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

Commit f76916a1 authored by James Mattis's avatar James Mattis Committed by Gerrit Code Review
Browse files

Merge changes Iabad7300,I85363e28

* changes:
  Stubbed setOemNetworkPreference in Connectivity
  Update OemNetworkPreferences to use 1:1 Map
parents 39338def 59084d66
Loading
Loading
Loading
Loading
+49 −22
Original line number Diff line number Diff line
/*
 * Copyright (C) 2020 The Android Open Source Project
 * Copyright (C) 2021 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
@@ -18,14 +18,14 @@ package android.net;

import android.annotation.IntDef;
import android.annotation.NonNull;
import android.os.Bundle;
import android.os.Parcelable;
import android.util.SparseArray;

import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.HashMap;
import java.util.Map;
import java.util.Objects;

/** @hide */
@@ -60,16 +60,16 @@ public final class OemNetworkPreferences implements Parcelable {
    public static final int OEM_NETWORK_PREFERENCE_OEM_PRIVATE_ONLY = 4;

    @NonNull
    private final SparseArray<List<String>> mNetworkMappings;
    private final Bundle mNetworkMappings;

    @NonNull
    public SparseArray<List<String>> getNetworkPreferences() {
        return mNetworkMappings.clone();
    public Map<String, Integer> getNetworkPreferences() {
        return convertToUnmodifiableMap(mNetworkMappings);
    }

    private OemNetworkPreferences(@NonNull SparseArray<List<String>> networkMappings) {
    private OemNetworkPreferences(@NonNull final Bundle networkMappings) {
        Objects.requireNonNull(networkMappings);
        mNetworkMappings = networkMappings.clone();
        mNetworkMappings = (Bundle) networkMappings.clone();
    }

    @Override
@@ -99,26 +99,45 @@ public final class OemNetworkPreferences implements Parcelable {
     * @hide
     */
    public static final class Builder {
        private final SparseArray<List<String>> mNetworkMappings;
        private final Bundle mNetworkMappings;

        public Builder() {
            mNetworkMappings = new SparseArray<>();
            mNetworkMappings = new Bundle();
        }

        public Builder(@NonNull final OemNetworkPreferences preferences) {
            Objects.requireNonNull(preferences);
            mNetworkMappings = (Bundle) preferences.mNetworkMappings.clone();
        }

        /**
         * Add a network preference for a list of packages.
         * Add a network preference for a given package. Previously stored values for the given
         * package will be overwritten.
         *
         * @param packageName full package name (e.g.: "com.google.apps.contacts") of the app
         *                    to use the given preference
         * @param preference  the desired network preference to use
         * @param packages   full package names (e.g.: "com.google.apps.contacts") for apps to use
         *                   the given preference
         * @return The builder to facilitate chaining.
         */
        @NonNull
        public Builder addNetworkPreference(@OemNetworkPreference final int preference,
                @NonNull List<String> packages) {
            Objects.requireNonNull(packages);
            mNetworkMappings.put(preference,
                    Collections.unmodifiableList(new ArrayList<>(packages)));
        public Builder addNetworkPreference(@NonNull final String packageName,
                @OemNetworkPreference final int preference) {
            Objects.requireNonNull(packageName);
            mNetworkMappings.putInt(packageName, preference);
            return this;
        }

        /**
         * Remove a network preference for a given package.
         *
         * @param packageName full package name (e.g.: "com.google.apps.contacts") of the app to
         *                    remove a preference for.
         * @return The builder to facilitate chaining.
         */
        @NonNull
        public Builder removeNetworkPreference(@NonNull final String packageName) {
            Objects.requireNonNull(packageName);
            mNetworkMappings.remove(packageName);
            return this;
        }

@@ -131,6 +150,14 @@ public final class OemNetworkPreferences implements Parcelable {
        }
    }

    private static Map<String, Integer> convertToUnmodifiableMap(@NonNull final Bundle bundle) {
        final Map<String, Integer> networkPreferences = new HashMap<>();
        for (final String key : bundle.keySet()) {
            networkPreferences.put(key, bundle.getInt(key));
        }
        return Collections.unmodifiableMap(networkPreferences);
    }

    /** @hide */
    @IntDef(prefix = "OEM_NETWORK_PREFERENCE_", value = {
            OEM_NETWORK_PREFERENCE_DEFAULT,
@@ -168,7 +195,7 @@ public final class OemNetworkPreferences implements Parcelable {

    @Override
    public void writeToParcel(@NonNull android.os.Parcel dest, int flags) {
        dest.writeSparseArray(mNetworkMappings);
        dest.writeBundle(mNetworkMappings);
    }

    @Override
@@ -187,7 +214,7 @@ public final class OemNetworkPreferences implements Parcelable {
                @Override
                public OemNetworkPreferences createFromParcel(@NonNull android.os.Parcel in) {
                    return new OemNetworkPreferences(
                            in.readSparseArray(getClass().getClassLoader()));
                            in.readBundle(getClass().getClassLoader()));
                }
            };
}
+7 −3
Original line number Diff line number Diff line
@@ -4845,9 +4845,13 @@ public class ConnectivityManager {
        }
    }

    private void setOemNetworkPreference(@NonNull OemNetworkPreferences preference) {
        Log.d(TAG, "setOemNetworkPreference called with preference: "
                + preference.toString());
    private void setOemNetworkPreference(@NonNull final OemNetworkPreferences preference) {
        try {
            mService.setOemNetworkPreference(preference);
        } catch (RemoteException e) {
            Log.e(TAG, "setOemNetworkPreference() failed for preference: " + preference.toString());
            throw e.rethrowFromSystemServer();
        }
    }

    @NonNull
+3 −0
Original line number Diff line number Diff line
@@ -29,6 +29,7 @@ import android.net.NetworkCapabilities;
import android.net.NetworkInfo;
import android.net.NetworkRequest;
import android.net.NetworkState;
import android.net.OemNetworkPreferences;
import android.net.ProxyInfo;
import android.net.UidRange;
import android.net.QosSocketInfo;
@@ -240,4 +241,6 @@ interface IConnectivityManager

    void registerQosSocketCallback(in QosSocketInfo socketInfo, in IQosCallback callback);
    void unregisterQosCallback(in IQosCallback callback);

    void setOemNetworkPreference(in OemNetworkPreferences preference);
}
+8 −0
Original line number Diff line number Diff line
@@ -120,6 +120,7 @@ import android.net.NetworkState;
import android.net.NetworkTestResultParcelable;
import android.net.NetworkUtils;
import android.net.NetworkWatchlistManager;
import android.net.OemNetworkPreferences;
import android.net.PrivateDnsConfigParcel;
import android.net.ProxyInfo;
import android.net.QosCallbackException;
@@ -9100,6 +9101,7 @@ public class ConnectivityService extends IConnectivityManager.Stub
            }
        }
    }

    /**
     * Registers {@link QosSocketFilter} with {@link IQosCallback}.
     *
@@ -9149,4 +9151,10 @@ public class ConnectivityService extends IConnectivityManager.Stub
    public void unregisterQosCallback(@NonNull final IQosCallback callback) {
        mQosCallbackTracker.unregisterCallback(callback);
    }

    @Override
    public void setOemNetworkPreference(@NonNull final OemNetworkPreferences preference) {
        // TODO http://b/176495594 track multiple default networks with networkPreferences
        if (DBG) log("setOemNetworkPreference() called with: " + preference.toString());
    }
}
+68 −24
Original line number Diff line number Diff line
/*
 * Copyright (C) 2020 The Android Open Source Project
 * Copyright (C) 2021 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
@@ -20,22 +20,20 @@ import static com.android.testutils.MiscAsserts.assertThrows;
import static com.android.testutils.ParcelUtils.assertParcelSane;

import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;

import android.os.Build;
import android.util.SparseArray;

import androidx.test.filters.SmallTest;

import com.android.testutils.DevSdkIgnoreRule.IgnoreUpTo;
import com.android.testutils.DevSdkIgnoreRunner;

import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;

import java.util.ArrayList;
import java.util.List;
import java.util.Map;

@IgnoreUpTo(Build.VERSION_CODES.R)
@RunWith(DevSdkIgnoreRunner.class)
@@ -45,51 +43,51 @@ public class OemNetworkPreferencesTest {
    private static final int TEST_PREF = OemNetworkPreferences.OEM_NETWORK_PREFERENCE_DEFAULT;
    private static final String TEST_PACKAGE = "com.google.apps.contacts";

    private final List<String> mPackages = new ArrayList<>();
    private final OemNetworkPreferences.Builder mBuilder = new OemNetworkPreferences.Builder();

    @Before
    public void beforeEachTestMethod() {
        mPackages.add(TEST_PACKAGE);
    @Test
    public void testBuilderAddNetworkPreferenceRequiresNonNullPackageName() {
        assertThrows(NullPointerException.class,
                () -> mBuilder.addNetworkPreference(null, TEST_PREF));
    }

    @Test
    public void builderAddNetworkPreferenceRequiresNonNullPackages() {
    public void testBuilderRemoveNetworkPreferenceRequiresNonNullPackageName() {
        assertThrows(NullPointerException.class,
                () -> mBuilder.addNetworkPreference(TEST_PREF, null));
                () -> mBuilder.removeNetworkPreference(null));
    }

    @Test
    public void getNetworkPreferencesReturnsCorrectValue() {
    public void testGetNetworkPreferenceReturnsCorrectValue() {
        final int expectedNumberOfMappings = 1;
        mBuilder.addNetworkPreference(TEST_PREF, mPackages);
        mBuilder.addNetworkPreference(TEST_PACKAGE, TEST_PREF);

        final SparseArray<List<String>> networkPreferences =
        final Map<String, Integer> networkPreferences =
                mBuilder.build().getNetworkPreferences();

        assertEquals(expectedNumberOfMappings, networkPreferences.size());
        assertEquals(mPackages.size(), networkPreferences.get(TEST_PREF).size());
        assertEquals(mPackages.get(0), networkPreferences.get(TEST_PREF).get(0));
        assertTrue(networkPreferences.containsKey(TEST_PACKAGE));
    }

    @Test
    public void getNetworkPreferencesReturnsUnmodifiableValue() {
    public void testGetNetworkPreferenceReturnsUnmodifiableValue() {
        final String newPackage = "new.com.google.apps.contacts";
        mBuilder.addNetworkPreference(TEST_PREF, mPackages);
        mBuilder.addNetworkPreference(TEST_PACKAGE, TEST_PREF);

        final SparseArray<List<String>> networkPreferences =
        final Map<String, Integer> networkPreferences =
                mBuilder.build().getNetworkPreferences();

        assertThrows(UnsupportedOperationException.class,
                () -> networkPreferences.get(TEST_PREF).set(mPackages.size() - 1, newPackage));
                () -> networkPreferences.put(newPackage, TEST_PREF));

        assertThrows(UnsupportedOperationException.class,
                () -> networkPreferences.get(TEST_PREF).add(newPackage));
                () -> networkPreferences.remove(TEST_PACKAGE));

    }

    @Test
    public void toStringReturnsCorrectValue() {
        mBuilder.addNetworkPreference(TEST_PREF, mPackages);
    public void testToStringReturnsCorrectValue() {
        mBuilder.addNetworkPreference(TEST_PACKAGE, TEST_PREF);

        final String networkPreferencesString = mBuilder.build().getNetworkPreferences().toString();

@@ -99,10 +97,56 @@ public class OemNetworkPreferencesTest {

    @Test
    public void testOemNetworkPreferencesParcelable() {
        mBuilder.addNetworkPreference(TEST_PREF, mPackages);
        mBuilder.addNetworkPreference(TEST_PACKAGE, TEST_PREF);

        final OemNetworkPreferences prefs = mBuilder.build();

        assertParcelSane(prefs, 1 /* fieldCount */);
    }

    @Test
    public void testAddNetworkPreferenceOverwritesPriorPreference() {
        final int newPref = OemNetworkPreferences.OEM_NETWORK_PREFERENCE_OEM_PAID;
        mBuilder.addNetworkPreference(TEST_PACKAGE, TEST_PREF);
        Map<String, Integer> networkPreferences =
                mBuilder.build().getNetworkPreferences();

        assertTrue(networkPreferences.containsKey(TEST_PACKAGE));
        assertEquals(networkPreferences.get(TEST_PACKAGE).intValue(), TEST_PREF);

        mBuilder.addNetworkPreference(TEST_PACKAGE, newPref);
        networkPreferences = mBuilder.build().getNetworkPreferences();

        assertTrue(networkPreferences.containsKey(TEST_PACKAGE));
        assertEquals(networkPreferences.get(TEST_PACKAGE).intValue(), newPref);
    }

    @Test
    public void testRemoveNetworkPreferenceRemovesValue() {
        mBuilder.addNetworkPreference(TEST_PACKAGE, TEST_PREF);
        Map<String, Integer> networkPreferences =
                mBuilder.build().getNetworkPreferences();

        assertTrue(networkPreferences.containsKey(TEST_PACKAGE));

        mBuilder.removeNetworkPreference(TEST_PACKAGE);
        networkPreferences = mBuilder.build().getNetworkPreferences();

        assertFalse(networkPreferences.containsKey(TEST_PACKAGE));
    }

    @Test
    public void testConstructorByOemNetworkPreferencesSetsValue() {
        mBuilder.addNetworkPreference(TEST_PACKAGE, TEST_PREF);
        OemNetworkPreferences networkPreference = mBuilder.build();

        final Map<String, Integer> networkPreferences =
                new OemNetworkPreferences
                        .Builder(networkPreference)
                        .build()
                        .getNetworkPreferences();

        assertTrue(networkPreferences.containsKey(TEST_PACKAGE));
        assertEquals(networkPreferences.get(TEST_PACKAGE).intValue(), TEST_PREF);
    }
}