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

Commit 1a6bda04 authored by Massimo Carli's avatar Massimo Carli
Browse files

Add Cache to Settings access for CompatUI

Flag: com.android.window.flags.enable_compat_ui_visibility_status
Fix: 374684062
Test: atest WMShellUnitTests:CompatUIControllerTest
Test: atest WMShellUnitTests:CompatUIStatusManagerTest
Test: atest SettingsProviderTest:SettingsBackupTest

Change-Id: I86d2859359ea4a3ee17690811a6b7fdcda4d1870
parent 43cb7dd4
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);
        }

    }
}