On API 29+ we need the location permission to start the hotspot, while
on lower API levels, we don't. In order to handle permissions and
other conditions in a clear manner depending the API level of the
device the app is running on, have separate extensions of the base
ConditionManager class.
Take special care to handle situations gracefully where the Wifi is
disabled and the user tries to start the hotspot. We cannot simply
rely on Wifi being enabled as a sufficient condition that allows us to
start the hotspot. We need to wait for WifiP2p to be available. While
it is tricky to obtain that state (it involves registering a broadcast
receiver for the WIFI_P2P_STATE_CHANGED_ACTION broadcast, keeping
track of changes there and even then things are still ugly. It can
happen that WifiP2p is available before Wifi is. Also it can happen
that WifiP2p never becomes available because some other application
has already opened a hotspot. Instead of checking that state, we now
just try (and retry repeatedly after a delay) to start the hotspot
(and the WifiP2p framework) hoping that is becomes availabe within a
reasonable amount of time after Wifi has been detected to be on.
Currently we try 5 times with a delay of 1 second.
Improve the behavior of disabling and re-enabling the 'start hotspot'
button, so that it becomes impossible to double-tap it, but still
making sure that the button get re-enabled as soon as the UI is back
in a state where the user should be able to tap the button again.