OSDN Git Service

Cherry-pick from master: Fix issue #3324032:
authorDianne Hackborn <hackbod@google.com>
Thu, 3 Mar 2011 06:39:49 +0000 (22:39 -0800)
committerDianne Hackborn <hackbod@google.com>
Sat, 5 Mar 2011 01:34:13 +0000 (17:34 -0800)
(I forgot to commit this before the MR2 branch was made.)

It is possible to create an app that cannot...
...be uninstalled using device policy managers

Don't allow app switches while we are bringing up the confirmation
dialog.  This prevents the app from pushing us out of the intended
settings app flow.

Change-Id: Id670e231ac47346478d22a3f59bb4a44a68ef7b2

src/com/android/settings/DeviceAdminAdd.java

index 63998e5..b2145b0 100644 (file)
@@ -19,6 +19,7 @@ package com.android.settings;
 import org.xmlpull.v1.XmlPullParserException;
 
 import android.app.Activity;
+import android.app.ActivityManagerNative;
 import android.app.AlertDialog;
 import android.app.Dialog;
 import android.app.admin.DeviceAdminInfo;
@@ -35,6 +36,7 @@ import android.content.res.Resources;
 import android.os.Bundle;
 import android.os.Handler;
 import android.os.RemoteCallback;
+import android.os.RemoteException;
 import android.text.TextUtils.TruncateAt;
 import android.util.Log;
 import android.view.Display;
@@ -193,6 +195,12 @@ public class DeviceAdminAdd extends Activity {
                     }
                     finish();
                 } else {
+                    try {
+                        // Don't allow the admin to put a dialog up in front
+                        // of us while we interact with the user.
+                        ActivityManagerNative.getDefault().stopAppSwitches();
+                    } catch (RemoteException e) {
+                    }
                     mDPM.getRemoveWarning(mDeviceAdmin.getComponent(),
                             new RemoteCallback(mHandler) {
                         @Override
@@ -202,6 +210,10 @@ public class DeviceAdminAdd extends Activity {
                                             DeviceAdminReceiver.EXTRA_DISABLE_WARNING)
                                     : null;
                             if (msg == null) {
+                                try {
+                                    ActivityManagerNative.getDefault().resumeAppSwitches();
+                                } catch (RemoteException e) {
+                                }
                                 mDPM.removeActiveAdmin(mDeviceAdmin.getComponent());
                                 finish();
                             } else {