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

Commit cbca6261 authored by Nino Jagar's avatar Nino Jagar Committed by Automerger Merge Worker
Browse files

Merge "Add content protection buffer to ContentCaptureManager" into udc-qpr-dev am: f1cebf63

parents 020f122c f1cebf63
Loading
Loading
Loading
Loading
+26 −2
Original line number Diff line number Diff line
@@ -52,6 +52,7 @@ import android.view.contentcapture.ContentCaptureSession.FlushReason;

import com.android.internal.annotations.GuardedBy;
import com.android.internal.annotations.VisibleForTesting;
import com.android.internal.util.RingBuffer;
import com.android.internal.util.SyncResultReceiver;

import java.io.PrintWriter;
@@ -446,6 +447,9 @@ public final class ContentCaptureManager {
    @Nullable // set on-demand by addDumpable()
    private Dumper mDumpable;

    // Created here in order to live across activity and session changes
    @Nullable private final RingBuffer<ContentCaptureEvent> mContentProtectionEventBuffer;

    /** @hide */
    public interface ContentCaptureClient {
        /**
@@ -456,12 +460,15 @@ public final class ContentCaptureManager {
    }

    /** @hide */
    static class StrippedContext {
    @VisibleForTesting(visibility = VisibleForTesting.Visibility.PACKAGE)
    public static class StrippedContext {
        @NonNull final String mPackageName;
        @NonNull final String mContext;
        final @UserIdInt int mUserId;

        private StrippedContext(@NonNull Context context) {
        /** @hide */
        @VisibleForTesting(visibility = VisibleForTesting.Visibility.PRIVATE)
        public StrippedContext(@NonNull Context context) {
            mPackageName = context.getPackageName();
            mContext = context.toString();
            mUserId = context.getUserId();
@@ -502,6 +509,16 @@ public final class ContentCaptureManager {
        mHandler = Handler.createAsync(Looper.getMainLooper());

        mDataShareAdapterResourceManager = new LocalDataShareAdapterResourceManager();

        if (mOptions.contentProtectionOptions.enableReceiver
                && mOptions.contentProtectionOptions.bufferSize > 0) {
            mContentProtectionEventBuffer =
                    new RingBuffer(
                            ContentCaptureEvent.class,
                            mOptions.contentProtectionOptions.bufferSize);
        } else {
            mContentProtectionEventBuffer = null;
        }
    }

    /**
@@ -870,6 +887,13 @@ public final class ContentCaptureManager {
        activity.addDumpable(mDumpable);
    }

    /** @hide */
    @VisibleForTesting(visibility = VisibleForTesting.Visibility.PACKAGE)
    @Nullable
    public RingBuffer<ContentCaptureEvent> getContentProtectionEventBuffer() {
        return mContentProtectionEventBuffer;
    }

    // NOTE: ContentCaptureManager cannot implement it directly as it would be exposed as public API
    private final class Dumper implements Dumpable {
        @Override
+82 −7
Original line number Diff line number Diff line
@@ -15,14 +15,17 @@
 */
package android.view.contentcapture;

import static android.view.contentcapture.ContentCaptureEvent.TYPE_SESSION_STARTED;

import static com.google.common.truth.Truth.assertThat;

import static org.mockito.Mockito.mock;
import static org.testng.Assert.assertThrows;

import android.content.ContentCaptureOptions;
import android.content.Context;

import com.android.internal.util.RingBuffer;

import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mock;
@@ -37,9 +40,15 @@ import org.mockito.junit.MockitoJUnitRunner;
@RunWith(MockitoJUnitRunner.class)
public class ContentCaptureManagerTest {

    private static final int BUFFER_SIZE = 100;

    private static final ContentCaptureOptions EMPTY_OPTIONS = new ContentCaptureOptions(null);

    @Mock
    private Context mMockContext;

    @Mock private IContentCaptureManager mMockContentCaptureManager;

    @Test
    public void testConstructor_invalidParametersThrowsException() {
        assertThrows(NullPointerException.class,
@@ -47,12 +56,66 @@ public class ContentCaptureManagerTest {
                        null));
    }

    @Test
    public void testConstructor_contentProtection_default_bufferNotCreated() {
        ContentCaptureManager manager =
                new ContentCaptureManager(mMockContext, mMockContentCaptureManager, EMPTY_OPTIONS);

        assertThat(manager.getContentProtectionEventBuffer()).isNull();
    }

    @Test
    public void testConstructor_contentProtection_disabled_bufferNotCreated() {
        ContentCaptureOptions options =
                createOptions(
                        new ContentCaptureOptions.ContentProtectionOptions(
                                /* enableReceiver= */ false, BUFFER_SIZE));

        ContentCaptureManager manager =
                new ContentCaptureManager(mMockContext, mMockContentCaptureManager, options);

        assertThat(manager.getContentProtectionEventBuffer()).isNull();
    }

    @Test
    public void testConstructor_contentProtection_invalidBufferSize_bufferNotCreated() {
        ContentCaptureOptions options =
                createOptions(
                        new ContentCaptureOptions.ContentProtectionOptions(
                                /* enableReceiver= */ true, /* bufferSize= */ 0));

        ContentCaptureManager manager =
                new ContentCaptureManager(mMockContext, mMockContentCaptureManager, options);

        assertThat(manager.getContentProtectionEventBuffer()).isNull();
    }

    @Test
    public void testConstructor_contentProtection_enabled_bufferCreated() {
        ContentCaptureOptions options =
                createOptions(
                        new ContentCaptureOptions.ContentProtectionOptions(
                                /* enableReceiver= */ true, BUFFER_SIZE));

        ContentCaptureManager manager =
                new ContentCaptureManager(mMockContext, mMockContentCaptureManager, options);
        RingBuffer<ContentCaptureEvent> buffer = manager.getContentProtectionEventBuffer();

        assertThat(buffer).isNotNull();
        ContentCaptureEvent[] expected = new ContentCaptureEvent[BUFFER_SIZE];
        int offset = 3;
        for (int i = 0; i < BUFFER_SIZE + offset; i++) {
            ContentCaptureEvent event = new ContentCaptureEvent(i, TYPE_SESSION_STARTED);
            buffer.append(event);
            expected[(i + BUFFER_SIZE - offset) % BUFFER_SIZE] = event;
        }
        assertThat(buffer.toArray()).isEqualTo(expected);
    }

    @Test
    public void testRemoveData_invalidParametersThrowsException() {
        final IContentCaptureManager mockService = mock(IContentCaptureManager.class);
        final ContentCaptureOptions options = new ContentCaptureOptions(null);
        final ContentCaptureManager manager =
                new ContentCaptureManager(mMockContext, mockService, options);
                new ContentCaptureManager(mMockContext, mMockContentCaptureManager, EMPTY_OPTIONS);

        assertThrows(NullPointerException.class, () -> manager.removeData(null));
    }
@@ -60,10 +123,8 @@ public class ContentCaptureManagerTest {
    @Test
    @SuppressWarnings("GuardedBy")
    public void testFlushViewTreeAppearingEventDisabled_setAndGet() {
        final IContentCaptureManager mockService = mock(IContentCaptureManager.class);
        final ContentCaptureOptions options = new ContentCaptureOptions(null);
        final ContentCaptureManager manager =
                new ContentCaptureManager(mMockContext, mockService, options);
                new ContentCaptureManager(mMockContext, mMockContentCaptureManager, EMPTY_OPTIONS);

        assertThat(manager.getFlushViewTreeAppearingEventDisabled()).isFalse();
        manager.setFlushViewTreeAppearingEventDisabled(true);
@@ -71,4 +132,18 @@ public class ContentCaptureManagerTest {
        manager.setFlushViewTreeAppearingEventDisabled(false);
        assertThat(manager.getFlushViewTreeAppearingEventDisabled()).isFalse();
    }

    private ContentCaptureOptions createOptions(
            ContentCaptureOptions.ContentProtectionOptions contentProtectionOptions) {
        return new ContentCaptureOptions(
                /* loggingLevel= */ 0,
                /* maxBufferSize= */ 0,
                /* idleFlushingFrequencyMs= */ 0,
                /* textChangeFlushingFrequencyMs= */ 0,
                /* logHistorySize= */ 0,
                /* disableFlushForViewTreeAppearing= */ false,
                /* enableReceiver= */ true,
                contentProtectionOptions,
                /* whitelistedComponents= */ null);
    }
}