The unpinned maui-ios workload now installs the iOS 26.5 SDK manifest,
which requires the iOS 26.4+ SDK. The macos-15 image tops out at
Xcode 26.3, so move to macos-26 and select Xcode 26.5 to match.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Mirrors lojack-connect. .NET for Android runs no DEX shrinker by default, and
even with AndroidLinkTool=r8 the ProGuard config the SDK generates hardcodes
-dontobfuscate -- a flag nothing later in the config list can undo -- so Play
Console's "DEX code optimization" report scores obfuscation at ~1%.
_AndroidObfuscateDex drops the SDK's proguard_xamarin.cfg from R8's --pg-conf
list and substitutes a copy without that line, regenerating the
-printmapping/-keepattributes tail the SDK would have appended (absolute path:
R8 resolves a relative -printmapping against the config file's own directory).
49.8% of DEX classes are now renamed.
proguard.cfg carries the keeps the generated rules miss: classes the .NET
runtime resolves by name from native code (net.dot.android.**), and public and
protected fields, which the trimmer covers for methods only. The target also
caches aapt2's keep rules outside FileWrites -- the SDK adds them to
@(ProguardConfiguration) inside _CreateBaseApkWithAapt2 and registers the file
as a FileWrite, so an incremental Release build that skips the resource link
loses them and ships an APK that dies inflating FitWindowsFrameLayout.
Verified on a Pixel 9 emulator (API 36) with the obfuscated Release APK:
launch, connection list, Add Connection form, and a Bolt connection attempt
that exercises the network/TLS stack and surfaces the driver's error dialog.
The AAB carries mapping.txt, so Play retraces Java stacks itself.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Add x:DataType to all pages and controls for compiled bindings, migrate
from deprecated Application.Current.MainPage to Windows[0].Page API,
suppress expected analyzer warnings (XC0023, CS0618, CA1422), and add
Newtonsoft.Json dependency.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
OfType<IX509TrustManager>() returns empty on Android because CLR type
checking does not work against Java proxy objects. JavaCast<> is the
correct API for casting Java-backed objects in MAUI Android bindings.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Footer links now stack vertically instead of horizontal row
- Nav "Download" button scrolls to the #download CTA section
instead of linking directly to the App Store
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Triggers a preview deployment on pull requests that touch landing/
files. Posts the preview URL as a comment on the PR.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Replace all iOS-only references with iOS + Android across the landing
page, meta tags, footer, and privacy policy. Convert Play Store
"Coming Soon" placeholders into active Google Play links.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Add FabBackgroundColor / FabTextColor theme keys so the FAB is always
visible: dark background + white icon in light mode, white background +
dark icon in dark mode.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Move the host label to its own line so it truncates properly before
the edit/delete buttons. Move the lock icon and scheme badge pill to
a separate third line below the host.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Switch symbol key widgets from Button to TextView to bypass Android
Material theme button text-color overrides, giving full control over
the key label color in both light and dark themes.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Remove backdrop inset:0 that was intercepting all canvas touches;
backdrop is now pointer-events:none and only covers the area above
the panel (bottom: 55%) so touch events reach the canvas
- Replace blanket `if (panelOpen) return` in handleStart with a guard
that only skips the two-finger pinch (handled by its own listener),
restoring single-finger pan, node tap, and pinch-zoom while panel
is open
- Add user-scalable=no viewport flag to prevent WebView native zoom
from scaling the panel UI
- Add singleTapTimer for double-tap detection: single tap delays 350ms
so double-tap is distinguished and only triggers expand/collapse
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Wrap the logo image in a white rounded Border so it remains visible
regardless of the system theme.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Tint toolbar navigation (back) icon white alongside overflow icon
- Add resoftware.png and logo.png as MauiImage resources (were only AndroidAssets)
- Copy resoftware.png to Android Resources for accessibility
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Settings:
- Add Editor section with auto-capitalize and auto-zoom toggles (blue when on)
- Reorder sections: Editor, Data, Support, About
- Move footer ("A product of" + logo) inside scroll instead of fixed at bottom
AddConnection:
- Add editable Name field at top of form
- Remove colons from field labels
- Save uses Name field instead of popup prompt
- Name falls back to host if left empty
- Fix UpdateConnectionString to persist Name field
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Android symbols bar:
- Rewrite using GlobalLayout + GetWindowVisibleDisplayFrame for reliable keyboard detection
- Toolbar attached once to content view, toggled via visibility (fixes crash)
- Pill-shaped container with themed colors, scrollable symbol strip
- Blue circle play icon (centered TextView), disabled when query empty
- Add symbols: { } \" ' . = * $
iOS symbols bar:
- Add same extra symbols to match Android
- Hide accessory when keyboard dismissed via external gesture
Auto-capitalize (both platforms):
- Cypher keywords auto-uppercased after cursor moves past them
- Respects auto_capitalize preference from Settings
- Skips capitalization while cursor is at end of word (no fighting while typing)
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- Replace basic popup with animated slide-up panel using app theme colors
- Add action buttons: Copy text, Show JSON (inline with copy), Relations list
- Panel is bi-directional draggable: swipe down to dismiss, drag up to expand
- Panel view states: properties, JSON, relations with navigation between them
- Auto-zoom and center on node tap (accounts for panel height)
- Delayed zoom after expand so physics can settle nodes first
- Notify C# on panel open/close to expand inline WebView height
- Add backdrop overlay to dismiss panel on outside tap
- Toast notification for clipboard copies
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- Replace hardcoded VS Code-like muted colors with CSS variables
- Use app theme palette for backgrounds, text, strings, numbers, keys
- Add font-weight to keys, increase font size and line-height
- Increase bracket/comma opacity for better readability
- Dynamic theme switching via setTheme() updates all new variables
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- Center no-results placeholder vertically by overlaying on Grid row
- Reduce result card height: smaller action buttons, halved graph view
- Add NavigationBarColor theme resource, use for FAB and nav bar
- Fix ApplyNavBarColors to read from theme instead of hardcoding #31333b
- Make title bar play button blue (#007AFF)
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- Android: windowBackground day/night colors fix white flash on navigation
- Android: status bar color set dynamically per theme in OnResume
- Android: AppearanceLightStatusBars set correctly (light icons in dark, dark in light)
- Android: overflow icon tinted white via view-tree walk in OnWindowFocusChanged
- AddConnection: reorder buttons Test → Connect → Save; Save is now primary (filled)
- SessionPage: saved queries header row fully tappable (not just chevron)
- SessionPage: QueryEditor BackgroundColor/TextColor use DynamicResource for live theme switching
- LightTheme: add Editor style so colors reset correctly when switching dark→light
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Version is now auto-generated as 1.0.<run_number> and a matching
git tag is created by the release step on each successful build.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Triggers on version tags (v*) or manual dispatch (with track selection).
- Builds signed APK → uploads to GitHub Release as downloadable asset
- Builds signed AAB → uploads to Play Store (default: internal track)
- Version code driven by GITHUB_RUN_NUMBER; display version from git tag
- Release notes read from distribution/whatsnew/whatsnew-en-US
Required secrets: KEYSTORE_BASE64, KEYSTORE_ALIAS, KEYSTORE_KEY_PASS,
KEYSTORE_STORE_PASS, PLAY_SERVICE_ACCOUNT_JSON
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Move all action buttons (star, expand, JSON, trash) into each result card header
- Always show query text in result cards (no conditional hiding)
- Saved queries section permanently visible above results, collapsible via chevron
- Result cards collapsible via per-card chevron toggle
- Add drop shadow and remove border around query text
- Clear query field after execute; tap result query label to reload it into editor
- WebView re-renders HTML on App.ThemeChanged for instant dark/light switch
- Result card trash, delete result, save/load query, open graph/table all work per-card
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Hint overlay is dismissed on first pan/zoom/click via iframe app://interaction
signal from the vis.js event handler.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Remove green dot IsActive indicator from ConnectionCell (no longer needed)
- ConnectionsPage subscribes to App.ThemeChanged and reloads list on switch
- Simplify ConnectionCell to single StackLayout (no converter dependency)
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Replace BoltGraphClient.ConnectAsync() which swallowed AuthenticationException
with an explicit RETURN 1 query via raw driver session; fails fast on wrong password.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Add static App.ThemeChanged event fired after resource dictionary swap
- Pages/controls subscribe OnAppearing and call reload on change
- Themes include Extreme/SecondaryTextColor tokens for dark and light
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Set colorPrimary/colorPrimaryDark/colorAccent to dark app colors (#31333b)
- Fix contextual action bar (CAB) background to match nav bar color
- Fix overflow button (3-dot) tint to white via OverflowMenuButton style
- Fix white-on-white popup menu text: remove global android:textColorPrimary
override; scope white text only to CAB via ActionModeStyle/ActionModeTitleText
- Add android:windowLightStatusBar=false so status bar icons are white on dark bg
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>