From 122957b0b0585068d82934afa2b02f8f0ad8a584 Mon Sep 17 00:00:00 2001 From: Jeremy Joslin Date: Wed, 18 Jan 2017 11:55:17 -0800 Subject: Pass more data through the recommendation request. Expanding the API so it can accept the WiFi config of the currently connected network (if any) and the set of connectable WiFi configurations. Also renamed currentRecommendedWifiConfig to defaultWifiConfig so the name was more representative of the parameter's purpose and added more documentation throughout. Test: adb shell am instrument -e class android.net.RecommendationRequestTest -w com.android.frameworks.coretests/android.support.test.runner.AndroidJUnitRunner Test: adb shell am instrument -w com.android.networkrecommendation.tests/android.support.test.runner.AndroidJUnitRunner Test: runtest frameworks-services -c com.android.server.NetworkScoreServiceTest Bug: 34387385 Change-Id: Ib8c3cab8f92b5c9da806070d32412f688690f82f Merged-In: I1089b70303b0396def7e6bf3737fdc67e40c9dcd --- api/system-current.txt | 12 +- core/java/android/net/RecommendationRequest.java | 142 ++++++++++++++++----- .../src/android/net/RecommendationRequestTest.java | 46 ++++--- .../com/android/server/NetworkScoreService.java | 8 +- .../android/server/NetworkScoreServiceTest.java | 8 +- 5 files changed, 159 insertions(+), 57 deletions(-) diff --git a/api/system-current.txt b/api/system-current.txt index 308fa6b6df9c..586bcfb7f1b7 100644 --- a/api/system-current.txt +++ b/api/system-current.txt @@ -25759,9 +25759,12 @@ package android.net { public final class RecommendationRequest implements android.os.Parcelable { ctor protected RecommendationRequest(android.os.Parcel); method public int describeContents(); - method public android.net.wifi.WifiConfiguration getCurrentSelectedConfig(); - method public android.net.NetworkCapabilities getRequiredCapabilities(); + method public android.net.wifi.WifiConfiguration[] getConnectableConfigs(); + method public android.net.wifi.WifiConfiguration getConnectedConfig(); + method public android.net.wifi.WifiConfiguration getDefaultWifiConfig(); method public android.net.wifi.ScanResult[] getScanResults(); + method public void setConnectableConfigs(android.net.wifi.WifiConfiguration[]); + method public void setConnectedConfig(android.net.wifi.WifiConfiguration); method public void writeToParcel(android.os.Parcel, int); field public static final android.os.Parcelable.Creator CREATOR; } @@ -25769,8 +25772,9 @@ package android.net { public static final class RecommendationRequest.Builder { ctor public RecommendationRequest.Builder(); method public android.net.RecommendationRequest build(); - method public android.net.RecommendationRequest.Builder setCurrentRecommendedWifiConfig(android.net.wifi.WifiConfiguration); - method public android.net.RecommendationRequest.Builder setNetworkCapabilities(android.net.NetworkCapabilities); + method public android.net.RecommendationRequest.Builder setConnectableConfigs(android.net.wifi.WifiConfiguration[]); + method public android.net.RecommendationRequest.Builder setConnectedWifiConfig(android.net.wifi.WifiConfiguration); + method public android.net.RecommendationRequest.Builder setDefaultWifiConfig(android.net.wifi.WifiConfiguration); method public android.net.RecommendationRequest.Builder setScanResults(android.net.wifi.ScanResult[]); } diff --git a/core/java/android/net/RecommendationRequest.java b/core/java/android/net/RecommendationRequest.java index d013f6442f23..a227f18fe2bf 100644 --- a/core/java/android/net/RecommendationRequest.java +++ b/core/java/android/net/RecommendationRequest.java @@ -34,8 +34,9 @@ import com.android.internal.annotations.VisibleForTesting; @SystemApi public final class RecommendationRequest implements Parcelable { private final ScanResult[] mScanResults; - private final WifiConfiguration mCurrentSelectedConfig; - private final NetworkCapabilities mRequiredCapabilities; + private final WifiConfiguration mDefaultConfig; + private WifiConfiguration mConnectedConfig; + private WifiConfiguration[] mConnectableConfigs; /** * Builder class for constructing {@link RecommendationRequest} instances. @@ -44,26 +45,62 @@ public final class RecommendationRequest implements Parcelable { @SystemApi public static final class Builder { private ScanResult[] mScanResults; - private WifiConfiguration mCurrentConfig; - private NetworkCapabilities mNetworkCapabilities; - + private WifiConfiguration mDefaultConfig; + private WifiConfiguration mConnectedConfig; + private WifiConfiguration[] mConnectableConfigs; + + /** + * @param scanResults the array of {@link ScanResult}s the recommendation must be + * constrained to i.e. if a non-null wifi config recommendation is + * returned then it must be able to connect to one of the networks in + * the results list. + * + * If the array is {@code null} or empty then there is no constraint. + * + * @return this + */ public Builder setScanResults(ScanResult[] scanResults) { mScanResults = scanResults; return this; } - public Builder setCurrentRecommendedWifiConfig(WifiConfiguration config) { - this.mCurrentConfig = config; + /** + * @param config the {@link WifiConfiguration} to return if no recommendation is available. + * @return this + */ + public Builder setDefaultWifiConfig(WifiConfiguration config) { + this.mDefaultConfig = config; + return this; + } + + /** + * @param config the {@link WifiConfiguration} of the connected network at the time the + * this request was made. + * @return this + */ + public Builder setConnectedWifiConfig(WifiConfiguration config) { + this.mConnectedConfig = config; return this; } - public Builder setNetworkCapabilities(NetworkCapabilities capabilities) { - mNetworkCapabilities = capabilities; + /** + * @param connectableConfigs the set of saved {@link WifiConfiguration}s that can be + * connected to based on the current set of {@link ScanResult}s. + * @return this + */ + public Builder setConnectableConfigs(WifiConfiguration[] connectableConfigs) { + mConnectableConfigs = connectableConfigs; return this; } + /** + * @return a new {@link RecommendationRequest} instance + */ public RecommendationRequest build() { - return new RecommendationRequest(mScanResults, mCurrentConfig, mNetworkCapabilities); + return new RecommendationRequest(mScanResults, + mDefaultConfig, + mConnectedConfig, + mConnectableConfigs); } } @@ -79,45 +116,80 @@ public final class RecommendationRequest implements Parcelable { } /** - * @return The best recommendation at the time this {@code RecommendationRequest} instance - * was created. This may be null which indicates that no recommendation is available. + * @return the {@link WifiConfiguration} to return if no recommendation is available. */ - public WifiConfiguration getCurrentSelectedConfig() { - return mCurrentSelectedConfig; + public WifiConfiguration getDefaultWifiConfig() { + return mDefaultConfig; } /** - * - * @return The set of {@link NetworkCapabilities} the recommendation must be constrained to. - * This may be {@code null} which indicates that there are no constraints on the - * capabilities of the recommended network. + * @return the {@link WifiConfiguration} of the connected network at the time the this request + * was made. */ - public NetworkCapabilities getRequiredCapabilities() { - return mRequiredCapabilities; + public WifiConfiguration getConnectedConfig() { + return mConnectedConfig; + } + + /** + * @return the set of saved {@link WifiConfiguration}s that can be connected to based on the + * current set of {@link ScanResult}s. + */ + public WifiConfiguration[] getConnectableConfigs() { + return mConnectableConfigs; + } + + /** + * @param connectedConfig the {@link WifiConfiguration} of the connected network at the time + * the this request was made. + */ + public void setConnectedConfig(WifiConfiguration connectedConfig) { + mConnectedConfig = connectedConfig; + } + + /** + * @param connectableConfigs the set of saved {@link WifiConfiguration}s that can be connected + * to based on the current set of {@link ScanResult}s. + */ + public void setConnectableConfigs(WifiConfiguration[] connectableConfigs) { + mConnectableConfigs = connectableConfigs; } @VisibleForTesting RecommendationRequest(ScanResult[] scanResults, - WifiConfiguration currentSelectedConfig, - NetworkCapabilities requiredCapabilities) { + WifiConfiguration defaultWifiConfig, + WifiConfiguration connectedWifiConfig, + WifiConfiguration[] connectableConfigs) { mScanResults = scanResults; - mCurrentSelectedConfig = currentSelectedConfig; - mRequiredCapabilities = requiredCapabilities; + mDefaultConfig = defaultWifiConfig; + mConnectedConfig = connectedWifiConfig; + mConnectableConfigs = connectableConfigs; } protected RecommendationRequest(Parcel in) { final int resultCount = in.readInt(); if (resultCount > 0) { mScanResults = new ScanResult[resultCount]; + final ClassLoader classLoader = ScanResult.class.getClassLoader(); for (int i = 0; i < resultCount; i++) { - mScanResults[i] = in.readParcelable(ScanResult.class.getClassLoader()); + mScanResults[i] = in.readParcelable(classLoader); } } else { mScanResults = null; } - mCurrentSelectedConfig = in.readParcelable(WifiConfiguration.class.getClassLoader()); - mRequiredCapabilities = in.readParcelable(NetworkCapabilities.class.getClassLoader()); + mDefaultConfig = in.readParcelable(WifiConfiguration.class.getClassLoader()); + mConnectedConfig = in.readParcelable(WifiConfiguration.class.getClassLoader()); + + final int configCount = in.readInt(); + if (configCount > 0) { + mConnectableConfigs = new WifiConfiguration[configCount]; + final ClassLoader classLoader = WifiConfiguration.class.getClassLoader(); + for (int i = 0; i < configCount; i++) { + mConnectableConfigs[i] = in.readParcelable(classLoader); + } + } else { + mConnectableConfigs = null; + } } @Override @@ -135,8 +207,20 @@ public final class RecommendationRequest implements Parcelable { } else { dest.writeInt(0); } - dest.writeParcelable(mCurrentSelectedConfig, flags); - dest.writeParcelable(mRequiredCapabilities, flags); + + dest.writeParcelable(mDefaultConfig, flags); + dest.writeParcelable(mConnectedConfig, flags); + + if (mConnectableConfigs != null) { + dest.writeInt(mConnectableConfigs.length); + for (int i = 0; i < mConnectableConfigs.length; i++) { + dest.writeParcelable(mConnectableConfigs[i], flags); + } + } else { + dest.writeInt(0); + } + + } public static final Creator CREATOR = diff --git a/core/tests/coretests/src/android/net/RecommendationRequestTest.java b/core/tests/coretests/src/android/net/RecommendationRequestTest.java index 31560b0ac8c3..39c1691b09a7 100644 --- a/core/tests/coretests/src/android/net/RecommendationRequestTest.java +++ b/core/tests/coretests/src/android/net/RecommendationRequestTest.java @@ -7,8 +7,9 @@ import android.test.AndroidTestCase; public class RecommendationRequestTest extends AndroidTestCase { private ScanResult[] mScanResults; - private WifiConfiguration mConfiguration; - private NetworkCapabilities mCapabilities; + private WifiConfiguration mDefaultConfig; + private WifiConfiguration mConnectedConfig; + private WifiConfiguration[] mConnectableConfigs; @Override public void setUp() throws Exception { @@ -29,45 +30,58 @@ public class RecommendationRequestTest extends AndroidTestCase { 8 /*centerFreq0*/, 9 /*centerFreq1*/, false /*is80211McRTTResponder*/); - mConfiguration = new WifiConfiguration(); - mConfiguration.SSID = "RecommendationRequestTest"; - mCapabilities = new NetworkCapabilities() - .removeCapability(NetworkCapabilities.NET_CAPABILITY_TRUSTED); + mDefaultConfig = new WifiConfiguration(); + mDefaultConfig.SSID = "default_config"; + mConnectedConfig = new WifiConfiguration(); + mConnectedConfig.SSID = "connected_config"; + mConnectableConfigs = new WifiConfiguration[] {mDefaultConfig, mConnectedConfig}; } public void testParceling() throws Exception { RecommendationRequest request = new RecommendationRequest.Builder() - .setCurrentRecommendedWifiConfig(mConfiguration) + .setDefaultWifiConfig(mDefaultConfig) .setScanResults(mScanResults) - .setNetworkCapabilities(mCapabilities) + .setConnectedWifiConfig(mConnectedConfig) + .setConnectableConfigs(mConnectableConfigs) .build(); RecommendationRequest parceled = passThroughParcel(request); - assertEquals(request.getCurrentSelectedConfig().SSID, - parceled.getCurrentSelectedConfig().SSID); - assertEquals(request.getRequiredCapabilities(), parceled.getRequiredCapabilities()); + assertEquals(request.getDefaultWifiConfig().SSID, + parceled.getDefaultWifiConfig().SSID); + assertEquals(request.getConnectedConfig().SSID, + parceled.getConnectedConfig().SSID); ScanResult[] parceledScanResults = parceled.getScanResults(); assertNotNull(parceledScanResults); assertEquals(mScanResults.length, parceledScanResults.length); for (int i = 0; i < mScanResults.length; i++) { assertEquals(mScanResults[i].SSID, parceledScanResults[i].SSID); } + WifiConfiguration[] parceledConfigs = parceled.getConnectableConfigs(); + for (int i = 0; i < parceledConfigs.length; i++) { + assertEquals(mConnectableConfigs[i].SSID, parceledConfigs[i].SSID); + } } public void testParceling_nullScanResults() throws Exception { RecommendationRequest request = new RecommendationRequest.Builder() - .setCurrentRecommendedWifiConfig(mConfiguration) - .setNetworkCapabilities(mCapabilities) + .setDefaultWifiConfig(mDefaultConfig) .build(); RecommendationRequest parceled = passThroughParcel(request); - assertEquals(request.getCurrentSelectedConfig().SSID, - parceled.getCurrentSelectedConfig().SSID); - assertEquals(request.getRequiredCapabilities(), parceled.getRequiredCapabilities()); ScanResult[] parceledScanResults = parceled.getScanResults(); assertNull(parceledScanResults); } + public void testParceling_nullWifiConfigArray() throws Exception { + RecommendationRequest request = new RecommendationRequest.Builder() + .setDefaultWifiConfig(mDefaultConfig) + .build(); + + RecommendationRequest parceled = passThroughParcel(request); + WifiConfiguration[] parceledConfigs = parceled.getConnectableConfigs(); + assertNull(parceledConfigs); + } + private RecommendationRequest passThroughParcel(RecommendationRequest request) { Parcel p = Parcel.obtain(); RecommendationRequest output = null; diff --git a/services/core/java/com/android/server/NetworkScoreService.java b/services/core/java/com/android/server/NetworkScoreService.java index 6f497023bce7..e5787ae76fc2 100644 --- a/services/core/java/com/android/server/NetworkScoreService.java +++ b/services/core/java/com/android/server/NetworkScoreService.java @@ -582,9 +582,9 @@ public class NetworkScoreService extends INetworkScoreService.Stub { Log.d(TAG, "Returning the default network recommendation."); } - if (request != null && request.getCurrentSelectedConfig() != null) { + if (request != null && request.getDefaultWifiConfig() != null) { return RecommendationResult.createConnectRecommendation( - request.getCurrentSelectedConfig()); + request.getDefaultWifiConfig()); } return RecommendationResult.createDoNotConnectRecommendation(); } finally { @@ -887,9 +887,9 @@ public class NetworkScoreService extends INetworkScoreService.Stub { } final RecommendationResult result; - if (request != null && request.getCurrentSelectedConfig() != null) { + if (request != null && request.getDefaultWifiConfig() != null) { result = RecommendationResult.createConnectRecommendation( - request.getCurrentSelectedConfig()); + request.getDefaultWifiConfig()); } else { result = RecommendationResult.createDoNotConnectRecommendation(); } diff --git a/services/tests/servicestests/src/com/android/server/NetworkScoreServiceTest.java b/services/tests/servicestests/src/com/android/server/NetworkScoreServiceTest.java index 75d9c3911fca..5d19b2904d2b 100644 --- a/services/tests/servicestests/src/com/android/server/NetworkScoreServiceTest.java +++ b/services/tests/servicestests/src/com/android/server/NetworkScoreServiceTest.java @@ -144,7 +144,7 @@ public class NetworkScoreServiceTest { configuration.SSID = "NetworkScoreServiceTest_SSID"; configuration.BSSID = "NetworkScoreServiceTest_BSSID"; mRecommendationRequest = new RecommendationRequest.Builder() - .setCurrentRecommendedWifiConfig(configuration).build(); + .setDefaultWifiConfig(configuration).build(); mOnResultListener = new OnResultListener(); mRemoteCallback = new RemoteCallback(mOnResultListener); Settings.Global.putLong(mContentResolver, @@ -240,7 +240,7 @@ public class NetworkScoreServiceTest { final RecommendationResult result = mNetworkScoreService.requestRecommendation(mRecommendationRequest); assertNotNull(result); - assertEquals(mRecommendationRequest.getCurrentSelectedConfig(), + assertEquals(mRecommendationRequest.getDefaultWifiConfig(), result.getWifiConfiguration()); } @@ -255,7 +255,7 @@ public class NetworkScoreServiceTest { final RecommendationResult result = mNetworkScoreService.requestRecommendation(mRecommendationRequest); assertNotNull(result); - assertEquals(mRecommendationRequest.getCurrentSelectedConfig(), + assertEquals(mRecommendationRequest.getDefaultWifiConfig(), result.getWifiConfiguration()); } @@ -327,7 +327,7 @@ public class NetworkScoreServiceTest { RecommendationResult result = mOnResultListener.receivedBundle.getParcelable(EXTRA_RECOMMENDATION_RESULT); assertTrue(result.hasRecommendation()); - assertEquals(mRecommendationRequest.getCurrentSelectedConfig().SSID, + assertEquals(mRecommendationRequest.getDefaultWifiConfig().SSID, result.getWifiConfiguration().SSID); } -- cgit v1.2.3-59-g8ed1b