Loading libs/WindowManager/Shell/src/com/android/wm/shell/compatui/CompatUIStatusManager.java +22 −5 Original line number Diff line number Diff line Loading @@ -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; Loading @@ -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 libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/compatui/CompatUIStatusManagerTest.java +69 −4 Original line number Diff line number Diff line Loading @@ -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; Loading @@ -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; Loading Loading @@ -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); } } } Loading
libs/WindowManager/Shell/src/com/android/wm/shell/compatui/CompatUIStatusManager.java +22 −5 Original line number Diff line number Diff line Loading @@ -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; Loading @@ -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
libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/compatui/CompatUIStatusManagerTest.java +69 −4 Original line number Diff line number Diff line Loading @@ -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; Loading @@ -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; Loading Loading @@ -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); } } }