Loading core/java/android/provider/Settings.java +10 −0 Original line number Diff line number Diff line Loading @@ -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. Loading core/tests/coretests/src/android/provider/SettingsBackupTest.java +1 −0 Original line number Diff line number Diff line Loading @@ -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, Loading packages/SettingsLib/src/com/android/settingslib/wifi/AccessPoint.java +17 −14 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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; Loading Loading @@ -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; } Loading @@ -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); Loading @@ -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) { Loading packages/SettingsLib/src/com/android/settingslib/wifi/WifiTracker.java +23 −22 Original line number Diff line number Diff line Loading @@ -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; Loading @@ -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; Loading @@ -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() { Loading @@ -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; Loading Loading @@ -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<>(); Loading Loading @@ -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. */ Loading Loading @@ -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) { Loading Loading @@ -370,7 +371,6 @@ public class WifiTracker { } unregisterScoreCache(); pauseScanning(); mContext.getContentResolver().unregisterContentObserver(mObserver); mWorkHandler.removePendingMessages(); mMainHandler.removePendingMessages(); Loading Loading @@ -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 Loading Loading @@ -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; } Loading Loading @@ -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; } } Loading packages/SettingsLib/tests/integ/src/com/android/settingslib/wifi/AccessPointTest.java +40 −20 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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; Loading Loading @@ -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(); } Loading Loading @@ -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()) Loading @@ -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()) Loading @@ -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()) Loading @@ -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()) Loading @@ -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)); } Loading @@ -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(); Loading @@ -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); Loading Loading @@ -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); } Loading @@ -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); } Loading Loading @@ -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); } Loading @@ -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); } Loading @@ -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); } Loading @@ -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); } Loading @@ -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( Loading @@ -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); Loading @@ -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( Loading @@ -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); Loading Loading
core/java/android/provider/Settings.java +10 −0 Original line number Diff line number Diff line Loading @@ -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. Loading
core/tests/coretests/src/android/provider/SettingsBackupTest.java +1 −0 Original line number Diff line number Diff line Loading @@ -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, Loading
packages/SettingsLib/src/com/android/settingslib/wifi/AccessPoint.java +17 −14 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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; Loading Loading @@ -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; } Loading @@ -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); Loading @@ -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) { Loading
packages/SettingsLib/src/com/android/settingslib/wifi/WifiTracker.java +23 −22 Original line number Diff line number Diff line Loading @@ -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; Loading @@ -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; Loading @@ -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() { Loading @@ -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; Loading Loading @@ -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<>(); Loading Loading @@ -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. */ Loading Loading @@ -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) { Loading Loading @@ -370,7 +371,6 @@ public class WifiTracker { } unregisterScoreCache(); pauseScanning(); mContext.getContentResolver().unregisterContentObserver(mObserver); mWorkHandler.removePendingMessages(); mMainHandler.removePendingMessages(); Loading Loading @@ -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 Loading Loading @@ -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; } Loading Loading @@ -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; } } Loading
packages/SettingsLib/tests/integ/src/com/android/settingslib/wifi/AccessPointTest.java +40 −20 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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; Loading Loading @@ -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(); } Loading Loading @@ -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()) Loading @@ -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()) Loading @@ -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()) Loading @@ -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()) Loading @@ -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)); } Loading @@ -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(); Loading @@ -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); Loading Loading @@ -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); } Loading @@ -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); } Loading Loading @@ -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); } Loading @@ -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); } Loading @@ -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); } Loading @@ -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); } Loading @@ -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( Loading @@ -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); Loading @@ -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( Loading @@ -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); Loading