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

Commit 2d61edf0 authored by Massimo Carli's avatar Massimo Carli Committed by Android (Google) Code Review
Browse files

Merge "Add Cache to Settings access for CompatUI" into main

parents 896e8165 1a6bda04
Loading
Loading
Loading
Loading
+22 −5
Original line number Diff line number Diff line
@@ -24,6 +24,7 @@ import java.util.function.IntSupplier;
/** Handle the visibility state of the Compat UI components. */
public class CompatUIStatusManager {

    private static final int COMPAT_UI_EDUCATION_UNDEFINED = -1;
    public static final int COMPAT_UI_EDUCATION_HIDDEN = 0;
    public static final int COMPAT_UI_EDUCATION_VISIBLE = 1;

@@ -32,24 +33,40 @@ public class CompatUIStatusManager {
    @NonNull
    private final IntSupplier mReader;

    private int mCurrentValue = COMPAT_UI_EDUCATION_UNDEFINED;

    public CompatUIStatusManager(@NonNull IntConsumer writer, @NonNull IntSupplier reader) {
        mWriter = writer;
        mReader = reader;
    }

    public CompatUIStatusManager() {
        this(i -> { }, () -> COMPAT_UI_EDUCATION_HIDDEN);
        this(i -> {
        }, () -> COMPAT_UI_EDUCATION_HIDDEN);
    }

    void onEducationShown() {
        mWriter.accept(COMPAT_UI_EDUCATION_VISIBLE);
        if (mCurrentValue != COMPAT_UI_EDUCATION_VISIBLE) {
            mCurrentValue = COMPAT_UI_EDUCATION_VISIBLE;
            mWriter.accept(mCurrentValue);
        }
    }

    void onEducationHidden() {
        mWriter.accept(COMPAT_UI_EDUCATION_HIDDEN);
        if (mCurrentValue != COMPAT_UI_EDUCATION_HIDDEN) {
            mCurrentValue = COMPAT_UI_EDUCATION_HIDDEN;
            mWriter.accept(mCurrentValue);
        }
    }

    boolean isEducationVisible() {
        return mReader.getAsInt() == COMPAT_UI_EDUCATION_VISIBLE;
        return getCurrentValue() == COMPAT_UI_EDUCATION_VISIBLE;
    }

    private int getCurrentValue() {
        if (mCurrentValue == COMPAT_UI_EDUCATION_UNDEFINED) {
            mCurrentValue = mReader.getAsInt();
        }
        return mCurrentValue;
    }
}
 No newline at end of file
+69 −4
Original line number Diff line number Diff line
@@ -16,6 +16,10 @@

package com.android.wm.shell.compatui;

import static com.android.wm.shell.compatui.CompatUIStatusManager.COMPAT_UI_EDUCATION_HIDDEN;

import static junit.framework.Assert.assertEquals;

import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;

@@ -25,7 +29,6 @@ import androidx.test.filters.SmallTest;

import com.android.wm.shell.ShellTestCase;


import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
@@ -63,13 +66,75 @@ public class CompatUIStatusManagerTest extends ShellTestCase {
        assertFalse(mStatusManager.isEducationVisible());
    }

    @Test
    public void valuesAreCached() {
        // At the beginning the value is not read or written because
        // we access the reader in lazy way.
        mTestState.assertReaderInvocations(0);
        mTestState.assertWriterInvocations(0);

        // We read the value when we start. Initial value is hidden.
        assertFalse(mStatusManager.isEducationVisible());
        mTestState.assertReaderInvocations(1);
        mTestState.assertWriterInvocations(0);

        // We send the event for the same state which is not written.
        mStatusManager.onEducationHidden();
        assertFalse(mStatusManager.isEducationVisible());
        mTestState.assertReaderInvocations(1);
        mTestState.assertWriterInvocations(0);

        // We send the event for the different state which is written but
        // not read again.
        mStatusManager.onEducationShown();
        assertTrue(mStatusManager.isEducationVisible());
        mTestState.assertReaderInvocations(1);
        mTestState.assertWriterInvocations(1);

        // We read multiple times and we don't read the value again
        mStatusManager.isEducationVisible();
        mStatusManager.isEducationVisible();
        mStatusManager.isEducationVisible();
        mTestState.assertReaderInvocations(1);
        mTestState.assertWriterInvocations(1);

        // We write different values. Writer  is only accessed when
        // the value changes.
        mStatusManager.onEducationHidden(); // change
        mStatusManager.onEducationHidden();
        mStatusManager.onEducationShown(); // change
        mStatusManager.onEducationShown();
        mStatusManager.onEducationHidden(); // change
        mStatusManager.onEducationShown(); // change
        mTestState.assertReaderInvocations(1);
        mTestState.assertWriterInvocations(5);
    }

    static class FakeCompatUIStatusManagerTest {

        int mCurrentStatus = 0;
        int mCurrentStatus = COMPAT_UI_EDUCATION_HIDDEN;

        int mReaderInvocations;

        final IntSupplier mReader = () -> mCurrentStatus;
        int mWriterInvocations;

        final IntConsumer mWriter = newStatus -> mCurrentStatus = newStatus;
        final IntSupplier mReader = () -> {
            mReaderInvocations++;
            return mCurrentStatus;
        };

        final IntConsumer mWriter = newStatus -> {
            mWriterInvocations++;
            mCurrentStatus = newStatus;
        };

        void assertWriterInvocations(int expected) {
            assertEquals(expected, mWriterInvocations);
        }

        void assertReaderInvocations(int expected) {
            assertEquals(expected, mReaderInvocations);
        }

    }
}