[DO NOT MERGE] Add synchronization for refreshing InternetTile with cached states am: 4f14e3e11b

Original change: https://googleplex-android-review.googlesource.com/c/platform/frameworks/base/+/21990198

Change-Id: Ic5b1e91ec90f7d09a70aaffe5836605c32d4fd5f
Signed-off-by: Automerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com>
This commit is contained in:
Ying Xu
2023-03-16 16:09:50 +00:00
committed by Automerger Merge Worker

View File

@@ -35,6 +35,7 @@ import android.widget.Switch;
import androidx.annotation.Nullable; import androidx.annotation.Nullable;
import com.android.internal.annotations.GuardedBy;
import com.android.internal.logging.MetricsLogger; import com.android.internal.logging.MetricsLogger;
import com.android.internal.logging.nano.MetricsProto.MetricsEvent; import com.android.internal.logging.nano.MetricsProto.MetricsEvent;
import com.android.settingslib.graph.SignalDrawable; import com.android.settingslib.graph.SignalDrawable;
@@ -71,12 +72,16 @@ public class InternetTile extends QSTileImpl<SignalState> {
public static final String TILE_SPEC = "internet"; public static final String TILE_SPEC = "internet";
private static final Intent WIFI_SETTINGS = new Intent(Settings.ACTION_WIFI_SETTINGS); private static final Intent WIFI_SETTINGS = new Intent(Settings.ACTION_WIFI_SETTINGS);
private static final int LAST_STATE_UNKNOWN = -1;
private static final int LAST_STATE_CELLULAR = 0;
private static final int LAST_STATE_WIFI = 1;
private static final int LAST_STATE_ETHERNET = 2;
protected final NetworkController mController; protected final NetworkController mController;
private final AccessPointController mAccessPointController; private final AccessPointController mAccessPointController;
private final DataUsageController mDataController; private final DataUsageController mDataController;
// The last updated tile state, 0: mobile, 1: wifi, 2: ethernet. // The last updated tile state, 0: mobile, 1: wifi, 2: ethernet.
private int mLastTileState = -1; private int mLastTileState = LAST_STATE_UNKNOWN;
protected final InternetSignalCallback mSignalCallback = new InternetSignalCallback(); protected final InternetSignalCallback mSignalCallback = new InternetSignalCallback();
private final InternetDialogFactory mInternetDialogFactory; private final InternetDialogFactory mInternetDialogFactory;
@@ -170,6 +175,15 @@ public class InternetTile extends QSTileImpl<SignalState> {
@Nullable @Nullable
String mEthernetContentDescription; String mEthernetContentDescription;
public void copyTo(EthernetCallbackInfo ethernetCallbackInfo) {
if (ethernetCallbackInfo == null) {
throw new IllegalArgumentException();
}
ethernetCallbackInfo.mConnected = this.mConnected;
ethernetCallbackInfo.mEthernetSignalIconId = this.mEthernetSignalIconId;
ethernetCallbackInfo.mEthernetContentDescription = this.mEthernetContentDescription;
}
@Override @Override
public String toString() { public String toString() {
return new StringBuilder("EthernetCallbackInfo[") return new StringBuilder("EthernetCallbackInfo[")
@@ -196,6 +210,23 @@ public class InternetTile extends QSTileImpl<SignalState> {
boolean mNoValidatedNetwork; boolean mNoValidatedNetwork;
boolean mNoNetworksAvailable; boolean mNoNetworksAvailable;
public void copyTo(WifiCallbackInfo wifiCallbackInfo) {
if (wifiCallbackInfo == null) {
throw new IllegalArgumentException();
}
wifiCallbackInfo.mAirplaneModeEnabled = this.mAirplaneModeEnabled;
wifiCallbackInfo.mEnabled = this.mEnabled;
wifiCallbackInfo.mConnected = this.mConnected;
wifiCallbackInfo.mWifiSignalIconId = this.mWifiSignalIconId;
wifiCallbackInfo.mSsid = this.mSsid;
wifiCallbackInfo.mWifiSignalContentDescription = this.mWifiSignalContentDescription;
wifiCallbackInfo.mIsTransient = this.mIsTransient;
wifiCallbackInfo.mStatusLabel = this.mStatusLabel;
wifiCallbackInfo.mNoDefaultNetwork = this.mNoDefaultNetwork;
wifiCallbackInfo.mNoValidatedNetwork = this.mNoValidatedNetwork;
wifiCallbackInfo.mNoNetworksAvailable = this.mNoNetworksAvailable;
}
@Override @Override
public String toString() { public String toString() {
return new StringBuilder("WifiCallbackInfo[") return new StringBuilder("WifiCallbackInfo[")
@@ -228,6 +259,23 @@ public class InternetTile extends QSTileImpl<SignalState> {
boolean mNoValidatedNetwork; boolean mNoValidatedNetwork;
boolean mNoNetworksAvailable; boolean mNoNetworksAvailable;
public void copyTo(CellularCallbackInfo cellularCallbackInfo) {
if (cellularCallbackInfo == null) {
throw new IllegalArgumentException();
}
cellularCallbackInfo.mAirplaneModeEnabled = this.mAirplaneModeEnabled;
cellularCallbackInfo.mDataSubscriptionName = this.mDataSubscriptionName;
cellularCallbackInfo.mDataContentDescription = this.mDataContentDescription;
cellularCallbackInfo.mMobileSignalIconId = this.mMobileSignalIconId;
cellularCallbackInfo.mQsTypeIcon = this.mQsTypeIcon;
cellularCallbackInfo.mNoSim = this.mNoSim;
cellularCallbackInfo.mRoaming = this.mRoaming;
cellularCallbackInfo.mMultipleSubs = this.mMultipleSubs;
cellularCallbackInfo.mNoDefaultNetwork = this.mNoDefaultNetwork;
cellularCallbackInfo.mNoValidatedNetwork = this.mNoValidatedNetwork;
cellularCallbackInfo.mNoNetworksAvailable = this.mNoNetworksAvailable;
}
@Override @Override
public String toString() { public String toString() {
return new StringBuilder("CellularCallbackInfo[") return new StringBuilder("CellularCallbackInfo[")
@@ -247,8 +295,11 @@ public class InternetTile extends QSTileImpl<SignalState> {
} }
protected final class InternetSignalCallback implements SignalCallback { protected final class InternetSignalCallback implements SignalCallback {
@GuardedBy("mWifiInfo")
final WifiCallbackInfo mWifiInfo = new WifiCallbackInfo(); final WifiCallbackInfo mWifiInfo = new WifiCallbackInfo();
@GuardedBy("mCellularInfo")
final CellularCallbackInfo mCellularInfo = new CellularCallbackInfo(); final CellularCallbackInfo mCellularInfo = new CellularCallbackInfo();
@GuardedBy("mEthernetInfo")
final EthernetCallbackInfo mEthernetInfo = new EthernetCallbackInfo(); final EthernetCallbackInfo mEthernetInfo = new EthernetCallbackInfo();
@@ -257,6 +308,7 @@ public class InternetTile extends QSTileImpl<SignalState> {
if (DEBUG) { if (DEBUG) {
Log.d(TAG, "setWifiIndicators: " + indicators); Log.d(TAG, "setWifiIndicators: " + indicators);
} }
synchronized (mWifiInfo) {
mWifiInfo.mEnabled = indicators.enabled; mWifiInfo.mEnabled = indicators.enabled;
mWifiInfo.mSsid = indicators.description; mWifiInfo.mSsid = indicators.description;
mWifiInfo.mIsTransient = indicators.isTransient; mWifiInfo.mIsTransient = indicators.isTransient;
@@ -265,13 +317,16 @@ public class InternetTile extends QSTileImpl<SignalState> {
mWifiInfo.mConnected = indicators.qsIcon.visible; mWifiInfo.mConnected = indicators.qsIcon.visible;
mWifiInfo.mWifiSignalIconId = indicators.qsIcon.icon; mWifiInfo.mWifiSignalIconId = indicators.qsIcon.icon;
mWifiInfo.mWifiSignalContentDescription = indicators.qsIcon.contentDescription; mWifiInfo.mWifiSignalContentDescription = indicators.qsIcon.contentDescription;
refreshState(mWifiInfo);
} else { } else {
mWifiInfo.mConnected = false; mWifiInfo.mConnected = false;
mWifiInfo.mWifiSignalIconId = 0; mWifiInfo.mWifiSignalIconId = 0;
mWifiInfo.mWifiSignalContentDescription = null; mWifiInfo.mWifiSignalContentDescription = null;
} }
} }
if (indicators.qsIcon != null) {
refreshState(mWifiInfo);
}
}
@Override @Override
public void setMobileDataIndicators(@NonNull MobileDataIndicators indicators) { public void setMobileDataIndicators(@NonNull MobileDataIndicators indicators) {
@@ -282,6 +337,7 @@ public class InternetTile extends QSTileImpl<SignalState> {
// Not data sim, don't display. // Not data sim, don't display.
return; return;
} }
synchronized (mCellularInfo) {
mCellularInfo.mDataSubscriptionName = indicators.qsDescription == null mCellularInfo.mDataSubscriptionName = indicators.qsDescription == null
? mController.getMobileDataNetworkName() : indicators.qsDescription; ? mController.getMobileDataNetworkName() : indicators.qsDescription;
mCellularInfo.mDataContentDescription = indicators.qsDescription != null mCellularInfo.mDataContentDescription = indicators.qsDescription != null
@@ -290,6 +346,7 @@ public class InternetTile extends QSTileImpl<SignalState> {
mCellularInfo.mQsTypeIcon = indicators.qsType; mCellularInfo.mQsTypeIcon = indicators.qsType;
mCellularInfo.mRoaming = indicators.roaming; mCellularInfo.mRoaming = indicators.roaming;
mCellularInfo.mMultipleSubs = mController.getNumberSubscriptions() > 1; mCellularInfo.mMultipleSubs = mController.getNumberSubscriptions() > 1;
}
refreshState(mCellularInfo); refreshState(mCellularInfo);
} }
@@ -299,9 +356,11 @@ public class InternetTile extends QSTileImpl<SignalState> {
Log.d(TAG, "setEthernetIndicators: " Log.d(TAG, "setEthernetIndicators: "
+ "icon = " + (icon == null ? "" : icon.toString())); + "icon = " + (icon == null ? "" : icon.toString()));
} }
synchronized (mEthernetInfo) {
mEthernetInfo.mConnected = icon.visible; mEthernetInfo.mConnected = icon.visible;
mEthernetInfo.mEthernetSignalIconId = icon.icon; mEthernetInfo.mEthernetSignalIconId = icon.icon;
mEthernetInfo.mEthernetContentDescription = icon.contentDescription; mEthernetInfo.mEthernetContentDescription = icon.contentDescription;
}
if (icon.visible) { if (icon.visible) {
refreshState(mEthernetInfo); refreshState(mEthernetInfo);
} }
@@ -314,6 +373,7 @@ public class InternetTile extends QSTileImpl<SignalState> {
+ "show = " + show + "," + "show = " + show + ","
+ "simDetected = " + simDetected); + "simDetected = " + simDetected);
} }
synchronized (mCellularInfo) {
mCellularInfo.mNoSim = show; mCellularInfo.mNoSim = show;
if (mCellularInfo.mNoSim) { if (mCellularInfo.mNoSim) {
// Make sure signal gets cleared out when no sims. // Make sure signal gets cleared out when no sims.
@@ -321,6 +381,7 @@ public class InternetTile extends QSTileImpl<SignalState> {
mCellularInfo.mQsTypeIcon = 0; mCellularInfo.mQsTypeIcon = 0;
} }
} }
}
@Override @Override
public void setIsAirplaneMode(IconState icon) { public void setIsAirplaneMode(IconState icon) {
@@ -331,8 +392,12 @@ public class InternetTile extends QSTileImpl<SignalState> {
if (mCellularInfo.mAirplaneModeEnabled == icon.visible) { if (mCellularInfo.mAirplaneModeEnabled == icon.visible) {
return; return;
} }
synchronized (mCellularInfo) {
mCellularInfo.mAirplaneModeEnabled = icon.visible; mCellularInfo.mAirplaneModeEnabled = icon.visible;
}
synchronized (mWifiInfo) {
mWifiInfo.mAirplaneModeEnabled = icon.visible; mWifiInfo.mAirplaneModeEnabled = icon.visible;
}
if (!mSignalCallback.mEthernetInfo.mConnected) { if (!mSignalCallback.mEthernetInfo.mConnected) {
// Always use mWifiInfo to refresh the Internet Tile if airplane mode is enabled, // Always use mWifiInfo to refresh the Internet Tile if airplane mode is enabled,
// because Internet Tile will show different information depending on whether WiFi // because Internet Tile will show different information depending on whether WiFi
@@ -359,12 +424,16 @@ public class InternetTile extends QSTileImpl<SignalState> {
+ "noValidatedNetwork = " + noValidatedNetwork + "," + "noValidatedNetwork = " + noValidatedNetwork + ","
+ "noNetworksAvailable = " + noNetworksAvailable); + "noNetworksAvailable = " + noNetworksAvailable);
} }
synchronized (mCellularInfo) {
mCellularInfo.mNoDefaultNetwork = noDefaultNetwork; mCellularInfo.mNoDefaultNetwork = noDefaultNetwork;
mCellularInfo.mNoValidatedNetwork = noValidatedNetwork; mCellularInfo.mNoValidatedNetwork = noValidatedNetwork;
mCellularInfo.mNoNetworksAvailable = noNetworksAvailable; mCellularInfo.mNoNetworksAvailable = noNetworksAvailable;
}
synchronized (mWifiInfo) {
mWifiInfo.mNoDefaultNetwork = noDefaultNetwork; mWifiInfo.mNoDefaultNetwork = noDefaultNetwork;
mWifiInfo.mNoValidatedNetwork = noValidatedNetwork; mWifiInfo.mNoValidatedNetwork = noValidatedNetwork;
mWifiInfo.mNoNetworksAvailable = noNetworksAvailable; mWifiInfo.mNoNetworksAvailable = noNetworksAvailable;
}
if (!noDefaultNetwork) { if (!noDefaultNetwork) {
return; return;
} }
@@ -386,24 +455,36 @@ public class InternetTile extends QSTileImpl<SignalState> {
mQSLogger.logInternetTileUpdate( mQSLogger.logInternetTileUpdate(
getTileSpec(), mLastTileState, arg == null ? "null" : arg.toString()); getTileSpec(), mLastTileState, arg == null ? "null" : arg.toString());
if (arg instanceof CellularCallbackInfo) { if (arg instanceof CellularCallbackInfo) {
mLastTileState = 0; mLastTileState = LAST_STATE_CELLULAR;
handleUpdateCellularState(state, arg); handleUpdateCellularState(state, arg);
} else if (arg instanceof WifiCallbackInfo) { } else if (arg instanceof WifiCallbackInfo) {
mLastTileState = 1; mLastTileState = LAST_STATE_WIFI;
handleUpdateWifiState(state, arg); handleUpdateWifiState(state, arg);
} else if (arg instanceof EthernetCallbackInfo) { } else if (arg instanceof EthernetCallbackInfo) {
mLastTileState = 2; mLastTileState = LAST_STATE_ETHERNET;
handleUpdateEthernetState(state, arg); handleUpdateEthernetState(state, arg);
} else { } else {
// handleUpdateState will be triggered when user expands the QuickSetting panel with // handleUpdateState will be triggered when user expands the QuickSetting panel with
// arg = null, in this case the last updated CellularCallbackInfo or WifiCallbackInfo // arg = null, in this case the last updated CellularCallbackInfo or WifiCallbackInfo
// should be used to refresh the tile. // should be used to refresh the tile.
if (mLastTileState == 0) { if (mLastTileState == LAST_STATE_CELLULAR) {
handleUpdateCellularState(state, mSignalCallback.mCellularInfo); CellularCallbackInfo cellularInfo = new CellularCallbackInfo();
} else if (mLastTileState == 1) { synchronized (mSignalCallback.mCellularInfo) {
handleUpdateWifiState(state, mSignalCallback.mWifiInfo); mSignalCallback.mCellularInfo.copyTo(cellularInfo);
} else if (mLastTileState == 2) { }
handleUpdateEthernetState(state, mSignalCallback.mEthernetInfo); handleUpdateCellularState(state, cellularInfo);
} else if (mLastTileState == LAST_STATE_WIFI) {
WifiCallbackInfo mifiInfo = new WifiCallbackInfo();
synchronized (mSignalCallback.mWifiInfo) {
mSignalCallback.mWifiInfo.copyTo(mifiInfo);
}
handleUpdateCellularState(state, mifiInfo);
} else if (mLastTileState == LAST_STATE_ETHERNET) {
EthernetCallbackInfo ethernetInfo = new EthernetCallbackInfo();
synchronized (mSignalCallback.mEthernetInfo) {
mSignalCallback.mEthernetInfo.copyTo(ethernetInfo);
}
handleUpdateCellularState(state, ethernetInfo);
} }
} }
} }