From 368b170af6e71ec135c8513618bf791c22c0c179 Mon Sep 17 00:00:00 2001 From: Roshan Pius Date: Wed, 5 Feb 2020 14:22:14 -0800 Subject: [PATCH 1/2] WifiManager: Add API for scan throttling Needed for moving away from using Settings.Global values as pseudo APIs. Bug: 148514485 Test: atest android.net.wifi Test: Verified wifi scan throttle toggle in Developer options Change-Id: I2e6e2d1fde22baeaddab18cf558e442d49c138dd --- api/current.txt | 1 + api/system-current.txt | 1 + wifi/java/android/net/wifi/IWifiManager.aidl | 4 ++ wifi/java/android/net/wifi/WifiManager.java | 44 +++++++++++++++++++ .../src/android/net/wifi/WifiManagerTest.java | 10 +++++ 5 files changed, 60 insertions(+) diff --git a/api/current.txt b/api/current.txt index a5a51d66375d5..640e85ec83059 100644 --- a/api/current.txt +++ b/api/current.txt @@ -31295,6 +31295,7 @@ package android.net.wifi { method public boolean isP2pSupported(); method public boolean isPreferredNetworkOffloadSupported(); method @Deprecated public boolean isScanAlwaysAvailable(); + method @RequiresPermission(android.Manifest.permission.ACCESS_WIFI_STATE) public boolean isScanThrottleEnabled(); method public boolean isStaApConcurrencySupported(); method public boolean isTdlsSupported(); method public boolean isWapiSupported(); diff --git a/api/system-current.txt b/api/system-current.txt index 7c5977f6e490e..beeb721464d0b 100755 --- a/api/system-current.txt +++ b/api/system-current.txt @@ -7693,6 +7693,7 @@ package android.net.wifi { method @RequiresPermission(android.Manifest.permission.WIFI_SET_DEVICE_MOBILITY_STATE) public void setDeviceMobilityState(int); method @RequiresPermission(android.Manifest.permission.NETWORK_SETTINGS) public void setMacRandomizationSettingPasspointEnabled(@NonNull String, boolean); method @RequiresPermission(android.Manifest.permission.NETWORK_SETTINGS) public void setMeteredOverridePasspoint(@NonNull String, int); + method @RequiresPermission(android.Manifest.permission.NETWORK_SETTINGS) public void setScanThrottleEnabled(boolean); method @RequiresPermission(android.Manifest.permission.NETWORK_SETTINGS) public boolean setSoftApConfiguration(@NonNull android.net.wifi.SoftApConfiguration); method @RequiresPermission(android.Manifest.permission.NETWORK_SETTINGS) public void setVerboseLoggingEnabled(boolean); method @Deprecated @RequiresPermission(android.Manifest.permission.CHANGE_WIFI_STATE) public boolean setWifiApConfiguration(android.net.wifi.WifiConfiguration); diff --git a/wifi/java/android/net/wifi/IWifiManager.aidl b/wifi/java/android/net/wifi/IWifiManager.aidl index 1f1c0c12cf21b..221f644409692 100644 --- a/wifi/java/android/net/wifi/IWifiManager.aidl +++ b/wifi/java/android/net/wifi/IWifiManager.aidl @@ -266,4 +266,8 @@ interface IWifiManager * Return the Map of {@link WifiNetworkSuggestion} and the list of */ Map getMatchingScanResults(in List networkSuggestions, in List scanResults, String callingPackage, String callingFeatureId); + + void setScanThrottleEnabled(boolean enable); + + boolean isScanThrottleEnabled(); } diff --git a/wifi/java/android/net/wifi/WifiManager.java b/wifi/java/android/net/wifi/WifiManager.java index a3cce7c00b3a6..1682023c33122 100644 --- a/wifi/java/android/net/wifi/WifiManager.java +++ b/wifi/java/android/net/wifi/WifiManager.java @@ -6118,4 +6118,48 @@ public class WifiManager { throw e.rethrowFromSystemServer(); } } + + /** + * Enable/disable wifi scan throttling from 3rd party apps. + * + *

+ * The throttling limits for apps are described in + * + * https://developer.android.com/guide/topics/connectivity/wifi-scan#wifi-scan-throttling + *

+ * + * @param enable true to allow scan throttling, false to disallow scan throttling. + * @hide + */ + @SystemApi + @RequiresPermission(android.Manifest.permission.NETWORK_SETTINGS) + public void setScanThrottleEnabled(boolean enable) { + try { + mService.setScanThrottleEnabled(enable); + } catch (RemoteException e) { + throw e.rethrowFromSystemServer(); + } + } + + /** + * Get the persisted Wi-Fi scan throttle state. Defaults to true, unless changed by the user via + * Developer options. + * + *

+ * The throttling limits for apps are described in + * + * https://developer.android.com/guide/topics/connectivity/wifi-scan#wifi-scan-throttling + *

+ * + * @return true to indicate that scan throttling is enabled, false to indicate that scan + * throttling is disabled. + */ + @RequiresPermission(ACCESS_WIFI_STATE) + public boolean isScanThrottleEnabled() { + try { + return mService.isScanThrottleEnabled(); + } catch (RemoteException e) { + throw e.rethrowFromSystemServer(); + } + } } diff --git a/wifi/tests/src/android/net/wifi/WifiManagerTest.java b/wifi/tests/src/android/net/wifi/WifiManagerTest.java index 6320f85eb9743..53e9755eaf528 100644 --- a/wifi/tests/src/android/net/wifi/WifiManagerTest.java +++ b/wifi/tests/src/android/net/wifi/WifiManagerTest.java @@ -2380,4 +2380,14 @@ public class WifiManagerTest { verify(mWifiConnectedNetworkScorer).start(0); verify(mWifiConnectedNetworkScorer).stop(10); } + + @Test + public void testScanThrottle() throws Exception { + mWifiManager.setScanThrottleEnabled(true); + verify(mWifiService).setScanThrottleEnabled(true); + + when(mWifiService.isScanThrottleEnabled()).thenReturn(false); + assertFalse(mWifiManager.isScanThrottleEnabled()); + verify(mWifiService).isScanThrottleEnabled(); + } } From 0ebf6f17efd3b43a761cd945834ac726c6e9d1e8 Mon Sep 17 00:00:00 2001 From: Roshan Pius Date: Thu, 6 Feb 2020 10:14:07 -0800 Subject: [PATCH 2/2] WifiOemMigrationHook: Rename class & methods to be more generic This class will hold all the mainline related migration logic. Currently, includes the config store migration hook. Will be adding the Settings migration hook here in a future CL. Bug: 148514485 Test: Compiles Change-Id: Ie66abbdaa720c0fe0deabc4e3de55e97ccac416e --- api/system-current.txt | 18 +++--- wifi/Android.bp | 2 +- ...ionHook.java => WifiOemMigrationHook.java} | 63 ++++++++++--------- 3 files changed, 42 insertions(+), 41 deletions(-) rename wifi/java/android/net/wifi/{WifiOemConfigStoreMigrationHook.java => WifiOemMigrationHook.java} (71%) diff --git a/api/system-current.txt b/api/system-current.txt index beeb721464d0b..6071c1ada98c6 100755 --- a/api/system-current.txt +++ b/api/system-current.txt @@ -7838,23 +7838,23 @@ package android.net.wifi { method @NonNull @RequiresPermission(android.Manifest.permission.NETWORK_CARRIER_PROVISIONING) public android.net.wifi.WifiNetworkSuggestion.Builder setCarrierId(int); } - public final class WifiOemConfigStoreMigrationHook { - method @Nullable public static android.net.wifi.WifiOemConfigStoreMigrationHook.MigrationData load(); + public final class WifiOemMigrationHook { + method @Nullable public static android.net.wifi.WifiOemMigrationHook.ConfigStoreMigrationData loadFromConfigStore(); } - public static final class WifiOemConfigStoreMigrationHook.MigrationData implements android.os.Parcelable { + public static final class WifiOemMigrationHook.ConfigStoreMigrationData implements android.os.Parcelable { method public int describeContents(); method @Nullable public java.util.List getUserSavedNetworkConfigurations(); method @Nullable public android.net.wifi.SoftApConfiguration getUserSoftApConfiguration(); method public void writeToParcel(@NonNull android.os.Parcel, int); - field @NonNull public static final android.os.Parcelable.Creator CREATOR; + field @NonNull public static final android.os.Parcelable.Creator CREATOR; } - public static final class WifiOemConfigStoreMigrationHook.MigrationData.Builder { - ctor public WifiOemConfigStoreMigrationHook.MigrationData.Builder(); - method @NonNull public android.net.wifi.WifiOemConfigStoreMigrationHook.MigrationData build(); - method @NonNull public android.net.wifi.WifiOemConfigStoreMigrationHook.MigrationData.Builder setUserSavedNetworkConfigurations(@NonNull java.util.List); - method @NonNull public android.net.wifi.WifiOemConfigStoreMigrationHook.MigrationData.Builder setUserSoftApConfiguration(@NonNull android.net.wifi.SoftApConfiguration); + public static final class WifiOemMigrationHook.ConfigStoreMigrationData.Builder { + ctor public WifiOemMigrationHook.ConfigStoreMigrationData.Builder(); + method @NonNull public android.net.wifi.WifiOemMigrationHook.ConfigStoreMigrationData build(); + method @NonNull public android.net.wifi.WifiOemMigrationHook.ConfigStoreMigrationData.Builder setUserSavedNetworkConfigurations(@NonNull java.util.List); + method @NonNull public android.net.wifi.WifiOemMigrationHook.ConfigStoreMigrationData.Builder setUserSoftApConfiguration(@NonNull android.net.wifi.SoftApConfiguration); } public class WifiScanner { diff --git a/wifi/Android.bp b/wifi/Android.bp index 6a29b1c36052e..1763975e77701 100644 --- a/wifi/Android.bp +++ b/wifi/Android.bp @@ -47,7 +47,7 @@ filegroup { // framework-wifi.jar. This is not a good idea, should move WifiNetworkScoreCache // to a separate package. "java/android/net/wifi/WifiNetworkScoreCache.java", - "java/android/net/wifi/WifiOemConfigStoreMigrationHook.java", + "java/android/net/wifi/WifiOemMigrationHook.java", "java/android/net/wifi/wificond/*.java", ":libwificond_ipc_aidl", ], diff --git a/wifi/java/android/net/wifi/WifiOemConfigStoreMigrationHook.java b/wifi/java/android/net/wifi/WifiOemMigrationHook.java similarity index 71% rename from wifi/java/android/net/wifi/WifiOemConfigStoreMigrationHook.java rename to wifi/java/android/net/wifi/WifiOemMigrationHook.java index 642dcb9211aed..22d7786371016 100755 --- a/wifi/java/android/net/wifi/WifiOemConfigStoreMigrationHook.java +++ b/wifi/java/android/net/wifi/WifiOemMigrationHook.java @@ -28,30 +28,17 @@ import java.util.List; /** * Class used to provide one time hooks for existing OEM devices to migrate their config store - * data to the wifi mainline module. - *

- * Note: - *

  • OEM's need to implement {@link #load()} only if their - * existing config store format or file locations differs from the vanilla AOSP implementation ( - * which is what the wifi mainline module understands). - *
  • - *
  • The wifi mainline module will invoke {@link #load()} method on every bootup, its - * the responsibility of the OEM implementation to ensure that this method returns non-null data - * only on the first bootup. Once the migration is done, the OEM can safely delete their config - * store files and then return null on any subsequent reboots. The first & only relevant invocation - * of {@link #load()} occurs when a previously released device upgrades to the wifi - * mainline module from an OEM implementation of the wifi stack. - *
  • + * data and other settings to the wifi mainline module. * @hide */ @SystemApi -public final class WifiOemConfigStoreMigrationHook { +public final class WifiOemMigrationHook { /** * Container for all the wifi config data to migrate. */ - public static final class MigrationData implements Parcelable { + public static final class ConfigStoreMigrationData implements Parcelable { /** - * Builder to create instance of {@link MigrationData}. + * Builder to create instance of {@link ConfigStoreMigrationData}. */ public static final class Builder { private List mUserSavedNetworkConfigurations; @@ -92,39 +79,40 @@ public final class WifiOemConfigStoreMigrationHook { } /** - * Build an instance of {@link MigrationData}. + * Build an instance of {@link ConfigStoreMigrationData}. * - * @return Instance of {@link MigrationData}. + * @return Instance of {@link ConfigStoreMigrationData}. */ - public @NonNull MigrationData build() { - return new MigrationData(mUserSavedNetworkConfigurations, mUserSoftApConfiguration); + public @NonNull ConfigStoreMigrationData build() { + return new ConfigStoreMigrationData( + mUserSavedNetworkConfigurations, mUserSoftApConfiguration); } } private final List mUserSavedNetworkConfigurations; private final SoftApConfiguration mUserSoftApConfiguration; - private MigrationData( + private ConfigStoreMigrationData( @Nullable List userSavedNetworkConfigurations, @Nullable SoftApConfiguration userSoftApConfiguration) { mUserSavedNetworkConfigurations = userSavedNetworkConfigurations; mUserSoftApConfiguration = userSoftApConfiguration; } - public static final @NonNull Parcelable.Creator CREATOR = - new Parcelable.Creator() { + public static final @NonNull Parcelable.Creator CREATOR = + new Parcelable.Creator() { @Override - public MigrationData createFromParcel(Parcel in) { + public ConfigStoreMigrationData createFromParcel(Parcel in) { List userSavedNetworkConfigurations = in.readArrayList(null); SoftApConfiguration userSoftApConfiguration = in.readParcelable(null); - return new MigrationData( + return new ConfigStoreMigrationData( userSavedNetworkConfigurations, userSoftApConfiguration); } @Override - public MigrationData[] newArray(int size) { - return new MigrationData[size]; + public ConfigStoreMigrationData[] newArray(int size) { + return new ConfigStoreMigrationData[size]; } }; @@ -164,16 +152,29 @@ public final class WifiOemConfigStoreMigrationHook { } } - private WifiOemConfigStoreMigrationHook() { } + private WifiOemMigrationHook() { } /** * Load data from OEM's config store. + *

    + * Note: + *

  • OEM's need to implement {@link #loadFromConfigStore()} ()} only if their + * existing config store format or file locations differs from the vanilla AOSP implementation ( + * which is what the wifi mainline module understands). + *
  • + *
  • The wifi mainline module will invoke {@link #loadFromConfigStore()} method on every + * bootup, its the responsibility of the OEM implementation to ensure that this method returns + * non-null data only on the first bootup. Once the migration is done, the OEM can safely delete + * their config store files and then return null on any subsequent reboots. The first & only + * relevant invocation of {@link #loadFromConfigStore()} occurs when a previously released + * device upgrades to the wifi mainline module from an OEM implementation of the wifi stack. + *
  • * - * @return Instance of {@link MigrationData} for migrating data, null if no + * @return Instance of {@link ConfigStoreMigrationData} for migrating data, null if no * migration is necessary. */ @Nullable - public static MigrationData load() { + public static ConfigStoreMigrationData loadFromConfigStore() { // Note: OEM's should add code to parse data from their config store format here! return null; }