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

Commit c3aeb052 authored by Tyler Freeman's avatar Tyler Freeman
Browse files

fix(force invert): listen for changes to force invert setting

Ensure that the app reacts when the user changes the force invert
preference in Settings.

Bug: 312289375
Test: manual:
1. Open Settings or some other app in light mode.
1. adb shell device_config set_sync_disabled_for_tests persistent && adb shell device_config put accessibility android.view.accessibility.force_invert_color true && adb shell settings put secure accessibility_force_invert_color_enabled 1
2. Color of the current app should change to be dark

Flag: android.view.accessibility.Flags.forceInvertColor

Change-Id: I39a78d640fe939a110d703343865fe8a88fad020
parent a16cb467
Loading
Loading
Loading
Loading
+30 −0
Original line number Diff line number Diff line
@@ -120,6 +120,7 @@ import android.content.res.CompatibilityInfo;
import android.content.res.Configuration;
import android.content.res.Resources;
import android.content.res.TypedArray;
import android.database.ContentObserver;
import android.graphics.BLASTBufferQueue;
import android.graphics.Canvas;
import android.graphics.Color;
@@ -390,6 +391,9 @@ public final class ViewRootImpl implements ViewParent,
     */
    private CompatOnBackInvokedCallback mCompatOnBackInvokedCallback;

    @Nullable
    private ContentObserver mForceInvertObserver;

    /**
     * Callback for notifying about global configuration changes.
     */
@@ -1598,6 +1602,24 @@ public final class ViewRootImpl implements ViewParent,
                        | DisplayManager.EVENT_FLAG_DISPLAY_CHANGED
                        | DisplayManager.EVENT_FLAG_DISPLAY_REMOVED,
                        mBasePackageName);

        if (forceInvertColor()) {
            if (mForceInvertObserver == null) {
                mForceInvertObserver = new ContentObserver(mHandler) {
                    @Override
                    public void onChange(boolean selfChange) {
                        updateForceDarkMode();
                    }
                };
                mContext.getContentResolver().registerContentObserver(
                        Settings.Secure.getUriFor(
                                Settings.Secure.ACCESSIBILITY_FORCE_INVERT_COLOR_ENABLED
                        ),
                        false,
                        mForceInvertObserver,
                        UserHandle.myUserId());
            }
        }
    }

    /**
@@ -1611,6 +1633,14 @@ public final class ViewRootImpl implements ViewParent,
        DisplayManagerGlobal
                .getInstance()
                .unregisterDisplayListener(mDisplayListener);

        if (forceInvertColor()) {
            if (mForceInvertObserver != null) {
                mContext.getContentResolver().unregisterContentObserver(mForceInvertObserver);
                mForceInvertObserver = null;
            }
        }

        if (mExtraDisplayListenerLogging) {
            Slog.w(mTag, "Unregister listeners: " + mBasePackageName, new Throwable());
        }