Merge "Fix refresh tile when tile is already listening" into tm-dev

This commit is contained in:
Fabian Kozynski
2022-03-25 19:18:52 +00:00
committed by Android (Google) Code Review
7 changed files with 76 additions and 8 deletions

View File

@@ -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;

View File

@@ -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();
}
}
}

View File

@@ -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) {

View File

@@ -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();
}
}

View File

@@ -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()
}
}

View File

@@ -372,6 +372,11 @@ public class TileQueryHelperTest extends SysuiTestCase {
}
}
@Override
public boolean isListening() {
return mListening;
}
@Override
public CharSequence getTileLabel() {
return mSpec;

View File

@@ -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);