Merge "Check home controls availability on overlay active." into tm-qpr-dev

This commit is contained in:
Darrell Shi
2022-11-13 23:17:27 +00:00
committed by Android (Google) Code Review
2 changed files with 70 additions and 14 deletions

View File

@@ -33,6 +33,7 @@ import com.android.internal.logging.UiEvent;
import com.android.internal.logging.UiEventLogger; import com.android.internal.logging.UiEventLogger;
import com.android.systemui.CoreStartable; import com.android.systemui.CoreStartable;
import com.android.systemui.animation.ActivityLaunchAnimator; import com.android.systemui.animation.ActivityLaunchAnimator;
import com.android.systemui.controls.ControlsServiceInfo;
import com.android.systemui.controls.dagger.ControlsComponent; import com.android.systemui.controls.dagger.ControlsComponent;
import com.android.systemui.controls.management.ControlsListingController; import com.android.systemui.controls.management.ControlsListingController;
import com.android.systemui.controls.ui.ControlsActivity; import com.android.systemui.controls.ui.ControlsActivity;
@@ -42,6 +43,8 @@ import com.android.systemui.dreams.complication.dagger.DreamHomeControlsComplica
import com.android.systemui.plugins.ActivityStarter; import com.android.systemui.plugins.ActivityStarter;
import com.android.systemui.util.ViewController; import com.android.systemui.util.ViewController;
import java.util.List;
import javax.inject.Inject; import javax.inject.Inject;
import javax.inject.Named; import javax.inject.Named;
@@ -76,16 +79,25 @@ public class DreamHomeControlsComplication implements Complication {
private final DreamOverlayStateController mDreamOverlayStateController; private final DreamOverlayStateController mDreamOverlayStateController;
private final ControlsComponent mControlsComponent; private final ControlsComponent mControlsComponent;
private boolean mControlServicesAvailable = false; private boolean mOverlayActive = false;
// Callback for when the home controls service availability changes. // Callback for when the home controls service availability changes.
private final ControlsListingController.ControlsListingCallback mControlsCallback = private final ControlsListingController.ControlsListingCallback mControlsCallback =
serviceInfos -> { services -> updateHomeControlsComplication();
boolean available = !serviceInfos.isEmpty();
if (available != mControlServicesAvailable) { private final DreamOverlayStateController.Callback mOverlayStateCallback =
mControlServicesAvailable = available; new DreamOverlayStateController.Callback() {
updateComplicationAvailability(); @Override
public void onStateChanged() {
if (mOverlayActive == mDreamOverlayStateController.isOverlayActive()) {
return;
}
mOverlayActive = !mOverlayActive;
if (mOverlayActive) {
updateHomeControlsComplication();
}
} }
}; };
@@ -102,18 +114,29 @@ public class DreamHomeControlsComplication implements Complication {
public void start() { public void start() {
mControlsComponent.getControlsListingController().ifPresent( mControlsComponent.getControlsListingController().ifPresent(
c -> c.addCallback(mControlsCallback)); c -> c.addCallback(mControlsCallback));
mDreamOverlayStateController.addCallback(mOverlayStateCallback);
}
private void updateHomeControlsComplication() {
mControlsComponent.getControlsListingController().ifPresent(c -> {
if (isHomeControlsAvailable(c.getCurrentServices())) {
mDreamOverlayStateController.addComplication(mComplication);
} else {
mDreamOverlayStateController.removeComplication(mComplication);
}
});
}
private boolean isHomeControlsAvailable(List<ControlsServiceInfo> controlsServices) {
if (controlsServices.isEmpty()) {
return false;
} }
private void updateComplicationAvailability() {
final boolean hasFavorites = mControlsComponent.getControlsController() final boolean hasFavorites = mControlsComponent.getControlsController()
.map(c -> !c.getFavorites().isEmpty()) .map(c -> !c.getFavorites().isEmpty())
.orElse(false); .orElse(false);
if (!hasFavorites || !mControlServicesAvailable final ControlsComponent.Visibility visibility = mControlsComponent.getVisibility();
|| mControlsComponent.getVisibility() == UNAVAILABLE) { return hasFavorites && visibility != UNAVAILABLE;
mDreamOverlayStateController.removeComplication(mComplication);
} else {
mDreamOverlayStateController.addComplication(mComplication);
}
} }
} }

View File

@@ -90,7 +90,10 @@ public class DreamHomeControlsComplicationTest extends SysuiTestCase {
private ActivityStarter mActivityStarter; private ActivityStarter mActivityStarter;
@Mock @Mock
UiEventLogger mUiEventLogger; private UiEventLogger mUiEventLogger;
@Captor
private ArgumentCaptor<DreamOverlayStateController.Callback> mStateCallbackCaptor;
@Before @Before
public void setup() { public void setup() {
@@ -164,6 +167,29 @@ public class DreamHomeControlsComplicationTest extends SysuiTestCase {
verify(mDreamOverlayStateController).addComplication(mComplication); verify(mDreamOverlayStateController).addComplication(mComplication);
} }
@Test
public void complicationAvailability_checkAvailabilityWhenDreamOverlayBecomesActive() {
final DreamHomeControlsComplication.Registrant registrant =
new DreamHomeControlsComplication.Registrant(mComplication,
mDreamOverlayStateController, mControlsComponent);
registrant.start();
setServiceAvailable(true);
setHaveFavorites(false);
// Complication not available on start.
verify(mDreamOverlayStateController, never()).addComplication(mComplication);
// Favorite controls added, complication should be available now.
setHaveFavorites(true);
// Dream overlay becomes active.
setDreamOverlayActive(true);
// Verify complication is added.
verify(mDreamOverlayStateController).addComplication(mComplication);
}
/** /**
* Ensures clicking home controls chip logs UiEvent. * Ensures clicking home controls chip logs UiEvent.
*/ */
@@ -196,10 +222,17 @@ public class DreamHomeControlsComplicationTest extends SysuiTestCase {
private void setServiceAvailable(boolean value) { private void setServiceAvailable(boolean value) {
final List<ControlsServiceInfo> serviceInfos = mock(List.class); final List<ControlsServiceInfo> serviceInfos = mock(List.class);
when(mControlsListingController.getCurrentServices()).thenReturn(serviceInfos);
when(serviceInfos.isEmpty()).thenReturn(!value); when(serviceInfos.isEmpty()).thenReturn(!value);
triggerControlsListingCallback(serviceInfos); triggerControlsListingCallback(serviceInfos);
} }
private void setDreamOverlayActive(boolean value) {
when(mDreamOverlayStateController.isOverlayActive()).thenReturn(value);
verify(mDreamOverlayStateController).addCallback(mStateCallbackCaptor.capture());
mStateCallbackCaptor.getValue().onStateChanged();
}
private void triggerControlsListingCallback(List<ControlsServiceInfo> serviceInfos) { private void triggerControlsListingCallback(List<ControlsServiceInfo> serviceInfos) {
verify(mControlsListingController).addCallback(mCallbackCaptor.capture()); verify(mControlsListingController).addCallback(mCallbackCaptor.capture());
mCallbackCaptor.getValue().onServicesUpdated(serviceInfos); mCallbackCaptor.getValue().onServicesUpdated(serviceInfos);