summaryrefslogtreecommitdiff
path: root/core/java/android/view/PointerIcon.java
diff options
context:
space:
mode:
authorAndrii Kulian <akulian@google.com>2018-10-05 16:58:39 -0700
committerArthur Hung <arthurhung@google.com>2019-01-17 10:34:36 +0800
commitfd8666df526a6fe317e4f3bb98a9dc2cbca872e5 (patch)
tree79f394fbcb87208bf310d0223cff766e319ce9a1 /core/java/android/view/PointerIcon.java
parenta67e674c2270a296aa9aacfe67560103424a28a5 (diff)
Load correct resources for pointer icon on external screen
When mouse pointer changes displays, it should also reload the icon from new resources. Otherwise, if the densities of the previous and new displays are different, the size of the pointer sprite will look too small or too large. - Add getDisplayContext to get the corresponding Context by displayId. - Cache system pointer icons per display, clear if display removed. - Fix icon moved to default when not resetting out of task bound. Bug: 113559891 Test: Enable mouse pointer on default display, move to other screen Change-Id: Ic42d0ec32d9c979281e13c83b9e8b57134fd4f0d
Diffstat (limited to 'core/java/android/view/PointerIcon.java')
-rw-r--r--core/java/android/view/PointerIcon.java54
1 files changed, 50 insertions, 4 deletions
diff --git a/core/java/android/view/PointerIcon.java b/core/java/android/view/PointerIcon.java
index cf11fd04efdf..c3d13bd46eb3 100644
--- a/core/java/android/view/PointerIcon.java
+++ b/core/java/android/view/PointerIcon.java
@@ -31,6 +31,7 @@ import android.graphics.RectF;
import android.graphics.drawable.AnimationDrawable;
import android.graphics.drawable.BitmapDrawable;
import android.graphics.drawable.Drawable;
+import android.hardware.display.DisplayManager;
import android.os.Build;
import android.os.Parcel;
import android.os.Parcelable;
@@ -144,7 +145,8 @@ public final class PointerIcon implements Parcelable {
public static final int TYPE_DEFAULT = TYPE_ARROW;
private static final PointerIcon gNullIcon = new PointerIcon(TYPE_NULL);
- private static final SparseArray<PointerIcon> gSystemIcons = new SparseArray<PointerIcon>();
+ private static final SparseArray<SparseArray<PointerIcon>> gSystemIconsByDisplay =
+ new SparseArray<SparseArray<PointerIcon>>();
private static boolean sUseLargeIcons = false;
@UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.P, trackingBug = 115609023)
@@ -163,6 +165,12 @@ public final class PointerIcon implements Parcelable {
@UnsupportedAppUsage
private int mDurationPerFrame;
+ /**
+ * Listener for displays lifecycle.
+ * @hide
+ */
+ private static DisplayManager.DisplayListener sDisplayListener;
+
private PointerIcon(int type) {
mType = type;
}
@@ -211,7 +219,19 @@ public final class PointerIcon implements Parcelable {
return gNullIcon;
}
- PointerIcon icon = gSystemIcons.get(type);
+ if (sDisplayListener == null) {
+ registerDisplayListener(context);
+ }
+
+ final int displayId = context.getDisplayId();
+ SparseArray<PointerIcon> systemIcons = gSystemIconsByDisplay.get(displayId);
+ if (systemIcons == null) {
+ systemIcons = new SparseArray<>();
+ gSystemIconsByDisplay.put(displayId, systemIcons);
+ }
+
+ PointerIcon icon = systemIcons.get(type);
+ // Reload if not in the same display.
if (icon != null) {
return icon;
}
@@ -240,7 +260,7 @@ public final class PointerIcon implements Parcelable {
} else {
icon.loadResource(context, context.getResources(), resourceId);
}
- gSystemIcons.append(type, icon);
+ systemIcons.append(type, icon);
return icon;
}
@@ -250,7 +270,7 @@ public final class PointerIcon implements Parcelable {
*/
public static void setUseLargeIcons(boolean use) {
sUseLargeIcons = use;
- gSystemIcons.clear();
+ gSystemIconsByDisplay.clear();
}
/**
@@ -576,4 +596,30 @@ public final class PointerIcon implements Parcelable {
return 0;
}
}
+
+ /**
+ * Manage system icon cache handled by display lifecycle.
+ * @param context The context.
+ */
+ private static void registerDisplayListener(@NonNull Context context) {
+ sDisplayListener = new DisplayManager.DisplayListener() {
+ @Override
+ public void onDisplayAdded(int displayId) {
+ }
+
+ @Override
+ public void onDisplayRemoved(int displayId) {
+ gSystemIconsByDisplay.remove(displayId);
+ }
+
+ @Override
+ public void onDisplayChanged(int displayId) {
+ gSystemIconsByDisplay.remove(displayId);
+ }
+ };
+
+ DisplayManager displayManager = context.getSystemService(DisplayManager.class);
+ displayManager.registerDisplayListener(sDisplayListener, null /* handler */);
+ }
+
}