From bf9928de18adfc39de17300325dfbd229af5db99 Mon Sep 17 00:00:00 2001 From: Tony Mak Date: Thu, 22 Dec 2016 11:02:45 +0000 Subject: [PATCH] Make sure ServiceConnection callback is called in main thread Fix: 33568999 Test: cts-tradefed run cts --module CtsDevicePolicyManagerTestCases --test com.android.cts.devicepolicy.DeviceOwnerPlusManagedProfileTest Change-Id: I14c8b5b1f78192429e68a3057430406245a909c8 --- core/java/android/app/ContextImpl.java | 6 ++++++ core/java/android/app/admin/DevicePolicyManager.java | 7 ++++--- core/java/android/content/Context.java | 7 +++++++ core/java/android/content/ContextWrapper.java | 8 ++++++++ test-runner/src/android/test/mock/MockContext.java | 6 ++++++ 5 files changed, 31 insertions(+), 3 deletions(-) diff --git a/core/java/android/app/ContextImpl.java b/core/java/android/app/ContextImpl.java index 5f706dcf8fb1..547c71043a11 100644 --- a/core/java/android/app/ContextImpl.java +++ b/core/java/android/app/ContextImpl.java @@ -1470,6 +1470,12 @@ class ContextImpl extends Context { return mMainThread.getApplicationThread(); } + /** @hide */ + @Override + public Handler getMainThreadHandler() { + return mMainThread.getHandler(); + } + private boolean bindServiceCommon(Intent service, ServiceConnection conn, int flags, Handler handler, UserHandle user) { // Keep this in sync with DevicePolicyManager.bindDeviceAdminServiceAsUser. diff --git a/core/java/android/app/admin/DevicePolicyManager.java b/core/java/android/app/admin/DevicePolicyManager.java index 617288428916..6f73388ff139 100644 --- a/core/java/android/app/admin/DevicePolicyManager.java +++ b/core/java/android/app/admin/DevicePolicyManager.java @@ -7111,8 +7111,8 @@ public class DevicePolicyManager { * @param serviceIntent Identifies the service to connect to. The Intent must specify either an * explicit component name or a package name to match an * {@link IntentFilter} published by a service. - * @param conn Receives information as the service is started and stopped. This must be a - * valid {@link ServiceConnection} object; it must not be {@code null}. + * @param conn Receives information as the service is started and stopped in main thread. This + * must be a valid {@link ServiceConnection} object; it must not be {@code null}. * @param flags Operation options for the binding operation. See * {@link Context#bindService(Intent, ServiceConnection, int)}. * @param targetUser Which user to bind to. Must be one of the users returned by @@ -7131,7 +7131,8 @@ public class DevicePolicyManager { throwIfParentInstance("bindDeviceAdminServiceAsUser"); // Keep this in sync with ContextImpl.bindServiceCommon. try { - final IServiceConnection sd = mContext.getServiceDispatcher(conn, null, flags); + final IServiceConnection sd = mContext.getServiceDispatcher( + conn, mContext.getMainThreadHandler(), flags); serviceIntent.prepareToLeaveProcess(mContext); return mService.bindDeviceAdminServiceAsUser(admin, mContext.getIApplicationThread(), mContext.getActivityToken(), serviceIntent, diff --git a/core/java/android/content/Context.java b/core/java/android/content/Context.java index f0f1d99b9f96..9dc60ab82f2d 100644 --- a/core/java/android/content/Context.java +++ b/core/java/android/content/Context.java @@ -4403,4 +4403,11 @@ public abstract class Context { public IApplicationThread getIApplicationThread() { throw new RuntimeException("Not implemented. Must override in a subclass."); } + + /** + * @hide + */ + public Handler getMainThreadHandler() { + throw new RuntimeException("Not implemented. Must override in a subclass."); + } } diff --git a/core/java/android/content/ContextWrapper.java b/core/java/android/content/ContextWrapper.java index 75336559088b..4b6076b37fdf 100644 --- a/core/java/android/content/ContextWrapper.java +++ b/core/java/android/content/ContextWrapper.java @@ -885,4 +885,12 @@ public class ContextWrapper extends Context { public IApplicationThread getIApplicationThread() { return mBase.getIApplicationThread(); } + + /** + * @hide + */ + @Override + public Handler getMainThreadHandler() { + return mBase.getMainThreadHandler(); + } } diff --git a/test-runner/src/android/test/mock/MockContext.java b/test-runner/src/android/test/mock/MockContext.java index 190fc35e4873..bcc68b38dd2b 100644 --- a/test-runner/src/android/test/mock/MockContext.java +++ b/test-runner/src/android/test/mock/MockContext.java @@ -780,4 +780,10 @@ public class MockContext extends Context { public IApplicationThread getIApplicationThread() { throw new UnsupportedOperationException(); } + + /** {@hide} */ + @Override + public Handler getMainThreadHandler() { + throw new UnsupportedOperationException(); + } } -- 2.11.0