aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authormontellese <montellese@xbmc.org>2016-02-09 12:45:50 +0100
committerGarrett Brown <themagnificentmrb@gmail.com>2016-03-10 21:33:33 -0800
commitea11320ea8208f6c6c11356180db7e607a2fd5a7 (patch)
tree26f354dbc99eb920ed7e64ca4fdfdb1679eb4c02
parentd09d579debe6ae60eeabe29ec3dbe08dd780567f (diff)
[android] add JNI wrapper for android.hardware.input.InputManager, a Java/native implementation of InputManager.InputDeviceListener and an IInputDeviceCallbacks interface to be able to receive callbacks when input devices change
-rw-r--r--.gitignore1
-rw-r--r--configure.ac1
-rw-r--r--tools/android/packaging/xbmc/src/org/xbmc/kodi/Main.java.in11
-rw-r--r--tools/android/packaging/xbmc/src/org/xbmc/kodi/XBMCInputDeviceListener.java.in29
-rw-r--r--xbmc/platform/android/activity/IInputDeviceCallbacks.h33
-rw-r--r--xbmc/platform/android/activity/JNIMainActivity.cpp27
-rw-r--r--xbmc/platform/android/activity/JNIMainActivity.h6
-rw-r--r--xbmc/platform/android/activity/XBMCApp.cpp52
-rw-r--r--xbmc/platform/android/activity/XBMCApp.h18
-rw-r--r--xbmc/platform/android/activity/android_main.cpp12
-rw-r--r--xbmc/platform/android/jni/InputManager.cpp92
-rw-r--r--xbmc/platform/android/jni/InputManager.h57
-rw-r--r--xbmc/platform/android/jni/Makefile.in1
-rw-r--r--xbmc/platform/android/jni/View.cpp2
-rw-r--r--xbmc/platform/android/jni/View.h2
15 files changed, 340 insertions, 4 deletions
diff --git a/.gitignore b/.gitignore
index f4c2e271a1..fb8f54922f 100644
--- a/.gitignore
+++ b/.gitignore
@@ -333,6 +333,7 @@ lib/cpluff/stamp-h1
/tools/android/packaging/xbmc/src/org/xbmc/kodi/Main.java
/tools/android/packaging/xbmc/src/org/xbmc/kodi/Splash.java
/tools/android/packaging/xbmc/src/org/xbmc/kodi/XBMCBroadcastReceiver.java
+/tools/android/packaging/xbmc/src/org/xbmc/kodi/XBMCInputDeviceListener.java
/tools/android/packaging/xbmc/src/org/xbmc/kodi/XBMCOnAudioFocusChangeListener.java
/tools/android/packaging/xbmc/src/org/xbmc/kodi/XBMCOnFrameAvailableListener.java
/tools/android/packaging/xbmc/src/org/xbmc/kodi/XBMCSettingsContentObserver.java
diff --git a/configure.ac b/configure.ac
index c7985c6d81..d1e443d20a 100644
--- a/configure.ac
+++ b/configure.ac
@@ -2237,6 +2237,7 @@ OUTPUT_FILES="Makefile \
tools/android/packaging/xbmc/src/org/xbmc/kodi/Splash.java \
tools/android/packaging/xbmc/src/org/xbmc/kodi/Main.java \
tools/android/packaging/xbmc/src/org/xbmc/kodi/XBMCBroadcastReceiver.java \
+ tools/android/packaging/xbmc/src/org/xbmc/kodi/XBMCInputDeviceListener.java \
tools/android/packaging/xbmc/src/org/xbmc/kodi/XBMCOnFrameAvailableListener.java \
tools/android/packaging/xbmc/src/org/xbmc/kodi/XBMCSettingsContentObserver.java \
tools/android/packaging/xbmc/src/org/xbmc/kodi/XBMCOnAudioFocusChangeListener.java \
diff --git a/tools/android/packaging/xbmc/src/org/xbmc/kodi/Main.java.in b/tools/android/packaging/xbmc/src/org/xbmc/kodi/Main.java.in
index bfa7c14419..b78b7bfd15 100644
--- a/tools/android/packaging/xbmc/src/org/xbmc/kodi/Main.java.in
+++ b/tools/android/packaging/xbmc/src/org/xbmc/kodi/Main.java.in
@@ -3,6 +3,7 @@ package org.xbmc.@APP_NAME_LC@;
import android.app.NativeActivity;
import android.content.ComponentName;
import android.content.Intent;
+import android.hardware.input.InputManager;
import android.media.AudioManager;
import android.os.Bundle;
import android.util.Log;
@@ -19,6 +20,7 @@ public class Main extends NativeActivity
private static final String TAG = "@APP_NAME_LC@";
private XBMCSettingsContentObserver mSettingsContentObserver;
+ private XBMCInputDeviceListener mInputDeviceListener;
private XBMCVideoView mVideoView = null;
private RelativeLayout mVideoLayout = null;
private View thisView = null;
@@ -101,6 +103,11 @@ public class Main extends NativeActivity
mSettingsContentObserver = new XBMCSettingsContentObserver(this, new Handler());
getApplicationContext().getContentResolver().registerContentObserver(android.provider.Settings.System.CONTENT_URI, true, mSettingsContentObserver );
+ // register the InputDeviceListener implementation
+ mInputDeviceListener = new XBMCInputDeviceListener();
+ InputManager manager = (InputManager) getSystemService(INPUT_SERVICE);
+ manager.registerInputDeviceListener(mInputDeviceListener, new Handler());
+
thisView = getWindow().getDecorView();
thisView.setOnSystemUiVisibilityChangeListener(new View.OnSystemUiVisibilityChangeListener()
{
@@ -176,6 +183,10 @@ public class Main extends NativeActivity
@Override
public void onDestroy()
{
+ // unregister the InputDeviceListener implementation
+ InputManager manager = (InputManager) getSystemService(INPUT_SERVICE);
+ manager.unregisterInputDeviceListener(mInputDeviceListener);
+
getApplicationContext().getContentResolver().unregisterContentObserver(mSettingsContentObserver);
super.onDestroy();
}
diff --git a/tools/android/packaging/xbmc/src/org/xbmc/kodi/XBMCInputDeviceListener.java.in b/tools/android/packaging/xbmc/src/org/xbmc/kodi/XBMCInputDeviceListener.java.in
new file mode 100644
index 0000000000..4e044f84a1
--- /dev/null
+++ b/tools/android/packaging/xbmc/src/org/xbmc/kodi/XBMCInputDeviceListener.java.in
@@ -0,0 +1,29 @@
+package org.xbmc.@APP_NAME_LC@;
+
+import android.hardware.input.InputManager.InputDeviceListener;
+import android.util.Log;
+
+public class XBMCInputDeviceListener implements InputDeviceListener
+{
+ native void _onInputDeviceAdded(int deviceId);
+ native void _onInputDeviceChanged(int deviceId);
+ native void _onInputDeviceRemoved(int deviceId);
+
+ @Override
+ public void onInputDeviceAdded(int deviceId)
+ {
+ _onInputDeviceAdded(deviceId);
+ }
+
+ @Override
+ public void onInputDeviceChanged(int deviceId)
+ {
+ _onInputDeviceChanged(deviceId);
+ }
+
+ @Override
+ public void onInputDeviceRemoved(int deviceId)
+ {
+ _onInputDeviceRemoved(deviceId);
+ }
+}
diff --git a/xbmc/platform/android/activity/IInputDeviceCallbacks.h b/xbmc/platform/android/activity/IInputDeviceCallbacks.h
new file mode 100644
index 0000000000..c799e103bd
--- /dev/null
+++ b/xbmc/platform/android/activity/IInputDeviceCallbacks.h
@@ -0,0 +1,33 @@
+#pragma once
+/*
+ * Copyright (C) 2016 Team XBMC
+ * http://xbmc.org
+ *
+ * This Program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2, or (at your option)
+ * any later version.
+ *
+ * This Program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with XBMC; see the file COPYING. If not, see
+ * <http://www.gnu.org/licenses/>.
+ *
+ */
+
+class IInputDeviceCallbacks
+{
+public:
+ virtual ~IInputDeviceCallbacks() { }
+
+ virtual void OnInputDeviceAdded(int deviceId) = 0;
+ virtual void OnInputDeviceChanged(int deviceId) = 0;
+ virtual void OnInputDeviceRemoved(int deviceId) = 0;
+
+protected:
+ IInputDeviceCallbacks() { }
+};
diff --git a/xbmc/platform/android/activity/JNIMainActivity.cpp b/xbmc/platform/android/activity/JNIMainActivity.cpp
index 43729272e8..aede2342b5 100644
--- a/xbmc/platform/android/activity/JNIMainActivity.cpp
+++ b/xbmc/platform/android/activity/JNIMainActivity.cpp
@@ -76,6 +76,33 @@ void CJNIMainActivity::_onAudioFocusChange(JNIEnv *env, jobject context, jint fo
m_appInstance->onAudioFocusChange(focusChange);
}
+void CJNIMainActivity::_onInputDeviceAdded(JNIEnv *env, jobject context, jint deviceId)
+{
+ static_cast<void>(env);
+ static_cast<void>(context);
+
+ if (m_appInstance != nullptr)
+ m_appInstance->onInputDeviceAdded(deviceId);
+}
+
+void CJNIMainActivity::_onInputDeviceChanged(JNIEnv *env, jobject context, jint deviceId)
+{
+ static_cast<void>(env);
+ static_cast<void>(context);
+
+ if (m_appInstance != nullptr)
+ m_appInstance->onInputDeviceChanged(deviceId);
+}
+
+void CJNIMainActivity::_onInputDeviceRemoved(JNIEnv *env, jobject context, jint deviceId)
+{
+ static_cast<void>(env);
+ static_cast<void>(context);
+
+ if (m_appInstance != nullptr)
+ m_appInstance->onInputDeviceRemoved(deviceId);
+}
+
CJNISurface CJNIMainActivity::getVideoViewSurface()
{
return call_method<jhobject>(m_context,
diff --git a/xbmc/platform/android/activity/JNIMainActivity.h b/xbmc/platform/android/activity/JNIMainActivity.h
index a018feff22..80b5678ab5 100644
--- a/xbmc/platform/android/activity/JNIMainActivity.h
+++ b/xbmc/platform/android/activity/JNIMainActivity.h
@@ -20,9 +20,10 @@
*/
#include "platform/android/jni/Activity.h"
+#include "platform/android/jni/InputManager.h"
#include "platform/android/jni/Surface.h"
-class CJNIMainActivity : public CJNIActivity
+class CJNIMainActivity : public CJNIActivity, public CJNIInputManagerInputDeviceListener
{
public:
CJNIMainActivity(const ANativeActivity *nativeActivity);
@@ -33,6 +34,9 @@ public:
static void _onNewIntent(JNIEnv *env, jobject context, jobject intent);
static void _onVolumeChanged(JNIEnv *env, jobject context, jint volume);
static void _onAudioFocusChange(JNIEnv *env, jobject context, jint focusChange);
+ static void _onInputDeviceAdded(JNIEnv *env, jobject context, jint deviceId);
+ static void _onInputDeviceChanged(JNIEnv *env, jobject context, jint deviceId);
+ static void _onInputDeviceRemoved(JNIEnv *env, jobject context, jint deviceId);
static void _callNative(JNIEnv *env, jobject context, jlong funcAddr, jlong variantAddr);
static void runNativeOnUiThread(void (*callback)(CVariant *), CVariant *variant);
diff --git a/xbmc/platform/android/activity/XBMCApp.cpp b/xbmc/platform/android/activity/XBMCApp.cpp
index 632d81e61d..e6eb95cb31 100644
--- a/xbmc/platform/android/activity/XBMCApp.cpp
+++ b/xbmc/platform/android/activity/XBMCApp.cpp
@@ -50,6 +50,7 @@
#include "platform/XbmcContext.h"
#include <android/bitmap.h>
#include "cores/AudioEngine/AEFactory.h"
+#include "platform/android/activity/IInputDeviceCallbacks.h"
#include "platform/android/jni/JNIThreading.h"
#include "platform/android/jni/BroadcastReceiver.h"
#include "platform/android/jni/Intent.h"
@@ -100,6 +101,7 @@ ANativeWindow* CXBMCApp::m_window = NULL;
int CXBMCApp::m_batteryLevel = 0;
bool CXBMCApp::m_hasFocus = false;
bool CXBMCApp::m_headsetPlugged = false;
+IInputDeviceCallbacks* CXBMCApp::m_inputDeviceCallbacks = nullptr;
CCriticalSection CXBMCApp::m_applicationsMutex;
std::vector<androidPackage> CXBMCApp::m_applications;
@@ -145,6 +147,7 @@ void CXBMCApp::onStart()
android_printf("%s: Already running, ignoring request to start", __PRETTY_FUNCTION__);
return;
}
+
pthread_attr_t attr;
pthread_attr_init(&attr);
pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_JOINABLE);
@@ -532,6 +535,18 @@ void CXBMCApp::OnPlayBackEnded()
ReleaseAudioFocus();
}
+const CJNIViewInputDevice CXBMCApp::GetInputDevice(int deviceId)
+{
+ CJNIInputManager inputManager(getSystemService("input"));
+ return inputManager.getInputDevice(deviceId);
+}
+
+std::vector<int> CXBMCApp::GetInputDeviceIds()
+{
+ CJNIInputManager inputManager(getSystemService("input"));
+ return inputManager.getInputDeviceIds();
+}
+
std::vector<androidPackage> CXBMCApp::GetApplications()
{
CSingleLock lock(m_applicationsMutex);
@@ -896,3 +911,40 @@ const ANativeWindow** CXBMCApp::GetNativeWindow(int timeout)
m_windowCreated.WaitMSec(timeout);
return (const ANativeWindow**)&m_window;
}
+
+void CXBMCApp::RegisterInputDeviceCallbacks(IInputDeviceCallbacks* handler)
+{
+ if (handler == nullptr)
+ return;
+
+ m_inputDeviceCallbacks = handler;
+}
+
+void CXBMCApp::UnregisterInputDeviceCallbacks()
+{
+ m_inputDeviceCallbacks = nullptr;
+}
+
+void CXBMCApp::onInputDeviceAdded(int deviceId)
+{
+ CXBMCApp::android_printf("Input device added: %d", deviceId);
+
+ if (m_inputDeviceCallbacks != nullptr)
+ m_inputDeviceCallbacks->OnInputDeviceAdded(deviceId);
+}
+
+void CXBMCApp::onInputDeviceChanged(int deviceId)
+{
+ CXBMCApp::android_printf("Input device changed: %d", deviceId);
+
+ if (m_inputDeviceCallbacks != nullptr)
+ m_inputDeviceCallbacks->OnInputDeviceChanged(deviceId);
+}
+
+void CXBMCApp::onInputDeviceRemoved(int deviceId)
+{
+ CXBMCApp::android_printf("Input device removed: %d", deviceId);
+
+ if (m_inputDeviceCallbacks != nullptr)
+ m_inputDeviceCallbacks->OnInputDeviceRemoved(deviceId);
+}
diff --git a/xbmc/platform/android/activity/XBMCApp.h b/xbmc/platform/android/activity/XBMCApp.h
index 4266369856..fc845e28c1 100644
--- a/xbmc/platform/android/activity/XBMCApp.h
+++ b/xbmc/platform/android/activity/XBMCApp.h
@@ -33,6 +33,7 @@
#include "platform/android/jni/Activity.h"
#include "platform/android/jni/BroadcastReceiver.h"
#include "platform/android/jni/AudioManager.h"
+#include "platform/android/jni/View.h"
#include "threads/Event.h"
#include "JNIMainActivity.h"
@@ -41,6 +42,7 @@
class CJNIWakeLock;
class CAESinkAUDIOTRACK;
class CVariant;
+class IInputDeviceCallbacks;
typedef struct _JNIEnv JNIEnv;
struct androidIcon
@@ -57,7 +59,9 @@ struct androidPackage
int icon;
};
-class CXBMCApp : public IActivityHandler, public CJNIMainActivity, public CJNIBroadcastReceiver, public CJNIAudioManagerAudioFocusChangeListener
+class CXBMCApp : public IActivityHandler, public CJNIMainActivity,
+ public CJNIBroadcastReceiver,
+ public CJNIAudioManagerAudioFocusChangeListener
{
public:
CXBMCApp(ANativeActivity *nativeActivity);
@@ -67,6 +71,11 @@ public:
virtual void onVolumeChanged(int volume);
virtual void onAudioFocusChange(int focusChange);
+ // implementation of CJNIInputManagerInputDeviceListener
+ void onInputDeviceAdded(int deviceId) override;
+ void onInputDeviceChanged(int deviceId) override;
+ void onInputDeviceRemoved(int deviceId) override;
+
bool isValid() { return m_activity != NULL; }
void onStart();
@@ -120,6 +129,12 @@ public:
static void OnPlayBackStopped();
static void OnPlayBackEnded();
+ // input device methods
+ static void RegisterInputDeviceCallbacks(IInputDeviceCallbacks* handler);
+ static void UnregisterInputDeviceCallbacks();
+ static const CJNIViewInputDevice GetInputDevice(int deviceId);
+ static std::vector<int> GetInputDeviceIds();
+
static CXBMCApp* get() { return m_xbmcappinstance; }
protected:
@@ -143,6 +158,7 @@ private:
static int m_batteryLevel;
static bool m_hasFocus;
static bool m_headsetPlugged;
+ static IInputDeviceCallbacks* m_inputDeviceCallbacks;
bool m_firstrun;
bool m_exiting;
pthread_t m_thread;
diff --git a/xbmc/platform/android/activity/android_main.cpp b/xbmc/platform/android/activity/android_main.cpp
index efafe37fe6..98dc377282 100644
--- a/xbmc/platform/android/activity/android_main.cpp
+++ b/xbmc/platform/android/activity/android_main.cpp
@@ -93,6 +93,7 @@ extern "C" JNIEXPORT jint JNI_OnLoad(JavaVM *vm, void *reserved)
std::string frameListener = "org/xbmc/" + appName + "/XBMCOnFrameAvailableListener";
std::string settingsObserver = "org/xbmc/" + appName + "/XBMCSettingsContentObserver";
std::string audioFocusChangeListener = "org/xbmc/" + appName + "/XBMCOnAudioFocusChangeListener";
+ std::string inputDeviceListener = "org/xbmc/" + appName + "/XBMCInputDeviceListener";
jclass cMain = env->FindClass(mainClass.c_str());
if(cMain)
@@ -156,5 +157,16 @@ extern "C" JNIEXPORT jint JNI_OnLoad(JavaVM *vm, void *reserved)
env->RegisterNatives(cAudioFocusChangeListener, &mOnAudioFocusChange, 1);
}
+ jclass cInputDeviceListener = env->FindClass(inputDeviceListener.c_str());
+ if(cInputDeviceListener)
+ {
+ JNINativeMethod mInputDeviceCallbacks[3] = {
+ { "_onInputDeviceAdded", "(I)V", (void*)&CJNIMainActivity::_onInputDeviceAdded },
+ { "_onInputDeviceChanged", "(I)V", (void*)&CJNIMainActivity::_onInputDeviceChanged },
+ { "_onInputDeviceRemoved", "(I)V", (void*)&CJNIMainActivity::_onInputDeviceRemoved }
+ };
+ env->RegisterNatives(cInputDeviceListener, mInputDeviceCallbacks, 3);
+ }
+
return version;
}
diff --git a/xbmc/platform/android/jni/InputManager.cpp b/xbmc/platform/android/jni/InputManager.cpp
new file mode 100644
index 0000000000..8726f35813
--- /dev/null
+++ b/xbmc/platform/android/jni/InputManager.cpp
@@ -0,0 +1,92 @@
+/*
+ * Copyright (C) 2013 Team XBMC
+ * http://xbmc.org
+ *
+ * This Program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2, or (at your option)
+ * any later version.
+ *
+ * This Program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with XBMC; see the file COPYING. If not, see
+ * <http://www.gnu.org/licenses/>.
+ *
+ */
+
+#include <algorithm>
+
+#include "InputManager.h"
+#include "ClassLoader.h"
+#include "Context.h"
+#include "platform/android/activity/JNIMainActivity.h"
+
+#include "jutils/jutils-details.hpp"
+
+using namespace jni;
+
+/************************************************************************/
+/************************************************************************/
+CJNIInputManagerInputDeviceListener* CJNIInputManagerInputDeviceListener::m_listenerInstance = nullptr;
+
+CJNIInputManagerInputDeviceListener::CJNIInputManagerInputDeviceListener()
+ : CJNIBase(CJNIContext::getPackageName() + ".XBMCInputDeviceListener")
+{
+ CJNIMainActivity *appInstance = CJNIMainActivity::GetAppInstance();
+ if (!appInstance)
+ return;
+
+ // Convert "the/class/name" to "the.class.name" as loadClass() expects it.
+ std::string dotClassName = GetClassName();
+ std::replace(dotClassName.begin(), dotClassName.end(), '/', '.');
+ m_object = new_object(appInstance->getClassLoader().loadClass(dotClassName));
+ m_object.setGlobal();
+
+ m_listenerInstance = this;
+}
+
+void CJNIInputManagerInputDeviceListener::_onInputDeviceAdded(JNIEnv *env, jobject context, jint deviceId)
+{
+ static_cast<void>(env);
+ static_cast<void>(context);
+
+ if (m_listenerInstance != nullptr)
+ m_listenerInstance->onInputDeviceAdded(deviceId);
+}
+
+void CJNIInputManagerInputDeviceListener::_onInputDeviceChanged(JNIEnv *env, jobject context, jint deviceId)
+{
+ static_cast<void>(env);
+ static_cast<void>(context);
+
+ if (m_listenerInstance != nullptr)
+ m_listenerInstance->onInputDeviceChanged(deviceId);
+}
+
+void CJNIInputManagerInputDeviceListener::_onInputDeviceRemoved(JNIEnv *env, jobject context, jint deviceId)
+{
+ static_cast<void>(env);
+ static_cast<void>(context);
+
+ if (m_listenerInstance != nullptr)
+ m_listenerInstance->onInputDeviceRemoved(deviceId);
+}
+
+/************************************************************************/
+/************************************************************************/
+const CJNIViewInputDevice CJNIInputManager::getInputDevice(int id) const
+{
+ return call_method<jhobject>(m_object,
+ "getInputDevice", "(I)Landroid/view/InputDevice;",
+ id);
+}
+
+std::vector<int> CJNIInputManager::getInputDeviceIds() const
+{
+ return jcast<std::vector<int>>(call_method<jhintArray>(m_object,
+ "getInputDeviceIds", "()[I"));
+}
diff --git a/xbmc/platform/android/jni/InputManager.h b/xbmc/platform/android/jni/InputManager.h
new file mode 100644
index 0000000000..5ac9630bb6
--- /dev/null
+++ b/xbmc/platform/android/jni/InputManager.h
@@ -0,0 +1,57 @@
+#pragma once
+/*
+ * Copyright (C) 2016 Team XBMC
+ * http://xbmc.org
+ *
+ * This Program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2, or (at your option)
+ * any later version.
+ *
+ * This Program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with XBMC; see the file COPYING. If not, see
+ * <http://www.gnu.org/licenses/>.
+ *
+ */
+
+#include "JNIBase.h"
+#include "View.h"
+
+class CJNIInputManagerInputDeviceListener : public CJNIBase
+{
+public:
+ CJNIInputManagerInputDeviceListener(const jni::jhobject &object) : CJNIBase(object) {};
+ ~CJNIInputManagerInputDeviceListener() {};
+
+ static void _onInputDeviceAdded(JNIEnv *env, jobject context, jint deviceId);
+ static void _onInputDeviceChanged(JNIEnv *env, jobject context, jint deviceId);
+ static void _onInputDeviceRemoved(JNIEnv *env, jobject context, jint deviceId);
+
+protected:
+ CJNIInputManagerInputDeviceListener();
+
+ virtual void onInputDeviceAdded(int deviceId) = 0;
+ virtual void onInputDeviceChanged(int deviceId) = 0;
+ virtual void onInputDeviceRemoved(int deviceId) = 0;
+
+private:
+ static CJNIInputManagerInputDeviceListener *m_listenerInstance;
+};
+
+class CJNIInputManager : public CJNIBase
+{
+public:
+ CJNIInputManager(const jni::jhobject &object) : CJNIBase(object) {};
+ ~CJNIInputManager() {};
+
+ const CJNIViewInputDevice getInputDevice(int id) const;
+ std::vector<int> getInputDeviceIds() const;
+
+private:
+ CJNIInputManager();
+};
diff --git a/xbmc/platform/android/jni/Makefile.in b/xbmc/platform/android/jni/Makefile.in
index 88b36315c7..1a95acea14 100644
--- a/xbmc/platform/android/jni/Makefile.in
+++ b/xbmc/platform/android/jni/Makefile.in
@@ -58,6 +58,7 @@ SRCS += Resources.cpp
SRCS += PackageItemInfo.cpp
SRCS += DisplayMetrics.cpp
SRCS += KeyEvent.cpp
+SRCS += InputManager.cpp
SRCS += Os.cpp
LIB = jni.a
diff --git a/xbmc/platform/android/jni/View.cpp b/xbmc/platform/android/jni/View.cpp
index 4fd17e59b3..cfbe9d8446 100644
--- a/xbmc/platform/android/jni/View.cpp
+++ b/xbmc/platform/android/jni/View.cpp
@@ -137,7 +137,7 @@ int CJNIViewInputDevice::getVendorId() const
"getVendorId", "()I");
}
-CJNIOsVibrator CJNIViewInputDevice::getVibrator() const
+const CJNIOsVibrator CJNIViewInputDevice::getVibrator() const
{
return call_method<jhobject>(m_object,
"getVibrator", "()Landroid/os/Vibrator;");
diff --git a/xbmc/platform/android/jni/View.h b/xbmc/platform/android/jni/View.h
index 515cf96602..0805ac842b 100644
--- a/xbmc/platform/android/jni/View.h
+++ b/xbmc/platform/android/jni/View.h
@@ -63,7 +63,7 @@ public:
int getProductId() const;
int getSources() const;
int getVendorId() const;
- CJNIOsVibrator getVibrator() const;
+ const CJNIOsVibrator getVibrator() const;
bool hasMicrophone() const;
bool isVirtual() const;
bool supportsSource(int source) const;