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

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

Change-Id: I652869eb0c05f6e40aebba78035ea3f5261e3eff
This commit is contained in:
Sudheer Shanka
2021-06-23 19:01:27 +00:00
committed by Automerger Merge Worker

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,36 +2613,45 @@ 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();
for (int i = 0; i < mNetworkPolicy.size(); ) {
final NetworkPolicy policy = mNetworkPolicy.valueAt(i); final NetworkPolicy policy = mNetworkPolicy.valueAt(i);
if (policy.template.getMatchRule() == NetworkTemplate.MATCH_WIFI if (policy.template.getMatchRule() == NetworkTemplate.MATCH_WIFI
&& !policy.inferred) { && !policy.inferred) {
mNetworkPolicy.removeAt(i); mNetworkPolicy.removeAt(i);
modified = true; wifiNetworkIds.put(policy.template.getNetworkId(), policy.metered);
} else {
i++;
}
}
}
final String networkId = resolveNetworkId(policy.template.getNetworkId()); if (wifiNetworkIds.isEmpty()) {
for (WifiConfiguration config : configs) { return;
if (Objects.equals(resolveNetworkId(config), networkId)) { }
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"); Slog.d(TAG, "Found network " + networkId + "; upgrading metered hint");
config.meteredOverride = policy.metered config.meteredOverride = metered
? WifiConfiguration.METERED_OVERRIDE_METERED ? WifiConfiguration.METERED_OVERRIDE_METERED
: WifiConfiguration.METERED_OVERRIDE_NOT_METERED; : WifiConfiguration.METERED_OVERRIDE_NOT_METERED;
wm.updateNetwork(config); wm.updateNetwork(config);
} }
} }
} else {
i++; synchronized (mUidRulesFirstLock) {
} synchronized (mNetworkPoliciesSecondLock) {
}
if (modified) {
writePolicyAL(); writePolicyAL();
} }
} }
}
@GuardedBy({"mUidRulesFirstLock", "mNetworkPoliciesSecondLock"}) @GuardedBy({"mUidRulesFirstLock", "mNetworkPoliciesSecondLock"})
void writePolicyAL() { void writePolicyAL() {