diff options
7 files changed, 7 insertions, 696 deletions
diff --git a/core/java/android/net/INetworkScoreService.aidl b/core/java/android/net/INetworkScoreService.aidl index 362ea9d6bc54..73e52c89dcc4 100644 --- a/core/java/android/net/INetworkScoreService.aidl +++ b/core/java/android/net/INetworkScoreService.aidl @@ -19,10 +19,7 @@ package android.net; import android.net.INetworkScoreCache; import android.net.NetworkKey; import android.net.NetworkScorerAppData; -import android.net.RecommendationRequest; -import android.net.RecommendationResult; import android.net.ScoredNetwork; -import android.os.RemoteCallback; /** * A service for updating network scores from a network scorer application. @@ -81,16 +78,6 @@ interface INetworkScoreService void unregisterNetworkScoreCache(int networkType, INetworkScoreCache scoreCache); /** - * Request a recommendation for the best network to connect to - * taking into account the inputs from the {@link RecommendationRequest}. - * - * @param request a {@link RecommendationRequest} instance containing the details of the request - * @return a {@link RecommendationResult} containing the recommended network to connect to - * @throws SecurityException if the caller is not the system - */ - RecommendationResult requestRecommendation(in RecommendationRequest request); - - /** * Request scoring for networks. * * Implementations should delegate to the registered network recommendation provider or @@ -119,18 +106,6 @@ interface INetworkScoreService * scorer. */ String getActiveScorerPackage(); - - /** - * Request a recommendation for the best network to connect to - * taking into account the inputs from the {@link RecommendationRequest}. - * - * @param request a {@link RecommendationRequest} instance containing the details of the request - * @param remoteCallback a {@link RemoteCallback} instance to invoke when the recommendation - * is available. - * @throws SecurityException if the caller is not the system - */ - oneway void requestRecommendationAsync(in RecommendationRequest request, - in RemoteCallback remoteCallback); /** * Returns metadata about the active scorer or <code>null</code> if there is no active scorer. diff --git a/core/java/android/net/NetworkScoreManager.java b/core/java/android/net/NetworkScoreManager.java index 29483cd98bd1..eeb426a4bcf9 100644 --- a/core/java/android/net/NetworkScoreManager.java +++ b/core/java/android/net/NetworkScoreManager.java @@ -428,14 +428,11 @@ public class NetworkScoreManager { * @throws SecurityException if the caller does not hold the * {@link android.Manifest.permission#REQUEST_NETWORK_SCORES} permission. * @hide + * @deprecated to be removed. */ public RecommendationResult requestRecommendation(RecommendationRequest request) throws SecurityException { - try { - return mService.requestRecommendation(request); - } catch (RemoteException e) { - throw e.rethrowFromSystemServer(); - } + return null; } /** @@ -452,43 +449,4 @@ public class NetworkScoreManager { throw e.rethrowFromSystemServer(); } } - - /** - * Request a recommendation for which network to connect to. - * - * <p>The callback will be run on the thread associated with provided {@link Handler}. - * - * @param request a {@link RecommendationRequest} instance containing additional - * request details - * @param handler a {@link Handler} instance representing the thread to complete the future on. - * If null the responding binder thread will be used. - * @return a {@link CompletableFuture} instance that will eventually receive the - * {@link RecommendationResult}. - * @throws SecurityException - * @hide - */ - public CompletableFuture<RecommendationResult> requestRecommendation( - final @NonNull RecommendationRequest request, - final @Nullable Handler handler) { - Preconditions.checkNotNull(request, "RecommendationRequest cannot be null."); - - final CompletableFuture<RecommendationResult> futureResult = - new CompletableFuture<>(); - - RemoteCallback remoteCallback = new RemoteCallback(new RemoteCallback.OnResultListener() { - @Override - public void onResult(Bundle data) { - RecommendationResult result = data.getParcelable(EXTRA_RECOMMENDATION_RESULT); - futureResult.complete(result); - } - }, handler); - - try { - mService.requestRecommendationAsync(request, remoteCallback); - } catch (RemoteException e) { - throw e.rethrowFromSystemServer(); - } - - return futureResult; - } } diff --git a/core/java/android/provider/Settings.java b/core/java/android/provider/Settings.java index c6ea9586374d..e8f0ee5dbe86 100755 --- a/core/java/android/provider/Settings.java +++ b/core/java/android/provider/Settings.java @@ -8371,6 +8371,7 @@ public final class Settings { * * Type: long * @hide + * @deprecated to be removed */ public static final String NETWORK_RECOMMENDATION_REQUEST_TIMEOUT_MS = "network_recommendation_request_timeout_ms"; diff --git a/core/tests/coretests/src/android/net/NetworkRecommendationProviderTest.java b/core/tests/coretests/src/android/net/NetworkRecommendationProviderTest.java index 497bc5cd900e..ff9816ad090c 100644 --- a/core/tests/coretests/src/android/net/NetworkRecommendationProviderTest.java +++ b/core/tests/coretests/src/android/net/NetworkRecommendationProviderTest.java @@ -1,26 +1,19 @@ package android.net; -import static android.net.NetworkRecommendationProvider.EXTRA_RECOMMENDATION_RESULT; -import static android.net.NetworkRecommendationProvider.EXTRA_SEQUENCE; - import static junit.framework.Assert.assertFalse; import static junit.framework.Assert.assertSame; import static junit.framework.Assert.fail; -import static junit.framework.TestCase.assertEquals; import static org.mockito.Matchers.anyString; import static org.mockito.Matchers.eq; import android.Manifest.permission; import android.content.Context; -import android.os.Bundle; -import android.os.IRemoteCallback; import android.support.test.runner.AndroidJUnit4; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; -import org.mockito.ArgumentCaptor; import org.mockito.Mock; import org.mockito.Mockito; import org.mockito.MockitoAnnotations; @@ -35,11 +28,9 @@ import java.util.concurrent.TimeUnit; */ @RunWith(AndroidJUnit4.class) public class NetworkRecommendationProviderTest { - @Mock private IRemoteCallback mMockRemoteCallback; @Mock private Context mContext; private NetworkRecProvider mRecProvider; private INetworkRecommendationProvider mStub; - private CountDownLatch mRecRequestLatch; private CountDownLatch mScoreRequestLatch; private NetworkKey[] mTestNetworkKeys; @@ -48,10 +39,8 @@ public class NetworkRecommendationProviderTest { MockitoAnnotations.initMocks(this); Executor executor = Executors.newSingleThreadExecutor(); - mRecRequestLatch = new CountDownLatch(1); mScoreRequestLatch = new CountDownLatch(1); - mRecProvider = new NetworkRecProvider(mContext, executor, mRecRequestLatch, - mScoreRequestLatch); + mRecProvider = new NetworkRecProvider(mContext, executor, mScoreRequestLatch); mStub = INetworkRecommendationProvider.Stub.asInterface(mRecProvider.getBinder()); mTestNetworkKeys = new NetworkKey[2]; mTestNetworkKeys[0] = new NetworkKey(new WifiKey("\"ssid_01\"", "00:00:00:00:00:11")); @@ -59,69 +48,6 @@ public class NetworkRecommendationProviderTest { } @Test - public void testRecommendationRequestReceived() throws Exception { - final RecommendationRequest request = new RecommendationRequest.Builder().build(); - final int sequence = 100; - mStub.requestRecommendation(request, mMockRemoteCallback, sequence); - - // wait for onRequestRecommendation() to be called in our impl below. - mRecRequestLatch.await(200, TimeUnit.MILLISECONDS); - NetworkRecommendationProvider.ResultCallback expectedResultCallback = - new NetworkRecommendationProvider.ResultCallback(mMockRemoteCallback, sequence); - assertEquals(request, mRecProvider.mCapturedRequest); - assertEquals(expectedResultCallback, mRecProvider.mCapturedCallback); - } - - @Test - public void testRecommendationRequest_permissionsEnforced() throws Exception { - final RecommendationRequest request = new RecommendationRequest.Builder().build(); - final int sequence = 100; - Mockito.doThrow(new SecurityException()) - .when(mContext) - .enforceCallingOrSelfPermission(eq(permission.REQUEST_NETWORK_SCORES), anyString()); - - try { - mStub.requestRecommendation(request, mMockRemoteCallback, sequence); - fail("SecurityException expected."); - } catch (SecurityException e) { - // expected - } - } - - @Test - public void testResultCallbackOnResult() throws Exception { - final int sequence = 100; - final NetworkRecommendationProvider.ResultCallback callback = - new NetworkRecommendationProvider.ResultCallback(mMockRemoteCallback, sequence); - - final RecommendationResult result = RecommendationResult.createDoNotConnectRecommendation(); - callback.onResult(result); - - final ArgumentCaptor<Bundle> bundleCaptor = ArgumentCaptor.forClass(Bundle.class); - Mockito.verify(mMockRemoteCallback).sendResult(bundleCaptor.capture()); - Bundle capturedBundle = bundleCaptor.getValue(); - assertEquals(sequence, capturedBundle.getInt(EXTRA_SEQUENCE)); - assertSame(result, capturedBundle.getParcelable(EXTRA_RECOMMENDATION_RESULT)); - } - - @Test - public void testResultCallbackOnResult_runTwice_throwsException() throws Exception { - final int sequence = 100; - final NetworkRecommendationProvider.ResultCallback callback = - new NetworkRecommendationProvider.ResultCallback(mMockRemoteCallback, sequence); - - final RecommendationResult result = RecommendationResult.createDoNotConnectRecommendation(); - callback.onResult(result); - - try { - callback.onResult(result); - fail("Callback ran more than once."); - } catch (IllegalStateException e) { - // expected - } - } - - @Test public void testScoreRequestReceived() throws Exception { mStub.requestScores(mTestNetworkKeys); @@ -162,28 +88,15 @@ public class NetworkRecommendationProviderTest { } private static class NetworkRecProvider extends NetworkRecommendationProvider { - private final CountDownLatch mRecRequestLatch; private final CountDownLatch mScoreRequestLatch; - RecommendationRequest mCapturedRequest; - ResultCallback mCapturedCallback; NetworkKey[] mCapturedNetworks; - NetworkRecProvider(Context context, Executor executor, CountDownLatch recRequestLatch, - CountDownLatch networkRequestLatch) { + NetworkRecProvider(Context context, Executor executor, CountDownLatch networkRequestLatch) { super(context, executor); - mRecRequestLatch = recRequestLatch; mScoreRequestLatch = networkRequestLatch; } @Override - public void onRequestRecommendation(RecommendationRequest request, - ResultCallback callback) { - mCapturedRequest = request; - mCapturedCallback = callback; - mRecRequestLatch.countDown(); - } - - @Override public void onRequestScores(NetworkKey[] networks) { mCapturedNetworks = networks; mScoreRequestLatch.countDown(); diff --git a/core/tests/coretests/src/android/net/RecommendationRequestTest.java b/core/tests/coretests/src/android/net/RecommendationRequestTest.java deleted file mode 100644 index e2e68834de7b..000000000000 --- a/core/tests/coretests/src/android/net/RecommendationRequestTest.java +++ /dev/null @@ -1,116 +0,0 @@ -package android.net; - -import android.net.wifi.ScanResult; -import android.net.wifi.WifiConfiguration; -import android.os.Parcel; -import android.os.SystemClock; -import android.test.AndroidTestCase; - -public class RecommendationRequestTest extends AndroidTestCase { - private ScanResult[] mScanResults; - private WifiConfiguration mDefaultConfig; - private WifiConfiguration mConnectedConfig; - private WifiConfiguration[] mConnectableConfigs; - private int mLastSelectedNetworkId; - private long mLastSelectedNetworkTimestamp; - - @Override - public void setUp() throws Exception { - mScanResults = new ScanResult[2]; - mScanResults[0] = new ScanResult(); - mScanResults[1] = new ScanResult( - "ssid", - "bssid", - 0L /*hessid*/, - 1 /*anqpDominId*/, - "caps", - 2 /*level*/, - 3 /*frequency*/, - 4L /*tsf*/, - 5 /*distCm*/, - 6 /*distSdCm*/, - 7 /*channelWidth*/, - 8 /*centerFreq0*/, - 9 /*centerFreq1*/, - false /*is80211McRTTResponder*/); - mDefaultConfig = new WifiConfiguration(); - mDefaultConfig.SSID = "default_config"; - mConnectedConfig = new WifiConfiguration(); - mConnectedConfig.SSID = "connected_config"; - mConnectableConfigs = new WifiConfiguration[] {mDefaultConfig, mConnectedConfig}; - mLastSelectedNetworkId = 5; - mLastSelectedNetworkTimestamp = SystemClock.elapsedRealtime(); - } - - public void testParceling() throws Exception { - RecommendationRequest request = new RecommendationRequest.Builder() - .setDefaultWifiConfig(mDefaultConfig) - .setScanResults(mScanResults) - .setConnectedWifiConfig(mConnectedConfig) - .setConnectableConfigs(mConnectableConfigs) - .setLastSelectedNetwork(mLastSelectedNetworkId, mLastSelectedNetworkTimestamp) - .build(); - - RecommendationRequest parceled = passThroughParcel(request); - 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); - } - assertEquals(mLastSelectedNetworkId, parceled.getLastSelectedNetworkId()); - assertEquals(mLastSelectedNetworkTimestamp, parceled.getLastSelectedNetworkTimestamp()); - } - - public void testParceling_nullScanResults() throws Exception { - RecommendationRequest request = new RecommendationRequest.Builder() - .setDefaultWifiConfig(mDefaultConfig) - .build(); - - RecommendationRequest parceled = passThroughParcel(request); - 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); - } - - public void testParceling_unsetLastSelectedNetwork() throws Exception { - RecommendationRequest request = new RecommendationRequest.Builder() - .build(); - - RecommendationRequest parceled = passThroughParcel(request); - - assertEquals(-1, parceled.getLastSelectedNetworkId()); - assertEquals(0, parceled.getLastSelectedNetworkTimestamp()); - } - - private RecommendationRequest passThroughParcel(RecommendationRequest request) { - Parcel p = Parcel.obtain(); - RecommendationRequest output = null; - try { - request.writeToParcel(p, 0); - p.setDataPosition(0); - output = RecommendationRequest.CREATOR.createFromParcel(p); - } finally { - p.recycle(); - } - assertNotNull(output); - return output; - } -} diff --git a/services/core/java/com/android/server/NetworkScoreService.java b/services/core/java/com/android/server/NetworkScoreService.java index d25b3cc68221..114d7619a024 100644 --- a/services/core/java/com/android/server/NetworkScoreService.java +++ b/services/core/java/com/android/server/NetworkScoreService.java @@ -16,9 +16,6 @@ package com.android.server; -import static android.net.NetworkRecommendationProvider.EXTRA_RECOMMENDATION_RESULT; -import static android.net.NetworkRecommendationProvider.EXTRA_SEQUENCE; - import android.Manifest.permission; import android.annotation.Nullable; import android.content.BroadcastReceiver; @@ -36,8 +33,6 @@ import android.net.INetworkScoreService; import android.net.NetworkKey; import android.net.NetworkScoreManager; import android.net.NetworkScorerAppData; -import android.net.RecommendationRequest; -import android.net.RecommendationResult; import android.net.ScoredNetwork; import android.net.Uri; import android.net.wifi.ScanResult; @@ -46,24 +41,18 @@ import android.net.wifi.WifiManager; import android.net.wifi.WifiScanner; import android.os.Binder; import android.os.Build; -import android.os.Bundle; import android.os.Handler; import android.os.IBinder; -import android.os.IRemoteCallback; import android.os.Looper; import android.os.Message; import android.os.Process; -import android.os.RemoteCallback; import android.os.RemoteCallbackList; import android.os.RemoteException; import android.os.UserHandle; -import android.provider.Settings; import android.provider.Settings.Global; import android.util.ArrayMap; import android.util.ArraySet; import android.util.Log; -import android.util.Pair; -import android.util.TimedRemoteCaller; import com.android.internal.annotations.GuardedBy; import com.android.internal.annotations.VisibleForTesting; @@ -80,9 +69,6 @@ import java.util.Collections; import java.util.List; import java.util.Map; import java.util.Set; -import java.util.concurrent.TimeoutException; -import java.util.concurrent.atomic.AtomicBoolean; -import java.util.concurrent.atomic.AtomicReference; import java.util.function.BiConsumer; import java.util.function.Function; import java.util.function.Supplier; @@ -99,7 +85,6 @@ public class NetworkScoreService extends INetworkScoreService.Stub { private final Context mContext; private final NetworkScorerAppManager mNetworkScorerAppManager; - private final AtomicReference<RequestRecommendationCaller> mReqRecommendationCallerRef; @GuardedBy("mScoreCaches") private final Map<Integer, RemoteCallbackList<INetworkScoreCache>> mScoreCaches; /** Lock used to update mPackageMonitor when scorer package changes occur. */ @@ -113,7 +98,6 @@ public class NetworkScoreService extends INetworkScoreService.Stub { private NetworkScorerPackageMonitor mPackageMonitor; @GuardedBy("mServiceConnectionLock") private ScoringServiceConnection mServiceConnection; - private volatile long mRecommendationRequestTimeoutMs; private BroadcastReceiver mUserIntentReceiver = new BroadcastReceiver() { @Override @@ -256,9 +240,6 @@ public class NetworkScoreService extends INetworkScoreService.Stub { mContext.registerReceiverAsUser( mUserIntentReceiver, UserHandle.SYSTEM, filter, null /* broadcastPermission*/, null /* scheduler */); - mReqRecommendationCallerRef = new AtomicReference<>( - new RequestRecommendationCaller(TimedRemoteCaller.DEFAULT_CALL_TIMEOUT_MILLIS)); - mRecommendationRequestTimeoutMs = TimedRemoteCaller.DEFAULT_CALL_TIMEOUT_MILLIS; mHandler = new ServiceHandler(looper); mContentObserver = new DispatchingContentObserver(context, mHandler); mServiceConnProducer = serviceConnProducer; @@ -295,10 +276,6 @@ public class NetworkScoreService extends INetworkScoreService.Stub { mContentObserver.observe(packageNameUri, ServiceHandler.MSG_RECOMMENDATIONS_PACKAGE_CHANGED); - final Uri timeoutUri = Global.getUriFor(Global.NETWORK_RECOMMENDATION_REQUEST_TIMEOUT_MS); - mContentObserver.observe(timeoutUri, - ServiceHandler.MSG_RECOMMENDATION_REQUEST_TIMEOUT_CHANGED); - final Uri settingUri = Global.getUriFor(Global.NETWORK_RECOMMENDATIONS_ENABLED); mContentObserver.observe(settingUri, ServiceHandler.MSG_RECOMMENDATION_ENABLED_SETTING_CHANGED); @@ -827,87 +804,6 @@ public class NetworkScoreService extends INetworkScoreService.Stub { } @Override - public RecommendationResult requestRecommendation(RecommendationRequest request) { - mContext.enforceCallingOrSelfPermission(permission.REQUEST_NETWORK_SCORES, TAG); - throwIfCalledOnMainThread(); - final long token = Binder.clearCallingIdentity(); - try { - final INetworkRecommendationProvider provider = getRecommendationProvider(); - if (provider != null) { - try { - final RequestRecommendationCaller caller = mReqRecommendationCallerRef.get(); - return caller.getRecommendationResult(provider, request); - } catch (RemoteException | TimeoutException e) { - Log.w(TAG, "Failed to request a recommendation.", e); - // TODO: 12/15/16 - Keep track of failures. - } - } - - if (DBG) { - Log.d(TAG, "Returning the default network recommendation."); - } - - if (request != null && request.getDefaultWifiConfig() != null) { - return RecommendationResult.createConnectRecommendation( - request.getDefaultWifiConfig()); - } - return RecommendationResult.createDoNotConnectRecommendation(); - } finally { - Binder.restoreCallingIdentity(token); - } - } - - /** - * Request a recommendation for the best network to connect to - * taking into account the inputs from the {@link RecommendationRequest}. - * - * @param request a {@link RecommendationRequest} instance containing the details of the request - * @param remoteCallback a {@link IRemoteCallback} instance to invoke when the recommendation - * is available. - * @throws SecurityException if the caller is not the system - */ - @Override - public void requestRecommendationAsync(RecommendationRequest request, - RemoteCallback remoteCallback) { - mContext.enforceCallingOrSelfPermission(permission.REQUEST_NETWORK_SCORES, TAG); - - final OneTimeCallback oneTimeCallback = new OneTimeCallback(remoteCallback); - final Pair<RecommendationRequest, OneTimeCallback> pair = - Pair.create(request, oneTimeCallback); - final Message timeoutMsg = mHandler.obtainMessage( - ServiceHandler.MSG_RECOMMENDATION_REQUEST_TIMEOUT, pair); - final INetworkRecommendationProvider provider = getRecommendationProvider(); - final long token = Binder.clearCallingIdentity(); - try { - if (provider != null) { - try { - mHandler.sendMessageDelayed(timeoutMsg, mRecommendationRequestTimeoutMs); - provider.requestRecommendation(request, new IRemoteCallback.Stub() { - @Override - public void sendResult(Bundle data) throws RemoteException { - // Remove the timeout message - mHandler.removeMessages(timeoutMsg.what, pair); - oneTimeCallback.sendResult(data); - } - }, 0 /*sequence*/); - return; - } catch (RemoteException e) { - Log.w(TAG, "Failed to request a recommendation.", e); - // TODO: 12/15/16 - Keep track of failures. - // Remove the timeout message - mHandler.removeMessages(timeoutMsg.what, pair); - // Will fall through and send back the default recommendation. - } - } - } finally { - Binder.restoreCallingIdentity(token); - } - - // Else send back the default recommendation. - sendDefaultRecommendationResponse(request, oneTimeCallback); - } - - @Override public boolean requestScores(NetworkKey[] networks) { mContext.enforceCallingOrSelfPermission(permission.REQUEST_NETWORK_SCORES, TAG); final long token = Binder.clearCallingIdentity(); @@ -941,7 +837,6 @@ public class NetworkScoreService extends INetworkScoreService.Stub { return; } writer.println("Current scorer: " + currentScorer); - writer.println("RecommendationRequestTimeoutMs: " + mRecommendationRequestTimeoutMs); sendCacheUpdateCallback(new BiConsumer<INetworkScoreCache, Object>() { @Override @@ -996,12 +891,6 @@ public class NetworkScoreService extends INetworkScoreService.Stub { } } - private void throwIfCalledOnMainThread() { - if (Thread.currentThread() == mContext.getMainLooper().getThread()) { - throw new RuntimeException("Cannot invoke on the main thread"); - } - } - @Nullable private INetworkRecommendationProvider getRecommendationProvider() { synchronized (mServiceConnectionLock) { @@ -1012,19 +901,6 @@ public class NetworkScoreService extends INetworkScoreService.Stub { return null; } - @VisibleForTesting - public void refreshRecommendationRequestTimeoutMs() { - final ContentResolver cr = mContext.getContentResolver(); - long timeoutMs = Settings.Global.getLong(cr, - Global.NETWORK_RECOMMENDATION_REQUEST_TIMEOUT_MS, -1L /*default*/); - if (timeoutMs < 0) { - timeoutMs = TimedRemoteCaller.DEFAULT_CALL_TIMEOUT_MILLIS; - } - if (DBG) Log.d(TAG, "Updating the recommendation request timeout to " + timeoutMs + " ms"); - mRecommendationRequestTimeoutMs = timeoutMs; - mReqRecommendationCallerRef.set(new RequestRecommendationCaller(timeoutMs)); - } - // The class and methods need to be public for Mockito to work. @VisibleForTesting public static class ScoringServiceConnection implements ServiceConnection { @@ -1114,93 +990,10 @@ public class NetworkScoreService extends INetworkScoreService.Stub { } } - /** - * Executes the async requestRecommendation() call with a timeout. - */ - private static final class RequestRecommendationCaller - extends TimedRemoteCaller<RecommendationResult> { - private final IRemoteCallback mCallback; - - RequestRecommendationCaller(long callTimeoutMillis) { - super(callTimeoutMillis); - mCallback = new IRemoteCallback.Stub() { - @Override - public void sendResult(Bundle data) throws RemoteException { - final RecommendationResult result = - data.getParcelable(EXTRA_RECOMMENDATION_RESULT); - final int sequence = data.getInt(EXTRA_SEQUENCE, -1); - if (VERBOSE) Log.v(TAG, "callback received for sequence " + sequence); - onRemoteMethodResult(result, sequence); - } - }; - } - - /** - * Runs the requestRecommendation() call on the given {@link INetworkRecommendationProvider} - * instance. - * - * @param target the {@link INetworkRecommendationProvider} to request a recommendation - * from - * @param request the {@link RecommendationRequest} from the calling client - * @return a {@link RecommendationResult} from the provider - * @throws RemoteException if the call failed - * @throws TimeoutException if the call took longer than the set timeout - */ - RecommendationResult getRecommendationResult(INetworkRecommendationProvider target, - RecommendationRequest request) throws RemoteException, TimeoutException { - final int sequence = onBeforeRemoteCall(); - if (VERBOSE) Log.v(TAG, "getRecommendationResult() seq=" + sequence); - target.requestRecommendation(request, mCallback, sequence); - return getResultTimed(sequence); - } - } - - /** - * A wrapper around {@link RemoteCallback} that guarantees - * {@link RemoteCallback#sendResult(Bundle)} will be invoked at most once. - */ - @VisibleForTesting - public static final class OneTimeCallback { - private final RemoteCallback mRemoteCallback; - private final AtomicBoolean mCallbackRun; - - public OneTimeCallback(RemoteCallback remoteCallback) { - mRemoteCallback = remoteCallback; - mCallbackRun = new AtomicBoolean(false); - } - - public void sendResult(Bundle data) { - if (mCallbackRun.compareAndSet(false, true)) { - mRemoteCallback.sendResult(data); - } - } - } - - private static void sendDefaultRecommendationResponse(RecommendationRequest request, - OneTimeCallback remoteCallback) { - if (DBG) { - Log.d(TAG, "Returning the default network recommendation."); - } - - final RecommendationResult result; - if (request != null && request.getDefaultWifiConfig() != null) { - result = RecommendationResult.createConnectRecommendation( - request.getDefaultWifiConfig()); - } else { - result = RecommendationResult.createDoNotConnectRecommendation(); - } - - final Bundle data = new Bundle(); - data.putParcelable(EXTRA_RECOMMENDATION_RESULT, result); - remoteCallback.sendResult(data); - } - @VisibleForTesting public final class ServiceHandler extends Handler { - public static final int MSG_RECOMMENDATION_REQUEST_TIMEOUT = 1; - public static final int MSG_RECOMMENDATIONS_PACKAGE_CHANGED = 2; - public static final int MSG_RECOMMENDATION_REQUEST_TIMEOUT_CHANGED = 3; - public static final int MSG_RECOMMENDATION_ENABLED_SETTING_CHANGED = 4; + public static final int MSG_RECOMMENDATIONS_PACKAGE_CHANGED = 1; + public static final int MSG_RECOMMENDATION_ENABLED_SETTING_CHANGED = 2; public ServiceHandler(Looper looper) { super(looper); @@ -1210,26 +1003,11 @@ public class NetworkScoreService extends INetworkScoreService.Stub { public void handleMessage(Message msg) { final int what = msg.what; switch (what) { - case MSG_RECOMMENDATION_REQUEST_TIMEOUT: - if (DBG) { - Log.d(TAG, "Network recommendation request timed out."); - } - final Pair<RecommendationRequest, OneTimeCallback> pair = - (Pair<RecommendationRequest, OneTimeCallback>) msg.obj; - final RecommendationRequest request = pair.first; - final OneTimeCallback remoteCallback = pair.second; - sendDefaultRecommendationResponse(request, remoteCallback); - break; - case MSG_RECOMMENDATIONS_PACKAGE_CHANGED: case MSG_RECOMMENDATION_ENABLED_SETTING_CHANGED: refreshBinding(); break; - case MSG_RECOMMENDATION_REQUEST_TIMEOUT_CHANGED: - refreshRecommendationRequestTimeoutMs(); - break; - default: Log.w(TAG,"Unknown message: " + what); } diff --git a/services/tests/servicestests/src/com/android/server/NetworkScoreServiceTest.java b/services/tests/servicestests/src/com/android/server/NetworkScoreServiceTest.java index 985e5eaee256..c78488f9d8d9 100644 --- a/services/tests/servicestests/src/com/android/server/NetworkScoreServiceTest.java +++ b/services/tests/servicestests/src/com/android/server/NetworkScoreServiceTest.java @@ -16,25 +16,18 @@ package com.android.server; -import static android.net.NetworkRecommendationProvider.EXTRA_RECOMMENDATION_RESULT; -import static android.net.NetworkRecommendationProvider.EXTRA_SEQUENCE; import static android.net.NetworkScoreManager.CACHE_FILTER_NONE; import static junit.framework.Assert.assertEquals; import static junit.framework.Assert.assertFalse; -import static junit.framework.Assert.assertNotNull; -import static junit.framework.Assert.assertSame; import static junit.framework.Assert.assertTrue; import static junit.framework.Assert.fail; import static org.mockito.Matchers.any; -import static org.mockito.Matchers.anyInt; import static org.mockito.Matchers.anyListOf; import static org.mockito.Matchers.anyString; import static org.mockito.Matchers.eq; -import static org.mockito.Matchers.isA; import static org.mockito.Mockito.atLeastOnce; -import static org.mockito.Mockito.doAnswer; import static org.mockito.Mockito.doThrow; import static org.mockito.Mockito.never; import static org.mockito.Mockito.times; @@ -55,8 +48,6 @@ import android.net.INetworkScoreCache; import android.net.NetworkKey; import android.net.NetworkScoreManager; import android.net.NetworkScorerAppData; -import android.net.RecommendationRequest; -import android.net.RecommendationResult; import android.net.ScoredNetwork; import android.net.Uri; import android.net.WifiKey; @@ -69,13 +60,11 @@ import android.os.Bundle; import android.os.Handler; import android.os.HandlerThread; import android.os.IBinder; -import android.os.IRemoteCallback; import android.os.Looper; import android.os.Message; import android.os.RemoteCallback; import android.os.RemoteException; import android.os.UserHandle; -import android.provider.Settings; import android.support.test.InstrumentationRegistry; import android.support.test.filters.MediumTest; import android.support.test.runner.AndroidJUnit4; @@ -145,9 +134,6 @@ public class NetworkScoreServiceTest { private ContentResolver mContentResolver; private NetworkScoreService mNetworkScoreService; - private RecommendationRequest mRecommendationRequest; - private RemoteCallback mRemoteCallback; - private OnResultListener mOnResultListener; private HandlerThread mHandlerThread; private List<ScanResult> mScanResults; @@ -177,13 +163,6 @@ public class NetworkScoreServiceTest { WifiConfiguration configuration = new WifiConfiguration(); configuration.SSID = "NetworkScoreServiceTest_SSID"; configuration.BSSID = "NetworkScoreServiceTest_BSSID"; - mRecommendationRequest = new RecommendationRequest.Builder() - .setDefaultWifiConfig(configuration).build(); - mOnResultListener = new OnResultListener(); - mRemoteCallback = new RemoteCallback(mOnResultListener); - Settings.Global.putLong(mContentResolver, - Settings.Global.NETWORK_RECOMMENDATION_REQUEST_TIMEOUT_MS, -1L); - mNetworkScoreService.refreshRecommendationRequestTimeoutMs(); populateScanResults(); } @@ -215,7 +194,6 @@ public class NetworkScoreServiceTest { verify(mNetworkScorerAppManager).updateState(); verify(mNetworkScorerAppManager).migrateNetworkScorerAppSettingIfNeeded(); verify(mServiceConnection).bind(mContext); - } @Test @@ -256,160 +234,6 @@ public class NetworkScoreServiceTest { } @Test - public void testRequestRecommendation_noPermission() throws Exception { - doThrow(new SecurityException()).when(mContext) - .enforceCallingOrSelfPermission(eq(permission.REQUEST_NETWORK_SCORES), - anyString()); - try { - mNetworkScoreService.requestRecommendation(mRecommendationRequest); - fail("REQUEST_NETWORK_SCORES not enforced."); - } catch (SecurityException e) { - // expected - } - } - - @Test - public void testRequestRecommendation_mainThread() throws Exception { - when(mContext.getMainLooper()).thenReturn(Looper.myLooper()); - try { - mNetworkScoreService.requestRecommendation(mRecommendationRequest); - fail("requestRecommendation run on main thread."); - } catch (RuntimeException e) { - // expected - } - } - - @Test - public void testRequestRecommendation_providerNotConnected() throws Exception { - when(mContext.getMainLooper()).thenReturn(Looper.getMainLooper()); - - final RecommendationResult result = - mNetworkScoreService.requestRecommendation(mRecommendationRequest); - assertNotNull(result); - assertEquals(mRecommendationRequest.getDefaultWifiConfig(), - result.getWifiConfiguration()); - } - - @Test - public void testRequestRecommendation_providerThrowsRemoteException() throws Exception { - when(mContext.getMainLooper()).thenReturn(Looper.getMainLooper()); - doThrow(new RemoteException()).when(mRecommendationProvider) - .requestRecommendation(eq(mRecommendationRequest), isA(IRemoteCallback.class), - anyInt()); - mNetworkScoreService.onUserUnlocked(0); - - final RecommendationResult result = - mNetworkScoreService.requestRecommendation(mRecommendationRequest); - assertNotNull(result); - assertEquals(mRecommendationRequest.getDefaultWifiConfig(), - result.getWifiConfiguration()); - } - - @Test - public void testRequestRecommendation_resultReturned() throws Exception { - when(mContext.getMainLooper()).thenReturn(Looper.getMainLooper()); - final WifiConfiguration wifiConfiguration = new WifiConfiguration(); - wifiConfiguration.SSID = "testRequestRecommendation_resultReturned_SSID"; - wifiConfiguration.BSSID = "testRequestRecommendation_resultReturned_BSSID"; - final RecommendationResult providerResult = RecommendationResult - .createConnectRecommendation(wifiConfiguration); - final Bundle bundle = new Bundle(); - bundle.putParcelable(EXTRA_RECOMMENDATION_RESULT, providerResult); - doAnswer(invocation -> { - bundle.putInt(EXTRA_SEQUENCE, invocation.getArgument(2)); - invocation.<IRemoteCallback>getArgument(1).sendResult(bundle); - return null; - }).when(mRecommendationProvider) - .requestRecommendation(eq(mRecommendationRequest), isA(IRemoteCallback.class), - anyInt()); - mNetworkScoreService.onUserUnlocked(0); - - final RecommendationResult result = - mNetworkScoreService.requestRecommendation(mRecommendationRequest); - assertNotNull(result); - assertEquals(providerResult.getWifiConfiguration().SSID, - result.getWifiConfiguration().SSID); - assertEquals(providerResult.getWifiConfiguration().BSSID, - result.getWifiConfiguration().BSSID); - } - - @Test - public void testRequestRecommendationAsync_noPermission() throws Exception { - doThrow(new SecurityException()).when(mContext) - .enforceCallingOrSelfPermission(eq(permission.REQUEST_NETWORK_SCORES), - anyString()); - try { - mNetworkScoreService.requestRecommendationAsync(mRecommendationRequest, - mRemoteCallback); - fail("REQUEST_NETWORK_SCORES not enforced."); - } catch (SecurityException e) { - // expected - } - } - - @Test - public void testRequestRecommendationAsync_providerNotConnected() throws Exception { - mNetworkScoreService.requestRecommendationAsync(mRecommendationRequest, - mRemoteCallback); - boolean callbackRan = mOnResultListener.countDownLatch.await(3, TimeUnit.SECONDS); - assertTrue(callbackRan); - verifyZeroInteractions(mRecommendationProvider); - } - - @Test - public void testRequestRecommendationAsync_requestTimesOut() throws Exception { - mNetworkScoreService.onUserUnlocked(0); - Settings.Global.putLong(mContentResolver, - Settings.Global.NETWORK_RECOMMENDATION_REQUEST_TIMEOUT_MS, 1L); - mNetworkScoreService.refreshRecommendationRequestTimeoutMs(); - mNetworkScoreService.requestRecommendationAsync(mRecommendationRequest, - mRemoteCallback); - boolean callbackRan = mOnResultListener.countDownLatch.await(3, TimeUnit.SECONDS); - assertTrue(callbackRan); - verify(mRecommendationProvider).requestRecommendation(eq(mRecommendationRequest), - isA(IRemoteCallback.Stub.class), anyInt()); - - assertTrue(mOnResultListener.receivedBundle.containsKey(EXTRA_RECOMMENDATION_RESULT)); - RecommendationResult result = - mOnResultListener.receivedBundle.getParcelable(EXTRA_RECOMMENDATION_RESULT); - assertTrue(result.hasRecommendation()); - assertEquals(mRecommendationRequest.getDefaultWifiConfig().SSID, - result.getWifiConfiguration().SSID); - } - - @Test - public void testRequestRecommendationAsync_requestSucceeds() throws Exception { - mNetworkScoreService.onUserUnlocked(0); - final Bundle bundle = new Bundle(); - doAnswer(invocation -> { - invocation.<IRemoteCallback>getArgument(1).sendResult(bundle); - return null; - }).when(mRecommendationProvider) - .requestRecommendation(eq(mRecommendationRequest), isA(IRemoteCallback.class), - anyInt()); - - mNetworkScoreService.requestRecommendationAsync(mRecommendationRequest, - mRemoteCallback); - boolean callbackRan = mOnResultListener.countDownLatch.await(3, TimeUnit.SECONDS); - assertTrue(callbackRan); - // If it's not the same instance then something else ran the callback. - assertSame(bundle, mOnResultListener.receivedBundle); - } - - @Test - public void testRequestRecommendationAsync_requestThrowsRemoteException() throws Exception { - mNetworkScoreService.onUserUnlocked(0); - doThrow(new RemoteException()).when(mRecommendationProvider) - .requestRecommendation(eq(mRecommendationRequest), isA(IRemoteCallback.class), - anyInt()); - - mNetworkScoreService.requestRecommendationAsync(mRecommendationRequest, - mRemoteCallback); - boolean callbackRan = mOnResultListener.countDownLatch.await(3, TimeUnit.SECONDS); - assertTrue(callbackRan); - } - - @Test public void dispatchingContentObserver_nullUri() throws Exception { NetworkScoreService.DispatchingContentObserver observer = new NetworkScoreService.DispatchingContentObserver(mContext, null /*handler*/); @@ -435,15 +259,6 @@ public class NetworkScoreServiceTest { } @Test - public void oneTimeCallback_multipleCallbacks() throws Exception { - NetworkScoreService.OneTimeCallback callback = - new NetworkScoreService.OneTimeCallback(mRemoteCallback); - callback.sendResult(null); - callback.sendResult(null); - assertEquals(1, mOnResultListener.resultCount); - } - - @Test public void testUpdateScores_notActiveScorer() { bindToScorer(false /*callerIsScorer*/); @@ -1088,19 +903,6 @@ public class NetworkScoreServiceTest { mNetworkScoreService.onUserUnlocked(0); } - private static class OnResultListener implements RemoteCallback.OnResultListener { - private final CountDownLatch countDownLatch = new CountDownLatch(1); - private int resultCount; - private Bundle receivedBundle; - - @Override - public void onResult(Bundle result) { - countDownLatch.countDown(); - resultCount++; - receivedBundle = result; - } - } - private static class CountDownHandler extends Handler { CountDownLatch latch = new CountDownLatch(1); int receivedWhat; |