Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit d5bda8a0 authored by Sudheer Shanka's avatar Sudheer Shanka Committed by Android (Google) Code Review
Browse files

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

parents 81419f4b ac14fde2
Loading
Loading
Loading
Loading
+34 −29
Original line number Diff line number Diff line
@@ -1235,11 +1235,7 @@ public class NetworkPolicyManagerService extends INetworkPolicyManager.Stub {
    final private BroadcastReceiver mWifiReceiver = new BroadcastReceiver() {
        @Override
        public void onReceive(Context context, Intent intent) {
            synchronized (mUidRulesFirstLock) {
                synchronized (mNetworkPoliciesSecondLock) {
                    upgradeWifiMeteredOverrideAL();
                }
            }
            upgradeWifiMeteredOverride();
            // Only need to perform upgrade logic once
            mContext.unregisterReceiver(this);
        }
@@ -2617,36 +2613,45 @@ public class NetworkPolicyManagerService extends INetworkPolicyManager.Stub {
     * Perform upgrade step of moving any user-defined meterness overrides over
     * into {@link WifiConfiguration}.
     */
    @GuardedBy({"mNetworkPoliciesSecondLock", "mUidRulesFirstLock"})
    private void upgradeWifiMeteredOverrideAL() {
        boolean modified = false;
        final WifiManager wm = mContext.getSystemService(WifiManager.class);
        final List<WifiConfiguration> configs = wm.getConfiguredNetworks();
    private void upgradeWifiMeteredOverride() {
        final ArrayMap<String, Boolean> wifiNetworkIds = new ArrayMap<>();
        synchronized (mNetworkPoliciesSecondLock) {
            for (int i = 0; i < mNetworkPolicy.size();) {
                final NetworkPolicy policy = mNetworkPolicy.valueAt(i);
                if (policy.template.getMatchRule() == NetworkTemplate.MATCH_WIFI
                        && !policy.inferred) {
                    mNetworkPolicy.removeAt(i);
                modified = true;
                    wifiNetworkIds.put(policy.template.getNetworkId(), policy.metered);
                } else {
                    i++;
                }
            }
        }

                final String networkId = resolveNetworkId(policy.template.getNetworkId());
                for (WifiConfiguration config : configs) {
                    if (Objects.equals(resolveNetworkId(config), networkId)) {
        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 = policy.metered
                config.meteredOverride = metered
                        ? WifiConfiguration.METERED_OVERRIDE_METERED
                        : WifiConfiguration.METERED_OVERRIDE_NOT_METERED;
                wm.updateNetwork(config);
            }
        }
            } else {
                i++;
            }
        }
        if (modified) {

        synchronized (mUidRulesFirstLock) {
            synchronized (mNetworkPoliciesSecondLock) {
                writePolicyAL();
            }
        }
    }

    @GuardedBy({"mUidRulesFirstLock", "mNetworkPoliciesSecondLock"})
    void writePolicyAL() {