Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 6161f03b authored by TreeHugger Robot's avatar TreeHugger Robot Committed by Android (Google) Code Review
Browse files

Merge changes from topic "wifi_tracker_bg_thread" into tm-dev

* changes:
  Thread fixes for WifiStatusTracker tests
  Move the blocking API to a backgound thread
parents 9d39a4c3 cdd02a88
Loading
Loading
Loading
Loading
+36 −14
Original line number Original line Diff line number Diff line
@@ -30,6 +30,7 @@ import android.net.wifi.WifiInfo;
import android.net.wifi.WifiManager;
import android.net.wifi.WifiManager;
import android.net.wifi.WifiNetworkScoreCache;
import android.net.wifi.WifiNetworkScoreCache;
import android.os.Handler;
import android.os.Handler;
import android.os.HandlerThread;
import android.os.Looper;
import android.os.Looper;
import android.provider.Settings;
import android.provider.Settings;


@@ -53,20 +54,14 @@ public class WifiStatusTracker {
    private final WifiManager mWifiManager;
    private final WifiManager mWifiManager;
    private final NetworkScoreManager mNetworkScoreManager;
    private final NetworkScoreManager mNetworkScoreManager;
    private final ConnectivityManager mConnectivityManager;
    private final ConnectivityManager mConnectivityManager;
    private final Handler mHandler = new Handler(Looper.getMainLooper());
    private final Handler mHandler;
    private final Handler mMainThreadHandler;
    private final Set<Integer> mNetworks = new HashSet<>();
    private final Set<Integer> mNetworks = new HashSet<>();
    // Save the previous HISTORY_SIZE states for logging.
    // Save the previous HISTORY_SIZE states for logging.
    private final String[] mHistory = new String[HISTORY_SIZE];
    private final String[] mHistory = new String[HISTORY_SIZE];
    // Where to copy the next state into.
    // Where to copy the next state into.
    private int mHistoryIndex;
    private int mHistoryIndex;
    private final WifiNetworkScoreCache.CacheListener mCacheListener =
    private final WifiNetworkScoreCache.CacheListener mCacheListener;
            new WifiNetworkScoreCache.CacheListener(mHandler) {
                @Override
                public void networkCacheUpdated(List<ScoredNetwork> updatedNetworks) {
                    updateStatusLabel();
                    mCallback.run();
                }
            };
    private final NetworkRequest mNetworkRequest = new NetworkRequest.Builder()
    private final NetworkRequest mNetworkRequest = new NetworkRequest.Builder()
            .clearCapabilities()
            .clearCapabilities()
            .addCapability(NetworkCapabilities.NET_CAPABILITY_NOT_VPN)
            .addCapability(NetworkCapabilities.NET_CAPABILITY_NOT_VPN)
@@ -113,7 +108,7 @@ public class WifiStatusTracker {
            }
            }
            updateWifiInfo(wifiInfo);
            updateWifiInfo(wifiInfo);
            updateStatusLabel();
            updateStatusLabel();
            mCallback.run();
            mMainThreadHandler.post(() -> postResults());
        }
        }


        @Override
        @Override
@@ -128,7 +123,7 @@ public class WifiStatusTracker {
                mNetworks.remove(network.getNetId());
                mNetworks.remove(network.getNetId());
                updateWifiInfo(null);
                updateWifiInfo(null);
                updateStatusLabel();
                updateStatusLabel();
                mCallback.run();
                mMainThreadHandler.post(() -> postResults());
            }
            }
        }
        }
    };
    };
@@ -143,7 +138,7 @@ public class WifiStatusTracker {
            mDefaultNetwork = network;
            mDefaultNetwork = network;
            mDefaultNetworkCapabilities = nc;
            mDefaultNetworkCapabilities = nc;
            updateStatusLabel();
            updateStatusLabel();
            mCallback.run();
            mMainThreadHandler.post(() -> postResults());
        }
        }
        @Override
        @Override
        public void onLost(Network network) {
        public void onLost(Network network) {
@@ -151,7 +146,7 @@ public class WifiStatusTracker {
            mDefaultNetwork = null;
            mDefaultNetwork = null;
            mDefaultNetworkCapabilities = null;
            mDefaultNetworkCapabilities = null;
            updateStatusLabel();
            updateStatusLabel();
            mCallback.run();
            mMainThreadHandler.post(() -> postResults());
        }
        }
    };
    };
    private Network mDefaultNetwork = null;
    private Network mDefaultNetwork = null;
@@ -174,12 +169,35 @@ public class WifiStatusTracker {
    public WifiStatusTracker(Context context, WifiManager wifiManager,
    public WifiStatusTracker(Context context, WifiManager wifiManager,
            NetworkScoreManager networkScoreManager, ConnectivityManager connectivityManager,
            NetworkScoreManager networkScoreManager, ConnectivityManager connectivityManager,
            Runnable callback) {
            Runnable callback) {
        this(context, wifiManager, networkScoreManager, connectivityManager, callback, null, null);
    }

    public WifiStatusTracker(Context context, WifiManager wifiManager,
            NetworkScoreManager networkScoreManager, ConnectivityManager connectivityManager,
            Runnable callback, Handler foregroundHandler, Handler backgroundHandler) {
        mContext = context;
        mContext = context;
        mWifiManager = wifiManager;
        mWifiManager = wifiManager;
        mWifiNetworkScoreCache = new WifiNetworkScoreCache(context);
        mWifiNetworkScoreCache = new WifiNetworkScoreCache(context);
        mNetworkScoreManager = networkScoreManager;
        mNetworkScoreManager = networkScoreManager;
        mConnectivityManager = connectivityManager;
        mConnectivityManager = connectivityManager;
        mCallback = callback;
        mCallback = callback;
        if (backgroundHandler == null) {
            HandlerThread handlerThread = new HandlerThread("WifiStatusTrackerHandler");
            handlerThread.start();
            mHandler = new Handler(handlerThread.getLooper());
        } else {
            mHandler = backgroundHandler;
        }
        mMainThreadHandler = foregroundHandler == null
                ? new Handler(Looper.getMainLooper()) : foregroundHandler;
        mCacheListener =
                new WifiNetworkScoreCache.CacheListener(mHandler) {
                    @Override
                    public void networkCacheUpdated(List<ScoredNetwork> updatedNetworks) {
                        updateStatusLabel();
                        mMainThreadHandler.post(() -> postResults());
                    }
                };
    }
    }


    public void setListening(boolean listening) {
    public void setListening(boolean listening) {
@@ -332,7 +350,7 @@ public class WifiStatusTracker {
    /** Refresh the status label on Locale changed. */
    /** Refresh the status label on Locale changed. */
    public void refreshLocale() {
    public void refreshLocale() {
        updateStatusLabel();
        updateStatusLabel();
        mCallback.run();
        mMainThreadHandler.post(() -> postResults());
    }
    }


    private String getValidSsid(WifiInfo info) {
    private String getValidSsid(WifiInfo info) {
@@ -348,6 +366,10 @@ public class WifiStatusTracker {
        mHistoryIndex = (mHistoryIndex + 1) % HISTORY_SIZE;
        mHistoryIndex = (mHistoryIndex + 1) % HISTORY_SIZE;
    }
    }


    private void postResults() {
        mCallback.run();
    }

    /** Dump function. */
    /** Dump function. */
    public void dump(PrintWriter pw) {
    public void dump(PrintWriter pw) {
        pw.println("  - WiFi Network History ------");
        pw.println("  - WiFi Network History ------");
+5 −2
Original line number Original line Diff line number Diff line
@@ -251,10 +251,10 @@ public class NetworkControllerImpl extends BroadcastReceiver
                broadcastDispatcher,
                broadcastDispatcher,
                demoModeController,
                demoModeController,
                carrierConfigTracker,
                carrierConfigTracker,
                handler,
                featureFlags,
                featureFlags,
                dumpManager);
                dumpManager);
        mReceiverHandler.post(mRegisterListeners);
        mReceiverHandler.post(mRegisterListeners);
        mMainHandler = handler;
        mInternetDialogFactory = internetDialogFactory;
        mInternetDialogFactory = internetDialogFactory;
    }
    }


@@ -274,12 +274,14 @@ public class NetworkControllerImpl extends BroadcastReceiver
            BroadcastDispatcher broadcastDispatcher,
            BroadcastDispatcher broadcastDispatcher,
            DemoModeController demoModeController,
            DemoModeController demoModeController,
            CarrierConfigTracker carrierConfigTracker,
            CarrierConfigTracker carrierConfigTracker,
            @Main Handler handler,
            FeatureFlags featureFlags,
            FeatureFlags featureFlags,
            DumpManager dumpManager
            DumpManager dumpManager
    ) {
    ) {
        mContext = context;
        mContext = context;
        mTelephonyListenerManager = telephonyListenerManager;
        mTelephonyListenerManager = telephonyListenerManager;
        mConfig = config;
        mConfig = config;
        mMainHandler = handler;
        mReceiverHandler = new Handler(bgLooper);
        mReceiverHandler = new Handler(bgLooper);
        mBgLooper = bgLooper;
        mBgLooper = bgLooper;
        mBgExecutor = bgExecutor;
        mBgExecutor = bgExecutor;
@@ -315,7 +317,8 @@ public class NetworkControllerImpl extends BroadcastReceiver
            }
            }
        });
        });
        mWifiSignalController = new WifiSignalController(mContext, mHasMobileDataFeature,
        mWifiSignalController = new WifiSignalController(mContext, mHasMobileDataFeature,
                mCallbackHandler, this, mWifiManager, mConnectivityManager, networkScoreManager);
                mCallbackHandler, this, mWifiManager, mConnectivityManager, networkScoreManager,
                mMainHandler, mReceiverHandler);


        mEthernetSignalController = new EthernetSignalController(mContext, mCallbackHandler, this);
        mEthernetSignalController = new EthernetSignalController(mContext, mCallbackHandler, this);


+7 −2
Original line number Original line Diff line number Diff line
@@ -25,6 +25,7 @@ import android.net.ConnectivityManager;
import android.net.NetworkCapabilities;
import android.net.NetworkCapabilities;
import android.net.NetworkScoreManager;
import android.net.NetworkScoreManager;
import android.net.wifi.WifiManager;
import android.net.wifi.WifiManager;
import android.os.Handler;
import android.text.Html;
import android.text.Html;


import com.android.internal.annotations.VisibleForTesting;
import com.android.internal.annotations.VisibleForTesting;
@@ -34,6 +35,8 @@ import com.android.settingslib.graph.SignalDrawable;
import com.android.settingslib.mobile.TelephonyIcons;
import com.android.settingslib.mobile.TelephonyIcons;
import com.android.settingslib.wifi.WifiStatusTracker;
import com.android.settingslib.wifi.WifiStatusTracker;
import com.android.systemui.R;
import com.android.systemui.R;
import com.android.systemui.dagger.qualifiers.Background;
import com.android.systemui.dagger.qualifiers.Main;
import com.android.systemui.util.Assert;
import com.android.systemui.util.Assert;


import java.io.PrintWriter;
import java.io.PrintWriter;
@@ -53,12 +56,14 @@ public class WifiSignalController extends SignalController<WifiState, IconGroup>
            NetworkControllerImpl networkController,
            NetworkControllerImpl networkController,
            WifiManager wifiManager,
            WifiManager wifiManager,
            ConnectivityManager connectivityManager,
            ConnectivityManager connectivityManager,
            NetworkScoreManager networkScoreManager) {
            NetworkScoreManager networkScoreManager,
            @Main Handler handler,
            @Background Handler backgroundHandler) {
        super("WifiSignalController", context, NetworkCapabilities.TRANSPORT_WIFI,
        super("WifiSignalController", context, NetworkCapabilities.TRANSPORT_WIFI,
                callbackHandler, networkController);
                callbackHandler, networkController);
        mWifiManager = wifiManager;
        mWifiManager = wifiManager;
        mWifiTracker = new WifiStatusTracker(mContext, wifiManager, networkScoreManager,
        mWifiTracker = new WifiStatusTracker(mContext, wifiManager, networkScoreManager,
                connectivityManager, this::handleStatusUpdated);
                connectivityManager, this::handleStatusUpdated, handler, backgroundHandler);
        mWifiTracker.setListening(true);
        mWifiTracker.setListening(true);
        mHasMobileDataFeature = hasMobileDataFeature;
        mHasMobileDataFeature = hasMobileDataFeature;
        if (wifiManager != null) {
        if (wifiManager != null) {
+8 −18
Original line number Original line Diff line number Diff line
@@ -125,6 +125,7 @@ public class NetworkControllerBaseTest extends SysuiTestCase {
    protected DemoModeController mDemoModeController;
    protected DemoModeController mDemoModeController;
    protected CarrierConfigTracker mCarrierConfigTracker;
    protected CarrierConfigTracker mCarrierConfigTracker;
    protected FakeExecutor mFakeExecutor = new FakeExecutor(new FakeSystemClock());
    protected FakeExecutor mFakeExecutor = new FakeExecutor(new FakeSystemClock());
    protected Handler mMainHandler;
    protected FeatureFlags mFeatureFlags;
    protected FeatureFlags mFeatureFlags;


    protected int mSubId;
    protected int mSubId;
@@ -174,9 +175,15 @@ public class NetworkControllerBaseTest extends SysuiTestCase {
        mMockNsm = mock(NetworkScoreManager.class);
        mMockNsm = mock(NetworkScoreManager.class);
        mMockSubDefaults = mock(SubscriptionDefaults.class);
        mMockSubDefaults = mock(SubscriptionDefaults.class);
        mCarrierConfigTracker = mock(CarrierConfigTracker.class);
        mCarrierConfigTracker = mock(CarrierConfigTracker.class);
        mMainHandler = mock(Handler.class);
        mNetCapabilities = new NetworkCapabilities();
        mNetCapabilities = new NetworkCapabilities();
        when(mMockTm.isDataCapable()).thenReturn(true);
        when(mMockTm.isDataCapable()).thenReturn(true);
        when(mMockTm.createForSubscriptionId(anyInt())).thenReturn(mMockTm);
        when(mMockTm.createForSubscriptionId(anyInt())).thenReturn(mMockTm);

        doAnswer(invocation -> {
            ((Runnable) invocation.getArgument(0)).run();
            return null;
        }).when(mMainHandler).post(any());
        doAnswer(invocation -> {
        doAnswer(invocation -> {
            int rssi = invocation.getArgument(0);
            int rssi = invocation.getArgument(0);
            if (rssi < -88) return 0;
            if (rssi < -88) return 0;
@@ -231,6 +238,7 @@ public class NetworkControllerBaseTest extends SysuiTestCase {
                mMockBd,
                mMockBd,
                mDemoModeController,
                mDemoModeController,
                mCarrierConfigTracker,
                mCarrierConfigTracker,
                mMainHandler,
                mFeatureFlags,
                mFeatureFlags,
                mock(DumpManager.class)
                mock(DumpManager.class)
        );
        );
@@ -291,24 +299,6 @@ public class NetworkControllerBaseTest extends SysuiTestCase {
        mNetworkController.doUpdateMobileControllers();
        mNetworkController.doUpdateMobileControllers();
    }
    }


    protected NetworkControllerImpl setUpNoMobileData() {
        when(mMockTm.isDataCapable()).thenReturn(false);
        NetworkControllerImpl networkControllerNoMobile =
                new NetworkControllerImpl(mContext, mMockCm, mMockTm, mTelephonyListenerManager,
                        mMockWm, mMockNsm, mMockSm,
                        mConfig, TestableLooper.get(this).getLooper(), mFakeExecutor,
                        mCallbackHandler,
                        mock(AccessPointControllerImpl.class),
                        mock(DataUsageController.class), mMockSubDefaults,
                        mock(DeviceProvisionedController.class), mMockBd, mDemoModeController,
                        mCarrierConfigTracker, mFeatureFlags,
                        mock(DumpManager.class));

        setupNetworkController();

        return networkControllerNoMobile;
    }

    // 2 Bars 3G GSM.
    // 2 Bars 3G GSM.
    public void setupDefaultSignal() {
    public void setupDefaultSignal() {
        setIsGsm(true);
        setIsGsm(true);
+3 −2
Original line number Original line Diff line number Diff line
@@ -25,6 +25,7 @@ import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;
import static org.mockito.Mockito.when;


import android.net.NetworkCapabilities;
import android.net.NetworkCapabilities;
import android.os.Handler;
import android.os.Looper;
import android.os.Looper;
import android.telephony.NetworkRegistrationInfo;
import android.telephony.NetworkRegistrationInfo;
import android.telephony.ServiceState;
import android.telephony.ServiceState;
@@ -130,8 +131,8 @@ public class NetworkControllerDataTest extends NetworkControllerBaseTest {
                mock(AccessPointControllerImpl.class),
                mock(AccessPointControllerImpl.class),
                mock(DataUsageController.class), mMockSubDefaults,
                mock(DataUsageController.class), mMockSubDefaults,
                mock(DeviceProvisionedController.class), mMockBd, mDemoModeController,
                mock(DeviceProvisionedController.class), mMockBd, mDemoModeController,
                mock(CarrierConfigTracker.class), mFeatureFlags,
                mock(CarrierConfigTracker.class), new Handler(TestableLooper.get(this).getLooper()),
                mock(DumpManager.class));
                mFeatureFlags, mock(DumpManager.class));
        setupNetworkController();
        setupNetworkController();


        setupDefaultSignal();
        setupDefaultSignal();
Loading