InstalledAppDetails.java revision c44d7c6be64be790878ddf1f21c0d9e91d238245
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;
698243c9a722e815bdcb069163de48877478c28dfdChristopher Tateimport java.util.HashSet;
70afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport java.util.List;
71f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackbornimport android.view.LayoutInflater;
723db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackbornimport android.view.Menu;
733db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackbornimport android.view.MenuInflater;
743db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackbornimport android.view.MenuItem;
75afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.view.View;
76f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackbornimport android.view.ViewGroup;
773465b67740e17711af2b36b09e2250a02275d860Jake Hambyimport android.widget.AdapterView;
78afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.widget.AppSecurityPermissions;
793465b67740e17711af2b36b09e2250a02275d860Jake Hambyimport android.widget.ArrayAdapter;
80afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.widget.Button;
81aef746c45f14c8a170dba48c4b55f93cae0e24e4Dianne Hackbornimport android.widget.CheckBox;
82aef746c45f14c8a170dba48c4b55f93cae0e24e4Dianne Hackbornimport android.widget.CompoundButton;
83afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.widget.ImageView;
84afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.widget.LinearLayout;
853465b67740e17711af2b36b09e2250a02275d860Jake Hambyimport android.widget.Spinner;
86afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.widget.TextView;
87afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
88afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project/**
89afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * Activity to display application information from Settings. This activity presents
90afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * extended information associated with a package like code, data, total size, permissions
91afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * used by the application and also the set of default launchable activities.
92afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * For system applications, an option to clear user data is displayed only if data size is > 0.
93afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * System applications that do not want clear user data do not have this option.
94afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * For non-system applications, there is no option to clear data. Instead there is an option to
95afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * uninstall the application.
96afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project */
97f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackbornpublic class InstalledAppDetails extends Fragment
98aef746c45f14c8a170dba48c4b55f93cae0e24e4Dianne Hackborn        implements View.OnClickListener, CompoundButton.OnCheckedChangeListener,
99aef746c45f14c8a170dba48c4b55f93cae0e24e4Dianne Hackborn        ApplicationsState.Callbacks {
100afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private static final String TAG="InstalledAppDetails";
1012f144fc07d3f202b83ffb6064a223bbadef65114Dianne Hackborn    private static final boolean localLOGV = false;
1020f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn
103f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn    public static final String ARG_PACKAGE_NAME = "package";
104f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn
1050f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn    private PackageManager mPm;
1063db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn    private UserManager mUserManager;
1079d6d92b33ebf1c91aed47bd759ce78a3e06afff5Mike Lockwood    private IUsbManager mUsbManager;
108c9029d99a36d78331b109b64c1f61812db7cedd9Michael Jurka    private AppWidgetManager mAppWidgetManager;
1095c2b48d4d52a2b6b3ae3c745e7016da390a4e1d7Dianne Hackborn    private DevicePolicyManager mDpm;
1103465b67740e17711af2b36b09e2250a02275d860Jake Hamby    private ISms mSmsManager;
1110f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn    private ApplicationsState mState;
112309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn    private ApplicationsState.Session mSession;
1130f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn    private ApplicationsState.AppEntry mAppEntry;
114ab616d477be693fc455329953711264af0ed7814Dianne Hackborn    private boolean mInitialized;
115ab616d477be693fc455329953711264af0ed7814Dianne Hackborn    private boolean mShowUninstalled;
1160f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn    private PackageInfo mPackageInfo;
1176dc1bf84cf72dd72a2517878f6b280e8afdcf4c2Dianne Hackborn    private CanBeOnSdCardChecker mCanBeOnSdCardChecker;
118f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn    private View mRootView;
11942241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu    private Button mUninstallButton;
1209072d9efc6f9c4ef260736c345e81390ac988d7aDianne Hackborn    private View mMoreControlButtons;
1219072d9efc6f9c4ef260736c345e81390ac988d7aDianne Hackborn    private Button mSpecialDisableButton;
122de03ac27b74d1d69c1fea36e7fb00f068ab16b21Suchi Amalapurapu    private boolean mMoveInProgress = false;
12342241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu    private boolean mUpdatedSysApp = false;
124afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private Button mActivitiesButton;
125aef746c45f14c8a170dba48c4b55f93cae0e24e4Dianne Hackborn    private View mScreenCompatSection;
126aef746c45f14c8a170dba48c4b55f93cae0e24e4Dianne Hackborn    private CheckBox mAskCompatibilityCB;
127aef746c45f14c8a170dba48c4b55f93cae0e24e4Dianne Hackborn    private CheckBox mEnableCompatibilityCB;
1282f144fc07d3f202b83ffb6064a223bbadef65114Dianne Hackborn    private boolean mCanClearData = true;
12950b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu    private TextView mAppVersion;
130afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private TextView mTotalSize;
131afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private TextView mAppSize;
132afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private TextView mDataSize;
133bd9ddab4f4e1f47b141abdcc0248cc716112b3c7Dianne Hackborn    private TextView mExternalCodeSize;
134bd9ddab4f4e1f47b141abdcc0248cc716112b3c7Dianne Hackborn    private TextView mExternalDataSize;
135afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private ClearUserDataObserver mClearDataObserver;
136afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    // Views related to cache info
137afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private TextView mCacheSize;
138afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private Button mClearCacheButton;
139afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private ClearCacheObserver mClearCacheObserver;
140afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private Button mForceStopButton;
14142241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu    private Button mClearDataButton;
14242241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu    private Button mMoveAppButton;
14370b599983967b68894a9c41df2279424f6ab3fefDaniel Sandler    private CompoundButton mNotificationSwitch;
1444a824be44c3878f22469cf45c2ef8b7e92724e92Daniel Sandler
145ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu    private PackageMoveObserver mPackageMoveObserver;
1469072d9efc6f9c4ef260736c345e81390ac988d7aDianne Hackborn
1478243c9a722e815bdcb069163de48877478c28dfdChristopher Tate    private final HashSet<String> mHomePackages = new HashSet<String>();
1488243c9a722e815bdcb069163de48877478c28dfdChristopher Tate
1499072d9efc6f9c4ef260736c345e81390ac988d7aDianne Hackborn    private boolean mDisableAfterUninstall;
1509072d9efc6f9c4ef260736c345e81390ac988d7aDianne Hackborn
1510f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn    private boolean mHaveSizes = false;
1520f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn    private long mLastCodeSize = -1;
1530f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn    private long mLastDataSize = -1;
154bd9ddab4f4e1f47b141abdcc0248cc716112b3c7Dianne Hackborn    private long mLastExternalCodeSize = -1;
155bd9ddab4f4e1f47b141abdcc0248cc716112b3c7Dianne Hackborn    private long mLastExternalDataSize = -1;
1560f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn    private long mLastCacheSize = -1;
1570f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn    private long mLastTotalSize = -1;
1580f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn
159afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    //internal constants used in Handler
160afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private static final int OP_SUCCESSFUL = 1;
161afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private static final int OP_FAILED = 2;
162afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private static final int CLEAR_USER_DATA = 1;
163afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private static final int CLEAR_CACHE = 3;
164ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu    private static final int PACKAGE_MOVE = 4;
165afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
166afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    // invalid size value used initially and also when size retrieval through PackageManager
167afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    // fails for whatever reason
168afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private static final int SIZE_INVALID = -1;
169afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
170afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    // Resource strings
171afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private CharSequence mInvalidSizeStr;
172afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private CharSequence mComputingStr;
173afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
17450b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu    // Dialog identifiers used in showDialog
17550b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu    private static final int DLG_BASE = 0;
17650b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu    private static final int DLG_CLEAR_DATA = DLG_BASE + 1;
17750b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu    private static final int DLG_FACTORY_RESET = DLG_BASE + 2;
17850b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu    private static final int DLG_APP_NOT_FOUND = DLG_BASE + 3;
17950b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu    private static final int DLG_CANNOT_CLEAR_DATA = DLG_BASE + 4;
18042241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu    private static final int DLG_FORCE_STOP = DLG_BASE + 5;
1815cc062f1cd37cff19a1a7ee6fbb2a6522eee415cSuchi Amalapurapu    private static final int DLG_MOVE_FAILED = DLG_BASE + 6;
182f0b63c2c3ec65e8864d5b76a993e87f592170a3dDianne Hackborn    private static final int DLG_DISABLE = DLG_BASE + 7;
18370b599983967b68894a9c41df2279424f6ab3fefDaniel Sandler    private static final int DLG_DISABLE_NOTIFICATIONS = DLG_BASE + 8;
1849072d9efc6f9c4ef260736c345e81390ac988d7aDianne Hackborn    private static final int DLG_SPECIAL_DISABLE = DLG_BASE + 9;
1853db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn
1863db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn    // Menu identifiers
1873db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn    public static final int UNINSTALL_ALL_USERS_MENU = 1;
1883db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn
1893db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn    // Result code identifiers
1903db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn    public static final int REQUEST_UNINSTALL = 1;
1913db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn    public static final int REQUEST_MANAGE_SPACE = 2;
1923db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn
193afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private Handler mHandler = new Handler() {
194afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        public void handleMessage(Message msg) {
195f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn            // If the fragment is gone, don't process any more messages.
196f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn            if (getView() == null) {
19707f636059a2fb45f2d8284fedbbbba2c78b05157Dianne Hackborn                return;
19807f636059a2fb45f2d8284fedbbbba2c78b05157Dianne Hackborn            }
199afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            switch (msg.what) {
200afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                case CLEAR_USER_DATA:
201afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                    processClearMsg(msg);
202afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                    break;
203afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                case CLEAR_CACHE:
204afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                    // Refresh size info
2050f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn                    mState.requestSize(mAppEntry.info.packageName);
206afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                    break;
207ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu                case PACKAGE_MOVE:
208ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu                    processMoveMsg(msg);
209ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu                    break;
210afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                default:
211afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                    break;
212afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            }
213afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        }
214afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    };
215afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
216afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    class ClearUserDataObserver extends IPackageDataObserver.Stub {
217afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project       public void onRemoveCompleted(final String packageName, final boolean succeeded) {
218afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project           final Message msg = mHandler.obtainMessage(CLEAR_USER_DATA);
219afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project           msg.arg1 = succeeded?OP_SUCCESSFUL:OP_FAILED;
220afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project           mHandler.sendMessage(msg);
221afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        }
222afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    }
223afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
224afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    class ClearCacheObserver extends IPackageDataObserver.Stub {
225afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        public void onRemoveCompleted(final String packageName, final boolean succeeded) {
226afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            final Message msg = mHandler.obtainMessage(CLEAR_CACHE);
227ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu            msg.arg1 = succeeded ? OP_SUCCESSFUL:OP_FAILED;
228afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            mHandler.sendMessage(msg);
229afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project         }
230afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project     }
231ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu
232ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu    class PackageMoveObserver extends IPackageMoveObserver.Stub {
233ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu        public void packageMoved(String packageName, int returnCode) throws RemoteException {
234ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu            final Message msg = mHandler.obtainMessage(PACKAGE_MOVE);
235ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu            msg.arg1 = returnCode;
236ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu            mHandler.sendMessage(msg);
237ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu        }
238ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu    }
239afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
240afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private String getSizeStr(long size) {
241afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        if (size == SIZE_INVALID) {
242afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            return mInvalidSizeStr.toString();
243afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        }
244f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn        return Formatter.formatFileSize(getActivity(), size);
245afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    }
246afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
24742241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu    private void initDataButtons() {
248c6fe9cc319a78b6174fe59e8732b07bb46e454bcAmith Yamasani        // If the app doesn't have its own space management UI
249c6fe9cc319a78b6174fe59e8732b07bb46e454bcAmith Yamasani        // And it's a system app that doesn't allow clearing user data or is an active admin
250c6fe9cc319a78b6174fe59e8732b07bb46e454bcAmith Yamasani        // Then disable the Clear Data button.
251c6fe9cc319a78b6174fe59e8732b07bb46e454bcAmith Yamasani        if (mAppEntry.info.manageSpaceActivityName == null
252c6fe9cc319a78b6174fe59e8732b07bb46e454bcAmith Yamasani                && ((mAppEntry.info.flags&(ApplicationInfo.FLAG_SYSTEM
253c6fe9cc319a78b6174fe59e8732b07bb46e454bcAmith Yamasani                        | ApplicationInfo.FLAG_ALLOW_CLEAR_USER_DATA))
254c6fe9cc319a78b6174fe59e8732b07bb46e454bcAmith Yamasani                        == ApplicationInfo.FLAG_SYSTEM
255c6fe9cc319a78b6174fe59e8732b07bb46e454bcAmith Yamasani                        || mDpm.packageHasActiveAdmins(mPackageInfo.packageName))) {
25642241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu            mClearDataButton.setText(R.string.clear_user_data_text);
2572f144fc07d3f202b83ffb6064a223bbadef65114Dianne Hackborn            mClearDataButton.setEnabled(false);
2582f144fc07d3f202b83ffb6064a223bbadef65114Dianne Hackborn            mCanClearData = false;
2592f144fc07d3f202b83ffb6064a223bbadef65114Dianne Hackborn        } else {
2602f144fc07d3f202b83ffb6064a223bbadef65114Dianne Hackborn            if (mAppEntry.info.manageSpaceActivityName != null) {
2612f144fc07d3f202b83ffb6064a223bbadef65114Dianne Hackborn                mClearDataButton.setText(R.string.manage_space_text);
2622f144fc07d3f202b83ffb6064a223bbadef65114Dianne Hackborn            } else {
2632f144fc07d3f202b83ffb6064a223bbadef65114Dianne Hackborn                mClearDataButton.setText(R.string.clear_user_data_text);
2642f144fc07d3f202b83ffb6064a223bbadef65114Dianne Hackborn            }
2652f144fc07d3f202b83ffb6064a223bbadef65114Dianne Hackborn            mClearDataButton.setOnClickListener(this);
26642241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu        }
267ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu    }
268ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu
2695cc062f1cd37cff19a1a7ee6fbb2a6522eee415cSuchi Amalapurapu    private CharSequence getMoveErrMsg(int errCode) {
2705cc062f1cd37cff19a1a7ee6fbb2a6522eee415cSuchi Amalapurapu        switch (errCode) {
2715cc062f1cd37cff19a1a7ee6fbb2a6522eee415cSuchi Amalapurapu            case PackageManager.MOVE_FAILED_INSUFFICIENT_STORAGE:
272f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                return getActivity().getString(R.string.insufficient_storage);
2735cc062f1cd37cff19a1a7ee6fbb2a6522eee415cSuchi Amalapurapu            case PackageManager.MOVE_FAILED_DOESNT_EXIST:
274f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                return getActivity().getString(R.string.does_not_exist);
2755cc062f1cd37cff19a1a7ee6fbb2a6522eee415cSuchi Amalapurapu            case PackageManager.MOVE_FAILED_FORWARD_LOCKED:
276f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                return getActivity().getString(R.string.app_forward_locked);
2775cc062f1cd37cff19a1a7ee6fbb2a6522eee415cSuchi Amalapurapu            case PackageManager.MOVE_FAILED_INVALID_LOCATION:
278f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                return getActivity().getString(R.string.invalid_location);
2795cc062f1cd37cff19a1a7ee6fbb2a6522eee415cSuchi Amalapurapu            case PackageManager.MOVE_FAILED_SYSTEM_PACKAGE:
280f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                return getActivity().getString(R.string.system_package);
2819a3a1a4e58c03a81368ebe5411f334c5c9a3a89bSuchi Amalapurapu            case PackageManager.MOVE_FAILED_INTERNAL_ERROR:
2829a3a1a4e58c03a81368ebe5411f334c5c9a3a89bSuchi Amalapurapu                return "";
2835cc062f1cd37cff19a1a7ee6fbb2a6522eee415cSuchi Amalapurapu        }
2849a3a1a4e58c03a81368ebe5411f334c5c9a3a89bSuchi Amalapurapu        return "";
2855cc062f1cd37cff19a1a7ee6fbb2a6522eee415cSuchi Amalapurapu    }
2865cc062f1cd37cff19a1a7ee6fbb2a6522eee415cSuchi Amalapurapu
287ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu    private void initMoveButton() {
288ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn        if (Environment.isExternalStorageEmulated()) {
289ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn            mMoveAppButton.setVisibility(View.INVISIBLE);
290ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn            return;
291ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn        }
29242241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu        boolean dataOnly = false;
2930f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn        dataOnly = (mPackageInfo == null) && (mAppEntry != null);
294ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu        boolean moveDisable = true;
29542241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu        if (dataOnly) {
29642241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu            mMoveAppButton.setText(R.string.move_app);
2970f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn        } else if ((mAppEntry.info.flags & ApplicationInfo.FLAG_EXTERNAL_STORAGE) != 0) {
29842241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu            mMoveAppButton.setText(R.string.move_app_to_internal);
2994056459e9e6bf766168aff4cfe41b0a28a843323Suchi Amalapurapu            // Always let apps move to internal storage from sdcard.
300ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu            moveDisable = false;
30142241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu        } else {
30242241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu            mMoveAppButton.setText(R.string.move_app_to_sdcard);
3036dc1bf84cf72dd72a2517878f6b280e8afdcf4c2Dianne Hackborn            mCanBeOnSdCardChecker.init();
3046dc1bf84cf72dd72a2517878f6b280e8afdcf4c2Dianne Hackborn            moveDisable = !mCanBeOnSdCardChecker.check(mAppEntry.info);
305730eb7e5ffa56cae2224a836f489b8e1e94b1f09Suchi Amalapurapu        }
306ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu        if (moveDisable) {
307ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu            mMoveAppButton.setEnabled(false);
308ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu        } else {
309ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu            mMoveAppButton.setOnClickListener(this);
310ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu            mMoveAppButton.setEnabled(true);
311ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu        }
31242241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu    }
31342241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu
31470b599983967b68894a9c41df2279424f6ab3fefDaniel Sandler    private boolean isThisASystemPackage() {
31570b599983967b68894a9c41df2279424f6ab3fefDaniel Sandler        try {
31670b599983967b68894a9c41df2279424f6ab3fefDaniel Sandler            PackageInfo sys = mPm.getPackageInfo("android", PackageManager.GET_SIGNATURES);
31770b599983967b68894a9c41df2279424f6ab3fefDaniel Sandler            return (mPackageInfo != null && mPackageInfo.signatures != null &&
31870b599983967b68894a9c41df2279424f6ab3fefDaniel Sandler                    sys.signatures[0].equals(mPackageInfo.signatures[0]));
31970b599983967b68894a9c41df2279424f6ab3fefDaniel Sandler        } catch (PackageManager.NameNotFoundException e) {
32070b599983967b68894a9c41df2279424f6ab3fefDaniel Sandler            return false;
32170b599983967b68894a9c41df2279424f6ab3fefDaniel Sandler        }
32270b599983967b68894a9c41df2279424f6ab3fefDaniel Sandler    }
32370b599983967b68894a9c41df2279424f6ab3fefDaniel Sandler
3249072d9efc6f9c4ef260736c345e81390ac988d7aDianne Hackborn    private boolean handleDisableable(Button button) {
3259072d9efc6f9c4ef260736c345e81390ac988d7aDianne Hackborn        boolean disableable = false;
3268243c9a722e815bdcb069163de48877478c28dfdChristopher Tate        // Try to prevent the user from bricking their phone
3278243c9a722e815bdcb069163de48877478c28dfdChristopher Tate        // by not allowing disabling of apps signed with the
3288243c9a722e815bdcb069163de48877478c28dfdChristopher Tate        // system cert and any launcher app in the system.
3298243c9a722e815bdcb069163de48877478c28dfdChristopher Tate        if (mHomePackages.contains(mAppEntry.info.packageName) || isThisASystemPackage()) {
3308243c9a722e815bdcb069163de48877478c28dfdChristopher Tate            // Disable button for core system applications.
3318243c9a722e815bdcb069163de48877478c28dfdChristopher Tate            button.setText(R.string.disable_text);
3328243c9a722e815bdcb069163de48877478c28dfdChristopher Tate        } else if (mAppEntry.info.enabled) {
3338243c9a722e815bdcb069163de48877478c28dfdChristopher Tate            button.setText(R.string.disable_text);
3348243c9a722e815bdcb069163de48877478c28dfdChristopher Tate            disableable = true;
3358243c9a722e815bdcb069163de48877478c28dfdChristopher Tate        } else {
3368243c9a722e815bdcb069163de48877478c28dfdChristopher Tate            button.setText(R.string.enable_text);
3378243c9a722e815bdcb069163de48877478c28dfdChristopher Tate            disableable = true;
3389072d9efc6f9c4ef260736c345e81390ac988d7aDianne Hackborn        }
3398243c9a722e815bdcb069163de48877478c28dfdChristopher Tate
3409072d9efc6f9c4ef260736c345e81390ac988d7aDianne Hackborn        return disableable;
3419072d9efc6f9c4ef260736c345e81390ac988d7aDianne Hackborn    }
3429072d9efc6f9c4ef260736c345e81390ac988d7aDianne Hackborn
343de03ac27b74d1d69c1fea36e7fb00f068ab16b21Suchi Amalapurapu    private void initUninstallButtons() {
3440f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn        mUpdatedSysApp = (mAppEntry.info.flags & ApplicationInfo.FLAG_UPDATED_SYSTEM_APP) != 0;
34542241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu        boolean enabled = true;
34642241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu        if (mUpdatedSysApp) {
34742241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu            mUninstallButton.setText(R.string.app_factory_reset);
3489072d9efc6f9c4ef260736c345e81390ac988d7aDianne Hackborn            boolean specialDisable = false;
3499072d9efc6f9c4ef260736c345e81390ac988d7aDianne Hackborn            if ((mAppEntry.info.flags & ApplicationInfo.FLAG_SYSTEM) != 0) {
3509072d9efc6f9c4ef260736c345e81390ac988d7aDianne Hackborn                specialDisable = handleDisableable(mSpecialDisableButton);
3519072d9efc6f9c4ef260736c345e81390ac988d7aDianne Hackborn                mSpecialDisableButton.setOnClickListener(this);
3529072d9efc6f9c4ef260736c345e81390ac988d7aDianne Hackborn            }
3539072d9efc6f9c4ef260736c345e81390ac988d7aDianne Hackborn            mMoreControlButtons.setVisibility(specialDisable ? View.VISIBLE : View.GONE);
35442241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu        } else {
3559072d9efc6f9c4ef260736c345e81390ac988d7aDianne Hackborn            mMoreControlButtons.setVisibility(View.GONE);
3560f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn            if ((mAppEntry.info.flags & ApplicationInfo.FLAG_SYSTEM) != 0) {
3579072d9efc6f9c4ef260736c345e81390ac988d7aDianne Hackborn                enabled = handleDisableable(mUninstallButton);
3582e3c75094bde1cfca1b15f66f5ff3d0a85baf0a0Dianne Hackborn            } else if ((mPackageInfo.applicationInfo.flags
3594de4061c8bb9475cbc5d98f83bf3b2c8ec222407Dianne Hackborn                    & ApplicationInfo.FLAG_INSTALLED) == 0
3604de4061c8bb9475cbc5d98f83bf3b2c8ec222407Dianne Hackborn                    && mUserManager.getUsers().size() >= 2) {
3614de4061c8bb9475cbc5d98f83bf3b2c8ec222407Dianne Hackborn                // When we have multiple users, there is a separate menu
3624de4061c8bb9475cbc5d98f83bf3b2c8ec222407Dianne Hackborn                // to uninstall for all users.
363c715fb1207361bb2a793752eefb02f1956075739Dianne Hackborn                mUninstallButton.setText(R.string.uninstall_text);
364c715fb1207361bb2a793752eefb02f1956075739Dianne Hackborn                enabled = false;
3659db5ee35d5345e13e6e6b857dbad5a83e9f037d1Dianne Hackborn            } else {
3669db5ee35d5345e13e6e6b857dbad5a83e9f037d1Dianne Hackborn                mUninstallButton.setText(R.string.uninstall_text);
367b99e029db14ae276a47da39da9378b6af9aef403Suchi Amalapurapu            }
36842241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu        }
369c44d7c6be64be790878ddf1f21c0d9e91d238245Christopher Tate        // If this is a device admin, it can't be uninstalled or disabled.
3705c2b48d4d52a2b6b3ae3c745e7016da390a4e1d7Dianne Hackborn        // We do this here so the text of the button is still set correctly.
3715c2b48d4d52a2b6b3ae3c745e7016da390a4e1d7Dianne Hackborn        if (mDpm.packageHasActiveAdmins(mPackageInfo.packageName)) {
3725c2b48d4d52a2b6b3ae3c745e7016da390a4e1d7Dianne Hackborn            enabled = false;
3735c2b48d4d52a2b6b3ae3c745e7016da390a4e1d7Dianne Hackborn        }
374c44d7c6be64be790878ddf1f21c0d9e91d238245Christopher Tate
375c44d7c6be64be790878ddf1f21c0d9e91d238245Christopher Tate        // If this is the default (or only) home app, suppress uninstall (even if
376c44d7c6be64be790878ddf1f21c0d9e91d238245Christopher Tate        // we still think it should be allowed for other reasons)
377c44d7c6be64be790878ddf1f21c0d9e91d238245Christopher Tate        if (enabled && mHomePackages.contains(mPackageInfo.packageName)) {
378c44d7c6be64be790878ddf1f21c0d9e91d238245Christopher Tate            ArrayList<ResolveInfo> homeActivities = new ArrayList<ResolveInfo>();
379c44d7c6be64be790878ddf1f21c0d9e91d238245Christopher Tate            ComponentName currentDefaultHome  = mPm.getHomeActivities(homeActivities);
380c44d7c6be64be790878ddf1f21c0d9e91d238245Christopher Tate            if (currentDefaultHome == null) {
381c44d7c6be64be790878ddf1f21c0d9e91d238245Christopher Tate                // No preferred default, so permit uninstall only when
382c44d7c6be64be790878ddf1f21c0d9e91d238245Christopher Tate                // there is more than one candidate
383c44d7c6be64be790878ddf1f21c0d9e91d238245Christopher Tate                enabled = (mHomePackages.size() > 1);
384c44d7c6be64be790878ddf1f21c0d9e91d238245Christopher Tate            } else {
385c44d7c6be64be790878ddf1f21c0d9e91d238245Christopher Tate                // There is an explicit default home app -- forbid uninstall of
386c44d7c6be64be790878ddf1f21c0d9e91d238245Christopher Tate                // that one, but permit it for installed-but-inactive ones.
387c44d7c6be64be790878ddf1f21c0d9e91d238245Christopher Tate                enabled = !mPackageInfo.packageName.equals(currentDefaultHome.getPackageName());
388c44d7c6be64be790878ddf1f21c0d9e91d238245Christopher Tate            }
389c44d7c6be64be790878ddf1f21c0d9e91d238245Christopher Tate        }
390c44d7c6be64be790878ddf1f21c0d9e91d238245Christopher Tate
39142241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu        mUninstallButton.setEnabled(enabled);
39242241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu        if (enabled) {
39342241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu            // Register listener
39442241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu            mUninstallButton.setOnClickListener(this);
39542241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu        }
39642241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu    }
39742241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu
3984a824be44c3878f22469cf45c2ef8b7e92724e92Daniel Sandler    private void initNotificationButton() {
3994a824be44c3878f22469cf45c2ef8b7e92724e92Daniel Sandler        INotificationManager nm = INotificationManager.Stub.asInterface(
4004a824be44c3878f22469cf45c2ef8b7e92724e92Daniel Sandler                ServiceManager.getService(Context.NOTIFICATION_SERVICE));
4014a824be44c3878f22469cf45c2ef8b7e92724e92Daniel Sandler        boolean enabled = true; // default on
4024a824be44c3878f22469cf45c2ef8b7e92724e92Daniel Sandler        try {
403df3f6d6c4722a7acc8189e47d0499aaf618969f9Daniel Sandler            enabled = nm.areNotificationsEnabledForPackage(mAppEntry.info.packageName,
404df3f6d6c4722a7acc8189e47d0499aaf618969f9Daniel Sandler                    mAppEntry.info.uid);
4054a824be44c3878f22469cf45c2ef8b7e92724e92Daniel Sandler        } catch (android.os.RemoteException ex) {
4064a824be44c3878f22469cf45c2ef8b7e92724e92Daniel Sandler            // this does not bode well
4074a824be44c3878f22469cf45c2ef8b7e92724e92Daniel Sandler        }
4084a824be44c3878f22469cf45c2ef8b7e92724e92Daniel Sandler        mNotificationSwitch.setChecked(enabled);
40970b599983967b68894a9c41df2279424f6ab3fefDaniel Sandler        if (isThisASystemPackage()) {
41070b599983967b68894a9c41df2279424f6ab3fefDaniel Sandler            mNotificationSwitch.setEnabled(false);
41170b599983967b68894a9c41df2279424f6ab3fefDaniel Sandler        } else {
41270b599983967b68894a9c41df2279424f6ab3fefDaniel Sandler            mNotificationSwitch.setEnabled(true);
41370b599983967b68894a9c41df2279424f6ab3fefDaniel Sandler            mNotificationSwitch.setOnCheckedChangeListener(this);
41470b599983967b68894a9c41df2279424f6ab3fefDaniel Sandler        }
4154a824be44c3878f22469cf45c2ef8b7e92724e92Daniel Sandler    }
4164a824be44c3878f22469cf45c2ef8b7e92724e92Daniel Sandler
417afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    /** Called when the activity is first created. */
418afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    @Override
419f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn    public void onCreate(Bundle icicle) {
420afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        super.onCreate(icicle);
4213db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn
422f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn        mState = ApplicationsState.getInstance(getActivity().getApplication());
423309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn        mSession = mState.newSession(this);
424f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn        mPm = getActivity().getPackageManager();
4253db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn        mUserManager = (UserManager)getActivity().getSystemService(Context.USER_SERVICE);
4269d6d92b33ebf1c91aed47bd759ce78a3e06afff5Mike Lockwood        IBinder b = ServiceManager.getService(Context.USB_SERVICE);
4279d6d92b33ebf1c91aed47bd759ce78a3e06afff5Mike Lockwood        mUsbManager = IUsbManager.Stub.asInterface(b);
428c9029d99a36d78331b109b64c1f61812db7cedd9Michael Jurka        mAppWidgetManager = AppWidgetManager.getInstance(getActivity());
4295c2b48d4d52a2b6b3ae3c745e7016da390a4e1d7Dianne Hackborn        mDpm = (DevicePolicyManager)getActivity().getSystemService(Context.DEVICE_POLICY_SERVICE);
4303465b67740e17711af2b36b09e2250a02275d860Jake Hamby        mSmsManager = ISms.Stub.asInterface(ServiceManager.getService("isms"));
4319d6d92b33ebf1c91aed47bd759ce78a3e06afff5Mike Lockwood
4326dc1bf84cf72dd72a2517878f6b280e8afdcf4c2Dianne Hackborn        mCanBeOnSdCardChecker = new CanBeOnSdCardChecker();
4330fca4296ac08fcf42b58fac3a016ea068fcf6257Dianne Hackborn
434c715fb1207361bb2a793752eefb02f1956075739Dianne Hackborn        // Need to make sure we have loaded applications at this point.
435c715fb1207361bb2a793752eefb02f1956075739Dianne Hackborn        mSession.resume();
436c715fb1207361bb2a793752eefb02f1956075739Dianne Hackborn
4370fca4296ac08fcf42b58fac3a016ea068fcf6257Dianne Hackborn        retrieveAppEntry();
4380fca4296ac08fcf42b58fac3a016ea068fcf6257Dianne Hackborn
4390fca4296ac08fcf42b58fac3a016ea068fcf6257Dianne Hackborn        setHasOptionsMenu(true);
440f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn    }
441f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn
442f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn    @Override
44397d07fa3aedde44368818551dc789eaff7bfb047Jeff Sharkey    public View onCreateView(
44497d07fa3aedde44368818551dc789eaff7bfb047Jeff Sharkey            LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
44597d07fa3aedde44368818551dc789eaff7bfb047Jeff Sharkey        final View view = inflater.inflate(R.layout.installed_app_details, container, false);
44697d07fa3aedde44368818551dc789eaff7bfb047Jeff Sharkey        Utils.prepareCustomPreferencesList(container, view, view, false);
44797d07fa3aedde44368818551dc789eaff7bfb047Jeff Sharkey
44897d07fa3aedde44368818551dc789eaff7bfb047Jeff Sharkey        mRootView = view;
449f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn        mComputingStr = getActivity().getText(R.string.computing_size);
450b0bcf9f7f50b56cb15a72be39fe11fe1351992c1Jeff Brown
45150b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu        // Set default values on sizes
452f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn        mTotalSize = (TextView)view.findViewById(R.id.total_size_text);
453f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn        mAppSize = (TextView)view.findViewById(R.id.application_size_text);
454f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn        mDataSize = (TextView)view.findViewById(R.id.data_size_text);
455bd9ddab4f4e1f47b141abdcc0248cc716112b3c7Dianne Hackborn        mExternalCodeSize = (TextView)view.findViewById(R.id.external_code_size_text);
456bd9ddab4f4e1f47b141abdcc0248cc716112b3c7Dianne Hackborn        mExternalDataSize = (TextView)view.findViewById(R.id.external_data_size_text);
4571f6ddac9f41f341073e7cedd8f777a43b7d11679Dianne Hackborn
4581f6ddac9f41f341073e7cedd8f777a43b7d11679Dianne Hackborn        if (Environment.isExternalStorageEmulated()) {
4591f6ddac9f41f341073e7cedd8f777a43b7d11679Dianne Hackborn            ((View)mExternalCodeSize.getParent()).setVisibility(View.GONE);
4601f6ddac9f41f341073e7cedd8f777a43b7d11679Dianne Hackborn            ((View)mExternalDataSize.getParent()).setVisibility(View.GONE);
4611f6ddac9f41f341073e7cedd8f777a43b7d11679Dianne Hackborn        }
4621f6ddac9f41f341073e7cedd8f777a43b7d11679Dianne Hackborn
46342241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu        // Get Control button panel
464f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn        View btnPanel = view.findViewById(R.id.control_buttons_panel);
46542241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu        mForceStopButton = (Button) btnPanel.findViewById(R.id.left_button);
46642241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu        mForceStopButton.setText(R.string.force_stop);
46742241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu        mUninstallButton = (Button)btnPanel.findViewById(R.id.right_button);
468cb497546ba55ef98fb561dd9a07c7a485a918f4bDianne Hackborn        mForceStopButton.setEnabled(false);
469b0bcf9f7f50b56cb15a72be39fe11fe1351992c1Jeff Brown
4709072d9efc6f9c4ef260736c345e81390ac988d7aDianne Hackborn        // Get More Control button panel
4719072d9efc6f9c4ef260736c345e81390ac988d7aDianne Hackborn        mMoreControlButtons = view.findViewById(R.id.more_control_buttons_panel);
4729072d9efc6f9c4ef260736c345e81390ac988d7aDianne Hackborn        mMoreControlButtons.findViewById(R.id.left_button).setVisibility(View.INVISIBLE);
4739072d9efc6f9c4ef260736c345e81390ac988d7aDianne Hackborn        mSpecialDisableButton = (Button)mMoreControlButtons.findViewById(R.id.right_button);
4749072d9efc6f9c4ef260736c345e81390ac988d7aDianne Hackborn        mMoreControlButtons.setVisibility(View.GONE);
4759072d9efc6f9c4ef260736c345e81390ac988d7aDianne Hackborn
47642241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu        // Initialize clear data and move install location buttons
477f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn        View data_buttons_panel = view.findViewById(R.id.data_buttons_panel);
478313ab1727014d535790bc89afdcf725ff936e5b4Dianne Hackborn        mClearDataButton = (Button) data_buttons_panel.findViewById(R.id.right_button);
479313ab1727014d535790bc89afdcf725ff936e5b4Dianne Hackborn        mMoveAppButton = (Button) data_buttons_panel.findViewById(R.id.left_button);
480b0bcf9f7f50b56cb15a72be39fe11fe1351992c1Jeff Brown
4810f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn        // Cache section
482f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn        mCacheSize = (TextView) view.findViewById(R.id.cache_size_text);
483f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn        mClearCacheButton = (Button) view.findViewById(R.id.clear_cache_button);
484f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn
485f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn        mActivitiesButton = (Button)view.findViewById(R.id.clear_activities_button);
4860f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn
487aef746c45f14c8a170dba48c4b55f93cae0e24e4Dianne Hackborn        // Screen compatibility control
488aef746c45f14c8a170dba48c4b55f93cae0e24e4Dianne Hackborn        mScreenCompatSection = view.findViewById(R.id.screen_compatibility_section);
489aef746c45f14c8a170dba48c4b55f93cae0e24e4Dianne Hackborn        mAskCompatibilityCB = (CheckBox)view.findViewById(R.id.ask_compatibility_cb);
490aef746c45f14c8a170dba48c4b55f93cae0e24e4Dianne Hackborn        mEnableCompatibilityCB = (CheckBox)view.findViewById(R.id.enable_compatibility_cb);
4914a824be44c3878f22469cf45c2ef8b7e92724e92Daniel Sandler
49270b599983967b68894a9c41df2279424f6ab3fefDaniel Sandler        mNotificationSwitch = (CompoundButton) view.findViewById(R.id.notification_switch);
493aef746c45f14c8a170dba48c4b55f93cae0e24e4Dianne Hackborn
494f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn        return view;
495afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    }
496f4c4b59f13a0cadd55832004e56ff7b6d827f7f0Suchi Amalapurapu
4973db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn    @Override
4983db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn    public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
4993db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn        menu.add(0, UNINSTALL_ALL_USERS_MENU, 1, R.string.uninstall_all_users_text)
5003db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn                .setShowAsAction(MenuItem.SHOW_AS_ACTION_NEVER);
5013db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn    }
5023db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn
5033db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn    @Override
5043db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn    public void onPrepareOptionsMenu(Menu menu) {
5053db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn        boolean showIt = true;
5063db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn        if (mUpdatedSysApp) {
5073db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn            showIt = false;
5080fca4296ac08fcf42b58fac3a016ea068fcf6257Dianne Hackborn        } else if (mAppEntry == null) {
5090fca4296ac08fcf42b58fac3a016ea068fcf6257Dianne Hackborn            showIt = false;
5103db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn        } else if ((mAppEntry.info.flags & ApplicationInfo.FLAG_SYSTEM) != 0) {
5113db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn            showIt = false;
51254b3f501ca4a7ff88ead39247d2277d2efc82bb6Jeff Sharkey        } else if (mPackageInfo == null || mDpm.packageHasActiveAdmins(mPackageInfo.packageName)) {
5133db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn            showIt = false;
5143db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn        } else if (UserHandle.myUserId() != 0) {
5153db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn            showIt = false;
5167a1c4cdfae66e8b110de3988e65586871a969c04Amith Yamasani        } else if (mUserManager.getUsers().size() < 2) {
5173db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn            showIt = false;
5183db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn        }
5193db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn        menu.findItem(UNINSTALL_ALL_USERS_MENU).setVisible(showIt);
5203db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn    }
5213db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn
5223db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn    @Override
5233db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn    public boolean onOptionsItemSelected(MenuItem item) {
5243db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn        int menuId = item.getItemId();
5253db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn        if (menuId == UNINSTALL_ALL_USERS_MENU) {
5269072d9efc6f9c4ef260736c345e81390ac988d7aDianne Hackborn            uninstallPkg(mAppEntry.info.packageName, true, false);
5273db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn            return true;
5283db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn        }
5293db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn        return false;
5303db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn    }
5313db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn
5323db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn    @Override
5333db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn    public void onActivityResult(int requestCode, int resultCode, Intent data) {
5343db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn        super.onActivityResult(requestCode, resultCode, data);
5353db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn        if (requestCode == REQUEST_UNINSTALL) {
5369072d9efc6f9c4ef260736c345e81390ac988d7aDianne Hackborn            if (mDisableAfterUninstall) {
5379072d9efc6f9c4ef260736c345e81390ac988d7aDianne Hackborn                mDisableAfterUninstall = false;
5389072d9efc6f9c4ef260736c345e81390ac988d7aDianne Hackborn                try {
5399072d9efc6f9c4ef260736c345e81390ac988d7aDianne Hackborn                    ApplicationInfo ainfo = getActivity().getPackageManager().getApplicationInfo(
5409072d9efc6f9c4ef260736c345e81390ac988d7aDianne Hackborn                            mAppEntry.info.packageName, PackageManager.GET_UNINSTALLED_PACKAGES
5419072d9efc6f9c4ef260736c345e81390ac988d7aDianne Hackborn                            | PackageManager.GET_DISABLED_COMPONENTS);
5429072d9efc6f9c4ef260736c345e81390ac988d7aDianne Hackborn                    if ((ainfo.flags & ApplicationInfo.FLAG_UPDATED_SYSTEM_APP) == 0) {
5439072d9efc6f9c4ef260736c345e81390ac988d7aDianne Hackborn                        new DisableChanger(this, mAppEntry.info,
5449072d9efc6f9c4ef260736c345e81390ac988d7aDianne Hackborn                                PackageManager.COMPONENT_ENABLED_STATE_DISABLED_USER)
5459072d9efc6f9c4ef260736c345e81390ac988d7aDianne Hackborn                                .execute((Object)null);
5469072d9efc6f9c4ef260736c345e81390ac988d7aDianne Hackborn                    }
5479072d9efc6f9c4ef260736c345e81390ac988d7aDianne Hackborn                } catch (NameNotFoundException e) {
5489072d9efc6f9c4ef260736c345e81390ac988d7aDianne Hackborn                }
5499072d9efc6f9c4ef260736c345e81390ac988d7aDianne Hackborn            }
5503db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn            if (!refreshUi()) {
5513db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn                setIntentAndFinish(true, true);
5523db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn            }
5533db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn        }
5543db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn    }
5553db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn
5560dd9902c89e7b705fd73158aadf1bf27843ad201Dianne Hackborn    // Utility method to set application label and icon.
557f4c4b59f13a0cadd55832004e56ff7b6d827f7f0Suchi Amalapurapu    private void setAppLabelAndIcon(PackageInfo pkgInfo) {
55897d07fa3aedde44368818551dc789eaff7bfb047Jeff Sharkey        final View appSnippet = mRootView.findViewById(R.id.app_snippet);
559b27223f139248f92637997378d7a38d7d24f6b02Fabrice Di Meglio        appSnippet.setPaddingRelative(0, appSnippet.getPaddingTop(), 0, appSnippet.getPaddingBottom());
56097d07fa3aedde44368818551dc789eaff7bfb047Jeff Sharkey
561f4c4b59f13a0cadd55832004e56ff7b6d827f7f0Suchi Amalapurapu        ImageView icon = (ImageView) appSnippet.findViewById(R.id.app_icon);
5620f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn        mState.ensureIcon(mAppEntry);
5630f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn        icon.setImageDrawable(mAppEntry.icon);
564f4c4b59f13a0cadd55832004e56ff7b6d827f7f0Suchi Amalapurapu        // Set application name.
565f4c4b59f13a0cadd55832004e56ff7b6d827f7f0Suchi Amalapurapu        TextView label = (TextView) appSnippet.findViewById(R.id.app_name);
5660f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn        label.setText(mAppEntry.label);
56750b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu        // Version number of application
568f4c4b59f13a0cadd55832004e56ff7b6d827f7f0Suchi Amalapurapu        mAppVersion = (TextView) appSnippet.findViewById(R.id.app_size);
569f4c4b59f13a0cadd55832004e56ff7b6d827f7f0Suchi Amalapurapu
570f4c4b59f13a0cadd55832004e56ff7b6d827f7f0Suchi Amalapurapu        if (pkgInfo != null && pkgInfo.versionName != null) {
57150b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu            mAppVersion.setVisibility(View.VISIBLE);
572f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn            mAppVersion.setText(getActivity().getString(R.string.version_text,
5738e1b0fb77ce50ddc99a596da48b65190e2708362Elliott Hughes                    String.valueOf(pkgInfo.versionName)));
57450b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu        } else {
575f4c4b59f13a0cadd55832004e56ff7b6d827f7f0Suchi Amalapurapu            mAppVersion.setVisibility(View.INVISIBLE);
57650b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu        }
57750b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu    }
57850b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu
57950b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu    @Override
58042241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu    public void onResume() {
58142241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu        super.onResume();
582b0bcf9f7f50b56cb15a72be39fe11fe1351992c1Jeff Brown
583309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn        mSession.resume();
5840f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn        if (!refreshUi()) {
585b0bcf9f7f50b56cb15a72be39fe11fe1351992c1Jeff Brown            setIntentAndFinish(true, true);
586b0bcf9f7f50b56cb15a72be39fe11fe1351992c1Jeff Brown        }
5870f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn    }
5880f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn
5890f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn    @Override
5900f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn    public void onPause() {
5910f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn        super.onPause();
592309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn        mSession.pause();
5930f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn    }
5940f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn
5950f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn    @Override
5960f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn    public void onAllSizesComputed() {
5970f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn    }
5980f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn
5990f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn    @Override
6000f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn    public void onPackageIconChanged() {
6010f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn    }
6020f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn
6030f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn    @Override
6040f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn    public void onPackageListChanged() {
6050f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn        refreshUi();
6060f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn    }
6070f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn
6080f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn    @Override
60919df79af269c4a2354b0989cebfcfe949aea42c4Dianne Hackborn    public void onRebuildComplete(ArrayList<AppEntry> apps) {
61019df79af269c4a2354b0989cebfcfe949aea42c4Dianne Hackborn    }
61119df79af269c4a2354b0989cebfcfe949aea42c4Dianne Hackborn
61219df79af269c4a2354b0989cebfcfe949aea42c4Dianne Hackborn    @Override
6130f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn    public void onPackageSizeChanged(String packageName) {
6140f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn        if (packageName.equals(mAppEntry.info.packageName)) {
6150f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn            refreshSizeInfo();
6160f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn        }
6170f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn    }
6180f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn
6190f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn    @Override
6200f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn    public void onRunningStateChanged(boolean running) {
6210f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn    }
6220f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn
6230fca4296ac08fcf42b58fac3a016ea068fcf6257Dianne Hackborn    private String retrieveAppEntry() {
6240c5b9ca58bda5bc3c56f1e6c78859f7de147e476Patrick Dubroy        final Bundle args = getArguments();
6250c5b9ca58bda5bc3c56f1e6c78859f7de147e476Patrick Dubroy        String packageName = (args != null) ? args.getString(ARG_PACKAGE_NAME) : null;
626f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn        if (packageName == null) {
6270c5b9ca58bda5bc3c56f1e6c78859f7de147e476Patrick Dubroy            Intent intent = (args == null) ?
6280c5b9ca58bda5bc3c56f1e6c78859f7de147e476Patrick Dubroy                    getActivity().getIntent() : (Intent) args.getParcelable("intent");
629f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn            if (intent != null) {
630f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                packageName = intent.getData().getSchemeSpecificPart();
631f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn            }
632f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn        }
6330f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn        mAppEntry = mState.getEntry(packageName);
634347188667b984fb43e8f973b105ddbde4a8fdb8bJeff Sharkey        if (mAppEntry != null) {
635347188667b984fb43e8f973b105ddbde4a8fdb8bJeff Sharkey            // Get application info again to refresh changed properties of application
636347188667b984fb43e8f973b105ddbde4a8fdb8bJeff Sharkey            try {
637347188667b984fb43e8f973b105ddbde4a8fdb8bJeff Sharkey                mPackageInfo = mPm.getPackageInfo(mAppEntry.info.packageName,
638347188667b984fb43e8f973b105ddbde4a8fdb8bJeff Sharkey                        PackageManager.GET_DISABLED_COMPONENTS |
639347188667b984fb43e8f973b105ddbde4a8fdb8bJeff Sharkey                        PackageManager.GET_UNINSTALLED_PACKAGES |
640347188667b984fb43e8f973b105ddbde4a8fdb8bJeff Sharkey                        PackageManager.GET_SIGNATURES);
641347188667b984fb43e8f973b105ddbde4a8fdb8bJeff Sharkey            } catch (NameNotFoundException e) {
642347188667b984fb43e8f973b105ddbde4a8fdb8bJeff Sharkey                Log.e(TAG, "Exception when retrieving package:" + mAppEntry.info.packageName, e);
643347188667b984fb43e8f973b105ddbde4a8fdb8bJeff Sharkey            }
644347188667b984fb43e8f973b105ddbde4a8fdb8bJeff Sharkey        } else {
645347188667b984fb43e8f973b105ddbde4a8fdb8bJeff Sharkey            Log.w(TAG, "Missing AppEntry; maybe reinstalling?");
646347188667b984fb43e8f973b105ddbde4a8fdb8bJeff Sharkey            mPackageInfo = null;
647b1bf9cf3835ce41f3864f1056554f0180624e2c7Amith Yamasani        }
648b1bf9cf3835ce41f3864f1056554f0180624e2c7Amith Yamasani
6490fca4296ac08fcf42b58fac3a016ea068fcf6257Dianne Hackborn        return packageName;
6500fca4296ac08fcf42b58fac3a016ea068fcf6257Dianne Hackborn    }
6510fca4296ac08fcf42b58fac3a016ea068fcf6257Dianne Hackborn
6528243c9a722e815bdcb069163de48877478c28dfdChristopher Tate    private boolean signaturesMatch(String pkg1, String pkg2) {
6538243c9a722e815bdcb069163de48877478c28dfdChristopher Tate        if (pkg1 != null && pkg2 != null) {
6548243c9a722e815bdcb069163de48877478c28dfdChristopher Tate            try {
6558243c9a722e815bdcb069163de48877478c28dfdChristopher Tate                final int match = mPm.checkSignatures(pkg1, pkg2);
6568243c9a722e815bdcb069163de48877478c28dfdChristopher Tate                if (match >= PackageManager.SIGNATURE_MATCH) {
6578243c9a722e815bdcb069163de48877478c28dfdChristopher Tate                    return true;
6588243c9a722e815bdcb069163de48877478c28dfdChristopher Tate                }
6598243c9a722e815bdcb069163de48877478c28dfdChristopher Tate            } catch (Exception e) {
6608243c9a722e815bdcb069163de48877478c28dfdChristopher Tate                // e.g. named alternate package not found during lookup;
6618243c9a722e815bdcb069163de48877478c28dfdChristopher Tate                // this is an expected case sometimes
6628243c9a722e815bdcb069163de48877478c28dfdChristopher Tate            }
6638243c9a722e815bdcb069163de48877478c28dfdChristopher Tate        }
6648243c9a722e815bdcb069163de48877478c28dfdChristopher Tate        return false;
6658243c9a722e815bdcb069163de48877478c28dfdChristopher Tate    }
6668243c9a722e815bdcb069163de48877478c28dfdChristopher Tate
6670fca4296ac08fcf42b58fac3a016ea068fcf6257Dianne Hackborn    private boolean refreshUi() {
6680fca4296ac08fcf42b58fac3a016ea068fcf6257Dianne Hackborn        if (mMoveInProgress) {
6690fca4296ac08fcf42b58fac3a016ea068fcf6257Dianne Hackborn            return true;
6700fca4296ac08fcf42b58fac3a016ea068fcf6257Dianne Hackborn        }
6710fca4296ac08fcf42b58fac3a016ea068fcf6257Dianne Hackborn        final String packageName = retrieveAppEntry();
6720fca4296ac08fcf42b58fac3a016ea068fcf6257Dianne Hackborn
6730f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn        if (mAppEntry == null) {
6740f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn            return false; // onCreate must have failed, make sure to exit
675b0bcf9f7f50b56cb15a72be39fe11fe1351992c1Jeff Brown        }
676b1bf9cf3835ce41f3864f1056554f0180624e2c7Amith Yamasani
677b1bf9cf3835ce41f3864f1056554f0180624e2c7Amith Yamasani        if (mPackageInfo == null) {
6780f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn            return false; // onCreate must have failed, make sure to exit
67950b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu        }
680b1bf9cf3835ce41f3864f1056554f0180624e2c7Amith Yamasani
6818243c9a722e815bdcb069163de48877478c28dfdChristopher Tate        // Get list of "home" apps and trace through any meta-data references
6828243c9a722e815bdcb069163de48877478c28dfdChristopher Tate        List<ResolveInfo> homeActivities = new ArrayList<ResolveInfo>();
6838243c9a722e815bdcb069163de48877478c28dfdChristopher Tate        mPm.getHomeActivities(homeActivities);
6848243c9a722e815bdcb069163de48877478c28dfdChristopher Tate        mHomePackages.clear();
6858243c9a722e815bdcb069163de48877478c28dfdChristopher Tate        for (int i = 0; i< homeActivities.size(); i++) {
6868243c9a722e815bdcb069163de48877478c28dfdChristopher Tate            ResolveInfo ri = homeActivities.get(i);
6878243c9a722e815bdcb069163de48877478c28dfdChristopher Tate            final String activityPkg = ri.activityInfo.packageName;
6888243c9a722e815bdcb069163de48877478c28dfdChristopher Tate            mHomePackages.add(activityPkg);
6898243c9a722e815bdcb069163de48877478c28dfdChristopher Tate
6908243c9a722e815bdcb069163de48877478c28dfdChristopher Tate            // Also make sure to include anything proxying for the home app
6918243c9a722e815bdcb069163de48877478c28dfdChristopher Tate            final Bundle metadata = ri.activityInfo.metaData;
6928243c9a722e815bdcb069163de48877478c28dfdChristopher Tate            if (metadata != null) {
6938243c9a722e815bdcb069163de48877478c28dfdChristopher Tate                final String metaPkg = metadata.getString(ActivityManager.META_HOME_ALTERNATE);
6948243c9a722e815bdcb069163de48877478c28dfdChristopher Tate                if (signaturesMatch(metaPkg, activityPkg)) {
6958243c9a722e815bdcb069163de48877478c28dfdChristopher Tate                    mHomePackages.add(metaPkg);
6968243c9a722e815bdcb069163de48877478c28dfdChristopher Tate                }
6978243c9a722e815bdcb069163de48877478c28dfdChristopher Tate            }
6988243c9a722e815bdcb069163de48877478c28dfdChristopher Tate        }
6998243c9a722e815bdcb069163de48877478c28dfdChristopher Tate
7000f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn        // Get list of preferred activities
7010f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn        List<ComponentName> prefActList = new ArrayList<ComponentName>();
702b0bcf9f7f50b56cb15a72be39fe11fe1351992c1Jeff Brown
7030f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn        // Intent list cannot be null. so pass empty list
7040f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn        List<IntentFilter> intentList = new ArrayList<IntentFilter>();
7050f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn        mPm.getPreferredActivities(intentList, prefActList, packageName);
706c9029d99a36d78331b109b64c1f61812db7cedd9Michael Jurka        if (localLOGV)
707c9029d99a36d78331b109b64c1f61812db7cedd9Michael Jurka            Log.i(TAG, "Have " + prefActList.size() + " number of activities in preferred list");
7089d6d92b33ebf1c91aed47bd759ce78a3e06afff5Mike Lockwood        boolean hasUsbDefaults = false;
7099d6d92b33ebf1c91aed47bd759ce78a3e06afff5Mike Lockwood        try {
710be32d4b408a2fd0ec25bdd4f0e67cba2f23a4edbJeff Sharkey            hasUsbDefaults = mUsbManager.hasDefaults(packageName, UserHandle.myUserId());
7119d6d92b33ebf1c91aed47bd759ce78a3e06afff5Mike Lockwood        } catch (RemoteException e) {
7129d6d92b33ebf1c91aed47bd759ce78a3e06afff5Mike Lockwood            Log.e(TAG, "mUsbManager.hasDefaults", e);
7139d6d92b33ebf1c91aed47bd759ce78a3e06afff5Mike Lockwood        }
714c9029d99a36d78331b109b64c1f61812db7cedd9Michael Jurka        boolean hasBindAppWidgetPermission =
715c9029d99a36d78331b109b64c1f61812db7cedd9Michael Jurka                mAppWidgetManager.hasBindAppWidgetPermission(mAppEntry.info.packageName);
716c9029d99a36d78331b109b64c1f61812db7cedd9Michael Jurka
717c9029d99a36d78331b109b64c1f61812db7cedd9Michael Jurka        TextView autoLaunchTitleView = (TextView) mRootView.findViewById(R.id.auto_launch_title);
718c9029d99a36d78331b109b64c1f61812db7cedd9Michael Jurka        TextView autoLaunchView = (TextView) mRootView.findViewById(R.id.auto_launch);
719c9029d99a36d78331b109b64c1f61812db7cedd9Michael Jurka        boolean autoLaunchEnabled = prefActList.size() > 0 || hasUsbDefaults;
720c9029d99a36d78331b109b64c1f61812db7cedd9Michael Jurka        if (!autoLaunchEnabled && !hasBindAppWidgetPermission) {
721c9029d99a36d78331b109b64c1f61812db7cedd9Michael Jurka            resetLaunchDefaultsUi(autoLaunchTitleView, autoLaunchView);
7220f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn        } else {
723c9029d99a36d78331b109b64c1f61812db7cedd9Michael Jurka            boolean useBullets = hasBindAppWidgetPermission && autoLaunchEnabled;
724c9029d99a36d78331b109b64c1f61812db7cedd9Michael Jurka
725c9029d99a36d78331b109b64c1f61812db7cedd9Michael Jurka            if (hasBindAppWidgetPermission) {
726c9029d99a36d78331b109b64c1f61812db7cedd9Michael Jurka                autoLaunchTitleView.setText(R.string.auto_launch_label_generic);
727c9029d99a36d78331b109b64c1f61812db7cedd9Michael Jurka            } else {
728c9029d99a36d78331b109b64c1f61812db7cedd9Michael Jurka                autoLaunchTitleView.setText(R.string.auto_launch_label);
729c9029d99a36d78331b109b64c1f61812db7cedd9Michael Jurka            }
730c9029d99a36d78331b109b64c1f61812db7cedd9Michael Jurka
731c9029d99a36d78331b109b64c1f61812db7cedd9Michael Jurka            CharSequence text = null;
732c9029d99a36d78331b109b64c1f61812db7cedd9Michael Jurka            int bulletIndent = getResources()
733c9029d99a36d78331b109b64c1f61812db7cedd9Michael Jurka                    .getDimensionPixelSize(R.dimen.installed_app_details_bullet_offset);
734c9029d99a36d78331b109b64c1f61812db7cedd9Michael Jurka            if (autoLaunchEnabled) {
735c9029d99a36d78331b109b64c1f61812db7cedd9Michael Jurka                CharSequence autoLaunchEnableText = getText(R.string.auto_launch_enable_text);
736c9029d99a36d78331b109b64c1f61812db7cedd9Michael Jurka                SpannableString s = new SpannableString(autoLaunchEnableText);
737c9029d99a36d78331b109b64c1f61812db7cedd9Michael Jurka                if (useBullets) {
738c9029d99a36d78331b109b64c1f61812db7cedd9Michael Jurka                    s.setSpan(new BulletSpan(bulletIndent), 0, autoLaunchEnableText.length(), 0);
739c9029d99a36d78331b109b64c1f61812db7cedd9Michael Jurka                }
740c9029d99a36d78331b109b64c1f61812db7cedd9Michael Jurka                text = (text == null) ?
741c9029d99a36d78331b109b64c1f61812db7cedd9Michael Jurka                        TextUtils.concat(s, "\n") : TextUtils.concat(text, "\n", s, "\n");
742c9029d99a36d78331b109b64c1f61812db7cedd9Michael Jurka            }
743c9029d99a36d78331b109b64c1f61812db7cedd9Michael Jurka            if (hasBindAppWidgetPermission) {
744c9029d99a36d78331b109b64c1f61812db7cedd9Michael Jurka                CharSequence alwaysAllowBindAppWidgetsText =
745c9029d99a36d78331b109b64c1f61812db7cedd9Michael Jurka                        getText(R.string.always_allow_bind_appwidgets_text);
746c9029d99a36d78331b109b64c1f61812db7cedd9Michael Jurka                SpannableString s = new SpannableString(alwaysAllowBindAppWidgetsText);
747c9029d99a36d78331b109b64c1f61812db7cedd9Michael Jurka                if (useBullets) {
748c9029d99a36d78331b109b64c1f61812db7cedd9Michael Jurka                    s.setSpan(new BulletSpan(bulletIndent),
749c9029d99a36d78331b109b64c1f61812db7cedd9Michael Jurka                            0, alwaysAllowBindAppWidgetsText.length(), 0);
750c9029d99a36d78331b109b64c1f61812db7cedd9Michael Jurka                }
751c9029d99a36d78331b109b64c1f61812db7cedd9Michael Jurka                text = (text == null) ?
752c9029d99a36d78331b109b64c1f61812db7cedd9Michael Jurka                        TextUtils.concat(s, "\n") : TextUtils.concat(text, "\n", s, "\n");
753c9029d99a36d78331b109b64c1f61812db7cedd9Michael Jurka            }
754c9029d99a36d78331b109b64c1f61812db7cedd9Michael Jurka            autoLaunchView.setText(text);
7550f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn            mActivitiesButton.setEnabled(true);
7560f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn            mActivitiesButton.setOnClickListener(this);
7570f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn        }
758aef746c45f14c8a170dba48c4b55f93cae0e24e4Dianne Hackborn
759aef746c45f14c8a170dba48c4b55f93cae0e24e4Dianne Hackborn        // Screen compatibility section.
760aef746c45f14c8a170dba48c4b55f93cae0e24e4Dianne Hackborn        ActivityManager am = (ActivityManager)
761aef746c45f14c8a170dba48c4b55f93cae0e24e4Dianne Hackborn                getActivity().getSystemService(Context.ACTIVITY_SERVICE);
762aef746c45f14c8a170dba48c4b55f93cae0e24e4Dianne Hackborn        int compatMode = am.getPackageScreenCompatMode(packageName);
76313bac39d2120a82b8a22b52f0db0727aa04b1f38Dianne Hackborn        // For now these are always off; this is the old UI model which we
76413bac39d2120a82b8a22b52f0db0727aa04b1f38Dianne Hackborn        // are no longer using.
76513bac39d2120a82b8a22b52f0db0727aa04b1f38Dianne Hackborn        if (false && (compatMode == ActivityManager.COMPAT_MODE_DISABLED
76613bac39d2120a82b8a22b52f0db0727aa04b1f38Dianne Hackborn                || compatMode == ActivityManager.COMPAT_MODE_ENABLED)) {
767aef746c45f14c8a170dba48c4b55f93cae0e24e4Dianne Hackborn            mScreenCompatSection.setVisibility(View.VISIBLE);
768aef746c45f14c8a170dba48c4b55f93cae0e24e4Dianne Hackborn            mAskCompatibilityCB.setChecked(am.getPackageAskScreenCompat(packageName));
769aef746c45f14c8a170dba48c4b55f93cae0e24e4Dianne Hackborn            mAskCompatibilityCB.setOnCheckedChangeListener(this);
770aef746c45f14c8a170dba48c4b55f93cae0e24e4Dianne Hackborn            mEnableCompatibilityCB.setChecked(compatMode == ActivityManager.COMPAT_MODE_ENABLED);
771aef746c45f14c8a170dba48c4b55f93cae0e24e4Dianne Hackborn            mEnableCompatibilityCB.setOnCheckedChangeListener(this);
772aef746c45f14c8a170dba48c4b55f93cae0e24e4Dianne Hackborn        } else {
773aef746c45f14c8a170dba48c4b55f93cae0e24e4Dianne Hackborn            mScreenCompatSection.setVisibility(View.GONE);
774aef746c45f14c8a170dba48c4b55f93cae0e24e4Dianne Hackborn        }
775aef746c45f14c8a170dba48c4b55f93cae0e24e4Dianne Hackborn
7760f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn        // Security permissions section
777f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn        LinearLayout permsView = (LinearLayout) mRootView.findViewById(R.id.permissions_section);
778f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn        AppSecurityPermissions asp = new AppSecurityPermissions(getActivity(), packageName);
7793465b67740e17711af2b36b09e2250a02275d860Jake Hamby        int premiumSmsPermission = getPremiumSmsPermission(packageName);
7803465b67740e17711af2b36b09e2250a02275d860Jake Hamby        // Premium SMS permission implies the app also has SEND_SMS permission, so the original
7813465b67740e17711af2b36b09e2250a02275d860Jake Hamby        // application permissions list doesn't have to be shown/hidden separately. The premium
7823465b67740e17711af2b36b09e2250a02275d860Jake Hamby        // SMS subsection should only be visible if the app has tried to send to a premium SMS.
7833465b67740e17711af2b36b09e2250a02275d860Jake Hamby        if (asp.getPermissionCount() > 0
7843465b67740e17711af2b36b09e2250a02275d860Jake Hamby                || premiumSmsPermission != SmsUsageMonitor.PREMIUM_SMS_PERMISSION_UNKNOWN) {
7850f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn            permsView.setVisibility(View.VISIBLE);
7863465b67740e17711af2b36b09e2250a02275d860Jake Hamby        } else {
7873465b67740e17711af2b36b09e2250a02275d860Jake Hamby            permsView.setVisibility(View.GONE);
7883465b67740e17711af2b36b09e2250a02275d860Jake Hamby        }
7893465b67740e17711af2b36b09e2250a02275d860Jake Hamby        // Premium SMS permission subsection
7903465b67740e17711af2b36b09e2250a02275d860Jake Hamby        TextView securityBillingDesc = (TextView) permsView.findViewById(
7913465b67740e17711af2b36b09e2250a02275d860Jake Hamby                R.id.security_settings_billing_desc);
7923465b67740e17711af2b36b09e2250a02275d860Jake Hamby        LinearLayout securityBillingList = (LinearLayout) permsView.findViewById(
7933465b67740e17711af2b36b09e2250a02275d860Jake Hamby                R.id.security_settings_billing_list);
7943465b67740e17711af2b36b09e2250a02275d860Jake Hamby        if (premiumSmsPermission != SmsUsageMonitor.PREMIUM_SMS_PERMISSION_UNKNOWN) {
7953465b67740e17711af2b36b09e2250a02275d860Jake Hamby            // Show the premium SMS permission selector
7963465b67740e17711af2b36b09e2250a02275d860Jake Hamby            securityBillingDesc.setVisibility(View.VISIBLE);
7973465b67740e17711af2b36b09e2250a02275d860Jake Hamby            securityBillingList.setVisibility(View.VISIBLE);
7983465b67740e17711af2b36b09e2250a02275d860Jake Hamby            Spinner spinner = (Spinner) permsView.findViewById(
7993465b67740e17711af2b36b09e2250a02275d860Jake Hamby                    R.id.security_settings_premium_sms_list);
8003465b67740e17711af2b36b09e2250a02275d860Jake Hamby            ArrayAdapter<CharSequence> adapter = ArrayAdapter.createFromResource(getActivity(),
8013465b67740e17711af2b36b09e2250a02275d860Jake Hamby                    R.array.security_settings_premium_sms_values,
8023465b67740e17711af2b36b09e2250a02275d860Jake Hamby                    android.R.layout.simple_spinner_item);
8033465b67740e17711af2b36b09e2250a02275d860Jake Hamby            adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
8043465b67740e17711af2b36b09e2250a02275d860Jake Hamby            spinner.setAdapter(adapter);
8053465b67740e17711af2b36b09e2250a02275d860Jake Hamby            // List items are in the same order as SmsUsageMonitor constants, offset by 1.
8063465b67740e17711af2b36b09e2250a02275d860Jake Hamby            spinner.setSelection(premiumSmsPermission - 1);
8073465b67740e17711af2b36b09e2250a02275d860Jake Hamby            spinner.setOnItemSelectedListener(new PremiumSmsSelectionListener(
8083465b67740e17711af2b36b09e2250a02275d860Jake Hamby                    packageName, mSmsManager));
8093465b67740e17711af2b36b09e2250a02275d860Jake Hamby        } else {
8103465b67740e17711af2b36b09e2250a02275d860Jake Hamby            // Hide the premium SMS permission selector
8113465b67740e17711af2b36b09e2250a02275d860Jake Hamby            securityBillingDesc.setVisibility(View.GONE);
8123465b67740e17711af2b36b09e2250a02275d860Jake Hamby            securityBillingList.setVisibility(View.GONE);
8133465b67740e17711af2b36b09e2250a02275d860Jake Hamby        }
8143465b67740e17711af2b36b09e2250a02275d860Jake Hamby        // App permissions subsection
8153465b67740e17711af2b36b09e2250a02275d860Jake Hamby        if (asp.getPermissionCount() > 0) {
8160f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn            // Make the security sections header visible
8170f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn            LinearLayout securityList = (LinearLayout) permsView.findViewById(
8180f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn                    R.id.security_settings_list);
8190f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn            securityList.removeAllViews();
820b26a61d6433e2e5456563e5d33aa4f419a8966fbNick Kralevich            securityList.addView(asp.getPermissionsViewWithRevokeButtons());
821e458832c765ed5c3de836384338c7626c80b5686Dianne Hackborn            // If this app is running under a shared user ID with other apps,
822e458832c765ed5c3de836384338c7626c80b5686Dianne Hackborn            // update the description to explain this.
823e458832c765ed5c3de836384338c7626c80b5686Dianne Hackborn            String[] packages = mPm.getPackagesForUid(mPackageInfo.applicationInfo.uid);
824e458832c765ed5c3de836384338c7626c80b5686Dianne Hackborn            if (packages != null && packages.length > 1) {
825e458832c765ed5c3de836384338c7626c80b5686Dianne Hackborn                ArrayList<CharSequence> pnames = new ArrayList<CharSequence>();
826e458832c765ed5c3de836384338c7626c80b5686Dianne Hackborn                for (int i=0; i<packages.length; i++) {
827e458832c765ed5c3de836384338c7626c80b5686Dianne Hackborn                    String pkg = packages[i];
828e458832c765ed5c3de836384338c7626c80b5686Dianne Hackborn                    if (mPackageInfo.packageName.equals(pkg)) {
829e458832c765ed5c3de836384338c7626c80b5686Dianne Hackborn                        continue;
830e458832c765ed5c3de836384338c7626c80b5686Dianne Hackborn                    }
831e458832c765ed5c3de836384338c7626c80b5686Dianne Hackborn                    try {
832e458832c765ed5c3de836384338c7626c80b5686Dianne Hackborn                        ApplicationInfo ainfo = mPm.getApplicationInfo(pkg, 0);
833e458832c765ed5c3de836384338c7626c80b5686Dianne Hackborn                        pnames.add(ainfo.loadLabel(mPm));
834e458832c765ed5c3de836384338c7626c80b5686Dianne Hackborn                    } catch (PackageManager.NameNotFoundException e) {
835e458832c765ed5c3de836384338c7626c80b5686Dianne Hackborn                    }
836e458832c765ed5c3de836384338c7626c80b5686Dianne Hackborn                }
837e458832c765ed5c3de836384338c7626c80b5686Dianne Hackborn                final int N = pnames.size();
838e458832c765ed5c3de836384338c7626c80b5686Dianne Hackborn                if (N > 0) {
839e458832c765ed5c3de836384338c7626c80b5686Dianne Hackborn                    final Resources res = getActivity().getResources();
840e458832c765ed5c3de836384338c7626c80b5686Dianne Hackborn                    String appListStr;
841e458832c765ed5c3de836384338c7626c80b5686Dianne Hackborn                    if (N == 1) {
842e458832c765ed5c3de836384338c7626c80b5686Dianne Hackborn                        appListStr = pnames.get(0).toString();
843e458832c765ed5c3de836384338c7626c80b5686Dianne Hackborn                    } else if (N == 2) {
844e458832c765ed5c3de836384338c7626c80b5686Dianne Hackborn                        appListStr = res.getString(R.string.join_two_items, pnames.get(0),
845e458832c765ed5c3de836384338c7626c80b5686Dianne Hackborn                                pnames.get(1));
846e458832c765ed5c3de836384338c7626c80b5686Dianne Hackborn                    } else {
847e458832c765ed5c3de836384338c7626c80b5686Dianne Hackborn                        appListStr = pnames.get(N-2).toString();
848e458832c765ed5c3de836384338c7626c80b5686Dianne Hackborn                        for (int i=N-3; i>=0; i--) {
849e458832c765ed5c3de836384338c7626c80b5686Dianne Hackborn                            appListStr = res.getString(i == 0 ? R.string.join_many_items_first
850e458832c765ed5c3de836384338c7626c80b5686Dianne Hackborn                                    : R.string.join_many_items_middle, pnames.get(i), appListStr);
851e458832c765ed5c3de836384338c7626c80b5686Dianne Hackborn                        }
852e458832c765ed5c3de836384338c7626c80b5686Dianne Hackborn                        appListStr = res.getString(R.string.join_many_items_last,
853e458832c765ed5c3de836384338c7626c80b5686Dianne Hackborn                                appListStr, pnames.get(N-1));
854e458832c765ed5c3de836384338c7626c80b5686Dianne Hackborn                    }
855e458832c765ed5c3de836384338c7626c80b5686Dianne Hackborn                    TextView descr = (TextView) mRootView.findViewById(
856e458832c765ed5c3de836384338c7626c80b5686Dianne Hackborn                            R.id.security_settings_desc);
857e458832c765ed5c3de836384338c7626c80b5686Dianne Hackborn                    descr.setText(res.getString(R.string.security_settings_desc_multi,
858e458832c765ed5c3de836384338c7626c80b5686Dianne Hackborn                            mPackageInfo.applicationInfo.loadLabel(mPm), appListStr));
859e458832c765ed5c3de836384338c7626c80b5686Dianne Hackborn                }
860e458832c765ed5c3de836384338c7626c80b5686Dianne Hackborn            }
861de03ac27b74d1d69c1fea36e7fb00f068ab16b21Suchi Amalapurapu        }
8620f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn
8630f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn        checkForceStop();
8640f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn        setAppLabelAndIcon(mPackageInfo);
8650f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn        refreshButtons();
8660f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn        refreshSizeInfo();
867ab616d477be693fc455329953711264af0ed7814Dianne Hackborn
868ab616d477be693fc455329953711264af0ed7814Dianne Hackborn        if (!mInitialized) {
869ab616d477be693fc455329953711264af0ed7814Dianne Hackborn            // First time init: are we displaying an uninstalled app?
870ab616d477be693fc455329953711264af0ed7814Dianne Hackborn            mInitialized = true;
871ab616d477be693fc455329953711264af0ed7814Dianne Hackborn            mShowUninstalled = (mAppEntry.info.flags&ApplicationInfo.FLAG_INSTALLED) == 0;
8724de4061c8bb9475cbc5d98f83bf3b2c8ec222407Dianne Hackborn        } else {
8734de4061c8bb9475cbc5d98f83bf3b2c8ec222407Dianne Hackborn            // All other times: if the app no longer exists then we want
8744de4061c8bb9475cbc5d98f83bf3b2c8ec222407Dianne Hackborn            // to go away.
8759072d9efc6f9c4ef260736c345e81390ac988d7aDianne Hackborn            try {
8769072d9efc6f9c4ef260736c345e81390ac988d7aDianne Hackborn                ApplicationInfo ainfo = getActivity().getPackageManager().getApplicationInfo(
8779072d9efc6f9c4ef260736c345e81390ac988d7aDianne Hackborn                        mAppEntry.info.packageName, PackageManager.GET_UNINSTALLED_PACKAGES
8789072d9efc6f9c4ef260736c345e81390ac988d7aDianne Hackborn                        | PackageManager.GET_DISABLED_COMPONENTS);
8794de4061c8bb9475cbc5d98f83bf3b2c8ec222407Dianne Hackborn                if (!mShowUninstalled) {
8804de4061c8bb9475cbc5d98f83bf3b2c8ec222407Dianne Hackborn                    // If we did not start out with the app uninstalled, then
8814de4061c8bb9475cbc5d98f83bf3b2c8ec222407Dianne Hackborn                    // it transitioning to the uninstalled state for the current
8824de4061c8bb9475cbc5d98f83bf3b2c8ec222407Dianne Hackborn                    // user means we should go away as well.
8834de4061c8bb9475cbc5d98f83bf3b2c8ec222407Dianne Hackborn                    return (ainfo.flags&ApplicationInfo.FLAG_INSTALLED) != 0;
8844de4061c8bb9475cbc5d98f83bf3b2c8ec222407Dianne Hackborn                }
8859072d9efc6f9c4ef260736c345e81390ac988d7aDianne Hackborn            } catch (NameNotFoundException e) {
8869072d9efc6f9c4ef260736c345e81390ac988d7aDianne Hackborn                return false;
8879072d9efc6f9c4ef260736c345e81390ac988d7aDianne Hackborn            }
888ab616d477be693fc455329953711264af0ed7814Dianne Hackborn        }
889ab616d477be693fc455329953711264af0ed7814Dianne Hackborn
8900f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn        return true;
891afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    }
8923465b67740e17711af2b36b09e2250a02275d860Jake Hamby
8933465b67740e17711af2b36b09e2250a02275d860Jake Hamby    private static class PremiumSmsSelectionListener implements AdapterView.OnItemSelectedListener {
8943465b67740e17711af2b36b09e2250a02275d860Jake Hamby        private final String mPackageName;
8953465b67740e17711af2b36b09e2250a02275d860Jake Hamby        private final ISms mSmsManager;
8963465b67740e17711af2b36b09e2250a02275d860Jake Hamby
8973465b67740e17711af2b36b09e2250a02275d860Jake Hamby        PremiumSmsSelectionListener(String packageName, ISms smsManager) {
8983465b67740e17711af2b36b09e2250a02275d860Jake Hamby            mPackageName = packageName;
8993465b67740e17711af2b36b09e2250a02275d860Jake Hamby            mSmsManager = smsManager;
9003465b67740e17711af2b36b09e2250a02275d860Jake Hamby        }
9013465b67740e17711af2b36b09e2250a02275d860Jake Hamby
9023465b67740e17711af2b36b09e2250a02275d860Jake Hamby        @Override
9033465b67740e17711af2b36b09e2250a02275d860Jake Hamby        public void onItemSelected(AdapterView<?> parent, View view, int position,
9043465b67740e17711af2b36b09e2250a02275d860Jake Hamby                long id) {
9053465b67740e17711af2b36b09e2250a02275d860Jake Hamby            if (position >= 0 && position < 3) {
9063465b67740e17711af2b36b09e2250a02275d860Jake Hamby                Log.d(TAG, "Selected premium SMS policy " + position);
9073465b67740e17711af2b36b09e2250a02275d860Jake Hamby                setPremiumSmsPermission(mPackageName, (position + 1));
9083465b67740e17711af2b36b09e2250a02275d860Jake Hamby            } else {
9093465b67740e17711af2b36b09e2250a02275d860Jake Hamby                Log.e(TAG, "Error: unknown premium SMS policy " + position);
9103465b67740e17711af2b36b09e2250a02275d860Jake Hamby            }
9113465b67740e17711af2b36b09e2250a02275d860Jake Hamby        }
9123465b67740e17711af2b36b09e2250a02275d860Jake Hamby
9133465b67740e17711af2b36b09e2250a02275d860Jake Hamby        @Override
9143465b67740e17711af2b36b09e2250a02275d860Jake Hamby        public void onNothingSelected(AdapterView<?> parent) {
9153465b67740e17711af2b36b09e2250a02275d860Jake Hamby            // Ignored
9163465b67740e17711af2b36b09e2250a02275d860Jake Hamby        }
9173465b67740e17711af2b36b09e2250a02275d860Jake Hamby
9183465b67740e17711af2b36b09e2250a02275d860Jake Hamby        private void setPremiumSmsPermission(String packageName, int permission) {
9193465b67740e17711af2b36b09e2250a02275d860Jake Hamby            try {
9203465b67740e17711af2b36b09e2250a02275d860Jake Hamby                if (mSmsManager != null) {
9213465b67740e17711af2b36b09e2250a02275d860Jake Hamby                    mSmsManager.setPremiumSmsPermission(packageName, permission);
9223465b67740e17711af2b36b09e2250a02275d860Jake Hamby                }
9233465b67740e17711af2b36b09e2250a02275d860Jake Hamby            } catch (RemoteException ex) {
9243465b67740e17711af2b36b09e2250a02275d860Jake Hamby                // ignored
9253465b67740e17711af2b36b09e2250a02275d860Jake Hamby            }
9263465b67740e17711af2b36b09e2250a02275d860Jake Hamby        }
9273465b67740e17711af2b36b09e2250a02275d860Jake Hamby    }
9280f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn
929c9029d99a36d78331b109b64c1f61812db7cedd9Michael Jurka    private void resetLaunchDefaultsUi(TextView title, TextView autoLaunchView) {
930c9029d99a36d78331b109b64c1f61812db7cedd9Michael Jurka        title.setText(R.string.auto_launch_label);
931c9029d99a36d78331b109b64c1f61812db7cedd9Michael Jurka        autoLaunchView.setText(R.string.auto_launch_disable_text);
932c9029d99a36d78331b109b64c1f61812db7cedd9Michael Jurka        // Disable clear activities button
933c9029d99a36d78331b109b64c1f61812db7cedd9Michael Jurka        mActivitiesButton.setEnabled(false);
934c9029d99a36d78331b109b64c1f61812db7cedd9Michael Jurka    }
935c9029d99a36d78331b109b64c1f61812db7cedd9Michael Jurka
936afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private void setIntentAndFinish(boolean finish, boolean appChanged) {
937afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        if(localLOGV) Log.i(TAG, "appChanged="+appChanged);
938afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        Intent intent = new Intent();
939afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        intent.putExtra(ManageApplications.APP_CHG, appChanged);
940ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn        PreferenceActivity pa = (PreferenceActivity)getActivity();
941ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn        pa.finishPreferencePanel(this, Activity.RESULT_OK, intent);
942afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    }
943afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
9440f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn    private void refreshSizeInfo() {
9450f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn        if (mAppEntry.size == ApplicationsState.SIZE_INVALID
9460f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn                || mAppEntry.size == ApplicationsState.SIZE_UNKNOWN) {
9470f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn            mLastCodeSize = mLastDataSize = mLastCacheSize = mLastTotalSize = -1;
9480f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn            if (!mHaveSizes) {
9490f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn                mAppSize.setText(mComputingStr);
9500f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn                mDataSize.setText(mComputingStr);
9510f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn                mCacheSize.setText(mComputingStr);
9520f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn                mTotalSize.setText(mComputingStr);
9530f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn            }
9540f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn            mClearDataButton.setEnabled(false);
9550f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn            mClearCacheButton.setEnabled(false);
9560f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn
957afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        } else {
9580f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn            mHaveSizes = true;
9591f6ddac9f41f341073e7cedd8f777a43b7d11679Dianne Hackborn            long codeSize = mAppEntry.codeSize;
9601f6ddac9f41f341073e7cedd8f777a43b7d11679Dianne Hackborn            long dataSize = mAppEntry.dataSize;
9611f6ddac9f41f341073e7cedd8f777a43b7d11679Dianne Hackborn            if (Environment.isExternalStorageEmulated()) {
9621f6ddac9f41f341073e7cedd8f777a43b7d11679Dianne Hackborn                codeSize += mAppEntry.externalCodeSize;
9631f6ddac9f41f341073e7cedd8f777a43b7d11679Dianne Hackborn                dataSize +=  mAppEntry.externalDataSize;
9641f6ddac9f41f341073e7cedd8f777a43b7d11679Dianne Hackborn            } else {
9651f6ddac9f41f341073e7cedd8f777a43b7d11679Dianne Hackborn                if (mLastExternalCodeSize != mAppEntry.externalCodeSize) {
9661f6ddac9f41f341073e7cedd8f777a43b7d11679Dianne Hackborn                    mLastExternalCodeSize = mAppEntry.externalCodeSize;
9671f6ddac9f41f341073e7cedd8f777a43b7d11679Dianne Hackborn                    mExternalCodeSize.setText(getSizeStr(mAppEntry.externalCodeSize));
9681f6ddac9f41f341073e7cedd8f777a43b7d11679Dianne Hackborn                }
9691f6ddac9f41f341073e7cedd8f777a43b7d11679Dianne Hackborn                if (mLastExternalDataSize !=  mAppEntry.externalDataSize) {
9701f6ddac9f41f341073e7cedd8f777a43b7d11679Dianne Hackborn                    mLastExternalDataSize =  mAppEntry.externalDataSize;
9711f6ddac9f41f341073e7cedd8f777a43b7d11679Dianne Hackborn                    mExternalDataSize.setText(getSizeStr( mAppEntry.externalDataSize));
9721f6ddac9f41f341073e7cedd8f777a43b7d11679Dianne Hackborn                }
973afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            }
9741f6ddac9f41f341073e7cedd8f777a43b7d11679Dianne Hackborn            if (mLastCodeSize != codeSize) {
9751f6ddac9f41f341073e7cedd8f777a43b7d11679Dianne Hackborn                mLastCodeSize = codeSize;
9761f6ddac9f41f341073e7cedd8f777a43b7d11679Dianne Hackborn                mAppSize.setText(getSizeStr(codeSize));
977bd9ddab4f4e1f47b141abdcc0248cc716112b3c7Dianne Hackborn            }
9781f6ddac9f41f341073e7cedd8f777a43b7d11679Dianne Hackborn            if (mLastDataSize != dataSize) {
9791f6ddac9f41f341073e7cedd8f777a43b7d11679Dianne Hackborn                mLastDataSize = dataSize;
9801f6ddac9f41f341073e7cedd8f777a43b7d11679Dianne Hackborn                mDataSize.setText(getSizeStr(dataSize));
981424acfb7ad469efb0a51c69fc8713cc96e2357b0Kenny Root            }
982313ab1727014d535790bc89afdcf725ff936e5b4Dianne Hackborn            long cacheSize = mAppEntry.cacheSize + mAppEntry.externalCacheSize;
983313ab1727014d535790bc89afdcf725ff936e5b4Dianne Hackborn            if (mLastCacheSize != cacheSize) {
984313ab1727014d535790bc89afdcf725ff936e5b4Dianne Hackborn                mLastCacheSize = cacheSize;
985313ab1727014d535790bc89afdcf725ff936e5b4Dianne Hackborn                mCacheSize.setText(getSizeStr(cacheSize));
986afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            }
9870f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn            if (mLastTotalSize != mAppEntry.size) {
9880f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn                mLastTotalSize = mAppEntry.size;
9890f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn                mTotalSize.setText(getSizeStr(mAppEntry.size));
990afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            }
9910f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn
9921f6ddac9f41f341073e7cedd8f777a43b7d11679Dianne Hackborn            if ((mAppEntry.dataSize+ mAppEntry.externalDataSize) <= 0 || !mCanClearData) {
9930f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn                mClearDataButton.setEnabled(false);
9940f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn            } else {
9950f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn                mClearDataButton.setEnabled(true);
9960f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn                mClearDataButton.setOnClickListener(this);
9970f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn            }
998313ab1727014d535790bc89afdcf725ff936e5b4Dianne Hackborn            if (cacheSize <= 0) {
9990f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn                mClearCacheButton.setEnabled(false);
10000f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn            } else {
10010f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn                mClearCacheButton.setEnabled(true);
10020f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn                mClearCacheButton.setOnClickListener(this);
1003afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            }
1004afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        }
1005afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    }
1006afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
1007afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    /*
1008afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project     * Private method to handle clear message notification from observer when
1009afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project     * the async operation from PackageManager is complete
1010afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project     */
1011afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private void processClearMsg(Message msg) {
1012afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        int result = msg.arg1;
10130f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn        String packageName = mAppEntry.info.packageName;
101442241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu        mClearDataButton.setText(R.string.clear_user_data_text);
1015afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        if(result == OP_SUCCESSFUL) {
101642241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu            Log.i(TAG, "Cleared user data for package : "+packageName);
10170f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn            mState.requestSize(mAppEntry.info.packageName);
1018afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        } else {
101942241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu            mClearDataButton.setEnabled(true);
1020afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        }
10219db5ee35d5345e13e6e6b857dbad5a83e9f037d1Dianne Hackborn        checkForceStop();
1022afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    }
1023ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu
1024de03ac27b74d1d69c1fea36e7fb00f068ab16b21Suchi Amalapurapu    private void refreshButtons() {
1025de03ac27b74d1d69c1fea36e7fb00f068ab16b21Suchi Amalapurapu        if (!mMoveInProgress) {
1026de03ac27b74d1d69c1fea36e7fb00f068ab16b21Suchi Amalapurapu            initUninstallButtons();
1027de03ac27b74d1d69c1fea36e7fb00f068ab16b21Suchi Amalapurapu            initDataButtons();
1028de03ac27b74d1d69c1fea36e7fb00f068ab16b21Suchi Amalapurapu            initMoveButton();
10294a824be44c3878f22469cf45c2ef8b7e92724e92Daniel Sandler            initNotificationButton();
1030de03ac27b74d1d69c1fea36e7fb00f068ab16b21Suchi Amalapurapu        } else {
1031de03ac27b74d1d69c1fea36e7fb00f068ab16b21Suchi Amalapurapu            mMoveAppButton.setText(R.string.moving);
1032de03ac27b74d1d69c1fea36e7fb00f068ab16b21Suchi Amalapurapu            mMoveAppButton.setEnabled(false);
1033de03ac27b74d1d69c1fea36e7fb00f068ab16b21Suchi Amalapurapu            mUninstallButton.setEnabled(false);
10349072d9efc6f9c4ef260736c345e81390ac988d7aDianne Hackborn            mSpecialDisableButton.setEnabled(false);
1035de03ac27b74d1d69c1fea36e7fb00f068ab16b21Suchi Amalapurapu        }
1036de03ac27b74d1d69c1fea36e7fb00f068ab16b21Suchi Amalapurapu    }
1037de03ac27b74d1d69c1fea36e7fb00f068ab16b21Suchi Amalapurapu
1038ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu    private void processMoveMsg(Message msg) {
1039ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu        int result = msg.arg1;
10400f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn        String packageName = mAppEntry.info.packageName;
1041de03ac27b74d1d69c1fea36e7fb00f068ab16b21Suchi Amalapurapu        // Refresh the button attributes.
1042de03ac27b74d1d69c1fea36e7fb00f068ab16b21Suchi Amalapurapu        mMoveInProgress = false;
10430f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn        if (result == PackageManager.MOVE_SUCCEEDED) {
1044ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu            Log.i(TAG, "Moved resources for " + packageName);
1045de03ac27b74d1d69c1fea36e7fb00f068ab16b21Suchi Amalapurapu            // Refresh size information again.
10460f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn            mState.requestSize(mAppEntry.info.packageName);
1047ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu        } else {
1048f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn            showDialogInner(DLG_MOVE_FAILED, result);
1049ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu        }
10500f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn        refreshUi();
1051ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu    }
10525cc062f1cd37cff19a1a7ee6fbb2a6522eee415cSuchi Amalapurapu
1053afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    /*
1054afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project     * Private method to initiate clearing user data when the user clicks the clear data
1055afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project     * button for a system package
1056afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project     */
105742241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu    private  void initiateClearUserData() {
105842241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu        mClearDataButton.setEnabled(false);
105942241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu        // Invoke uninstall or clear user data based on sysPackage
10600f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn        String packageName = mAppEntry.info.packageName;
106142241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu        Log.i(TAG, "Clearing user data for package : " + packageName);
10620f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn        if (mClearDataObserver == null) {
1063afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            mClearDataObserver = new ClearUserDataObserver();
1064afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        }
1065f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn        ActivityManager am = (ActivityManager)
1066f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                getActivity().getSystemService(Context.ACTIVITY_SERVICE);
1067afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        boolean res = am.clearApplicationUserData(packageName, mClearDataObserver);
10680f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn        if (!res) {
106950b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu            // Clearing data failed for some obscure reason. Just log error for now
1070afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            Log.i(TAG, "Couldnt clear application user data for package:"+packageName);
1071f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn            showDialogInner(DLG_CANNOT_CLEAR_DATA, 0);
1072afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        } else {
107342241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu            mClearDataButton.setText(R.string.recompute_size);
1074afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        }
1075afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    }
1076afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
1077f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn    private void showDialogInner(int id, int moveErrorCode) {
1078f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn        DialogFragment newFragment = MyAlertDialogFragment.newInstance(id, moveErrorCode);
1079f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn        newFragment.setTargetFragment(this, 0);
1080f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn        newFragment.show(getFragmentManager(), "dialog " + id);
108150b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu    }
108250b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu
1083f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn    public static class MyAlertDialogFragment extends DialogFragment {
1084f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn
1085f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn        public static MyAlertDialogFragment newInstance(int id, int moveErrorCode) {
1086f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn            MyAlertDialogFragment frag = new MyAlertDialogFragment();
1087f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn            Bundle args = new Bundle();
1088f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn            args.putInt("id", id);
1089f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn            args.putInt("moveError", moveErrorCode);
1090f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn            frag.setArguments(args);
1091f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn            return frag;
1092f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn        }
1093f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn
1094f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn        InstalledAppDetails getOwner() {
1095f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn            return (InstalledAppDetails)getTargetFragment();
1096f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn        }
1097f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn
1098f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn        @Override
1099f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn        public Dialog onCreateDialog(Bundle savedInstanceState) {
1100f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn            int id = getArguments().getInt("id");
1101f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn            int moveErrorCode = getArguments().getInt("moveError");
1102f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn            switch (id) {
1103f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                case DLG_CLEAR_DATA:
1104f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                    return new AlertDialog.Builder(getActivity())
1105f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                    .setTitle(getActivity().getText(R.string.clear_data_dlg_title))
1106e7c53b1c9e48c6f997c47a0ca9a2f190ecbbf586Björn Lundén                    .setIconAttribute(android.R.attr.alertDialogIcon)
1107f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                    .setMessage(getActivity().getText(R.string.clear_data_dlg_text))
1108f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                    .setPositiveButton(R.string.dlg_ok,
1109f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                            new DialogInterface.OnClickListener() {
1110f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                        public void onClick(DialogInterface dialog, int which) {
1111f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                            // Clear user data here
1112f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                            getOwner().initiateClearUserData();
1113f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                        }
1114f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                    })
1115f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                    .setNegativeButton(R.string.dlg_cancel, null)
1116f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                    .create();
1117f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                case DLG_FACTORY_RESET:
1118f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                    return new AlertDialog.Builder(getActivity())
1119f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                    .setTitle(getActivity().getText(R.string.app_factory_reset_dlg_title))
1120e7c53b1c9e48c6f997c47a0ca9a2f190ecbbf586Björn Lundén                    .setIconAttribute(android.R.attr.alertDialogIcon)
1121f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                    .setMessage(getActivity().getText(R.string.app_factory_reset_dlg_text))
1122f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                    .setPositiveButton(R.string.dlg_ok,
1123f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                            new DialogInterface.OnClickListener() {
1124f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                        public void onClick(DialogInterface dialog, int which) {
1125f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                            // Clear user data here
11269072d9efc6f9c4ef260736c345e81390ac988d7aDianne Hackborn                            getOwner().uninstallPkg(getOwner().mAppEntry.info.packageName,
11279072d9efc6f9c4ef260736c345e81390ac988d7aDianne Hackborn                                    false, false);
1128f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                        }
1129f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                    })
1130f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                    .setNegativeButton(R.string.dlg_cancel, null)
1131f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                    .create();
1132f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                case DLG_APP_NOT_FOUND:
1133f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                    return new AlertDialog.Builder(getActivity())
1134f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                    .setTitle(getActivity().getText(R.string.app_not_found_dlg_title))
1135e7c53b1c9e48c6f997c47a0ca9a2f190ecbbf586Björn Lundén                    .setIconAttribute(android.R.attr.alertDialogIcon)
1136f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                    .setMessage(getActivity().getText(R.string.app_not_found_dlg_title))
1137f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                    .setNeutralButton(getActivity().getText(R.string.dlg_ok),
1138f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                            new DialogInterface.OnClickListener() {
1139f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                        public void onClick(DialogInterface dialog, int which) {
1140f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                            //force to recompute changed value
1141f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                            getOwner().setIntentAndFinish(true, true);
1142f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                        }
1143f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                    })
1144f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                    .create();
1145f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                case DLG_CANNOT_CLEAR_DATA:
1146f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                    return new AlertDialog.Builder(getActivity())
1147f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                    .setTitle(getActivity().getText(R.string.clear_failed_dlg_title))
1148e7c53b1c9e48c6f997c47a0ca9a2f190ecbbf586Björn Lundén                    .setIconAttribute(android.R.attr.alertDialogIcon)
1149f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                    .setMessage(getActivity().getText(R.string.clear_failed_dlg_text))
1150f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                    .setNeutralButton(R.string.dlg_ok,
1151f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                            new DialogInterface.OnClickListener() {
1152f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                        public void onClick(DialogInterface dialog, int which) {
1153f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                            getOwner().mClearDataButton.setEnabled(false);
1154f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                            //force to recompute changed value
1155f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                            getOwner().setIntentAndFinish(false, false);
1156f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                        }
1157f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                    })
1158f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                    .create();
1159f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                case DLG_FORCE_STOP:
1160f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                    return new AlertDialog.Builder(getActivity())
1161f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                    .setTitle(getActivity().getText(R.string.force_stop_dlg_title))
1162e7c53b1c9e48c6f997c47a0ca9a2f190ecbbf586Björn Lundén                    .setIconAttribute(android.R.attr.alertDialogIcon)
1163f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                    .setMessage(getActivity().getText(R.string.force_stop_dlg_text))
1164f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                    .setPositiveButton(R.string.dlg_ok,
1165f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                        new DialogInterface.OnClickListener() {
1166f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                        public void onClick(DialogInterface dialog, int which) {
1167f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                            // Force stop
1168f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                            getOwner().forceStopPackage(getOwner().mAppEntry.info.packageName);
1169f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                        }
1170f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                    })
1171f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                    .setNegativeButton(R.string.dlg_cancel, null)
1172f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                    .create();
1173f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                case DLG_MOVE_FAILED:
1174f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                    CharSequence msg = getActivity().getString(R.string.move_app_failed_dlg_text,
1175f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                            getOwner().getMoveErrMsg(moveErrorCode));
1176f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                    return new AlertDialog.Builder(getActivity())
1177f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                    .setTitle(getActivity().getText(R.string.move_app_failed_dlg_title))
1178e7c53b1c9e48c6f997c47a0ca9a2f190ecbbf586Björn Lundén                    .setIconAttribute(android.R.attr.alertDialogIcon)
1179f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                    .setMessage(msg)
1180f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                    .setNeutralButton(R.string.dlg_ok, null)
1181f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                    .create();
1182f0b63c2c3ec65e8864d5b76a993e87f592170a3dDianne Hackborn                case DLG_DISABLE:
1183f0b63c2c3ec65e8864d5b76a993e87f592170a3dDianne Hackborn                    return new AlertDialog.Builder(getActivity())
1184f0b63c2c3ec65e8864d5b76a993e87f592170a3dDianne Hackborn                    .setTitle(getActivity().getText(R.string.app_disable_dlg_title))
1185e7c53b1c9e48c6f997c47a0ca9a2f190ecbbf586Björn Lundén                    .setIconAttribute(android.R.attr.alertDialogIcon)
1186f0b63c2c3ec65e8864d5b76a993e87f592170a3dDianne Hackborn                    .setMessage(getActivity().getText(R.string.app_disable_dlg_text))
1187f0b63c2c3ec65e8864d5b76a993e87f592170a3dDianne Hackborn                    .setPositiveButton(R.string.dlg_ok,
1188f0b63c2c3ec65e8864d5b76a993e87f592170a3dDianne Hackborn                        new DialogInterface.OnClickListener() {
1189f0b63c2c3ec65e8864d5b76a993e87f592170a3dDianne Hackborn                        public void onClick(DialogInterface dialog, int which) {
1190f0b63c2c3ec65e8864d5b76a993e87f592170a3dDianne Hackborn                            // Disable the app
1191f0b63c2c3ec65e8864d5b76a993e87f592170a3dDianne Hackborn                            new DisableChanger(getOwner(), getOwner().mAppEntry.info,
1192f0b63c2c3ec65e8864d5b76a993e87f592170a3dDianne Hackborn                                    PackageManager.COMPONENT_ENABLED_STATE_DISABLED_USER)
1193f0b63c2c3ec65e8864d5b76a993e87f592170a3dDianne Hackborn                            .execute((Object)null);
1194f0b63c2c3ec65e8864d5b76a993e87f592170a3dDianne Hackborn                        }
1195f0b63c2c3ec65e8864d5b76a993e87f592170a3dDianne Hackborn                    })
1196f0b63c2c3ec65e8864d5b76a993e87f592170a3dDianne Hackborn                    .setNegativeButton(R.string.dlg_cancel, null)
1197f0b63c2c3ec65e8864d5b76a993e87f592170a3dDianne Hackborn                    .create();
119870b599983967b68894a9c41df2279424f6ab3fefDaniel Sandler                case DLG_DISABLE_NOTIFICATIONS:
119970b599983967b68894a9c41df2279424f6ab3fefDaniel Sandler                    return new AlertDialog.Builder(getActivity())
120070b599983967b68894a9c41df2279424f6ab3fefDaniel Sandler                    .setTitle(getActivity().getText(R.string.app_disable_notifications_dlg_title))
1201c8272b075275f81ddfb9cef2f92514b7ce3365deBjörn Lundén                    .setIconAttribute(android.R.attr.alertDialogIcon)
120270b599983967b68894a9c41df2279424f6ab3fefDaniel Sandler                    .setMessage(getActivity().getText(R.string.app_disable_notifications_dlg_text))
120370b599983967b68894a9c41df2279424f6ab3fefDaniel Sandler                    .setPositiveButton(R.string.dlg_ok,
120470b599983967b68894a9c41df2279424f6ab3fefDaniel Sandler                        new DialogInterface.OnClickListener() {
120570b599983967b68894a9c41df2279424f6ab3fefDaniel Sandler                        public void onClick(DialogInterface dialog, int which) {
120670b599983967b68894a9c41df2279424f6ab3fefDaniel Sandler                            // Disable the package's notifications
120770b599983967b68894a9c41df2279424f6ab3fefDaniel Sandler                            getOwner().setNotificationsEnabled(false);
120870b599983967b68894a9c41df2279424f6ab3fefDaniel Sandler                        }
120970b599983967b68894a9c41df2279424f6ab3fefDaniel Sandler                    })
121070b599983967b68894a9c41df2279424f6ab3fefDaniel Sandler                    .setNegativeButton(R.string.dlg_cancel,
121170b599983967b68894a9c41df2279424f6ab3fefDaniel Sandler                        new DialogInterface.OnClickListener() {
121270b599983967b68894a9c41df2279424f6ab3fefDaniel Sandler                        public void onClick(DialogInterface dialog, int which) {
121370b599983967b68894a9c41df2279424f6ab3fefDaniel Sandler                            // Re-enable the checkbox
121470b599983967b68894a9c41df2279424f6ab3fefDaniel Sandler                            getOwner().mNotificationSwitch.setChecked(true);
121570b599983967b68894a9c41df2279424f6ab3fefDaniel Sandler                        }
121670b599983967b68894a9c41df2279424f6ab3fefDaniel Sandler                    })
121770b599983967b68894a9c41df2279424f6ab3fefDaniel Sandler                    .create();
12189072d9efc6f9c4ef260736c345e81390ac988d7aDianne Hackborn                case DLG_SPECIAL_DISABLE:
12199072d9efc6f9c4ef260736c345e81390ac988d7aDianne Hackborn                    return new AlertDialog.Builder(getActivity())
12209072d9efc6f9c4ef260736c345e81390ac988d7aDianne Hackborn                    .setTitle(getActivity().getText(R.string.app_special_disable_dlg_title))
12219072d9efc6f9c4ef260736c345e81390ac988d7aDianne Hackborn                    .setIconAttribute(android.R.attr.alertDialogIcon)
12229072d9efc6f9c4ef260736c345e81390ac988d7aDianne Hackborn                    .setMessage(getActivity().getText(R.string.app_special_disable_dlg_text))
12239072d9efc6f9c4ef260736c345e81390ac988d7aDianne Hackborn                    .setPositiveButton(R.string.dlg_ok,
12249072d9efc6f9c4ef260736c345e81390ac988d7aDianne Hackborn                            new DialogInterface.OnClickListener() {
12259072d9efc6f9c4ef260736c345e81390ac988d7aDianne Hackborn                        public void onClick(DialogInterface dialog, int which) {
12269072d9efc6f9c4ef260736c345e81390ac988d7aDianne Hackborn                            // Clear user data here
12279072d9efc6f9c4ef260736c345e81390ac988d7aDianne Hackborn                            getOwner().uninstallPkg(getOwner().mAppEntry.info.packageName,
12289072d9efc6f9c4ef260736c345e81390ac988d7aDianne Hackborn                                    false, true);
12299072d9efc6f9c4ef260736c345e81390ac988d7aDianne Hackborn                        }
12309072d9efc6f9c4ef260736c345e81390ac988d7aDianne Hackborn                    })
12319072d9efc6f9c4ef260736c345e81390ac988d7aDianne Hackborn                    .setNegativeButton(R.string.dlg_cancel, null)
12329072d9efc6f9c4ef260736c345e81390ac988d7aDianne Hackborn                    .create();
1233f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn            }
1234f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn            throw new IllegalArgumentException("unknown id " + id);
1235f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn        }
123650b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu    }
123750b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu
12389072d9efc6f9c4ef260736c345e81390ac988d7aDianne Hackborn    private void uninstallPkg(String packageName, boolean allUsers, boolean andDisable) {
123950b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu         // Create new intent to launch Uninstaller activity
124050b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu        Uri packageURI = Uri.parse("package:"+packageName);
12413db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn        Intent uninstallIntent = new Intent(Intent.ACTION_UNINSTALL_PACKAGE, packageURI);
12423db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn        uninstallIntent.putExtra(Intent.EXTRA_UNINSTALL_ALL_USERS, allUsers);
12433db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn        startActivityForResult(uninstallIntent, REQUEST_UNINSTALL);
12449072d9efc6f9c4ef260736c345e81390ac988d7aDianne Hackborn        mDisableAfterUninstall = andDisable;
124550b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu    }
124650b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu
124742241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu    private void forceStopPackage(String pkgName) {
1248f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn        ActivityManager am = (ActivityManager)getActivity().getSystemService(
124942241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu                Context.ACTIVITY_SERVICE);
125042241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu        am.forceStopPackage(pkgName);
1251c442e52dca4d32e2ea391e361c847ce834bf0dfdDianne Hackborn        mState.invalidatePackage(pkgName);
1252c442e52dca4d32e2ea391e361c847ce834bf0dfdDianne Hackborn        ApplicationsState.AppEntry newEnt = mState.getEntry(pkgName);
1253c442e52dca4d32e2ea391e361c847ce834bf0dfdDianne Hackborn        if (newEnt != null) {
1254c442e52dca4d32e2ea391e361c847ce834bf0dfdDianne Hackborn            mAppEntry = newEnt;
1255c442e52dca4d32e2ea391e361c847ce834bf0dfdDianne Hackborn        }
1256cb497546ba55ef98fb561dd9a07c7a485a918f4bDianne Hackborn        checkForceStop();
125742241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu    }
125842241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu
1259cb497546ba55ef98fb561dd9a07c7a485a918f4bDianne Hackborn    private final BroadcastReceiver mCheckKillProcessesReceiver = new BroadcastReceiver() {
1260cb497546ba55ef98fb561dd9a07c7a485a918f4bDianne Hackborn        @Override
1261cb497546ba55ef98fb561dd9a07c7a485a918f4bDianne Hackborn        public void onReceive(Context context, Intent intent) {
1262861c04fbd4841253a02299b7498a8cf609e8874dDianne Hackborn            updateForceStopButton(getResultCode() != Activity.RESULT_CANCELED);
1263cb497546ba55ef98fb561dd9a07c7a485a918f4bDianne Hackborn        }
1264cb497546ba55ef98fb561dd9a07c7a485a918f4bDianne Hackborn    };
1265861c04fbd4841253a02299b7498a8cf609e8874dDianne Hackborn
1266861c04fbd4841253a02299b7498a8cf609e8874dDianne Hackborn    private void updateForceStopButton(boolean enabled) {
1267861c04fbd4841253a02299b7498a8cf609e8874dDianne Hackborn        mForceStopButton.setEnabled(enabled);
1268861c04fbd4841253a02299b7498a8cf609e8874dDianne Hackborn        mForceStopButton.setOnClickListener(InstalledAppDetails.this);
1269861c04fbd4841253a02299b7498a8cf609e8874dDianne Hackborn    }
1270cb497546ba55ef98fb561dd9a07c7a485a918f4bDianne Hackborn
1271cb497546ba55ef98fb561dd9a07c7a485a918f4bDianne Hackborn    private void checkForceStop() {
12725c2b48d4d52a2b6b3ae3c745e7016da390a4e1d7Dianne Hackborn        if (mDpm.packageHasActiveAdmins(mPackageInfo.packageName)) {
12735c2b48d4d52a2b6b3ae3c745e7016da390a4e1d7Dianne Hackborn            // User can't force stop device admin.
12745c2b48d4d52a2b6b3ae3c745e7016da390a4e1d7Dianne Hackborn            updateForceStopButton(false);
12755c2b48d4d52a2b6b3ae3c745e7016da390a4e1d7Dianne Hackborn        } else if ((mAppEntry.info.flags&ApplicationInfo.FLAG_STOPPED) == 0) {
1276861c04fbd4841253a02299b7498a8cf609e8874dDianne Hackborn            // If the app isn't explicitly stopped, then always show the
1277861c04fbd4841253a02299b7498a8cf609e8874dDianne Hackborn            // force stop button.
1278861c04fbd4841253a02299b7498a8cf609e8874dDianne Hackborn            updateForceStopButton(true);
1279861c04fbd4841253a02299b7498a8cf609e8874dDianne Hackborn        } else {
12805c2b48d4d52a2b6b3ae3c745e7016da390a4e1d7Dianne Hackborn            Intent intent = new Intent(Intent.ACTION_QUERY_PACKAGE_RESTART,
12815c2b48d4d52a2b6b3ae3c745e7016da390a4e1d7Dianne Hackborn                    Uri.fromParts("package", mAppEntry.info.packageName, null));
12825c2b48d4d52a2b6b3ae3c745e7016da390a4e1d7Dianne Hackborn            intent.putExtra(Intent.EXTRA_PACKAGES, new String[] { mAppEntry.info.packageName });
12835c2b48d4d52a2b6b3ae3c745e7016da390a4e1d7Dianne Hackborn            intent.putExtra(Intent.EXTRA_UID, mAppEntry.info.uid);
1284c715fb1207361bb2a793752eefb02f1956075739Dianne Hackborn            intent.putExtra(Intent.EXTRA_USER_HANDLE, UserHandle.getUserId(mAppEntry.info.uid));
12858243c9a722e815bdcb069163de48877478c28dfdChristopher Tate            getActivity().sendOrderedBroadcastAsUser(intent, UserHandle.CURRENT, null,
12868243c9a722e815bdcb069163de48877478c28dfdChristopher Tate                    mCheckKillProcessesReceiver, null, Activity.RESULT_CANCELED, null, null);
1287861c04fbd4841253a02299b7498a8cf609e8874dDianne Hackborn        }
1288cb497546ba55ef98fb561dd9a07c7a485a918f4bDianne Hackborn    }
128970b599983967b68894a9c41df2279424f6ab3fefDaniel Sandler
12909db5ee35d5345e13e6e6b857dbad5a83e9f037d1Dianne Hackborn    static class DisableChanger extends AsyncTask<Object, Object, Object> {
12919db5ee35d5345e13e6e6b857dbad5a83e9f037d1Dianne Hackborn        final PackageManager mPm;
12929db5ee35d5345e13e6e6b857dbad5a83e9f037d1Dianne Hackborn        final WeakReference<InstalledAppDetails> mActivity;
12939db5ee35d5345e13e6e6b857dbad5a83e9f037d1Dianne Hackborn        final ApplicationInfo mInfo;
12949db5ee35d5345e13e6e6b857dbad5a83e9f037d1Dianne Hackborn        final int mState;
12959db5ee35d5345e13e6e6b857dbad5a83e9f037d1Dianne Hackborn
12969db5ee35d5345e13e6e6b857dbad5a83e9f037d1Dianne Hackborn        DisableChanger(InstalledAppDetails activity, ApplicationInfo info, int state) {
12979db5ee35d5345e13e6e6b857dbad5a83e9f037d1Dianne Hackborn            mPm = activity.mPm;
12989db5ee35d5345e13e6e6b857dbad5a83e9f037d1Dianne Hackborn            mActivity = new WeakReference<InstalledAppDetails>(activity);
12999db5ee35d5345e13e6e6b857dbad5a83e9f037d1Dianne Hackborn            mInfo = info;
13009db5ee35d5345e13e6e6b857dbad5a83e9f037d1Dianne Hackborn            mState = state;
13019db5ee35d5345e13e6e6b857dbad5a83e9f037d1Dianne Hackborn        }
13029db5ee35d5345e13e6e6b857dbad5a83e9f037d1Dianne Hackborn
13039db5ee35d5345e13e6e6b857dbad5a83e9f037d1Dianne Hackborn        @Override
13049db5ee35d5345e13e6e6b857dbad5a83e9f037d1Dianne Hackborn        protected Object doInBackground(Object... params) {
13059db5ee35d5345e13e6e6b857dbad5a83e9f037d1Dianne Hackborn            mPm.setApplicationEnabledSetting(mInfo.packageName, mState, 0);
13069db5ee35d5345e13e6e6b857dbad5a83e9f037d1Dianne Hackborn            return null;
13079db5ee35d5345e13e6e6b857dbad5a83e9f037d1Dianne Hackborn        }
13089db5ee35d5345e13e6e6b857dbad5a83e9f037d1Dianne Hackborn    }
13099db5ee35d5345e13e6e6b857dbad5a83e9f037d1Dianne Hackborn
131070b599983967b68894a9c41df2279424f6ab3fefDaniel Sandler    private void setNotificationsEnabled(boolean enabled) {
131170b599983967b68894a9c41df2279424f6ab3fefDaniel Sandler        String packageName = mAppEntry.info.packageName;
131270b599983967b68894a9c41df2279424f6ab3fefDaniel Sandler        INotificationManager nm = INotificationManager.Stub.asInterface(
131370b599983967b68894a9c41df2279424f6ab3fefDaniel Sandler                ServiceManager.getService(Context.NOTIFICATION_SERVICE));
131470b599983967b68894a9c41df2279424f6ab3fefDaniel Sandler        try {
131570b599983967b68894a9c41df2279424f6ab3fefDaniel Sandler            final boolean enable = mNotificationSwitch.isChecked();
1316df3f6d6c4722a7acc8189e47d0499aaf618969f9Daniel Sandler            nm.setNotificationsEnabledForPackage(packageName, mAppEntry.info.uid, enabled);
131770b599983967b68894a9c41df2279424f6ab3fefDaniel Sandler        } catch (android.os.RemoteException ex) {
131870b599983967b68894a9c41df2279424f6ab3fefDaniel Sandler            mNotificationSwitch.setChecked(!enabled); // revert
131970b599983967b68894a9c41df2279424f6ab3fefDaniel Sandler        }
132070b599983967b68894a9c41df2279424f6ab3fefDaniel Sandler    }
132170b599983967b68894a9c41df2279424f6ab3fefDaniel Sandler
13223465b67740e17711af2b36b09e2250a02275d860Jake Hamby    private int getPremiumSmsPermission(String packageName) {
13233465b67740e17711af2b36b09e2250a02275d860Jake Hamby        try {
13243465b67740e17711af2b36b09e2250a02275d860Jake Hamby            if (mSmsManager != null) {
13253465b67740e17711af2b36b09e2250a02275d860Jake Hamby                return mSmsManager.getPremiumSmsPermission(packageName);
13263465b67740e17711af2b36b09e2250a02275d860Jake Hamby            }
13273465b67740e17711af2b36b09e2250a02275d860Jake Hamby        } catch (RemoteException ex) {
13283465b67740e17711af2b36b09e2250a02275d860Jake Hamby            // ignored
13293465b67740e17711af2b36b09e2250a02275d860Jake Hamby        }
13303465b67740e17711af2b36b09e2250a02275d860Jake Hamby        return SmsUsageMonitor.PREMIUM_SMS_PERMISSION_UNKNOWN;
13313465b67740e17711af2b36b09e2250a02275d860Jake Hamby    }
13323465b67740e17711af2b36b09e2250a02275d860Jake Hamby
1333afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    /*
1334afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project     * Method implementing functionality of buttons clicked
1335afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project     * @see android.view.View.OnClickListener#onClick(android.view.View)
1336afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project     */
1337afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    public void onClick(View v) {
13380f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn        String packageName = mAppEntry.info.packageName;
133942241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu        if(v == mUninstallButton) {
134042241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu            if (mUpdatedSysApp) {
1341f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                showDialogInner(DLG_FACTORY_RESET, 0);
134242241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu            } else {
13430f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn                if ((mAppEntry.info.flags & ApplicationInfo.FLAG_SYSTEM) != 0) {
1344f0b63c2c3ec65e8864d5b76a993e87f592170a3dDianne Hackborn                    if (mAppEntry.info.enabled) {
1345f0b63c2c3ec65e8864d5b76a993e87f592170a3dDianne Hackborn                        showDialogInner(DLG_DISABLE, 0);
1346f0b63c2c3ec65e8864d5b76a993e87f592170a3dDianne Hackborn                    } else {
1347f0b63c2c3ec65e8864d5b76a993e87f592170a3dDianne Hackborn                        new DisableChanger(this, mAppEntry.info,
1348f0b63c2c3ec65e8864d5b76a993e87f592170a3dDianne Hackborn                                PackageManager.COMPONENT_ENABLED_STATE_DEFAULT)
1349f0b63c2c3ec65e8864d5b76a993e87f592170a3dDianne Hackborn                        .execute((Object)null);
1350f0b63c2c3ec65e8864d5b76a993e87f592170a3dDianne Hackborn                    }
13512e3c75094bde1cfca1b15f66f5ff3d0a85baf0a0Dianne Hackborn                } else if ((mAppEntry.info.flags & ApplicationInfo.FLAG_INSTALLED) == 0) {
13524de4061c8bb9475cbc5d98f83bf3b2c8ec222407Dianne Hackborn                    uninstallPkg(packageName, true, false);
13539db5ee35d5345e13e6e6b857dbad5a83e9f037d1Dianne Hackborn                } else {
13549072d9efc6f9c4ef260736c345e81390ac988d7aDianne Hackborn                    uninstallPkg(packageName, false, false);
13559db5ee35d5345e13e6e6b857dbad5a83e9f037d1Dianne Hackborn                }
1356afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            }
13579072d9efc6f9c4ef260736c345e81390ac988d7aDianne Hackborn        } else if(v == mSpecialDisableButton) {
13589072d9efc6f9c4ef260736c345e81390ac988d7aDianne Hackborn            showDialogInner(DLG_SPECIAL_DISABLE, 0);
1359afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        } else if(v == mActivitiesButton) {
1360afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            mPm.clearPackagePreferredActivities(packageName);
13619d6d92b33ebf1c91aed47bd759ce78a3e06afff5Mike Lockwood            try {
1362be32d4b408a2fd0ec25bdd4f0e67cba2f23a4edbJeff Sharkey                mUsbManager.clearDefaults(packageName, UserHandle.myUserId());
13639d6d92b33ebf1c91aed47bd759ce78a3e06afff5Mike Lockwood            } catch (RemoteException e) {
13649d6d92b33ebf1c91aed47bd759ce78a3e06afff5Mike Lockwood                Log.e(TAG, "mUsbManager.clearDefaults", e);
13659d6d92b33ebf1c91aed47bd759ce78a3e06afff5Mike Lockwood            }
1366c9029d99a36d78331b109b64c1f61812db7cedd9Michael Jurka            mAppWidgetManager.setBindAppWidgetPermission(packageName, false);
1367c9029d99a36d78331b109b64c1f61812db7cedd9Michael Jurka            TextView autoLaunchTitleView =
1368c9029d99a36d78331b109b64c1f61812db7cedd9Michael Jurka                    (TextView) mRootView.findViewById(R.id.auto_launch_title);
1369c9029d99a36d78331b109b64c1f61812db7cedd9Michael Jurka            TextView autoLaunchView = (TextView) mRootView.findViewById(R.id.auto_launch);
1370c9029d99a36d78331b109b64c1f61812db7cedd9Michael Jurka            resetLaunchDefaultsUi(autoLaunchTitleView, autoLaunchView);
137142241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu        } else if(v == mClearDataButton) {
13720f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn            if (mAppEntry.info.manageSpaceActivityName != null) {
13733fd8051a89c5fbcd52b83566a05f0edb919414a5Amith Yamasani                if (!Utils.isMonkeyRunning()) {
13743fd8051a89c5fbcd52b83566a05f0edb919414a5Amith Yamasani                    Intent intent = new Intent(Intent.ACTION_DEFAULT);
13753fd8051a89c5fbcd52b83566a05f0edb919414a5Amith Yamasani                    intent.setClassName(mAppEntry.info.packageName,
13763fd8051a89c5fbcd52b83566a05f0edb919414a5Amith Yamasani                            mAppEntry.info.manageSpaceActivityName);
13773db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn                    startActivityForResult(intent, REQUEST_MANAGE_SPACE);
13783fd8051a89c5fbcd52b83566a05f0edb919414a5Amith Yamasani                }
137942241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu            } else {
1380f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                showDialogInner(DLG_CLEAR_DATA, 0);
138142241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu            }
1382afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        } else if (v == mClearCacheButton) {
1383afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            // Lazy initialization of observer
1384afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            if (mClearCacheObserver == null) {
1385afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                mClearCacheObserver = new ClearCacheObserver();
1386afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            }
1387afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            mPm.deleteApplicationCacheFiles(packageName, mClearCacheObserver);
1388afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        } else if (v == mForceStopButton) {
1389f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn            showDialogInner(DLG_FORCE_STOP, 0);
13909db5ee35d5345e13e6e6b857dbad5a83e9f037d1Dianne Hackborn            //forceStopPackage(mAppInfo.packageName);
1391ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu        } else if (v == mMoveAppButton) {
1392ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu            if (mPackageMoveObserver == null) {
1393ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu                mPackageMoveObserver = new PackageMoveObserver();
1394ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu            }
13950f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn            int moveFlags = (mAppEntry.info.flags & ApplicationInfo.FLAG_EXTERNAL_STORAGE) != 0 ?
1396ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu                    PackageManager.MOVE_INTERNAL : PackageManager.MOVE_EXTERNAL_MEDIA;
1397de03ac27b74d1d69c1fea36e7fb00f068ab16b21Suchi Amalapurapu            mMoveInProgress = true;
1398de03ac27b74d1d69c1fea36e7fb00f068ab16b21Suchi Amalapurapu            refreshButtons();
13990f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn            mPm.movePackage(mAppEntry.info.packageName, mPackageMoveObserver, moveFlags);
1400afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        }
1401afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    }
1402aef746c45f14c8a170dba48c4b55f93cae0e24e4Dianne Hackborn
1403aef746c45f14c8a170dba48c4b55f93cae0e24e4Dianne Hackborn    @Override
1404aef746c45f14c8a170dba48c4b55f93cae0e24e4Dianne Hackborn    public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
1405aef746c45f14c8a170dba48c4b55f93cae0e24e4Dianne Hackborn        String packageName = mAppEntry.info.packageName;
1406aef746c45f14c8a170dba48c4b55f93cae0e24e4Dianne Hackborn        ActivityManager am = (ActivityManager)
1407aef746c45f14c8a170dba48c4b55f93cae0e24e4Dianne Hackborn                getActivity().getSystemService(Context.ACTIVITY_SERVICE);
1408aef746c45f14c8a170dba48c4b55f93cae0e24e4Dianne Hackborn        if (buttonView == mAskCompatibilityCB) {
1409aef746c45f14c8a170dba48c4b55f93cae0e24e4Dianne Hackborn            am.setPackageAskScreenCompat(packageName, isChecked);
1410aef746c45f14c8a170dba48c4b55f93cae0e24e4Dianne Hackborn        } else if (buttonView == mEnableCompatibilityCB) {
1411aef746c45f14c8a170dba48c4b55f93cae0e24e4Dianne Hackborn            am.setPackageScreenCompatMode(packageName, isChecked ?
1412aef746c45f14c8a170dba48c4b55f93cae0e24e4Dianne Hackborn                    ActivityManager.COMPAT_MODE_ENABLED : ActivityManager.COMPAT_MODE_DISABLED);
14134a824be44c3878f22469cf45c2ef8b7e92724e92Daniel Sandler        } else if (buttonView == mNotificationSwitch) {
141470b599983967b68894a9c41df2279424f6ab3fefDaniel Sandler            if (!isChecked) {
141570b599983967b68894a9c41df2279424f6ab3fefDaniel Sandler                showDialogInner(DLG_DISABLE_NOTIFICATIONS, 0);
141670b599983967b68894a9c41df2279424f6ab3fefDaniel Sandler            } else {
141770b599983967b68894a9c41df2279424f6ab3fefDaniel Sandler                setNotificationsEnabled(true);
14184a824be44c3878f22469cf45c2ef8b7e92724e92Daniel Sandler            }
1419aef746c45f14c8a170dba48c4b55f93cae0e24e4Dianne Hackborn        }
1420aef746c45f14c8a170dba48c4b55f93cae0e24e4Dianne Hackborn    }
1421afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project}
1422afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
1423