InstalledAppDetails.java revision 4a824be44c3878f22469cf45c2ef8b7e92724e92
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
19afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport com.android.settings.R;
2019df79af269c4a2354b0989cebfcfe949aea42c4Dianne Hackbornimport com.android.settings.applications.ApplicationsState.AppEntry;
21728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn
22afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.app.Activity;
23afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.app.ActivityManager;
24afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.app.AlertDialog;
2550b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapuimport android.app.Dialog;
26f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackbornimport android.app.DialogFragment;
27f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackbornimport android.app.Fragment;
284a824be44c3878f22469cf45c2ef8b7e92724e92Daniel Sandlerimport android.app.INotificationManager;
294a824be44c3878f22469cf45c2ef8b7e92724e92Daniel Sandlerimport android.app.NotificationManager;
305c2b48d4d52a2b6b3ae3c745e7016da390a4e1d7Dianne Hackbornimport android.app.admin.DevicePolicyManager;
31cb497546ba55ef98fb561dd9a07c7a485a918f4bDianne Hackbornimport android.content.BroadcastReceiver;
32afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.content.Context;
33afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.content.DialogInterface;
34afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.content.Intent;
35afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.content.IntentFilter;
36afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.content.pm.ApplicationInfo;
37afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.content.pm.IPackageDataObserver;
38ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapuimport android.content.pm.IPackageMoveObserver;
3950b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapuimport android.content.pm.PackageInfo;
40afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.content.pm.PackageManager;
419db5ee35d5345e13e6e6b857dbad5a83e9f037d1Dianne Hackbornimport android.content.pm.ResolveInfo;
42afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.content.pm.PackageManager.NameNotFoundException;
439d6d92b33ebf1c91aed47bd759ce78a3e06afff5Mike Lockwoodimport android.hardware.usb.IUsbManager;
44afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.net.Uri;
459db5ee35d5345e13e6e6b857dbad5a83e9f037d1Dianne Hackbornimport android.os.AsyncTask;
46afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.os.Bundle;
47ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackbornimport android.os.Environment;
48afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.os.Handler;
499d6d92b33ebf1c91aed47bd759ce78a3e06afff5Mike Lockwoodimport android.os.IBinder;
50afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.os.Message;
5150b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapuimport android.os.RemoteException;
529d6d92b33ebf1c91aed47bd759ce78a3e06afff5Mike Lockwoodimport android.os.ServiceManager;
53ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackbornimport android.preference.PreferenceActivity;
54afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.text.format.Formatter;
55afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.util.Log;
569db5ee35d5345e13e6e6b857dbad5a83e9f037d1Dianne Hackborn
579db5ee35d5345e13e6e6b857dbad5a83e9f037d1Dianne Hackbornimport java.lang.ref.WeakReference;
58afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport java.util.ArrayList;
59afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport java.util.List;
60afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.content.ComponentName;
61f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackbornimport android.view.LayoutInflater;
62afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.view.View;
63f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackbornimport android.view.ViewGroup;
64afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.widget.AppSecurityPermissions;
65afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.widget.Button;
66aef746c45f14c8a170dba48c4b55f93cae0e24e4Dianne Hackbornimport android.widget.CheckBox;
67aef746c45f14c8a170dba48c4b55f93cae0e24e4Dianne Hackbornimport android.widget.CompoundButton;
68afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.widget.ImageView;
69afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.widget.LinearLayout;
704a824be44c3878f22469cf45c2ef8b7e92724e92Daniel Sandlerimport android.widget.Switch;
71afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.widget.TextView;
72afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
73afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project/**
74afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * Activity to display application information from Settings. This activity presents
75afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * extended information associated with a package like code, data, total size, permissions
76afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * used by the application and also the set of default launchable activities.
77afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * For system applications, an option to clear user data is displayed only if data size is > 0.
78afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * System applications that do not want clear user data do not have this option.
79afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * For non-system applications, there is no option to clear data. Instead there is an option to
80afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * uninstall the application.
81afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project */
82f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackbornpublic class InstalledAppDetails extends Fragment
83aef746c45f14c8a170dba48c4b55f93cae0e24e4Dianne Hackborn        implements View.OnClickListener, CompoundButton.OnCheckedChangeListener,
84aef746c45f14c8a170dba48c4b55f93cae0e24e4Dianne Hackborn        ApplicationsState.Callbacks {
85afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private static final String TAG="InstalledAppDetails";
86a12c1e3226ca660a23f049f880947df7f8d96c4eDianne Hackborn    static final boolean SUPPORT_DISABLE_APPS = true;
872f144fc07d3f202b83ffb6064a223bbadef65114Dianne Hackborn    private static final boolean localLOGV = false;
880f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn
89f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn    public static final String ARG_PACKAGE_NAME = "package";
90f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn
910f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn    private PackageManager mPm;
929d6d92b33ebf1c91aed47bd759ce78a3e06afff5Mike Lockwood    private IUsbManager mUsbManager;
935c2b48d4d52a2b6b3ae3c745e7016da390a4e1d7Dianne Hackborn    private DevicePolicyManager mDpm;
940f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn    private ApplicationsState mState;
950f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn    private ApplicationsState.AppEntry mAppEntry;
960f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn    private PackageInfo mPackageInfo;
976dc1bf84cf72dd72a2517878f6b280e8afdcf4c2Dianne Hackborn    private CanBeOnSdCardChecker mCanBeOnSdCardChecker;
98f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn    private View mRootView;
9942241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu    private Button mUninstallButton;
100de03ac27b74d1d69c1fea36e7fb00f068ab16b21Suchi Amalapurapu    private boolean mMoveInProgress = false;
10142241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu    private boolean mUpdatedSysApp = false;
102afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private Button mActivitiesButton;
103aef746c45f14c8a170dba48c4b55f93cae0e24e4Dianne Hackborn    private View mScreenCompatSection;
104aef746c45f14c8a170dba48c4b55f93cae0e24e4Dianne Hackborn    private CheckBox mAskCompatibilityCB;
105aef746c45f14c8a170dba48c4b55f93cae0e24e4Dianne Hackborn    private CheckBox mEnableCompatibilityCB;
1062f144fc07d3f202b83ffb6064a223bbadef65114Dianne Hackborn    private boolean mCanClearData = true;
10750b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu    private TextView mAppVersion;
108afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private TextView mTotalSize;
109afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private TextView mAppSize;
110afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private TextView mDataSize;
111bd9ddab4f4e1f47b141abdcc0248cc716112b3c7Dianne Hackborn    private TextView mExternalCodeSize;
112bd9ddab4f4e1f47b141abdcc0248cc716112b3c7Dianne Hackborn    private TextView mExternalDataSize;
113afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private ClearUserDataObserver mClearDataObserver;
114afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    // Views related to cache info
115afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private TextView mCacheSize;
116afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private Button mClearCacheButton;
117afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private ClearCacheObserver mClearCacheObserver;
118afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private Button mForceStopButton;
11942241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu    private Button mClearDataButton;
12042241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu    private Button mMoveAppButton;
1214a824be44c3878f22469cf45c2ef8b7e92724e92Daniel Sandler    private Switch mNotificationSwitch;
1224a824be44c3878f22469cf45c2ef8b7e92724e92Daniel Sandler
123ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu    private PackageMoveObserver mPackageMoveObserver;
124afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
1250f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn    private boolean mHaveSizes = false;
1260f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn    private long mLastCodeSize = -1;
1270f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn    private long mLastDataSize = -1;
128bd9ddab4f4e1f47b141abdcc0248cc716112b3c7Dianne Hackborn    private long mLastExternalCodeSize = -1;
129bd9ddab4f4e1f47b141abdcc0248cc716112b3c7Dianne Hackborn    private long mLastExternalDataSize = -1;
1300f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn    private long mLastCacheSize = -1;
1310f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn    private long mLastTotalSize = -1;
1320f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn
133afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    //internal constants used in Handler
134afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private static final int OP_SUCCESSFUL = 1;
135afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private static final int OP_FAILED = 2;
136afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private static final int CLEAR_USER_DATA = 1;
137afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private static final int CLEAR_CACHE = 3;
138ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu    private static final int PACKAGE_MOVE = 4;
139afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
140afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    // invalid size value used initially and also when size retrieval through PackageManager
141afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    // fails for whatever reason
142afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private static final int SIZE_INVALID = -1;
143afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
144afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    // Resource strings
145afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private CharSequence mInvalidSizeStr;
146afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private CharSequence mComputingStr;
147afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
14850b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu    // Dialog identifiers used in showDialog
14950b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu    private static final int DLG_BASE = 0;
15050b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu    private static final int DLG_CLEAR_DATA = DLG_BASE + 1;
15150b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu    private static final int DLG_FACTORY_RESET = DLG_BASE + 2;
15250b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu    private static final int DLG_APP_NOT_FOUND = DLG_BASE + 3;
15350b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu    private static final int DLG_CANNOT_CLEAR_DATA = DLG_BASE + 4;
15442241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu    private static final int DLG_FORCE_STOP = DLG_BASE + 5;
1555cc062f1cd37cff19a1a7ee6fbb2a6522eee415cSuchi Amalapurapu    private static final int DLG_MOVE_FAILED = DLG_BASE + 6;
156f0b63c2c3ec65e8864d5b76a993e87f592170a3dDianne Hackborn    private static final int DLG_DISABLE = DLG_BASE + 7;
157afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
158afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private Handler mHandler = new Handler() {
159afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        public void handleMessage(Message msg) {
160f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn            // If the fragment is gone, don't process any more messages.
161f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn            if (getView() == null) {
16207f636059a2fb45f2d8284fedbbbba2c78b05157Dianne Hackborn                return;
16307f636059a2fb45f2d8284fedbbbba2c78b05157Dianne Hackborn            }
164afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            switch (msg.what) {
165afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                case CLEAR_USER_DATA:
166afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                    processClearMsg(msg);
167afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                    break;
168afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                case CLEAR_CACHE:
169afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                    // Refresh size info
1700f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn                    mState.requestSize(mAppEntry.info.packageName);
171afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                    break;
172ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu                case PACKAGE_MOVE:
173ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu                    processMoveMsg(msg);
174ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu                    break;
175afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                default:
176afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                    break;
177afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            }
178afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        }
179afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    };
180afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
181afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    class ClearUserDataObserver extends IPackageDataObserver.Stub {
182afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project       public void onRemoveCompleted(final String packageName, final boolean succeeded) {
183afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project           final Message msg = mHandler.obtainMessage(CLEAR_USER_DATA);
184afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project           msg.arg1 = succeeded?OP_SUCCESSFUL:OP_FAILED;
185afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project           mHandler.sendMessage(msg);
186afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        }
187afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    }
188afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
189afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    class ClearCacheObserver extends IPackageDataObserver.Stub {
190afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        public void onRemoveCompleted(final String packageName, final boolean succeeded) {
191afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            final Message msg = mHandler.obtainMessage(CLEAR_CACHE);
192ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu            msg.arg1 = succeeded ? OP_SUCCESSFUL:OP_FAILED;
193afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            mHandler.sendMessage(msg);
194afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project         }
195afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project     }
196ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu
197ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu    class PackageMoveObserver extends IPackageMoveObserver.Stub {
198ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu        public void packageMoved(String packageName, int returnCode) throws RemoteException {
199ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu            final Message msg = mHandler.obtainMessage(PACKAGE_MOVE);
200ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu            msg.arg1 = returnCode;
201ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu            mHandler.sendMessage(msg);
202ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu        }
203ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu    }
204afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
205afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private String getSizeStr(long size) {
206afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        if (size == SIZE_INVALID) {
207afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            return mInvalidSizeStr.toString();
208afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        }
209f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn        return Formatter.formatFileSize(getActivity(), size);
210afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    }
211afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
21242241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu    private void initDataButtons() {
2132f144fc07d3f202b83ffb6064a223bbadef65114Dianne Hackborn        if ((mAppEntry.info.flags&(ApplicationInfo.FLAG_SYSTEM
2142f144fc07d3f202b83ffb6064a223bbadef65114Dianne Hackborn                | ApplicationInfo.FLAG_ALLOW_CLEAR_USER_DATA))
2155c2b48d4d52a2b6b3ae3c745e7016da390a4e1d7Dianne Hackborn                == ApplicationInfo.FLAG_SYSTEM
2165c2b48d4d52a2b6b3ae3c745e7016da390a4e1d7Dianne Hackborn                || mDpm.packageHasActiveAdmins(mPackageInfo.packageName)) {
21742241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu            mClearDataButton.setText(R.string.clear_user_data_text);
2182f144fc07d3f202b83ffb6064a223bbadef65114Dianne Hackborn            mClearDataButton.setEnabled(false);
2192f144fc07d3f202b83ffb6064a223bbadef65114Dianne Hackborn            mCanClearData = false;
2202f144fc07d3f202b83ffb6064a223bbadef65114Dianne Hackborn        } else {
2212f144fc07d3f202b83ffb6064a223bbadef65114Dianne Hackborn            if (mAppEntry.info.manageSpaceActivityName != null) {
2222f144fc07d3f202b83ffb6064a223bbadef65114Dianne Hackborn                mClearDataButton.setText(R.string.manage_space_text);
2232f144fc07d3f202b83ffb6064a223bbadef65114Dianne Hackborn            } else {
2242f144fc07d3f202b83ffb6064a223bbadef65114Dianne Hackborn                mClearDataButton.setText(R.string.clear_user_data_text);
2252f144fc07d3f202b83ffb6064a223bbadef65114Dianne Hackborn            }
2262f144fc07d3f202b83ffb6064a223bbadef65114Dianne Hackborn            mClearDataButton.setOnClickListener(this);
22742241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu        }
228ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu    }
229ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu
2305cc062f1cd37cff19a1a7ee6fbb2a6522eee415cSuchi Amalapurapu    private CharSequence getMoveErrMsg(int errCode) {
2315cc062f1cd37cff19a1a7ee6fbb2a6522eee415cSuchi Amalapurapu        switch (errCode) {
2325cc062f1cd37cff19a1a7ee6fbb2a6522eee415cSuchi Amalapurapu            case PackageManager.MOVE_FAILED_INSUFFICIENT_STORAGE:
233f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                return getActivity().getString(R.string.insufficient_storage);
2345cc062f1cd37cff19a1a7ee6fbb2a6522eee415cSuchi Amalapurapu            case PackageManager.MOVE_FAILED_DOESNT_EXIST:
235f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                return getActivity().getString(R.string.does_not_exist);
2365cc062f1cd37cff19a1a7ee6fbb2a6522eee415cSuchi Amalapurapu            case PackageManager.MOVE_FAILED_FORWARD_LOCKED:
237f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                return getActivity().getString(R.string.app_forward_locked);
2385cc062f1cd37cff19a1a7ee6fbb2a6522eee415cSuchi Amalapurapu            case PackageManager.MOVE_FAILED_INVALID_LOCATION:
239f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                return getActivity().getString(R.string.invalid_location);
2405cc062f1cd37cff19a1a7ee6fbb2a6522eee415cSuchi Amalapurapu            case PackageManager.MOVE_FAILED_SYSTEM_PACKAGE:
241f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                return getActivity().getString(R.string.system_package);
2429a3a1a4e58c03a81368ebe5411f334c5c9a3a89bSuchi Amalapurapu            case PackageManager.MOVE_FAILED_INTERNAL_ERROR:
2439a3a1a4e58c03a81368ebe5411f334c5c9a3a89bSuchi Amalapurapu                return "";
2445cc062f1cd37cff19a1a7ee6fbb2a6522eee415cSuchi Amalapurapu        }
2459a3a1a4e58c03a81368ebe5411f334c5c9a3a89bSuchi Amalapurapu        return "";
2465cc062f1cd37cff19a1a7ee6fbb2a6522eee415cSuchi Amalapurapu    }
2475cc062f1cd37cff19a1a7ee6fbb2a6522eee415cSuchi Amalapurapu
248ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu    private void initMoveButton() {
249ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn        if (Environment.isExternalStorageEmulated()) {
250ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn            mMoveAppButton.setVisibility(View.INVISIBLE);
251ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn            return;
252ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn        }
25342241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu        boolean dataOnly = false;
2540f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn        dataOnly = (mPackageInfo == null) && (mAppEntry != null);
255ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu        boolean moveDisable = true;
25642241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu        if (dataOnly) {
25742241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu            mMoveAppButton.setText(R.string.move_app);
2580f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn        } else if ((mAppEntry.info.flags & ApplicationInfo.FLAG_EXTERNAL_STORAGE) != 0) {
25942241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu            mMoveAppButton.setText(R.string.move_app_to_internal);
2604056459e9e6bf766168aff4cfe41b0a28a843323Suchi Amalapurapu            // Always let apps move to internal storage from sdcard.
261ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu            moveDisable = false;
26242241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu        } else {
26342241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu            mMoveAppButton.setText(R.string.move_app_to_sdcard);
2646dc1bf84cf72dd72a2517878f6b280e8afdcf4c2Dianne Hackborn            mCanBeOnSdCardChecker.init();
2656dc1bf84cf72dd72a2517878f6b280e8afdcf4c2Dianne Hackborn            moveDisable = !mCanBeOnSdCardChecker.check(mAppEntry.info);
266730eb7e5ffa56cae2224a836f489b8e1e94b1f09Suchi Amalapurapu        }
267ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu        if (moveDisable) {
268ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu            mMoveAppButton.setEnabled(false);
269ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu        } else {
270ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu            mMoveAppButton.setOnClickListener(this);
271ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu            mMoveAppButton.setEnabled(true);
272ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu        }
27342241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu    }
27442241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu
275de03ac27b74d1d69c1fea36e7fb00f068ab16b21Suchi Amalapurapu    private void initUninstallButtons() {
2760f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn        mUpdatedSysApp = (mAppEntry.info.flags & ApplicationInfo.FLAG_UPDATED_SYSTEM_APP) != 0;
27742241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu        boolean enabled = true;
27842241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu        if (mUpdatedSysApp) {
27942241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu            mUninstallButton.setText(R.string.app_factory_reset);
28042241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu        } else {
2810f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn            if ((mAppEntry.info.flags & ApplicationInfo.FLAG_SYSTEM) != 0) {
282b99e029db14ae276a47da39da9378b6af9aef403Suchi Amalapurapu                enabled = false;
28344178e2801c013e60defb4b5f390d893e7344a71Dianne Hackborn                if (SUPPORT_DISABLE_APPS) {
28444178e2801c013e60defb4b5f390d893e7344a71Dianne Hackborn                    try {
28544178e2801c013e60defb4b5f390d893e7344a71Dianne Hackborn                        // Try to prevent the user from bricking their phone
28644178e2801c013e60defb4b5f390d893e7344a71Dianne Hackborn                        // by not allowing disabling of apps signed with the
28744178e2801c013e60defb4b5f390d893e7344a71Dianne Hackborn                        // system cert and any launcher app in the system.
28844178e2801c013e60defb4b5f390d893e7344a71Dianne Hackborn                        PackageInfo sys = mPm.getPackageInfo("android",
28944178e2801c013e60defb4b5f390d893e7344a71Dianne Hackborn                                PackageManager.GET_SIGNATURES);
29044178e2801c013e60defb4b5f390d893e7344a71Dianne Hackborn                        Intent intent = new Intent(Intent.ACTION_MAIN);
29144178e2801c013e60defb4b5f390d893e7344a71Dianne Hackborn                        intent.addCategory(Intent.CATEGORY_HOME);
29244178e2801c013e60defb4b5f390d893e7344a71Dianne Hackborn                        intent.setPackage(mAppEntry.info.packageName);
29344178e2801c013e60defb4b5f390d893e7344a71Dianne Hackborn                        List<ResolveInfo> homes = mPm.queryIntentActivities(intent, 0);
29444178e2801c013e60defb4b5f390d893e7344a71Dianne Hackborn                        if ((homes != null && homes.size() > 0) ||
2955d4b25c9a7c40d55f3bdb1ef095e5d0cf7cddcdfMarco Nelissen                                (mPackageInfo != null && mPackageInfo.signatures != null &&
29644178e2801c013e60defb4b5f390d893e7344a71Dianne Hackborn                                        sys.signatures[0].equals(mPackageInfo.signatures[0]))) {
29744178e2801c013e60defb4b5f390d893e7344a71Dianne Hackborn                            // Disable button for core system applications.
29844178e2801c013e60defb4b5f390d893e7344a71Dianne Hackborn                            mUninstallButton.setText(R.string.disable_text);
29944178e2801c013e60defb4b5f390d893e7344a71Dianne Hackborn                        } else if (mAppEntry.info.enabled) {
30044178e2801c013e60defb4b5f390d893e7344a71Dianne Hackborn                            mUninstallButton.setText(R.string.disable_text);
30144178e2801c013e60defb4b5f390d893e7344a71Dianne Hackborn                            enabled = true;
30244178e2801c013e60defb4b5f390d893e7344a71Dianne Hackborn                        } else {
30344178e2801c013e60defb4b5f390d893e7344a71Dianne Hackborn                            mUninstallButton.setText(R.string.enable_text);
30444178e2801c013e60defb4b5f390d893e7344a71Dianne Hackborn                            enabled = true;
30544178e2801c013e60defb4b5f390d893e7344a71Dianne Hackborn                        }
30644178e2801c013e60defb4b5f390d893e7344a71Dianne Hackborn                    } catch (PackageManager.NameNotFoundException e) {
30744178e2801c013e60defb4b5f390d893e7344a71Dianne Hackborn                        Log.w(TAG, "Unable to get package info", e);
3089db5ee35d5345e13e6e6b857dbad5a83e9f037d1Dianne Hackborn                    }
3099db5ee35d5345e13e6e6b857dbad5a83e9f037d1Dianne Hackborn                }
3109db5ee35d5345e13e6e6b857dbad5a83e9f037d1Dianne Hackborn            } else {
3119db5ee35d5345e13e6e6b857dbad5a83e9f037d1Dianne Hackborn                mUninstallButton.setText(R.string.uninstall_text);
312b99e029db14ae276a47da39da9378b6af9aef403Suchi Amalapurapu            }
31342241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu        }
3145c2b48d4d52a2b6b3ae3c745e7016da390a4e1d7Dianne Hackborn        // If this is a device admin, it can't be uninstall or disabled.
3155c2b48d4d52a2b6b3ae3c745e7016da390a4e1d7Dianne Hackborn        // We do this here so the text of the button is still set correctly.
3165c2b48d4d52a2b6b3ae3c745e7016da390a4e1d7Dianne Hackborn        if (mDpm.packageHasActiveAdmins(mPackageInfo.packageName)) {
3175c2b48d4d52a2b6b3ae3c745e7016da390a4e1d7Dianne Hackborn            enabled = false;
3185c2b48d4d52a2b6b3ae3c745e7016da390a4e1d7Dianne Hackborn        }
31942241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu        mUninstallButton.setEnabled(enabled);
32042241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu        if (enabled) {
32142241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu            // Register listener
32242241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu            mUninstallButton.setOnClickListener(this);
32342241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu        }
32442241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu    }
32542241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu
3264a824be44c3878f22469cf45c2ef8b7e92724e92Daniel Sandler    private void initNotificationButton() {
3274a824be44c3878f22469cf45c2ef8b7e92724e92Daniel Sandler        INotificationManager nm = INotificationManager.Stub.asInterface(
3284a824be44c3878f22469cf45c2ef8b7e92724e92Daniel Sandler                ServiceManager.getService(Context.NOTIFICATION_SERVICE));
3294a824be44c3878f22469cf45c2ef8b7e92724e92Daniel Sandler        boolean enabled = true; // default on
3304a824be44c3878f22469cf45c2ef8b7e92724e92Daniel Sandler        try {
3314a824be44c3878f22469cf45c2ef8b7e92724e92Daniel Sandler            enabled = nm.areNotificationsEnabledForPackage(mAppEntry.info.packageName);
3324a824be44c3878f22469cf45c2ef8b7e92724e92Daniel Sandler        } catch (android.os.RemoteException ex) {
3334a824be44c3878f22469cf45c2ef8b7e92724e92Daniel Sandler            // this does not bode well
3344a824be44c3878f22469cf45c2ef8b7e92724e92Daniel Sandler        }
3354a824be44c3878f22469cf45c2ef8b7e92724e92Daniel Sandler        mNotificationSwitch.setChecked(enabled);
3364a824be44c3878f22469cf45c2ef8b7e92724e92Daniel Sandler        mNotificationSwitch.setOnCheckedChangeListener(this);
3374a824be44c3878f22469cf45c2ef8b7e92724e92Daniel Sandler    }
3384a824be44c3878f22469cf45c2ef8b7e92724e92Daniel Sandler
339afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    /** Called when the activity is first created. */
340afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    @Override
341f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn    public void onCreate(Bundle icicle) {
342afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        super.onCreate(icicle);
343b0bcf9f7f50b56cb15a72be39fe11fe1351992c1Jeff Brown
344f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn        mState = ApplicationsState.getInstance(getActivity().getApplication());
345f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn        mPm = getActivity().getPackageManager();
3469d6d92b33ebf1c91aed47bd759ce78a3e06afff5Mike Lockwood        IBinder b = ServiceManager.getService(Context.USB_SERVICE);
3479d6d92b33ebf1c91aed47bd759ce78a3e06afff5Mike Lockwood        mUsbManager = IUsbManager.Stub.asInterface(b);
3485c2b48d4d52a2b6b3ae3c745e7016da390a4e1d7Dianne Hackborn        mDpm = (DevicePolicyManager)getActivity().getSystemService(Context.DEVICE_POLICY_SERVICE);
3499d6d92b33ebf1c91aed47bd759ce78a3e06afff5Mike Lockwood
3506dc1bf84cf72dd72a2517878f6b280e8afdcf4c2Dianne Hackborn        mCanBeOnSdCardChecker = new CanBeOnSdCardChecker();
351f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn    }
352f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn
353f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn    @Override
354f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
355f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn        View view = mRootView = inflater.inflate(R.layout.installed_app_details, null);
3566dc1bf84cf72dd72a2517878f6b280e8afdcf4c2Dianne Hackborn
357f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn        mComputingStr = getActivity().getText(R.string.computing_size);
358b0bcf9f7f50b56cb15a72be39fe11fe1351992c1Jeff Brown
35950b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu        // Set default values on sizes
360f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn        mTotalSize = (TextView)view.findViewById(R.id.total_size_text);
361f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn        mAppSize = (TextView)view.findViewById(R.id.application_size_text);
362f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn        mDataSize = (TextView)view.findViewById(R.id.data_size_text);
363bd9ddab4f4e1f47b141abdcc0248cc716112b3c7Dianne Hackborn        mExternalCodeSize = (TextView)view.findViewById(R.id.external_code_size_text);
364bd9ddab4f4e1f47b141abdcc0248cc716112b3c7Dianne Hackborn        mExternalDataSize = (TextView)view.findViewById(R.id.external_data_size_text);
365b0bcf9f7f50b56cb15a72be39fe11fe1351992c1Jeff Brown
36642241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu        // Get Control button panel
367f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn        View btnPanel = view.findViewById(R.id.control_buttons_panel);
36842241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu        mForceStopButton = (Button) btnPanel.findViewById(R.id.left_button);
36942241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu        mForceStopButton.setText(R.string.force_stop);
37042241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu        mUninstallButton = (Button)btnPanel.findViewById(R.id.right_button);
371cb497546ba55ef98fb561dd9a07c7a485a918f4bDianne Hackborn        mForceStopButton.setEnabled(false);
372b0bcf9f7f50b56cb15a72be39fe11fe1351992c1Jeff Brown
37342241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu        // Initialize clear data and move install location buttons
374f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn        View data_buttons_panel = view.findViewById(R.id.data_buttons_panel);
37542241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu        mClearDataButton = (Button) data_buttons_panel.findViewById(R.id.left_button);
37642241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu        mMoveAppButton = (Button) data_buttons_panel.findViewById(R.id.right_button);
377b0bcf9f7f50b56cb15a72be39fe11fe1351992c1Jeff Brown
3780f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn        // Cache section
379f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn        mCacheSize = (TextView) view.findViewById(R.id.cache_size_text);
380f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn        mClearCacheButton = (Button) view.findViewById(R.id.clear_cache_button);
381f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn
382f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn        mActivitiesButton = (Button)view.findViewById(R.id.clear_activities_button);
3830f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn
384aef746c45f14c8a170dba48c4b55f93cae0e24e4Dianne Hackborn        // Screen compatibility control
385aef746c45f14c8a170dba48c4b55f93cae0e24e4Dianne Hackborn        mScreenCompatSection = view.findViewById(R.id.screen_compatibility_section);
386aef746c45f14c8a170dba48c4b55f93cae0e24e4Dianne Hackborn        mAskCompatibilityCB = (CheckBox)view.findViewById(R.id.ask_compatibility_cb);
387aef746c45f14c8a170dba48c4b55f93cae0e24e4Dianne Hackborn        mEnableCompatibilityCB = (CheckBox)view.findViewById(R.id.enable_compatibility_cb);
3884a824be44c3878f22469cf45c2ef8b7e92724e92Daniel Sandler
3894a824be44c3878f22469cf45c2ef8b7e92724e92Daniel Sandler        mNotificationSwitch = (Switch) view.findViewById(R.id.notification_switch);
390aef746c45f14c8a170dba48c4b55f93cae0e24e4Dianne Hackborn
391f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn        return view;
392afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    }
393f4c4b59f13a0cadd55832004e56ff7b6d827f7f0Suchi Amalapurapu
39450b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu    // Utility method to set applicaiton label and icon.
395f4c4b59f13a0cadd55832004e56ff7b6d827f7f0Suchi Amalapurapu    private void setAppLabelAndIcon(PackageInfo pkgInfo) {
396f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn        View appSnippet = mRootView.findViewById(R.id.app_snippet);
397f4c4b59f13a0cadd55832004e56ff7b6d827f7f0Suchi Amalapurapu        ImageView icon = (ImageView) appSnippet.findViewById(R.id.app_icon);
3980f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn        mState.ensureIcon(mAppEntry);
3990f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn        icon.setImageDrawable(mAppEntry.icon);
400f4c4b59f13a0cadd55832004e56ff7b6d827f7f0Suchi Amalapurapu        // Set application name.
401f4c4b59f13a0cadd55832004e56ff7b6d827f7f0Suchi Amalapurapu        TextView label = (TextView) appSnippet.findViewById(R.id.app_name);
4020f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn        label.setText(mAppEntry.label);
40350b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu        // Version number of application
404f4c4b59f13a0cadd55832004e56ff7b6d827f7f0Suchi Amalapurapu        mAppVersion = (TextView) appSnippet.findViewById(R.id.app_size);
405f4c4b59f13a0cadd55832004e56ff7b6d827f7f0Suchi Amalapurapu
406f4c4b59f13a0cadd55832004e56ff7b6d827f7f0Suchi Amalapurapu        if (pkgInfo != null && pkgInfo.versionName != null) {
40750b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu            mAppVersion.setVisibility(View.VISIBLE);
408f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn            mAppVersion.setText(getActivity().getString(R.string.version_text,
4098e1b0fb77ce50ddc99a596da48b65190e2708362Elliott Hughes                    String.valueOf(pkgInfo.versionName)));
41050b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu        } else {
411f4c4b59f13a0cadd55832004e56ff7b6d827f7f0Suchi Amalapurapu            mAppVersion.setVisibility(View.INVISIBLE);
41250b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu        }
41350b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu    }
41450b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu
41550b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu    @Override
41642241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu    public void onResume() {
41742241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu        super.onResume();
418b0bcf9f7f50b56cb15a72be39fe11fe1351992c1Jeff Brown
4190f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn        mState.resume(this);
4200f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn        if (!refreshUi()) {
421b0bcf9f7f50b56cb15a72be39fe11fe1351992c1Jeff Brown            setIntentAndFinish(true, true);
422b0bcf9f7f50b56cb15a72be39fe11fe1351992c1Jeff Brown        }
4230f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn    }
4240f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn
4250f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn    @Override
4260f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn    public void onPause() {
4270f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn        super.onPause();
4280f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn        mState.pause();
4290f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn    }
4300f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn
4310f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn    @Override
4320f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn    public void onAllSizesComputed() {
4330f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn    }
4340f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn
4350f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn    @Override
4360f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn    public void onPackageIconChanged() {
4370f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn    }
4380f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn
4390f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn    @Override
4400f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn    public void onPackageListChanged() {
4410f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn        refreshUi();
4420f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn    }
4430f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn
4440f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn    @Override
44519df79af269c4a2354b0989cebfcfe949aea42c4Dianne Hackborn    public void onRebuildComplete(ArrayList<AppEntry> apps) {
44619df79af269c4a2354b0989cebfcfe949aea42c4Dianne Hackborn    }
44719df79af269c4a2354b0989cebfcfe949aea42c4Dianne Hackborn
44819df79af269c4a2354b0989cebfcfe949aea42c4Dianne Hackborn    @Override
4490f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn    public void onPackageSizeChanged(String packageName) {
4500f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn        if (packageName.equals(mAppEntry.info.packageName)) {
4510f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn            refreshSizeInfo();
4520f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn        }
4530f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn    }
4540f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn
4550f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn    @Override
4560f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn    public void onRunningStateChanged(boolean running) {
4570f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn    }
4580f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn
4590f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn    private boolean refreshUi() {
4600f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn        if (mMoveInProgress) {
4610f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn            return true;
4620f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn        }
4630c5b9ca58bda5bc3c56f1e6c78859f7de147e476Patrick Dubroy        final Bundle args = getArguments();
4640c5b9ca58bda5bc3c56f1e6c78859f7de147e476Patrick Dubroy        String packageName = (args != null) ? args.getString(ARG_PACKAGE_NAME) : null;
465f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn        if (packageName == null) {
4660c5b9ca58bda5bc3c56f1e6c78859f7de147e476Patrick Dubroy            Intent intent = (args == null) ?
4670c5b9ca58bda5bc3c56f1e6c78859f7de147e476Patrick Dubroy                    getActivity().getIntent() : (Intent) args.getParcelable("intent");
468f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn            if (intent != null) {
469f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                packageName = intent.getData().getSchemeSpecificPart();
470f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn            }
471f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn        }
4720f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn        mAppEntry = mState.getEntry(packageName);
4730f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn
4740f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn        if (mAppEntry == null) {
4750f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn            return false; // onCreate must have failed, make sure to exit
476b0bcf9f7f50b56cb15a72be39fe11fe1351992c1Jeff Brown        }
477b0bcf9f7f50b56cb15a72be39fe11fe1351992c1Jeff Brown
47850b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu        // Get application info again to refresh changed properties of application
47950b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu        try {
4800f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn            mPackageInfo = mPm.getPackageInfo(mAppEntry.info.packageName,
4810f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn                    PackageManager.GET_DISABLED_COMPONENTS |
4820f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn                    PackageManager.GET_UNINSTALLED_PACKAGES |
4830f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn                    PackageManager.GET_SIGNATURES);
48450b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu        } catch (NameNotFoundException e) {
4850f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn            Log.e(TAG, "Exception when retrieving package:" + mAppEntry.info.packageName, e);
4860f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn            return false; // onCreate must have failed, make sure to exit
48750b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu        }
488b0bcf9f7f50b56cb15a72be39fe11fe1351992c1Jeff Brown
4890f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn        // Get list of preferred activities
4900f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn        List<ComponentName> prefActList = new ArrayList<ComponentName>();
491b0bcf9f7f50b56cb15a72be39fe11fe1351992c1Jeff Brown
4920f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn        // Intent list cannot be null. so pass empty list
4930f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn        List<IntentFilter> intentList = new ArrayList<IntentFilter>();
4940f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn        mPm.getPreferredActivities(intentList, prefActList, packageName);
4950f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn        if(localLOGV) Log.i(TAG, "Have "+prefActList.size()+" number of activities in prefered list");
4969d6d92b33ebf1c91aed47bd759ce78a3e06afff5Mike Lockwood        boolean hasUsbDefaults = false;
4979d6d92b33ebf1c91aed47bd759ce78a3e06afff5Mike Lockwood        try {
4982715376cfa4d220f183623a5f35214d1bd537376Mike Lockwood            hasUsbDefaults = mUsbManager.hasDefaults(packageName);
4999d6d92b33ebf1c91aed47bd759ce78a3e06afff5Mike Lockwood        } catch (RemoteException e) {
5009d6d92b33ebf1c91aed47bd759ce78a3e06afff5Mike Lockwood            Log.e(TAG, "mUsbManager.hasDefaults", e);
5019d6d92b33ebf1c91aed47bd759ce78a3e06afff5Mike Lockwood        }
502f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn        TextView autoLaunchView = (TextView)mRootView.findViewById(R.id.auto_launch);
5039d6d92b33ebf1c91aed47bd759ce78a3e06afff5Mike Lockwood        if (prefActList.size() <= 0 && !hasUsbDefaults) {
5040f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn            // Disable clear activities button
5050f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn            autoLaunchView.setText(R.string.auto_launch_disable_text);
5060f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn            mActivitiesButton.setEnabled(false);
5070f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn        } else {
5080f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn            autoLaunchView.setText(R.string.auto_launch_enable_text);
5090f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn            mActivitiesButton.setEnabled(true);
5100f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn            mActivitiesButton.setOnClickListener(this);
5110f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn        }
512aef746c45f14c8a170dba48c4b55f93cae0e24e4Dianne Hackborn
513aef746c45f14c8a170dba48c4b55f93cae0e24e4Dianne Hackborn        // Screen compatibility section.
514aef746c45f14c8a170dba48c4b55f93cae0e24e4Dianne Hackborn        ActivityManager am = (ActivityManager)
515aef746c45f14c8a170dba48c4b55f93cae0e24e4Dianne Hackborn                getActivity().getSystemService(Context.ACTIVITY_SERVICE);
516aef746c45f14c8a170dba48c4b55f93cae0e24e4Dianne Hackborn        int compatMode = am.getPackageScreenCompatMode(packageName);
51713bac39d2120a82b8a22b52f0db0727aa04b1f38Dianne Hackborn        // For now these are always off; this is the old UI model which we
51813bac39d2120a82b8a22b52f0db0727aa04b1f38Dianne Hackborn        // are no longer using.
51913bac39d2120a82b8a22b52f0db0727aa04b1f38Dianne Hackborn        if (false && (compatMode == ActivityManager.COMPAT_MODE_DISABLED
52013bac39d2120a82b8a22b52f0db0727aa04b1f38Dianne Hackborn                || compatMode == ActivityManager.COMPAT_MODE_ENABLED)) {
521aef746c45f14c8a170dba48c4b55f93cae0e24e4Dianne Hackborn            mScreenCompatSection.setVisibility(View.VISIBLE);
522aef746c45f14c8a170dba48c4b55f93cae0e24e4Dianne Hackborn            mAskCompatibilityCB.setChecked(am.getPackageAskScreenCompat(packageName));
523aef746c45f14c8a170dba48c4b55f93cae0e24e4Dianne Hackborn            mAskCompatibilityCB.setOnCheckedChangeListener(this);
524aef746c45f14c8a170dba48c4b55f93cae0e24e4Dianne Hackborn            mEnableCompatibilityCB.setChecked(compatMode == ActivityManager.COMPAT_MODE_ENABLED);
525aef746c45f14c8a170dba48c4b55f93cae0e24e4Dianne Hackborn            mEnableCompatibilityCB.setOnCheckedChangeListener(this);
526aef746c45f14c8a170dba48c4b55f93cae0e24e4Dianne Hackborn        } else {
527aef746c45f14c8a170dba48c4b55f93cae0e24e4Dianne Hackborn            mScreenCompatSection.setVisibility(View.GONE);
528aef746c45f14c8a170dba48c4b55f93cae0e24e4Dianne Hackborn        }
529aef746c45f14c8a170dba48c4b55f93cae0e24e4Dianne Hackborn
5300f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn        // Security permissions section
531f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn        LinearLayout permsView = (LinearLayout) mRootView.findViewById(R.id.permissions_section);
532f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn        AppSecurityPermissions asp = new AppSecurityPermissions(getActivity(), packageName);
5330f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn        if (asp.getPermissionCount() > 0) {
5340f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn            permsView.setVisibility(View.VISIBLE);
5350f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn            // Make the security sections header visible
5360f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn            LinearLayout securityList = (LinearLayout) permsView.findViewById(
5370f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn                    R.id.security_settings_list);
5380f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn            securityList.removeAllViews();
5390f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn            securityList.addView(asp.getPermissionsView());
5400f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn        } else {
5410f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn            permsView.setVisibility(View.GONE);
542de03ac27b74d1d69c1fea36e7fb00f068ab16b21Suchi Amalapurapu        }
5430f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn
5440f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn        checkForceStop();
5450f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn        setAppLabelAndIcon(mPackageInfo);
5460f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn        refreshButtons();
5470f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn        refreshSizeInfo();
5480f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn        return true;
549afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    }
5500f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn
551afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private void setIntentAndFinish(boolean finish, boolean appChanged) {
552afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        if(localLOGV) Log.i(TAG, "appChanged="+appChanged);
553afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        Intent intent = new Intent();
554afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        intent.putExtra(ManageApplications.APP_CHG, appChanged);
555ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn        PreferenceActivity pa = (PreferenceActivity)getActivity();
556ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn        pa.finishPreferencePanel(this, Activity.RESULT_OK, intent);
557afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    }
558afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
5590f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn    private void refreshSizeInfo() {
5600f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn        if (mAppEntry.size == ApplicationsState.SIZE_INVALID
5610f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn                || mAppEntry.size == ApplicationsState.SIZE_UNKNOWN) {
5620f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn            mLastCodeSize = mLastDataSize = mLastCacheSize = mLastTotalSize = -1;
5630f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn            if (!mHaveSizes) {
5640f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn                mAppSize.setText(mComputingStr);
5650f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn                mDataSize.setText(mComputingStr);
5660f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn                mCacheSize.setText(mComputingStr);
5670f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn                mTotalSize.setText(mComputingStr);
5680f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn            }
5690f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn            mClearDataButton.setEnabled(false);
5700f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn            mClearCacheButton.setEnabled(false);
5710f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn
572afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        } else {
5730f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn            mHaveSizes = true;
5740f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn            if (mLastCodeSize != mAppEntry.codeSize) {
5750f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn                mLastCodeSize = mAppEntry.codeSize;
5760f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn                mAppSize.setText(getSizeStr(mAppEntry.codeSize));
577afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            }
5780f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn            if (mLastDataSize != mAppEntry.dataSize) {
5790f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn                mLastDataSize = mAppEntry.dataSize;
5800f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn                mDataSize.setText(getSizeStr(mAppEntry.dataSize));
581afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            }
582bd9ddab4f4e1f47b141abdcc0248cc716112b3c7Dianne Hackborn            if (mLastExternalCodeSize != mAppEntry.externalCodeSize) {
583bd9ddab4f4e1f47b141abdcc0248cc716112b3c7Dianne Hackborn                mLastExternalCodeSize = mAppEntry.externalCodeSize;
584bd9ddab4f4e1f47b141abdcc0248cc716112b3c7Dianne Hackborn                mExternalCodeSize.setText(getSizeStr(mAppEntry.externalCodeSize));
585bd9ddab4f4e1f47b141abdcc0248cc716112b3c7Dianne Hackborn            }
586bd9ddab4f4e1f47b141abdcc0248cc716112b3c7Dianne Hackborn            if (mLastExternalDataSize != mAppEntry.externalDataSize) {
587bd9ddab4f4e1f47b141abdcc0248cc716112b3c7Dianne Hackborn                mLastExternalDataSize = mAppEntry.externalDataSize;
588bd9ddab4f4e1f47b141abdcc0248cc716112b3c7Dianne Hackborn                mExternalDataSize.setText(getSizeStr(mAppEntry.externalDataSize));
589424acfb7ad469efb0a51c69fc8713cc96e2357b0Kenny Root            }
5900f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn            if (mLastCacheSize != mAppEntry.cacheSize) {
5910f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn                mLastCacheSize = mAppEntry.cacheSize;
5920f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn                mCacheSize.setText(getSizeStr(mAppEntry.cacheSize));
593afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            }
5940f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn            if (mLastTotalSize != mAppEntry.size) {
5950f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn                mLastTotalSize = mAppEntry.size;
5960f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn                mTotalSize.setText(getSizeStr(mAppEntry.size));
597afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            }
5980f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn
5992f144fc07d3f202b83ffb6064a223bbadef65114Dianne Hackborn            if (mAppEntry.dataSize <= 0 || !mCanClearData) {
6000f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn                mClearDataButton.setEnabled(false);
6010f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn            } else {
6020f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn                mClearDataButton.setEnabled(true);
6030f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn                mClearDataButton.setOnClickListener(this);
6040f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn            }
6050f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn            if (mAppEntry.cacheSize <= 0) {
6060f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn                mClearCacheButton.setEnabled(false);
6070f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn            } else {
6080f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn                mClearCacheButton.setEnabled(true);
6090f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn                mClearCacheButton.setOnClickListener(this);
610afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            }
611afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        }
612afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    }
613afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
614afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    /*
615afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project     * Private method to handle clear message notification from observer when
616afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project     * the async operation from PackageManager is complete
617afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project     */
618afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private void processClearMsg(Message msg) {
619afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        int result = msg.arg1;
6200f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn        String packageName = mAppEntry.info.packageName;
62142241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu        mClearDataButton.setText(R.string.clear_user_data_text);
622afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        if(result == OP_SUCCESSFUL) {
62342241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu            Log.i(TAG, "Cleared user data for package : "+packageName);
6240f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn            mState.requestSize(mAppEntry.info.packageName);
625afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        } else {
62642241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu            mClearDataButton.setEnabled(true);
627afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        }
6289db5ee35d5345e13e6e6b857dbad5a83e9f037d1Dianne Hackborn        checkForceStop();
629afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    }
630ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu
631de03ac27b74d1d69c1fea36e7fb00f068ab16b21Suchi Amalapurapu    private void refreshButtons() {
632de03ac27b74d1d69c1fea36e7fb00f068ab16b21Suchi Amalapurapu        if (!mMoveInProgress) {
633de03ac27b74d1d69c1fea36e7fb00f068ab16b21Suchi Amalapurapu            initUninstallButtons();
634de03ac27b74d1d69c1fea36e7fb00f068ab16b21Suchi Amalapurapu            initDataButtons();
635de03ac27b74d1d69c1fea36e7fb00f068ab16b21Suchi Amalapurapu            initMoveButton();
6364a824be44c3878f22469cf45c2ef8b7e92724e92Daniel Sandler            initNotificationButton();
637de03ac27b74d1d69c1fea36e7fb00f068ab16b21Suchi Amalapurapu        } else {
638de03ac27b74d1d69c1fea36e7fb00f068ab16b21Suchi Amalapurapu            mMoveAppButton.setText(R.string.moving);
639de03ac27b74d1d69c1fea36e7fb00f068ab16b21Suchi Amalapurapu            mMoveAppButton.setEnabled(false);
640de03ac27b74d1d69c1fea36e7fb00f068ab16b21Suchi Amalapurapu            mUninstallButton.setEnabled(false);
641de03ac27b74d1d69c1fea36e7fb00f068ab16b21Suchi Amalapurapu        }
642de03ac27b74d1d69c1fea36e7fb00f068ab16b21Suchi Amalapurapu    }
643de03ac27b74d1d69c1fea36e7fb00f068ab16b21Suchi Amalapurapu
644ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu    private void processMoveMsg(Message msg) {
645ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu        int result = msg.arg1;
6460f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn        String packageName = mAppEntry.info.packageName;
647de03ac27b74d1d69c1fea36e7fb00f068ab16b21Suchi Amalapurapu        // Refresh the button attributes.
648de03ac27b74d1d69c1fea36e7fb00f068ab16b21Suchi Amalapurapu        mMoveInProgress = false;
6490f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn        if (result == PackageManager.MOVE_SUCCEEDED) {
650ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu            Log.i(TAG, "Moved resources for " + packageName);
651de03ac27b74d1d69c1fea36e7fb00f068ab16b21Suchi Amalapurapu            // Refresh size information again.
6520f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn            mState.requestSize(mAppEntry.info.packageName);
653ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu        } else {
654f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn            showDialogInner(DLG_MOVE_FAILED, result);
655ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu        }
6560f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn        refreshUi();
657ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu    }
6585cc062f1cd37cff19a1a7ee6fbb2a6522eee415cSuchi Amalapurapu
659afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    /*
660afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project     * Private method to initiate clearing user data when the user clicks the clear data
661afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project     * button for a system package
662afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project     */
66342241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu    private  void initiateClearUserData() {
66442241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu        mClearDataButton.setEnabled(false);
66542241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu        // Invoke uninstall or clear user data based on sysPackage
6660f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn        String packageName = mAppEntry.info.packageName;
66742241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu        Log.i(TAG, "Clearing user data for package : " + packageName);
6680f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn        if (mClearDataObserver == null) {
669afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            mClearDataObserver = new ClearUserDataObserver();
670afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        }
671f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn        ActivityManager am = (ActivityManager)
672f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                getActivity().getSystemService(Context.ACTIVITY_SERVICE);
673afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        boolean res = am.clearApplicationUserData(packageName, mClearDataObserver);
6740f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn        if (!res) {
67550b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu            // Clearing data failed for some obscure reason. Just log error for now
676afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            Log.i(TAG, "Couldnt clear application user data for package:"+packageName);
677f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn            showDialogInner(DLG_CANNOT_CLEAR_DATA, 0);
678afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        } else {
67942241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu            mClearDataButton.setText(R.string.recompute_size);
680afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        }
681afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    }
682afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
683f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn    private void showDialogInner(int id, int moveErrorCode) {
684f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn        DialogFragment newFragment = MyAlertDialogFragment.newInstance(id, moveErrorCode);
685f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn        newFragment.setTargetFragment(this, 0);
686f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn        newFragment.show(getFragmentManager(), "dialog " + id);
68750b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu    }
68850b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu
689f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn    public static class MyAlertDialogFragment extends DialogFragment {
690f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn
691f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn        public static MyAlertDialogFragment newInstance(int id, int moveErrorCode) {
692f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn            MyAlertDialogFragment frag = new MyAlertDialogFragment();
693f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn            Bundle args = new Bundle();
694f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn            args.putInt("id", id);
695f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn            args.putInt("moveError", moveErrorCode);
696f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn            frag.setArguments(args);
697f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn            return frag;
698f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn        }
699f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn
700f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn        InstalledAppDetails getOwner() {
701f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn            return (InstalledAppDetails)getTargetFragment();
702f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn        }
703f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn
704f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn        @Override
705f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn        public Dialog onCreateDialog(Bundle savedInstanceState) {
706f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn            int id = getArguments().getInt("id");
707f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn            int moveErrorCode = getArguments().getInt("moveError");
708f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn            switch (id) {
709f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                case DLG_CLEAR_DATA:
710f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                    return new AlertDialog.Builder(getActivity())
711f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                    .setTitle(getActivity().getText(R.string.clear_data_dlg_title))
712f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                    .setIcon(android.R.drawable.ic_dialog_alert)
713f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                    .setMessage(getActivity().getText(R.string.clear_data_dlg_text))
714f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                    .setPositiveButton(R.string.dlg_ok,
715f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                            new DialogInterface.OnClickListener() {
716f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                        public void onClick(DialogInterface dialog, int which) {
717f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                            // Clear user data here
718f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                            getOwner().initiateClearUserData();
719f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                        }
720f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                    })
721f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                    .setNegativeButton(R.string.dlg_cancel, null)
722f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                    .create();
723f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                case DLG_FACTORY_RESET:
724f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                    return new AlertDialog.Builder(getActivity())
725f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                    .setTitle(getActivity().getText(R.string.app_factory_reset_dlg_title))
726f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                    .setIcon(android.R.drawable.ic_dialog_alert)
727f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                    .setMessage(getActivity().getText(R.string.app_factory_reset_dlg_text))
728f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                    .setPositiveButton(R.string.dlg_ok,
729f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                            new DialogInterface.OnClickListener() {
730f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                        public void onClick(DialogInterface dialog, int which) {
731f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                            // Clear user data here
732f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                            getOwner().uninstallPkg(getOwner().mAppEntry.info.packageName);
733f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                        }
734f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                    })
735f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                    .setNegativeButton(R.string.dlg_cancel, null)
736f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                    .create();
737f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                case DLG_APP_NOT_FOUND:
738f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                    return new AlertDialog.Builder(getActivity())
739f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                    .setTitle(getActivity().getText(R.string.app_not_found_dlg_title))
740f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                    .setIcon(android.R.drawable.ic_dialog_alert)
741f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                    .setMessage(getActivity().getText(R.string.app_not_found_dlg_title))
742f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                    .setNeutralButton(getActivity().getText(R.string.dlg_ok),
743f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                            new DialogInterface.OnClickListener() {
744f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                        public void onClick(DialogInterface dialog, int which) {
745f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                            //force to recompute changed value
746f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                            getOwner().setIntentAndFinish(true, true);
747f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                        }
748f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                    })
749f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                    .create();
750f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                case DLG_CANNOT_CLEAR_DATA:
751f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                    return new AlertDialog.Builder(getActivity())
752f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                    .setTitle(getActivity().getText(R.string.clear_failed_dlg_title))
753f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                    .setIcon(android.R.drawable.ic_dialog_alert)
754f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                    .setMessage(getActivity().getText(R.string.clear_failed_dlg_text))
755f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                    .setNeutralButton(R.string.dlg_ok,
756f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                            new DialogInterface.OnClickListener() {
757f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                        public void onClick(DialogInterface dialog, int which) {
758f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                            getOwner().mClearDataButton.setEnabled(false);
759f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                            //force to recompute changed value
760f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                            getOwner().setIntentAndFinish(false, false);
761f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                        }
762f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                    })
763f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                    .create();
764f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                case DLG_FORCE_STOP:
765f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                    return new AlertDialog.Builder(getActivity())
766f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                    .setTitle(getActivity().getText(R.string.force_stop_dlg_title))
767f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                    .setIcon(android.R.drawable.ic_dialog_alert)
768f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                    .setMessage(getActivity().getText(R.string.force_stop_dlg_text))
769f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                    .setPositiveButton(R.string.dlg_ok,
770f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                        new DialogInterface.OnClickListener() {
771f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                        public void onClick(DialogInterface dialog, int which) {
772f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                            // Force stop
773f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                            getOwner().forceStopPackage(getOwner().mAppEntry.info.packageName);
774f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                        }
775f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                    })
776f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                    .setNegativeButton(R.string.dlg_cancel, null)
777f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                    .create();
778f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                case DLG_MOVE_FAILED:
779f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                    CharSequence msg = getActivity().getString(R.string.move_app_failed_dlg_text,
780f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                            getOwner().getMoveErrMsg(moveErrorCode));
781f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                    return new AlertDialog.Builder(getActivity())
782f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                    .setTitle(getActivity().getText(R.string.move_app_failed_dlg_title))
783f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                    .setIcon(android.R.drawable.ic_dialog_alert)
784f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                    .setMessage(msg)
785f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                    .setNeutralButton(R.string.dlg_ok, null)
786f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                    .create();
787f0b63c2c3ec65e8864d5b76a993e87f592170a3dDianne Hackborn                case DLG_DISABLE:
788f0b63c2c3ec65e8864d5b76a993e87f592170a3dDianne Hackborn                    return new AlertDialog.Builder(getActivity())
789f0b63c2c3ec65e8864d5b76a993e87f592170a3dDianne Hackborn                    .setTitle(getActivity().getText(R.string.app_disable_dlg_title))
790f0b63c2c3ec65e8864d5b76a993e87f592170a3dDianne Hackborn                    .setIcon(android.R.drawable.ic_dialog_alert)
791f0b63c2c3ec65e8864d5b76a993e87f592170a3dDianne Hackborn                    .setMessage(getActivity().getText(R.string.app_disable_dlg_text))
792f0b63c2c3ec65e8864d5b76a993e87f592170a3dDianne Hackborn                    .setPositiveButton(R.string.dlg_ok,
793f0b63c2c3ec65e8864d5b76a993e87f592170a3dDianne Hackborn                        new DialogInterface.OnClickListener() {
794f0b63c2c3ec65e8864d5b76a993e87f592170a3dDianne Hackborn                        public void onClick(DialogInterface dialog, int which) {
795f0b63c2c3ec65e8864d5b76a993e87f592170a3dDianne Hackborn                            // Disable the app
796f0b63c2c3ec65e8864d5b76a993e87f592170a3dDianne Hackborn                            new DisableChanger(getOwner(), getOwner().mAppEntry.info,
797f0b63c2c3ec65e8864d5b76a993e87f592170a3dDianne Hackborn                                    PackageManager.COMPONENT_ENABLED_STATE_DISABLED_USER)
798f0b63c2c3ec65e8864d5b76a993e87f592170a3dDianne Hackborn                            .execute((Object)null);
799f0b63c2c3ec65e8864d5b76a993e87f592170a3dDianne Hackborn                        }
800f0b63c2c3ec65e8864d5b76a993e87f592170a3dDianne Hackborn                    })
801f0b63c2c3ec65e8864d5b76a993e87f592170a3dDianne Hackborn                    .setNegativeButton(R.string.dlg_cancel, null)
802f0b63c2c3ec65e8864d5b76a993e87f592170a3dDianne Hackborn                    .create();
803f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn            }
804f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn            throw new IllegalArgumentException("unknown id " + id);
805f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn        }
80650b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu    }
80750b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu
80850b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu    private void uninstallPkg(String packageName) {
80950b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu         // Create new intent to launch Uninstaller activity
81050b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu        Uri packageURI = Uri.parse("package:"+packageName);
81150b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu        Intent uninstallIntent = new Intent(Intent.ACTION_DELETE, packageURI);
81250b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu        startActivity(uninstallIntent);
81350b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu        setIntentAndFinish(true, true);
81450b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu    }
81550b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu
81642241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu    private void forceStopPackage(String pkgName) {
817f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn        ActivityManager am = (ActivityManager)getActivity().getSystemService(
81842241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu                Context.ACTIVITY_SERVICE);
81942241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu        am.forceStopPackage(pkgName);
820c442e52dca4d32e2ea391e361c847ce834bf0dfdDianne Hackborn        mState.invalidatePackage(pkgName);
821c442e52dca4d32e2ea391e361c847ce834bf0dfdDianne Hackborn        ApplicationsState.AppEntry newEnt = mState.getEntry(pkgName);
822c442e52dca4d32e2ea391e361c847ce834bf0dfdDianne Hackborn        if (newEnt != null) {
823c442e52dca4d32e2ea391e361c847ce834bf0dfdDianne Hackborn            mAppEntry = newEnt;
824c442e52dca4d32e2ea391e361c847ce834bf0dfdDianne Hackborn        }
825cb497546ba55ef98fb561dd9a07c7a485a918f4bDianne Hackborn        checkForceStop();
82642241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu    }
82742241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu
828cb497546ba55ef98fb561dd9a07c7a485a918f4bDianne Hackborn    private final BroadcastReceiver mCheckKillProcessesReceiver = new BroadcastReceiver() {
829cb497546ba55ef98fb561dd9a07c7a485a918f4bDianne Hackborn        @Override
830cb497546ba55ef98fb561dd9a07c7a485a918f4bDianne Hackborn        public void onReceive(Context context, Intent intent) {
831861c04fbd4841253a02299b7498a8cf609e8874dDianne Hackborn            updateForceStopButton(getResultCode() != Activity.RESULT_CANCELED);
832cb497546ba55ef98fb561dd9a07c7a485a918f4bDianne Hackborn        }
833cb497546ba55ef98fb561dd9a07c7a485a918f4bDianne Hackborn    };
834861c04fbd4841253a02299b7498a8cf609e8874dDianne Hackborn
835861c04fbd4841253a02299b7498a8cf609e8874dDianne Hackborn    private void updateForceStopButton(boolean enabled) {
836861c04fbd4841253a02299b7498a8cf609e8874dDianne Hackborn        mForceStopButton.setEnabled(enabled);
837861c04fbd4841253a02299b7498a8cf609e8874dDianne Hackborn        mForceStopButton.setOnClickListener(InstalledAppDetails.this);
838861c04fbd4841253a02299b7498a8cf609e8874dDianne Hackborn    }
839cb497546ba55ef98fb561dd9a07c7a485a918f4bDianne Hackborn
840cb497546ba55ef98fb561dd9a07c7a485a918f4bDianne Hackborn    private void checkForceStop() {
8415c2b48d4d52a2b6b3ae3c745e7016da390a4e1d7Dianne Hackborn        if (mDpm.packageHasActiveAdmins(mPackageInfo.packageName)) {
8425c2b48d4d52a2b6b3ae3c745e7016da390a4e1d7Dianne Hackborn            // User can't force stop device admin.
8435c2b48d4d52a2b6b3ae3c745e7016da390a4e1d7Dianne Hackborn            updateForceStopButton(false);
8445c2b48d4d52a2b6b3ae3c745e7016da390a4e1d7Dianne Hackborn        } else if ((mAppEntry.info.flags&ApplicationInfo.FLAG_STOPPED) == 0) {
845861c04fbd4841253a02299b7498a8cf609e8874dDianne Hackborn            // If the app isn't explicitly stopped, then always show the
846861c04fbd4841253a02299b7498a8cf609e8874dDianne Hackborn            // force stop button.
847861c04fbd4841253a02299b7498a8cf609e8874dDianne Hackborn            updateForceStopButton(true);
848861c04fbd4841253a02299b7498a8cf609e8874dDianne Hackborn        } else {
8495c2b48d4d52a2b6b3ae3c745e7016da390a4e1d7Dianne Hackborn            Intent intent = new Intent(Intent.ACTION_QUERY_PACKAGE_RESTART,
8505c2b48d4d52a2b6b3ae3c745e7016da390a4e1d7Dianne Hackborn                    Uri.fromParts("package", mAppEntry.info.packageName, null));
8515c2b48d4d52a2b6b3ae3c745e7016da390a4e1d7Dianne Hackborn            intent.putExtra(Intent.EXTRA_PACKAGES, new String[] { mAppEntry.info.packageName });
8525c2b48d4d52a2b6b3ae3c745e7016da390a4e1d7Dianne Hackborn            intent.putExtra(Intent.EXTRA_UID, mAppEntry.info.uid);
853861c04fbd4841253a02299b7498a8cf609e8874dDianne Hackborn            getActivity().sendOrderedBroadcast(intent, null, mCheckKillProcessesReceiver, null,
854861c04fbd4841253a02299b7498a8cf609e8874dDianne Hackborn                    Activity.RESULT_CANCELED, null, null);
855861c04fbd4841253a02299b7498a8cf609e8874dDianne Hackborn        }
856cb497546ba55ef98fb561dd9a07c7a485a918f4bDianne Hackborn    }
857cb497546ba55ef98fb561dd9a07c7a485a918f4bDianne Hackborn
8589db5ee35d5345e13e6e6b857dbad5a83e9f037d1Dianne Hackborn    static class DisableChanger extends AsyncTask<Object, Object, Object> {
8599db5ee35d5345e13e6e6b857dbad5a83e9f037d1Dianne Hackborn        final PackageManager mPm;
8609db5ee35d5345e13e6e6b857dbad5a83e9f037d1Dianne Hackborn        final WeakReference<InstalledAppDetails> mActivity;
8619db5ee35d5345e13e6e6b857dbad5a83e9f037d1Dianne Hackborn        final ApplicationInfo mInfo;
8629db5ee35d5345e13e6e6b857dbad5a83e9f037d1Dianne Hackborn        final int mState;
8639db5ee35d5345e13e6e6b857dbad5a83e9f037d1Dianne Hackborn
8649db5ee35d5345e13e6e6b857dbad5a83e9f037d1Dianne Hackborn        DisableChanger(InstalledAppDetails activity, ApplicationInfo info, int state) {
8659db5ee35d5345e13e6e6b857dbad5a83e9f037d1Dianne Hackborn            mPm = activity.mPm;
8669db5ee35d5345e13e6e6b857dbad5a83e9f037d1Dianne Hackborn            mActivity = new WeakReference<InstalledAppDetails>(activity);
8679db5ee35d5345e13e6e6b857dbad5a83e9f037d1Dianne Hackborn            mInfo = info;
8689db5ee35d5345e13e6e6b857dbad5a83e9f037d1Dianne Hackborn            mState = state;
8699db5ee35d5345e13e6e6b857dbad5a83e9f037d1Dianne Hackborn        }
8709db5ee35d5345e13e6e6b857dbad5a83e9f037d1Dianne Hackborn
8719db5ee35d5345e13e6e6b857dbad5a83e9f037d1Dianne Hackborn        @Override
8729db5ee35d5345e13e6e6b857dbad5a83e9f037d1Dianne Hackborn        protected Object doInBackground(Object... params) {
8739db5ee35d5345e13e6e6b857dbad5a83e9f037d1Dianne Hackborn            mPm.setApplicationEnabledSetting(mInfo.packageName, mState, 0);
8749db5ee35d5345e13e6e6b857dbad5a83e9f037d1Dianne Hackborn            return null;
8759db5ee35d5345e13e6e6b857dbad5a83e9f037d1Dianne Hackborn        }
8769db5ee35d5345e13e6e6b857dbad5a83e9f037d1Dianne Hackborn    }
8779db5ee35d5345e13e6e6b857dbad5a83e9f037d1Dianne Hackborn
878afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    /*
879afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project     * Method implementing functionality of buttons clicked
880afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project     * @see android.view.View.OnClickListener#onClick(android.view.View)
881afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project     */
882afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    public void onClick(View v) {
8830f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn        String packageName = mAppEntry.info.packageName;
88442241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu        if(v == mUninstallButton) {
88542241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu            if (mUpdatedSysApp) {
886f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                showDialogInner(DLG_FACTORY_RESET, 0);
88742241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu            } else {
8880f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn                if ((mAppEntry.info.flags & ApplicationInfo.FLAG_SYSTEM) != 0) {
889f0b63c2c3ec65e8864d5b76a993e87f592170a3dDianne Hackborn                    if (mAppEntry.info.enabled) {
890f0b63c2c3ec65e8864d5b76a993e87f592170a3dDianne Hackborn                        showDialogInner(DLG_DISABLE, 0);
891f0b63c2c3ec65e8864d5b76a993e87f592170a3dDianne Hackborn                    } else {
892f0b63c2c3ec65e8864d5b76a993e87f592170a3dDianne Hackborn                        new DisableChanger(this, mAppEntry.info,
893f0b63c2c3ec65e8864d5b76a993e87f592170a3dDianne Hackborn                                PackageManager.COMPONENT_ENABLED_STATE_DEFAULT)
894f0b63c2c3ec65e8864d5b76a993e87f592170a3dDianne Hackborn                        .execute((Object)null);
895f0b63c2c3ec65e8864d5b76a993e87f592170a3dDianne Hackborn                    }
8969db5ee35d5345e13e6e6b857dbad5a83e9f037d1Dianne Hackborn                } else {
8979db5ee35d5345e13e6e6b857dbad5a83e9f037d1Dianne Hackborn                    uninstallPkg(packageName);
8989db5ee35d5345e13e6e6b857dbad5a83e9f037d1Dianne Hackborn                }
899afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            }
900afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        } else if(v == mActivitiesButton) {
901afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            mPm.clearPackagePreferredActivities(packageName);
9029d6d92b33ebf1c91aed47bd759ce78a3e06afff5Mike Lockwood            try {
9032715376cfa4d220f183623a5f35214d1bd537376Mike Lockwood                mUsbManager.clearDefaults(packageName);
9049d6d92b33ebf1c91aed47bd759ce78a3e06afff5Mike Lockwood            } catch (RemoteException e) {
9059d6d92b33ebf1c91aed47bd759ce78a3e06afff5Mike Lockwood                Log.e(TAG, "mUsbManager.clearDefaults", e);
9069d6d92b33ebf1c91aed47bd759ce78a3e06afff5Mike Lockwood            }
907afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            mActivitiesButton.setEnabled(false);
90842241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu        } else if(v == mClearDataButton) {
9090f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn            if (mAppEntry.info.manageSpaceActivityName != null) {
91042241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu                Intent intent = new Intent(Intent.ACTION_DEFAULT);
9110f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn                intent.setClassName(mAppEntry.info.packageName,
9120f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn                        mAppEntry.info.manageSpaceActivityName);
91342241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu                startActivityForResult(intent, -1);
91442241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu            } else {
915f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                showDialogInner(DLG_CLEAR_DATA, 0);
91642241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu            }
917afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        } else if (v == mClearCacheButton) {
918afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            // Lazy initialization of observer
919afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            if (mClearCacheObserver == null) {
920afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                mClearCacheObserver = new ClearCacheObserver();
921afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            }
922afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            mPm.deleteApplicationCacheFiles(packageName, mClearCacheObserver);
923afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        } else if (v == mForceStopButton) {
924f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn            showDialogInner(DLG_FORCE_STOP, 0);
9259db5ee35d5345e13e6e6b857dbad5a83e9f037d1Dianne Hackborn            //forceStopPackage(mAppInfo.packageName);
926ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu        } else if (v == mMoveAppButton) {
927ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu            if (mPackageMoveObserver == null) {
928ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu                mPackageMoveObserver = new PackageMoveObserver();
929ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu            }
9300f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn            int moveFlags = (mAppEntry.info.flags & ApplicationInfo.FLAG_EXTERNAL_STORAGE) != 0 ?
931ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu                    PackageManager.MOVE_INTERNAL : PackageManager.MOVE_EXTERNAL_MEDIA;
932de03ac27b74d1d69c1fea36e7fb00f068ab16b21Suchi Amalapurapu            mMoveInProgress = true;
933de03ac27b74d1d69c1fea36e7fb00f068ab16b21Suchi Amalapurapu            refreshButtons();
9340f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn            mPm.movePackage(mAppEntry.info.packageName, mPackageMoveObserver, moveFlags);
935afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        }
936afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    }
937aef746c45f14c8a170dba48c4b55f93cae0e24e4Dianne Hackborn
938aef746c45f14c8a170dba48c4b55f93cae0e24e4Dianne Hackborn    @Override
939aef746c45f14c8a170dba48c4b55f93cae0e24e4Dianne Hackborn    public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
940aef746c45f14c8a170dba48c4b55f93cae0e24e4Dianne Hackborn        String packageName = mAppEntry.info.packageName;
941aef746c45f14c8a170dba48c4b55f93cae0e24e4Dianne Hackborn        ActivityManager am = (ActivityManager)
942aef746c45f14c8a170dba48c4b55f93cae0e24e4Dianne Hackborn                getActivity().getSystemService(Context.ACTIVITY_SERVICE);
943aef746c45f14c8a170dba48c4b55f93cae0e24e4Dianne Hackborn        if (buttonView == mAskCompatibilityCB) {
944aef746c45f14c8a170dba48c4b55f93cae0e24e4Dianne Hackborn            am.setPackageAskScreenCompat(packageName, isChecked);
945aef746c45f14c8a170dba48c4b55f93cae0e24e4Dianne Hackborn        } else if (buttonView == mEnableCompatibilityCB) {
946aef746c45f14c8a170dba48c4b55f93cae0e24e4Dianne Hackborn            am.setPackageScreenCompatMode(packageName, isChecked ?
947aef746c45f14c8a170dba48c4b55f93cae0e24e4Dianne Hackborn                    ActivityManager.COMPAT_MODE_ENABLED : ActivityManager.COMPAT_MODE_DISABLED);
9484a824be44c3878f22469cf45c2ef8b7e92724e92Daniel Sandler        } else if (buttonView == mNotificationSwitch) {
9494a824be44c3878f22469cf45c2ef8b7e92724e92Daniel Sandler            INotificationManager nm = INotificationManager.Stub.asInterface(
9504a824be44c3878f22469cf45c2ef8b7e92724e92Daniel Sandler                ServiceManager.getService(Context.NOTIFICATION_SERVICE));
9514a824be44c3878f22469cf45c2ef8b7e92724e92Daniel Sandler            try {
9524a824be44c3878f22469cf45c2ef8b7e92724e92Daniel Sandler                nm.setNotificationsEnabledForPackage(packageName, isChecked);
9534a824be44c3878f22469cf45c2ef8b7e92724e92Daniel Sandler            } catch (android.os.RemoteException ex) {
9544a824be44c3878f22469cf45c2ef8b7e92724e92Daniel Sandler                mNotificationSwitch.setChecked(!isChecked); // revert
9554a824be44c3878f22469cf45c2ef8b7e92724e92Daniel Sandler            }
956aef746c45f14c8a170dba48c4b55f93cae0e24e4Dianne Hackborn        }
957aef746c45f14c8a170dba48c4b55f93cae0e24e4Dianne Hackborn    }
958afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project}
959afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
960