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