Skip to content

Release 8.25.0#2736

Closed
vegaro wants to merge 85 commits intomainfrom
previous-major
Closed

Release 8.25.0#2736
vegaro wants to merge 85 commits intomainfrom
previous-major

Conversation

@vegaro
Copy link
Copy Markdown
Member

@vegaro vegaro commented Oct 15, 2025

RevenueCat SDK

Note

This release brings all non-breaking changes between SDK versions 9.6.0 and 9.11.0 to major 8, so developers that don't/can't use major 9, can still get the latest updates. meant to be bought only once, for example, lifetime subscriptions.

✨ New Features

🐞 Bugfixes

RevenueCatUI SDK

Paywallv2

✨ New Features

🐞 Bugfixes

Customer Center

✨ New Features

🐞 Bugfixes

🔄 Other Changes

revenuecat-ops and others added 30 commits July 9, 2025 17:23
While CEC already had the `storefrontCountryCode`, this also adds the
APIs `getStorefrontCountryCode` and `awaitStorefrontCountryCode` to the
CEC flavor.
### Description
This fixes the previews for the `Switch` component so we can preview the
checked state. They weren't working since they tried to use an unused
property `defaultValue`, which is removed in this PR. The component uses
the selected tab index to know whether the switch should be checked or
not.
This updates the CustomEntitlementComputation sample app to kotlin
1.8.22. This is needed after dropping support for 1.7 in #2493
### Description

Bump AGP to 8.10.1 and Gradle to 8.14.2.
This PR contains the following updates:

| Package | Type | Update | Change |
|---|---|---|---|
| [gradle](https://gradle.org)
([source](https://redirect.github.com/gradle/gradle)) | | minor |
`8.10.2` -> `8.14.2` |
| [gradle](https://gradle.org)
([source](https://redirect.github.com/gradle/gradle)) | | minor | `8.9`
-> `8.14.2` |
| [com.android.library](https://developer.android.com/studio/build)
([source](https://android.googlesource.com/platform/tools/base)) |
plugin | minor | `8.8.0` -> `8.11.0` |
| [com.android.application](https://developer.android.com/studio/build)
([source](https://android.googlesource.com/platform/tools/base)) |
plugin | minor | `8.8.0` -> `8.11.0` |
| [com.android.application](https://developer.android.com/studio/build)
([source](https://android.googlesource.com/platform/tools/base)) |
plugin | minor | `8.1.3` -> `8.11.0` |

---

### Release Notes

<details>
<summary>gradle/gradle (gradle)</summary>

###
[`v8.14.2`](https://redirect.github.com/gradle/gradle/releases/tag/v8.14.2):
8.14.2

[Compare
Source](https://redirect.github.com/gradle/gradle/compare/v8.14.1...v8.14.2)

The Gradle team is excited to announce Gradle 8.14.2.

Here are the highlights of this release:

- Java 24 support
- GraalVM Native Image toolchain selection
- Enhancements to test reporting
- Build Authoring improvements

[Read the Release
Notes](https://docs.gradle.org/8.14.2/release-notes.html)

We would like to thank the following community members for their
contributions to this release of Gradle:
[Aurimas](https://redirect.github.com/liutikas),
[Ben Bader](https://redirect.github.com/benjamin-bader),
[Björn Kautler](https://redirect.github.com/Vampire),
[chandre92](https://redirect.github.com/chandre92),
[Daniel Hammer](https://redirect.github.com/dlehammer),
[Danish Nawab](https://redirect.github.com/danishnawab),
[Florian Dreier](https://redirect.github.com/DreierF),
[Ivy Chen](https://redirect.github.com/Mengmeiivy),
[Jendrik Johannes](https://redirect.github.com/jjohannes),
[jimmy1995-gu](https://redirect.github.com/jimmy1995-gu),
[Madalin Valceleanu](https://redirect.github.com/vmadalin),
[Na Minhyeok](https://redirect.github.com/NaMinhyeok).

##### Upgrade instructions

Switch your build to use Gradle 8.14.2 by updating your wrapper:

```
./gradlew wrapper --gradle-version=8.14.2 && ./gradlew wrapper
```

See the Gradle [8.x upgrade
guide](https://docs.gradle.org/8.14.2/userguide/upgrading_version_8.html)
to learn about deprecations, breaking changes and other considerations
when upgrading.

For Java, Groovy, Kotlin and Android compatibility, see the [full
compatibility
notes](https://docs.gradle.org/8.14.2/userguide/compatibility.html).

##### Reporting problems

If you find a problem with this release, please file a bug on [GitHub
Issues](https://redirect.github.com/gradle/gradle/issues) adhering to
our issue guidelines.
If you're not sure you're encountering a bug, please use the
[forum](https://discuss.gradle.org/c/help-discuss).

We hope you will build happiness with Gradle, and we look forward to
your feedback via [Twitter](https://twitter.com/gradle) or on
[GitHub](https://redirect.github.com/gradle).

###
[`v8.14.1`](https://redirect.github.com/gradle/gradle/releases/tag/v8.14.1):
8.14.1

[Compare
Source](https://redirect.github.com/gradle/gradle/compare/v8.14.0...v8.14.1)

The Gradle team is excited to announce Gradle 8.14.1.

[Read the Release
Notes](https://docs.gradle.org/8.14.1/release-notes.html)

We would like to thank the following community members for their
contributions to this release of Gradle:
[Aurimas](https://redirect.github.com/liutikas),
[Ben Bader](https://redirect.github.com/benjamin-bader),
[Björn Kautler](https://redirect.github.com/Vampire),
[chandre92](https://redirect.github.com/chandre92),
[Daniel Hammer](https://redirect.github.com/dlehammer),
[Danish Nawab](https://redirect.github.com/danishnawab),
[Florian Dreier](https://redirect.github.com/DreierF),
[Ivy Chen](https://redirect.github.com/Mengmeiivy),
[Jendrik Johannes](https://redirect.github.com/jjohannes),
[jimmy1995-gu](https://redirect.github.com/jimmy1995-gu),
[Madalin Valceleanu](https://redirect.github.com/vmadalin),
[Na Minhyeok](https://redirect.github.com/NaMinhyeok).

##### Upgrade instructions

Switch your build to use Gradle 8.14.1 by updating your wrapper:

```
./gradlew wrapper --gradle-version=8.14.1 && ./gradlew wrapper
```

See the Gradle [8.x upgrade
guide](https://docs.gradle.org/8.14.1/userguide/upgrading_version_8.html)
to learn about deprecations, breaking changes and other considerations
when upgrading.

For Java, Groovy, Kotlin and Android compatibility, see the [full
compatibility
notes](https://docs.gradle.org/8.14.1/userguide/compatibility.html).

##### Reporting problems

If you find a problem with this release, please file a bug on [GitHub
Issues](https://redirect.github.com/gradle/gradle/issues) adhering to
our issue guidelines.
If you're not sure you're encountering a bug, please use the
[forum](https://discuss.gradle.org/c/help-discuss).

We hope you will build happiness with Gradle, and we look forward to
your feedback via [Twitter](https://twitter.com/gradle) or on
[GitHub](https://redirect.github.com/gradle).

###
[`v8.14`](https://redirect.github.com/gradle/gradle/releases/tag/v8.14.0):
8.14

[Compare
Source](https://redirect.github.com/gradle/gradle/compare/v8.13.0...v8.14.0)

The Gradle team is excited to announce Gradle 8.14.

[Read the Release
Notes](https://docs.gradle.org/8.14/release-notes.html)

We would like to thank the following community members for their
contributions to this release of Gradle:
[Aurimas](https://redirect.github.com/liutikas),
[Ben Bader](https://redirect.github.com/benjamin-bader),
[Björn Kautler](https://redirect.github.com/Vampire),
[chandre92](https://redirect.github.com/chandre92),
[Daniel Hammer](https://redirect.github.com/dlehammer),
[Danish Nawab](https://redirect.github.com/danishnawab),
[Florian Dreier](https://redirect.github.com/DreierF),
[Ivy Chen](https://redirect.github.com/Mengmeiivy),
[Jendrik Johannes](https://redirect.github.com/jjohannes),
[jimmy1995-gu](https://redirect.github.com/jimmy1995-gu),
[Madalin Valceleanu](https://redirect.github.com/vmadalin),
[Na Minhyeok](https://redirect.github.com/NaMinhyeok).

##### Upgrade instructions

Switch your build to use Gradle 8.14 by updating your wrapper:

```
./gradlew wrapper --gradle-version=8.14 && ./gradlew wrapper
```

See the Gradle [8.x upgrade
guide](https://docs.gradle.org/8.14/userguide/upgrading_version_8.html)
to learn about deprecations, breaking changes and other considerations
when upgrading.

For Java, Groovy, Kotlin and Android compatibility, see the [full
compatibility
notes](https://docs.gradle.org/8.14/userguide/compatibility.html).

##### Reporting problems

If you find a problem with this release, please file a bug on [GitHub
Issues](https://redirect.github.com/gradle/gradle/issues) adhering to
our issue guidelines.
If you're not sure you're encountering a bug, please use the
[forum](https://discuss.gradle.org/c/help-discuss).

We hope you will build happiness with Gradle, and we look forward to
your feedback via [Twitter](https://twitter.com/gradle) or on
[GitHub](https://redirect.github.com/gradle).

###
[`v8.13`](https://redirect.github.com/gradle/gradle/releases/tag/v8.13.0):
8.13

[Compare
Source](https://redirect.github.com/gradle/gradle/compare/v8.12.1...v8.13.0)

The Gradle team is excited to announce Gradle 8.13.

[Read the Release
Notes](https://docs.gradle.org/8.13/release-notes.html)

We would like to thank the following community members for their
contributions to this release of Gradle:
[Adam](https://redirect.github.com/adam-enko),
[Adam](https://redirect.github.com/aSemy),
[Ahmad Al-Masry](https://redirect.github.com/AhmadMasry),
[Ahmed Ehab](https://redirect.github.com/ahmedehabb),
[Aurimas](https://redirect.github.com/liutikas),
[Baptiste Decroix](https://redirect.github.com/bdecroix-spiria),
[Björn Kautler](https://redirect.github.com/Vampire),
[Borewit](https://redirect.github.com/Borewit),
[Jorge Matamoros](https://redirect.github.com/YungOkra),
[Lei Zhu](https://redirect.github.com/Korov),
[Madalin Valceleanu](https://redirect.github.com/vmadalin),
[Mohammed Thavaf](https://redirect.github.com/mthavaf),
[Patrick Brückner](https://redirect.github.com/madmuffin1),
[Philip Wedemann](https://redirect.github.com/hfhbd),
[Roberto Perez Alcolea](https://redirect.github.com/rpalcolea),
[Róbert Papp](https://redirect.github.com/TWiStErRob),
[Semyon Gaschenko](https://redirect.github.com/gasches),
[Shi Chen](https://redirect.github.com/CsCherrYY),
[Stefan M.](https://redirect.github.com/StefMa),
[Steven Schoen](https://redirect.github.com/DSteve595),
[tg-freigmbh](https://redirect.github.com/tg-freigmbh),
[TheGoesen](https://redirect.github.com/TheGoesen),
[Tony Robalik](https://redirect.github.com/autonomousapps),
[Zongle Wang](https://redirect.github.com/Goooler).

##### Upgrade instructions

Switch your build to use Gradle 8.13 by updating your wrapper:

```
./gradlew wrapper --gradle-version=8.13 && ./gradlew wrapper
```

See the Gradle [8.x upgrade
guide](https://docs.gradle.org/8.13/userguide/upgrading_version_8.html)
to learn about deprecations, breaking changes and other considerations
when upgrading.

For Java, Groovy, Kotlin and Android compatibility, see the [full
compatibility
notes](https://docs.gradle.org/8.13/userguide/compatibility.html).

##### Reporting problems

If you find a problem with this release, please file a bug on [GitHub
Issues](https://redirect.github.com/gradle/gradle/issues) adhering to
our issue guidelines.
If you're not sure you're encountering a bug, please use the
[forum](https://discuss.gradle.org/c/help-discuss).

We hope you will build happiness with Gradle, and we look forward to
your feedback via [Twitter](https://twitter.com/gradle) or on
[GitHub](https://redirect.github.com/gradle).

###
[`v8.12.1`](https://redirect.github.com/gradle/gradle/releases/tag/v8.12.1):
8.12.1

[Compare
Source](https://redirect.github.com/gradle/gradle/compare/v8.12.0...v8.12.1)

The Gradle team is excited to announce Gradle 8.12.1.

[Read the Release
Notes](https://docs.gradle.org/8.12.1/release-notes.html)

We would like to thank the following community members for their
contributions to this release of Gradle:
[Abhiraj Adhikary](https://redirect.github.com/abhirajadhikary06),
[Ayush Saxena](https://redirect.github.com/Ayushcode10),
[Björn Kautler](https://redirect.github.com/Vampire),
[davidburstrom](https://redirect.github.com/davidburstrom),
[Dominic Fellbaum](https://redirect.github.com/felldo),
[Emmanuel Ferdman](https://redirect.github.com/emmanuel-ferdman),
[Finn Petersen](https://redirect.github.com/fp7),
[Johnny Lim](https://redirect.github.com/izeye),
[Mahdi Hosseinzadeh](https://redirect.github.com/mahozad),
[Martin Bonnin](https://redirect.github.com/martinbonnin),
[Paint\_Ninja](https://redirect.github.com/PaintNinja),
[Petter Måhlén](https://redirect.github.com/pettermahlen),
[Philip Wedemann](https://redirect.github.com/hfhbd),
[stegeto22](https://redirect.github.com/stegeto22),
[Tanish](https://redirect.github.com/Taz03),
[TheGoesen](https://redirect.github.com/TheGoesen),
[Tim Nielens](https://redirect.github.com/tnielens),
[Trout Zhang](https://redirect.github.com/TroutZhang),
[Victor Merkulov](https://redirect.github.com/urdak)

##### Upgrade instructions

Switch your build to use Gradle 8.12.1 by updating your wrapper:

```
./gradlew wrapper --gradle-version=8.12.1
```

See the Gradle [8.x upgrade
guide](https://docs.gradle.org/8.12.1/userguide/upgrading_version_8.html)
to learn about deprecations, breaking changes and other considerations
when upgrading.

For Java, Groovy, Kotlin and Android compatibility, see the [full
compatibility
notes](https://docs.gradle.org/8.12.1/userguide/compatibility.html).

##### Reporting problems

If you find a problem with this release, please file a bug on [GitHub
Issues](https://redirect.github.com/gradle/gradle/issues) adhering to
our issue guidelines.
If you're not sure you're encountering a bug, please use the
[forum](https://discuss.gradle.org/c/help-discuss).

We hope you will build happiness with Gradle, and we look forward to
your feedback via [Twitter](https://twitter.com/gradle) or on
[GitHub](https://redirect.github.com/gradle).

###
[`v8.12`](https://redirect.github.com/gradle/gradle/releases/tag/v8.12.0):
8.12

[Compare
Source](https://redirect.github.com/gradle/gradle/compare/v8.11.1...v8.12.0)

The Gradle team is excited to announce Gradle 8.12.

[Read the Release
Notes](https://docs.gradle.org/8.12/release-notes.html)

We would like to thank the following community members for their
contributions to this release of Gradle:
[Abhiraj Adhikary](https://redirect.github.com/abhirajadhikary06),
[Ayush Saxena](https://redirect.github.com/Ayushcode10),
[Björn Kautler](https://redirect.github.com/Vampire),
[davidburstrom](https://redirect.github.com/davidburstrom),
[Dominic Fellbaum](https://redirect.github.com/felldo),
[Emmanuel Ferdman](https://redirect.github.com/emmanuel-ferdman),
[Finn Petersen](https://redirect.github.com/fp7),
[Johnny Lim](https://redirect.github.com/izeye),
[Mahdi Hosseinzadeh](https://redirect.github.com/mahozad),
[Martin Bonnin](https://redirect.github.com/martinbonnin),
[Paint\_Ninja](https://redirect.github.com/PaintNinja),
[Petter Måhlén](https://redirect.github.com/pettermahlen),
[Philip Wedemann](https://redirect.github.com/hfhbd),
[stegeto22](https://redirect.github.com/stegeto22),
[Tanish](https://redirect.github.com/Taz03),
[TheGoesen](https://redirect.github.com/TheGoesen),
[Tim Nielens](https://redirect.github.com/tnielens),
[Trout Zhang](https://redirect.github.com/TroutZhang),
[Victor Merkulov](https://redirect.github.com/urdak)

##### Upgrade instructions

Switch your build to use Gradle 8.12 by updating your wrapper:

```
./gradlew wrapper --gradle-version=8.12
```

See the Gradle [8.x upgrade
guide](https://docs.gradle.org/8.12/userguide/upgrading_version_8.html)
to learn about deprecations, breaking changes and other considerations
when upgrading.

For Java, Groovy, Kotlin and Android compatibility, see the [full
compatibility
notes](https://docs.gradle.org/8.12/userguide/compatibility.html).

##### Reporting problems

If you find a problem with this release, please file a bug on [GitHub
Issues](https://redirect.github.com/gradle/gradle/issues) adhering to
our issue guidelines.
If you're not sure you're encountering a bug, please use the
[forum](https://discuss.gradle.org/c/help-discuss).

We hope you will build happiness with Gradle, and we look forward to
your feedback via [Twitter](https://twitter.com/gradle) or on
[GitHub](https://redirect.github.com/gradle).

###
[`v8.11.1`](https://redirect.github.com/gradle/gradle/releases/tag/v8.11.1):
8.11.1

[Compare
Source](https://redirect.github.com/gradle/gradle/compare/v8.11.0...v8.11.1)

This is a patch release for Gradle 8.11. We recommend users upgrade to
8.11.1 instead of 8.11.

It fixes the following issues:

-
[#&#8203;31268](https://redirect.github.com/gradle/gradle/issues/31268)
BuildEventsListenerRegistry corrupted with Isolated Projects and
parallel configuration
-
[#&#8203;31282](https://redirect.github.com/gradle/gradle/issues/31282)
Running executables sporadically fails with ETXTBSY (Text file busy)
-
[#&#8203;31284](https://redirect.github.com/gradle/gradle/issues/31284)
ArrayIndexOutOfBoundsException after upgrading to gradle 8.11 when
generating problems report
-
[#&#8203;31310](https://redirect.github.com/gradle/gradle/issues/31310)
Unable to run Gradle task in 8.10 due to bytecode interception

[Read the Release
Notes](https://docs.gradle.org/8.11.1/release-notes.html)

##### Upgrade instructions

Switch your build to use Gradle 8.11.1 by updating your wrapper:

```
./gradlew wrapper --gradle-version=8.11.1
```

See the Gradle [8.x upgrade
guide](https://docs.gradle.org/8.11.1/userguide/upgrading_version_8.html)
to learn about deprecations, breaking changes and other considerations
when upgrading.

For Java, Groovy, Kotlin and Android compatibility, see the [full
compatibility
notes](https://docs.gradle.org/8.11.1/userguide/compatibility.html).

##### Reporting problems

If you find a problem with this release, please file a bug on [GitHub
Issues](https://redirect.github.com/gradle/gradle/issues) adhering to
our issue guidelines.
If you're not sure you're encountering a bug, please use the
[forum](https://discuss.gradle.org/c/help-discuss).

We hope you will build happiness with Gradle, and we look forward to
your feedback via [Twitter](https://twitter.com/gradle) or on
[GitHub](https://redirect.github.com/gradle).

###
[`v8.11`](https://redirect.github.com/gradle/gradle/releases/tag/v8.11.0):
8.11

[Compare
Source](https://redirect.github.com/gradle/gradle/compare/v8.10.2...v8.11.0)

The Gradle team is excited to announce Gradle 8.11.

[Read the Release
Notes](https://docs.gradle.org/8.11/release-notes.html)

We would like to thank the following community members for their
contributions to this release of Gradle:
[Adam](https://redirect.github.com/adam-enko),
[alyssoncs](https://redirect.github.com/alyssoncs),
[Bilel MEDIMEGH](https://redirect.github.com/LelouBil),
[Björn Kautler](https://redirect.github.com/Vampire),
[Chuck Thomas](https://redirect.github.com/chuckthemole),
[Daniel Lacasse](https://redirect.github.com/lacasseio),
[Finn Petersen](https://redirect.github.com/fp7),
[JK](https://redirect.github.com/jknair0),
[Jérémie Bresson](https://redirect.github.com/jmini),
[luozexuan](https://redirect.github.com/luozexuan),
[Mahdi Hosseinzadeh](https://redirect.github.com/mahozad),
[Markus Gaisbauer](https://redirect.github.com/quijote),
[Matthew Haughton](https://redirect.github.com/3flex),
[Matthew Von-Maszewski](https://redirect.github.com/matthewvon),
[ploober](https://redirect.github.com/ploober),
[Siarhei](https://redirect.github.com/madhead),
[Titus James](https://redirect.github.com/tj330),
[vrp0211](https://redirect.github.com/vrp0211)

##### Upgrade instructions

Switch your build to use Gradle 8.11 by updating your wrapper:

```
./gradlew wrapper --gradle-version=8.11
```

See the Gradle [8.x upgrade
guide](https://docs.gradle.org/8.11/userguide/upgrading_version_8.html)
to learn about deprecations, breaking changes and other considerations
when upgrading.

For Java, Groovy, Kotlin and Android compatibility, see the [full
compatibility
notes](https://docs.gradle.org/8.11/userguide/compatibility.html).

##### Reporting problems

If you find a problem with this release, please file a bug on [GitHub
Issues](https://redirect.github.com/gradle/gradle/issues) adhering to
our issue guidelines.
If you're not sure you're encountering a bug, please use the
[forum](https://discuss.gradle.org/c/help-discuss).

We hope you will build happiness with Gradle, and we look forward to
your feedback via [Twitter](https://twitter.com/gradle) or on
[GitHub](https://redirect.github.com/gradle).

</details>

---

### Configuration

📅 **Schedule**: Branch creation - At any time (no schedule defined),
Automerge - At any time (no schedule defined).

🚦 **Automerge**: Disabled by config. Please merge this manually once you
are satisfied.

♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the
rebase/retry checkbox.

👻 **Immortal**: This PR will be recreated if closed unmerged. Get
[config
help](https://redirect.github.com/renovatebot/renovate/discussions) if
that's undesired.

---

- [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check
this box

---

This PR has been generated by [Renovate
Bot](https://redirect.github.com/renovatebot/renovate).

<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0MS4xNy4yIiwidXBkYXRlZEluVmVyIjoiNDEuMTcuMiIsInRhcmdldEJyYW5jaCI6Im1haW4iLCJsYWJlbHMiOlsicHI6ZGVwZW5kZW5jaWVzIl19-->

---------

Co-authored-by: Renovate Bot <[email protected]>
Co-authored-by: JayShortway <[email protected]>
This PR contains the following updates:

| Package | Type | Update | Change |
|---|---|---|---|
| [gradle](https://gradle.org)
([source](https://redirect.github.com/gradle/gradle)) | | patch |
`8.14.2` -> `8.14.3` |
| [com.android.library](https://developer.android.com/studio/build)
([source](https://android.googlesource.com/platform/tools/base)) |
plugin | patch | `8.11.0` -> `8.11.1` |
| [com.android.application](https://developer.android.com/studio/build)
([source](https://android.googlesource.com/platform/tools/base)) |
plugin | patch | `8.11.0` -> `8.11.1` |

---

### Release Notes

<details>
<summary>gradle/gradle (gradle)</summary>

###
[`v8.14.3`](https://redirect.github.com/gradle/gradle/releases/tag/v8.14.3):
8.14.3

[Compare
Source](https://redirect.github.com/gradle/gradle/compare/v8.14.2...v8.14.3)

The Gradle team is excited to announce Gradle 8.14.3.

This is a patch release for 8.14. We recommend using 8.14.3 instead of
8.14.

Here are the highlights of this release:

- Java 24 support
- GraalVM Native Image toolchain selection
- Enhancements to test reporting
- Build Authoring improvements

[Read the Release
Notes](https://docs.gradle.org/8.14.3/release-notes.html)

We would like to thank the following community members for their
contributions to this release of Gradle:
[Aurimas](https://redirect.github.com/liutikas),
[Ben Bader](https://redirect.github.com/benjamin-bader),
[Björn Kautler](https://redirect.github.com/Vampire),
[chandre92](https://redirect.github.com/chandre92),
[Daniel Hammer](https://redirect.github.com/dlehammer),
[Danish Nawab](https://redirect.github.com/danishnawab),
[Florian Dreier](https://redirect.github.com/DreierF),
[Ivy Chen](https://redirect.github.com/Mengmeiivy),
[Jendrik Johannes](https://redirect.github.com/jjohannes),
[jimmy1995-gu](https://redirect.github.com/jimmy1995-gu),
[Madalin Valceleanu](https://redirect.github.com/vmadalin),
[Na Minhyeok](https://redirect.github.com/NaMinhyeok).

##### Upgrade instructions

Switch your build to use Gradle 8.14.3 by updating your wrapper:

```
./gradlew wrapper --gradle-version=8.14.3 && ./gradlew wrapper
```

See the Gradle [8.x upgrade
guide](https://docs.gradle.org/8.14.3/userguide/upgrading_version_8.html)
to learn about deprecations, breaking changes and other considerations
when upgrading.

For Java, Groovy, Kotlin and Android compatibility, see the [full
compatibility
notes](https://docs.gradle.org/8.14.3/userguide/compatibility.html).

##### Reporting problems

If you find a problem with this release, please file a bug on [GitHub
Issues](https://redirect.github.com/gradle/gradle/issues) adhering to
our issue guidelines.
If you're not sure you're encountering a bug, please use the
[forum](https://discuss.gradle.org/c/help-discuss).

We hope you will build happiness with Gradle, and we look forward to
your feedback via [Twitter](https://twitter.com/gradle) or on
[GitHub](https://redirect.github.com/gradle).

</details>

---

### Configuration

📅 **Schedule**: Branch creation - At any time (no schedule defined),
Automerge - At any time (no schedule defined).

🚦 **Automerge**: Disabled by config. Please merge this manually once you
are satisfied.

♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the
rebase/retry checkbox.

👻 **Immortal**: This PR will be recreated if closed unmerged. Get
[config
help](https://redirect.github.com/renovatebot/renovate/discussions) if
that's undesired.

---

- [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check
this box

---

This PR has been generated by [Renovate
Bot](https://redirect.github.com/renovatebot/renovate).

<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0MS4zMC41IiwidXBkYXRlZEluVmVyIjoiNDEuMzAuNSIsInRhcmdldEJyYW5jaCI6Im1haW4iLCJsYWJlbHMiOlsicHI6ZGVwZW5kZW5jaWVzIl19-->

Co-authored-by: Renovate Bot <[email protected]>
### Description
This updates the android orb and the tag we use for our jobs. Which will
allow us to have access to the latest android SDKs and fix tests in
#2520
### Description
Snapshot deployment broke in #2521. This should fix that
Increases compile/target SDK version to 35
### Description
This makes it so we don't consume insets in paywalls in Android 16+.
Starting on Android 16+, by default apps will go edge to edge. We
already consume insets correctly within the paywall as needed, but the
activity was actually consuming those insets before that.

A better fix might be to add an option to enable/disable this
consumption, while keeping the current behavior in Android < 16 but
changing it for android 16+. This is a short term fix for now.
### Description
As the title says. Now, we will rely on Google instead to handle
resubscribing. The default behavior by Google is:
- If trying to purchase the same base plan that the user is already
subscribed, display a message indicating so, with a link to manage
subscriptions
- If trying to purchase a different base plan for a product the user is
already subscribed to, perform an upgrade/downgrade.
- If trying to purchase a product the user has an active but cancelled
subscription for, resubscribe.
…l in full screen (#2530)

### Description
We currently were not supporting edge to edge in paywalls when using the
`launch` and `launchIfNeeded` APIs. This adds a new parameter that
allows to display it in edgeToEdge mode, or not.

The default will be true for Android 15+ and false otherwise.
…e is not set up (#2527)

## Description
This opens the door to showing `PaywallView` in a new Window, instead of
in an Activity. It should also fix a few crashes we've been seeing in
react-native-purchases, when the Paywall is shown modally.

There's an explainer added to the documentation of `CompatComposeView`.
Android counterpart to
RevenueCat/purchases-ios#5108.

This PR introduces virtual currencies to the Android SDK. It's a large
PR, but all parts of it have been reviewed individually before here:
- #2466
- #2496
- #2505

It includes the following:

These functions allow you to fetch the virtual currencies for the
current subscriber. The `invalidateVirtualCurrenciesCache` function
allows developers to clear the cached virtual currencies, which will
then force the refreshing of the virtual currencies from the backend the
next time `getVirtualCurrencies()` is called.

```kotlin
class Purchases {
   fun getVirtualCurrencies(
        callback: GetVirtualCurrenciesCallback,
    )

   fun invalidateVirtualCurrenciesCache()

   val cachedVirtualCurrencies: VirtualCurrencies?
}
```

```kotlin
class VirtualCurrencies internal constructor(
    val all: Map<String, VirtualCurrency>,
) : Parcelable {
    operator fun get(code: String): VirtualCurrency? = all[code]
}

class VirtualCurrency internal constructor(
    val balance: Int,
    val name: String,
    val code: String,
    val serverDescription: String? = null,
)
```

Kotlin:
```swift
Purchases.sharedInstance.invalidateVirtualCurrenciesCache()

Purchases.sharedInstance.getVirtualCurrencies(
    object: GetVirtualCurrenciesCallback {
        override fun onReceived(virtualCurrencies: VirtualCurrencies) {}
        override fun onError(error: PurchasesError) {}
    }
)

Purchases.sharedInstance.getVirtualCurrenciesWith(
        onError = { _: PurchasesError -> },
        onSuccess = { _: VirtualCurrencies -> },
)

val getVirtualCurrenciesResult: VirtualCurrencies = Purchases.sharedInstance.awaitGetVirtualCurrencies()

val cachedVirtualCurrencies = Purchases.sharedInstance.cachedVirtualCurrencies
```
### Description
We were running virtual currency integration tests both with and without
the load shedder. However, the load shedder doesn't currently support
virtual currencies, so these tests were failing when run for the load
shedder integration test app. This PR updates the integration tests so
that the virtual currency integration tests don't run for the load
shedder integration tests app.

### Implementation Details
We are able to accomplish this by:
- When we're running integration tests through the integration tests
app, fastlane sets the `IS_RUNNING_LOAD_SHEDDER_INTEGRATION_TESTS`
string to `true` in `Constants.kt`.
- There's a new function
`BasePurchasesIntegrationTest.isRunningLoadShedderIntegrationTests`,
that tests can use to determine if they're running in the load shedder
integration test app.

### Testing
I manually forced the integration tests to run on this PR, and both the
regular and load shedder integration tests passed in Firebase
### Description
This is the first of a series of PRs to support a test store in
purchases-android.

In this one, we add support for a new test API key and expose the API
key validation result to the billing factory, so we can in future PRs
create a billing implementation for this test store.
### Description
This PR exposes the `VirtualCurrency` and `VirtualCurrencies`
constructors publicly behind the `@InternalRevenueCatAPI` annotation.
This will help us in a few scenarios when we need to instantiate VC
objects outside of `purchases-android`, including in the mapper tests in
PHC.

#### Other Approaches Considered
We considered a few other approaches before deciding to use
`@InternalRevenueCatAPI`:
- Making the constructor public without an annotation. This works, but
isn't ideal for a few reasons:
- Adding new properties would be a breaking change unless we used the
`@JvmOverloads` annotation. Even then, we would need to provide a
default value, and that won't always be easy (e.g. when we add VC icons,
these will likely not be optionals)
- Parsing the VC objects from JSON in the PHC mapper tests. This would
work but feels a little dirty, and wouldn't help us if we ever need to
do this in other circumstances.

Using `@InternalRevenueCatAPI` allows us to access the constructor
outside of `purchases-android` while still giving us the freedom to make
breaking changes to the constructor in the future.
If the subscription is already cancelled, it should say "Resubscribe"
instead of "Cancel Subscription"

It should also not open any feedback survey or promotional offer
…dark mode (#2550)

The Customer Center was closing when switching between light and dark
mode
Bumps [nokogiri](https://github.com/sparklemotion/nokogiri) from 1.18.8
to 1.18.9.
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/sparklemotion/nokogiri/releases">nokogiri's
releases</a>.</em></p>
<blockquote>
<h2>v1.18.9 / 2025-07-20</h2>
<h3>Security</h3>
<ul>
<li>[CRuby] Applied upstream libxml2 patches to address CVE-2025-6021,
CVE-2025-6170, CVE-2025-49794, CVE-2025-49795, and CVE-2025-49796. See
<a
href="https://github.com/sparklemotion/nokogiri/security/advisories/GHSA-353f-x4gh-cqq8">GHSA-353f-x4gh-cqq8</a>
for more information.</li>
</ul>
<!-- raw HTML omitted -->

<pre><code>5bcfdf7aa8d1056a7ad5e52e1adffc64ef53d12d0724fbc6f458a3af1a4b9e32
nokogiri-1.18.9-aarch64-linux-gnu.gem
55e9e6ca46c4ad1715e313f407d8481d15be1e3b65d9f8e52ba1c124d01676a7
nokogiri-1.18.9-aarch64-linux-musl.gem
eea3f1f06463ff6309d3ff5b88033c4948d0da1ab3cc0a3a24f63c4d4a763979
nokogiri-1.18.9-arm64-darwin.gem
fe611ae65880e445a9c0f650d52327db239f3488626df4173c05beafd161d46e
nokogiri-1.18.9-arm-linux-gnu.gem
935605e14c0ba17da18d203922440bf6c0676c602659278d855d4622d756a324
nokogiri-1.18.9-arm-linux-musl.gem
ac5a7d93fd0e3cef388800b037407890882413feccca79eb0272a2715a82fa33
nokogiri-1.18.9.gem
1fe5b7aa4a054eda689a969bb4e03999960a6ea806582d327207d687168bceb5
nokogiri-1.18.9-java.gem
6b4fc1523aa0370c78653e38c94cb50e7f3ab786425de66ba7ad24222c1164a3
nokogiri-1.18.9-x64-mingw-ucrt.gem
e0d2deb03d3d7af8016e8c9df5ff4a7d692159cefb135cbb6a4109f265652348
nokogiri-1.18.9-x86_64-darwin.gem
b52f5defedc53d14f71eeaaf990da66b077e1918a2e13088b6a96d0230f44360
nokogiri-1.18.9-x86_64-linux-gnu.gem
e69359d6240c17e64cc9f43970d54f13bfc7b8cc516b819228f687e953425e69
nokogiri-1.18.9-x86_64-linux-musl.gem
</code></pre>
<!-- raw HTML omitted -->
</blockquote>
</details>
<details>
<summary>Changelog</summary>
<p><em>Sourced from <a
href="https://github.com/sparklemotion/nokogiri/blob/main/CHANGELOG.md">nokogiri's
changelog</a>.</em></p>
<blockquote>
<h2>v1.18.9 / 2025-07-20</h2>
<h3>Security</h3>
<ul>
<li>[CRuby] Applied upstream libxml2 patches to address CVE-2025-6021,
CVE-2025-6170, CVE-2025-49794, CVE-2025-49795, and CVE-2025-49796. See
<a
href="https://github.com/sparklemotion/nokogiri/security/advisories/GHSA-353f-x4gh-cqq8">GHSA-353f-x4gh-cqq8</a>
for more information.</li>
</ul>
</blockquote>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="https://github.com/sparklemotion/nokogiri/commit/1dcd8ce30365ebd4620a3b823bf806b127eeefc3"><code>1dcd8ce</code></a>
version bump to v1.18.9</li>
<li><a
href="https://github.com/sparklemotion/nokogiri/commit/a05d2b44b930072af70dad12bddbac67f36c6f90"><code>a05d2b4</code></a>
Apply upstream patches to address multiple vulnerabilities (<a
href="https://redirect.github.com/sparklemotion/nokogiri/issues/3526">#3526</a>)</li>
<li><a
href="https://github.com/sparklemotion/nokogiri/commit/947a55e87edff3c6d76ffd81f07da728e67c9b82"><code>947a55e</code></a>
Apply upstream patches to address multiple vulnerabilities</li>
<li>See full diff in <a
href="https://github.com/sparklemotion/nokogiri/compare/v1.18.8...v1.18.9">compare
view</a></li>
</ul>
</details>
<br />


[![Dependabot compatibility
score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=nokogiri&package-manager=bundler&previous-version=1.18.8&new-version=1.18.9)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores)

Dependabot will resolve any conflicts with this PR as long as you don't
alter it yourself. You can also trigger a rebase manually by commenting
`@dependabot rebase`.

[//]: # (dependabot-automerge-start)
[//]: # (dependabot-automerge-end)

---

<details>
<summary>Dependabot commands and options</summary>
<br />

You can trigger Dependabot actions by commenting on this PR:
- `@dependabot rebase` will rebase this PR
- `@dependabot recreate` will recreate this PR, overwriting any edits
that have been made to it
- `@dependabot merge` will merge this PR after your CI passes on it
- `@dependabot squash and merge` will squash and merge this PR after
your CI passes on it
- `@dependabot cancel merge` will cancel a previously requested merge
and block automerging
- `@dependabot reopen` will reopen this PR if it is closed
- `@dependabot close` will close this PR and stop Dependabot recreating
it. You can achieve the same result by closing it manually
- `@dependabot show <dependency name> ignore conditions` will show all
of the ignore conditions of the specified dependency
- `@dependabot ignore this major version` will close this PR and stop
Dependabot creating any more for this major version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this minor version` will close this PR and stop
Dependabot creating any more for this minor version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this dependency` will close this PR and stop
Dependabot creating any more for this dependency (unless you reopen the
PR or upgrade to it yourself)
You can disable automated security fix PRs for this repo from the
[Security Alerts
page](https://github.com/RevenueCat/purchases-android/network/alerts).

</details>

Signed-off-by: dependabot[bot] <[email protected]>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
…2558)

Bumps
[fastlane-plugin-revenuecat_internal](https://github.com/RevenueCat/fastlane-plugin-revenuecat_internal)
from `9a29f63` to `7d97553`.
<details>
<summary>Commits</summary>
<ul>
<li><a
href="https://github.com/RevenueCat/fastlane-plugin-revenuecat_internal/commit/7d97553e9c5baabcd18286f03d8034797a27dd64"><code>7d97553</code></a>
Adds <code>create_or_checkout_branch</code>,
<code>commit_all_changes</code>, `create_pr_if_necessa...</li>
<li><a
href="https://github.com/RevenueCat/fastlane-plugin-revenuecat_internal/commit/b519e5ce1f6f567b656d0db4a750e159c2c8d68a"><code>b519e5c</code></a>
Only retry tests that failed but didn't succeed after in-run retry (<a
href="https://redirect.github.com/RevenueCat/fastlane-plugin-revenuecat_internal/issues/79">#79</a>)</li>
<li>See full diff in <a
href="https://github.com/RevenueCat/fastlane-plugin-revenuecat_internal/compare/9a29f638e834a61c2f522df6247d484ad478bba0...7d97553e9c5baabcd18286f03d8034797a27dd64">compare
view</a></li>
</ul>
</details>
<br />


Dependabot will resolve any conflicts with this PR as long as you don't
alter it yourself. You can also trigger a rebase manually by commenting
`@dependabot rebase`.

[//]: # (dependabot-automerge-start)
[//]: # (dependabot-automerge-end)

---

<details>
<summary>Dependabot commands and options</summary>
<br />

You can trigger Dependabot actions by commenting on this PR:
- `@dependabot rebase` will rebase this PR
- `@dependabot recreate` will recreate this PR, overwriting any edits
that have been made to it
- `@dependabot merge` will merge this PR after your CI passes on it
- `@dependabot squash and merge` will squash and merge this PR after
your CI passes on it
- `@dependabot cancel merge` will cancel a previously requested merge
and block automerging
- `@dependabot reopen` will reopen this PR if it is closed
- `@dependabot close` will close this PR and stop Dependabot recreating
it. You can achieve the same result by closing it manually
- `@dependabot show <dependency name> ignore conditions` will show all
of the ignore conditions of the specified dependency
- `@dependabot ignore this major version` will close this PR and stop
Dependabot creating any more for this major version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this minor version` will close this PR and stop
Dependabot creating any more for this minor version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this dependency` will close this PR and stop
Dependabot creating any more for this dependency (unless you reopen the
PR or upgrade to it yourself)


</details>

Signed-off-by: dependabot[bot] <[email protected]>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Bumps [fastlane](https://github.com/fastlane/fastlane) from 2.227.2 to
2.228.0.
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/fastlane/fastlane/releases">fastlane's
releases</a>.</em></p>
<blockquote>
<h2>2.228.0 Improvements</h2>
<ul>
<li>[sigh][match] fix issue where unknown attribute
<code>template_name</code> is being sent when creating provisioning
profiles (<a
href="https://redirect.github.com/fastlane/fastlane/issues/29591">#29591</a>)
via Florentin Luca Rieger (<a
href="https://github.com/visuallization"><code>@​visuallization</code></a>)</li>
<li>[action][hipchat] remove hipchat action (<a
href="https://redirect.github.com/fastlane/fastlane/issues/29558">#29558</a>)
via Eitan Adler (<a
href="https://github.com/grimreaper"><code>@​grimreaper</code></a>)</li>
</ul>
<hr />
<blockquote>
<p>[!IMPORTANT]
If your app relies on managed capabilities (previously referred to as
custom entitlements or the <code>template_name</code> parameter in
<em>match</em>), you are impacted by a change that Apple made to their
APIs in the last 2 weeks.
Please check out the ongoing discussion at <a
href="https://github.com/fastlane/fastlane/discussions/29609">https://github.com/fastlane/fastlane/discussions/29609</a>
for the latest updates. Your insights and contributions are welcome!</p>
</blockquote>
</blockquote>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="https://github.com/fastlane/fastlane/commit/20fd6778dd2f38cc17477e821099e517bfbcdd07"><code>20fd677</code></a>
Version bump to 2.228.0 (<a
href="https://redirect.github.com/fastlane/fastlane/issues/29610">#29610</a>)</li>
<li><a
href="https://github.com/fastlane/fastlane/commit/db3b1e9f605d6b54f3ab8e948d1ba88bddb1cbb0"><code>db3b1e9</code></a>
[sigh][match] fix issue where unknown attribute
<code>template_name</code> is being sent...</li>
<li><a
href="https://github.com/fastlane/fastlane/commit/d7f1ca8eab11fb9de96e3f02a692b4e50058c791"><code>d7f1ca8</code></a>
[action][hipchat] remove hipchat action (<a
href="https://redirect.github.com/fastlane/fastlane/issues/29558">#29558</a>)</li>
<li>See full diff in <a
href="https://github.com/fastlane/fastlane/compare/fastlane/2.227.2...fastlane/2.228.0">compare
view</a></li>
</ul>
</details>
<br />


[![Dependabot compatibility
score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=fastlane&package-manager=bundler&previous-version=2.227.2&new-version=2.228.0)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores)

Dependabot will resolve any conflicts with this PR as long as you don't
alter it yourself. You can also trigger a rebase manually by commenting
`@dependabot rebase`.

[//]: # (dependabot-automerge-start)
[//]: # (dependabot-automerge-end)

---

<details>
<summary>Dependabot commands and options</summary>
<br />

You can trigger Dependabot actions by commenting on this PR:
- `@dependabot rebase` will rebase this PR
- `@dependabot recreate` will recreate this PR, overwriting any edits
that have been made to it
- `@dependabot merge` will merge this PR after your CI passes on it
- `@dependabot squash and merge` will squash and merge this PR after
your CI passes on it
- `@dependabot cancel merge` will cancel a previously requested merge
and block automerging
- `@dependabot reopen` will reopen this PR if it is closed
- `@dependabot close` will close this PR and stop Dependabot recreating
it. You can achieve the same result by closing it manually
- `@dependabot show <dependency name> ignore conditions` will show all
of the ignore conditions of the specified dependency
- `@dependabot ignore this major version` will close this PR and stop
Dependabot creating any more for this major version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this minor version` will close this PR and stop
Dependabot creating any more for this minor version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this dependency` will close this PR and stop
Dependabot creating any more for this dependency (unless you reopen the
PR or upgrade to it yourself)


</details>

Signed-off-by: dependabot[bot] <[email protected]>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
### Description

Android equivalent of
RevenueCat/purchases-ios#5404

This PR updates the
`VirtualCurrencyStrings.NO_CACHED_VIRTUAL_CURRENCIES` log message from
`"No cached VirtualCurrencies, fetching from network."` to `"There are
no cached VirtualCurrencies."`.

The previous message stated that a network fetch would occur, which
isn't always the case.

There are two scenarios where this log may appear:
- When fetching virtual currencies and the cache is not stale but
contains no virtual currencies object (an edge case that shouldn't occur
with normal usage).
- When accessing the cache directly using
`Purchases.cachedVirtualCurrencies` and it's empty - in this case, the
SDK returns nil without initiating a network fetch.

The updated message is more descriptive of what actually happens in the
second scenario. In the first scenario, subsequent log messages state
that the SDK is fetching VCs from the network.
Bumps [danger](https://github.com/danger/danger) from 9.5.1 to 9.5.3.
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/danger/danger/releases">danger's
releases</a>.</em></p>
<blockquote>
<h2>9.5.3</h2>
<ul>
<li>Revert &quot;Add GitLab Merge Request support with a new
<code>mr</code> command&quot; - <a
href="https://github.com/manicmaniac"><code>@​manicmaniac</code></a> <a
href="https://redirect.github.com/danger/danger/pull/1521">#1521</a></li>
</ul>
<h2>9.5.2</h2>
<ul>
<li>Add GitLab Merge Request support with a new <code>mr</code> command
- <a href="https://github.com/jtslear"><code>@​jtslear</code></a> <a
href="https://redirect.github.com/danger/danger/pull/1516">#1516</a></li>
<li>Support v4 of colored2 gem to make danger work with
--enable-frozen-string-literal RUBYOPT of newer Ruby versions - <a
href="https://github.com/eiskrenkov"><code>@​eiskrenkov</code></a> <a
href="https://redirect.github.com/danger/danger/pull/1513">#1513</a></li>
<li>Support ruby-git 2.x - <a
href="https://github.com/manicmaniac"><code>@​manicmaniac</code></a> <a
href="https://redirect.github.com/danger/danger/pull/1511">#1511</a></li>
<li>Allow terminal-table versions through 4.x - <a
href="https://github.com/murilooon"><code>@​murilooon</code></a> <a
href="https://redirect.github.com/danger/danger/pull/1508">#1508</a></li>
<li>Bump kramdown to 2.5.1 - <a
href="https://github.com/manicmaniac"><code>@​manicmaniac</code></a> <a
href="https://redirect.github.com/danger/danger/pull/1514">#1514</a></li>
</ul>
</blockquote>
</details>
<details>
<summary>Changelog</summary>
<p><em>Sourced from <a
href="https://github.com/danger/danger/blob/master/CHANGELOG.md">danger's
changelog</a>.</em></p>
<blockquote>
<h2>9.5.3</h2>
<ul>
<li>Revert &quot;Add GitLab Merge Request support with a new
<code>mr</code> command&quot; - <a
href="https://github.com/manicmaniac"><code>@​manicmaniac</code></a> <a
href="https://redirect.github.com/danger/danger/pull/1521">#1521</a></li>
</ul>
<h2>9.5.2</h2>
<ul>
<li>Add GitLab Merge Request support with a new <code>mr</code> command
- <a href="https://github.com/jtslear"><code>@​jtslear</code></a> <a
href="https://redirect.github.com/danger/danger/pull/1516">#1516</a></li>
<li>Support v4 of colored2 gem to make danger work with
--enable-frozen-string-literal RUBYOPT of newer Ruby versions - <a
href="https://github.com/eiskrenkov"><code>@​eiskrenkov</code></a> <a
href="https://redirect.github.com/danger/danger/pull/1513">#1513</a></li>
<li>Support ruby-git 2.x - <a
href="https://github.com/manicmaniac"><code>@​manicmaniac</code></a> <a
href="https://redirect.github.com/danger/danger/pull/1511">#1511</a></li>
<li>Allow terminal-table versions through 4.x - <a
href="https://github.com/murilooon"><code>@​murilooon</code></a> <a
href="https://redirect.github.com/danger/danger/pull/1508">#1508</a></li>
<li>Bump kramdown to 2.5.1 - <a
href="https://github.com/manicmaniac"><code>@​manicmaniac</code></a> <a
href="https://redirect.github.com/danger/danger/pull/1514">#1514</a></li>
</ul>
</blockquote>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="https://github.com/danger/danger/commit/bb3e85616b48e3ec23c6b3ccf8c0c972cb299462"><code>bb3e856</code></a>
Prepare for release</li>
<li><a
href="https://github.com/danger/danger/commit/8209b62770b81a8daed360a5a64bbde906197964"><code>8209b62</code></a>
Merge pull request <a
href="https://redirect.github.com/danger/danger/issues/1521">#1521</a>
from manicmaniac/revert-add-gitlab-merge-request-sup...</li>
<li><a
href="https://github.com/danger/danger/commit/12d7696e43194a020fac814906da7e5086a3874b"><code>12d7696</code></a>
Revert &quot;Merge pull request <a
href="https://redirect.github.com/danger/danger/issues/1516">#1516</a>
from jtslear/add-gitlab-merge-request-support&quot;</li>
<li><a
href="https://github.com/danger/danger/commit/ea7cfb0858a59a6f5105d4fa0549d1472029e805"><code>ea7cfb0</code></a>
Prepare for release</li>
<li><a
href="https://github.com/danger/danger/commit/f1064d24a43ac5a6f68403b0d1d6bf51fb52191b"><code>f1064d2</code></a>
Merge pull request <a
href="https://redirect.github.com/danger/danger/issues/1514">#1514</a>
from manicmaniac/bump-kramdown-to-2.5.1</li>
<li><a
href="https://github.com/danger/danger/commit/cb97334d4e0d35e72ee51a32d030df742c8cbae1"><code>cb97334</code></a>
Merge pull request <a
href="https://redirect.github.com/danger/danger/issues/1519">#1519</a>
from ydah/fixfixme</li>
<li><a
href="https://github.com/danger/danger/commit/683c6893682c81b50fff2ff63a0af984d2836d5e"><code>683c689</code></a>
Resolve FIXME comments for <code>Metrics/BlockLength</code> in
.rubocop.yml</li>
<li><a
href="https://github.com/danger/danger/commit/7d92b8d4f81c36f86ef9c6ce61529143c4533b0d"><code>7d92b8d</code></a>
Merge pull request <a
href="https://redirect.github.com/danger/danger/issues/1516">#1516</a>
from jtslear/add-gitlab-merge-request-support</li>
<li><a
href="https://github.com/danger/danger/commit/7b28dffa54f4edcfba0dae0beb5dd2cc1688416b"><code>7b28dff</code></a>
RuboCop was angry, so I refactored the client method to make it smile
again</li>
<li><a
href="https://github.com/danger/danger/commit/02b6b6cb63581ef9444cb076cc4fb5fe7b87bbcc"><code>02b6b6c</code></a>
Add GitLab Merge Request support</li>
<li>Additional commits viewable in <a
href="https://github.com/danger/danger/compare/v9.5.1...v9.5.3">compare
view</a></li>
</ul>
</details>
<br />


[![Dependabot compatibility
score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=danger&package-manager=bundler&previous-version=9.5.1&new-version=9.5.3)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores)

Dependabot will resolve any conflicts with this PR as long as you don't
alter it yourself. You can also trigger a rebase manually by commenting
`@dependabot rebase`.

[//]: # (dependabot-automerge-start)
[//]: # (dependabot-automerge-end)

---

<details>
<summary>Dependabot commands and options</summary>
<br />

You can trigger Dependabot actions by commenting on this PR:
- `@dependabot rebase` will rebase this PR
- `@dependabot recreate` will recreate this PR, overwriting any edits
that have been made to it
- `@dependabot merge` will merge this PR after your CI passes on it
- `@dependabot squash and merge` will squash and merge this PR after
your CI passes on it
- `@dependabot cancel merge` will cancel a previously requested merge
and block automerging
- `@dependabot reopen` will reopen this PR if it is closed
- `@dependabot close` will close this PR and stop Dependabot recreating
it. You can achieve the same result by closing it manually
- `@dependabot show <dependency name> ignore conditions` will show all
of the ignore conditions of the specified dependency
- `@dependabot ignore this major version` will close this PR and stop
Dependabot creating any more for this major version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this minor version` will close this PR and stop
Dependabot creating any more for this minor version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this dependency` will close this PR and stop
Dependabot creating any more for this dependency (unless you reopen the
PR or upgrade to it yourself)


</details>

Signed-off-by: dependabot[bot] <[email protected]>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
…2559)

| Old | New |
|--------|--------|
| <img width="347" height="704" alt="Screenshot 2025-07-22 at 16 38 15"
src="https://github.com/user-attachments/assets/31530ae9-9cf0-4f87-9c13-3eecf4450b91"
/> | <img width="344" height="707" alt="Screenshot 2025-07-22 at 16 37
21"
src="https://github.com/user-attachments/assets/a4dc612d-18ef-4093-aede-34aa27ea1b80"
/> |
Display the latest expired subscription in the customer center, if there
are no active subscriptions
tonidero and others added 22 commits August 25, 2025 14:54
### Description
Until now, if trying to restore a purchase with a payment pending error,
the SDK returned an `UnknownBackendError` code. This should be returned
instead with a `PaymentPendingError` code for proper handling.

Note that restore errors return the error of the last post receipt with
errors. If there were multiple errors, all might not be exposed right
now.
<!-- Thank you for contributing to Purchases! Before pressing the
"Create Pull Request" button, please provide the following: -->

- [x] If applicable, unit tests

We have several users who want the ability to delay the appearance of
the close paywall button.

Implemented a Transitions mechanism that will optionally hide/show a
view when the component is marked with a transition object. This lays
the groundwork for accepting custom animation declarations so that it
would not error out if/when we add that in the future.
### Motivation
We want to be more explicit on how to edit the button text for the
ScreenOffering.
 
[ios](RevenueCat/purchases-ios#5501)


![image](https://github.com/user-attachments/assets/5b57e61c-6e54-45bf-8d01-4a6f0017344f)


### Description
- Add button text to ScreenOffering

> This comes already translated. For backwards compatibility, we default
to the key used right now.
### Description
There is an issue in our current version of compose that causes the
Dialog composable to extend beyond the screen size in Android 35+
devices: https://issuetracker.google.com/issues/246909281. This was
fixed in a newer version of Compose, however, that introduces a breaking
change by forcing apps to compile against Android 35.

This PR introduces a workaround by applying some bottom padding that
consists on the status bar + navigation bars sizes as bottom padding. It
also makes the PaywallDialog go Edge to Edge on Android 35+, which is
the default starting on that version. The current fix has been tested on
Android <35 and >35 and also when the client app uses a higher version
of compsoe with the fix.

| Issue in Android 35+ | Android < 35 | Android >= 35 with older compose
version | Android >= 35 with newer compose version |
| ------ | ----- | ----- | ----- |
| <img width="540" height="1212" alt="image"
src="https://github.com/user-attachments/assets/5ceb3a20-c25c-419f-8aa2-2ac54f6e458e"
/> | <img width="540" height="1200" alt="image"
src="https://github.com/user-attachments/assets/06d2ec4b-da6e-471c-a471-d2950b651008"
/> | <img width="540" height="1212" alt="image"
src="https://github.com/user-attachments/assets/8cd441a5-6e45-4ae8-bc11-228787189063"
/> | <img width="540" height="1212" alt="image"
src="https://github.com/user-attachments/assets/adba21c1-d5f8-46e8-b3ed-c7623437353a"
/> |
…ghly with team (#2641)

<!-- Thank you for contributing to Purchases! Before pressing the
"Create Pull Request" button, please provide the following: -->

- [x] If applicable, unit tests

PR #2623 merged a day too soon. After Josh got back from a long weekend
we had more time to chat. There are existing patterns in place to keep
the json flat. Fortunately, if the code from that PR merges to
production it will fallback to a Fade transition which is what we need
for the immediate ask anyway. We also hashed out some details on what is
optional.

Flattened the json from :

```JSON
"type": {
    "type": "some_type",
    "maybe_never_would_add_another_field": "some_value"
 }
```

to:

```JSON
"type": "some_type",
"maybe_never_would_add_another_field": "some_value"
```

and made the int values required values in the json

<!-- Describe your changes in detail -->
<!-- Please describe in detail how you tested your changes -->
…n network IDs at configuration time (#2643)

### Description
This adds a new API that can be used to disable automatic collection of
Advertising ID, IP and device info when using one of the attribution
networks we support like Adjust or Appsflyer. This can be set at
configuration time like this:
```
val purchasesConfiguration = PurchasesConfiguration.Builder(context, "YOUR_API_KEY")
   .automaticDeviceIdentifierCollectionEnabled(enabled)
   .build()
Purchases.configure(purchasesConfiguration)
```

Note that you can still collect these identifiers with this option
disabled by calling
`Purchases.sharedInstance.collectDeviceIdentifiers()`
## Summary

This PR adds the ability to override the system locale for RevenueCat UI
components (Paywalls and Customer Center), allowing developers to
display the UI in a specific language regardless of the system locale
setting. This implements the same functionality that was added to the
iOS SDK in RevenueCat/purchases-ios#5292.

## Changes

### Configuration API
- Add `preferredUILocaleOverride` property to `PurchasesConfiguration`
- Add `preferredUILocaleOverride(String?)` builder method with
comprehensive documentation

### Runtime API  
- Add `overridePreferredUILocale(String?): Boolean` method to
`Purchases` class
- Add public getter `preferredUILocaleOverride` property
- **Automatic cache management**: Cache clearing happens automatically
when locale changes
- **Rate limiting**: Built-in rate limiting (10 calls per 60 seconds)
prevents excessive API calls
- Both APIs available for default and custom entitlement computation
flavors

### UI Components Integration
- Update `PaywallViewModel` and `PaywallState` to use preferred locale
override
- Add reflection-based approach to access preferred locale from UI
components
- Support both "es-ES" and "es_ES" locale format patterns
- Proper locale matching logic that prioritizes preferred override
- Graceful fallback to system default for invalid locales with proper
logging

### HTTP Request Integration
- Update `LocaleProvider` to include preferred locale override in API
requests
- Preferred locale is sent first in Accept-Language header when set
- Ensures both UI rendering and API responses respect the same locale
preference

### Paywall Tester Enhancements
- Add comprehensive locale selection tab with 15+ predefined locales
- Add search/filter functionality to offerings tab
- Support custom locale input with validation
- Optional preferred locale configuration via `Constants.kt`
- Real-time feedback on cache clearing status with rate limit handling

## API Usage

### Configuration time:
```kotlin
val configuration = PurchasesConfiguration.Builder(context, apiKey)
    .preferredUILocaleOverride("es-ES")  // or "es_ES" - both formats supported
    .build()
Purchases.configure(configuration)
```

### Runtime override:
```kotlin
// Set preferred locale (automatically clears cache if changed)
val cacheCleared = Purchases.sharedInstance.overridePreferredUILocale("de-DE")
if (cacheCleared) {
    // Cache was cleared and offerings will be refetched with new locale
}

// Revert to system default
Purchases.sharedInstance.overridePreferredUILocale(null)
```

## Architecture

### Rate Limiting
- Cache clearing operations are rate limited to prevent excessive
network requests
- Uses the same `RateLimiter` utility as subscriber attributes (10 calls
per 60 seconds)
- Locale setting is immediate, cache clearing is rate limited separately

### Locale Resolution Priority
1. **Preferred override** (if set via configuration or runtime API)
2. **System default locales** (from `LocaleListCompat.getDefault()`)
3. **Paywall default locale** (fallback for UI components)

### Thread Safety
- All operations are properly synchronized
- Reflection-based access includes proper exception handling
- State management through PurchasesOrchestrator ensures consistency

## Test plan

- [x] All existing unit tests pass
- [x] Code compiles successfully for all modules  
- [x] Lint/detekt checks pass with no new violations
- [x] API compatibility checks pass (metalava)
- [x] Graceful error handling for invalid locale strings
- [x] Thread-safe access to shared configuration state
- [x] Rate limiting functionality verified
- [x] Paywall tester UI enhancements tested

## Testing Notes

- Manual testing shows paywalls now correctly display in the preferred
locale
- HTTP requests include the preferred locale in Accept-Language headers
- Cache clearing triggers background refetch of offerings with new
locale
- Rate limiting prevents excessive API calls when rapidly changing
locales
- Paywall tester provides comprehensive UI for testing different locales

🤖 Generated with [Claude Code](https://claude.ai/code)

---------

Co-authored-by: Claude <[email protected]>
### Motivation

Don't validate if no package components on paywall

### Description

This shouldn't be a SDK validation but a server side one
### Motivation

Improve thread safety of setting preferred locale

### Description

Make the variable `@Volatile`

Co-authored-by: Claude <[email protected]>
### Description
Follow-up to #2610. We had a non-null offeringIdentifier parameter,
which doesn't allow us to reset the offering selection to none. This
would be very uncommon, but we should still support it.
Fixes
#2588 (comment)

A new lint issue that starts happening when upgrading to AGP 8.13.0

Also wrapped the `refreshStateIfColorsChanged` in a LaunchedEffect keyed
by the inputs, so it only runs when the theme actually changes.
### Description
This PR adds a new `RevenueCatBackupAgent` that consumers of this
library can optionally use to backup revenuecat data accross
installations. To use it, developers need to add this in the
application's AndroidManifest `<application>` tag:
```
android:backupAgent="com.revenuecat.purchases.backup.RevenueCatBackupAgent"
```

After that, the shared preferences file with the main content from
RevenueCat will be saved using the device's backup system. See official
docs for this type of backup here:
https://developer.android.com/identity/data/keyvaluebackup.

If users already have their own BackupAgentHelper configured for their
app, they can just add a line to backup the
`com_revenuecat_purchases_preferences` preferences file to their
BackupAgentHelper, like:
```
SharedPreferencesBackupHelper(this, RevenueCatBackupAgent.REVENUECAT_PREFS_FILE_NAME).also {
   addHelper("revenuecat_prefs_backup", it)
}
```

This will allow customers, specially for apps using anonymous users, to
immediately regain access to any entitlements they had before changing
devices or uninstalling and reinstalling, effectively removing the need
for these users to "restore purchases".
@vegaro vegaro requested review from a team as code owners October 15, 2025 13:12
@emerge-tools
Copy link
Copy Markdown

emerge-tools bot commented Oct 15, 2025

1 build increased size

Name Version Download Change Install Change Approval
TestPurchasesUIAndroidCompatibility
com.revenuecat.testpurchasesuiandroidcompatibility
1.0 (1) 64.8 MB ⬆️ 149.9 kB (0.23%) 106.0 MB ⬆️ 434.1 kB (0.41%) N/A

TestPurchasesUIAndroidCompatibility 1.0 (1)
com.revenuecat.testpurchasesuiandroidcompatibility

⚖️ Compare build
⏱️ Analyze build performance

Total install size change: ⬆️ 434.1 kB (0.41%)
Total download size change: ⬆️ 149.9 kB (0.23%)

Largest size changes

Item Install Size Change Download Size Change
📝 com.revenuecat.purchases.virtualcurrencies.VirtualCurrencyManager ⬆️ 10.6 kB ⬆️ 3.5 kB
📝 com.revenuecat.purchases.common.SharedPreferencesManager ⬆️ 9.6 kB ⬆️ 3.2 kB
📝 kotlin.text.HexExtensionsKt ⬆️ 6.9 kB ⬆️ 2.5 kB
com.revenuecat.purchases.common.caching.DeviceCache ⬆️ 7.5 kB ⬆️ 2.4 kB
📝 com.revenuecat.purchases.ui.revenuecatui.components.button.Button... ⬆️ 4.9 kB ⬆️ 1.7 kB
View Treemap

Image of diff


🛸 Powered by Emerge Tools

Comment trigger: Size diff threshold of 100.00kB exceeded

@vegaro vegaro closed this Oct 15, 2025
@vegaro vegaro deleted the previous-major branch October 15, 2025 13:13
@vegaro vegaro restored the previous-major branch October 15, 2025 13:13
@RevenueCat-Danger-Bot
Copy link
Copy Markdown

1 Error
🚫 Label the PR using one of the change type labels. If you are not sure which label to use, choose pr:other.
Label Description
pr:feat A new feature. Use along with pr:breaking to force a major release.
pr:fix A bug fix. Use along with pr:force_minor to force a minor release.
pr:other Other changes. Catch-all for anything that doesn't fit the above categories. Releases that only contain this label will not be released. Use along with pr:force_patch, or pr:force_minor to force a patch or minor release.
pr:RevenueCatUI Use along any other tag to mark a PR that only contains RevenueCatUI changes
pr:next_release Preparing a new release
pr:dependencies Updating a dependency
pr:phc_dependencies Updating purchases-hybrid-common dependency
pr:changelog_ignore The PR will not be included in the changelog. This label doesn't determine the type of bump of the version and must be combined with pr:feat, pr:fix or pr:other.

Generated by 🚫 Danger

@emerge-tools
Copy link
Copy Markdown

emerge-tools bot commented Oct 15, 2025

📸 Snapshot Test

Some snapshots failed to render

Name Added Removed Modified Renamed Unchanged Errored Approval
TestPurchasesUIAndroidCompatibility
com.revenuecat.testpurchasesuiandroidcompatibility
2 123 18 0 256 2 ⏳ Needs approval
TestPurchasesUIAndroidCompatibility Paparazzi
com.revenuecat.testpurchasesuiandroidcompatibility.paparazzi
0 0 114 0 137 0 ⏳ Needs approval

🛸 Powered by Emerge Tools

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.