Skip to content

Add Glovo, hidden Diagnostics gesture, and food provider picker - #83

Merged
neteinstein merged 3 commits into
mainfrom
claude/app-update-failure-t02jta
Sep 2, 2026
Merged

neteinstein merged 3 commits into
mainfrom
claude/app-update-failure-t02jta

Conversation

@neteinstein

Copy link
Copy Markdown
Owner

Summary

  • Comparison configuration section in Settings (above Updates): pick exactly 2 of Uber Eats / Bolt Food / Glovo to compare on "Search Food". Tapping a third option swaps out whichever of the current 2 was picked least recently, so the pair never drops below or exceeds 2. Persisted via a new ComparisonConfigRepository (SharedPreferences), defaulting to Uber Eats + Bolt Food.
  • Added Glovo as a third food delivery provider - package name (com.glovo) confirmed via the Play Store listing; the search deep link is a best-effort guess since no shipped manifest was available to verify a host against (unlike Bolt Food's confirmed /search App Link). Fully documented, including confidence level, in docs/DEEP_LINKS.md (Bolt deep link is broken #5).
  • Generalized the food search plumbing (FoodDeliveryProvider enum, FoodDeepLinks.createSearchLink, MainViewModel, MainActivity) from a hardcoded Uber Eats/Bolt Food pair to whichever 2 providers are currently selected.
  • Diagnostics (Bolt Link Lab) in Settings is now hidden until the Settings title is tapped 10 times, keeping it out of regular users' way while still reachable for on-device deep-link debugging.
  • Changed the main screen's primary button text from "Compare" to "Compare Trips".

Bonus fix

While wiring up isAppInstalled() for the food providers, found that the manifest's <queries> block only listed the ride apps (com.ubercab, ee.mtakso.client) - on API 30+, PackageManager.getPackageInfo() for any package not in that list throws NameNotFoundException regardless of whether it's actually installed, which means the food-app "installed" warnings were silently broken on modern Android. Added com.ubercab.eats, com.bolt.deliveryclient, and com.glovo to <queries>.

Test plan

  • Added/updated unit tests: FoodDeepLinksTest, MainViewModelFoodSearchTest, ComparisonConfigRepositoryImplTest (new), SettingsViewModelTest (new, covers the 10-tap gesture and the exactly-2 swap logic)
  • Updated MainActivityEspressoTest for the new button text
  • Could not run ./gradlew test/lint locally in this sandbox (network egress to dl.google.com for the Android Gradle Plugin is blocked here) - relying on CI (PR Check workflow) to validate

🤖 Generated with Claude Code

https://claude.ai/code/session_01147MnP2Vf5sDY2BT7UhBbn


Generated by Claude Code

claude and others added 3 commits September 2, 2026 06:58
Confirmed via CI logs (release.yml run for v1.0.0.41) that
KEYSTORE_FILE/KEYSTORE_PASSWORD/KEY_ALIAS/KEY_PASSWORD are all empty in
this repo, so app/build.gradle's release build falls back to debug
signing. Each GitHub Actions job runs on a fresh, ephemeral VM with no
persisted ~/.android/debug.keystore, so that fallback generates a new,
different debug keystore on every run - meaning every published GitHub
Release APK is signed with a different certificate than the previous
one.

Android refuses to install an update whose signing certificate doesn't
match the currently-installed app's, so the in-app "Update to latest"
flow always downloads the new APK successfully and then always fails
at install time, regardless of network conditions or device.

Add a guard step that fails the workflow with a clear error instead of
silently publishing another release nobody can update to, until the
real signing secrets are configured in the repo.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01147MnP2Vf5sDY2BT7UhBbn
- Comparison configuration section in Settings (above Updates): pick
  exactly 2 of Uber Eats / Bolt Food / Glovo to compare on "Search
  Food". Tapping a third option swaps out whichever of the current 2
  was picked least recently, so the pair never drops below or exceeds
  2. Persisted via a new ComparisonConfigRepository (SharedPreferences),
  defaulting to Uber Eats + Bolt Food.
- Added Glovo as a third food delivery provider: package name
  (com.glovo) confirmed via the Play Store listing, search deep link
  is a best-effort guess (documented, along with everything else known
  about these deep links, in docs/DEEP_LINKS.md #5) since no shipped
  manifest was available to verify a host against, unlike Bolt Food.
- Generalized the food search plumbing (FoodDeliveryProvider enum,
  FoodDeepLinks.createSearchLink, MainViewModel, MainActivity) from a
  hardcoded Uber Eats/Bolt Food pair to whichever 2 providers are
  currently selected.
- Fixed a latent package-visibility bug found while wiring this up:
  the manifest's <queries> block only listed the ride apps, so
  PackageManager.getPackageInfo() for the food apps (isAppInstalled)
  would throw NameNotFoundException on API 30+ regardless of whether
  they were actually installed. Added all three food package names.
- Diagnostics (Bolt Link Lab) in Settings is now hidden until the
  Settings title is tapped 10 times, keeping it out of regular users'
  way while still reachable for on-device deep-link debugging.
- Changed the main screen's primary button text from "Compare" to
  "Compare Trips".

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01147MnP2Vf5sDY2BT7UhBbn
@neteinstein
neteinstein merged commit cc5b58d into main Sep 2, 2026
1 check passed
@neteinstein
neteinstein deleted the claude/app-update-failure-t02jta branch September 2, 2026 07:33
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