Added new API for toggling text input via Android EditText widget

This commit is contained in:
pelya
2011-02-24 16:21:54 +00:00
parent 4de240dc27
commit 99f734c61c
17 changed files with 174 additions and 40 deletions

View File

@@ -579,7 +579,7 @@ done
cd ../../..
echo Cleaning up dependencies
rm -rf project/libs/*
rm -rf project/libs/* project/gen
for OUT in obj; do
rm -rf project/$OUT/local/*/objs/sdl_main/* project/$OUT/local/*/libsdl_main.so
rm -rf project/$OUT/local/*/libsdl-*.so

View File

@@ -32,6 +32,6 @@ cd project && env PATH=$NDKBUILDPATH nice -n19 ndk-build -j4 V=1 && \
cp jni/application/src/libapplication.so libs/armeabi && \
`which ndk-build | sed 's@/ndk-build@@'`/toolchains/arm-linux-androideabi-4.4.3/prebuilt/$MYARCH/bin/arm-linux-androideabi-strip --strip-unneeded libs/armeabi/libapplication.so \
|| true ; } && \
ant `test -n "$1" && echo release || echo debug` && \
ant debug && \
test -z "$1" && cd bin && adb install -r DemoActivity-debug.apk

View File

@@ -242,6 +242,7 @@ public class MainActivity extends Activity {
DemoRenderer.nativeTextInput( (int)text.charAt(i), (int)text.codePointAt(i) );
}
}
DemoRenderer.nativeTextInputFinished();
_videoLayout.removeView(_screenKeyboard);
_screenKeyboard = null;
mGLView.setFocusableInTouchMode(true);
@@ -249,7 +250,7 @@ public class MainActivity extends Activity {
mGLView.requestFocus();
};
public void showScreenKeyboard()
public void showScreenKeyboard(final String oldText)
{
if(_screenKeyboard != null)
return;
@@ -283,6 +284,8 @@ public class MainActivity extends Activity {
};
_screenKeyboard = new EditText(this);
_screenKeyboard.setOnKeyListener(new myKeyListener(this));
_screenKeyboard.setHint(R.string.text_edit_click_here);
_screenKeyboard.setText(oldText);
_videoLayout.addView(_screenKeyboard);
_screenKeyboard.setFocusableInTouchMode(true);
_screenKeyboard.setFocusable(true);

View File

@@ -45,7 +45,7 @@ class Settings
static boolean settingsLoaded = false;
static boolean settingsChanged = false;
static final int SETTINGS_FILE_VERSION = 4;
static final int SETTINGS_FILE_VERSION = 5;
static void Save(final MainActivity p)
{

View File

@@ -253,18 +253,20 @@ class DemoRenderer extends GLSurfaceView_SDL.Renderer {
return 1;
}
public void showScreenKeyboard() // Called from native code
public void showScreenKeyboard(final String oldText) // Called from native code
{
class Callback implements Runnable
{
public MainActivity parent;
public String oldText;
public void run()
{
parent.showScreenKeyboard();
parent.showScreenKeyboard(oldText);
}
}
Callback cb = new Callback();
cb.parent = context;
cb.oldText = oldText;
context.runOnUiThread(cb);
}
@@ -279,6 +281,7 @@ class DemoRenderer extends GLSurfaceView_SDL.Renderer {
private native void nativeGlContextLost();
public native void nativeGlContextRecreated();
public static native void nativeTextInput( int ascii, int unicode );
public static native void nativeTextInputFinished();
private MainActivity context = null;
private AccelerometerReader accelerometer = null;

View File

@@ -143,4 +143,6 @@
<string name="video_smooth">Smooth the video</string>
<string name="video_separatethread">Separate thread for video, will increase FPS on some devices</string>
<string name="text_edit_click_here">Tap to start typing, press Back when done</string>
</resources>

View File

@@ -2,7 +2,7 @@
AppSettingVersion=17
LibSdlVersion=1.2
AppName="Ballfield"
AppFullName=net.olofson.ballfield
AppFullName=net.olofson.ballfield.v426
ScreenOrientation=h
InhibitSuspend=n
AppDataDownloadUrl="Game data is 1 Mb|ballfield.zip"

View File

@@ -13,7 +13,7 @@ SwVideoMode=y
AppUsesMouse=y
AppNeedsTwoButtonMouse=y
AppNeedsArrowKeys=n
AppNeedsTextInput=y
AppNeedsTextInput=n
AppUsesJoystick=n
AppHandlesJoystickSensitivity=n
AppUsesMultitouch=n
@@ -23,8 +23,8 @@ AppTouchscreenKeyboardKeysAmount=0
AppTouchscreenKeyboardKeysAmountAutoFire=0
RedefinedKeysScreenKb="LCTRL M T H E C SPACE C S L"
MultiABI=n
AppVersionCode=226512
AppVersionName="2265.12"
AppVersionCode=229312
AppVersionName="2293.12"
CompiledLibraries="sdl_net sdl_mixer sdl_image sdl_ttf png intl"
CustomBuildScript=n
AppCflags='-finline-functions -O2 -DWITH_ZLIB -DWITH_MIXER -DWITH_XML -DWITH_IMAGE -DWITH_TTF -DWITH_AI=simple'

View File

@@ -1 +1 @@
ballfield
fheroes2

View File

@@ -0,0 +1,26 @@
diff -ru orig/vice-2.3/src/arch/sdl/uimenu.c vice-2.3/src/arch/sdl/uimenu.c
--- orig/vice-2.3/src/arch/sdl/uimenu.c 2011-02-19 11:33:41.000000000 -0500
+++ vice-2.3/src/arch/sdl/uimenu.c 2011-02-23 09:56:42.000000000 -0500
@@ -750,8 +750,9 @@
if (vsid_mode && (sdl_vsid_state & SDL_VSID_ACTIVE)) {
sdl_vsid_close();
}
-
+#ifndef ANDROID
SDL_EnableKeyRepeat(SDL_DEFAULT_REPEAT_DELAY, SDL_DEFAULT_REPEAT_INTERVAL);
+#endif
sdl_menu_state = 1;
ui_check_mouse_cursor();
}
@@ -762,8 +763,9 @@
sdl_menu_state = 0;
ui_check_mouse_cursor();
+#ifndef ANDROID
SDL_EnableKeyRepeat(0, 0);
-
+#endif
/* Do not resume sound if in warp mode */
resources_get_int("WarpMode", &warp_state);
if (warp_state == 0) {

View File

@@ -70,11 +70,14 @@ extern DECLSPEC int SDLCALL SDL_ANDROID_GetScreenKeyboardShown();
extern DECLSPEC int SDLCALL SDL_ANDROID_GetScreenKeyboardSize();
/* Show Android on-screen keyboard, and pass entered text back to application as SDL keypress events, previousText may be NULL */
/* Show Android on-screen keyboard, and pass entered text back to application as SDL keypress events,
previousText is UTF-8 encoded, it may be NULL, only 256 first bytes will be used, and this call will not block */
extern DECLSPEC int SDLCALL SDL_ANDROID_ToggleScreenKeyboardTextInput(const char * previousText);
/* Show Android on-screen keyboard, and pass entered text back to application in a buffer, previousText may be NULL */
extern DECLSPEC int SDLCALL SDL_ANDROID_GetScreenKeyboardTextInput(const char * previousText, char * outText, int outTextSize);
/* Show Android on-screen keyboard, and pass entered text back to application in a buffer,
using buffer contents as previous text (UTF-8 encoded), the buffer may be of any size -
this call will block until user typed all text */
extern DECLSPEC int SDLCALL SDL_ANDROID_GetScreenKeyboardTextInput(char * textBuf, int textBufSize);
/* Whether user redefined on-screen keyboard layout via SDL menu, app should not enforce it's own layout in that case */
extern DECLSPEC int SDLCALL SDL_ANDROID_GetScreenKeyboardRedefinedByUser();

View File

@@ -117,6 +117,38 @@ int oldMouseX = 0;
int oldMouseY = 0;
int oldMouseButtons = 0;
static int UnicodeToUtf8(int src, char * dest)
{
int len = 0;
if ( src <= 0x007f) {
*dest++ = (char)src;
len = 1;
} else if (src <= 0x07ff) {
*dest++ = (char)0xc0 | (src >> 6);
*dest++ = (char)0x80 | (src & 0x003f);
len = 2;
} else if (src == 0xFEFF) {
// nop -- zap the BOM
} else if (src >= 0xD800 && src <= 0xDFFF) {
// surrogates not supported
} else if (src <= 0xffff) {
*dest++ = (char)0xe0 | (src >> 12);
*dest++ = (char)0x80 | ((src >> 6) & 0x003f);
*dest++ = (char)0x80 | (src & 0x003f);
len = 3;
} else if (src <= 0xffff) {
*dest++ = (char)0xf0 | (src >> 18);
*dest++ = (char)0x80 | ((src >> 12) & 0x3f);
*dest++ = (char)0x80 | ((src >> 6) & 0x3f);
*dest++ = (char)0x80 | (src & 0x3f);
len = 4;
} else {
// out of Unicode range
}
*dest = 0;
return len;
}
static inline int InsideRect(const SDL_Rect * r, int x, int y)
{
return ( x >= r->x && x <= r->x + r->w ) && ( y >= r->y && y <= r->y + r->h );
@@ -639,16 +671,40 @@ JAVA_EXPORT_NAME(DemoGLSurfaceView_nativeKey) ( JNIEnv* env, jobject thiz, jint
SDL_ANDROID_MainThreadPushKeyboardKey( action ? SDL_PRESSED : SDL_RELEASED, TranslateKey(key) );
}
JNIEXPORT void JNICALL
JAVA_EXPORT_NAME(DemoRenderer_nativeTextInput) ( JNIEnv* env, jobject thiz, jint ascii, jint unicode )
static char * textInputBuffer = NULL;
int textInputBufferLen = 0;
int textInputBufferPos = 0;
void SDL_ANDROID_TextInputInit(char * buffer, int len)
{
SDL_ANDROID_MainThreadPushText(ascii, unicode);
textInputBuffer = buffer;
textInputBufferLen = len;
}
JNIEXPORT void JNICALL
JAVA_EXPORT_NAME(DemoRenderer_nativeTextInput) ( JNIEnv* env, jobject thiz, jint ascii, jint unicode )
{
if( !textInputBuffer )
SDL_ANDROID_MainThreadPushText(ascii, unicode);
else
{
if( textInputBufferPos < textInputBufferLen + 4 )
{
textInputBufferPos += UnicodeToUtf8(unicode, textInputBuffer + textInputBufferPos);
}
}
}
JNIEXPORT void JNICALL
JAVA_EXPORT_NAME(DemoRenderer_nativeTextInputFinished) ( JNIEnv* env, jobject thiz )
{
textInputBuffer = NULL;
SDL_ANDROID_TextInputFinished();
}
static void updateOrientation ( float accX, float accY, float accZ );
JNIEXPORT void JNICALL
JNIEXPORT void JNICALL
JAVA_EXPORT_NAME(AccelerometerReader_nativeAccelerometer) ( JNIEnv* env, jobject thiz, jfloat accPosX, jfloat accPosY, jfloat accPosZ )
{
#if SDL_VERSION_ATLEAST(1,3,0)
@@ -1531,10 +1587,8 @@ extern void SDL_ANDROID_MainThreadPushText( int ascii, int unicode )
#if SDL_VERSION_ATLEAST(1,3,0)
// TODO: convert to UTF-8
ev->type = SDL_TEXTINPUT;
ev->text.text[0] = ascii;
ev->text.text[1] = 0;
UnicodeToUtf8(unicode, ev->text.text);
#else

View File

@@ -63,6 +63,7 @@ static jmethodID JavaSwapBuffers = NULL;
static jmethodID JavaShowScreenKeyboard = NULL;
static int glContextLost = 0;
static int showScreenKeyboardDeferred = 0;
static const char * showScreenKeyboardOldText = "";
int SDL_ANDROID_SmoothVideo = 0;
int SDL_ANDROID_VideoMultithreaded = 0;
@@ -117,7 +118,7 @@ int SDL_ANDROID_CallJavaSwapBuffers()
if( showScreenKeyboardDeferred )
{
showScreenKeyboardDeferred = 0;
(*JavaEnv)->CallVoidMethod( JavaEnv, JavaRenderer, JavaShowScreenKeyboard );
(*JavaEnv)->CallVoidMethod( JavaEnv, JavaRenderer, JavaShowScreenKeyboard, (*JavaEnv)->NewStringUTF(JavaEnv, showScreenKeyboardOldText) );
}
SDL_ANDROID_ProcessDeferredEvents();
return 1;
@@ -210,13 +211,51 @@ JAVA_EXPORT_NAME(DemoRenderer_nativeGlContextRecreated) ( JNIEnv* env, jobject
#endif
}
void SDL_ANDROID_CallJavaShowScreenKeyboard(const char * oldText, int blocking)
volatile static textInputFinished = 0;
void SDL_ANDROID_TextInputFinished()
{
showScreenKeyboardDeferred = 1;
// Move mouse by 1 pixel to force screen update
int x, y;
SDL_GetMouseState( &x, &y );
SDL_ANDROID_MainThreadPushMouseMotion(x > 0 ? x-1 : 0, y);
textInputFinished = 1;
};
#if SDL_VERSION_ATLEAST(1,3,0)
#else
extern int SDL_Flip(SDL_Surface *screen);
extern SDL_Surface *SDL_GetVideoSurface(void);
#endif
void SDL_ANDROID_CallJavaShowScreenKeyboard(const char * oldText, char * outBuf, int outBufLen)
{
if( !outBuf )
{
showScreenKeyboardDeferred = 1;
showScreenKeyboardOldText = oldText;
// Move mouse by 1 pixel to force screen update
int x, y;
SDL_GetMouseState( &x, &y );
SDL_ANDROID_MainThreadPushMouseMotion(x > 0 ? x-1 : 0, y);
}
else
{
textInputFinished = 0;
SDL_ANDROID_TextInputInit(outBuf, outBufLen);
if( SDL_ANDROID_VideoMultithreaded )
{
#if SDL_VERSION_ATLEAST(1,3,0)
#else
// Dirty hack: we may call (*JavaEnv)->CallVoidMethod(...) only from video thread
showScreenKeyboardDeferred = 1;
showScreenKeyboardOldText = oldText;
SDL_Flip(SDL_GetVideoSurface());
#endif
}
else
(*JavaEnv)->CallVoidMethod( JavaEnv, JavaRenderer, JavaShowScreenKeyboard, (*JavaEnv)->NewStringUTF(JavaEnv, oldText) );
while( !textInputFinished )
SDL_Delay(100);
textInputFinished = 0;
}
}
JNIEXPORT void JNICALL
@@ -227,7 +266,7 @@ JAVA_EXPORT_NAME(DemoRenderer_nativeInitJavaCallbacks) ( JNIEnv* env, jobject t
JavaRendererClass = (*JavaEnv)->GetObjectClass(JavaEnv, thiz);
JavaSwapBuffers = (*JavaEnv)->GetMethodID(JavaEnv, JavaRendererClass, "swapBuffers", "()I");
JavaShowScreenKeyboard = (*JavaEnv)->GetMethodID(JavaEnv, JavaRendererClass, "showScreenKeyboard", "()V");
JavaShowScreenKeyboard = (*JavaEnv)->GetMethodID(JavaEnv, JavaRendererClass, "showScreenKeyboard", "(Ljava/lang/String;)V");
ANDROID_InitOSKeymap();

View File

@@ -40,12 +40,14 @@ extern int SDL_ANDROID_TouchscreenCalibrationX;
extern int SDL_ANDROID_TouchscreenCalibrationY;
extern int SDL_ANDROID_SmoothVideo;
extern int SDL_ANDROID_VideoMultithreaded;
extern void SDL_ANDROID_TextInputInit(char * buffer, int len);
extern void SDL_ANDROID_TextInputFinished();
extern SDL_Surface *SDL_CurrentVideoSurface;
extern SDL_Rect SDL_ANDROID_ForceClearScreenRect;
extern int SDL_ANDROID_ShowScreenUnderFinger;
extern SDL_Rect SDL_ANDROID_ShowScreenUnderFingerRect, SDL_ANDROID_ShowScreenUnderFingerRectSrc;
extern int SDL_ANDROID_CallJavaSwapBuffers();
extern void SDL_ANDROID_CallJavaShowScreenKeyboard(const char * oldText, int blocking);
extern void SDL_ANDROID_CallJavaShowScreenKeyboard(const char * oldText, char * outBuf, int outBufLen);
extern int SDL_ANDROID_drawTouchscreenKeyboard();
extern void SDL_ANDROID_VideoContextLost();
extern void SDL_ANDROID_VideoContextRecreated();

View File

@@ -788,19 +788,16 @@ int SDL_ANDROID_GetScreenKeyboardSize()
int SDL_ANDROID_ToggleScreenKeyboardTextInput(const char * previousText)
{
const char * textIn = previousText;
if( textIn == NULL )
textIn = "";
SDL_ANDROID_CallJavaShowScreenKeyboard(textIn, 0);
static char textIn[255];
strncpy(textIn, previousText, sizeof(textIn));
textIn[sizeof(textIn)-1] = 0;
SDL_ANDROID_CallJavaShowScreenKeyboard(textIn, NULL, 0);
return 1;
};
int SDLCALL SDL_ANDROID_GetScreenKeyboardTextInput(const char * previousText, char * outText, int outTextSize)
int SDLCALL SDL_ANDROID_GetScreenKeyboardTextInput(char * textBuf, int textBufSize)
{
const char * textIn = previousText;
if( textIn == NULL )
textIn = "";
SDL_ANDROID_CallJavaShowScreenKeyboard(textIn, 1);
SDL_ANDROID_CallJavaShowScreenKeyboard(textBuf, textBuf, textBufSize);
return 1;
};

View File

@@ -174,7 +174,8 @@ and that may be not desired for older phones with very little storage.
The script app2sd.sh will re-package your .apk file in such a way that
the shared libraries will not be extracted by Android OS but by application itself,
and it will remove them from internal storage right after starting up,
so you still need that space free, but only temporarily.
so you still need that space free, but only temporarily.
However your application will start up slower.
How to compile your own application using automake/configure scripts

View File

@@ -11,4 +11,8 @@ Bugs to fix
- Support of libjnigraphics (it will disable on-screen keyboard, only SW SDL screen surface supported)
- Update screen keyboard text input API
- Floating on-screen joystick
And that's all, I won't be doing any more development or fix other bugs (see bugs.txt for details).