summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Prabir Pradhan <prabirmsp@google.com> 2024-07-13 04:27:56 +0000
committer Android Build Cherrypicker Worker <android-build-cherrypicker-worker@google.com> 2024-07-13 04:27:56 +0000
commitff5bf8798d79b18b7a88c0488b37849c11e752d6 (patch)
tree4a13980dc73d07419f4947b188614c53a3d1a7fd
parentd7a24e9a89bf02f357ef823cf06421321c1210bd (diff)
PointerIcon: Add leniency to hotspot validation for scaled icons
When icons are loaded for the current display density, the icon bitmap is always scaled to an integer pixel size, but the hotspot can be scaled more precisely using floats. To account for the difference in precision, add leniency to the hotspot validation checks when the icons are scaled. Bug: 332973446 Test: adb shell wm density 142 (cherry picked from https://googleplex-android-review.googlesource.com/q/commit:f3c4cd5db78b2082eba3b3029d69302783d65e3d) Merged-In: I4af5d6619aa7f5245054047ad079694b11919754 Change-Id: I4af5d6619aa7f5245054047ad079694b11919754
-rw-r--r--core/java/android/view/PointerIcon.java17
1 files changed, 12 insertions, 5 deletions
diff --git a/core/java/android/view/PointerIcon.java b/core/java/android/view/PointerIcon.java
index 9099f9855eab..7eb6f2e2b331 100644
--- a/core/java/android/view/PointerIcon.java
+++ b/core/java/android/view/PointerIcon.java
@@ -284,7 +284,7 @@ public final class PointerIcon implements Parcelable {
if (bitmap == null) {
throw new IllegalArgumentException("bitmap must not be null");
}
- validateHotSpot(bitmap, hotSpotX, hotSpotY);
+ validateHotSpot(bitmap, hotSpotX, hotSpotY, false /* isScaled */);
PointerIcon icon = new PointerIcon(TYPE_CUSTOM);
icon.mBitmap = bitmap;
@@ -517,7 +517,9 @@ public final class PointerIcon implements Parcelable {
BitmapDrawable bitmapDrawable = (BitmapDrawable) drawable;
final Bitmap bitmap = getBitmapFromDrawable(bitmapDrawable);
- validateHotSpot(bitmap, hotSpotX, hotSpotY);
+ // The bitmap and hotspot are loaded from the context, which means it is implicitly scaled
+ // to the current display density, so treat this as a scaled icon when verifying hotspot.
+ validateHotSpot(bitmap, hotSpotX, hotSpotY, true /* isScaled */);
// Set the properties now that we have successfully loaded the icon.
mBitmap = bitmap;
mHotSpotX = hotSpotX;
@@ -531,11 +533,16 @@ public final class PointerIcon implements Parcelable {
+ ", hotspotX=" + mHotSpotX + ", hotspotY=" + mHotSpotY + "}";
}
- private static void validateHotSpot(Bitmap bitmap, float hotSpotX, float hotSpotY) {
- if (hotSpotX < 0 || hotSpotX >= bitmap.getWidth()) {
+ private static void validateHotSpot(Bitmap bitmap, float hotSpotX, float hotSpotY,
+ boolean isScaled) {
+ // Be more lenient when checking the hotspot for scaled icons to account for the restriction
+ // that bitmaps must have an integer size.
+ if (hotSpotX < 0 || (isScaled ? (int) hotSpotX > bitmap.getWidth()
+ : hotSpotX >= bitmap.getWidth())) {
throw new IllegalArgumentException("x hotspot lies outside of the bitmap area");
}
- if (hotSpotY < 0 || hotSpotY >= bitmap.getHeight()) {
+ if (hotSpotY < 0 || (isScaled ? (int) hotSpotY > bitmap.getHeight()
+ : hotSpotY >= bitmap.getHeight())) {
throw new IllegalArgumentException("y hotspot lies outside of the bitmap area");
}
}