summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--packages/SystemUI/plugin/src/com/android/systemui/plugins/qs/QSTile.java8
-rw-r--r--packages/SystemUI/src/com/android/systemui/qs/QSPanelControllerBase.java7
-rw-r--r--packages/SystemUI/src/com/android/systemui/qs/tileimpl/QSTileImpl.java7
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/qs/QSPanelControllerBaseTest.java17
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/qs/QSPanelControllerTest.kt22
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/qs/customize/TileQueryHelperTest.java5
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/qs/tileimpl/QSTileImplTest.java18
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);