diff --git a/core/java/android/view/PointerIcon.java b/core/java/android/view/PointerIcon.java index 88e9a952f778c..b61706ef44243 100644 --- a/core/java/android/view/PointerIcon.java +++ b/core/java/android/view/PointerIcon.java @@ -24,6 +24,7 @@ import android.content.res.Resources; import android.content.res.TypedArray; import android.content.res.XmlResourceParser; import android.graphics.Bitmap; +import android.graphics.drawable.AnimationDrawable; import android.graphics.drawable.BitmapDrawable; import android.graphics.drawable.Drawable; import android.os.Parcel; @@ -142,6 +143,10 @@ public final class PointerIcon implements Parcelable { private Bitmap mBitmap; private float mHotSpotX; private float mHotSpotY; + // The bitmaps for the additional frame of animated pointer icon. Note that the first frame + // will be stored in mBitmap. + private Bitmap mBitmapFrames[]; + private int mDurationPerFrame; private PointerIcon(int style) { mStyle = style; @@ -472,6 +477,36 @@ public final class PointerIcon implements Parcelable { } else { drawable = context.getDrawable(bitmapRes); } + if (drawable instanceof AnimationDrawable) { + // Extract animation frame bitmaps. + final AnimationDrawable animationDrawable = (AnimationDrawable) drawable; + final int frames = animationDrawable.getNumberOfFrames(); + drawable = animationDrawable.getFrame(0); + if (frames == 1) { + Log.w(TAG, "Animation icon with single frame -- simply treating the first " + + "frame as a normal bitmap icon."); + } else { + // Assumes they have the exact duration. + mDurationPerFrame = animationDrawable.getDuration(0); + mBitmapFrames = new Bitmap[frames - 1]; + final int width = drawable.getIntrinsicWidth(); + final int height = drawable.getIntrinsicHeight(); + for (int i = 1; i < frames; ++i) { + Drawable drawableFrame = animationDrawable.getFrame(i); + if (!(drawableFrame instanceof BitmapDrawable)) { + throw new IllegalArgumentException("Frame of an animated pointer icon " + + "must refer to a bitmap drawable."); + } + if (drawableFrame.getIntrinsicWidth() != width || + drawableFrame.getIntrinsicHeight() != height) { + throw new IllegalArgumentException("The bitmap size of " + i + "-th frame " + + "is different. All frames should have the exact same size and " + + "share the same hotspot."); + } + mBitmapFrames[i - 1] = ((BitmapDrawable)drawableFrame).getBitmap(); + } + } + } if (!(drawable instanceof BitmapDrawable)) { throw new IllegalArgumentException(" bitmap attribute must " + "refer to a bitmap drawable."); @@ -509,8 +544,7 @@ public final class PointerIcon implements Parcelable { case STYLE_HELP: return com.android.internal.R.styleable.Pointer_pointerIconHelp; case STYLE_WAIT: - // falls back to the default icon because no animation support. - return com.android.internal.R.styleable.Pointer_pointerIconArrow; + return com.android.internal.R.styleable.Pointer_pointerIconWait; case STYLE_CELL: return com.android.internal.R.styleable.Pointer_pointerIconCell; case STYLE_CROSSHAIR: diff --git a/core/jni/android_view_PointerIcon.cpp b/core/jni/android_view_PointerIcon.cpp index d04adbfc742b4..d7e2c028a23ff 100644 --- a/core/jni/android_view_PointerIcon.cpp +++ b/core/jni/android_view_PointerIcon.cpp @@ -24,6 +24,7 @@ #include #include #include +#include "ScopedLocalRef.h" #include "core_jni_helpers.h" @@ -35,6 +36,8 @@ static struct { jfieldID mBitmap; jfieldID mHotSpotX; jfieldID mHotSpotY; + jfieldID mBitmapFrames; + jfieldID mDurationPerFrame; jmethodID getSystemIcon; jmethodID load; } gPointerIconClassInfo; @@ -84,6 +87,19 @@ status_t android_view_PointerIcon_load(JNIEnv* env, jobject pointerIconObj, jobj env->DeleteLocalRef(bitmapObj); } + ScopedLocalRef bitmapFramesObj(env, reinterpret_cast( + env->GetObjectField(loadedPointerIconObj, gPointerIconClassInfo.mBitmapFrames))); + if (bitmapFramesObj.get()) { + outPointerIcon->durationPerFrame = env->GetIntField( + loadedPointerIconObj, gPointerIconClassInfo.mDurationPerFrame); + jsize size = env->GetArrayLength(bitmapFramesObj.get()); + outPointerIcon->bitmapFrames.resize(size); + for (jsize i = 0; i < size; ++i) { + ScopedLocalRef bitmapObj(env, env->GetObjectArrayElement(bitmapFramesObj.get(), i)); + GraphicsJNI::getSkBitmap(env, bitmapObj.get(), &(outPointerIcon->bitmapFrames[i])); + } + } + env->DeleteLocalRef(loadedPointerIconObj); return OK; } @@ -121,6 +137,12 @@ int register_android_view_PointerIcon(JNIEnv* env) { gPointerIconClassInfo.mHotSpotY = GetFieldIDOrDie(env, gPointerIconClassInfo.clazz, "mHotSpotY", "F"); + gPointerIconClassInfo.mBitmapFrames = GetFieldIDOrDie(env, gPointerIconClassInfo.clazz, + "mBitmapFrames", "[Landroid/graphics/Bitmap;"); + + gPointerIconClassInfo.mDurationPerFrame = GetFieldIDOrDie(env, gPointerIconClassInfo.clazz, + "mDurationPerFrame", "I"); + gPointerIconClassInfo.getSystemIcon = GetStaticMethodIDOrDie(env, gPointerIconClassInfo.clazz, "getSystemIcon", "(Landroid/content/Context;I)Landroid/view/PointerIcon;"); diff --git a/core/jni/android_view_PointerIcon.h b/core/jni/android_view_PointerIcon.h index 86f288d0d7114..ca080850df940 100644 --- a/core/jni/android_view_PointerIcon.h +++ b/core/jni/android_view_PointerIcon.h @@ -19,6 +19,8 @@ #include "jni.h" +#include + #include #include @@ -69,6 +71,8 @@ struct PointerIcon { SkBitmap bitmap; float hotSpotX; float hotSpotY; + std::vector bitmapFrames; + int32_t durationPerFrame; inline bool isNullIcon() { return style == POINTER_ICON_STYLE_NULL; @@ -79,6 +83,8 @@ struct PointerIcon { bitmap.reset(); hotSpotX = 0; hotSpotY = 0; + bitmapFrames.clear(); + durationPerFrame = 0; } }; diff --git a/core/res/res/drawable-mdpi/pointer_wait_0.png b/core/res/res/drawable-mdpi/pointer_wait_0.png new file mode 100644 index 0000000000000..adb78064f03cc Binary files /dev/null and b/core/res/res/drawable-mdpi/pointer_wait_0.png differ diff --git a/core/res/res/drawable-mdpi/pointer_wait_1.png b/core/res/res/drawable-mdpi/pointer_wait_1.png new file mode 100644 index 0000000000000..fc6b42fbb8564 Binary files /dev/null and b/core/res/res/drawable-mdpi/pointer_wait_1.png differ diff --git a/core/res/res/drawable-mdpi/pointer_wait_10.png b/core/res/res/drawable-mdpi/pointer_wait_10.png new file mode 100644 index 0000000000000..02968b524ff17 Binary files /dev/null and b/core/res/res/drawable-mdpi/pointer_wait_10.png differ diff --git a/core/res/res/drawable-mdpi/pointer_wait_11.png b/core/res/res/drawable-mdpi/pointer_wait_11.png new file mode 100644 index 0000000000000..24f866bf1d41e Binary files /dev/null and b/core/res/res/drawable-mdpi/pointer_wait_11.png differ diff --git a/core/res/res/drawable-mdpi/pointer_wait_12.png b/core/res/res/drawable-mdpi/pointer_wait_12.png new file mode 100644 index 0000000000000..d1a31bc5bce43 Binary files /dev/null and b/core/res/res/drawable-mdpi/pointer_wait_12.png differ diff --git a/core/res/res/drawable-mdpi/pointer_wait_13.png b/core/res/res/drawable-mdpi/pointer_wait_13.png new file mode 100644 index 0000000000000..b0c679862384e Binary files /dev/null and b/core/res/res/drawable-mdpi/pointer_wait_13.png differ diff --git a/core/res/res/drawable-mdpi/pointer_wait_14.png b/core/res/res/drawable-mdpi/pointer_wait_14.png new file mode 100644 index 0000000000000..721e86d168a00 Binary files /dev/null and b/core/res/res/drawable-mdpi/pointer_wait_14.png differ diff --git a/core/res/res/drawable-mdpi/pointer_wait_15.png b/core/res/res/drawable-mdpi/pointer_wait_15.png new file mode 100644 index 0000000000000..adb019909813c Binary files /dev/null and b/core/res/res/drawable-mdpi/pointer_wait_15.png differ diff --git a/core/res/res/drawable-mdpi/pointer_wait_16.png b/core/res/res/drawable-mdpi/pointer_wait_16.png new file mode 100644 index 0000000000000..3695c18f63973 Binary files /dev/null and b/core/res/res/drawable-mdpi/pointer_wait_16.png differ diff --git a/core/res/res/drawable-mdpi/pointer_wait_17.png b/core/res/res/drawable-mdpi/pointer_wait_17.png new file mode 100644 index 0000000000000..861605e20f829 Binary files /dev/null and b/core/res/res/drawable-mdpi/pointer_wait_17.png differ diff --git a/core/res/res/drawable-mdpi/pointer_wait_18.png b/core/res/res/drawable-mdpi/pointer_wait_18.png new file mode 100644 index 0000000000000..f5dfdcf69af4f Binary files /dev/null and b/core/res/res/drawable-mdpi/pointer_wait_18.png differ diff --git a/core/res/res/drawable-mdpi/pointer_wait_19.png b/core/res/res/drawable-mdpi/pointer_wait_19.png new file mode 100644 index 0000000000000..9d51f79208d51 Binary files /dev/null and b/core/res/res/drawable-mdpi/pointer_wait_19.png differ diff --git a/core/res/res/drawable-mdpi/pointer_wait_2.png b/core/res/res/drawable-mdpi/pointer_wait_2.png new file mode 100644 index 0000000000000..d73a1542165ee Binary files /dev/null and b/core/res/res/drawable-mdpi/pointer_wait_2.png differ diff --git a/core/res/res/drawable-mdpi/pointer_wait_20.png b/core/res/res/drawable-mdpi/pointer_wait_20.png new file mode 100644 index 0000000000000..81d1d51f680b2 Binary files /dev/null and b/core/res/res/drawable-mdpi/pointer_wait_20.png differ diff --git a/core/res/res/drawable-mdpi/pointer_wait_21.png b/core/res/res/drawable-mdpi/pointer_wait_21.png new file mode 100644 index 0000000000000..331820bccce87 Binary files /dev/null and b/core/res/res/drawable-mdpi/pointer_wait_21.png differ diff --git a/core/res/res/drawable-mdpi/pointer_wait_22.png b/core/res/res/drawable-mdpi/pointer_wait_22.png new file mode 100644 index 0000000000000..2678d32044243 Binary files /dev/null and b/core/res/res/drawable-mdpi/pointer_wait_22.png differ diff --git a/core/res/res/drawable-mdpi/pointer_wait_23.png b/core/res/res/drawable-mdpi/pointer_wait_23.png new file mode 100644 index 0000000000000..d54d9eb77b8d6 Binary files /dev/null and b/core/res/res/drawable-mdpi/pointer_wait_23.png differ diff --git a/core/res/res/drawable-mdpi/pointer_wait_24.png b/core/res/res/drawable-mdpi/pointer_wait_24.png new file mode 100644 index 0000000000000..442ace7c9af2b Binary files /dev/null and b/core/res/res/drawable-mdpi/pointer_wait_24.png differ diff --git a/core/res/res/drawable-mdpi/pointer_wait_25.png b/core/res/res/drawable-mdpi/pointer_wait_25.png new file mode 100644 index 0000000000000..27ce60da8e4aa Binary files /dev/null and b/core/res/res/drawable-mdpi/pointer_wait_25.png differ diff --git a/core/res/res/drawable-mdpi/pointer_wait_26.png b/core/res/res/drawable-mdpi/pointer_wait_26.png new file mode 100644 index 0000000000000..8143634e9256f Binary files /dev/null and b/core/res/res/drawable-mdpi/pointer_wait_26.png differ diff --git a/core/res/res/drawable-mdpi/pointer_wait_27.png b/core/res/res/drawable-mdpi/pointer_wait_27.png new file mode 100644 index 0000000000000..496ab9a0509f4 Binary files /dev/null and b/core/res/res/drawable-mdpi/pointer_wait_27.png differ diff --git a/core/res/res/drawable-mdpi/pointer_wait_28.png b/core/res/res/drawable-mdpi/pointer_wait_28.png new file mode 100644 index 0000000000000..a2aab2bf6262e Binary files /dev/null and b/core/res/res/drawable-mdpi/pointer_wait_28.png differ diff --git a/core/res/res/drawable-mdpi/pointer_wait_29.png b/core/res/res/drawable-mdpi/pointer_wait_29.png new file mode 100644 index 0000000000000..646d15366f5a6 Binary files /dev/null and b/core/res/res/drawable-mdpi/pointer_wait_29.png differ diff --git a/core/res/res/drawable-mdpi/pointer_wait_3.png b/core/res/res/drawable-mdpi/pointer_wait_3.png new file mode 100644 index 0000000000000..9f45afeebf855 Binary files /dev/null and b/core/res/res/drawable-mdpi/pointer_wait_3.png differ diff --git a/core/res/res/drawable-mdpi/pointer_wait_30.png b/core/res/res/drawable-mdpi/pointer_wait_30.png new file mode 100644 index 0000000000000..27b3fc40f1e15 Binary files /dev/null and b/core/res/res/drawable-mdpi/pointer_wait_30.png differ diff --git a/core/res/res/drawable-mdpi/pointer_wait_31.png b/core/res/res/drawable-mdpi/pointer_wait_31.png new file mode 100644 index 0000000000000..6dbe184c4f647 Binary files /dev/null and b/core/res/res/drawable-mdpi/pointer_wait_31.png differ diff --git a/core/res/res/drawable-mdpi/pointer_wait_32.png b/core/res/res/drawable-mdpi/pointer_wait_32.png new file mode 100644 index 0000000000000..9f072ef2fe356 Binary files /dev/null and b/core/res/res/drawable-mdpi/pointer_wait_32.png differ diff --git a/core/res/res/drawable-mdpi/pointer_wait_33.png b/core/res/res/drawable-mdpi/pointer_wait_33.png new file mode 100644 index 0000000000000..881ec5f97139b Binary files /dev/null and b/core/res/res/drawable-mdpi/pointer_wait_33.png differ diff --git a/core/res/res/drawable-mdpi/pointer_wait_34.png b/core/res/res/drawable-mdpi/pointer_wait_34.png new file mode 100644 index 0000000000000..94961e3a4b82a Binary files /dev/null and b/core/res/res/drawable-mdpi/pointer_wait_34.png differ diff --git a/core/res/res/drawable-mdpi/pointer_wait_35.png b/core/res/res/drawable-mdpi/pointer_wait_35.png new file mode 100644 index 0000000000000..dfa65d72b863b Binary files /dev/null and b/core/res/res/drawable-mdpi/pointer_wait_35.png differ diff --git a/core/res/res/drawable-mdpi/pointer_wait_4.png b/core/res/res/drawable-mdpi/pointer_wait_4.png new file mode 100644 index 0000000000000..5d3d652fa2313 Binary files /dev/null and b/core/res/res/drawable-mdpi/pointer_wait_4.png differ diff --git a/core/res/res/drawable-mdpi/pointer_wait_5.png b/core/res/res/drawable-mdpi/pointer_wait_5.png new file mode 100644 index 0000000000000..d440a82fa94ef Binary files /dev/null and b/core/res/res/drawable-mdpi/pointer_wait_5.png differ diff --git a/core/res/res/drawable-mdpi/pointer_wait_6.png b/core/res/res/drawable-mdpi/pointer_wait_6.png new file mode 100644 index 0000000000000..ae6559074c89a Binary files /dev/null and b/core/res/res/drawable-mdpi/pointer_wait_6.png differ diff --git a/core/res/res/drawable-mdpi/pointer_wait_7.png b/core/res/res/drawable-mdpi/pointer_wait_7.png new file mode 100644 index 0000000000000..cd84aa5d874d3 Binary files /dev/null and b/core/res/res/drawable-mdpi/pointer_wait_7.png differ diff --git a/core/res/res/drawable-mdpi/pointer_wait_8.png b/core/res/res/drawable-mdpi/pointer_wait_8.png new file mode 100644 index 0000000000000..0b81a9aeab25e Binary files /dev/null and b/core/res/res/drawable-mdpi/pointer_wait_8.png differ diff --git a/core/res/res/drawable-mdpi/pointer_wait_9.png b/core/res/res/drawable-mdpi/pointer_wait_9.png new file mode 100644 index 0000000000000..c13a90c19482c Binary files /dev/null and b/core/res/res/drawable-mdpi/pointer_wait_9.png differ diff --git a/core/res/res/drawable-xhdpi/pointer_wait_0.png b/core/res/res/drawable-xhdpi/pointer_wait_0.png new file mode 100644 index 0000000000000..5396784c20e83 Binary files /dev/null and b/core/res/res/drawable-xhdpi/pointer_wait_0.png differ diff --git a/core/res/res/drawable-xhdpi/pointer_wait_1.png b/core/res/res/drawable-xhdpi/pointer_wait_1.png new file mode 100644 index 0000000000000..25edbf5730113 Binary files /dev/null and b/core/res/res/drawable-xhdpi/pointer_wait_1.png differ diff --git a/core/res/res/drawable-xhdpi/pointer_wait_10.png b/core/res/res/drawable-xhdpi/pointer_wait_10.png new file mode 100644 index 0000000000000..96d93a9049ce8 Binary files /dev/null and b/core/res/res/drawable-xhdpi/pointer_wait_10.png differ diff --git a/core/res/res/drawable-xhdpi/pointer_wait_11.png b/core/res/res/drawable-xhdpi/pointer_wait_11.png new file mode 100644 index 0000000000000..cd78675c34ba8 Binary files /dev/null and b/core/res/res/drawable-xhdpi/pointer_wait_11.png differ diff --git a/core/res/res/drawable-xhdpi/pointer_wait_12.png b/core/res/res/drawable-xhdpi/pointer_wait_12.png new file mode 100644 index 0000000000000..1b2c7b218e4a9 Binary files /dev/null and b/core/res/res/drawable-xhdpi/pointer_wait_12.png differ diff --git a/core/res/res/drawable-xhdpi/pointer_wait_13.png b/core/res/res/drawable-xhdpi/pointer_wait_13.png new file mode 100644 index 0000000000000..3b00f101a5b4b Binary files /dev/null and b/core/res/res/drawable-xhdpi/pointer_wait_13.png differ diff --git a/core/res/res/drawable-xhdpi/pointer_wait_14.png b/core/res/res/drawable-xhdpi/pointer_wait_14.png new file mode 100644 index 0000000000000..eca5c3f50c6e9 Binary files /dev/null and b/core/res/res/drawable-xhdpi/pointer_wait_14.png differ diff --git a/core/res/res/drawable-xhdpi/pointer_wait_15.png b/core/res/res/drawable-xhdpi/pointer_wait_15.png new file mode 100644 index 0000000000000..0fc2085ac6fd8 Binary files /dev/null and b/core/res/res/drawable-xhdpi/pointer_wait_15.png differ diff --git a/core/res/res/drawable-xhdpi/pointer_wait_16.png b/core/res/res/drawable-xhdpi/pointer_wait_16.png new file mode 100644 index 0000000000000..db13cf61e018e Binary files /dev/null and b/core/res/res/drawable-xhdpi/pointer_wait_16.png differ diff --git a/core/res/res/drawable-xhdpi/pointer_wait_17.png b/core/res/res/drawable-xhdpi/pointer_wait_17.png new file mode 100644 index 0000000000000..9b6fac59d823c Binary files /dev/null and b/core/res/res/drawable-xhdpi/pointer_wait_17.png differ diff --git a/core/res/res/drawable-xhdpi/pointer_wait_18.png b/core/res/res/drawable-xhdpi/pointer_wait_18.png new file mode 100644 index 0000000000000..c56ff6c1a6f25 Binary files /dev/null and b/core/res/res/drawable-xhdpi/pointer_wait_18.png differ diff --git a/core/res/res/drawable-xhdpi/pointer_wait_19.png b/core/res/res/drawable-xhdpi/pointer_wait_19.png new file mode 100644 index 0000000000000..22b7c9099e4b5 Binary files /dev/null and b/core/res/res/drawable-xhdpi/pointer_wait_19.png differ diff --git a/core/res/res/drawable-xhdpi/pointer_wait_2.png b/core/res/res/drawable-xhdpi/pointer_wait_2.png new file mode 100644 index 0000000000000..4bdbe3fadfc77 Binary files /dev/null and b/core/res/res/drawable-xhdpi/pointer_wait_2.png differ diff --git a/core/res/res/drawable-xhdpi/pointer_wait_20.png b/core/res/res/drawable-xhdpi/pointer_wait_20.png new file mode 100644 index 0000000000000..6d042fb318f80 Binary files /dev/null and b/core/res/res/drawable-xhdpi/pointer_wait_20.png differ diff --git a/core/res/res/drawable-xhdpi/pointer_wait_21.png b/core/res/res/drawable-xhdpi/pointer_wait_21.png new file mode 100644 index 0000000000000..e3ab63fbe6277 Binary files /dev/null and b/core/res/res/drawable-xhdpi/pointer_wait_21.png differ diff --git a/core/res/res/drawable-xhdpi/pointer_wait_22.png b/core/res/res/drawable-xhdpi/pointer_wait_22.png new file mode 100644 index 0000000000000..b25f6b7dba47b Binary files /dev/null and b/core/res/res/drawable-xhdpi/pointer_wait_22.png differ diff --git a/core/res/res/drawable-xhdpi/pointer_wait_23.png b/core/res/res/drawable-xhdpi/pointer_wait_23.png new file mode 100644 index 0000000000000..49faba9095610 Binary files /dev/null and b/core/res/res/drawable-xhdpi/pointer_wait_23.png differ diff --git a/core/res/res/drawable-xhdpi/pointer_wait_24.png b/core/res/res/drawable-xhdpi/pointer_wait_24.png new file mode 100644 index 0000000000000..e91c340e3333f Binary files /dev/null and b/core/res/res/drawable-xhdpi/pointer_wait_24.png differ diff --git a/core/res/res/drawable-xhdpi/pointer_wait_25.png b/core/res/res/drawable-xhdpi/pointer_wait_25.png new file mode 100644 index 0000000000000..f4785c6d4fb7a Binary files /dev/null and b/core/res/res/drawable-xhdpi/pointer_wait_25.png differ diff --git a/core/res/res/drawable-xhdpi/pointer_wait_26.png b/core/res/res/drawable-xhdpi/pointer_wait_26.png new file mode 100644 index 0000000000000..ea902f80fde44 Binary files /dev/null and b/core/res/res/drawable-xhdpi/pointer_wait_26.png differ diff --git a/core/res/res/drawable-xhdpi/pointer_wait_27.png b/core/res/res/drawable-xhdpi/pointer_wait_27.png new file mode 100644 index 0000000000000..7d628c3886d3c Binary files /dev/null and b/core/res/res/drawable-xhdpi/pointer_wait_27.png differ diff --git a/core/res/res/drawable-xhdpi/pointer_wait_28.png b/core/res/res/drawable-xhdpi/pointer_wait_28.png new file mode 100644 index 0000000000000..92d6dc183b11d Binary files /dev/null and b/core/res/res/drawable-xhdpi/pointer_wait_28.png differ diff --git a/core/res/res/drawable-xhdpi/pointer_wait_29.png b/core/res/res/drawable-xhdpi/pointer_wait_29.png new file mode 100644 index 0000000000000..5a8d18915190f Binary files /dev/null and b/core/res/res/drawable-xhdpi/pointer_wait_29.png differ diff --git a/core/res/res/drawable-xhdpi/pointer_wait_3.png b/core/res/res/drawable-xhdpi/pointer_wait_3.png new file mode 100644 index 0000000000000..de4d79c80d353 Binary files /dev/null and b/core/res/res/drawable-xhdpi/pointer_wait_3.png differ diff --git a/core/res/res/drawable-xhdpi/pointer_wait_30.png b/core/res/res/drawable-xhdpi/pointer_wait_30.png new file mode 100644 index 0000000000000..ba04b5e8acb26 Binary files /dev/null and b/core/res/res/drawable-xhdpi/pointer_wait_30.png differ diff --git a/core/res/res/drawable-xhdpi/pointer_wait_31.png b/core/res/res/drawable-xhdpi/pointer_wait_31.png new file mode 100644 index 0000000000000..3ef8e9838a6e7 Binary files /dev/null and b/core/res/res/drawable-xhdpi/pointer_wait_31.png differ diff --git a/core/res/res/drawable-xhdpi/pointer_wait_32.png b/core/res/res/drawable-xhdpi/pointer_wait_32.png new file mode 100644 index 0000000000000..3297a7d15e5fe Binary files /dev/null and b/core/res/res/drawable-xhdpi/pointer_wait_32.png differ diff --git a/core/res/res/drawable-xhdpi/pointer_wait_33.png b/core/res/res/drawable-xhdpi/pointer_wait_33.png new file mode 100644 index 0000000000000..b0ac3b9655ed2 Binary files /dev/null and b/core/res/res/drawable-xhdpi/pointer_wait_33.png differ diff --git a/core/res/res/drawable-xhdpi/pointer_wait_34.png b/core/res/res/drawable-xhdpi/pointer_wait_34.png new file mode 100644 index 0000000000000..0eaa386232806 Binary files /dev/null and b/core/res/res/drawable-xhdpi/pointer_wait_34.png differ diff --git a/core/res/res/drawable-xhdpi/pointer_wait_35.png b/core/res/res/drawable-xhdpi/pointer_wait_35.png new file mode 100644 index 0000000000000..73894d8981c9c Binary files /dev/null and b/core/res/res/drawable-xhdpi/pointer_wait_35.png differ diff --git a/core/res/res/drawable-xhdpi/pointer_wait_4.png b/core/res/res/drawable-xhdpi/pointer_wait_4.png new file mode 100644 index 0000000000000..ea44e85ded920 Binary files /dev/null and b/core/res/res/drawable-xhdpi/pointer_wait_4.png differ diff --git a/core/res/res/drawable-xhdpi/pointer_wait_5.png b/core/res/res/drawable-xhdpi/pointer_wait_5.png new file mode 100644 index 0000000000000..46c399dc57e24 Binary files /dev/null and b/core/res/res/drawable-xhdpi/pointer_wait_5.png differ diff --git a/core/res/res/drawable-xhdpi/pointer_wait_6.png b/core/res/res/drawable-xhdpi/pointer_wait_6.png new file mode 100644 index 0000000000000..3b9aff69813d3 Binary files /dev/null and b/core/res/res/drawable-xhdpi/pointer_wait_6.png differ diff --git a/core/res/res/drawable-xhdpi/pointer_wait_7.png b/core/res/res/drawable-xhdpi/pointer_wait_7.png new file mode 100644 index 0000000000000..a54edc06e45fc Binary files /dev/null and b/core/res/res/drawable-xhdpi/pointer_wait_7.png differ diff --git a/core/res/res/drawable-xhdpi/pointer_wait_8.png b/core/res/res/drawable-xhdpi/pointer_wait_8.png new file mode 100644 index 0000000000000..2f30732dbc579 Binary files /dev/null and b/core/res/res/drawable-xhdpi/pointer_wait_8.png differ diff --git a/core/res/res/drawable-xhdpi/pointer_wait_9.png b/core/res/res/drawable-xhdpi/pointer_wait_9.png new file mode 100644 index 0000000000000..f39c7a753959a Binary files /dev/null and b/core/res/res/drawable-xhdpi/pointer_wait_9.png differ diff --git a/core/res/res/drawable/pointer_wait.xml b/core/res/res/drawable/pointer_wait.xml new file mode 100644 index 0000000000000..8955ce8dd4184 --- /dev/null +++ b/core/res/res/drawable/pointer_wait.xml @@ -0,0 +1,38 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/core/res/res/drawable/pointer_wait_icon.xml b/core/res/res/drawable/pointer_wait_icon.xml new file mode 100644 index 0000000000000..d9b03b096093e --- /dev/null +++ b/core/res/res/drawable/pointer_wait_icon.xml @@ -0,0 +1,5 @@ + + diff --git a/core/res/res/values/attrs.xml b/core/res/res/values/attrs.xml index 90fc22b8b3b81..0f817f3302848 100644 --- a/core/res/res/values/attrs.xml +++ b/core/res/res/values/attrs.xml @@ -7631,6 +7631,8 @@ i + + diff --git a/core/res/res/values/styles.xml b/core/res/res/values/styles.xml index b831df827a8c8..eb99077beff6b 100644 --- a/core/res/res/values/styles.xml +++ b/core/res/res/values/styles.xml @@ -1339,6 +1339,7 @@ please see styles_device_defaults.xml. @drawable/pointer_hand_icon @drawable/pointer_context_menu_icon @drawable/pointer_help_icon + @drawable/pointer_wait_icon @drawable/pointer_cell_icon @drawable/pointer_crosshair_icon @drawable/pointer_text_icon diff --git a/libs/input/PointerController.cpp b/libs/input/PointerController.cpp index c9586e4ca81d3..bd6af788bcf74 100644 --- a/libs/input/PointerController.cpp +++ b/libs/input/PointerController.cpp @@ -86,6 +86,9 @@ PointerController::PointerController(const sp& mLocked.pointerIconChanged = false; mLocked.requestedPointerShape = mPolicy->getDefaultPointerIconId(); + mLocked.animationFrameIndex = 0; + mLocked.lastFrameUpdatedTime = 0; + mLocked.buttonState = 0; loadResources(); @@ -239,7 +242,8 @@ void PointerController::setPresentation(Presentation presentation) { AutoMutex _l(mLock); if (presentation == PRESENTATION_POINTER && mLocked.additionalMouseResources.empty()) { - mPolicy->loadAdditionalMouseResources(&mLocked.additionalMouseResources); + mPolicy->loadAdditionalMouseResources(&mLocked.additionalMouseResources, + &mLocked.animationResources); } if (mLocked.presentation != presentation) { @@ -402,7 +406,7 @@ void PointerController::setDisplayViewport(int32_t width, int32_t height, int32_ updatePointerLocked(); } -void PointerController::updatePointerShape(int iconId) { +void PointerController::updatePointerShape(int32_t iconId) { AutoMutex _l(mLock); if (mLocked.requestedPointerShape != iconId) { mLocked.requestedPointerShape = iconId; @@ -462,8 +466,17 @@ int PointerController::handleEvent(int /* fd */, int events, void* /* data */) { void PointerController::doAnimate(nsecs_t timestamp) { AutoMutex _l(mLock); - bool keepAnimating = false; mLocked.animationPending = false; + + bool keepFading = doFadingAnimationLocked(timestamp); + bool keepBitmapFlipping = doBitmapAnimationLocked(timestamp); + if (keepFading || keepBitmapFlipping) { + startAnimationLocked(); + } +} + +bool PointerController::doFadingAnimationLocked(nsecs_t timestamp) { + bool keepAnimating = false; nsecs_t frameDelay = timestamp - mLocked.animationTime; // Animate pointer fade. @@ -501,10 +514,32 @@ void PointerController::doAnimate(nsecs_t timestamp) { } } } + return keepAnimating; +} - if (keepAnimating) { - startAnimationLocked(); +bool PointerController::doBitmapAnimationLocked(nsecs_t timestamp) { + std::map::const_iterator iter = mLocked.animationResources.find( + mLocked.requestedPointerShape); + if (iter == mLocked.animationResources.end()) { + return false; } + + if (timestamp - mLocked.lastFrameUpdatedTime > iter->second.durationPerFrame) { + mSpriteController->openTransaction(); + + int incr = (timestamp - mLocked.lastFrameUpdatedTime) / iter->second.durationPerFrame; + mLocked.animationFrameIndex += incr; + mLocked.lastFrameUpdatedTime += iter->second.durationPerFrame * incr; + while (mLocked.animationFrameIndex >= iter->second.animationFrames.size()) { + mLocked.animationFrameIndex -= iter->second.animationFrames.size(); + } + mLocked.pointerSprite->setIcon(iter->second.animationFrames[mLocked.animationFrameIndex]); + + mSpriteController->closeTransaction(); + } + + // Keep animating. + return true; } void PointerController::doInactivityTimeout() { @@ -549,9 +584,16 @@ void PointerController::updatePointerLocked() { if (mLocked.requestedPointerShape == mPolicy->getDefaultPointerIconId()) { mLocked.pointerSprite->setIcon(mLocked.pointerIcon); } else { - std::map::const_iterator iter = + std::map::const_iterator iter = mLocked.additionalMouseResources.find(mLocked.requestedPointerShape); if (iter != mLocked.additionalMouseResources.end()) { + std::map::const_iterator anim_iter = + mLocked.animationResources.find(mLocked.requestedPointerShape); + if (anim_iter != mLocked.animationResources.end()) { + mLocked.animationFrameIndex = 0; + mLocked.lastFrameUpdatedTime = systemTime(SYSTEM_TIME_MONOTONIC); + startAnimationLocked(); + } mLocked.pointerSprite->setIcon(iter->second); } else { ALOGW("Can't find the resource for icon id %d", mLocked.requestedPointerShape); diff --git a/libs/input/PointerController.h b/libs/input/PointerController.h index 6d840db0ec5c9..b6c01d2903a9d 100644 --- a/libs/input/PointerController.h +++ b/libs/input/PointerController.h @@ -20,6 +20,7 @@ #include "SpriteController.h" #include +#include #include #include @@ -30,8 +31,6 @@ #include #include -#include - namespace android { /* @@ -43,6 +42,11 @@ struct PointerResources { SpriteIcon spotAnchor; }; +struct PointerAnimation { + std::vector animationFrames; + nsecs_t durationPerFrame; +}; + /* * Pointer controller policy interface. * @@ -59,7 +63,8 @@ protected: public: virtual void loadPointerResources(PointerResources* outResources) = 0; - virtual void loadAdditionalMouseResources(std::map* outResources) = 0; + virtual void loadAdditionalMouseResources(std::map* outResources, + std::map* outAnimationResources) = 0; virtual int32_t getDefaultPointerIconId() = 0; }; @@ -98,7 +103,7 @@ public: const uint32_t* spotIdToIndex, BitSet32 spotIdBits); virtual void clearSpots(); - void updatePointerShape(int iconId); + void updatePointerShape(int32_t iconId); void setDisplayViewport(int32_t width, int32_t height, int32_t orientation); void setPointerIcon(const SpriteIcon& icon); void setInactivityTimeout(InactivityTimeout inactivityTimeout); @@ -145,6 +150,9 @@ private: bool animationPending; nsecs_t animationTime; + size_t animationFrameIndex; + nsecs_t lastFrameUpdatedTime; + int32_t displayWidth; int32_t displayHeight; int32_t displayOrientation; @@ -162,7 +170,8 @@ private: SpriteIcon pointerIcon; bool pointerIconChanged; - std::map additionalMouseResources; + std::map additionalMouseResources; + std::map animationResources; int32_t requestedPointerShape; @@ -178,6 +187,8 @@ private: void handleMessage(const Message& message); int handleEvent(int fd, int events, void* data); void doAnimate(nsecs_t timestamp); + bool doFadingAnimationLocked(nsecs_t timestamp); + bool doBitmapAnimationLocked(nsecs_t timestamp); void doInactivityTimeout(); void startAnimationLocked(); diff --git a/services/core/jni/com_android_server_input_InputManagerService.cpp b/services/core/jni/com_android_server_input_InputManagerService.cpp index be190cbef47d4..b5654eebd34f9 100644 --- a/services/core/jni/com_android_server_input_InputManagerService.cpp +++ b/services/core/jni/com_android_server_input_InputManagerService.cpp @@ -152,18 +152,23 @@ static jobject getInputWindowHandleObjLocalRef(JNIEnv* env, getInputWindowHandleObjLocalRef(env); } -static void loadSystemIconAsSprite(JNIEnv* env, jobject contextObj, int32_t style, - SpriteIcon* outSpriteIcon) { - PointerIcon pointerIcon; +static void loadSystemIconAsSpriteWithPointerIcon(JNIEnv* env, jobject contextObj, int32_t style, + PointerIcon* outPointerIcon, SpriteIcon* outSpriteIcon) { status_t status = android_view_PointerIcon_loadSystemIcon(env, - contextObj, style, &pointerIcon); + contextObj, style, outPointerIcon); if (!status) { - pointerIcon.bitmap.copyTo(&outSpriteIcon->bitmap, kN32_SkColorType); - outSpriteIcon->hotSpotX = pointerIcon.hotSpotX; - outSpriteIcon->hotSpotY = pointerIcon.hotSpotY; + outPointerIcon->bitmap.copyTo(&outSpriteIcon->bitmap, kN32_SkColorType); + outSpriteIcon->hotSpotX = outPointerIcon->hotSpotX; + outSpriteIcon->hotSpotY = outPointerIcon->hotSpotY; } } +static void loadSystemIconAsSprite(JNIEnv* env, jobject contextObj, int32_t style, + SpriteIcon* outSpriteIcon) { + PointerIcon pointerIcon; + loadSystemIconAsSpriteWithPointerIcon(env, contextObj, style, &pointerIcon, outSpriteIcon); +} + enum { WM_ACTION_PASS_TO_USER = 1, }; @@ -238,7 +243,8 @@ public: /* --- PointerControllerPolicyInterface implementation --- */ virtual void loadPointerResources(PointerResources* outResources); - virtual void loadAdditionalMouseResources(std::map* outResources); + virtual void loadAdditionalMouseResources(std::map* outResources, + std::map* outAnimationResources); virtual int32_t getDefaultPointerIconId(); private: @@ -1041,14 +1047,31 @@ void NativeInputManager::loadPointerResources(PointerResources* outResources) { &outResources->spotAnchor); } -void NativeInputManager::loadAdditionalMouseResources(std::map* outResources) { +void NativeInputManager::loadAdditionalMouseResources(std::map* outResources, + std::map* outAnimationResources) { JNIEnv* env = jniEnv(); for (int iconId = POINTER_ICON_STYLE_CONTEXT_MENU; iconId <= POINTER_ICON_STYLE_GRABBING; ++iconId) { - loadSystemIconAsSprite(env, mContextObj, iconId, &((*outResources)[iconId])); + PointerIcon pointerIcon; + loadSystemIconAsSpriteWithPointerIcon( + env, mContextObj, iconId, &pointerIcon, &((*outResources)[iconId])); + if (!pointerIcon.bitmapFrames.empty()) { + PointerAnimation& animationData = (*outAnimationResources)[iconId]; + size_t numFrames = pointerIcon.bitmapFrames.size() + 1; + animationData.durationPerFrame = + milliseconds_to_nanoseconds(pointerIcon.durationPerFrame); + animationData.animationFrames.reserve(numFrames); + animationData.animationFrames.push_back(SpriteIcon( + pointerIcon.bitmap, pointerIcon.hotSpotX, pointerIcon.hotSpotY)); + for (size_t i = 0; i < numFrames - 1; ++i) { + animationData.animationFrames.push_back(SpriteIcon( + pointerIcon.bitmapFrames[i], pointerIcon.hotSpotX, pointerIcon.hotSpotY)); + } + } } - loadSystemIconAsSprite(env, mContextObj, POINTER_ICON_STYLE_NULL, &((*outResources)[POINTER_ICON_STYLE_NULL])); + loadSystemIconAsSprite(env, mContextObj, POINTER_ICON_STYLE_NULL, + &((*outResources)[POINTER_ICON_STYLE_NULL])); } int32_t NativeInputManager::getDefaultPointerIconId() {