Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit d5063d26 authored by TYM Tsai's avatar TYM Tsai Committed by Winson Chung
Browse files

Avoid to hold a strong reference to Context object

We only use parts of Context in the Content Capture manager and
main session, we don't need to cache context object which will
cause some memory issues.

This change will extract the necessary information to save it, instead
of caching the entire context object.

Bug: 256247718
Fixes: 239192932
Test: atest CtsContentCaptureServiceTestCases
Change-Id: Id7b5e8617c521f31879199b0f2c7e18204bb7526
Merged-In: Id7b5e8617c521f31879199b0f2c7e18204bb7526
(cherry picked from commit c3380c16)
parent ad23a83c
Loading
Loading
Loading
Loading
+30 −2
Original line number Diff line number Diff line
@@ -378,7 +378,7 @@ public final class ContentCaptureManager {
    private final Object mLock = new Object();

    @NonNull
    private final Context mContext;
    private final StrippedContext mContext;

    @NonNull
    private final IContentCaptureManager mService;
@@ -413,10 +413,38 @@ public final class ContentCaptureManager {
        ComponentName contentCaptureClientGetComponentName();
    }

    /** @hide */
    static class StrippedContext {
        final String mPackageName;
        final String mContext;
        final @UserIdInt int mUserId;

        private StrippedContext(Context context) {
            mPackageName = context.getPackageName();
            mContext = context.toString();
            mUserId = context.getUserId();
        }

        @Override
        public String toString() {
            return mContext;
        }

        public String getPackageName() {
            return mPackageName;
        }

        @UserIdInt
        public int getUserId() {
            return mUserId;
        }
    }

    /** @hide */
    public ContentCaptureManager(@NonNull Context context,
            @NonNull IContentCaptureManager service, @NonNull ContentCaptureOptions options) {
        mContext = Objects.requireNonNull(context, "context cannot be null");
        Objects.requireNonNull(context, "context cannot be null");
        mContext = new StrippedContext(context);
        mService = Objects.requireNonNull(service, "service cannot be null");
        mOptions = Objects.requireNonNull(options, "options cannot be null");

+2 −3
Original line number Diff line number Diff line
@@ -36,7 +36,6 @@ import android.annotation.NonNull;
import android.annotation.Nullable;
import android.annotation.UiThread;
import android.content.ComponentName;
import android.content.Context;
import android.content.pm.ParceledListSlice;
import android.graphics.Insets;
import android.graphics.Rect;
@@ -103,7 +102,7 @@ public final class MainContentCaptureSession extends ContentCaptureSession {
    private final AtomicBoolean mDisabled = new AtomicBoolean(false);

    @NonNull
    private final Context mContext;
    private final ContentCaptureManager.StrippedContext mContext;

    @NonNull
    private final ContentCaptureManager mManager;
@@ -197,7 +196,7 @@ public final class MainContentCaptureSession extends ContentCaptureSession {
        }
    }

    protected MainContentCaptureSession(@NonNull Context context,
    protected MainContentCaptureSession(@NonNull ContentCaptureManager.StrippedContext context,
            @NonNull ContentCaptureManager manager, @NonNull Handler handler,
            @NonNull IContentCaptureManager systemServerInterface) {
        mContext = context;