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

Commit 96a19bca authored by Junyu Lai's avatar Junyu Lai
Browse files

[MS14] Move isPersistable to NetworkPolicy

Since the NetworkTemplate serialization is done in the platform
code. To decide whether the template is persistable should be
also inside the platform along with the serialization logic.

Test: atest NetworkPolicyTest
Bug: 204830222
Change-Id: I15d17dda77e6a3e1ae11275915e3d2f6e2888639
parent ba518b8b
Loading
Loading
Loading
Loading
+28 −1
Original line number Diff line number Diff line
@@ -18,8 +18,11 @@ package android.net;

import static android.net.NetworkStats.METERED_ALL;
import static android.net.NetworkStats.METERED_YES;
import static android.net.NetworkTemplate.MATCH_BLUETOOTH;
import static android.net.NetworkTemplate.MATCH_CARRIER;
import static android.net.NetworkTemplate.MATCH_ETHERNET;
import static android.net.NetworkTemplate.MATCH_MOBILE;
import static android.net.NetworkTemplate.MATCH_WIFI;
import static android.net.NetworkTemplate.SUBSCRIBER_ID_MATCH_RULE_EXACT;

import android.annotation.NonNull;
@@ -324,7 +327,7 @@ public class NetworkPolicy implements Parcelable, Comparable<NetworkPolicy> {

    @NonNull
    private byte[] getNetworkTemplateBytesForBackup() throws IOException {
        if (!template.isPersistable()) {
        if (!isTemplatePersistable(this.template)) {
            Log.wtf(TAG, "Trying to backup non-persistable template: " + this);
        }

@@ -378,4 +381,28 @@ public class NetworkPolicy implements Parcelable, Comparable<NetworkPolicy> {
                    "Restored network template contains unknown match rule " + matchRule, e);
        }
    }

    /**
     * Check if the template can be persisted into disk.
     */
    public static boolean isTemplatePersistable(@NonNull NetworkTemplate template) {
        switch (template.getMatchRule()) {
            case MATCH_BLUETOOTH:
            case MATCH_ETHERNET:
                return true;
            case MATCH_CARRIER:
            case MATCH_MOBILE:
                return !template.getSubscriberIds().isEmpty();
            case MATCH_WIFI:
                if (Objects.equals(template.getWifiNetworkKey(), null)
                        && template.getSubscriberIds().isEmpty()) {
                    return false;
                }
                return true;
            default:
                // Don't allow persistable for unknown types or legacy types such as
                // MATCH_MOBILE_WILDCARD, MATCH_PROXY, etc.
                return false;
        }
    }
}
+28 −0
Original line number Diff line number Diff line
@@ -16,6 +16,10 @@

package android.net

import android.net.NetworkTemplate.MATCH_BLUETOOTH
import android.net.NetworkTemplate.MATCH_ETHERNET
import android.net.NetworkTemplate.MATCH_MOBILE
import android.net.NetworkTemplate.MATCH_WIFI
import android.text.format.Time.TIMEZONE_UTC
import androidx.test.runner.AndroidJUnit4
import org.junit.Test
@@ -24,6 +28,8 @@ import java.io.ByteArrayInputStream
import java.io.DataInputStream
import java.time.ZoneId
import kotlin.test.assertEquals
import kotlin.test.assertFalse
import kotlin.test.assertTrue

private const val TEST_IMSI1 = "TESTIMSI1"
private const val TEST_SSID1 = "TESTISSID1"
@@ -53,4 +59,26 @@ class NetworkPolicyTest {
        val restored = NetworkPolicy.getNetworkPolicyFromBackup(stream)
        assertEquals(policy, restored)
    }

    @Test
    fun testIsTemplatePersistable() {
        listOf(MATCH_MOBILE, MATCH_WIFI).forEach {
            // Verify wildcard templates cannot be persistable.
            assertFalse(NetworkPolicy.isTemplatePersistable(NetworkTemplate.Builder(it).build()))

            // Verify mobile/wifi templates can be persistable if the Subscriber Id is supplied.
            assertTrue(NetworkPolicy.isTemplatePersistable(NetworkTemplate.Builder(it)
                    .setSubscriberIds(setOf(TEST_IMSI1)).build()))
        }

        // Verify bluetooth and ethernet templates can be persistable without any other
        // field is supplied.
        listOf(MATCH_BLUETOOTH, MATCH_ETHERNET).forEach {
            assertTrue(NetworkPolicy.isTemplatePersistable(NetworkTemplate.Builder(it).build()))
        }

        // Verify wifi template can be persistable if the Wifi Network Key is supplied.
        assertTrue(NetworkPolicy.isTemplatePersistable(NetworkTemplate.Builder(MATCH_WIFI)
                .setWifiNetworkKey(TEST_SSID1).build()))
    }
}
 No newline at end of file
+0 −24
Original line number Diff line number Diff line
@@ -559,30 +559,6 @@ public final class NetworkTemplate implements Parcelable {
        }
    }

    /**
     * Check if the template can be persisted into disk.
     *
     * @hide
     */
    // TODO: Move to the NetworkPolicy.
    public boolean isPersistable() {
        switch (mMatchRule) {
            case MATCH_MOBILE_WILDCARD:
            case MATCH_WIFI_WILDCARD:
                return false;
            case MATCH_CARRIER:
                return mSubscriberId != null;
            case MATCH_WIFI:
                if (Objects.equals(mNetworkId, WIFI_NETWORK_KEY_ALL)
                        && mSubscriberIdMatchRule == SUBSCRIBER_ID_MATCH_RULE_ALL) {
                    return false;
                }
                return true;
            default:
                return true;
        }
    }

    /**
     * Get match rule of the template. See {@code MATCH_*}.
     */
+2 −2
Original line number Diff line number Diff line
@@ -2456,7 +2456,7 @@ public class NetworkPolicyManagerService extends INetworkPolicyManager.Stub {
                                networkId, templateMeteredness, NetworkStats.ROAMING_ALL,
                                NetworkStats.DEFAULT_NETWORK_ALL, NetworkTemplate.NETWORK_TYPE_ALL,
                                NetworkTemplate.OEM_MANAGED_ALL, subscriberIdMatchRule);
                        if (template.isPersistable()) {
                        if (NetworkPolicy.isTemplatePersistable(template)) {
                            mNetworkPolicy.put(template, new NetworkPolicy(template, cycleRule,
                                    warningBytes, limitBytes, lastWarningSnooze,
                                    lastLimitSnooze, metered, inferred));
@@ -2663,7 +2663,7 @@ public class NetworkPolicyManagerService extends INetworkPolicyManager.Stub {
            for (int i = 0; i < mNetworkPolicy.size(); i++) {
                final NetworkPolicy policy = mNetworkPolicy.valueAt(i);
                final NetworkTemplate template = policy.template;
                if (!template.isPersistable()) continue;
                if (!NetworkPolicy.isTemplatePersistable(template)) continue;

                out.startTag(null, TAG_NETWORK_POLICY);
                writeIntAttribute(out, ATTR_NETWORK_TEMPLATE, template.getMatchRule());