From e011092025416e63d3648e915534153e20978ba0 Mon Sep 17 00:00:00 2001 From: Julian Winkler Date: Wed, 23 Apr 2025 18:21:19 +0200 Subject: [PATCH] api-impl: misc APIs for WhatsApp media chooser Activities --- src/api-impl/android/app/Activity.java | 2 +- src/api-impl/android/content/Intent.java | 8 ++++++ .../android/content/pm/ResolveInfo.java | 17 ++++++++++++ .../android/graphics/BitmapFactory.java | 8 +++--- src/api-impl/android/graphics/Canvas.java | 4 +++ .../graphics/drawable/TransitionDrawable.java | 14 ++++++++-- src/api-impl/android/media/AudioManager.java | 4 +++ .../android/os/ParcelFileDescriptor.java | 26 +++++++++---------- .../android/telephony/PhoneNumberUtils.java | 2 +- src/api-impl/android/view/MenuItem.java | 2 ++ src/api-impl/android/view/SubMenu.java | 4 +++ src/api-impl/android/view/ViewGroup.java | 4 +++ .../android/view/ViewPropertyAnimator.java | 8 ++++++ .../AccelerateDecelerateInterpolator.java | 4 +-- src/api-impl/android/widget/ImageView.java | 9 ++++++- src/api-impl/android/widget/PopupMenu.java | 12 +++++++++ src/api-impl/android/widget/ProgressBar.java | 3 ++- src/api-impl/android/widget/RemoteViews.java | 16 ++++++++++++ src/api-impl/android/widget/TextView.java | 2 ++ 19 files changed, 123 insertions(+), 26 deletions(-) diff --git a/src/api-impl/android/app/Activity.java b/src/api-impl/android/app/Activity.java index 49e7b3fa..c8c4f8b5 100644 --- a/src/api-impl/android/app/Activity.java +++ b/src/api-impl/android/app/Activity.java @@ -258,7 +258,7 @@ public class Activity extends ContextThemeWrapper implements Window.Callback, La protected void onSaveInstanceState(Bundle outState) { } - void onConfigurationChanged(Configuration newConfig) { + public void onConfigurationChanged(Configuration newConfig) { } public void onLowMemory() { diff --git a/src/api-impl/android/content/Intent.java b/src/api-impl/android/content/Intent.java index b79a4442..309f3af1 100644 --- a/src/api-impl/android/content/Intent.java +++ b/src/api-impl/android/content/Intent.java @@ -395,7 +395,15 @@ public class Intent implements Parcelable { public void setSourceBounds(Rect sourceBounds) {} + public Rect getSourceBounds() { + return null; + } + public void setSelector(Intent selector) {} public void setClipData(ClipData clip) {} + + public String resolveType(Context context) { + return type; + } } diff --git a/src/api-impl/android/content/pm/ResolveInfo.java b/src/api-impl/android/content/pm/ResolveInfo.java index 2d13224d..b735f898 100644 --- a/src/api-impl/android/content/pm/ResolveInfo.java +++ b/src/api-impl/android/content/pm/ResolveInfo.java @@ -1,6 +1,7 @@ package android.content.pm; import android.content.IntentFilter; +import android.graphics.drawable.Drawable; public class ResolveInfo { public ActivityInfo activityInfo = new ActivityInfo(); @@ -8,6 +9,22 @@ public class ResolveInfo { public IntentFilter filter = new IntentFilter(); public int priority = -500; + public Drawable loadIcon(PackageManager pm) { + Drawable icon = activityInfo.loadIcon(pm); + if (icon == null) { + icon = new Drawable(); + } + return icon; + } + + public CharSequence loadLabel(PackageManager pm) { + CharSequence label = activityInfo.loadLabel(pm); + if (label == null) { + label = "fixme ResolveInfo.loadLabel"; + } + return label; + } + public static class DisplayNameComparator { public DisplayNameComparator(PackageManager pm) {} diff --git a/src/api-impl/android/graphics/BitmapFactory.java b/src/api-impl/android/graphics/BitmapFactory.java index a1a63eba..e79988cb 100644 --- a/src/api-impl/android/graphics/BitmapFactory.java +++ b/src/api-impl/android/graphics/BitmapFactory.java @@ -626,9 +626,9 @@ public class BitmapFactory { Trace.traceBegin(Trace.TRACE_TAG_GRAPHICS, "decodeFileDescriptor"); try { - if (nativeIsSeekable(fd)) { - bm = nativeDecodeFileDescriptor(fd, outPadding, opts); - } else { + //if (nativeIsSeekable(fd)) { + // bm = nativeDecodeFileDescriptor(fd, outPadding, opts); + //} else { FileInputStream fis = new FileInputStream(fd); try { bm = decodeStreamInternal(fis, outPadding, opts); @@ -638,7 +638,7 @@ public class BitmapFactory { } catch (Throwable t) { /* ignore */ } } - } + //} if (bm == null && opts != null && opts.inBitmap != null) { throw new IllegalArgumentException("Problem decoding into existing bitmap"); diff --git a/src/api-impl/android/graphics/Canvas.java b/src/api-impl/android/graphics/Canvas.java index 31a45d68..82e96b98 100644 --- a/src/api-impl/android/graphics/Canvas.java +++ b/src/api-impl/android/graphics/Canvas.java @@ -474,6 +474,10 @@ public class Canvas { return save(); } + public int saveLayer(RectF bounds, Paint paint) { + return save(); + } + public void drawOval(RectF oval, Paint paint) { Log.w("Canvas", "STUB: drawOval"); } diff --git a/src/api-impl/android/graphics/drawable/TransitionDrawable.java b/src/api-impl/android/graphics/drawable/TransitionDrawable.java index c59a2ef6..71252ab4 100644 --- a/src/api-impl/android/graphics/drawable/TransitionDrawable.java +++ b/src/api-impl/android/graphics/drawable/TransitionDrawable.java @@ -1,10 +1,20 @@ package android.graphics.drawable; -public class TransitionDrawable extends Drawable { +import android.graphics.Canvas; - public TransitionDrawable(Drawable[] layers) {} +public class TransitionDrawable extends LayerDrawable { + + public TransitionDrawable(Drawable[] layers) { + super(layers); + } public void setCrossFadeEnabled(boolean enabled) {} public void startTransition(int duration) {} + + @Override + public void draw(Canvas canvas) { + // always draw the target drawable + mLayerState.mChildren[1].mDrawable.draw(canvas); + } } diff --git a/src/api-impl/android/media/AudioManager.java b/src/api-impl/android/media/AudioManager.java index 2cab883c..0bd6cf30 100644 --- a/src/api-impl/android/media/AudioManager.java +++ b/src/api-impl/android/media/AudioManager.java @@ -56,4 +56,8 @@ public class AudioManager { public boolean isStreamMute(int streamType) { return false; } + + public boolean isMusicActive() { + return false; + } } diff --git a/src/api-impl/android/os/ParcelFileDescriptor.java b/src/api-impl/android/os/ParcelFileDescriptor.java index 13b351ab..d69997d9 100644 --- a/src/api-impl/android/os/ParcelFileDescriptor.java +++ b/src/api-impl/android/os/ParcelFileDescriptor.java @@ -601,19 +601,19 @@ public class ParcelFileDescriptor implements Closeable { * * @see #canDetectErrors() */ - public int detachFd() { /* - if (mWrapped != null) { - return mWrapped.detachFd(); - } else { - if (mClosed) { - throw new IllegalStateException("Already closed"); - } - final int fd = getFd(); - Parcel.clearFileDescriptor(mFd); - writeCommStatusAndClose(Status.DETACHED, null); - return fd; - }*/ - return -1; + public int detachFd() { + if (mWrapped != null) { + return mWrapped.detachFd(); + } else { + if (mClosed) { + throw new IllegalStateException("Already closed"); + } + final int fd = getFd(); + // Parcel.clearFileDescriptor(mFd); + mFd.setInt$(-1); + writeCommStatusAndClose(Status.DETACHED, null); + return fd; + } } /** diff --git a/src/api-impl/android/telephony/PhoneNumberUtils.java b/src/api-impl/android/telephony/PhoneNumberUtils.java index 00913f53..6d9a3ee3 100644 --- a/src/api-impl/android/telephony/PhoneNumberUtils.java +++ b/src/api-impl/android/telephony/PhoneNumberUtils.java @@ -7,6 +7,6 @@ public class PhoneNumberUtils { } public static boolean isGlobalPhoneNumber(String phoneNumber) { - return phoneNumber.startsWith("+") || phoneNumber.startsWith("00"); + return phoneNumber != null && (phoneNumber.startsWith("+") || phoneNumber.startsWith("00")); } } diff --git a/src/api-impl/android/view/MenuItem.java b/src/api-impl/android/view/MenuItem.java index 0044fd1e..72e5b223 100644 --- a/src/api-impl/android/view/MenuItem.java +++ b/src/api-impl/android/view/MenuItem.java @@ -74,4 +74,6 @@ public interface MenuItem { public MenuItem setNumericShortcut(char numericChar); public boolean expandActionView(); + + public boolean isActionViewExpanded(); } diff --git a/src/api-impl/android/view/SubMenu.java b/src/api-impl/android/view/SubMenu.java index 82d3e0ec..e8cebcbd 100644 --- a/src/api-impl/android/view/SubMenu.java +++ b/src/api-impl/android/view/SubMenu.java @@ -1,9 +1,13 @@ package android.view; +import android.graphics.drawable.Drawable; + public interface SubMenu extends Menu { public MenuItem getItem(); public void clearHeader(); + public SubMenu setIcon(Drawable icon); + } diff --git a/src/api-impl/android/view/ViewGroup.java b/src/api-impl/android/view/ViewGroup.java index e9b2b9bb..2fed5106 100644 --- a/src/api-impl/android/view/ViewGroup.java +++ b/src/api-impl/android/view/ViewGroup.java @@ -654,5 +654,9 @@ public class ViewGroup extends View implements ViewParent, ViewManager { public void requestChildFocus(View child, View focused) {} + public boolean getClipChildren() { + return false; + } + public native boolean native_dispatchTouchEvent(long widget, MotionEvent event, double x, double y); } diff --git a/src/api-impl/android/view/ViewPropertyAnimator.java b/src/api-impl/android/view/ViewPropertyAnimator.java index 7c95baf3..e7a1b4a7 100644 --- a/src/api-impl/android/view/ViewPropertyAnimator.java +++ b/src/api-impl/android/view/ViewPropertyAnimator.java @@ -88,4 +88,12 @@ public class ViewPropertyAnimator { } }, startDelay+duration); } + + public ViewPropertyAnimator withEndAction(Runnable runnable) { + return this; + } + + public ViewPropertyAnimator withStartAction(Runnable runnable) { + return this; + } } diff --git a/src/api-impl/android/view/animation/AccelerateDecelerateInterpolator.java b/src/api-impl/android/view/animation/AccelerateDecelerateInterpolator.java index fd0f367e..711948d1 100644 --- a/src/api-impl/android/view/animation/AccelerateDecelerateInterpolator.java +++ b/src/api-impl/android/view/animation/AccelerateDecelerateInterpolator.java @@ -1,8 +1,6 @@ package android.view.animation; -import android.animation.TimeInterpolator; - -public class AccelerateDecelerateInterpolator implements TimeInterpolator { +public class AccelerateDecelerateInterpolator implements Interpolator { @Override public float getInterpolation(float input) { diff --git a/src/api-impl/android/widget/ImageView.java b/src/api-impl/android/widget/ImageView.java index 15cfeb8a..6e132b1c 100644 --- a/src/api-impl/android/widget/ImageView.java +++ b/src/api-impl/android/widget/ImageView.java @@ -163,7 +163,10 @@ public class ImageView extends View { public final void setColorFilter(int color, PorterDuff.Mode mode) {} public void setImageTintList(ColorStateList tint) { - colorFilter = new PorterDuffColorFilter(tint.getDefaultColor(), PorterDuff.Mode.SRC_IN); + if (tint == null) + colorFilter = null; + else + colorFilter = new PorterDuffColorFilter(tint.getDefaultColor(), PorterDuff.Mode.SRC_IN); setImageDrawable(drawable); } @@ -191,6 +194,10 @@ public class ImageView extends View { public void setColorFilter(ColorFilter cf) {} + public Matrix getImageMatrix() { + return Matrix.IDENTITY_MATRIX; + } + @Override protected native long native_constructor(Context context, AttributeSet attrs); protected native void native_setDrawable(long widget, long paintable); diff --git a/src/api-impl/android/widget/PopupMenu.java b/src/api-impl/android/widget/PopupMenu.java index 66881b88..24937dde 100644 --- a/src/api-impl/android/widget/PopupMenu.java +++ b/src/api-impl/android/widget/PopupMenu.java @@ -335,6 +335,12 @@ public class PopupMenu { throw new UnsupportedOperationException("Unimplemented method 'clearHeader'"); } + @Override + public SubMenu setIcon(Drawable icon) { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'setIcon'"); + } + } private class MenuItemImpl implements MenuItem { @@ -549,6 +555,12 @@ public class PopupMenu { // TODO Auto-generated method stub throw new UnsupportedOperationException("Unimplemented method 'expandActionView'"); } + + @Override + public boolean isActionViewExpanded() { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'isActionViewExpanded'"); + } } } diff --git a/src/api-impl/android/widget/ProgressBar.java b/src/api-impl/android/widget/ProgressBar.java index f0a81a8a..aacaaebc 100644 --- a/src/api-impl/android/widget/ProgressBar.java +++ b/src/api-impl/android/widget/ProgressBar.java @@ -19,11 +19,12 @@ public class ProgressBar extends View { super(context, attrs, defStyle); haveCustomMeasure = false; TypedArray a = context.obtainStyledAttributes(attrs, com.android.internal.R.styleable.ProgressBar, defStyle, 0); + setIndeterminateDrawable(a.getDrawable(com.android.internal.R.styleable.ProgressBar_indeterminateDrawable)); + setProgressDrawable(a.getDrawable(com.android.internal.R.styleable.ProgressBar_progressDrawable)); setIndeterminate(a.getBoolean(com.android.internal.R.styleable.ProgressBar_indeterminate, false)); if (a.getBoolean(com.android.internal.R.styleable.ProgressBar_indeterminateOnly, false)) { setIndeterminate(true); } - setIndeterminateDrawable(a.getDrawable(com.android.internal.R.styleable.ProgressBar_indeterminateDrawable)); /* FIXME hack: NewPipe expects this to not be null, but for some reason it is */ if(indeterminateDrawable == null) indeterminateDrawable = new Drawable() { diff --git a/src/api-impl/android/widget/RemoteViews.java b/src/api-impl/android/widget/RemoteViews.java index cc9bc538..db7f9fa6 100644 --- a/src/api-impl/android/widget/RemoteViews.java +++ b/src/api-impl/android/widget/RemoteViews.java @@ -1,4 +1,20 @@ package android.widget; +import android.app.PendingIntent; + public class RemoteViews { + + public RemoteViews(String packageName, int layoutId) {} + + public void setProgressBar(int viewId, int max, int progress, boolean indeterminate) {} + + public void setTextViewText(int viewId, CharSequence text) {} + + public void setImageViewResource(int viewId, int resId) {} + + public void setContentDescription(int viewId, CharSequence text) {} + + public void setOnClickPendingIntent(int viewId, PendingIntent pendingIntent) {} + + public void setViewVisibility(int viewId, int visibility) {} } diff --git a/src/api-impl/android/widget/TextView.java b/src/api-impl/android/widget/TextView.java index 3467a3e5..245e5858 100644 --- a/src/api-impl/android/widget/TextView.java +++ b/src/api-impl/android/widget/TextView.java @@ -403,4 +403,6 @@ public class TextView extends View { public void setShadowLayer(float radius, float dx, float dy, int color) {} public void setBreakStrategy(int strategy) {} + + public void clearComposingText() {} }