From e3d37d182270ba6dd25f0d11b64d046a42edf9b2 Mon Sep 17 00:00:00 2001 From: Gray Zhang Date: Sat, 18 Oct 2025 11:28:49 +0800 Subject: [PATCH 1/2] feat: add analytics tracking to VShare WebView MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Add custom User-Agent and source parameter to track V2er app traffic to VShare page for analytics purposes. Changes: - Set custom User-Agent: "Mozilla/5.0... V2er-Android/{version}" - Add source parameter to URL: "?theme={theme}&source=v2er-android" - Add getAppVersion() method to retrieve app version for User-Agent This enables VShare page to: 1. Identify traffic from V2er Android app via User-Agent header 2. Track app version distribution 3. Filter analytics by source parameter 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude --- .../v2er/module/vshare/VshareWebActivity.java | 27 ++++++++++++++----- 1 file changed, 21 insertions(+), 6 deletions(-) diff --git a/app/src/main/java/me/ghui/v2er/module/vshare/VshareWebActivity.java b/app/src/main/java/me/ghui/v2er/module/vshare/VshareWebActivity.java index 3a219d10..c91d5938 100644 --- a/app/src/main/java/me/ghui/v2er/module/vshare/VshareWebActivity.java +++ b/app/src/main/java/me/ghui/v2er/module/vshare/VshareWebActivity.java @@ -103,13 +103,10 @@ protected void init() { setupWebView(); - // Compute URL with theme parameter based on current app theme + // Compute URL with theme and source parameters for analytics tracking String url = VSHARE_BASE_URL; - if (DarkModelUtils.isDarkMode()) { - url += "?theme=dark"; - } else { - url += "?theme=light"; - } + String themeParam = DarkModelUtils.isDarkMode() ? "dark" : "light"; + url += "?theme=" + themeParam + "&source=v2er-android"; mWebView.loadUrl(url); } @@ -143,6 +140,12 @@ private void setupWebView() { WebSettings settings = mWebView.getSettings(); + // Set custom User-Agent for analytics tracking + String defaultUserAgent = settings.getUserAgentString(); + String appVersion = getAppVersion(); + String customUserAgent = defaultUserAgent + " V2er-Android/" + appVersion; + settings.setUserAgentString(customUserAgent); + // Enable JavaScript settings.setJavaScriptEnabled(true); @@ -273,6 +276,18 @@ private int getStatusBarHeight() { return result; } + /** + * Get app version name for User-Agent tracking + */ + private String getAppVersion() { + try { + return getPackageManager().getPackageInfo(getPackageName(), 0).versionName; + } catch (Exception e) { + Log.e(TAG, "Failed to get app version", e); + return "unknown"; + } + } + /** * Handle URL loading for WebView * Returns true if the URL was handled externally, false if WebView should load it From 94fb604c636c438ca5e1e5bf783ceef3a21d2fc5 Mon Sep 17 00:00:00 2001 From: Gray Zhang Date: Sat, 18 Oct 2025 11:43:18 +0800 Subject: [PATCH 2/2] refactor: address Copilot review feedback for VShare analytics MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Address code review feedback from Copilot: 1. Use Uri.Builder for safer URL construction - Replace manual string concatenation with Uri.Builder - Properly encode query parameters - Handle existing parameters correctly 2. Replace PackageManager with BuildConfig.VERSION_NAME - Use BuildConfig.VERSION_NAME directly (no try/catch needed) - Avoid deprecated PackageManager.getPackageInfo() call - Simpler and more reliable implementation Changes: - VshareWebActivity.java:106-114: Use Uri.Builder for URL construction - VshareWebActivity.java:286-288: Simplify getAppVersion() with BuildConfig - Add BuildConfig import Note: Test coverage suggestions noted but deferred for future enhancement. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude --- .../v2er/module/vshare/VshareWebActivity.java | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/app/src/main/java/me/ghui/v2er/module/vshare/VshareWebActivity.java b/app/src/main/java/me/ghui/v2er/module/vshare/VshareWebActivity.java index c91d5938..7adc1cd9 100644 --- a/app/src/main/java/me/ghui/v2er/module/vshare/VshareWebActivity.java +++ b/app/src/main/java/me/ghui/v2er/module/vshare/VshareWebActivity.java @@ -22,6 +22,7 @@ import androidx.annotation.Nullable; import butterknife.BindView; +import me.ghui.v2er.BuildConfig; import me.ghui.v2er.R; import me.ghui.v2er.module.base.BaseActivity; import me.ghui.v2er.module.base.BaseContract; @@ -104,9 +105,13 @@ protected void init() { setupWebView(); // Compute URL with theme and source parameters for analytics tracking - String url = VSHARE_BASE_URL; String themeParam = DarkModelUtils.isDarkMode() ? "dark" : "light"; - url += "?theme=" + themeParam + "&source=v2er-android"; + String url = Uri.parse(VSHARE_BASE_URL) + .buildUpon() + .appendQueryParameter("theme", themeParam) + .appendQueryParameter("source", "v2er-android") + .build() + .toString(); mWebView.loadUrl(url); } @@ -280,12 +285,7 @@ private int getStatusBarHeight() { * Get app version name for User-Agent tracking */ private String getAppVersion() { - try { - return getPackageManager().getPackageInfo(getPackageName(), 0).versionName; - } catch (Exception e) { - Log.e(TAG, "Failed to get app version", e); - return "unknown"; - } + return BuildConfig.VERSION_NAME != null ? BuildConfig.VERSION_NAME : "unknown"; } /**