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
This commit is contained in:
Fabian Kozynski
2020-02-25 11:26:20 -05:00
parent 7b27da1d8f
commit 17623bfa8f
2 changed files with 29 additions and 9 deletions

View File

@@ -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

View File

@@ -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);
}
}