passgo/cmd/passgo-gui/impl_android.go
Greg Pomerantz a022236d87 Guard against Gio's null-view detach event (recents-wipe SIGABRT)
Gio's GioView.onDestroyView sends ViewEvent{View: 0} as its detach
signal when the view is destroyed — i.e. the activity going away on a
recents-wipe. handleEvent passed that zero straight through to
InitPgp/registerFragment, whose GetObjectClass(null) aborts the process
(JNI DETECTED ERROR: java_object == null in call to GetObjectClass).

Guard on both sides: handleEvent ignores the View == 0 detach signal
(a re-attach arrives as a fresh event with a live view), InitPgp
returns early on a zero view so unfiltered callers are covered, and
registerFragment null-checks as defense in depth. Same fix as pad
(fdbffc9); verified there on a Pixel 9 Pro / Android 17 where the
recents swipe used to crash the app.
2026-08-20 22:16:13 -04:00

63 lines
1.3 KiB
Go

//+build android
package main
import (
"os"
"git.wow.st/gmp/passgo"
"gioui.org/app"
"gioui.org/io/event"
)
var (
noidLabelText = "Enter a GPG key ID above"
)
func init() {
log(Info, "Android start")
// Use a larger font on Android
fontSize = 24
}
func handleEvent(e event.Event) {
switch e := e.(type) {
case app.ViewEvent:
// View == 0 is Gio's detach signal: GioView.onDestroyView sends
// ViewEvent{View: 0} when the view is destroyed (e.g. the activity
// going away on a recents-wipe). There is nothing to register for a
// detached view; passing the null ref on would abort in JNI
// (GetObjectClass on null). A re-attach arrives as a fresh event
// with a live view.
if e.View == 0 {
return
}
initPgp(e.View)
}
}
func initPgp(view uintptr) {
passgo.InitPgp(view)
}
func getConfDir() (string, error) {
ret, err := app.DataDir()
if err != nil {
log(Error, "Cannot get data directory:", err)
return "", err
}
if _, err := os.Stat(ret); os.IsNotExist(err) {
err = os.MkdirAll(ret, 0700)
if err != nil {
log(Error, "Cannot create configuration directory ", ret)
return "", err
} else {
log(Info, "Configuration directory created")
return ret, nil
}
} else {
log(Info, "Configuration directory found")
return ret, nil
}
}