191ec61c3dca241befdf4a3803c45b051a3e3124fThe Android Open Source Project/* 291ec61c3dca241befdf4a3803c45b051a3e3124fThe Android Open Source Project** 391ec61c3dca241befdf4a3803c45b051a3e3124fThe Android Open Source Project** Copyright 2007, The Android Open Source Project 491ec61c3dca241befdf4a3803c45b051a3e3124fThe Android Open Source Project** 591ec61c3dca241befdf4a3803c45b051a3e3124fThe Android Open Source Project** Licensed under the Apache License, Version 2.0 (the "License"); 691ec61c3dca241befdf4a3803c45b051a3e3124fThe Android Open Source Project** you may not use this file except in compliance with the License. 791ec61c3dca241befdf4a3803c45b051a3e3124fThe Android Open Source Project** You may obtain a copy of the License at 891ec61c3dca241befdf4a3803c45b051a3e3124fThe Android Open Source Project** 991ec61c3dca241befdf4a3803c45b051a3e3124fThe Android Open Source Project** http://www.apache.org/licenses/LICENSE-2.0 1091ec61c3dca241befdf4a3803c45b051a3e3124fThe Android Open Source Project** 1191ec61c3dca241befdf4a3803c45b051a3e3124fThe Android Open Source Project** Unless required by applicable law or agreed to in writing, software 1291ec61c3dca241befdf4a3803c45b051a3e3124fThe Android Open Source Project** distributed under the License is distributed on an "AS IS" BASIS, 1391ec61c3dca241befdf4a3803c45b051a3e3124fThe Android Open Source Project** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1491ec61c3dca241befdf4a3803c45b051a3e3124fThe Android Open Source Project** See the License for the specific language governing permissions and 1591ec61c3dca241befdf4a3803c45b051a3e3124fThe Android Open Source Project** limitations under the License. 1691ec61c3dca241befdf4a3803c45b051a3e3124fThe Android Open Source Project*/ 1791ec61c3dca241befdf4a3803c45b051a3e3124fThe Android Open Source Projectpackage com.android.packageinstaller; 1891ec61c3dca241befdf4a3803c45b051a3e3124fThe Android Open Source Project 1991ec61c3dca241befdf4a3803c45b051a3e3124fThe Android Open Source Projectimport android.app.Activity; 20ca2484bb0553a93507eccec96cc73ecee1d77a53Scott Warnerimport android.content.Context; 2191ec61c3dca241befdf4a3803c45b051a3e3124fThe Android Open Source Projectimport android.content.Intent; 2291ec61c3dca241befdf4a3803c45b051a3e3124fThe Android Open Source Projectimport android.content.pm.ApplicationInfo; 2391ec61c3dca241befdf4a3803c45b051a3e3124fThe Android Open Source Projectimport android.content.pm.IPackageDeleteObserver; 243aeb50560ee8c383b7dfa65fd8c46642d2a6ef5cJeff Sharkeyimport android.content.pm.IPackageDeleteObserver2; 25596ce64f71011e7600ee2be66d977dafb86b9da3Kenny Guyimport android.content.pm.IPackageManager; 263aeb50560ee8c383b7dfa65fd8c46642d2a6ef5cJeff Sharkeyimport android.content.pm.PackageInstaller; 2777b967ee75a3566b2322fb767c8545aef8856841Kenny Rootimport android.content.pm.PackageManager; 28596ce64f71011e7600ee2be66d977dafb86b9da3Kenny Guyimport android.content.pm.UserInfo; 2991ec61c3dca241befdf4a3803c45b051a3e3124fThe Android Open Source Projectimport android.os.Bundle; 3091ec61c3dca241befdf4a3803c45b051a3e3124fThe Android Open Source Projectimport android.os.Handler; 313aeb50560ee8c383b7dfa65fd8c46642d2a6ef5cJeff Sharkeyimport android.os.IBinder; 3291ec61c3dca241befdf4a3803c45b051a3e3124fThe Android Open Source Projectimport android.os.Message; 33596ce64f71011e7600ee2be66d977dafb86b9da3Kenny Guyimport android.os.RemoteException; 34596ce64f71011e7600ee2be66d977dafb86b9da3Kenny Guyimport android.os.ServiceManager; 35596ce64f71011e7600ee2be66d977dafb86b9da3Kenny Guyimport android.os.UserHandle; 36596ce64f71011e7600ee2be66d977dafb86b9da3Kenny Guyimport android.os.UserManager; 377672c9941137c4664f5a2c64eb15a335b3c4789dSuchi Amalapurapuimport android.util.Log; 387672c9941137c4664f5a2c64eb15a335b3c4789dSuchi Amalapurapuimport android.view.KeyEvent; 397672c9941137c4664f5a2c64eb15a335b3c4789dSuchi Amalapurapuimport android.view.View; 407672c9941137c4664f5a2c64eb15a335b3c4789dSuchi Amalapurapuimport android.view.View.OnClickListener; 417672c9941137c4664f5a2c64eb15a335b3c4789dSuchi Amalapurapuimport android.widget.Button; 4291ec61c3dca241befdf4a3803c45b051a3e3124fThe Android Open Source Projectimport android.widget.ProgressBar; 4391ec61c3dca241befdf4a3803c45b051a3e3124fThe Android Open Source Projectimport android.widget.TextView; 44ca2484bb0553a93507eccec96cc73ecee1d77a53Scott Warnerimport android.widget.Toast; 4591ec61c3dca241befdf4a3803c45b051a3e3124fThe Android Open Source Project 46596ce64f71011e7600ee2be66d977dafb86b9da3Kenny Guyimport java.util.List; 47596ce64f71011e7600ee2be66d977dafb86b9da3Kenny Guy 4891ec61c3dca241befdf4a3803c45b051a3e3124fThe Android Open Source Project/** 4991ec61c3dca241befdf4a3803c45b051a3e3124fThe Android Open Source Project * This activity corresponds to a download progress screen that is displayed 5091ec61c3dca241befdf4a3803c45b051a3e3124fThe Android Open Source Project * when an application is uninstalled. The result of the application uninstall 5191ec61c3dca241befdf4a3803c45b051a3e3124fThe Android Open Source Project * is indicated in the result code that gets set to 0 or 1. The application gets launched 5291ec61c3dca241befdf4a3803c45b051a3e3124fThe Android Open Source Project * by an intent with the intent's class name explicitly set to UninstallAppProgress and expects 5391ec61c3dca241befdf4a3803c45b051a3e3124fThe Android Open Source Project * the application object of the application to uninstall. 5491ec61c3dca241befdf4a3803c45b051a3e3124fThe Android Open Source Project */ 557672c9941137c4664f5a2c64eb15a335b3c4789dSuchi Amalapurapupublic class UninstallAppProgress extends Activity implements OnClickListener { 5691ec61c3dca241befdf4a3803c45b051a3e3124fThe Android Open Source Project private final String TAG="UninstallAppProgress"; 5791ec61c3dca241befdf4a3803c45b051a3e3124fThe Android Open Source Project private boolean localLOGV = false; 583aeb50560ee8c383b7dfa65fd8c46642d2a6ef5cJeff Sharkey 5991ec61c3dca241befdf4a3803c45b051a3e3124fThe Android Open Source Project private ApplicationInfo mAppInfo; 603e0c22f98f61d8570c14c6f7ce49a05c1804d1f9Dianne Hackborn private boolean mAllUsers; 61596ce64f71011e7600ee2be66d977dafb86b9da3Kenny Guy private UserHandle mUser; 623aeb50560ee8c383b7dfa65fd8c46642d2a6ef5cJeff Sharkey private IBinder mCallback; 633aeb50560ee8c383b7dfa65fd8c46642d2a6ef5cJeff Sharkey 647672c9941137c4664f5a2c64eb15a335b3c4789dSuchi Amalapurapu private TextView mStatusTextView; 657672c9941137c4664f5a2c64eb15a335b3c4789dSuchi Amalapurapu private Button mOkButton; 66bae45d9ae440e20d1a261e81b6acdf02130a305aKenny Root private Button mDeviceManagerButton; 677672c9941137c4664f5a2c64eb15a335b3c4789dSuchi Amalapurapu private ProgressBar mProgressBar; 6838048fa68f75aa8d08ae6c0d2b5b32a5b52ce246Suchi Amalapurapu private View mOkPanel; 697672c9941137c4664f5a2c64eb15a335b3c4789dSuchi Amalapurapu private volatile int mResultCode = -1; 703aeb50560ee8c383b7dfa65fd8c46642d2a6ef5cJeff Sharkey 713aeb50560ee8c383b7dfa65fd8c46642d2a6ef5cJeff Sharkey private static final int UNINSTALL_COMPLETE = 1; 723aeb50560ee8c383b7dfa65fd8c46642d2a6ef5cJeff Sharkey 7391ec61c3dca241befdf4a3803c45b051a3e3124fThe Android Open Source Project private Handler mHandler = new Handler() { 7491ec61c3dca241befdf4a3803c45b051a3e3124fThe Android Open Source Project public void handleMessage(Message msg) { 7591ec61c3dca241befdf4a3803c45b051a3e3124fThe Android Open Source Project switch (msg.what) { 7691ec61c3dca241befdf4a3803c45b051a3e3124fThe Android Open Source Project case UNINSTALL_COMPLETE: 773aeb50560ee8c383b7dfa65fd8c46642d2a6ef5cJeff Sharkey mResultCode = msg.arg1; 783aeb50560ee8c383b7dfa65fd8c46642d2a6ef5cJeff Sharkey final String packageName = (String) msg.obj; 793aeb50560ee8c383b7dfa65fd8c46642d2a6ef5cJeff Sharkey 803aeb50560ee8c383b7dfa65fd8c46642d2a6ef5cJeff Sharkey if (mCallback != null) { 813aeb50560ee8c383b7dfa65fd8c46642d2a6ef5cJeff Sharkey final IPackageDeleteObserver2 observer = IPackageDeleteObserver2.Stub 823aeb50560ee8c383b7dfa65fd8c46642d2a6ef5cJeff Sharkey .asInterface(mCallback); 833aeb50560ee8c383b7dfa65fd8c46642d2a6ef5cJeff Sharkey try { 843aeb50560ee8c383b7dfa65fd8c46642d2a6ef5cJeff Sharkey observer.onPackageDeleted(mAppInfo.packageName, mResultCode, 853aeb50560ee8c383b7dfa65fd8c46642d2a6ef5cJeff Sharkey packageName); 863aeb50560ee8c383b7dfa65fd8c46642d2a6ef5cJeff Sharkey } catch (RemoteException ignored) { 873aeb50560ee8c383b7dfa65fd8c46642d2a6ef5cJeff Sharkey } 883aeb50560ee8c383b7dfa65fd8c46642d2a6ef5cJeff Sharkey finish(); 893aeb50560ee8c383b7dfa65fd8c46642d2a6ef5cJeff Sharkey return; 903aeb50560ee8c383b7dfa65fd8c46642d2a6ef5cJeff Sharkey } 913aeb50560ee8c383b7dfa65fd8c46642d2a6ef5cJeff Sharkey 929e9721266feafdf16786b94f6fac4c06220cd422Dianne Hackborn if (getIntent().getBooleanExtra(Intent.EXTRA_RETURN_RESULT, false)) { 939e9721266feafdf16786b94f6fac4c06220cd422Dianne Hackborn Intent result = new Intent(); 943aeb50560ee8c383b7dfa65fd8c46642d2a6ef5cJeff Sharkey result.putExtra(Intent.EXTRA_INSTALL_RESULT, mResultCode); 953aeb50560ee8c383b7dfa65fd8c46642d2a6ef5cJeff Sharkey setResult(mResultCode == PackageManager.DELETE_SUCCEEDED 969e9721266feafdf16786b94f6fac4c06220cd422Dianne Hackborn ? Activity.RESULT_OK : Activity.RESULT_FIRST_USER, 979e9721266feafdf16786b94f6fac4c06220cd422Dianne Hackborn result); 989e9721266feafdf16786b94f6fac4c06220cd422Dianne Hackborn finish(); 999e9721266feafdf16786b94f6fac4c06220cd422Dianne Hackborn return; 1009e9721266feafdf16786b94f6fac4c06220cd422Dianne Hackborn } 1019e9721266feafdf16786b94f6fac4c06220cd422Dianne Hackborn 1027672c9941137c4664f5a2c64eb15a335b3c4789dSuchi Amalapurapu // Update the status text 103596ce64f71011e7600ee2be66d977dafb86b9da3Kenny Guy final String statusText; 104bae45d9ae440e20d1a261e81b6acdf02130a305aKenny Root switch (msg.arg1) { 105bae45d9ae440e20d1a261e81b6acdf02130a305aKenny Root case PackageManager.DELETE_SUCCEEDED: 106596ce64f71011e7600ee2be66d977dafb86b9da3Kenny Guy statusText = getString(R.string.uninstall_done); 107ca2484bb0553a93507eccec96cc73ecee1d77a53Scott Warner // Show a Toast and finish the activity 108ca2484bb0553a93507eccec96cc73ecee1d77a53Scott Warner Context ctx = getBaseContext(); 109ca2484bb0553a93507eccec96cc73ecee1d77a53Scott Warner Toast.makeText(ctx, statusText, Toast.LENGTH_LONG).show(); 110ca2484bb0553a93507eccec96cc73ecee1d77a53Scott Warner setResultAndFinish(mResultCode); 111ca2484bb0553a93507eccec96cc73ecee1d77a53Scott Warner return; 112bae45d9ae440e20d1a261e81b6acdf02130a305aKenny Root case PackageManager.DELETE_FAILED_DEVICE_POLICY_MANAGER: 113bae45d9ae440e20d1a261e81b6acdf02130a305aKenny Root Log.d(TAG, "Uninstall failed because " + packageName 114bae45d9ae440e20d1a261e81b6acdf02130a305aKenny Root + " is a device admin"); 115bae45d9ae440e20d1a261e81b6acdf02130a305aKenny Root mDeviceManagerButton.setVisibility(View.VISIBLE); 116596ce64f71011e7600ee2be66d977dafb86b9da3Kenny Guy statusText = getString(R.string.uninstall_failed_device_policy_manager); 117596ce64f71011e7600ee2be66d977dafb86b9da3Kenny Guy break; 118596ce64f71011e7600ee2be66d977dafb86b9da3Kenny Guy case PackageManager.DELETE_FAILED_OWNER_BLOCKED: 119596ce64f71011e7600ee2be66d977dafb86b9da3Kenny Guy UserManager userManager = 120596ce64f71011e7600ee2be66d977dafb86b9da3Kenny Guy (UserManager) getSystemService(Context.USER_SERVICE); 121596ce64f71011e7600ee2be66d977dafb86b9da3Kenny Guy IPackageManager packageManager = IPackageManager.Stub.asInterface( 122596ce64f71011e7600ee2be66d977dafb86b9da3Kenny Guy ServiceManager.getService("package")); 123596ce64f71011e7600ee2be66d977dafb86b9da3Kenny Guy List<UserInfo> users = userManager.getUsers(); 124596ce64f71011e7600ee2be66d977dafb86b9da3Kenny Guy int blockingUserId = UserHandle.USER_NULL; 125596ce64f71011e7600ee2be66d977dafb86b9da3Kenny Guy for (int i = 0; i < users.size(); ++i) { 126596ce64f71011e7600ee2be66d977dafb86b9da3Kenny Guy final UserInfo user = users.get(i); 127596ce64f71011e7600ee2be66d977dafb86b9da3Kenny Guy try { 128596ce64f71011e7600ee2be66d977dafb86b9da3Kenny Guy if (packageManager.getBlockUninstallForUser(packageName, 129596ce64f71011e7600ee2be66d977dafb86b9da3Kenny Guy user.id)) { 130596ce64f71011e7600ee2be66d977dafb86b9da3Kenny Guy blockingUserId = user.id; 131596ce64f71011e7600ee2be66d977dafb86b9da3Kenny Guy break; 132596ce64f71011e7600ee2be66d977dafb86b9da3Kenny Guy } 133596ce64f71011e7600ee2be66d977dafb86b9da3Kenny Guy } catch (RemoteException e) { 134596ce64f71011e7600ee2be66d977dafb86b9da3Kenny Guy // Shouldn't happen. 135596ce64f71011e7600ee2be66d977dafb86b9da3Kenny Guy Log.e(TAG, "Failed to talk to package manager", e); 136596ce64f71011e7600ee2be66d977dafb86b9da3Kenny Guy } 137596ce64f71011e7600ee2be66d977dafb86b9da3Kenny Guy } 138596ce64f71011e7600ee2be66d977dafb86b9da3Kenny Guy mDeviceManagerButton.setVisibility(View.VISIBLE); 139596ce64f71011e7600ee2be66d977dafb86b9da3Kenny Guy if (blockingUserId == UserHandle.USER_OWNER) { 140596ce64f71011e7600ee2be66d977dafb86b9da3Kenny Guy statusText = getString(R.string.uninstall_blocked_device_owner); 141596ce64f71011e7600ee2be66d977dafb86b9da3Kenny Guy } else if (blockingUserId == UserHandle.USER_NULL) { 142596ce64f71011e7600ee2be66d977dafb86b9da3Kenny Guy Log.d(TAG, "Uninstall failed for " + packageName + " with code " 143596ce64f71011e7600ee2be66d977dafb86b9da3Kenny Guy + msg.arg1 + " no blocking user"); 144596ce64f71011e7600ee2be66d977dafb86b9da3Kenny Guy statusText = getString(R.string.uninstall_failed); 145596ce64f71011e7600ee2be66d977dafb86b9da3Kenny Guy } else { 146596ce64f71011e7600ee2be66d977dafb86b9da3Kenny Guy String userName = userManager.getUserInfo(blockingUserId).name; 147596ce64f71011e7600ee2be66d977dafb86b9da3Kenny Guy statusText = String.format( 148596ce64f71011e7600ee2be66d977dafb86b9da3Kenny Guy getString(R.string.uninstall_blocked_profile_owner), 149596ce64f71011e7600ee2be66d977dafb86b9da3Kenny Guy userName); 150596ce64f71011e7600ee2be66d977dafb86b9da3Kenny Guy } 151bae45d9ae440e20d1a261e81b6acdf02130a305aKenny Root break; 152bae45d9ae440e20d1a261e81b6acdf02130a305aKenny Root default: 153bae45d9ae440e20d1a261e81b6acdf02130a305aKenny Root Log.d(TAG, "Uninstall failed for " + packageName + " with code " 154bae45d9ae440e20d1a261e81b6acdf02130a305aKenny Root + msg.arg1); 155596ce64f71011e7600ee2be66d977dafb86b9da3Kenny Guy statusText = getString(R.string.uninstall_failed); 156bae45d9ae440e20d1a261e81b6acdf02130a305aKenny Root break; 1577672c9941137c4664f5a2c64eb15a335b3c4789dSuchi Amalapurapu } 158bae45d9ae440e20d1a261e81b6acdf02130a305aKenny Root mStatusTextView.setText(statusText); 159bae45d9ae440e20d1a261e81b6acdf02130a305aKenny Root 160bae45d9ae440e20d1a261e81b6acdf02130a305aKenny Root // Hide the progress bar; Show the ok button 16138048fa68f75aa8d08ae6c0d2b5b32a5b52ce246Suchi Amalapurapu mProgressBar.setVisibility(View.INVISIBLE); 16238048fa68f75aa8d08ae6c0d2b5b32a5b52ce246Suchi Amalapurapu mOkPanel.setVisibility(View.VISIBLE); 16391ec61c3dca241befdf4a3803c45b051a3e3124fThe Android Open Source Project break; 16491ec61c3dca241befdf4a3803c45b051a3e3124fThe Android Open Source Project default: 16591ec61c3dca241befdf4a3803c45b051a3e3124fThe Android Open Source Project break; 16691ec61c3dca241befdf4a3803c45b051a3e3124fThe Android Open Source Project } 16791ec61c3dca241befdf4a3803c45b051a3e3124fThe Android Open Source Project } 16891ec61c3dca241befdf4a3803c45b051a3e3124fThe Android Open Source Project }; 169bae45d9ae440e20d1a261e81b6acdf02130a305aKenny Root 17091ec61c3dca241befdf4a3803c45b051a3e3124fThe Android Open Source Project @Override 17191ec61c3dca241befdf4a3803c45b051a3e3124fThe Android Open Source Project public void onCreate(Bundle icicle) { 17291ec61c3dca241befdf4a3803c45b051a3e3124fThe Android Open Source Project super.onCreate(icicle); 17391ec61c3dca241befdf4a3803c45b051a3e3124fThe Android Open Source Project Intent intent = getIntent(); 17491ec61c3dca241befdf4a3803c45b051a3e3124fThe Android Open Source Project mAppInfo = intent.getParcelableExtra(PackageUtil.INTENT_ATTR_APPLICATION_INFO); 1753e0c22f98f61d8570c14c6f7ce49a05c1804d1f9Dianne Hackborn mAllUsers = intent.getBooleanExtra(Intent.EXTRA_UNINSTALL_ALL_USERS, false); 176596ce64f71011e7600ee2be66d977dafb86b9da3Kenny Guy if (mAllUsers && UserHandle.myUserId() != UserHandle.USER_OWNER) { 177596ce64f71011e7600ee2be66d977dafb86b9da3Kenny Guy throw new SecurityException("Only owner user can request uninstall for all users"); 178596ce64f71011e7600ee2be66d977dafb86b9da3Kenny Guy } 179596ce64f71011e7600ee2be66d977dafb86b9da3Kenny Guy mUser = intent.getParcelableExtra(Intent.EXTRA_USER); 180596ce64f71011e7600ee2be66d977dafb86b9da3Kenny Guy if (mUser == null) { 181596ce64f71011e7600ee2be66d977dafb86b9da3Kenny Guy mUser = android.os.Process.myUserHandle(); 182596ce64f71011e7600ee2be66d977dafb86b9da3Kenny Guy } else { 183596ce64f71011e7600ee2be66d977dafb86b9da3Kenny Guy UserManager userManager = (UserManager) getSystemService(Context.USER_SERVICE); 184596ce64f71011e7600ee2be66d977dafb86b9da3Kenny Guy List<UserHandle> profiles = userManager.getUserProfiles(); 185596ce64f71011e7600ee2be66d977dafb86b9da3Kenny Guy if (!profiles.contains(mUser)) { 186596ce64f71011e7600ee2be66d977dafb86b9da3Kenny Guy throw new SecurityException("User " + android.os.Process.myUserHandle() + " can't " 187596ce64f71011e7600ee2be66d977dafb86b9da3Kenny Guy + "request uninstall for user " + mUser); 188596ce64f71011e7600ee2be66d977dafb86b9da3Kenny Guy } 189596ce64f71011e7600ee2be66d977dafb86b9da3Kenny Guy } 1903aeb50560ee8c383b7dfa65fd8c46642d2a6ef5cJeff Sharkey mCallback = intent.getIBinderExtra(PackageInstaller.EXTRA_CALLBACK); 19191ec61c3dca241befdf4a3803c45b051a3e3124fThe Android Open Source Project initView(); 19291ec61c3dca241befdf4a3803c45b051a3e3124fThe Android Open Source Project } 19391ec61c3dca241befdf4a3803c45b051a3e3124fThe Android Open Source Project 19491ec61c3dca241befdf4a3803c45b051a3e3124fThe Android Open Source Project class PackageDeleteObserver extends IPackageDeleteObserver.Stub { 19577b967ee75a3566b2322fb767c8545aef8856841Kenny Root public void packageDeleted(String packageName, int returnCode) { 19691ec61c3dca241befdf4a3803c45b051a3e3124fThe Android Open Source Project Message msg = mHandler.obtainMessage(UNINSTALL_COMPLETE); 197bae45d9ae440e20d1a261e81b6acdf02130a305aKenny Root msg.arg1 = returnCode; 198bae45d9ae440e20d1a261e81b6acdf02130a305aKenny Root msg.obj = packageName; 19991ec61c3dca241befdf4a3803c45b051a3e3124fThe Android Open Source Project mHandler.sendMessage(msg); 20091ec61c3dca241befdf4a3803c45b051a3e3124fThe Android Open Source Project } 20191ec61c3dca241befdf4a3803c45b051a3e3124fThe Android Open Source Project } 20291ec61c3dca241befdf4a3803c45b051a3e3124fThe Android Open Source Project 20391ec61c3dca241befdf4a3803c45b051a3e3124fThe Android Open Source Project void setResultAndFinish(int retCode) { 20491ec61c3dca241befdf4a3803c45b051a3e3124fThe Android Open Source Project setResult(retCode); 20591ec61c3dca241befdf4a3803c45b051a3e3124fThe Android Open Source Project finish(); 20691ec61c3dca241befdf4a3803c45b051a3e3124fThe Android Open Source Project } 20791ec61c3dca241befdf4a3803c45b051a3e3124fThe Android Open Source Project 20891ec61c3dca241befdf4a3803c45b051a3e3124fThe Android Open Source Project public void initView() { 209362660b35aec989137b205ce8cb8eb945c19c1a3Patrick Dubroy boolean isUpdate = ((mAppInfo.flags & ApplicationInfo.FLAG_UPDATED_SYSTEM_APP) != 0); 210362660b35aec989137b205ce8cb8eb945c19c1a3Patrick Dubroy setTitle(isUpdate ? R.string.uninstall_update_title : R.string.uninstall_application_title); 211362660b35aec989137b205ce8cb8eb945c19c1a3Patrick Dubroy 2127672c9941137c4664f5a2c64eb15a335b3c4789dSuchi Amalapurapu setContentView(R.layout.uninstall_progress); 213ff8693ab50a9ed78ee816361c628969752127e9dSuchi Amalapurapu // Initialize views 214362660b35aec989137b205ce8cb8eb945c19c1a3Patrick Dubroy View snippetView = findViewById(R.id.app_snippet); 215362660b35aec989137b205ce8cb8eb945c19c1a3Patrick Dubroy PackageUtil.initSnippetForInstalledApp(this, mAppInfo, snippetView); 216bae45d9ae440e20d1a261e81b6acdf02130a305aKenny Root mStatusTextView = (TextView) findViewById(R.id.center_text); 2177672c9941137c4664f5a2c64eb15a335b3c4789dSuchi Amalapurapu mStatusTextView.setText(R.string.uninstalling); 218bae45d9ae440e20d1a261e81b6acdf02130a305aKenny Root mDeviceManagerButton = (Button) findViewById(R.id.device_manager_button); 219bae45d9ae440e20d1a261e81b6acdf02130a305aKenny Root mDeviceManagerButton.setVisibility(View.GONE); 220bae45d9ae440e20d1a261e81b6acdf02130a305aKenny Root mDeviceManagerButton.setOnClickListener(new OnClickListener() { 221bae45d9ae440e20d1a261e81b6acdf02130a305aKenny Root @Override 222bae45d9ae440e20d1a261e81b6acdf02130a305aKenny Root public void onClick(View v) { 223bae45d9ae440e20d1a261e81b6acdf02130a305aKenny Root Intent intent = new Intent(); 224bae45d9ae440e20d1a261e81b6acdf02130a305aKenny Root intent.setClassName("com.android.settings", 225bae45d9ae440e20d1a261e81b6acdf02130a305aKenny Root "com.android.settings.Settings$DeviceAdminSettingsActivity"); 226bae45d9ae440e20d1a261e81b6acdf02130a305aKenny Root intent.setFlags(Intent.FLAG_ACTIVITY_NO_HISTORY | Intent.FLAG_ACTIVITY_NEW_TASK); 227bae45d9ae440e20d1a261e81b6acdf02130a305aKenny Root startActivity(intent); 228bae45d9ae440e20d1a261e81b6acdf02130a305aKenny Root finish(); 229bae45d9ae440e20d1a261e81b6acdf02130a305aKenny Root } 230bae45d9ae440e20d1a261e81b6acdf02130a305aKenny Root }); 2317672c9941137c4664f5a2c64eb15a335b3c4789dSuchi Amalapurapu mProgressBar = (ProgressBar) findViewById(R.id.progress_bar); 2327672c9941137c4664f5a2c64eb15a335b3c4789dSuchi Amalapurapu mProgressBar.setIndeterminate(true); 2337672c9941137c4664f5a2c64eb15a335b3c4789dSuchi Amalapurapu // Hide button till progress is being displayed 234bae45d9ae440e20d1a261e81b6acdf02130a305aKenny Root mOkPanel = (View) findViewById(R.id.ok_panel); 235bae45d9ae440e20d1a261e81b6acdf02130a305aKenny Root mOkButton = (Button) findViewById(R.id.ok_button); 2367672c9941137c4664f5a2c64eb15a335b3c4789dSuchi Amalapurapu mOkButton.setOnClickListener(this); 23738048fa68f75aa8d08ae6c0d2b5b32a5b52ce246Suchi Amalapurapu mOkPanel.setVisibility(View.INVISIBLE); 238596ce64f71011e7600ee2be66d977dafb86b9da3Kenny Guy IPackageManager packageManager = 239596ce64f71011e7600ee2be66d977dafb86b9da3Kenny Guy IPackageManager.Stub.asInterface(ServiceManager.getService("package")); 24091ec61c3dca241befdf4a3803c45b051a3e3124fThe Android Open Source Project PackageDeleteObserver observer = new PackageDeleteObserver(); 241596ce64f71011e7600ee2be66d977dafb86b9da3Kenny Guy try { 242596ce64f71011e7600ee2be66d977dafb86b9da3Kenny Guy packageManager.deletePackageAsUser(mAppInfo.packageName, observer, 243596ce64f71011e7600ee2be66d977dafb86b9da3Kenny Guy mUser.getIdentifier(), 244596ce64f71011e7600ee2be66d977dafb86b9da3Kenny Guy mAllUsers ? PackageManager.DELETE_ALL_USERS : 0); 245596ce64f71011e7600ee2be66d977dafb86b9da3Kenny Guy } catch (RemoteException e) { 246596ce64f71011e7600ee2be66d977dafb86b9da3Kenny Guy // Shouldn't happen. 247596ce64f71011e7600ee2be66d977dafb86b9da3Kenny Guy Log.e(TAG, "Failed to talk to package manager", e); 248596ce64f71011e7600ee2be66d977dafb86b9da3Kenny Guy } 24991ec61c3dca241befdf4a3803c45b051a3e3124fThe Android Open Source Project } 2507672c9941137c4664f5a2c64eb15a335b3c4789dSuchi Amalapurapu 2517672c9941137c4664f5a2c64eb15a335b3c4789dSuchi Amalapurapu public void onClick(View v) { 2527672c9941137c4664f5a2c64eb15a335b3c4789dSuchi Amalapurapu if(v == mOkButton) { 2537672c9941137c4664f5a2c64eb15a335b3c4789dSuchi Amalapurapu Log.i(TAG, "Finished uninstalling pkg: " + mAppInfo.packageName); 2547672c9941137c4664f5a2c64eb15a335b3c4789dSuchi Amalapurapu setResultAndFinish(mResultCode); 2557672c9941137c4664f5a2c64eb15a335b3c4789dSuchi Amalapurapu } 2567672c9941137c4664f5a2c64eb15a335b3c4789dSuchi Amalapurapu } 2577672c9941137c4664f5a2c64eb15a335b3c4789dSuchi Amalapurapu 2587672c9941137c4664f5a2c64eb15a335b3c4789dSuchi Amalapurapu @Override 2597672c9941137c4664f5a2c64eb15a335b3c4789dSuchi Amalapurapu public boolean dispatchKeyEvent(KeyEvent ev) { 2607672c9941137c4664f5a2c64eb15a335b3c4789dSuchi Amalapurapu if (ev.getKeyCode() == KeyEvent.KEYCODE_BACK) { 2617672c9941137c4664f5a2c64eb15a335b3c4789dSuchi Amalapurapu if (mResultCode == -1) { 2627672c9941137c4664f5a2c64eb15a335b3c4789dSuchi Amalapurapu // Ignore back key when installation is in progress 2637672c9941137c4664f5a2c64eb15a335b3c4789dSuchi Amalapurapu return true; 2647672c9941137c4664f5a2c64eb15a335b3c4789dSuchi Amalapurapu } else { 2657672c9941137c4664f5a2c64eb15a335b3c4789dSuchi Amalapurapu // If installation is done, just set the result code 2667672c9941137c4664f5a2c64eb15a335b3c4789dSuchi Amalapurapu setResult(mResultCode); 2677672c9941137c4664f5a2c64eb15a335b3c4789dSuchi Amalapurapu } 2687672c9941137c4664f5a2c64eb15a335b3c4789dSuchi Amalapurapu } 2697672c9941137c4664f5a2c64eb15a335b3c4789dSuchi Amalapurapu return super.dispatchKeyEvent(ev); 2707672c9941137c4664f5a2c64eb15a335b3c4789dSuchi Amalapurapu } 27191ec61c3dca241befdf4a3803c45b051a3e3124fThe Android Open Source Project} 272