Remove ExternalScoreEvaluator.

Also remove WifiNetworkScoreCache usage from the wifi framework and
instead maintain a cache of requested WifiKeys.

Bug: 33694078, 19948759
Test: ./runtests.sh
Change-Id: Ib4ba372f0fd4802d111a4f1ab609a26a4f34c399
diff --git a/service/java/com/android/server/wifi/ExternalScoreEvaluator.java b/service/java/com/android/server/wifi/ExternalScoreEvaluator.java
deleted file mode 100644
index 0e12289..0000000
--- a/service/java/com/android/server/wifi/ExternalScoreEvaluator.java
+++ /dev/null
@@ -1,381 +0,0 @@
-/*
- * Copyright (C) 2016 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.server.wifi;
-
-import android.annotation.Nullable;
-import android.content.Context;
-import android.net.NetworkKey;
-import android.net.NetworkScoreManager;
-import android.net.WifiKey;
-import android.net.wifi.ScanResult;
-import android.net.wifi.WifiConfiguration;
-import android.net.wifi.WifiNetworkScoreCache;
-import android.os.Process;
-import android.text.TextUtils;
-import android.util.LocalLog;
-import android.util.Pair;
-
-import com.android.server.wifi.util.ScanResultUtil;
-
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.List;
-
-/**
- * This class is the WifiNetworkSelector.NetworkEvaluator implementation for
- * externally scored networks.
- * @deprecated TODO(b/33694078): remove this evaluator in favor of RecommendedNetworkEvaluator
- */
-@Deprecated
-public class ExternalScoreEvaluator implements WifiNetworkSelector.NetworkEvaluator {
-    private static final String NAME = "WifiExternalScoreEvaluator";
-    private final WifiConfigManager mWifiConfigManager;
-    private final Clock mClock;
-    private final LocalLog mLocalLog;
-    private final NetworkScoreManager mScoreManager;
-    private final WifiNetworkScoreCache mScoreCache;
-
-    ExternalScoreEvaluator(Context context, WifiConfigManager configManager,
-                           WifiNetworkScoreCache scoreCache, Clock clock, LocalLog localLog) {
-        mWifiConfigManager = configManager;
-        mClock = clock;
-        mLocalLog = localLog;
-        mScoreCache = scoreCache;
-        mScoreManager =
-                (NetworkScoreManager) context.getSystemService(Context.NETWORK_SCORE_SERVICE);
-        if (mScoreManager != null) {
-            mScoreManager.registerNetworkScoreCache(NetworkKey.TYPE_WIFI, mScoreCache);
-        } else {
-            localLog("Couldn't get NETWORK_SCORE_SERVICE.");
-        }
-    }
-
-    private void localLog(String log) {
-        if (mLocalLog != null) {
-            mLocalLog.log(log);
-        }
-    }
-
-    /**
-     * Get the evaluator name.
-     */
-    public String getName() {
-        return NAME;
-    }
-
-    private void updateNetworkScoreCache(List<ScanDetail> scanDetails) {
-        ArrayList<NetworkKey> unscoredNetworks = new ArrayList<NetworkKey>();
-
-        for (ScanDetail scanDetail : scanDetails) {
-            ScanResult scanResult = scanDetail.getScanResult();
-
-            // Is there a score for this network? If not, request a score.
-            if (mScoreCache != null && !mScoreCache.isScoredNetwork(scanResult)) {
-                WifiKey wifiKey;
-
-                try {
-                    wifiKey = new WifiKey("\"" + scanResult.SSID + "\"", scanResult.BSSID);
-                    NetworkKey ntwkKey = new NetworkKey(wifiKey);
-                    unscoredNetworks.add(ntwkKey);
-                } catch (IllegalArgumentException e) {
-                    localLog("Invalid SSID=" + scanResult.SSID + " BSSID=" + scanResult.BSSID
-                            + " for network score. Skip.");
-                }
-            }
-        }
-
-        // Kick the score manager if there is any unscored network.
-        if (mScoreManager != null && unscoredNetworks.size() != 0) {
-            NetworkKey[] unscoredNetworkKeys =
-                    unscoredNetworks.toArray(new NetworkKey[unscoredNetworks.size()]);
-            mScoreManager.requestScores(unscoredNetworkKeys);
-        }
-    }
-
-    /**
-     * Update the evaluator.
-     */
-    public void update(List<ScanDetail> scanDetails) {
-        updateNetworkScoreCache(scanDetails);
-    }
-
-    private boolean isPotentialEphemeralNetwork(List<WifiConfiguration> associatedConfigurations) {
-        if (associatedConfigurations == null) {
-            return true;
-        } else if (associatedConfigurations.size() == 1) {
-            // If there is more than one associated networks, it must be a passpoint network.
-            // Hence it is not a ephemeral network.
-            WifiConfiguration network = associatedConfigurations.get(0);
-            if (network.ephemeral) {
-                return true;
-            }
-        }
-        return false;
-    }
-
-    private WifiConfiguration getPotentialEphemeralNetworkConfiguration(
-            List<WifiConfiguration> associatedConfigurations) {
-        if (associatedConfigurations == null) {
-            return null;
-        } else {
-            WifiConfiguration network = associatedConfigurations.get(0);
-            return network;
-        }
-    }
-
-    /**
-     * Returns the available external network score or null if no score is available.
-     *
-     * @param scanResult The scan result of the network to score.
-     * @param scoreCache Wifi network score cache.
-     * @param active Flag which indicates whether this is the currently connected network.
-     * @return A valid external score if one is available or NULL.
-     */
-    @Nullable
-    Integer getNetworkScore(ScanResult scanResult, WifiNetworkScoreCache scoreCache,
-                boolean active) {
-        if (scoreCache != null && scoreCache.isScoredNetwork(scanResult)) {
-            int score = scoreCache.getNetworkScore(scanResult, active);
-            localLog(WifiNetworkSelector.toScanId(scanResult) + " has score: " + score
-                    + " active network: " + active);
-            return score;
-        }
-        return null;
-    }
-
-    /**
-     * Returns the best candidate network according to the given ExternalScoreEvaluator.
-     */
-    @Nullable
-    WifiConfiguration getExternalScoreCandidate(ExternalScoreTracker scoreTracker,
-                WifiNetworkScoreCache scoreCache) {
-        int candidateNetworkId = WifiConfiguration.INVALID_NETWORK_ID;
-        switch (scoreTracker.getBestCandidateType()) {
-            case ExternalScoreTracker.EXTERNAL_SCORED_UNTRUSTED_NETWORK:
-                ScanResult untrustedScanResultCandidate =
-                        scoreTracker.getScanResultCandidate();
-                WifiConfiguration unTrustedNetworkCandidate =
-                        ScanResultUtil.createNetworkFromScanResult(untrustedScanResultCandidate);
-
-                // Mark this config as ephemeral so it isn't persisted.
-                unTrustedNetworkCandidate.ephemeral = true;
-                if (scoreCache != null) {
-                    unTrustedNetworkCandidate.meteredHint =
-                            scoreCache.getMeteredHint(untrustedScanResultCandidate);
-                }
-                NetworkUpdateResult result =
-                        mWifiConfigManager.addOrUpdateNetwork(unTrustedNetworkCandidate,
-                                Process.WIFI_UID);
-                if (!result.isSuccess()) {
-                    localLog("Failed to add ephemeral network");
-                    break;
-                }
-                candidateNetworkId = result.getNetworkId();
-                mWifiConfigManager.setNetworkCandidateScanResult(candidateNetworkId,
-                        untrustedScanResultCandidate, 0);
-                localLog(String.format("new ephemeral candidate %s network ID:%d, "
-                                + "meteredHint=%b",
-                        WifiNetworkSelector.toScanId(untrustedScanResultCandidate),
-                        candidateNetworkId,
-                        unTrustedNetworkCandidate.meteredHint));
-                break;
-
-            case ExternalScoreTracker.EXTERNAL_SCORED_SAVED_NETWORK:
-                ScanResult scanResultCandidate = scoreTracker.getScanResultCandidate();
-                candidateNetworkId = scoreTracker.getSavedConfig().networkId;
-                mWifiConfigManager.setNetworkCandidateScanResult(candidateNetworkId,
-                        scanResultCandidate, 0);
-                localLog(String.format("new saved network candidate %s network ID:%d",
-                        WifiNetworkSelector.toScanId(scanResultCandidate),
-                        candidateNetworkId));
-                break;
-
-            case ExternalScoreTracker.EXTERNAL_SCORED_NONE:
-                localLog("did not see any good candidates.");
-                break;
-
-            default:
-                localLog("Unhandled case. No candidate selected.");
-                break;
-        }
-        return mWifiConfigManager.getConfiguredNetwork(candidateNetworkId);
-    }
-
-    /**
-     * Evaluate all the networks from the scan results and return
-     * the WifiConfiguration of the network chosen for connection.
-     *
-     * @return configuration of the chosen network;
-     *         null if no network in this category is available.
-     */
-    public WifiConfiguration evaluateNetworks(List<ScanDetail> scanDetails,
-                    WifiConfiguration currentNetwork, String currentBssid, boolean connected,
-                    boolean untrustedNetworkAllowed,
-                    List<Pair<ScanDetail, WifiConfiguration>> connectableNetworks) {
-        if (mScoreCache == null) {
-            localLog("has no network score cache.");
-            return null;
-        }
-
-        final ExternalScoreTracker externalScoreTracker = new ExternalScoreTracker(mLocalLog);
-        ArrayList<NetworkKey> unscoredNetworks = new ArrayList<>();
-
-        for (ScanDetail scanDetail : scanDetails) {
-            ScanResult scanResult = scanDetail.getScanResult();
-
-            // One ScanResult can be associated with more than one networks, hence we calculate all
-            // the scores and use the highest one as the ScanResult's score.
-            // TODO(b/31065385): WifiConfigManager does not support passpoint networks currently.
-            // So this list has just one entry always.
-            List<WifiConfiguration> associatedConfigs = null;
-            WifiConfiguration associatedConfig =
-                    mWifiConfigManager.getSavedNetworkForScanDetailAndCache(scanDetail);
-            if (associatedConfig != null) {
-                associatedConfigs =
-                    new ArrayList<>(Arrays.asList(associatedConfig));
-            }
-
-            if (isPotentialEphemeralNetwork(associatedConfigs)) {
-                if (untrustedNetworkAllowed) {
-                    if (!mWifiConfigManager.wasEphemeralNetworkDeleted(
-                                ScanResultUtil.createQuotedSSID(scanResult.SSID))) {
-                        // Ephemeral network has either one WifiConfiguration or none yet.
-                        // Checking BSSID is sufficient to determine whether this is the
-                        // currently connected network.
-                        boolean active = TextUtils.equals(currentBssid, scanResult.BSSID);
-                        Integer score = getNetworkScore(scanResult, mScoreCache, active);
-                        externalScoreTracker.trackUntrustedCandidate(score, scanResult);
-                        if (connectableNetworks != null) {
-                            connectableNetworks.add(Pair.create(scanDetail,
-                                    getPotentialEphemeralNetworkConfiguration(associatedConfigs)));
-                        }
-                    }
-                }
-                continue;
-            }
-
-            for (WifiConfiguration network : associatedConfigs) {
-                WifiConfiguration.NetworkSelectionStatus status =
-                        network.getNetworkSelectionStatus();
-                status.setSeenInLastQualifiedNetworkSelection(true);
-                if (!status.isNetworkEnabled()) {
-                    continue;
-                } else if (network.BSSID != null &&  !network.BSSID.equals("any")
-                        && !network.BSSID.equals(scanResult.BSSID)) {
-                    // App has specified the only BSSID to connect for this
-                    // configuration. So only the matching ScanResult can be a candidate.
-                    localLog("Network " + WifiNetworkSelector.toNetworkString(network)
-                            + " has specified BSSID " + network.BSSID + ". Skip "
-                            + scanResult.BSSID);
-                    continue;
-                }
-
-                // Saved network wth an external score.
-                if (network.useExternalScores) {
-                    localLog("Network " + WifiNetworkSelector.toNetworkString(network)
-                            + " uses external score");
-                    boolean active = currentNetwork != null && currentNetwork == network
-                                && TextUtils.equals(currentBssid, scanResult.BSSID);
-                    Integer score = getNetworkScore(scanResult, mScoreCache, active);
-                    externalScoreTracker.trackSavedCandidate(score, network, scanResult);
-                    if (connectableNetworks != null) {
-                        connectableNetworks.add(Pair.create(scanDetail, network));
-                    }
-                }
-            }
-        }
-
-        WifiConfiguration candidate = getExternalScoreCandidate(externalScoreTracker, mScoreCache);
-
-        if (candidate != null
-                && candidate.getNetworkSelectionStatus().getCandidate() != null) {
-            return candidate;
-        } else {
-            return null;
-        }
-    }
-
-    /**
-     * Used to track the network with the highest score.
-     */
-    static class ExternalScoreTracker {
-        public static final int EXTERNAL_SCORED_NONE = 0;
-        public static final int EXTERNAL_SCORED_SAVED_NETWORK = 1;
-        public static final int EXTERNAL_SCORED_UNTRUSTED_NETWORK = 2;
-
-        private int mBestCandidateType = EXTERNAL_SCORED_NONE;
-        private int mHighScore = WifiNetworkScoreCache.INVALID_NETWORK_SCORE;
-        private WifiConfiguration mSavedConfig;
-        private ScanResult mScanResultCandidate;
-        private final LocalLog mLocalLog;
-
-        ExternalScoreTracker(LocalLog localLog) {
-            mLocalLog = localLog;
-        }
-
-        // Determines whether or not the given scan result is the best one its seen so far.
-        void trackUntrustedCandidate(@Nullable Integer score, ScanResult scanResult) {
-            if (score != null && score > mHighScore) {
-                mHighScore = score;
-                mScanResultCandidate = scanResult;
-                mBestCandidateType = EXTERNAL_SCORED_UNTRUSTED_NETWORK;
-                localLog(WifiNetworkSelector.toScanId(scanResult)
-                        + " becomes the new untrusted candidate.");
-            }
-        }
-
-        // Determines whether or not the given saved network is the best one its seen so far.
-        void trackSavedCandidate(@Nullable Integer score, WifiConfiguration config,
-                ScanResult scanResult) {
-            // Always take the highest score. If there's a tie and an untrusted network is currently
-            // the best then pick the saved network.
-            if (score != null
-                    && (score > mHighScore
-                        || (mBestCandidateType == EXTERNAL_SCORED_UNTRUSTED_NETWORK
-                            && score == mHighScore))) {
-                mHighScore = score;
-                mSavedConfig = config;
-                mScanResultCandidate = scanResult;
-                mBestCandidateType = EXTERNAL_SCORED_SAVED_NETWORK;
-                localLog(WifiNetworkSelector.toScanId(scanResult)
-                        + " becomes the new externally scored saved network candidate.");
-            }
-        }
-
-        int getBestCandidateType() {
-            return mBestCandidateType;
-        }
-
-        int getHighScore() {
-            return mHighScore;
-        }
-
-        public ScanResult getScanResultCandidate() {
-            return mScanResultCandidate;
-        }
-
-        WifiConfiguration getSavedConfig() {
-            return mSavedConfig;
-        }
-
-        private void localLog(String log) {
-            if (mLocalLog != null) {
-                mLocalLog.log(log);
-            }
-        }
-    }
-}
diff --git a/service/java/com/android/server/wifi/RecommendedNetworkEvaluator.java b/service/java/com/android/server/wifi/RecommendedNetworkEvaluator.java
index bc019eb..8b332f8 100644
--- a/service/java/com/android/server/wifi/RecommendedNetworkEvaluator.java
+++ b/service/java/com/android/server/wifi/RecommendedNetworkEvaluator.java
@@ -19,31 +19,40 @@
 import android.content.ContentResolver;
 import android.content.Context;
 import android.database.ContentObserver;
+import android.net.INetworkScoreCache;
 import android.net.NetworkKey;
 import android.net.NetworkScoreManager;
 import android.net.RecommendationRequest;
 import android.net.RecommendationResult;
+import android.net.ScoredNetwork;
 import android.net.WifiKey;
 import android.net.wifi.ScanResult;
 import android.net.wifi.WifiConfiguration;
 import android.net.wifi.WifiInfo;
-import android.net.wifi.WifiNetworkScoreCache;
 import android.os.Handler;
 import android.os.Looper;
 import android.os.Process;
+import android.os.RemoteException;
+import android.os.SystemClock;
 import android.provider.Settings;
 import android.text.TextUtils;
 import android.util.ArraySet;
 import android.util.LocalLog;
+import android.util.LruCache;
 import android.util.Pair;
 import android.util.Slog;
 
 import com.android.internal.annotations.VisibleForTesting;
 import com.android.server.wifi.util.ScanResultUtil;
 
+import java.io.FileDescriptor;
+import java.io.PrintWriter;
 import java.util.ArrayList;
 import java.util.List;
 import java.util.Set;
+import java.util.concurrent.TimeUnit;
+
+import javax.annotation.concurrent.GuardedBy;
 
 /**
  * {@link WifiNetworkSelector.NetworkEvaluator} implementation that uses
@@ -52,23 +61,22 @@
 public class RecommendedNetworkEvaluator implements WifiNetworkSelector.NetworkEvaluator {
     private static final String TAG = "RecNetEvaluator";
     private final NetworkScoreManager mNetworkScoreManager;
-    private final WifiNetworkScoreCache mNetworkScoreCache;
     private final WifiConfigManager mWifiConfigManager;
     private final LocalLog mLocalLog;
-    private final ExternalScoreEvaluator mExternalScoreEvaluator;
     @VisibleForTesting final ContentObserver mContentObserver;
+    private final RequestedScoreCache mRequestedScoreCache;
     private boolean mNetworkRecommendationsEnabled;
 
     RecommendedNetworkEvaluator(final Context context, ContentResolver contentResolver,
             Looper looper, final FrameworkFacade frameworkFacade,
-            WifiNetworkScoreCache networkScoreCache,
             NetworkScoreManager networkScoreManager, WifiConfigManager wifiConfigManager,
-            LocalLog localLog, ExternalScoreEvaluator externalScoreEvaluator) {
-        mNetworkScoreCache = networkScoreCache;
+            LocalLog localLog) {
+        mRequestedScoreCache = new RequestedScoreCache(frameworkFacade.getLongSetting(
+                context, Settings.Global.RECOMMENDED_NETWORK_EVALUATOR_CACHE_EXPIRY_MS,
+                TimeUnit.DAYS.toMillis(1)));
         mNetworkScoreManager = networkScoreManager;
         mWifiConfigManager = wifiConfigManager;
         mLocalLog = localLog;
-        mExternalScoreEvaluator = externalScoreEvaluator; // TODO(b/33694202): Remove
         mContentObserver = new ContentObserver(new Handler(looper)) {
             @Override
             public void onChange(boolean selfChange) {
@@ -80,6 +88,8 @@
                 Settings.Global.getUriFor(Settings.Global.NETWORK_RECOMMENDATIONS_ENABLED),
                 false /* notifyForDescendents */, mContentObserver);
         mContentObserver.onChange(false /* unused */);
+        mNetworkScoreManager.registerNetworkScoreCache(NetworkKey.TYPE_WIFI, mRequestedScoreCache,
+                NetworkScoreManager.CACHE_FILTER_NONE);
         mLocalLog.log("RecommendedNetworkEvaluator constructed. mNetworkRecommendationsEnabled: "
                 + mNetworkRecommendationsEnabled);
     }
@@ -88,8 +98,6 @@
     public void update(List<ScanDetail> scanDetails) {
         if (mNetworkRecommendationsEnabled) {
             updateNetworkScoreCache(scanDetails);
-        } else {
-            mExternalScoreEvaluator.update(scanDetails);
         }
         clearNotRecommendedFlag();
     }
@@ -99,16 +107,16 @@
 
         for (int i = 0; i < scanDetails.size(); i++) {
             ScanResult scanResult = scanDetails.get(i).getScanResult();
-
-            // Is there a score for this network? If not, request a score.
-            if (!mNetworkScoreCache.isScoredNetwork(scanResult)) {
-                try {
-                    WifiKey wifiKey = new WifiKey("\"" + scanResult.SSID + "\"", scanResult.BSSID);
+            try {
+                WifiKey wifiKey = new WifiKey(
+                        ScanResultUtil.createQuotedSSID(scanResult.SSID), scanResult.BSSID);
+                // Have we requested a score for this network? If not, request a score.
+                if (mRequestedScoreCache.shouldRequestScore(wifiKey)) {
                     unscoredNetworks.add(new NetworkKey(wifiKey));
-                } catch (IllegalArgumentException e) {
-                    mLocalLog.log("Invalid SSID=" + scanResult.SSID + " BSSID=" + scanResult.BSSID
-                            + " for network score. Skip.");
                 }
+            } catch (IllegalArgumentException e) {
+                mLocalLog.log("Invalid SSID=" + scanResult.SSID + " BSSID=" + scanResult.BSSID
+                        + " for network score. Skip.");
             }
         }
 
@@ -134,8 +142,8 @@
             boolean untrustedNetworkAllowed,
             List<Pair<ScanDetail, WifiConfiguration>> connectableNetworks) {
         if (!mNetworkRecommendationsEnabled) {
-            return mExternalScoreEvaluator.evaluateNetworks(scanDetails, currentNetwork,
-                    currentBssid, connected, untrustedNetworkAllowed, connectableNetworks);
+            mLocalLog.log("Skipping evaluateNetworks; Network recommendations disabled.");
+            return null;
         }
         Set<WifiConfiguration> availableConfiguredNetworks = new ArraySet<>();
         List<ScanResult> scanResults = new ArrayList<>();
@@ -229,7 +237,7 @@
         return mWifiConfigManager.getConfiguredNetwork(networkId);
     }
 
-    private ScanDetail findMatchingScanDetail(List<ScanDetail> scanDetails,
+    private static ScanDetail findMatchingScanDetail(List<ScanDetail> scanDetails,
             WifiConfiguration wifiConfiguration) {
         String ssid = WifiInfo.removeDoubleQuotes(wifiConfiguration.SSID);
         String bssid = wifiConfiguration.BSSID;
@@ -264,9 +272,58 @@
 
     @Override
     public String getName() {
-        if (mNetworkRecommendationsEnabled) {
-            return TAG;
+        return TAG;
+    }
+
+    /** Cache for scores that have already been requested. */
+    static class RequestedScoreCache extends INetworkScoreCache.Stub {
+        /** Number entries to be stored in the {@link LruCache} of requested {@link WifiKey}s. */
+        private static final int MAX_CACHE_SIZE = 1000;
+
+        private final long mCacheExpiryMillis;
+        @GuardedBy("mCache")
+        private final LruCache<WifiKey, Object> mCache = new LruCache<>(MAX_CACHE_SIZE);
+        @GuardedBy("mCache")
+        private long mCacheCreationTime;
+
+        RequestedScoreCache(long cacheExpiryMillis) {
+            mCacheExpiryMillis = cacheExpiryMillis;
         }
-        return TAG + "-" + mExternalScoreEvaluator.getName();
+
+        /** Returns whether a score should be requested for a given {@code wifiKey}. */
+        public boolean shouldRequestScore(WifiKey wifiKey) {
+            long nowMillis = SystemClock.elapsedRealtime();
+            long oldestUsableCacheTimeMillis = nowMillis - mCacheExpiryMillis;
+            synchronized (mCache) {
+                if (mCacheCreationTime < oldestUsableCacheTimeMillis) {
+                    mCache.evictAll();
+                    mCacheCreationTime = nowMillis;
+                }
+                boolean shouldRequest = mCache.get(wifiKey) == null;
+                mCache.put(wifiKey, this); // Update access time for wifiKey.
+                return shouldRequest;
+            }
+        }
+
+        @Override
+        public void updateScores(List<ScoredNetwork> networks) throws RemoteException {}
+
+        @Override
+        public void clearScores() throws RemoteException {
+            synchronized (mCache) {
+                mCache.evictAll();
+                mCacheCreationTime = 0;
+            }
+        }
+
+        @Override
+        protected void dump(FileDescriptor fd, PrintWriter writer, String[] args) {
+            writer.println("RequestedScoreCache:");
+            writer.println("mCacheExpiryMillis: " + mCacheExpiryMillis);
+            synchronized (mCache) {
+                writer.println("mCacheCreationTime: " + mCacheCreationTime);
+                writer.println("mCache size: " + mCache.size());
+            }
+        }
     }
 }
diff --git a/service/java/com/android/server/wifi/WifiInjector.java b/service/java/com/android/server/wifi/WifiInjector.java
index 20a0609..2c7ab58 100644
--- a/service/java/com/android/server/wifi/WifiInjector.java
+++ b/service/java/com/android/server/wifi/WifiInjector.java
@@ -23,7 +23,6 @@
 import android.net.wifi.IWificond;
 import android.net.wifi.WifiConfiguration;
 import android.net.wifi.WifiInfo;
-import android.net.wifi.WifiNetworkScoreCache;
 import android.net.wifi.WifiScanner;
 import android.os.BatteryStats;
 import android.os.HandlerThread;
@@ -102,7 +101,6 @@
     private final SavedNetworkEvaluator mSavedNetworkEvaluator;
     private final PasspointNetworkEvaluator mPasspointNetworkEvaluator;
     private final RecommendedNetworkEvaluator mRecommendedNetworkEvaluator;
-    private final WifiNetworkScoreCache mWifiNetworkScoreCache;
     private final NetworkScoreManager mNetworkScoreManager;
     private WifiScanner mWifiScanner;
     private final WifiPermissionsWrapper mWifiPermissionsWrapper;
@@ -195,17 +193,13 @@
                 UserManager.get(mContext), TelephonyManager.from(mContext),
                 mWifiKeyStore, mWifiConfigStore, mWifiConfigStoreLegacy, mWifiPermissionsWrapper,
                 new NetworkListStoreData(), new DeletedEphemeralSsidsStoreData());
-        mWifiNetworkScoreCache = new WifiNetworkScoreCache(mContext);
         mWifiNetworkSelector = new WifiNetworkSelector(mContext, mWifiConfigManager, mClock);
         LocalLog localLog = mWifiNetworkSelector.getLocalLog();
         mSavedNetworkEvaluator = new SavedNetworkEvaluator(mContext,
                 mWifiConfigManager, mClock, localLog, wifiStateMachineLooper, mFrameworkFacade);
-        ExternalScoreEvaluator externalScoreEvaluator = new ExternalScoreEvaluator(
-                mContext, mWifiConfigManager, mWifiNetworkScoreCache, mClock, localLog);
         mRecommendedNetworkEvaluator = new RecommendedNetworkEvaluator(context,
-                context.getContentResolver(), wifiStateMachineLooper,
-                mFrameworkFacade, mWifiNetworkScoreCache, mNetworkScoreManager, mWifiConfigManager,
-                localLog, externalScoreEvaluator);
+                context.getContentResolver(), wifiStateMachineLooper, mFrameworkFacade,
+                mNetworkScoreManager, mWifiConfigManager, localLog);
         mSimAccessor = new SIMAccessor(mContext);
         mPasspointManager = new PasspointManager(mContext, mWifiNative, mWifiKeyStore, mClock,
                 mSimAccessor, new PasspointObjectFactory(), mWifiConfigManager, mWifiConfigStore);
diff --git a/service/tests/wifitests/src/com/android/server/wifi/ExternalScoreEvaluatorTest.java b/service/tests/wifitests/src/com/android/server/wifi/ExternalScoreEvaluatorTest.java
deleted file mode 100644
index 2829f01..0000000
--- a/service/tests/wifitests/src/com/android/server/wifi/ExternalScoreEvaluatorTest.java
+++ /dev/null
@@ -1,479 +0,0 @@
-/*
- * Copyright (C) 2016 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.server.wifi;
-
-import static com.android.server.wifi.WifiConfigurationTestUtil.SECURITY_NONE;
-import static com.android.server.wifi.WifiConfigurationTestUtil.SECURITY_PSK;
-
-import static org.junit.Assert.*;
-import static org.mockito.Mockito.*;
-
-import android.content.Context;
-import android.content.res.Resources;
-import android.net.NetworkScoreManager;
-import android.net.wifi.ScanResult;
-import android.net.wifi.WifiConfiguration;
-import android.net.wifi.WifiNetworkScoreCache;
-import android.os.SystemClock;
-import android.test.suitebuilder.annotation.SmallTest;
-
-import com.android.internal.R;
-import com.android.server.wifi.WifiNetworkSelectorTestUtil.ScanDetailsAndWifiConfigs;
-
-import org.junit.After;
-import org.junit.Before;
-import org.junit.Test;
-
-import java.util.List;
-
-/**
- * Unit tests for {@link com.android.server.wifi.ExternalScoreEvaluator}.
- */
-@SmallTest
-public class ExternalScoreEvaluatorTest {
-
-    /** Sets up test. */
-    @Before
-    public void setUp() throws Exception {
-        mResource = getResource();
-        mScoreManager = mock(NetworkScoreManager.class);
-        mContext = getContext();
-        mScoreCache = new WifiNetworkScoreCache(mContext);
-        mWifiConfigManager = getWifiConfigManager();
-        when(mClock.getElapsedSinceBootMillis()).thenReturn(SystemClock.elapsedRealtime());
-
-        mThresholdQualifiedRssi2G = mResource.getInteger(
-                R.integer.config_wifi_framework_wifi_score_low_rssi_threshold_24GHz);
-        mThresholdQualifiedRssi5G = mResource.getInteger(
-                R.integer.config_wifi_framework_wifi_score_low_rssi_threshold_5GHz);
-
-        mExternalScoreEvaluator = new ExternalScoreEvaluator(mContext, mWifiConfigManager,
-                mScoreCache, mClock, null);
-    }
-
-    /** Cleans up test. */
-    @After
-    public void cleanup() {
-        validateMockitoUsage();
-    }
-
-    private ExternalScoreEvaluator mExternalScoreEvaluator;
-    private WifiConfigManager mWifiConfigManager;
-    private Context mContext;
-    private Resources mResource;
-    private NetworkScoreManager mScoreManager;
-    private WifiNetworkScoreCache mScoreCache;
-    private Clock mClock = mock(Clock.class);
-    private int mThresholdQualifiedRssi2G;
-    private int mThresholdQualifiedRssi5G;
-    private static final String TAG = "External Score Evaluator Unit Test";
-
-    Context getContext() {
-        Context context = mock(Context.class);
-
-        when(context.getResources()).thenReturn(mResource);
-        when(context.getSystemService(Context.NETWORK_SCORE_SERVICE)).thenReturn(mScoreManager);
-
-        return context;
-    }
-
-    Resources getResource() {
-        Resources resource = mock(Resources.class);
-
-        when(resource.getInteger(
-                R.integer.config_wifi_framework_wifi_score_low_rssi_threshold_5GHz))
-                .thenReturn(-70);
-        when(resource.getInteger(
-                R.integer.config_wifi_framework_wifi_score_low_rssi_threshold_24GHz))
-                .thenReturn(-73);
-
-        return resource;
-    }
-
-    WifiConfigManager getWifiConfigManager() {
-        WifiConfigManager wifiConfigManager = mock(WifiConfigManager.class);
-        when(wifiConfigManager.getLastSelectedNetwork())
-                .thenReturn(WifiConfiguration.INVALID_NETWORK_ID);
-        return wifiConfigManager;
-    }
-
-
-    /**
-     * When no saved networks available, choose the available ephemeral networks
-     * if untrusted networks are allowed.
-     */
-    @Test
-    public void chooseEphemeralNetworkBecauseOfNoSavedNetwork() {
-        String[] ssids = {"\"test1\"", "\"test2\""};
-        String[] bssids = {"6c:f3:7f:ae:8c:f3", "6c:f3:7f:ae:8c:f4"};
-        int[] freqs = {2470, 2437};
-        String[] caps = {"[WPA2-EAP-CCMP][ESS]", "[ESS]"};
-        int[] levels = {mThresholdQualifiedRssi2G + 8, mThresholdQualifiedRssi2G + 10};
-        Integer[] scores = {null, 120};
-        boolean[] meteredHints = {false, true};
-
-        List<ScanDetail> scanDetails = WifiNetworkSelectorTestUtil.buildScanDetails(
-                    ssids, bssids, freqs, caps, levels, mClock);
-        WifiNetworkSelectorTestUtil.configureScoreCache(mScoreCache,
-                    scanDetails, scores, meteredHints);
-
-        // No saved networks.
-        when(mWifiConfigManager.getSavedNetworkForScanDetailAndCache(any(ScanDetail.class)))
-                .thenReturn(null);
-
-        ScanResult scanResult = scanDetails.get(1).getScanResult();
-        WifiConfiguration ephemeralNetworkConfig = WifiNetworkSelectorTestUtil
-                .setupEphemeralNetwork(mWifiConfigManager, 1, scanResult, meteredHints[1]);
-
-        // Untrusted networks allowed.
-        WifiConfiguration candidate = mExternalScoreEvaluator.evaluateNetworks(scanDetails,
-                null, null, false, true, null);
-
-        WifiConfigurationTestUtil.assertConfigurationEqual(ephemeralNetworkConfig, candidate);
-        WifiNetworkSelectorTestUtil.verifySelectedScanResult(mWifiConfigManager,
-                scanResult, candidate);
-        assertEquals(meteredHints[1], candidate.meteredHint);
-    }
-
-    /**
-     * When no saved networks available, choose the highest scored ephemeral networks
-     * if untrusted networks are allowed.
-     */
-    @Test
-    public void chooseHigherScoredEphemeralNetwork() {
-        String[] ssids = {"\"test1\"", "\"test2\""};
-        String[] bssids = {"6c:f3:7f:ae:8c:f3", "6c:f3:7f:ae:8c:f4"};
-        int[] freqs = {2470, 2437};
-        String[] caps = {"[ESS]", "[ESS]"};
-        int[] levels = {mThresholdQualifiedRssi2G + 8, mThresholdQualifiedRssi2G + 8};
-        Integer[] scores = {100, 120};
-        boolean[] meteredHints = {true, true};
-        ScanResult[] scanResults = new ScanResult[2];
-        WifiConfiguration[] ephemeralNetworkConfigs = new WifiConfiguration[2];
-
-        List<ScanDetail> scanDetails = WifiNetworkSelectorTestUtil.buildScanDetails(
-                    ssids, bssids, freqs, caps, levels, mClock);
-        WifiNetworkSelectorTestUtil.configureScoreCache(mScoreCache,
-                    scanDetails, scores, meteredHints);
-
-        // No saved networks.
-        when(mWifiConfigManager.getSavedNetworkForScanDetailAndCache(any(ScanDetail.class)))
-                .thenReturn(null);
-
-        for (int i = 0; i < 2; i++) {
-            scanResults[i] = scanDetails.get(i).getScanResult();
-            ephemeralNetworkConfigs[i] = WifiNetworkSelectorTestUtil
-                .setupEphemeralNetwork(mWifiConfigManager, i, scanResults[i], meteredHints[i]);
-        }
-
-        WifiConfiguration candidate = mExternalScoreEvaluator.evaluateNetworks(scanDetails,
-                null, null, false, true, null);
-
-        WifiConfigurationTestUtil.assertConfigurationEqual(ephemeralNetworkConfigs[1], candidate);
-        WifiNetworkSelectorTestUtil.verifySelectedScanResult(mWifiConfigManager,
-                scanResults[1], candidate);
-        assertEquals(meteredHints[1], candidate.meteredHint);
-    }
-
-    /**
-     * Don't choose available ephemeral networks if no saved networks and untrusted networks
-     * are not allowed.
-     */
-    @Test
-    public void noEphemeralNetworkWhenUntrustedNetworksNotAllowed() {
-        String[] ssids = {"\"test1\"", "\"test2\""};
-        String[] bssids = {"6c:f3:7f:ae:8c:f3", "6c:f3:7f:ae:8c:f4"};
-        int[] freqs = {2470, 2437};
-        String[] caps = {"[WPA2-EAP-CCMP][ESS]", "[ESS]"};
-        int[] levels = {mThresholdQualifiedRssi2G + 8, mThresholdQualifiedRssi2G + 10};
-        Integer[] scores = {null, 120};
-        boolean[] meteredHints = {false, true};
-
-        List<ScanDetail> scanDetails = WifiNetworkSelectorTestUtil.buildScanDetails(
-                    ssids, bssids, freqs, caps, levels, mClock);
-        WifiNetworkSelectorTestUtil.configureScoreCache(mScoreCache,
-                    scanDetails, scores, meteredHints);
-
-        // No saved networks.
-        when(mWifiConfigManager.getSavedNetworkForScanDetailAndCache(any(ScanDetail.class)))
-                .thenReturn(null);
-
-        ScanResult scanResult = scanDetails.get(1).getScanResult();
-        WifiConfiguration ephemeralNetworkConfig = WifiNetworkSelectorTestUtil
-                .setupEphemeralNetwork(mWifiConfigManager, 1, scanResult, meteredHints[1]);
-
-        // Untursted networks not allowed.
-        WifiConfiguration candidate = mExternalScoreEvaluator.evaluateNetworks(scanDetails,
-                null, null, false, false, null);
-
-        assertEquals("Expect null configuration", null, candidate);
-    }
-
-
-    /**
-     * Choose externally scored saved network.
-     */
-    @Test
-    public void chooseSavedNetworkWithExternalScore() {
-        String[] ssids = {"\"test1\""};
-        String[] bssids = {"6c:f3:7f:ae:8c:f3"};
-        int[] freqs = {5200};
-        String[] caps = {"[WPA2-EAP-CCMP][ESS]"};
-        int[] securities = {SECURITY_PSK};
-        int[] levels = {mThresholdQualifiedRssi5G + 8};
-        Integer[] scores = {120};
-        boolean[] meteredHints = {false};
-
-
-        ScanDetailsAndWifiConfigs scanDetailsAndConfigs =
-                WifiNetworkSelectorTestUtil.setupScanDetailsAndConfigStore(ssids, bssids,
-                    freqs, caps, levels, securities, mWifiConfigManager, mClock);
-        List<ScanDetail> scanDetails = scanDetailsAndConfigs.getScanDetails();
-        WifiConfiguration[] savedConfigs = scanDetailsAndConfigs.getWifiConfigs();
-        savedConfigs[0].useExternalScores = true;
-
-        WifiNetworkSelectorTestUtil.configureScoreCache(mScoreCache,
-                    scanDetails, scores, meteredHints);
-
-        WifiConfiguration candidate = mExternalScoreEvaluator.evaluateNetworks(scanDetails,
-                null, null, false, true, null);
-
-        WifiConfigurationTestUtil.assertConfigurationEqual(savedConfigs[0], candidate);
-        WifiNetworkSelectorTestUtil.verifySelectedScanResult(mWifiConfigManager,
-                scanDetails.get(0).getScanResult(), candidate);
-    }
-
-    /**
-     * Choose externally scored saved network with higher score.
-     */
-    @Test
-    public void chooseSavedNetworkWithHigherExternalScore() {
-        String[] ssids = {"\"test1\"", "\"test2\""};
-        String[] bssids = {"6c:f3:7f:ae:8c:f3", "6c:f3:7f:ae:8c:f4"};
-        int[] freqs = {2470, 2437};
-        String[] caps = {"[WPA2-EAP-CCMP][ESS]", "[WPA2-EAP-CCMP][ESS]"};
-        int[] securities = {SECURITY_PSK, SECURITY_PSK};
-        int[] levels = {mThresholdQualifiedRssi2G + 8, mThresholdQualifiedRssi2G + 8};
-        Integer[] scores = {100, 120};
-        boolean[] meteredHints = {false, false};
-
-        ScanDetailsAndWifiConfigs scanDetailsAndConfigs =
-                WifiNetworkSelectorTestUtil.setupScanDetailsAndConfigStore(ssids, bssids,
-                    freqs, caps, levels, securities, mWifiConfigManager, mClock);
-        List<ScanDetail> scanDetails = scanDetailsAndConfigs.getScanDetails();
-        WifiConfiguration[] savedConfigs = scanDetailsAndConfigs.getWifiConfigs();
-        savedConfigs[0].useExternalScores = savedConfigs[1].useExternalScores = true;
-
-        WifiNetworkSelectorTestUtil.configureScoreCache(mScoreCache,
-                    scanDetails, scores, meteredHints);
-
-        WifiConfiguration candidate = mExternalScoreEvaluator.evaluateNetworks(scanDetails,
-                null, null, false, true, null);
-
-        WifiConfigurationTestUtil.assertConfigurationEqual(savedConfigs[1], candidate);
-        WifiNetworkSelectorTestUtil.verifySelectedScanResult(mWifiConfigManager,
-                scanDetails.get(1).getScanResult(), candidate);
-    }
-
-    /**
-     * Prefer externally scored saved network over untrusted network when they have
-     * the same score.
-     */
-    @Test
-    public void chooseExternallyScoredSavedNetworkOverUntrustedNetworksWithSameScore() {
-        String[] ssids = {"\"test1\"", "\"test2\""};
-        String[] bssids = {"6c:f3:7f:ae:8c:f3", "6c:f3:7f:ae:8c:f4"};
-        int[] freqs = {2470, 2437};
-        String[] caps = {"[WPA2-EAP-CCMP][ESS]", "[ESS]"};
-        int[] securities = {SECURITY_PSK, SECURITY_NONE};
-        int[] levels = {mThresholdQualifiedRssi2G + 8, mThresholdQualifiedRssi2G + 8};
-        Integer[] scores = {120, 120};
-        boolean[] meteredHints = {false, true};
-
-        ScanDetailsAndWifiConfigs scanDetailsAndConfigs =
-                WifiNetworkSelectorTestUtil.setupScanDetailsAndConfigStore(ssids, bssids,
-                    freqs, caps, levels, securities, mWifiConfigManager, mClock);
-        List<ScanDetail> scanDetails = scanDetailsAndConfigs.getScanDetails();
-        WifiConfiguration[] savedConfigs = scanDetailsAndConfigs.getWifiConfigs();
-        savedConfigs[0].useExternalScores = true;
-
-        WifiNetworkSelectorTestUtil.configureScoreCache(mScoreCache,
-                    scanDetails, scores, meteredHints);
-
-        WifiConfiguration candidate = mExternalScoreEvaluator.evaluateNetworks(scanDetails,
-                null, null, false, true, null);
-
-        WifiConfigurationTestUtil.assertConfigurationEqual(savedConfigs[0], candidate);
-        WifiNetworkSelectorTestUtil.verifySelectedScanResult(mWifiConfigManager,
-                scanDetails.get(0).getScanResult(), candidate);
-    }
-
-    /**
-     * Choose untrusted network when it has higher score than the externally scored
-     * saved network.
-     */
-    @Test
-    public void chooseUntrustedNetworkWithHigherScoreThanExternallyScoredSavedNetwork() {
-        // Saved network.
-        String[] savedSsids = {"\"test1\""};
-        String[] savedBssids = {"6c:f3:7f:ae:8c:f3"};
-        int[] savedFreqs = {2470};
-        String[] savedCaps = {"[WPA2-EAP-CCMP][ESS]"};
-        int[] savedSecurities = {SECURITY_PSK};
-        int[] savedLevels = {mThresholdQualifiedRssi2G + 8};
-        // Ephemeral network.
-        String[] ephemeralSsids = {"\"test2\""};
-        String[] ephemeralBssids = {"6c:f3:7f:ae:8c:f4"};
-        int[] ephemeralFreqs = {2437};
-        String[] ephemeralCaps = {"[ESS]"};
-        int[] ephemeralLevels = {mThresholdQualifiedRssi2G + 8};
-        // Ephemeral network has higher score than the saved network.
-        Integer[] scores = {100, 120};
-        boolean[] meteredHints = {false, true};
-
-        // Set up the saved network.
-        ScanDetailsAndWifiConfigs scanDetailsAndConfigs =
-                WifiNetworkSelectorTestUtil.setupScanDetailsAndConfigStore(savedSsids,
-                    savedBssids, savedFreqs, savedCaps, savedLevels, savedSecurities,
-                    mWifiConfigManager, mClock);
-        List<ScanDetail> scanDetails = scanDetailsAndConfigs.getScanDetails();
-        WifiConfiguration[] savedConfigs = scanDetailsAndConfigs.getWifiConfigs();
-        savedConfigs[0].useExternalScores = true;
-
-        // Set up the ephemeral network.
-        scanDetails.addAll(WifiNetworkSelectorTestUtil.buildScanDetails(
-                    ephemeralSsids, ephemeralBssids, ephemeralFreqs,
-                    ephemeralCaps, ephemeralLevels, mClock));
-        ScanResult ephemeralScanResult = scanDetails.get(1).getScanResult();
-        WifiConfiguration ephemeralNetworkConfig = WifiNetworkSelectorTestUtil
-                   .setupEphemeralNetwork(mWifiConfigManager, 1, ephemeralScanResult,
-                                        meteredHints[1]);
-
-        // Set up score cache for both the saved network and the ephemeral network.
-        WifiNetworkSelectorTestUtil.configureScoreCache(mScoreCache,
-                    scanDetails, scores, meteredHints);
-
-        WifiConfiguration candidate = mExternalScoreEvaluator.evaluateNetworks(scanDetails,
-                null, null, false, true, null);
-
-        WifiConfigurationTestUtil.assertConfigurationEqual(ephemeralNetworkConfig, candidate);
-        WifiNetworkSelectorTestUtil.verifySelectedScanResult(mWifiConfigManager,
-                ephemeralScanResult, candidate);
-    }
-
-    /**
-     * Prefer externally scored saved network over untrusted network when they have
-     * the same score.
-     */
-    @Test
-    public void nullScoredNetworks() {
-        String[] ssids = {"\"test1\"", "\"test2\""};
-        String[] bssids = {"6c:f3:7f:ae:8c:f3", "6c:f3:7f:ae:8c:f4"};
-        int[] freqs = {2470, 2437};
-        String[] caps = {"[WPA2-EAP-CCMP][ESS]", "[ESS]"};
-        int[] securities = {SECURITY_PSK, SECURITY_NONE};
-        int[] levels = {mThresholdQualifiedRssi2G + 8, mThresholdQualifiedRssi2G + 8};
-        Integer[] scores = {null, null};
-        boolean[] meteredHints = {false, true};
-
-        ScanDetailsAndWifiConfigs scanDetailsAndConfigs =
-                WifiNetworkSelectorTestUtil.setupScanDetailsAndConfigStore(ssids, bssids,
-                    freqs, caps, levels, securities, mWifiConfigManager, mClock);
-        List<ScanDetail> scanDetails = scanDetailsAndConfigs.getScanDetails();
-        WifiConfiguration[] savedConfigs = scanDetailsAndConfigs.getWifiConfigs();
-        savedConfigs[0].useExternalScores = true;
-
-        WifiNetworkSelectorTestUtil.configureScoreCache(mScoreCache,
-                    scanDetails, scores, meteredHints);
-
-        WifiConfiguration candidate = mExternalScoreEvaluator.evaluateNetworks(scanDetails,
-                null, null, false, true, null);
-
-        assertEquals("Expect null configuration", null, candidate);
-    }
-
-    /**
-     * Between two ephemeral networks with the same RSSI, choose
-     * the currently connected one.
-     */
-    @Test
-    public void chooseActiveEphemeralNetwork() {
-        String[] ssids = {"\"test1\"", "\"test2\""};
-        String[] bssids = {"6c:f3:7f:ae:8c:f3", "6c:f3:7f:ae:8c:f4"};
-        int[] freqs = {2470, 2437};
-        String[] caps = {"[ESS]", "[ESS]"};
-        int[] levels = {mThresholdQualifiedRssi2G + 28, mThresholdQualifiedRssi2G + 28};
-        boolean[] meteredHints = {true, true};
-        ScanResult[] scanResults = new ScanResult[2];
-        WifiConfiguration[] ephemeralNetworkConfigs = new WifiConfiguration[2];
-
-        List<ScanDetail> scanDetails = WifiNetworkSelectorTestUtil.buildScanDetails(
-                    ssids, bssids, freqs, caps, levels, mClock);
-        WifiNetworkSelectorTestUtil.configureScoreCache(mScoreCache,
-                    scanDetails, null, meteredHints);
-
-        // No saved networks.
-        when(mWifiConfigManager.getSavedNetworkForScanDetailAndCache(any(ScanDetail.class)))
-                .thenReturn(null);
-
-        for (int i = 0; i < 2; i++) {
-            scanResults[i] = scanDetails.get(i).getScanResult();
-            ephemeralNetworkConfigs[i] = WifiNetworkSelectorTestUtil
-                .setupEphemeralNetwork(mWifiConfigManager, i, scanResults[i], meteredHints[i]);
-        }
-
-        WifiConfiguration candidate = mExternalScoreEvaluator.evaluateNetworks(scanDetails,
-                null, bssids[1], true, true, null);
-
-        WifiConfigurationTestUtil.assertConfigurationEqual(ephemeralNetworkConfigs[1], candidate);
-        WifiNetworkSelectorTestUtil.verifySelectedScanResult(mWifiConfigManager,
-                scanResults[1], candidate);
-        assertEquals(meteredHints[1], candidate.meteredHint);
-    }
-
-    /**
-     *  Between two externally scored saved networks with the same RSSI, choose
-     *  the currently connected one.
-     */
-    @Test
-    public void chooseActiveSavedNetwork() {
-        String[] ssids = {"\"test1\"", "\"test2\""};
-        String[] bssids = {"6c:f3:7f:ae:8c:f3", "6c:f3:7f:ae:8c:f4"};
-        int[] freqs = {2470, 2437};
-        String[] caps = {"[WPA2-EAP-CCMP][ESS]", "[WPA2-EAP-CCMP][ESS]"};
-        int[] securities = {SECURITY_PSK, SECURITY_PSK};
-        int[] levels = {mThresholdQualifiedRssi2G + 28, mThresholdQualifiedRssi2G + 28};
-        boolean[] meteredHints = {false, false};
-
-        ScanDetailsAndWifiConfigs scanDetailsAndConfigs =
-                WifiNetworkSelectorTestUtil.setupScanDetailsAndConfigStore(ssids, bssids,
-                    freqs, caps, levels, securities, mWifiConfigManager, mClock);
-        List<ScanDetail> scanDetails = scanDetailsAndConfigs.getScanDetails();
-        WifiConfiguration[] savedConfigs = scanDetailsAndConfigs.getWifiConfigs();
-        savedConfigs[0].useExternalScores = savedConfigs[1].useExternalScores = true;
-
-        WifiNetworkSelectorTestUtil.configureScoreCache(mScoreCache,
-                    scanDetails, null, meteredHints);
-
-        WifiConfiguration candidate = mExternalScoreEvaluator.evaluateNetworks(scanDetails,
-                savedConfigs[1], bssids[1], true, true, null);
-
-        WifiConfigurationTestUtil.assertConfigurationEqual(savedConfigs[1], candidate);
-        WifiNetworkSelectorTestUtil.verifySelectedScanResult(mWifiConfigManager,
-                scanDetails.get(1).getScanResult(), candidate);
-    }
-}
diff --git a/service/tests/wifitests/src/com/android/server/wifi/RecommendedNetworkEvaluatorTest.java b/service/tests/wifitests/src/com/android/server/wifi/RecommendedNetworkEvaluatorTest.java
index 689f267..f537117 100644
--- a/service/tests/wifitests/src/com/android/server/wifi/RecommendedNetworkEvaluatorTest.java
+++ b/service/tests/wifitests/src/com/android/server/wifi/RecommendedNetworkEvaluatorTest.java
@@ -16,6 +16,7 @@
 
 package com.android.server.wifi;
 
+
 import static junit.framework.Assert.assertNull;
 import static junit.framework.Assert.assertTrue;
 
@@ -25,6 +26,8 @@
 import static org.mockito.Matchers.anyString;
 import static org.mockito.Mockito.any;
 import static org.mockito.Mockito.never;
+import static org.mockito.Mockito.reset;
+import static org.mockito.Mockito.times;
 import static org.mockito.Mockito.verify;
 import static org.mockito.Mockito.verifyZeroInteractions;
 import static org.mockito.Mockito.when;
@@ -39,7 +42,6 @@
 import android.net.wifi.ScanResult;
 import android.net.wifi.WifiConfiguration;
 import android.net.wifi.WifiConfiguration.NetworkSelectionStatus;
-import android.net.wifi.WifiNetworkScoreCache;
 import android.net.wifi.WifiSsid;
 import android.os.Looper;
 import android.os.Process;
@@ -63,6 +65,7 @@
 import java.util.ArrayList;
 import java.util.List;
 import java.util.Set;
+import java.util.concurrent.TimeUnit;
 
 /**
  * Unit tests for {@link RecommendedNetworkEvaluator}.
@@ -81,8 +84,6 @@
     @Mock private FrameworkFacade mFrameworkFacade;
     @Mock private NetworkScoreManager mNetworkScoreManager;
     @Mock private WifiConfigManager mWifiConfigManager;
-    @Mock private WifiNetworkScoreCache mNetworkScoreCache;
-    @Mock private ExternalScoreEvaluator mExternalScoreEvaluator;
 
     @Captor private ArgumentCaptor<NetworkKey[]> mNetworkKeyArrayCaptor;
     @Captor private ArgumentCaptor<RecommendationRequest> mRecommendationRequestCaptor;
@@ -117,9 +118,14 @@
         when(mFrameworkFacade.getIntegerSetting(mContext,
                 Settings.Global.NETWORK_RECOMMENDATIONS_ENABLED, 0))
                 .thenReturn(1);
+        long dayMillis = TimeUnit.DAYS.toMillis(1);
+        when(mFrameworkFacade.getLongSetting(mContext,
+                Settings.Global.RECOMMENDED_NETWORK_EVALUATOR_CACHE_EXPIRY_MS, dayMillis))
+                .thenReturn(dayMillis);
         mRecommendedNetworkEvaluator = new RecommendedNetworkEvaluator(mContext, mContentResolver,
-                Looper.getMainLooper(), mFrameworkFacade, mNetworkScoreCache, mNetworkScoreManager,
-                mWifiConfigManager, new LocalLog(0), mExternalScoreEvaluator);
+                Looper.getMainLooper(), mFrameworkFacade, mNetworkScoreManager,
+                mWifiConfigManager, new LocalLog(0));
+        reset(mNetworkScoreManager);
 
         when(mWifiConfigManager.getSavedNetworkForScanDetailAndCache(mTrustedScanDetail))
                 .thenReturn(mTrustedWifiConfiguration);
@@ -144,8 +150,7 @@
 
         mRecommendedNetworkEvaluator.update(scanDetails);
 
-        verify(mExternalScoreEvaluator).update(scanDetails);
-        verifyZeroInteractions(mNetworkScoreManager, mNetworkScoreManager);
+        verifyZeroInteractions(mNetworkScoreManager);
         verify(mWifiConfigManager).updateNetworkNotRecommended(
                 mTrustedWifiConfiguration.networkId, false /* notRecommended */);
     }
@@ -160,38 +165,45 @@
     }
 
     @Test
-    public void testUpdate_allNetworksScored() {
-        when(mNetworkScoreCache.isScoredNetwork(mTrustedScanDetail.getScanResult()))
-                .thenReturn(true);
-        when(mNetworkScoreCache.isScoredNetwork(mUntrustedScanDetail.getScanResult()))
-                .thenReturn(true);
-
+    public void testUpdate_allNetworksUnscored() {
         mRecommendedNetworkEvaluator.update(Lists.newArrayList(mTrustedScanDetail,
                 mUntrustedScanDetail));
 
-        verifyZeroInteractions(mNetworkScoreManager);
         verify(mWifiConfigManager).updateNetworkNotRecommended(
                 mTrustedWifiConfiguration.networkId, false /* notRecommended */);
+        verify(mNetworkScoreManager).requestScores(mNetworkKeyArrayCaptor.capture());
+        assertEquals(2, mNetworkKeyArrayCaptor.getValue().length);
+        NetworkKey expectedNetworkKey = new NetworkKey(new WifiKey(ScanResultUtil.createQuotedSSID(
+                mTrustedScanDetail.getSSID()), mTrustedScanDetail.getBSSIDString()));
+        assertEquals(expectedNetworkKey, mNetworkKeyArrayCaptor.getValue()[0]);
+        expectedNetworkKey = new NetworkKey(new WifiKey(ScanResultUtil.createQuotedSSID(
+                mUntrustedScanDetail.getSSID()), mUntrustedScanDetail.getBSSIDString()));
+        assertEquals(expectedNetworkKey, mNetworkKeyArrayCaptor.getValue()[1]);
     }
 
     @Test
-    public void testUpdate_oneScored_oneUnscored() {
-        when(mNetworkScoreCache.isScoredNetwork(mTrustedScanDetail.getScanResult()))
-                .thenReturn(true);
-        when(mNetworkScoreCache.isScoredNetwork(mUntrustedScanDetail.getScanResult()))
-                .thenReturn(false);
+    public void testUpdate_oneScored_twoScored() {
+        mRecommendedNetworkEvaluator.update(Lists.newArrayList(mUntrustedScanDetail));
 
-        mRecommendedNetworkEvaluator.update(Lists.newArrayList(mTrustedScanDetail,
-                mUntrustedScanDetail));
+        // Next scan should only trigger a request for the trusted network.
+        mRecommendedNetworkEvaluator.update(
+                Lists.newArrayList(mTrustedScanDetail, mUntrustedScanDetail));
 
-        verify(mNetworkScoreManager).requestScores(mNetworkKeyArrayCaptor.capture());
+        verify(mWifiConfigManager, times(2)).updateNetworkNotRecommended(
+                mTrustedWifiConfiguration.networkId, false /* notRecommended */);
+        verify(mNetworkScoreManager, times(2)).requestScores(mNetworkKeyArrayCaptor.capture());
 
-        assertEquals(1, mNetworkKeyArrayCaptor.getValue().length);
+        NetworkKey[] requestedScores = mNetworkKeyArrayCaptor.getAllValues().get(0);
+        assertEquals(1, requestedScores.length);
         NetworkKey expectedNetworkKey = new NetworkKey(new WifiKey(ScanResultUtil.createQuotedSSID(
                 mUntrustedScanDetail.getSSID()), mUntrustedScanDetail.getBSSIDString()));
-        assertEquals(expectedNetworkKey, mNetworkKeyArrayCaptor.getValue()[0]);
-        verify(mWifiConfigManager).updateNetworkNotRecommended(
-                mTrustedWifiConfiguration.networkId, false /* notRecommended */);
+        assertEquals(expectedNetworkKey, requestedScores[0]);
+
+        requestedScores = mNetworkKeyArrayCaptor.getAllValues().get(1);
+        assertEquals(1, requestedScores.length);
+        expectedNetworkKey = new NetworkKey(new WifiKey(ScanResultUtil.createQuotedSSID(
+                mTrustedScanDetail.getSSID()), mTrustedScanDetail.getBSSIDString()));
+        assertEquals(expectedNetworkKey, requestedScores[0]);
     }
 
     @Test
@@ -204,8 +216,6 @@
 
         mRecommendedNetworkEvaluator.evaluateNetworks(null, null, null, false, false, null);
 
-        verify(mExternalScoreEvaluator).evaluateNetworks(null, null, null, false, false, null);
-
         verifyZeroInteractions(mWifiConfigManager, mNetworkScoreManager);
     }