From c5d992ca47d57352d979a6f9b8124aaf08273f73 Mon Sep 17 00:00:00 2001 From: a1012112796 <1012112796@qq.com> Date: Tue, 24 Feb 2026 20:38:59 +0800 Subject: [PATCH] fix(android): update gradlew command for Windows compatibility and improve message processing --- .../android/build/android/Taskfile.yml | 4 +- .../main/java/com/wails/app/WailsBridge.java | 43 ++++++++++--------- .../build_assets/android/Taskfile.yml | 4 +- .../main/java/com/wails/app/WailsBridge.java | 5 +-- v3/pkg/application/application.go | 5 ++- v3/pkg/application/application_android.go | 2 +- .../application/messageprocessor_android.go | 2 +- 7 files changed, 33 insertions(+), 32 deletions(-) diff --git a/v3/examples/android/build/android/Taskfile.yml b/v3/examples/android/build/android/Taskfile.yml index e9988b406..a473ef638 100644 --- a/v3/examples/android/build/android/Taskfile.yml +++ b/v3/examples/android/build/android/Taskfile.yml @@ -128,7 +128,7 @@ tasks: # ./gradlew doesn't work on windows case "$(uname -s)" in - MINGW*|MSYS*|CYGWIN*) gradlew="powershell ./gradlew" ;; + MINGW*|MSYS*|CYGWIN*) gradlew="powershell ./gradlew.bat" ;; *) gradlew="./gradlew" ;; esac @@ -144,7 +144,7 @@ tasks: # ./gradlew doesn't work on windows case "$(uname -s)" in - MINGW*|MSYS*|CYGWIN*) gradlew="powershell ./gradlew" ;; + MINGW*|MSYS*|CYGWIN*) gradlew="powershell ./gradlew.bat" ;; *) gradlew="./gradlew" ;; esac diff --git a/v3/examples/android/build/android/app/src/main/java/com/wails/app/WailsBridge.java b/v3/examples/android/build/android/app/src/main/java/com/wails/app/WailsBridge.java index 03ce38274..3bbddd56c 100644 --- a/v3/examples/android/build/android/app/src/main/java/com/wails/app/WailsBridge.java +++ b/v3/examples/android/build/android/app/src/main/java/com/wails/app/WailsBridge.java @@ -20,6 +20,7 @@ import java.util.ArrayList; import java.util.Collections; import java.util.List; import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.CopyOnWriteArrayList; import java.util.concurrent.atomic.AtomicInteger; /** @@ -45,21 +46,21 @@ public class WailsBridge { private WebView webView; private volatile boolean initialized = false; private BottomNavigationView nativeTabsView; - private List nativeTabTitles = new ArrayList<>(); - private boolean nativeTabsEnabled = false; - private boolean scrollEnabled = true; - private boolean bounceEnabled = true; - private boolean scrollIndicatorsEnabled = true; - private boolean backForwardGesturesEnabled = false; - private boolean linkPreviewEnabled = true; - private String customUserAgent = null; - private float touchStartX = 0f; - private float touchStartY = 0f; - private int swipeThresholdPx = 120; - private View.OnTouchListener touchListener; + private final CopyOnWriteArrayList nativeTabTitles = new CopyOnWriteArrayList<>(); + private volatile boolean nativeTabsEnabled = false; + private volatile boolean scrollEnabled = true; + private volatile boolean bounceEnabled = true; + private volatile boolean scrollIndicatorsEnabled = true; + private volatile boolean backForwardGesturesEnabled = false; + private volatile boolean linkPreviewEnabled = true; + private volatile String customUserAgent = null; + private volatile float touchStartX = 0f; + private volatile float touchStartY = 0f; + private volatile int swipeThresholdPx = 120; + private volatile View.OnTouchListener touchListener; private final View.OnLongClickListener blockLongClickListener = v -> true; - private static final List DEFAULT_NATIVE_TAB_TITLES = Collections.emptyList(); + private static final List DEFAULT_NATIVE_TAB_TITLES = Collections.singletonList("Home"); // Native methods - implemented in Go private static native void nativeInit(WailsBridge bridge); @@ -371,7 +372,8 @@ public class WailsBridge { } } - nativeTabTitles = titles; + nativeTabTitles.clear(); + nativeTabTitles.addAll(titles); if (!nativeTabTitles.isEmpty()) { nativeTabsEnabled = true; } @@ -425,15 +427,14 @@ public class WailsBridge { return; } - boolean shouldShow = nativeTabsEnabled || (nativeTabTitles != null && !nativeTabTitles.isEmpty()); - if (!shouldShow) { - tabs.setVisibility(View.GONE); - return; + List titles = nativeTabTitles; + if (titles.isEmpty()) { + titles = DEFAULT_NATIVE_TAB_TITLES; } - List titles = nativeTabTitles; - if (titles == null || titles.isEmpty()) { - titles = DEFAULT_NATIVE_TAB_TITLES; + if (!nativeTabsEnabled) { + tabs.setVisibility(View.GONE); + return; } Menu menu = tabs.getMenu(); diff --git a/v3/internal/commands/build_assets/android/Taskfile.yml b/v3/internal/commands/build_assets/android/Taskfile.yml index 89031a390..2dd79b528 100644 --- a/v3/internal/commands/build_assets/android/Taskfile.yml +++ b/v3/internal/commands/build_assets/android/Taskfile.yml @@ -128,7 +128,7 @@ tasks: # ./gradlew doesn't work on windows case "$(uname -s)" in - MINGW*|MSYS*|CYGWIN*) gradlew="powershell ./gradlew" ;; + MINGW*|MSYS*|CYGWIN*) gradlew="powershell ./gradlew.bat" ;; *) gradlew="./gradlew" ;; esac @@ -144,7 +144,7 @@ tasks: # ./gradlew doesn't work on windows case "$(uname -s)" in - MINGW*|MSYS*|CYGWIN*) gradlew="powershell ./gradlew" ;; + MINGW*|MSYS*|CYGWIN*) gradlew="powershell ./gradlew.bat" ;; *) gradlew="./gradlew" ;; esac diff --git a/v3/internal/commands/build_assets/android/app/src/main/java/com/wails/app/WailsBridge.java b/v3/internal/commands/build_assets/android/app/src/main/java/com/wails/app/WailsBridge.java index 2b1c37ee3..3bbddd56c 100644 --- a/v3/internal/commands/build_assets/android/app/src/main/java/com/wails/app/WailsBridge.java +++ b/v3/internal/commands/build_assets/android/app/src/main/java/com/wails/app/WailsBridge.java @@ -60,7 +60,7 @@ public class WailsBridge { private volatile View.OnTouchListener touchListener; private final View.OnLongClickListener blockLongClickListener = v -> true; - private static final List DEFAULT_NATIVE_TAB_TITLES = Collections.emptyList(); + private static final List DEFAULT_NATIVE_TAB_TITLES = Collections.singletonList("Home"); // Native methods - implemented in Go private static native void nativeInit(WailsBridge bridge); @@ -432,8 +432,7 @@ public class WailsBridge { titles = DEFAULT_NATIVE_TAB_TITLES; } - boolean shouldShow = nativeTabsEnabled && !titles.isEmpty(); - if (!shouldShow) { + if (!nativeTabsEnabled) { tabs.setVisibility(View.GONE); return; } diff --git a/v3/pkg/application/application.go b/v3/pkg/application/application.go index cef8f567d..f6e689d2e 100644 --- a/v3/pkg/application/application.go +++ b/v3/pkg/application/application.go @@ -66,7 +66,7 @@ func New(appOptions Options) *App { result.customEventProcessor = NewWailsEventProcessor(result.Event.dispatch) - messageProc := NewMessageProcessor(result.Logger) + result.messageProcessor = NewMessageProcessor(result.Logger) // Initialize transport (default to HTTP if not specified) transport := appOptions.Transport @@ -74,7 +74,7 @@ func New(appOptions Options) *App { transport = NewHTTPTransport(HTTPTransportWithLogger(result.Logger)) } - err := transport.Start(result.ctx, messageProc) + err := transport.Start(result.ctx, result.messageProcessor) if err != nil { result.fatal("failed to start custom transport: %w", err) } @@ -377,6 +377,7 @@ type App struct { clipboard *Clipboard customEventProcessor *EventProcessor + messageProcessor *MessageProcessor Logger *slog.Logger contextMenus map[string]*ContextMenu diff --git a/v3/pkg/application/application_android.go b/v3/pkg/application/application_android.go index 31d425f59..76229ae32 100644 --- a/v3/pkg/application/application_android.go +++ b/v3/pkg/application/application_android.go @@ -867,7 +867,7 @@ func handleMessageForAndroid(app *App, message string) string { return marshalAndroidInvokeResponse(nil, fmt.Errorf("unsupported message type: %s", payload.Type)) } - processor := NewMessageProcessor(app.Logger) + processor := app.messageProcessor request := &RuntimeRequest{ Object: payload.Object, Method: payload.Method, diff --git a/v3/pkg/application/messageprocessor_android.go b/v3/pkg/application/messageprocessor_android.go index f551c6bdc..d5c5a3026 100644 --- a/v3/pkg/application/messageprocessor_android.go +++ b/v3/pkg/application/messageprocessor_android.go @@ -1,4 +1,4 @@ -//go:build android && !server +//go:build android package application