NetworkScoreManager.java revision 14f1ec05b2add5ee051c0d2e7c7c3b36a6e77b92
1b51e0a6c4b249e0d6f404fafef007645221be0d3Jeff Davidson/* 2b51e0a6c4b249e0d6f404fafef007645221be0d3Jeff Davidson * Copyright (C) 2014 The Android Open Source Project 3b51e0a6c4b249e0d6f404fafef007645221be0d3Jeff Davidson * 4b51e0a6c4b249e0d6f404fafef007645221be0d3Jeff Davidson * Licensed under the Apache License, Version 2.0 (the "License"); 5b51e0a6c4b249e0d6f404fafef007645221be0d3Jeff Davidson * you may not use this file except in compliance with the License. 6b51e0a6c4b249e0d6f404fafef007645221be0d3Jeff Davidson * You may obtain a copy of the License at 7b51e0a6c4b249e0d6f404fafef007645221be0d3Jeff Davidson * 8b51e0a6c4b249e0d6f404fafef007645221be0d3Jeff Davidson * http://www.apache.org/licenses/LICENSE-2.0 9b51e0a6c4b249e0d6f404fafef007645221be0d3Jeff Davidson * 10b51e0a6c4b249e0d6f404fafef007645221be0d3Jeff Davidson * Unless required by applicable law or agreed to in writing, software 11b51e0a6c4b249e0d6f404fafef007645221be0d3Jeff Davidson * distributed under the License is distributed on an "AS IS" BASIS, 12b51e0a6c4b249e0d6f404fafef007645221be0d3Jeff Davidson * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13b51e0a6c4b249e0d6f404fafef007645221be0d3Jeff Davidson * See the License for the specific language governing permissions and 14b51e0a6c4b249e0d6f404fafef007645221be0d3Jeff Davidson * limitations under the License 15b51e0a6c4b249e0d6f404fafef007645221be0d3Jeff Davidson */ 16b51e0a6c4b249e0d6f404fafef007645221be0d3Jeff Davidson 17b51e0a6c4b249e0d6f404fafef007645221be0d3Jeff Davidsonpackage android.net; 18b51e0a6c4b249e0d6f404fafef007645221be0d3Jeff Davidson 19b51e0a6c4b249e0d6f404fafef007645221be0d3Jeff Davidsonimport android.annotation.SdkConstant; 20b51e0a6c4b249e0d6f404fafef007645221be0d3Jeff Davidsonimport android.annotation.SdkConstant.SdkConstantType; 21b51e0a6c4b249e0d6f404fafef007645221be0d3Jeff Davidsonimport android.content.Context; 2214f1ec05b2add5ee051c0d2e7c7c3b36a6e77b92Jeff Davidsonimport android.content.Intent; 236a4b220f1263d95fdefe6361c2bc87bbb04bbed0Jeff Davidsonimport android.os.IBinder; 246a4b220f1263d95fdefe6361c2bc87bbb04bbed0Jeff Davidsonimport android.os.RemoteException; 256a4b220f1263d95fdefe6361c2bc87bbb04bbed0Jeff Davidsonimport android.os.ServiceManager; 26b51e0a6c4b249e0d6f404fafef007645221be0d3Jeff Davidson 27b51e0a6c4b249e0d6f404fafef007645221be0d3Jeff Davidson/** 28b51e0a6c4b249e0d6f404fafef007645221be0d3Jeff Davidson * Class that manages communication between network subsystems and a network scorer. 29b51e0a6c4b249e0d6f404fafef007645221be0d3Jeff Davidson * 30b51e0a6c4b249e0d6f404fafef007645221be0d3Jeff Davidson * <p>You can get an instance of this class by calling 31b51e0a6c4b249e0d6f404fafef007645221be0d3Jeff Davidson * {@link android.content.Context#getSystemService(String)}: 32b51e0a6c4b249e0d6f404fafef007645221be0d3Jeff Davidson * 33b51e0a6c4b249e0d6f404fafef007645221be0d3Jeff Davidson * <pre>NetworkScoreManager manager = 34b51e0a6c4b249e0d6f404fafef007645221be0d3Jeff Davidson * (NetworkScoreManager) getSystemService(Context.NETWORK_SCORE_SERVICE)</pre> 35b51e0a6c4b249e0d6f404fafef007645221be0d3Jeff Davidson * 36b51e0a6c4b249e0d6f404fafef007645221be0d3Jeff Davidson * <p>A network scorer is any application which: 37b51e0a6c4b249e0d6f404fafef007645221be0d3Jeff Davidson * <ul> 38b51e0a6c4b249e0d6f404fafef007645221be0d3Jeff Davidson * <li>Declares the {@link android.Manifest.permission#SCORE_NETWORKS} permission. 39b51e0a6c4b249e0d6f404fafef007645221be0d3Jeff Davidson * <li>Includes a receiver for {@link #ACTION_SCORE_NETWORKS} guarded by the 40b51e0a6c4b249e0d6f404fafef007645221be0d3Jeff Davidson * {@link android.Manifest.permission#BROADCAST_SCORE_NETWORKS} permission which scores networks 41b51e0a6c4b249e0d6f404fafef007645221be0d3Jeff Davidson * and (eventually) calls {@link #updateScores} with the results. 42b51e0a6c4b249e0d6f404fafef007645221be0d3Jeff Davidson * </ul> 43b51e0a6c4b249e0d6f404fafef007645221be0d3Jeff Davidson * 44ee2a1219d3c59d88c83fca65289166fa9d7e53e9Jeff Davidson * <p>The system keeps track of an active scorer application; at any time, only this application 45b51e0a6c4b249e0d6f404fafef007645221be0d3Jeff Davidson * will receive {@link #ACTION_SCORE_NETWORKS} broadcasts and will be permitted to call 46ee2a1219d3c59d88c83fca65289166fa9d7e53e9Jeff Davidson * {@link #updateScores}. Applications may determine the current active scorer with 47ee2a1219d3c59d88c83fca65289166fa9d7e53e9Jeff Davidson * {@link #getActiveScorerPackage()} and request to change the active scorer by sending an 48ee2a1219d3c59d88c83fca65289166fa9d7e53e9Jeff Davidson * {@link #ACTION_CHANGE_ACTIVE} broadcast with another scorer. 49b51e0a6c4b249e0d6f404fafef007645221be0d3Jeff Davidson * 50b51e0a6c4b249e0d6f404fafef007645221be0d3Jeff Davidson * @hide 51b51e0a6c4b249e0d6f404fafef007645221be0d3Jeff Davidson */ 52b51e0a6c4b249e0d6f404fafef007645221be0d3Jeff Davidsonpublic class NetworkScoreManager { 53b51e0a6c4b249e0d6f404fafef007645221be0d3Jeff Davidson /** 54ee2a1219d3c59d88c83fca65289166fa9d7e53e9Jeff Davidson * Activity action: ask the user to change the active network scorer. This will show a dialog 55ee2a1219d3c59d88c83fca65289166fa9d7e53e9Jeff Davidson * that asks the user whether they want to replace the current active scorer with the one 56b51e0a6c4b249e0d6f404fafef007645221be0d3Jeff Davidson * specified in {@link #EXTRA_PACKAGE_NAME}. The activity will finish with RESULT_OK if the 57ee2a1219d3c59d88c83fca65289166fa9d7e53e9Jeff Davidson * active scorer was changed or RESULT_CANCELED if it failed for any reason. 58b51e0a6c4b249e0d6f404fafef007645221be0d3Jeff Davidson */ 59b51e0a6c4b249e0d6f404fafef007645221be0d3Jeff Davidson @SdkConstant(SdkConstantType.ACTIVITY_INTENT_ACTION) 60ee2a1219d3c59d88c83fca65289166fa9d7e53e9Jeff Davidson public static final String ACTION_CHANGE_ACTIVE = "android.net.scoring.CHANGE_ACTIVE"; 61b51e0a6c4b249e0d6f404fafef007645221be0d3Jeff Davidson 62b51e0a6c4b249e0d6f404fafef007645221be0d3Jeff Davidson /** 63ee2a1219d3c59d88c83fca65289166fa9d7e53e9Jeff Davidson * Extra used with {@link #ACTION_CHANGE_ACTIVE} to specify the new scorer package. Set with 64b51e0a6c4b249e0d6f404fafef007645221be0d3Jeff Davidson * {@link android.content.Intent#putExtra(String, String)}. 65b51e0a6c4b249e0d6f404fafef007645221be0d3Jeff Davidson */ 66b51e0a6c4b249e0d6f404fafef007645221be0d3Jeff Davidson public static final String EXTRA_PACKAGE_NAME = "packageName"; 67b51e0a6c4b249e0d6f404fafef007645221be0d3Jeff Davidson 68b51e0a6c4b249e0d6f404fafef007645221be0d3Jeff Davidson /** 69b51e0a6c4b249e0d6f404fafef007645221be0d3Jeff Davidson * Broadcast action: new network scores are being requested. This intent will only be delivered 70ee2a1219d3c59d88c83fca65289166fa9d7e53e9Jeff Davidson * to the current active scorer app. That app is responsible for scoring the networks and 71b51e0a6c4b249e0d6f404fafef007645221be0d3Jeff Davidson * calling {@link #updateScores} when complete. The networks to score are specified in 72b51e0a6c4b249e0d6f404fafef007645221be0d3Jeff Davidson * {@link #EXTRA_NETWORKS_TO_SCORE}, and will generally consist of all networks which have been 73b51e0a6c4b249e0d6f404fafef007645221be0d3Jeff Davidson * configured by the user as well as any open networks. 74b51e0a6c4b249e0d6f404fafef007645221be0d3Jeff Davidson * 75b51e0a6c4b249e0d6f404fafef007645221be0d3Jeff Davidson * <p class="note">This is a protected intent that can only be sent by the system. 76b51e0a6c4b249e0d6f404fafef007645221be0d3Jeff Davidson */ 77b51e0a6c4b249e0d6f404fafef007645221be0d3Jeff Davidson @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION) 78b51e0a6c4b249e0d6f404fafef007645221be0d3Jeff Davidson public static final String ACTION_SCORE_NETWORKS = "android.net.scoring.SCORE_NETWORKS"; 79b51e0a6c4b249e0d6f404fafef007645221be0d3Jeff Davidson 80b51e0a6c4b249e0d6f404fafef007645221be0d3Jeff Davidson /** 81b51e0a6c4b249e0d6f404fafef007645221be0d3Jeff Davidson * Extra used with {@link #ACTION_SCORE_NETWORKS} to specify the networks to be scored, as an 82b51e0a6c4b249e0d6f404fafef007645221be0d3Jeff Davidson * array of {@link NetworkKey}s. Can be obtained with 83b51e0a6c4b249e0d6f404fafef007645221be0d3Jeff Davidson * {@link android.content.Intent#getParcelableArrayExtra(String)}}. 84b51e0a6c4b249e0d6f404fafef007645221be0d3Jeff Davidson */ 85b51e0a6c4b249e0d6f404fafef007645221be0d3Jeff Davidson public static final String EXTRA_NETWORKS_TO_SCORE = "networksToScore"; 86b51e0a6c4b249e0d6f404fafef007645221be0d3Jeff Davidson 87b51e0a6c4b249e0d6f404fafef007645221be0d3Jeff Davidson private final Context mContext; 886a4b220f1263d95fdefe6361c2bc87bbb04bbed0Jeff Davidson private final INetworkScoreService mService; 89b51e0a6c4b249e0d6f404fafef007645221be0d3Jeff Davidson 90b51e0a6c4b249e0d6f404fafef007645221be0d3Jeff Davidson /** @hide */ 91b51e0a6c4b249e0d6f404fafef007645221be0d3Jeff Davidson public NetworkScoreManager(Context context) { 92b51e0a6c4b249e0d6f404fafef007645221be0d3Jeff Davidson mContext = context; 936a4b220f1263d95fdefe6361c2bc87bbb04bbed0Jeff Davidson IBinder iBinder = ServiceManager.getService(Context.NETWORK_SCORE_SERVICE); 946a4b220f1263d95fdefe6361c2bc87bbb04bbed0Jeff Davidson mService = INetworkScoreService.Stub.asInterface(iBinder); 95b51e0a6c4b249e0d6f404fafef007645221be0d3Jeff Davidson } 96b51e0a6c4b249e0d6f404fafef007645221be0d3Jeff Davidson 97b51e0a6c4b249e0d6f404fafef007645221be0d3Jeff Davidson /** 986a4b220f1263d95fdefe6361c2bc87bbb04bbed0Jeff Davidson * Obtain the package name of the current active network scorer. 99b51e0a6c4b249e0d6f404fafef007645221be0d3Jeff Davidson * 1006a4b220f1263d95fdefe6361c2bc87bbb04bbed0Jeff Davidson * <p>At any time, only one scorer application will receive {@link #ACTION_SCORE_NETWORKS} 101b51e0a6c4b249e0d6f404fafef007645221be0d3Jeff Davidson * broadcasts and be allowed to call {@link #updateScores}. Applications may use this method to 102b51e0a6c4b249e0d6f404fafef007645221be0d3Jeff Davidson * determine the current scorer and offer the user the ability to select a different scorer via 103ee2a1219d3c59d88c83fca65289166fa9d7e53e9Jeff Davidson * the {@link #ACTION_CHANGE_ACTIVE} intent. 1046a4b220f1263d95fdefe6361c2bc87bbb04bbed0Jeff Davidson * @return the full package name of the current active scorer, or null if there is no active 10514f1ec05b2add5ee051c0d2e7c7c3b36a6e77b92Jeff Davidson * scorer. 106b51e0a6c4b249e0d6f404fafef007645221be0d3Jeff Davidson */ 1076a4b220f1263d95fdefe6361c2bc87bbb04bbed0Jeff Davidson public String getActiveScorerPackage() { 1086a4b220f1263d95fdefe6361c2bc87bbb04bbed0Jeff Davidson return NetworkScorerAppManager.getActiveScorer(mContext); 109b51e0a6c4b249e0d6f404fafef007645221be0d3Jeff Davidson } 110b51e0a6c4b249e0d6f404fafef007645221be0d3Jeff Davidson 111b51e0a6c4b249e0d6f404fafef007645221be0d3Jeff Davidson /** 112b51e0a6c4b249e0d6f404fafef007645221be0d3Jeff Davidson * Update network scores. 113b51e0a6c4b249e0d6f404fafef007645221be0d3Jeff Davidson * 1146a4b220f1263d95fdefe6361c2bc87bbb04bbed0Jeff Davidson * <p>This may be called at any time to re-score active networks. Scores will generally be 1156a4b220f1263d95fdefe6361c2bc87bbb04bbed0Jeff Davidson * updated quickly, but if this method is called too frequently, the scores may be held and 1166a4b220f1263d95fdefe6361c2bc87bbb04bbed0Jeff Davidson * applied at a later time. 117b51e0a6c4b249e0d6f404fafef007645221be0d3Jeff Davidson * 118b51e0a6c4b249e0d6f404fafef007645221be0d3Jeff Davidson * @param networks the networks which have been scored by the scorer. 1196a4b220f1263d95fdefe6361c2bc87bbb04bbed0Jeff Davidson * @return whether the update was successful. 1206a4b220f1263d95fdefe6361c2bc87bbb04bbed0Jeff Davidson * @throws SecurityException if the caller is not the active scorer. 121b51e0a6c4b249e0d6f404fafef007645221be0d3Jeff Davidson */ 1226a4b220f1263d95fdefe6361c2bc87bbb04bbed0Jeff Davidson public boolean updateScores(ScoredNetwork[] networks) throws SecurityException { 1236a4b220f1263d95fdefe6361c2bc87bbb04bbed0Jeff Davidson try { 1246a4b220f1263d95fdefe6361c2bc87bbb04bbed0Jeff Davidson return mService.updateScores(networks); 1256a4b220f1263d95fdefe6361c2bc87bbb04bbed0Jeff Davidson } catch (RemoteException e) { 1266a4b220f1263d95fdefe6361c2bc87bbb04bbed0Jeff Davidson return false; 1276a4b220f1263d95fdefe6361c2bc87bbb04bbed0Jeff Davidson } 1286a4b220f1263d95fdefe6361c2bc87bbb04bbed0Jeff Davidson } 1296a4b220f1263d95fdefe6361c2bc87bbb04bbed0Jeff Davidson 1306a4b220f1263d95fdefe6361c2bc87bbb04bbed0Jeff Davidson /** 1316a4b220f1263d95fdefe6361c2bc87bbb04bbed0Jeff Davidson * Clear network scores. 1326a4b220f1263d95fdefe6361c2bc87bbb04bbed0Jeff Davidson * 1336a4b220f1263d95fdefe6361c2bc87bbb04bbed0Jeff Davidson * <p>Should be called when all scores need to be invalidated, i.e. because the scoring 1346a4b220f1263d95fdefe6361c2bc87bbb04bbed0Jeff Davidson * algorithm has changed and old scores can no longer be compared to future scores. 1356a4b220f1263d95fdefe6361c2bc87bbb04bbed0Jeff Davidson * 1366a4b220f1263d95fdefe6361c2bc87bbb04bbed0Jeff Davidson * <p>Note that scores will be cleared automatically when the active scorer changes, as scores 1376a4b220f1263d95fdefe6361c2bc87bbb04bbed0Jeff Davidson * from one scorer cannot be compared to those from another scorer. 1386a4b220f1263d95fdefe6361c2bc87bbb04bbed0Jeff Davidson * 1396a4b220f1263d95fdefe6361c2bc87bbb04bbed0Jeff Davidson * @return whether the clear was successful. 1406a4b220f1263d95fdefe6361c2bc87bbb04bbed0Jeff Davidson * @throws SecurityException if the caller is not the active scorer or privileged. 1416a4b220f1263d95fdefe6361c2bc87bbb04bbed0Jeff Davidson */ 1426a4b220f1263d95fdefe6361c2bc87bbb04bbed0Jeff Davidson public boolean clearScores() throws SecurityException { 1436a4b220f1263d95fdefe6361c2bc87bbb04bbed0Jeff Davidson try { 1446a4b220f1263d95fdefe6361c2bc87bbb04bbed0Jeff Davidson return mService.clearScores(); 1456a4b220f1263d95fdefe6361c2bc87bbb04bbed0Jeff Davidson } catch (RemoteException e) { 1466a4b220f1263d95fdefe6361c2bc87bbb04bbed0Jeff Davidson return false; 1476a4b220f1263d95fdefe6361c2bc87bbb04bbed0Jeff Davidson } 1486a4b220f1263d95fdefe6361c2bc87bbb04bbed0Jeff Davidson } 1496a4b220f1263d95fdefe6361c2bc87bbb04bbed0Jeff Davidson 1506a4b220f1263d95fdefe6361c2bc87bbb04bbed0Jeff Davidson /** 1516a4b220f1263d95fdefe6361c2bc87bbb04bbed0Jeff Davidson * Set the active scorer to a new package and clear existing scores. 1526a4b220f1263d95fdefe6361c2bc87bbb04bbed0Jeff Davidson * 1536a4b220f1263d95fdefe6361c2bc87bbb04bbed0Jeff Davidson * @return true if the operation succeeded, or false if the new package is not a valid scorer. 1546a4b220f1263d95fdefe6361c2bc87bbb04bbed0Jeff Davidson * @throws SecurityException if the caller does not hold the 15514f1ec05b2add5ee051c0d2e7c7c3b36a6e77b92Jeff Davidson * {@link android.Manifest.permission#BROADCAST_SCORE_NETWORKS} permission indicating 15614f1ec05b2add5ee051c0d2e7c7c3b36a6e77b92Jeff Davidson * that it can manage scorer applications. 1576a4b220f1263d95fdefe6361c2bc87bbb04bbed0Jeff Davidson * @hide 1586a4b220f1263d95fdefe6361c2bc87bbb04bbed0Jeff Davidson */ 1596a4b220f1263d95fdefe6361c2bc87bbb04bbed0Jeff Davidson public boolean setActiveScorer(String packageName) throws SecurityException { 1606a4b220f1263d95fdefe6361c2bc87bbb04bbed0Jeff Davidson try { 1616a4b220f1263d95fdefe6361c2bc87bbb04bbed0Jeff Davidson return mService.setActiveScorer(packageName); 1626a4b220f1263d95fdefe6361c2bc87bbb04bbed0Jeff Davidson } catch (RemoteException e) { 1636a4b220f1263d95fdefe6361c2bc87bbb04bbed0Jeff Davidson return false; 1646a4b220f1263d95fdefe6361c2bc87bbb04bbed0Jeff Davidson } 165b51e0a6c4b249e0d6f404fafef007645221be0d3Jeff Davidson } 16614f1ec05b2add5ee051c0d2e7c7c3b36a6e77b92Jeff Davidson 16714f1ec05b2add5ee051c0d2e7c7c3b36a6e77b92Jeff Davidson /** 16814f1ec05b2add5ee051c0d2e7c7c3b36a6e77b92Jeff Davidson * Request scoring for networks. 16914f1ec05b2add5ee051c0d2e7c7c3b36a6e77b92Jeff Davidson * 17014f1ec05b2add5ee051c0d2e7c7c3b36a6e77b92Jeff Davidson * <p>Note that this is just a helper method to assemble the broadcast, and will run in the 17114f1ec05b2add5ee051c0d2e7c7c3b36a6e77b92Jeff Davidson * calling process. 17214f1ec05b2add5ee051c0d2e7c7c3b36a6e77b92Jeff Davidson * 17314f1ec05b2add5ee051c0d2e7c7c3b36a6e77b92Jeff Davidson * @return true if the broadcast was sent, or false if there is no active scorer. 17414f1ec05b2add5ee051c0d2e7c7c3b36a6e77b92Jeff Davidson * @throws SecurityException if the caller does not hold the 17514f1ec05b2add5ee051c0d2e7c7c3b36a6e77b92Jeff Davidson * {@link android.Manifest.permission#BROADCAST_SCORE_NETWORKS} permission. 17614f1ec05b2add5ee051c0d2e7c7c3b36a6e77b92Jeff Davidson * @hide 17714f1ec05b2add5ee051c0d2e7c7c3b36a6e77b92Jeff Davidson */ 17814f1ec05b2add5ee051c0d2e7c7c3b36a6e77b92Jeff Davidson public boolean requestScores(NetworkKey[] networks) throws SecurityException { 17914f1ec05b2add5ee051c0d2e7c7c3b36a6e77b92Jeff Davidson String activeScorer = getActiveScorerPackage(); 18014f1ec05b2add5ee051c0d2e7c7c3b36a6e77b92Jeff Davidson if (activeScorer == null) { 18114f1ec05b2add5ee051c0d2e7c7c3b36a6e77b92Jeff Davidson return false; 18214f1ec05b2add5ee051c0d2e7c7c3b36a6e77b92Jeff Davidson } 18314f1ec05b2add5ee051c0d2e7c7c3b36a6e77b92Jeff Davidson Intent intent = new Intent(ACTION_SCORE_NETWORKS); 18414f1ec05b2add5ee051c0d2e7c7c3b36a6e77b92Jeff Davidson intent.setPackage(activeScorer); 18514f1ec05b2add5ee051c0d2e7c7c3b36a6e77b92Jeff Davidson intent.putExtra(EXTRA_NETWORKS_TO_SCORE, networks); 18614f1ec05b2add5ee051c0d2e7c7c3b36a6e77b92Jeff Davidson mContext.sendBroadcast(intent); 18714f1ec05b2add5ee051c0d2e7c7c3b36a6e77b92Jeff Davidson return true; 18814f1ec05b2add5ee051c0d2e7c7c3b36a6e77b92Jeff Davidson } 18914f1ec05b2add5ee051c0d2e7c7c3b36a6e77b92Jeff Davidson 19014f1ec05b2add5ee051c0d2e7c7c3b36a6e77b92Jeff Davidson /** 19114f1ec05b2add5ee051c0d2e7c7c3b36a6e77b92Jeff Davidson * Register a network score cache. 19214f1ec05b2add5ee051c0d2e7c7c3b36a6e77b92Jeff Davidson * 19314f1ec05b2add5ee051c0d2e7c7c3b36a6e77b92Jeff Davidson * @param networkType the type of network this cache can handle. See {@link NetworkKey#type}. 19414f1ec05b2add5ee051c0d2e7c7c3b36a6e77b92Jeff Davidson * @param scoreCache implementation of {@link INetworkScoreCache} to store the scores. 19514f1ec05b2add5ee051c0d2e7c7c3b36a6e77b92Jeff Davidson * @throws SecurityException if the caller does not hold the 19614f1ec05b2add5ee051c0d2e7c7c3b36a6e77b92Jeff Davidson * {@link android.Manifest.permission#BROADCAST_SCORE_NETWORKS} permission. 19714f1ec05b2add5ee051c0d2e7c7c3b36a6e77b92Jeff Davidson * @throws IllegalArgumentException if a score cache is already registered for this type. 19814f1ec05b2add5ee051c0d2e7c7c3b36a6e77b92Jeff Davidson * @hide 19914f1ec05b2add5ee051c0d2e7c7c3b36a6e77b92Jeff Davidson */ 20014f1ec05b2add5ee051c0d2e7c7c3b36a6e77b92Jeff Davidson public void registerNetworkScoreCache(int networkType, INetworkScoreCache scoreCache) { 20114f1ec05b2add5ee051c0d2e7c7c3b36a6e77b92Jeff Davidson try { 20214f1ec05b2add5ee051c0d2e7c7c3b36a6e77b92Jeff Davidson mService.registerNetworkScoreCache(networkType, scoreCache); 20314f1ec05b2add5ee051c0d2e7c7c3b36a6e77b92Jeff Davidson } catch (RemoteException e) { 20414f1ec05b2add5ee051c0d2e7c7c3b36a6e77b92Jeff Davidson } 20514f1ec05b2add5ee051c0d2e7c7c3b36a6e77b92Jeff Davidson } 206b51e0a6c4b249e0d6f404fafef007645221be0d3Jeff Davidson} 207