[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:
@@ -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;
|
||||
|
||||
@@ -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
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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
|
||||
}
|
||||
}
|
||||
@@ -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 {
|
||||
|
||||
@@ -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)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
@@ -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()
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user