138e932b37aea8d2f6866c3c879afa188587bcde3Wei Liu/*
238e932b37aea8d2f6866c3c879afa188587bcde3Wei Liu * Copyright (C) 2011 The Android Open Source Project
338e932b37aea8d2f6866c3c879afa188587bcde3Wei Liu *
438e932b37aea8d2f6866c3c879afa188587bcde3Wei Liu * Licensed under the Apache License, Version 2.0 (the "License");
538e932b37aea8d2f6866c3c879afa188587bcde3Wei Liu * you may not use this file except in compliance with the License.
638e932b37aea8d2f6866c3c879afa188587bcde3Wei Liu * You may obtain a copy of the License at
738e932b37aea8d2f6866c3c879afa188587bcde3Wei Liu *
838e932b37aea8d2f6866c3c879afa188587bcde3Wei Liu *      http://www.apache.org/licenses/LICENSE-2.0
938e932b37aea8d2f6866c3c879afa188587bcde3Wei Liu *
1038e932b37aea8d2f6866c3c879afa188587bcde3Wei Liu * Unless required by applicable law or agreed to in writing, software
1138e932b37aea8d2f6866c3c879afa188587bcde3Wei Liu * distributed under the License is distributed on an "AS IS" BASIS,
1238e932b37aea8d2f6866c3c879afa188587bcde3Wei Liu * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1338e932b37aea8d2f6866c3c879afa188587bcde3Wei Liu * See the License for the specific language governing permissions and
1438e932b37aea8d2f6866c3c879afa188587bcde3Wei Liu * limitations under the License.
1538e932b37aea8d2f6866c3c879afa188587bcde3Wei Liu */
1638e932b37aea8d2f6866c3c879afa188587bcde3Wei Liu
1738e932b37aea8d2f6866c3c879afa188587bcde3Wei Liupackage com.android.settingslib;
1838e932b37aea8d2f6866c3c879afa188587bcde3Wei Liu
1938e932b37aea8d2f6866c3c879afa188587bcde3Wei Liuimport static android.net.NetworkPolicy.CYCLE_NONE;
2038e932b37aea8d2f6866c3c879afa188587bcde3Wei Liuimport static android.net.NetworkPolicy.LIMIT_DISABLED;
2138e932b37aea8d2f6866c3c879afa188587bcde3Wei Liuimport static android.net.NetworkPolicy.SNOOZE_NEVER;
2238e932b37aea8d2f6866c3c879afa188587bcde3Wei Liuimport static android.net.NetworkPolicy.WARNING_DISABLED;
2338e932b37aea8d2f6866c3c879afa188587bcde3Wei Liuimport static android.net.NetworkTemplate.MATCH_WIFI;
2443d2a1700b6eb1d804924c6a1e5e0161a13a5348Jeff Sharkey
2538e932b37aea8d2f6866c3c879afa188587bcde3Wei Liuimport static com.android.internal.util.Preconditions.checkNotNull;
2638e932b37aea8d2f6866c3c879afa188587bcde3Wei Liu
2738e932b37aea8d2f6866c3c879afa188587bcde3Wei Liuimport android.net.NetworkPolicy;
2838e932b37aea8d2f6866c3c879afa188587bcde3Wei Liuimport android.net.NetworkPolicyManager;
2938e932b37aea8d2f6866c3c879afa188587bcde3Wei Liuimport android.net.NetworkTemplate;
3038e932b37aea8d2f6866c3c879afa188587bcde3Wei Liuimport android.net.wifi.WifiInfo;
3138e932b37aea8d2f6866c3c879afa188587bcde3Wei Liuimport android.os.AsyncTask;
3238e932b37aea8d2f6866c3c879afa188587bcde3Wei Liuimport android.text.TextUtils;
3317bebd2fd7d3af0bc648172da6ae36f8b55ad7afJeff Sharkeyimport android.util.RecurrenceRule;
3438e932b37aea8d2f6866c3c879afa188587bcde3Wei Liu
3538e932b37aea8d2f6866c3c879afa188587bcde3Wei Liuimport com.google.android.collect.Lists;
3638e932b37aea8d2f6866c3c879afa188587bcde3Wei Liu
3717bebd2fd7d3af0bc648172da6ae36f8b55ad7afJeff Sharkeyimport java.time.ZoneId;
3817bebd2fd7d3af0bc648172da6ae36f8b55ad7afJeff Sharkeyimport java.time.ZonedDateTime;
3938e932b37aea8d2f6866c3c879afa188587bcde3Wei Liuimport java.util.ArrayList;
4038e932b37aea8d2f6866c3c879afa188587bcde3Wei Liu
4138e932b37aea8d2f6866c3c879afa188587bcde3Wei Liu/**
4238e932b37aea8d2f6866c3c879afa188587bcde3Wei Liu * Utility class to modify list of {@link NetworkPolicy}. Specifically knows
4338e932b37aea8d2f6866c3c879afa188587bcde3Wei Liu * about which policies can coexist. This editor offers thread safety when
4438e932b37aea8d2f6866c3c879afa188587bcde3Wei Liu * talking with {@link NetworkPolicyManager}.
4538e932b37aea8d2f6866c3c879afa188587bcde3Wei Liu *
4638e932b37aea8d2f6866c3c879afa188587bcde3Wei Liu * @hide
4738e932b37aea8d2f6866c3c879afa188587bcde3Wei Liu */
4838e932b37aea8d2f6866c3c879afa188587bcde3Wei Liupublic class NetworkPolicyEditor {
4938e932b37aea8d2f6866c3c879afa188587bcde3Wei Liu    // TODO: be more robust when missing policies from service
5038e932b37aea8d2f6866c3c879afa188587bcde3Wei Liu
5138e932b37aea8d2f6866c3c879afa188587bcde3Wei Liu    public static final boolean ENABLE_SPLIT_POLICIES = false;
5238e932b37aea8d2f6866c3c879afa188587bcde3Wei Liu
5338e932b37aea8d2f6866c3c879afa188587bcde3Wei Liu    private NetworkPolicyManager mPolicyManager;
5438e932b37aea8d2f6866c3c879afa188587bcde3Wei Liu    private ArrayList<NetworkPolicy> mPolicies = Lists.newArrayList();
5538e932b37aea8d2f6866c3c879afa188587bcde3Wei Liu
5638e932b37aea8d2f6866c3c879afa188587bcde3Wei Liu    public NetworkPolicyEditor(NetworkPolicyManager policyManager) {
5738e932b37aea8d2f6866c3c879afa188587bcde3Wei Liu        mPolicyManager = checkNotNull(policyManager);
5838e932b37aea8d2f6866c3c879afa188587bcde3Wei Liu    }
5938e932b37aea8d2f6866c3c879afa188587bcde3Wei Liu
6038e932b37aea8d2f6866c3c879afa188587bcde3Wei Liu    public void read() {
6138e932b37aea8d2f6866c3c879afa188587bcde3Wei Liu        final NetworkPolicy[] policies = mPolicyManager.getNetworkPolicies();
6238e932b37aea8d2f6866c3c879afa188587bcde3Wei Liu
6338e932b37aea8d2f6866c3c879afa188587bcde3Wei Liu        boolean modified = false;
6438e932b37aea8d2f6866c3c879afa188587bcde3Wei Liu        mPolicies.clear();
6538e932b37aea8d2f6866c3c879afa188587bcde3Wei Liu        for (NetworkPolicy policy : policies) {
6638e932b37aea8d2f6866c3c879afa188587bcde3Wei Liu            // TODO: find better place to clamp these
6738e932b37aea8d2f6866c3c879afa188587bcde3Wei Liu            if (policy.limitBytes < -1) {
6838e932b37aea8d2f6866c3c879afa188587bcde3Wei Liu                policy.limitBytes = LIMIT_DISABLED;
6938e932b37aea8d2f6866c3c879afa188587bcde3Wei Liu                modified = true;
7038e932b37aea8d2f6866c3c879afa188587bcde3Wei Liu            }
7138e932b37aea8d2f6866c3c879afa188587bcde3Wei Liu            if (policy.warningBytes < -1) {
7238e932b37aea8d2f6866c3c879afa188587bcde3Wei Liu                policy.warningBytes = WARNING_DISABLED;
7338e932b37aea8d2f6866c3c879afa188587bcde3Wei Liu                modified = true;
7438e932b37aea8d2f6866c3c879afa188587bcde3Wei Liu            }
7538e932b37aea8d2f6866c3c879afa188587bcde3Wei Liu
7638e932b37aea8d2f6866c3c879afa188587bcde3Wei Liu            mPolicies.add(policy);
7738e932b37aea8d2f6866c3c879afa188587bcde3Wei Liu        }
7838e932b37aea8d2f6866c3c879afa188587bcde3Wei Liu
7938e932b37aea8d2f6866c3c879afa188587bcde3Wei Liu        // when we cleaned policies above, write back changes
8038e932b37aea8d2f6866c3c879afa188587bcde3Wei Liu        if (modified) writeAsync();
8138e932b37aea8d2f6866c3c879afa188587bcde3Wei Liu    }
8238e932b37aea8d2f6866c3c879afa188587bcde3Wei Liu
8338e932b37aea8d2f6866c3c879afa188587bcde3Wei Liu    public void writeAsync() {
8438e932b37aea8d2f6866c3c879afa188587bcde3Wei Liu        // TODO: consider making more robust by passing through service
8538e932b37aea8d2f6866c3c879afa188587bcde3Wei Liu        final NetworkPolicy[] policies = mPolicies.toArray(new NetworkPolicy[mPolicies.size()]);
8638e932b37aea8d2f6866c3c879afa188587bcde3Wei Liu        new AsyncTask<Void, Void, Void>() {
8738e932b37aea8d2f6866c3c879afa188587bcde3Wei Liu            @Override
8838e932b37aea8d2f6866c3c879afa188587bcde3Wei Liu            protected Void doInBackground(Void... params) {
8938e932b37aea8d2f6866c3c879afa188587bcde3Wei Liu                write(policies);
9038e932b37aea8d2f6866c3c879afa188587bcde3Wei Liu                return null;
9138e932b37aea8d2f6866c3c879afa188587bcde3Wei Liu            }
9238e932b37aea8d2f6866c3c879afa188587bcde3Wei Liu        }.execute();
9338e932b37aea8d2f6866c3c879afa188587bcde3Wei Liu    }
9438e932b37aea8d2f6866c3c879afa188587bcde3Wei Liu
9538e932b37aea8d2f6866c3c879afa188587bcde3Wei Liu    public void write(NetworkPolicy[] policies) {
9638e932b37aea8d2f6866c3c879afa188587bcde3Wei Liu        mPolicyManager.setNetworkPolicies(policies);
9738e932b37aea8d2f6866c3c879afa188587bcde3Wei Liu    }
9838e932b37aea8d2f6866c3c879afa188587bcde3Wei Liu
9938e932b37aea8d2f6866c3c879afa188587bcde3Wei Liu    public boolean hasLimitedPolicy(NetworkTemplate template) {
10038e932b37aea8d2f6866c3c879afa188587bcde3Wei Liu        final NetworkPolicy policy = getPolicy(template);
10138e932b37aea8d2f6866c3c879afa188587bcde3Wei Liu        return policy != null && policy.limitBytes != LIMIT_DISABLED;
10238e932b37aea8d2f6866c3c879afa188587bcde3Wei Liu    }
10338e932b37aea8d2f6866c3c879afa188587bcde3Wei Liu
10438e932b37aea8d2f6866c3c879afa188587bcde3Wei Liu    public NetworkPolicy getOrCreatePolicy(NetworkTemplate template) {
10538e932b37aea8d2f6866c3c879afa188587bcde3Wei Liu        NetworkPolicy policy = getPolicy(template);
10638e932b37aea8d2f6866c3c879afa188587bcde3Wei Liu        if (policy == null) {
10738e932b37aea8d2f6866c3c879afa188587bcde3Wei Liu            policy = buildDefaultPolicy(template);
10838e932b37aea8d2f6866c3c879afa188587bcde3Wei Liu            mPolicies.add(policy);
10938e932b37aea8d2f6866c3c879afa188587bcde3Wei Liu        }
11038e932b37aea8d2f6866c3c879afa188587bcde3Wei Liu        return policy;
11138e932b37aea8d2f6866c3c879afa188587bcde3Wei Liu    }
11238e932b37aea8d2f6866c3c879afa188587bcde3Wei Liu
11338e932b37aea8d2f6866c3c879afa188587bcde3Wei Liu    public NetworkPolicy getPolicy(NetworkTemplate template) {
11438e932b37aea8d2f6866c3c879afa188587bcde3Wei Liu        for (NetworkPolicy policy : mPolicies) {
11538e932b37aea8d2f6866c3c879afa188587bcde3Wei Liu            if (policy.template.equals(template)) {
11638e932b37aea8d2f6866c3c879afa188587bcde3Wei Liu                return policy;
11738e932b37aea8d2f6866c3c879afa188587bcde3Wei Liu            }
11838e932b37aea8d2f6866c3c879afa188587bcde3Wei Liu        }
11938e932b37aea8d2f6866c3c879afa188587bcde3Wei Liu        return null;
12038e932b37aea8d2f6866c3c879afa188587bcde3Wei Liu    }
12138e932b37aea8d2f6866c3c879afa188587bcde3Wei Liu
12238e932b37aea8d2f6866c3c879afa188587bcde3Wei Liu    public NetworkPolicy getPolicyMaybeUnquoted(NetworkTemplate template) {
12338e932b37aea8d2f6866c3c879afa188587bcde3Wei Liu        NetworkPolicy policy = getPolicy(template);
12438e932b37aea8d2f6866c3c879afa188587bcde3Wei Liu        if (policy != null) {
12538e932b37aea8d2f6866c3c879afa188587bcde3Wei Liu            return policy;
12638e932b37aea8d2f6866c3c879afa188587bcde3Wei Liu        } else {
12738e932b37aea8d2f6866c3c879afa188587bcde3Wei Liu            return getPolicy(buildUnquotedNetworkTemplate(template));
12838e932b37aea8d2f6866c3c879afa188587bcde3Wei Liu        }
12938e932b37aea8d2f6866c3c879afa188587bcde3Wei Liu    }
13038e932b37aea8d2f6866c3c879afa188587bcde3Wei Liu
13138e932b37aea8d2f6866c3c879afa188587bcde3Wei Liu    @Deprecated
13238e932b37aea8d2f6866c3c879afa188587bcde3Wei Liu    private static NetworkPolicy buildDefaultPolicy(NetworkTemplate template) {
13338e932b37aea8d2f6866c3c879afa188587bcde3Wei Liu        // TODO: move this into framework to share with NetworkPolicyManagerService
13417bebd2fd7d3af0bc648172da6ae36f8b55ad7afJeff Sharkey        final RecurrenceRule cycleRule;
13538e932b37aea8d2f6866c3c879afa188587bcde3Wei Liu        final boolean metered;
13638e932b37aea8d2f6866c3c879afa188587bcde3Wei Liu
13738e932b37aea8d2f6866c3c879afa188587bcde3Wei Liu        if (template.getMatchRule() == MATCH_WIFI) {
13817bebd2fd7d3af0bc648172da6ae36f8b55ad7afJeff Sharkey            cycleRule = RecurrenceRule.buildNever();
13938e932b37aea8d2f6866c3c879afa188587bcde3Wei Liu            metered = false;
14038e932b37aea8d2f6866c3c879afa188587bcde3Wei Liu        } else {
14117bebd2fd7d3af0bc648172da6ae36f8b55ad7afJeff Sharkey            cycleRule = RecurrenceRule.buildRecurringMonthly(ZonedDateTime.now().getDayOfMonth(),
14217bebd2fd7d3af0bc648172da6ae36f8b55ad7afJeff Sharkey                    ZoneId.systemDefault());
14338e932b37aea8d2f6866c3c879afa188587bcde3Wei Liu            metered = true;
14438e932b37aea8d2f6866c3c879afa188587bcde3Wei Liu        }
14538e932b37aea8d2f6866c3c879afa188587bcde3Wei Liu
14617bebd2fd7d3af0bc648172da6ae36f8b55ad7afJeff Sharkey        return new NetworkPolicy(template, cycleRule, WARNING_DISABLED,
14738e932b37aea8d2f6866c3c879afa188587bcde3Wei Liu                LIMIT_DISABLED, SNOOZE_NEVER, SNOOZE_NEVER, metered, true);
14838e932b37aea8d2f6866c3c879afa188587bcde3Wei Liu    }
14938e932b37aea8d2f6866c3c879afa188587bcde3Wei Liu
15017bebd2fd7d3af0bc648172da6ae36f8b55ad7afJeff Sharkey    @Deprecated
15138e932b37aea8d2f6866c3c879afa188587bcde3Wei Liu    public int getPolicyCycleDay(NetworkTemplate template) {
15238e932b37aea8d2f6866c3c879afa188587bcde3Wei Liu        final NetworkPolicy policy = getPolicy(template);
15317bebd2fd7d3af0bc648172da6ae36f8b55ad7afJeff Sharkey        if (policy != null && policy.cycleRule.isMonthly()) {
15417bebd2fd7d3af0bc648172da6ae36f8b55ad7afJeff Sharkey            return policy.cycleRule.start.getDayOfMonth();
15517bebd2fd7d3af0bc648172da6ae36f8b55ad7afJeff Sharkey        } else {
15617bebd2fd7d3af0bc648172da6ae36f8b55ad7afJeff Sharkey            return CYCLE_NONE;
15717bebd2fd7d3af0bc648172da6ae36f8b55ad7afJeff Sharkey        }
15838e932b37aea8d2f6866c3c879afa188587bcde3Wei Liu    }
15938e932b37aea8d2f6866c3c879afa188587bcde3Wei Liu
16017bebd2fd7d3af0bc648172da6ae36f8b55ad7afJeff Sharkey    @Deprecated
16138e932b37aea8d2f6866c3c879afa188587bcde3Wei Liu    public void setPolicyCycleDay(NetworkTemplate template, int cycleDay, String cycleTimezone) {
16238e932b37aea8d2f6866c3c879afa188587bcde3Wei Liu        final NetworkPolicy policy = getOrCreatePolicy(template);
16317bebd2fd7d3af0bc648172da6ae36f8b55ad7afJeff Sharkey        policy.cycleRule = NetworkPolicy.buildRule(cycleDay, ZoneId.of(cycleTimezone));
16438e932b37aea8d2f6866c3c879afa188587bcde3Wei Liu        policy.inferred = false;
16538e932b37aea8d2f6866c3c879afa188587bcde3Wei Liu        policy.clearSnooze();
16638e932b37aea8d2f6866c3c879afa188587bcde3Wei Liu        writeAsync();
16738e932b37aea8d2f6866c3c879afa188587bcde3Wei Liu    }
16838e932b37aea8d2f6866c3c879afa188587bcde3Wei Liu
16938e932b37aea8d2f6866c3c879afa188587bcde3Wei Liu    public long getPolicyWarningBytes(NetworkTemplate template) {
17038e932b37aea8d2f6866c3c879afa188587bcde3Wei Liu        final NetworkPolicy policy = getPolicy(template);
17138e932b37aea8d2f6866c3c879afa188587bcde3Wei Liu        return (policy != null) ? policy.warningBytes : WARNING_DISABLED;
17238e932b37aea8d2f6866c3c879afa188587bcde3Wei Liu    }
17338e932b37aea8d2f6866c3c879afa188587bcde3Wei Liu
1746a85d3bddc92f0e25cbea977648cfb4d3beedc96jackqdyulei    private void setPolicyWarningBytesInner(NetworkTemplate template, long warningBytes) {
17538e932b37aea8d2f6866c3c879afa188587bcde3Wei Liu        final NetworkPolicy policy = getOrCreatePolicy(template);
17638e932b37aea8d2f6866c3c879afa188587bcde3Wei Liu        policy.warningBytes = warningBytes;
17738e932b37aea8d2f6866c3c879afa188587bcde3Wei Liu        policy.inferred = false;
17838e932b37aea8d2f6866c3c879afa188587bcde3Wei Liu        policy.clearSnooze();
17938e932b37aea8d2f6866c3c879afa188587bcde3Wei Liu        writeAsync();
18038e932b37aea8d2f6866c3c879afa188587bcde3Wei Liu    }
18138e932b37aea8d2f6866c3c879afa188587bcde3Wei Liu
1826a85d3bddc92f0e25cbea977648cfb4d3beedc96jackqdyulei    public void setPolicyWarningBytes(NetworkTemplate template, long warningBytes) {
1836a85d3bddc92f0e25cbea977648cfb4d3beedc96jackqdyulei        long limitBytes = getPolicyLimitBytes(template);
1846a85d3bddc92f0e25cbea977648cfb4d3beedc96jackqdyulei
185752a601d46e8d8f72f8c092d166b235c3f9272ebjackqdyulei        warningBytes =
186752a601d46e8d8f72f8c092d166b235c3f9272ebjackqdyulei            (limitBytes == LIMIT_DISABLED) ? warningBytes : Math.min(warningBytes, limitBytes);
187752a601d46e8d8f72f8c092d166b235c3f9272ebjackqdyulei
1886a85d3bddc92f0e25cbea977648cfb4d3beedc96jackqdyulei        setPolicyWarningBytesInner(template, warningBytes);
1896a85d3bddc92f0e25cbea977648cfb4d3beedc96jackqdyulei    }
1906a85d3bddc92f0e25cbea977648cfb4d3beedc96jackqdyulei
19138e932b37aea8d2f6866c3c879afa188587bcde3Wei Liu    public long getPolicyLimitBytes(NetworkTemplate template) {
19238e932b37aea8d2f6866c3c879afa188587bcde3Wei Liu        final NetworkPolicy policy = getPolicy(template);
19338e932b37aea8d2f6866c3c879afa188587bcde3Wei Liu        return (policy != null) ? policy.limitBytes : LIMIT_DISABLED;
19438e932b37aea8d2f6866c3c879afa188587bcde3Wei Liu    }
19538e932b37aea8d2f6866c3c879afa188587bcde3Wei Liu
1966a85d3bddc92f0e25cbea977648cfb4d3beedc96jackqdyulei
19738e932b37aea8d2f6866c3c879afa188587bcde3Wei Liu    public void setPolicyLimitBytes(NetworkTemplate template, long limitBytes) {
1986a85d3bddc92f0e25cbea977648cfb4d3beedc96jackqdyulei        long warningBytes = getPolicyWarningBytes(template);
1996a85d3bddc92f0e25cbea977648cfb4d3beedc96jackqdyulei
200752a601d46e8d8f72f8c092d166b235c3f9272ebjackqdyulei        if (warningBytes > limitBytes && limitBytes != LIMIT_DISABLED) {
2016a85d3bddc92f0e25cbea977648cfb4d3beedc96jackqdyulei            setPolicyWarningBytesInner(template, limitBytes);
2026a85d3bddc92f0e25cbea977648cfb4d3beedc96jackqdyulei        }
2036a85d3bddc92f0e25cbea977648cfb4d3beedc96jackqdyulei
20438e932b37aea8d2f6866c3c879afa188587bcde3Wei Liu        final NetworkPolicy policy = getOrCreatePolicy(template);
20538e932b37aea8d2f6866c3c879afa188587bcde3Wei Liu        policy.limitBytes = limitBytes;
20638e932b37aea8d2f6866c3c879afa188587bcde3Wei Liu        policy.inferred = false;
20738e932b37aea8d2f6866c3c879afa188587bcde3Wei Liu        policy.clearSnooze();
20838e932b37aea8d2f6866c3c879afa188587bcde3Wei Liu        writeAsync();
20938e932b37aea8d2f6866c3c879afa188587bcde3Wei Liu    }
21038e932b37aea8d2f6866c3c879afa188587bcde3Wei Liu
21138e932b37aea8d2f6866c3c879afa188587bcde3Wei Liu    /**
21238e932b37aea8d2f6866c3c879afa188587bcde3Wei Liu     * Build a revised {@link NetworkTemplate} that matches the same rule, but
21338e932b37aea8d2f6866c3c879afa188587bcde3Wei Liu     * with an unquoted {@link NetworkTemplate#getNetworkId()}. Used to work
21438e932b37aea8d2f6866c3c879afa188587bcde3Wei Liu     * around legacy bugs.
21538e932b37aea8d2f6866c3c879afa188587bcde3Wei Liu     */
21638e932b37aea8d2f6866c3c879afa188587bcde3Wei Liu    private static NetworkTemplate buildUnquotedNetworkTemplate(NetworkTemplate template) {
21738e932b37aea8d2f6866c3c879afa188587bcde3Wei Liu        if (template == null) return null;
21838e932b37aea8d2f6866c3c879afa188587bcde3Wei Liu        final String networkId = template.getNetworkId();
21938e932b37aea8d2f6866c3c879afa188587bcde3Wei Liu        final String strippedNetworkId = WifiInfo.removeDoubleQuotes(networkId);
22038e932b37aea8d2f6866c3c879afa188587bcde3Wei Liu        if (!TextUtils.equals(strippedNetworkId, networkId)) {
22138e932b37aea8d2f6866c3c879afa188587bcde3Wei Liu            return new NetworkTemplate(
22238e932b37aea8d2f6866c3c879afa188587bcde3Wei Liu                    template.getMatchRule(), template.getSubscriberId(), strippedNetworkId);
22338e932b37aea8d2f6866c3c879afa188587bcde3Wei Liu        } else {
22438e932b37aea8d2f6866c3c879afa188587bcde3Wei Liu            return null;
22538e932b37aea8d2f6866c3c879afa188587bcde3Wei Liu        }
22638e932b37aea8d2f6866c3c879afa188587bcde3Wei Liu    }
22738e932b37aea8d2f6866c3c879afa188587bcde3Wei Liu}
228