Merge changes from topic "sysui-networking-refactor" into sc-v2-dev

* changes:
  Remove instance fields from MobileSignalController
  Re-internalize MobileState and State from SettingsLib
  Move interfaces out of NetworkController
This commit is contained in:
Evan Laird
2021-11-09 15:56:48 +00:00
committed by Android (Google) Code Review
34 changed files with 849 additions and 636 deletions

View File

@@ -15,13 +15,8 @@
*/
package com.android.settingslib;
import com.android.settingslib.mobile.TelephonyIcons;
import java.text.SimpleDateFormat;
import java.util.Objects;
/**
* Icons and states for SysUI and Settings.
* Icons for SysUI and Settings.
*/
public class SignalIcon {
@@ -70,92 +65,6 @@ public class SignalIcon {
}
}
/**
* Holds states for SysUI.
*/
public static class State {
// No locale as it's only used for logging purposes
private static SimpleDateFormat sSDF = new SimpleDateFormat("MM-dd HH:mm:ss.SSS");
public boolean connected;
public boolean enabled;
public boolean activityIn;
public boolean activityOut;
public int level;
public IconGroup iconGroup;
public int inetCondition;
public int rssi; // Only for logging.
// Not used for comparison, just used for logging.
public long time;
/**
* Generates a copy of the source state.
*/
public void copyFrom(State state) {
connected = state.connected;
enabled = state.enabled;
level = state.level;
iconGroup = state.iconGroup;
inetCondition = state.inetCondition;
activityIn = state.activityIn;
activityOut = state.activityOut;
rssi = state.rssi;
time = state.time;
}
@Override
public String toString() {
if (time != 0) {
StringBuilder builder = new StringBuilder();
toString(builder);
return builder.toString();
} else {
return "Empty " + getClass().getSimpleName();
}
}
protected void toString(StringBuilder builder) {
builder.append("connected=").append(connected).append(',')
.append("enabled=").append(enabled).append(',')
.append("level=").append(level).append(',')
.append("inetCondition=").append(inetCondition).append(',')
.append("iconGroup=").append(iconGroup).append(',')
.append("activityIn=").append(activityIn).append(',')
.append("activityOut=").append(activityOut).append(',')
.append("rssi=").append(rssi).append(',')
.append("lastModified=").append(sSDF.format(time));
}
@Override
public boolean equals(Object o) {
if (!o.getClass().equals(getClass())) {
return false;
}
State other = (State) o;
return other.connected == connected
&& other.enabled == enabled
&& other.level == level
&& other.inetCondition == inetCondition
&& other.iconGroup == iconGroup
&& other.activityIn == activityIn
&& other.activityOut == activityOut
&& other.rssi == rssi;
}
@Override
public int hashCode() {
return Objects.hash(
connected,
enabled,
level,
inetCondition,
iconGroup,
activityIn,
activityOut,
rssi);
}
}
/**
* Holds icons for a given MobileState.
*/
@@ -189,110 +98,4 @@ public class SignalIcon {
this.dataType = dataType;
}
}
/**
* Holds mobile states for SysUI.
*/
public static class MobileState extends State {
public String networkName;
public String networkNameData;
public boolean dataSim;
public boolean dataConnected;
public boolean isEmergency;
public boolean airplaneMode;
public boolean carrierNetworkChangeMode;
public boolean isDefault;
public boolean userSetup;
public boolean roaming;
public boolean defaultDataOff; // Tracks the on/off state of the defaultDataSubscription
@Override
public void copyFrom(State s) {
super.copyFrom(s);
MobileState state = (MobileState) s;
dataSim = state.dataSim;
networkName = state.networkName;
networkNameData = state.networkNameData;
dataConnected = state.dataConnected;
isDefault = state.isDefault;
isEmergency = state.isEmergency;
airplaneMode = state.airplaneMode;
carrierNetworkChangeMode = state.carrierNetworkChangeMode;
userSetup = state.userSetup;
roaming = state.roaming;
defaultDataOff = state.defaultDataOff;
}
/** @return true if this state is disabled or not default data */
public boolean isDataDisabledOrNotDefault() {
return (iconGroup == TelephonyIcons.DATA_DISABLED
|| (iconGroup == TelephonyIcons.NOT_DEFAULT_DATA)) && userSetup;
}
/** @return if this state is considered to have inbound activity */
public boolean hasActivityIn() {
return dataConnected && !carrierNetworkChangeMode && activityIn;
}
/** @return if this state is considered to have outbound activity */
public boolean hasActivityOut() {
return dataConnected && !carrierNetworkChangeMode && activityOut;
}
/** @return true if this state should show a RAT icon in quick settings */
public boolean showQuickSettingsRatIcon() {
return dataConnected || isDataDisabledOrNotDefault();
}
@Override
protected void toString(StringBuilder builder) {
super.toString(builder);
builder.append(',');
builder.append("dataSim=").append(dataSim).append(',');
builder.append("networkName=").append(networkName).append(',');
builder.append("networkNameData=").append(networkNameData).append(',');
builder.append("dataConnected=").append(dataConnected).append(',');
builder.append("roaming=").append(roaming).append(',');
builder.append("isDefault=").append(isDefault).append(',');
builder.append("isEmergency=").append(isEmergency).append(',');
builder.append("airplaneMode=").append(airplaneMode).append(',');
builder.append("carrierNetworkChangeMode=").append(carrierNetworkChangeMode)
.append(',');
builder.append("userSetup=").append(userSetup).append(',');
builder.append("defaultDataOff=").append(defaultDataOff).append(',');
builder.append("showQuickSettingsRatIcon=").append(showQuickSettingsRatIcon());
}
@Override
public boolean equals(Object o) {
return super.equals(o)
&& Objects.equals(((MobileState) o).networkName, networkName)
&& Objects.equals(((MobileState) o).networkNameData, networkNameData)
&& ((MobileState) o).dataSim == dataSim
&& ((MobileState) o).dataConnected == dataConnected
&& ((MobileState) o).isEmergency == isEmergency
&& ((MobileState) o).airplaneMode == airplaneMode
&& ((MobileState) o).carrierNetworkChangeMode == carrierNetworkChangeMode
&& ((MobileState) o).userSetup == userSetup
&& ((MobileState) o).isDefault == isDefault
&& ((MobileState) o).roaming == roaming
&& ((MobileState) o).defaultDataOff == defaultDataOff;
}
@Override
public int hashCode() {
return Objects.hash(super.hashCode(),
networkName,
networkNameData,
dataSim,
dataConnected,
isEmergency,
airplaneMode,
carrierNetworkChangeMode,
userSetup,
isDefault,
roaming,
defaultDataOff);
}
}
}

View File

@@ -19,6 +19,7 @@ package com.android.systemui.qs.carrier;
import static android.view.View.IMPORTANT_FOR_ACCESSIBILITY_YES;
import android.annotation.MainThread;
import android.annotation.NonNull;
import android.content.Context;
import android.content.Intent;
import android.os.Handler;
@@ -42,8 +43,10 @@ import com.android.systemui.dagger.qualifiers.Background;
import com.android.systemui.dagger.qualifiers.Main;
import com.android.systemui.flags.FeatureFlags;
import com.android.systemui.plugins.ActivityStarter;
import com.android.systemui.statusbar.connectivity.IconState;
import com.android.systemui.statusbar.connectivity.MobileDataIndicators;
import com.android.systemui.statusbar.connectivity.NetworkController;
import com.android.systemui.statusbar.connectivity.NetworkController.MobileDataIndicators;
import com.android.systemui.statusbar.connectivity.SignalCallback;
import com.android.systemui.util.CarrierConfigTracker;
import java.util.function.Consumer;
@@ -81,10 +84,9 @@ public class QSCarrierGroupController {
private final SlotIndexResolver mSlotIndexResolver;
private final NetworkController.SignalCallback mSignalCallback =
new NetworkController.SignalCallback() {
private final SignalCallback mSignalCallback = new SignalCallback() {
@Override
public void setMobileDataIndicators(MobileDataIndicators indicators) {
public void setMobileDataIndicators(@NonNull MobileDataIndicators indicators) {
if (mProviderModel) {
return;
}
@@ -109,7 +111,7 @@ public class QSCarrierGroupController {
}
@Override
public void setCallIndicator(NetworkController.IconState statusIcon, int subId) {
public void setCallIndicator(@NonNull IconState statusIcon, int subId) {
if (!mProviderModel) {
return;
}

View File

@@ -18,6 +18,7 @@ package com.android.systemui.qs.tiles;
import static android.media.MediaRouter.ROUTE_TYPE_REMOTE_DISPLAY;
import android.annotation.NonNull;
import android.app.Dialog;
import android.content.Context;
import android.content.Intent;
@@ -52,7 +53,8 @@ import com.android.systemui.qs.QSHost;
import com.android.systemui.qs.logging.QSLogger;
import com.android.systemui.qs.tileimpl.QSTileImpl;
import com.android.systemui.statusbar.connectivity.NetworkController;
import com.android.systemui.statusbar.connectivity.NetworkController.WifiIndicators;
import com.android.systemui.statusbar.connectivity.SignalCallback;
import com.android.systemui.statusbar.connectivity.WifiIndicators;
import com.android.systemui.statusbar.phone.SystemUIDialog;
import com.android.systemui.statusbar.policy.CastController;
import com.android.systemui.statusbar.policy.CastController.CastDevice;
@@ -273,10 +275,9 @@ public class CastTile extends QSTileImpl<BooleanState> {
return mWifiConnected || mHotspotConnected;
}
private final NetworkController.SignalCallback mSignalCallback =
new NetworkController.SignalCallback() {
private final SignalCallback mSignalCallback = new SignalCallback() {
@Override
public void setWifiIndicators(WifiIndicators indicators) {
public void setWifiIndicators(@NonNull WifiIndicators indicators) {
// statusIcon.visible has the connected status information
boolean enabledAndConnected = indicators.enabled
&& (indicators.qsIcon == null ? false : indicators.qsIcon.visible);

View File

@@ -18,6 +18,7 @@ package com.android.systemui.qs.tiles;
import static com.android.systemui.Prefs.Key.QS_HAS_TURNED_OFF_MOBILE_DATA;
import android.annotation.NonNull;
import android.app.AlertDialog;
import android.app.AlertDialog.Builder;
import android.content.Context;
@@ -56,10 +57,10 @@ import com.android.systemui.qs.QSHost;
import com.android.systemui.qs.SignalTileView;
import com.android.systemui.qs.logging.QSLogger;
import com.android.systemui.qs.tileimpl.QSTileImpl;
import com.android.systemui.statusbar.connectivity.IconState;
import com.android.systemui.statusbar.connectivity.MobileDataIndicators;
import com.android.systemui.statusbar.connectivity.NetworkController;
import com.android.systemui.statusbar.connectivity.NetworkController.IconState;
import com.android.systemui.statusbar.connectivity.NetworkController.MobileDataIndicators;
import com.android.systemui.statusbar.connectivity.NetworkController.SignalCallback;
import com.android.systemui.statusbar.connectivity.SignalCallback;
import com.android.systemui.statusbar.phone.SystemUIDialog;
import javax.inject.Inject;
@@ -269,7 +270,7 @@ public class CellularTile extends QSTileImpl<SignalState> {
private final CallbackInfo mInfo = new CallbackInfo();
@Override
public void setMobileDataIndicators(MobileDataIndicators indicators) {
public void setMobileDataIndicators(@NonNull MobileDataIndicators indicators) {
if (indicators.qsIcon == null) {
// Not data sim, don't display.
return;
@@ -291,7 +292,7 @@ public class CellularTile extends QSTileImpl<SignalState> {
}
@Override
public void setIsAirplaneMode(IconState icon) {
public void setIsAirplaneMode(@NonNull IconState icon) {
mInfo.airplaneModeEnabled = icon.visible;
refreshState(mInfo);
}

View File

@@ -16,6 +16,7 @@
package com.android.systemui.qs.tiles;
import android.annotation.NonNull;
import android.content.Context;
import android.content.Intent;
import android.content.pm.PackageManager;
@@ -52,13 +53,13 @@ import com.android.systemui.qs.QSHost;
import com.android.systemui.qs.logging.QSLogger;
import com.android.systemui.qs.tileimpl.QSTileImpl;
import com.android.systemui.qs.tiles.dialog.InternetDialogFactory;
import com.android.systemui.statusbar.connectivity.AccessPointController;
import com.android.systemui.statusbar.connectivity.IconState;
import com.android.systemui.statusbar.connectivity.MobileDataIndicators;
import com.android.systemui.statusbar.connectivity.NetworkController;
import com.android.systemui.statusbar.connectivity.NetworkController.AccessPointController;
import com.android.systemui.statusbar.connectivity.NetworkController.IconState;
import com.android.systemui.statusbar.connectivity.NetworkController.MobileDataIndicators;
import com.android.systemui.statusbar.connectivity.NetworkController.SignalCallback;
import com.android.systemui.statusbar.connectivity.NetworkController.WifiIndicators;
import com.android.systemui.statusbar.connectivity.SignalCallback;
import com.android.systemui.statusbar.connectivity.WifiIcons;
import com.android.systemui.statusbar.connectivity.WifiIndicators;
import java.io.FileDescriptor;
import java.io.PrintWriter;
@@ -250,7 +251,7 @@ public class InternetTile extends QSTileImpl<SignalState> {
@Override
public void setWifiIndicators(WifiIndicators indicators) {
public void setWifiIndicators(@NonNull WifiIndicators indicators) {
if (DEBUG) {
Log.d(TAG, "setWifiIndicators: " + indicators);
}
@@ -271,7 +272,7 @@ public class InternetTile extends QSTileImpl<SignalState> {
}
@Override
public void setMobileDataIndicators(MobileDataIndicators indicators) {
public void setMobileDataIndicators(@NonNull MobileDataIndicators indicators) {
if (DEBUG) {
Log.d(TAG, "setMobileDataIndicators: " + indicators);
}
@@ -293,7 +294,7 @@ public class InternetTile extends QSTileImpl<SignalState> {
}
@Override
public void setEthernetIndicators(IconState icon) {
public void setEthernetIndicators(@NonNull IconState icon) {
if (DEBUG) {
Log.d(TAG, "setEthernetIndicators: "
+ "icon = " + (icon == null ? "" : icon.toString()));

View File

@@ -16,6 +16,7 @@
package com.android.systemui.qs.tiles;
import android.annotation.NonNull;
import android.content.Context;
import android.content.Intent;
import android.content.pm.PackageManager;
@@ -52,11 +53,11 @@ import com.android.systemui.qs.QSHost;
import com.android.systemui.qs.logging.QSLogger;
import com.android.systemui.qs.tileimpl.QSIconViewImpl;
import com.android.systemui.qs.tileimpl.QSTileImpl;
import com.android.systemui.statusbar.connectivity.AccessPointController;
import com.android.systemui.statusbar.connectivity.NetworkController;
import com.android.systemui.statusbar.connectivity.NetworkController.AccessPointController;
import com.android.systemui.statusbar.connectivity.NetworkController.SignalCallback;
import com.android.systemui.statusbar.connectivity.NetworkController.WifiIndicators;
import com.android.systemui.statusbar.connectivity.SignalCallback;
import com.android.systemui.statusbar.connectivity.WifiIcons;
import com.android.systemui.statusbar.connectivity.WifiIndicators;
import com.android.wifitrackerlib.WifiEntry;
import java.util.List;
@@ -310,7 +311,7 @@ public class WifiTile extends QSTileImpl<SignalState> {
final CallbackInfo mInfo = new CallbackInfo();
@Override
public void setWifiIndicators(WifiIndicators indicators) {
public void setWifiIndicators(@NonNull WifiIndicators indicators) {
if (DEBUG) Log.d(TAG, "onWifiSignalChanged enabled=" + indicators.enabled);
if (indicators.qsIcon == null) {
return;
@@ -332,7 +333,7 @@ public class WifiTile extends QSTileImpl<SignalState> {
}
protected class WifiDetailAdapter implements DetailAdapter,
NetworkController.AccessPointController.AccessPointCallback, QSDetailItems.Callback {
AccessPointController.AccessPointCallback, QSDetailItems.Callback {
private QSDetailItems mItems;
private WifiEntry[] mAccessPoints;

View File

@@ -76,8 +76,7 @@ import com.android.systemui.broadcast.BroadcastDispatcher;
import com.android.systemui.dagger.qualifiers.Background;
import com.android.systemui.dagger.qualifiers.Main;
import com.android.systemui.plugins.ActivityStarter;
import com.android.systemui.statusbar.connectivity.NetworkController;
import com.android.systemui.statusbar.connectivity.NetworkController.AccessPointController;
import com.android.systemui.statusbar.connectivity.AccessPointController;
import com.android.systemui.statusbar.policy.KeyguardStateController;
import com.android.systemui.statusbar.policy.LocationController;
import com.android.systemui.toast.SystemUIToast;
@@ -100,7 +99,7 @@ import java.util.stream.Stream;
import javax.inject.Inject;
public class InternetDialogController implements WifiEntry.DisconnectCallback,
NetworkController.AccessPointController.AccessPointCallback {
AccessPointController.AccessPointCallback {
private static final String TAG = "InternetDialogController";
private static final String ACTION_NETWORK_PROVIDER_SETTINGS =

View File

@@ -16,6 +16,7 @@
package com.android.systemui.statusbar;
import android.annotation.NonNull;
import android.os.Bundle;
import android.telephony.ServiceState;
import android.telephony.SubscriptionInfo;
@@ -26,7 +27,9 @@ import com.android.keyguard.KeyguardUpdateMonitor;
import com.android.keyguard.KeyguardUpdateMonitorCallback;
import com.android.systemui.demomode.DemoModeCommandReceiver;
import com.android.systemui.plugins.DarkIconDispatcher;
import com.android.systemui.statusbar.connectivity.IconState;
import com.android.systemui.statusbar.connectivity.NetworkController;
import com.android.systemui.statusbar.connectivity.SignalCallback;
import com.android.systemui.tuner.TunerService;
import com.android.systemui.util.ViewController;
@@ -135,10 +138,9 @@ public class OperatorNameViewController extends ViewController<OperatorNameView>
(area, darkIntensity, tint) ->
mView.setTextColor(DarkIconDispatcher.getTint(area, mView, tint));
private final NetworkController.SignalCallback mSignalCallback =
new NetworkController.SignalCallback() {
private final SignalCallback mSignalCallback = new SignalCallback() {
@Override
public void setIsAirplaneMode(NetworkController.IconState icon) {
public void setIsAirplaneMode(@NonNull IconState icon) {
update();
}
};

View File

@@ -0,0 +1,93 @@
/*
* Copyright (C) 2021 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.connectivity
import android.content.Intent
import android.os.UserManager
import android.provider.Settings
import com.android.wifitrackerlib.MergedCarrierEntry
import com.android.wifitrackerlib.WifiEntry
/**
* Tracks changes in access points. Allows listening for changes, scanning for new APs,
* and connecting to new ones.
*/
interface AccessPointController {
fun addAccessPointCallback(callback: AccessPointCallback)
fun removeAccessPointCallback(callback: AccessPointCallback)
/**
* Request an updated list of available access points
*
* This method will trigger a call to [AccessPointCallback.onAccessPointsChanged]
*/
fun scanForAccessPoints()
/**
* Gets the current [MergedCarrierEntry]. If null, this call generates a call to
* [AccessPointCallback.onAccessPointsChanged]
*
* @return the current [MergedCarrierEntry], if one exists
*/
fun getMergedCarrierEntry(): MergedCarrierEntry?
/** @return the appropriate icon id for the given [WifiEntry]'s level */
fun getIcon(ap: WifiEntry): Int
/**
* Connects to a [WifiEntry] if it's saved or does not require security.
*
* If the entry is not saved and requires security, will trigger
* [AccessPointCallback.onSettingsActivityTriggered].
*
* @param ap
* @return `true` if [AccessPointCallback.onSettingsActivityTriggered] is triggered
*/
fun connect(ap: WifiEntry?): Boolean
/**
* `true` if the current user does not have the [UserManager.DISALLOW_CONFIG_WIFI] restriction
*/
fun canConfigWifi(): Boolean
/**
* `true` if the current user does not have the [UserManager.DISALLOW_CONFIG_MOBILE_NETWORKS]
* restriction set
*/
fun canConfigMobileData(): Boolean
interface AccessPointCallback {
/**
* Called whenever [scanForAccessPoints] is called, or [getMergedCarrierEntry] is called
* with a null entry
*
* @param accessPoints the list of available access points, including the current connected
* one if it exists
*/
fun onAccessPointsChanged(accessPoints: List<@JvmSuppressWildcards WifiEntry>)
/**
* Called whenever [connecting][connect] to an unknown access point which has security.
* Implementers should launch the intent in the appropriate context
*
* @param settingsIntent an intent for [Settings.ACTION_WIFI_SETTINGS] with
* "wifi_start_connect_ssid" set as an extra
*/
fun onSettingsActivityTriggered(settingsIntent: Intent?)
}
}

View File

@@ -56,9 +56,9 @@ import java.util.concurrent.Executor;
import javax.inject.Inject;
/** */
public class AccessPointControllerImpl
implements NetworkController.AccessPointController,
WifiPickerTracker.WifiPickerTrackerCallback, LifecycleOwner {
public class AccessPointControllerImpl implements AccessPointController,
WifiPickerTracker.WifiPickerTrackerCallback,
LifecycleOwner {
private static final String TAG = "AccessPointController";
private static final boolean DEBUG = Log.isLoggable(TAG, Log.DEBUG);
@@ -117,13 +117,11 @@ public class AccessPointControllerImpl
super.finalize();
}
/** */
public boolean canConfigWifi() {
return !mUserManager.hasUserRestriction(UserManager.DISALLOW_CONFIG_WIFI,
new UserHandle(mCurrentUser));
}
/** */
public boolean canConfigMobileData() {
return !mUserManager.hasUserRestriction(UserManager.DISALLOW_CONFIG_MOBILE_NETWORKS,
UserHandle.of(mCurrentUser)) && mUserTracker.getUserInfo().isAdmin();
@@ -156,7 +154,7 @@ public class AccessPointControllerImpl
@Override
public void scanForAccessPoints() {
if (mWifiPickerTracker == null) {
fireAcccessPointsCallback(Collections.emptyList());
fireAccessPointsCallback(Collections.emptyList());
return;
}
List<WifiEntry> entries = mWifiPickerTracker.getWifiEntries();
@@ -164,13 +162,13 @@ public class AccessPointControllerImpl
if (connectedEntry != null) {
entries.add(0, connectedEntry);
}
fireAcccessPointsCallback(entries);
fireAccessPointsCallback(entries);
}
@Override
public MergedCarrierEntry getMergedCarrierEntry() {
if (mWifiPickerTracker == null) {
fireAcccessPointsCallback(Collections.emptyList());
fireAccessPointsCallback(Collections.emptyList());
return null;
}
return mWifiPickerTracker.getMergedCarrierEntry();
@@ -190,7 +188,7 @@ public class AccessPointControllerImpl
* @param ap
* @return {@code true} if {@link AccessPointCallback#onSettingsActivityTriggered} is triggered
*/
public boolean connect(WifiEntry ap) {
public boolean connect(@Nullable WifiEntry ap) {
if (ap == null) return false;
if (DEBUG) {
if (ap.getWifiConfiguration() != null) {
@@ -222,7 +220,7 @@ public class AccessPointControllerImpl
}
}
private void fireAcccessPointsCallback(List<WifiEntry> aps) {
private void fireAccessPointsCallback(List<WifiEntry> aps) {
for (AccessPointCallback callback : mCallbacks) {
callback.onAccessPointsChanged(aps);
}

View File

@@ -23,10 +23,6 @@ import android.telephony.SubscriptionInfo;
import com.android.internal.annotations.VisibleForTesting;
import com.android.systemui.dagger.qualifiers.Main;
import com.android.systemui.statusbar.connectivity.NetworkController.EmergencyListener;
import com.android.systemui.statusbar.connectivity.NetworkController.IconState;
import com.android.systemui.statusbar.connectivity.NetworkController.MobileDataIndicators;
import com.android.systemui.statusbar.connectivity.NetworkController.SignalCallback;
import com.android.systemui.statusbar.connectivity.NetworkController.WifiIndicators;
import java.io.PrintWriter;
import java.text.SimpleDateFormat;

View File

@@ -0,0 +1,104 @@
/*
* Copyright (C) 2021 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.connectivity
import android.annotation.SuppressLint
import com.android.settingslib.SignalIcon.IconGroup
import java.text.SimpleDateFormat
/**
* Base type for various connectivity states, for use with [SignalController] and its subtypes
*/
open class ConnectivityState {
@JvmField var connected = false
@JvmField var enabled = false
@JvmField var activityIn = false
@JvmField var activityOut = false
@JvmField var level = 0
@JvmField var iconGroup: IconGroup? = null
@JvmField var inetCondition = 0
// Only for logging.
@JvmField var rssi = 0
// Not used for comparison, just used for logging.
@JvmField var time: Long = 0
override fun toString(): String {
return if (time != 0L) {
val builder = StringBuilder()
toString(builder)
builder.toString()
} else {
"Empty " + javaClass.simpleName
}
}
protected open fun copyFrom(other: ConnectivityState) {
connected = other.connected
enabled = other.enabled
activityIn = other.activityIn
activityOut = other.activityOut
level = other.level
iconGroup = other.iconGroup
inetCondition = other.inetCondition
rssi = other.rssi
time = other.time
}
protected open fun toString(builder: StringBuilder) {
builder.append("connected=$connected,")
.append("enabled=$enabled,")
.append("level=$level,")
.append("inetCondition=$inetCondition,")
.append("iconGroup=$iconGroup,")
.append("activityIn=$activityIn,")
.append("activityOut=$activityOut,")
.append("rssi=$rssi,")
.append("lastModified=${sSDF.format(time)}")
}
override fun equals(other: Any?): Boolean {
if (other == null) return false
if (other.javaClass != javaClass) return false
val o = other as ConnectivityState
return o.connected == connected &&
o.enabled == enabled &&
o.level == level &&
o.inetCondition == inetCondition &&
o.iconGroup === iconGroup &&
o.activityIn == activityIn &&
o.activityOut == activityOut &&
o.rssi == rssi
}
override fun hashCode(): Int {
var result = connected.hashCode()
result = 31 * result + enabled.hashCode()
result = 31 * result + activityIn.hashCode()
result = 31 * result + activityOut.hashCode()
result = 31 * result + level
result = 31 * result + (iconGroup?.hashCode() ?: 0)
result = 31 * result + inetCondition
result = 31 * result + rssi
result = 31 * result + time.hashCode()
return result
}
}
// No locale as it's only used for logging purposes
@SuppressLint("SimpleDateFormat")
private val sSDF = SimpleDateFormat("MM-dd HH:mm:ss.SSS")

View File

@@ -20,15 +20,12 @@ import android.net.NetworkCapabilities;
import com.android.settingslib.AccessibilityContentDescriptions;
import com.android.settingslib.SignalIcon.IconGroup;
import com.android.settingslib.SignalIcon.State;
import com.android.systemui.statusbar.connectivity.NetworkController.IconState;
import com.android.systemui.statusbar.connectivity.NetworkController.SignalCallback;
import java.util.BitSet;
/** */
public class EthernetSignalController extends
SignalController<State, IconGroup> {
SignalController<ConnectivityState, IconGroup> {
public EthernetSignalController(Context context,
CallbackHandler callbackHandler, NetworkControllerImpl networkController) {
@@ -68,7 +65,7 @@ public class EthernetSignalController extends
}
@Override
public State cleanState() {
return new State();
public ConnectivityState cleanState() {
return new ConnectivityState();
}
}

View File

@@ -33,7 +33,6 @@ import android.telephony.ServiceState;
import android.telephony.SignalStrength;
import android.telephony.SubscriptionInfo;
import android.telephony.SubscriptionManager;
import android.telephony.TelephonyDisplayInfo;
import android.telephony.TelephonyManager;
import android.telephony.ims.ImsException;
import android.telephony.ims.ImsMmTelManager;
@@ -47,8 +46,6 @@ import android.util.Log;
import com.android.internal.annotations.VisibleForTesting;
import com.android.settingslib.AccessibilityContentDescriptions;
import com.android.settingslib.SignalIcon.MobileIconGroup;
import com.android.settingslib.SignalIcon.MobileState;
import com.android.settingslib.Utils;
import com.android.settingslib.graph.SignalDrawable;
import com.android.settingslib.mobile.MobileMappings.Config;
import com.android.settingslib.mobile.MobileStatusTracker;
@@ -58,9 +55,6 @@ import com.android.settingslib.mobile.TelephonyIcons;
import com.android.settingslib.net.SignalStrengthUtil;
import com.android.systemui.R;
import com.android.systemui.flags.FeatureFlags;
import com.android.systemui.statusbar.connectivity.NetworkController.IconState;
import com.android.systemui.statusbar.connectivity.NetworkController.MobileDataIndicators;
import com.android.systemui.statusbar.connectivity.NetworkController.SignalCallback;
import com.android.systemui.util.CarrierConfigTracker;
import java.io.PrintWriter;
@@ -93,15 +87,6 @@ public class MobileSignalController extends SignalController<MobileState, Mobile
final SubscriptionInfo mSubscriptionInfo;
private Map<String, MobileIconGroup> mNetworkToIconLookup;
// Since some pieces of the phone state are interdependent we store it locally,
// this could potentially become part of MobileState for simplification/complication
// of code.
private int mDataState = TelephonyManager.DATA_DISCONNECTED;
private TelephonyDisplayInfo mTelephonyDisplayInfo =
new TelephonyDisplayInfo(TelephonyManager.NETWORK_TYPE_UNKNOWN,
TelephonyDisplayInfo.OVERRIDE_NETWORK_TYPE_NONE);
private ServiceState mServiceState;
private SignalStrength mSignalStrength;
private int mLastLevel;
private MobileIconGroup mDefaultIcons;
private Config mConfig;
@@ -468,16 +453,8 @@ public class MobileSignalController extends SignalController<MobileState, Mobile
return new MobileState();
}
private boolean isCdma() {
return (mSignalStrength != null) && !mSignalStrength.isGsm();
}
public boolean isEmergencyOnly() {
return (mServiceState != null && mServiceState.isEmergencyOnly());
}
public boolean isInService() {
return Utils.isInService(mServiceState);
return mCurrentState.isInService();
}
String getNetworkNameForCarrierWiFi() {
@@ -485,15 +462,15 @@ public class MobileSignalController extends SignalController<MobileState, Mobile
}
private boolean isRoaming() {
// During a carrier change, roaming indications need to be supressed.
// During a carrier change, roaming indications need to be suppressed.
if (isCarrierNetworkChangeActive()) {
return false;
}
if (isCdma()) {
if (mCurrentState.isCdma()) {
return mPhone.getCdmaEnhancedRoamingIndicatorDisplayNumber()
!= TelephonyManager.ERI_OFF;
} else {
return mServiceState != null && mServiceState.getRoaming();
return mCurrentState.isRoaming();
}
}
@@ -585,27 +562,29 @@ public class MobileSignalController extends SignalController<MobileState, Mobile
}
private void updateMobileStatus(MobileStatus mobileStatus) {
mCurrentState.activityIn = mobileStatus.activityIn;
mCurrentState.activityOut = mobileStatus.activityOut;
mCurrentState.dataSim = mobileStatus.dataSim;
mCurrentState.carrierNetworkChangeMode = mobileStatus.carrierNetworkChangeMode;
mDataState = mobileStatus.dataState;
int lastVoiceState = mCurrentState.getVoiceServiceState();
mCurrentState.setFromMobileStatus(mobileStatus);
notifyMobileLevelChangeIfNecessary(mobileStatus.signalStrength);
mSignalStrength = mobileStatus.signalStrength;
mTelephonyDisplayInfo = mobileStatus.telephonyDisplayInfo;
int lastVoiceState = mServiceState != null ? mServiceState.getState() : -1;
mServiceState = mobileStatus.serviceState;
int currentVoiceState = mServiceState != null ? mServiceState.getState() : -1;
if (mProviderModelBehavior) {
maybeNotifyCallStateChanged(lastVoiceState);
}
}
/** Call state changed is only applicable when provider model behavior is true */
private void maybeNotifyCallStateChanged(int lastVoiceState) {
int currentVoiceState = mCurrentState.getVoiceServiceState();
if (lastVoiceState == currentVoiceState) {
return;
}
// Only update the no calling Status in the below scenarios
// 1. The first valid voice state has been received
// 2. The voice state has been changed and either the last or current state is
// ServiceState.STATE_IN_SERVICE
if (mProviderModelBehavior
&& lastVoiceState != currentVoiceState
&& (lastVoiceState == -1
|| (lastVoiceState == ServiceState.STATE_IN_SERVICE
|| currentVoiceState == ServiceState.STATE_IN_SERVICE))) {
boolean isNoCalling = currentVoiceState != ServiceState.STATE_IN_SERVICE;
if (lastVoiceState == -1
|| (lastVoiceState == ServiceState.STATE_IN_SERVICE
|| currentVoiceState == ServiceState.STATE_IN_SERVICE)) {
boolean isNoCalling = mCurrentState.isNoCalling();
isNoCalling &= !hideNoCalling();
IconState statusIcon = new IconState(isNoCalling,
R.drawable.ic_qs_no_calling_sms,
@@ -615,7 +594,7 @@ public class MobileSignalController extends SignalController<MobileState, Mobile
}
void updateNoCallingState() {
int currentVoiceState = mServiceState != null ? mServiceState.getState() : -1;
int currentVoiceState = mCurrentState.getVoiceServiceState();
boolean isNoCalling = currentVoiceState != ServiceState.STATE_IN_SERVICE;
isNoCalling &= !hideNoCalling();
IconState statusIcon = new IconState(isNoCalling,
@@ -643,8 +622,7 @@ public class MobileSignalController extends SignalController<MobileState, Mobile
}
void refreshCallIndicator(SignalCallback callback) {
boolean isNoCalling = mServiceState != null
&& mServiceState.getState() != ServiceState.STATE_IN_SERVICE;
boolean isNoCalling = mCurrentState.isNoCalling();
isNoCalling &= !hideNoCalling();
IconState statusIcon = new IconState(isNoCalling,
R.drawable.ic_qs_no_calling_sms,
@@ -736,30 +714,30 @@ public class MobileSignalController extends SignalController<MobileState, Mobile
}
/**
* Updates the current state based on mServiceState, mSignalStrength, mDataState,
* mTelephonyDisplayInfo, and mSimState. It should be called any time one of these is updated.
* Updates the current state based on ServiceState, SignalStrength, DataState,
* TelephonyDisplayInfo, and sim state. It should be called any time one of these is updated.
* This will call listeners if necessary.
*/
private void updateTelephony() {
if (Log.isLoggable(mTag, Log.DEBUG)) {
Log.d(mTag, "updateTelephonySignalStrength: hasService="
+ Utils.isInService(mServiceState) + " ss=" + mSignalStrength
+ " displayInfo=" + mTelephonyDisplayInfo);
+ mCurrentState.isInService()
+ " ss=" + mCurrentState.signalStrength
+ " displayInfo=" + mCurrentState.telephonyDisplayInfo);
}
checkDefaultData();
mCurrentState.connected = Utils.isInService(mServiceState) && mSignalStrength != null;
mCurrentState.connected = mCurrentState.isInService();
if (mCurrentState.connected) {
mCurrentState.level = getSignalLevel(mSignalStrength);
mCurrentState.level = getSignalLevel(mCurrentState.signalStrength);
}
String iconKey = getIconKey(mTelephonyDisplayInfo);
String iconKey = getIconKey(mCurrentState.telephonyDisplayInfo);
if (mNetworkToIconLookup.get(iconKey) != null) {
mCurrentState.iconGroup = mNetworkToIconLookup.get(iconKey);
} else {
mCurrentState.iconGroup = mDefaultIcons;
}
mCurrentState.dataConnected = mCurrentState.connected
&& mDataState == TelephonyManager.DATA_CONNECTED;
mCurrentState.dataConnected = mCurrentState.isDataConnected();
mCurrentState.roaming = isRoaming();
if (isCarrierNetworkChangeActive()) {
@@ -771,20 +749,20 @@ public class MobileSignalController extends SignalController<MobileState, Mobile
mCurrentState.iconGroup = TelephonyIcons.DATA_DISABLED;
}
}
if (isEmergencyOnly() != mCurrentState.isEmergency) {
mCurrentState.isEmergency = isEmergencyOnly();
if (mCurrentState.isEmergencyOnly() != mCurrentState.isEmergency) {
mCurrentState.isEmergency = mCurrentState.isEmergencyOnly();
mNetworkController.recalculateEmergency();
}
// Fill in the network name if we think we have it.
if (mCurrentState.networkName.equals(mNetworkNameDefault) && mServiceState != null
&& !TextUtils.isEmpty(mServiceState.getOperatorAlphaShort())) {
mCurrentState.networkName = mServiceState.getOperatorAlphaShort();
if (mCurrentState.networkName.equals(mNetworkNameDefault)
&& !TextUtils.isEmpty(mCurrentState.getOperatorAlphaShort())) {
mCurrentState.networkName = mCurrentState.getOperatorAlphaShort();
}
// If this is the data subscription, update the currentState data name
if (mCurrentState.networkNameData.equals(mNetworkNameDefault) && mServiceState != null
if (mCurrentState.networkNameData.equals(mNetworkNameDefault)
&& mCurrentState.dataSim
&& !TextUtils.isEmpty(mServiceState.getOperatorAlphaShort())) {
mCurrentState.networkNameData = mServiceState.getOperatorAlphaShort();
&& !TextUtils.isEmpty(mCurrentState.getOperatorAlphaShort())) {
mCurrentState.networkNameData = mCurrentState.getOperatorAlphaShort();
}
notifyListenersIfNecessary();
@@ -836,10 +814,6 @@ public class MobileSignalController extends SignalController<MobileState, Mobile
pw.println(" mSubscription=" + mSubscriptionInfo + ",");
pw.println(" mProviderModelSetting=" + mProviderModelSetting + ",");
pw.println(" mProviderModelBehavior=" + mProviderModelBehavior + ",");
pw.println(" mServiceState=" + mServiceState + ",");
pw.println(" mSignalStrength=" + mSignalStrength + ",");
pw.println(" mTelephonyDisplayInfo=" + mTelephonyDisplayInfo + ",");
pw.println(" mDataState=" + mDataState + ",");
pw.println(" mInflateSignalStrengths=" + mInflateSignalStrengths + ",");
pw.println(" isDataDisabled=" + isDataDisabled() + ",");
pw.println(" mNetworkToIconLookup=" + mNetworkToIconLookup + ",");
@@ -884,5 +858,4 @@ public class MobileSignalController extends SignalController<MobileState, Mobile
icon = iconState;
}
}
}

View File

@@ -0,0 +1,225 @@
/*
* Copyright (C) 2021 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.connectivity
import android.telephony.ServiceState
import android.telephony.SignalStrength
import android.telephony.TelephonyDisplayInfo
import android.telephony.TelephonyManager
import com.android.settingslib.Utils
import com.android.settingslib.mobile.MobileStatusTracker.MobileStatus
import com.android.settingslib.mobile.TelephonyIcons
import java.lang.IllegalArgumentException
/**
* Box for all policy-related state used in [MobileSignalController]
*/
internal class MobileState(
@JvmField var networkName: String? = null,
@JvmField var networkNameData: String? = null,
@JvmField var dataSim: Boolean = false,
@JvmField var dataConnected: Boolean = false,
@JvmField var isEmergency: Boolean = false,
@JvmField var airplaneMode: Boolean = false,
@JvmField var carrierNetworkChangeMode: Boolean = false,
@JvmField var isDefault: Boolean = false,
@JvmField var userSetup: Boolean = false,
@JvmField var roaming: Boolean = false,
@JvmField var dataState: Int = TelephonyManager.DATA_DISCONNECTED,
// Tracks the on/off state of the defaultDataSubscription
@JvmField var defaultDataOff: Boolean = false
) : ConnectivityState() {
@JvmField var telephonyDisplayInfo = TelephonyDisplayInfo(TelephonyManager.NETWORK_TYPE_UNKNOWN,
TelephonyDisplayInfo.OVERRIDE_NETWORK_TYPE_NONE)
@JvmField var serviceState: ServiceState? = null
@JvmField var signalStrength: SignalStrength? = null
/** @return true if this state is disabled or not default data */
val isDataDisabledOrNotDefault: Boolean
get() = (iconGroup === TelephonyIcons.DATA_DISABLED ||
iconGroup === TelephonyIcons.NOT_DEFAULT_DATA) && userSetup
/** @return if this state is considered to have inbound activity */
fun hasActivityIn(): Boolean {
return dataConnected && !carrierNetworkChangeMode && activityIn
}
/** @return if this state is considered to have outbound activity */
fun hasActivityOut(): Boolean {
return dataConnected && !carrierNetworkChangeMode && activityOut
}
/** @return true if this state should show a RAT icon in quick settings */
fun showQuickSettingsRatIcon(): Boolean {
return dataConnected || isDataDisabledOrNotDefault
}
override fun copyFrom(other: ConnectivityState) {
val o = other as? MobileState ?: throw IllegalArgumentException(
"MobileState can only update from another MobileState")
super.copyFrom(o)
networkName = o.networkName
networkNameData = o.networkNameData
dataSim = o.dataSim
dataConnected = o.dataConnected
isEmergency = o.isEmergency
airplaneMode = o.airplaneMode
carrierNetworkChangeMode = o.carrierNetworkChangeMode
isDefault = o.isDefault
userSetup = o.userSetup
roaming = o.roaming
dataState = o.dataState
defaultDataOff = o.defaultDataOff
telephonyDisplayInfo = o.telephonyDisplayInfo
serviceState = o.serviceState
signalStrength = o.signalStrength
}
fun isDataConnected(): Boolean {
return connected && dataState == TelephonyManager.DATA_CONNECTED
}
/** @return the current voice service state, or -1 if null */
fun getVoiceServiceState(): Int {
return serviceState?.state ?: -1
}
fun isNoCalling(): Boolean {
return serviceState?.state != ServiceState.STATE_IN_SERVICE
}
fun getOperatorAlphaShort(): String {
return serviceState?.operatorAlphaShort ?: ""
}
fun isCdma(): Boolean {
return signalStrength != null && !signalStrength!!.isGsm
}
fun isEmergencyOnly(): Boolean {
return serviceState != null && serviceState!!.isEmergencyOnly
}
fun isInService(): Boolean {
return Utils.isInService(serviceState)
}
fun isRoaming(): Boolean {
return serviceState != null && serviceState!!.roaming
}
fun setFromMobileStatus(mobileStatus: MobileStatus) {
activityIn = mobileStatus.activityIn
activityOut = mobileStatus.activityOut
dataSim = mobileStatus.dataSim
carrierNetworkChangeMode = mobileStatus.carrierNetworkChangeMode
dataState = mobileStatus.dataState
signalStrength = mobileStatus.signalStrength
telephonyDisplayInfo = mobileStatus.telephonyDisplayInfo
serviceState = mobileStatus.serviceState
}
override fun toString(builder: StringBuilder) {
super.toString(builder)
builder.append(',')
builder.append("dataSim=$dataSim,")
builder.append("networkName=$networkName,")
builder.append("networkNameData=$networkNameData,")
builder.append("dataConnected=$dataConnected,")
builder.append("roaming=$roaming,")
builder.append("isDefault=$isDefault,")
builder.append("isEmergency=$isEmergency,")
builder.append("airplaneMode=$airplaneMode,")
builder.append("carrierNetworkChangeMode=$carrierNetworkChangeMode,")
builder.append("userSetup=$userSetup,")
builder.append("dataState=$dataState,")
builder.append("defaultDataOff=$defaultDataOff,")
// Computed properties
builder.append("showQuickSettingsRatIcon=${showQuickSettingsRatIcon()},")
builder.append("voiceServiceState=${getVoiceServiceState()},")
builder.append("isInService=${isInService()},")
builder.append("serviceState=${serviceState?.minLog() ?: "(null)"},")
builder.append("signalStrength=${signalStrength?.minLog() ?: "(null)"},")
builder.append("displayInfo=$telephonyDisplayInfo")
}
override fun equals(other: Any?): Boolean {
if (this === other) return true
if (javaClass != other?.javaClass) return false
if (!super.equals(other)) return false
other as MobileState
if (networkName != other.networkName) return false
if (networkNameData != other.networkNameData) return false
if (dataSim != other.dataSim) return false
if (dataConnected != other.dataConnected) return false
if (isEmergency != other.isEmergency) return false
if (airplaneMode != other.airplaneMode) return false
if (carrierNetworkChangeMode != other.carrierNetworkChangeMode) return false
if (isDefault != other.isDefault) return false
if (userSetup != other.userSetup) return false
if (roaming != other.roaming) return false
if (dataState != other.dataState) return false
if (defaultDataOff != other.defaultDataOff) return false
if (telephonyDisplayInfo != other.telephonyDisplayInfo) return false
if (serviceState != other.serviceState) return false
if (signalStrength != other.signalStrength) return false
return true
}
override fun hashCode(): Int {
var result = super.hashCode()
result = 31 * result + (networkName?.hashCode() ?: 0)
result = 31 * result + (networkNameData?.hashCode() ?: 0)
result = 31 * result + dataSim.hashCode()
result = 31 * result + dataConnected.hashCode()
result = 31 * result + isEmergency.hashCode()
result = 31 * result + airplaneMode.hashCode()
result = 31 * result + carrierNetworkChangeMode.hashCode()
result = 31 * result + isDefault.hashCode()
result = 31 * result + userSetup.hashCode()
result = 31 * result + roaming.hashCode()
result = 31 * result + dataState
result = 31 * result + defaultDataOff.hashCode()
result = 31 * result + telephonyDisplayInfo.hashCode()
result = 31 * result + (serviceState?.hashCode() ?: 0)
result = 31 * result + (signalStrength?.hashCode() ?: 0)
return result
}
}
/** toString() is a little more verbose than we need. Just log the fields we read */
private fun ServiceState.minLog(): String {
return "serviceState={" +
"state=$state," +
"isEmergencyOnly=$isEmergencyOnly," +
"roaming=$roaming," +
"operatorNameAlphaShort=$operatorAlphaShort}"
}
private fun SignalStrength.minLog(): String {
return "signalStrength={" +
"isGsm=$isGsm," +
"level=$level}"
}

View File

@@ -16,19 +16,10 @@
package com.android.systemui.statusbar.connectivity;
import android.content.Context;
import android.content.Intent;
import android.telephony.SubscriptionInfo;
import com.android.settingslib.net.DataUsageController;
import com.android.systemui.demomode.DemoMode;
import com.android.systemui.statusbar.connectivity.NetworkController.SignalCallback;
import com.android.systemui.statusbar.policy.CallbackController;
import com.android.systemui.statusbar.policy.DataSaverController;
import com.android.wifitrackerlib.MergedCarrierEntry;
import com.android.wifitrackerlib.WifiEntry;
import java.util.List;
/** */
public interface NetworkController extends CallbackController<SignalCallback>, DemoMode {
@@ -62,197 +53,8 @@ public interface NetworkController extends CallbackController<SignalCallback>, D
/** */
boolean isRadioOn();
/**
* Wrapper class for all the WiFi signals used for WiFi indicators.
*/
final class WifiIndicators {
public boolean enabled;
public IconState statusIcon;
public IconState qsIcon;
public boolean activityIn;
public boolean activityOut;
public String description;
public boolean isTransient;
public String statusLabel;
public WifiIndicators(boolean enabled, IconState statusIcon, IconState qsIcon,
boolean activityIn, boolean activityOut, String description,
boolean isTransient, String statusLabel) {
this.enabled = enabled;
this.statusIcon = statusIcon;
this.qsIcon = qsIcon;
this.activityIn = activityIn;
this.activityOut = activityOut;
this.description = description;
this.isTransient = isTransient;
this.statusLabel = statusLabel;
}
@Override
public String toString() {
return new StringBuilder("WifiIndicators[")
.append("enabled=").append(enabled)
.append(",statusIcon=").append(statusIcon == null ? "" : statusIcon.toString())
.append(",qsIcon=").append(qsIcon == null ? "" : qsIcon.toString())
.append(",activityIn=").append(activityIn)
.append(",activityOut=").append(activityOut)
.append(",qsDescription=").append(description)
.append(",isTransient=").append(isTransient)
.append(",statusLabel=").append(statusLabel)
.append(']').toString();
}
}
/**
* Wrapper class for all the mobile signals used for mobile data indicators.
*/
final class MobileDataIndicators {
public IconState statusIcon;
public IconState qsIcon;
public int statusType;
public int qsType;
public boolean activityIn;
public boolean activityOut;
public CharSequence typeContentDescription;
public CharSequence typeContentDescriptionHtml;
public CharSequence qsDescription;
public int subId;
public boolean roaming;
public boolean showTriangle;
public MobileDataIndicators(IconState statusIcon, IconState qsIcon, int statusType,
int qsType, boolean activityIn, boolean activityOut,
CharSequence typeContentDescription, CharSequence typeContentDescriptionHtml,
CharSequence qsDescription, int subId, boolean roaming,
boolean showTriangle) {
this.statusIcon = statusIcon;
this.qsIcon = qsIcon;
this.statusType = statusType;
this.qsType = qsType;
this.activityIn = activityIn;
this.activityOut = activityOut;
this.typeContentDescription = typeContentDescription;
this.typeContentDescriptionHtml = typeContentDescriptionHtml;
this.qsDescription = qsDescription;
this.subId = subId;
this.roaming = roaming;
this.showTriangle = showTriangle;
}
@Override
public String toString() {
return new StringBuilder("MobileDataIndicators[")
.append("statusIcon=").append(statusIcon == null ? "" : statusIcon.toString())
.append(",qsIcon=").append(qsIcon == null ? "" : qsIcon.toString())
.append(",statusType=").append(statusType)
.append(",qsType=").append(qsType)
.append(",activityIn=").append(activityIn)
.append(",activityOut=").append(activityOut)
.append(",typeContentDescription=").append(typeContentDescription)
.append(",typeContentDescriptionHtml=").append(typeContentDescriptionHtml)
.append(",description=").append(qsDescription)
.append(",subId=").append(subId)
.append(",roaming=").append(roaming)
.append(",showTriangle=").append(showTriangle)
.append(']').toString();
}
}
/** */
interface SignalCallback {
/**
* Callback for listeners to be able to update the state of any UI tracking connectivity of
* WiFi networks.
*/
default void setWifiIndicators(WifiIndicators wifiIndicators) {}
/**
* Callback for listeners to be able to update the state of any UI tracking connectivity
* of Mobile networks.
*/
default void setMobileDataIndicators(MobileDataIndicators mobileDataIndicators) {}
/** */
default void setSubs(List<SubscriptionInfo> subs) {}
/** */
default void setNoSims(boolean show, boolean simDetected) {}
/** */
default void setEthernetIndicators(IconState icon) {}
/** */
default void setIsAirplaneMode(IconState icon) {}
/** */
default void setMobileDataEnabled(boolean enabled) {}
/**
* Callback for listeners to be able to update the connectivity status
* @param noDefaultNetwork whether there is any default network.
* @param noValidatedNetwork whether there is any validated network.
* @param noNetworksAvailable whether there is any WiFi networks available.
*/
default void setConnectivityStatus(boolean noDefaultNetwork, boolean noValidatedNetwork,
boolean noNetworksAvailable) {}
/**
* Callback for listeners to be able to update the call indicator
* @param statusIcon the icon for the call indicator
* @param subId subscription ID for which to update the UI
*/
default void setCallIndicator(IconState statusIcon, int subId) {}
}
/** */
interface EmergencyListener {
void setEmergencyCallsOnly(boolean emergencyOnly);
}
/** */
class IconState {
public final boolean visible;
public final int icon;
public final String contentDescription;
public IconState(boolean visible, int icon, String contentDescription) {
this.visible = visible;
this.icon = icon;
this.contentDescription = contentDescription;
}
public IconState(boolean visible, int icon, int contentDescription,
Context context) {
this(visible, icon, context.getString(contentDescription));
}
@Override
public String toString() {
StringBuilder builder = new StringBuilder();
return builder.append("[visible=").append(visible).append(',')
.append("icon=").append(icon).append(',')
.append("contentDescription=").append(contentDescription).append(']')
.toString();
}
}
/**
* Tracks changes in access points. Allows listening for changes, scanning for new APs,
* and connecting to new ones.
*/
interface AccessPointController {
void addAccessPointCallback(AccessPointCallback callback);
void removeAccessPointCallback(AccessPointCallback callback);
void scanForAccessPoints();
MergedCarrierEntry getMergedCarrierEntry();
int getIcon(WifiEntry ap);
boolean connect(WifiEntry ap);
boolean canConfigWifi();
boolean canConfigMobileData();
interface AccessPointCallback {
void onAccessPointsChanged(List<WifiEntry> accessPoints);
void onSettingsActivityTriggered(Intent settingsIntent);
}
}
}

View File

@@ -721,8 +721,11 @@ public class NetworkControllerImpl extends BroadcastReceiver
@Override
public void addCallback(@NonNull SignalCallback cb) {
cb.setSubs(mCurrentSubscriptions);
cb.setIsAirplaneMode(new IconState(mAirplaneMode,
TelephonyIcons.FLIGHT_MODE_ICON, R.string.accessibility_airplane_mode, mContext));
cb.setIsAirplaneMode(
new IconState(
mAirplaneMode,
TelephonyIcons.FLIGHT_MODE_ICON,
mContext.getString(R.string.accessibility_airplane_mode)));
cb.setNoSims(mHasNoSubs, mSimDetected);
if (mProviderModelSetting) {
cb.setConnectivityStatus(mNoDefaultNetwork, !mInetCondition, mNoNetworksAvailable);
@@ -1056,8 +1059,11 @@ public class NetworkControllerImpl extends BroadcastReceiver
* notifyAllListeners.
*/
private void notifyListeners() {
mCallbackHandler.setIsAirplaneMode(new IconState(mAirplaneMode,
TelephonyIcons.FLIGHT_MODE_ICON, R.string.accessibility_airplane_mode, mContext));
mCallbackHandler.setIsAirplaneMode(
new IconState(
mAirplaneMode,
TelephonyIcons.FLIGHT_MODE_ICON,
mContext.getString(R.string.accessibility_airplane_mode)));
mCallbackHandler.setNoSims(mHasNoSubs, mSimDetected);
}
@@ -1206,7 +1212,7 @@ public class NetworkControllerImpl extends BroadcastReceiver
}
private boolean mDemoInetCondition;
private WifiSignalController.WifiState mDemoWifiState;
private WifiState mDemoWifiState;
@Override
public void onDemoModeStarted() {
@@ -1241,9 +1247,11 @@ public class NetworkControllerImpl extends BroadcastReceiver
String airplane = args.getString("airplane");
if (airplane != null) {
boolean show = airplane.equals("show");
mCallbackHandler.setIsAirplaneMode(new IconState(show,
TelephonyIcons.FLIGHT_MODE_ICON, R.string.accessibility_airplane_mode,
mContext));
mCallbackHandler.setIsAirplaneMode(
new IconState(
show,
TelephonyIcons.FLIGHT_MODE_ICON,
mContext.getString(R.string.accessibility_airplane_mode)));
}
String fully = args.getString("fully");
if (fully != null) {

View File

@@ -0,0 +1,187 @@
/*
* Copyright (C) 2021 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.connectivity
import android.telephony.SubscriptionInfo
/**
* SignalCallback contains all of the connectivity updates from [NetworkController]. Implement this
* interface to be able to draw iconography for Wi-Fi, mobile data, ethernet, call strength
* indicators, etc.
*/
interface SignalCallback {
/**
* Called when the Wi-Fi iconography has been updated. Implement this method to draw Wi-Fi icons
*
* @param wifiIndicators a box type containing enough information to properly draw a Wi-Fi icon
*/
@JvmDefault
fun setWifiIndicators(wifiIndicators: WifiIndicators) {}
/**
* Called when the mobile iconography has been updated. Implement this method to draw mobile
* indicators
*
* @param mobileDataIndicators a box type containing enough information to properly draw
* mobile data icons
*
* NOTE: phones can have multiple subscriptions, so this [mobileDataIndicators] object should be
* indexed based on its [subId][MobileDataIndicators.subId]
*/
@JvmDefault
fun setMobileDataIndicators(mobileDataIndicators: MobileDataIndicators) {}
/**
* Called when the list of mobile data subscriptions has changed. Use this method as a chance
* to remove views that are no longer needed, or to make room for new icons to come in
*
* @param subs a [SubscriptionInfo] for each subscription that we know about
*/
@JvmDefault
fun setSubs(subs: List<@JvmSuppressWildcards SubscriptionInfo>) {}
/**
* Called when:
* 1. The number of [MobileSignalController]s goes to 0 while mobile data is enabled
* OR
* 2. The presence of any SIM changes
*
* @param show whether or not to show a "no sim" view
* @param simDetected whether any SIM is detected or not
*/
@JvmDefault
fun setNoSims(show: Boolean, simDetected: Boolean) {}
/**
* Called when there is any update to the ethernet iconography. Implement this method to set an
* ethernet icon
*
* @param icon an [IconState] for the current ethernet status
*/
@JvmDefault
fun setEthernetIndicators(icon: IconState) {}
/**
* Called whenever airplane mode changes
*
* @param icon an [IconState] for the current airplane mode status
*/
@JvmDefault
fun setIsAirplaneMode(icon: IconState) {}
/**
* Called whenever the mobile data feature enabled state changes
*
* @param enabled the current mobile data feature ennabled state
*/
@JvmDefault
fun setMobileDataEnabled(enabled: Boolean) {}
/**
* Callback for listeners to be able to update the connectivity status
* @param noDefaultNetwork whether there is any default network.
* @param noValidatedNetwork whether there is any validated network.
* @param noNetworksAvailable whether there is any WiFi networks available.
*/
@JvmDefault
fun setConnectivityStatus(
noDefaultNetwork: Boolean,
noValidatedNetwork: Boolean,
noNetworksAvailable: Boolean
) { }
/**
* Callback for listeners to be able to update the call indicator
* @param statusIcon the icon for the call indicator
* @param subId subscription ID for which to update the UI
*/
@JvmDefault
fun setCallIndicator(statusIcon: IconState, subId: Int) {}
}
/** Box type for [SignalCallback.setWifiIndicators] */
data class WifiIndicators(
@JvmField val enabled: Boolean,
@JvmField val statusIcon: IconState?,
@JvmField val qsIcon: IconState?,
@JvmField val activityIn: Boolean,
@JvmField val activityOut: Boolean,
@JvmField val description: String?,
@JvmField val isTransient: Boolean,
@JvmField val statusLabel: String?
) {
override fun toString(): String {
return StringBuilder("WifiIndicators[")
.append("enabled=").append(enabled)
.append(",statusIcon=").append(statusIcon?.toString() ?: "")
.append(",qsIcon=").append(qsIcon?.toString() ?: "")
.append(",activityIn=").append(activityIn)
.append(",activityOut=").append(activityOut)
.append(",qsDescription=").append(description)
.append(",isTransient=").append(isTransient)
.append(",statusLabel=").append(statusLabel)
.append(']').toString()
}
}
/** Box type for [SignalCallback.setMobileDataIndicators] */
data class MobileDataIndicators(
@JvmField val statusIcon: IconState?,
@JvmField val qsIcon: IconState?,
@JvmField val statusType: Int,
@JvmField val qsType: Int,
@JvmField val activityIn: Boolean,
@JvmField val activityOut: Boolean,
@JvmField val typeContentDescription: CharSequence?,
@JvmField val typeContentDescriptionHtml: CharSequence?,
@JvmField val qsDescription: CharSequence?,
@JvmField val subId: Int,
@JvmField val roaming: Boolean,
@JvmField val showTriangle: Boolean
) {
override fun toString(): String {
return java.lang.StringBuilder("MobileDataIndicators[")
.append("statusIcon=").append(statusIcon?.toString() ?: "")
.append(",qsIcon=").append(qsIcon?.toString() ?: "")
.append(",statusType=").append(statusType)
.append(",qsType=").append(qsType)
.append(",activityIn=").append(activityIn)
.append(",activityOut=").append(activityOut)
.append(",typeContentDescription=").append(typeContentDescription)
.append(",typeContentDescriptionHtml=").append(typeContentDescriptionHtml)
.append(",description=").append(qsDescription)
.append(",subId=").append(subId)
.append(",roaming=").append(roaming)
.append(",showTriangle=").append(showTriangle)
.append(']').toString()
}
}
/** Box for an icon with its visibility and content description */
data class IconState(
@JvmField val visible: Boolean,
@JvmField val icon: Int,
@JvmField val contentDescription: String
) {
override fun toString(): String {
val builder = java.lang.StringBuilder()
return builder.append("[visible=").append(visible).append(',')
.append("icon=").append(icon).append(',')
.append("contentDescription=").append(contentDescription).append(']')
.toString()
}
}

View File

@@ -22,9 +22,6 @@ import android.content.Context;
import android.util.Log;
import com.android.settingslib.SignalIcon.IconGroup;
import com.android.settingslib.SignalIcon.State;
import com.android.systemui.statusbar.connectivity.NetworkController.IconState;
import com.android.systemui.statusbar.connectivity.NetworkController.SignalCallback;
import java.io.PrintWriter;
import java.util.BitSet;
@@ -36,7 +33,7 @@ import java.util.BitSet;
* @param <T> State of the SysUI controller.
* @param <I> Icon groups of the SysUI controller for a given State.
*/
public abstract class SignalController<T extends State, I extends IconGroup> {
public abstract class SignalController<T extends ConnectivityState, I extends IconGroup> {
// Save the previous SignalController.States of all SignalControllers for dumps.
static final boolean RECORD_HISTORY = true;
// If RECORD_HISTORY how many to save, must be a power of 2.
@@ -58,7 +55,7 @@ public abstract class SignalController<T extends State, I extends IconGroup> {
private final CallbackHandler mCallbackHandler;
// Save the previous HISTORY_SIZE states for logging.
private final State[] mHistory;
private final ConnectivityState[] mHistory;
// Where to copy the next state into.
private int mHistoryIndex;
@@ -72,7 +69,7 @@ public abstract class SignalController<T extends State, I extends IconGroup> {
mCurrentState = cleanState();
mLastState = cleanState();
if (RECORD_HISTORY) {
mHistory = new State[HISTORY_SIZE];
mHistory = new ConnectivityState[HISTORY_SIZE];
for (int i = 0; i < HISTORY_SIZE; i++) {
mHistory[i] = cleanState();
}

View File

@@ -26,28 +26,20 @@ import android.net.NetworkCapabilities;
import android.net.NetworkScoreManager;
import android.net.wifi.WifiManager;
import android.text.Html;
import android.text.TextUtils;
import com.android.internal.annotations.VisibleForTesting;
import com.android.settingslib.SignalIcon.IconGroup;
import com.android.settingslib.SignalIcon.MobileIconGroup;
import com.android.settingslib.SignalIcon.State;
import com.android.settingslib.graph.SignalDrawable;
import com.android.settingslib.mobile.TelephonyIcons;
import com.android.settingslib.wifi.WifiStatusTracker;
import com.android.systemui.R;
import com.android.systemui.flags.FeatureFlags;
import com.android.systemui.statusbar.connectivity.NetworkController.IconState;
import com.android.systemui.statusbar.connectivity.NetworkController.MobileDataIndicators;
import com.android.systemui.statusbar.connectivity.NetworkController.SignalCallback;
import com.android.systemui.statusbar.connectivity.NetworkController.WifiIndicators;
import java.io.PrintWriter;
import java.util.Objects;
/** */
public class WifiSignalController extends
SignalController<WifiSignalController.WifiState, IconGroup> {
public class WifiSignalController extends SignalController<WifiState, IconGroup> {
private final boolean mHasMobileDataFeature;
private final WifiStatusTracker mWifiTracker;
private final IconGroup mUnmergedWifiIconGroup = WifiIcons.UNMERGED_WIFI;
@@ -272,50 +264,4 @@ public class WifiSignalController extends
setActivity(state);
}
}
static class WifiState extends State {
public String ssid;
public boolean isTransient;
public boolean isDefault;
public String statusLabel;
public boolean isCarrierMerged;
public int subId;
@Override
public void copyFrom(State s) {
super.copyFrom(s);
WifiState state = (WifiState) s;
ssid = state.ssid;
isTransient = state.isTransient;
isDefault = state.isDefault;
statusLabel = state.statusLabel;
isCarrierMerged = state.isCarrierMerged;
subId = state.subId;
}
@Override
protected void toString(StringBuilder builder) {
super.toString(builder);
builder.append(",ssid=").append(ssid)
.append(",isTransient=").append(isTransient)
.append(",isDefault=").append(isDefault)
.append(",statusLabel=").append(statusLabel)
.append(",isCarrierMerged=").append(isCarrierMerged)
.append(",subId=").append(subId);
}
@Override
public boolean equals(Object o) {
if (!super.equals(o)) {
return false;
}
WifiState other = (WifiState) o;
return Objects.equals(other.ssid, ssid)
&& other.isTransient == isTransient
&& other.isDefault == isDefault
&& TextUtils.equals(other.statusLabel, statusLabel)
&& other.isCarrierMerged == isCarrierMerged
&& other.subId == subId;
}
}
}

View File

@@ -0,0 +1,78 @@
/*
* Copyright (C) 2021 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.connectivity
import java.lang.StringBuilder
internal class WifiState(
@JvmField var ssid: String? = null,
@JvmField var isTransient: Boolean = false,
@JvmField var isDefault: Boolean = false,
@JvmField var statusLabel: String? = null,
@JvmField var isCarrierMerged: Boolean = false,
@JvmField var subId: Int = 0
) : ConnectivityState() {
public override fun copyFrom(s: ConnectivityState) {
super.copyFrom(s)
val state = s as WifiState
ssid = state.ssid
isTransient = state.isTransient
isDefault = state.isDefault
statusLabel = state.statusLabel
isCarrierMerged = state.isCarrierMerged
subId = state.subId
}
override fun toString(builder: StringBuilder) {
super.toString(builder)
builder.append(",ssid=").append(ssid)
.append(",isTransient=").append(isTransient)
.append(",isDefault=").append(isDefault)
.append(",statusLabel=").append(statusLabel)
.append(",isCarrierMerged=").append(isCarrierMerged)
.append(",subId=").append(subId)
}
override fun equals(other: Any?): Boolean {
if (this === other) return true
if (javaClass != other?.javaClass) return false
if (!super.equals(other)) return false
other as WifiState
if (ssid != other.ssid) return false
if (isTransient != other.isTransient) return false
if (isDefault != other.isDefault) return false
if (statusLabel != other.statusLabel) return false
if (isCarrierMerged != other.isCarrierMerged) return false
if (subId != other.subId) return false
return true
}
override fun hashCode(): Int {
var result = super.hashCode()
result = 31 * result + (ssid?.hashCode() ?: 0)
result = 31 * result + isTransient.hashCode()
result = 31 * result + isDefault.hashCode()
result = 31 * result + (statusLabel?.hashCode() ?: 0)
result = 31 * result + isCarrierMerged.hashCode()
result = 31 * result + subId
return result
}
}

View File

@@ -26,6 +26,7 @@ import static com.android.systemui.statusbar.events.SystemStatusAnimationSchedul
import static com.android.systemui.statusbar.events.SystemStatusAnimationSchedulerKt.SHOWING_PERSISTENT_DOT;
import android.animation.ValueAnimator;
import android.annotation.NonNull;
import android.annotation.Nullable;
import android.app.Fragment;
import android.os.Bundle;
@@ -46,8 +47,9 @@ import com.android.systemui.statusbar.DisableFlagsLogger.DisableState;
import com.android.systemui.statusbar.OperatorNameView;
import com.android.systemui.statusbar.OperatorNameViewController;
import com.android.systemui.statusbar.StatusBarState;
import com.android.systemui.statusbar.connectivity.IconState;
import com.android.systemui.statusbar.connectivity.NetworkController;
import com.android.systemui.statusbar.connectivity.NetworkController.SignalCallback;
import com.android.systemui.statusbar.connectivity.SignalCallback;
import com.android.systemui.statusbar.events.SystemStatusAnimationCallback;
import com.android.systemui.statusbar.events.SystemStatusAnimationScheduler;
import com.android.systemui.statusbar.phone.StatusBarIconController.DarkIconManager;
@@ -109,7 +111,7 @@ public class CollapsedStatusBarFragment extends Fragment implements CommandQueue
private SignalCallback mSignalCallback = new SignalCallback() {
@Override
public void setIsAirplaneMode(NetworkController.IconState icon) {
public void setIsAirplaneMode(@NonNull IconState icon) {
mCommandQueue.recomputeDisableFlags(getContext().getDisplayId(), true /* animate */);
}
};

View File

@@ -16,6 +16,7 @@
package com.android.systemui.statusbar.phone;
import android.annotation.NonNull;
import android.content.Context;
import android.os.Handler;
import android.telephony.SubscriptionInfo;
@@ -26,11 +27,11 @@ import com.android.settingslib.mobile.TelephonyIcons;
import com.android.systemui.R;
import com.android.systemui.dagger.SysUISingleton;
import com.android.systemui.flags.FeatureFlags;
import com.android.systemui.statusbar.connectivity.IconState;
import com.android.systemui.statusbar.connectivity.MobileDataIndicators;
import com.android.systemui.statusbar.connectivity.NetworkController;
import com.android.systemui.statusbar.connectivity.NetworkController.IconState;
import com.android.systemui.statusbar.connectivity.NetworkController.MobileDataIndicators;
import com.android.systemui.statusbar.connectivity.NetworkController.WifiIndicators;
import com.android.systemui.statusbar.connectivity.NetworkControllerImpl;
import com.android.systemui.statusbar.connectivity.SignalCallback;
import com.android.systemui.statusbar.connectivity.WifiIndicators;
import com.android.systemui.statusbar.policy.SecurityController;
import com.android.systemui.tuner.TunerService;
import com.android.systemui.tuner.TunerService.Tunable;
@@ -44,7 +45,7 @@ import javax.inject.Inject;
/** Controls the signal policies for icons shown in the StatusBar. **/
@SysUISingleton
public class StatusBarSignalPolicy implements NetworkControllerImpl.SignalCallback,
public class StatusBarSignalPolicy implements SignalCallback,
SecurityController.SecurityControllerCallback, Tunable {
private static final String TAG = "StatusBarSignalPolicy";
private static final boolean DEBUG = Log.isLoggable(TAG, Log.DEBUG);
@@ -169,7 +170,7 @@ public class StatusBarSignalPolicy implements NetworkControllerImpl.SignalCallba
}
@Override
public void setWifiIndicators(WifiIndicators indicators) {
public void setWifiIndicators(@NonNull WifiIndicators indicators) {
if (DEBUG) {
Log.d(TAG, "setWifiIndicators: " + indicators);
}
@@ -219,7 +220,7 @@ public class StatusBarSignalPolicy implements NetworkControllerImpl.SignalCallba
}
@Override
public void setCallIndicator(IconState statusIcon, int subId) {
public void setCallIndicator(@NonNull IconState statusIcon, int subId) {
if (DEBUG) {
Log.d(TAG, "setCallIndicator: "
+ "statusIcon = " + statusIcon + ","
@@ -247,7 +248,7 @@ public class StatusBarSignalPolicy implements NetworkControllerImpl.SignalCallba
}
@Override
public void setMobileDataIndicators(MobileDataIndicators indicators) {
public void setMobileDataIndicators(@NonNull MobileDataIndicators indicators) {
if (DEBUG) {
Log.d(TAG, "setMobileDataIndicators: " + indicators);
}

View File

@@ -23,6 +23,7 @@ import com.android.internal.R;
import com.android.systemui.dagger.SysUISingleton;
import com.android.systemui.dagger.qualifiers.Main;
import com.android.systemui.settings.UserTracker;
import com.android.systemui.statusbar.connectivity.AccessPointController;
import com.android.systemui.statusbar.connectivity.AccessPointControllerImpl;
import com.android.systemui.statusbar.connectivity.NetworkController;
import com.android.systemui.statusbar.connectivity.NetworkControllerImpl;
@@ -135,7 +136,7 @@ public interface StatusBarPolicyModule {
/** */
@Binds
NetworkController.AccessPointController provideAccessPointController(
AccessPointController provideAccessPointController(
AccessPointControllerImpl accessPointControllerImpl);
/** */

View File

@@ -39,8 +39,10 @@ import androidx.test.filters.SmallTest;
import com.android.keyguard.CarrierTextManager;
import com.android.systemui.flags.FeatureFlags;
import com.android.systemui.plugins.ActivityStarter;
import com.android.systemui.statusbar.connectivity.IconState;
import com.android.systemui.statusbar.connectivity.MobileDataIndicators;
import com.android.systemui.statusbar.connectivity.NetworkController;
import com.android.systemui.statusbar.connectivity.NetworkController.MobileDataIndicators;
import com.android.systemui.statusbar.connectivity.SignalCallback;
import com.android.systemui.util.CarrierConfigTracker;
import com.android.systemui.utils.leaks.LeakCheckedTest;
import com.android.systemui.utils.os.FakeHandler;
@@ -57,7 +59,7 @@ import org.mockito.MockitoAnnotations;
public class QSCarrierGroupControllerTest extends LeakCheckedTest {
private QSCarrierGroupController mQSCarrierGroupController;
private NetworkController.SignalCallback mSignalCallback;
private SignalCallback mSignalCallback;
private CarrierTextManager.CarrierTextCallback mCallback;
@Mock
private QSCarrierGroup mQSCarrierGroup;
@@ -94,7 +96,7 @@ public class QSCarrierGroupControllerTest extends LeakCheckedTest {
when(mNetworkController.hasVoiceCallingFeature()).thenReturn(true);
doAnswer(invocation -> mSignalCallback = invocation.getArgument(0))
.when(mNetworkController)
.addCallback(any(NetworkController.SignalCallback.class));
.addCallback(any(SignalCallback.class));
when(mCarrierTextControllerBuilder.setShowAirplaneMode(anyBoolean()))
.thenReturn(mCarrierTextControllerBuilder);
@@ -230,8 +232,8 @@ public class QSCarrierGroupControllerTest extends LeakCheckedTest {
mSlotIndexResolver.overrideInvalid = true;
MobileDataIndicators indicators = new MobileDataIndicators(
mock(NetworkController.IconState.class),
mock(NetworkController.IconState.class),
mock(IconState.class),
mock(IconState.class),
0, 0, true, true, "", "", "", 0, true, true);
mSignalCallback.setMobileDataIndicators(indicators);
}

View File

@@ -43,8 +43,10 @@ import com.android.systemui.plugins.ActivityStarter;
import com.android.systemui.plugins.statusbar.StatusBarStateController;
import com.android.systemui.qs.QSTileHost;
import com.android.systemui.qs.logging.QSLogger;
import com.android.systemui.statusbar.connectivity.IconState;
import com.android.systemui.statusbar.connectivity.NetworkController;
import com.android.systemui.statusbar.connectivity.NetworkController.WifiIndicators;
import com.android.systemui.statusbar.connectivity.SignalCallback;
import com.android.systemui.statusbar.connectivity.WifiIndicators;
import com.android.systemui.statusbar.policy.CastController;
import com.android.systemui.statusbar.policy.CastController.CastDevice;
import com.android.systemui.statusbar.policy.HotspotController;
@@ -77,7 +79,7 @@ public class CastTileTest extends SysuiTestCase {
@Mock
private QSTileHost mHost;
@Mock
NetworkController.SignalCallback mSignalCallback;
SignalCallback mSignalCallback;
@Mock
private MetricsLogger mMetricsLogger;
@Mock
@@ -122,8 +124,8 @@ public class CastTileTest extends SysuiTestCase {
mTestableLooper.processAllMessages();
mCastTile.handleSetListening(true);
ArgumentCaptor<NetworkController.SignalCallback> signalCallbackArgumentCaptor =
ArgumentCaptor.forClass(NetworkController.SignalCallback.class);
ArgumentCaptor<SignalCallback> signalCallbackArgumentCaptor =
ArgumentCaptor.forClass(SignalCallback.class);
verify(mNetworkController).observe(any(LifecycleOwner.class),
signalCallbackArgumentCaptor.capture());
mSignalCallback = signalCallbackArgumentCaptor.getValue();
@@ -139,10 +141,9 @@ public class CastTileTest extends SysuiTestCase {
// All these tests for enabled/disabled wifi have hotspot not enabled
@Test
public void testStateUnavailable_wifiDisabled() {
NetworkController.IconState qsIcon =
new NetworkController.IconState(false, 0, "");
IconState qsIcon = new IconState(false, 0, "");
WifiIndicators indicators = new WifiIndicators(
false, mock(NetworkController.IconState.class),
false, mock(IconState.class),
qsIcon, false,false, "",
false, "");
mSignalCallback.setWifiIndicators(indicators);
@@ -153,10 +154,9 @@ public class CastTileTest extends SysuiTestCase {
@Test
public void testStateUnavailable_wifiNotConnected() {
NetworkController.IconState qsIcon =
new NetworkController.IconState(false, 0, "");
IconState qsIcon = new IconState(false, 0, "");
WifiIndicators indicators = new WifiIndicators(
true, mock(NetworkController.IconState.class),
true, mock(IconState.class),
qsIcon, false,false, "",
false, "");
mSignalCallback.setWifiIndicators(indicators);
@@ -166,10 +166,9 @@ public class CastTileTest extends SysuiTestCase {
}
private void enableWifiAndProcessMessages() {
NetworkController.IconState qsIcon =
new NetworkController.IconState(true, 0, "");
IconState qsIcon = new IconState(true, 0, "");
WifiIndicators indicators = new WifiIndicators(
true, mock(NetworkController.IconState.class),
true, mock(IconState.class),
qsIcon, false,false, "",
false, "");
mSignalCallback.setWifiIndicators(indicators);

View File

@@ -49,8 +49,7 @@ import com.android.systemui.animation.DialogLaunchAnimator;
import com.android.systemui.broadcast.BroadcastDispatcher;
import com.android.systemui.dagger.qualifiers.Main;
import com.android.systemui.plugins.ActivityStarter;
import com.android.systemui.statusbar.connectivity.NetworkController;
import com.android.systemui.statusbar.connectivity.NetworkController.AccessPointController;
import com.android.systemui.statusbar.connectivity.AccessPointController;
import com.android.systemui.statusbar.policy.KeyguardStateController;
import com.android.systemui.statusbar.policy.LocationController;
import com.android.systemui.toast.SystemUIToast;
@@ -104,7 +103,7 @@ public class InternetDialogControllerTest extends SysuiTestCase {
@Mock
private KeyguardStateController mKeyguardStateController;
@Mock
private NetworkController.AccessPointController mAccessPointController;
private AccessPointController mAccessPointController;
@Mock
private WifiEntry mConnectedEntry;
@Mock

View File

@@ -56,9 +56,9 @@ class AccessPointControllerImplTest : SysuiTestCase() {
@Mock
private lateinit var wifiPickerTracker: WifiPickerTracker
@Mock
private lateinit var callback: NetworkController.AccessPointController.AccessPointCallback
private lateinit var callback: AccessPointController.AccessPointCallback
@Mock
private lateinit var otherCallback: NetworkController.AccessPointController.AccessPointCallback
private lateinit var otherCallback: AccessPointController.AccessPointCallback
@Mock
private lateinit var wifiEntryConnected: WifiEntry
@Mock

View File

@@ -29,10 +29,6 @@ import androidx.test.runner.AndroidJUnit4;
import com.android.settingslib.mobile.TelephonyIcons;
import com.android.systemui.SysuiTestCase;
import com.android.systemui.statusbar.connectivity.NetworkController.EmergencyListener;
import com.android.systemui.statusbar.connectivity.NetworkController.IconState;
import com.android.systemui.statusbar.connectivity.NetworkController.MobileDataIndicators;
import com.android.systemui.statusbar.connectivity.NetworkController.SignalCallback;
import com.android.systemui.statusbar.connectivity.NetworkController.WifiIndicators;
import com.android.systemui.tests.R;
import org.junit.Before;

View File

@@ -14,22 +14,26 @@
* limitations under the License.
*/
package com.android.settingslib;
package com.android.systemui.statusbar.connectivity;
import static junit.framework.Assert.assertFalse;
import static junit.framework.Assert.assertTrue;
import android.test.suitebuilder.annotation.SmallTest;
import android.testing.AndroidTestingRunner;
import com.android.settingslib.mobile.TelephonyIcons;
import com.android.systemui.SysuiTestCase;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.robolectric.RobolectricTestRunner;
@RunWith(RobolectricTestRunner.class)
public class MobileStateTest {
@SmallTest
@RunWith(AndroidTestingRunner.class)
public class MobileStateTest extends SysuiTestCase {
private SignalIcon.MobileState mState = new SignalIcon.MobileState();
private final MobileState mState = new MobileState();
@Before
public void setUp() {

View File

@@ -72,9 +72,6 @@ import com.android.systemui.broadcast.BroadcastDispatcher;
import com.android.systemui.demomode.DemoModeController;
import com.android.systemui.dump.DumpManager;
import com.android.systemui.flags.FeatureFlags;
import com.android.systemui.statusbar.connectivity.NetworkController.IconState;
import com.android.systemui.statusbar.connectivity.NetworkController.MobileDataIndicators;
import com.android.systemui.statusbar.connectivity.NetworkController.SignalCallback;
import com.android.systemui.statusbar.policy.DeviceProvisionedController;
import com.android.systemui.statusbar.policy.DeviceProvisionedController.DeviceProvisionedListener;
import com.android.systemui.telephony.TelephonyListenerManager;

View File

@@ -23,8 +23,6 @@ import android.test.suitebuilder.annotation.SmallTest;
import android.testing.AndroidTestingRunner;
import android.testing.TestableLooper.RunWithLooper;
import com.android.systemui.statusbar.connectivity.NetworkController.IconState;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.ArgumentCaptor;

View File

@@ -36,7 +36,6 @@ import android.testing.AndroidTestingRunner;
import android.testing.TestableLooper.RunWithLooper;
import com.android.settingslib.mobile.TelephonyIcons;
import com.android.systemui.statusbar.connectivity.NetworkController.WifiIndicators;
import org.junit.Before;
import org.junit.Test;

View File

@@ -18,8 +18,9 @@ import android.os.Bundle;
import android.testing.LeakCheck;
import com.android.settingslib.net.DataUsageController;
import com.android.systemui.statusbar.connectivity.AccessPointController;
import com.android.systemui.statusbar.connectivity.NetworkController;
import com.android.systemui.statusbar.connectivity.NetworkController.SignalCallback;
import com.android.systemui.statusbar.connectivity.SignalCallback;
import com.android.systemui.statusbar.policy.DataSaverController;
public class FakeNetworkController extends BaseLeakChecker<SignalCallback>