From 3d38ec9755d6ca53ae6f51469a14158d789c24b0 Mon Sep 17 00:00:00 2001 From: Julian Winkler Date: Tue, 3 Sep 2024 17:49:56 +0200 Subject: [PATCH] add Java APIs needed for WhatsApp settings --- src/api-impl/android/app/Activity.java | 4 ++++ src/api-impl/android/graphics/drawable/Drawable.java | 2 ++ src/api-impl/android/media/Ringtone.java | 9 +++++++++ src/api-impl/android/media/RingtoneManager.java | 10 ++++++++++ src/api-impl/android/view/View.java | 9 +++++++++ src/api-impl/android/view/ViewStub.java | 7 +++++++ src/api-impl/android/webkit/URLUtil.java | 5 ++++- src/api-impl/android/widget/AbsListView.java | 8 +++++++- src/api-impl/android/widget/CheckedTextView.java | 3 +++ src/api-impl/android/widget/CursorAdapter.java | 1 + src/api-impl/android/widget/TextView.java | 2 ++ src/api-impl/meson.build | 2 ++ 12 files changed, 60 insertions(+), 2 deletions(-) create mode 100644 src/api-impl/android/media/Ringtone.java create mode 100644 src/api-impl/android/media/RingtoneManager.java diff --git a/src/api-impl/android/app/Activity.java b/src/api-impl/android/app/Activity.java index 46f94e1d..c5b02aae 100644 --- a/src/api-impl/android/app/Activity.java +++ b/src/api-impl/android/app/Activity.java @@ -529,6 +529,10 @@ public class Activity extends ContextThemeWrapper implements Window.Callback { public void startPostponedEnterTransition() {} + public boolean isChild() { + return false; + } + private native void nativeFinish(long native_window); public static native void nativeRecreateActivity(Activity activity); public static native void nativeStartActivity(Activity activity); diff --git a/src/api-impl/android/graphics/drawable/Drawable.java b/src/api-impl/android/graphics/drawable/Drawable.java index 565c4166..8c95331d 100644 --- a/src/api-impl/android/graphics/drawable/Drawable.java +++ b/src/api-impl/android/graphics/drawable/Drawable.java @@ -240,6 +240,8 @@ public class Drawable { return drawable; } else if ("nine-patch".equals(parser.getName())) { return new NinePatchDrawable(resources, null, null, null, null); + } else if ("animation-list".equals(parser.getName())) { + return new AnimationDrawable(); } return null; } diff --git a/src/api-impl/android/media/Ringtone.java b/src/api-impl/android/media/Ringtone.java new file mode 100644 index 00000000..8edfbd67 --- /dev/null +++ b/src/api-impl/android/media/Ringtone.java @@ -0,0 +1,9 @@ +package android.media; + +import android.content.Context; + +public class Ringtone{ + public String getTitle(Context context) { + return "FIXME: Ringtone.getTitle()"; + } +}; diff --git a/src/api-impl/android/media/RingtoneManager.java b/src/api-impl/android/media/RingtoneManager.java new file mode 100644 index 00000000..677c2cb1 --- /dev/null +++ b/src/api-impl/android/media/RingtoneManager.java @@ -0,0 +1,10 @@ +package android.media; + +import android.content.Context; +import android.net.Uri; + +public class RingtoneManager { + public static Ringtone getRingtone(Context context, Uri uri) { + return new Ringtone(); + } +} diff --git a/src/api-impl/android/view/View.java b/src/api-impl/android/view/View.java index f5752137..4edaf113 100644 --- a/src/api-impl/android/view/View.java +++ b/src/api-impl/android/view/View.java @@ -896,6 +896,15 @@ public class View implements Drawable.Callback { minHeight = a.getDimensionPixelSize(com.android.internal.R.styleable.View_minHeight, 0); } } + onCreateDrawableState(0); + } + + protected int[] onCreateDrawableState(int extraSpace) { + return new int[0]; + } + + protected static int[] mergeDrawableStates(int[] curState, int[] newState) { + return new int[0]; } public View findViewById(int id) { diff --git a/src/api-impl/android/view/ViewStub.java b/src/api-impl/android/view/ViewStub.java index ba669c9f..4793b1cc 100644 --- a/src/api-impl/android/view/ViewStub.java +++ b/src/api-impl/android/view/ViewStub.java @@ -7,6 +7,7 @@ import android.util.AttributeSet; public class ViewStub extends View { private int layoutResource; + private int inflatedId = View.NO_ID; public ViewStub(Context context) { this(context, null, 0); @@ -28,6 +29,8 @@ public class ViewStub extends View { throw new IllegalStateException("ViewStub must have a valid layoutResource"); ViewGroup parent = (ViewGroup) getParent(); View view = LayoutInflater.from(getContext()).inflate(layoutResource, parent, false); + if (inflatedId != View.NO_ID) + view.setId(inflatedId); int index = parent.indexOfChild(this); parent.removeView(this); parent.addView(view, index, getLayoutParams()); @@ -43,4 +46,8 @@ public class ViewStub extends View { setMeasuredDimension(0, 0); } + public void setInflatedId(int inflatedId) { + this.inflatedId = inflatedId; + } + } diff --git a/src/api-impl/android/webkit/URLUtil.java b/src/api-impl/android/webkit/URLUtil.java index 693b8e35..2ac25c70 100644 --- a/src/api-impl/android/webkit/URLUtil.java +++ b/src/api-impl/android/webkit/URLUtil.java @@ -3,6 +3,9 @@ package android.webkit; public class URLUtil { public static String guessFileName(String url, String contentDisposition, String mimeType) { - return url.substring(url.lastIndexOf('/') + 1); + String filename = url.substring(url.lastIndexOf('/') + 1); + if (filename.contains("?")) + filename = filename.substring(0, filename.indexOf('?')); + return filename; } } diff --git a/src/api-impl/android/widget/AbsListView.java b/src/api-impl/android/widget/AbsListView.java index 3159ec76..ac0523d4 100644 --- a/src/api-impl/android/widget/AbsListView.java +++ b/src/api-impl/android/widget/AbsListView.java @@ -73,7 +73,10 @@ public abstract class AbsListView extends AdapterView { public void smoothScrollBy(int position, int duration) {} - public void smoothScrollToPositionFromTop(int position, int offset) {} + @Override + public ViewGroup.LayoutParams generateLayoutParams(AttributeSet attrs) { + return new LayoutParams(getContext(), attrs); + } public interface OnScrollListener {} @@ -93,5 +96,8 @@ public abstract class AbsListView extends AdapterView { public class LayoutParams extends ViewGroup.LayoutParams { + public LayoutParams(Context c, AttributeSet attrs) { + super(c, attrs); + } } } diff --git a/src/api-impl/android/widget/CheckedTextView.java b/src/api-impl/android/widget/CheckedTextView.java index 5275525f..fe595393 100644 --- a/src/api-impl/android/widget/CheckedTextView.java +++ b/src/api-impl/android/widget/CheckedTextView.java @@ -1,6 +1,7 @@ package android.widget; import android.content.Context; +import android.graphics.drawable.Drawable; import android.util.AttributeSet; public class CheckedTextView extends TextView { @@ -15,4 +16,6 @@ public class CheckedTextView extends TextView { public void setChecked(boolean checked) {} + public void setCheckMarkDrawable(Drawable d) {} + } diff --git a/src/api-impl/android/widget/CursorAdapter.java b/src/api-impl/android/widget/CursorAdapter.java index 15745273..da656080 100644 --- a/src/api-impl/android/widget/CursorAdapter.java +++ b/src/api-impl/android/widget/CursorAdapter.java @@ -17,6 +17,7 @@ public abstract class CursorAdapter extends BaseAdapter { public void changeCursor(Cursor cursor) { this.cursor = cursor; + notifyDataSetChanged(); } public Cursor getCursor() { diff --git a/src/api-impl/android/widget/TextView.java b/src/api-impl/android/widget/TextView.java index 8236e669..feab7d21 100644 --- a/src/api-impl/android/widget/TextView.java +++ b/src/api-impl/android/widget/TextView.java @@ -305,4 +305,6 @@ public class TextView extends View { public TextUtils.TruncateAt getEllipsize() {return null;} public void setLines(int lines) {} + + public void setMinLines(int lines) {} } diff --git a/src/api-impl/meson.build b/src/api-impl/meson.build index 959fe2cd..2f50d9f7 100644 --- a/src/api-impl/meson.build +++ b/src/api-impl/meson.build @@ -242,6 +242,8 @@ hax_jar = jar('hax', [ 'android/media/MediaMetadata.java', 'android/media/MediaPlayer.java', 'android/media/MediaRouter.java', + 'android/media/Ringtone.java', + 'android/media/RingtoneManager.java', 'android/media/SoundPool.java', 'android/media/projection/MediaProjectionManager.java', 'android/media/session/MediaController.java',