Loading core/java/android/provider/Settings.java +8 −0 Original line number Diff line number Diff line Loading @@ -8177,6 +8177,14 @@ public final class Settings { @SystemApi public static final String WIFI_WAKEUP_ENABLED = "wifi_wakeup_enabled"; /** * Value to specify whether network quality scores and badging should be shown in the UI. * * Type: int (0 for false, 1 for true) * @hide */ public static final String NETWORK_SCORING_UI_ENABLED = "network_scoring_ui_enabled"; /** * Value to specify if network recommendations from * {@link com.android.server.NetworkScoreService} are enabled. Loading packages/SettingsLib/src/com/android/settingslib/wifi/WifiTracker.java +31 −5 Original line number Diff line number Diff line Loading @@ -16,9 +16,11 @@ package com.android.settingslib.wifi; import android.content.BroadcastReceiver; import android.content.ContentResolver; 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 @@ -38,6 +40,7 @@ import android.os.ConditionVariable; import android.os.Handler; import android.os.Looper; import android.os.Message; import android.provider.Settings; import android.support.annotation.WorkerThread; import android.util.ArraySet; import android.util.Log; Loading Loading @@ -136,6 +139,8 @@ public class WifiTracker { private final NetworkScoreManager mNetworkScoreManager; private final WifiNetworkScoreCache mScoreCache; private final Set<NetworkKey> mRequestedScores = new ArraySet<>(); private boolean mNetworkScoringUiEnabled; private final ContentObserver mObserver; @VisibleForTesting Scanner mScanner; Loading Loading @@ -215,6 +220,16 @@ public class WifiTracker { Message.obtain(mWorkHandler, WorkHandler.MSG_UPDATE_NETWORK_SCORES).sendToTarget(); } }); mObserver = new ContentObserver(mWorkHandler) { @Override public void onChange(boolean selfChange) { mNetworkScoringUiEnabled = Settings.Global.getInt( mContext.getContentResolver(), Settings.Global.NETWORK_SCORING_UI_ENABLED, 0) == 1; } }; } /** Loading Loading @@ -274,6 +289,11 @@ public class WifiTracker { } }); mContext.getContentResolver().registerContentObserver( Settings.Global.getUriFor(Settings.Global.NETWORK_SCORING_UI_ENABLED), false /* notifyForDescendants */, mObserver); mObserver.onChange(false /* selfChange */); // Set the initial value for mScoringUiEnabled resumeScanning(); if (!mRegistered) { Loading Loading @@ -327,6 +347,7 @@ public class WifiTracker { unregisterAndClearScoreCache(); } }); mContext.getContentResolver().unregisterContentObserver(mObserver); } @WorkerThread Loading Loading @@ -537,11 +558,12 @@ public class WifiTracker { } } if (mNetworkScoringUiEnabled) { requestScoresForNetworkKeys(scoresToRequest); for (AccessPoint ap : accessPoints) { ap.updateScores(mScoreCache); } } // Pre-sort accessPoints to speed preference insertion Collections.sort(accessPoints); Loading Loading @@ -641,7 +663,7 @@ public class WifiTracker { if (ap.update(connectionConfig, mLastInfo, mLastNetworkInfo)) { reorder = true; } if (ap.updateScores(mScoreCache)) { if (mNetworkScoringUiEnabled && ap.updateScores(mScoreCache)) { reorder = true; } } Loading @@ -657,6 +679,10 @@ public class WifiTracker { * <p>Will trigger a resort and notify listeners of changes if applicable. */ private void updateNetworkScores() { if (!mNetworkScoringUiEnabled) { return; } // Lock required to prevent accidental copying of AccessPoint states while the modification // is in progress. see #copyAndNotifyListeners long before = System.currentTimeMillis(); Loading packages/SettingsLib/tests/integ/src/com/android/settingslib/wifi/WifiTrackerTest.java +65 −9 Original line number Diff line number Diff line Loading @@ -110,7 +110,7 @@ public class WifiTrackerTest { private HandlerThread mWorkerThread; private Looper mLooper; private Looper mMainLooper; private int mOriginalSettingValue; private int mOriginalScoringUiSettingValue; @Before public void setUp() { Loading Loading @@ -175,19 +175,23 @@ public class WifiTrackerTest { } }).when(mockWifiListener).onAccessPointsChanged(); mOriginalSettingValue = Settings.Global.getInt( // Turn on Scoring UI features mOriginalScoringUiSettingValue = Settings.Global.getInt( InstrumentationRegistry.getTargetContext().getContentResolver(), Settings.Global.NETWORK_RECOMMENDATIONS_ENABLED, Settings.Global.NETWORK_SCORING_UI_ENABLED, 0 /* disabled */); Settings.Global.putInt( InstrumentationRegistry.getTargetContext().getContentResolver(), Settings.Global.NETWORK_SCORING_UI_ENABLED, 1 /* enabled */); } @After public void cleanUp() { Settings.Global.putInt( InstrumentationRegistry.getTargetContext().getContentResolver(), Settings.Global.NETWORK_RECOMMENDATIONS_ENABLED, mOriginalSettingValue); Settings.Global.NETWORK_SCORING_UI_ENABLED, mOriginalScoringUiSettingValue); } private static ScanResult buildScanResult1() { Loading Loading @@ -333,9 +337,18 @@ public class WifiTrackerTest { WifiNetworkScoreCache scoreCache = mScoreCacheCaptor.getValue(); CountDownLatch latch = new CountDownLatch(1); doAnswer( (invocation) -> { latch.countDown(); return null; }).when(mockNetworkScoreManager) .unregisterNetworkScoreCache(NetworkKey.TYPE_WIFI, scoreCache); // Test unregister tracker.stopTracking(); latch.await(LATCH_TIMEOUT, TimeUnit.MILLISECONDS); verify(mockNetworkScoreManager) .unregisterNetworkScoreCache(NetworkKey.TYPE_WIFI, scoreCache); } Loading Loading @@ -385,7 +398,28 @@ public class WifiTrackerTest { assertTrue(aps.size() == 2); assertEquals(aps.get(0).getSsidStr(), SSID_2); assertEquals(aps.get(1).getSsidStr(), SSID_1); } @Test public void scoreCacheUpdateScoresShouldNotChangeSortOrderWhenSortingDisabled() throws InterruptedException { Settings.Global.putInt( InstrumentationRegistry.getTargetContext().getContentResolver(), Settings.Global.NETWORK_SCORING_UI_ENABLED, 0 /* disabled */); WifiTracker tracker = createTrackerAndInjectInitialScanResults(); List<AccessPoint> aps = tracker.getAccessPoints(); assertTrue(aps.size() == 2); assertEquals(aps.get(0).getSsidStr(), SSID_1); assertEquals(aps.get(1).getSsidStr(), SSID_2); updateScoresAndWaitForAccessPointsChangedCallback(); aps = tracker.getAccessPoints(); assertTrue(aps.size() == 2); assertEquals(aps.get(0).getSsidStr(), SSID_1); assertEquals(aps.get(1).getSsidStr(), SSID_2); } @Test Loading @@ -404,6 +438,28 @@ public class WifiTrackerTest { } } @Test public void noBadgesShouldBeInsertedIntoAccessPointWhenScoringUiDisabled() throws InterruptedException { Settings.Global.putInt( InstrumentationRegistry.getTargetContext().getContentResolver(), Settings.Global.NETWORK_SCORING_UI_ENABLED, 0 /* disabled */); WifiTracker tracker = createTrackerAndInjectInitialScanResults(); updateScoresAndWaitForAccessPointsChangedCallback(); List<AccessPoint> aps = tracker.getAccessPoints(); for (AccessPoint ap : aps) { if (ap.getSsidStr().equals(SSID_1)) { assertEquals(ScoredNetwork.BADGING_NONE, ap.getBadge()); } else if (ap.getSsidStr().equals(SSID_2)) { assertEquals(ScoredNetwork.BADGING_NONE, ap.getBadge()); } } } @Test public void scoresShouldBeRequestedForNewScanResultOnly() throws InterruptedException { mRequestScoresLatch = new CountDownLatch(2); Loading packages/SystemUI/src/com/android/systemui/statusbar/policy/WifiSignalController.java +13 −12 Original line number Diff line number Diff line Loading @@ -56,7 +56,7 @@ public class WifiSignalController extends private final WifiNetworkScoreCache mScoreCache; private final WifiStatusTracker mWifiTracker; private boolean mScoringEnabled = false; private boolean mScoringUiEnabled = false; public WifiSignalController(Context context, boolean hasMobileData, CallbackHandler callbackHandler, NetworkControllerImpl networkController, Loading Loading @@ -95,25 +95,26 @@ public class WifiSignalController extends // Setup scoring mNetworkScoreManager = networkScoreManager; configureScoringGating(); registerScoreCache(); } private void configureScoringGating() { ContentObserver observer = new ContentObserver(new Handler(Looper.getMainLooper())) { @Override public void onChange(boolean selfChange) { mScoringEnabled = mScoringUiEnabled = Settings.Global.getInt( mContext.getContentResolver(), Settings.Global.NETWORK_RECOMMENDATIONS_ENABLED, 0) == 1; if (!mScoringEnabled) { mScoreCache.clearScores(); } Settings.Global.NETWORK_SCORING_UI_ENABLED, 0) == 1; } }; ContentResolver cr = mContext.getContentResolver(); cr.registerContentObserver( Settings.Global.getUriFor(Settings.Global.NETWORK_RECOMMENDATIONS_ENABLED), mContext.getContentResolver().registerContentObserver( Settings.Global.getUriFor(Settings.Global.NETWORK_SCORING_UI_ENABLED), false /* notifyForDescendants */, observer); observer.onChange(false /* selfChange */); registerScoreCache(); observer.onChange(false /* selfChange */); // Set the initial values } private void registerScoreCache() { Loading Loading @@ -199,7 +200,7 @@ public class WifiSignalController extends * <p>{@link #updateScoreCacheIfNecessary} should be called prior to this method. */ private int getWifiBadgeEnum() { if (!mScoringEnabled || mWifiTracker.networkKey == null) { if (!mScoringUiEnabled || mWifiTracker.networkKey == null) { return ScoredNetwork.BADGING_NONE; } ScoredNetwork score = mScoreCache.getScoredNetwork(mWifiTracker.networkKey); Loading packages/SystemUI/tests/AndroidManifest.xml +1 −0 Original line number Diff line number Diff line Loading @@ -33,6 +33,7 @@ <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> <uses-permission android:name="android.permission.CONNECTIVITY_INTERNAL" /> <uses-permission android:name="android.permission.MANAGE_NETWORK_POLICY" /> <uses-permission android:name="android.permission.REQUEST_NETWORK_SCORES" /> <application> <uses-library android:name="android.test.runner" /> Loading Loading
core/java/android/provider/Settings.java +8 −0 Original line number Diff line number Diff line Loading @@ -8177,6 +8177,14 @@ public final class Settings { @SystemApi public static final String WIFI_WAKEUP_ENABLED = "wifi_wakeup_enabled"; /** * Value to specify whether network quality scores and badging should be shown in the UI. * * Type: int (0 for false, 1 for true) * @hide */ public static final String NETWORK_SCORING_UI_ENABLED = "network_scoring_ui_enabled"; /** * Value to specify if network recommendations from * {@link com.android.server.NetworkScoreService} are enabled. Loading
packages/SettingsLib/src/com/android/settingslib/wifi/WifiTracker.java +31 −5 Original line number Diff line number Diff line Loading @@ -16,9 +16,11 @@ package com.android.settingslib.wifi; import android.content.BroadcastReceiver; import android.content.ContentResolver; 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 @@ -38,6 +40,7 @@ import android.os.ConditionVariable; import android.os.Handler; import android.os.Looper; import android.os.Message; import android.provider.Settings; import android.support.annotation.WorkerThread; import android.util.ArraySet; import android.util.Log; Loading Loading @@ -136,6 +139,8 @@ public class WifiTracker { private final NetworkScoreManager mNetworkScoreManager; private final WifiNetworkScoreCache mScoreCache; private final Set<NetworkKey> mRequestedScores = new ArraySet<>(); private boolean mNetworkScoringUiEnabled; private final ContentObserver mObserver; @VisibleForTesting Scanner mScanner; Loading Loading @@ -215,6 +220,16 @@ public class WifiTracker { Message.obtain(mWorkHandler, WorkHandler.MSG_UPDATE_NETWORK_SCORES).sendToTarget(); } }); mObserver = new ContentObserver(mWorkHandler) { @Override public void onChange(boolean selfChange) { mNetworkScoringUiEnabled = Settings.Global.getInt( mContext.getContentResolver(), Settings.Global.NETWORK_SCORING_UI_ENABLED, 0) == 1; } }; } /** Loading Loading @@ -274,6 +289,11 @@ public class WifiTracker { } }); mContext.getContentResolver().registerContentObserver( Settings.Global.getUriFor(Settings.Global.NETWORK_SCORING_UI_ENABLED), false /* notifyForDescendants */, mObserver); mObserver.onChange(false /* selfChange */); // Set the initial value for mScoringUiEnabled resumeScanning(); if (!mRegistered) { Loading Loading @@ -327,6 +347,7 @@ public class WifiTracker { unregisterAndClearScoreCache(); } }); mContext.getContentResolver().unregisterContentObserver(mObserver); } @WorkerThread Loading Loading @@ -537,11 +558,12 @@ public class WifiTracker { } } if (mNetworkScoringUiEnabled) { requestScoresForNetworkKeys(scoresToRequest); for (AccessPoint ap : accessPoints) { ap.updateScores(mScoreCache); } } // Pre-sort accessPoints to speed preference insertion Collections.sort(accessPoints); Loading Loading @@ -641,7 +663,7 @@ public class WifiTracker { if (ap.update(connectionConfig, mLastInfo, mLastNetworkInfo)) { reorder = true; } if (ap.updateScores(mScoreCache)) { if (mNetworkScoringUiEnabled && ap.updateScores(mScoreCache)) { reorder = true; } } Loading @@ -657,6 +679,10 @@ public class WifiTracker { * <p>Will trigger a resort and notify listeners of changes if applicable. */ private void updateNetworkScores() { if (!mNetworkScoringUiEnabled) { return; } // Lock required to prevent accidental copying of AccessPoint states while the modification // is in progress. see #copyAndNotifyListeners long before = System.currentTimeMillis(); Loading
packages/SettingsLib/tests/integ/src/com/android/settingslib/wifi/WifiTrackerTest.java +65 −9 Original line number Diff line number Diff line Loading @@ -110,7 +110,7 @@ public class WifiTrackerTest { private HandlerThread mWorkerThread; private Looper mLooper; private Looper mMainLooper; private int mOriginalSettingValue; private int mOriginalScoringUiSettingValue; @Before public void setUp() { Loading Loading @@ -175,19 +175,23 @@ public class WifiTrackerTest { } }).when(mockWifiListener).onAccessPointsChanged(); mOriginalSettingValue = Settings.Global.getInt( // Turn on Scoring UI features mOriginalScoringUiSettingValue = Settings.Global.getInt( InstrumentationRegistry.getTargetContext().getContentResolver(), Settings.Global.NETWORK_RECOMMENDATIONS_ENABLED, Settings.Global.NETWORK_SCORING_UI_ENABLED, 0 /* disabled */); Settings.Global.putInt( InstrumentationRegistry.getTargetContext().getContentResolver(), Settings.Global.NETWORK_SCORING_UI_ENABLED, 1 /* enabled */); } @After public void cleanUp() { Settings.Global.putInt( InstrumentationRegistry.getTargetContext().getContentResolver(), Settings.Global.NETWORK_RECOMMENDATIONS_ENABLED, mOriginalSettingValue); Settings.Global.NETWORK_SCORING_UI_ENABLED, mOriginalScoringUiSettingValue); } private static ScanResult buildScanResult1() { Loading Loading @@ -333,9 +337,18 @@ public class WifiTrackerTest { WifiNetworkScoreCache scoreCache = mScoreCacheCaptor.getValue(); CountDownLatch latch = new CountDownLatch(1); doAnswer( (invocation) -> { latch.countDown(); return null; }).when(mockNetworkScoreManager) .unregisterNetworkScoreCache(NetworkKey.TYPE_WIFI, scoreCache); // Test unregister tracker.stopTracking(); latch.await(LATCH_TIMEOUT, TimeUnit.MILLISECONDS); verify(mockNetworkScoreManager) .unregisterNetworkScoreCache(NetworkKey.TYPE_WIFI, scoreCache); } Loading Loading @@ -385,7 +398,28 @@ public class WifiTrackerTest { assertTrue(aps.size() == 2); assertEquals(aps.get(0).getSsidStr(), SSID_2); assertEquals(aps.get(1).getSsidStr(), SSID_1); } @Test public void scoreCacheUpdateScoresShouldNotChangeSortOrderWhenSortingDisabled() throws InterruptedException { Settings.Global.putInt( InstrumentationRegistry.getTargetContext().getContentResolver(), Settings.Global.NETWORK_SCORING_UI_ENABLED, 0 /* disabled */); WifiTracker tracker = createTrackerAndInjectInitialScanResults(); List<AccessPoint> aps = tracker.getAccessPoints(); assertTrue(aps.size() == 2); assertEquals(aps.get(0).getSsidStr(), SSID_1); assertEquals(aps.get(1).getSsidStr(), SSID_2); updateScoresAndWaitForAccessPointsChangedCallback(); aps = tracker.getAccessPoints(); assertTrue(aps.size() == 2); assertEquals(aps.get(0).getSsidStr(), SSID_1); assertEquals(aps.get(1).getSsidStr(), SSID_2); } @Test Loading @@ -404,6 +438,28 @@ public class WifiTrackerTest { } } @Test public void noBadgesShouldBeInsertedIntoAccessPointWhenScoringUiDisabled() throws InterruptedException { Settings.Global.putInt( InstrumentationRegistry.getTargetContext().getContentResolver(), Settings.Global.NETWORK_SCORING_UI_ENABLED, 0 /* disabled */); WifiTracker tracker = createTrackerAndInjectInitialScanResults(); updateScoresAndWaitForAccessPointsChangedCallback(); List<AccessPoint> aps = tracker.getAccessPoints(); for (AccessPoint ap : aps) { if (ap.getSsidStr().equals(SSID_1)) { assertEquals(ScoredNetwork.BADGING_NONE, ap.getBadge()); } else if (ap.getSsidStr().equals(SSID_2)) { assertEquals(ScoredNetwork.BADGING_NONE, ap.getBadge()); } } } @Test public void scoresShouldBeRequestedForNewScanResultOnly() throws InterruptedException { mRequestScoresLatch = new CountDownLatch(2); Loading
packages/SystemUI/src/com/android/systemui/statusbar/policy/WifiSignalController.java +13 −12 Original line number Diff line number Diff line Loading @@ -56,7 +56,7 @@ public class WifiSignalController extends private final WifiNetworkScoreCache mScoreCache; private final WifiStatusTracker mWifiTracker; private boolean mScoringEnabled = false; private boolean mScoringUiEnabled = false; public WifiSignalController(Context context, boolean hasMobileData, CallbackHandler callbackHandler, NetworkControllerImpl networkController, Loading Loading @@ -95,25 +95,26 @@ public class WifiSignalController extends // Setup scoring mNetworkScoreManager = networkScoreManager; configureScoringGating(); registerScoreCache(); } private void configureScoringGating() { ContentObserver observer = new ContentObserver(new Handler(Looper.getMainLooper())) { @Override public void onChange(boolean selfChange) { mScoringEnabled = mScoringUiEnabled = Settings.Global.getInt( mContext.getContentResolver(), Settings.Global.NETWORK_RECOMMENDATIONS_ENABLED, 0) == 1; if (!mScoringEnabled) { mScoreCache.clearScores(); } Settings.Global.NETWORK_SCORING_UI_ENABLED, 0) == 1; } }; ContentResolver cr = mContext.getContentResolver(); cr.registerContentObserver( Settings.Global.getUriFor(Settings.Global.NETWORK_RECOMMENDATIONS_ENABLED), mContext.getContentResolver().registerContentObserver( Settings.Global.getUriFor(Settings.Global.NETWORK_SCORING_UI_ENABLED), false /* notifyForDescendants */, observer); observer.onChange(false /* selfChange */); registerScoreCache(); observer.onChange(false /* selfChange */); // Set the initial values } private void registerScoreCache() { Loading Loading @@ -199,7 +200,7 @@ public class WifiSignalController extends * <p>{@link #updateScoreCacheIfNecessary} should be called prior to this method. */ private int getWifiBadgeEnum() { if (!mScoringEnabled || mWifiTracker.networkKey == null) { if (!mScoringUiEnabled || mWifiTracker.networkKey == null) { return ScoredNetwork.BADGING_NONE; } ScoredNetwork score = mScoreCache.getScoredNetwork(mWifiTracker.networkKey); Loading
packages/SystemUI/tests/AndroidManifest.xml +1 −0 Original line number Diff line number Diff line Loading @@ -33,6 +33,7 @@ <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> <uses-permission android:name="android.permission.CONNECTIVITY_INTERNAL" /> <uses-permission android:name="android.permission.MANAGE_NETWORK_POLICY" /> <uses-permission android:name="android.permission.REQUEST_NETWORK_SCORES" /> <application> <uses-library android:name="android.test.runner" /> Loading