Merge commit 'bf5efba238f81330f4b473e92b6931b85baa1cbc' into gingerbread-plus-aosp * commit 'bf5efba238f81330f4b473e92b6931b85baa1cbc': Fix issue #3117918: No way to finish a native activity
This commit is contained in:
@ -35,8 +35,8 @@
|
|||||||
#include "android_view_InputChannel.h"
|
#include "android_view_InputChannel.h"
|
||||||
#include "android_view_KeyEvent.h"
|
#include "android_view_KeyEvent.h"
|
||||||
|
|
||||||
//#define LOG_TRACE(...)
|
#define LOG_TRACE(...)
|
||||||
#define LOG_TRACE(...) LOG(LOG_DEBUG, LOG_TAG, __VA_ARGS__)
|
//#define LOG_TRACE(...) LOG(LOG_DEBUG, LOG_TAG, __VA_ARGS__)
|
||||||
|
|
||||||
namespace android
|
namespace android
|
||||||
{
|
{
|
||||||
@ -46,6 +46,7 @@ static struct {
|
|||||||
|
|
||||||
jmethodID dispatchUnhandledKeyEvent;
|
jmethodID dispatchUnhandledKeyEvent;
|
||||||
jmethodID preDispatchKeyEvent;
|
jmethodID preDispatchKeyEvent;
|
||||||
|
jmethodID finish;
|
||||||
jmethodID setWindowFlags;
|
jmethodID setWindowFlags;
|
||||||
jmethodID setWindowFormat;
|
jmethodID setWindowFormat;
|
||||||
jmethodID showIme;
|
jmethodID showIme;
|
||||||
@ -62,6 +63,7 @@ struct ActivityWork {
|
|||||||
|
|
||||||
enum {
|
enum {
|
||||||
CMD_DEF_KEY = 1,
|
CMD_DEF_KEY = 1,
|
||||||
|
CMD_FINISH,
|
||||||
CMD_SET_WINDOW_FORMAT,
|
CMD_SET_WINDOW_FORMAT,
|
||||||
CMD_SET_WINDOW_FLAGS,
|
CMD_SET_WINDOW_FLAGS,
|
||||||
CMD_SHOW_SOFT_INPUT,
|
CMD_SHOW_SOFT_INPUT,
|
||||||
@ -512,6 +514,11 @@ struct NativeCode : public ANativeActivity {
|
|||||||
sp<Looper> looper;
|
sp<Looper> looper;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
void android_NativeActivity_finish(ANativeActivity* activity) {
|
||||||
|
NativeCode* code = static_cast<NativeCode*>(activity);
|
||||||
|
write_work(code->mainWorkWrite, CMD_FINISH, 0);
|
||||||
|
}
|
||||||
|
|
||||||
void android_NativeActivity_setWindowFormat(
|
void android_NativeActivity_setWindowFormat(
|
||||||
ANativeActivity* activity, int32_t format) {
|
ANativeActivity* activity, int32_t format) {
|
||||||
NativeCode* code = static_cast<NativeCode*>(activity);
|
NativeCode* code = static_cast<NativeCode*>(activity);
|
||||||
@ -538,6 +545,16 @@ void android_NativeActivity_hideSoftInput(
|
|||||||
|
|
||||||
// ------------------------------------------------------------------------
|
// ------------------------------------------------------------------------
|
||||||
|
|
||||||
|
static bool checkAndClearExceptionFromCallback(JNIEnv* env, const char* methodName) {
|
||||||
|
if (env->ExceptionCheck()) {
|
||||||
|
LOGE("An exception was thrown by callback '%s'.", methodName);
|
||||||
|
LOGE_EX(env);
|
||||||
|
env->ExceptionClear();
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Callback for handling native events on the application's main thread.
|
* Callback for handling native events on the application's main thread.
|
||||||
*/
|
*/
|
||||||
@ -562,6 +579,7 @@ static int mainWorkCallback(int fd, int events, void* data) {
|
|||||||
code->env, keyEvent);
|
code->env, keyEvent);
|
||||||
code->env->CallVoidMethod(code->clazz,
|
code->env->CallVoidMethod(code->clazz,
|
||||||
gNativeActivityClassInfo.dispatchUnhandledKeyEvent, inputEventObj);
|
gNativeActivityClassInfo.dispatchUnhandledKeyEvent, inputEventObj);
|
||||||
|
checkAndClearExceptionFromCallback(code->env, "dispatchUnhandledKeyEvent");
|
||||||
code->nativeInputQueue->finishEvent(keyEvent, true);
|
code->nativeInputQueue->finishEvent(keyEvent, true);
|
||||||
}
|
}
|
||||||
int seq;
|
int seq;
|
||||||
@ -570,23 +588,32 @@ static int mainWorkCallback(int fd, int events, void* data) {
|
|||||||
code->env, keyEvent);
|
code->env, keyEvent);
|
||||||
code->env->CallVoidMethod(code->clazz,
|
code->env->CallVoidMethod(code->clazz,
|
||||||
gNativeActivityClassInfo.preDispatchKeyEvent, inputEventObj, seq);
|
gNativeActivityClassInfo.preDispatchKeyEvent, inputEventObj, seq);
|
||||||
|
checkAndClearExceptionFromCallback(code->env, "preDispatchKeyEvent");
|
||||||
}
|
}
|
||||||
} break;
|
} break;
|
||||||
|
case CMD_FINISH: {
|
||||||
|
code->env->CallVoidMethod(code->clazz, gNativeActivityClassInfo.finish);
|
||||||
|
checkAndClearExceptionFromCallback(code->env, "finish");
|
||||||
|
} break;
|
||||||
case CMD_SET_WINDOW_FORMAT: {
|
case CMD_SET_WINDOW_FORMAT: {
|
||||||
code->env->CallVoidMethod(code->clazz,
|
code->env->CallVoidMethod(code->clazz,
|
||||||
gNativeActivityClassInfo.setWindowFormat, work.arg1);
|
gNativeActivityClassInfo.setWindowFormat, work.arg1);
|
||||||
|
checkAndClearExceptionFromCallback(code->env, "setWindowFormat");
|
||||||
} break;
|
} break;
|
||||||
case CMD_SET_WINDOW_FLAGS: {
|
case CMD_SET_WINDOW_FLAGS: {
|
||||||
code->env->CallVoidMethod(code->clazz,
|
code->env->CallVoidMethod(code->clazz,
|
||||||
gNativeActivityClassInfo.setWindowFlags, work.arg1, work.arg2);
|
gNativeActivityClassInfo.setWindowFlags, work.arg1, work.arg2);
|
||||||
|
checkAndClearExceptionFromCallback(code->env, "setWindowFlags");
|
||||||
} break;
|
} break;
|
||||||
case CMD_SHOW_SOFT_INPUT: {
|
case CMD_SHOW_SOFT_INPUT: {
|
||||||
code->env->CallVoidMethod(code->clazz,
|
code->env->CallVoidMethod(code->clazz,
|
||||||
gNativeActivityClassInfo.showIme, work.arg1);
|
gNativeActivityClassInfo.showIme, work.arg1);
|
||||||
|
checkAndClearExceptionFromCallback(code->env, "showIme");
|
||||||
} break;
|
} break;
|
||||||
case CMD_HIDE_SOFT_INPUT: {
|
case CMD_HIDE_SOFT_INPUT: {
|
||||||
code->env->CallVoidMethod(code->clazz,
|
code->env->CallVoidMethod(code->clazz,
|
||||||
gNativeActivityClassInfo.hideIme, work.arg1);
|
gNativeActivityClassInfo.hideIme, work.arg1);
|
||||||
|
checkAndClearExceptionFromCallback(code->env, "hideIme");
|
||||||
} break;
|
} break;
|
||||||
default:
|
default:
|
||||||
LOGW("Unknown work command: %d", work.cmd);
|
LOGW("Unknown work command: %d", work.cmd);
|
||||||
@ -1018,6 +1045,9 @@ int register_android_app_NativeActivity(JNIEnv* env)
|
|||||||
gNativeActivityClassInfo.clazz,
|
gNativeActivityClassInfo.clazz,
|
||||||
"preDispatchKeyEvent", "(Landroid/view/KeyEvent;I)V");
|
"preDispatchKeyEvent", "(Landroid/view/KeyEvent;I)V");
|
||||||
|
|
||||||
|
GET_METHOD_ID(gNativeActivityClassInfo.finish,
|
||||||
|
gNativeActivityClassInfo.clazz,
|
||||||
|
"finish", "()V");
|
||||||
GET_METHOD_ID(gNativeActivityClassInfo.setWindowFlags,
|
GET_METHOD_ID(gNativeActivityClassInfo.setWindowFlags,
|
||||||
gNativeActivityClassInfo.clazz,
|
gNativeActivityClassInfo.clazz,
|
||||||
"setWindowFlags", "(II)V");
|
"setWindowFlags", "(II)V");
|
||||||
|
@ -26,6 +26,9 @@
|
|||||||
|
|
||||||
namespace android {
|
namespace android {
|
||||||
|
|
||||||
|
extern void android_NativeActivity_finish(
|
||||||
|
ANativeActivity* activity);
|
||||||
|
|
||||||
extern void android_NativeActivity_setWindowFormat(
|
extern void android_NativeActivity_setWindowFormat(
|
||||||
ANativeActivity* activity, int32_t format);
|
ANativeActivity* activity, int32_t format);
|
||||||
|
|
||||||
|
@ -21,6 +21,10 @@
|
|||||||
|
|
||||||
using namespace android;
|
using namespace android;
|
||||||
|
|
||||||
|
void ANativeActivity_finish(ANativeActivity* activity) {
|
||||||
|
android_NativeActivity_finish(activity);
|
||||||
|
}
|
||||||
|
|
||||||
void ANativeActivity_setWindowFormat(ANativeActivity* activity, int32_t format) {
|
void ANativeActivity_setWindowFormat(ANativeActivity* activity, int32_t format) {
|
||||||
android_NativeActivity_setWindowFormat(activity, format);
|
android_NativeActivity_setWindowFormat(activity, format);
|
||||||
}
|
}
|
||||||
|
@ -227,6 +227,12 @@ typedef void ANativeActivity_createFunc(ANativeActivity* activity,
|
|||||||
*/
|
*/
|
||||||
extern ANativeActivity_createFunc ANativeActivity_onCreate;
|
extern ANativeActivity_createFunc ANativeActivity_onCreate;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Finish the given activity. Its finish() method will be called, causing it
|
||||||
|
* to be stopped and destroyed.
|
||||||
|
*/
|
||||||
|
void ANativeActivity_finish(ANativeActivity* activity);
|
||||||
|
|
||||||
void ANativeActivity_setWindowFormat(ANativeActivity* activity, int32_t format);
|
void ANativeActivity_setWindowFormat(ANativeActivity* activity, int32_t format);
|
||||||
|
|
||||||
void ANativeActivity_setWindowFlags(ANativeActivity* activity,
|
void ANativeActivity_setWindowFlags(ANativeActivity* activity,
|
||||||
|
Reference in New Issue
Block a user