diff options
author | Cameron Cawley | 2019-08-18 22:58:13 +0100 |
---|---|---|
committer | Filippos Karapetis | 2019-08-20 14:32:50 +0300 |
commit | 12c232eefc7c78f7d40da9894e395dee4ce6d8c2 (patch) | |
tree | 5a00b4bb1754d4fe6d2f6608851312206475f313 /backends/platform/android | |
parent | c2054682f0f20ad284582b0717d0298df401a228 (diff) | |
download | scummvm-rg350-12c232eefc7c78f7d40da9894e395dee4ce6d8c2.tar.gz scummvm-rg350-12c232eefc7c78f7d40da9894e395dee4ce6d8c2.tar.bz2 scummvm-rg350-12c232eefc7c78f7d40da9894e395dee4ce6d8c2.zip |
ANDROID: Add a button to show the virtual keyboard
Diffstat (limited to 'backends/platform/android')
-rw-r--r-- | backends/platform/android/android.cpp | 13 | ||||
-rw-r--r-- | backends/platform/android/android.mk | 6 | ||||
-rw-r--r-- | backends/platform/android/jni.cpp | 15 | ||||
-rw-r--r-- | backends/platform/android/jni.h | 2 | ||||
-rw-r--r-- | backends/platform/android/org/scummvm/scummvm/ScummVM.java | 1 | ||||
-rw-r--r-- | backends/platform/android/org/scummvm/scummvm/ScummVMActivity.java | 44 |
6 files changed, 80 insertions, 1 deletions
diff --git a/backends/platform/android/android.cpp b/backends/platform/android/android.cpp index f3dc0b5876..2ae36c8073 100644 --- a/backends/platform/android/android.cpp +++ b/backends/platform/android/android.cpp @@ -350,6 +350,7 @@ void OSystem_Android::initBackend() { ConfMan.registerDefault("fullscreen", true); ConfMan.registerDefault("aspect_ratio", true); ConfMan.registerDefault("touchpad_mouse_mode", true); + ConfMan.registerDefault("onscreen_control", true); ConfMan.setInt("autosave_period", 0); ConfMan.setBool("FM_high_quality", false); @@ -360,6 +361,11 @@ void OSystem_Android::initBackend() { else ConfMan.setBool("touchpad_mouse_mode", true); + if (ConfMan.hasKey("onscreen_control")) + JNI::showKeyboardControl(ConfMan.getBool("onscreen_control")); + else + ConfMan.setBool("onscreen_control", true); + // must happen before creating TimerManager to avoid race in // creating EventManager setupKeymapper(); @@ -411,6 +417,7 @@ bool OSystem_Android::hasFeature(Feature f) { f == kFeatureOverlaySupportsAlpha || f == kFeatureOpenUrl || f == kFeatureTouchpadMode || + f == kFeatureOnScreenControl || f == kFeatureClipboardSupport); } @@ -439,6 +446,10 @@ void OSystem_Android::setFeatureState(Feature f, bool enable) { ConfMan.setBool("touchpad_mouse_mode", enable); _touchpad_mode = enable; break; + case kFeatureOnScreenControl: + ConfMan.setBool("onscreen_control", enable); + JNI::showKeyboardControl(enable); + break; default: break; } @@ -456,6 +467,8 @@ bool OSystem_Android::getFeatureState(Feature f) { return _use_mouse_palette; case kFeatureTouchpadMode: return ConfMan.getBool("touchpad_mouse_mode"); + case kFeatureOnScreenControl: + return ConfMan.getBool("onscreen_control"); default: return false; } diff --git a/backends/platform/android/android.mk b/backends/platform/android/android.mk index b5f559c3a4..eaae5dd3dd 100644 --- a/backends/platform/android/android.mk +++ b/backends/platform/android/android.mk @@ -21,7 +21,11 @@ RESOURCES = \ $(PATH_BUILD_RES)/drawable/scummvm.png \ $(PATH_BUILD_RES)/drawable/scummvm_big.png \ $(PATH_BUILD_RES)/drawable-xhdpi/leanback_icon.png \ - $(PATH_BUILD_RES)/drawable-xhdpi/ouya_icon.png + $(PATH_BUILD_RES)/drawable-xhdpi/ouya_icon.png \ + $(PATH_BUILD_RES)/drawable-hdpi/ic_action_settings.png \ + $(PATH_BUILD_RES)/drawable-mdpi/ic_action_settings.png \ + $(PATH_BUILD_RES)/drawable-xhdpi/ic_action_settings.png \ + $(PATH_BUILD_RES)/drawable-xxhdpi/ic_action_settings.png DIST_ANDROID_MK = $(PATH_DIST)/jni/Android.mk DIST_BUILD_XML = $(PATH_DIST)/custom_rules.xml diff --git a/backends/platform/android/jni.cpp b/backends/platform/android/jni.cpp index ffe60062fb..905423a5a6 100644 --- a/backends/platform/android/jni.cpp +++ b/backends/platform/android/jni.cpp @@ -84,6 +84,7 @@ jmethodID JNI::_MID_setTextInClipboard = 0; jmethodID JNI::_MID_isConnectionLimited = 0; jmethodID JNI::_MID_setWindowCaption = 0; jmethodID JNI::_MID_showVirtualKeyboard = 0; +jmethodID JNI::_MID_showKeyboardControl = 0; jmethodID JNI::_MID_getSysArchives = 0; jmethodID JNI::_MID_initSurface = 0; jmethodID JNI::_MID_deinitSurface = 0; @@ -361,6 +362,19 @@ void JNI::showVirtualKeyboard(bool enable) { } } +void JNI::showKeyboardControl(bool enable) { + JNIEnv *env = JNI::getEnv(); + + env->CallVoidMethod(_jobj, _MID_showKeyboardControl, enable); + + if (env->ExceptionCheck()) { + LOGE("Error trying to show virtual keyboard control"); + + env->ExceptionDescribe(); + env->ExceptionClear(); + } +} + void JNI::addSysArchivesToSearchSet(Common::SearchSet &s, int priority) { JNIEnv *env = JNI::getEnv(); @@ -517,6 +531,7 @@ void JNI::create(JNIEnv *env, jobject self, jobject asset_manager, FIND_METHOD(, setTextInClipboard, "([B)Z"); FIND_METHOD(, isConnectionLimited, "()Z"); FIND_METHOD(, showVirtualKeyboard, "(Z)V"); + FIND_METHOD(, showKeyboardControl, "(Z)V"); FIND_METHOD(, getSysArchives, "()[Ljava/lang/String;"); FIND_METHOD(, initSurface, "()Ljavax/microedition/khronos/egl/EGLSurface;"); FIND_METHOD(, deinitSurface, "()V"); diff --git a/backends/platform/android/jni.h b/backends/platform/android/jni.h index e65e7f5dc8..aa89174dfc 100644 --- a/backends/platform/android/jni.h +++ b/backends/platform/android/jni.h @@ -64,6 +64,7 @@ public: static bool setTextInClipboard(const Common::String &text); static bool isConnectionLimited(); static void showVirtualKeyboard(bool enable); + static void showKeyboardControl(bool enable); static void addSysArchivesToSearchSet(Common::SearchSet &s, int priority); static inline bool haveSurface(); @@ -101,6 +102,7 @@ private: static jmethodID _MID_isConnectionLimited; static jmethodID _MID_setWindowCaption; static jmethodID _MID_showVirtualKeyboard; + static jmethodID _MID_showKeyboardControl; static jmethodID _MID_getSysArchives; static jmethodID _MID_initSurface; static jmethodID _MID_deinitSurface; diff --git a/backends/platform/android/org/scummvm/scummvm/ScummVM.java b/backends/platform/android/org/scummvm/scummvm/ScummVM.java index 7b6627f667..37fe76ebda 100644 --- a/backends/platform/android/org/scummvm/scummvm/ScummVM.java +++ b/backends/platform/android/org/scummvm/scummvm/ScummVM.java @@ -61,6 +61,7 @@ public abstract class ScummVM implements SurfaceHolder.Callback, Runnable { abstract protected boolean isConnectionLimited(); abstract protected void setWindowCaption(String caption); abstract protected void showVirtualKeyboard(boolean enable); + abstract protected void showKeyboardControl(boolean enable); abstract protected String[] getSysArchives(); public ScummVM(AssetManager asset_manager, SurfaceHolder holder) { diff --git a/backends/platform/android/org/scummvm/scummvm/ScummVMActivity.java b/backends/platform/android/org/scummvm/scummvm/ScummVMActivity.java index 58af703d56..7bb0fe8057 100644 --- a/backends/platform/android/org/scummvm/scummvm/ScummVMActivity.java +++ b/backends/platform/android/org/scummvm/scummvm/ScummVMActivity.java @@ -15,10 +15,12 @@ import android.os.Environment; import android.text.ClipboardManager; import android.util.DisplayMetrics; import android.util.Log; +import android.view.View; import android.view.SurfaceView; import android.view.SurfaceHolder; import android.view.MotionEvent; import android.view.inputmethod.InputMethodManager; +import android.widget.ImageView; import android.widget.Toast; import java.io.File; @@ -39,6 +41,17 @@ public class ScummVMActivity extends Activity { } } + public View.OnClickListener keyboardBtnOnClickListener = new View.OnClickListener() { + @Override + public void onClick(View v) { + runOnUiThread(new Runnable() { + public void run() { + toggleKeyboard(); + } + }); + } + }; + private class MyScummVM extends ScummVM { private boolean usingSmallScreen() { // Multiple screen sizes came in with Android 1.6. Have @@ -151,6 +164,15 @@ public class ScummVMActivity extends Activity { } @Override + protected void showKeyboardControl(final boolean enable) { + runOnUiThread(new Runnable() { + public void run() { + showKeyboardView(enable); + } + }); + } + + @Override protected String[] getSysArchives() { return new String[0]; } @@ -233,6 +255,9 @@ public class ScummVMActivity extends Activity { _events = new ScummVMEventsHoneycomb(this, _scummvm, _mouseHelper); } + // On screen button listener + ((ImageView)findViewById(R.id.show_keyboard)).setOnClickListener(keyboardBtnOnClickListener); + main_surface.setOnKeyListener(_events); main_surface.setOnTouchListener(_events); @@ -324,6 +349,25 @@ public class ScummVMActivity extends Activity { InputMethodManager.HIDE_IMPLICIT_ONLY); } + private void toggleKeyboard() { + SurfaceView main_surface = (SurfaceView)findViewById(R.id.main_surface); + InputMethodManager imm = (InputMethodManager) + getSystemService(INPUT_METHOD_SERVICE); + + imm.toggleSoftInputFromWindow(main_surface.getWindowToken(), + InputMethodManager.SHOW_IMPLICIT, + InputMethodManager.HIDE_IMPLICIT_ONLY); + } + + private void showKeyboardView(boolean show) { + ImageView keyboardBtn = (ImageView)findViewById(R.id.show_keyboard); + + if (show) + keyboardBtn.setVisibility(View.VISIBLE); + else + keyboardBtn.setVisibility(View.GONE); + } + private void showMouseCursor(boolean show) { /* Currently hiding the system mouse cursor is only supported on OUYA. If other systems provide similar |