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