diff options
author | Dianne Hackborn <hackbod@google.com> | 2010-10-21 20:27:15 -0700 |
---|---|---|
committer | Android Git Automerger <android-git-automerger@android.com> | 2010-10-21 20:27:15 -0700 |
commit | bff26d156d23e55e2428e19b3fb7f52acf03f79f (patch) | |
tree | b0993306b63215d4db6559a86f02bcdb5ff22c55 | |
parent | 4924aee9cb1c5988359f3162b6e89689c5b101e1 (diff) | |
parent | 86f1b643d10e0b5b17ae01db3b81020db87b3295 (diff) | |
download | frameworks_base-bff26d156d23e55e2428e19b3fb7f52acf03f79f.zip frameworks_base-bff26d156d23e55e2428e19b3fb7f52acf03f79f.tar.gz frameworks_base-bff26d156d23e55e2428e19b3fb7f52acf03f79f.tar.bz2 |
am 86f1b643: am bf5efba2: Merge "Fix issue #3117918: No way to finish a native activity" into gingerbread
Merge commit '86f1b643d10e0b5b17ae01db3b81020db87b3295'
* commit '86f1b643d10e0b5b17ae01db3b81020db87b3295':
Fix issue #3117918: No way to finish a native activity
-rw-r--r-- | core/jni/android_app_NativeActivity.cpp | 34 | ||||
-rw-r--r-- | include/android_runtime/android_app_NativeActivity.h | 3 | ||||
-rw-r--r-- | native/android/native_activity.cpp | 4 | ||||
-rw-r--r-- | native/include/android/native_activity.h | 6 |
4 files changed, 45 insertions, 2 deletions
diff --git a/core/jni/android_app_NativeActivity.cpp b/core/jni/android_app_NativeActivity.cpp index 6aa77f6..63d3578 100644 --- a/core/jni/android_app_NativeActivity.cpp +++ b/core/jni/android_app_NativeActivity.cpp @@ -35,8 +35,8 @@ #include "android_view_InputChannel.h" #include "android_view_KeyEvent.h" -//#define LOG_TRACE(...) -#define LOG_TRACE(...) LOG(LOG_DEBUG, LOG_TAG, __VA_ARGS__) +#define LOG_TRACE(...) +//#define LOG_TRACE(...) LOG(LOG_DEBUG, LOG_TAG, __VA_ARGS__) namespace android { @@ -46,6 +46,7 @@ static struct { jmethodID dispatchUnhandledKeyEvent; jmethodID preDispatchKeyEvent; + jmethodID finish; jmethodID setWindowFlags; jmethodID setWindowFormat; jmethodID showIme; @@ -62,6 +63,7 @@ struct ActivityWork { enum { CMD_DEF_KEY = 1, + CMD_FINISH, CMD_SET_WINDOW_FORMAT, CMD_SET_WINDOW_FLAGS, CMD_SHOW_SOFT_INPUT, @@ -512,6 +514,11 @@ struct NativeCode : public ANativeActivity { 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( ANativeActivity* activity, int32_t format) { 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. */ @@ -562,6 +579,7 @@ static int mainWorkCallback(int fd, int events, void* data) { code->env, keyEvent); code->env->CallVoidMethod(code->clazz, gNativeActivityClassInfo.dispatchUnhandledKeyEvent, inputEventObj); + checkAndClearExceptionFromCallback(code->env, "dispatchUnhandledKeyEvent"); code->nativeInputQueue->finishEvent(keyEvent, true); } int seq; @@ -570,23 +588,32 @@ static int mainWorkCallback(int fd, int events, void* data) { code->env, keyEvent); code->env->CallVoidMethod(code->clazz, gNativeActivityClassInfo.preDispatchKeyEvent, inputEventObj, seq); + checkAndClearExceptionFromCallback(code->env, "preDispatchKeyEvent"); } } break; + case CMD_FINISH: { + code->env->CallVoidMethod(code->clazz, gNativeActivityClassInfo.finish); + checkAndClearExceptionFromCallback(code->env, "finish"); + } break; case CMD_SET_WINDOW_FORMAT: { code->env->CallVoidMethod(code->clazz, gNativeActivityClassInfo.setWindowFormat, work.arg1); + checkAndClearExceptionFromCallback(code->env, "setWindowFormat"); } break; case CMD_SET_WINDOW_FLAGS: { code->env->CallVoidMethod(code->clazz, gNativeActivityClassInfo.setWindowFlags, work.arg1, work.arg2); + checkAndClearExceptionFromCallback(code->env, "setWindowFlags"); } break; case CMD_SHOW_SOFT_INPUT: { code->env->CallVoidMethod(code->clazz, gNativeActivityClassInfo.showIme, work.arg1); + checkAndClearExceptionFromCallback(code->env, "showIme"); } break; case CMD_HIDE_SOFT_INPUT: { code->env->CallVoidMethod(code->clazz, gNativeActivityClassInfo.hideIme, work.arg1); + checkAndClearExceptionFromCallback(code->env, "hideIme"); } break; default: LOGW("Unknown work command: %d", work.cmd); @@ -1018,6 +1045,9 @@ int register_android_app_NativeActivity(JNIEnv* env) gNativeActivityClassInfo.clazz, "preDispatchKeyEvent", "(Landroid/view/KeyEvent;I)V"); + GET_METHOD_ID(gNativeActivityClassInfo.finish, + gNativeActivityClassInfo.clazz, + "finish", "()V"); GET_METHOD_ID(gNativeActivityClassInfo.setWindowFlags, gNativeActivityClassInfo.clazz, "setWindowFlags", "(II)V"); diff --git a/include/android_runtime/android_app_NativeActivity.h b/include/android_runtime/android_app_NativeActivity.h index b49e02a..5dbec59 100644 --- a/include/android_runtime/android_app_NativeActivity.h +++ b/include/android_runtime/android_app_NativeActivity.h @@ -26,6 +26,9 @@ namespace android { +extern void android_NativeActivity_finish( + ANativeActivity* activity); + extern void android_NativeActivity_setWindowFormat( ANativeActivity* activity, int32_t format); diff --git a/native/android/native_activity.cpp b/native/android/native_activity.cpp index 0c6823a..056255f 100644 --- a/native/android/native_activity.cpp +++ b/native/android/native_activity.cpp @@ -21,6 +21,10 @@ using namespace android; +void ANativeActivity_finish(ANativeActivity* activity) { + android_NativeActivity_finish(activity); +} + void ANativeActivity_setWindowFormat(ANativeActivity* activity, int32_t format) { android_NativeActivity_setWindowFormat(activity, format); } diff --git a/native/include/android/native_activity.h b/native/include/android/native_activity.h index d74e1ce..a8f11c9 100644 --- a/native/include/android/native_activity.h +++ b/native/include/android/native_activity.h @@ -227,6 +227,12 @@ typedef void ANativeActivity_createFunc(ANativeActivity* activity, */ 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_setWindowFlags(ANativeActivity* activity, |