Merge "ContentCaptureManager should be null when the feature is disabled."
This commit is contained in:
committed by
Android (Google) Code Review
commit
fe09cbef5a
@@ -1129,7 +1129,11 @@ final class SystemServiceRegistry {
|
||||
IBinder b = ServiceManager
|
||||
.getService(Context.CONTENT_CAPTURE_MANAGER_SERVICE);
|
||||
IContentCaptureManager service = IContentCaptureManager.Stub.asInterface(b);
|
||||
return new ContentCaptureManager(outerContext, service);
|
||||
if (service != null) {
|
||||
// When feature is disabled, we return a null manager to apps so the
|
||||
// performance impact is practically zero
|
||||
return new ContentCaptureManager(outerContext, service);
|
||||
}
|
||||
}
|
||||
return null;
|
||||
}});
|
||||
|
||||
@@ -39,15 +39,8 @@ import com.android.internal.util.SyncResultReceiver;
|
||||
|
||||
import java.io.PrintWriter;
|
||||
|
||||
/*
|
||||
* NOTE: all methods in this class should return right away, or do the real work in a handler
|
||||
* thread.
|
||||
*
|
||||
* Hence, the only field that must be thread-safe is mEnabled, which is called at the beginning
|
||||
* of every method.
|
||||
*/
|
||||
/**
|
||||
* TODO(b/123577059): add javadocs / implement
|
||||
* TODO(b/123577059): add javadocs / mention it can be null
|
||||
*/
|
||||
@SystemService(Context.CONTENT_CAPTURE_MANAGER_SERVICE)
|
||||
public final class ContentCaptureManager {
|
||||
@@ -90,7 +83,7 @@ public final class ContentCaptureManager {
|
||||
@NonNull
|
||||
private final Context mContext;
|
||||
|
||||
@Nullable
|
||||
@NonNull
|
||||
private final IContentCaptureManager mService;
|
||||
|
||||
// Flags used for starting session.
|
||||
@@ -107,11 +100,11 @@ public final class ContentCaptureManager {
|
||||
|
||||
/** @hide */
|
||||
public ContentCaptureManager(@NonNull Context context,
|
||||
@Nullable IContentCaptureManager service) {
|
||||
mContext = Preconditions.checkNotNull(context, "context cannot be null");
|
||||
@NonNull IContentCaptureManager service) {
|
||||
if (VERBOSE) Log.v(TAG, "Constructor for " + context.getPackageName());
|
||||
mContext = Preconditions.checkNotNull(context, "context cannot be null");
|
||||
mService = Preconditions.checkNotNull(service, "service cannot be null");
|
||||
|
||||
mService = service;
|
||||
// TODO(b/119220549): we might not even need a handler, as the IPCs are oneway. But if we
|
||||
// do, then we should optimize it to run the tests after the Choreographer finishes the most
|
||||
// important steps of the frame.
|
||||
@@ -199,8 +192,6 @@ public final class ContentCaptureManager {
|
||||
* </ul>
|
||||
*/
|
||||
public boolean isContentCaptureEnabled() {
|
||||
if (mService == null) return false;
|
||||
|
||||
final MainContentCaptureSession mainSession;
|
||||
synchronized (mLock) {
|
||||
mainSession = mMainSession;
|
||||
@@ -242,8 +233,6 @@ public final class ContentCaptureManager {
|
||||
@SystemApi
|
||||
@TestApi
|
||||
public boolean isContentCaptureFeatureEnabled() {
|
||||
if (mService == null) return false;
|
||||
|
||||
final SyncResultReceiver resultReceiver = new SyncResultReceiver(SYNC_CALLS_TIMEOUT_MS);
|
||||
final int resultCode;
|
||||
try {
|
||||
@@ -314,22 +303,21 @@ public final class ContentCaptureManager {
|
||||
|
||||
/** @hide */
|
||||
public void dump(String prefix, PrintWriter pw) {
|
||||
pw.print(prefix); pw.println("ContentCaptureManager");
|
||||
final String prefix2 = prefix + " ";
|
||||
synchronized (mLock) {
|
||||
pw.print(prefix); pw.println("ContentCaptureManager");
|
||||
pw.print(prefix); pw.print("isContentCaptureEnabled(): ");
|
||||
pw.print(prefix2); pw.print("isContentCaptureEnabled(): ");
|
||||
pw.println(isContentCaptureEnabled());
|
||||
pw.print(prefix); pw.print("Context: "); pw.println(mContext);
|
||||
pw.print(prefix); pw.print("User: "); pw.println(mContext.getUserId());
|
||||
if (mService != null) {
|
||||
pw.print(prefix); pw.print("Service: "); pw.println(mService);
|
||||
}
|
||||
pw.print(prefix); pw.print("Flags: "); pw.println(mFlags);
|
||||
pw.print(prefix2); pw.print("Context: "); pw.println(mContext);
|
||||
pw.print(prefix2); pw.print("User: "); pw.println(mContext.getUserId());
|
||||
pw.print(prefix2); pw.print("Service: "); pw.println(mService);
|
||||
pw.print(prefix2); pw.print("Flags: "); pw.println(mFlags);
|
||||
if (mMainSession != null) {
|
||||
final String prefix2 = prefix + " ";
|
||||
pw.print(prefix); pw.println("Main session:");
|
||||
mMainSession.dump(prefix2, pw);
|
||||
final String prefix3 = prefix2 + " ";
|
||||
pw.print(prefix2); pw.println("Main session:");
|
||||
mMainSession.dump(prefix3, pw);
|
||||
} else {
|
||||
pw.print(prefix); pw.println("No sessions");
|
||||
pw.print(prefix2); pw.println("No sessions");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -105,14 +105,14 @@ public final class MainContentCaptureSession extends ContentCaptureSession {
|
||||
* Interface to the system_server binder object - it's only used to start the session (and
|
||||
* notify when the session is finished).
|
||||
*/
|
||||
@Nullable // TODO(b/122959591): shoul never be null, we should make main session null instead
|
||||
@NonNull
|
||||
private final IContentCaptureManager mSystemServerInterface;
|
||||
|
||||
/**
|
||||
* Direct interface to the service binder object - it's used to send the events, including the
|
||||
* last ones (when the session is finished)
|
||||
*/
|
||||
@Nullable
|
||||
@NonNull
|
||||
private IContentCaptureDirectManager mDirectServiceInterface;
|
||||
@Nullable
|
||||
private DeathRecipient mDirectServiceVulture;
|
||||
@@ -140,7 +140,7 @@ public final class MainContentCaptureSession extends ContentCaptureSession {
|
||||
/** @hide */
|
||||
protected MainContentCaptureSession(@NonNull Context context,
|
||||
@NonNull ContentCaptureManager manager, @NonNull Handler handler,
|
||||
@Nullable IContentCaptureManager systemServerInterface) {
|
||||
@NonNull IContentCaptureManager systemServerInterface) {
|
||||
mContext = context;
|
||||
mManager = manager;
|
||||
mHandler = handler;
|
||||
@@ -193,8 +193,6 @@ public final class MainContentCaptureSession extends ContentCaptureSession {
|
||||
}
|
||||
|
||||
try {
|
||||
if (mSystemServerInterface == null) return;
|
||||
|
||||
mSystemServerInterface.startSession(mApplicationToken, component, mId, flags,
|
||||
new IResultReceiver.Stub() {
|
||||
@Override
|
||||
@@ -507,8 +505,6 @@ public final class MainContentCaptureSession extends ContentCaptureSession {
|
||||
}
|
||||
|
||||
try {
|
||||
if (mSystemServerInterface == null) return;
|
||||
|
||||
mSystemServerInterface.finishSession(mId);
|
||||
} catch (RemoteException e) {
|
||||
Log.e(TAG, "Error destroying system-service session " + mId + " for "
|
||||
@@ -628,12 +624,11 @@ public final class MainContentCaptureSession extends ContentCaptureSession {
|
||||
|
||||
@Override
|
||||
void dump(@NonNull String prefix, @NonNull PrintWriter pw) {
|
||||
super.dump(prefix, pw);
|
||||
|
||||
pw.print(prefix); pw.print("mContext: "); pw.println(mContext);
|
||||
pw.print(prefix); pw.print("user: "); pw.println(mContext.getUserId());
|
||||
if (mSystemServerInterface != null) {
|
||||
pw.print(prefix); pw.print("mSystemServerInterface: ");
|
||||
pw.println(mSystemServerInterface);
|
||||
}
|
||||
pw.print(prefix); pw.print("mSystemServerInterface: ");
|
||||
if (mDirectServiceInterface != null) {
|
||||
pw.print(prefix); pw.print("mDirectServiceInterface: ");
|
||||
pw.println(mDirectServiceInterface);
|
||||
@@ -667,8 +662,6 @@ public final class MainContentCaptureSession extends ContentCaptureSession {
|
||||
}
|
||||
pw.print(prefix); pw.println("flush history:");
|
||||
mFlushHistory.reverseDump(/* fd= */ null, pw, /* args= */ null); pw.println();
|
||||
|
||||
super.dump(prefix, pw);
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
Reference in New Issue
Block a user