summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Andrew Sapperstein <asapperstein@google.com> 2023-03-01 16:59:26 +0000
committer Android (Google) Code Review <android-gerrit@google.com> 2023-03-01 16:59:26 +0000
commit303166ae8392dda0643534041212a66438691fd8 (patch)
treefc56d92a3f3b413fcba23a7ce939c6fc5d894deb
parentfab0ec06076cc593ba222e59d74fa4f92e0459ea (diff)
parent44d3fa63ff86b0273eb49f57a2a49a15334df12c (diff)
Merge changes I4d967137,Ifdae8e18 into udc-dev
* changes: API Review: SharedConnectivityManager & SharedConnectivityService API Review: KnownNetwork changes.
-rw-r--r--core/api/system-current.txt31
-rw-r--r--wifi/java/src/android/net/wifi/sharedconnectivity/app/KnownNetwork.java36
-rw-r--r--wifi/java/src/android/net/wifi/sharedconnectivity/app/SharedConnectivityManager.java30
-rw-r--r--wifi/java/src/android/net/wifi/sharedconnectivity/service/SharedConnectivityService.java82
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();