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

Commit 17623bfa authored by Fabian Kozynski's avatar Fabian Kozynski
Browse files

Prevent early destroying HotspotTile

Due to the switch to Async HotspotControllerImpl, if the controller is
created with the tile it will think that tethering is not available
(because it hasn't received callbacks saying otherwise yet) and the tile
will be preemptively destroyed. This was observable on OTAs (or when
doing a full flash).

With this change, HotspotControllerImpl will assume that tethering is
available by default and will signal callbacks if it learns that it's
not.

There are currently no other consumers of
HotspotControllerImpl#isHotspotSupported.

Fixes: 149492796
Test: atest HotspotControllerImplTest
Test: manual full flash
Change-Id: Id1461b7fbe973b732bc69c7ad77a30e0f66247d8
parent 7b27da1d
Loading
Loading
Loading
Loading
+12 −2
Original line number Diff line number Diff line
@@ -56,8 +56,9 @@ public class HotspotControllerImpl implements HotspotController, WifiManager.Sof

    private int mHotspotState;
    private volatile int mNumConnectedDevices;
    private volatile boolean mIsTetheringSupported;
    private volatile boolean mHasTetherableWifiRegexs;
    // Assume tethering is available until told otherwise
    private volatile boolean mIsTetheringSupported = true;
    private volatile boolean mHasTetherableWifiRegexs = true;
    private boolean mWaitingForTerminalState;

    private TetheringManager.TetheringEventCallback mTetheringCallback =
@@ -97,6 +98,15 @@ public class HotspotControllerImpl implements HotspotController, WifiManager.Sof
                new HandlerExecutor(backgroundHandler), mTetheringCallback);
    }

    /**
     * Whether hotspot is currently supported.
     *
     * This will return {@code true} immediately on creation of the controller, but may be updated
     * later. Callbacks from this controllers will notify if the state changes.
     *
     * @return {@code true} if hotspot is supported (or we haven't been told it's not)
     * @see #addCallback
     */
    @Override
    public boolean isHotspotSupported() {
        return mIsTetheringSupported && mHasTetherableWifiRegexs
+17 −7
Original line number Diff line number Diff line
@@ -16,7 +16,6 @@

package com.android.systemui.statusbar.policy;

import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
import static org.mockito.ArgumentMatchers.anyBoolean;
import static org.mockito.ArgumentMatchers.anyInt;
@@ -140,13 +139,16 @@ public class HotspotControllerImplTest extends SysuiTestCase {
    }

    @Test
    public void testDefault_hotspotNotSupported() {
        assertFalse(mController.isHotspotSupported());
    public void testHotspotSupported_default() {
        assertTrue(mController.isHotspotSupported());
    }

    @Test
    public void testHotspotSupported_rightConditions() {
        mTetheringCallbackCaptor.getValue().onTetheringSupported(true);

        assertTrue(mController.isHotspotSupported());

        mTetheringCallbackCaptor.getValue()
                .onTetherableInterfaceRegexpsChanged(mTetheringInterfaceRegexps);

@@ -154,13 +156,21 @@ public class HotspotControllerImplTest extends SysuiTestCase {
    }

    @Test
    public void testHotspotSupported_callbackCalledOnChange() {
    public void testHotspotSupported_callbackCalledOnChange_tetheringSupported() {
        mController.addCallback(mCallback1);
        mTetheringCallbackCaptor.getValue().onTetheringSupported(false);

        verify(mCallback1).onHotspotAvailabilityChanged(false);
    }

    @Test
    public void testHotspotSupported_callbackCalledOnChange_tetherableInterfaces() {
        when(mTetheringInterfaceRegexps.getTetherableWifiRegexs())
                .thenReturn(Collections.emptyList());
        mController.addCallback(mCallback1);
        mTetheringCallbackCaptor.getValue().onTetheringSupported(true);
        mTetheringCallbackCaptor.getValue()
                .onTetherableInterfaceRegexpsChanged(mTetheringInterfaceRegexps);

        verify(mCallback1).onHotspotAvailabilityChanged(true);
        verify(mCallback1).onHotspotAvailabilityChanged(false);
    }

}