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

Commit 303166ae authored by Andrew Sapperstein's avatar Andrew Sapperstein Committed by Android (Google) Code Review
Browse files

Merge changes I4d967137,Ifdae8e18 into udc-dev

* changes:
  API Review: SharedConnectivityManager & SharedConnectivityService
  API Review: KnownNetwork changes.
parents fab0ec06 44d3fa63
Loading
Loading
Loading
Loading
+16 −15
Original line number Diff line number Diff line
@@ -10028,21 +10028,22 @@ package android.net.wifi.sharedconnectivity.app {
  public final class KnownNetwork implements android.os.Parcelable {
    method public int describeContents();
    method @NonNull public android.net.wifi.sharedconnectivity.app.DeviceInfo getDeviceInfo();
    method @Nullable public android.net.wifi.sharedconnectivity.app.DeviceInfo getDeviceInfo();
    method public int getNetworkSource();
    method @NonNull public java.util.Set<java.lang.Integer> getSecurityTypes();
    method @NonNull public String getSsid();
    method public void writeToParcel(@NonNull android.os.Parcel, int);
    field @NonNull public static final android.os.Parcelable.Creator<android.net.wifi.sharedconnectivity.app.KnownNetwork> CREATOR;
    field public static final int NETWORK_SOURCE_CLOUD_SELF = 1; // 0x1
    field public static final int NETWORK_SOURCE_NEARBY_SELF = 0; // 0x0
    field public static final int NETWORK_SOURCE_CLOUD_SELF = 2; // 0x2
    field public static final int NETWORK_SOURCE_NEARBY_SELF = 1; // 0x1
    field public static final int NETWORK_SOURCE_UNKNOWN = 0; // 0x0
  }
  public static final class KnownNetwork.Builder {
    ctor public KnownNetwork.Builder();
    method @NonNull public android.net.wifi.sharedconnectivity.app.KnownNetwork.Builder addSecurityType(int);
    method @NonNull public android.net.wifi.sharedconnectivity.app.KnownNetwork build();
    method @NonNull public android.net.wifi.sharedconnectivity.app.KnownNetwork.Builder setDeviceInfo(@NonNull android.net.wifi.sharedconnectivity.app.DeviceInfo);
    method @NonNull public android.net.wifi.sharedconnectivity.app.KnownNetwork.Builder setDeviceInfo(@Nullable android.net.wifi.sharedconnectivity.app.DeviceInfo);
    method @NonNull public android.net.wifi.sharedconnectivity.app.KnownNetwork.Builder setNetworkSource(int);
    method @NonNull public android.net.wifi.sharedconnectivity.app.KnownNetwork.Builder setSsid(@NonNull String);
  }
@@ -10079,17 +10080,17 @@ package android.net.wifi.sharedconnectivity.app {
  }
  public class SharedConnectivityManager {
    method public boolean connectKnownNetwork(@NonNull android.net.wifi.sharedconnectivity.app.KnownNetwork);
    method public boolean connectTetherNetwork(@NonNull android.net.wifi.sharedconnectivity.app.TetherNetwork);
    method public boolean disconnectTetherNetwork(@NonNull android.net.wifi.sharedconnectivity.app.TetherNetwork);
    method public boolean forgetKnownNetwork(@NonNull android.net.wifi.sharedconnectivity.app.KnownNetwork);
    method @Nullable public android.net.wifi.sharedconnectivity.app.KnownNetworkConnectionStatus getKnownNetworkConnectionStatus();
    method @NonNull public java.util.List<android.net.wifi.sharedconnectivity.app.KnownNetwork> getKnownNetworks();
    method @Nullable public android.net.wifi.sharedconnectivity.app.SharedConnectivitySettingsState getSettingsState();
    method @Nullable public android.net.wifi.sharedconnectivity.app.TetherNetworkConnectionStatus getTetherNetworkConnectionStatus();
    method @NonNull public java.util.List<android.net.wifi.sharedconnectivity.app.TetherNetwork> getTetherNetworks();
    method public void registerCallback(@NonNull java.util.concurrent.Executor, @NonNull android.net.wifi.sharedconnectivity.app.SharedConnectivityClientCallback);
    method public boolean unregisterCallback(@NonNull android.net.wifi.sharedconnectivity.app.SharedConnectivityClientCallback);
    method @RequiresPermission(anyOf={android.Manifest.permission.NETWORK_SETTINGS, android.Manifest.permission.NETWORK_SETUP_WIZARD}) public boolean connectKnownNetwork(@NonNull android.net.wifi.sharedconnectivity.app.KnownNetwork);
    method @RequiresPermission(anyOf={android.Manifest.permission.NETWORK_SETTINGS, android.Manifest.permission.NETWORK_SETUP_WIZARD}) public boolean connectTetherNetwork(@NonNull android.net.wifi.sharedconnectivity.app.TetherNetwork);
    method @RequiresPermission(anyOf={android.Manifest.permission.NETWORK_SETTINGS, android.Manifest.permission.NETWORK_SETUP_WIZARD}) public boolean disconnectTetherNetwork(@NonNull android.net.wifi.sharedconnectivity.app.TetherNetwork);
    method @RequiresPermission(anyOf={android.Manifest.permission.NETWORK_SETTINGS, android.Manifest.permission.NETWORK_SETUP_WIZARD}) public boolean forgetKnownNetwork(@NonNull android.net.wifi.sharedconnectivity.app.KnownNetwork);
    method @Nullable @RequiresPermission(anyOf={android.Manifest.permission.NETWORK_SETTINGS, android.Manifest.permission.NETWORK_SETUP_WIZARD}) public android.net.wifi.sharedconnectivity.app.KnownNetworkConnectionStatus getKnownNetworkConnectionStatus();
    method @NonNull @RequiresPermission(anyOf={android.Manifest.permission.NETWORK_SETTINGS, android.Manifest.permission.NETWORK_SETUP_WIZARD}) public java.util.List<android.net.wifi.sharedconnectivity.app.KnownNetwork> getKnownNetworks();
    method @Nullable @RequiresPermission(anyOf={android.Manifest.permission.NETWORK_SETTINGS, android.Manifest.permission.NETWORK_SETUP_WIZARD}) public android.net.wifi.sharedconnectivity.app.SharedConnectivitySettingsState getSettingsState();
    method @Nullable @RequiresPermission(anyOf={android.Manifest.permission.NETWORK_SETTINGS, android.Manifest.permission.NETWORK_SETUP_WIZARD}) public android.net.wifi.sharedconnectivity.app.TetherNetworkConnectionStatus getTetherNetworkConnectionStatus();
    method @NonNull @RequiresPermission(anyOf={android.Manifest.permission.NETWORK_SETTINGS, android.Manifest.permission.NETWORK_SETUP_WIZARD}) public java.util.List<android.net.wifi.sharedconnectivity.app.TetherNetwork> getTetherNetworks();
    method @RequiresPermission(anyOf={android.Manifest.permission.NETWORK_SETTINGS, android.Manifest.permission.NETWORK_SETUP_WIZARD}) public void registerCallback(@NonNull java.util.concurrent.Executor, @NonNull android.net.wifi.sharedconnectivity.app.SharedConnectivityClientCallback);
    method @RequiresPermission(anyOf={android.Manifest.permission.NETWORK_SETTINGS, android.Manifest.permission.NETWORK_SETUP_WIZARD}) public boolean unregisterCallback(@NonNull android.net.wifi.sharedconnectivity.app.SharedConnectivityClientCallback);
  }
  public final class SharedConnectivitySettingsState implements android.os.Parcelable {
+26 −10
Original line number Diff line number Diff line
@@ -20,6 +20,7 @@ import static android.net.wifi.WifiAnnotations.SecurityType;

import android.annotation.IntDef;
import android.annotation.NonNull;
import android.annotation.Nullable;
import android.annotation.SystemApi;
import android.os.Parcel;
import android.os.Parcelable;
@@ -38,21 +39,28 @@ import java.util.Set;
 */
@SystemApi
public final class KnownNetwork implements Parcelable {

    /**
     * Network source is unknown.
     */
    public static final int NETWORK_SOURCE_UNKNOWN = 0;

    /**
     * Network is known by a nearby device with the same user account.
     */
    public static final int NETWORK_SOURCE_NEARBY_SELF = 0;
    public static final int NETWORK_SOURCE_NEARBY_SELF = 1;

    /**
     * Network is known via cloud storage associated with this device's user account.
     */
    public static final int NETWORK_SOURCE_CLOUD_SELF = 1;
    public static final int NETWORK_SOURCE_CLOUD_SELF = 2;

    /**
     * @hide
     */
    @Retention(RetentionPolicy.SOURCE)
    @IntDef({
            NETWORK_SOURCE_UNKNOWN,
            NETWORK_SOURCE_NEARBY_SELF,
            NETWORK_SOURCE_CLOUD_SELF
    })
@@ -110,12 +118,13 @@ public final class KnownNetwork implements Parcelable {

        /**
         * Sets the device information of the device providing connectivity.
         * Must be set if network source is {@link KnownNetwork#NETWORK_SOURCE_NEARBY_SELF}.
         *
         * @param deviceInfo The device information object.
         * @return Returns the Builder object.
         */
        @NonNull
        public Builder setDeviceInfo(@NonNull DeviceInfo deviceInfo) {
        public Builder setDeviceInfo(@Nullable DeviceInfo deviceInfo) {
            mDeviceInfo = deviceInfo;
            return this;
        }
@@ -135,9 +144,11 @@ public final class KnownNetwork implements Parcelable {
        }
    }

    private static void validate(int networkSource, String ssid, Set<Integer> securityTypes) {
        if (networkSource != NETWORK_SOURCE_CLOUD_SELF && networkSource
                != NETWORK_SOURCE_NEARBY_SELF) {
    private static void validate(int networkSource, String ssid, Set<Integer> securityTypes,
            DeviceInfo deviceInfo) {
        if (networkSource != NETWORK_SOURCE_UNKNOWN
                && networkSource != NETWORK_SOURCE_CLOUD_SELF
                && networkSource != NETWORK_SOURCE_NEARBY_SELF) {
            throw new IllegalArgumentException("Illegal network source");
        }
        if (TextUtils.isEmpty(ssid)) {
@@ -146,14 +157,18 @@ public final class KnownNetwork implements Parcelable {
        if (securityTypes.isEmpty()) {
            throw new IllegalArgumentException("SecurityTypes must be set");
        }
        if (networkSource == NETWORK_SOURCE_NEARBY_SELF && deviceInfo == null) {
            throw new IllegalArgumentException("Device info must be provided when network source"
                    + " is NETWORK_SOURCE_NEARBY_SELF");
        }
    }

    private KnownNetwork(
            @NetworkSource int networkSource,
            @NonNull String ssid,
            @NonNull @SecurityType ArraySet<Integer> securityTypes,
            @NonNull DeviceInfo deviceInfo) {
        validate(networkSource, ssid, securityTypes);
            @Nullable DeviceInfo deviceInfo) {
        validate(networkSource, ssid, securityTypes, deviceInfo);
        mNetworkSource = networkSource;
        mSsid = ssid;
        mSecurityTypes = new ArraySet<>(securityTypes);
@@ -194,9 +209,10 @@ public final class KnownNetwork implements Parcelable {
    /**
     * Gets the device information of the device providing connectivity.
     *
     * @return Returns the information of the device providing the known network.
     * @return Returns the information of the device providing the known network. Can be null if the
     * network source is cloud or unknown.
     */
    @NonNull
    @Nullable
    public DeviceInfo getDeviceInfo() {
        return mDeviceInfo;
    }
+26 −4
Original line number Diff line number Diff line
@@ -19,6 +19,7 @@ package android.net.wifi.sharedconnectivity.app;
import android.annotation.CallbackExecutor;
import android.annotation.NonNull;
import android.annotation.Nullable;
import android.annotation.RequiresPermission;
import android.annotation.SuppressLint;
import android.annotation.SystemApi;
import android.annotation.TestApi;
@@ -151,7 +152,7 @@ public class SharedConnectivityManager {
     * Creates a new instance of {@link SharedConnectivityManager}.
     *
     * Automatically binds to implementation of {@link SharedConnectivityService} specified in
     * device overlay.
     * the device overlay.
     *
     * @return An instance of {@link SharedConnectivityManager} or null if the shared connectivity
     * service is not found.
@@ -266,9 +267,10 @@ public class SharedConnectivityManager {
     *
     * @param executor The Executor used to invoke the callback.
     * @param callback The callback of type {@link SharedConnectivityClientCallback} that is invoked
     *                 when the service updates either the list of Tether Networks or Known
     *                 Networks.
     *                 when the service updates its data.
     */
    @RequiresPermission(anyOf = {android.Manifest.permission.NETWORK_SETTINGS,
            android.Manifest.permission.NETWORK_SETUP_WIZARD})
    public void registerCallback(@NonNull @CallbackExecutor Executor executor,
            @NonNull SharedConnectivityClientCallback callback) {
        Objects.requireNonNull(executor, "executor cannot be null");
@@ -297,6 +299,8 @@ public class SharedConnectivityManager {
     *
     * @return Returns true if the callback was successfully unregistered, false otherwise.
     */
    @RequiresPermission(anyOf = {android.Manifest.permission.NETWORK_SETTINGS,
            android.Manifest.permission.NETWORK_SETUP_WIZARD})
    public boolean unregisterCallback(
            @NonNull SharedConnectivityClientCallback callback) {
        Objects.requireNonNull(callback, "callback cannot be null");
@@ -334,6 +338,8 @@ public class SharedConnectivityManager {
     * @return Returns true if the service received the command. Does not guarantee that the
     *         connection was successful.
     */
    @RequiresPermission(anyOf = {android.Manifest.permission.NETWORK_SETTINGS,
            android.Manifest.permission.NETWORK_SETUP_WIZARD})
    public boolean connectTetherNetwork(@NonNull TetherNetwork network) {
        Objects.requireNonNull(network, "Tether network cannot be null");

@@ -359,6 +365,8 @@ public class SharedConnectivityManager {
     * @return Returns true if the service received the command. Does not guarantee that the
     *         disconnection was successful.
     */
    @RequiresPermission(anyOf = {android.Manifest.permission.NETWORK_SETTINGS,
            android.Manifest.permission.NETWORK_SETUP_WIZARD})
    public boolean disconnectTetherNetwork(@NonNull TetherNetwork network) {
        if (mService == null) {
            return false;
@@ -382,6 +390,8 @@ public class SharedConnectivityManager {
     * @return Returns true if the service received the command. Does not guarantee that the
     *         connection was successful.
     */
    @RequiresPermission(anyOf = {android.Manifest.permission.NETWORK_SETTINGS,
            android.Manifest.permission.NETWORK_SETUP_WIZARD})
    public boolean connectKnownNetwork(@NonNull KnownNetwork network) {
        Objects.requireNonNull(network, "Known network cannot be null");

@@ -405,6 +415,8 @@ public class SharedConnectivityManager {
     * @return Returns true if the service received the command. Does not guarantee that the
     *         forget action was successful.
     */
    @RequiresPermission(anyOf = {android.Manifest.permission.NETWORK_SETTINGS,
            android.Manifest.permission.NETWORK_SETUP_WIZARD})
    public boolean forgetKnownNetwork(@NonNull KnownNetwork network) {
        Objects.requireNonNull(network, "Known network cannot be null");

@@ -426,6 +438,8 @@ public class SharedConnectivityManager {
     *
     * @return Returns a {@link List} of {@link TetherNetwork} objects, empty list on failure.
     */
    @RequiresPermission(anyOf = {android.Manifest.permission.NETWORK_SETTINGS,
            android.Manifest.permission.NETWORK_SETUP_WIZARD})
    @NonNull
    public List<TetherNetwork> getTetherNetworks() {
        if (mService == null) {
@@ -445,6 +459,8 @@ public class SharedConnectivityManager {
     *
     * @return Returns a {@link List} of {@link KnownNetwork} objects, empty list on failure.
     */
    @RequiresPermission(anyOf = {android.Manifest.permission.NETWORK_SETTINGS,
            android.Manifest.permission.NETWORK_SETUP_WIZARD})
    @NonNull
    public List<KnownNetwork> getKnownNetworks() {
        if (mService == null) {
@@ -465,6 +481,8 @@ public class SharedConnectivityManager {
     * @return Returns a {@link SharedConnectivitySettingsState} object with the state, null on
     * failure.
     */
    @RequiresPermission(anyOf = {android.Manifest.permission.NETWORK_SETTINGS,
            android.Manifest.permission.NETWORK_SETUP_WIZARD})
    @Nullable
    public SharedConnectivitySettingsState getSettingsState() {
        if (mService == null) {
@@ -486,6 +504,8 @@ public class SharedConnectivityManager {
     * null on failure. If no connection is active the status will be
     * {@link TetherNetworkConnectionStatus#CONNECTION_STATUS_UNKNOWN}.
     */
    @RequiresPermission(anyOf = {android.Manifest.permission.NETWORK_SETTINGS,
            android.Manifest.permission.NETWORK_SETUP_WIZARD})
    @Nullable
    public TetherNetworkConnectionStatus getTetherNetworkConnectionStatus() {
        if (mService == null) {
@@ -507,6 +527,8 @@ public class SharedConnectivityManager {
     * null on failure. If no connection is active the status will be
     * {@link KnownNetworkConnectionStatus#CONNECTION_STATUS_UNKNOWN}.
     */
    @RequiresPermission(anyOf = {android.Manifest.permission.NETWORK_SETTINGS,
            android.Manifest.permission.NETWORK_SETUP_WIZARD})
    @Nullable
    public KnownNetworkConnectionStatus getKnownNetworkConnectionStatus() {
        if (mService == null) {
+82 −0
Original line number Diff line number Diff line
@@ -82,66 +82,148 @@ public abstract class SharedConnectivityService extends Service {
        if (DEBUG) Log.i(TAG, "onBind intent=" + intent);
        mHandler = new Handler(getMainLooper());
        IBinder serviceStub = new ISharedConnectivityService.Stub() {

            /**
             * Registers a callback for receiving updates to the list of Tether Networks, Known
             * Networks, shared connectivity settings state, tether network connection status and
             * known network connection status.
             *
             * @param callback The callback of type {@link ISharedConnectivityCallback} to be called
             *                 when there is update to the data.
             */
            @RequiresPermission(anyOf = {android.Manifest.permission.NETWORK_SETTINGS,
                    android.Manifest.permission.NETWORK_SETUP_WIZARD})
            @Override
            public void registerCallback(ISharedConnectivityCallback callback) {
                checkPermissions();
                mHandler.post(() -> onRegisterCallback(callback));
            }

            /**
             * Unregisters a previously registered callback.
             *
             * @param callback The callback to unregister.
             */
            @RequiresPermission(anyOf = {android.Manifest.permission.NETWORK_SETTINGS,
                    android.Manifest.permission.NETWORK_SETUP_WIZARD})
            @Override
            public void unregisterCallback(ISharedConnectivityCallback callback) {
                checkPermissions();
                mHandler.post(() -> onUnregisterCallback(callback));
            }

            /**
             * Connects to a tether network.
             *
             * @param network The network to connect to.
             */
            @RequiresPermission(anyOf = {android.Manifest.permission.NETWORK_SETTINGS,
                    android.Manifest.permission.NETWORK_SETUP_WIZARD})
            @Override
            public void connectTetherNetwork(TetherNetwork network) {
                checkPermissions();
                mHandler.post(() -> onConnectTetherNetwork(network));
            }

            /**
             * Disconnects from a previously connected tether network.
             *
             * @param network The network to disconnect from.
             */
            @RequiresPermission(anyOf = {android.Manifest.permission.NETWORK_SETTINGS,
                    android.Manifest.permission.NETWORK_SETUP_WIZARD})
            @Override
            public void disconnectTetherNetwork(TetherNetwork network) {
                checkPermissions();
                mHandler.post(() -> onDisconnectTetherNetwork(network));
            }

            /**
             * Adds a known network to the available networks on the device and connects to it.
             *
             * @param network The network to connect to.
             */
            @RequiresPermission(anyOf = {android.Manifest.permission.NETWORK_SETTINGS,
                    android.Manifest.permission.NETWORK_SETUP_WIZARD})
            @Override
            public void connectKnownNetwork(KnownNetwork network) {
                checkPermissions();
                mHandler.post(() -> onConnectKnownNetwork(network));
            }

            /**
             * Removes a known network from the available networks on the device which will also
             * disconnect the device from the network if it is connected to it.
             *
             * @param network The network to forget.
             */
            @Override
            public void forgetKnownNetwork(KnownNetwork network) {
                checkPermissions();
                mHandler.post(() -> onForgetKnownNetwork(network));
            }

            /**
             * Gets the list of tether networks the user can select to connect to.
             *
             * @return Returns a {@link List} of {@link TetherNetwork} objects
             */
            @RequiresPermission(anyOf = {android.Manifest.permission.NETWORK_SETTINGS,
                    android.Manifest.permission.NETWORK_SETUP_WIZARD})
            @Override
            public List<TetherNetwork> getTetherNetworks() {
                checkPermissions();
                return mTetherNetworks;
            }

            /**
             * Gets the list of known networks the user can select to connect to.
             *
             * @return Returns a {@link List} of {@link KnownNetwork} objects.
             */
            @RequiresPermission(anyOf = {android.Manifest.permission.NETWORK_SETTINGS,
                    android.Manifest.permission.NETWORK_SETUP_WIZARD})
            @Override
            public List<KnownNetwork> getKnownNetworks() {
                checkPermissions();
                return mKnownNetworks;
            }

            /**
             * Gets the shared connectivity settings state.
             *
             * @return Returns a {@link SharedConnectivitySettingsState} object with the state.
             */
            @RequiresPermission(anyOf = {android.Manifest.permission.NETWORK_SETTINGS,
                    android.Manifest.permission.NETWORK_SETUP_WIZARD})
            @Override
            public SharedConnectivitySettingsState getSettingsState() {
                checkPermissions();
                return mSettingsState;
            }

            /**
             * Gets the connection status of the tether network the user selected to connect to.
             *
             * @return Returns a {@link TetherNetworkConnectionStatus} object with the connection
             * status.
             */
            @RequiresPermission(anyOf = {android.Manifest.permission.NETWORK_SETTINGS,
                    android.Manifest.permission.NETWORK_SETUP_WIZARD})
            @Override
            public TetherNetworkConnectionStatus getTetherNetworkConnectionStatus() {
                checkPermissions();
                return mTetherNetworkConnectionStatus;
            }

            /**
             * Gets the connection status of the known network the user selected to connect to.
             *
             * @return Returns a {@link KnownNetworkConnectionStatus} object with the connection
             * status.
             */
            @RequiresPermission(anyOf = {android.Manifest.permission.NETWORK_SETTINGS,
                    android.Manifest.permission.NETWORK_SETUP_WIZARD})
            @Override
            public KnownNetworkConnectionStatus getKnownNetworkConnectionStatus() {
                checkPermissions();