Merge "Fix the context leak in the ContentCapture" into rvc-dev am: 44b233c55d am: 17ad352dbf

Original change: https://googleplex-android-review.googlesource.com/c/platform/frameworks/base/+/11882491

Change-Id: I19143c9ad81f891646634237d0c35f14be06bab1
This commit is contained in:
TreeHugger Robot
2020-06-19 07:02:26 +00:00
committed by Automerger Merge Worker

View File

@@ -52,6 +52,7 @@ import android.view.contentcapture.ViewNode.ViewStructureImpl;
import com.android.internal.os.IResultReceiver; import com.android.internal.os.IResultReceiver;
import java.io.PrintWriter; import java.io.PrintWriter;
import java.lang.ref.WeakReference;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Collections; import java.util.Collections;
import java.util.List; import java.util.List;
@@ -146,7 +147,44 @@ public final class MainContentCaptureSession extends ContentCaptureSession {
* Binder object used to update the session state. * Binder object used to update the session state.
*/ */
@NonNull @NonNull
private final IResultReceiver.Stub mSessionStateReceiver; private final SessionStateReceiver mSessionStateReceiver;
private static class SessionStateReceiver extends IResultReceiver.Stub {
private final WeakReference<MainContentCaptureSession> mMainSession;
SessionStateReceiver(MainContentCaptureSession session) {
mMainSession = new WeakReference<>(session);
}
@Override
public void send(int resultCode, Bundle resultData) {
final MainContentCaptureSession mainSession = mMainSession.get();
if (mainSession == null) {
Log.w(TAG, "received result after mina session released");
return;
}
final IBinder binder;
if (resultData != null) {
// Change in content capture enabled.
final boolean hasEnabled = resultData.getBoolean(EXTRA_ENABLED_STATE);
if (hasEnabled) {
final boolean disabled = (resultCode == RESULT_CODE_FALSE);
mainSession.mDisabled.set(disabled);
return;
}
binder = resultData.getBinder(EXTRA_BINDER);
if (binder == null) {
Log.wtf(TAG, "No " + EXTRA_BINDER + " extra result");
mainSession.mHandler.post(() -> mainSession.resetSession(
STATE_DISABLED | STATE_INTERNAL_ERROR));
return;
}
} else {
binder = null;
}
mainSession.mHandler.post(() -> mainSession.onSessionStarted(resultCode, binder));
}
}
protected MainContentCaptureSession(@NonNull Context context, protected MainContentCaptureSession(@NonNull Context context,
@NonNull ContentCaptureManager manager, @NonNull Handler handler, @NonNull ContentCaptureManager manager, @NonNull Handler handler,
@@ -159,32 +197,7 @@ public final class MainContentCaptureSession extends ContentCaptureSession {
final int logHistorySize = mManager.mOptions.logHistorySize; final int logHistorySize = mManager.mOptions.logHistorySize;
mFlushHistory = logHistorySize > 0 ? new LocalLog(logHistorySize) : null; mFlushHistory = logHistorySize > 0 ? new LocalLog(logHistorySize) : null;
mSessionStateReceiver = new IResultReceiver.Stub() { mSessionStateReceiver = new SessionStateReceiver(this);
@Override
public void send(int resultCode, Bundle resultData) {
final IBinder binder;
if (resultData != null) {
// Change in content capture enabled.
final boolean hasEnabled = resultData.getBoolean(EXTRA_ENABLED_STATE);
if (hasEnabled) {
final boolean disabled = (resultCode == RESULT_CODE_FALSE);
mDisabled.set(disabled);
return;
}
binder = resultData.getBinder(EXTRA_BINDER);
if (binder == null) {
Log.wtf(TAG, "No " + EXTRA_BINDER + " extra result");
mHandler.post(() -> resetSession(
STATE_DISABLED | STATE_INTERNAL_ERROR));
return;
}
} else {
binder = null;
}
mHandler.post(() -> onSessionStarted(resultCode, binder));
}
};
} }
@Override @Override
@@ -543,6 +556,11 @@ public final class MainContentCaptureSession extends ContentCaptureSession {
Log.e(TAG, "Error destroying system-service session " + mId + " for " Log.e(TAG, "Error destroying system-service session " + mId + " for "
+ getDebugState() + ": " + e); + getDebugState() + ": " + e);
} }
if (mDirectServiceInterface != null) {
mDirectServiceInterface.asBinder().unlinkToDeath(mDirectServiceVulture, 0);
}
mDirectServiceInterface = null;
} }
// TODO(b/122454205): once we support multiple sessions, we might need to move some of these // TODO(b/122454205): once we support multiple sessions, we might need to move some of these