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.
63 lines
1.3 KiB
Go
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
|
|
}
|
|
}
|