[automerge] Fix refresh tile when tile is already listening 2p: 0ca203c23c
Original change: https://googleplex-android-review.googlesource.com/c/platform/frameworks/base/+/17378284 Change-Id: I0716591decfe23bd9d62e24550aef687f504b7a7
This commit is contained in:
committed by
Presubmit Automerger Backend
commit
4cbf16ec0c
@@ -39,7 +39,7 @@ import java.util.function.Supplier;
|
|||||||
@DependsOn(target = Icon.class)
|
@DependsOn(target = Icon.class)
|
||||||
@DependsOn(target = State.class)
|
@DependsOn(target = State.class)
|
||||||
public interface QSTile {
|
public interface QSTile {
|
||||||
int VERSION = 3;
|
int VERSION = 4;
|
||||||
|
|
||||||
String getTileSpec();
|
String getTileSpec();
|
||||||
|
|
||||||
@@ -114,6 +114,12 @@ public interface QSTile {
|
|||||||
return false;
|
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)
|
@ProvidesInterface(version = Callback.VERSION)
|
||||||
interface Callback {
|
interface Callback {
|
||||||
static final int VERSION = 2;
|
static final int VERSION = 2;
|
||||||
|
|||||||
@@ -217,9 +217,14 @@ public abstract class QSPanelControllerBase<T extends QSPanel> extends ViewContr
|
|||||||
/** */
|
/** */
|
||||||
public void refreshAllTiles() {
|
public void refreshAllTiles() {
|
||||||
for (QSPanelControllerBase.TileRecord r : mRecords) {
|
for (QSPanelControllerBase.TileRecord r : mRecords) {
|
||||||
|
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();
|
r.tile.refreshState();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
private void addTile(final QSTile tile, boolean collapsedView) {
|
private void addTile(final QSTile tile, boolean collapsedView) {
|
||||||
final TileRecord r =
|
final TileRecord r =
|
||||||
|
|||||||
@@ -331,6 +331,11 @@ public abstract class QSTileImpl<TState extends State> implements QSTile, Lifecy
|
|||||||
refreshState(null);
|
refreshState(null);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public final boolean isListening() {
|
||||||
|
return getLifecycle().getCurrentState().isAtLeast(RESUMED);
|
||||||
|
}
|
||||||
|
|
||||||
protected final void refreshState(@Nullable Object arg) {
|
protected final void refreshState(@Nullable Object arg) {
|
||||||
mHandler.obtainMessage(H.REFRESH_STATE, arg).sendToTarget();
|
mHandler.obtainMessage(H.REFRESH_STATE, arg).sendToTarget();
|
||||||
}
|
}
|
||||||
@@ -416,7 +421,7 @@ public abstract class QSTileImpl<TState extends State> implements QSTile, Lifecy
|
|||||||
@Nullable
|
@Nullable
|
||||||
public abstract Intent getLongClickIntent();
|
public abstract Intent getLongClickIntent();
|
||||||
|
|
||||||
protected void handleRefreshState(@Nullable Object arg) {
|
protected final void handleRefreshState(@Nullable Object arg) {
|
||||||
handleUpdateState(mTmpState, arg);
|
handleUpdateState(mTmpState, arg);
|
||||||
boolean changed = mTmpState.copyTo(mState);
|
boolean changed = mTmpState.copyTo(mState);
|
||||||
if (mReadyState == READY_STATE_READYING) {
|
if (mReadyState == READY_STATE_READYING) {
|
||||||
|
|||||||
@@ -46,6 +46,7 @@ import com.android.systemui.R;
|
|||||||
import com.android.systemui.SysuiTestCase;
|
import com.android.systemui.SysuiTestCase;
|
||||||
import com.android.systemui.dump.DumpManager;
|
import com.android.systemui.dump.DumpManager;
|
||||||
import com.android.systemui.media.MediaHost;
|
import com.android.systemui.media.MediaHost;
|
||||||
|
import com.android.systemui.plugins.qs.QSTile;
|
||||||
import com.android.systemui.plugins.qs.QSTileView;
|
import com.android.systemui.plugins.qs.QSTileView;
|
||||||
import com.android.systemui.qs.customize.QSCustomizerController;
|
import com.android.systemui.qs.customize.QSCustomizerController;
|
||||||
import com.android.systemui.qs.logging.QSLogger;
|
import com.android.systemui.qs.logging.QSLogger;
|
||||||
@@ -62,6 +63,7 @@ import java.io.FileDescriptor;
|
|||||||
import java.io.PrintWriter;
|
import java.io.PrintWriter;
|
||||||
import java.io.StringWriter;
|
import java.io.StringWriter;
|
||||||
import java.util.Collections;
|
import java.util.Collections;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
@RunWith(AndroidTestingRunner.class)
|
@RunWith(AndroidTestingRunner.class)
|
||||||
@RunWithLooper
|
@RunWithLooper
|
||||||
@@ -89,6 +91,8 @@ public class QSPanelControllerBaseTest extends SysuiTestCase {
|
|||||||
@Mock
|
@Mock
|
||||||
QSTileImpl mQSTile;
|
QSTileImpl mQSTile;
|
||||||
@Mock
|
@Mock
|
||||||
|
QSTile mOtherTile;
|
||||||
|
@Mock
|
||||||
QSTileView mQSTileView;
|
QSTileView mQSTileView;
|
||||||
@Mock
|
@Mock
|
||||||
PagedTileLayout mPagedTileLayout;
|
PagedTileLayout mPagedTileLayout;
|
||||||
@@ -280,4 +284,17 @@ public class QSPanelControllerBaseTest extends SysuiTestCase {
|
|||||||
assertThat(mController.shouldUseHorizontalLayout()).isFalse();
|
assertThat(mController.shouldUseHorizontalLayout()).isFalse();
|
||||||
verify(mHorizontalLayoutListener, times(2)).run();
|
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();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -4,13 +4,13 @@ import android.test.suitebuilder.annotation.SmallTest
|
|||||||
import android.testing.AndroidTestingRunner
|
import android.testing.AndroidTestingRunner
|
||||||
import com.android.internal.logging.MetricsLogger
|
import com.android.internal.logging.MetricsLogger
|
||||||
import com.android.internal.logging.UiEventLogger
|
import com.android.internal.logging.UiEventLogger
|
||||||
import com.android.systemui.R
|
|
||||||
import com.android.systemui.SysuiTestCase
|
import com.android.systemui.SysuiTestCase
|
||||||
import com.android.systemui.dump.DumpManager
|
import com.android.systemui.dump.DumpManager
|
||||||
import com.android.systemui.flags.FeatureFlags
|
import com.android.systemui.flags.FeatureFlags
|
||||||
import com.android.systemui.media.MediaHost
|
import com.android.systemui.media.MediaHost
|
||||||
import com.android.systemui.media.MediaHostState
|
import com.android.systemui.media.MediaHostState
|
||||||
import com.android.systemui.plugins.FalsingManager
|
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.customize.QSCustomizerController
|
||||||
import com.android.systemui.qs.logging.QSLogger
|
import com.android.systemui.qs.logging.QSLogger
|
||||||
import com.android.systemui.settings.brightness.BrightnessController
|
import com.android.systemui.settings.brightness.BrightnessController
|
||||||
@@ -21,11 +21,12 @@ import org.junit.Before
|
|||||||
import org.junit.Test
|
import org.junit.Test
|
||||||
import org.junit.runner.RunWith
|
import org.junit.runner.RunWith
|
||||||
import org.mockito.Mock
|
import org.mockito.Mock
|
||||||
|
import org.mockito.Mockito
|
||||||
import org.mockito.Mockito.any
|
import org.mockito.Mockito.any
|
||||||
import org.mockito.Mockito.reset
|
import org.mockito.Mockito.reset
|
||||||
import org.mockito.Mockito.verify
|
import org.mockito.Mockito.verify
|
||||||
import org.mockito.Mockito.`when` as whenever
|
|
||||||
import org.mockito.MockitoAnnotations
|
import org.mockito.MockitoAnnotations
|
||||||
|
import org.mockito.Mockito.`when` as whenever
|
||||||
|
|
||||||
@SmallTest
|
@SmallTest
|
||||||
@RunWith(AndroidTestingRunner::class)
|
@RunWith(AndroidTestingRunner::class)
|
||||||
@@ -49,6 +50,8 @@ class QSPanelControllerTest : SysuiTestCase() {
|
|||||||
@Mock private lateinit var falsingManager: FalsingManager
|
@Mock private lateinit var falsingManager: FalsingManager
|
||||||
@Mock private lateinit var featureFlags: FeatureFlags
|
@Mock private lateinit var featureFlags: FeatureFlags
|
||||||
@Mock private lateinit var mediaHost: MediaHost
|
@Mock private lateinit var mediaHost: MediaHost
|
||||||
|
@Mock private lateinit var tile: QSTile
|
||||||
|
@Mock private lateinit var otherTile: QSTile
|
||||||
|
|
||||||
private lateinit var controller: QSPanelController
|
private lateinit var controller: QSPanelController
|
||||||
|
|
||||||
@@ -93,8 +96,17 @@ class QSPanelControllerTest : SysuiTestCase() {
|
|||||||
verify(mediaHost).expansion = MediaHostState.EXPANDED
|
verify(mediaHost).expansion = MediaHostState.EXPANDED
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun setSplitShadeEnabled(enabled: Boolean) {
|
@Test
|
||||||
mContext.orCreateTestableResources
|
fun testSetListeningDoesntRefreshListeningTiles() {
|
||||||
.addOverride(R.bool.config_use_split_notification_shade, enabled)
|
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()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -372,6 +372,11 @@ public class TileQueryHelperTest extends SysuiTestCase {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean isListening() {
|
||||||
|
return mListening;
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public CharSequence getTileLabel() {
|
public CharSequence getTileLabel() {
|
||||||
return mSpec;
|
return mSpec;
|
||||||
|
|||||||
@@ -361,6 +361,24 @@ public class QSTileImplTest extends SysuiTestCase {
|
|||||||
assertEquals(Settings.ACTION_SHOW_ADMIN_SUPPORT_DETAILS, captor.getValue().getAction());
|
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,
|
private void assertEvent(UiEventLogger.UiEventEnum eventType,
|
||||||
UiEventLoggerFake.FakeUiEvent fakeEvent) {
|
UiEventLoggerFake.FakeUiEvent fakeEvent) {
|
||||||
assertEquals(eventType.getId(), fakeEvent.eventId);
|
assertEquals(eventType.getId(), fakeEvent.eventId);
|
||||||
|
|||||||
Reference in New Issue
Block a user