Skip to content

chore(deps): Play Billing 9, play-services-auth 22, Firebase BoM 35, google-java-format 2.0 - #183

Merged
pasichDev merged 7 commits into
masterfrom
chore/major-dependency-bumps
Nov 13, 2026
Merged

pasichDev merged 7 commits into
masterfrom
chore/major-dependency-bumps

Conversation

@pasichDev

@pasichDev pasichDev commented Nov 13, 2026 •

Copy link
Copy Markdown
Owner

Dependencies

Library From To
Play Billing 8.3.0 9.1.0
play-services-auth 21.4.0 22.0.0
Firebase BoM (firebase-auth 25.0.0) 34.18.0 35.2.0
google-java-format 1.22.0 2.0.0
  • Play Billing 9: none of the APIs the app uses changed (setSkuDetails, removed, was unused). Behaviour change: a Play Store blocked by the system (an OEM kids mode, for example) now answers BILLING_UNAVAILABLE instead of ERROR; see the billing fixes below.
  • play-services-auth 22: removes the legacy Google Sign-In APIs. The app uses Credential Manager and Identity/AuthorizationClient, which remain. proguard-rules.pro has -dontwarn com.google.android.gms.**, which would hide missing classes from R8, so every gms class referenced by credentials-play-services-auth 1.6.0 was checked against 22.0.0: none are missing.
  • Firebase BoM 35: its breaking change is minSdk 24; the app's minSdk is 26.
  • google-java-format 2.0 runs on Java 21. The Gradle daemon already uses the JDK 21 toolchain (gradle/gradle-daemon-jvm.properties); CI now sets up JDK 21 too. The app still compiles for Java 17.

Billing fixes (from review)

  • BILLING_UNAVAILABLE reads "Google Play billing is not available on this device" instead of "Billing API version is not supported".
  • Donations are sorted by getPriceAmountMicros(); parsing the formatted price read "¥1,000" as 1.0.
  • enableAutoServiceReconnection(): a dropped Play Store service reconnects on the next call instead of failing until the screen is reopened.
  • A purchase completed while the app was closed (or a pending one that settled) is thanked after its consume succeeds instead of being consumed silently.
  • Purchases are queried once per screen open instead of twice.

Tests: DonationProductTest, BillingManagerErrorMessageTest.

Commits

Review commit by commit. 8e4e556 is formatting only (74 files are identical with all whitespace removed) and is listed in .git-blame-ignore-revs, so merge with a merge commit, not squash or rebase, or the listed hash will not exist on master. The formatter version change is its own commit (2e3b344), so blame still shows it.

Verification

./gradlew spotlessCheck test lint assembleRelease passes locally. The donation flow still needs a manual check on a device with a Play test account.

…BoM 35.2.0

- Play Billing 8.3.0 -> 9.1.0. No API the app uses changed. One behaviour
  change: when the system blocks the Play Store (for example an OEM kids
  mode), billing now answers BILLING_UNAVAILABLE instead of ERROR, which
  BillingManager already reports as an unavailable billing service.
- play-services-auth 21.4.0 -> 22.0.0. 22.0.0 removes the legacy Google
  Sign-In APIs; the app signs in through Credential Manager and authorizes
  Drive through Identity/AuthorizationClient, which remain. Every gms class
  credentials-play-services-auth 1.6.0 references is still present.
- Firebase BoM 34.18.0 -> 35.2.0 (firebase-auth 25.0.0). Its breaking change
  is minSdk 24; the app's minSdk is 26.
@pasichDev
pasichDev changed the base branch from chore/upgrade-gradle-agp-plugins to master November 13, 2026 10:57
@github-actions

github-actions Bot commented Nov 13, 2026 •

Copy link
Copy Markdown

Test coverage (unit + instrumentation)

Overall Project 18.03% -4.54% 🍏
Files changed 11.16% 🍏

Module Coverage
debug 19.71% -4.45% 🍏
debug 16.36% -4.62% 🍏
Files
Module File Coverage
debug GoogleDriveSyncBackend.java 89.83% 🍏
FirebaseGoogleAuth.java 67.33% -10.89% 🍏
SyncMutationCoordinator.java 65.37% -27.65% 🍏
TagsSorter.java 56% -32% 🍏
MainPresenter.java 54.87% -2.35% 🍏
DonationProduct.java 46.58% 🍏
MoreNoteDialogPresenter.java 6.84% -2.61% 🍏
GoogleDriveAuthorization.java 4.41% -21.32% 🍏
BillingManager.java 3.82% -24.11% 🍏
BackupPresenter.java 2.61% -12.92% 🍏
ImportDataFragment.java 0% -38.55% 🍏
AccountSyncFragment.java 0% -24.47% 🍏
MyApp.java 0% -64.41% 🍏
ChangelogActivity.java 0% -21.05% 🍏
TasksActivity.java 0% -12.85% 🍏
BackupActivity.java 0% -15.94% 🍏
PhotoViewActivity.java 0% -17% 🍏
SnoozeActivity.java 0% -13.89% 🍏
SupportActivity.java 0% -26.93% 🍏
MainActivity.java 0% -1.74% 🍏
ShareActivity.java 0% -9.04% 🍏
BootReceiver.java 0% -34.04% 🍏
ReminderReceiver.java 0% -3.51% 🍏
MeetEnclyDialog.java 0% -29.82% 🍏
NoteVersionSheet.java 0% -6.14% 🍏
ShareOptionsDialog.java 0% -23.13% 🍏
MoreNoteDialog.java 0% -29.25% 🍏
OtherAppImportDialog.java 0% -11.11% 🍏
CustomRepeatDialog.java 0% -7.64% 🍏
UpdateChangelogDialog.java 0% -50.86% 🍏
BackupOptionsDialog.java 0% -32.97% 🍏
TaskReminderPickerBottomSheet.java 0% -19.51% 🍏
ReminderPickerBottomSheet.java 0% -4.89% 🍏
EditorJSInterface.java 0% -19.09% 🍏
AppDataManager.java 0% -4.85% 🍏
TasksAdapter.java 0% -3.87% 🍏
CopyNoteAnimationUtil.java 0% -15.38% 🍏
AttachmentActionsDialog.java 0% -13.8% 🍏
ThankedPurchases.java 0% 🍏
NoteDragCallback.java 0% -4.55% 🍏
SelectionController.java 0% -9.9% 🍏
AppDbHelper.java 0% -15.88% 🍏
AppDatabase.java 0% 🍏
InterfaceSettingsFragment.java 0% -16.72% 🍏
MediaSettingsFragment.java 0% -24.43% 🍏
InteractionSettingsFragment.java 0% -3.82% 🍏
TagsManagementAdapter.java 0% -24.87% 🍏
AccentColorAdapter.java 0% -22.32% 🍏
DonationProductAdapter.java 0% -4% 🍏
NoteActivity.java 0% -7.16% 🍏
NoteExtendedEditorActivity.java 0% -12.35% 🍏
PopupWindowsTag.java 0% -17.41% 🍏
RoomSyncStore.java 0% -11.89% 🍏
TwoSideSwitchView.java 0% -12.37% 🍏
EditorKeyboardBar.java 0% -9.28% 🍏
EnclyMigrationRepository.java 0% -12% 🍏
NoteViewStateStore.java 0% -7.27% 🍏
TagsAdapter.java 0% -26.06% 🍏
NavigationController.java 0% -24.54% 🍏
SearchController.java 0% -15.88% 🍏
DeleteTagDialog.java 0% -25.23% 🍏
ViewOptionsDialog.java 0% -24.49% 🍏
NameTagDialog.java 0% -5.91% 🍏
TagOptionsBottomSheet.java 0% -30.22% 🍏
SingleTagSelectDialog.java 0% -15.89% 🍏
AllTagSelectDialog.java 0% -15% 🍏
SyncCoordinatorFactory.java 0% -6.54% 🍏
NoteEditorView.java 0% -9.36% 🍏
NoteAdapter.java 0% -1.85% 🍏
debug AppDatabase.java 82.66% 🍏
RoomSyncStore.java 81.67% -0.53% 🍏
BootReceiver.java 68.09% -12.77% 🍏
MyApp.java 62.71% -37.29% 🍏
NoteViewStateStore.java 12.79% -7.27% 🍏
DonationProduct.java 0% -16.44% 🍏
ImportDataFragment.java 0% -38.55% 🍏
AccountSyncFragment.java 0% -24.47% 🍏
GoogleDriveAuthorization.java 0% -21.32% 🍏
FirebaseGoogleAuth.java 0% -38.61% 🍏
ChangelogActivity.java 0% -21.05% 🍏
TasksActivity.java 0% -12.85% 🍏
BackupActivity.java 0% -15.94% 🍏
PhotoViewActivity.java 0% -17% 🍏
SnoozeActivity.java 0% -13.89% 🍏
SupportActivity.java 0% -26.93% 🍏
MainActivity.java 0% -1.74% 🍏
ShareActivity.java 0% -9.04% 🍏
ReminderReceiver.java 0% -3.51% 🍏
TagsSorter.java 0% -69.33% 🍏
MeetEnclyDialog.java 0% -29.82% 🍏
NoteVersionSheet.java 0% -6.14% 🍏
ShareOptionsDialog.java 0% -23.13% 🍏
MoreNoteDialog.java 0% -29.25% 🍏
OtherAppImportDialog.java 0% -11.11% 🍏
CustomRepeatDialog.java 0% -7.64% 🍏
UpdateChangelogDialog.java 0% -50.86% 🍏
BackupOptionsDialog.java 0% -32.97% 🍏
TaskReminderPickerBottomSheet.java 0% -19.51% 🍏
ReminderPickerBottomSheet.java 0% -4.89% 🍏
EditorJSInterface.java 0% -19.09% 🍏
AppDataManager.java 0% -4.85% 🍏
TasksAdapter.java 0% -3.87% 🍏
CopyNoteAnimationUtil.java 0% -15.38% 🍏
AttachmentActionsDialog.java 0% -13.8% 🍏
ThankedPurchases.java 0% 🍏
BillingManager.java 0% -24.34% 🍏
NoteDragCallback.java 0% -4.55% 🍏
SelectionController.java 0% -9.9% 🍏
AppDbHelper.java 0% -15.88% 🍏
MainPresenter.java 0% -3.07% 🍏
BackupPresenter.java 0% -12.92% 🍏
InterfaceSettingsFragment.java 0% -16.72% 🍏
MediaSettingsFragment.java 0% -24.43% 🍏
InteractionSettingsFragment.java 0% -3.82% 🍏
TagsManagementAdapter.java 0% -24.87% 🍏
AccentColorAdapter.java 0% -22.32% 🍏
DonationProductAdapter.java 0% -4% 🍏
NoteActivity.java 0% -7.16% 🍏
NoteExtendedEditorActivity.java 0% -12.35% 🍏
PopupWindowsTag.java 0% -17.41% 🍏
GoogleDriveSyncBackend.java 0% -1.27% 🍏
SyncMutationCoordinator.java 0% -53.78% 🍏
TwoSideSwitchView.java 0% -12.37% 🍏
EditorKeyboardBar.java 0% -9.28% 🍏
MoreNoteDialogPresenter.java 0% -2.61% 🍏
EnclyMigrationRepository.java 0% -12% 🍏
TagsAdapter.java 0% -26.06% 🍏
NavigationController.java 0% -24.54% 🍏
SearchController.java 0% -15.88% 🍏
DeleteTagDialog.java 0% -25.23% 🍏
ViewOptionsDialog.java 0% -24.49% 🍏
NameTagDialog.java 0% -5.91% 🍏
TagOptionsBottomSheet.java 0% -30.22% 🍏
SingleTagSelectDialog.java 0% -15.89% 🍏
AllTagSelectDialog.java 0% -15% 🍏
SyncCoordinatorFactory.java 0% -6.54% 🍏
NoteEditorView.java 0% -9.36% 🍏
NoteAdapter.java 0% -1.85% 🍏

Formatter version only; the codebase is reformatted in the next commit. google-java-format 2.0 runs on Java 21; the Gradle daemon already runs on JDK 21 through gradle/gradle-daemon-jvm.properties.
Formatting only, produced by ./gradlew spotlessApply; no code changes. The
commit is listed in .git-blame-ignore-revs.
google-java-format 2.0 needs Java 21. The Gradle daemon already runs on the JDK 21 toolchain from gradle/gradle-daemon-jvm.properties; setting it up in CI too stops spotlessCheck from depending on a toolchain download. The app still compiles for Java 17 (compileOptions).
- BILLING_UNAVAILABLE now reads "Google Play billing is not available on
  this device". Since Billing 9 it also covers a Play Store blocked by the
  system (an OEM kids mode), and the purchase path showed "Billing API
  version is not supported".
- Donations are sorted by getPriceAmountMicros() instead of by parsing the
  formatted price, which read "¥1,000" as 1.0 and listed it as the cheapest.
- enableAutoServiceReconnection(): a dropped Play Store service reconnects
  on the next call, instead of every donation tap failing with "Billing
  service not connected" until the screen is reopened.
- A purchase the user was never thanked for (completed while the app was
  closed, or a pending purchase that settled in the background) is now
  thanked once its consume succeeds, instead of being consumed silently.
- Purchases are queried once per screen open, not twice: SupportActivity
  already queries them when billing is initialized.
@pasichDev
pasichDev force-pushed the chore/major-dependency-bumps branch from b624cab to 2c12c52 Compare November 13, 2026 11:07
… a failed setup

Second review round on the Play Billing 9 fixes:

- Thanks for purchases the user never saw are given only when billing
  connects, once for the whole batch, instead of once per purchase. The
  pre-purchase cleanup and the ITEM_ALREADY_OWNED path consume silently
  again: they showed "Purchase successful" before a purchase sheet opened,
  or next to "Item already owned".
- A donation thanked in the purchase flow is remembered (ThankedPurchases,
  keyed by purchase token) until its consume succeeds, so a failed consume
  is not thanked a second time when the purchase comes back.
- The isServiceConnected gate is gone. It was set only by a successful first
  setup, so a failed setup refused every call for the life of the screen,
  which automatic service reconnection would otherwise recover from.
- destroy() ends the connection unconditionally: a dropped client is not
  ready but still reconnects for a call in flight.
- The unused five-argument DonationProduct constructor is removed, so a
  caller cannot silently create a product without a price.
@pasichDev
pasichDev merged commit 06c03ed into master Nov 13, 2026
4 checks passed
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.

1 participant