Merge "Change score cache eviction time to settings value." into oc-mr1-dev

This commit is contained in:
TreeHugger Robot
2017-09-13 23:12:21 +00:00
committed by Android (Google) Code Review
5 changed files with 91 additions and 56 deletions

View File

@@ -8531,6 +8531,16 @@ public final class Settings {
*/
public static final String NETWORK_SCORING_UI_ENABLED = "network_scoring_ui_enabled";
/**
* Value to specify how long in milliseconds to retain seen score cache curves to be used
* when generating SSID only bases score curves.
*
* Type: long
* @hide
*/
public static final String SPEED_LABEL_CACHE_EVICTION_AGE_MILLIS =
"speed_label_cache_eviction_age_millis";
/**
* Value to specify if network recommendations from
* {@link com.android.server.NetworkScoreService} are enabled.

View File

@@ -328,6 +328,7 @@ public class SettingsBackupTest {
Settings.Global.SMS_SHORT_CODE_RULE,
Settings.Global.SMS_SHORT_CODES_UPDATE_CONTENT_URL,
Settings.Global.SMS_SHORT_CODES_UPDATE_METADATA_URL,
Settings.Global.SPEED_LABEL_CACHE_EVICTION_AGE_MILLIS,
Settings.Global.STORAGE_BENCHMARK_INTERVAL,
Settings.Global.STORAGE_SETTINGS_CLOBBER_THRESHOLD,
Settings.Global.SYNC_MAX_RETRY_DELAY_IN_SECONDS,

View File

@@ -51,7 +51,6 @@ import android.support.annotation.NonNull;
import android.text.Spannable;
import android.text.SpannableString;
import android.text.TextUtils;
import android.text.format.DateUtils;
import android.text.style.TtsSpan;
import android.util.Log;
@@ -133,10 +132,6 @@ public class AccessPoint implements Comparable<AccessPoint> {
*/
private final Map<String, TimestampedScoredNetwork> mScoredNetworkCache = new HashMap<>();
/** Maximum age in millis of cached scored networks in {@link #mScoredNetworkCache}. */
@VisibleForTesting static final long MAX_CACHED_SCORE_AGE_MILLIS =
24 * DateUtils.DAY_IN_MILLIS;
/** Maximum age of scan results to hold onto while actively scanning. **/
private static final long MAX_SCAN_RESULT_AGE_MILLIS = 15000;
@@ -438,13 +433,18 @@ public class AccessPoint implements Comparable<AccessPoint> {
* Updates the AccessPoint rankingScore, metering, and speed, returning true if the data has
* changed.
*
* @param scoreCache The score cache to use to retrieve scores.
* @param scoringUiEnabled Whether to show scoring and badging UI.
* @param scoreCache The score cache to use to retrieve scores
* @param scoringUiEnabled Whether to show scoring and badging UI
* @param maxScoreCacheAgeMillis the maximum age in milliseconds of scores to consider when
* generating speed labels
*/
boolean update(WifiNetworkScoreCache scoreCache, boolean scoringUiEnabled) {
boolean update(
WifiNetworkScoreCache scoreCache,
boolean scoringUiEnabled,
long maxScoreCacheAgeMillis) {
boolean scoreChanged = false;
if (scoringUiEnabled) {
scoreChanged = updateScores(scoreCache);
scoreChanged = updateScores(scoreCache, maxScoreCacheAgeMillis);
}
return updateMetered(scoreCache) || scoreChanged;
}
@@ -452,15 +452,18 @@ public class AccessPoint implements Comparable<AccessPoint> {
/**
* Updates the AccessPoint rankingScore and speed, returning true if the data has changed.
*
* <p>Any cached {@link TimestampedScoredNetwork} objects older than
* {@link #MAX_CACHED_SCORE_AGE_MILLIS} will be removed when this method is invoked.
* <p>Any cached {@link TimestampedScoredNetwork} objects older than the given max age in millis
* will be removed when this method is invoked.
*
* <p>Precondition: {@link #mRssi} is up to date before invoking this method.
*
* @param scoreCache The score cache to use to retrieve scores.
* @param scoreCache The score cache to use to retrieve scores
* @param maxScoreCacheAgeMillis the maximum age in milliseconds of scores to consider when
* generating speed labels
*
* @return true if the set speed has changed
*/
private boolean updateScores(WifiNetworkScoreCache scoreCache) {
private boolean updateScores(WifiNetworkScoreCache scoreCache, long maxScoreCacheAgeMillis) {
long nowMillis = SystemClock.elapsedRealtime();
for (ScanResult result : mScanResultCache.values()) {
ScoredNetwork score = scoreCache.getScoredNetwork(result);
@@ -478,7 +481,7 @@ public class AccessPoint implements Comparable<AccessPoint> {
}
// Remove old cached networks
long evictionCutoff = nowMillis - MAX_CACHED_SCORE_AGE_MILLIS;
long evictionCutoff = nowMillis - maxScoreCacheAgeMillis;
Iterator<TimestampedScoredNetwork> iterator = mScoredNetworkCache.values().iterator();
iterator.forEachRemaining(timestampedScoredNetwork -> {
if (timestampedScoredNetwork.getUpdatedTimestampMillis() < evictionCutoff) {

View File

@@ -20,7 +20,6 @@ import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.database.ContentObserver;
import android.net.ConnectivityManager;
import android.net.Network;
import android.net.NetworkCapabilities;
@@ -41,6 +40,7 @@ import android.os.Looper;
import android.os.Message;
import android.provider.Settings;
import android.support.annotation.GuardedBy;
import android.text.format.DateUtils;
import android.util.ArraySet;
import android.util.Log;
import android.util.SparseArray;
@@ -65,7 +65,11 @@ import java.util.concurrent.atomic.AtomicBoolean;
* Tracks saved or available wifi networks and their state.
*/
public class WifiTracker {
// TODO(b/36733768): Remove flag includeSaved and includePasspoints.
/**
* Default maximum age in millis of cached scored networks in
* {@link AccessPoint#mScoredNetworkCache} to be used for speed label generation.
*/
private static final long DEFAULT_MAX_CACHED_SCORE_AGE_MILLIS = 20 * DateUtils.MINUTE_IN_MILLIS;
private static final String TAG = "WifiTracker";
private static final boolean DBG() {
@@ -76,6 +80,8 @@ public class WifiTracker {
* and used so as to assist with in-the-field WiFi connectivity debugging */
public static boolean sVerboseLogging;
// TODO(b/36733768): Remove flag includeSaved and includePasspoints.
// TODO: Allow control of this?
// Combo scans can take 5-6s to complete - set to 10s.
private static final int WIFI_RESCAN_INTERVAL_MS = 10 * 1000;
@@ -138,7 +144,7 @@ public class WifiTracker {
private final NetworkScoreManager mNetworkScoreManager;
private final WifiNetworkScoreCache mScoreCache;
private boolean mNetworkScoringUiEnabled;
private final ContentObserver mObserver;
private long mMaxSpeedLabelScoreCacheAge;
@GuardedBy("mLock")
private final Set<NetworkKey> mRequestedScores = new ArraySet<>();
@@ -229,16 +235,6 @@ public class WifiTracker {
updateNetworkScores();
}
});
mObserver = new ContentObserver(mWorkHandler) {
@Override
public void onChange(boolean selfChange) {
mNetworkScoringUiEnabled =
Settings.Global.getInt(
mContext.getContentResolver(),
Settings.Global.NETWORK_SCORING_UI_ENABLED, 0) == 1;
}
};
}
/** Synchronously update the list of access points with the latest information. */
@@ -314,11 +310,16 @@ public class WifiTracker {
synchronized (mLock) {
registerScoreCache();
mContext.getContentResolver().registerContentObserver(
Settings.Global.getUriFor(Settings.Global.NETWORK_SCORING_UI_ENABLED),
false /* notifyForDescendants */,
mObserver);
mObserver.onChange(false /* selfChange */); // Set mScoringUiEnabled
mNetworkScoringUiEnabled =
Settings.Global.getInt(
mContext.getContentResolver(),
Settings.Global.NETWORK_SCORING_UI_ENABLED, 0) == 1;
mMaxSpeedLabelScoreCacheAge =
Settings.Global.getLong(
mContext.getContentResolver(),
Settings.Global.SPEED_LABEL_CACHE_EVICTION_AGE_MILLIS,
DEFAULT_MAX_CACHED_SCORE_AGE_MILLIS);
resumeScanning();
if (!mRegistered) {
@@ -370,7 +371,6 @@ public class WifiTracker {
}
unregisterScoreCache();
pauseScanning();
mContext.getContentResolver().unregisterContentObserver(mObserver);
mWorkHandler.removePendingMessages();
mMainHandler.removePendingMessages();
@@ -609,7 +609,7 @@ public class WifiTracker {
requestScoresForNetworkKeys(scoresToRequest);
for (AccessPoint ap : accessPoints) {
ap.update(mScoreCache, mNetworkScoringUiEnabled);
ap.update(mScoreCache, mNetworkScoringUiEnabled, mMaxSpeedLabelScoreCacheAge);
}
// Pre-sort accessPoints to speed preference insertion
@@ -710,7 +710,7 @@ public class WifiTracker {
updated = true;
if (previouslyConnected != ap.isActive()) reorder = true;
}
if (ap.update(mScoreCache, mNetworkScoringUiEnabled)) {
if (ap.update(mScoreCache, mNetworkScoringUiEnabled, mMaxSpeedLabelScoreCacheAge)) {
reorder = true;
updated = true;
}
@@ -744,7 +744,8 @@ public class WifiTracker {
synchronized (mLock) {
boolean updated = false;
for (int i = 0; i < mInternalAccessPoints.size(); i++) {
if (mInternalAccessPoints.get(i).update(mScoreCache, mNetworkScoringUiEnabled)) {
if (mInternalAccessPoints.get(i).update(
mScoreCache, mNetworkScoringUiEnabled, mMaxSpeedLabelScoreCacheAge)) {
updated = true;
}
}

View File

@@ -45,6 +45,7 @@ import android.support.test.InstrumentationRegistry;
import android.support.test.filters.SmallTest;
import android.support.test.runner.AndroidJUnit4;
import android.text.SpannableString;
import android.text.format.DateUtils;
import android.text.style.TtsSpan;
import com.android.settingslib.R;
@@ -72,6 +73,8 @@ public class AccessPointTest {
private static final RssiCurve FAST_BADGE_CURVE =
new RssiCurve(-150, 10, new byte[]{Speed.FAST});
public static final String TEST_BSSID = "00:00:00:00:00:00";
private static final long MAX_SCORE_CACHE_AGE_MILLIS =
20 * DateUtils.MINUTE_IN_MILLIS;;
private Context mContext;
@Mock private RssiCurve mockBadgeCurve;
@@ -335,7 +338,8 @@ public class AccessPointTest {
null /* NetworkKey */,
null /* rssiCurve */,
true /* metered */));
ap.update(mockWifiNetworkScoreCache, false /* scoringUiEnabled */);
ap.update(mockWifiNetworkScoreCache, false /* scoringUiEnabled */,
MAX_SCORE_CACHE_AGE_MILLIS);
assertThat(ap.isMetered()).isTrue();
}
@@ -364,7 +368,8 @@ public class AccessPointTest {
.thenReturn(buildScoredNetworkWithMockBadgeCurve());
when(mockBadgeCurve.lookupScore(anyInt())).thenReturn((byte) AccessPoint.Speed.VERY_FAST);
ap.update(mockWifiNetworkScoreCache, true /* scoringUiEnabled */);
ap.update(mockWifiNetworkScoreCache, true /* scoringUiEnabled */,
MAX_SCORE_CACHE_AGE_MILLIS);
assertThat(ap.getSpeed()).isEqualTo(AccessPoint.Speed.VERY_FAST);
assertThat(ap.getSpeedLabel())
@@ -379,7 +384,9 @@ public class AccessPointTest {
.thenReturn(buildScoredNetworkWithMockBadgeCurve());
when(mockBadgeCurve.lookupScore(anyInt())).thenReturn((byte) AccessPoint.Speed.FAST);
ap.update(mockWifiNetworkScoreCache, true /* scoringUiEnabled */);
ap.update(mockWifiNetworkScoreCache, true /* scoringUiEnabled */,
MAX_SCORE_CACHE_AGE_MILLIS);
assertThat(ap.getSpeed()).isEqualTo(AccessPoint.Speed.FAST);
assertThat(ap.getSpeedLabel())
@@ -394,7 +401,8 @@ public class AccessPointTest {
.thenReturn(buildScoredNetworkWithMockBadgeCurve());
when(mockBadgeCurve.lookupScore(anyInt())).thenReturn((byte) AccessPoint.Speed.MODERATE);
ap.update(mockWifiNetworkScoreCache, true /* scoringUiEnabled */);
ap.update(mockWifiNetworkScoreCache, true /* scoringUiEnabled */,
MAX_SCORE_CACHE_AGE_MILLIS);
assertThat(ap.getSpeed()).isEqualTo(AccessPoint.Speed.MODERATE);
assertThat(ap.getSpeedLabel())
@@ -409,7 +417,8 @@ public class AccessPointTest {
.thenReturn(buildScoredNetworkWithMockBadgeCurve());
when(mockBadgeCurve.lookupScore(anyInt())).thenReturn((byte) AccessPoint.Speed.SLOW);
ap.update(mockWifiNetworkScoreCache, true /* scoringUiEnabled */);
ap.update(mockWifiNetworkScoreCache, true /* scoringUiEnabled */,
MAX_SCORE_CACHE_AGE_MILLIS);
assertThat(ap.getSpeed()).isEqualTo(AccessPoint.Speed.SLOW);
assertThat(ap.getSpeedLabel())
@@ -424,7 +433,8 @@ public class AccessPointTest {
.thenReturn(buildScoredNetworkWithMockBadgeCurve());
when(mockBadgeCurve.lookupScore(anyInt())).thenReturn((byte) AccessPoint.Speed.VERY_FAST);
ap.update(mockWifiNetworkScoreCache, true /* scoringUiEnabled */);
ap.update(mockWifiNetworkScoreCache, true /* scoringUiEnabled */,
MAX_SCORE_CACHE_AGE_MILLIS);
assertThat(ap.getSummary()).isEqualTo(mContext.getString(R.string.speed_label_very_fast));
}
@@ -442,7 +452,8 @@ public class AccessPointTest {
.thenReturn(buildScoredNetworkWithMockBadgeCurve());
when(mockBadgeCurve.lookupScore(anyInt())).thenReturn((byte) AccessPoint.Speed.VERY_FAST);
ap.update(mockWifiNetworkScoreCache, true /* scoringUiEnabled */);
ap.update(mockWifiNetworkScoreCache, true /* scoringUiEnabled */,
MAX_SCORE_CACHE_AGE_MILLIS);
String summary = ap.verboseScanResultSummary(scanResults.get(0), null);
assertThat(summary.contains(mContext.getString(R.string.speed_label_very_fast))).isTrue();
@@ -457,7 +468,8 @@ public class AccessPointTest {
.thenReturn(buildScoredNetworkWithMockBadgeCurve());
when(mockBadgeCurve.lookupScore(anyInt())).thenReturn((byte) AccessPoint.Speed.VERY_FAST);
ap.update(mockWifiNetworkScoreCache, true /* scoringUiEnabled */);
ap.update(mockWifiNetworkScoreCache, true /* scoringUiEnabled */,
MAX_SCORE_CACHE_AGE_MILLIS);
String expectedString = mContext.getString(R.string.speed_label_very_fast) + " / "
+ mContext.getString(R.string.wifi_remembered);
@@ -864,7 +876,8 @@ public class AccessPointTest {
int expectedSpeed = (speed1 + speed2) / 2;
ap.update(mockWifiNetworkScoreCache, true /* scoringUiEnabled */);
ap.update(mockWifiNetworkScoreCache, true /* scoringUiEnabled */,
MAX_SCORE_CACHE_AGE_MILLIS);
assertThat(ap.getSpeed()).isEqualTo(expectedSpeed);
}
@@ -884,7 +897,8 @@ public class AccessPointTest {
when(mockWifiNetworkScoreCache.getScoredNetwork(SCAN_RESULTS.get(1)))
.thenReturn(buildScoredNetworkWithGivenBadgeCurve(badgeCurve2));
ap.update(mockWifiNetworkScoreCache, true /* scoringUiEnabled */);
ap.update(
mockWifiNetworkScoreCache, true /* scoringUiEnabled */, MAX_SCORE_CACHE_AGE_MILLIS);
assertThat(ap.getSpeed()).isEqualTo(speed1);
}
@@ -925,7 +939,8 @@ public class AccessPointTest {
when(mockWifiNetworkScoreCache.getScoredNetwork(scanResultConnected))
.thenReturn(null);
ap.update(mockWifiNetworkScoreCache, true /* scoringUiEnabled */);
ap.update(mockWifiNetworkScoreCache, true /* scoringUiEnabled */,
MAX_SCORE_CACHE_AGE_MILLIS);
assertThat(ap.getSpeed()).isEqualTo(fallbackSpeed);
}
@@ -952,7 +967,8 @@ public class AccessPointTest {
AccessPoint ap =
createApWithFastTimestampedScoredNetworkCache(SystemClock.elapsedRealtime());
ap.update(mockWifiNetworkScoreCache, true /* scoringUiEnabled */);
ap.update(mockWifiNetworkScoreCache, true /* scoringUiEnabled */,
MAX_SCORE_CACHE_AGE_MILLIS);
assertThat(ap.getSpeed()).isEqualTo(Speed.FAST);
}
@@ -960,11 +976,12 @@ public class AccessPointTest {
@Test
public void testNetworkScoresAreUsedForSpeedLabelGenerationWhenWithinAgeRange() {
long withinRangeTimeMillis =
SystemClock.elapsedRealtime() - (AccessPoint.MAX_CACHED_SCORE_AGE_MILLIS - 10000);
SystemClock.elapsedRealtime() - (MAX_SCORE_CACHE_AGE_MILLIS - 10000);
AccessPoint ap =
createApWithFastTimestampedScoredNetworkCache(withinRangeTimeMillis);
ap.update(mockWifiNetworkScoreCache, true /* scoringUiEnabled */);
ap.update(mockWifiNetworkScoreCache, true /* scoringUiEnabled */,
MAX_SCORE_CACHE_AGE_MILLIS);
assertThat(ap.getSpeed()).isEqualTo(Speed.FAST);
}
@@ -972,11 +989,12 @@ public class AccessPointTest {
@Test
public void testOldNetworkScoresAreNotUsedForSpeedLabelGeneration() {
long tooOldTimeMillis =
SystemClock.elapsedRealtime() - (AccessPoint.MAX_CACHED_SCORE_AGE_MILLIS + 1);
SystemClock.elapsedRealtime() - (MAX_SCORE_CACHE_AGE_MILLIS + 1);
AccessPoint ap =
createApWithFastTimestampedScoredNetworkCache(tooOldTimeMillis);
ap.update(mockWifiNetworkScoreCache, true /* scoringUiEnabled */);
ap.update(mockWifiNetworkScoreCache, true /* scoringUiEnabled */,
MAX_SCORE_CACHE_AGE_MILLIS);
assertThat(ap.getSpeed()).isEqualTo(Speed.NONE);
}
@@ -984,7 +1002,7 @@ public class AccessPointTest {
@Test
public void testUpdateScoresRefreshesScoredNetworkCacheTimestamps () {
long tooOldTimeMillis =
SystemClock.elapsedRealtime() - (AccessPoint.MAX_CACHED_SCORE_AGE_MILLIS + 1);
SystemClock.elapsedRealtime() - (MAX_SCORE_CACHE_AGE_MILLIS + 1);
ScoredNetwork scoredNetwork = buildScoredNetworkWithGivenBadgeCurve(FAST_BADGE_CURVE);
TimestampedScoredNetwork recentScore = new TimestampedScoredNetwork(
@@ -1002,7 +1020,8 @@ public class AccessPointTest {
when(mockWifiNetworkScoreCache.getScoredNetwork(any(ScanResult.class)))
.thenReturn(scoredNetwork);
ap.update(mockWifiNetworkScoreCache, true /* scoringUiEnabled */);
ap.update(mockWifiNetworkScoreCache, true /* scoringUiEnabled */,
MAX_SCORE_CACHE_AGE_MILLIS);
// Fast should still be returned since cache was updated with recent time
assertThat(ap.getSpeed()).isEqualTo(Speed.FAST);
@@ -1011,7 +1030,7 @@ public class AccessPointTest {
@Test
public void testUpdateScoresRefreshesScoredNetworkCacheWithNewSpeed () {
long tooOldTimeMillis =
SystemClock.elapsedRealtime() - (AccessPoint.MAX_CACHED_SCORE_AGE_MILLIS + 1);
SystemClock.elapsedRealtime() - (MAX_SCORE_CACHE_AGE_MILLIS + 1);
ScoredNetwork scoredNetwork = buildScoredNetworkWithGivenBadgeCurve(FAST_BADGE_CURVE);
TimestampedScoredNetwork recentScore = new TimestampedScoredNetwork(
@@ -1031,7 +1050,8 @@ public class AccessPointTest {
.thenReturn(buildScoredNetworkWithMockBadgeCurve());
when(mockBadgeCurve.lookupScore(anyInt())).thenReturn((byte) newSpeed);
ap.update(mockWifiNetworkScoreCache, true /* scoringUiEnabled */);
ap.update(mockWifiNetworkScoreCache, true /* scoringUiEnabled */,
MAX_SCORE_CACHE_AGE_MILLIS);
// Fast should still be returned since cache was updated with recent time
assertThat(ap.getSpeed()).isEqualTo(newSpeed);