Merge changes I7125da88,Id6a26bd0 into tm-qpr-dev
* changes: [SB Refactor] Define flags that allow us to run the backend without updating the UI. [SB Refactor] Define WifiUiAdapter to interface between the new data pipeline and the old UI.
This commit is contained in:
committed by
Android (Google) Code Review
commit
6019444593
@@ -179,10 +179,18 @@ object Flags {
|
|||||||
@Deprecated("Replaced by mobile and wifi specific flags.")
|
@Deprecated("Replaced by mobile and wifi specific flags.")
|
||||||
val NEW_STATUS_BAR_PIPELINE_FRONTEND = UnreleasedFlag(605, teamfood = false)
|
val NEW_STATUS_BAR_PIPELINE_FRONTEND = UnreleasedFlag(605, teamfood = false)
|
||||||
|
|
||||||
|
// TODO(b/256614753): Tracking Bug
|
||||||
val NEW_STATUS_BAR_MOBILE_ICONS = UnreleasedFlag(606)
|
val NEW_STATUS_BAR_MOBILE_ICONS = UnreleasedFlag(606)
|
||||||
|
|
||||||
|
// TODO(b/256614210): Tracking Bug
|
||||||
val NEW_STATUS_BAR_WIFI_ICON = UnreleasedFlag(607)
|
val NEW_STATUS_BAR_WIFI_ICON = UnreleasedFlag(607)
|
||||||
|
|
||||||
|
// TODO(b/256614751): Tracking Bug
|
||||||
|
val NEW_STATUS_BAR_MOBILE_ICONS_BACKEND = UnreleasedFlag(608)
|
||||||
|
|
||||||
|
// TODO(b/256613548): Tracking Bug
|
||||||
|
val NEW_STATUS_BAR_WIFI_ICON_BACKEND = UnreleasedFlag(609)
|
||||||
|
|
||||||
// 700 - dialer/calls
|
// 700 - dialer/calls
|
||||||
// TODO(b/254512734): Tracking Bug
|
// TODO(b/254512734): Tracking Bug
|
||||||
val ONGOING_CALL_STATUS_BAR_CHIP = ReleasedFlag(700)
|
val ONGOING_CALL_STATUS_BAR_CHIP = ReleasedFlag(700)
|
||||||
|
|||||||
@@ -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;
|
||||||
import static com.android.systemui.statusbar.phone.StatusBarIconHolder.TYPE_MOBILE_NEW;
|
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;
|
||||||
|
import static com.android.systemui.statusbar.phone.StatusBarIconHolder.TYPE_WIFI_NEW;
|
||||||
|
|
||||||
import android.annotation.Nullable;
|
import android.annotation.Nullable;
|
||||||
import android.content.Context;
|
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.binder.MobileIconsBinder;
|
||||||
import com.android.systemui.statusbar.pipeline.mobile.ui.view.ModernStatusBarMobileView;
|
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.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.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 com.android.systemui.util.Assert;
|
||||||
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
@@ -84,7 +86,18 @@ public interface StatusBarIconController {
|
|||||||
/** */
|
/** */
|
||||||
void setIcon(String slot, StatusBarIcon icon);
|
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);
|
void setMobileIcons(String slot, List<MobileIconState> states);
|
||||||
|
|
||||||
@@ -151,14 +164,14 @@ public interface StatusBarIconController {
|
|||||||
LinearLayout linearLayout,
|
LinearLayout linearLayout,
|
||||||
StatusBarLocation location,
|
StatusBarLocation location,
|
||||||
StatusBarPipelineFlags statusBarPipelineFlags,
|
StatusBarPipelineFlags statusBarPipelineFlags,
|
||||||
WifiViewModel wifiViewModel,
|
WifiUiAdapter wifiUiAdapter,
|
||||||
MobileUiAdapter mobileUiAdapter,
|
MobileUiAdapter mobileUiAdapter,
|
||||||
MobileContextProvider mobileContextProvider,
|
MobileContextProvider mobileContextProvider,
|
||||||
DarkIconDispatcher darkIconDispatcher) {
|
DarkIconDispatcher darkIconDispatcher) {
|
||||||
super(linearLayout,
|
super(linearLayout,
|
||||||
location,
|
location,
|
||||||
statusBarPipelineFlags,
|
statusBarPipelineFlags,
|
||||||
wifiViewModel,
|
wifiUiAdapter,
|
||||||
mobileUiAdapter,
|
mobileUiAdapter,
|
||||||
mobileContextProvider);
|
mobileContextProvider);
|
||||||
mIconHPadding = mContext.getResources().getDimensionPixelSize(
|
mIconHPadding = mContext.getResources().getDimensionPixelSize(
|
||||||
@@ -218,7 +231,7 @@ public interface StatusBarIconController {
|
|||||||
@SysUISingleton
|
@SysUISingleton
|
||||||
public static class Factory {
|
public static class Factory {
|
||||||
private final StatusBarPipelineFlags mStatusBarPipelineFlags;
|
private final StatusBarPipelineFlags mStatusBarPipelineFlags;
|
||||||
private final WifiViewModel mWifiViewModel;
|
private final WifiUiAdapter mWifiUiAdapter;
|
||||||
private final MobileContextProvider mMobileContextProvider;
|
private final MobileContextProvider mMobileContextProvider;
|
||||||
private final MobileUiAdapter mMobileUiAdapter;
|
private final MobileUiAdapter mMobileUiAdapter;
|
||||||
private final DarkIconDispatcher mDarkIconDispatcher;
|
private final DarkIconDispatcher mDarkIconDispatcher;
|
||||||
@@ -226,12 +239,12 @@ public interface StatusBarIconController {
|
|||||||
@Inject
|
@Inject
|
||||||
public Factory(
|
public Factory(
|
||||||
StatusBarPipelineFlags statusBarPipelineFlags,
|
StatusBarPipelineFlags statusBarPipelineFlags,
|
||||||
WifiViewModel wifiViewModel,
|
WifiUiAdapter wifiUiAdapter,
|
||||||
MobileContextProvider mobileContextProvider,
|
MobileContextProvider mobileContextProvider,
|
||||||
MobileUiAdapter mobileUiAdapter,
|
MobileUiAdapter mobileUiAdapter,
|
||||||
DarkIconDispatcher darkIconDispatcher) {
|
DarkIconDispatcher darkIconDispatcher) {
|
||||||
mStatusBarPipelineFlags = statusBarPipelineFlags;
|
mStatusBarPipelineFlags = statusBarPipelineFlags;
|
||||||
mWifiViewModel = wifiViewModel;
|
mWifiUiAdapter = wifiUiAdapter;
|
||||||
mMobileContextProvider = mobileContextProvider;
|
mMobileContextProvider = mobileContextProvider;
|
||||||
mMobileUiAdapter = mobileUiAdapter;
|
mMobileUiAdapter = mobileUiAdapter;
|
||||||
mDarkIconDispatcher = darkIconDispatcher;
|
mDarkIconDispatcher = darkIconDispatcher;
|
||||||
@@ -242,7 +255,7 @@ public interface StatusBarIconController {
|
|||||||
group,
|
group,
|
||||||
location,
|
location,
|
||||||
mStatusBarPipelineFlags,
|
mStatusBarPipelineFlags,
|
||||||
mWifiViewModel,
|
mWifiUiAdapter,
|
||||||
mMobileUiAdapter,
|
mMobileUiAdapter,
|
||||||
mMobileContextProvider,
|
mMobileContextProvider,
|
||||||
mDarkIconDispatcher);
|
mDarkIconDispatcher);
|
||||||
@@ -260,14 +273,14 @@ public interface StatusBarIconController {
|
|||||||
ViewGroup group,
|
ViewGroup group,
|
||||||
StatusBarLocation location,
|
StatusBarLocation location,
|
||||||
StatusBarPipelineFlags statusBarPipelineFlags,
|
StatusBarPipelineFlags statusBarPipelineFlags,
|
||||||
WifiViewModel wifiViewModel,
|
WifiUiAdapter wifiUiAdapter,
|
||||||
MobileUiAdapter mobileUiAdapter,
|
MobileUiAdapter mobileUiAdapter,
|
||||||
MobileContextProvider mobileContextProvider
|
MobileContextProvider mobileContextProvider
|
||||||
) {
|
) {
|
||||||
super(group,
|
super(group,
|
||||||
location,
|
location,
|
||||||
statusBarPipelineFlags,
|
statusBarPipelineFlags,
|
||||||
wifiViewModel,
|
wifiUiAdapter,
|
||||||
mobileUiAdapter,
|
mobileUiAdapter,
|
||||||
mobileContextProvider);
|
mobileContextProvider);
|
||||||
}
|
}
|
||||||
@@ -302,19 +315,19 @@ public interface StatusBarIconController {
|
|||||||
@SysUISingleton
|
@SysUISingleton
|
||||||
public static class Factory {
|
public static class Factory {
|
||||||
private final StatusBarPipelineFlags mStatusBarPipelineFlags;
|
private final StatusBarPipelineFlags mStatusBarPipelineFlags;
|
||||||
private final WifiViewModel mWifiViewModel;
|
private final WifiUiAdapter mWifiUiAdapter;
|
||||||
private final MobileContextProvider mMobileContextProvider;
|
private final MobileContextProvider mMobileContextProvider;
|
||||||
private final MobileUiAdapter mMobileUiAdapter;
|
private final MobileUiAdapter mMobileUiAdapter;
|
||||||
|
|
||||||
@Inject
|
@Inject
|
||||||
public Factory(
|
public Factory(
|
||||||
StatusBarPipelineFlags statusBarPipelineFlags,
|
StatusBarPipelineFlags statusBarPipelineFlags,
|
||||||
WifiViewModel wifiViewModel,
|
WifiUiAdapter wifiUiAdapter,
|
||||||
MobileUiAdapter mobileUiAdapter,
|
MobileUiAdapter mobileUiAdapter,
|
||||||
MobileContextProvider mobileContextProvider
|
MobileContextProvider mobileContextProvider
|
||||||
) {
|
) {
|
||||||
mStatusBarPipelineFlags = statusBarPipelineFlags;
|
mStatusBarPipelineFlags = statusBarPipelineFlags;
|
||||||
mWifiViewModel = wifiViewModel;
|
mWifiUiAdapter = wifiUiAdapter;
|
||||||
mMobileUiAdapter = mobileUiAdapter;
|
mMobileUiAdapter = mobileUiAdapter;
|
||||||
mMobileContextProvider = mobileContextProvider;
|
mMobileContextProvider = mobileContextProvider;
|
||||||
}
|
}
|
||||||
@@ -324,7 +337,7 @@ public interface StatusBarIconController {
|
|||||||
group,
|
group,
|
||||||
location,
|
location,
|
||||||
mStatusBarPipelineFlags,
|
mStatusBarPipelineFlags,
|
||||||
mWifiViewModel,
|
mWifiUiAdapter,
|
||||||
mMobileUiAdapter,
|
mMobileUiAdapter,
|
||||||
mMobileContextProvider);
|
mMobileContextProvider);
|
||||||
}
|
}
|
||||||
@@ -336,10 +349,9 @@ public interface StatusBarIconController {
|
|||||||
*/
|
*/
|
||||||
class IconManager implements DemoModeCommandReceiver {
|
class IconManager implements DemoModeCommandReceiver {
|
||||||
protected final ViewGroup mGroup;
|
protected final ViewGroup mGroup;
|
||||||
private final StatusBarLocation mLocation;
|
|
||||||
private final StatusBarPipelineFlags mStatusBarPipelineFlags;
|
private final StatusBarPipelineFlags mStatusBarPipelineFlags;
|
||||||
private final WifiViewModel mWifiViewModel;
|
|
||||||
private final MobileContextProvider mMobileContextProvider;
|
private final MobileContextProvider mMobileContextProvider;
|
||||||
|
private final LocationBasedWifiViewModel mWifiViewModel;
|
||||||
private final MobileIconsViewModel mMobileIconsViewModel;
|
private final MobileIconsViewModel mMobileIconsViewModel;
|
||||||
|
|
||||||
protected final Context mContext;
|
protected final Context mContext;
|
||||||
@@ -359,26 +371,33 @@ public interface StatusBarIconController {
|
|||||||
ViewGroup group,
|
ViewGroup group,
|
||||||
StatusBarLocation location,
|
StatusBarLocation location,
|
||||||
StatusBarPipelineFlags statusBarPipelineFlags,
|
StatusBarPipelineFlags statusBarPipelineFlags,
|
||||||
WifiViewModel wifiViewModel,
|
WifiUiAdapter wifiUiAdapter,
|
||||||
MobileUiAdapter mobileUiAdapter,
|
MobileUiAdapter mobileUiAdapter,
|
||||||
MobileContextProvider mobileContextProvider
|
MobileContextProvider mobileContextProvider
|
||||||
) {
|
) {
|
||||||
mGroup = group;
|
mGroup = group;
|
||||||
mLocation = location;
|
|
||||||
mStatusBarPipelineFlags = statusBarPipelineFlags;
|
mStatusBarPipelineFlags = statusBarPipelineFlags;
|
||||||
mWifiViewModel = wifiViewModel;
|
|
||||||
mMobileContextProvider = mobileContextProvider;
|
mMobileContextProvider = mobileContextProvider;
|
||||||
mContext = group.getContext();
|
mContext = group.getContext();
|
||||||
mIconSize = mContext.getResources().getDimensionPixelSize(
|
mIconSize = mContext.getResources().getDimensionPixelSize(
|
||||||
com.android.internal.R.dimen.status_bar_icon_size);
|
com.android.internal.R.dimen.status_bar_icon_size);
|
||||||
|
|
||||||
if (statusBarPipelineFlags.useNewMobileIcons()) {
|
if (statusBarPipelineFlags.runNewMobileIconsBackend()) {
|
||||||
// This starts the flow for the new pipeline, and will notify us of changes
|
// This starts the flow for the new pipeline, and will notify us of changes if
|
||||||
|
// {@link StatusBarPipelineFlags#useNewMobileIcons} is also true.
|
||||||
mMobileIconsViewModel = mobileUiAdapter.createMobileIconsViewModel();
|
mMobileIconsViewModel = mobileUiAdapter.createMobileIconsViewModel();
|
||||||
MobileIconsBinder.bind(mGroup, mMobileIconsViewModel);
|
MobileIconsBinder.bind(mGroup, mMobileIconsViewModel);
|
||||||
} else {
|
} else {
|
||||||
mMobileIconsViewModel = null;
|
mMobileIconsViewModel = null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (statusBarPipelineFlags.runNewWifiIconBackend()) {
|
||||||
|
// This starts the flow for the new pipeline, and will notify us of changes if
|
||||||
|
// {@link StatusBarPipelineFlags#useNewWifiIcon} is also true.
|
||||||
|
mWifiViewModel = wifiUiAdapter.bindGroup(mGroup, location);
|
||||||
|
} else {
|
||||||
|
mWifiViewModel = null;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public boolean isDemoable() {
|
public boolean isDemoable() {
|
||||||
@@ -429,6 +448,9 @@ public interface StatusBarIconController {
|
|||||||
case TYPE_WIFI:
|
case TYPE_WIFI:
|
||||||
return addWifiIcon(index, slot, holder.getWifiState());
|
return addWifiIcon(index, slot, holder.getWifiState());
|
||||||
|
|
||||||
|
case TYPE_WIFI_NEW:
|
||||||
|
return addNewWifiIcon(index, slot);
|
||||||
|
|
||||||
case TYPE_MOBILE:
|
case TYPE_MOBILE:
|
||||||
return addMobileIcon(index, slot, holder.getMobileState());
|
return addMobileIcon(index, slot, holder.getMobileState());
|
||||||
|
|
||||||
@@ -450,16 +472,13 @@ public interface StatusBarIconController {
|
|||||||
|
|
||||||
@VisibleForTesting
|
@VisibleForTesting
|
||||||
protected StatusIconDisplayable addWifiIcon(int index, String slot, WifiIconState state) {
|
protected StatusIconDisplayable addWifiIcon(int index, String slot, WifiIconState state) {
|
||||||
final BaseStatusBarFrameLayout view;
|
|
||||||
if (mStatusBarPipelineFlags.useNewWifiIcon()) {
|
if (mStatusBarPipelineFlags.useNewWifiIcon()) {
|
||||||
view = onCreateModernStatusBarWifiView(slot);
|
throw new IllegalStateException("Attempting to add a mobile icon while the new "
|
||||||
// When [ModernStatusBarWifiView] is created, it will automatically apply the
|
+ "icons are enabled is not supported");
|
||||||
// correct view state so we don't need to call applyWifiState.
|
|
||||||
} else {
|
|
||||||
StatusBarWifiView wifiView = onCreateStatusBarWifiView(slot);
|
|
||||||
wifiView.applyWifiState(state);
|
|
||||||
view = wifiView;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
final StatusBarWifiView view = onCreateStatusBarWifiView(slot);
|
||||||
|
view.applyWifiState(state);
|
||||||
mGroup.addView(view, index, onCreateLayoutParams());
|
mGroup.addView(view, index, onCreateLayoutParams());
|
||||||
|
|
||||||
if (mIsInDemoMode) {
|
if (mIsInDemoMode) {
|
||||||
@@ -468,6 +487,17 @@ public interface StatusBarIconController {
|
|||||||
return view;
|
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
|
@VisibleForTesting
|
||||||
protected StatusIconDisplayable addMobileIcon(
|
protected StatusIconDisplayable addMobileIcon(
|
||||||
int index,
|
int index,
|
||||||
@@ -523,8 +553,7 @@ public interface StatusBarIconController {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private ModernStatusBarWifiView onCreateModernStatusBarWifiView(String slot) {
|
private ModernStatusBarWifiView onCreateModernStatusBarWifiView(String slot) {
|
||||||
return ModernStatusBarWifiView.constructAndBind(
|
return ModernStatusBarWifiView.constructAndBind(mContext, slot, mWifiViewModel);
|
||||||
mContext, slot, mWifiViewModel, mLocation);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private StatusBarMobileView onCreateStatusBarMobileView(int subId, String slot) {
|
private StatusBarMobileView onCreateStatusBarMobileView(int subId, String slot) {
|
||||||
@@ -600,7 +629,8 @@ public interface StatusBarIconController {
|
|||||||
onSetMobileIcon(viewIndex, holder.getMobileState());
|
onSetMobileIcon(viewIndex, holder.getMobileState());
|
||||||
return;
|
return;
|
||||||
case TYPE_MOBILE_NEW:
|
case TYPE_MOBILE_NEW:
|
||||||
// Nothing, the icon updates itself now
|
case TYPE_WIFI_NEW:
|
||||||
|
// Nothing, the new icons update themselves
|
||||||
return;
|
return;
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
|
|||||||
@@ -195,12 +195,13 @@ public class StatusBarIconControllerImpl implements Tunable,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Signal icons need to be handled differently, because they can be
|
|
||||||
* composite views
|
|
||||||
*/
|
|
||||||
@Override
|
@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) {
|
if (state == null) {
|
||||||
removeIcon(slot, 0);
|
removeIcon(slot, 0);
|
||||||
return;
|
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
|
* 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.
|
* by subId. Don't worry this definitely makes sense and works.
|
||||||
@@ -225,7 +244,7 @@ public class StatusBarIconControllerImpl implements Tunable,
|
|||||||
@Override
|
@Override
|
||||||
public void setMobileIcons(String slot, List<MobileIconState> iconStates) {
|
public void setMobileIcons(String slot, List<MobileIconState> iconStates) {
|
||||||
if (mStatusBarPipelineFlags.useNewMobileIcons()) {
|
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");
|
+ "icons are enabled");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@@ -251,10 +270,11 @@ public class StatusBarIconControllerImpl implements Tunable,
|
|||||||
public void setNewMobileIconSubIds(List<Integer> subIds) {
|
public void setNewMobileIconSubIds(List<Integer> subIds) {
|
||||||
if (!mStatusBarPipelineFlags.useNewMobileIcons()) {
|
if (!mStatusBarPipelineFlags.useNewMobileIcons()) {
|
||||||
Log.d(TAG, "ignoring new pipeline callback, "
|
Log.d(TAG, "ignoring new pipeline callback, "
|
||||||
+ "since the new icons are disabled");
|
+ "since the new mobile icons are disabled");
|
||||||
return;
|
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);
|
Collections.reverse(subIds);
|
||||||
|
|
||||||
@@ -262,7 +282,7 @@ public class StatusBarIconControllerImpl implements Tunable,
|
|||||||
StatusBarIconHolder holder = mobileSlot.getHolderForTag(subId);
|
StatusBarIconHolder holder = mobileSlot.getHolderForTag(subId);
|
||||||
if (holder == null) {
|
if (holder == null) {
|
||||||
holder = StatusBarIconHolder.fromSubIdForModernMobileIcon(subId);
|
holder = StatusBarIconHolder.fromSubIdForModernMobileIcon(subId);
|
||||||
setIcon("mobile", holder);
|
setIcon(slotName, holder);
|
||||||
} else {
|
} else {
|
||||||
// Don't have to do anything in the new world
|
// Don't have to do anything in the new world
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -51,11 +51,24 @@ public class StatusBarIconHolder {
|
|||||||
@Deprecated
|
@Deprecated
|
||||||
public static final int TYPE_MOBILE_NEW = 3;
|
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({
|
@IntDef({
|
||||||
TYPE_ICON,
|
TYPE_ICON,
|
||||||
TYPE_WIFI,
|
TYPE_WIFI,
|
||||||
TYPE_MOBILE,
|
TYPE_MOBILE,
|
||||||
TYPE_MOBILE_NEW
|
TYPE_MOBILE_NEW,
|
||||||
|
TYPE_WIFI_NEW
|
||||||
})
|
})
|
||||||
@Retention(RetentionPolicy.SOURCE)
|
@Retention(RetentionPolicy.SOURCE)
|
||||||
@interface IconType {}
|
@interface IconType {}
|
||||||
@@ -95,6 +108,13 @@ public class StatusBarIconHolder {
|
|||||||
return holder;
|
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) {
|
public static StatusBarIconHolder fromMobileIconState(MobileIconState state) {
|
||||||
StatusBarIconHolder holder = new StatusBarIconHolder();
|
StatusBarIconHolder holder = new StatusBarIconHolder();
|
||||||
@@ -172,9 +192,10 @@ public class StatusBarIconHolder {
|
|||||||
case TYPE_MOBILE:
|
case TYPE_MOBILE:
|
||||||
return mMobileState.visible;
|
return mMobileState.visible;
|
||||||
case TYPE_MOBILE_NEW:
|
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;
|
return true;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
@@ -199,7 +220,9 @@ public class StatusBarIconHolder {
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
case TYPE_MOBILE_NEW:
|
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;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -212,7 +212,7 @@ public class StatusBarSignalPolicy implements SignalCallback,
|
|||||||
private void updateWifiIconWithState(WifiIconState state) {
|
private void updateWifiIconWithState(WifiIconState state) {
|
||||||
if (DEBUG) Log.d(TAG, "WifiIconState: " + state == null ? "" : state.toString());
|
if (DEBUG) Log.d(TAG, "WifiIconState: " + state == null ? "" : state.toString());
|
||||||
if (state.visible && state.resId > 0) {
|
if (state.visible && state.resId > 0) {
|
||||||
mIconController.setSignalIcon(mSlotWifi, state);
|
mIconController.setWifiIcon(mSlotWifi, state);
|
||||||
mIconController.setIconVisibility(mSlotWifi, true);
|
mIconController.setIconVisibility(mSlotWifi, true);
|
||||||
} else {
|
} else {
|
||||||
mIconController.setIconVisibility(mSlotWifi, false);
|
mIconController.setIconVisibility(mSlotWifi, false);
|
||||||
|
|||||||
@@ -27,11 +27,26 @@ class StatusBarPipelineFlags @Inject constructor(private val featureFlags: Featu
|
|||||||
/** True if we should display the mobile icons using the new status bar data pipeline. */
|
/** True if we should display the mobile icons using the new status bar data pipeline. */
|
||||||
fun useNewMobileIcons(): Boolean = featureFlags.isEnabled(Flags.NEW_STATUS_BAR_MOBILE_ICONS)
|
fun useNewMobileIcons(): Boolean = featureFlags.isEnabled(Flags.NEW_STATUS_BAR_MOBILE_ICONS)
|
||||||
|
|
||||||
|
/**
|
||||||
|
* True if we should run the new mobile icons backend to get the logging.
|
||||||
|
*
|
||||||
|
* Does *not* affect whether we render the mobile icons using the new backend data. See
|
||||||
|
* [useNewMobileIcons] for that.
|
||||||
|
*/
|
||||||
|
fun runNewMobileIconsBackend(): Boolean =
|
||||||
|
featureFlags.isEnabled(Flags.NEW_STATUS_BAR_MOBILE_ICONS_BACKEND) || useNewMobileIcons()
|
||||||
|
|
||||||
/** True if we should display the wifi icon using the new status bar data pipeline. */
|
/** True if we should display the wifi icon using the new status bar data pipeline. */
|
||||||
fun useNewWifiIcon(): Boolean = featureFlags.isEnabled(Flags.NEW_STATUS_BAR_WIFI_ICON)
|
fun useNewWifiIcon(): Boolean = featureFlags.isEnabled(Flags.NEW_STATUS_BAR_WIFI_ICON)
|
||||||
|
|
||||||
// TODO(b/238425913): Add flags to only run the mobile backend or wifi backend so we get the
|
/**
|
||||||
// logging without getting the UI effects.
|
* True if we should run the new wifi icon backend to get the logging.
|
||||||
|
*
|
||||||
|
* Does *not* affect whether we render the wifi icon using the new backend data. See
|
||||||
|
* [useNewWifiIcon] for that.
|
||||||
|
*/
|
||||||
|
fun runNewWifiIconBackend(): Boolean =
|
||||||
|
featureFlags.isEnabled(Flags.NEW_STATUS_BAR_WIFI_ICON_BACKEND) || useNewWifiIcon()
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns true if we should apply some coloring to the wifi icon that was rendered with the new
|
* Returns true if we should apply some coloring to the wifi icon that was rendered with the new
|
||||||
|
|||||||
@@ -20,6 +20,7 @@ import com.android.systemui.dagger.SysUISingleton
|
|||||||
import com.android.systemui.dagger.qualifiers.Application
|
import com.android.systemui.dagger.qualifiers.Application
|
||||||
import com.android.systemui.statusbar.phone.StatusBarIconController
|
import com.android.systemui.statusbar.phone.StatusBarIconController
|
||||||
import com.android.systemui.statusbar.phone.StatusBarIconController.IconManager
|
import com.android.systemui.statusbar.phone.StatusBarIconController.IconManager
|
||||||
|
import com.android.systemui.statusbar.pipeline.StatusBarPipelineFlags
|
||||||
import com.android.systemui.statusbar.pipeline.mobile.domain.interactor.MobileIconsInteractor
|
import com.android.systemui.statusbar.pipeline.mobile.domain.interactor.MobileIconsInteractor
|
||||||
import com.android.systemui.statusbar.pipeline.mobile.ui.viewmodel.MobileIconsViewModel
|
import com.android.systemui.statusbar.pipeline.mobile.ui.viewmodel.MobileIconsViewModel
|
||||||
import javax.inject.Inject
|
import javax.inject.Inject
|
||||||
@@ -50,6 +51,7 @@ constructor(
|
|||||||
private val iconController: StatusBarIconController,
|
private val iconController: StatusBarIconController,
|
||||||
private val iconsViewModelFactory: MobileIconsViewModel.Factory,
|
private val iconsViewModelFactory: MobileIconsViewModel.Factory,
|
||||||
@Application scope: CoroutineScope,
|
@Application scope: CoroutineScope,
|
||||||
|
private val statusBarPipelineFlags: StatusBarPipelineFlags,
|
||||||
) {
|
) {
|
||||||
private val mobileSubIds: Flow<List<Int>> =
|
private val mobileSubIds: Flow<List<Int>> =
|
||||||
interactor.filteredSubscriptions.mapLatest { infos ->
|
interactor.filteredSubscriptions.mapLatest { infos ->
|
||||||
@@ -66,8 +68,14 @@ constructor(
|
|||||||
private val mobileSubIdsState: StateFlow<List<Int>> =
|
private val mobileSubIdsState: StateFlow<List<Int>> =
|
||||||
mobileSubIds
|
mobileSubIds
|
||||||
.onEach {
|
.onEach {
|
||||||
// Notify the icon controller here so that it knows to add icons
|
// Only notify the icon controller if we want to *render* the new icons.
|
||||||
iconController.setNewMobileIconSubIds(it)
|
// Note that this flow may still run if
|
||||||
|
// [statusBarPipelineFlags.runNewMobileIconsBackend] is true because we may want to
|
||||||
|
// get the logging data without rendering.
|
||||||
|
if (statusBarPipelineFlags.useNewMobileIcons()) {
|
||||||
|
// Notify the icon controller here so that it knows to add icons
|
||||||
|
iconController.setNewMobileIconSubIds(it)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
.stateIn(scope, SharingStarted.WhileSubscribed(), listOf())
|
.stateIn(scope, SharingStarted.WhileSubscribed(), listOf())
|
||||||
|
|
||||||
|
|||||||
@@ -0,0 +1,86 @@
|
|||||||
|
/*
|
||||||
|
* 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.StatusBarPipelineFlags
|
||||||
|
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,
|
||||||
|
private val statusBarPipelineFlags: StatusBarPipelineFlags,
|
||||||
|
) {
|
||||||
|
/**
|
||||||
|
* 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 ->
|
||||||
|
// Only notify the icon controller if we want to *render* the new icon.
|
||||||
|
// Note that this flow may still run if
|
||||||
|
// [statusBarPipelineFlags.runNewWifiIconBackend] is true because we may
|
||||||
|
// want to get the logging data without rendering.
|
||||||
|
if (wifiIcon != null && statusBarPipelineFlags.useNewWifiIcon()) {
|
||||||
|
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_DOT
|
||||||
import com.android.systemui.statusbar.StatusBarIconView.STATE_HIDDEN
|
import com.android.systemui.statusbar.StatusBarIconView.STATE_HIDDEN
|
||||||
import com.android.systemui.statusbar.StatusBarIconView.STATE_ICON
|
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.LocationBasedWifiViewModel
|
||||||
import com.android.systemui.statusbar.pipeline.wifi.ui.viewmodel.WifiViewModel
|
|
||||||
import kotlinx.coroutines.InternalCoroutinesApi
|
import kotlinx.coroutines.InternalCoroutinesApi
|
||||||
import kotlinx.coroutines.flow.MutableStateFlow
|
import kotlinx.coroutines.flow.MutableStateFlow
|
||||||
import kotlinx.coroutines.flow.collect
|
import kotlinx.coroutines.flow.collect
|
||||||
@@ -62,26 +60,9 @@ object WifiViewBinder {
|
|||||||
fun onVisibilityStateChanged(@StatusBarIconView.VisibleState state: Int)
|
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. */
|
/** Binds the view to the view-model, continuing to update the former based on the latter. */
|
||||||
@JvmStatic
|
@JvmStatic
|
||||||
private fun bind(
|
fun bind(
|
||||||
view: ViewGroup,
|
view: ViewGroup,
|
||||||
viewModel: LocationBasedWifiViewModel,
|
viewModel: LocationBasedWifiViewModel,
|
||||||
): Binding {
|
): Binding {
|
||||||
|
|||||||
@@ -26,9 +26,8 @@ import com.android.systemui.statusbar.BaseStatusBarFrameLayout
|
|||||||
import com.android.systemui.statusbar.StatusBarIconView
|
import com.android.systemui.statusbar.StatusBarIconView
|
||||||
import com.android.systemui.statusbar.StatusBarIconView.STATE_DOT
|
import com.android.systemui.statusbar.StatusBarIconView.STATE_DOT
|
||||||
import com.android.systemui.statusbar.StatusBarIconView.STATE_HIDDEN
|
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.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
|
* A new and more modern implementation of [com.android.systemui.statusbar.StatusBarWifiView] that
|
||||||
@@ -81,12 +80,11 @@ class ModernStatusBarWifiView(
|
|||||||
|
|
||||||
private fun initView(
|
private fun initView(
|
||||||
slotName: String,
|
slotName: String,
|
||||||
wifiViewModel: WifiViewModel,
|
wifiViewModel: LocationBasedWifiViewModel,
|
||||||
location: StatusBarLocation,
|
|
||||||
) {
|
) {
|
||||||
slot = slotName
|
slot = slotName
|
||||||
initDotView()
|
initDotView()
|
||||||
binding = WifiViewBinder.bind(this, wifiViewModel, location)
|
binding = WifiViewBinder.bind(this, wifiViewModel)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Mostly duplicated from [com.android.systemui.statusbar.StatusBarWifiView].
|
// Mostly duplicated from [com.android.systemui.statusbar.StatusBarWifiView].
|
||||||
@@ -116,14 +114,13 @@ class ModernStatusBarWifiView(
|
|||||||
fun constructAndBind(
|
fun constructAndBind(
|
||||||
context: Context,
|
context: Context,
|
||||||
slot: String,
|
slot: String,
|
||||||
wifiViewModel: WifiViewModel,
|
wifiViewModel: LocationBasedWifiViewModel,
|
||||||
location: StatusBarLocation,
|
|
||||||
): ModernStatusBarWifiView {
|
): ModernStatusBarWifiView {
|
||||||
return (
|
return (
|
||||||
LayoutInflater.from(context).inflate(R.layout.new_status_bar_wifi_group, null)
|
LayoutInflater.from(context).inflate(R.layout.new_status_bar_wifi_group, null)
|
||||||
as ModernStatusBarWifiView
|
as ModernStatusBarWifiView
|
||||||
).also {
|
).also {
|
||||||
it.initView(slot, wifiViewModel, location)
|
it.initView(slot, wifiViewModel)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -145,7 +145,8 @@ constructor(
|
|||||||
else -> null
|
else -> null
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
.stateIn(scope, started = SharingStarted.WhileSubscribed(), initialValue = null)
|
.logOutputChange(logger, "icon") { icon -> icon?.contentDescription.toString() }
|
||||||
|
.stateIn(scope, started = SharingStarted.WhileSubscribed(), initialValue = null)
|
||||||
|
|
||||||
/** The wifi activity status. Null if we shouldn't display the activity status. */
|
/** The wifi activity status. Null if we shouldn't display the activity status. */
|
||||||
private val activity: Flow<WifiActivityModel?> =
|
private val activity: Flow<WifiActivityModel?> =
|
||||||
|
|||||||
@@ -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.phone.StatusBarSignalPolicy.WifiIconState;
|
||||||
import com.android.systemui.statusbar.pipeline.StatusBarPipelineFlags;
|
import com.android.systemui.statusbar.pipeline.StatusBarPipelineFlags;
|
||||||
import com.android.systemui.statusbar.pipeline.mobile.ui.MobileUiAdapter;
|
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 com.android.systemui.utils.leaks.LeakCheckedTest;
|
||||||
|
|
||||||
import org.junit.Before;
|
import org.junit.Before;
|
||||||
@@ -80,7 +80,7 @@ public class StatusBarIconControllerTest extends LeakCheckedTest {
|
|||||||
layout,
|
layout,
|
||||||
StatusBarLocation.HOME,
|
StatusBarLocation.HOME,
|
||||||
mock(StatusBarPipelineFlags.class),
|
mock(StatusBarPipelineFlags.class),
|
||||||
mock(WifiViewModel.class),
|
mock(WifiUiAdapter.class),
|
||||||
mock(MobileUiAdapter.class),
|
mock(MobileUiAdapter.class),
|
||||||
mMobileContextProvider,
|
mMobileContextProvider,
|
||||||
mock(DarkIconDispatcher.class));
|
mock(DarkIconDispatcher.class));
|
||||||
@@ -124,14 +124,14 @@ public class StatusBarIconControllerTest extends LeakCheckedTest {
|
|||||||
LinearLayout group,
|
LinearLayout group,
|
||||||
StatusBarLocation location,
|
StatusBarLocation location,
|
||||||
StatusBarPipelineFlags statusBarPipelineFlags,
|
StatusBarPipelineFlags statusBarPipelineFlags,
|
||||||
WifiViewModel wifiViewModel,
|
WifiUiAdapter wifiUiAdapter,
|
||||||
MobileUiAdapter mobileUiAdapter,
|
MobileUiAdapter mobileUiAdapter,
|
||||||
MobileContextProvider contextProvider,
|
MobileContextProvider contextProvider,
|
||||||
DarkIconDispatcher darkIconDispatcher) {
|
DarkIconDispatcher darkIconDispatcher) {
|
||||||
super(group,
|
super(group,
|
||||||
location,
|
location,
|
||||||
statusBarPipelineFlags,
|
statusBarPipelineFlags,
|
||||||
wifiViewModel,
|
wifiUiAdapter,
|
||||||
mobileUiAdapter,
|
mobileUiAdapter,
|
||||||
contextProvider,
|
contextProvider,
|
||||||
darkIconDispatcher);
|
darkIconDispatcher);
|
||||||
@@ -172,7 +172,7 @@ public class StatusBarIconControllerTest extends LeakCheckedTest {
|
|||||||
super(group,
|
super(group,
|
||||||
StatusBarLocation.HOME,
|
StatusBarLocation.HOME,
|
||||||
mock(StatusBarPipelineFlags.class),
|
mock(StatusBarPipelineFlags.class),
|
||||||
mock(WifiViewModel.class),
|
mock(WifiUiAdapter.class),
|
||||||
mock(MobileUiAdapter.class),
|
mock(MobileUiAdapter.class),
|
||||||
contextProvider);
|
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_DOT
|
||||||
import com.android.systemui.statusbar.StatusBarIconView.STATE_HIDDEN
|
import com.android.systemui.statusbar.StatusBarIconView.STATE_HIDDEN
|
||||||
import com.android.systemui.statusbar.StatusBarIconView.STATE_ICON
|
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.StatusBarPipelineFlags
|
||||||
import com.android.systemui.statusbar.pipeline.airplane.data.repository.FakeAirplaneModeRepository
|
import com.android.systemui.statusbar.pipeline.airplane.data.repository.FakeAirplaneModeRepository
|
||||||
import com.android.systemui.statusbar.pipeline.airplane.domain.interactor.AirplaneModeInteractor
|
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.data.repository.FakeWifiRepository
|
||||||
import com.android.systemui.statusbar.pipeline.wifi.domain.interactor.WifiInteractor
|
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.shared.WifiConstants
|
||||||
|
import com.android.systemui.statusbar.pipeline.wifi.ui.viewmodel.LocationBasedWifiViewModel
|
||||||
import com.android.systemui.statusbar.pipeline.wifi.ui.viewmodel.WifiViewModel
|
import com.android.systemui.statusbar.pipeline.wifi.ui.viewmodel.WifiViewModel
|
||||||
import com.google.common.truth.Truth.assertThat
|
import com.google.common.truth.Truth.assertThat
|
||||||
import kotlinx.coroutines.CoroutineScope
|
import kotlinx.coroutines.CoroutineScope
|
||||||
@@ -70,7 +70,7 @@ class ModernStatusBarWifiViewTest : SysuiTestCase() {
|
|||||||
private lateinit var connectivityRepository: FakeConnectivityRepository
|
private lateinit var connectivityRepository: FakeConnectivityRepository
|
||||||
private lateinit var wifiRepository: FakeWifiRepository
|
private lateinit var wifiRepository: FakeWifiRepository
|
||||||
private lateinit var interactor: WifiInteractor
|
private lateinit var interactor: WifiInteractor
|
||||||
private lateinit var viewModel: WifiViewModel
|
private lateinit var viewModel: LocationBasedWifiViewModel
|
||||||
private lateinit var scope: CoroutineScope
|
private lateinit var scope: CoroutineScope
|
||||||
private lateinit var airplaneModeViewModel: AirplaneModeViewModel
|
private lateinit var airplaneModeViewModel: AirplaneModeViewModel
|
||||||
|
|
||||||
@@ -105,23 +105,19 @@ class ModernStatusBarWifiViewTest : SysuiTestCase() {
|
|||||||
scope,
|
scope,
|
||||||
statusBarPipelineFlags,
|
statusBarPipelineFlags,
|
||||||
wifiConstants,
|
wifiConstants,
|
||||||
)
|
).home
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
fun constructAndBind_hasCorrectSlot() {
|
fun constructAndBind_hasCorrectSlot() {
|
||||||
val view = ModernStatusBarWifiView.constructAndBind(
|
val view = ModernStatusBarWifiView.constructAndBind(context, "slotName", viewModel)
|
||||||
context, "slotName", viewModel, StatusBarLocation.HOME
|
|
||||||
)
|
|
||||||
|
|
||||||
assertThat(view.slot).isEqualTo("slotName")
|
assertThat(view.slot).isEqualTo("slotName")
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
fun getVisibleState_icon_returnsIcon() {
|
fun getVisibleState_icon_returnsIcon() {
|
||||||
val view = ModernStatusBarWifiView.constructAndBind(
|
val view = ModernStatusBarWifiView.constructAndBind(context, SLOT_NAME, viewModel)
|
||||||
context, SLOT_NAME, viewModel, StatusBarLocation.HOME
|
|
||||||
)
|
|
||||||
|
|
||||||
view.setVisibleState(STATE_ICON, /* animate= */ false)
|
view.setVisibleState(STATE_ICON, /* animate= */ false)
|
||||||
|
|
||||||
@@ -130,9 +126,7 @@ class ModernStatusBarWifiViewTest : SysuiTestCase() {
|
|||||||
|
|
||||||
@Test
|
@Test
|
||||||
fun getVisibleState_dot_returnsDot() {
|
fun getVisibleState_dot_returnsDot() {
|
||||||
val view = ModernStatusBarWifiView.constructAndBind(
|
val view = ModernStatusBarWifiView.constructAndBind(context, SLOT_NAME, viewModel)
|
||||||
context, SLOT_NAME, viewModel, StatusBarLocation.HOME
|
|
||||||
)
|
|
||||||
|
|
||||||
view.setVisibleState(STATE_DOT, /* animate= */ false)
|
view.setVisibleState(STATE_DOT, /* animate= */ false)
|
||||||
|
|
||||||
@@ -141,9 +135,7 @@ class ModernStatusBarWifiViewTest : SysuiTestCase() {
|
|||||||
|
|
||||||
@Test
|
@Test
|
||||||
fun getVisibleState_hidden_returnsHidden() {
|
fun getVisibleState_hidden_returnsHidden() {
|
||||||
val view = ModernStatusBarWifiView.constructAndBind(
|
val view = ModernStatusBarWifiView.constructAndBind(context, SLOT_NAME, viewModel)
|
||||||
context, SLOT_NAME, viewModel, StatusBarLocation.HOME
|
|
||||||
)
|
|
||||||
|
|
||||||
view.setVisibleState(STATE_HIDDEN, /* animate= */ false)
|
view.setVisibleState(STATE_HIDDEN, /* animate= */ false)
|
||||||
|
|
||||||
@@ -155,9 +147,7 @@ class ModernStatusBarWifiViewTest : SysuiTestCase() {
|
|||||||
|
|
||||||
@Test
|
@Test
|
||||||
fun setVisibleState_icon_iconShownDotHidden() {
|
fun setVisibleState_icon_iconShownDotHidden() {
|
||||||
val view = ModernStatusBarWifiView.constructAndBind(
|
val view = ModernStatusBarWifiView.constructAndBind(context, SLOT_NAME, viewModel)
|
||||||
context, SLOT_NAME, viewModel, StatusBarLocation.HOME
|
|
||||||
)
|
|
||||||
|
|
||||||
view.setVisibleState(STATE_ICON, /* animate= */ false)
|
view.setVisibleState(STATE_ICON, /* animate= */ false)
|
||||||
|
|
||||||
@@ -172,9 +162,7 @@ class ModernStatusBarWifiViewTest : SysuiTestCase() {
|
|||||||
|
|
||||||
@Test
|
@Test
|
||||||
fun setVisibleState_dot_iconHiddenDotShown() {
|
fun setVisibleState_dot_iconHiddenDotShown() {
|
||||||
val view = ModernStatusBarWifiView.constructAndBind(
|
val view = ModernStatusBarWifiView.constructAndBind(context, SLOT_NAME, viewModel)
|
||||||
context, SLOT_NAME, viewModel, StatusBarLocation.HOME
|
|
||||||
)
|
|
||||||
|
|
||||||
view.setVisibleState(STATE_DOT, /* animate= */ false)
|
view.setVisibleState(STATE_DOT, /* animate= */ false)
|
||||||
|
|
||||||
@@ -189,9 +177,7 @@ class ModernStatusBarWifiViewTest : SysuiTestCase() {
|
|||||||
|
|
||||||
@Test
|
@Test
|
||||||
fun setVisibleState_hidden_iconAndDotHidden() {
|
fun setVisibleState_hidden_iconAndDotHidden() {
|
||||||
val view = ModernStatusBarWifiView.constructAndBind(
|
val view = ModernStatusBarWifiView.constructAndBind(context, SLOT_NAME, viewModel)
|
||||||
context, SLOT_NAME, viewModel, StatusBarLocation.HOME
|
|
||||||
)
|
|
||||||
|
|
||||||
view.setVisibleState(STATE_HIDDEN, /* animate= */ false)
|
view.setVisibleState(STATE_HIDDEN, /* animate= */ false)
|
||||||
|
|
||||||
@@ -211,9 +197,7 @@ class ModernStatusBarWifiViewTest : SysuiTestCase() {
|
|||||||
WifiNetworkModel.Active(NETWORK_ID, isValidated = true, level = 2)
|
WifiNetworkModel.Active(NETWORK_ID, isValidated = true, level = 2)
|
||||||
)
|
)
|
||||||
|
|
||||||
val view = ModernStatusBarWifiView.constructAndBind(
|
val view = ModernStatusBarWifiView.constructAndBind(context, SLOT_NAME, viewModel)
|
||||||
context, SLOT_NAME, viewModel, StatusBarLocation.HOME
|
|
||||||
)
|
|
||||||
|
|
||||||
ViewUtils.attachView(view)
|
ViewUtils.attachView(view)
|
||||||
testableLooper.processAllMessages()
|
testableLooper.processAllMessages()
|
||||||
@@ -230,9 +214,7 @@ class ModernStatusBarWifiViewTest : SysuiTestCase() {
|
|||||||
WifiNetworkModel.Active(NETWORK_ID, isValidated = true, level = 2)
|
WifiNetworkModel.Active(NETWORK_ID, isValidated = true, level = 2)
|
||||||
)
|
)
|
||||||
|
|
||||||
val view = ModernStatusBarWifiView.constructAndBind(
|
val view = ModernStatusBarWifiView.constructAndBind(context, SLOT_NAME, viewModel)
|
||||||
context, SLOT_NAME, viewModel, StatusBarLocation.HOME
|
|
||||||
)
|
|
||||||
|
|
||||||
ViewUtils.attachView(view)
|
ViewUtils.attachView(view)
|
||||||
testableLooper.processAllMessages()
|
testableLooper.processAllMessages()
|
||||||
|
|||||||
@@ -62,7 +62,11 @@ public class FakeStatusBarIconController extends BaseLeakChecker<IconManager>
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void setSignalIcon(String slot, WifiIconState state) {
|
public void setWifiIcon(String slot, WifiIconState state) {
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void setNewWifiIcon() {
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|||||||
Reference in New Issue
Block a user