Merge "Update registerNetworkScoreCache() to accept a filter type."

This commit is contained in:
Treehugger Robot
2016-12-09 23:56:34 +00:00
committed by Gerrit Code Review
4 changed files with 81 additions and 17 deletions

View File

@@ -58,12 +58,14 @@ interface INetworkScoreService
/** /**
* Register a cache to receive scoring updates. * Register a cache to receive scoring updates.
* *
* @param networkType the type of network this cache can handle. See {@link NetworkKey#type}. * @param networkType the type of network this cache can handle. See {@link NetworkKey#type}
* @param scoreCache implementation of {@link INetworkScoreCache} to store the scores. * @param scoreCache implementation of {@link INetworkScoreCache} to store the scores
* @throws SecurityException if the caller is not the system. * @param filterType the {@link CacheUpdateFilter} to apply
* @throws SecurityException if the caller is not the system
* @throws IllegalArgumentException if a score cache is already registed for this type
* @hide * @hide
*/ */
void registerNetworkScoreCache(int networkType, INetworkScoreCache scoreCache); void registerNetworkScoreCache(int networkType, INetworkScoreCache scoreCache, int filterType);
/** /**
* Unregister a cache to receive scoring updates. * Unregister a cache to receive scoring updates.

View File

@@ -17,6 +17,7 @@
package android.net; package android.net;
import android.Manifest; import android.Manifest;
import android.annotation.IntDef;
import android.annotation.SdkConstant; import android.annotation.SdkConstant;
import android.annotation.SdkConstant.SdkConstantType; import android.annotation.SdkConstant.SdkConstantType;
import android.annotation.SystemApi; import android.annotation.SystemApi;
@@ -28,6 +29,9 @@ import android.os.RemoteException;
import android.os.ServiceManager; import android.os.ServiceManager;
import android.os.UserHandle; import android.os.UserHandle;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
/** /**
* Class that manages communication between network subsystems and a network scorer. * Class that manages communication between network subsystems and a network scorer.
* *
@@ -131,6 +135,29 @@ public class NetworkScoreManager {
*/ */
public static final String EXTRA_NEW_SCORER = "newScorer"; public static final String EXTRA_NEW_SCORER = "newScorer";
/** @hide */
@IntDef({CACHE_FILTER_NONE, CACHE_FILTER_CURRENT_NETWORK, CACHE_FILTER_SCAN_RESULTS})
@Retention(RetentionPolicy.SOURCE)
public @interface CacheUpdateFilter {}
/**
* Do not filter updates sent to the cache.
* @hide
*/
public static final int CACHE_FILTER_NONE = 0;
/**
* Only send cache updates when the network matches the connected network.
* @hide
*/
public static final int CACHE_FILTER_CURRENT_NETWORK = 1;
/**
* Only send cache updates when the network is part of the current scan result set.
* @hide
*/
public static final int CACHE_FILTER_SCAN_RESULTS = 2;
private final Context mContext; private final Context mContext;
private final INetworkScoreService mService; private final INetworkScoreService mService;
@@ -268,11 +295,29 @@ public class NetworkScoreManager {
* @throws SecurityException if the caller does not hold the * @throws SecurityException if the caller does not hold the
* {@link android.Manifest.permission#BROADCAST_NETWORK_PRIVILEGED} permission. * {@link android.Manifest.permission#BROADCAST_NETWORK_PRIVILEGED} permission.
* @throws IllegalArgumentException if a score cache is already registered for this type. * @throws IllegalArgumentException if a score cache is already registered for this type.
* @deprecated equivalent to registering for cache updates with CACHE_FILTER_NONE.
* @hide * @hide
*/ */
@Deprecated // migrate to registerNetworkScoreCache(int, INetworkScoreCache, int)
public void registerNetworkScoreCache(int networkType, INetworkScoreCache scoreCache) { public void registerNetworkScoreCache(int networkType, INetworkScoreCache scoreCache) {
registerNetworkScoreCache(networkType, scoreCache, CACHE_FILTER_NONE);
}
/**
* Register a network score cache.
*
* @param networkType the type of network this cache can handle. See {@link NetworkKey#type}
* @param scoreCache implementation of {@link INetworkScoreCache} to store the scores
* @param filterType the {@link CacheUpdateFilter} to apply
* @throws SecurityException if the caller does not hold the
* {@link android.Manifest.permission#BROADCAST_NETWORK_PRIVILEGED} permission.
* @throws IllegalArgumentException if a score cache is already registered for this type.
* @hide
*/
public void registerNetworkScoreCache(int networkType, INetworkScoreCache scoreCache,
@CacheUpdateFilter int filterType) {
try { try {
mService.registerNetworkScoreCache(networkType, scoreCache); mService.registerNetworkScoreCache(networkType, scoreCache, filterType);
} catch (RemoteException e) { } catch (RemoteException e) {
throw e.rethrowFromSystemServer(); throw e.rethrowFromSystemServer();
} }

View File

@@ -425,7 +425,9 @@ public class NetworkScoreService extends INetworkScoreService.Stub {
} }
@Override @Override
public void registerNetworkScoreCache(int networkType, INetworkScoreCache scoreCache) { public void registerNetworkScoreCache(int networkType,
INetworkScoreCache scoreCache,
int filterType) {
mContext.enforceCallingOrSelfPermission(permission.BROADCAST_NETWORK_PRIVILEGED, TAG); mContext.enforceCallingOrSelfPermission(permission.BROADCAST_NETWORK_PRIVILEGED, TAG);
synchronized (mScoreCaches) { synchronized (mScoreCaches) {
RemoteCallbackList<INetworkScoreCache> callbackList = mScoreCaches.get(networkType); RemoteCallbackList<INetworkScoreCache> callbackList = mScoreCaches.get(networkType);
@@ -433,7 +435,7 @@ public class NetworkScoreService extends INetworkScoreService.Stub {
callbackList = new RemoteCallbackList<>(); callbackList = new RemoteCallbackList<>();
mScoreCaches.put(networkType, callbackList); mScoreCaches.put(networkType, callbackList);
} }
if (!callbackList.register(scoreCache)) { if (!callbackList.register(scoreCache, filterType)) {
if (callbackList.getRegisteredCallbackCount() == 0) { if (callbackList.getRegisteredCallbackCount() == 0) {
mScoreCaches.remove(networkType); mScoreCaches.remove(networkType);
} }

View File

@@ -16,6 +16,8 @@
package com.android.server; package com.android.server;
import static android.net.NetworkScoreManager.CACHE_FILTER_NONE;
import static junit.framework.Assert.assertEquals; import static junit.framework.Assert.assertEquals;
import static junit.framework.Assert.assertFalse; import static junit.framework.Assert.assertFalse;
import static junit.framework.Assert.assertTrue; import static junit.framework.Assert.assertTrue;
@@ -26,6 +28,7 @@ import static org.mockito.Matchers.anyInt;
import static org.mockito.Matchers.anyListOf; import static org.mockito.Matchers.anyListOf;
import static org.mockito.Matchers.anyString; import static org.mockito.Matchers.anyString;
import static org.mockito.Matchers.eq; import static org.mockito.Matchers.eq;
import static org.mockito.Mockito.atLeastOnce;
import static org.mockito.Mockito.doThrow; import static org.mockito.Mockito.doThrow;
import static org.mockito.Mockito.never; import static org.mockito.Mockito.never;
import static org.mockito.Mockito.times; import static org.mockito.Mockito.times;
@@ -70,6 +73,7 @@ import org.junit.runner.RunWith;
import org.mockito.ArgumentCaptor; import org.mockito.ArgumentCaptor;
import org.mockito.Captor; import org.mockito.Captor;
import org.mockito.Mock; import org.mockito.Mock;
import org.mockito.Mockito;
import org.mockito.MockitoAnnotations; import org.mockito.MockitoAnnotations;
/** /**
@@ -177,7 +181,8 @@ public class NetworkScoreServiceTest {
public void testUpdateScores_oneRegisteredCache() throws RemoteException { public void testUpdateScores_oneRegisteredCache() throws RemoteException {
when(mNetworkScorerAppManager.isCallerActiveScorer(anyInt())).thenReturn(true); when(mNetworkScorerAppManager.isCallerActiveScorer(anyInt())).thenReturn(true);
mNetworkScoreService.registerNetworkScoreCache(NetworkKey.TYPE_WIFI, mNetworkScoreCache); mNetworkScoreService.registerNetworkScoreCache(NetworkKey.TYPE_WIFI,
mNetworkScoreCache, CACHE_FILTER_NONE);
mNetworkScoreService.updateScores(new ScoredNetwork[]{SCORED_NETWORK}); mNetworkScoreService.updateScores(new ScoredNetwork[]{SCORED_NETWORK});
@@ -191,9 +196,10 @@ public class NetworkScoreServiceTest {
public void testUpdateScores_twoRegisteredCaches() throws RemoteException { public void testUpdateScores_twoRegisteredCaches() throws RemoteException {
when(mNetworkScorerAppManager.isCallerActiveScorer(anyInt())).thenReturn(true); when(mNetworkScorerAppManager.isCallerActiveScorer(anyInt())).thenReturn(true);
mNetworkScoreService.registerNetworkScoreCache(NetworkKey.TYPE_WIFI, mNetworkScoreCache); mNetworkScoreService.registerNetworkScoreCache(NetworkKey.TYPE_WIFI,
mNetworkScoreCache, CACHE_FILTER_NONE);
mNetworkScoreService.registerNetworkScoreCache( mNetworkScoreService.registerNetworkScoreCache(
NetworkKey.TYPE_WIFI, mNetworkScoreCache2); NetworkKey.TYPE_WIFI, mNetworkScoreCache2, CACHE_FILTER_NONE);
// updateScores should update both caches // updateScores should update both caches
mNetworkScoreService.updateScores(new ScoredNetwork[]{SCORED_NETWORK}); mNetworkScoreService.updateScores(new ScoredNetwork[]{SCORED_NETWORK});
@@ -215,6 +221,9 @@ public class NetworkScoreServiceTest {
// updateScores should not update any caches since they are both unregistered // updateScores should not update any caches since they are both unregistered
mNetworkScoreService.updateScores(new ScoredNetwork[]{SCORED_NETWORK}); mNetworkScoreService.updateScores(new ScoredNetwork[]{SCORED_NETWORK});
// The register and unregister calls grab the binder from the score cache.
verify(mNetworkScoreCache, atLeastOnce()).asBinder();
verify(mNetworkScoreCache2, atLeastOnce()).asBinder();
verifyNoMoreInteractions(mNetworkScoreCache, mNetworkScoreCache2); verifyNoMoreInteractions(mNetworkScoreCache, mNetworkScoreCache2);
} }
@@ -244,7 +253,8 @@ public class NetworkScoreServiceTest {
public void testClearScores_activeScorer() throws RemoteException { public void testClearScores_activeScorer() throws RemoteException {
when(mNetworkScorerAppManager.isCallerActiveScorer(anyInt())).thenReturn(true); when(mNetworkScorerAppManager.isCallerActiveScorer(anyInt())).thenReturn(true);
mNetworkScoreService.registerNetworkScoreCache(NetworkKey.TYPE_WIFI, mNetworkScoreCache); mNetworkScoreService.registerNetworkScoreCache(NetworkKey.TYPE_WIFI, mNetworkScoreCache,
CACHE_FILTER_NONE);
mNetworkScoreService.clearScores(); mNetworkScoreService.clearScores();
verify(mNetworkScoreCache).clearScores(); verify(mNetworkScoreCache).clearScores();
@@ -257,7 +267,8 @@ public class NetworkScoreServiceTest {
when(mContext.checkCallingOrSelfPermission(permission.BROADCAST_NETWORK_PRIVILEGED)) when(mContext.checkCallingOrSelfPermission(permission.BROADCAST_NETWORK_PRIVILEGED))
.thenReturn(PackageManager.PERMISSION_GRANTED); .thenReturn(PackageManager.PERMISSION_GRANTED);
mNetworkScoreService.registerNetworkScoreCache(NetworkKey.TYPE_WIFI, mNetworkScoreCache); mNetworkScoreService.registerNetworkScoreCache(NetworkKey.TYPE_WIFI, mNetworkScoreCache,
CACHE_FILTER_NONE);
mNetworkScoreService.clearScores(); mNetworkScoreService.clearScores();
verify(mNetworkScoreCache).clearScores(); verify(mNetworkScoreCache).clearScores();
@@ -280,7 +291,8 @@ public class NetworkScoreServiceTest {
public void testSetActiveScorer_failure() throws RemoteException { public void testSetActiveScorer_failure() throws RemoteException {
when(mNetworkScorerAppManager.getActiveScorer()).thenReturn(PREV_SCORER); when(mNetworkScorerAppManager.getActiveScorer()).thenReturn(PREV_SCORER);
when(mNetworkScorerAppManager.setActiveScorer(NEW_SCORER.mPackageName)).thenReturn(false); when(mNetworkScorerAppManager.setActiveScorer(NEW_SCORER.mPackageName)).thenReturn(false);
mNetworkScoreService.registerNetworkScoreCache(NetworkKey.TYPE_WIFI, mNetworkScoreCache); mNetworkScoreService.registerNetworkScoreCache(NetworkKey.TYPE_WIFI, mNetworkScoreCache,
CACHE_FILTER_NONE);
boolean success = mNetworkScoreService.setActiveScorer(NEW_SCORER.mPackageName); boolean success = mNetworkScoreService.setActiveScorer(NEW_SCORER.mPackageName);
@@ -297,7 +309,8 @@ public class NetworkScoreServiceTest {
public void testSetActiveScorer_success() throws RemoteException { public void testSetActiveScorer_success() throws RemoteException {
when(mNetworkScorerAppManager.getActiveScorer()).thenReturn(PREV_SCORER, NEW_SCORER); when(mNetworkScorerAppManager.getActiveScorer()).thenReturn(PREV_SCORER, NEW_SCORER);
when(mNetworkScorerAppManager.setActiveScorer(NEW_SCORER.mPackageName)).thenReturn(true); when(mNetworkScorerAppManager.setActiveScorer(NEW_SCORER.mPackageName)).thenReturn(true);
mNetworkScoreService.registerNetworkScoreCache(NetworkKey.TYPE_WIFI, mNetworkScoreCache); mNetworkScoreService.registerNetworkScoreCache(NetworkKey.TYPE_WIFI, mNetworkScoreCache,
CACHE_FILTER_NONE);
boolean success = mNetworkScoreService.setActiveScorer(NEW_SCORER.mPackageName); boolean success = mNetworkScoreService.setActiveScorer(NEW_SCORER.mPackageName);
@@ -333,7 +346,8 @@ public class NetworkScoreServiceTest {
when(mNetworkScorerAppManager.isCallerActiveScorer(anyInt())).thenReturn(true); when(mNetworkScorerAppManager.isCallerActiveScorer(anyInt())).thenReturn(true);
when(mNetworkScorerAppManager.getActiveScorer()).thenReturn(PREV_SCORER, null); when(mNetworkScorerAppManager.getActiveScorer()).thenReturn(PREV_SCORER, null);
when(mNetworkScorerAppManager.setActiveScorer(null)).thenReturn(true); when(mNetworkScorerAppManager.setActiveScorer(null)).thenReturn(true);
mNetworkScoreService.registerNetworkScoreCache(NetworkKey.TYPE_WIFI, mNetworkScoreCache); mNetworkScoreService.registerNetworkScoreCache(NetworkKey.TYPE_WIFI, mNetworkScoreCache,
CACHE_FILTER_NONE);
mNetworkScoreService.disableScoring(); mNetworkScoreService.disableScoring();
@@ -354,7 +368,8 @@ public class NetworkScoreServiceTest {
.thenReturn(PackageManager.PERMISSION_GRANTED); .thenReturn(PackageManager.PERMISSION_GRANTED);
when(mNetworkScorerAppManager.getActiveScorer()).thenReturn(PREV_SCORER, null); when(mNetworkScorerAppManager.getActiveScorer()).thenReturn(PREV_SCORER, null);
when(mNetworkScorerAppManager.setActiveScorer(null)).thenReturn(true); when(mNetworkScorerAppManager.setActiveScorer(null)).thenReturn(true);
mNetworkScoreService.registerNetworkScoreCache(NetworkKey.TYPE_WIFI, mNetworkScoreCache); mNetworkScoreService.registerNetworkScoreCache(NetworkKey.TYPE_WIFI, mNetworkScoreCache,
CACHE_FILTER_NONE);
mNetworkScoreService.disableScoring(); mNetworkScoreService.disableScoring();
@@ -374,7 +389,7 @@ public class NetworkScoreServiceTest {
try { try {
mNetworkScoreService.registerNetworkScoreCache( mNetworkScoreService.registerNetworkScoreCache(
NetworkKey.TYPE_WIFI, mNetworkScoreCache); NetworkKey.TYPE_WIFI, mNetworkScoreCache, CACHE_FILTER_NONE);
fail("SecurityException expected"); fail("SecurityException expected");
} catch (SecurityException e) { } catch (SecurityException e) {
// expected // expected