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

Commit aae06ed8 authored by Evan Laird's avatar Evan Laird Committed by Automerger Merge Worker
Browse files

Merge "Synchronize access to mCurrentState when updating" into tm-dev am: 3137c78e

parents 33927c74 3137c78e
Loading
Loading
Loading
Loading
+9 −7
Original line number Original line Diff line number Diff line
@@ -33,7 +33,6 @@ import android.net.ConnectivityManager;
import android.net.ConnectivityManager.NetworkCallback;
import android.net.ConnectivityManager.NetworkCallback;
import android.net.Network;
import android.net.Network;
import android.net.NetworkCapabilities;
import android.net.NetworkCapabilities;
import android.net.NetworkScoreManager;
import android.net.wifi.ScanResult;
import android.net.wifi.ScanResult;
import android.net.wifi.WifiManager;
import android.net.wifi.WifiManager;
import android.os.AsyncTask;
import android.os.AsyncTask;
@@ -225,10 +224,10 @@ public class NetworkControllerImpl extends BroadcastReceiver
            TelephonyManager telephonyManager,
            TelephonyManager telephonyManager,
            TelephonyListenerManager telephonyListenerManager,
            TelephonyListenerManager telephonyListenerManager,
            @Nullable WifiManager wifiManager,
            @Nullable WifiManager wifiManager,
            NetworkScoreManager networkScoreManager,
            AccessPointControllerImpl accessPointController,
            AccessPointControllerImpl accessPointController,
            DemoModeController demoModeController,
            DemoModeController demoModeController,
            CarrierConfigTracker carrierConfigTracker,
            CarrierConfigTracker carrierConfigTracker,
            WifiStatusTrackerFactory trackerFactory,
            @Main Handler handler,
            @Main Handler handler,
            InternetDialogFactory internetDialogFactory,
            InternetDialogFactory internetDialogFactory,
            FeatureFlags featureFlags,
            FeatureFlags featureFlags,
@@ -237,7 +236,6 @@ public class NetworkControllerImpl extends BroadcastReceiver
                telephonyManager,
                telephonyManager,
                telephonyListenerManager,
                telephonyListenerManager,
                wifiManager,
                wifiManager,
                networkScoreManager,
                subscriptionManager,
                subscriptionManager,
                Config.readConfig(context),
                Config.readConfig(context),
                bgLooper,
                bgLooper,
@@ -250,6 +248,7 @@ public class NetworkControllerImpl extends BroadcastReceiver
                broadcastDispatcher,
                broadcastDispatcher,
                demoModeController,
                demoModeController,
                carrierConfigTracker,
                carrierConfigTracker,
                trackerFactory,
                handler,
                handler,
                featureFlags,
                featureFlags,
                dumpManager);
                dumpManager);
@@ -262,8 +261,9 @@ public class NetworkControllerImpl extends BroadcastReceiver
            TelephonyManager telephonyManager,
            TelephonyManager telephonyManager,
            TelephonyListenerManager telephonyListenerManager,
            TelephonyListenerManager telephonyListenerManager,
            WifiManager wifiManager,
            WifiManager wifiManager,
            NetworkScoreManager networkScoreManager,
            SubscriptionManager subManager,
            SubscriptionManager subManager, Config config, Looper bgLooper,
            Config config,
            Looper bgLooper,
            Executor bgExecutor,
            Executor bgExecutor,
            CallbackHandler callbackHandler,
            CallbackHandler callbackHandler,
            AccessPointControllerImpl accessPointController,
            AccessPointControllerImpl accessPointController,
@@ -273,6 +273,7 @@ public class NetworkControllerImpl extends BroadcastReceiver
            BroadcastDispatcher broadcastDispatcher,
            BroadcastDispatcher broadcastDispatcher,
            DemoModeController demoModeController,
            DemoModeController demoModeController,
            CarrierConfigTracker carrierConfigTracker,
            CarrierConfigTracker carrierConfigTracker,
            WifiStatusTrackerFactory trackerFactory,
            @Main Handler handler,
            @Main Handler handler,
            FeatureFlags featureFlags,
            FeatureFlags featureFlags,
            DumpManager dumpManager
            DumpManager dumpManager
@@ -315,9 +316,10 @@ public class NetworkControllerImpl extends BroadcastReceiver
                notifyControllersMobileDataChanged();
                notifyControllersMobileDataChanged();
            }
            }
        });
        });

        mWifiSignalController = new WifiSignalController(mContext, mHasMobileDataFeature,
        mWifiSignalController = new WifiSignalController(mContext, mHasMobileDataFeature,
                mCallbackHandler, this, mWifiManager, mConnectivityManager, networkScoreManager,
                mCallbackHandler, this, mWifiManager, trackerFactory,
                mMainHandler, mReceiverHandler);
                mReceiverHandler);


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


+2 −2
Original line number Original line Diff line number Diff line
@@ -50,7 +50,7 @@ public abstract class SignalController<T extends ConnectivityState, I extends Ic
    protected final T mLastState;
    protected final T mLastState;
    protected final int mTransportType;
    protected final int mTransportType;
    protected final Context mContext;
    protected final Context mContext;
    // The owner of the SignalController (i.e. NetworkController will maintain the following
    // The owner of the SignalController (i.e. NetworkController) will maintain the following
    // lists and call notifyListeners whenever the list has changed to ensure everyone
    // lists and call notifyListeners whenever the list has changed to ensure everyone
    // is aware of current state.
    // is aware of current state.
    protected final NetworkControllerImpl mNetworkController;
    protected final NetworkControllerImpl mNetworkController;
@@ -103,7 +103,7 @@ public abstract class SignalController<T extends ConnectivityState, I extends Ic
     * Determines if the state of this signal controller has changed and
     * Determines if the state of this signal controller has changed and
     * needs to trigger callbacks related to it.
     * needs to trigger callbacks related to it.
     */
     */
    public boolean isDirty() {
    boolean isDirty() {
        if (!mLastState.equals(mCurrentState)) {
        if (!mLastState.equals(mCurrentState)) {
            if (DEBUG) {
            if (DEBUG) {
                Log.d(mTag, "Change in state from: " + mLastState + "\n"
                Log.d(mTag, "Change in state from: " + mLastState + "\n"
+38 −25
Original line number Original line Diff line number Diff line
@@ -21,14 +21,13 @@ import static android.net.wifi.WifiManager.TrafficStateCallback.DATA_ACTIVITY_OU


import android.content.Context;
import android.content.Context;
import android.content.Intent;
import android.content.Intent;
import android.net.ConnectivityManager;
import android.net.NetworkCapabilities;
import android.net.NetworkCapabilities;
import android.net.NetworkScoreManager;
import android.net.wifi.WifiManager;
import android.net.wifi.WifiManager;
import android.os.Handler;
import android.os.Handler;
import android.text.Html;
import android.text.Html;


import com.android.internal.annotations.VisibleForTesting;
import com.android.internal.annotations.VisibleForTesting;
import com.android.internal.util.Preconditions;
import com.android.settingslib.SignalIcon.IconGroup;
import com.android.settingslib.SignalIcon.IconGroup;
import com.android.settingslib.SignalIcon.MobileIconGroup;
import com.android.settingslib.SignalIcon.MobileIconGroup;
import com.android.settingslib.graph.SignalDrawable;
import com.android.settingslib.graph.SignalDrawable;
@@ -36,8 +35,6 @@ 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.Background;
import com.android.systemui.dagger.qualifiers.Main;
import com.android.systemui.util.Assert;


import java.io.PrintWriter;
import java.io.PrintWriter;


@@ -49,21 +46,21 @@ public class WifiSignalController extends SignalController<WifiState, IconGroup>
    private final MobileIconGroup mCarrierMergedWifiIconGroup = TelephonyIcons.CARRIER_MERGED_WIFI;
    private final MobileIconGroup mCarrierMergedWifiIconGroup = TelephonyIcons.CARRIER_MERGED_WIFI;
    private final WifiManager mWifiManager;
    private final WifiManager mWifiManager;


    private final Handler mBgHandler;

    public WifiSignalController(
    public WifiSignalController(
            Context context,
            Context context,
            boolean hasMobileDataFeature,
            boolean hasMobileDataFeature,
            CallbackHandler callbackHandler,
            CallbackHandler callbackHandler,
            NetworkControllerImpl networkController,
            NetworkControllerImpl networkController,
            WifiManager wifiManager,
            WifiManager wifiManager,
            ConnectivityManager connectivityManager,
            WifiStatusTrackerFactory trackerFactory,
            NetworkScoreManager networkScoreManager,
            @Background Handler bgHandler) {
            @Main Handler handler,
            @Background Handler backgroundHandler) {
        super("WifiSignalController", context, NetworkCapabilities.TRANSPORT_WIFI,
        super("WifiSignalController", context, NetworkCapabilities.TRANSPORT_WIFI,
                callbackHandler, networkController);
                callbackHandler, networkController);
        mBgHandler = bgHandler;
        mWifiManager = wifiManager;
        mWifiManager = wifiManager;
        mWifiTracker = new WifiStatusTracker(mContext, wifiManager, networkScoreManager,
        mWifiTracker = trackerFactory.createTracker(this::handleStatusUpdated, bgHandler);
                connectivityManager, this::handleStatusUpdated, handler, backgroundHandler);
        mWifiTracker.setListening(true);
        mWifiTracker.setListening(true);
        mHasMobileDataFeature = hasMobileDataFeature;
        mHasMobileDataFeature = hasMobileDataFeature;
        if (wifiManager != null) {
        if (wifiManager != null) {
@@ -181,33 +178,51 @@ public class WifiSignalController extends SignalController<WifiState, IconGroup>
     * Fetches wifi initial state replacing the initial sticky broadcast.
     * Fetches wifi initial state replacing the initial sticky broadcast.
     */
     */
    public void fetchInitialState() {
    public void fetchInitialState() {
        doInBackground(() -> {
            mWifiTracker.fetchInitialState();
            mWifiTracker.fetchInitialState();
            copyWifiStates();
            copyWifiStates();
            notifyListenersIfNecessary();
            notifyListenersIfNecessary();
        });
    }
    }


    /**
    /**
     * Extract wifi state directly from broadcasts about changes in wifi state.
     * Extract wifi state directly from broadcasts about changes in wifi state.
     */
     */
    public void handleBroadcast(Intent intent) {
    void handleBroadcast(Intent intent) {
        doInBackground(() -> {
            mWifiTracker.handleBroadcast(intent);
            mWifiTracker.handleBroadcast(intent);
            copyWifiStates();
            copyWifiStates();
            notifyListenersIfNecessary();
            notifyListenersIfNecessary();
        });
    }
    }


    private void handleStatusUpdated() {
    private void handleStatusUpdated() {
        Assert.isMainThread();
        // The WifiStatusTracker callback comes in on the main thread, but the rest of our data
        // access happens on the bgHandler
        doInBackground(() -> {
            copyWifiStates();
            copyWifiStates();
            notifyListenersIfNecessary();
            notifyListenersIfNecessary();
        });
    }

    private void doInBackground(Runnable action) {
        if (Thread.currentThread() != mBgHandler.getLooper().getThread()) {
            mBgHandler.post(action);
        } else {
            action.run();
        }
    }
    }


    private void copyWifiStates() {
    private void copyWifiStates() {
        // Data access should only happen on our bg thread
        Preconditions.checkState(mBgHandler.getLooper().isCurrentThread());

        mCurrentState.enabled = mWifiTracker.enabled;
        mCurrentState.enabled = mWifiTracker.enabled;
        mCurrentState.isDefault = mWifiTracker.isDefaultNetwork;
        mCurrentState.isDefault = mWifiTracker.isDefaultNetwork;
        mCurrentState.connected = mWifiTracker.connected;
        mCurrentState.connected = mWifiTracker.connected;
        mCurrentState.ssid = mWifiTracker.ssid;
        mCurrentState.ssid = mWifiTracker.ssid;
        mCurrentState.rssi = mWifiTracker.rssi;
        mCurrentState.rssi = mWifiTracker.rssi;
        notifyWifiLevelChangeIfNecessary(mWifiTracker.level);
        boolean levelChanged = mCurrentState.level != mWifiTracker.level;
        mCurrentState.level = mWifiTracker.level;
        mCurrentState.level = mWifiTracker.level;
        mCurrentState.statusLabel = mWifiTracker.statusLabel;
        mCurrentState.statusLabel = mWifiTracker.statusLabel;
        mCurrentState.isCarrierMerged = mWifiTracker.isCarrierMerged;
        mCurrentState.isCarrierMerged = mWifiTracker.isCarrierMerged;
@@ -215,11 +230,9 @@ public class WifiSignalController extends SignalController<WifiState, IconGroup>
        mCurrentState.iconGroup =
        mCurrentState.iconGroup =
                mCurrentState.isCarrierMerged ? mCarrierMergedWifiIconGroup
                mCurrentState.isCarrierMerged ? mCarrierMergedWifiIconGroup
                        : mUnmergedWifiIconGroup;
                        : mUnmergedWifiIconGroup;
    }


    void notifyWifiLevelChangeIfNecessary(int level) {
        if (levelChanged) {
        if (level != mCurrentState.level) {
            mNetworkController.notifyWifiLevelChange(mCurrentState.level);
            mNetworkController.notifyWifiLevelChange(level);
        }
        }
    }
    }


+50 −0
Original line number Original line Diff line number Diff line
/*
 * Copyright (C) 2015 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.systemui.statusbar.connectivity

import android.content.Context
import android.net.ConnectivityManager
import android.net.NetworkScoreManager
import android.net.wifi.WifiManager
import android.os.Handler

import com.android.settingslib.wifi.WifiStatusTracker
import com.android.systemui.dagger.qualifiers.Main

import javax.inject.Inject

/**
 * Factory class for [WifiStatusTracker] which lives in SettingsLib (and thus doesn't use Dagger).
 * This enables the constructors for NetworkControllerImpl and WifiSignalController to be slightly
 * nicer.
 */
internal class WifiStatusTrackerFactory @Inject constructor(
    private val mContext: Context,
    private val mWifiManager: WifiManager?,
    private val mNetworkScoreManager: NetworkScoreManager,
    private val mConnectivityManager: ConnectivityManager,
    @Main private val mMainHandler: Handler
) {
    fun createTracker(callback: Runnable?, bgHandler: Handler?): WifiStatusTracker {
        return WifiStatusTracker(mContext,
                mWifiManager,
                mNetworkScoreManager,
                mConnectivityManager,
                callback,
                mMainHandler,
                bgHandler)
    }
}
+5 −1
Original line number Original line Diff line number Diff line
@@ -127,6 +127,7 @@ public class NetworkControllerBaseTest extends SysuiTestCase {
    protected FakeExecutor mFakeExecutor = new FakeExecutor(new FakeSystemClock());
    protected FakeExecutor mFakeExecutor = new FakeExecutor(new FakeSystemClock());
    protected Handler mMainHandler;
    protected Handler mMainHandler;
    protected FeatureFlags mFeatureFlags;
    protected FeatureFlags mFeatureFlags;
    protected WifiStatusTrackerFactory mWifiStatusTrackerFactory;


    protected int mSubId;
    protected int mSubId;


@@ -220,12 +221,14 @@ public class NetworkControllerBaseTest extends SysuiTestCase {
            return null;
            return null;
        }).when(mMockProvisionController).addCallback(any());
        }).when(mMockProvisionController).addCallback(any());


        mWifiStatusTrackerFactory = new WifiStatusTrackerFactory(
                mContext, mMockWm, mMockNsm, mMockCm, mMainHandler);

        mNetworkController = new NetworkControllerImpl(mContext,
        mNetworkController = new NetworkControllerImpl(mContext,
                mMockCm,
                mMockCm,
                mMockTm,
                mMockTm,
                mTelephonyListenerManager,
                mTelephonyListenerManager,
                mMockWm,
                mMockWm,
                mMockNsm,
                mMockSm,
                mMockSm,
                mConfig,
                mConfig,
                TestableLooper.get(this).getLooper(),
                TestableLooper.get(this).getLooper(),
@@ -238,6 +241,7 @@ public class NetworkControllerBaseTest extends SysuiTestCase {
                mMockBd,
                mMockBd,
                mDemoModeController,
                mDemoModeController,
                mCarrierConfigTracker,
                mCarrierConfigTracker,
                mWifiStatusTrackerFactory,
                mMainHandler,
                mMainHandler,
                mFeatureFlags,
                mFeatureFlags,
                mock(DumpManager.class)
                mock(DumpManager.class)
Loading