add Java APIs needed for WhatsApp MainActivity and ConversationActivity

This commit is contained in:
Julian Winkler
2024-08-25 11:20:01 +02:00
parent 9d8e091799
commit c492e1f03f
74 changed files with 903 additions and 69 deletions

View File

@@ -96,6 +96,7 @@ libtranslationlayer_so = shared_library('translation_layer_main', [
'src/api-impl-jni/content/android_content_res_XmlBlock.c',
'src/api-impl-jni/database/android_database_SQLiteCommon.c',
'src/api-impl-jni/database/android_database_SQLiteConnection.c',
'src/api-impl-jni/database/android_database_SQLiteGlobal.c',
'src/api-impl-jni/egl/com_google_android_gles_jni_EGLImpl.c',
'src/api-impl-jni/graphics/NinePatchPaintable.c',
'src/api-impl-jni/graphics/NinePatchPaintable.c',

View File

@@ -0,0 +1,37 @@
/*
* Copyright (C) 2011 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
/*
** Modified to support SQLite extensions by the SQLite developers:
** sqlite-dev@sqlite.org.
*/
/*
** Rewritten from C++ to C for Android Translation Layer:
*/
#include <jni.h>
#include <sqlite3.h>
#include "../generated_headers/android_database_sqlite_SQLiteGlobal.h"
// Limit heap to 8MB for now. This is 4 times the maximum cursor window
// size, as has been used by the original code in SQLiteDatabase for
// a long time.
static const int SOFT_HEAP_LIMIT = 8 * 1024 * 1024;
JNIEXPORT jint JNICALL Java_android_database_sqlite_SQLiteGlobal_nativeReleaseMemory(JNIEnv* env, jclass clazz) {
return sqlite3_release_memory(SOFT_HEAP_LIMIT);
}

View File

@@ -223,6 +223,14 @@ JNIEXPORT void JNICALL Java_android_widget_Button_native_1setText
JNIEXPORT void JNICALL Java_android_widget_Button_nativeSetOnClickListener
(JNIEnv *, jobject, jlong);
/*
* Class: android_widget_Button
* Method: getText
* Signature: ()Ljava/lang/CharSequence;
*/
JNIEXPORT jobject JNICALL Java_android_widget_Button_getText
(JNIEnv *, jobject);
#ifdef __cplusplus
}
#endif

View File

@@ -178,3 +178,26 @@ JNIEXPORT void JNICALL Java_android_graphics_Path_native_1addRoundRect__JLandroi
sk_path_add_rounded_rect(path, &(sk_rect_t){left, top, right, bottom}, radii_array[0], radii_array[1], (sk_path_direction_t)dir);
(*env)->ReleaseFloatArrayElements(env, radii, radii_array, 0);
}
JNIEXPORT void JNICALL Java_android_graphics_Path_native_1addOval(JNIEnv *env, jclass class, jlong path_ptr, jobject rect, jint dir)
{
sk_path_t *path = (sk_path_t *)_PTR(path_ptr);
float left = _GET_FLOAT_FIELD(rect, "left");
float top = _GET_FLOAT_FIELD(rect, "top");
float right = _GET_FLOAT_FIELD(rect, "right");
float bottom = _GET_FLOAT_FIELD(rect, "bottom");
sk_path_add_oval(path, &(sk_rect_t){left, top, right, bottom}, (sk_path_direction_t)dir);
}
JNIEXPORT void JNICALL Java_android_graphics_Path_native_1addCircle(JNIEnv *env, jclass class, jlong path_ptr, jfloat x, jfloat y, jfloat radius, jint dir)
{
sk_path_t *path = (sk_path_t *)_PTR(path_ptr);
sk_path_add_circle(path, x, y, radius, (sk_path_direction_t)dir);
}
JNIEXPORT void JNICALL Java_android_graphics_Path_native_1addPath__JJ(JNIEnv *env, jclass class, jlong path_ptr, jlong src_ptr)
{
sk_path_t *path = (sk_path_t *)_PTR(path_ptr);
sk_path_t *src = (sk_path_t *)_PTR(src_ptr);
sk_path_add_path(path, src, APPEND_SK_PATH_ADD_MODE);
}

View File

@@ -480,7 +480,8 @@ JNIEXPORT void JNICALL Java_android_view_View_setBackgroundColor(JNIEnv *env, jo
gtk_style_context_add_provider(style_context, GTK_STYLE_PROVIDER(css_provider), GTK_STYLE_PROVIDER_PRIORITY_APPLICATION);
g_object_set_data(G_OBJECT(widget), "background_color_style_provider", css_provider);
widget_set_needs_allocation(widget);
if (((color >> 24) & 0xFF) != 0)
widget_set_needs_allocation(widget);
}
#pragma GCC diagnostic pop

View File

@@ -45,3 +45,9 @@ JNIEXPORT void JNICALL Java_android_widget_Button_nativeSetOnClickListener(JNIEn
g_signal_connect(button, "clicked", G_CALLBACK(clicked_cb), NULL);
}
JNIEXPORT jobject JNICALL Java_android_widget_Button_getText(JNIEnv *env, jobject this)
{
GtkButton *button = GTK_BUTTON(_PTR(_GET_LONG_FIELD(this, "widget")));
return (*env)->NewStringUTF(env, gtk_button_get_label(button));
}

View File

@@ -49,6 +49,10 @@ JNIEXPORT void JNICALL Java_android_widget_CheckBox_setOnCheckedChangeListener(J
JNIEXPORT void JNICALL Java_android_widget_CheckBox_setText(JNIEnv *env, jobject this, jstring text)
{
GtkCheckButton *button = GTK_CHECK_BUTTON(_PTR(_GET_LONG_FIELD(this, "widget")));
if (text == NULL) {
gtk_check_button_set_label(button, NULL);
return;
}
const char *text_str = (*env)->GetStringUTFChars(env, text, NULL);
gtk_check_button_set_label(button, text_str);
(*env)->ReleaseStringUTFChars(env, text, text_str);

View File

@@ -29,4 +29,8 @@ public class Animator {
public void setInterpolator(TimeInterpolator i) {}
public void setStartDelay(long startDelay) {}
public boolean isStarted() { return false; }
}

View File

@@ -33,7 +33,7 @@ import java.util.Map;
public class Activity extends ContextThemeWrapper implements Window.Callback {
LayoutInflater layout_inflater;
Window window = new Window(this);
Window window = new Window(this, this);
int requested_orientation = -1 /*ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED*/; // dummy
public Intent intent;
private Activity resultActivity;
@@ -369,9 +369,10 @@ public class Activity extends ContextThemeWrapper implements Window.Callback {
runOnUiThread(new Runnable() {
@Override
public void run() {
nativeFinish(getWindow().native_window);
getWindow().setContentView(null);
window = null;
if (window != null) {
nativeFinish(getWindow().native_window);
window = null;
}
}
});
}
@@ -529,6 +530,14 @@ public class Activity extends ContextThemeWrapper implements Window.Callback {
public void overridePendingTransition(int enterAnim, int exitAnim) {}
public boolean isTaskRoot() {
return false;
}
public void postponeEnterTransition() {}
public void startPostponedEnterTransition() {}
private native void nativeFinish(long native_window);
public static native void nativeRecreateActivity(Activity activity);
public static native void nativeStartActivity(Activity activity);

View File

@@ -20,6 +20,10 @@ public class ActivityManager {
public long availMem = 10000;
public long totalMem = 10000;
public long threshold = 200;
public boolean lowMemory = false;
}
public void getMemoryInfo(MemoryInfo outInfo)

View File

@@ -0,0 +1,6 @@
package android.app;
public class DatePickerDialog {
public interface OnDateSetListener {}
}

View File

@@ -27,7 +27,7 @@ public class Dialog implements Window.Callback, DialogInterface {
public Dialog(Context context, int themeResId) {
this.context = context;
nativePtr = nativeInit();
window = new Window(this);
window = new Window(context, this);
window.native_window = nativePtr;
}

View File

@@ -188,6 +188,8 @@ public class Notification implements Parcelable {
public Builder addExtras(Bundle extras) {return this;}
public Builder addRemoteInput(RemoteInput remoteInput) {return this;}
public Action build() {
return action;
}
@@ -210,5 +212,19 @@ public class Notification implements Parcelable {
public BigTextStyle setBigContentTitle(CharSequence title) {return this;}
public BigTextStyle bigText(CharSequence text) {return this;}
public BigTextStyle setSummaryText(CharSequence summaryText) {return this;}
}
public static class InboxStyle extends Style {
public InboxStyle(Notification.Builder builder) {}
public InboxStyle setBigContentTitle(CharSequence title) {return this;}
public InboxStyle setSummaryText(CharSequence summaryText) {return this;}
public InboxStyle addLine(CharSequence line) {return this;}
}
}

View File

@@ -0,0 +1,23 @@
package android.app;
import android.os.Bundle;
public class RemoteInput {
public static class Builder {
public Builder(String resultKey) {}
public Builder setLabel(CharSequence label) {return this;}
public Builder setChoices(CharSequence[] choices) {return this;}
public Builder setAllowFreeFormInput(boolean allowFreeFormInput) {return this;}
public Builder addExtras(Bundle extras) {return this;}
public RemoteInput build() {
return new RemoteInput();
}
}
}

View File

@@ -40,4 +40,8 @@ public abstract class Service extends Context {
public void stopSelf() {
System.out.println("Service.stopSelf() called");
}
public void attachBaseContext(Context newBase) {
System.out.println("Service.attachBaseContext(" + newBase + ") called");
}
}

View File

@@ -1,10 +1,15 @@
package android.appwidget;
import android.content.ComponentName;
import android.content.Context;
public class AppWidgetManager {
public static AppWidgetManager getInstance(Context context) {
return new AppWidgetManager();
}
public static AppWidgetManager getInstance(Context context) {
return new AppWidgetManager();
}
public int[] getAppWidgetIds(ComponentName provider) {
return new int[0];
}
}

View File

@@ -0,0 +1,4 @@
package android.appwidget;
public class AppWidgetProvider {
}

View File

@@ -418,6 +418,7 @@ public class Context extends Object {
Class<? extends Service> cls = Class.forName(component.getClassName()).asSubclass(Service.class);
if (!runningServices.containsKey(cls)) {
Service service = cls.getConstructor().newInstance();
service.attachBaseContext(new Context());
service.onCreate();
runningServices.put(cls, service);
}

View File

@@ -6,7 +6,7 @@ import android.os.Parcelable;
import java.io.Serializable;
import java.util.ArrayList;
public class Intent {
public class Intent implements Parcelable {
private ComponentName component;
private Bundle extras = new Bundle();
private String action;
@@ -316,13 +316,26 @@ public class Intent {
}
public String getPackage() {
return component.getPackageName();
return component == null ? null : component.getPackageName();
}
public String getScheme() {
return data == null ? null : data.getScheme();
}
public Intent putStringArrayListExtra(String name, ArrayList<String> value) {
extras.putStringArrayList(name, value);
return this;
}
public ArrayList<String> getStringArrayListExtra(String name) {
return extras.getStringArrayList(name);
}
public ClipData getClipData() {
return null;
}
public static class ShortcutIconResource {
public static ShortcutIconResource fromContext(Context context, int id) {

View File

@@ -0,0 +1,216 @@
package android.database;
import android.content.ContentResolver;
import android.net.Uri;
import android.os.Bundle;
public class CursorWrapper implements Cursor {
private Cursor cursor;
public CursorWrapper(Cursor cursor) {
this.cursor = cursor;
}
@Override
public int getCount() {
return cursor.getCount();
}
@Override
public int getPosition() {
return cursor.getPosition();
}
@Override
public boolean move(int offset) {
return cursor.move(offset);
}
@Override
public boolean moveToPosition(int position) {
return cursor.moveToPosition(position);
}
@Override
public boolean moveToFirst() {
return cursor.moveToFirst();
}
@Override
public boolean moveToLast() {
return cursor.moveToLast();
}
@Override
public boolean moveToNext() {
return cursor.moveToNext();
}
@Override
public boolean moveToPrevious() {
return cursor.moveToPrevious();
}
@Override
public boolean isFirst() {
return cursor.isFirst();
}
@Override
public boolean isLast() {
return cursor.isLast();
}
@Override
public boolean isBeforeFirst() {
return cursor.isBeforeFirst();
}
@Override
public boolean isAfterLast() {
return cursor.isAfterLast();
}
@Override
public int getColumnIndex(String columnName) {
return cursor.getColumnIndex(columnName);
}
@Override
public int getColumnIndexOrThrow(String columnName) throws IllegalArgumentException {
return cursor.getColumnIndexOrThrow(columnName);
}
@Override
public String getColumnName(int columnIndex) {
return cursor.getColumnName(columnIndex);
}
@Override
public String[] getColumnNames() {
return cursor.getColumnNames();
}
@Override
public int getColumnCount() {
return cursor.getColumnCount();
}
@Override
public byte[] getBlob(int columnIndex) {
return cursor.getBlob(columnIndex);
}
@Override
public String getString(int columnIndex) {
return cursor.getString(columnIndex);
}
@Override
public void copyStringToBuffer(int columnIndex, CharArrayBuffer buffer) {
cursor.copyStringToBuffer(columnIndex, buffer);
}
@Override
public short getShort(int columnIndex) {
return cursor.getShort(columnIndex);
}
@Override
public int getInt(int columnIndex) {
return cursor.getInt(columnIndex);
}
@Override
public long getLong(int columnIndex) {
return cursor.getLong(columnIndex);
}
@Override
public float getFloat(int columnIndex) {
return cursor.getFloat(columnIndex);
}
@Override
public double getDouble(int columnIndex) {
return cursor.getDouble(columnIndex);
}
@Override
public int getType(int columnIndex) {
return cursor.getType(columnIndex);
}
@Override
public boolean isNull(int columnIndex) {
return cursor.isNull(columnIndex);
}
@SuppressWarnings("deprecation")
@Override
public void deactivate() {
cursor.deactivate();
}
@SuppressWarnings("deprecation")
@Override
public boolean requery() {
return cursor.requery();
}
@Override
public void close() {
cursor.close();
}
@Override
public boolean isClosed() {
return cursor.isClosed();
}
@Override
public void registerContentObserver(ContentObserver observer) {
cursor.registerContentObserver(observer);
}
@Override
public void unregisterContentObserver(ContentObserver observer) {
cursor.unregisterContentObserver(observer);
}
@Override
public void registerDataSetObserver(DataSetObserver observer) {
cursor.registerDataSetObserver(observer);
}
@Override
public void unregisterDataSetObserver(DataSetObserver observer) {
cursor.unregisterDataSetObserver(observer);
}
@Override
public void setNotificationUri(ContentResolver cr, Uri uri) {
cursor.setNotificationUri(cr, uri);
}
@Override
public Uri getNotificationUri() {
return cursor.getNotificationUri();
}
@Override
public boolean getWantsAllOnMoveCalls() {
return cursor.getWantsAllOnMoveCalls();
}
@Override
public Bundle getExtras() {
return cursor.getExtras();
}
@Override
public Bundle respond(Bundle extras) {
return cursor.respond(extras);
}
}

Some files were not shown because too many files have changed in this diff Show More