Skip to content

Conversation

@DropSnorz
Copy link
Owner

No description provided.

@coderabbitai
Copy link

coderabbitai bot commented Aug 22, 2025

Walkthrough

Adds a TelemetryService (Mixpanel) and telemetry config; removes AnalyticsService; swaps AnalyticsService usages to TelemetryService across controllers; adds telemetry UI and preferences; changes TaskBarController.setErrorLog to accept task context and emits telemetry on errors and incomplete plugin scans; updates application properties and FXML.

Changes

Cohort / File(s) Summary
Telemetry service & config
owlplug-client/src/main/java/com/owlplug/core/services/TelemetryService.java, owlplug-client/src/main/resources/application.properties, owlplug-client/src/main/java/com/owlplug/core/components/ApplicationDefaults.java
Add TelemetryService (Mixpanel EU integration, persistent userId, allowlist, sanitization, background delivery); add owlplug.telemetry.code property and TELEMETRY_ENABLED_KEY / TELEMETRY_USER_ID_KEY constants; rename SYNC_FILE_STATSYNC_FILE_STAT_KEY.
Remove legacy analytics
owlplug-client/src/main/java/com/owlplug/core/services/AnalyticsService.java
Remove deprecated AnalyticsService and its pageView no-ops.
Controller service swap
owlplug-client/src/main/java/com/owlplug/core/controllers/BaseController.java
Replace AnalyticsService field/getter with TelemetryService field/getter (public API rename).
Startup telemetry
owlplug-client/src/main/java/com/owlplug/core/controllers/MainController.java
Replace analytics pageView("/app/core/startup") with telemetry event("/Startup") via TelemetryService.
Explore / source / install telemetry
owlplug-client/src/main/java/com/owlplug/explore/controllers/ExploreController.java, owlplug-client/src/main/java/com/owlplug/explore/controllers/NewSourceDialogController.java
Replace various analytics calls with TelemetryService events (e.g., /Explore/SyncSources, /Explore/Install); remove some former analytics calls for add-source and search.
Plugins & projects telemetry
owlplug-client/src/main/java/com/owlplug/plugin/controllers/PluginsController.java, owlplug-client/src/main/java/com/owlplug/plugin/controllers/dialogs/NewLinkController.java, owlplug-client/src/main/java/com/owlplug/project/controllers/ProjectsController.java
Replace/add telemetry events: /Plugins/Scan, /Plugins/Export, /Plugins/CreateSymlink, /Projects/Scan.
Error logging & task context
owlplug-client/src/main/java/com/owlplug/core/components/TaskRunner.java, owlplug-client/src/main/java/com/owlplug/core/controllers/TaskBarController.java, owlplug-client/src/main/java/com/owlplug/core/controllers/dialogs/CrashRecoveryDialogController.java
Change TaskBarController.setErrorLog signature to include AbstractTask; TaskRunner passes current task on failures; TaskBarController emits /Error/TaskExecution (taskName, error, content); CrashRecovery emits /Error/PluginScanIncomplete per plugin.
Options UI & prefs
owlplug-client/src/main/java/com/owlplug/core/controllers/OptionsController.java, owlplug-client/src/main/resources/fxml/OptionsView.fxml
Add telemetryCheckBox, telemetryHyperlink, owlplugWebsiteLink FXML fields; persist/read TELEMETRY_ENABLED_KEY; adjust layout (widths, spacing) and link behavior.
Plugin task preference key update
owlplug-client/src/main/java/com/owlplug/plugin/components/PluginTaskFactory.java
Use ApplicationDefaults.SYNC_FILE_STAT_KEY when gating file-stat sync scheduling.

Sequence Diagram(s)

sequenceDiagram
  autonumber
  actor User
  participant UI as Controller
  participant TS as TelemetryService
  participant Mix as Mixpanel API

  rect rgba(230,240,255,0.5)
    note over UI,TS: Emit telemetry for whitelisted events when enabled
    User->>UI: Trigger action
    UI->>TS: event(name, builder?)
    TS->>TS: read TELEMETRY_ENABLED pref
    TS->>TS: check allowlist
    alt allowed
      TS->>TS: build & sanitize props
      TS->>Mix: deliver(event(userId, name, props))
      Mix-->>TS: ack / IOException
    else blocked
      TS-->>UI: no-op
    end
  end
Loading
sequenceDiagram
  autonumber
  participant TR as TaskRunner
  participant TBC as TaskBarController
  participant TS as TelemetryService
  participant UI as Error Dialog

  TR->>TBC: setErrorLog(currentTask, title, content)
  TBC->>TS: event("/Error/TaskExecution", {taskName, error, content})
  TBC->>UI: showErrorDialog(title, content)
Loading

Estimated code review effort

🎯 3 (Moderate) | ⏱️ ~25 minutes

Possibly related PRs

Tip

🔌 Remote MCP (Model Context Protocol) integration is now available!

Pro plan users can now connect to remote MCP servers from the Integrations page. Connect with popular remote MCPs such as Notion and Linear to add more context to your reviews and chats.

✨ Finishing Touches
  • 📝 Generate Docstrings
🧪 Generate unit tests
  • Create PR with unit tests
  • Post copyable unit tests in a comment
  • Commit unit tests in branch feat/telemetry

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share
🪧 Tips

Chat

There are 3 ways to chat with CodeRabbit:

  • Review comments: Directly reply to a review comment made by CodeRabbit. Example:
    • I pushed a fix in commit <commit_id>, please review it.
    • Open a follow-up GitHub issue for this discussion.
  • Files and specific lines of code (under the "Files changed" tab): Tag @coderabbitai in a new review comment at the desired location with your query.
  • PR comments: Tag @coderabbitai in a new PR comment to ask questions about the PR branch. For the best results, please provide a very specific query, as very limited context is provided in this mode. Examples:
    • @coderabbitai gather interesting stats about this repository and render them as a table. Additionally, render a pie chart showing the language distribution in the codebase.
    • @coderabbitai read the files in the src/scheduler package and generate a class diagram using mermaid and a README in the markdown format.

Support

Need help? Create a ticket on our support page for assistance with any issues or questions.

CodeRabbit Commands (Invoked using PR/Issue comments)

Type @coderabbitai help to get the list of available commands.

Other keywords and placeholders

  • Add @coderabbitai ignore anywhere in the PR description to prevent this PR from being reviewed.
  • Add @coderabbitai summary to generate the high-level summary at a specific location in the PR description.
  • Add @coderabbitai or @coderabbitai title anywhere in the PR title to generate the title automatically.

CodeRabbit Configuration File (.coderabbit.yaml)

  • You can programmatically configure CodeRabbit by adding a .coderabbit.yaml file to the root of your repository.
  • Please see the configuration documentation for more information.
  • If your editor has YAML language server enabled, you can add the path at the top of this file to enable auto-completion and validation: # yaml-language-server: $schema=https://coderabbit.ai/integrations/schema.v2.json

Status, Documentation and Community

  • Visit our Status Page to check the current availability of CodeRabbit.
  • Visit our Documentation for detailed information on how to use CodeRabbit.
  • Join our Discord Community to get help, request features, and share feedback.
  • Follow us on X/Twitter for updates and announcements.

@DropSnorz
Copy link
Owner Author

@coderabbitai review

@coderabbitai
Copy link

coderabbitai bot commented Aug 22, 2025

✅ Actions performed

Review triggered.

Note: CodeRabbit is an incremental review system and does not re-review already reviewed commits. This command is applicable only when automatic reviews are paused.

Copy link

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 6

🧹 Nitpick comments (15)
owlplug-client/src/main/java/com/owlplug/core/components/ApplicationDefaults.java (1)

121-122: Rename telemetry constants and update their usages

The rg search shows the following usages of the old constant names—these will all need to be updated to the new _KEY suffixed names after you apply the diff:

  • TelemetryService.java

    • Line 61:
      getPreferences().get(ApplicationDefaults.TELEMETRY_USER_ID, …)
      getPreferences().get(ApplicationDefaults.TELEMETRY_USER_ID_KEY, …)
    • Line 62:
      getPreferences().put(ApplicationDefaults.TELEMETRY_USER_ID, userId)
      getPreferences().put(ApplicationDefaults.TELEMETRY_USER_ID_KEY, userId)
    • Line 71:
      getPreferences().getBoolean(ApplicationDefaults.TELEMETRY_ENABLED, false)
      getPreferences().getBoolean(ApplicationDefaults.TELEMETRY_ENABLED_KEY, false)
  • OptionsController.java

    • Line 206:
      putBoolean(ApplicationDefaults.TELEMETRY_ENABLED, newValue)
      putBoolean(ApplicationDefaults.TELEMETRY_ENABLED_KEY, newValue)
    • Line 283:
      setSelected(getPreferences().getBoolean(ApplicationDefaults.TELEMETRY_ENABLED, true))
      setSelected(getPreferences().getBoolean(ApplicationDefaults.TELEMETRY_ENABLED_KEY, true))

Apply the following diff in ApplicationDefaults.java:

-  public static final String TELEMETRY_ENABLED = "TELEMETRY_ENABLED";
-  public static final String TELEMETRY_USER_ID = "TELEMETRY_USER_ID";
+  /** Whether telemetry is enabled in user preferences. */
+  public static final String TELEMETRY_ENABLED_KEY = "TELEMETRY_ENABLED";
+  /** Stable, anonymized telemetry user identifier stored in preferences. */
+  public static final String TELEMETRY_USER_ID_KEY = "TELEMETRY_USER_ID";

This aligns these constants with the existing _KEY naming convention and adds concise Javadoc.

owlplug-client/src/main/resources/application.properties (1)

13-13: Document what this token is and how to override it

Add a short comment to clarify that this is the public project token (not user data) and can be overridden via standard Spring property mechanisms. Helps future maintainers and downstream packagers.

-owlplug.telemetry.code = 1ef50688f6f98ec583f1aa2170874320
+# Telemetry project token (public, non-PII). Override with:
+#  -Dowlplug.telemetry.code=... or env OWLPLUG_TELEMETRY_CODE
+owlplug.telemetry.code = 1ef50688f6f98ec583f1aa2170874320
owlplug-client/src/main/java/com/owlplug/plugin/controllers/dialogs/NewLinkController.java (1)

92-92: Enrich telemetry with minimal, non-sensitive context and add failure telemetry

Great to migrate to TelemetryService. Consider adding basic properties (no paths) and emitting an error event when symlink creation fails. This improves observability without leaking PII.

Apply this diff for success context:

-          this.getTelemetryService().event("/Plugins/CreateSymlink");
+          this.getTelemetryService().event("/Plugins/CreateSymlink", p -> {
+            p.put("success", "true");
+            p.put("sourceName", linkSourceNameTextField.getText()); // name only, not full path
+            p.put("os", this.getApplicationDefaults().getRuntimePlatform().getOperatingSystem().name());
+          });

And update the catch block to capture failures (outside this hunk):

// inside createSymlink(...) catch (IOException e) { ... }
this.getTelemetryService().event("/Plugins/CreateSymlink", p -> {
  p.put("success", "false");
  p.put("errorType", e.getClass().getSimpleName());
  p.put("message", e.getMessage() != null ? e.getMessage().substring(0, Math.min(120, e.getMessage().length())) : "");
});

If you prefer stronger consistency, extract event names to a TelemetryEvents class to avoid string literals spreading further.

owlplug-client/src/main/java/com/owlplug/core/controllers/MainController.java (1)

195-195: Include useful startup context; optionally capture first-launch flag before toggling

Emitting the event is good. Add basic dimensions like version and OS. If you want a firstLaunch dimension, read it before setting it to false.

Apply this diff for added context:

-    this.getTelemetryService().event("/Startup");
+    this.getTelemetryService().event("/Startup", p -> {
+      p.put("version", this.getApplicationDefaults().getVersion());
+      p.put("os", this.getApplicationDefaults().getRuntimePlatform().getOperatingSystem().name());
+    });

Optionally (outside this hunk), capture firstLaunch:

boolean firstLaunch = this.getPreferences().getBoolean(ApplicationDefaults.FIRST_LAUNCH_KEY, true);
// ... existing logic ...
this.getPreferences().putBoolean(ApplicationDefaults.FIRST_LAUNCH_KEY, false);
// ...
this.getTelemetryService().event("/Startup", p -> {
  p.put("version", this.getApplicationDefaults().getVersion());
  p.put("os", this.getApplicationDefaults().getRuntimePlatform().getOperatingSystem().name());
  p.put("firstLaunch", Boolean.toString(firstLaunch));
});
owlplug-client/src/main/java/com/owlplug/core/controllers/dialogs/CrashRecoveryDialogController.java (1)

134-144: Throttle per-plugin error events and add an aggregate event

Per-plugin events are useful but can be noisy on large sets. Throttle to a reasonable number and send a single aggregate event with the total count.

Apply this diff:

-      for (Plugin plugin : incompleteSyncPlugins) {
-        log.info("Last scan for plugin {} is incomplete", plugin.getName());
-        RecoveredPluginView pluginView = new RecoveredPluginView(plugin, pluginService, this.getApplicationDefaults());
-        pluginListContainer.getChildren().add(pluginView);
-
-        this.getTelemetryService().event("/Error/PluginScanIncomplete", p -> {
-          p.put("nativeDiscoveryLoader", this.getPreferences().get(
-              ApplicationDefaults.PREFERRED_NATIVE_LOADER, "unknown"));
-          p.put("pluginName", plugin.getName());
-        });
-      }
+      int limit = Math.min(incompleteSyncPlugins.size(), 10);
+      for (int i = 0; i < limit; i++) {
+        Plugin plugin = incompleteSyncPlugins.get(i);
+        log.info("Last scan for plugin {} is incomplete", plugin.getName());
+        RecoveredPluginView pluginView = new RecoveredPluginView(plugin, pluginService, this.getApplicationDefaults());
+        pluginListContainer.getChildren().add(pluginView);
+
+        this.getTelemetryService().event("/Error/PluginScanIncomplete", p -> {
+          p.put("nativeDiscoveryLoader", this.getPreferences().get(
+              ApplicationDefaults.PREFERRED_NATIVE_LOADER, "unknown"));
+          p.put("pluginName", plugin.getName());
+        });
+      }
+      if (incompleteSyncPlugins.size() > limit) {
+        this.getTelemetryService().event("/Error/PluginScanIncomplete/Bulk", p -> {
+          p.put("count", String.valueOf(incompleteSyncPlugins.size()));
+        });
+      }

Optional: replace pluginName with a stable, non-PII identifier if available (e.g., plugin.getId()) to avoid surprises with vendor-specific naming.

owlplug-client/src/main/java/com/owlplug/plugin/controllers/PluginsController.java (1)

182-184: Telemetry calls: make them resilient and avoid stringly-typed event names

  • Ensure TelemetryService.event(...) is non-blocking and swallows/translates exceptions so UI actions (scan/export) are never impacted by telemetry outages.
  • To prevent typos and promote consistency across controllers, avoid inline string literals for event names.

Apply this localized change to use constants at call sites:

-      this.getTelemetryService().event("/Plugins/Scan");
+      this.getTelemetryService().event(EVT_PLUGINS_SCAN);
-      this.getTelemetryService().event("/Plugins/Export");
+      this.getTelemetryService().event(EVT_PLUGINS_EXPORT);

And add these constants in the class (outside the shown range, near the class fields):

private static final String EVT_PLUGINS_SCAN = "/Plugins/Scan";
private static final String EVT_PLUGINS_EXPORT = "/Plugins/Export";

Alternatively, centralize event names in a shared TelemetryEvents class to keep them DRY project-wide.

Also applies to: 189-191

owlplug-client/src/main/java/com/owlplug/project/controllers/ProjectsController.java (1)

69-72: Good instrumentation; keep naming consistent with other controllers

Logging “/Projects/Scan” before triggering sync aligns with the Plugins controller. Consider extracting event names to shared constants to avoid drift over time.

owlplug-client/src/main/java/com/owlplug/core/controllers/OptionsController.java (1)

205-213: Guard against missing wiki URL; avoid potential null/blank concatenation

If owlplug.github.wiki.url is missing/blank, concatenation will yield an invalid URL. Add a simple guard.

Apply:

-    telemetryHyperlink.setOnAction(e -> {
-      PlatformUtils.openDefaultBrowser(this.getApplicationDefaults().getEnvProperty("owlplug.github.wiki.url")
-                                           + "/Telemetry");
-    });
+    telemetryHyperlink.setOnAction(e -> {
+      String wikiBase = this.getApplicationDefaults().getEnvProperty("owlplug.github.wiki.url");
+      if (wikiBase != null && !wikiBase.isBlank()) {
+        PlatformUtils.openDefaultBrowser(wikiBase + "/Telemetry");
+      }
+    });
owlplug-client/src/main/java/com/owlplug/core/controllers/BaseController.java (1)

24-24: Telemetry migration verification and recommendations

  • Verified that all references to AnalyticsService (including getAnalyticsService() and the AnalyticsService type) have been removed—no occurrences found in the codebase.
  • Confirmed that TelemetryService is registered as a Spring bean via @Service, so dependency injection will always succeed.
  • Reviewed owlplug-client/src/main/java/com/owlplug/core/services/TelemetryService.java and found no logic for a “disabled” or no-op mode—no conditional checks, flags, or methods referencing disable/no-op behavior.

Recommendation: introduce configuration-driven short-circuiting inside TelemetryService (for example, reading a telemetry.enabled flag from ApplicationDefaults or via @Value) so that when telemetry is disabled the service becomes a no-op internally. This ensures callers never need to guard calls and the bean remains present for DI.

owlplug-client/src/main/java/com/owlplug/core/components/TaskRunner.java (2)

112-114: Null-safe error title to avoid empty dialog headings

Exceptions often have null messages; prefer a safe fallback. Also, remember this content is later sent to telemetry; keep it concise.

-                taskBarController.setErrorLog(currentTask, currentTask.getException().getMessage(),
-                        currentTask.getException().toString());
+                String errTitle = currentTask.getException().getMessage();
+                if (errTitle == null || errTitle.isBlank()) {
+                  errTitle = currentTask.getException().getClass().getSimpleName();
+                }
+                taskBarController.setErrorLog(currentTask, errTitle, currentTask.getException().toString());

126-129: Same null-safe title for failure path

Mirror the safeguard on the failure callback.

-            taskBarController.setErrorLog(currentTask, ex.getMessage(), ex.toString());
+            String errTitle = (ex.getMessage() == null || ex.getMessage().isBlank())
+                ? ex.getClass().getSimpleName()
+                : ex.getMessage();
+            taskBarController.setErrorLog(currentTask, errTitle, ex.toString());
owlplug-client/src/main/resources/fxml/OptionsView.fxml (1)

91-97: Clarify copy and improve accessibility/UX for telemetry opt-in

Current composition (“Send” + hyperlink “Diagnostic Telemetry Data” + “over the network”) reads awkwardly for screen readers and localization. Prefer a self-contained checkbox label and a separate “Learn more” link. Also, the “hyperlink-disabled” style may suggest it’s non-interactive.

-                  <Label styleClass="heading-2" text="Advanced" />
-                  <HBox alignment="CENTER_LEFT">
-                        <CheckBox fx:id="telemetryCheckBox" mnemonicParsing="false" text="Send" />
-                        <Hyperlink fx:id="telemetryHyperlink" styleClass="hyperlink-disabled" text="Diagnostic Telemetry Data" />
-                        <Label text="over the network" />
-                  </HBox>
+                  <Label styleClass="heading-2" text="Advanced" />
+                  <HBox alignment="CENTER_LEFT" spacing="6.0">
+                        <CheckBox fx:id="telemetryCheckBox" mnemonicParsing="false" text="Send diagnostic telemetry data over the network" />
+                        <Hyperlink fx:id="telemetryHyperlink" text="Learn more" />
+                  </HBox>

Confirm that the CSS class “hyperlink-disabled” is purely stylistic and doesn’t disable pointer events. If it does, drop the class or toggle it based on the checkbox state.

owlplug-client/src/main/java/com/owlplug/core/services/TelemetryService.java (3)

55-63: Guard missing config and stabilize userId initialization

If owlplug.telemetry.code is missing/blank, sending will fail later. Fail fast and log once.

   @PostConstruct
   private void initialize() {
     mixpanel = new MixpanelAPI("https://api-eu.mixpanel.com/track",
         "https://api-eu.mixpanel.com/engage");
-    messageBuilder = new MessageBuilder(this.getApplicationDefaults().getEnvProperty("owlplug.telemetry.code"));
+    final String code = this.getApplicationDefaults().getEnvProperty("owlplug.telemetry.code");
+    if (code == null || code.isBlank()) {
+      log.warn("Telemetry disabled: missing 'owlplug.telemetry.code'.");
+      // Still initialize messageBuilder with a dummy to avoid NPEs; events will be gated out by TELEMETRY_ENABLED.
+      messageBuilder = new MessageBuilder("disabled");
+    } else {
+      messageBuilder = new MessageBuilder(code);
+    }
@@
-    userId = this.getPreferences().get(ApplicationDefaults.TELEMETRY_USER_ID, UUID.randomUUID().toString());
-    this.getPreferences().put(ApplicationDefaults.TELEMETRY_USER_ID, userId);
+    String existing = this.getPreferences().get(ApplicationDefaults.TELEMETRY_USER_ID, null);
+    userId = (existing == null || existing.isBlank()) ? UUID.randomUUID().toString() : existing;
+    this.getPreferences().put(ApplicationDefaults.TELEMETRY_USER_ID, userId);

70-77: Add debug hints when events are gated

When telemetry is disabled or event is not allowed, a one-line debug helps diagnose why nothing shows up.

-    if (!this.getPreferences().getBoolean(ApplicationDefaults.TELEMETRY_ENABLED, false)) {
-      return;
-    }
+    if (!this.getPreferences().getBoolean(ApplicationDefaults.TELEMETRY_ENABLED, false)) {
+      log.debug("Telemetry gated: disabled by user preferences");
+      return;
+    }
@@
-    if (!ALLOWED_EVENTS.contains(canonicalName)) {
-      return;
-    }
+    if (!ALLOWED_EVENTS.contains(canonicalName)) {
+      log.debug("Telemetry gated: '{}' not in allowed events {}", canonicalName, ALLOWED_EVENTS);
+      return;
+    }

101-101: Consider graceful shutdown

If the app uses Spring lifecycle hooks, optionally shut down the dispatcher to flush pending events on exit.

Add:

@PreDestroy
private void shutdown() {
  dispatcher.shutdown();
}

And import jakarta.annotation.PreDestroy.

📜 Review details

Configuration used: CodeRabbit UI

Review profile: CHILL

Plan: Pro

💡 Knowledge Base configuration:

  • MCP integration is disabled by default for public repositories
  • Jira integration is disabled by default for public repositories
  • Linear integration is disabled by default for public repositories

You can enable these sources in your CodeRabbit configuration.

📥 Commits

Reviewing files that changed from the base of the PR and between a491171 and 07ea02e.

⛔ Files ignored due to path filters (1)
  • owlplug-client/pom.xml is excluded by !**/*.xml
📒 Files selected for processing (16)
  • owlplug-client/src/main/java/com/owlplug/core/components/ApplicationDefaults.java (1 hunks)
  • owlplug-client/src/main/java/com/owlplug/core/components/TaskRunner.java (2 hunks)
  • owlplug-client/src/main/java/com/owlplug/core/controllers/BaseController.java (3 hunks)
  • owlplug-client/src/main/java/com/owlplug/core/controllers/MainController.java (1 hunks)
  • owlplug-client/src/main/java/com/owlplug/core/controllers/OptionsController.java (3 hunks)
  • owlplug-client/src/main/java/com/owlplug/core/controllers/TaskBarController.java (1 hunks)
  • owlplug-client/src/main/java/com/owlplug/core/controllers/dialogs/CrashRecoveryDialogController.java (1 hunks)
  • owlplug-client/src/main/java/com/owlplug/core/services/AnalyticsService.java (0 hunks)
  • owlplug-client/src/main/java/com/owlplug/core/services/TelemetryService.java (1 hunks)
  • owlplug-client/src/main/java/com/owlplug/explore/controllers/ExploreController.java (2 hunks)
  • owlplug-client/src/main/java/com/owlplug/explore/controllers/NewSourceDialogController.java (0 hunks)
  • owlplug-client/src/main/java/com/owlplug/plugin/controllers/PluginsController.java (1 hunks)
  • owlplug-client/src/main/java/com/owlplug/plugin/controllers/dialogs/NewLinkController.java (1 hunks)
  • owlplug-client/src/main/java/com/owlplug/project/controllers/ProjectsController.java (1 hunks)
  • owlplug-client/src/main/resources/application.properties (1 hunks)
  • owlplug-client/src/main/resources/fxml/OptionsView.fxml (3 hunks)
💤 Files with no reviewable changes (2)
  • owlplug-client/src/main/java/com/owlplug/core/services/AnalyticsService.java
  • owlplug-client/src/main/java/com/owlplug/explore/controllers/NewSourceDialogController.java
⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (1)
  • GitHub Check: Codacy Static Code Analysis
🔇 Additional comments (6)
owlplug-client/src/main/java/com/owlplug/core/controllers/OptionsController.java (2)

94-98: Verified: telemetry FXML bindings and wiki URL property are present

The OptionsView.fxml file declares both new controls with the correct fx:id values:

  • Line 93: <CheckBox fx:id="telemetryCheckBox" … />
  • Line 94: <Hyperlink fx:id="telemetryHyperlink" … />

The application.properties file also includes the required wiki URL key:

  • Line 8: owlplug.github.wiki.url = https://github.com/DropSnorz/OwlPlug/wiki

No further changes are needed.


283-284: Telemetry default opt-in implementation and service enforcement confirmed

  • In OptionsController (src/main/java/com/owlplug/core/controllers/OptionsController.java:205–207, 283), the telemetry checkbox’s listener is attached before the initial setSelected(getBoolean(..., true)). This means on first render the default true value is persisted to preferences, enabling telemetry by default.
  • In TelemetryService (src/main/java/com/owlplug/core/services/TelemetryService.java:71–73), event(...) calls getBoolean(..., false) and returns immediately when telemetry is disabled, making it a no-op if the pref is false.

Please confirm that opting users into telemetry by default aligns with your distribution and compliance requirements.

owlplug-client/src/main/java/com/owlplug/explore/controllers/ExploreController.java (1)

370-374: I’ve set up commands to inspect the definitions and nullability of the involved types and methods. Let me know when you have the results.

owlplug-client/src/main/resources/fxml/OptionsView.fxml (3)

46-46: Layout tweak is fine

Reducing the right card prefWidth to 470.0 improves balance with the left pane.


118-118: Spacing improvement around About footer controls looks good

The added spacing in the footer HBox improves visual clarity.


126-126: Copy change “Open Logs” → “Logs” is fine

Shorter label aligns with the adjacent “Contribute” button and reduces crowding.

@DropSnorz
Copy link
Owner Author

@coderabbitai review

@coderabbitai
Copy link

coderabbitai bot commented Aug 24, 2025

✅ Actions performed

Review triggered.

Note: CodeRabbit is an incremental review system and does not re-review already reviewed commits. This command is applicable only when automatic reviews are paused.

Copy link

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 0

🧹 Nitpick comments (1)
owlplug-client/src/main/java/com/owlplug/plugin/components/PluginTaskFactory.java (1)

117-125: Evaluate the preference at schedule time to avoid stale reads

Minor improvement: read the preference inside the onScheduled handler so the latest setting is honored even if the user toggles it between sync success and task scheduling. Current code reads it once before wiring the handler.

-      if (prefs.getBoolean(ApplicationDefaults.SYNC_FILE_STAT_KEY, true)) {
-        lookupTask.getTask().setOnScheduled(lookupEvent -> {
-          if (directoryScope != null) {
-            createFileStatSyncTask(directoryScope).scheduleNow();
-          } else {
-            createFileStatSyncTask().scheduleNow();
-          }
-        });
-      }
+      lookupTask.getTask().setOnScheduled(lookupEvent -> {
+        if (!prefs.getBoolean(ApplicationDefaults.SYNC_FILE_STAT_KEY, true)) {
+          return;
+        }
+        if (directoryScope != null) {
+          createFileStatSyncTask(directoryScope).scheduleNow();
+        } else {
+          createFileStatSyncTask().scheduleNow();
+        }
+      });
📜 Review details

Configuration used: CodeRabbit UI

Review profile: CHILL

Plan: Pro

💡 Knowledge Base configuration:

  • MCP integration is disabled by default for public repositories
  • Jira integration is disabled by default for public repositories
  • Linear integration is disabled by default for public repositories

You can enable these sources in your CodeRabbit configuration.

📥 Commits

Reviewing files that changed from the base of the PR and between 07ea02e and b2d3953.

📒 Files selected for processing (5)
  • owlplug-client/src/main/java/com/owlplug/core/components/ApplicationDefaults.java (1 hunks)
  • owlplug-client/src/main/java/com/owlplug/core/controllers/OptionsController.java (4 hunks)
  • owlplug-client/src/main/java/com/owlplug/core/controllers/TaskBarController.java (1 hunks)
  • owlplug-client/src/main/java/com/owlplug/core/services/TelemetryService.java (1 hunks)
  • owlplug-client/src/main/java/com/owlplug/plugin/components/PluginTaskFactory.java (1 hunks)
🚧 Files skipped from review as they are similar to previous changes (4)
  • owlplug-client/src/main/java/com/owlplug/core/controllers/OptionsController.java
  • owlplug-client/src/main/java/com/owlplug/core/controllers/TaskBarController.java
  • owlplug-client/src/main/java/com/owlplug/core/services/TelemetryService.java
  • owlplug-client/src/main/java/com/owlplug/core/components/ApplicationDefaults.java
⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (1)
  • GitHub Check: Codacy Static Code Analysis
🔇 Additional comments (1)
owlplug-client/src/main/java/com/owlplug/plugin/components/PluginTaskFactory.java (1)

117-117: Preference key rename verified and backward compatibility confirmed

  • Confirmed that ApplicationDefaults.SYNC_FILE_STAT_KEY is defined exactly once in ApplicationDefaults.java as
    public static final String SYNC_FILE_STAT_KEY = "SYNC_FILE_STAT_KEY";
    (no prior SYNC_FILE_STAT constant or changed literal value)
  • No lingering references to a non-_KEY symbol in the codebase; all calls use the new SYNC_FILE_STAT_KEY

Everything looks correct—no further changes needed.

@DropSnorz DropSnorz merged commit 4a03507 into master Aug 27, 2025
3 checks passed
@coderabbitai coderabbitai bot mentioned this pull request Nov 2, 2025
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants