app/internal/window: [Android] unregister focus listener on destroy

Updates github.com/tailscale/tailscale/issues/431

Signed-off-by: Elias Naur <mail@eliasnaur.com>
This commit is contained in:
Elias Naur
2020-06-11 15:39:33 +02:00
parent 5fe3785bbd
commit 6d5fbcba3f
+9 -6
View File
@@ -39,7 +39,8 @@ public final class GioView extends SurfaceView implements Choreographer.FrameCal
private final static Object initLock = new Object(); private final static Object initLock = new Object();
private static boolean jniLoaded; private static boolean jniLoaded;
private final SurfaceHolder.Callback callbacks; private final SurfaceHolder.Callback surfCallbacks;
private final View.OnFocusChangeListener focusCallback;
private final InputMethodManager imm; private final InputMethodManager imm;
private final Handler handler; private final Handler handler;
private long nhandle; private long nhandle;
@@ -59,12 +60,13 @@ public final class GioView extends SurfaceView implements Choreographer.FrameCal
imm = (InputMethodManager)context.getSystemService(Context.INPUT_METHOD_SERVICE); imm = (InputMethodManager)context.getSystemService(Context.INPUT_METHOD_SERVICE);
setFocusable(true); setFocusable(true);
setFocusableInTouchMode(true); setFocusableInTouchMode(true);
setOnFocusChangeListener(new View.OnFocusChangeListener() { focusCallback = new View.OnFocusChangeListener() {
@Override public void onFocusChange(View v, boolean focus) { @Override public void onFocusChange(View v, boolean focus) {
GioView.this.onFocusChange(nhandle, focus); GioView.this.onFocusChange(nhandle, focus);
} }
}); };
callbacks = new SurfaceHolder.Callback() { setOnFocusChangeListener(focusCallback);
surfCallbacks = new SurfaceHolder.Callback() {
@Override public void surfaceCreated(SurfaceHolder holder) { @Override public void surfaceCreated(SurfaceHolder holder) {
// Ignore; surfaceChanged is guaranteed to be called immediately after this. // Ignore; surfaceChanged is guaranteed to be called immediately after this.
} }
@@ -75,7 +77,7 @@ public final class GioView extends SurfaceView implements Choreographer.FrameCal
onSurfaceDestroyed(nhandle); onSurfaceDestroyed(nhandle);
} }
}; };
getHolder().addCallback(callbacks); getHolder().addCallback(surfCallbacks);
} }
@Override public boolean onKeyDown(int keyCode, KeyEvent event) { @Override public boolean onKeyDown(int keyCode, KeyEvent event) {
@@ -176,7 +178,8 @@ public final class GioView extends SurfaceView implements Choreographer.FrameCal
} }
void destroy() { void destroy() {
getHolder().removeCallback(callbacks); setOnFocusChangeListener(null);
getHolder().removeCallback(surfCallbacks);
onDestroyView(nhandle); onDestroyView(nhandle);
nhandle = 0; nhandle = 0;
} }