This is only the first half of physical key event mapping. The modifiers and hardware key codes will be in a followup CL. I'm splitting this out because it covers two other parts of the problem: first is maintaining a JNIEnv pointer for the main routine, the second is access to the Android unicode key map. The NDK does not have a method to give us the key mapping, so we get to it via GoNativeActivity. Tested with a USB keyboard. I'll attempt an abd-based unit test later, but I suspect it will be difficult to set a device ID. Change-Id: Ie93700d1f2a5d382a9b17cdd668cb4acaa6e4bcc Reviewed-on: https://go-review.googlesource.com/13649 Reviewed-by: Hyang-Ah Hana Kim <hyangah@gmail.com>
68 lines
1.8 KiB
Java
68 lines
1.8 KiB
Java
package org.golang.app;
|
|
|
|
import android.app.Activity;
|
|
import android.app.NativeActivity;
|
|
import android.content.Context;
|
|
import android.content.pm.ActivityInfo;
|
|
import android.content.pm.PackageManager;
|
|
import android.os.Bundle;
|
|
import android.util.Log;
|
|
import android.view.KeyCharacterMap;
|
|
|
|
public class GoNativeActivity extends NativeActivity {
|
|
private static GoNativeActivity goNativeActivity;
|
|
|
|
public GoNativeActivity() {
|
|
super();
|
|
goNativeActivity = this;
|
|
}
|
|
|
|
String getTmpdir() {
|
|
return getCacheDir().getAbsolutePath();
|
|
}
|
|
|
|
int getRune(int deviceId, int keyCode, int metaState) {
|
|
try {
|
|
int rune = KeyCharacterMap.load(deviceId).get(keyCode, metaState);
|
|
if (rune == 0) {
|
|
return -1;
|
|
}
|
|
return rune;
|
|
} catch (KeyCharacterMap.UnavailableException e) {
|
|
return -1;
|
|
} catch (Exception e) {
|
|
Log.e("Go", "exception reading KeyCharacterMap", e);
|
|
return -1;
|
|
}
|
|
}
|
|
|
|
private void load() {
|
|
// Interestingly, NativeActivity uses a different method
|
|
// to find native code to execute, avoiding
|
|
// System.loadLibrary. The result is Java methods
|
|
// implemented in C with JNIEXPORT (and JNI_OnLoad) are not
|
|
// available unless an explicit call to System.loadLibrary
|
|
// is done. So we do it here, borrowing the name of the
|
|
// library from the same AndroidManifest.xml metadata used
|
|
// by NativeActivity.
|
|
try {
|
|
ActivityInfo ai = getPackageManager().getActivityInfo(
|
|
getIntent().getComponent(), PackageManager.GET_META_DATA);
|
|
if (ai.metaData == null) {
|
|
Log.e("Go", "loadLibrary: no manifest metadata found");
|
|
return;
|
|
}
|
|
String libName = ai.metaData.getString("android.app.lib_name");
|
|
System.loadLibrary(libName);
|
|
} catch (Exception e) {
|
|
Log.e("Go", "loadLibrary failed", e);
|
|
}
|
|
}
|
|
|
|
@Override
|
|
public void onCreate(Bundle savedInstanceState) {
|
|
load();
|
|
super.onCreate(savedInstanceState);
|
|
}
|
|
}
|