Merge "Avoid calling into phone process with NPMS locks held." into sc-dev

This commit is contained in:
Sudheer Shanka
2021-06-23 19:01:16 +00:00
committed by Android (Google) Code Review

View File

@@ -1235,11 +1235,7 @@ public class NetworkPolicyManagerService extends INetworkPolicyManager.Stub {
final private BroadcastReceiver mWifiReceiver = new BroadcastReceiver() { final private BroadcastReceiver mWifiReceiver = new BroadcastReceiver() {
@Override @Override
public void onReceive(Context context, Intent intent) { public void onReceive(Context context, Intent intent) {
synchronized (mUidRulesFirstLock) { upgradeWifiMeteredOverride();
synchronized (mNetworkPoliciesSecondLock) {
upgradeWifiMeteredOverrideAL();
}
}
// Only need to perform upgrade logic once // Only need to perform upgrade logic once
mContext.unregisterReceiver(this); mContext.unregisterReceiver(this);
} }
@@ -2617,34 +2613,43 @@ public class NetworkPolicyManagerService extends INetworkPolicyManager.Stub {
* Perform upgrade step of moving any user-defined meterness overrides over * Perform upgrade step of moving any user-defined meterness overrides over
* into {@link WifiConfiguration}. * into {@link WifiConfiguration}.
*/ */
@GuardedBy({"mNetworkPoliciesSecondLock", "mUidRulesFirstLock"}) private void upgradeWifiMeteredOverride() {
private void upgradeWifiMeteredOverrideAL() { final ArrayMap<String, Boolean> wifiNetworkIds = new ArrayMap<>();
boolean modified = false; synchronized (mNetworkPoliciesSecondLock) {
final WifiManager wm = mContext.getSystemService(WifiManager.class); for (int i = 0; i < mNetworkPolicy.size();) {
final List<WifiConfiguration> configs = wm.getConfiguredNetworks(); final NetworkPolicy policy = mNetworkPolicy.valueAt(i);
for (int i = 0; i < mNetworkPolicy.size(); ) { if (policy.template.getMatchRule() == NetworkTemplate.MATCH_WIFI
final NetworkPolicy policy = mNetworkPolicy.valueAt(i); && !policy.inferred) {
if (policy.template.getMatchRule() == NetworkTemplate.MATCH_WIFI mNetworkPolicy.removeAt(i);
&& !policy.inferred) { wifiNetworkIds.put(policy.template.getNetworkId(), policy.metered);
mNetworkPolicy.removeAt(i); } else {
modified = true; i++;
final String networkId = resolveNetworkId(policy.template.getNetworkId());
for (WifiConfiguration config : configs) {
if (Objects.equals(resolveNetworkId(config), networkId)) {
Slog.d(TAG, "Found network " + networkId + "; upgrading metered hint");
config.meteredOverride = policy.metered
? WifiConfiguration.METERED_OVERRIDE_METERED
: WifiConfiguration.METERED_OVERRIDE_NOT_METERED;
wm.updateNetwork(config);
}
} }
} else {
i++;
} }
} }
if (modified) {
writePolicyAL(); if (wifiNetworkIds.isEmpty()) {
return;
}
final WifiManager wm = mContext.getSystemService(WifiManager.class);
final List<WifiConfiguration> configs = wm.getConfiguredNetworks();
for (int i = 0; i < configs.size(); ++i) {
final WifiConfiguration config = configs.get(i);
final String networkId = resolveNetworkId(config);
final Boolean metered = wifiNetworkIds.get(networkId);
if (metered != null) {
Slog.d(TAG, "Found network " + networkId + "; upgrading metered hint");
config.meteredOverride = metered
? WifiConfiguration.METERED_OVERRIDE_METERED
: WifiConfiguration.METERED_OVERRIDE_NOT_METERED;
wm.updateNetwork(config);
}
}
synchronized (mUidRulesFirstLock) {
synchronized (mNetworkPoliciesSecondLock) {
writePolicyAL();
}
} }
} }