diff --git a/meson.build b/meson.build index 4b829083..c7917a3c 100644 --- a/meson.build +++ b/meson.build @@ -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', diff --git a/src/api-impl-jni/database/android_database_SQLiteGlobal.c b/src/api-impl-jni/database/android_database_SQLiteGlobal.c new file mode 100644 index 00000000..a0845943 --- /dev/null +++ b/src/api-impl-jni/database/android_database_SQLiteGlobal.c @@ -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 + +#include + +#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); +} diff --git a/src/api-impl-jni/generated_headers/android_widget_Button.h b/src/api-impl-jni/generated_headers/android_widget_Button.h index e93ea795..d0e629f4 100644 --- a/src/api-impl-jni/generated_headers/android_widget_Button.h +++ b/src/api-impl-jni/generated_headers/android_widget_Button.h @@ -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 diff --git a/src/api-impl-jni/graphics/android_graphics_Path.c b/src/api-impl-jni/graphics/android_graphics_Path.c index facecf4a..591a3778 100644 --- a/src/api-impl-jni/graphics/android_graphics_Path.c +++ b/src/api-impl-jni/graphics/android_graphics_Path.c @@ -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); +} diff --git a/src/api-impl-jni/views/android_view_View.c b/src/api-impl-jni/views/android_view_View.c index 28728d36..2886fa1f 100644 --- a/src/api-impl-jni/views/android_view_View.c +++ b/src/api-impl-jni/views/android_view_View.c @@ -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 diff --git a/src/api-impl-jni/widgets/android_widget_Button.c b/src/api-impl-jni/widgets/android_widget_Button.c index 949037b3..80da0fce 100644 --- a/src/api-impl-jni/widgets/android_widget_Button.c +++ b/src/api-impl-jni/widgets/android_widget_Button.c @@ -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)); +} diff --git a/src/api-impl-jni/widgets/android_widget_CheckBox.c b/src/api-impl-jni/widgets/android_widget_CheckBox.c index ec9d287c..1cf67165 100644 --- a/src/api-impl-jni/widgets/android_widget_CheckBox.c +++ b/src/api-impl-jni/widgets/android_widget_CheckBox.c @@ -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); diff --git a/src/api-impl/android/animation/Animator.java b/src/api-impl/android/animation/Animator.java index 7dc3153a..c8200bf5 100644 --- a/src/api-impl/android/animation/Animator.java +++ b/src/api-impl/android/animation/Animator.java @@ -29,4 +29,8 @@ public class Animator { public void setInterpolator(TimeInterpolator i) {} + public void setStartDelay(long startDelay) {} + + public boolean isStarted() { return false; } + } diff --git a/src/api-impl/android/app/Activity.java b/src/api-impl/android/app/Activity.java index 0055327e..9e22036c 100644 --- a/src/api-impl/android/app/Activity.java +++ b/src/api-impl/android/app/Activity.java @@ -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); diff --git a/src/api-impl/android/app/ActivityManager.java b/src/api-impl/android/app/ActivityManager.java index d5f9103a..25d5d221 100644 --- a/src/api-impl/android/app/ActivityManager.java +++ b/src/api-impl/android/app/ActivityManager.java @@ -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) diff --git a/src/api-impl/android/app/DatePickerDialog.java b/src/api-impl/android/app/DatePickerDialog.java new file mode 100644 index 00000000..e28bf534 --- /dev/null +++ b/src/api-impl/android/app/DatePickerDialog.java @@ -0,0 +1,6 @@ +package android.app; + +public class DatePickerDialog { + + public interface OnDateSetListener {} +} diff --git a/src/api-impl/android/app/Dialog.java b/src/api-impl/android/app/Dialog.java index 9bcdb48f..b3d169e2 100644 --- a/src/api-impl/android/app/Dialog.java +++ b/src/api-impl/android/app/Dialog.java @@ -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; } diff --git a/src/api-impl/android/app/Notification.java b/src/api-impl/android/app/Notification.java index c9a0e544..3078ffd5 100644 --- a/src/api-impl/android/app/Notification.java +++ b/src/api-impl/android/app/Notification.java @@ -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;} + } } diff --git a/src/api-impl/android/app/RemoteInput.java b/src/api-impl/android/app/RemoteInput.java new file mode 100644 index 00000000..4a77d3d5 --- /dev/null +++ b/src/api-impl/android/app/RemoteInput.java @@ -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(); + } + } +} diff --git a/src/api-impl/android/app/Service.java b/src/api-impl/android/app/Service.java index 7f39765e..11dd8f4f 100644 --- a/src/api-impl/android/app/Service.java +++ b/src/api-impl/android/app/Service.java @@ -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"); + } } diff --git a/src/api-impl/android/appwidget/AppWidgetManager.java b/src/api-impl/android/appwidget/AppWidgetManager.java index 6542857d..53d7a64b 100644 --- a/src/api-impl/android/appwidget/AppWidgetManager.java +++ b/src/api-impl/android/appwidget/AppWidgetManager.java @@ -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]; + } } diff --git a/src/api-impl/android/appwidget/AppWidgetProvider.java b/src/api-impl/android/appwidget/AppWidgetProvider.java new file mode 100644 index 00000000..a5501373 --- /dev/null +++ b/src/api-impl/android/appwidget/AppWidgetProvider.java @@ -0,0 +1,4 @@ +package android.appwidget; + +public class AppWidgetProvider { +} diff --git a/src/api-impl/android/content/Context.java b/src/api-impl/android/content/Context.java index 3817ed2d..2d5d8263 100644 --- a/src/api-impl/android/content/Context.java +++ b/src/api-impl/android/content/Context.java @@ -418,6 +418,7 @@ public class Context extends Object { Class 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); } diff --git a/src/api-impl/android/content/Intent.java b/src/api-impl/android/content/Intent.java index 700631a4..d791a29e 100644 --- a/src/api-impl/android/content/Intent.java +++ b/src/api-impl/android/content/Intent.java @@ -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 value) { + extras.putStringArrayList(name, value); + return this; + } + + public ArrayList getStringArrayListExtra(String name) { + return extras.getStringArrayList(name); + } + + public ClipData getClipData() { + return null; + } + public static class ShortcutIconResource { public static ShortcutIconResource fromContext(Context context, int id) { diff --git a/src/api-impl/android/database/CursorWrapper.java b/src/api-impl/android/database/CursorWrapper.java new file mode 100644 index 00000000..24424a54 --- /dev/null +++ b/src/api-impl/android/database/CursorWrapper.java @@ -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); + } +} diff --git a/src/api-impl/android/graphics/BitmapFactory.java b/src/api-impl/android/graphics/BitmapFactory.java index 35e0512c..a83de361 100644 --- a/src/api-impl/android/graphics/BitmapFactory.java +++ b/src/api-impl/android/graphics/BitmapFactory.java @@ -566,6 +566,10 @@ public class BitmapFactory { } setDensityFromOptions(bm, opts); + if (bm != null && opts != null) { + opts.outWidth = bm.getWidth(); + opts.outHeight = bm.getHeight(); + } } finally { Trace.traceEnd(Trace.TRACE_TAG_GRAPHICS); } diff --git a/src/api-impl/android/graphics/Canvas.java b/src/api-impl/android/graphics/Canvas.java index 309d3f01..8c554143 100644 --- a/src/api-impl/android/graphics/Canvas.java +++ b/src/api-impl/android/graphics/Canvas.java @@ -399,7 +399,14 @@ public class Canvas { native_drawLine(skia_canvas, widget, startX, startY, stopX, stopY, paint.skia_paint); } - public void setBitmap(Bitmap bitmap) {} + public void setBitmap(Bitmap bitmap) { + if (skia_canvas != 0) { + native_destroy_canvas(skia_canvas); + } + bitmap.destroyTexture(); // invalidate cached texture + this.skia_canvas = native_canvas_from_bitmap(bitmap.pixbuf); + this.widget = 0; + } public void drawPath(Path path, Paint paint) { native_drawPath(skia_canvas, path.mNativePath, paint.skia_paint); @@ -445,6 +452,20 @@ public class Canvas { public void drawColor(int dummy) {} + public void drawARGB(int a, int r, int g, int b) {} + + public int saveLayer(RectF bounds, Paint paint, int flags) { + return save(); + } + + public void drawOval(RectF oval, Paint paint) {} + + public boolean clipRect(int left, int top, int right, int bottom) { + return false; + } + + public void drawColor(int color, PorterDuff.Mode mode) {} + private static native long native_canvas_from_bitmap(long pixbuf); private static native void native_save(long skia_canvas, long widget); diff --git a/src/api-impl/android/graphics/Path.java b/src/api-impl/android/graphics/Path.java index 5934f5a9..9fd77ee4 100644 --- a/src/api-impl/android/graphics/Path.java +++ b/src/api-impl/android/graphics/Path.java @@ -423,6 +423,10 @@ public class Path { native_arcTo(mNativePath, oval, startAngle, sweepAngle, false); } + public void arcTo(float left, float top, float right, float bottom, float startAngle, float sweepAngle, boolean forceMoveTo) { + arcTo(new RectF(left, top, right, bottom), startAngle, sweepAngle, forceMoveTo); + } + /** * Close the current contour. If the current point is not equal to the * first point of the contour, a line segment is automatically added. diff --git a/src/api-impl/android/graphics/drawable/BitmapDrawable.java b/src/api-impl/android/graphics/drawable/BitmapDrawable.java index b37bf0fe..17f4f35b 100644 --- a/src/api-impl/android/graphics/drawable/BitmapDrawable.java +++ b/src/api-impl/android/graphics/drawable/BitmapDrawable.java @@ -28,6 +28,11 @@ public class BitmapDrawable extends Drawable { this.paintable = bitmap.getTexture(); } + public BitmapDrawable(Bitmap bitmap) { + this.bitmap = bitmap; + this.paintable = bitmap.getTexture(); + } + public Bitmap getBitmap() { return bitmap; } diff --git a/src/api-impl/android/graphics/drawable/Drawable.java b/src/api-impl/android/graphics/drawable/Drawable.java index c20c6154..565c4166 100644 --- a/src/api-impl/android/graphics/drawable/Drawable.java +++ b/src/api-impl/android/graphics/drawable/Drawable.java @@ -14,6 +14,7 @@ import android.content.res.ColorStateList; import android.content.res.Resources; import android.content.res.XmlResourceParser; import android.content.res.Resources.Theme; +import android.graphics.BitmapFactory; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.ColorFilter; @@ -54,7 +55,24 @@ public class Drawable { public void setChangingConfigurations(int bitmap) {} public ConstantState getConstantState() { - return null; + return new ConstantState() { + + @Override + public Drawable newDrawable(Resources res) { + return Drawable.this; + } + + @Override + public Drawable newDrawable() { + return Drawable.this; + } + + @Override + public int getChangingConfigurations() { + return Drawable.this.getChangingConfigurations(); + } + + }; } public static abstract class ConstantState { @@ -220,12 +238,17 @@ public class Drawable { LayerDrawable drawable = new LayerDrawable(); drawable.inflate(resources, parser, attrs); return drawable; + } else if ("nine-patch".equals(parser.getName())) { + return new NinePatchDrawable(resources, null, null, null, null); } return null; } public static Drawable createFromResourceStream(Resources resources, TypedValue value, InputStream is, String file, Object object) { + if (!file.endsWith(".9.png")) { + return new BitmapDrawable(resources, BitmapFactory.decodeStream(is)); + } Path path = Paths.get(android.os.Environment.getExternalStorageDirectory().getPath(), file); if (!Files.exists(path)) { try (InputStream inputStream = ClassLoader.getSystemClassLoader().getResourceAsStream(file)) { diff --git a/src/api-impl/android/graphics/drawable/InsetDrawable.java b/src/api-impl/android/graphics/drawable/InsetDrawable.java index 4617d7d1..31af0e77 100644 --- a/src/api-impl/android/graphics/drawable/InsetDrawable.java +++ b/src/api-impl/android/graphics/drawable/InsetDrawable.java @@ -4,14 +4,22 @@ import android.graphics.Rect; public class InsetDrawable extends Drawable { + private Drawable drawable; + public InsetDrawable(Drawable drawable, int insetLeft, int insetTop, int insetRight, int insetBottom) { super(); + this.drawable = drawable; } public InsetDrawable(Drawable drawable, int inset) { super(); + this.drawable = drawable; } public boolean getPadding(Rect padding) { return false; } - + + public Drawable getDrawable() { + return drawable; + } + } diff --git a/src/api-impl/android/graphics/drawable/NinePatchDrawable.java b/src/api-impl/android/graphics/drawable/NinePatchDrawable.java new file mode 100644 index 00000000..f395ef5b --- /dev/null +++ b/src/api-impl/android/graphics/drawable/NinePatchDrawable.java @@ -0,0 +1,10 @@ +package android.graphics.drawable; + +import android.content.res.Resources; +import android.graphics.Bitmap; +import android.graphics.Rect; + +public class NinePatchDrawable extends Drawable { + + public NinePatchDrawable(Resources res, Bitmap bitmap, byte[] data, Rect padding, String name) {} +} diff --git a/src/api-impl/android/graphics/drawable/RippleDrawable.java b/src/api-impl/android/graphics/drawable/RippleDrawable.java index cdb92941..db322a49 100644 --- a/src/api-impl/android/graphics/drawable/RippleDrawable.java +++ b/src/api-impl/android/graphics/drawable/RippleDrawable.java @@ -2,8 +2,10 @@ package android.graphics.drawable; import android.content.res.ColorStateList; -public class RippleDrawable extends Drawable { +public class RippleDrawable extends LayerDrawable { - public RippleDrawable(ColorStateList colorStateList, Drawable drawable, Drawable drawable2) {} + public RippleDrawable(ColorStateList colorStateList, Drawable drawable, Drawable drawable2) { + super(new Drawable[] {drawable}); + } } diff --git a/src/api-impl/android/graphics/drawable/ShapeDrawable.java b/src/api-impl/android/graphics/drawable/ShapeDrawable.java index f5c1dd5d..3bdc3616 100644 --- a/src/api-impl/android/graphics/drawable/ShapeDrawable.java +++ b/src/api-impl/android/graphics/drawable/ShapeDrawable.java @@ -1,6 +1,7 @@ package android.graphics.drawable; import android.graphics.Paint; +import android.graphics.Rect; import android.graphics.drawable.shapes.Shape; public class ShapeDrawable extends Drawable { @@ -8,5 +9,9 @@ public class ShapeDrawable extends Drawable { public ShapeDrawable(Shape shape) {} public Paint getPaint() {return new Paint();} + + public void setPadding(Rect padding) {} + + public void setShape(Shape shape) {} } diff --git a/src/api-impl/android/os/BaseBundle.java b/src/api-impl/android/os/BaseBundle.java index ab69d825..bfa1989c 100644 --- a/src/api-impl/android/os/BaseBundle.java +++ b/src/api-impl/android/os/BaseBundle.java @@ -62,6 +62,15 @@ public class BaseBundle { return mMap.containsKey(key); } + /** + * Removes any entry with the given key from the mapping of this Bundle. + * + * @param key a String key + */ + public void remove(String key) { + mMap.remove(key); + } + /** * Returns the entry with the given key as an object. * @@ -169,6 +178,17 @@ public class BaseBundle { mMap.put(key, value); } + /** + * Inserts a String array value into the mapping of this Bundle, replacing + * any existing value for the given key. Either key or value may be null. + * + * @param key a String, or null + * @param value a String array object, or null + */ + public void putStringArray(String key, String[] value) { + mMap.put(key, value); + } + /** * Returns the number of mappings contained in this Bundle. * @@ -209,4 +229,25 @@ public class BaseBundle { public int getInt(String key) { return getInt(key, 0); } + + /** + * Returns the value associated with the given key, or null if + * no mapping of the desired type exists for the given key or a null + * value is explicitly associated with the key. + * + * @param key a String, or null + * @return a String[] value, or null + */ + public String[] getStringArray(String key) { + Object o = mMap.get(key); + if (o == null) { + return null; + } + try { + return (String[])o; + } catch (ClassCastException e) { + typeWarning(key, o, "String[]", e); + return null; + } + } } diff --git a/src/api-impl/android/os/Bundle.java b/src/api-impl/android/os/Bundle.java index e297e40d..ef37b21e 100644 --- a/src/api-impl/android/os/Bundle.java +++ b/src/api-impl/android/os/Bundle.java @@ -27,7 +27,7 @@ import java.util.List; * A mapping from String values to various Parcelable types. * */ -public final class Bundle extends BaseBundle implements Cloneable { +public final class Bundle extends BaseBundle implements Cloneable, Parcelable { static final boolean DEBUG = false; public static final Bundle EMPTY; @@ -188,15 +188,6 @@ public final class Bundle extends BaseBundle implements Cloneable { mFdsKnown = true; } - /** - * Removes any entry with the given key from the mapping of this Bundle. - * - * @param key a String key - */ - public void remove(String key) { - mMap.remove(key); - } - /** * Inserts all mappings from the given Bundle into this Bundle. * @@ -541,17 +532,6 @@ public final class Bundle extends BaseBundle implements Cloneable { mMap.put(key, value); } - /** - * Inserts a String array value into the mapping of this Bundle, replacing - * any existing value for the given key. Either key or value may be null. - * - * @param key a String, or null - * @param value a String array object, or null - */ - public void putStringArray(String key, String[] value) { - mMap.put(key, value); - } - /** * Inserts a CharSequence array value into the mapping of this Bundle, replacing * any existing value for the given key. Either key or value may be null. @@ -1196,27 +1176,6 @@ public final class Bundle extends BaseBundle implements Cloneable { } } - /** - * Returns the value associated with the given key, or null if - * no mapping of the desired type exists for the given key or a null - * value is explicitly associated with the key. - * - * @param key a String, or null - * @return a String[] value, or null - */ - public String[] getStringArray(String key) { - Object o = mMap.get(key); - if (o == null) { - return null; - } - try { - return (String[])o; - } catch (ClassCastException e) { - typeWarning(key, o, "String[]", e); - return null; - } - } - /** * Returns the value associated with the given key, or null if * no mapping of the desired type exists for the given key or a null diff --git a/src/api-impl/android/os/Debug.java b/src/api-impl/android/os/Debug.java index 089c6f16..87859bb2 100644 --- a/src/api-impl/android/os/Debug.java +++ b/src/api-impl/android/os/Debug.java @@ -15,4 +15,12 @@ public final class Debug { public static boolean isDebuggerConnected() { return false; } + + public static long getNativeHeapFreeSize() { + return 0; + } + + public static long getNativeHeapAllocatedSize() { + return 0; + } } diff --git a/src/api-impl/android/os/StrictMode.java b/src/api-impl/android/os/StrictMode.java index 16b0952b..384ab88c 100644 --- a/src/api-impl/android/os/StrictMode.java +++ b/src/api-impl/android/os/StrictMode.java @@ -20,6 +20,9 @@ public final class StrictMode { public Builder penaltyLog() { return this; } + public Builder detectNetwork() { + return this; + } public ThreadPolicy build() { return new ThreadPolicy(); } diff --git a/src/api-impl/android/provider/Settings.java b/src/api-impl/android/provider/Settings.java index 921d2b82..9ccf990e 100644 --- a/src/api-impl/android/provider/Settings.java +++ b/src/api-impl/android/provider/Settings.java @@ -28,10 +28,12 @@ public class Settings { } } public static final class System { - public static final Uri CONTENT_URI = null; // Uri.parse("content://settings/system"); + public static final Uri CONTENT_URI = Uri.parse("content://settings/system"); public static final Uri DEFAULT_NOTIFICATION_URI = getUriFor("notification_sound"); + public static final Uri DEFAULT_RINGTONE_URI = getUriFor("ringtone"); + public static int getInt(ContentResolver cr, String key, int def) { int ret = getInt(cr, key); if (ret != -1) { @@ -54,7 +56,7 @@ public class Settings { } public static Uri getUriFor(String name) { - return null; + return Uri.withAppendedPath(CONTENT_URI, name); } public static float getFloat(ContentResolver cr, String key, float def) { @@ -71,6 +73,14 @@ public class Settings { return def; } } + + public static float getFloat(ContentResolver cr, String key, float def) { + switch (key) { + default: + java.lang.System.out.println("!!!! Settings$Global.getFloat: unknown key: >" + key + "<"); + return def; + } + } } public static class SettingNotFoundException extends AndroidException {} diff --git a/src/api-impl/android/telephony/TelephonyManager.java b/src/api-impl/android/telephony/TelephonyManager.java index 6c4bca0e..c190c4e8 100644 --- a/src/api-impl/android/telephony/TelephonyManager.java +++ b/src/api-impl/android/telephony/TelephonyManager.java @@ -53,4 +53,8 @@ public class TelephonyManager { public String getSimOperatorName() { return null; } + + public int getCallState() { + return 0; // CALL_STATE_IDLE + } } diff --git a/src/api-impl/android/text/Editable.java b/src/api-impl/android/text/Editable.java index 0e23e4e9..78660463 100644 --- a/src/api-impl/android/text/Editable.java +++ b/src/api-impl/android/text/Editable.java @@ -2,7 +2,15 @@ package android.text; public interface Editable extends CharSequence { - public class Factory {} + public class Factory { + public static Factory getInstance() { + return new Factory(); + } + + public Editable newEditable(CharSequence source) { + return new SpannableStringBuilder(source); + } + } public Editable replace(int start, int end, CharSequence source, int destoff, int destlen); diff --git a/src/api-impl/android/text/Layout.java b/src/api-impl/android/text/Layout.java index 48bbd009..dc58fbb6 100644 --- a/src/api-impl/android/text/Layout.java +++ b/src/api-impl/android/text/Layout.java @@ -27,4 +27,6 @@ public class Layout { public int getHeight() {return 10;} public void draw(Canvas canvas) {} + + public int getParagraphDirection(int line) {return 0;} } diff --git a/src/api-impl/android/text/format/Time.java b/src/api-impl/android/text/format/Time.java new file mode 100644 index 00000000..5c280e2d --- /dev/null +++ b/src/api-impl/android/text/format/Time.java @@ -0,0 +1,8 @@ +package android.text.format; + +public class Time { + + public long gmtoff = 0; + + public void set(long millis) {} +} diff --git a/src/api-impl/android/text/method/TextKeyListener.java b/src/api-impl/android/text/method/TextKeyListener.java new file mode 100644 index 00000000..843cd486 --- /dev/null +++ b/src/api-impl/android/text/method/TextKeyListener.java @@ -0,0 +1,8 @@ +package android.text.method; + +import android.text.Editable; + +public class TextKeyListener { + + public static void clear(Editable content) {} +} diff --git a/src/api-impl/android/text/style/AbsoluteSizeSpan.java b/src/api-impl/android/text/style/AbsoluteSizeSpan.java new file mode 100644 index 00000000..fb60ce2d --- /dev/null +++ b/src/api-impl/android/text/style/AbsoluteSizeSpan.java @@ -0,0 +1,4 @@ +package android.text.style; + +public class AbsoluteSizeSpan { +} diff --git a/src/api-impl/android/text/style/LeadingMarginSpan.java b/src/api-impl/android/text/style/LeadingMarginSpan.java index 4d92042a..d57873f6 100644 --- a/src/api-impl/android/text/style/LeadingMarginSpan.java +++ b/src/api-impl/android/text/style/LeadingMarginSpan.java @@ -1,3 +1,6 @@ package android.text.style; -public interface LeadingMarginSpan {} +public interface LeadingMarginSpan { + + public static class Standard implements LeadingMarginSpan {} +} diff --git a/src/api-impl/android/text/style/StrikethroughSpan.java b/src/api-impl/android/text/style/StrikethroughSpan.java new file mode 100644 index 00000000..71ab48d3 --- /dev/null +++ b/src/api-impl/android/text/style/StrikethroughSpan.java @@ -0,0 +1,4 @@ +package android.text.style; + +public class StrikethroughSpan { +} diff --git a/src/api-impl/android/text/style/UpdateLayout.java b/src/api-impl/android/text/style/UpdateLayout.java new file mode 100644 index 00000000..c1d4bcad --- /dev/null +++ b/src/api-impl/android/text/style/UpdateLayout.java @@ -0,0 +1,4 @@ +package android.text.style; + +public interface UpdateLayout { +} diff --git a/src/api-impl/android/view/LayoutInflater.java b/src/api-impl/android/view/LayoutInflater.java index 4e988c34..f5346cdf 100644 --- a/src/api-impl/android/view/LayoutInflater.java +++ b/src/api-impl/android/view/LayoutInflater.java @@ -299,9 +299,11 @@ public class LayoutInflater { // Inflate all children. rInflate(childParser, view, childAttrs, true); - int id = attrs.getAttributeResourceValue("http://schemas.android.com/apk/res/android", "id", 0); + TypedArray ta = context.obtainStyledAttributes(attrs, new int[]{com.android.internal.R.attr.id}); + int id = ta.getResourceId(0, 0); if (id != 0) view.setId(id); + ta.recycle(); group.addView(view); } diff --git a/src/api-impl/android/view/Menu.java b/src/api-impl/android/view/Menu.java index 5adbed0a..549681e5 100644 --- a/src/api-impl/android/view/Menu.java +++ b/src/api-impl/android/view/Menu.java @@ -31,4 +31,6 @@ public interface Menu { public int size(); public boolean hasVisibleItems(); + + public SubMenu addSubMenu(int groupId, int itemId, int order, int titleRes); } diff --git a/src/api-impl/android/view/MenuItem.java b/src/api-impl/android/view/MenuItem.java index 940fc31b..6394dcbf 100644 --- a/src/api-impl/android/view/MenuItem.java +++ b/src/api-impl/android/view/MenuItem.java @@ -56,4 +56,6 @@ public interface MenuItem { public MenuItem setShowAsActionFlags(int action); + public MenuItem setAlphabeticShortcut(char alphaChar); + } \ No newline at end of file diff --git a/src/api-impl/android/view/MotionEvent.java b/src/api-impl/android/view/MotionEvent.java index c426388c..3459b37c 100644 --- a/src/api-impl/android/view/MotionEvent.java +++ b/src/api-impl/android/view/MotionEvent.java @@ -1651,8 +1651,8 @@ public final class MotionEvent extends InputEvent { throw new IllegalArgumentException("other motion event must not be null"); } - MotionEvent ev = obtain(); - ev.mNativePtr = nativeCopy(ev.mNativePtr, other.mNativePtr, false /*keepHistory*/); + MotionEvent ev = obtain(other); + // ev.mNativePtr = nativeCopy(ev.mNativePtr, other.mNativePtr, false /*keepHistory*/); return ev; } diff --git a/src/api-impl/android/view/ScaleGestureDetector.java b/src/api-impl/android/view/ScaleGestureDetector.java new file mode 100644 index 00000000..0db4ce76 --- /dev/null +++ b/src/api-impl/android/view/ScaleGestureDetector.java @@ -0,0 +1,16 @@ +package android.view; + +import android.content.Context; + +public class ScaleGestureDetector { + + public interface OnScaleGestureListener {} + + public ScaleGestureDetector(Context context, OnScaleGestureListener listener) {} + + public void setQuickScaleEnabled(boolean enabled) {} + + public boolean onTouchEvent(MotionEvent event) { + return false; + } +} diff --git a/src/api-impl/android/view/SubMenu.java b/src/api-impl/android/view/SubMenu.java index fef75ecb..82d3e0ec 100644 --- a/src/api-impl/android/view/SubMenu.java +++ b/src/api-impl/android/view/SubMenu.java @@ -4,4 +4,6 @@ public interface SubMenu extends Menu { public MenuItem getItem(); + public void clearHeader(); + } diff --git a/src/api-impl/android/view/View.java b/src/api-impl/android/view/View.java index 07d8f002..f5752137 100644 --- a/src/api-impl/android/view/View.java +++ b/src/api-impl/android/view/View.java @@ -30,6 +30,7 @@ import android.view.animation.Animation; import java.util.ArrayList; import java.util.HashMap; import java.util.Map; +import java.util.Objects; import java.util.concurrent.atomic.AtomicInteger; class WindowId {} @@ -652,6 +653,8 @@ public class View implements Drawable.Callback { */ // void onCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo menuInfo); } + + public interface OnDragListener {} // --- end of interfaces // --- subclasses @@ -1091,7 +1094,7 @@ public class View implements Drawable.Callback { } public void setPadding(int left, int top, int right, int bottom) {} public void setBackgroundResource(int resid) { - setBackgroundDrawable(getResources().getDrawable(resid)); + setBackgroundDrawable(resid == 0 ? null : getResources().getDrawable(resid)); } public void getHitRect(Rect outRect) { @@ -1823,4 +1826,27 @@ public class View implements Drawable.Callback { public void setNestedScrollingEnabled(boolean enabled) {} public void setTouchDelegate(TouchDelegate touchDelegate) {} + + public void setOnDragListener(OnDragListener onDragListener) {} + + public void setTransitionName(String transitionName) {} + + public Animation getAnimation() {return null;} + + public ViewOverlay getOverlay() { + return new ViewOverlay(); + } + + public void cancelLongPress() {} + + public int getTextAlignment() {return 0;} + + public float getY() {return 0.f;} + + public View findViewWithTag(Object tag) { + if (Objects.equals(tag, this.tag)) + return this; + else + return null; + } } diff --git a/src/api-impl/android/view/ViewAnimationUtils.java b/src/api-impl/android/view/ViewAnimationUtils.java index 737c83de..fdb17252 100644 --- a/src/api-impl/android/view/ViewAnimationUtils.java +++ b/src/api-impl/android/view/ViewAnimationUtils.java @@ -1,5 +1,10 @@ package android.view; +import android.animation.Animator; + public class ViewAnimationUtils { + public static Animator createCircularReveal(View view, int centerX, int centerY, float startRadius, float endRadius) { + return new Animator(); + } } diff --git a/src/api-impl/android/view/ViewGroup.java b/src/api-impl/android/view/ViewGroup.java index 25587f26..ed45ca33 100644 --- a/src/api-impl/android/view/ViewGroup.java +++ b/src/api-impl/android/view/ViewGroup.java @@ -7,6 +7,7 @@ import android.content.res.TypedArray; import android.util.AttributeSet; import java.util.ArrayList; import java.util.Iterator; +import java.util.Objects; public class ViewGroup extends View implements ViewParent, ViewManager { public ArrayList children; @@ -363,6 +364,24 @@ public class ViewGroup extends View implements ViewParent, ViewManager { removeView(view); } + public void setTouchscreenBlocksFocus(boolean touchscreenBlocksFocus) {} + + public void setClipChildren(boolean clipChildren) {} + + public void dispatchSetPressed(boolean pressed) {} + + @Override + public View findViewWithTag(Object tag) { + if (Objects.equals(tag, getTag())) + return this; + for (View child: children) { + View result = child.findViewWithTag(tag); + if (result != null) + return result; + } + return null; + } + public static class LayoutParams { public static final int FILL_PARENT = -1; public static final int MATCH_PARENT = -1; @@ -442,6 +461,16 @@ public class ViewGroup extends View implements ViewParent, ViewManager { a.recycle(); } + public MarginLayoutParams(ViewGroup.MarginLayoutParams source) { + super(); + width = source.width; + height = source.height; + leftMargin = source.leftMargin; + topMargin = source.topMargin; + rightMargin = source.rightMargin; + bottomMargin = source.bottomMargin; + } + public void setMargins(int left, int top, int right, int bottom) { leftMargin = left; topMargin = top; diff --git a/src/api-impl/android/view/ViewOverlay.java b/src/api-impl/android/view/ViewOverlay.java new file mode 100644 index 00000000..3f600d40 --- /dev/null +++ b/src/api-impl/android/view/ViewOverlay.java @@ -0,0 +1,8 @@ +package android.view; + +import android.graphics.drawable.Drawable; + +public class ViewOverlay { + + public void add(Drawable drawable) {} +} diff --git a/src/api-impl/android/view/ViewStub.java b/src/api-impl/android/view/ViewStub.java index b7c640aa..ba669c9f 100644 --- a/src/api-impl/android/view/ViewStub.java +++ b/src/api-impl/android/view/ViewStub.java @@ -34,4 +34,13 @@ public class ViewStub extends View { return view; } + public void setLayoutResource(int layoutResource) { + this.layoutResource = layoutResource; + } + + @Override + protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { + setMeasuredDimension(0, 0); + } + } diff --git a/src/api-impl/android/view/Window.java b/src/api-impl/android/view/Window.java index dbb7bed1..13dece13 100644 --- a/src/api-impl/android/view/Window.java +++ b/src/api-impl/android/view/Window.java @@ -27,9 +27,11 @@ public class Window { public View contentView; private Window.Callback callback; + private Context context; - public Window(Window.Callback callback) { + public Window(Context context, Window.Callback callback) { this.callback = callback; + this.context = context; contentView = new ViewGroup(Context.this_application); contentView.setId(android.R.id.content); } @@ -122,4 +124,12 @@ public class Window { public void setBackgroundDrawableResource(int resId) {} public int getStatusBarColor() { return 0xFFFF0000; } + + public Context getContext() { + return context; + } + + public boolean hasFeature(int featureId) { + return false; + } } diff --git a/src/api-impl/android/view/WindowManager.java b/src/api-impl/android/view/WindowManager.java index fdc713cb..63187156 100644 --- a/src/api-impl/android/view/WindowManager.java +++ b/src/api-impl/android/view/WindowManager.java @@ -11,6 +11,7 @@ public interface WindowManager { public int x; public int y; public int windowAnimations; + public int flags; public LayoutParams(int w, int h, int type, int flags, int format) { super(w, h); diff --git a/src/api-impl/android/view/animation/AccelerateDecelerateInterpolator.java b/src/api-impl/android/view/animation/AccelerateDecelerateInterpolator.java index f326692b..fd0f367e 100644 --- a/src/api-impl/android/view/animation/AccelerateDecelerateInterpolator.java +++ b/src/api-impl/android/view/animation/AccelerateDecelerateInterpolator.java @@ -1,5 +1,12 @@ package android.view.animation; -public class AccelerateDecelerateInterpolator { +import android.animation.TimeInterpolator; + +public class AccelerateDecelerateInterpolator implements TimeInterpolator { + + @Override + public float getInterpolation(float input) { + return input; + } } diff --git a/src/api-impl/android/view/animation/AnimationSet.java b/src/api-impl/android/view/animation/AnimationSet.java new file mode 100644 index 00000000..c4ab2504 --- /dev/null +++ b/src/api-impl/android/view/animation/AnimationSet.java @@ -0,0 +1,8 @@ +package android.view.animation; + +public class AnimationSet extends Animation { + + public AnimationSet(boolean shareInterpolator) {} + + public void addAnimation(Animation animation) {} +} diff --git a/src/api-impl/android/view/animation/OvershootInterpolator.java b/src/api-impl/android/view/animation/OvershootInterpolator.java new file mode 100644 index 00000000..0bece644 --- /dev/null +++ b/src/api-impl/android/view/animation/OvershootInterpolator.java @@ -0,0 +1,6 @@ +package android.view.animation; + +public class OvershootInterpolator { + + public OvershootInterpolator(float overshoot) {} +} diff --git a/src/api-impl/android/view/animation/ScaleAnimation.java b/src/api-impl/android/view/animation/ScaleAnimation.java new file mode 100644 index 00000000..efe36cc2 --- /dev/null +++ b/src/api-impl/android/view/animation/ScaleAnimation.java @@ -0,0 +1,6 @@ +package android.view.animation; + +public class ScaleAnimation extends Animation { + + public ScaleAnimation(float fromX, float toX, float fromY, float toY, int pivotXType, float pivotXValue, int pivotYType, float pivotYValue) {} +} diff --git a/src/api-impl/android/view/animation/TranslateAnimation.java b/src/api-impl/android/view/animation/TranslateAnimation.java new file mode 100644 index 00000000..87533060 --- /dev/null +++ b/src/api-impl/android/view/animation/TranslateAnimation.java @@ -0,0 +1,6 @@ +package android.view.animation; + +public class TranslateAnimation extends Animation { + + public TranslateAnimation(int fromXType, float fromXValue, int toXType, float toXValue, int fromYType, float fromYValue, int toYType, float toYValue) {} +} diff --git a/src/api-impl/android/view/inputmethod/InputMethodManager.java b/src/api-impl/android/view/inputmethod/InputMethodManager.java index 7ccc9f65..a9fcad86 100644 --- a/src/api-impl/android/view/inputmethod/InputMethodManager.java +++ b/src/api-impl/android/view/inputmethod/InputMethodManager.java @@ -1,5 +1,8 @@ package android.view.inputmethod; +import java.util.Collections; +import java.util.List; + import android.os.IBinder; import android.view.View; @@ -13,4 +16,8 @@ public class InputMethodManager { public boolean isActive(View view) {return false;} + public List/**/ getEnabledInputMethodList() { + return Collections.emptyList(); + } + } diff --git a/src/api-impl/android/widget/AbsListView.java b/src/api-impl/android/widget/AbsListView.java index 21aa8a89..868eb044 100644 --- a/src/api-impl/android/widget/AbsListView.java +++ b/src/api-impl/android/widget/AbsListView.java @@ -65,6 +65,16 @@ public abstract class AbsListView extends AdapterView { public void setFastScrollAlwaysVisible(boolean alwaysVisible) {} + public void setTranscriptMode(int mode) {} + + public int getTranscriptMode() {return 0;} + + public void setSelectionFromTop(int position, int y) {} + + public void smoothScrollBy(int position, int duration) {} + + public void smoothScrollToPositionFromTop(int position, int offset) {} + public interface OnScrollListener {} public interface SelectionBoundsAdjuster {} diff --git a/src/api-impl/android/widget/AdapterView.java b/src/api-impl/android/widget/AdapterView.java index 87aa7e54..42a019b0 100644 --- a/src/api-impl/android/widget/AdapterView.java +++ b/src/api-impl/android/widget/AdapterView.java @@ -53,4 +53,18 @@ public abstract class AdapterView extends ViewGroup { public Object getItemAtPosition(int position) { return adapter.getItem(position); } + + public void setEmptyView(View emptyView) {} + + public int getFirstVisiblePosition() { + return 0; + } + + public int getLastVisiblePosition() { + return 0; + } + + public int getCount() { + return adapter.getCount(); + } } diff --git a/src/api-impl/android/widget/Button.java b/src/api-impl/android/widget/Button.java index 3b51884e..0b6369b0 100644 --- a/src/api-impl/android/widget/Button.java +++ b/src/api-impl/android/widget/Button.java @@ -33,7 +33,7 @@ public class Button extends TextView { } @Override - public CharSequence getText() { return "FIXME Button.getText"; } + public native CharSequence getText(); @Override public void setTextSize(float size) {} diff --git a/src/api-impl/android/widget/CompoundButton.java b/src/api-impl/android/widget/CompoundButton.java index 155bbd9b..c8a80e84 100644 --- a/src/api-impl/android/widget/CompoundButton.java +++ b/src/api-impl/android/widget/CompoundButton.java @@ -45,6 +45,10 @@ public abstract class CompoundButton extends Button implements Checkable { public void setTextColor(int color) {} @Override public void setTextSize(float size) {} + @Override + public CharSequence getText() { + return "FIXME CompoundButton.getText()"; + } public void setButtonTintList(ColorStateList list) { } diff --git a/src/api-impl/android/widget/CursorAdapter.java b/src/api-impl/android/widget/CursorAdapter.java index be66dff1..15745273 100644 --- a/src/api-impl/android/widget/CursorAdapter.java +++ b/src/api-impl/android/widget/CursorAdapter.java @@ -1,4 +1,30 @@ package android.widget; +import android.content.Context; +import android.database.Cursor; + public abstract class CursorAdapter extends BaseAdapter { + + private Cursor cursor; + + public CursorAdapter(Context context, Cursor cursor, boolean autoRequery) { + this.cursor = cursor; + } + + public CursorAdapter(Context context, Cursor cursor, int flags) { + this.cursor = cursor; + } + + public void changeCursor(Cursor cursor) { + this.cursor = cursor; + } + + public Cursor getCursor() { + return cursor; + } + + @Override + public int getCount() { + return cursor == null ? 0 : cursor.getCount(); + } } diff --git a/src/api-impl/android/widget/ImageView.java b/src/api-impl/android/widget/ImageView.java index e182ef66..22a9de21 100644 --- a/src/api-impl/android/widget/ImageView.java +++ b/src/api-impl/android/widget/ImageView.java @@ -164,6 +164,10 @@ public class ImageView extends View { public void setImageTintMode(PorterDuff.Mode tintMode) {} + public void setCropToPadding(boolean crop) {} + + public void setColorFilter(int color) {} + @Override protected native long native_constructor(Context context, AttributeSet attrs); protected native void native_setPixbuf(long widget, long pixbuf); diff --git a/src/api-impl/android/widget/ListView.java b/src/api-impl/android/widget/ListView.java index a9127382..fa734639 100644 --- a/src/api-impl/android/widget/ListView.java +++ b/src/api-impl/android/widget/ListView.java @@ -40,4 +40,10 @@ public class ListView extends AbsListView { public void setDivider(Drawable drawable) {} public void setSelectionFromTop(int position, int y) {} + + public void addFooterView(View v, Object data, boolean isSelectable) {} + + public void addFooterView(View v) {} + + public void setDividerHeight(int height) {} } diff --git a/src/api-impl/android/widget/PopupMenu.java b/src/api-impl/android/widget/PopupMenu.java index c842a2fd..309169d4 100644 --- a/src/api-impl/android/widget/PopupMenu.java +++ b/src/api-impl/android/widget/PopupMenu.java @@ -304,6 +304,12 @@ public class PopupMenu { // TODO Auto-generated method stub throw new UnsupportedOperationException("Unimplemented method 'hasVisibleItems'"); } + + @Override + public SubMenu addSubMenu(int groupId, int itemId, int order, int titleRes) { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'addSubMenu'"); + } } private class SubMenuImpl extends MenuImpl implements SubMenu { @@ -317,6 +323,12 @@ public class PopupMenu { public MenuItem getItem() { return item; } + + @Override + public void clearHeader() { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'clearHeader'"); + } } @@ -487,6 +499,12 @@ public class PopupMenu { // TODO Auto-generated method stub throw new UnsupportedOperationException("Unimplemented method 'setShowAsActionFlags'"); } + + @Override + public MenuItem setAlphabeticShortcut(char alphaChar) { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'setAlphabeticShortcut'"); + } } } \ No newline at end of file diff --git a/src/api-impl/android/widget/PopupWindow.java b/src/api-impl/android/widget/PopupWindow.java index 413afd5d..426d9737 100644 --- a/src/api-impl/android/widget/PopupWindow.java +++ b/src/api-impl/android/widget/PopupWindow.java @@ -3,6 +3,8 @@ package android.widget; import android.content.Context; import android.graphics.drawable.Drawable; import android.util.AttributeSet; +import android.util.Log; +import android.view.Gravity; import android.view.View; public class PopupWindow { @@ -15,6 +17,22 @@ public class PopupWindow { this(context, null, 0, 0); } + public PopupWindow() { + popover = native_constructor(); + } + + public PopupWindow(View contentView, int width, int height, boolean focusable) { + popover = native_constructor(); + setContentView(contentView); + setWidth(width); + setHeight(height); + setFocusable(focusable); + } + + public PopupWindow(View contentView, int width, int height) { + this(contentView, width, height, true); + } + private View contentView; private long popover; // native pointer to GtkPopover @@ -60,4 +78,24 @@ public class PopupWindow { } public View getContentView() {return contentView;} + + public void setTouchable(boolean touchable) {} + + public void showAsDropDown(View anchor, int xoff, int yoff) { + if (!anchor.isAttachedToWindow()) { + Log.e("PopupWindow", "anchor is not attached to window"); + return; + } + native_showAsDropDown(popover, anchor.widget, xoff, yoff, Gravity.NO_GRAVITY); + } + + public void showAtLocation(View parent, int gravity, int x, int y) { + native_showAsDropDown(popover, parent.widget, x, y, gravity); + } + + public void dismiss() { + System.out.println("PopupWindow.dismiss() called"); + } + + public void setAnimationStyle(int animationStyle) {} } diff --git a/src/api-impl/android/widget/SectionIndexer.java b/src/api-impl/android/widget/SectionIndexer.java new file mode 100644 index 00000000..2c1af93a --- /dev/null +++ b/src/api-impl/android/widget/SectionIndexer.java @@ -0,0 +1,4 @@ +package android.widget; + +public interface SectionIndexer { +} diff --git a/src/api-impl/android/widget/TextView.java b/src/api-impl/android/widget/TextView.java index 0b336b10..8236e669 100644 --- a/src/api-impl/android/widget/TextView.java +++ b/src/api-impl/android/widget/TextView.java @@ -262,6 +262,8 @@ public class TextView extends View { public void setCompoundDrawablesRelativeWithIntrinsicBounds(int start, int top, int end, int bottom) {} + public void setCompoundDrawablesRelativeWithIntrinsicBounds(Drawable start, Drawable top, Drawable end, Drawable bottom) {} + public boolean getLinksClickable() {return true;} public boolean isTextSelectable() {return true;} @@ -297,4 +299,10 @@ public class TextView extends View { public void setCustomSelectionActionModeCallback(ActionMode.Callback actionModeCallback) {} public int getExtendedPaddingTop() {return 0;} + + public void setRawInputType(int type) {} + + public TextUtils.TruncateAt getEllipsize() {return null;} + + public void setLines(int lines) {} } diff --git a/src/api-impl/meson.build b/src/api-impl/meson.build index 78fd76fb..959fe2cd 100644 --- a/src/api-impl/meson.build +++ b/src/api-impl/meson.build @@ -26,6 +26,7 @@ hax_jar = jar('hax', [ 'android/app/AlertDialog.java', 'android/app/AppGlobals.java', 'android/app/AppOpsManager.java', + 'android/app/DatePickerDialog.java', 'android/app/Application.java', 'android/app/ApplicationErrorReport.java', 'android/app/Dialog.java', @@ -41,6 +42,7 @@ hax_jar = jar('hax', [ 'android/app/NotificationManager.java', 'android/app/PendingIntent.java', 'android/app/ProgressDialog.java', + 'android/app/RemoteInput.java', 'android/app/SearchManager.java', 'android/app/Service.java', 'android/app/SharedElementCallback.java', @@ -52,6 +54,7 @@ hax_jar = jar('hax', [ 'android/app/job/JobService.java', 'android/app/usage/UsageStatsManager.java', 'android/appwidget/AppWidgetManager.java', + 'android/appwidget/AppWidgetProvider.java', 'android/bluetooth/BluetoothAdapter.java', 'android/bluetooth/BluetoothManager.java', 'android/bluetooth/BluetoothProfile.java', @@ -117,6 +120,7 @@ hax_jar = jar('hax', [ 'android/database/CrossProcessCursor.java', 'android/database/Cursor.java', 'android/database/CursorWindow.java', + 'android/database/CursorWrapper.java', 'android/database/DataSetObservable.java', 'android/database/DataSetObserver.java', 'android/database/DatabaseErrorHandler.java', @@ -203,6 +207,7 @@ hax_jar = jar('hax', [ 'android/graphics/drawable/GradientDrawable.java', 'android/graphics/drawable/InsetDrawable.java', 'android/graphics/drawable/LayerDrawable.java', + 'android/graphics/drawable/NinePatchDrawable.java', 'android/graphics/drawable/RippleDrawable.java', 'android/graphics/drawable/ScaleDrawable.java', 'android/graphics/drawable/ShapeDrawable.java', @@ -342,13 +347,16 @@ hax_jar = jar('hax', [ 'android/text/format/DateFormat.java', 'android/text/format/DateUtils.java', 'android/text/format/Formatter.java', + 'android/text/format/Time.java', 'android/text/method/BaseMovementMethod.java', 'android/text/method/KeyListener.java', 'android/text/method/LinkMovementMethod.java', 'android/text/method/MovementMethod.java', 'android/text/method/NumberKeyListener.java', 'android/text/method/PasswordTransformationMethod.java', + 'android/text/method/TextKeyListener.java', 'android/text/method/TransformationMethod.java', + 'android/text/style/AbsoluteSizeSpan.java', 'android/text/style/BackgroundColorSpan.java', 'android/text/style/BulletSpan.java', 'android/text/style/CharacterStyle.java', @@ -363,11 +371,13 @@ hax_jar = jar('hax', [ 'android/text/style/ParagraphStyle.java', 'android/text/style/RelativeSizeSpan.java', 'android/text/style/ReplacementSpan.java', + 'android/text/style/StrikethroughSpan.java', 'android/text/style/StyleSpan.java', 'android/text/style/TextAppearanceSpan.java', 'android/text/style/TypefaceSpan.java', 'android/text/style/UnderlineSpan.java', 'android/text/style/UpdateAppearance.java', + 'android/text/style/UpdateLayout.java', 'android/text/style/URLSpan.java', 'android/text/util/Linkify.java', 'android/util/AndroidException.java', @@ -424,6 +434,7 @@ hax_jar = jar('hax', [ 'android/view/MenuInflater.java', 'android/view/MenuItem.java', 'android/view/MotionEvent.java', + 'android/view/ScaleGestureDetector.java', 'android/view/SubMenu.java', 'android/view/Surface.java', 'android/view/SurfaceHolder.java', @@ -436,6 +447,7 @@ hax_jar = jar('hax', [ 'android/view/ViewGroup.java', 'android/view/ViewManager.java', 'android/view/ViewOutlineProvider.java', + 'android/view/ViewOverlay.java', 'android/view/ViewParent.java', 'android/view/ViewPropertyAnimator.java', 'android/view/ViewStub.java', @@ -451,12 +463,16 @@ hax_jar = jar('hax', [ 'android/view/animation/AccelerateInterpolator.java', 'android/view/animation/AlphaAnimation.java', 'android/view/animation/Animation.java', + 'android/view/animation/AnimationSet.java', 'android/view/animation/AnimationUtils.java', 'android/view/animation/BaseInterpolator.java', 'android/view/animation/DecelerateInterpolator.java', 'android/view/animation/Interpolator.java', 'android/view/animation/LinearInterpolator.java', + 'android/view/animation/OvershootInterpolator.java', 'android/view/animation/PathInterpolator.java', + 'android/view/animation/ScaleAnimation.java', + 'android/view/animation/TranslateAnimation.java', 'android/view/inputmethod/BaseInputConnection.java', 'android/view/inputmethod/InputConnection.java', 'android/view/inputmethod/InputMethodManager.java', @@ -508,6 +524,7 @@ hax_jar = jar('hax', [ 'android/widget/RelativeLayout.java', 'android/widget/RemoteViews.java', 'android/widget/ScrollView.java', + 'android/widget/SectionIndexer.java', 'android/widget/Scroller.java', 'android/widget/SeekBar.java', 'android/widget/SimpleAdapter.java',