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