Loading core/java/android/view/contentcapture/ContentCaptureManager.java +35 −2 Original line number Diff line number Diff line Loading @@ -15,6 +15,8 @@ */ package android.view.contentcapture; import static com.android.internal.util.function.pooled.PooledLambda.obtainMessage; import android.annotation.NonNull; import android.annotation.Nullable; import android.annotation.SystemService; Loading @@ -24,9 +26,12 @@ import android.content.Context; import android.os.Handler; import android.os.HandlerThread; import android.os.IBinder; import android.os.RemoteException; import android.util.Log; import com.android.internal.os.IResultReceiver; import com.android.internal.util.Preconditions; import com.android.internal.util.SyncResultReceiver; import java.io.PrintWriter; import java.util.concurrent.atomic.AtomicBoolean; Loading @@ -48,6 +53,11 @@ public final class ContentCaptureManager { private static final String BG_THREAD_NAME = "intel_svc_streamer_thread"; /** * Timeout for calls to system_server. */ private static final int SYNC_CALLS_TIMEOUT_MS = 5000; // TODO(b/121044306): define a way to dynamically set them(for example, using settings?) static final boolean VERBOSE = false; static final boolean DEBUG = true; // STOPSHIP if not set to false Loading Loading @@ -142,9 +152,22 @@ public final class ContentCaptureManager { */ @Nullable public ComponentName getServiceComponentName() { //TODO(b/121047489): implement if (!isContentCaptureEnabled()) { return null; } // Wait for system server to return the component name. final SyncResultReceiver resultReceiver = new SyncResultReceiver(SYNC_CALLS_TIMEOUT_MS); mHandler.sendMessage(obtainMessage( ContentCaptureManager::handleReceiverServiceComponentName, this, mContext.getUserId(), resultReceiver)); try { return resultReceiver.getParcelableResult(); } catch (RemoteException e) { // Unable to retrieve component name in a reasonable amount of time. throw e.rethrowFromSystemServer(); } } /** * Checks whether content capture is enabled for this activity. Loading Loading @@ -191,4 +214,14 @@ public final class ContentCaptureManager { pw.print(prefix); pw.println("No sessions"); } } /** Retrieves the component name of the target content capture service through system_server. */ private void handleReceiverServiceComponentName(int userId, IResultReceiver resultReceiver) { try { mService.getReceiverServiceComponentName(userId, resultReceiver); } catch (RemoteException e) { Log.w(TAG, "Unable to retrieve service component name: " + e); } } } core/java/android/view/contentcapture/IContentCaptureManager.aidl +21 −0 Original line number Diff line number Diff line Loading @@ -32,7 +32,28 @@ import java.util.List; * @hide */ oneway interface IContentCaptureManager { /** * Starts a new session for the provided {@code userId} running as part of the * app's activity identified by {@code activityToken}/{@code componentName}. * * @param sessionId Unique session id as provided by the app. * @param flags Meta flags that enable or disable content capture (see * {@link IContentCaptureContext#flags}). */ void startSession(int userId, IBinder activityToken, in ComponentName componentName, String sessionId, int flags, in IResultReceiver result); /** * Marks the end of a session for the provided {@code userId} identified by * the corresponding {@code startSession}'s {@code sessionId}. */ void finishSession(int userId, String sessionId); /** * Returns the content capture service's component name (if enabled and * connected). * @param Receiver of the content capture service's @{code ComponentName} * provided {@code Bundle} with key "{@code EXTRA}". */ void getReceiverServiceComponentName(int userId, in IResultReceiver result); } services/contentcapture/java/com/android/server/contentcapture/ContentCaptureManagerService.java +20 −2 Original line number Diff line number Diff line Loading @@ -39,6 +39,7 @@ import com.android.internal.annotations.GuardedBy; import com.android.internal.os.IResultReceiver; import com.android.internal.util.DumpUtils; import com.android.internal.util.Preconditions; import com.android.internal.util.SyncResultReceiver; import com.android.server.LocalServices; import com.android.server.infra.AbstractMasterSystemService; import com.android.server.infra.FrameworkResourcesServiceNameResolver; Loading @@ -50,8 +51,9 @@ import java.util.ArrayList; /** * A service used to observe the contents of the screen. * * <p>The data collected by this service can be analyzed and combined with other sources to provide * contextual data in other areas of the system such as Autofill. * <p>The data collected by this service can be analyzed on-device and combined * with other sources to provide contextual data in other areas of the system * such as Autofill. */ public final class ContentCaptureManagerService extends AbstractMasterSystemService<ContentCaptureManagerService, ContentCapturePerUserService> { Loading Loading @@ -195,6 +197,22 @@ public final class ContentCaptureManagerService extends } } @Override public void getReceiverServiceComponentName(@UserIdInt int userId, IResultReceiver receiver) { ComponentName connectedServiceComponentName; synchronized (mLock) { final ContentCapturePerUserService service = getServiceForUserLocked(userId); connectedServiceComponentName = service.getServiceComponentName(); } try { receiver.send(0, SyncResultReceiver.bundleFor(connectedServiceComponentName)); } catch (RemoteException e) { // Ignore exception as we need to be resilient against app behavior. Slog.w(TAG, "Unable to send service component name: " + e); } } @Override public void dump(FileDescriptor fd, PrintWriter pw, String[] args) { if (!DumpUtils.checkDumpPermission(getContext(), TAG, pw)) return; Loading Loading
core/java/android/view/contentcapture/ContentCaptureManager.java +35 −2 Original line number Diff line number Diff line Loading @@ -15,6 +15,8 @@ */ package android.view.contentcapture; import static com.android.internal.util.function.pooled.PooledLambda.obtainMessage; import android.annotation.NonNull; import android.annotation.Nullable; import android.annotation.SystemService; Loading @@ -24,9 +26,12 @@ import android.content.Context; import android.os.Handler; import android.os.HandlerThread; import android.os.IBinder; import android.os.RemoteException; import android.util.Log; import com.android.internal.os.IResultReceiver; import com.android.internal.util.Preconditions; import com.android.internal.util.SyncResultReceiver; import java.io.PrintWriter; import java.util.concurrent.atomic.AtomicBoolean; Loading @@ -48,6 +53,11 @@ public final class ContentCaptureManager { private static final String BG_THREAD_NAME = "intel_svc_streamer_thread"; /** * Timeout for calls to system_server. */ private static final int SYNC_CALLS_TIMEOUT_MS = 5000; // TODO(b/121044306): define a way to dynamically set them(for example, using settings?) static final boolean VERBOSE = false; static final boolean DEBUG = true; // STOPSHIP if not set to false Loading Loading @@ -142,9 +152,22 @@ public final class ContentCaptureManager { */ @Nullable public ComponentName getServiceComponentName() { //TODO(b/121047489): implement if (!isContentCaptureEnabled()) { return null; } // Wait for system server to return the component name. final SyncResultReceiver resultReceiver = new SyncResultReceiver(SYNC_CALLS_TIMEOUT_MS); mHandler.sendMessage(obtainMessage( ContentCaptureManager::handleReceiverServiceComponentName, this, mContext.getUserId(), resultReceiver)); try { return resultReceiver.getParcelableResult(); } catch (RemoteException e) { // Unable to retrieve component name in a reasonable amount of time. throw e.rethrowFromSystemServer(); } } /** * Checks whether content capture is enabled for this activity. Loading Loading @@ -191,4 +214,14 @@ public final class ContentCaptureManager { pw.print(prefix); pw.println("No sessions"); } } /** Retrieves the component name of the target content capture service through system_server. */ private void handleReceiverServiceComponentName(int userId, IResultReceiver resultReceiver) { try { mService.getReceiverServiceComponentName(userId, resultReceiver); } catch (RemoteException e) { Log.w(TAG, "Unable to retrieve service component name: " + e); } } }
core/java/android/view/contentcapture/IContentCaptureManager.aidl +21 −0 Original line number Diff line number Diff line Loading @@ -32,7 +32,28 @@ import java.util.List; * @hide */ oneway interface IContentCaptureManager { /** * Starts a new session for the provided {@code userId} running as part of the * app's activity identified by {@code activityToken}/{@code componentName}. * * @param sessionId Unique session id as provided by the app. * @param flags Meta flags that enable or disable content capture (see * {@link IContentCaptureContext#flags}). */ void startSession(int userId, IBinder activityToken, in ComponentName componentName, String sessionId, int flags, in IResultReceiver result); /** * Marks the end of a session for the provided {@code userId} identified by * the corresponding {@code startSession}'s {@code sessionId}. */ void finishSession(int userId, String sessionId); /** * Returns the content capture service's component name (if enabled and * connected). * @param Receiver of the content capture service's @{code ComponentName} * provided {@code Bundle} with key "{@code EXTRA}". */ void getReceiverServiceComponentName(int userId, in IResultReceiver result); }
services/contentcapture/java/com/android/server/contentcapture/ContentCaptureManagerService.java +20 −2 Original line number Diff line number Diff line Loading @@ -39,6 +39,7 @@ import com.android.internal.annotations.GuardedBy; import com.android.internal.os.IResultReceiver; import com.android.internal.util.DumpUtils; import com.android.internal.util.Preconditions; import com.android.internal.util.SyncResultReceiver; import com.android.server.LocalServices; import com.android.server.infra.AbstractMasterSystemService; import com.android.server.infra.FrameworkResourcesServiceNameResolver; Loading @@ -50,8 +51,9 @@ import java.util.ArrayList; /** * A service used to observe the contents of the screen. * * <p>The data collected by this service can be analyzed and combined with other sources to provide * contextual data in other areas of the system such as Autofill. * <p>The data collected by this service can be analyzed on-device and combined * with other sources to provide contextual data in other areas of the system * such as Autofill. */ public final class ContentCaptureManagerService extends AbstractMasterSystemService<ContentCaptureManagerService, ContentCapturePerUserService> { Loading Loading @@ -195,6 +197,22 @@ public final class ContentCaptureManagerService extends } } @Override public void getReceiverServiceComponentName(@UserIdInt int userId, IResultReceiver receiver) { ComponentName connectedServiceComponentName; synchronized (mLock) { final ContentCapturePerUserService service = getServiceForUserLocked(userId); connectedServiceComponentName = service.getServiceComponentName(); } try { receiver.send(0, SyncResultReceiver.bundleFor(connectedServiceComponentName)); } catch (RemoteException e) { // Ignore exception as we need to be resilient against app behavior. Slog.w(TAG, "Unable to send service component name: " + e); } } @Override public void dump(FileDescriptor fd, PrintWriter pw, String[] args) { if (!DumpUtils.checkDumpPermission(getContext(), TAG, pw)) return; Loading