Bug 1406168 - 3. Remove AndroidJavaWrappers; r?snorp draft
authorJim Chen <nchen@mozilla.com>
Tue, 31 Oct 2017 11:43:08 -0400
changeset 689464 a9df885501b3e53a620bb908d375746f07b4ecce
parent 689463 62be054900379962223c845092e9e6ba5c33d2fc
child 689465 bd3f8034a1ac67744284e89ceadcfe023b0b5eda
push id87029
push userbmo:nchen@mozilla.com
push dateTue, 31 Oct 2017 15:44:03 +0000
reviewerssnorp
bugs1406168
milestone58.0a1
Bug 1406168 - 3. Remove AndroidJavaWrappers; r?snorp Remove AndroidJavaWrappers. Convert nsJNIString usages to use jni::String and AndroidMotionEvent usages to use java::sdk::MotionEvent. Move key code constants to GeckoEditableSupport.cpp. MozReview-Commit-ID: CwcGGADWCNv
mobile/android/base/java/org/mozilla/gecko/MemoryMonitor.java
widget/android/AndroidBridge.cpp
widget/android/AndroidJavaWrappers.cpp
widget/android/AndroidJavaWrappers.h
widget/android/GeckoEditableSupport.cpp
widget/android/moz.build
widget/android/nsWindow.cpp
widget/android/nsWindow.h
--- a/mobile/android/base/java/org/mozilla/gecko/MemoryMonitor.java
+++ b/mobile/android/base/java/org/mozilla/gecko/MemoryMonitor.java
@@ -41,17 +41,17 @@ import android.util.Log;
   * be thread-safe. In terms of lock ordering, code holding the PressureDecrementer lock
   * is allowed to pick up the MemoryMonitor lock, but not vice-versa.
   */
 class MemoryMonitor extends BroadcastReceiver implements ComponentCallbacks2 {
     private static final String LOGTAG = "GeckoMemoryMonitor";
     private static final String ACTION_MEMORY_DUMP = "org.mozilla.gecko.MEMORY_DUMP";
     private static final String ACTION_FORCE_PRESSURE = "org.mozilla.gecko.FORCE_MEMORY_PRESSURE";
 
-    // Memory pressure levels. Keep these in sync with those in AndroidJavaWrappers.h
+    // Memory pressure levels.
     private static final int MEMORY_PRESSURE_NONE = 0;
     private static final int MEMORY_PRESSURE_CLEANUP = 1;
     private static final int MEMORY_PRESSURE_LOW = 2;
     private static final int MEMORY_PRESSURE_MEDIUM = 3;
     private static final int MEMORY_PRESSURE_HIGH = 4;
 
     // We're living as long as the application, so keeping a static reference to it is okay.
     @SuppressLint("StaticFieldLeak")
--- a/widget/android/AndroidBridge.cpp
+++ b/widget/android/AndroidBridge.cpp
@@ -224,34 +224,40 @@ jstring AndroidBridge::NewJavaString(Aut
     return NewJavaString(frame, NS_ConvertUTF8toUTF16(string));
 }
 
 jstring AndroidBridge::NewJavaString(AutoLocalJNIFrame* frame, const nsACString& string) {
     return NewJavaString(frame, NS_ConvertUTF8toUTF16(string));
 }
 
 static void
-getHandlersFromStringArray(JNIEnv *aJNIEnv, jobjectArray jArr, jsize aLen,
+getHandlersFromStringArray(JNIEnv *aJNIEnv, jni::ObjectArray::Param aArr, size_t aLen,
                            nsIMutableArray *aHandlersArray,
                            nsIHandlerApp **aDefaultApp,
                            const nsAString& aAction = EmptyString(),
                            const nsACString& aMimeType = EmptyCString())
 {
     nsString empty = EmptyString();
-    for (jsize i = 0; i < aLen; i+=4) {
 
-        AutoLocalJNIFrame jniFrame(aJNIEnv, 4);
-        nsJNIString name(
-            static_cast<jstring>(aJNIEnv->GetObjectArrayElement(jArr, i)), aJNIEnv);
-        nsJNIString isDefault(
-            static_cast<jstring>(aJNIEnv->GetObjectArrayElement(jArr, i + 1)), aJNIEnv);
-        nsJNIString packageName(
-            static_cast<jstring>(aJNIEnv->GetObjectArrayElement(jArr, i + 2)), aJNIEnv);
-        nsJNIString className(
-            static_cast<jstring>(aJNIEnv->GetObjectArrayElement(jArr, i + 3)), aJNIEnv);
+    auto getNormalizedString = [] (jni::Object::Param obj) -> nsString {
+        nsString out;
+        if (!obj) {
+            out.SetIsVoid(true);
+        } else {
+            out.Assign(jni::String::Ref::From(obj)->ToString());
+        }
+        return out;
+    };
+
+    for (size_t i = 0; i < aLen; i += 4) {
+        nsString name(getNormalizedString(aArr->GetElement(i)));
+        nsString isDefault(getNormalizedString(aArr->GetElement(i + 1)));
+        nsString packageName(getNormalizedString(aArr->GetElement(i + 2)));
+        nsString className(getNormalizedString(aArr->GetElement(i + 3)));
+
         nsIHandlerApp* app = nsOSHelperAppService::
             CreateAndroidHandlerApp(name, className, packageName,
                                     className, aMimeType, aAction);
 
         aHandlersArray->AppendElement(app);
         if (aDefaultApp && isDefault.Length() > 0)
             *aDefaultApp = app;
     }
@@ -265,22 +271,22 @@ AndroidBridge::GetHandlersForMimeType(co
 {
     ALOG_BRIDGE("AndroidBridge::GetHandlersForMimeType");
 
     auto arr = GeckoAppShell::GetHandlersForMimeType(aMimeType, aAction);
     if (!arr)
         return false;
 
     JNIEnv* const env = arr.Env();
-    jsize len = env->GetArrayLength(arr.Get());
+    size_t len = arr->Length();
 
     if (!aHandlersArray)
         return len > 0;
 
-    getHandlersFromStringArray(env, arr.Get(), len, aHandlersArray,
+    getHandlersFromStringArray(env, arr, len, aHandlersArray,
                                aDefaultApp, aAction,
                                NS_ConvertUTF16toUTF8(aMimeType));
     return true;
 }
 
 bool
 AndroidBridge::GetHWEncoderCapability()
 {
@@ -310,22 +316,22 @@ AndroidBridge::GetHandlersForURL(const n
 {
     ALOG_BRIDGE("AndroidBridge::GetHandlersForURL");
 
     auto arr = GeckoAppShell::GetHandlersForURL(aURL, aAction);
     if (!arr)
         return false;
 
     JNIEnv* const env = arr.Env();
-    jsize len = env->GetArrayLength(arr.Get());
+    size_t len = arr->Length();
 
     if (!aHandlersArray)
         return len > 0;
 
-    getHandlersFromStringArray(env, arr.Get(), len, aHandlersArray,
+    getHandlersFromStringArray(env, arr, len, aHandlersArray,
                                aDefaultApp, aAction);
     return true;
 }
 
 void
 AndroidBridge::GetMimeTypeFromExtensions(const nsACString& aFileExt, nsCString& aMimeType)
 {
     ALOG_BRIDGE("AndroidBridge::GetMimeTypeFromExtensions");
@@ -550,17 +556,17 @@ AndroidBridge::GetStaticStringField(cons
     if (!field) {
         return false;
     }
 
     jstring jstr = (jstring) jEnv->GetStaticObjectField(cls.getRawRef(), field);
     if (!jstr)
         return false;
 
-    result.Assign(nsJNIString(jstr, jEnv));
+    result.Assign(jni::String::Ref::From(jstr)->ToString());
     return true;
 }
 
 namespace mozilla {
     class TracerRunnable : public Runnable{
     public:
         TracerRunnable() : Runnable("TracerRunnable") {
             mTracerLock = new Mutex("TracerRunnable");
deleted file mode 100644
--- a/widget/android/AndroidJavaWrappers.cpp
+++ /dev/null
@@ -1,62 +0,0 @@
-/* -*- Mode: c++; c-basic-offset: 4; tab-width: 20; indent-tabs-mode: nil; -*-
- * This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
-
-#include "AndroidJavaWrappers.h"
-
-using namespace mozilla;
-
-nsJNIString::nsJNIString(jstring jstr, JNIEnv *jenv)
-{
-    if (!jstr) {
-        SetIsVoid(true);
-        return;
-    }
-    JNIEnv *jni = jenv;
-    if (!jni) {
-        jni = jni::GetGeckoThreadEnv();
-    }
-    const jchar* jCharPtr = jni->GetStringChars(jstr, nullptr);
-
-    if (!jCharPtr) {
-        SetIsVoid(true);
-        return;
-    }
-
-    jsize len = jni->GetStringLength(jstr);
-
-    if (len <= 0) {
-        SetIsVoid(true);
-    } else {
-        Assign(reinterpret_cast<const char16_t*>(jCharPtr), len);
-    }
-    jni->ReleaseStringChars(jstr, jCharPtr);
-}
-
-nsJNICString::nsJNICString(jstring jstr, JNIEnv *jenv)
-{
-    if (!jstr) {
-        SetIsVoid(true);
-        return;
-    }
-    JNIEnv *jni = jenv;
-    if (!jni) {
-        jni = jni::GetGeckoThreadEnv();
-    }
-    const char* jCharPtr = jni->GetStringUTFChars(jstr, nullptr);
-
-    if (!jCharPtr) {
-        SetIsVoid(true);
-        return;
-    }
-
-    jsize len = jni->GetStringUTFLength(jstr);
-
-    if (len <= 0) {
-        SetIsVoid(true);
-    } else {
-        Assign(jCharPtr, len);
-    }
-    jni->ReleaseStringUTFChars(jstr, jCharPtr);
-}
deleted file mode 100644
--- a/widget/android/AndroidJavaWrappers.h
+++ /dev/null
@@ -1,300 +0,0 @@
-/* -*- Mode: c++; c-basic-offset: 4; tab-width: 20; indent-tabs-mode: nil; -*-
- * This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
-
-#ifndef AndroidJavaWrappers_h__
-#define AndroidJavaWrappers_h__
-
-#include <jni.h>
-#include <android/input.h>
-#include <android/log.h>
-#include <android/api-level.h>
-
-#include "nsRect.h"
-#include "nsString.h"
-#include "nsTArray.h"
-#include "nsIAndroidBridge.h"
-#include "mozilla/gfx/Rect.h"
-#include "mozilla/dom/Touch.h"
-#include "mozilla/EventForwards.h"
-#include "InputData.h"
-#include "Units.h"
-#include "FrameMetrics.h"
-
-//#define FORCE_ALOG 1
-
-class nsIAndroidDisplayport;
-class nsIWidget;
-
-namespace mozilla {
-
-enum {
-    // These keycode masks are not defined in android/keycodes.h:
-#if __ANDROID_API__ < 13
-    AKEYCODE_ESCAPE             = 111,
-    AKEYCODE_FORWARD_DEL        = 112,
-    AKEYCODE_CTRL_LEFT          = 113,
-    AKEYCODE_CTRL_RIGHT         = 114,
-    AKEYCODE_CAPS_LOCK          = 115,
-    AKEYCODE_SCROLL_LOCK        = 116,
-    AKEYCODE_META_LEFT          = 117,
-    AKEYCODE_META_RIGHT         = 118,
-    AKEYCODE_FUNCTION           = 119,
-    AKEYCODE_SYSRQ              = 120,
-    AKEYCODE_BREAK              = 121,
-    AKEYCODE_MOVE_HOME          = 122,
-    AKEYCODE_MOVE_END           = 123,
-    AKEYCODE_INSERT             = 124,
-    AKEYCODE_FORWARD            = 125,
-    AKEYCODE_MEDIA_PLAY         = 126,
-    AKEYCODE_MEDIA_PAUSE        = 127,
-    AKEYCODE_MEDIA_CLOSE        = 128,
-    AKEYCODE_MEDIA_EJECT        = 129,
-    AKEYCODE_MEDIA_RECORD       = 130,
-    AKEYCODE_F1                 = 131,
-    AKEYCODE_F2                 = 132,
-    AKEYCODE_F3                 = 133,
-    AKEYCODE_F4                 = 134,
-    AKEYCODE_F5                 = 135,
-    AKEYCODE_F6                 = 136,
-    AKEYCODE_F7                 = 137,
-    AKEYCODE_F8                 = 138,
-    AKEYCODE_F9                 = 139,
-    AKEYCODE_F10                = 140,
-    AKEYCODE_F11                = 141,
-    AKEYCODE_F12                = 142,
-    AKEYCODE_NUM_LOCK           = 143,
-    AKEYCODE_NUMPAD_0           = 144,
-    AKEYCODE_NUMPAD_1           = 145,
-    AKEYCODE_NUMPAD_2           = 146,
-    AKEYCODE_NUMPAD_3           = 147,
-    AKEYCODE_NUMPAD_4           = 148,
-    AKEYCODE_NUMPAD_5           = 149,
-    AKEYCODE_NUMPAD_6           = 150,
-    AKEYCODE_NUMPAD_7           = 151,
-    AKEYCODE_NUMPAD_8           = 152,
-    AKEYCODE_NUMPAD_9           = 153,
-    AKEYCODE_NUMPAD_DIVIDE      = 154,
-    AKEYCODE_NUMPAD_MULTIPLY    = 155,
-    AKEYCODE_NUMPAD_SUBTRACT    = 156,
-    AKEYCODE_NUMPAD_ADD         = 157,
-    AKEYCODE_NUMPAD_DOT         = 158,
-    AKEYCODE_NUMPAD_COMMA       = 159,
-    AKEYCODE_NUMPAD_ENTER       = 160,
-    AKEYCODE_NUMPAD_EQUALS      = 161,
-    AKEYCODE_NUMPAD_LEFT_PAREN  = 162,
-    AKEYCODE_NUMPAD_RIGHT_PAREN = 163,
-    AKEYCODE_VOLUME_MUTE        = 164,
-    AKEYCODE_INFO               = 165,
-    AKEYCODE_CHANNEL_UP         = 166,
-    AKEYCODE_CHANNEL_DOWN       = 167,
-    AKEYCODE_ZOOM_IN            = 168,
-    AKEYCODE_ZOOM_OUT           = 169,
-    AKEYCODE_TV                 = 170,
-    AKEYCODE_WINDOW             = 171,
-    AKEYCODE_GUIDE              = 172,
-    AKEYCODE_DVR                = 173,
-    AKEYCODE_BOOKMARK           = 174,
-    AKEYCODE_CAPTIONS           = 175,
-    AKEYCODE_SETTINGS           = 176,
-    AKEYCODE_TV_POWER           = 177,
-    AKEYCODE_TV_INPUT           = 178,
-    AKEYCODE_STB_POWER          = 179,
-    AKEYCODE_STB_INPUT          = 180,
-    AKEYCODE_AVR_POWER          = 181,
-    AKEYCODE_AVR_INPUT          = 182,
-    AKEYCODE_PROG_RED           = 183,
-    AKEYCODE_PROG_GREEN         = 184,
-    AKEYCODE_PROG_YELLOW        = 185,
-    AKEYCODE_PROG_BLUE          = 186,
-    AKEYCODE_APP_SWITCH         = 187,
-    AKEYCODE_BUTTON_1           = 188,
-    AKEYCODE_BUTTON_2           = 189,
-    AKEYCODE_BUTTON_3           = 190,
-    AKEYCODE_BUTTON_4           = 191,
-    AKEYCODE_BUTTON_5           = 192,
-    AKEYCODE_BUTTON_6           = 193,
-    AKEYCODE_BUTTON_7           = 194,
-    AKEYCODE_BUTTON_8           = 195,
-    AKEYCODE_BUTTON_9           = 196,
-    AKEYCODE_BUTTON_10          = 197,
-    AKEYCODE_BUTTON_11          = 198,
-    AKEYCODE_BUTTON_12          = 199,
-    AKEYCODE_BUTTON_13          = 200,
-    AKEYCODE_BUTTON_14          = 201,
-    AKEYCODE_BUTTON_15          = 202,
-    AKEYCODE_BUTTON_16          = 203,
-#endif
-#if __ANDROID_API__ < 14
-    AKEYCODE_LANGUAGE_SWITCH    = 204,
-    AKEYCODE_MANNER_MODE        = 205,
-    AKEYCODE_3D_MODE            = 206,
-#endif
-#if __ANDROID_API__ < 15
-    AKEYCODE_CONTACTS           = 207,
-    AKEYCODE_CALENDAR           = 208,
-    AKEYCODE_MUSIC              = 209,
-    AKEYCODE_CALCULATOR         = 210,
-#endif
-#if __ANDROID_API__ < 16
-    AKEYCODE_ZENKAKU_HANKAKU    = 211,
-    AKEYCODE_EISU               = 212,
-    AKEYCODE_MUHENKAN           = 213,
-    AKEYCODE_HENKAN             = 214,
-    AKEYCODE_KATAKANA_HIRAGANA  = 215,
-    AKEYCODE_YEN                = 216,
-    AKEYCODE_RO                 = 217,
-    AKEYCODE_KANA               = 218,
-    AKEYCODE_ASSIST             = 219,
-#endif
-#if __ANDROID_API__ < 18
-    AKEYCODE_BRIGHTNESS_DOWN    = 220,
-    AKEYCODE_BRIGHTNESS_UP      = 221,
-#endif
-#if __ANDROID_API__ < 19
-    AKEYCODE_MEDIA_AUDIO_TRACK  = 222,
-#endif
-#if __ANDROID_API__ < 20
-    AKEYCODE_SLEEP              = 223,
-    AKEYCODE_WAKEUP             = 224,
-#endif
-#if __ANDROID_API__ < 21
-    AKEYCODE_PAIRING                       = 225,
-    AKEYCODE_MEDIA_TOP_MENU                = 226,
-    AKEYCODE_11                            = 227,
-    AKEYCODE_12                            = 228,
-    AKEYCODE_LAST_CHANNEL                  = 229,
-    AKEYCODE_TV_DATA_SERVICE               = 230,
-    AKEYCODE_VOICE_ASSIST                  = 231,
-    AKEYCODE_TV_RADIO_SERVICE              = 232,
-    AKEYCODE_TV_TELETEXT                   = 233,
-    AKEYCODE_TV_NUMBER_ENTRY               = 234,
-    AKEYCODE_TV_TERRESTRIAL_ANALOG         = 235,
-    AKEYCODE_TV_TERRESTRIAL_DIGITAL        = 236,
-    AKEYCODE_TV_SATELLITE                  = 237,
-    AKEYCODE_TV_SATELLITE_BS               = 238,
-    AKEYCODE_TV_SATELLITE_CS               = 239,
-    AKEYCODE_TV_SATELLITE_SERVICE          = 240,
-    AKEYCODE_TV_NETWORK                    = 241,
-    AKEYCODE_TV_ANTENNA_CABLE              = 242,
-    AKEYCODE_TV_INPUT_HDMI_1               = 243,
-    AKEYCODE_TV_INPUT_HDMI_2               = 244,
-    AKEYCODE_TV_INPUT_HDMI_3               = 245,
-    AKEYCODE_TV_INPUT_HDMI_4               = 246,
-    AKEYCODE_TV_INPUT_COMPOSITE_1          = 247,
-    AKEYCODE_TV_INPUT_COMPOSITE_2          = 248,
-    AKEYCODE_TV_INPUT_COMPONENT_1          = 249,
-    AKEYCODE_TV_INPUT_COMPONENT_2          = 250,
-    AKEYCODE_TV_INPUT_VGA_1                = 251,
-    AKEYCODE_TV_AUDIO_DESCRIPTION          = 252,
-    AKEYCODE_TV_AUDIO_DESCRIPTION_MIX_UP   = 253,
-    AKEYCODE_TV_AUDIO_DESCRIPTION_MIX_DOWN = 254,
-    AKEYCODE_TV_ZOOM_MODE                  = 255,
-    AKEYCODE_TV_CONTENTS_MENU              = 256,
-    AKEYCODE_TV_MEDIA_CONTEXT_MENU         = 257,
-    AKEYCODE_TV_TIMER_PROGRAMMING          = 258,
-    AKEYCODE_HELP                          = 259,
-#endif
-#if __ANDROID_API__ < 23
-    AKEYCODE_NAVIGATE_PREVIOUS  = 260,
-    AKEYCODE_NAVIGATE_NEXT      = 261,
-    AKEYCODE_NAVIGATE_IN        = 262,
-    AKEYCODE_NAVIGATE_OUT       = 263,
-#endif
-#if __ANDROID_API__ < 24
-    AKEYCODE_STEM_PRIMARY       = 264,
-    AKEYCODE_STEM_1             = 265,
-    AKEYCODE_STEM_2             = 266,
-    AKEYCODE_STEM_3             = 267,
-    AKEYCODE_DPAD_UP_LEFT       = 268,
-    AKEYCODE_DPAD_DOWN_LEFT     = 269,
-    AKEYCODE_DPAD_UP_RIGHT      = 270,
-    AKEYCODE_DPAD_DOWN_RIGHT    = 271,
-#endif
-#if __ANDROID_API__ < 23
-    AKEYCODE_MEDIA_SKIP_FORWARD  = 272,
-    AKEYCODE_MEDIA_SKIP_BACKWARD = 273,
-    AKEYCODE_MEDIA_STEP_FORWARD  = 274,
-    AKEYCODE_MEDIA_STEP_BACKWARD = 275,
-#endif
-#if __ANDROID_API__ < 24
-    AKEYCODE_SOFT_SLEEP         = 276,
-    AKEYCODE_CUT                = 277,
-    AKEYCODE_COPY               = 278,
-    AKEYCODE_PASTE              = 279,
-#endif
-#if __ANDROID_API__ < 25
-    AKEYCODE_SYSTEM_NAVIGATION_UP    = 280,
-    AKEYCODE_SYSTEM_NAVIGATION_DOWN  = 281,
-    AKEYCODE_SYSTEM_NAVIGATION_LEFT  = 282,
-    AKEYCODE_SYSTEM_NAVIGATION_RIGHT = 283,
-#endif
-
-    AMETA_FUNCTION_ON           = 0x00000008,
-    AMETA_CTRL_ON               = 0x00001000,
-    AMETA_CTRL_LEFT_ON          = 0x00002000,
-    AMETA_CTRL_RIGHT_ON         = 0x00004000,
-    AMETA_META_ON               = 0x00010000,
-    AMETA_META_LEFT_ON          = 0x00020000,
-    AMETA_META_RIGHT_ON         = 0x00040000,
-    AMETA_CAPS_LOCK_ON          = 0x00100000,
-    AMETA_NUM_LOCK_ON           = 0x00200000,
-    AMETA_SCROLL_LOCK_ON        = 0x00400000,
-
-    AMETA_ALT_MASK              = AMETA_ALT_LEFT_ON   | AMETA_ALT_RIGHT_ON   | AMETA_ALT_ON,
-    AMETA_CTRL_MASK             = AMETA_CTRL_LEFT_ON  | AMETA_CTRL_RIGHT_ON  | AMETA_CTRL_ON,
-    AMETA_META_MASK             = AMETA_META_LEFT_ON  | AMETA_META_RIGHT_ON  | AMETA_META_ON,
-    AMETA_SHIFT_MASK            = AMETA_SHIFT_LEFT_ON | AMETA_SHIFT_RIGHT_ON | AMETA_SHIFT_ON,
-};
-
-class AndroidMotionEvent
-{
-public:
-    enum {
-        ACTION_DOWN = 0,
-        ACTION_UP = 1,
-        ACTION_MOVE = 2,
-        ACTION_CANCEL = 3,
-        ACTION_OUTSIDE = 4,
-        ACTION_POINTER_DOWN = 5,
-        ACTION_POINTER_UP = 6,
-        ACTION_HOVER_MOVE = 7,
-        ACTION_HOVER_ENTER = 9,
-        ACTION_HOVER_EXIT = 10,
-        ACTION_MAGNIFY_START = 11,
-        ACTION_MAGNIFY = 12,
-        ACTION_MAGNIFY_END = 13,
-        EDGE_TOP = 0x00000001,
-        EDGE_BOTTOM = 0x00000002,
-        EDGE_LEFT = 0x00000004,
-        EDGE_RIGHT = 0x00000008,
-        SAMPLE_X = 0,
-        SAMPLE_Y = 1,
-        SAMPLE_PRESSURE = 2,
-        SAMPLE_SIZE = 3,
-        NUM_SAMPLE_DATA = 4,
-        TOOL_TYPE_UNKNOWN = 0,
-        TOOL_TYPE_FINGER = 1,
-        TOOL_TYPE_STYLUS = 2,
-        TOOL_TYPE_MOUSE = 3,
-        TOOL_TYPE_ERASER = 4,
-        dummy_java_enum_list_end
-    };
-};
-
-class nsJNIString : public nsString
-{
-public:
-    nsJNIString(jstring jstr, JNIEnv *jenv);
-};
-
-class nsJNICString : public nsCString
-{
-public:
-    nsJNICString(jstring jstr, JNIEnv *jenv);
-};
-
-}
-
-#endif
--- a/widget/android/GeckoEditableSupport.cpp
+++ b/widget/android/GeckoEditableSupport.cpp
@@ -13,29 +13,234 @@
 #include "nsISelection.h"
 
 #include "mozilla/EventStateManager.h"
 #include "mozilla/IMEStateManager.h"
 #include "mozilla/TextComposition.h"
 #include "mozilla/TextEventDispatcherListener.h"
 #include "mozilla/TextEvents.h"
 
+#include <android/api-level.h>
+#include <android/input.h>
 #include <android/log.h>
 
 #ifdef DEBUG_ANDROID_IME
 #define ALOGIME(args...) __android_log_print(ANDROID_LOG_INFO, \
                                              "GeckoEditableSupport" , ## args)
 #else
 #define ALOGIME(args...) do { } while (0)
 #endif
 
 template<> const char
 nsWindow::NativePtr<mozilla::widget::GeckoEditableSupport>::sName[] =
         "GeckoEditableSupport";
 
+enum {
+    // These keycode masks are not defined in android/keycodes.h:
+#if __ANDROID_API__ < 13
+    AKEYCODE_ESCAPE             = 111,
+    AKEYCODE_FORWARD_DEL        = 112,
+    AKEYCODE_CTRL_LEFT          = 113,
+    AKEYCODE_CTRL_RIGHT         = 114,
+    AKEYCODE_CAPS_LOCK          = 115,
+    AKEYCODE_SCROLL_LOCK        = 116,
+    AKEYCODE_META_LEFT          = 117,
+    AKEYCODE_META_RIGHT         = 118,
+    AKEYCODE_FUNCTION           = 119,
+    AKEYCODE_SYSRQ              = 120,
+    AKEYCODE_BREAK              = 121,
+    AKEYCODE_MOVE_HOME          = 122,
+    AKEYCODE_MOVE_END           = 123,
+    AKEYCODE_INSERT             = 124,
+    AKEYCODE_FORWARD            = 125,
+    AKEYCODE_MEDIA_PLAY         = 126,
+    AKEYCODE_MEDIA_PAUSE        = 127,
+    AKEYCODE_MEDIA_CLOSE        = 128,
+    AKEYCODE_MEDIA_EJECT        = 129,
+    AKEYCODE_MEDIA_RECORD       = 130,
+    AKEYCODE_F1                 = 131,
+    AKEYCODE_F2                 = 132,
+    AKEYCODE_F3                 = 133,
+    AKEYCODE_F4                 = 134,
+    AKEYCODE_F5                 = 135,
+    AKEYCODE_F6                 = 136,
+    AKEYCODE_F7                 = 137,
+    AKEYCODE_F8                 = 138,
+    AKEYCODE_F9                 = 139,
+    AKEYCODE_F10                = 140,
+    AKEYCODE_F11                = 141,
+    AKEYCODE_F12                = 142,
+    AKEYCODE_NUM_LOCK           = 143,
+    AKEYCODE_NUMPAD_0           = 144,
+    AKEYCODE_NUMPAD_1           = 145,
+    AKEYCODE_NUMPAD_2           = 146,
+    AKEYCODE_NUMPAD_3           = 147,
+    AKEYCODE_NUMPAD_4           = 148,
+    AKEYCODE_NUMPAD_5           = 149,
+    AKEYCODE_NUMPAD_6           = 150,
+    AKEYCODE_NUMPAD_7           = 151,
+    AKEYCODE_NUMPAD_8           = 152,
+    AKEYCODE_NUMPAD_9           = 153,
+    AKEYCODE_NUMPAD_DIVIDE      = 154,
+    AKEYCODE_NUMPAD_MULTIPLY    = 155,
+    AKEYCODE_NUMPAD_SUBTRACT    = 156,
+    AKEYCODE_NUMPAD_ADD         = 157,
+    AKEYCODE_NUMPAD_DOT         = 158,
+    AKEYCODE_NUMPAD_COMMA       = 159,
+    AKEYCODE_NUMPAD_ENTER       = 160,
+    AKEYCODE_NUMPAD_EQUALS      = 161,
+    AKEYCODE_NUMPAD_LEFT_PAREN  = 162,
+    AKEYCODE_NUMPAD_RIGHT_PAREN = 163,
+    AKEYCODE_VOLUME_MUTE        = 164,
+    AKEYCODE_INFO               = 165,
+    AKEYCODE_CHANNEL_UP         = 166,
+    AKEYCODE_CHANNEL_DOWN       = 167,
+    AKEYCODE_ZOOM_IN            = 168,
+    AKEYCODE_ZOOM_OUT           = 169,
+    AKEYCODE_TV                 = 170,
+    AKEYCODE_WINDOW             = 171,
+    AKEYCODE_GUIDE              = 172,
+    AKEYCODE_DVR                = 173,
+    AKEYCODE_BOOKMARK           = 174,
+    AKEYCODE_CAPTIONS           = 175,
+    AKEYCODE_SETTINGS           = 176,
+    AKEYCODE_TV_POWER           = 177,
+    AKEYCODE_TV_INPUT           = 178,
+    AKEYCODE_STB_POWER          = 179,
+    AKEYCODE_STB_INPUT          = 180,
+    AKEYCODE_AVR_POWER          = 181,
+    AKEYCODE_AVR_INPUT          = 182,
+    AKEYCODE_PROG_RED           = 183,
+    AKEYCODE_PROG_GREEN         = 184,
+    AKEYCODE_PROG_YELLOW        = 185,
+    AKEYCODE_PROG_BLUE          = 186,
+    AKEYCODE_APP_SWITCH         = 187,
+    AKEYCODE_BUTTON_1           = 188,
+    AKEYCODE_BUTTON_2           = 189,
+    AKEYCODE_BUTTON_3           = 190,
+    AKEYCODE_BUTTON_4           = 191,
+    AKEYCODE_BUTTON_5           = 192,
+    AKEYCODE_BUTTON_6           = 193,
+    AKEYCODE_BUTTON_7           = 194,
+    AKEYCODE_BUTTON_8           = 195,
+    AKEYCODE_BUTTON_9           = 196,
+    AKEYCODE_BUTTON_10          = 197,
+    AKEYCODE_BUTTON_11          = 198,
+    AKEYCODE_BUTTON_12          = 199,
+    AKEYCODE_BUTTON_13          = 200,
+    AKEYCODE_BUTTON_14          = 201,
+    AKEYCODE_BUTTON_15          = 202,
+    AKEYCODE_BUTTON_16          = 203,
+#endif
+#if __ANDROID_API__ < 14
+    AKEYCODE_LANGUAGE_SWITCH    = 204,
+    AKEYCODE_MANNER_MODE        = 205,
+    AKEYCODE_3D_MODE            = 206,
+#endif
+#if __ANDROID_API__ < 15
+    AKEYCODE_CONTACTS           = 207,
+    AKEYCODE_CALENDAR           = 208,
+    AKEYCODE_MUSIC              = 209,
+    AKEYCODE_CALCULATOR         = 210,
+#endif
+#if __ANDROID_API__ < 16
+    AKEYCODE_ZENKAKU_HANKAKU    = 211,
+    AKEYCODE_EISU               = 212,
+    AKEYCODE_MUHENKAN           = 213,
+    AKEYCODE_HENKAN             = 214,
+    AKEYCODE_KATAKANA_HIRAGANA  = 215,
+    AKEYCODE_YEN                = 216,
+    AKEYCODE_RO                 = 217,
+    AKEYCODE_KANA               = 218,
+    AKEYCODE_ASSIST             = 219,
+#endif
+#if __ANDROID_API__ < 18
+    AKEYCODE_BRIGHTNESS_DOWN    = 220,
+    AKEYCODE_BRIGHTNESS_UP      = 221,
+#endif
+#if __ANDROID_API__ < 19
+    AKEYCODE_MEDIA_AUDIO_TRACK  = 222,
+#endif
+#if __ANDROID_API__ < 20
+    AKEYCODE_SLEEP              = 223,
+    AKEYCODE_WAKEUP             = 224,
+#endif
+#if __ANDROID_API__ < 21
+    AKEYCODE_PAIRING                       = 225,
+    AKEYCODE_MEDIA_TOP_MENU                = 226,
+    AKEYCODE_11                            = 227,
+    AKEYCODE_12                            = 228,
+    AKEYCODE_LAST_CHANNEL                  = 229,
+    AKEYCODE_TV_DATA_SERVICE               = 230,
+    AKEYCODE_VOICE_ASSIST                  = 231,
+    AKEYCODE_TV_RADIO_SERVICE              = 232,
+    AKEYCODE_TV_TELETEXT                   = 233,
+    AKEYCODE_TV_NUMBER_ENTRY               = 234,
+    AKEYCODE_TV_TERRESTRIAL_ANALOG         = 235,
+    AKEYCODE_TV_TERRESTRIAL_DIGITAL        = 236,
+    AKEYCODE_TV_SATELLITE                  = 237,
+    AKEYCODE_TV_SATELLITE_BS               = 238,
+    AKEYCODE_TV_SATELLITE_CS               = 239,
+    AKEYCODE_TV_SATELLITE_SERVICE          = 240,
+    AKEYCODE_TV_NETWORK                    = 241,
+    AKEYCODE_TV_ANTENNA_CABLE              = 242,
+    AKEYCODE_TV_INPUT_HDMI_1               = 243,
+    AKEYCODE_TV_INPUT_HDMI_2               = 244,
+    AKEYCODE_TV_INPUT_HDMI_3               = 245,
+    AKEYCODE_TV_INPUT_HDMI_4               = 246,
+    AKEYCODE_TV_INPUT_COMPOSITE_1          = 247,
+    AKEYCODE_TV_INPUT_COMPOSITE_2          = 248,
+    AKEYCODE_TV_INPUT_COMPONENT_1          = 249,
+    AKEYCODE_TV_INPUT_COMPONENT_2          = 250,
+    AKEYCODE_TV_INPUT_VGA_1                = 251,
+    AKEYCODE_TV_AUDIO_DESCRIPTION          = 252,
+    AKEYCODE_TV_AUDIO_DESCRIPTION_MIX_UP   = 253,
+    AKEYCODE_TV_AUDIO_DESCRIPTION_MIX_DOWN = 254,
+    AKEYCODE_TV_ZOOM_MODE                  = 255,
+    AKEYCODE_TV_CONTENTS_MENU              = 256,
+    AKEYCODE_TV_MEDIA_CONTEXT_MENU         = 257,
+    AKEYCODE_TV_TIMER_PROGRAMMING          = 258,
+    AKEYCODE_HELP                          = 259,
+#endif
+#if __ANDROID_API__ < 23
+    AKEYCODE_NAVIGATE_PREVIOUS  = 260,
+    AKEYCODE_NAVIGATE_NEXT      = 261,
+    AKEYCODE_NAVIGATE_IN        = 262,
+    AKEYCODE_NAVIGATE_OUT       = 263,
+#endif
+#if __ANDROID_API__ < 24
+    AKEYCODE_STEM_PRIMARY       = 264,
+    AKEYCODE_STEM_1             = 265,
+    AKEYCODE_STEM_2             = 266,
+    AKEYCODE_STEM_3             = 267,
+    AKEYCODE_DPAD_UP_LEFT       = 268,
+    AKEYCODE_DPAD_DOWN_LEFT     = 269,
+    AKEYCODE_DPAD_UP_RIGHT      = 270,
+    AKEYCODE_DPAD_DOWN_RIGHT    = 271,
+#endif
+#if __ANDROID_API__ < 23
+    AKEYCODE_MEDIA_SKIP_FORWARD  = 272,
+    AKEYCODE_MEDIA_SKIP_BACKWARD = 273,
+    AKEYCODE_MEDIA_STEP_FORWARD  = 274,
+    AKEYCODE_MEDIA_STEP_BACKWARD = 275,
+#endif
+#if __ANDROID_API__ < 24
+    AKEYCODE_SOFT_SLEEP         = 276,
+    AKEYCODE_CUT                = 277,
+    AKEYCODE_COPY               = 278,
+    AKEYCODE_PASTE              = 279,
+#endif
+#if __ANDROID_API__ < 25
+    AKEYCODE_SYSTEM_NAVIGATION_UP    = 280,
+    AKEYCODE_SYSTEM_NAVIGATION_DOWN  = 281,
+    AKEYCODE_SYSTEM_NAVIGATION_LEFT  = 282,
+    AKEYCODE_SYSTEM_NAVIGATION_RIGHT = 283,
+#endif
+};
+
 static uint32_t
 ConvertAndroidKeyCodeToDOMKeyCode(int32_t androidKeyCode)
 {
     // Special-case alphanumeric keycodes because they are most common.
     if (androidKeyCode >= AKEYCODE_A &&
         androidKeyCode <= AKEYCODE_Z) {
         return androidKeyCode - AKEYCODE_A + NS_VK_A;
     }
--- a/widget/android/moz.build
+++ b/widget/android/moz.build
@@ -19,32 +19,30 @@ DIRS += [
 XPIDL_SOURCES += [
     'nsIAndroidBridge.idl',
 ]
 
 XPIDL_MODULE = 'widget_android'
 
 EXPORTS += [
     'AndroidBridge.h',
-    'AndroidJavaWrappers.h',
     'GeneratedJNINatives.h',
     'GeneratedJNIWrappers.h',
 ]
 
 EXPORTS.mozilla.widget += [
     'AndroidCompositorWidget.h',
     'AndroidUiThread.h',
 ]
 
 UNIFIED_SOURCES += [
     'AndroidAlerts.cpp',
     'AndroidBridge.cpp',
     'AndroidCompositorWidget.cpp',
     'AndroidContentController.cpp',
-    'AndroidJavaWrappers.cpp',
     'AndroidJNI.cpp',
     'AndroidUiThread.cpp',
     'ANRReporter.cpp',
     'EventDispatcher.cpp',
     'GeckoEditableSupport.cpp',
     'GeneratedJNIWrappers.cpp',
     'GfxInfo.cpp',
     'nsAndroidProtocolHandler.cpp',
--- a/widget/android/nsWindow.cpp
+++ b/widget/android/nsWindow.cpp
@@ -538,36 +538,36 @@ public:
 
         if (!controller) {
             return false;
         }
 
         MouseInput::MouseType mouseType = MouseInput::MOUSE_NONE;
         MouseInput::ButtonType buttonType = MouseInput::NONE;
         switch (aAction) {
-            case AndroidMotionEvent::ACTION_DOWN:
+            case java::sdk::MotionEvent::ACTION_DOWN:
                 mouseType = MouseInput::MOUSE_DOWN;
                 buttonType = GetButtonType(buttons ^ mPreviousButtons);
                 mPreviousButtons = buttons;
                 break;
-            case AndroidMotionEvent::ACTION_UP:
+            case java::sdk::MotionEvent::ACTION_UP:
                 mouseType = MouseInput::MOUSE_UP;
                 buttonType = GetButtonType(buttons ^ mPreviousButtons);
                 mPreviousButtons = buttons;
                 break;
-            case AndroidMotionEvent::ACTION_MOVE:
+            case java::sdk::MotionEvent::ACTION_MOVE:
                 mouseType = MouseInput::MOUSE_MOVE;
                 break;
-            case AndroidMotionEvent::ACTION_HOVER_MOVE:
+            case java::sdk::MotionEvent::ACTION_HOVER_MOVE:
                 mouseType = MouseInput::MOUSE_MOVE;
                 break;
-            case AndroidMotionEvent::ACTION_HOVER_ENTER:
+            case java::sdk::MotionEvent::ACTION_HOVER_ENTER:
                 mouseType = MouseInput::MOUSE_WIDGET_ENTER;
                 break;
-            case AndroidMotionEvent::ACTION_HOVER_EXIT:
+            case java::sdk::MotionEvent::ACTION_HOVER_EXIT:
                 mouseType = MouseInput::MOUSE_WIDGET_EXIT;
                 break;
             default:
                 break;
         }
 
         if (mouseType == MouseInput::MOUSE_NONE) {
             return false;
--- a/widget/android/nsWindow.h
+++ b/widget/android/nsWindow.h
@@ -6,17 +6,16 @@
 
 #ifndef NSWINDOW_H_
 #define NSWINDOW_H_
 
 #include "nsBaseWidget.h"
 #include "gfxPoint.h"
 #include "nsIIdleServiceInternal.h"
 #include "nsTArray.h"
-#include "AndroidJavaWrappers.h"
 #include "EventDispatcher.h"
 #include "GeneratedJNIWrappers.h"
 #include "mozilla/EventForwards.h"
 #include "mozilla/Mutex.h"
 #include "mozilla/StaticPtr.h"
 #include "mozilla/TextRange.h"
 #include "mozilla/UniquePtr.h"