diff options
7 files changed, 76 insertions, 8 deletions
diff --git a/packages/SystemUI/plugin/src/com/android/systemui/plugins/qs/QSTile.java b/packages/SystemUI/plugin/src/com/android/systemui/plugins/qs/QSTile.java index 669d6a3835ac..2b169997168b 100644 --- a/packages/SystemUI/plugin/src/com/android/systemui/plugins/qs/QSTile.java +++ b/packages/SystemUI/plugin/src/com/android/systemui/plugins/qs/QSTile.java @@ -39,7 +39,7 @@ import java.util.function.Supplier; @DependsOn(target = Icon.class) @DependsOn(target = State.class) public interface QSTile { - int VERSION = 3; + int VERSION = 4; String getTileSpec(); @@ -114,6 +114,12 @@ public interface QSTile { return false; } + /** + * Return whether the tile is set to its listening state and therefore receiving updates and + * refreshes from controllers + */ + boolean isListening(); + @ProvidesInterface(version = Callback.VERSION) interface Callback { static final int VERSION = 2; diff --git a/packages/SystemUI/src/com/android/systemui/qs/QSPanelControllerBase.java b/packages/SystemUI/src/com/android/systemui/qs/QSPanelControllerBase.java index 58007c0d370a..74d1a3d43ab3 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/QSPanelControllerBase.java +++ b/packages/SystemUI/src/com/android/systemui/qs/QSPanelControllerBase.java @@ -217,7 +217,12 @@ public abstract class QSPanelControllerBase<T extends QSPanel> extends ViewContr /** */ public void refreshAllTiles() { for (QSPanelControllerBase.TileRecord r : mRecords) { - r.tile.refreshState(); + if (!r.tile.isListening()) { + // Only refresh tiles that were not already in the listening state. Tiles that are + // already listening is as if they are already expanded (for example, tiles that + // are both in QQS and QS). + r.tile.refreshState(); + } } } diff --git a/packages/SystemUI/src/com/android/systemui/qs/tileimpl/QSTileImpl.java b/packages/SystemUI/src/com/android/systemui/qs/tileimpl/QSTileImpl.java index 999818ff943f..8755bc90c0a8 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/tileimpl/QSTileImpl.java +++ b/packages/SystemUI/src/com/android/systemui/qs/tileimpl/QSTileImpl.java @@ -331,6 +331,11 @@ public abstract class QSTileImpl<TState extends State> implements QSTile, Lifecy refreshState(null); } + @Override + public final boolean isListening() { + return getLifecycle().getCurrentState().isAtLeast(RESUMED); + } + protected final void refreshState(@Nullable Object arg) { mHandler.obtainMessage(H.REFRESH_STATE, arg).sendToTarget(); } @@ -416,7 +421,7 @@ public abstract class QSTileImpl<TState extends State> implements QSTile, Lifecy @Nullable public abstract Intent getLongClickIntent(); - protected void handleRefreshState(@Nullable Object arg) { + protected final void handleRefreshState(@Nullable Object arg) { handleUpdateState(mTmpState, arg); boolean changed = mTmpState.copyTo(mState); if (mReadyState == READY_STATE_READYING) { diff --git a/packages/SystemUI/tests/src/com/android/systemui/qs/QSPanelControllerBaseTest.java b/packages/SystemUI/tests/src/com/android/systemui/qs/QSPanelControllerBaseTest.java index 8ccf5596b0ec..3f45ff321013 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/qs/QSPanelControllerBaseTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/qs/QSPanelControllerBaseTest.java @@ -46,6 +46,7 @@ import com.android.systemui.R; import com.android.systemui.SysuiTestCase; import com.android.systemui.dump.DumpManager; import com.android.systemui.media.MediaHost; +import com.android.systemui.plugins.qs.QSTile; import com.android.systemui.plugins.qs.QSTileView; import com.android.systemui.qs.customize.QSCustomizerController; import com.android.systemui.qs.logging.QSLogger; @@ -62,6 +63,7 @@ import java.io.FileDescriptor; import java.io.PrintWriter; import java.io.StringWriter; import java.util.Collections; +import java.util.List; @RunWith(AndroidTestingRunner.class) @RunWithLooper @@ -89,6 +91,8 @@ public class QSPanelControllerBaseTest extends SysuiTestCase { @Mock QSTileImpl mQSTile; @Mock + QSTile mOtherTile; + @Mock QSTileView mQSTileView; @Mock PagedTileLayout mPagedTileLayout; @@ -280,4 +284,17 @@ public class QSPanelControllerBaseTest extends SysuiTestCase { assertThat(mController.shouldUseHorizontalLayout()).isFalse(); verify(mHorizontalLayoutListener, times(2)).run(); } + + @Test + public void testRefreshAllTilesDoesntRefreshListeningTiles() { + when(mQSTileHost.getTiles()).thenReturn(List.of(mQSTile, mOtherTile)); + mController.setTiles(); + + when(mQSTile.isListening()).thenReturn(false); + when(mOtherTile.isListening()).thenReturn(true); + + mController.refreshAllTiles(); + verify(mQSTile).refreshState(); + verify(mOtherTile, never()).refreshState(); + } } diff --git a/packages/SystemUI/tests/src/com/android/systemui/qs/QSPanelControllerTest.kt b/packages/SystemUI/tests/src/com/android/systemui/qs/QSPanelControllerTest.kt index 1b48a16740b9..e9488e9ad98c 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/qs/QSPanelControllerTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/qs/QSPanelControllerTest.kt @@ -4,13 +4,13 @@ import android.test.suitebuilder.annotation.SmallTest import android.testing.AndroidTestingRunner import com.android.internal.logging.MetricsLogger import com.android.internal.logging.UiEventLogger -import com.android.systemui.R import com.android.systemui.SysuiTestCase import com.android.systemui.dump.DumpManager import com.android.systemui.flags.FeatureFlags import com.android.systemui.media.MediaHost import com.android.systemui.media.MediaHostState import com.android.systemui.plugins.FalsingManager +import com.android.systemui.plugins.qs.QSTile import com.android.systemui.qs.customize.QSCustomizerController import com.android.systemui.qs.logging.QSLogger import com.android.systemui.settings.brightness.BrightnessController @@ -21,11 +21,12 @@ import org.junit.Before import org.junit.Test import org.junit.runner.RunWith import org.mockito.Mock +import org.mockito.Mockito import org.mockito.Mockito.any import org.mockito.Mockito.reset import org.mockito.Mockito.verify -import org.mockito.Mockito.`when` as whenever import org.mockito.MockitoAnnotations +import org.mockito.Mockito.`when` as whenever @SmallTest @RunWith(AndroidTestingRunner::class) @@ -49,6 +50,8 @@ class QSPanelControllerTest : SysuiTestCase() { @Mock private lateinit var falsingManager: FalsingManager @Mock private lateinit var featureFlags: FeatureFlags @Mock private lateinit var mediaHost: MediaHost + @Mock private lateinit var tile: QSTile + @Mock private lateinit var otherTile: QSTile private lateinit var controller: QSPanelController @@ -93,8 +96,17 @@ class QSPanelControllerTest : SysuiTestCase() { verify(mediaHost).expansion = MediaHostState.EXPANDED } - private fun setSplitShadeEnabled(enabled: Boolean) { - mContext.orCreateTestableResources - .addOverride(R.bool.config_use_split_notification_shade, enabled) + @Test + fun testSetListeningDoesntRefreshListeningTiles() { + whenever(qsTileHost.getTiles()).thenReturn(listOf(tile, otherTile)) + controller.setTiles() + whenever(tile.isListening()).thenReturn(false) + whenever(otherTile.isListening()).thenReturn(true) + whenever(qsPanel.isListening).thenReturn(true) + + controller.setListening(true, true) + + verify(tile).refreshState() + verify(otherTile, Mockito.never()).refreshState() } } diff --git a/packages/SystemUI/tests/src/com/android/systemui/qs/customize/TileQueryHelperTest.java b/packages/SystemUI/tests/src/com/android/systemui/qs/customize/TileQueryHelperTest.java index 30b464b2557c..040af70f2077 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/qs/customize/TileQueryHelperTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/qs/customize/TileQueryHelperTest.java @@ -373,6 +373,11 @@ public class TileQueryHelperTest extends SysuiTestCase { } @Override + public boolean isListening() { + return mListening; + } + + @Override public CharSequence getTileLabel() { return mSpec; } diff --git a/packages/SystemUI/tests/src/com/android/systemui/qs/tileimpl/QSTileImplTest.java b/packages/SystemUI/tests/src/com/android/systemui/qs/tileimpl/QSTileImplTest.java index c5bc68d6bd7b..c31a971cc775 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/qs/tileimpl/QSTileImplTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/qs/tileimpl/QSTileImplTest.java @@ -361,6 +361,24 @@ public class QSTileImplTest extends SysuiTestCase { assertEquals(Settings.ACTION_SHOW_ADMIN_SUPPORT_DETAILS, captor.getValue().getAction()); } + @Test + public void testIsListening() { + Object o = new Object(); + + mTile.setListening(o, true); + mTestableLooper.processAllMessages(); + assertTrue(mTile.isListening()); + + mTile.setListening(o, false); + mTestableLooper.processAllMessages(); + assertFalse(mTile.isListening()); + + mTile.setListening(o, true); + mTile.destroy(); + mTestableLooper.processAllMessages(); + assertFalse(mTile.isListening()); + } + private void assertEvent(UiEventLogger.UiEventEnum eventType, UiEventLoggerFake.FakeUiEvent fakeEvent) { assertEquals(eventType.getId(), fakeEvent.eventId); |