[SB Refactor] Define WifiUiAdapter to interface between the new data

pipeline and the old UI.

When the new data pipeline detects a valid wifi icon, it will notify
StatusBarIconController to inflate a wifi icon if necessary.
This matches the pattern of MobileUiAdapter.

Bug: 238425913
Test: verify old wifi icon still works as expected
Test: verify new wifi icon still works as expected
Test: atest ModernStatusBarWifiViewTest StatusBarIconControllerTest
Change-Id: Id6a26bd00ee661a28e89585ea7b1293282a50c4d
This commit is contained in:
Caitlin Shkuratov
2022-10-28 15:40:21 +00:00
parent b0b34d3e4c
commit c1c24a6a97
10 changed files with 222 additions and 108 deletions

View File

@@ -18,6 +18,7 @@ import static com.android.systemui.statusbar.phone.StatusBarIconHolder.TYPE_ICON
import static com.android.systemui.statusbar.phone.StatusBarIconHolder.TYPE_MOBILE;
import static com.android.systemui.statusbar.phone.StatusBarIconHolder.TYPE_MOBILE_NEW;
import static com.android.systemui.statusbar.phone.StatusBarIconHolder.TYPE_WIFI;
import static com.android.systemui.statusbar.phone.StatusBarIconHolder.TYPE_WIFI_NEW;
import android.annotation.Nullable;
import android.content.Context;
@@ -53,8 +54,9 @@ import com.android.systemui.statusbar.pipeline.mobile.ui.MobileUiAdapter;
import com.android.systemui.statusbar.pipeline.mobile.ui.binder.MobileIconsBinder;
import com.android.systemui.statusbar.pipeline.mobile.ui.view.ModernStatusBarMobileView;
import com.android.systemui.statusbar.pipeline.mobile.ui.viewmodel.MobileIconsViewModel;
import com.android.systemui.statusbar.pipeline.wifi.ui.WifiUiAdapter;
import com.android.systemui.statusbar.pipeline.wifi.ui.view.ModernStatusBarWifiView;
import com.android.systemui.statusbar.pipeline.wifi.ui.viewmodel.WifiViewModel;
import com.android.systemui.statusbar.pipeline.wifi.ui.viewmodel.LocationBasedWifiViewModel;
import com.android.systemui.util.Assert;
import java.util.ArrayList;
@@ -84,7 +86,18 @@ public interface StatusBarIconController {
/** */
void setIcon(String slot, StatusBarIcon icon);
/** */
void setSignalIcon(String slot, WifiIconState state);
void setWifiIcon(String slot, WifiIconState state);
/**
* Sets up a wifi icon using the new data pipeline. No effect if the wifi icon has already been
* set up (inflated and added to the view hierarchy).
*
* This method completely replaces {@link #setWifiIcon} with the information from the new wifi
* data pipeline. Icons will automatically keep their state up to date, so we don't have to
* worry about funneling state objects through anymore.
*/
void setNewWifiIcon();
/** */
void setMobileIcons(String slot, List<MobileIconState> states);
@@ -151,14 +164,14 @@ public interface StatusBarIconController {
LinearLayout linearLayout,
StatusBarLocation location,
StatusBarPipelineFlags statusBarPipelineFlags,
WifiViewModel wifiViewModel,
WifiUiAdapter wifiUiAdapter,
MobileUiAdapter mobileUiAdapter,
MobileContextProvider mobileContextProvider,
DarkIconDispatcher darkIconDispatcher) {
super(linearLayout,
location,
statusBarPipelineFlags,
wifiViewModel,
wifiUiAdapter,
mobileUiAdapter,
mobileContextProvider);
mIconHPadding = mContext.getResources().getDimensionPixelSize(
@@ -218,7 +231,7 @@ public interface StatusBarIconController {
@SysUISingleton
public static class Factory {
private final StatusBarPipelineFlags mStatusBarPipelineFlags;
private final WifiViewModel mWifiViewModel;
private final WifiUiAdapter mWifiUiAdapter;
private final MobileContextProvider mMobileContextProvider;
private final MobileUiAdapter mMobileUiAdapter;
private final DarkIconDispatcher mDarkIconDispatcher;
@@ -226,12 +239,12 @@ public interface StatusBarIconController {
@Inject
public Factory(
StatusBarPipelineFlags statusBarPipelineFlags,
WifiViewModel wifiViewModel,
WifiUiAdapter wifiUiAdapter,
MobileContextProvider mobileContextProvider,
MobileUiAdapter mobileUiAdapter,
DarkIconDispatcher darkIconDispatcher) {
mStatusBarPipelineFlags = statusBarPipelineFlags;
mWifiViewModel = wifiViewModel;
mWifiUiAdapter = wifiUiAdapter;
mMobileContextProvider = mobileContextProvider;
mMobileUiAdapter = mobileUiAdapter;
mDarkIconDispatcher = darkIconDispatcher;
@@ -242,7 +255,7 @@ public interface StatusBarIconController {
group,
location,
mStatusBarPipelineFlags,
mWifiViewModel,
mWifiUiAdapter,
mMobileUiAdapter,
mMobileContextProvider,
mDarkIconDispatcher);
@@ -260,14 +273,14 @@ public interface StatusBarIconController {
ViewGroup group,
StatusBarLocation location,
StatusBarPipelineFlags statusBarPipelineFlags,
WifiViewModel wifiViewModel,
WifiUiAdapter wifiUiAdapter,
MobileUiAdapter mobileUiAdapter,
MobileContextProvider mobileContextProvider
) {
super(group,
location,
statusBarPipelineFlags,
wifiViewModel,
wifiUiAdapter,
mobileUiAdapter,
mobileContextProvider);
}
@@ -302,19 +315,19 @@ public interface StatusBarIconController {
@SysUISingleton
public static class Factory {
private final StatusBarPipelineFlags mStatusBarPipelineFlags;
private final WifiViewModel mWifiViewModel;
private final WifiUiAdapter mWifiUiAdapter;
private final MobileContextProvider mMobileContextProvider;
private final MobileUiAdapter mMobileUiAdapter;
@Inject
public Factory(
StatusBarPipelineFlags statusBarPipelineFlags,
WifiViewModel wifiViewModel,
WifiUiAdapter wifiUiAdapter,
MobileUiAdapter mobileUiAdapter,
MobileContextProvider mobileContextProvider
) {
mStatusBarPipelineFlags = statusBarPipelineFlags;
mWifiViewModel = wifiViewModel;
mWifiUiAdapter = wifiUiAdapter;
mMobileUiAdapter = mobileUiAdapter;
mMobileContextProvider = mobileContextProvider;
}
@@ -324,7 +337,7 @@ public interface StatusBarIconController {
group,
location,
mStatusBarPipelineFlags,
mWifiViewModel,
mWifiUiAdapter,
mMobileUiAdapter,
mMobileContextProvider);
}
@@ -336,10 +349,9 @@ public interface StatusBarIconController {
*/
class IconManager implements DemoModeCommandReceiver {
protected final ViewGroup mGroup;
private final StatusBarLocation mLocation;
private final StatusBarPipelineFlags mStatusBarPipelineFlags;
private final WifiViewModel mWifiViewModel;
private final MobileContextProvider mMobileContextProvider;
private final LocationBasedWifiViewModel mWifiViewModel;
private final MobileIconsViewModel mMobileIconsViewModel;
protected final Context mContext;
@@ -359,14 +371,12 @@ public interface StatusBarIconController {
ViewGroup group,
StatusBarLocation location,
StatusBarPipelineFlags statusBarPipelineFlags,
WifiViewModel wifiViewModel,
WifiUiAdapter wifiUiAdapter,
MobileUiAdapter mobileUiAdapter,
MobileContextProvider mobileContextProvider
) {
mGroup = group;
mLocation = location;
mStatusBarPipelineFlags = statusBarPipelineFlags;
mWifiViewModel = wifiViewModel;
mMobileContextProvider = mobileContextProvider;
mContext = group.getContext();
mIconSize = mContext.getResources().getDimensionPixelSize(
@@ -379,6 +389,12 @@ public interface StatusBarIconController {
} else {
mMobileIconsViewModel = null;
}
if (statusBarPipelineFlags.useNewWifiIcon()) {
mWifiViewModel = wifiUiAdapter.bindGroup(mGroup, location);
} else {
mWifiViewModel = null;
}
}
public boolean isDemoable() {
@@ -429,6 +445,9 @@ public interface StatusBarIconController {
case TYPE_WIFI:
return addWifiIcon(index, slot, holder.getWifiState());
case TYPE_WIFI_NEW:
return addNewWifiIcon(index, slot);
case TYPE_MOBILE:
return addMobileIcon(index, slot, holder.getMobileState());
@@ -450,16 +469,13 @@ public interface StatusBarIconController {
@VisibleForTesting
protected StatusIconDisplayable addWifiIcon(int index, String slot, WifiIconState state) {
final BaseStatusBarFrameLayout view;
if (mStatusBarPipelineFlags.useNewWifiIcon()) {
view = onCreateModernStatusBarWifiView(slot);
// When [ModernStatusBarWifiView] is created, it will automatically apply the
// correct view state so we don't need to call applyWifiState.
} else {
StatusBarWifiView wifiView = onCreateStatusBarWifiView(slot);
wifiView.applyWifiState(state);
view = wifiView;
throw new IllegalStateException("Attempting to add a mobile icon while the new "
+ "icons are enabled is not supported");
}
final StatusBarWifiView view = onCreateStatusBarWifiView(slot);
view.applyWifiState(state);
mGroup.addView(view, index, onCreateLayoutParams());
if (mIsInDemoMode) {
@@ -468,6 +484,17 @@ public interface StatusBarIconController {
return view;
}
protected StatusIconDisplayable addNewWifiIcon(int index, String slot) {
if (!mStatusBarPipelineFlags.useNewWifiIcon()) {
throw new IllegalStateException("Attempting to add a wifi icon using the new"
+ "pipeline, but the enabled flag is false.");
}
ModernStatusBarWifiView view = onCreateModernStatusBarWifiView(slot);
mGroup.addView(view, index, onCreateLayoutParams());
return view;
}
@VisibleForTesting
protected StatusIconDisplayable addMobileIcon(
int index,
@@ -523,8 +550,7 @@ public interface StatusBarIconController {
}
private ModernStatusBarWifiView onCreateModernStatusBarWifiView(String slot) {
return ModernStatusBarWifiView.constructAndBind(
mContext, slot, mWifiViewModel, mLocation);
return ModernStatusBarWifiView.constructAndBind(mContext, slot, mWifiViewModel);
}
private StatusBarMobileView onCreateStatusBarMobileView(int subId, String slot) {
@@ -600,7 +626,8 @@ public interface StatusBarIconController {
onSetMobileIcon(viewIndex, holder.getMobileState());
return;
case TYPE_MOBILE_NEW:
// Nothing, the icon updates itself now
case TYPE_WIFI_NEW:
// Nothing, the new icons update themselves
return;
default:
break;

View File

@@ -195,12 +195,13 @@ public class StatusBarIconControllerImpl implements Tunable,
}
}
/**
* Signal icons need to be handled differently, because they can be
* composite views
*/
@Override
public void setSignalIcon(String slot, WifiIconState state) {
public void setWifiIcon(String slot, WifiIconState state) {
if (mStatusBarPipelineFlags.useNewWifiIcon()) {
Log.d(TAG, "ignoring old pipeline callback because the new wifi icon is enabled");
return;
}
if (state == null) {
removeIcon(slot, 0);
return;
@@ -216,6 +217,24 @@ public class StatusBarIconControllerImpl implements Tunable,
}
}
@Override
public void setNewWifiIcon() {
if (!mStatusBarPipelineFlags.useNewWifiIcon()) {
Log.d(TAG, "ignoring new pipeline callback because the new wifi icon is disabled");
return;
}
String slot = mContext.getString(com.android.internal.R.string.status_bar_wifi);
StatusBarIconHolder holder = mStatusBarIconList.getIconHolder(slot, /* tag= */ 0);
if (holder == null) {
holder = StatusBarIconHolder.forNewWifiIcon();
setIcon(slot, holder);
} else {
// Don't have to do anything in the new world
}
}
/**
* Accept a list of MobileIconStates, which all live in the same slot(?!), and then are sorted
* by subId. Don't worry this definitely makes sense and works.
@@ -225,7 +244,7 @@ public class StatusBarIconControllerImpl implements Tunable,
@Override
public void setMobileIcons(String slot, List<MobileIconState> iconStates) {
if (mStatusBarPipelineFlags.useNewMobileIcons()) {
Log.d(TAG, "ignoring old pipeline callbacks, because the new "
Log.d(TAG, "ignoring old pipeline callbacks, because the new mobile "
+ "icons are enabled");
return;
}
@@ -251,10 +270,11 @@ public class StatusBarIconControllerImpl implements Tunable,
public void setNewMobileIconSubIds(List<Integer> subIds) {
if (!mStatusBarPipelineFlags.useNewMobileIcons()) {
Log.d(TAG, "ignoring new pipeline callback, "
+ "since the new icons are disabled");
+ "since the new mobile icons are disabled");
return;
}
Slot mobileSlot = mStatusBarIconList.getSlot("mobile");
String slotName = mContext.getString(com.android.internal.R.string.status_bar_mobile);
Slot mobileSlot = mStatusBarIconList.getSlot(slotName);
Collections.reverse(subIds);
@@ -262,7 +282,7 @@ public class StatusBarIconControllerImpl implements Tunable,
StatusBarIconHolder holder = mobileSlot.getHolderForTag(subId);
if (holder == null) {
holder = StatusBarIconHolder.fromSubIdForModernMobileIcon(subId);
setIcon("mobile", holder);
setIcon(slotName, holder);
} else {
// Don't have to do anything in the new world
}

View File

@@ -51,11 +51,24 @@ public class StatusBarIconHolder {
@Deprecated
public static final int TYPE_MOBILE_NEW = 3;
/**
* TODO (b/238425913): address this once the new pipeline is in place
* This type exists so that the new wifi pipeline can be used to inform the old view system
* about the existence of the wifi icon. The design of the new pipeline should allow for removal
* of this icon holder type, and obsolete the need for this entire class.
*
* @deprecated This field only exists so the new status bar pipeline can interface with the
* view holder system.
*/
@Deprecated
public static final int TYPE_WIFI_NEW = 4;
@IntDef({
TYPE_ICON,
TYPE_WIFI,
TYPE_MOBILE,
TYPE_MOBILE_NEW
TYPE_MOBILE_NEW,
TYPE_WIFI_NEW
})
@Retention(RetentionPolicy.SOURCE)
@interface IconType {}
@@ -95,6 +108,13 @@ public class StatusBarIconHolder {
return holder;
}
/** Creates a new holder with for the new wifi icon. */
public static StatusBarIconHolder forNewWifiIcon() {
StatusBarIconHolder holder = new StatusBarIconHolder();
holder.mType = TYPE_WIFI_NEW;
return holder;
}
/** */
public static StatusBarIconHolder fromMobileIconState(MobileIconState state) {
StatusBarIconHolder holder = new StatusBarIconHolder();
@@ -172,9 +192,10 @@ public class StatusBarIconHolder {
case TYPE_MOBILE:
return mMobileState.visible;
case TYPE_MOBILE_NEW:
//TODO (b/249790733), the new pipeline can control visibility via the ViewModel
case TYPE_WIFI_NEW:
// The new pipeline controls visibilities via the view model and view binder, so
// this is effectively an unused return value.
return true;
default:
return true;
}
@@ -199,7 +220,9 @@ public class StatusBarIconHolder {
break;
case TYPE_MOBILE_NEW:
//TODO (b/249790733), the new pipeline can control visibility via the ViewModel
case TYPE_WIFI_NEW:
// The new pipeline controls visibilities via the view model and view binder, so
// ignore setVisible.
break;
}
}

View File

@@ -212,7 +212,7 @@ public class StatusBarSignalPolicy implements SignalCallback,
private void updateWifiIconWithState(WifiIconState state) {
if (DEBUG) Log.d(TAG, "WifiIconState: " + state == null ? "" : state.toString());
if (state.visible && state.resId > 0) {
mIconController.setSignalIcon(mSlotWifi, state);
mIconController.setWifiIcon(mSlotWifi, state);
mIconController.setIconVisibility(mSlotWifi, true);
} else {
mIconController.setIconVisibility(mSlotWifi, false);

View File

@@ -0,0 +1,80 @@
/*
* Copyright (C) 2022 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.android.systemui.statusbar.pipeline.wifi.ui
import android.view.ViewGroup
import androidx.lifecycle.Lifecycle
import androidx.lifecycle.repeatOnLifecycle
import com.android.systemui.dagger.SysUISingleton
import com.android.systemui.lifecycle.repeatWhenAttached
import com.android.systemui.statusbar.phone.StatusBarIconController
import com.android.systemui.statusbar.phone.StatusBarLocation
import com.android.systemui.statusbar.pipeline.wifi.ui.viewmodel.LocationBasedWifiViewModel
import com.android.systemui.statusbar.pipeline.wifi.ui.viewmodel.WifiViewModel
import javax.inject.Inject
import kotlinx.coroutines.flow.collect
import kotlinx.coroutines.launch
/**
* This class serves as a bridge between the old UI classes and the new data pipeline.
*
* Once the new pipeline notifies [wifiViewModel] that the wifi icon should be visible, this class
* notifies [iconController] to inflate the wifi icon (if needed). After that, the [wifiViewModel]
* has sole responsibility for updating the wifi icon drawable, visibility, etc. and the
* [iconController] will not do any updates to the icon.
*/
@SysUISingleton
class WifiUiAdapter
@Inject
constructor(
private val iconController: StatusBarIconController,
private val wifiViewModel: WifiViewModel,
) {
/**
* Binds the container for all the status bar icons to a view model, so that we inflate the wifi
* view once we receive a valid icon from the data pipeline.
*
* NOTE: This should go away as we better integrate the data pipeline with the UI.
*
* @return the view model used for this particular group in the given [location].
*/
fun bindGroup(
statusBarIconGroup: ViewGroup,
location: StatusBarLocation,
): LocationBasedWifiViewModel {
val locationViewModel =
when (location) {
StatusBarLocation.HOME -> wifiViewModel.home
StatusBarLocation.KEYGUARD -> wifiViewModel.keyguard
StatusBarLocation.QS -> wifiViewModel.qs
}
statusBarIconGroup.repeatWhenAttached {
repeatOnLifecycle(Lifecycle.State.STARTED) {
launch {
locationViewModel.wifiIcon.collect { wifiIcon ->
if (wifiIcon != null) {
iconController.setNewWifiIcon()
}
}
}
}
}
return locationViewModel
}
}

View File

@@ -30,9 +30,7 @@ import com.android.systemui.statusbar.StatusBarIconView
import com.android.systemui.statusbar.StatusBarIconView.STATE_DOT
import com.android.systemui.statusbar.StatusBarIconView.STATE_HIDDEN
import com.android.systemui.statusbar.StatusBarIconView.STATE_ICON
import com.android.systemui.statusbar.phone.StatusBarLocation
import com.android.systemui.statusbar.pipeline.wifi.ui.viewmodel.LocationBasedWifiViewModel
import com.android.systemui.statusbar.pipeline.wifi.ui.viewmodel.WifiViewModel
import kotlinx.coroutines.InternalCoroutinesApi
import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.coroutines.flow.collect
@@ -62,26 +60,9 @@ object WifiViewBinder {
fun onVisibilityStateChanged(@StatusBarIconView.VisibleState state: Int)
}
/**
* Binds the view to the appropriate view-model based on the given location. The view will
* continue to be updated following updates from the view-model.
*/
@JvmStatic
fun bind(
view: ViewGroup,
wifiViewModel: WifiViewModel,
location: StatusBarLocation,
): Binding {
return when (location) {
StatusBarLocation.HOME -> bind(view, wifiViewModel.home)
StatusBarLocation.KEYGUARD -> bind(view, wifiViewModel.keyguard)
StatusBarLocation.QS -> bind(view, wifiViewModel.qs)
}
}
/** Binds the view to the view-model, continuing to update the former based on the latter. */
@JvmStatic
private fun bind(
fun bind(
view: ViewGroup,
viewModel: LocationBasedWifiViewModel,
): Binding {

View File

@@ -26,9 +26,8 @@ import com.android.systemui.statusbar.BaseStatusBarFrameLayout
import com.android.systemui.statusbar.StatusBarIconView
import com.android.systemui.statusbar.StatusBarIconView.STATE_DOT
import com.android.systemui.statusbar.StatusBarIconView.STATE_HIDDEN
import com.android.systemui.statusbar.phone.StatusBarLocation
import com.android.systemui.statusbar.pipeline.wifi.ui.binder.WifiViewBinder
import com.android.systemui.statusbar.pipeline.wifi.ui.viewmodel.WifiViewModel
import com.android.systemui.statusbar.pipeline.wifi.ui.viewmodel.LocationBasedWifiViewModel
/**
* A new and more modern implementation of [com.android.systemui.statusbar.StatusBarWifiView] that
@@ -81,12 +80,11 @@ class ModernStatusBarWifiView(
private fun initView(
slotName: String,
wifiViewModel: WifiViewModel,
location: StatusBarLocation,
wifiViewModel: LocationBasedWifiViewModel,
) {
slot = slotName
initDotView()
binding = WifiViewBinder.bind(this, wifiViewModel, location)
binding = WifiViewBinder.bind(this, wifiViewModel)
}
// Mostly duplicated from [com.android.systemui.statusbar.StatusBarWifiView].
@@ -116,14 +114,13 @@ class ModernStatusBarWifiView(
fun constructAndBind(
context: Context,
slot: String,
wifiViewModel: WifiViewModel,
location: StatusBarLocation,
wifiViewModel: LocationBasedWifiViewModel,
): ModernStatusBarWifiView {
return (
LayoutInflater.from(context).inflate(R.layout.new_status_bar_wifi_group, null)
as ModernStatusBarWifiView
).also {
it.initView(slot, wifiViewModel, location)
it.initView(slot, wifiViewModel)
}
}
}

View File

@@ -45,7 +45,7 @@ import com.android.systemui.statusbar.phone.StatusBarSignalPolicy.MobileIconStat
import com.android.systemui.statusbar.phone.StatusBarSignalPolicy.WifiIconState;
import com.android.systemui.statusbar.pipeline.StatusBarPipelineFlags;
import com.android.systemui.statusbar.pipeline.mobile.ui.MobileUiAdapter;
import com.android.systemui.statusbar.pipeline.wifi.ui.viewmodel.WifiViewModel;
import com.android.systemui.statusbar.pipeline.wifi.ui.WifiUiAdapter;
import com.android.systemui.utils.leaks.LeakCheckedTest;
import org.junit.Before;
@@ -80,7 +80,7 @@ public class StatusBarIconControllerTest extends LeakCheckedTest {
layout,
StatusBarLocation.HOME,
mock(StatusBarPipelineFlags.class),
mock(WifiViewModel.class),
mock(WifiUiAdapter.class),
mock(MobileUiAdapter.class),
mMobileContextProvider,
mock(DarkIconDispatcher.class));
@@ -124,14 +124,14 @@ public class StatusBarIconControllerTest extends LeakCheckedTest {
LinearLayout group,
StatusBarLocation location,
StatusBarPipelineFlags statusBarPipelineFlags,
WifiViewModel wifiViewModel,
WifiUiAdapter wifiUiAdapter,
MobileUiAdapter mobileUiAdapter,
MobileContextProvider contextProvider,
DarkIconDispatcher darkIconDispatcher) {
super(group,
location,
statusBarPipelineFlags,
wifiViewModel,
wifiUiAdapter,
mobileUiAdapter,
contextProvider,
darkIconDispatcher);
@@ -172,7 +172,7 @@ public class StatusBarIconControllerTest extends LeakCheckedTest {
super(group,
StatusBarLocation.HOME,
mock(StatusBarPipelineFlags.class),
mock(WifiViewModel.class),
mock(WifiUiAdapter.class),
mock(MobileUiAdapter.class),
contextProvider);
}

View File

@@ -28,7 +28,6 @@ import com.android.systemui.lifecycle.InstantTaskExecutorRule
import com.android.systemui.statusbar.StatusBarIconView.STATE_DOT
import com.android.systemui.statusbar.StatusBarIconView.STATE_HIDDEN
import com.android.systemui.statusbar.StatusBarIconView.STATE_ICON
import com.android.systemui.statusbar.phone.StatusBarLocation
import com.android.systemui.statusbar.pipeline.StatusBarPipelineFlags
import com.android.systemui.statusbar.pipeline.airplane.data.repository.FakeAirplaneModeRepository
import com.android.systemui.statusbar.pipeline.airplane.domain.interactor.AirplaneModeInteractor
@@ -40,6 +39,7 @@ import com.android.systemui.statusbar.pipeline.wifi.data.model.WifiNetworkModel
import com.android.systemui.statusbar.pipeline.wifi.data.repository.FakeWifiRepository
import com.android.systemui.statusbar.pipeline.wifi.domain.interactor.WifiInteractor
import com.android.systemui.statusbar.pipeline.wifi.shared.WifiConstants
import com.android.systemui.statusbar.pipeline.wifi.ui.viewmodel.LocationBasedWifiViewModel
import com.android.systemui.statusbar.pipeline.wifi.ui.viewmodel.WifiViewModel
import com.google.common.truth.Truth.assertThat
import kotlinx.coroutines.CoroutineScope
@@ -70,7 +70,7 @@ class ModernStatusBarWifiViewTest : SysuiTestCase() {
private lateinit var connectivityRepository: FakeConnectivityRepository
private lateinit var wifiRepository: FakeWifiRepository
private lateinit var interactor: WifiInteractor
private lateinit var viewModel: WifiViewModel
private lateinit var viewModel: LocationBasedWifiViewModel
private lateinit var scope: CoroutineScope
private lateinit var airplaneModeViewModel: AirplaneModeViewModel
@@ -105,23 +105,19 @@ class ModernStatusBarWifiViewTest : SysuiTestCase() {
scope,
statusBarPipelineFlags,
wifiConstants,
)
).home
}
@Test
fun constructAndBind_hasCorrectSlot() {
val view = ModernStatusBarWifiView.constructAndBind(
context, "slotName", viewModel, StatusBarLocation.HOME
)
val view = ModernStatusBarWifiView.constructAndBind(context, "slotName", viewModel)
assertThat(view.slot).isEqualTo("slotName")
}
@Test
fun getVisibleState_icon_returnsIcon() {
val view = ModernStatusBarWifiView.constructAndBind(
context, SLOT_NAME, viewModel, StatusBarLocation.HOME
)
val view = ModernStatusBarWifiView.constructAndBind(context, SLOT_NAME, viewModel)
view.setVisibleState(STATE_ICON, /* animate= */ false)
@@ -130,9 +126,7 @@ class ModernStatusBarWifiViewTest : SysuiTestCase() {
@Test
fun getVisibleState_dot_returnsDot() {
val view = ModernStatusBarWifiView.constructAndBind(
context, SLOT_NAME, viewModel, StatusBarLocation.HOME
)
val view = ModernStatusBarWifiView.constructAndBind(context, SLOT_NAME, viewModel)
view.setVisibleState(STATE_DOT, /* animate= */ false)
@@ -141,9 +135,7 @@ class ModernStatusBarWifiViewTest : SysuiTestCase() {
@Test
fun getVisibleState_hidden_returnsHidden() {
val view = ModernStatusBarWifiView.constructAndBind(
context, SLOT_NAME, viewModel, StatusBarLocation.HOME
)
val view = ModernStatusBarWifiView.constructAndBind(context, SLOT_NAME, viewModel)
view.setVisibleState(STATE_HIDDEN, /* animate= */ false)
@@ -155,9 +147,7 @@ class ModernStatusBarWifiViewTest : SysuiTestCase() {
@Test
fun setVisibleState_icon_iconShownDotHidden() {
val view = ModernStatusBarWifiView.constructAndBind(
context, SLOT_NAME, viewModel, StatusBarLocation.HOME
)
val view = ModernStatusBarWifiView.constructAndBind(context, SLOT_NAME, viewModel)
view.setVisibleState(STATE_ICON, /* animate= */ false)
@@ -172,9 +162,7 @@ class ModernStatusBarWifiViewTest : SysuiTestCase() {
@Test
fun setVisibleState_dot_iconHiddenDotShown() {
val view = ModernStatusBarWifiView.constructAndBind(
context, SLOT_NAME, viewModel, StatusBarLocation.HOME
)
val view = ModernStatusBarWifiView.constructAndBind(context, SLOT_NAME, viewModel)
view.setVisibleState(STATE_DOT, /* animate= */ false)
@@ -189,9 +177,7 @@ class ModernStatusBarWifiViewTest : SysuiTestCase() {
@Test
fun setVisibleState_hidden_iconAndDotHidden() {
val view = ModernStatusBarWifiView.constructAndBind(
context, SLOT_NAME, viewModel, StatusBarLocation.HOME
)
val view = ModernStatusBarWifiView.constructAndBind(context, SLOT_NAME, viewModel)
view.setVisibleState(STATE_HIDDEN, /* animate= */ false)
@@ -211,9 +197,7 @@ class ModernStatusBarWifiViewTest : SysuiTestCase() {
WifiNetworkModel.Active(NETWORK_ID, isValidated = true, level = 2)
)
val view = ModernStatusBarWifiView.constructAndBind(
context, SLOT_NAME, viewModel, StatusBarLocation.HOME
)
val view = ModernStatusBarWifiView.constructAndBind(context, SLOT_NAME, viewModel)
ViewUtils.attachView(view)
testableLooper.processAllMessages()
@@ -230,9 +214,7 @@ class ModernStatusBarWifiViewTest : SysuiTestCase() {
WifiNetworkModel.Active(NETWORK_ID, isValidated = true, level = 2)
)
val view = ModernStatusBarWifiView.constructAndBind(
context, SLOT_NAME, viewModel, StatusBarLocation.HOME
)
val view = ModernStatusBarWifiView.constructAndBind(context, SLOT_NAME, viewModel)
ViewUtils.attachView(view)
testableLooper.processAllMessages()

View File

@@ -62,7 +62,11 @@ public class FakeStatusBarIconController extends BaseLeakChecker<IconManager>
}
@Override
public void setSignalIcon(String slot, WifiIconState state) {
public void setWifiIcon(String slot, WifiIconState state) {
}
@Override
public void setNewWifiIcon() {
}
@Override