From 0e078894ceb6b5be7e6a9cdcc6be574e9346bd6b Mon Sep 17 00:00:00 2001 From: Julian Winkler Date: Fri, 13 Dec 2024 16:25:07 +0100 Subject: [PATCH] make K-9 Mail launch --- .../android/animation/AnimatorSet.java | 5 ++ src/api-impl/android/app/Activity.java | 70 +++++++++---------- src/api-impl/android/content/Context.java | 6 +- src/api-impl/android/content/Intent.java | 14 ++++ .../android/content/IntentFilter.java | 11 +++ .../android/content/pm/PackageManager.java | 4 +- .../android/content/pm/ResolveInfo.java | 3 + .../android/content/res/Resources.java | 4 ++ src/api-impl/android/graphics/Picture.java | 10 +++ .../net/SSLCertificateSocketFactory.java | 4 ++ .../text/style/MetricAffectingSpan.java | 4 ++ src/api-impl/android/view/HardwareCanvas.java | 6 ++ src/api-impl/android/widget/ViewAnimator.java | 2 + src/api-impl/meson.build | 3 + 14 files changed, 101 insertions(+), 45 deletions(-) create mode 100644 src/api-impl/android/graphics/Picture.java create mode 100644 src/api-impl/android/net/SSLCertificateSocketFactory.java create mode 100644 src/api-impl/android/view/HardwareCanvas.java diff --git a/src/api-impl/android/animation/AnimatorSet.java b/src/api-impl/android/animation/AnimatorSet.java index 17246967..b7231ffb 100644 --- a/src/api-impl/android/animation/AnimatorSet.java +++ b/src/api-impl/android/animation/AnimatorSet.java @@ -1,5 +1,6 @@ package android.animation; +import java.util.ArrayList; import java.util.Collection; public class AnimatorSet extends Animator { @@ -29,4 +30,8 @@ public class AnimatorSet extends Animator { public void playTogether(Animator[] animators) {} + public ArrayList getChildAnimations() { + return new ArrayList(0); + } + } diff --git a/src/api-impl/android/app/Activity.java b/src/api-impl/android/app/Activity.java index 7fda8cfa..9b3820fc 100644 --- a/src/api-impl/android/app/Activity.java +++ b/src/api-impl/android/app/Activity.java @@ -40,7 +40,6 @@ public class Activity extends ContextThemeWrapper implements Window.Callback { public static final int RESULT_CANCELED = 0; public static final int RESULT_OK = -1; - LayoutInflater layout_inflater; Window window = new Window(this, this); int requested_orientation = -1 /*ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED*/; // dummy public Intent intent; @@ -51,6 +50,33 @@ public class Activity extends ContextThemeWrapper implements Window.Callback { List fragments = new ArrayList<>(); boolean destroyed = false; + public static Activity internalCreateActivity(String className, long native_window, Intent intent) throws ReflectiveOperationException { + int themeResId = 0; + CharSequence label = null; + CharSequence app_label = null; + for (PackageParser.Activity activity: pkg.activities) { + if (className.equals(activity.className)) { + label = r.getText(activity.info.labelRes); + themeResId = activity.info.getThemeResource(); + break; + } + } + Class cls = Class.forName(className).asSubclass(Activity.class); + Constructor constructor = cls.getConstructor(); + Activity activity = constructor.newInstance(); + activity.window.native_window = native_window; + activity.intent = intent; + activity.attachBaseContext(new Context()); + activity.setTheme(themeResId); + app_label = r.getText(pkg.applicationInfo.labelRes); + if (label != null) { + activity.setTitle(label); + } else if (app_label != null) { + activity.setTitle(app_label); + } + return activity; + } + /** * Helper function to be called from native code to construct main activity * @@ -80,39 +106,11 @@ public class Activity extends ContextThemeWrapper implements Window.Callback { System.err.println("Failed to find Activity to launch URI: " + uri); System.exit(1); } - Class cls = Class.forName(className).asSubclass(Activity.class); - Constructor constructor = cls.getConstructor(); - Activity activity = constructor.newInstance(); - activity.window.native_window = native_window; - if (uri != null) - activity.setIntent(new Intent("android.intent.action.VIEW", uri)); - return activity; + return internalCreateActivity(className, native_window, uri != null ? new Intent("android.intent.action.VIEW", uri) : new Intent()); } public Activity() { super(null); - layout_inflater = new LayoutInflater(this); - intent = new Intent(); - - CharSequence label = null; - CharSequence app_label = null; - int themeResId = 0; - for (PackageParser.Activity activity: pkg.activities) { - if (getClass().getName().equals(activity.className)) { - label = r.getText(activity.info.labelRes); - themeResId = activity.info.getThemeResource(); - break; - } - } - - app_label = r.getText(pkg.applicationInfo.labelRes); - if (label != null) { - setTitle(label); - } else if (app_label != null) { - setTitle(app_label); - } - attachBaseContext(new Context()); - setTheme(themeResId); } public View root_view; @@ -262,7 +260,7 @@ public class Activity extends ContextThemeWrapper implements Window.Callback { public void setContentView(int layoutResID) throws Exception { Slog.i(TAG, "- setContentView - yay!"); - root_view = layout_inflater.inflate(layoutResID, null, false); + root_view = getLayoutInflater().inflate(layoutResID, null, false); System.out.println("~~~~~~~~~~~"); System.out.println(root_view.toString()); @@ -411,7 +409,7 @@ public class Activity extends ContextThemeWrapper implements Window.Callback { } public LayoutInflater getLayoutInflater() { - return layout_inflater; + return new LayoutInflater(this); } public boolean isChangingConfigurations() {return false;} @@ -511,14 +509,10 @@ public class Activity extends ContextThemeWrapper implements Window.Callback { public void recreate() { try { /* TODO: check if this is a toplevel activity */ - Class cls = this.getClass(); - Constructor constructor = cls.getConstructor(); - Activity activity = constructor.newInstance(); - activity.getWindow().native_window = getWindow().native_window; - Slog.i(TAG, "activity.getWindow().native_window >"+activity.getWindow().native_window+"<"); + Activity activity = internalCreateActivity(this.getClass().getName(), getWindow().native_window, intent); nativeFinish(0); nativeStartActivity(activity); - } catch (NoSuchMethodException | SecurityException | InstantiationException | IllegalAccessException | IllegalArgumentException | InvocationTargetException e) { + } catch (ReflectiveOperationException e) { Slog.i(TAG, "exception in Activity.recreate, this is kinda sus"); e.printStackTrace(); } diff --git a/src/api-impl/android/content/Context.java b/src/api-impl/android/content/Context.java index cada1526..e2eb9dd1 100644 --- a/src/api-impl/android/content/Context.java +++ b/src/api-impl/android/content/Context.java @@ -538,11 +538,7 @@ public class Context extends Object { @Override public void run() { try { - Class cls = Class.forName(intent_.getComponent().getClassName()).asSubclass(Activity.class); - Constructor constructor = cls.getConstructor(); - Activity activity = constructor.newInstance(); - activity.intent = intent_; - activity.getWindow().native_window = this_application.native_window; + Activity activity = Activity.internalCreateActivity(intent_.getComponent().getClassName(), this_application.native_window, intent_); Activity.nativeStartActivity(activity); } catch (Exception e) { e.printStackTrace(); diff --git a/src/api-impl/android/content/Intent.java b/src/api-impl/android/content/Intent.java index ff3477c4..96afa0e3 100644 --- a/src/api-impl/android/content/Intent.java +++ b/src/api-impl/android/content/Intent.java @@ -5,6 +5,8 @@ import android.os.Bundle; import android.os.Parcelable; import java.io.Serializable; import java.util.ArrayList; +import java.util.Collections; +import java.util.Set; public class Intent implements Parcelable { public static final String ACTION_MAIN = "android.intent.action.MAIN"; @@ -350,4 +352,16 @@ public class Intent implements Parcelable { public Intent setClassName(Context packageContext, String className) { return this; } + + public String resolveTypeIfNeeded(ContentResolver resolver) { + return type; + } + + public Set getCategories() { + return Collections.emptySet(); + } + + public byte[] getByteArrayExtra(String name) { + return extras.getByteArray(name); + } } diff --git a/src/api-impl/android/content/IntentFilter.java b/src/api-impl/android/content/IntentFilter.java index 00774220..c5aa4e2f 100644 --- a/src/api-impl/android/content/IntentFilter.java +++ b/src/api-impl/android/content/IntentFilter.java @@ -4,6 +4,9 @@ import java.util.ArrayList; import java.util.HashSet; import java.util.List; import java.util.Set; + +import android.net.Uri; + import java.util.Iterator; public class IntentFilter { @@ -64,4 +67,12 @@ public class IntentFilter { public final Iterator actionsIterator() { return actions.iterator(); } + + public boolean hasAction(String action) { + return actions.contains(action); + } + + public int match(String action, String type, String scheme, Uri data, Set categories, String logTag) { + return -1/*NO_MATCH_TYPE*/; + } } diff --git a/src/api-impl/android/content/pm/PackageManager.java b/src/api-impl/android/content/pm/PackageManager.java index ed3e5618..e5408412 100644 --- a/src/api-impl/android/content/pm/PackageManager.java +++ b/src/api-impl/android/content/pm/PackageManager.java @@ -1814,10 +1814,10 @@ public class PackageManager { // TODO: we shouldn't just automatically grant these once we have bubblewrap set up // for now, the app can access anything it wants, so no point telling it otherwise case "android.permission.WRITE_EXTERNAL_STORAGE": - return PERMISSION_GRANTED; case "android.permission.READ_EXTERNAL_STORAGE": - return PERMISSION_GRANTED; case "com.google.android.c2dm.permission.SEND": + case "com.fsck.k9.DYNAMIC_RECEIVER_NOT_EXPORTED_PERMISSION": + case "net.thunderbird.android.DYNAMIC_RECEIVER_NOT_EXPORTED_PERMISSION": return PERMISSION_GRANTED; default: System.out.println("PackageManager.checkPermission: >" + permName + "< not handled\n"); diff --git a/src/api-impl/android/content/pm/ResolveInfo.java b/src/api-impl/android/content/pm/ResolveInfo.java index 7ba07794..a7def7a6 100644 --- a/src/api-impl/android/content/pm/ResolveInfo.java +++ b/src/api-impl/android/content/pm/ResolveInfo.java @@ -1,8 +1,11 @@ package android.content.pm; +import android.content.IntentFilter; + public class ResolveInfo { public ActivityInfo activityInfo = new ActivityInfo(); public ServiceInfo serviceInfo = new ServiceInfo(); + public IntentFilter filter = new IntentFilter(); public static class DisplayNameComparator { diff --git a/src/api-impl/android/content/res/Resources.java b/src/api-impl/android/content/res/Resources.java index 2ed1a211..d683b908 100644 --- a/src/api-impl/android/content/res/Resources.java +++ b/src/api-impl/android/content/res/Resources.java @@ -1466,6 +1466,10 @@ public class Resources { theme = mAssets.createTheme(); } + public Resources getResources() { + return Resources.this; + } + private final AssetManager mAssets; } diff --git a/src/api-impl/android/graphics/Picture.java b/src/api-impl/android/graphics/Picture.java new file mode 100644 index 00000000..209f5615 --- /dev/null +++ b/src/api-impl/android/graphics/Picture.java @@ -0,0 +1,10 @@ +package android.graphics; + +public class Picture { + + public Canvas beginRecording(int width, int height) { + return new Canvas(Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888)); + } + + public void endRecording() {} +} diff --git a/src/api-impl/android/net/SSLCertificateSocketFactory.java b/src/api-impl/android/net/SSLCertificateSocketFactory.java new file mode 100644 index 00000000..8d8cf852 --- /dev/null +++ b/src/api-impl/android/net/SSLCertificateSocketFactory.java @@ -0,0 +1,4 @@ +package android.net; + +public class SSLCertificateSocketFactory { +} diff --git a/src/api-impl/android/text/style/MetricAffectingSpan.java b/src/api-impl/android/text/style/MetricAffectingSpan.java index bcabef9b..4b77d167 100644 --- a/src/api-impl/android/text/style/MetricAffectingSpan.java +++ b/src/api-impl/android/text/style/MetricAffectingSpan.java @@ -1,5 +1,9 @@ package android.text.style; +import android.text.TextPaint; + public class MetricAffectingSpan { + public void updateMeasureState(TextPaint paint) {} + } diff --git a/src/api-impl/android/view/HardwareCanvas.java b/src/api-impl/android/view/HardwareCanvas.java new file mode 100644 index 00000000..6fd2d4b5 --- /dev/null +++ b/src/api-impl/android/view/HardwareCanvas.java @@ -0,0 +1,6 @@ +package android.view; + +import android.graphics.Canvas; + +public class HardwareCanvas extends Canvas { +} diff --git a/src/api-impl/android/widget/ViewAnimator.java b/src/api-impl/android/widget/ViewAnimator.java index f323a33d..6e38e391 100644 --- a/src/api-impl/android/widget/ViewAnimator.java +++ b/src/api-impl/android/widget/ViewAnimator.java @@ -11,4 +11,6 @@ public class ViewAnimator extends ViewGroup { } public void setDisplayedChild(int index) {} + + public int getDisplayedChild() { return 0; } } diff --git a/src/api-impl/meson.build b/src/api-impl/meson.build index 50d98eca..2edec5ca 100644 --- a/src/api-impl/meson.build +++ b/src/api-impl/meson.build @@ -191,6 +191,7 @@ srcs = [ 'android/graphics/Path.java', 'android/graphics/PathEffect.java', 'android/graphics/PathMeasure.java', + 'android/graphics/Picture.java', 'android/graphics/PixelFormat.java', 'android/graphics/Point.java', 'android/graphics/PointF.java', @@ -262,6 +263,7 @@ srcs = [ 'android/net/ConnectivityManager.java', 'android/net/NetworkInfo.java', 'android/net/NetworkRequest.java', + 'android/net/SSLCertificateSocketFactory.java', 'android/net/SSLSessionCache.java', 'android/net/TrafficStats.java', 'android/net/Uri.java', @@ -439,6 +441,7 @@ srcs = [ 'android/view/ContextThemeWrapper.java', 'android/view/Display.java', 'android/view/GestureDetector.java', + 'android/view/HardwareCanvas.java', 'android/view/Gravity.java', 'android/view/InflateException.java', 'android/view/InputDevice.java',