App goes into background spontaneously when memory is low
On the Galaxy Nexus (Android 4.3), Briar sometimes goes into the background spontaneously when memory is low.
This seems to happen because the app's importance is downgraded from IMPORTANCE_FOREGROUND to IMPORTANCE_VISIBLE when the app's showing a system dialog (in my case it was the Bluetooth discoverability dialog). BriarApplicationImpl#isRunningInBackground() considers anything other than IMPORTANCE_FOREGROUND to be background, so it allows BriarService to hide the UI to save memory.
Fixing this will require some care. When Briar's actually running in the background on this device it has an importance of IMPORTANCE_PERCEPTIBLE_PRE_26 (perhaps it's treated as perceptible because of the foreground service). But on other devices it might plausibly have IMPORTANCE_FOREGROUND_SERVICE (added in API 23) or IMPORTANCE_PERCEPTIBLE (added in API 26). Presumably new constants may be added in future versions.
The constants seem to be ordered, with lower values being more important:
- IMPORTANCE_FOREGROUND = 100
- IMPORTANCE_FOREGROUND_SERVICE = 125
- IMPORTANCE_PERCEPTIBLE_PRE_26 = 130
- IMPORTANCE_VISIBLE = 200
- IMPORTANCE_PERCEPTIBLE = 230
Unfortunately there's no cutoff we can choose such that the values for "running in the foreground, maybe with a system dialog" are on one side while the values for "running in the background with a foreground service" are on the other side.
I suspect there's an Android bug here: an app that would have IMPORTANCE_PERCEPTIBLE_PRE_26 when running in the background shouldn't be less important when it's running in the foreground but showing a system dialog. If I'm right and we can find out when the bug was fixed, maybe we can use some version-aware logic to work around this.