From c3a9c0fddbc4803f073e27b2a44842efb5b8e871 Mon Sep 17 00:00:00 2001 From: Joe Julian Date: Thu, 9 Apr 2026 06:50:16 -0700 Subject: [PATCH] Extract app UI platform glue --- internal/appui/android_share_stub.go | 7 ------- internal/appui/app.go | 13 +++++-------- .../appui/{ => platform}/android_share_android.go | 4 ++-- internal/appui/platform/android_share_stub.go | 7 +++++++ internal/appui/{ => platform}/clipboard_gio.go | 10 +++++++--- internal/appui/{ => platform}/clipboard_gio_test.go | 10 +++++----- 6 files changed, 26 insertions(+), 25 deletions(-) delete mode 100644 internal/appui/android_share_stub.go rename internal/appui/{ => platform}/android_share_android.go (98%) create mode 100644 internal/appui/platform/android_share_stub.go rename internal/appui/{ => platform}/clipboard_gio.go (83%) rename internal/appui/{ => platform}/clipboard_gio_test.go (73%) diff --git a/internal/appui/android_share_stub.go b/internal/appui/android_share_stub.go deleted file mode 100644 index 9a557c5..0000000 --- a/internal/appui/android_share_stub.go +++ /dev/null @@ -1,7 +0,0 @@ -//go:build !android - -package appui - -func newPlatformVaultSharer(goos string) vaultSharer { - return nil -} diff --git a/internal/appui/app.go b/internal/appui/app.go index 5bdbec3..6be8cf9 100644 --- a/internal/appui/app.go +++ b/internal/appui/app.go @@ -36,6 +36,7 @@ import ( "git.julianfamily.org/keepassgo/internal/apiaudit" "git.julianfamily.org/keepassgo/internal/apitokens" "git.julianfamily.org/keepassgo/internal/appstate" + "git.julianfamily.org/keepassgo/internal/appui/platform" keepassassets "git.julianfamily.org/keepassgo/internal/assets" "git.julianfamily.org/keepassgo/internal/autofillcache" "git.julianfamily.org/keepassgo/internal/clipboard" @@ -466,7 +467,7 @@ type ui struct { settingsIcon *widget.Icon menuIcon *widget.Icon clipboardWriter clipboard.Writer - vaultSharer vaultSharer + vaultSharer platform.VaultSharer loadingMessage string loadingActionLabel string lifecycleMode string @@ -546,10 +547,6 @@ type backgroundActionResult struct { id int } -type vaultSharer interface { - ShareVault(path, title string) error -} - var ( bgColor = color.NRGBA{R: 242, G: 239, B: 233, A: 255} panelColor = color.NRGBA{R: 250, G: 248, B: 244, A: 255} @@ -691,7 +688,7 @@ func newUIWithState(mode string, sess appstate.CurrentSession, paths statePaths) syncDefaultDirection: syncDirectionPull, apiPolicyGroupScope: true, autofillNoticePreference: autofillNoticeAll, - vaultSharer: newPlatformVaultSharer(runtime.GOOS), + vaultSharer: platform.NewVaultSharer(runtime.GOOS), backgroundResults: make(chan backgroundActionResult, 8), phoneGroupBrowserExpanded: true, } @@ -6980,7 +6977,7 @@ func run(w *app.Window, mode string, paths statePaths, grpcAddr string) error { ui := newUIWithSession(mode, manager, paths) ui.fileExplorer = explorer.NewExplorer(w) ui.invalidate = w.Invalidate - ui.clipboardWriter = newPlatformClipboardWriter(runtime.GOOS, w.Invalidate) + ui.clipboardWriter = platform.NewClipboardWriter(runtime.GOOS, w.Invalidate) host, err := api.StartHost(grpcAddr, manager, passwords.DefaultProfiles(), ui.clipboardWriter, func() bool { return ui.state.Dirty }) if err != nil { ui.state.ErrorMessage = fmt.Sprintf("start gRPC API: %v", err) @@ -7001,7 +6998,7 @@ func run(w *app.Window, mode string, paths statePaths, grpcAddr string) error { gtx := app.NewContext(&ops, e) ui.processBackgroundActions() ui.layout(gtx) - processClipboardWrites(gtx, ui.clipboardWriter) + platform.ProcessClipboardWrites(gtx, ui.clipboardWriter) e.Frame(gtx.Ops) } } diff --git a/internal/appui/android_share_android.go b/internal/appui/platform/android_share_android.go similarity index 98% rename from internal/appui/android_share_android.go rename to internal/appui/platform/android_share_android.go index a7d0769..81adc82 100644 --- a/internal/appui/android_share_android.go +++ b/internal/appui/platform/android_share_android.go @@ -1,6 +1,6 @@ //go:build android -package appui +package platform /* #cgo CFLAGS: -Werror @@ -71,7 +71,7 @@ func gioJavaVM() *C.JavaVM //go:linkname gioRunInJVM gioui.org/app.runInJVM func gioRunInJVM(jvm *C.JavaVM, f func(env *C.JNIEnv)) -func newPlatformVaultSharer(goos string) vaultSharer { +func NewVaultSharer(goos string) VaultSharer { return androidVaultSharer{} } diff --git a/internal/appui/platform/android_share_stub.go b/internal/appui/platform/android_share_stub.go new file mode 100644 index 0000000..9343c74 --- /dev/null +++ b/internal/appui/platform/android_share_stub.go @@ -0,0 +1,7 @@ +//go:build !android + +package platform + +func NewVaultSharer(goos string) VaultSharer { + return nil +} diff --git a/internal/appui/clipboard_gio.go b/internal/appui/platform/clipboard_gio.go similarity index 83% rename from internal/appui/clipboard_gio.go rename to internal/appui/platform/clipboard_gio.go index d4033ac..6eb8fd4 100644 --- a/internal/appui/clipboard_gio.go +++ b/internal/appui/platform/clipboard_gio.go @@ -1,4 +1,4 @@ -package appui +package platform import ( "io" @@ -11,20 +11,24 @@ import ( appclipboard "git.julianfamily.org/keepassgo/internal/clipboard" ) +type VaultSharer interface { + ShareVault(path, title string) error +} + type clipboardCommandWriter struct { mu sync.Mutex pending []string invalidate func() } -func newPlatformClipboardWriter(goos string, invalidate func()) appclipboard.Writer { +func NewClipboardWriter(goos string, invalidate func()) appclipboard.Writer { if strings.EqualFold(goos, "android") { return &clipboardCommandWriter{invalidate: invalidate} } return nil } -func processClipboardWrites(gtx layout.Context, writer appclipboard.Writer) { +func ProcessClipboardWrites(gtx layout.Context, writer appclipboard.Writer) { commandWriter, ok := writer.(*clipboardCommandWriter) if !ok { return diff --git a/internal/appui/clipboard_gio_test.go b/internal/appui/platform/clipboard_gio_test.go similarity index 73% rename from internal/appui/clipboard_gio_test.go rename to internal/appui/platform/clipboard_gio_test.go index 18a6b35..2f6e865 100644 --- a/internal/appui/clipboard_gio_test.go +++ b/internal/appui/platform/clipboard_gio_test.go @@ -1,4 +1,4 @@ -package appui +package platform import ( "slices" @@ -8,17 +8,17 @@ import ( func TestNewPlatformClipboardWriterUsesCommandWriterOnAndroid(t *testing.T) { t.Parallel() - writer := newPlatformClipboardWriter("android", nil) + writer := NewClipboardWriter("android", nil) if _, ok := writer.(*clipboardCommandWriter); !ok { - t.Fatalf("newPlatformClipboardWriter(android) = %T, want *clipboardCommandWriter", writer) + t.Fatalf("NewClipboardWriter(android) = %T, want *clipboardCommandWriter", writer) } } func TestNewPlatformClipboardWriterUsesSystemClipboardOffAndroid(t *testing.T) { t.Parallel() - if writer := newPlatformClipboardWriter("linux", nil); writer != nil { - t.Fatalf("newPlatformClipboardWriter(linux) = %T, want nil", writer) + if writer := NewClipboardWriter("linux", nil); writer != nil { + t.Fatalf("NewClipboardWriter(linux) = %T, want nil", writer) } }