mirror of
https://git.sr.ht/~eliasnaur/gio
synced 2026-07-04 17:05:38 +00:00
app: [Android] detach previous View when another is created
The Android system can in some cases replace the GioView of our Android Activity before destroying the previous one. This change makes sure the previous view is ignored, in particular its destroy event. Signed-off-by: Elias Naur <mail@eliasnaur.com>
This commit is contained in:
+30
-7
@@ -113,7 +113,9 @@ public final class GioView extends SurfaceView {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override public boolean onKeyDown(int keyCode, KeyEvent event) {
|
@Override public boolean onKeyDown(int keyCode, KeyEvent event) {
|
||||||
onKeyEvent(nhandle, keyCode, event.getUnicodeChar(), event.getEventTime());
|
if (nhandle != 0) {
|
||||||
|
onKeyEvent(nhandle, keyCode, event.getUnicodeChar(), event.getEventTime());
|
||||||
|
}
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -229,6 +231,9 @@ public final class GioView extends SurfaceView {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private void dispatchMotionEvent(MotionEvent event) {
|
private void dispatchMotionEvent(MotionEvent event) {
|
||||||
|
if (nhandle == 0) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
for (int j = 0; j < event.getHistorySize(); j++) {
|
for (int j = 0; j < event.getHistorySize(); j++) {
|
||||||
long time = event.getHistoricalEventTime(j);
|
long time = event.getHistoricalEventTime(j);
|
||||||
for (int i = 0; i < event.getPointerCount(); i++) {
|
for (int i = 0; i < event.getPointerCount(); i++) {
|
||||||
@@ -289,12 +294,16 @@ public final class GioView extends SurfaceView {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override protected boolean fitSystemWindows(Rect insets) {
|
@Override protected boolean fitSystemWindows(Rect insets) {
|
||||||
onWindowInsets(nhandle, insets.top, insets.right, insets.bottom, insets.left);
|
if (nhandle != 0) {
|
||||||
|
onWindowInsets(nhandle, insets.top, insets.right, insets.bottom, insets.left);
|
||||||
|
}
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override protected void onDraw(Canvas canvas) {
|
@Override protected void onDraw(Canvas canvas) {
|
||||||
onFrameCallback(nhandle);
|
if (nhandle != 0) {
|
||||||
|
onFrameCallback(nhandle);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
int getDensity() {
|
int getDensity() {
|
||||||
@@ -306,25 +315,39 @@ public final class GioView extends SurfaceView {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public void start() {
|
public void start() {
|
||||||
onStartView(nhandle);
|
if (nhandle != 0) {
|
||||||
|
onStartView(nhandle);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public void stop() {
|
public void stop() {
|
||||||
onStopView(nhandle);
|
if (nhandle != 0) {
|
||||||
|
onStopView(nhandle);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public void destroy() {
|
public void destroy() {
|
||||||
|
if (nhandle != 0) {
|
||||||
|
onDestroyView(nhandle);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
protected void unregister() {
|
||||||
setOnFocusChangeListener(null);
|
setOnFocusChangeListener(null);
|
||||||
getHolder().removeCallback(surfCallbacks);
|
getHolder().removeCallback(surfCallbacks);
|
||||||
onDestroyView(nhandle);
|
|
||||||
nhandle = 0;
|
nhandle = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void configurationChanged() {
|
public void configurationChanged() {
|
||||||
onConfigurationChanged(nhandle);
|
if (nhandle != 0) {
|
||||||
|
onConfigurationChanged(nhandle);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public boolean backPressed() {
|
public boolean backPressed() {
|
||||||
|
if (nhandle == 0) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
return onBack(nhandle);
|
return onBack(nhandle);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+15
-5
@@ -161,6 +161,7 @@ var gioView struct {
|
|||||||
setNavigationColor C.jmethodID
|
setNavigationColor C.jmethodID
|
||||||
setStatusColor C.jmethodID
|
setStatusColor C.jmethodID
|
||||||
setFullscreen C.jmethodID
|
setFullscreen C.jmethodID
|
||||||
|
unregister C.jmethodID
|
||||||
}
|
}
|
||||||
|
|
||||||
// ViewEvent is sent whenever the Window's underlying Android view
|
// ViewEvent is sent whenever the Window's underlying Android view
|
||||||
@@ -315,6 +316,7 @@ func Java_org_gioui_GioView_onCreateView(env *C.JNIEnv, class C.jclass, view C.j
|
|||||||
m.setNavigationColor = getMethodID(env, class, "setNavigationColor", "(II)V")
|
m.setNavigationColor = getMethodID(env, class, "setNavigationColor", "(II)V")
|
||||||
m.setStatusColor = getMethodID(env, class, "setStatusColor", "(II)V")
|
m.setStatusColor = getMethodID(env, class, "setStatusColor", "(II)V")
|
||||||
m.setFullscreen = getMethodID(env, class, "setFullscreen", "(Z)V")
|
m.setFullscreen = getMethodID(env, class, "setFullscreen", "(Z)V")
|
||||||
|
m.unregister = getMethodID(env, class, "unregister", "()V")
|
||||||
})
|
})
|
||||||
view = C.jni_NewGlobalRef(env, view)
|
view = C.jni_NewGlobalRef(env, view)
|
||||||
wopts := <-mainWindow.out
|
wopts := <-mainWindow.out
|
||||||
@@ -325,6 +327,9 @@ func Java_org_gioui_GioView_onCreateView(env *C.JNIEnv, class C.jclass, view C.j
|
|||||||
}
|
}
|
||||||
windows[wopts.window] = w
|
windows[wopts.window] = w
|
||||||
}
|
}
|
||||||
|
if w.view != 0 {
|
||||||
|
w.detach(env)
|
||||||
|
}
|
||||||
w.view = view
|
w.view = view
|
||||||
w.callbacks.SetDriver(w)
|
w.callbacks.SetDriver(w)
|
||||||
handle := C.jlong(view)
|
handle := C.jlong(view)
|
||||||
@@ -339,11 +344,7 @@ func Java_org_gioui_GioView_onCreateView(env *C.JNIEnv, class C.jclass, view C.j
|
|||||||
//export Java_org_gioui_GioView_onDestroyView
|
//export Java_org_gioui_GioView_onDestroyView
|
||||||
func Java_org_gioui_GioView_onDestroyView(env *C.JNIEnv, class C.jclass, handle C.jlong) {
|
func Java_org_gioui_GioView_onDestroyView(env *C.JNIEnv, class C.jclass, handle C.jlong) {
|
||||||
w := views[handle]
|
w := views[handle]
|
||||||
w.callbacks.Event(ViewEvent{View: 0})
|
w.detach(env)
|
||||||
w.callbacks.SetDriver(nil)
|
|
||||||
delete(views, handle)
|
|
||||||
C.jni_DeleteGlobalRef(env, w.view)
|
|
||||||
w.view = 0
|
|
||||||
}
|
}
|
||||||
|
|
||||||
//export Java_org_gioui_GioView_onStopView
|
//export Java_org_gioui_GioView_onStopView
|
||||||
@@ -442,6 +443,15 @@ func Java_org_gioui_GioView_onWindowInsets(env *C.JNIEnv, class C.jclass, view C
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (w *window) detach(env *C.JNIEnv) {
|
||||||
|
callVoidMethod(env, w.view, gioView.unregister)
|
||||||
|
w.callbacks.Event(ViewEvent{})
|
||||||
|
w.callbacks.SetDriver(nil)
|
||||||
|
delete(views, C.jlong(w.view))
|
||||||
|
C.jni_DeleteGlobalRef(env, w.view)
|
||||||
|
w.view = 0
|
||||||
|
}
|
||||||
|
|
||||||
func (w *window) setVisible() {
|
func (w *window) setVisible() {
|
||||||
width, height := C.ANativeWindow_getWidth(w.win), C.ANativeWindow_getHeight(w.win)
|
width, height := C.ANativeWindow_getWidth(w.win), C.ANativeWindow_getHeight(w.win)
|
||||||
if width == 0 || height == 0 {
|
if width == 0 || height == 0 {
|
||||||
|
|||||||
Reference in New Issue
Block a user