8
votes

I would like to know if Android has any flag to be added into configChanges in an Activity attribute in the AndroidManifest for modifications in the Invert Colors option of the device.

The android doc shows the following flags: - "mcc"
- "mnc"
- "locale"
- "touchscreen"
- "keyboard"
- "keyboardHidden"
- "navigation"
- "screenLayout"
- "fontScale"
- "uiMode" // this one is for the dark mode
- "orientation"
- "density"
- "screenSize"
- "smallestScreenSize"

But none of them deal with it.


Invert colors option:

enter image description here

1
I do not see "invert colors" in Settings on Android 10 (Pixel 3) or Android 9 (Galaxy S9). Where are you seeing this option? - CommonsWare
Thanks for pointing that out! Playing with it, I suspect that is purely a GPU thing and is not actually a configuration change, but that's just a guess. Does your activity undergo a configuration change when this is toggled? - CommonsWare
AFAIK, onConfigurationChanged() would only get fired if you had the right android:configChanges attribute and opted out of the default configuration change behavior. Is your activity destroyed and recreated after switching the "invert colors" toggle? - CommonsWare
OK, so it's definitely a configuration change. Unless there's some system message in Logcat, I don't know how to determine what sort of configuration change it is and how you would opt out of it via android:configChanges. If you tried all the documented ones without success, then either the android:configChanges value is undocumented or does not exist (i.e., you can't opt out of it)... and neither of those are great options. :-( - CommonsWare
@CommonsWare I'm afraid Android does not have a flag for the color inversion modification. I tested with all the flags available in the docs (mnc|locale|touchscreen|keyboard|keyboardHidden|navigation|screenLayout|fontScale|uiMode|orientation|density|screenSize|smallestScreenSize) and none made the onConfigurationChanged callback be fired =/. Anyways, I would like to thank you a bunch for your attention, time and willing to help \o/ - Augusto Carmo

1 Answers

1
votes

If you need to check the state of inverted colors I see just two possible solutions.

Manual check. Taken from this question:
Get enable/disable status and of accessibility Colour inversion mode

fun isInversionModeEnabled(): Boolean {
        var isInversionEnabled = false
        val accessibilityEnabled = try {
            Settings.Secure.getInt(contentResolver, Settings.Secure.ACCESSIBILITY_DISPLAY_INVERSION_ENABLED)
        } catch (e: Settings.SettingNotFoundException) {
            Log.d(TAG, "Error finding setting ACCESSIBILITY_DISPLAY_INVERSION_ENABLED: " + e.message)
            Log.d(TAG, "Checking negative color enabled status")
            val SEM_HIGH_CONTRAST = "high_contrast"
            Settings.System.getInt(contentResolver, SEM_HIGH_CONTRAST, 0)
        }
        if (accessibilityEnabled == 1) {
            Log.d(TAG, "inversion  or negative colour is enabled")
            isInversionEnabled = true
        } else {
            Log.d(TAG, "inversion  or negative colour is disabled")
        }
        return isInversionEnabled
    }

And also you can use AccessibilityService.
On inversion color changed i've got such event:

EventType: TYPE_VIEW_CLICKED; EventTime: 170718119; PackageName: com.android.systemui; 
MovementGranularity: 0; Action: 0; ContentChangeTypes: []; WindowChangeTypes: [] [
ClassName: android.widget.Switch; Text: [Invert colors]; ContentDescription: On;

So i can check the current state somehow like this:

override fun onAccessibilityEvent(event: AccessibilityEvent) {
        val isInvertedColorsChanged = event.text.contains("Invert colors")
        if (isInvertedColorsChanged) {
            val isEnabled = event.contentDescription == "On"
            //do what you need
        }
    }

I'm not sure it will work for every device.
I've never done it before, so maybe there is a better solution.