diff options
| author | 2021-01-14 10:36:55 +0000 | |
|---|---|---|
| committer | 2021-01-14 10:36:55 +0000 | |
| commit | 85cab1fa8b637da33dd8c5d8bd0a8e3c1e59e038 (patch) | |
| tree | a8a7ab649fb3afa2284255ee001a33bdfbf6021d | |
| parent | c91a0f9491cff6c609c659e9fdd6d06e723c5d69 (diff) | |
| parent | a95881f6caad848d41eb10436d345915bd4e0e2e (diff) | |
Merge "Use API for binding service with custom user and executor."
| -rw-r--r-- | core/java/android/app/ContextImpl.java | 1 | ||||
| -rw-r--r-- | core/java/com/android/internal/infra/ServiceConnector.java | 34 |
2 files changed, 19 insertions, 16 deletions
diff --git a/core/java/android/app/ContextImpl.java b/core/java/android/app/ContextImpl.java index 733270118909..c1ed7b2ec55a 100644 --- a/core/java/android/app/ContextImpl.java +++ b/core/java/android/app/ContextImpl.java @@ -1795,7 +1795,6 @@ class ContextImpl extends Context { @Override public boolean bindService( Intent service, int flags, Executor executor, ServiceConnection conn) { - warnIfCallingFromSystemProcess(); return bindServiceCommon(service, conn, flags, null, null, executor, getUser()); } diff --git a/core/java/com/android/internal/infra/ServiceConnector.java b/core/java/com/android/internal/infra/ServiceConnector.java index 89869389cb59..fc95275c2e1b 100644 --- a/core/java/com/android/internal/infra/ServiceConnector.java +++ b/core/java/com/android/internal/infra/ServiceConnector.java @@ -24,6 +24,7 @@ import android.content.Context; import android.content.Intent; import android.content.ServiceConnection; import android.os.Handler; +import android.os.HandlerExecutor; import android.os.IBinder; import android.os.IInterface; import android.os.Looper; @@ -40,6 +41,7 @@ import java.util.Objects; import java.util.Queue; import java.util.concurrent.CompletableFuture; import java.util.concurrent.CompletionStage; +import java.util.concurrent.Executor; import java.util.concurrent.TimeUnit; import java.util.function.BiConsumer; import java.util.function.Function; @@ -220,11 +222,13 @@ public interface ServiceConnector<I extends IInterface> { private final @NonNull ServiceConnection mServiceConnection = this; private final @NonNull Runnable mTimeoutDisconnect = this; + // This context contains the user information. protected final @NonNull Context mContext; private final @NonNull Intent mIntent; private final int mBindingFlags; - private final int mUserId; private final @Nullable Function<IBinder, I> mBinderAsInterface; + private final @NonNull Handler mHandler; + private final @NonNull Executor mExecutor; private volatile I mService = null; private boolean mBinding = false; @@ -249,11 +253,13 @@ public interface ServiceConnector<I extends IInterface> { */ public Impl(@NonNull Context context, @NonNull Intent intent, int bindingFlags, @UserIdInt int userId, @Nullable Function<IBinder, I> binderAsInterface) { - mContext = context; + mContext = context.createContextAsUser(UserHandle.of(userId), 0); mIntent = intent; mBindingFlags = bindingFlags; - mUserId = userId; mBinderAsInterface = binderAsInterface; + + mHandler = getJobHandler(); + mExecutor = new HandlerExecutor(mHandler); } /** @@ -292,14 +298,12 @@ public interface ServiceConnector<I extends IInterface> { * <p> * If overridden, implementation must use at least the provided {@link ServiceConnection} */ - protected boolean bindService( - @NonNull ServiceConnection serviceConnection, @NonNull Handler handler) { + protected boolean bindService(@NonNull ServiceConnection serviceConnection) { if (DEBUG) { logTrace(); } - return mContext.bindServiceAsUser(mIntent, serviceConnection, - Context.BIND_AUTO_CREATE | mBindingFlags, - handler, UserHandle.of(mUserId)); + return mContext.bindService(mIntent, Context.BIND_AUTO_CREATE | mBindingFlags, + mExecutor, serviceConnection); } /** @@ -381,13 +385,13 @@ public interface ServiceConnector<I extends IInterface> { if (!enqueue((Job<I, ?>) task)) { task.completeExceptionally(new IllegalStateException( "Failed to post a job to handler. Likely " - + getJobHandler().getLooper() + " is exiting")); + + mHandler.getLooper() + " is exiting")); } } private boolean enqueue(@NonNull Job<I, ?> job) { cancelTimeout(); - return getJobHandler().post(() -> enqueueJobThread(job)); + return mHandler.post(() -> enqueueJobThread(job)); } void enqueueJobThread(@NonNull Job<I, ?> job) { @@ -404,7 +408,7 @@ public interface ServiceConnector<I extends IInterface> { } else if (isBound()) { processQueue(); } else if (!mBinding) { - if (bindService(mServiceConnection, getJobHandler())) { + if (bindService(mServiceConnection)) { mBinding = true; } else { completeExceptionally(job, @@ -497,7 +501,7 @@ public interface ServiceConnector<I extends IInterface> { logTrace(); } mUnbinding = true; - getJobHandler().post(this::unbindJobThread); + mHandler.post(this::unbindJobThread); } void unbindJobThread() { @@ -606,7 +610,7 @@ public interface ServiceConnector<I extends IInterface> { public String toString() { StringBuilder sb = new StringBuilder("ServiceConnector@") .append(System.identityHashCode(this) % 1000).append("(") - .append(mIntent).append(", user: ").append(mUserId) + .append(mIntent).append(", user: ").append(mContext.getUser().getIdentifier()) .append(")[").append(stateToString()); if (!mQueue.isEmpty()) { sb.append(", ").append(mQueue.size()).append(" pending job(s)"); @@ -624,8 +628,8 @@ public interface ServiceConnector<I extends IInterface> { String tab = " "; pw.append(prefix).append("ServiceConnector:").println(); pw.append(prefix).append(tab).append(String.valueOf(mIntent)).println(); - pw.append(prefix).append(tab) - .append("userId: ").append(String.valueOf(mUserId)).println(); + pw.append(prefix).append(tab).append("userId: ") + .append(String.valueOf(mContext.getUser().getIdentifier())).println(); pw.append(prefix).append(tab) .append("State: ").append(stateToString()).println(); pw.append(prefix).append(tab) |