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

Commit 73396979 authored by Treehugger Robot's avatar Treehugger Robot Committed by Android (Google) Code Review
Browse files

Merge "InputManagerService: Reload pointer icons only when density changes" into main

parents 39d7066d c07330f6
Loading
Loading
Loading
Loading
+41 −5
Original line number Diff line number Diff line
@@ -86,7 +86,9 @@ import android.util.Log;
import android.util.Slog;
import android.util.SparseArray;
import android.util.SparseBooleanArray;
import android.util.SparseIntArray;
import android.view.Display;
import android.view.DisplayInfo;
import android.view.IInputFilter;
import android.view.IInputFilterHost;
import android.view.IInputMonitorHost;
@@ -415,11 +417,15 @@ public class InputManagerService extends IInputManager.Stub
    boolean mUseLargePointerIcons = false;
    @GuardedBy("mLoadedPointerIconsByDisplayAndType")
    final SparseArray<Context> mDisplayContexts = new SparseArray<>();
    @GuardedBy("mLoadedPointerIconsByDisplayAndType")
    final SparseIntArray mDisplayDensities = new SparseIntArray();

    final DisplayManager.DisplayListener mDisplayListener = new DisplayManager.DisplayListener() {
        @Override
        public void onDisplayAdded(int displayId) {

            synchronized (mLoadedPointerIconsByDisplayAndType) {
                updateDisplayDensity(displayId);
            }
        }

        @Override
@@ -427,14 +433,20 @@ public class InputManagerService extends IInputManager.Stub
            synchronized (mLoadedPointerIconsByDisplayAndType) {
                mLoadedPointerIconsByDisplayAndType.remove(displayId);
                mDisplayContexts.remove(displayId);
                mDisplayDensities.delete(displayId);
            }
        }

        @Override
        public void onDisplayChanged(int displayId) {
            synchronized (mLoadedPointerIconsByDisplayAndType) {
                // The display density could have changed, so force all cached pointer icons to be
                if (!updateDisplayDensity(displayId)) {
                    return;
                }
                // The display density changed, so force all cached pointer icons to be
                // reloaded for the display.
                Slog.i(TAG,
                        "Reloading pointer icons due to density change on display: " + displayId);
                var iconsByType = mLoadedPointerIconsByDisplayAndType.get(displayId);
                if (iconsByType == null) {
                    return;
@@ -444,6 +456,26 @@ public class InputManagerService extends IInputManager.Stub
            }
            mNative.reloadPointerIcons();
        }

        // Updates the cached display density for the given displayId, and returns true if
        // the cached density changed.
        @GuardedBy("mLoadedPointerIconsByDisplayAndType")
        private boolean updateDisplayDensity(int displayId) {
            final DisplayManager displayManager = Objects.requireNonNull(
                    mContext.getSystemService(DisplayManager.class));
            final Display display = displayManager.getDisplay(displayId);
            if (display == null) {
                return false;
            }
            DisplayInfo info = new DisplayInfo();
            display.getDisplayInfo(info);
            final int oldDensity = mDisplayDensities.get(displayId, 0 /* default */);
            if (oldDensity == info.logicalDensityDpi) {
                return false;
            }
            mDisplayDensities.put(displayId, info.logicalDensityDpi);
            return true;
        }
    };

    /** Point of injection for test dependencies. */
@@ -613,9 +645,13 @@ public class InputManagerService extends IInputManager.Stub
            mWiredAccessoryCallbacks.systemReady();
        }

        Objects.requireNonNull(
                mContext.getSystemService(DisplayManager.class)).registerDisplayListener(
                mDisplayListener, mHandler);
        final DisplayManager displayManager = Objects.requireNonNull(
                mContext.getSystemService(DisplayManager.class));
        displayManager.registerDisplayListener(mDisplayListener, mHandler);
        final Display[] displays = displayManager.getDisplays();
        for (int i = 0; i < displays.length; i++) {
            mDisplayListener.onDisplayAdded(displays[i].getDisplayId());
        }

        mKeyboardLayoutManager.systemRunning();
        mBatteryController.systemRunning();