From 3e7fdac663d6eccd430b7c51d1476e3ac5e8725a Mon Sep 17 00:00:00 2001 From: Julian Winkler Date: Mon, 5 Aug 2024 17:17:53 +0200 Subject: [PATCH] add more Java APIs needed for OctoDroid --- src/api-impl/android/graphics/Typeface.java | 1 + .../graphics/drawable/ColorDrawable.java | 5 ++++ .../android/graphics/drawable/Drawable.java | 2 ++ .../graphics/drawable/TransitionDrawable.java | 10 ++++++++ src/api-impl/android/os/Parcel.java | 4 ++++ src/api-impl/android/text/Html.java | 7 ++++++ src/api-impl/android/text/TextUtils.java | 8 +++++++ .../android/text/format/DateUtils.java | 12 ++++++++++ .../android/text/format/Formatter.java | 14 ++++++++++- .../android/text/style/ImageSpan.java | 14 ++++++++++- src/api-impl/android/view/LayoutInflater.java | 6 ++++- src/api-impl/android/view/MenuItem.java | 4 ++++ src/api-impl/android/view/TouchDelegate.java | 9 ++++++++ src/api-impl/android/view/View.java | 2 ++ src/api-impl/android/webkit/WebSettings.java | 21 +++++++++++++++++ src/api-impl/android/webkit/WebView.java | 9 ++++++++ .../android/widget/AutoCompleteTextView.java | 23 +++++++++++++++++++ .../widget/MultiAutoCompleteTextView.java | 14 +++++++++++ src/api-impl/android/widget/PopupMenu.java | 15 ++++++++++-- src/api-impl/android/widget/TextView.java | 5 ++++ src/api-impl/meson.build | 4 ++++ 21 files changed, 184 insertions(+), 5 deletions(-) create mode 100644 src/api-impl/android/graphics/drawable/TransitionDrawable.java create mode 100644 src/api-impl/android/text/format/DateUtils.java create mode 100644 src/api-impl/android/view/TouchDelegate.java create mode 100644 src/api-impl/android/widget/MultiAutoCompleteTextView.java diff --git a/src/api-impl/android/graphics/Typeface.java b/src/api-impl/android/graphics/Typeface.java index 342ed8a3..153648ba 100644 --- a/src/api-impl/android/graphics/Typeface.java +++ b/src/api-impl/android/graphics/Typeface.java @@ -34,6 +34,7 @@ public class Typeface { public static final int BOLD_ITALIC = 3; public long skia_typeface = 0; + public long native_instance = 0; // directly accessed by androidx public static Typeface createFromAsset(AssetManager mgr, String path) { return DEFAULT; diff --git a/src/api-impl/android/graphics/drawable/ColorDrawable.java b/src/api-impl/android/graphics/drawable/ColorDrawable.java index 3c725f96..67989c39 100644 --- a/src/api-impl/android/graphics/drawable/ColorDrawable.java +++ b/src/api-impl/android/graphics/drawable/ColorDrawable.java @@ -22,4 +22,9 @@ public class ColorDrawable extends Drawable { public void draw(Canvas canvas) { canvas.drawRect(getBounds(), paint); } + + public void setColor(int color) { + this.color = color; + paint.setColor(color); + } } diff --git a/src/api-impl/android/graphics/drawable/Drawable.java b/src/api-impl/android/graphics/drawable/Drawable.java index 45edf776..c20c6154 100644 --- a/src/api-impl/android/graphics/drawable/Drawable.java +++ b/src/api-impl/android/graphics/drawable/Drawable.java @@ -62,6 +62,8 @@ public class Drawable { public abstract Drawable newDrawable(Resources res); public abstract Drawable newDrawable(); + + public abstract int getChangingConfigurations(); } public void setBounds(int left, int top, int right, int bottom) { diff --git a/src/api-impl/android/graphics/drawable/TransitionDrawable.java b/src/api-impl/android/graphics/drawable/TransitionDrawable.java new file mode 100644 index 00000000..c59a2ef6 --- /dev/null +++ b/src/api-impl/android/graphics/drawable/TransitionDrawable.java @@ -0,0 +1,10 @@ +package android.graphics.drawable; + +public class TransitionDrawable extends Drawable { + + public TransitionDrawable(Drawable[] layers) {} + + public void setCrossFadeEnabled(boolean enabled) {} + + public void startTransition(int duration) {} +} diff --git a/src/api-impl/android/os/Parcel.java b/src/api-impl/android/os/Parcel.java index b3bec4fe..16333cca 100644 --- a/src/api-impl/android/os/Parcel.java +++ b/src/api-impl/android/os/Parcel.java @@ -39,4 +39,8 @@ public class Parcel { public int dataPosition() { return 0; } + + public void writeParcelable(Parcelable p, int flags) { + System.out.println("Parcel.writeParcelable(" + p + ", " + flags + ")"); + } } diff --git a/src/api-impl/android/text/Html.java b/src/api-impl/android/text/Html.java index 28e23647..1414f06f 100644 --- a/src/api-impl/android/text/Html.java +++ b/src/api-impl/android/text/Html.java @@ -1,6 +1,13 @@ package android.text; +import android.graphics.drawable.Drawable; + public class Html { + + public static interface ImageGetter { + public Drawable getDrawable(String source); + } + public static Spanned fromHtml(String source) { return new SpannableString(source.replace("
", "\n") .replace("
", "\n") diff --git a/src/api-impl/android/text/TextUtils.java b/src/api-impl/android/text/TextUtils.java index 0bf2a50d..b06ddebe 100644 --- a/src/api-impl/android/text/TextUtils.java +++ b/src/api-impl/android/text/TextUtils.java @@ -330,4 +330,12 @@ public class TextUtils { private static Object sLock = new Object(); private static char[] sTemp = null; + + public static int getTrimmedLength(CharSequence s) { + return s.toString().trim().length(); + } + + public static String htmlEncode(String s) { + return s; + } } diff --git a/src/api-impl/android/text/format/DateUtils.java b/src/api-impl/android/text/format/DateUtils.java new file mode 100644 index 00000000..fbaff963 --- /dev/null +++ b/src/api-impl/android/text/format/DateUtils.java @@ -0,0 +1,12 @@ +package android.text.format; + +import java.util.Date; + +import android.content.Context; + +public class DateUtils { + + public static CharSequence getRelativeTimeSpanString(Context context, long millis, boolean withPreposition) { + return new Date(millis).toString(); + } +} diff --git a/src/api-impl/android/text/format/Formatter.java b/src/api-impl/android/text/format/Formatter.java index 909a2612..59d3f619 100644 --- a/src/api-impl/android/text/format/Formatter.java +++ b/src/api-impl/android/text/format/Formatter.java @@ -5,6 +5,18 @@ import android.content.Context; public class Formatter { public static String formatShortFileSize(Context context, long size) { - return String.valueOf(size); + return formatFileSize(context, size); + } + + public static String formatFileSize(Context context, long size) { + if (size > 1024 * 1024 * 1024) { + return String.format("%.1f GiB", size / 1024.0 / 1024.0 / 1024.0); + } else if (size > 1024 * 1024) { + return String.format("%.1f MiB", size / 1024.0 / 1024.0); + } else if (size > 1024) { + return String.format("%.1f KiB", size / 1024.0); + } else { + return String.format("%d B", size); + } } } diff --git a/src/api-impl/android/text/style/ImageSpan.java b/src/api-impl/android/text/style/ImageSpan.java index ecd86b02..cfe7a785 100644 --- a/src/api-impl/android/text/style/ImageSpan.java +++ b/src/api-impl/android/text/style/ImageSpan.java @@ -4,5 +4,17 @@ import android.graphics.drawable.Drawable; public class ImageSpan extends DynamicDrawableSpan { - public ImageSpan(Drawable d) {} + private Drawable drawable; + + public ImageSpan(Drawable d) { + drawable = d; + } + + public ImageSpan(Drawable d, String source) { + drawable = d; + } + + public Drawable getDrawable() { + return drawable; + } } diff --git a/src/api-impl/android/view/LayoutInflater.java b/src/api-impl/android/view/LayoutInflater.java index ec9c2950..4e988c34 100644 --- a/src/api-impl/android/view/LayoutInflater.java +++ b/src/api-impl/android/view/LayoutInflater.java @@ -83,7 +83,11 @@ public class LayoutInflater { try { // FIXME ugly return createView(name, "android.view.", attrs); } catch (java.lang.ClassNotFoundException e) { - return createView(name, "android.widget.", attrs); + try { + return createView(name, "android.widget.", attrs); + } catch (java.lang.ClassNotFoundException e1) { + return createView(name, "android.webkit.", attrs); + } } } diff --git a/src/api-impl/android/view/MenuItem.java b/src/api-impl/android/view/MenuItem.java index 96503c6f..940fc31b 100644 --- a/src/api-impl/android/view/MenuItem.java +++ b/src/api-impl/android/view/MenuItem.java @@ -52,4 +52,8 @@ public interface MenuItem { public MenuItem setIcon(Drawable icon); + public boolean isChecked(); + + public MenuItem setShowAsActionFlags(int action); + } \ No newline at end of file diff --git a/src/api-impl/android/view/TouchDelegate.java b/src/api-impl/android/view/TouchDelegate.java new file mode 100644 index 00000000..9d6cedf9 --- /dev/null +++ b/src/api-impl/android/view/TouchDelegate.java @@ -0,0 +1,9 @@ +package android.view; + +import android.graphics.Rect; + +public class TouchDelegate { + + public TouchDelegate(Rect bounds, View delegate) { + } +} diff --git a/src/api-impl/android/view/View.java b/src/api-impl/android/view/View.java index 999d6510..07d8f002 100644 --- a/src/api-impl/android/view/View.java +++ b/src/api-impl/android/view/View.java @@ -1821,4 +1821,6 @@ public class View implements Drawable.Callback { public void setVerticalScrollbarPosition(int position) {} public void setNestedScrollingEnabled(boolean enabled) {} + + public void setTouchDelegate(TouchDelegate touchDelegate) {} } diff --git a/src/api-impl/android/webkit/WebSettings.java b/src/api-impl/android/webkit/WebSettings.java index 3d1f41ad..f30055ca 100644 --- a/src/api-impl/android/webkit/WebSettings.java +++ b/src/api-impl/android/webkit/WebSettings.java @@ -1,6 +1,11 @@ package android.webkit; public class WebSettings { + + public static enum LayoutAlgorithm { + NORMAL, + } + public String getUserAgentString() { return "GDPR VIOLATION"; } @@ -16,4 +21,20 @@ public class WebSettings { public void setGeolocationEnabled(boolean enabled) {} public void setCacheMode(int dummy) {} + + public void setLayoutAlgorithm(LayoutAlgorithm layoutAlgorithm) {} + + public void setAllowFileAccess(boolean allowFileAccess) {} + + public void setBuiltInZoomControls(boolean builtInZoomControls) {} + + public void setDisplayZoomControls(boolean displayZoomControls) {} + + public void setLoadsImagesAutomatically(boolean loadsImagesAutomatically) {} + + public void setSupportZoom(boolean supportZoom) {} + + public void setUseWideViewPort(boolean useWideViewPort) {} + + public void setTextZoom(int textZoom) {} } diff --git a/src/api-impl/android/webkit/WebView.java b/src/api-impl/android/webkit/WebView.java index 47295554..6308ea98 100644 --- a/src/api-impl/android/webkit/WebView.java +++ b/src/api-impl/android/webkit/WebView.java @@ -1,6 +1,7 @@ package android.webkit; import android.content.Context; +import android.util.AttributeSet; import android.view.View; // the only reason we need to implement this is that some app developers are such scumbags that they try to use this for tracking purposes @@ -9,6 +10,10 @@ public class WebView extends View { super(context); } + public WebView(Context context, AttributeSet attrs) { + super(context, attrs); + } + public WebSettings getSettings() { return new WebSettings(); } @@ -32,4 +37,8 @@ public class WebView extends View { public void loadUrl(String url) {} public void stopLoading() {} + + public void loadDataWithBaseURL(String baseUrl, String data, String mimeType, String encoding, String historyUrl) { + System.out.println("loadDataWithBaseURL(" + baseUrl + ", " + data + ", " + mimeType + ", " + encoding + ", " + historyUrl + ") called"); + } } diff --git a/src/api-impl/android/widget/AutoCompleteTextView.java b/src/api-impl/android/widget/AutoCompleteTextView.java index 2aae90e5..37549f55 100644 --- a/src/api-impl/android/widget/AutoCompleteTextView.java +++ b/src/api-impl/android/widget/AutoCompleteTextView.java @@ -1,6 +1,7 @@ package android.widget; import android.content.Context; +import android.graphics.drawable.Drawable; import android.util.AttributeSet; public class AutoCompleteTextView extends EditText { @@ -16,4 +17,26 @@ public class AutoCompleteTextView extends EditText { super(context, attributeSet); } + public void setDropDownBackgroundDrawable(Drawable drawable) {} + + public int getThreshold() { + return 0; + } + + public void setOnItemClickListener(AdapterView.OnItemClickListener listener) {} + + public void setOnItemSelectedListener(AdapterView.OnItemSelectedListener listener) {} + + public int getDropDownAnchor() { + return 0; + } + + public void setAdapter(ListAdapter adapter) {} + + public void setThreshold(int threshold) {} + + public int getImeOptions() { + return 0; + } + } \ No newline at end of file diff --git a/src/api-impl/android/widget/MultiAutoCompleteTextView.java b/src/api-impl/android/widget/MultiAutoCompleteTextView.java new file mode 100644 index 00000000..375e7906 --- /dev/null +++ b/src/api-impl/android/widget/MultiAutoCompleteTextView.java @@ -0,0 +1,14 @@ +package android.widget; + +import android.content.Context; + +public class MultiAutoCompleteTextView extends AutoCompleteTextView { + + public static interface Tokenizer {} + + public MultiAutoCompleteTextView(Context context) { + super(context); + } + + public void setTokenizer(Tokenizer tokenizer) {} +} \ No newline at end of file diff --git a/src/api-impl/android/widget/PopupMenu.java b/src/api-impl/android/widget/PopupMenu.java index 26bef5fc..c842a2fd 100644 --- a/src/api-impl/android/widget/PopupMenu.java +++ b/src/api-impl/android/widget/PopupMenu.java @@ -444,8 +444,7 @@ public class PopupMenu { @Override public Drawable getIcon() { - // TODO Auto-generated method stub - throw new UnsupportedOperationException("Unimplemented method 'getIcon'"); + return new Drawable(); } @Override @@ -476,6 +475,18 @@ public class PopupMenu { // TODO Auto-generated method stub throw new UnsupportedOperationException("Unimplemented method 'setOnActionExpandListener'"); } + + @Override + public boolean isChecked() { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'isChecked'"); + } + + @Override + public MenuItem setShowAsActionFlags(int action) { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'setShowAsActionFlags'"); + } } } \ No newline at end of file diff --git a/src/api-impl/android/widget/TextView.java b/src/api-impl/android/widget/TextView.java index 45182175..0b336b10 100644 --- a/src/api-impl/android/widget/TextView.java +++ b/src/api-impl/android/widget/TextView.java @@ -19,6 +19,7 @@ import android.text.method.TransformationMethod; import android.text.style.URLSpan; import android.util.AttributeSet; import android.util.TypedValue; +import android.view.ActionMode; import android.view.Gravity; import android.view.KeyEvent; import android.view.View; @@ -292,4 +293,8 @@ public class TextView extends View { public void nullLayouts() {} public void setLinkTextColor(int color) {} + + public void setCustomSelectionActionModeCallback(ActionMode.Callback actionModeCallback) {} + + public int getExtendedPaddingTop() {return 0;} } diff --git a/src/api-impl/meson.build b/src/api-impl/meson.build index befb9622..78fd76fb 100644 --- a/src/api-impl/meson.build +++ b/src/api-impl/meson.build @@ -207,6 +207,7 @@ hax_jar = jar('hax', [ 'android/graphics/drawable/ScaleDrawable.java', 'android/graphics/drawable/ShapeDrawable.java', 'android/graphics/drawable/StateListDrawable.java', + 'android/graphics/drawable/TransitionDrawable.java', 'android/graphics/drawable/VectorDrawable.java', 'android/graphics/drawable/shapes/OvalShape.java', 'android/graphics/drawable/shapes/RoundRectShape.java', @@ -339,6 +340,7 @@ hax_jar = jar('hax', [ 'android/text/TextUtils.java', 'android/text/TextWatcher.java', 'android/text/format/DateFormat.java', + 'android/text/format/DateUtils.java', 'android/text/format/Formatter.java', 'android/text/method/BaseMovementMethod.java', 'android/text/method/KeyListener.java', @@ -427,6 +429,7 @@ hax_jar = jar('hax', [ 'android/view/SurfaceHolder.java', 'android/view/SurfaceView.java', 'android/view/TextureView.java', + 'android/view/TouchDelegate.java', 'android/view/VelocityTracker.java', 'android/view/View.java', 'android/view/ViewConfiguration.java', @@ -495,6 +498,7 @@ hax_jar = jar('hax', [ 'android/widget/ListAdapter.java', 'android/widget/ListView.java', 'android/widget/MediaController.java', + 'android/widget/MultiAutoCompleteTextView.java', 'android/widget/OverScroller.java', 'android/widget/PopupMenu.java', 'android/widget/PopupWindow.java',