From: Alexis Laferrière Date: Fri, 18 Mar 2016 20:17:59 +0000 (-0400) Subject: lib/android: implement back_button support using the "hardware" back key X-Git-Url: http://nitlanguage.org lib/android: implement back_button support using the "hardware" back key Signed-off-by: Alexis Laferrière --- diff --git a/lib/android/NitActivity.java b/lib/android/NitActivity.java index 8837617..cbe6ad4 100644 --- a/lib/android/NitActivity.java +++ b/lib/android/NitActivity.java @@ -48,6 +48,7 @@ public class NitActivity extends Activity { protected native void nitOnDestroy(int activity); protected native void nitOnSaveInstanceState(int activity, Bundle savedInstanceState); protected native void nitOnRestoreInstanceState(int activity, Bundle savedInstanceState); + protected native boolean nitOnBackPressed(int activity); protected native boolean nitOnKeyDown(int activity, int keyCode, KeyEvent event); protected native boolean nitOnKeyLongPress(int activity, int keyCode, KeyEvent event); protected native boolean nitOnKeyMultiple(int activity, int keyCode, int count, KeyEvent event); @@ -115,6 +116,12 @@ public class NitActivity extends Activity { } @Override + public void onBackPressed() { + if (!nitOnBackPressed(nitActivity)) + super.onBackPressed(); + } + + @Override public boolean onKeyDown(int keyCode, KeyEvent event) { return nitOnKeyDown(nitActivity, keyCode, event) || super.onKeyDown(keyCode, event); diff --git a/lib/android/nit_activity.nit b/lib/android/nit_activity.nit index de849ea..1668147 100644 --- a/lib/android/nit_activity.nit +++ b/lib/android/nit_activity.nit @@ -135,6 +135,12 @@ in "C body" `{ Activity_on_restore_instance_state((Activity)nit_activity, saved_state); } + JNIEXPORT jboolean JNICALL Java_nit_app_NitActivity_nitOnBackPressed + (JNIEnv *env, jobject java_activity, jint nit_activity) + { + return (jboolean)Activity_on_back_pressed((Activity)nit_activity); + } + JNIEXPORT jboolean JNICALL Java_nit_app_NitActivity_nitOnKeyDown (JNIEnv *env, jobject java_activity, jint nit_activity, jint keyCode, jobject event) { @@ -184,6 +190,7 @@ redef class App Activity.on_start, Activity.on_restart, Activity.on_stop, Activity.on_pause, Activity.on_resume, Activity.on_save_instance_state, Activity.on_restore_instance_state, + Activity.on_back_pressed, Activity.on_key_down, Activity.on_key_long_press, Activity.on_key_multiple, Activity.on_key_up `{ App_incr_ref(self); @@ -279,6 +286,11 @@ class Activity # Notification from Android, the current device configuration has changed fun on_configuration_changed do end + # The back key has been pressed + # + # Return `true` if the event has been handled. + fun on_back_pressed: Bool do return false + # A key has been pressed # # Return `true` if the event has been handled. diff --git a/lib/android/ui/ui.nit b/lib/android/ui/ui.nit index 65535e8..dedad21 100644 --- a/lib/android/ui/ui.nit +++ b/lib/android/ui/ui.nit @@ -78,6 +78,19 @@ redef class App end end +redef class Activity + redef fun on_back_pressed + do + var window = app.window + if window.enable_back_button then + window.on_back_button + return true + end + + return false + end +end + # On Android, a window is implemented with the fragment `native` redef class Window redef var native = (new Android_app_Fragment(self)).new_global_ref