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

Commit 3c4925ca authored by Pat Manning's avatar Pat Manning
Browse files

Add support for VectorDrawables into PointerIcon.

Bug: 305193969
Test: Manual
Flag: ACONFIG com.android.systemui.enable_vector_cursors DEVELOPMENT
Change-Id: I6e67faa7f9d9a5e628709cb7ecd8fd6f018fb349
parent 98a766e4
Loading
Loading
Loading
Loading
+28 −3
Original line number Diff line number Diff line
@@ -32,6 +32,7 @@ import android.graphics.RectF;
import android.graphics.drawable.AnimationDrawable;
import android.graphics.drawable.BitmapDrawable;
import android.graphics.drawable.Drawable;
import android.graphics.drawable.VectorDrawable;
import android.os.Build;
import android.os.Parcel;
import android.os.Parcelable;
@@ -173,6 +174,8 @@ public final class PointerIcon implements Parcelable {
    private Bitmap mBitmapFrames[];
    @UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.R, trackingBug = 170729553)
    private int mDurationPerFrame;
    @SuppressWarnings("unused")
    private boolean mDrawNativeDropShadow;

    private PointerIcon(int type) {
        mType = type;
@@ -231,9 +234,15 @@ public final class PointerIcon implements Parcelable {
            typeIndex = getSystemIconTypeIndex(TYPE_DEFAULT);
        }

        final int defStyle = useLargeIcons
                ? com.android.internal.R.style.LargePointer
                : com.android.internal.R.style.Pointer;
        final int defStyle;
        // TODO(b/305193969): Use scaled vectors when large icons are requested.
        if (useLargeIcons) {
            defStyle = com.android.internal.R.style.LargePointer;
        } else if (android.view.flags.Flags.enableVectorCursors()) {
            defStyle = com.android.internal.R.style.VectorPointer;
        } else {
            defStyle = com.android.internal.R.style.Pointer;
        }
        TypedArray a = context.obtainStyledAttributes(null,
                com.android.internal.R.styleable.Pointer,
                0, defStyle);
@@ -333,6 +342,7 @@ public final class PointerIcon implements Parcelable {
                                    Bitmap.CREATOR.createFromParcel(in),
                                    in.readFloat(),
                                    in.readFloat());
                    icon.mDrawNativeDropShadow = in.readBoolean();
                    return icon;
                }

@@ -362,6 +372,7 @@ public final class PointerIcon implements Parcelable {
        mBitmap.writeToParcel(out, flags);
        out.writeFloat(mHotSpotX);
        out.writeFloat(mHotSpotY);
        out.writeBoolean(mDrawNativeDropShadow);
    }

    @Override
@@ -415,6 +426,16 @@ public final class PointerIcon implements Parcelable {
        return scaled;
    }

    private BitmapDrawable getBitmapDrawableFromVectorDrawable(Resources resources,
            VectorDrawable vectorDrawable) {
        Bitmap bitmap = Bitmap.createBitmap(vectorDrawable.getIntrinsicWidth(),
                vectorDrawable.getIntrinsicHeight(), Bitmap.Config.ARGB_8888);
        Canvas canvas = new Canvas(bitmap);
        vectorDrawable.setBounds(0, 0, canvas.getWidth(), canvas.getHeight());
        vectorDrawable.draw(canvas);
        return new BitmapDrawable(resources, bitmap);
    }

    private void loadResource(Context context, Resources resources, @XmlRes int resourceId) {
        final XmlResourceParser parser = resources.getXml(resourceId);
        final int bitmapRes;
@@ -476,6 +497,10 @@ public final class PointerIcon implements Parcelable {
                }
            }
        }
        if (drawable instanceof VectorDrawable) {
            mDrawNativeDropShadow = true;
            drawable = getBitmapDrawableFromVectorDrawable(resources, (VectorDrawable) drawable);
        }
        if (!(drawable instanceof BitmapDrawable)) {
            throw new IllegalArgumentException("<pointer-icon> bitmap attribute must "
                    + "refer to a bitmap drawable.");
+8 −0
Original line number Diff line number Diff line
@@ -24,3 +24,11 @@ flag {
    bug: "316170253"
    is_fixed_read_only: true
}

flag {
    name: "enable_vector_cursors"
    namespace: "systemui"
    description: "Feature flag to enable vector drawables in addition to bitmaps for PointerIcon."
    bug: "305193969"
    is_fixed_read_only: true
}
+37 −0
Original line number Diff line number Diff line
@@ -1459,6 +1459,43 @@ please see styles_device_defaults.xml.
        <item name="pointerIconHandwriting">@drawable/pointer_handwriting_icon</item>
    </style>

    <!-- @hide -->
    <style name="VectorPointer">
        <item name="pointerIconArrow">@drawable/pointer_arrow_icon</item>
        <item name="pointerIconSpotHover">@drawable/pointer_spot_hover_icon</item>
        <item name="pointerIconSpotTouch">@drawable/pointer_spot_touch_icon</item>
        <item name="pointerIconSpotAnchor">@drawable/pointer_spot_anchor_icon</item>
        <item name="pointerIconHand">@drawable/pointer_hand_icon</item>
        <item name="pointerIconContextMenu">@drawable/pointer_context_menu_icon</item>
        <item name="pointerIconHelp">@drawable/pointer_help_icon</item>
        <item name="pointerIconWait">@drawable/pointer_wait_icon</item>
        <item name="pointerIconCell">@drawable/pointer_cell_icon</item>
        <item name="pointerIconCrosshair">@drawable/pointer_crosshair_icon</item>
        <item name="pointerIconText">@drawable/pointer_text_icon</item>
        <item name="pointerIconVerticalText">@drawable/pointer_vertical_text_icon</item>
        <item name="pointerIconAlias">@drawable/pointer_alias_icon</item>
        <item name="pointerIconCopy">@drawable/pointer_copy_icon</item>
        <item name="pointerIconAllScroll">@drawable/pointer_all_scroll_icon</item>
        <item name="pointerIconNodrop">@drawable/pointer_nodrop_icon</item>
        <item name="pointerIconHorizontalDoubleArrow">
            @drawable/pointer_horizontal_double_arrow_icon
        </item>
        <item name="pointerIconVerticalDoubleArrow">
            @drawable/pointer_vertical_double_arrow_icon
        </item>
        <item name="pointerIconTopRightDiagonalDoubleArrow">
            @drawable/pointer_top_right_diagonal_double_arrow_icon
        </item>
        <item name="pointerIconTopLeftDiagonalDoubleArrow">
            @drawable/pointer_top_left_diagonal_double_arrow_icon
        </item>
        <item name="pointerIconZoomIn">@drawable/pointer_zoom_in_icon</item>
        <item name="pointerIconZoomOut">@drawable/pointer_zoom_out_icon</item>
        <item name="pointerIconGrab">@drawable/pointer_grab_icon</item>
        <item name="pointerIconGrabbing">@drawable/pointer_grabbing_icon</item>
        <item name="pointerIconHandwriting">@drawable/pointer_handwriting_icon</item>
    </style>

    <!-- @hide -->
    <style name="aerr_list_item" parent="Widget.Material.Light.Button.Borderless">
        <item name="minHeight">?attr/listPreferredItemHeightSmall</item>
+1 −0
Original line number Diff line number Diff line
@@ -1671,6 +1671,7 @@
  <java-symbol type="style" name="Theme.DeviceDefault.VoiceInteractionSession" />
  <java-symbol type="style" name="Pointer" />
  <java-symbol type="style" name="LargePointer" />
  <java-symbol type="style" name="VectorPointer" />
  <java-symbol type="style" name="TextAppearance.DeviceDefault.Notification.Title" />
  <java-symbol type="style" name="TextAppearance.DeviceDefault.Notification.Info" />