diff options
| author | 2023-03-01 16:59:26 +0000 | |
|---|---|---|
| committer | 2023-03-01 16:59:26 +0000 | |
| commit | 303166ae8392dda0643534041212a66438691fd8 (patch) | |
| tree | fc56d92a3f3b413fcba23a7ce939c6fc5d894deb | |
| parent | fab0ec06076cc593ba222e59d74fa4f92e0459ea (diff) | |
| parent | 44d3fa63ff86b0273eb49f57a2a49a15334df12c (diff) | |
Merge changes I4d967137,Ifdae8e18 into udc-dev
* changes:
API Review: SharedConnectivityManager & SharedConnectivityService
API Review: KnownNetwork changes.
4 files changed, 150 insertions, 29 deletions
diff --git a/core/api/system-current.txt b/core/api/system-current.txt index fbc30deb40ee..9f6a13e05618 100644 --- a/core/api/system-current.txt +++ b/core/api/system-current.txt @@ -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 { diff --git a/wifi/java/src/android/net/wifi/sharedconnectivity/app/KnownNetwork.java b/wifi/java/src/android/net/wifi/sharedconnectivity/app/KnownNetwork.java index 1fb1c630304d..fe23caae7f03 100644 --- a/wifi/java/src/android/net/wifi/sharedconnectivity/app/KnownNetwork.java +++ b/wifi/java/src/android/net/wifi/sharedconnectivity/app/KnownNetwork.java @@ -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; } diff --git a/wifi/java/src/android/net/wifi/sharedconnectivity/app/SharedConnectivityManager.java b/wifi/java/src/android/net/wifi/sharedconnectivity/app/SharedConnectivityManager.java index a19510b3f9df..c09f85b39ee4 100644 --- a/wifi/java/src/android/net/wifi/sharedconnectivity/app/SharedConnectivityManager.java +++ b/wifi/java/src/android/net/wifi/sharedconnectivity/app/SharedConnectivityManager.java @@ -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"); @@ -325,7 +329,7 @@ public class SharedConnectivityManager { return true; } - /** + /** * Send command to the implementation of {@link SharedConnectivityService} requesting connection * to the specified Tether Network. * @@ -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) { diff --git a/wifi/java/src/android/net/wifi/sharedconnectivity/service/SharedConnectivityService.java b/wifi/java/src/android/net/wifi/sharedconnectivity/service/SharedConnectivityService.java index d2cea613d2ec..4c88c1b269a9 100644 --- a/wifi/java/src/android/net/wifi/sharedconnectivity/service/SharedConnectivityService.java +++ b/wifi/java/src/android/net/wifi/sharedconnectivity/service/SharedConnectivityService.java @@ -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(); |