|
@@ -52,12 +52,11 @@
|
|
|
#endif
|
|
|
#ifdef LAGUI_ANDROID
|
|
|
#include <GLES3/gl32.h>
|
|
|
+#include <jni.h>
|
|
|
#include <android/log.h>
|
|
|
#include <android/native_activity.h>
|
|
|
-#include <jni.h>
|
|
|
#include <android/native_window.h>
|
|
|
#include <android/native_window_jni.h>
|
|
|
-#include <jni.h>
|
|
|
#include <android_native_app_glue.h>
|
|
|
#include <android/window.h>
|
|
|
#include <android/asset_manager.h>
|
|
@@ -1306,11 +1305,15 @@ int laGetReadyWith(laInitArguments* ia){
|
|
|
MAIN.WireThickness = 5;
|
|
|
MAIN.WireSaggyness = 0.5;
|
|
|
|
|
|
+#ifdef LAGUI_ANDROID
|
|
|
+ laAddResourceFolder("");
|
|
|
+#else
|
|
|
laAddResourceFolder(".");
|
|
|
+#endif
|
|
|
|
|
|
laSetMenuBarTemplates(laui_DefaultMenuButtons, laui_DefaultMenuExtras, "🧩LaGUI 2022");
|
|
|
|
|
|
- laAddExtraExtension(LA_FILETYPE_UDF,"udf",0);
|
|
|
+ laAddExtraExtension(LA_FILETYPE_UDF,"udf",0ll);
|
|
|
|
|
|
la_InitProgressWindow();
|
|
|
la_MakeTranslations();
|
|
@@ -1442,12 +1445,22 @@ void laShutoff(int SavePrefereces){
|
|
|
}
|
|
|
|
|
|
int laRestoreFactorySettings(){
|
|
|
- char path[1024]; sprintf(path, "%s%s", SSTR(MAIN.WorkingDirectory), "preferences.udf");
|
|
|
+ char path[1024];
|
|
|
+#ifdef LAGUI_ANDROID
|
|
|
+ sprintf(path,"%s","preferences.udf");
|
|
|
+#else
|
|
|
+ sprintf(path,"%s%s",SSTR(MAIN.WorkingDirectory),"preferences.udf");
|
|
|
+#endif
|
|
|
if(remove(path)){ return 0; }
|
|
|
return 1;
|
|
|
}
|
|
|
void laSaveUserPreferences(){
|
|
|
- char path[1024]; sprintf(path,"%s%s",SSTR(MAIN.WorkingDirectory),"preferences.udf");
|
|
|
+ char path[1024];
|
|
|
+#ifdef LAGUI_ANDROID
|
|
|
+ sprintf(path,"%s","preferences.udf");
|
|
|
+#else
|
|
|
+ sprintf(path,"%s%s",SSTR(MAIN.WorkingDirectory),"preferences.udf");
|
|
|
+#endif
|
|
|
laUDF* udf=laPrepareUDF(path);
|
|
|
laWriteProp(udf,"la.windows");
|
|
|
laWriteProp(udf,"la.user_preferences");
|
|
@@ -1459,10 +1472,15 @@ void laSaveUserPreferences(){
|
|
|
laPackUDF(udf,0,0);
|
|
|
}
|
|
|
void laEnsureUserPreferences(){
|
|
|
- char path[1024]; sprintf(path,"%s%s",SSTR(MAIN.WorkingDirectory),"preferences.udf");
|
|
|
+ char path[1024];
|
|
|
+#ifdef LAGUI_ANDROID
|
|
|
+ sprintf(path,"%s/%s",MAIN.InternalDataPath,"preferences.udf");
|
|
|
+#else
|
|
|
+ sprintf(path,"%s%s",SSTR(MAIN.WorkingDirectory),"preferences.udf");
|
|
|
+#endif
|
|
|
laUDFRegistry* r=laFindUDFRegistry(path);
|
|
|
if(!r){ laSaveUserPreferences(); return; }
|
|
|
- laUDF* udf=laOpenUDF(r->Path->Ptr,1,0,0); if(!udf){ logPrint("Can't read preferences. Using default settings."); return; }
|
|
|
+ laUDF* udf=laOpenUDF(SSTR(r->Path),1,0,0); if(!udf){ logPrint("Can't read preferences on %s. Using default settings.",SSTR(r->Path)); return; }
|
|
|
laClearUDFRegistries();
|
|
|
while(MAIN.ResourceFolders.pFirst){ laRemoveResourceFolder(MAIN.ResourceFolders.pFirst); }
|
|
|
while(MAIN.InputMapping->InputMappings.pFirst){ laRemoveInputMapping(MAIN.InputMapping->InputMappings.pFirst); }
|
|
@@ -1482,6 +1500,7 @@ void laAddExtraExtension(int FileType, ...){
|
|
|
laExtensionType* et=memAcquireSimple(sizeof(laExtensionType));
|
|
|
et->FileType=FileType; et->Extension=ext;
|
|
|
lstAppendItem(&MAIN.ExtraExtensions, et);
|
|
|
+ logPrintNew("add ext %s",ext);
|
|
|
}
|
|
|
va_end(list);
|
|
|
}
|
|
@@ -3075,6 +3094,9 @@ void la_AssignWindowPP(laWindow* w){
|
|
|
w->PP.LastPs->Type = U'.';
|
|
|
}
|
|
|
laWindow *laDesignWindow(int X, int Y, int W, int H){
|
|
|
+#ifdef LAGUI_ANDROID
|
|
|
+ if(MAIN.Windows.pFirst){ return MAIN.Windows.pFirst; }
|
|
|
+#endif
|
|
|
laWindow *n = memAcquire(sizeof(laWindow));
|
|
|
|
|
|
strSafeSet(&n->Title, "Empty SYSWINDOW");
|
|
@@ -8041,6 +8063,11 @@ void laMainLoop(){
|
|
|
|
|
|
laSetWindowCursor(LA_ARROW);
|
|
|
MAIN.DelayTriggered=1;
|
|
|
+
|
|
|
+#ifdef LAGUI_ANDROID
|
|
|
+ while(!MAIN.AppReady){ usleep(1000); }
|
|
|
+ la_CommandResizeWindow(0,0,0,MAIN.AppWidth,MAIN.AppHeight);
|
|
|
+#endif
|
|
|
|
|
|
while (1){
|
|
|
laRecordTime(&FrameStartTime);
|
|
@@ -8110,6 +8137,8 @@ int la_AndroidInitGraphics(void){
|
|
|
MAIN.AppWidth=ANativeWindow_getWidth(MAIN.app->window);
|
|
|
MAIN.AppHeight=ANativeWindow_getHeight(MAIN.app->window);
|
|
|
|
|
|
+ logPrintNew("Android init graphics %d x %d", MAIN.AppWidth, MAIN.AppHeight);
|
|
|
+
|
|
|
la_CommandResizeWindow(0,0,0,MAIN.AppWidth,MAIN.AppHeight);
|
|
|
|
|
|
EGLint samples = 0;
|
|
@@ -8132,7 +8161,7 @@ int la_AndroidInitGraphics(void){
|
|
|
|
|
|
EGLint numConfigs = 0;
|
|
|
|
|
|
- MAIN.egl_dpy = eglGetDisplay(EGL_DEFAULT_DISPLAY);
|
|
|
+ MAIN.egl_dpy=eglGetDisplay(EGL_DEFAULT_DISPLAY);
|
|
|
if (MAIN.egl_dpy == EGL_NO_DISPLAY){ logPrint("Android no display"); return -1; }
|
|
|
if (eglInitialize(MAIN.egl_dpy, NULL, NULL) == EGL_FALSE){ logPrint("Android can't init display"); return -1; }
|
|
|
eglChooseConfig(MAIN.egl_dpy, framebufferAttribs, &MAIN.BestFBC, 1, &numConfigs);
|
|
@@ -8146,16 +8175,13 @@ int la_AndroidInitGraphics(void){
|
|
|
|
|
|
ANativeWindow_setBuffersGeometry(MAIN.app->window, MAIN.AppWidth, MAIN.AppHeight, displayFormat);
|
|
|
|
|
|
- MAIN.egl_surf = eglCreateWindowSurface(MAIN.egl_surf, MAIN.BestFBC, MAIN.app->window, NULL);
|
|
|
+ MAIN.egl_surf = eglCreateWindowSurface(MAIN.egl_dpy, MAIN.BestFBC, MAIN.app->window, NULL);
|
|
|
|
|
|
|
|
|
-
|
|
|
+ eglSwapInterval(MAIN.egl_dpy, 1);
|
|
|
|
|
|
if (eglMakeCurrent(MAIN.egl_dpy, MAIN.egl_surf, MAIN.egl_surf, MAIN.glc) == EGL_FALSE) { logPrint("Android can't make current"); return -1; }
|
|
|
-
|
|
|
- glViewport(0,0,MAIN.AppWidth, MAIN.AppHeight);
|
|
|
- glClearColor(0,1,1,1);
|
|
|
- glClear(GL_COLOR_BUFFER_BIT);
|
|
|
+
|
|
|
eglSwapBuffers(MAIN.egl_dpy, MAIN.egl_surf);
|
|
|
|
|
|
MAIN.AppReady = 1;
|
|
@@ -8192,7 +8218,7 @@ static void la_AndroidCommandCallback(struct android_app *app, int32_t cmd){
|
|
|
|
|
|
|
|
|
|
|
|
- eglSwapBuffers(MAIN.egl_dpy, MAIN.egl_surf);
|
|
|
+
|
|
|
la_CommandResizeWindow(0,0,0,MAIN.AppWidth,MAIN.AppHeight);
|
|
|
|
|
|
MAIN.ContextRebindRequired = false;
|
|
@@ -8223,6 +8249,7 @@ static void la_AndroidCommandCallback(struct android_app *app, int32_t cmd){
|
|
|
case APP_CMD_CONFIG_CHANGED:
|
|
|
MAIN.AppWidth=ANativeWindow_getWidth(MAIN.app->window);
|
|
|
MAIN.AppHeight=ANativeWindow_getHeight(MAIN.app->window);
|
|
|
+
|
|
|
la_CommandResizeWindow(0,0,0,MAIN.AppWidth,MAIN.AppHeight);
|
|
|
|
|
|
|
|
@@ -8233,6 +8260,172 @@ static void la_AndroidCommandCallback(struct android_app *app, int32_t cmd){
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+#define KEYCODE_MAP_SIZE 162
|
|
|
+static const int KeycodeMap[KEYCODE_MAP_SIZE] = {
|
|
|
+ 0,
|
|
|
+ 0,
|
|
|
+ 0,
|
|
|
+ 0,
|
|
|
+ 0,
|
|
|
+ 0,
|
|
|
+ 0,
|
|
|
+ '0',
|
|
|
+ '1',
|
|
|
+ '2',
|
|
|
+ '3',
|
|
|
+ '4',
|
|
|
+ '5',
|
|
|
+ '6',
|
|
|
+ '7',
|
|
|
+ '8',
|
|
|
+ '9',
|
|
|
+ 0,
|
|
|
+ 0,
|
|
|
+ LA_KEY_ARRUP,
|
|
|
+ LA_KEY_ARRDOWN,
|
|
|
+ LA_KEY_ARRLEFT,
|
|
|
+ LA_KEY_ARRRIGHT,
|
|
|
+ 0,
|
|
|
+ 0,
|
|
|
+ 0,
|
|
|
+ 0,
|
|
|
+ 0,
|
|
|
+ 0,
|
|
|
+ 'a',
|
|
|
+ 'b',
|
|
|
+ 'c',
|
|
|
+ 'd',
|
|
|
+ 'e',
|
|
|
+ 'f',
|
|
|
+ 'g',
|
|
|
+ 'h',
|
|
|
+ 'i',
|
|
|
+ 'j',
|
|
|
+ 'k',
|
|
|
+ 'l',
|
|
|
+ 'm',
|
|
|
+ 'n',
|
|
|
+ 'o',
|
|
|
+ 'p',
|
|
|
+ 'q',
|
|
|
+ 'r',
|
|
|
+ 's',
|
|
|
+ 't',
|
|
|
+ 'u',
|
|
|
+ 'v',
|
|
|
+ 'w',
|
|
|
+ 'x',
|
|
|
+ 'y',
|
|
|
+ 'z',
|
|
|
+ ',',
|
|
|
+ '.',
|
|
|
+ LA_KEY_ALT,
|
|
|
+ LA_KEY_ALT,
|
|
|
+ LA_KEY_SHIFT,
|
|
|
+ LA_KEY_SHIFT,
|
|
|
+ LA_KEY_TAB,
|
|
|
+ ' ',
|
|
|
+ 0,
|
|
|
+ 0,
|
|
|
+ 0,
|
|
|
+ LA_KEY_ENTER,
|
|
|
+ LA_KEY_BACKSPACE,
|
|
|
+ '`',
|
|
|
+ '-',
|
|
|
+ '=',
|
|
|
+ '(',
|
|
|
+ ')',
|
|
|
+ '\\',
|
|
|
+ ';',
|
|
|
+ '\'',
|
|
|
+ '/',
|
|
|
+ 0,
|
|
|
+ 0,
|
|
|
+ 0,
|
|
|
+ 0,
|
|
|
+ 0,
|
|
|
+ 0,
|
|
|
+ 0,
|
|
|
+ 0,
|
|
|
+ 0,
|
|
|
+ 0,
|
|
|
+ 0,
|
|
|
+ 0,
|
|
|
+ 0,
|
|
|
+ 0,
|
|
|
+ 0,
|
|
|
+ 0,
|
|
|
+ 0,
|
|
|
+ 0,
|
|
|
+ 0,
|
|
|
+ 0,
|
|
|
+ 0,
|
|
|
+ 0,
|
|
|
+ 0,
|
|
|
+ 0,
|
|
|
+ 0,
|
|
|
+ 0,
|
|
|
+ 0,
|
|
|
+ 0,
|
|
|
+ 0,
|
|
|
+ 0,
|
|
|
+ 0,
|
|
|
+ 0,
|
|
|
+ 0,
|
|
|
+ 0,
|
|
|
+ LA_KEY_ESCAPE,
|
|
|
+ LA_KEY_DELETE,
|
|
|
+ LA_KEY_CTRL,
|
|
|
+ LA_KEY_CTRL,
|
|
|
+ 0,
|
|
|
+ 0,
|
|
|
+ LA_KEY_ARRLEFT,
|
|
|
+ LA_KEY_ARRRIGHT,
|
|
|
+ 0,
|
|
|
+ 0,
|
|
|
+ 0,
|
|
|
+ 0,
|
|
|
+ 0,
|
|
|
+ 0,
|
|
|
+ 0,
|
|
|
+ 0,
|
|
|
+ 0,
|
|
|
+ 0,
|
|
|
+ 0,
|
|
|
+ 0,
|
|
|
+ LA_KEY_F1,
|
|
|
+ LA_KEY_F2,
|
|
|
+ LA_KEY_F3,
|
|
|
+ LA_KEY_F4,
|
|
|
+ LA_KEY_F5,
|
|
|
+ LA_KEY_F6,
|
|
|
+ LA_KEY_F7,
|
|
|
+ LA_KEY_F8,
|
|
|
+ LA_KEY_F9,
|
|
|
+ LA_KEY_F10,
|
|
|
+ LA_KEY_F11,
|
|
|
+ LA_KEY_F12,
|
|
|
+ 0,
|
|
|
+ LA_KEY_NUM0,
|
|
|
+ LA_KEY_NUM1,
|
|
|
+ LA_KEY_NUM2,
|
|
|
+ LA_KEY_NUM3,
|
|
|
+ LA_KEY_NUM4,
|
|
|
+ LA_KEY_NUM5,
|
|
|
+ LA_KEY_NUM6,
|
|
|
+ LA_KEY_NUM7,
|
|
|
+ LA_KEY_NUM8,
|
|
|
+ LA_KEY_NUM9,
|
|
|
+ LA_KEY_NUMDIVIDE,
|
|
|
+ LA_KEY_NUMMULT,
|
|
|
+ LA_KEY_NUMMINUS,
|
|
|
+ LA_KEY_NUMPLUS,
|
|
|
+ LA_KEY_NUMDOT,
|
|
|
+ 0,
|
|
|
+ LA_KEY_NUMENTER,
|
|
|
+ '='
|
|
|
+};
|
|
|
+
|
|
|
static int32_t la_AndroidInputCallback(struct android_app *app, AInputEvent *event)
|
|
|
{
|
|
|
__android_log_print(ANDROID_LOG_DEBUG, "huh 5678", "123 input");
|
|
@@ -8241,7 +8434,46 @@ static int32_t la_AndroidInputCallback(struct android_app *app, AInputEvent *eve
|
|
|
|
|
|
int type = AInputEvent_getType(event);
|
|
|
if(type == AINPUT_EVENT_TYPE_KEY){
|
|
|
+ int32_t keycode = AKeyEvent_getKeyCode(event);
|
|
|
+
|
|
|
+ int key = (keycode > 0 && keycode < KEYCODE_MAP_SIZE) ? KeycodeMap[keycode] : 0;
|
|
|
+ if (key != 0){
|
|
|
+
|
|
|
+
|
|
|
+ if (AKeyEvent_getAction(event) == AKEY_EVENT_ACTION_DOWN){
|
|
|
+ la_SendKeyboardEvent(0,LA_KEY_DOWN,key);
|
|
|
+ if(key!=LA_KEY_BACKSPACE)
|
|
|
+ la_SendInputEvent(0,key);
|
|
|
+ }
|
|
|
+ else if (AKeyEvent_getAction(event) == AKEY_EVENT_ACTION_MULTIPLE){
|
|
|
+ la_SendKeyboardEvent(0,LA_KEY_DOWN,key);
|
|
|
+ la_SendInputEvent(0,key);
|
|
|
+ }
|
|
|
+ else la_SendKeyboardEvent(0,LA_KEY_UP,key);
|
|
|
+ }
|
|
|
+
|
|
|
+ if (keycode == AKEYCODE_POWER)
|
|
|
+ {
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+ return 0;
|
|
|
+ }
|
|
|
+ else if ((keycode == AKEYCODE_BACK) || (keycode == AKEYCODE_MENU))
|
|
|
+ {
|
|
|
+
|
|
|
+ return 1;
|
|
|
+ }
|
|
|
+ else if ((keycode == AKEYCODE_VOLUME_UP) || (keycode == AKEYCODE_VOLUME_DOWN))
|
|
|
+ {
|
|
|
+
|
|
|
+ return 0;
|
|
|
+ }
|
|
|
+
|
|
|
return 0;
|
|
|
+
|
|
|
}
|
|
|
elif(type == AINPUT_EVENT_TYPE_MOTION){
|
|
|
int pcount = AMotionEvent_getPointerCount(event); int x,y;
|
|
@@ -8277,9 +8509,10 @@ static int32_t la_AndroidInputCallback(struct android_app *app, AInputEvent *eve
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
|
-void la_InitAssetManager(AAssetManager *manager, const char *dataPath){
|
|
|
+void la_InitAssetManager(AAssetManager *manager, const char *dataPath, const char *externalDataPath){
|
|
|
MAIN.AssetManager = manager;
|
|
|
MAIN.InternalDataPath = dataPath;
|
|
|
+ MAIN.ExternalDataPath = externalDataPath;
|
|
|
}
|
|
|
|
|
|
static int android_read(void *cookie, char *data, int dataSize){
|
|
@@ -8311,7 +8544,10 @@ FILE *android_fopen(const char *fileName, const char *mode)
|
|
|
|
|
|
|
|
|
#undef fopen
|
|
|
+ FILE* result=fopen(fileName, mode); if(result){ return result; }
|
|
|
sprintf(buf,"%s/%s", MAIN.InternalDataPath, fileName);
|
|
|
+ result=fopen(buf, mode); if(result) return result;
|
|
|
+ sprintf(buf,"%s/%s", MAIN.ExternalDataPath, fileName);
|
|
|
return fopen(buf, mode);
|
|
|
#define fopen(name, mode) android_fopen(name, mode)
|
|
|
}
|
|
@@ -8328,23 +8564,57 @@ FILE *android_fopen(const char *fileName, const char *mode)
|
|
|
else
|
|
|
{
|
|
|
#undef fopen
|
|
|
+ FILE* result=fopen(fileName, mode); if(result){ return result; }
|
|
|
|
|
|
sprintf(buf,"%s/%s", MAIN.InternalDataPath, fileName);
|
|
|
+ result=fopen(buf, mode); if(result){ return result; }
|
|
|
+ sprintf(buf,"%s/%s", MAIN.ExternalDataPath, fileName);
|
|
|
return fopen(buf, mode);
|
|
|
#define fopen(name, mode) android_fopen(name, mode)
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+void la_HideNavBar(){
|
|
|
+ JavaVM* lJavaVM = MAIN.app->activity->vm;
|
|
|
+ JNIEnv* lJNIEnv = MAIN.app->activity->env;
|
|
|
+ (*lJavaVM)->AttachCurrentThread(lJavaVM, &lJNIEnv,0);
|
|
|
+
|
|
|
+ jclass activityClass = (*lJNIEnv)->FindClass(lJNIEnv,"android/app/NativeActivity");
|
|
|
+ jmethodID getWindow = (*lJNIEnv)->GetMethodID(lJNIEnv,activityClass, "getWindow", "()Landroid/view/Window;");
|
|
|
+
|
|
|
+ jclass windowClass = (*lJNIEnv)->FindClass(lJNIEnv,"android/view/Window");
|
|
|
+ jmethodID getDecorView = (*lJNIEnv)->GetMethodID(lJNIEnv,windowClass, "getDecorView", "()Landroid/view/View;");
|
|
|
+
|
|
|
+ jclass viewClass = (*lJNIEnv)->FindClass(lJNIEnv,"android/view/View");
|
|
|
+ jmethodID setSystemUiVisibility = (*lJNIEnv)->GetMethodID(lJNIEnv,viewClass, "setSystemUiVisibility", "(I)V");
|
|
|
+
|
|
|
+ jobject window = (*lJNIEnv)->CallObjectMethod(lJNIEnv,MAIN.app->activity->clazz, getWindow);
|
|
|
+
|
|
|
+ jobject decorView = (*lJNIEnv)->CallObjectMethod(lJNIEnv,window, getDecorView);
|
|
|
+
|
|
|
+ jfieldID flagFullscreenID = (*lJNIEnv)->GetStaticFieldID(lJNIEnv,viewClass, "SYSTEM_UI_FLAG_FULLSCREEN", "I");
|
|
|
+ jfieldID flagHideNavigationID = (*lJNIEnv)->GetStaticFieldID(lJNIEnv,viewClass, "SYSTEM_UI_FLAG_HIDE_NAVIGATION", "I");
|
|
|
+
|
|
|
+ int flagFullscreen = (*lJNIEnv)->GetStaticIntField(lJNIEnv,viewClass, flagFullscreenID);
|
|
|
+ int flagHideNavigation = (*lJNIEnv)->GetStaticIntField(lJNIEnv,viewClass, flagHideNavigationID);
|
|
|
+
|
|
|
+ int flag = flagFullscreen | flagHideNavigation;
|
|
|
+
|
|
|
+ (*lJNIEnv)->CallVoidMethod(lJNIEnv,decorView, setSystemUiVisibility, flag);
|
|
|
+ (*lJavaVM)->DetachCurrentThread(lJavaVM);
|
|
|
+}
|
|
|
+
|
|
|
void la_InitAndroidPlatform(struct android_app *app){
|
|
|
MAIN.app=app;
|
|
|
|
|
|
- ANativeActivity_setWindowFlags(MAIN.app->activity, AWINDOW_FLAG_FULLSCREEN, 1);
|
|
|
+ ANativeActivity_setWindowFlags(MAIN.app->activity, AWINDOW_FLAG_FULLSCREEN, 0);
|
|
|
+
|
|
|
|
|
|
MAIN.app->onAppCmd = la_AndroidCommandCallback;
|
|
|
MAIN.app->onInputEvent = la_AndroidInputCallback;
|
|
|
|
|
|
- la_InitAssetManager(MAIN.app->activity->assetManager, MAIN.app->activity->internalDataPath);
|
|
|
+ la_InitAssetManager(MAIN.app->activity->assetManager, MAIN.app->activity->internalDataPath, MAIN.app->activity->externalDataPath);
|
|
|
|
|
|
int pollResult = 0;
|
|
|
int pollEvents = 0;
|
|
@@ -8380,5 +8650,99 @@ void android_main(struct android_app *app){
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+void la_DisplayKeyboard(bool pShow) {
|
|
|
+
|
|
|
+ jint lResult;
|
|
|
+ jint lFlags = 0;
|
|
|
+
|
|
|
+ JavaVM* lJavaVM = MAIN.app->activity->vm;
|
|
|
+ JNIEnv* lJNIEnv = MAIN.app->activity->env;
|
|
|
+
|
|
|
+ JavaVMAttachArgs lJavaVMAttachArgs;
|
|
|
+ lJavaVMAttachArgs.version = JNI_VERSION_1_6;
|
|
|
+ lJavaVMAttachArgs.name = "NativeThread";
|
|
|
+ lJavaVMAttachArgs.group = NULL;
|
|
|
+
|
|
|
+ lResult=(*lJavaVM)->AttachCurrentThread(lJavaVM, &lJNIEnv,0);
|
|
|
+ if (lResult == JNI_ERR) {
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
+ jobject lNativeActivity = MAIN.app->activity->clazz;
|
|
|
+ jclass ClassNativeActivity = (*lJNIEnv)->GetObjectClass(lJNIEnv,lNativeActivity);
|
|
|
+ logPrintNew("jvm3");
|
|
|
+
|
|
|
+
|
|
|
+ jclass ClassContext = (*lJNIEnv)->FindClass(lJNIEnv,"android/content/Context");
|
|
|
+ jfieldID FieldINPUT_METHOD_SERVICE =
|
|
|
+ (*lJNIEnv)->GetStaticFieldID(lJNIEnv,ClassContext,
|
|
|
+ "INPUT_METHOD_SERVICE", "Ljava/lang/String;");
|
|
|
+ jobject INPUT_METHOD_SERVICE =
|
|
|
+ (*lJNIEnv)->GetStaticObjectField(lJNIEnv,ClassContext,
|
|
|
+ FieldINPUT_METHOD_SERVICE);
|
|
|
+
|
|
|
+ logPrintNew("jvm4");
|
|
|
+
|
|
|
+
|
|
|
+ jclass ClassInputMethodManager = (*lJNIEnv)->FindClass(lJNIEnv,
|
|
|
+ "android/view/inputmethod/InputMethodManager");
|
|
|
+ jmethodID MethodGetSystemService = (*lJNIEnv)->GetMethodID(lJNIEnv,
|
|
|
+ ClassNativeActivity, "getSystemService",
|
|
|
+ "(Ljava/lang/String;)Ljava/lang/Object;");
|
|
|
+ jobject lInputMethodManager = (*lJNIEnv)->CallObjectMethod(lJNIEnv,
|
|
|
+ lNativeActivity, MethodGetSystemService,
|
|
|
+ INPUT_METHOD_SERVICE);
|
|
|
+
|
|
|
+
|
|
|
+ jmethodID MethodGetWindow = (*lJNIEnv)->GetMethodID(lJNIEnv,
|
|
|
+ ClassNativeActivity, "getWindow",
|
|
|
+ "()Landroid/view/Window;");
|
|
|
+ jobject lWindow = (*lJNIEnv)->CallObjectMethod(lJNIEnv,lNativeActivity,
|
|
|
+ MethodGetWindow);
|
|
|
+ jclass ClassWindow = (*lJNIEnv)->FindClass(lJNIEnv,
|
|
|
+ "android/view/Window");
|
|
|
+ jmethodID MethodGetDecorView = (*lJNIEnv)->GetMethodID(lJNIEnv,
|
|
|
+ ClassWindow, "getDecorView", "()Landroid/view/View;");
|
|
|
+ jobject lDecorView = (*lJNIEnv)->CallObjectMethod(lJNIEnv,lWindow,
|
|
|
+ MethodGetDecorView);
|
|
|
+
|
|
|
+ if (pShow) {
|
|
|
+
|
|
|
+ jmethodID MethodShowSoftInput = (*lJNIEnv)->GetMethodID(lJNIEnv,
|
|
|
+ ClassInputMethodManager, "showSoftInput",
|
|
|
+ "(Landroid/view/View;I)Z");
|
|
|
+ jboolean lResult = (*lJNIEnv)->CallBooleanMethod(lJNIEnv,
|
|
|
+ lInputMethodManager, MethodShowSoftInput,
|
|
|
+ lDecorView, lFlags);
|
|
|
+ } else {
|
|
|
+
|
|
|
+ jclass ClassView = (*lJNIEnv)->FindClass(lJNIEnv,
|
|
|
+ "android/view/View");
|
|
|
+ jmethodID MethodGetWindowToken = (*lJNIEnv)->GetMethodID(lJNIEnv,
|
|
|
+ ClassView, "getWindowToken", "()Landroid/os/IBinder;");
|
|
|
+ jobject lBinder = (*lJNIEnv)->CallObjectMethod(lJNIEnv,lDecorView,
|
|
|
+ MethodGetWindowToken);
|
|
|
+
|
|
|
+
|
|
|
+ jmethodID MethodHideSoftInput = (*lJNIEnv)->GetMethodID(lJNIEnv,
|
|
|
+ ClassInputMethodManager, "hideSoftInputFromWindow",
|
|
|
+ "(Landroid/os/IBinder;I)Z");
|
|
|
+ jboolean lRes = (*lJNIEnv)->CallBooleanMethod(lJNIEnv,
|
|
|
+ lInputMethodManager, MethodHideSoftInput,
|
|
|
+ lBinder, lFlags);
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ (*lJavaVM)->DetachCurrentThread(lJavaVM);
|
|
|
+}
|
|
|
+
|
|
|
#endif
|
|
|
|
|
|
+#ifndef LAGUI_ANDROID
|
|
|
+void la_DisplayKeyboard(bool pShow) {
|
|
|
+ return;
|
|
|
+}
|
|
|
+void la_HideNavBar(){
|
|
|
+ return;
|
|
|
+}
|
|
|
+#endif
|