summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author TreeHugger Robot <treehugger-gerrit@google.com> 2021-01-14 10:36:55 +0000
committer Android (Google) Code Review <android-gerrit@google.com> 2021-01-14 10:36:55 +0000
commit85cab1fa8b637da33dd8c5d8bd0a8e3c1e59e038 (patch)
treea8a7ab649fb3afa2284255ee001a33bdfbf6021d
parentc91a0f9491cff6c609c659e9fdd6d06e723c5d69 (diff)
parenta95881f6caad848d41eb10436d345915bd4e0e2e (diff)
Merge "Use API for binding service with custom user and executor."
-rw-r--r--core/java/android/app/ContextImpl.java1
-rw-r--r--core/java/com/android/internal/infra/ServiceConnector.java34
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)