reis-mobile 0.3.6 → 0.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (463) hide show
  1. package/.claude-plugin/marketplace.json +2 -2
  2. package/.claude-plugin/plugin.json +1 -1
  3. package/CHANGELOG.md +24 -0
  4. package/README.md +175 -168
  5. package/THIRD_PARTY_NOTICES.md +224 -4
  6. package/agents/android-architect.md +89 -0
  7. package/agents/android-performance-engineer.md +92 -0
  8. package/agents/android-test-engineer.md +97 -0
  9. package/agents/flutter-test-engineer.md +2 -0
  10. package/agents/ios-architect.md +93 -0
  11. package/agents/ios-performance-engineer.md +92 -0
  12. package/agents/ios-test-engineer.md +95 -0
  13. package/agents/lead-mobile.md +10 -1
  14. package/agents/mobile-staff-engineer.md +1 -1
  15. package/agents/rn-architect.md +94 -0
  16. package/agents/rn-performance-engineer.md +92 -0
  17. package/agents/rn-test-engineer.md +98 -0
  18. package/bin/reis-mobile.mjs +59 -17
  19. package/commands/debate.md +10 -1
  20. package/commands/debug.md +60 -0
  21. package/commands/reis-mobile.md +7 -2
  22. package/core/config/project.mjs +59 -0
  23. package/core/registry/frontmatter.mjs +15 -4
  24. package/core/registry/registry.mjs +21 -1
  25. package/core/router/intents.mjs +2 -0
  26. package/core/router/router.mjs +10 -5
  27. package/package.json +1 -1
  28. package/skills/android-adaptive/SKILL.md +304 -0
  29. package/skills/android-adaptive/references/android/develop/ui/compose/layouts/adaptive/flexbox/container-behavior.md +112 -0
  30. package/skills/android-adaptive/references/android/develop/ui/compose/layouts/adaptive/flexbox/get-started.md +69 -0
  31. package/skills/android-adaptive/references/android/develop/ui/compose/layouts/adaptive/flexbox/index.md +81 -0
  32. package/skills/android-adaptive/references/android/develop/ui/compose/layouts/adaptive/flexbox/item-behavior.md +170 -0
  33. package/skills/android-adaptive/references/android/develop/ui/compose/layouts/adaptive/grid/container-properties.md +415 -0
  34. package/skills/android-adaptive/references/android/develop/ui/compose/layouts/adaptive/grid/get-started.md +51 -0
  35. package/skills/android-adaptive/references/android/develop/ui/compose/layouts/adaptive/grid/index.md +73 -0
  36. package/skills/android-adaptive/references/android/develop/ui/compose/layouts/adaptive/grid/item-properties.md +170 -0
  37. package/skills/android-adaptive/references/android/develop/ui/compose/layouts/adaptive/mediaquery/index.md +333 -0
  38. package/skills/android-adaptive/references/android/develop/ui/compose/tooling/debug.md +114 -0
  39. package/skills/android-adaptive/references/android/guide/navigation/navigation-3/recipes/material-listdetail.md +141 -0
  40. package/skills/android-agp-9-upgrade/SKILL.md +106 -0
  41. package/skills/android-agp-9-upgrade/references/android/build/migrate-to-built-in-kotlin.md +416 -0
  42. package/skills/android-agp-9-upgrade/references/android/build/releases/agp-9-0-0-release-notes.md +554 -0
  43. package/skills/android-agp-9-upgrade/references/buildconfig.md +54 -0
  44. package/skills/android-agp-9-upgrade/references/ksp-kapt.md +39 -0
  45. package/skills/android-agp-9-upgrade/references/paparazzi-gradle-9.md +30 -0
  46. package/skills/android-agp-9-upgrade/references/recipes.md +62 -0
  47. package/skills/android-appfunctions/SKILL.md +74 -0
  48. package/skills/android-appfunctions/references/adb-interaction-testing.md +95 -0
  49. package/skills/android-appfunctions/references/context.md +26 -0
  50. package/skills/android-appfunctions/references/feature-discovery-analysis.md +71 -0
  51. package/skills/android-appfunctions/references/implementation-configuration.md +282 -0
  52. package/skills/android-appfunctions/references/kdoc-refinement-optimization.md +75 -0
  53. package/skills/android-appfunctions/references/migrate-to-service-entry-point.md +226 -0
  54. package/skills/android-camerax/SKILL.md +135 -0
  55. package/skills/android-camerax/references/camera1-to-camerax.md +198 -0
  56. package/skills/android-camerax/references/camera2-to-camerax.md +193 -0
  57. package/skills/android-camerax/references/expert-blueprints.md +58 -0
  58. package/skills/android-camerax/references/foldables.md +83 -0
  59. package/skills/android-camerax/references/immutability.md +60 -0
  60. package/skills/android-camerax/references/low-light.md +124 -0
  61. package/skills/android-camerax/references/mlkit-spatial.md +75 -0
  62. package/skills/android-camerax/references/modern-apis.md +42 -0
  63. package/skills/android-camerax/references/testing.md +69 -0
  64. package/skills/android-camerax/references/thermals.md +85 -0
  65. package/skills/android-camerax/references/wear-os.md +76 -0
  66. package/skills/android-camerax/references/xr.md +54 -0
  67. package/skills/android-cli/SKILL.md +474 -0
  68. package/skills/android-cli/references/interact.md +113 -0
  69. package/skills/android-cli/references/journeys.md +120 -0
  70. package/skills/android-code-review/SKILL.md +58 -0
  71. package/skills/android-display-glasses-with-jetpack-compose-glimmer/SKILL.md +340 -0
  72. package/skills/android-display-glasses-with-jetpack-compose-glimmer/references/android/design/ui/ai-glasses/guides/interaction/inputs.md +67 -0
  73. package/skills/android-display-glasses-with-jetpack-compose-glimmer/references/android/develop/xr/jetpack-xr-sdk/access-hardware-projected-context.md +388 -0
  74. package/skills/android-display-glasses-with-jetpack-compose-glimmer/references/android/develop/xr/jetpack-xr-sdk/jetpack-compose-glimmer/buttons.md +139 -0
  75. package/skills/android-display-glasses-with-jetpack-compose-glimmer/references/android/develop/xr/jetpack-xr-sdk/jetpack-compose-glimmer/cards.md +148 -0
  76. package/skills/android-display-glasses-with-jetpack-compose-glimmer/references/android/develop/xr/jetpack-xr-sdk/jetpack-compose-glimmer/focus.md +107 -0
  77. package/skills/android-display-glasses-with-jetpack-compose-glimmer/references/android/develop/xr/jetpack-xr-sdk/jetpack-compose-glimmer/icons.md +90 -0
  78. package/skills/android-display-glasses-with-jetpack-compose-glimmer/references/android/develop/xr/jetpack-xr-sdk/jetpack-compose-glimmer/text.md +69 -0
  79. package/skills/android-display-glasses-with-jetpack-compose-glimmer/references/android/develop/xr/jetpack-xr-sdk/jetpack-compose-glimmer/title-chips.md +82 -0
  80. package/skills/android-display-glasses-with-jetpack-compose-glimmer/references/android/develop/xr/jetpack-xr-sdk/request-hardware-permissions.md +213 -0
  81. package/skills/android-display-glasses-with-jetpack-compose-glimmer/references/button-samples-source.md +176 -0
  82. package/skills/android-display-glasses-with-jetpack-compose-glimmer/references/button-source.md +203 -0
  83. package/skills/android-display-glasses-with-jetpack-compose-glimmer/references/card-samples-source.md +296 -0
  84. package/skills/android-display-glasses-with-jetpack-compose-glimmer/references/card-source.md +515 -0
  85. package/skills/android-display-glasses-with-jetpack-compose-glimmer/references/deptheffect-source.md +224 -0
  86. package/skills/android-display-glasses-with-jetpack-compose-glimmer/references/deptheffectlevels-source.md +105 -0
  87. package/skills/android-display-glasses-with-jetpack-compose-glimmer/references/glimmersansflextypography-source.md +270 -0
  88. package/skills/android-display-glasses-with-jetpack-compose-glimmer/references/glimmertheme-source.md +182 -0
  89. package/skills/android-display-glasses-with-jetpack-compose-glimmer/references/icon-source.md +388 -0
  90. package/skills/android-display-glasses-with-jetpack-compose-glimmer/references/iconbutton-source.md +126 -0
  91. package/skills/android-display-glasses-with-jetpack-compose-glimmer/references/iconsizes-source.md +78 -0
  92. package/skills/android-display-glasses-with-jetpack-compose-glimmer/references/list-source.md +27 -0
  93. package/skills/android-display-glasses-with-jetpack-compose-glimmer/references/listitem-source.md +272 -0
  94. package/skills/android-display-glasses-with-jetpack-compose-glimmer/references/liststate-source.md +427 -0
  95. package/skills/android-display-glasses-with-jetpack-compose-glimmer/references/material-hct-source.md +217 -0
  96. package/skills/android-display-glasses-with-jetpack-compose-glimmer/references/projectedcontext-source.md +265 -0
  97. package/skills/android-display-glasses-with-jetpack-compose-glimmer/references/stack-source.md +368 -0
  98. package/skills/android-display-glasses-with-jetpack-compose-glimmer/references/stackitemscope-source.md +440 -0
  99. package/skills/android-display-glasses-with-jetpack-compose-glimmer/references/stackstate-source.md +325 -0
  100. package/skills/android-display-glasses-with-jetpack-compose-glimmer/references/surface-source.md +1211 -0
  101. package/skills/android-display-glasses-with-jetpack-compose-glimmer/references/titlechip-samples-source.md +101 -0
  102. package/skills/android-display-glasses-with-jetpack-compose-glimmer/references/titlechip-source.md +131 -0
  103. package/skills/android-edge-to-edge/SKILL.md +429 -0
  104. package/skills/android-engage-sdk-integration/SKILL.md +130 -0
  105. package/skills/android-engage-sdk-integration/references/android/guide/playcore/engage/faq.md +439 -0
  106. package/skills/android-engage-sdk-integration/references/android/guide/playcore/engage/food.md +1149 -0
  107. package/skills/android-engage-sdk-integration/references/android/guide/playcore/engage/healthandfitness.md +1055 -0
  108. package/skills/android-engage-sdk-integration/references/android/guide/playcore/engage/listen.md +1050 -0
  109. package/skills/android-engage-sdk-integration/references/android/guide/playcore/engage/otherverticals.md +1301 -0
  110. package/skills/android-engage-sdk-integration/references/android/guide/playcore/engage/read.md +910 -0
  111. package/skills/android-engage-sdk-integration/references/android/guide/playcore/engage/shopping.md +1224 -0
  112. package/skills/android-engage-sdk-integration/references/android/guide/playcore/engage/social.md +719 -0
  113. package/skills/android-engage-sdk-integration/references/android/guide/playcore/engage/travel.md +1413 -0
  114. package/skills/android-engage-sdk-integration/references/android/guide/playcore/engage/tv/continue-watching/index.md +19 -0
  115. package/skills/android-engage-sdk-integration/references/android/guide/playcore/engage/tv/entitlements.md +353 -0
  116. package/skills/android-engage-sdk-integration/references/android/guide/playcore/engage/tv/getting-started.md +202 -0
  117. package/skills/android-engage-sdk-integration/references/android/guide/playcore/engage/tv/recommendations.md +471 -0
  118. package/skills/android-engage-sdk-integration/references/android/guide/playcore/engage/watch.md +1081 -0
  119. package/skills/android-engage-sdk-integration/references/clusters.md +154 -0
  120. package/skills/android-engage-sdk-integration/references/common.md +519 -0
  121. package/skills/android-engage-sdk-integration/references/patterns.md +527 -0
  122. package/skills/android-engage-sdk-integration/references/requests.md +260 -0
  123. package/skills/android-engage-sdk-integration/references/schemas/food.md +509 -0
  124. package/skills/android-engage-sdk-integration/references/schemas/listen.md +842 -0
  125. package/skills/android-engage-sdk-integration/references/schemas/other.md +220 -0
  126. package/skills/android-engage-sdk-integration/references/schemas/read.md +412 -0
  127. package/skills/android-engage-sdk-integration/references/schemas/shopping.md +357 -0
  128. package/skills/android-engage-sdk-integration/references/schemas/social.md +228 -0
  129. package/skills/android-engage-sdk-integration/references/schemas/travel.md +923 -0
  130. package/skills/android-engage-sdk-integration/references/schemas/tv.md +1226 -0
  131. package/skills/android-engage-sdk-integration/references/schemas/watch.md +1137 -0
  132. package/skills/android-engage-sdk-integration/references/troubleshooting.md +39 -0
  133. package/skills/android-gradle-build-debug/SKILL.md +71 -0
  134. package/skills/android-intent-security/SKILL.md +550 -0
  135. package/skills/android-leanback-to-compose-tv-migration/SKILL.md +743 -0
  136. package/skills/android-leanback-to-compose-tv-migration/references/android/training/tv/get-started/navigation.md +372 -0
  137. package/skills/android-leanback-to-compose-tv-migration/references/android/training/tv/playback/compose/browse.md +243 -0
  138. package/skills/android-leanback-to-compose-tv-migration/references/android/training/tv/playback/compose/index.md +153 -0
  139. package/skills/android-media3-cast-integration/SKILL.md +236 -0
  140. package/skills/android-media3-cast-integration/references/android/media/media3/cast/create-castplayer.md +390 -0
  141. package/skills/android-media3-cast-integration/references/android/media/media3/cast/customize-castoptions.md +93 -0
  142. package/skills/android-media3-cast-integration/references/android/media/media3/cast/index.md +21 -0
  143. package/skills/android-migrate-xml-views-to-jetpack-compose/SKILL.md +127 -0
  144. package/skills/android-migrate-xml-views-to-jetpack-compose/references/analysis-of-the-project-and-layout.md +42 -0
  145. package/skills/android-migrate-xml-views-to-jetpack-compose/references/android/develop/ui/compose/designsystems/migrate-xml-theme-to-compose.md +171 -0
  146. package/skills/android-migrate-xml-views-to-jetpack-compose/references/android/develop/ui/compose/migrate/interoperability-apis/compose-in-views.md +299 -0
  147. package/skills/android-migrate-xml-views-to-jetpack-compose/references/android/develop/ui/compose/migrate/interoperability-apis/views-in-compose.md +286 -0
  148. package/skills/android-migrate-xml-views-to-jetpack-compose/references/android/develop/ui/compose/setup-compose-dependencies-and-compiler.md +197 -0
  149. package/skills/android-migrate-xml-views-to-jetpack-compose/references/identify-optimal-xml-candidate.md +31 -0
  150. package/skills/android-migrate-xml-views-to-jetpack-compose/references/xml-layout-migration.md +86 -0
  151. package/skills/android-ml-kit-genai-prompt-api/SKILL.md +124 -0
  152. package/skills/android-ml-kit-genai-prompt-api/references/get-started.md +272 -0
  153. package/skills/android-ml-kit-genai-prompt-api/references/prefix-caching.md +146 -0
  154. package/skills/android-ml-kit-genai-prompt-api/references/prompt-design.md +55 -0
  155. package/skills/android-ml-kit-genai-prompt-api/references/prompt-optimization.md +74 -0
  156. package/skills/android-ml-kit-genai-prompt-api/references/structured-output.md +219 -0
  157. package/skills/android-ml-kit-genai-prompt-api/references/system-instructions.md +71 -0
  158. package/skills/android-navigation-3/SKILL.md +122 -0
  159. package/skills/android-navigation-3/references/android/guide/navigation/navigation-3/index.md +51 -0
  160. package/skills/android-navigation-3/references/android/guide/navigation/navigation-3/migration-guide.md +670 -0
  161. package/skills/android-navigation-3/references/android/guide/navigation/navigation-3/recipes/animations.md +147 -0
  162. package/skills/android-navigation-3/references/android/guide/navigation/navigation-3/recipes/basic.md +89 -0
  163. package/skills/android-navigation-3/references/android/guide/navigation/navigation-3/recipes/basicdsl.md +85 -0
  164. package/skills/android-navigation-3/references/android/guide/navigation/navigation-3/recipes/basicsaveable.md +90 -0
  165. package/skills/android-navigation-3/references/android/guide/navigation/navigation-3/recipes/bottomsheet.md +195 -0
  166. package/skills/android-navigation-3/references/android/guide/navigation/navigation-3/recipes/common-ui.md +200 -0
  167. package/skills/android-navigation-3/references/android/guide/navigation/navigation-3/recipes/conditional-transitions.md +182 -0
  168. package/skills/android-navigation-3/references/android/guide/navigation/navigation-3/recipes/conditional.md +230 -0
  169. package/skills/android-navigation-3/references/android/guide/navigation/navigation-3/recipes/deeplinks-custommatcher.md +176 -0
  170. package/skills/android-navigation-3/references/android/guide/navigation/navigation-3/recipes/deeplinks-staticuri.md +140 -0
  171. package/skills/android-navigation-3/references/android/guide/navigation/navigation-3/recipes/deeplinks-syntheticbackstack.md +184 -0
  172. package/skills/android-navigation-3/references/android/guide/navigation/navigation-3/recipes/dialog.md +107 -0
  173. package/skills/android-navigation-3/references/android/guide/navigation/navigation-3/recipes/lifecycle-owner.md +185 -0
  174. package/skills/android-navigation-3/references/android/guide/navigation/navigation-3/recipes/material-listdetail.md +141 -0
  175. package/skills/android-navigation-3/references/android/guide/navigation/navigation-3/recipes/material-supportingpane.md +145 -0
  176. package/skills/android-navigation-3/references/android/guide/navigation/navigation-3/recipes/modular-hilt.md +283 -0
  177. package/skills/android-navigation-3/references/android/guide/navigation/navigation-3/recipes/modular-koin.md +287 -0
  178. package/skills/android-navigation-3/references/android/guide/navigation/navigation-3/recipes/multiple-backstacks.md +468 -0
  179. package/skills/android-navigation-3/references/android/guide/navigation/navigation-3/recipes/passingarguments.md +371 -0
  180. package/skills/android-navigation-3/references/android/guide/navigation/navigation-3/recipes/results-event.md +273 -0
  181. package/skills/android-navigation-3/references/android/guide/navigation/navigation-3/recipes/results-state.md +266 -0
  182. package/skills/android-navigation-3/references/android/guide/navigation/navigation-3/recipes/scenes-listdetail.md +435 -0
  183. package/skills/android-navigation-3/references/android/guide/navigation/navigation-3/recipes/scenes-twopane.md +244 -0
  184. package/skills/android-navigation-3/references/android/guide/navigation/type-safe-destinations.md +129 -0
  185. package/skills/android-navigation-event/SKILL.md +312 -0
  186. package/skills/android-navigation-event/references/android/guide/navigation/navigation-event/dispatcher.md +134 -0
  187. package/skills/android-navigation-event/references/android/guide/navigation/navigation-event/handle-back.md +217 -0
  188. package/skills/android-navigation-event/references/android/guide/navigation/navigation-event/index.md +83 -0
  189. package/skills/android-navigation-event/references/android/guide/navigation/navigation-event/setup.md +32 -0
  190. package/skills/android-play-billing-library-version-upgrade/SKILL.md +96 -0
  191. package/skills/android-play-billing-library-version-upgrade/references/android/google/play/billing/release-notes.md +1240 -0
  192. package/skills/android-play-billing-library-version-upgrade/references/migration-logic.md +78 -0
  193. package/skills/android-play-billing-library-version-upgrade/references/version-checklist.md +54 -0
  194. package/skills/android-play-policy-insights/SKILL.md +172 -0
  195. package/skills/android-play-policy-insights/resources/common_mandates.md +100 -0
  196. package/skills/android-play-policy-insights/resources/compliance_report_template.md +59 -0
  197. package/skills/android-play-policy-insights/resources/critic.md +86 -0
  198. package/skills/android-play-policy-insights/resources/goal_data_safety.md +212 -0
  199. package/skills/android-play-policy-insights/resources/goal_permissions_and_apis.md +459 -0
  200. package/skills/android-play-policy-insights/resources/goal_user_account.md +106 -0
  201. package/skills/android-play-policy-insights/resources/policies.json +321 -0
  202. package/skills/android-play-policy-insights/resources/scanner_config.json +843 -0
  203. package/skills/android-play-policy-insights/scripts/generate_report.py +860 -0
  204. package/skills/android-play-policy-insights/scripts/orchestrator.py +1313 -0
  205. package/skills/android-play-policy-insights/scripts/play_store_scraper.py +410 -0
  206. package/skills/android-play-policy-insights/scripts/scanner.py +261 -0
  207. package/skills/android-play-policy-insights/scripts/template_engine.py +243 -0
  208. package/skills/android-profiler/SKILL.md +60 -0
  209. package/skills/android-profiler/analysis/analysis_orchestrator.md +32 -0
  210. package/skills/android-profiler/analysis/workflows/perfetto-sql/perfetto_sql.md +28 -0
  211. package/skills/android-profiler/analysis/workflows/perfetto-trace-analysis/perfetto_trace_analysis.md +121 -0
  212. package/skills/android-profiler/analysis/workflows/perfetto-trace-analysis/references/guiding_principles.md +51 -0
  213. package/skills/android-profiler/analysis/workflows/perfetto-trace-analysis/references/hints/domain_hints_template.md +7 -0
  214. package/skills/android-profiler/analysis/workflows/perfetto-trace-analysis/references/hints/subsystems/hints_cpu.md +56 -0
  215. package/skills/android-profiler/analysis/workflows/perfetto-trace-analysis/references/hints/subsystems/hints_graphics.md +51 -0
  216. package/skills/android-profiler/analysis/workflows/perfetto-trace-analysis/references/hints/subsystems/hints_io.md +46 -0
  217. package/skills/android-profiler/analysis/workflows/perfetto-trace-analysis/references/hints/subsystems/hints_ipc.md +41 -0
  218. package/skills/android-profiler/analysis/workflows/perfetto-trace-analysis/references/hints/subsystems/hints_memory.md +55 -0
  219. package/skills/android-profiler/analysis/workflows/perfetto-trace-analysis/references/hints/subsystems/hints_power.md +33 -0
  220. package/skills/android-profiler/analysis/workflows/perfetto-trace-analysis/references/per_candidate_analysis.md +172 -0
  221. package/skills/android-profiler/analysis/workflows/perfetto-trace-analysis/references/triage.md +94 -0
  222. package/skills/android-profiler/recording/recording_orchestrator.md +36 -0
  223. package/skills/android-profiler/recording/workflows/perfetto-trace-recording/perfetto_trace_recording.md +148 -0
  224. package/skills/android-profiler/recording/workflows/perfetto-trace-recording/references/example-configs/app_jank.pftxt +43 -0
  225. package/skills/android-profiler/recording/workflows/perfetto-trace-recording/references/example-configs/cpu_profile.pftxt +35 -0
  226. package/skills/android-profiler/recording/workflows/perfetto-trace-recording/references/example-configs/java_heap_dump.pftxt +21 -0
  227. package/skills/android-profiler/recording/workflows/perfetto-trace-recording/references/example-configs/long_background.pftxt +37 -0
  228. package/skills/android-profiler/recording/workflows/perfetto-trace-recording/references/example-configs/memory_counters.pftxt +45 -0
  229. package/skills/android-profiler/recording/workflows/perfetto-trace-recording/references/example-configs/native_heap.pftxt +21 -0
  230. package/skills/android-profiler/recording/workflows/perfetto-trace-recording/references/example-configs/sched_cpu.pftxt +33 -0
  231. package/skills/android-profiler/recording/workflows/perfetto-trace-recording/references/trace_config_reference.md +102 -0
  232. package/skills/android-profiler/references/env_setup.md +15 -0
  233. package/skills/android-profiler/references/perfetto/setup.md +29 -0
  234. package/skills/android-profiler/references/perfetto/sql.md +327 -0
  235. package/skills/android-r8-analyzer/SKILL.md +72 -0
  236. package/skills/android-r8-analyzer/references/CONFIGURATION-ANALYZER.md +287 -0
  237. package/skills/android-r8-analyzer/references/CONFIGURATION.md +44 -0
  238. package/skills/android-r8-analyzer/references/KEEP-RULES-IMPACT-HIERARCHY.md +83 -0
  239. package/skills/android-r8-analyzer/references/REDUNDANT-RULES.md +222 -0
  240. package/skills/android-r8-analyzer/references/REFLECTION-GUIDE.md +139 -0
  241. package/skills/android-r8-analyzer/references/REPORT_FORMAT.md +51 -0
  242. package/skills/android-r8-analyzer/references/android/topic/performance/app-optimization/enable-app-optimization.md +252 -0
  243. package/skills/android-r8-analyzer/references/android/training/testing/other-components/ui-automator.md +312 -0
  244. package/skills/android-restore-credentials/SKILL.md +359 -0
  245. package/skills/android-restore-credentials/references/android/guide/topics/manifest/application-element.md +832 -0
  246. package/skills/android-restore-credentials/references/android/identity/passkeys/create-passkeys.md +327 -0
  247. package/skills/android-restore-credentials/references/android/identity/passkeys/sign-in-with-passkeys.md +219 -0
  248. package/skills/android-styles/SKILL.md +229 -0
  249. package/skills/android-styles/references/android/develop/ui/compose/designsystems/custom.md +459 -0
  250. package/skills/android-styles/references/android/develop/ui/compose/styles/fundamentals.md +421 -0
  251. package/skills/android-styles/references/android/develop/ui/compose/styles/state-animations.md +461 -0
  252. package/skills/android-styles/references/android/develop/ui/compose/styles/styles-vs-modifiers.md +48 -0
  253. package/skills/android-styles/references/android/develop/ui/compose/styles/theming.md +269 -0
  254. package/skills/android-verified-email/SKILL.md +432 -0
  255. package/skills/android-verified-email/references/android/identity/credential-manager/index.md +67 -0
  256. package/skills/android-verified-email/references/android/identity/digital-credentials/credential-verifier.md +166 -0
  257. package/skills/android-verified-email/references/android/identity/digital-credentials/email-verification-implementation.md +313 -0
  258. package/skills/android-verified-email/references/android/identity/digital-credentials/email-verification.md +158 -0
  259. package/skills/android-verified-email/references/android/identity/digital-credentials/index.md +112 -0
  260. package/skills/android-verified-email/references/android/identity/passkeys/create-passkeys.md +327 -0
  261. package/skills/android-verified-email/references/android/identity/sign-in/credential-manager-webview.md +84 -0
  262. package/skills/android-wear-compose-m3/SKILL.md +365 -0
  263. package/skills/android-wear-compose-m3/references/android/training/wearables/compose/migrate-to-material3.md +677 -0
  264. package/skills/android-wear-compose-m3/references/foundation/AmbientModeSample.kt.md +123 -0
  265. package/skills/android-wear-compose-m3/references/foundation/AmbientModeSample.kt.md.txt +123 -0
  266. package/skills/android-wear-compose-m3/references/foundation/CurvedWorldSample.kt.md +430 -0
  267. package/skills/android-wear-compose-m3/references/foundation/CurvedWorldSample.kt.md.txt +430 -0
  268. package/skills/android-wear-compose-m3/references/foundation/ExpandableSample.kt.md +99 -0
  269. package/skills/android-wear-compose-m3/references/foundation/ExpandableSample.kt.md.txt +99 -0
  270. package/skills/android-wear-compose-m3/references/foundation/HierarchicalFocusSample.kt.md +141 -0
  271. package/skills/android-wear-compose-m3/references/foundation/HierarchicalFocusSample.kt.md.txt +141 -0
  272. package/skills/android-wear-compose-m3/references/foundation/PagerSamples.kt.md +56 -0
  273. package/skills/android-wear-compose-m3/references/foundation/PagerSamples.kt.md.txt +56 -0
  274. package/skills/android-wear-compose-m3/references/foundation/RotarySamples.kt.md +153 -0
  275. package/skills/android-wear-compose-m3/references/foundation/RotarySamples.kt.md.txt +153 -0
  276. package/skills/android-wear-compose-m3/references/foundation/ScalingLazyColumnSample.kt.md +131 -0
  277. package/skills/android-wear-compose-m3/references/foundation/ScalingLazyColumnSample.kt.md.txt +131 -0
  278. package/skills/android-wear-compose-m3/references/foundation/SwipeToDismissBoxSample.kt.md +169 -0
  279. package/skills/android-wear-compose-m3/references/foundation/SwipeToDismissBoxSample.kt.md.txt +169 -0
  280. package/skills/android-wear-compose-m3/references/foundation/SwipeToRevealSample.kt.md +282 -0
  281. package/skills/android-wear-compose-m3/references/foundation/SwipeToRevealSample.kt.md.txt +282 -0
  282. package/skills/android-wear-compose-m3/references/foundation/TransformingLazyColumnSample.kt.md +335 -0
  283. package/skills/android-wear-compose-m3/references/foundation/TransformingLazyColumnSample.kt.md.txt +335 -0
  284. package/skills/android-wear-compose-m3/references/material3/AlertDialogSample.kt.md +377 -0
  285. package/skills/android-wear-compose-m3/references/material3/AlertDialogSample.kt.md.txt +377 -0
  286. package/skills/android-wear-compose-m3/references/material3/AnimatedTextSample.kt.md +165 -0
  287. package/skills/android-wear-compose-m3/references/material3/AnimatedTextSample.kt.md.txt +165 -0
  288. package/skills/android-wear-compose-m3/references/material3/ButtonGroupSample.kt.md +91 -0
  289. package/skills/android-wear-compose-m3/references/material3/ButtonGroupSample.kt.md.txt +91 -0
  290. package/skills/android-wear-compose-m3/references/material3/ButtonSample.kt.md +496 -0
  291. package/skills/android-wear-compose-m3/references/material3/ButtonSample.kt.md.txt +496 -0
  292. package/skills/android-wear-compose-m3/references/material3/CardSample.kt.md +470 -0
  293. package/skills/android-wear-compose-m3/references/material3/CardSample.kt.md.txt +470 -0
  294. package/skills/android-wear-compose-m3/references/material3/CheckboxButtonSample.kt.md +67 -0
  295. package/skills/android-wear-compose-m3/references/material3/CheckboxButtonSample.kt.md.txt +67 -0
  296. package/skills/android-wear-compose-m3/references/material3/ConfirmationDialogSample.kt.md +162 -0
  297. package/skills/android-wear-compose-m3/references/material3/ConfirmationDialogSample.kt.md.txt +162 -0
  298. package/skills/android-wear-compose-m3/references/material3/CurvedTextSamples.kt.md +78 -0
  299. package/skills/android-wear-compose-m3/references/material3/CurvedTextSamples.kt.md.txt +78 -0
  300. package/skills/android-wear-compose-m3/references/material3/DatePickerSample.kt.md +131 -0
  301. package/skills/android-wear-compose-m3/references/material3/DatePickerSample.kt.md.txt +131 -0
  302. package/skills/android-wear-compose-m3/references/material3/DynamicColorSchemeSample.kt.md +74 -0
  303. package/skills/android-wear-compose-m3/references/material3/DynamicColorSchemeSample.kt.md.txt +74 -0
  304. package/skills/android-wear-compose-m3/references/material3/EdgeButtonSample.kt.md +63 -0
  305. package/skills/android-wear-compose-m3/references/material3/EdgeButtonSample.kt.md.txt +63 -0
  306. package/skills/android-wear-compose-m3/references/material3/FadingExpandingLabelSample.kt.md +60 -0
  307. package/skills/android-wear-compose-m3/references/material3/FadingExpandingLabelSample.kt.md.txt +60 -0
  308. package/skills/android-wear-compose-m3/references/material3/IconButtonSample.kt.md +125 -0
  309. package/skills/android-wear-compose-m3/references/material3/IconButtonSample.kt.md.txt +125 -0
  310. package/skills/android-wear-compose-m3/references/material3/IconToggleButtonSample.kt.md +116 -0
  311. package/skills/android-wear-compose-m3/references/material3/IconToggleButtonSample.kt.md.txt +116 -0
  312. package/skills/android-wear-compose-m3/references/material3/LevelIndicatorSample.kt.md +68 -0
  313. package/skills/android-wear-compose-m3/references/material3/LevelIndicatorSample.kt.md.txt +68 -0
  314. package/skills/android-wear-compose-m3/references/material3/LinearProgressIndicatorSample.kt.md +50 -0
  315. package/skills/android-wear-compose-m3/references/material3/LinearProgressIndicatorSample.kt.md.txt +50 -0
  316. package/skills/android-wear-compose-m3/references/material3/ListHeaderSample.kt.md +177 -0
  317. package/skills/android-wear-compose-m3/references/material3/ListHeaderSample.kt.md.txt +177 -0
  318. package/skills/android-wear-compose-m3/references/material3/OneHandedGestureSamples.kt.md +651 -0
  319. package/skills/android-wear-compose-m3/references/material3/OneHandedGestureSamples.kt.md.txt +651 -0
  320. package/skills/android-wear-compose-m3/references/material3/OpenOnPhoneDialogSample.kt.md +57 -0
  321. package/skills/android-wear-compose-m3/references/material3/OpenOnPhoneDialogSample.kt.md.txt +57 -0
  322. package/skills/android-wear-compose-m3/references/material3/PageIndicatorSample.kt.md +110 -0
  323. package/skills/android-wear-compose-m3/references/material3/PageIndicatorSample.kt.md.txt +110 -0
  324. package/skills/android-wear-compose-m3/references/material3/PagerScaffoldSample.kt.md +204 -0
  325. package/skills/android-wear-compose-m3/references/material3/PagerScaffoldSample.kt.md.txt +204 -0
  326. package/skills/android-wear-compose-m3/references/material3/PickerGroupSample.kt.md +139 -0
  327. package/skills/android-wear-compose-m3/references/material3/PickerGroupSample.kt.md.txt +139 -0
  328. package/skills/android-wear-compose-m3/references/material3/PickerSample.kt.md +111 -0
  329. package/skills/android-wear-compose-m3/references/material3/PickerSample.kt.md.txt +111 -0
  330. package/skills/android-wear-compose-m3/references/material3/PlaceholderSample.kt.md +184 -0
  331. package/skills/android-wear-compose-m3/references/material3/PlaceholderSample.kt.md.txt +184 -0
  332. package/skills/android-wear-compose-m3/references/material3/ProgressIndicatorSample.kt.md +263 -0
  333. package/skills/android-wear-compose-m3/references/material3/ProgressIndicatorSample.kt.md.txt +263 -0
  334. package/skills/android-wear-compose-m3/references/material3/RadioButtonSample.kt.md +105 -0
  335. package/skills/android-wear-compose-m3/references/material3/RadioButtonSample.kt.md.txt +105 -0
  336. package/skills/android-wear-compose-m3/references/material3/ScaffoldSample.kt.md +146 -0
  337. package/skills/android-wear-compose-m3/references/material3/ScaffoldSample.kt.md.txt +146 -0
  338. package/skills/android-wear-compose-m3/references/material3/ScrollAwaySample.kt.md +97 -0
  339. package/skills/android-wear-compose-m3/references/material3/ScrollAwaySample.kt.md.txt +97 -0
  340. package/skills/android-wear-compose-m3/references/material3/ScrollIndicatorSample.kt.md +66 -0
  341. package/skills/android-wear-compose-m3/references/material3/ScrollIndicatorSample.kt.md.txt +66 -0
  342. package/skills/android-wear-compose-m3/references/material3/SliderSample.kt.md +86 -0
  343. package/skills/android-wear-compose-m3/references/material3/SliderSample.kt.md.txt +86 -0
  344. package/skills/android-wear-compose-m3/references/material3/StepperSample.kt.md +148 -0
  345. package/skills/android-wear-compose-m3/references/material3/StepperSample.kt.md.txt +148 -0
  346. package/skills/android-wear-compose-m3/references/material3/SurfaceTransformationSample.kt.md +166 -0
  347. package/skills/android-wear-compose-m3/references/material3/SurfaceTransformationSample.kt.md.txt +166 -0
  348. package/skills/android-wear-compose-m3/references/material3/SwipeToDismissBoxSample.kt.md +172 -0
  349. package/skills/android-wear-compose-m3/references/material3/SwipeToDismissBoxSample.kt.md.txt +172 -0
  350. package/skills/android-wear-compose-m3/references/material3/SwipeToRevealSample.kt.md +367 -0
  351. package/skills/android-wear-compose-m3/references/material3/SwipeToRevealSample.kt.md.txt +367 -0
  352. package/skills/android-wear-compose-m3/references/material3/SwitchButtonSample.kt.md +66 -0
  353. package/skills/android-wear-compose-m3/references/material3/SwitchButtonSample.kt.md.txt +66 -0
  354. package/skills/android-wear-compose-m3/references/material3/TextButtonSample.kt.md +115 -0
  355. package/skills/android-wear-compose-m3/references/material3/TextButtonSample.kt.md.txt +115 -0
  356. package/skills/android-wear-compose-m3/references/material3/TextToggleButtonSample.kt.md +71 -0
  357. package/skills/android-wear-compose-m3/references/material3/TextToggleButtonSample.kt.md.txt +71 -0
  358. package/skills/android-wear-compose-m3/references/material3/TimePickerSample.kt.md +151 -0
  359. package/skills/android-wear-compose-m3/references/material3/TimePickerSample.kt.md.txt +151 -0
  360. package/skills/android-wear-compose-m3/references/material3/TimeTextSample.kt.md +65 -0
  361. package/skills/android-wear-compose-m3/references/material3/TimeTextSample.kt.md.txt +65 -0
  362. package/skills/android-wear-compose-m3/references/material3/TransformationSpecSample.kt.md +246 -0
  363. package/skills/android-wear-compose-m3/references/material3/TransformationSpecSample.kt.md.txt +246 -0
  364. package/skills/android-wear-compose-m3/references/material3/TransformingLazyColumnNotificationsSample.kt.md +89 -0
  365. package/skills/android-wear-compose-m3/references/material3/TransformingLazyColumnNotificationsSample.kt.md.txt +89 -0
  366. package/skills/android-wear-compose-m3/references/material3/TransformingLazyColumnSample.kt.md +309 -0
  367. package/skills/android-wear-compose-m3/references/material3/TransformingLazyColumnSample.kt.md.txt +309 -0
  368. package/skills/android-wear-compose-m3/references/navigation3/SwipeDismissableSceneStrategySample.kt.md +205 -0
  369. package/skills/android-wear-compose-m3/references/navigation3/SwipeDismissableSceneStrategySample.kt.md.txt +205 -0
  370. package/skills/{architecture-feature-first → flutter-architecture-feature-first}/SKILL.md +1 -1
  371. package/skills/{bloc → flutter-bloc}/SKILL.md +1 -1
  372. package/skills/flutter-build-debug/SKILL.md +66 -0
  373. package/skills/{code-review → flutter-code-review}/SKILL.md +1 -1
  374. package/skills/{dart-3-updates → flutter-dart-3-updates}/SKILL.md +1 -1
  375. package/skills/{dart-fix-runtime-errors → flutter-dart-fix-runtime-errors}/SKILL.md +1 -1
  376. package/skills/{dart-resolve-package-conflicts → flutter-dart-resolve-package-conflicts}/SKILL.md +1 -1
  377. package/skills/{dart-run-static-analysis → flutter-dart-run-static-analysis}/SKILL.md +1 -1
  378. package/skills/{dart-use-pattern-matching → flutter-dart-use-pattern-matching}/SKILL.md +1 -1
  379. package/skills/{effective-dart → flutter-effective-dart}/SKILL.md +1 -1
  380. package/skills/{provider → flutter-provider}/SKILL.md +1 -1
  381. package/skills/{riverpod → flutter-riverpod}/SKILL.md +1 -1
  382. package/skills/ios-cocoapods-debug/SKILL.md +65 -0
  383. package/skills/ios-code-review/SKILL.md +56 -0
  384. package/skills/ios-xcode-build-debug/SKILL.md +66 -0
  385. package/skills/{detect-mobile-stack → mobile-detect-stack}/SKILL.md +1 -1
  386. package/skills/mobile-firebase/SKILL.md +54 -0
  387. package/skills/mobile-firebase/references/android/ai-logic.md +31 -0
  388. package/skills/mobile-firebase/references/android/analytics.md +33 -0
  389. package/skills/mobile-firebase/references/android/app-check.md +36 -0
  390. package/skills/mobile-firebase/references/android/auth.md +44 -0
  391. package/skills/mobile-firebase/references/android/crashlytics.md +31 -0
  392. package/skills/mobile-firebase/references/android/firestore.md +44 -0
  393. package/skills/mobile-firebase/references/android/functions.md +33 -0
  394. package/skills/mobile-firebase/references/android/in-app-messaging.md +28 -0
  395. package/skills/mobile-firebase/references/android/messaging.md +41 -0
  396. package/skills/mobile-firebase/references/android/realtime-database.md +50 -0
  397. package/skills/mobile-firebase/references/android/remote-config.md +43 -0
  398. package/skills/mobile-firebase/references/android/sql-connect.md +31 -0
  399. package/skills/mobile-firebase/references/android/storage.md +39 -0
  400. package/skills/mobile-firebase/references/android.md +30 -0
  401. package/skills/{firebase-ai/SKILL.md → mobile-firebase/references/flutter/ai-logic.md} +2 -8
  402. package/skills/{firebase-analytics/SKILL.md → mobile-firebase/references/flutter/analytics.md} +2 -8
  403. package/skills/{firebase-app-check/SKILL.md → mobile-firebase/references/flutter/app-check.md} +2 -8
  404. package/skills/{firebase-auth/SKILL.md → mobile-firebase/references/flutter/auth.md} +2 -8
  405. package/skills/{firebase-crashlytics/SKILL.md → mobile-firebase/references/flutter/crashlytics.md} +2 -8
  406. package/skills/{firebase-cloud-firestore/SKILL.md → mobile-firebase/references/flutter/firestore.md} +2 -8
  407. package/skills/{firebase-cloud-functions/SKILL.md → mobile-firebase/references/flutter/functions.md} +2 -8
  408. package/skills/{firebase-in-app-messaging/SKILL.md → mobile-firebase/references/flutter/in-app-messaging.md} +2 -8
  409. package/skills/{firebase-messaging/SKILL.md → mobile-firebase/references/flutter/messaging.md} +2 -8
  410. package/skills/{firebase-database/SKILL.md → mobile-firebase/references/flutter/realtime-database.md} +2 -8
  411. package/skills/{firebase-remote-config/SKILL.md → mobile-firebase/references/flutter/remote-config.md} +2 -8
  412. package/skills/{flutterfire-configure/SKILL.md → mobile-firebase/references/flutter/setup-flutterfire.md} +1 -8
  413. package/skills/{firebase-data-connect/SKILL.md → mobile-firebase/references/flutter/sql-connect.md} +2 -8
  414. package/skills/{firebase-storage/SKILL.md → mobile-firebase/references/flutter/storage.md} +2 -8
  415. package/skills/mobile-firebase/references/flutter.md +36 -0
  416. package/skills/mobile-firebase/references/ios/ai-logic.md +30 -0
  417. package/skills/mobile-firebase/references/ios/analytics.md +33 -0
  418. package/skills/mobile-firebase/references/ios/app-check.md +36 -0
  419. package/skills/mobile-firebase/references/ios/auth.md +48 -0
  420. package/skills/mobile-firebase/references/ios/crashlytics.md +34 -0
  421. package/skills/mobile-firebase/references/ios/firestore.md +53 -0
  422. package/skills/mobile-firebase/references/ios/functions.md +35 -0
  423. package/skills/mobile-firebase/references/ios/in-app-messaging.md +26 -0
  424. package/skills/mobile-firebase/references/ios/messaging.md +45 -0
  425. package/skills/mobile-firebase/references/ios/realtime-database.md +49 -0
  426. package/skills/mobile-firebase/references/ios/remote-config.md +44 -0
  427. package/skills/mobile-firebase/references/ios/sql-connect.md +33 -0
  428. package/skills/mobile-firebase/references/ios/storage.md +36 -0
  429. package/skills/mobile-firebase/references/ios.md +28 -0
  430. package/skills/mobile-firebase/references/react-native/ai-logic.md +32 -0
  431. package/skills/mobile-firebase/references/react-native/analytics.md +43 -0
  432. package/skills/mobile-firebase/references/react-native/app-check.md +35 -0
  433. package/skills/mobile-firebase/references/react-native/auth.md +50 -0
  434. package/skills/mobile-firebase/references/react-native/crashlytics.md +36 -0
  435. package/skills/mobile-firebase/references/react-native/firestore.md +45 -0
  436. package/skills/mobile-firebase/references/react-native/functions.md +28 -0
  437. package/skills/mobile-firebase/references/react-native/in-app-messaging.md +27 -0
  438. package/skills/mobile-firebase/references/react-native/messaging.md +46 -0
  439. package/skills/mobile-firebase/references/react-native/realtime-database.md +46 -0
  440. package/skills/mobile-firebase/references/react-native/remote-config.md +32 -0
  441. package/skills/mobile-firebase/references/react-native/sql-connect.md +11 -0
  442. package/skills/mobile-firebase/references/react-native/storage.md +30 -0
  443. package/skills/mobile-firebase/references/react-native.md +29 -0
  444. package/skills/mobile-test/SKILL.md +63 -0
  445. package/skills/mobile-test/references/android/setup/GUIDE.md +183 -0
  446. package/skills/mobile-test/references/android/setup/references/android/develop/ui/compose/testing/common-patterns.md +181 -0
  447. package/skills/mobile-test/references/android/setup/references/android/studio/preview/compose-screenshot-testing.md +255 -0
  448. package/skills/mobile-test/references/android/setup/references/android/training/dependency-injection/hilt-testing.md +447 -0
  449. package/skills/mobile-test/references/android.md +83 -0
  450. package/skills/{dart-collect-coverage/SKILL.md → mobile-test/references/flutter/coverage.md} +2 -11
  451. package/skills/{dart-generate-test-mocks/SKILL.md → mobile-test/references/flutter/generate-mocks.md} +2 -11
  452. package/skills/{flutter-add-integration-test/SKILL.md → mobile-test/references/flutter/integration-tests.md} +2 -11
  453. package/skills/{dart-migrate-to-checks-package/SKILL.md → mobile-test/references/flutter/migrate-to-checks.md} +2 -13
  454. package/skills/{mockito/SKILL.md → mobile-test/references/flutter/mockito.md} +1 -8
  455. package/skills/{mocktail/SKILL.md → mobile-test/references/flutter/mocktail.md} +1 -8
  456. package/skills/{patrol-e2e-testing/SKILL.md → mobile-test/references/flutter/patrol.md} +1 -8
  457. package/skills/{testing/SKILL.md → mobile-test/references/flutter/testing-guidelines.md} +1 -8
  458. package/skills/{dart-add-unit-test/SKILL.md → mobile-test/references/flutter/unit-tests.md} +2 -11
  459. package/skills/{flutter-add-widget-test/SKILL.md → mobile-test/references/flutter/widget-tests.md} +2 -11
  460. package/skills/mobile-test/references/flutter.md +44 -0
  461. package/skills/mobile-test/references/ios.md +79 -0
  462. package/skills/mobile-test/references/react-native.md +62 -0
  463. /package/skills/{dart-use-pattern-matching → flutter-dart-use-pattern-matching}/examples/json_patterns.dart +0 -0
@@ -0,0 +1,1240 @@
1
+ This document contains release notes for the Google Play Billing Library.
2
+
3
+
4
+ ## Android skills
5
+
6
+ [View on GitHub](https://github.com/android/skills/tree/main/play/play-billing-library-version-upgrade)
7
+
8
+ ### Upgrade Play Billing Library
9
+
10
+ Use the Play Billing Library [Android skill](https://developer.android.com/tools/agents/android-skills) to automate your upgrade to the latest version. To install the skill from the [Android CLI](https://developer.android.com/tools/agents/android-cli), run:
11
+
12
+ android skills add play-billing-library-version-upgrade
13
+
14
+ To activate the skill, try the following prompt:
15
+
16
+ Help me upgrade my Play Billing Library implementation.
17
+
18
+ <br />
19
+
20
+ ## Google Play Billing Library 9.1.0 Release (2026-06-18)
21
+
22
+ Version 9.1.0 of the Google Play Billing Library and Kotlin extensions are now available.
23
+
24
+ ### Summary of changes
25
+
26
+ - New APIs for [Billing Choice](https://developer.android.com/google/play/billing/billingchoice):
27
+ - Added [`BillingClient.getBillingChoiceInfoAsync()`](https://developer.android.com/reference/com/android/billingclient/api/BillingClient#getBillingChoiceInfoAsync(com.android.billingclient.api.GetBillingChoiceInfoParams,com.android.billingclient.api.BillingChoiceInfoResponseListener)) to retrieve information about billing choices available to the user.
28
+ - Added [`BillingChoiceInfo`](https://developer.android.com/reference/com/android/billingclient/api/BillingChoiceInfo) class which contains the response details, including image URLs and loyalty information.
29
+ - Added [`GetBillingChoiceInfoParams`](https://developer.android.com/reference/com/android/billingclient/api/GetBillingChoiceInfoParams) to configure the request.
30
+ - Added [`BillingChoiceInfoResponseListener`](https://developer.android.com/reference/com/android/billingclient/api/BillingChoiceInfoResponseListener) to receive the callback.
31
+ - Added Kotlin extension [`BillingClient.getBillingChoiceInfo()`](https://developer.android.com/reference/kotlin/com/android/billingclient/api/package-summary#(com.android.billingclient.api.BillingClient).getBillingChoiceInfo(com.android.billingclient.api.GetBillingChoiceInfoParams)) suspend function.
32
+ - Added [`BillingClient.showBillingProgramInformationDialog()`](https://developer.android.com/reference/com/android/billingclient/api/BillingClient#showBillingProgramInformationDialog(android.app.Activity,com.android.billingclient.api.BillingProgramInformationDialogParams,com.android.billingclient.api.BillingProgramInformationDialogListener)) to show an information dialog for a billing program.
33
+ - Added [`BillingProgramInformationDialogParams`](https://developer.android.com/reference/com/android/billingclient/api/BillingProgramInformationDialogParams) to configure the dialog.
34
+ - Added [`BillingProgramInformationDialogListener`](https://developer.android.com/reference/com/android/billingclient/api/BillingProgramInformationDialogListener) to receive the callback.
35
+ - Added [`BillingProgramAvailabilityDetails.BillingChoiceAvailabilityDetails`](https://developer.android.com/reference/com/android/billingclient/api/BillingProgramAvailabilityDetails.BillingChoiceAvailabilityDetails) to provide details about billing choice availability.
36
+ - Added [`ChoiceScreenType`](https://developer.android.com/reference/com/android/billingclient/api/BillingProgramAvailabilityDetails.BillingChoiceAvailabilityDetails.ChoiceScreenType) to specify the type of choice screen.
37
+
38
+ ## Google Play Billing Library 9.0.0 Release (2026-05-19)
39
+
40
+ Version 9.0.0 of the Google Play Billing Library and Kotlin extensions are
41
+ now available. See the [PBL 9 migration guide](https://developer.android.com/google/play/billing/migrate-pbl-latest) if you want to migrate from
42
+ the previous versions of PBL.
43
+
44
+ ### Summary of changes
45
+
46
+ - **Updated error codes for blocked Play Store activity** : Error codes for
47
+ blocked Play Store apps have been updated. For instances where
48
+ the Play Store app is blocked by the system
49
+ (for example, in OEM-customized kids mode), the response code has
50
+ changed from `ERROR` to `BILLING_UNAVAILABLE`. Additionally, the
51
+ `BillingResult` for such cases now provides a *Play Store is blocked*
52
+ debug message.
53
+
54
+ > [!NOTE]
55
+ > **Note:** For this feature to work, you need [AndroidX.core library](https://developer.android.com/jetpack/androidx/releases/core#core_and_core-ktx_version_190_2) version 1.9 or later.
56
+
57
+ - **Nullability update for developer-provided billing** : The
58
+ [`DeveloperProvidedBillingDetails.getLinkUri()`](https://developer.android.com/reference/com/android/billingclient/api/DeveloperProvidedBillingDetails#getLinkUri()) method has
59
+ been updated to be `@Nullable`. This change supports scenarios where
60
+ the direct link URI for external payments is unavailable during the
61
+ payment selection stage.
62
+
63
+ To handle this change safely, ensure your integration code handles both
64
+ `null` and empty string (`""`) values from the
65
+ [`DeveloperProvidedBillingDetails.getLinkUri()`](https://developer.android.com/reference/com/android/billingclient/api/DeveloperProvidedBillingDetails#getLinkUri()) method before parsing
66
+ or launching browser intents.
67
+ - Updated `targetSdkVersion` to 35.
68
+
69
+ - You can now use [in-app messaging](https://developer.android.com/google/play/billing/subscriptions#in-app-messaging) to notify users
70
+ of an upcoming opt-in price increase. This lets users confirm the price increase without leaving the app. The message for an outstanding opt-in price increase is shown starting on the first day the user can accept the price increase, and the message is shown a maximum of once every 7 days.
71
+
72
+ ## Google Play Billing Library 8.3.0 Release (2025-12-23)
73
+
74
+ Version 8.3.0 of the Google Play Billing Library and Kotlin extensions are now available.
75
+
76
+ ### Summary of changes
77
+
78
+ - New APIs for [external payments](https://developer.android.com/google/play/billing/externalpaymentlinks):
79
+
80
+ - Added classes to support external payments flow:
81
+ - [`BillingProgram.EXTERNAL_PAYMENTS`](https://developer.android.com/reference/com/android/billingclient/api/BillingClient.BillingProgram#EXTERNAL_PAYMENTS)
82
+ - [`EnableBillingProgramParams`](https://developer.android.com/reference/com/android/billingclient/api/EnableBillingProgramParams)
83
+ - [`DeveloperBillingOptionParams`](https://developer.android.com/reference/com/android/billingclient/api/DeveloperBillingOptionParams)
84
+ - [`DeveloperProvidedBillingDetails`](https://developer.android.com/reference/com/android/billingclient/api/DeveloperProvidedBillingDetails)
85
+ - [`DeveloperProvidedBillingListener`](https://developer.android.com/reference/com/android/billingclient/api/DeveloperProvidedBillingListener)
86
+ - Added [`enableBillingProgram(EnableBillingProgramParams)`](https://developer.android.com/reference/com/android/billingclient/api/BillingClient.Builder#enableBillingProgram(com.android.billingclient.api.EnableBillingProgramParams)) to enable external payments.
87
+ - Added [`BillingFlowParams.Builder.enableDeveloperBillingOption`](https://developer.android.com/reference/com/android/billingclient/api/BillingFlowParams.Builder#enableDeveloperBillingOption(com.android.billingclient.api.DeveloperBillingOptionParams)) to launch the external payments flow.
88
+
89
+ ## Google Play Billing Library 8.2.1 Release (2025-12-15)
90
+
91
+ Version 8.2.1 of the Google Play Billing Library and Kotlin extensions are now
92
+ available.
93
+
94
+ ### Bug fixes
95
+
96
+ - Fixed a bug in [`isBillingProgramAvailableAsync`](https://developer.android.com/reference/com/android/billingclient/api/BillingClient#isBillingProgramAvailableAsync(int,com.android.billingclient.api.BillingProgramAvailabilityListener)) and [`createBillingProgramReportingDetailsAsync`](https://developer.android.com/reference/com/android/billingclient/api/BillingClient#createBillingProgramReportingDetailsAsync(com.android.billingclient.api.BillingProgramReportingDetailsParams,com.android.billingclient.api.BillingProgramReportingDetailsListener)). Update to version 8.2.1 to use these APIs introduced in 8.2.0.
97
+
98
+ ## Google Play Billing Library 8.2.0 Release (2025-12-09)
99
+
100
+ Version 8.2.0 of the Google Play Billing Library and Kotlin extensions are now available.
101
+
102
+ ### Summary of changes
103
+
104
+ - New APIs for [external content links](https://developer.android.com/google/play/billing/externalcontentlinks) and [external offers](https://developer.android.com/google/play/billing/external):
105
+
106
+ - Added [`enableBillingProgram`](https://developer.android.com/reference/com/android/billingclient/api/BillingClient.Builder#enableBillingProgram(int)) to setup the `BillingClient` for these programs.
107
+ - Added [`isBillingProgramAvailableAsync`](https://developer.android.com/reference/com/android/billingclient/api/BillingClient#isBillingProgramAvailableAsync(int,com.android.billingclient.api.BillingProgramAvailabilityListener)) to determine user eligibility.
108
+ - Added [`createBillingProgramReportingDetailsAsync`](https://developer.android.com/reference/com/android/billingclient/api/BillingClient#createBillingProgramReportingDetailsAsync(com.android.billingclient.api.BillingProgramReportingDetailsParams,com.android.billingclient.api.BillingProgramReportingDetailsListener)) to create the external transaction token that must be used for reporting.
109
+ - Added [`launchExternalLink`](https://developer.android.com/reference/com/android/billingclient/api/BillingClient#launchExternalLink(android.app.Activity,com.android.billingclient.api.LaunchExternalLinkParams,com.android.billingclient.api.LaunchExternalLinkResponseListener)) to initiate the external link to a digital content offer or an app download.
110
+ - Changes to the [external offers program](https://developer.android.com/google/play/billing/external):
111
+
112
+ - There are policy changes for the external offers program. See [program changes](https://support.google.com/googleplay/android-developer/answer/16505463) for details. To understand how to launch external offer flows with the new APIs, see the [integration guide](https://developer.android.com/google/play/billing/external/integration).
113
+ - Deprecated the [`BillingClient.Builder.enableExternalOffer`](https://developer.android.com/reference/com/android/billingclient/api/BillingClient.Builder#enableExternalOffer()) API.
114
+ - Deprecated the [`isExternalOfferAvailableAsync`](https://developer.android.com/reference/com/android/billingclient/api/BillingClient#isExternalOfferAvailableAsync(com.android.billingclient.api.ExternalOfferAvailabilityListener)) API.
115
+ - Deprecated the [`createExternalOfferReportingDetailsAsync`](https://developer.android.com/reference/com/android/billingclient/api/BillingClient#createExternalOfferReportingDetailsAsync(com.android.billingclient.api.ExternalOfferReportingDetailsListener)) API.
116
+ - Deprecated the [`showExternalOfferInformationDialog`](https://developer.android.com/reference/com/android/billingclient/api/BillingClient#showExternalOfferInformationDialog(android.app.Activity,com.android.billingclient.api.ExternalOfferInformationDialogListener)) API.
117
+
118
+ ## Google Play Billing Library 8.1.0 Release (2025-11-06)
119
+
120
+ Version 8.1.0 of the Google Play Billing Library and Kotlin extensions are now available.
121
+
122
+ ### Summary of changes
123
+
124
+ - Suspended subscriptions
125
+
126
+ A new parameter has been added to the
127
+ [`BillingClient.queryPurchasesAsync()`](https://developer.android.com/reference/com/android/billingclient/api/BillingClient#queryPurchasesAsync(com.android.billingclient.api.QueryPurchasesParams,com.android.billingclient.api.PurchasesResponseListener))
128
+ method to include suspended subscriptions when querying for subscriptions.
129
+ Suspended subscriptions are still attributed to the user, but are not active,
130
+ either because the user paused the subscription or their renewal payment method
131
+ was declined.
132
+
133
+ The [`Purchase`](https://developer.android.com/reference/com/android/billingclient/api/Purchase) object returned in the listener will return `isSuspended() = true`
134
+ for any suspended subscriptions. In this case, you shouldn't grant access
135
+ to the purchased subscription, and instead guide the user to the
136
+ [subscriptions center](https://play.google.com/store/account/subscriptions)
137
+ where the user can manage their payment methods
138
+ or pause state to re-activate their subscription.
139
+ - Updates to [subscriptions](https://developer.android.com/google/play/billing/subscriptions):
140
+
141
+ - The [`BillingFlowParams.ProductDetailsParams`](https://developer.android.com/reference/com/android/billingclient/api/BillingFlowParams.ProductDetailsParams)
142
+ object now has the `setSubscriptionProductReplacementParams()` method
143
+ in which you can specify product level replacement information.
144
+
145
+ - The `SubscriptionProductReplacementParams` object has
146
+ two setter methods:
147
+
148
+ - `setOldProductId`: The old product that needs to be replaced by the product in current [`ProductDetails`](https://developer.android.com/reference/com/android/billingclient/api/ProductDetails).
149
+ - `setReplacementMode`: This is the item level replacement mode. The modes are essentially the same as SubscriptionUpdateParams, but the value mapping has been updated. A new replacement mode `KEEP_EXISTING` is introduced that lets you keep the existing payment schedule unchanged for an item.
150
+ - [SubscriptionUpdateParams setSubscriptionReplacementMode](https://developer.android.com/reference/com/android/billingclient/api/BillingFlowParams.SubscriptionUpdateParams.Builder#setSubscriptionReplacementMode(int)) will be
151
+ deprecated. You should use `SubscriptionProductReplacementParams.setReplacementMode`
152
+ instead.
153
+
154
+ - Updated `minSdkVersion` to 23.
155
+
156
+ - Enabled [pre-order APIs for one-time products](https://developer.android.com/google/play/billing/one-time-product-multi-purchase-options-offers#pre-order)
157
+
158
+ The `ProductDetails.oneTimePurchaseOfferDetails.getPreorderDetails()` API
159
+ that gets the pre-order details is now available for use.
160
+ - Google Play Billing Library now supports [Kotlin version 2.2.0](https://kotlinlang.org/docs/whatsnew22.html).
161
+
162
+ ## Google Play Billing Library 8.0.0 Release (2025-06-30)
163
+
164
+ Version 8.0.0 of the Google Play Billing Library and Kotlin extensions are now
165
+ available.
166
+
167
+ ### Summary of changes
168
+
169
+ - *In-app items* will now be referred to as *one-time products*.
170
+
171
+ - Multiple purchase options and offers for one-time products.
172
+
173
+ You can now have multiple purchase options and offers for your one-time
174
+ products. This provides you flexibility in how you sell your products and
175
+ reduces the complexity of managing them.
176
+ - Improved the [`queryProductDetailsAsync()`](https://developer.android.com/reference/com/android/billingclient/api/BillingClient#queryProductDetailsAsync(com.android.billingclient.api.QueryProductDetailsParams,com.android.billingclient.api.ProductDetailsResponseListener)) method.
177
+
178
+ Prior to PBL 8.0.0, the [`queryProductDetailsAsync()`](https://developer.android.com/reference/com/android/billingclient/api/BillingClient#queryProductDetailsAsync(com.android.billingclient.api.QueryProductDetailsParams,com.android.billingclient.api.ProductDetailsResponseListener)) method didn't
179
+ return products that couldn't be fetched. This could be due to reasons such
180
+ as the product is not found or no offers are available to the user. With PBL
181
+ 8.0.0, unfetched products are returned with a new product-level status code
182
+ that provides information about unfetched products. Note that there is a
183
+ change in the signature of the
184
+ [`ProductDetailsResponseListener.onProductDetailsResponse()`](https://developer.android.com/google/play/billing/integrate#automatic-service-reconnection) which
185
+ requires changes in your app. For more information, see [process the
186
+ result](https://developer.android.com/google/play/billing/integrate#process-the-result).
187
+ - Automatic service reconnection.
188
+
189
+ The new `BillingClient.Builder.enableAutoServiceReconnection()` builder
190
+ parameter lets developers opt-in to automatic service reconnection, which
191
+ simplifies connection management by handling reconnections to
192
+ the Play Billing Service automatically and eliminating the need to manually
193
+ call `startConnection()` in the event of a service disconnection.
194
+ For more information, see [Automatically Re-establish a Connection](https://developer.android.com/google/play/billing/integrate#automatic-service-reconnection).
195
+ - Sub-response codes for the [`launchBillingFlow()`](https://developer.android.com/reference/com/android/billingclient/api/BillingClient#launchBillingFlow(android.app.Activity,com.android.billingclient.api.BillingFlowParams)) method.
196
+
197
+ The [BillingResult](https://developer.android.com/reference/com/android/billingclient/api/BillingResult) returned from [`launchBillingFlow()`](https://developer.android.com/reference/com/android/billingclient/api/BillingClient#launchBillingFlow(android.app.Activity,com.android.billingclient.api.BillingFlowParams)) will now
198
+ include a sub-response code field. This field will only be populated in some
199
+ cases to provide a more specific reason for the failure. The sub-response
200
+ field can have the following values:
201
+ - `PAYMENT_DECLINED_DUE_TO_INSUFFICIENT_FUNDS` - Returned when the user's funds are less than the price of the item they are attempting to purchase.
202
+ - `USER_INELIGIBLE` - Returned when the user doesn't meet the configured eligibility requirements for a subscription offer.
203
+ - `NO_APPLICABLE_SUB_RESPONSE_CODE` - The default value, returned when no other sub-response code is applicable.
204
+ - Removed the `queryPurchaseHistory()` method.
205
+
206
+ The `queryPurchaseHistory()` method that was previously marked as
207
+ deprecated has now been removed. See [Query Purchase History](https://developer.android.com/google/play/billing/query-purchase-history) for
208
+ details on what alternative APIs to use instead.
209
+ - Removed the `querySkuDetailsAsync()` method.
210
+
211
+ The `querySkuDetailsAsync()` method that was previously marked as deprecated
212
+ has now been removed. You should use [queryProductDetailsAsync](https://developer.android.com/reference/com/android/billingclient/api/BillingClient#queryProductDetailsAsync(com.android.billingclient.api.QueryProductDetailsParams,com.android.billingclient.api.ProductDetailsResponseListener)) instead.
213
+ - Removed the `BillingClient.Builder.enablePendingPurchases()` method.
214
+
215
+ The `enablePendingPurchases()` method with no parameters that was previously
216
+ marked as deprecated has now been removed. You should use
217
+ `enablePendingPurchases(PendingPurchaseParams params)` instead. Note that
218
+ the deprecated `enablePendingPurchases()` is functionally equivalent to
219
+ `enablePendingPurchases(PendingPurchasesParams.newBuilder().enableOneTimeProducts().build())`.
220
+ - Removed the overloaded `queryPurchasesAsync()` method that takes a [skuType](https://developer.android.com/reference/com/android/billingclient/api/BillingClient.SkuType).
221
+
222
+ The `queryPurchasesAsync(String skuType, PurchasesResponseListener
223
+ listener)` method that was previously marked as
224
+ deprecated has now been removed. Alternately, use
225
+ [`queryPurchasesAsync(QueryPurchasesParams queryPurchasesParams,
226
+ PurchasesResponseListener listener)`](https://developer.android.com/reference/com/android/billingclient/api/BillingClient#queryPurchasesAsync(com.android.billingclient.api.QueryPurchasesParams,com.android.billingclient.api.PurchasesResponseListener)).
227
+
228
+ ## Google Play Billing Library 7.1.1 Release (2024-10-03)
229
+
230
+ Version 7.1.1 of the Google Play Billing Library and Kotlin extensions are now
231
+ available.
232
+
233
+ ### Bug fixes
234
+
235
+ - Fixed a bug in Play Billing Library 7.1.0 related to [testing
236
+ `BillingResult` response codes](https://developer.android.com/google/play/billing/test-response-codes).
237
+
238
+ ## Google Play Billing Library 7.1.0 Release (2024-09-19)
239
+
240
+ Version 7.1.0 of the Google Play Billing Library and Kotlin extensions are now
241
+ available.
242
+
243
+ ### Summary of changes
244
+
245
+ - Improved thread safety related to connection status and management.
246
+ - Introduced partial changes for testing [`BillingResult`](https://developer.android.com/reference/com/android/billingclient/api/BillingResult) response codes which is fully released in Play Billing Library 7.1.1. To test your integration using this feature, you'll need to upgrade to Play Billing Library 7.1.1. A bug exists that will only impact applications with [billing overrides testing enabled](https://developer.android.com/google/play/billing/test-response-codes#enable-billing-overrides-testing) and does not affect regular usage. For more information, see [Test `BillingResult`
247
+ response codes](https://developer.android.com/google/play/billing/test-response-codes).
248
+
249
+ ## Google Play Billing Library 7.0.0 Release (2024-05-14)
250
+
251
+ Version 7.0.0 of the Google Play Billing Library and Kotlin extensions are now
252
+ available.
253
+
254
+ ### Summary of changes
255
+
256
+ - Added APIs to support installment subscriptions.
257
+
258
+ - Added [`ProductDetails.InstallmentPlanDetails`](https://developer.android.com/reference/com/android/billingclient/api/ProductDetails.InstallmentPlanDetails) for installment base plans that users are eligible to purchase. This API helps your app identify the installment plan and its commitment setup to provide related information to the user. To learn more, see our [subscription installments guide](https://developer.android.com/google/play/billing/subscriptions#installments).
259
+ - Added [`PendingPurchasesParams`](https://developer.android.com/reference/com/android/billingclient/api/PendingPurchasesParams) and
260
+ [`BillingClient.Builder.enablePendingPurchases(PendingPurchaseParams)`](https://developer.android.com/reference/com/android/billingclient/api/BillingClient.Builder#enablePendingPurchases(PendingPurchaseParams))
261
+ to replace
262
+ [`BillingClient.Builder.enablePendingPurchases()`](https://developer.android.com/reference/com/android/billingclient/api/BillingClient.Builder#enablePendingPurchases()),
263
+ which has been deprecated in this release.
264
+
265
+ - The deprecated `enablePendingPurchases()` is functionally equivalent to `enablePendingPurchases(PendingPurchasesParams.newBuilder().enableOneTimeProducts().build())`.
266
+ - Added APIs to support pending transactions for subscription prepaid plans:
267
+
268
+ - Use [`PendingPurchasesParams.Builder.enablePrepaidPlans()`](https://developer.android.com/reference/com/android/billingclient/api/PendingPurchasesParams.Builder#enablePrepaidPlans()) along with [`BillingClient.Builder.enablePendingPurchases(PendingPurchaseParams)`](https://developer.android.com/reference/com/android/billingclient/api/BillingClient.Builder#enablePendingPurchases(PendingPurchaseParams)) to enable pending transactions for subscription prepaid plans. When adding support, be sure that your app also correctly manages subscription lifecycles. To learn more see our [pending purchases
269
+ guide](https://developer.android.com/google/play/billing/subscriptions#pending).
270
+ - Added [`Purchase.PendingPurchaseUpdate`](https://developer.android.com/reference/com/android/billingclient/api/Purchase.PendingPurchaseUpdate) and [`Purchase.getPendingPurchaseUpdate()`](https://developer.android.com/reference/com/android/billingclient/api/Purchase.getPendingPurchaseUpdate()) for retrieving the pending top-up or upgrade or downgrade to an existing subscription.
271
+ - Removed
272
+ [`BillingClient.Builder.enableAlternativeBilling()`](https://developer.android.com/reference/com/android/billingclient/api/BillingClient.Builder#enableAlternativeBilling(com.android.billingclient.api.AlternativeBillingListener)),
273
+ [`AlternativeBillingListener`](https://developer.android.com/reference/com/android/billingclient/api/AlternativeBillingListener), and
274
+ [`AlternativeChoiceDetails`](https://developer.android.com/reference/com/android/billingclient/api/AlternativeChoiceDetails).
275
+
276
+ - Developers should use [`BillingClient.Builder.enableUserChoiceBilling()`](https://developer.android.com/reference/com/android/billingclient/api/BillingClient.Builder#enableUserChoiceBilling(com.android.billingclient.api.UserChoiceBillingListener)) with [`UserChoiceBillingListener`](https://developer.android.com/reference/com/android/billingclient/api/UserChoiceBillingListener) and [`UserChoiceDetails`](https://developer.android.com/reference/com/android/billingclient/api/UserChoiceDetails) in the listener callback instead.
277
+ - Removed [`BillingFlowParams.ProrationMode`](https://developer.android.com/reference/com/android/billingclient/api/BillingFlowParams.ProrationMode),
278
+ [`BillingFlowParams.SubscriptionUpdateParams.Builder.setReplaceProrationMode()`](https://developer.android.com/reference/com/android/billingclient/api/BillingFlowParams.SubscriptionUpdateParams.Builder#setReplaceProrationMode(int)),
279
+ and
280
+ [`BillingFlowParams.SubscriptionUpdateParams.Builder.setReplaceSkusProrationMode()`](https://developer.android.com/reference/com/android/billingclient/api/BillingFlowParams.SubscriptionUpdateParams.Builder#setReplaceSkusProrationMode(int)).
281
+
282
+ - Developers should use [`BillingFlowParams.SubscriptionUpdateParams.ReplacementMode`](https://developer.android.com/reference/com/android/billingclient/api/BillingFlowParams.SubscriptionUpdateParams.ReplacementMode) with [`BillingFlowParams.SubscriptionUpdateParams.Builder#setSubscriptionReplacementMode(int)`](https://developer.android.com/reference/com/android/billingclient/api/BillingFlowParams.SubscriptionUpdateParams.Builder#setSubscriptionReplacementMode(int)) instead.
283
+ - Removed
284
+ [`BillingFlowParams.SubscriptionUpdateParams.Builder#setOldSkuPurchaseToken()`](https://developer.android.com/reference/com/android/billingclient/api/BillingFlowParams.SubscriptionUpdateParams.Builder#setOldSkuPurchaseToken(java.lang.String)).
285
+
286
+ - Developers should use [`BillingFlowParams.SubscriptionUpdateParams.Builder#setOldPurchaseToken(java.lang.String)`](https://developer.android.com/reference/com/android/billingclient/api/BillingFlowParams.SubscriptionUpdateParams.Builder#setOldPurchaseToken(java.lang.String)) instead.
287
+ - [`BillingClient.queryPurchaseHistoryAsync()`](https://developer.android.com/reference/com/android/billingclient/api/BillingClient#queryPurchaseHistoryAsync(com.android.billingclient.api.QueryPurchaseHistoryParams,com.android.billingclient.api.PurchaseHistoryResponseListener))
288
+ has been deprecated and will be removed in a future release. Developers
289
+ should use the following alternatives instead:
290
+
291
+ - Acknowledged and pending purchases: Use [`BillingClient.queryPurchasesAsync()`](https://developer.android.com/reference/com/android/billingclient/api/BillingClient#queryPurchasesAsync(com.android.billingclient.api.QueryPurchasesParams,%20com.android.billingclient.api.PurchasesResponseListener)) to fetch the active purchases.
292
+ - Consumed purchases: Developers should keep track of consumed purchases on their own servers.
293
+ - Canceled purchases: Use the [voided-purchases](https://developers.google.com/android-publisher/voided-purchases) developer API.
294
+ - For more details, see [Query Purchase History](https://developer.android.com/google/play/billing/query-purchase-history)
295
+ - [`BillingFlowParams.ProductDetailsParams.setOfferToken()`](https://developer.android.com/reference/com/android/billingclient/api/BillingFlowParams.ProductDetailsParams.Builder#setOfferToken(java.lang.String))
296
+ now throws an exception when developers specify an empty `offerToken`.
297
+
298
+ - Updated `minSdkVersion` to 21 and `targetSdkVersion` to 34.
299
+
300
+ ## Google Play Billing Library 6.2.1 Release (2024-04-16)
301
+
302
+ Version 6.2.1 of the Google Play Billing Library and Kotlin extensions are now
303
+ available.
304
+
305
+ ### Summary of changes
306
+
307
+ - Fixed a bug in [`BillingClient.showAlternativeBillingOnlyInformationDialog()`](https://developer.android.com/reference/com/android/billingclient/api/BillingClient#showAlternativeBillingOnlyInformationDialog(android.app.Activity,%20com.android.billingclient.api.AlternativeBillingOnlyInformationDialogListener)) where the [`AlternativeBillingOnlyInformationDialogListener`](https://developer.android.com/reference/com/android/billingclient/api/AlternativeBillingOnlyInformationDialogListener) may not be called in certain cases when the dialog completes.
308
+
309
+ ## Google Play Billing Library 6.2.0 Release (2024-03-06)
310
+
311
+ Version 6.2.0 of the Google Play Billing Library and Kotlin extensions are now
312
+ available.
313
+
314
+ ### Summary of changes
315
+
316
+ - Added APIs to support [external offers](https://developer.android.com/google/play/billing/external)
317
+ - Added [`BillingClient.Builder.enableExternalOffer()`](https://developer.android.com/reference/com/android/billingclient/api/BillingClient.Builder#enableExternalOffer()) to enable the ability to provide external offers.
318
+ - Added [`BillingClient.isExternalOfferAvailableAsync()`](https://developer.android.com/reference/com/android/billingclient/api/BillingClient#isExternalOfferAvailableAsync(com.android.billingclient.api.ExternalOfferAvailabilityListener)) to check the availability of providing external offers functionality.
319
+ - Added [`BillingClient.showExternalOfferInformationDialog()`](https://developer.android.com/reference/com/android/billingclient/api/BillingClient#showExternalOfferInformationDialog(android.app.Activity,%20com.android.billingclient.api.ExternalOfferInformationDialogListener)) to show an information dialog to users before leading users outside the app.
320
+ - Added [`BillingClient.createExternalOfferReportingDetailsAsync()`](https://developer.android.com/reference/com/android/billingclient/api/BillingClient#createExternalOfferReportingDetailsAsync(com.android.billingclient.api.ExternalOfferReportingDetailsListener)) to create a payload required to report transactions made through external offers.
321
+
322
+ ## Google Play Billing Library 6.1.0 Release (2023-11-14)
323
+
324
+ Version 6.1.0 of the Google Play Billing Library and Kotlin extensions are now
325
+ available.
326
+
327
+ ### Summary of changes
328
+
329
+ - Added APIs to support [alternative billing only (i.e. without user choice)](https://developer.android.com/google/play/billing/alternative)
330
+ - Added [`BillingClient.Builder.enableAlternativeBillingOnly()`](https://developer.android.com/reference/com/android/billingclient/api/BillingClient.Builder#enableAlternativeBillingOnly()) to functionally enable the ability to offer alternative billing only.
331
+ - Added [`BillingClient.isAlternativeBillingOnlyAvailableAsync()`](https://developer.android.com/reference/com/android/billingclient/api/BillingClient#isAlternativeBillingOnlyAvailableAsync(com.android.billingclient.api.AlternativeBillingOnlyAvailabilityListener)) to check the availability of offering alternative billing only.
332
+ - Added [`BillingClient.showAlternativeBillingOnlyInformationDialog()`](https://developer.android.com/reference/com/android/billingclient/api/BillingClient#showAlternativeBillingOnlyInformationDialog(android.app.Activity,%20com.android.billingclient.api.AlternativeBillingOnlyInformationDialogListener)) to show an information dialog to inform users when alternative billing only is being used.
333
+ - Added [`BillingClient.createAlternativeBillingOnlyReportingDetailsAsync()`](https://developer.android.com/reference/com/android/billingclient/api/BillingClient#createAlternativeBillingOnlyReportingDetailsAsync(com.android.billingclient.api.AlternativeBillingOnlyReportingDetailsListener)) to create a payload required to report transactions made through alternative billing only.
334
+ - Updated the user choice billing APIs
335
+ - Added [`UserChoiceBillingListener`](https://developer.android.com/reference/com/android/billingclient/api/UserChoiceBillingListener) to replace [AlternativeBillingListener](https://developer.android.com/reference/com/android/billingclient/api/AlternativeBillingListener) which has been marked as deprecated.
336
+ - Added [`UserChoiceDetails`](https://developer.android.com/reference/com/android/billingclient/api/UserChoiceDetails) to replace [`AlternativeChoiceDetails`](https://developer.android.com/reference/com/android/billingclient/api/AlternativeChoiceDetails) which has been marked as deprecated.
337
+ - Added [`BillingClient.Builder.enableUserChoiceBilling()`](https://developer.android.com/reference/com/android/billingclient/api/BillingClient.Builder#enableUserChoiceBilling(com.android.billingclient.api.UserChoiceBillingListener)) to replace [`BillingClient.Builder.enableAlternativeBilling()`](https://developer.android.com/reference/com/android/billingclient/api/BillingClient.Builder#enableAlternativeBilling(com.android.billingclient.api.AlternativeBillingListener)) which has been marked as deprecated.
338
+ - Added [`BillingClient.getBillingConfigAsync()`](https://developer.android.com/reference/com/android/billingclient/api/BillingClient#getBillingConfigAsync(com.android.billingclient.api.GetBillingConfigParams,%20com.android.billingclient.api.BillingConfigResponseListener)) to retrieve Google Play country.
339
+
340
+ ## Google Play Billing Library 6.0.1 Release (2023-06-22)
341
+
342
+ Version 6.0.1 of the Google Play Billing Library and Kotlin extensions are now
343
+ available.
344
+
345
+ ### Summary of changes
346
+
347
+ Update Play Billing Library to be compatible with Android 14.
348
+
349
+ ## Google Play Billing Library 6.0 Release (2023-05-10)
350
+
351
+ Version 6.0.0 of the Google Play Billing Library and Kotlin extensions are now
352
+ available.
353
+
354
+ ### Summary of changes
355
+
356
+ - Added new [`ReplacementMode`](https://developer.android.com/reference/com/android/billingclient/api/BillingFlowParams.SubscriptionUpdateParams.ReplacementMode)
357
+ enum to replace
358
+ [`ProrationMode`](https://developer.android.com/reference/com/android/billingclient/api/BillingFlowParams.ProrationMode).
359
+
360
+ Note that `ProrationMode` is still available for backward compatibility
361
+ reasons.
362
+ - Removed order ID for [`PENDING`](https://developer.android.com/reference/com/android/billingclient/api/Purchase.PurchaseState#PENDING)
363
+ purchases.
364
+
365
+ Previously, the order ID would always be created even if the purchase was
366
+ pending. Starting with version 6.0.0, an order ID will not be created for
367
+ pending purchases, and for these purchases, the order ID will be populated
368
+ after the purchase is moved to the
369
+ [`PURCHASED`](https://developer.android.com/reference/com/android/billingclient/api/Purchase.PurchaseState#PURCHASED)
370
+ state.
371
+ - Removed `queryPurchases` and `launchPriceConfirmationFlow` methods.
372
+
373
+ The `queryPurchases` and `launchPriceConfirmationFlow` methods that have
374
+ previously been marked as deprecated have now been removed in Play Billing
375
+ Library 6.0.0. Developers should use
376
+ [`queryPurchasesAsync`](https://developer.android.com/reference/com/android/billingclient/api/BillingClient#queryPurchasesAsync(com.android.billingclient.api.QueryPurchasesParams,%20com.android.billingclient.api.PurchasesResponseListener))
377
+ instead of `queryPurchases`. For `launchPriceConfirmationFlow` alternatives,
378
+ see [Price changes](https://developer.android.com/google/play/billing/price-changes).
379
+ - Added new network error response code.
380
+
381
+ A new network error response code,
382
+ [`NETWORK_ERROR`](https://developer.android.com/reference/com/android/billingclient/api/BillingClient.BillingResponseCode#NETWORK_ERROR),
383
+ has been added starting with PBL version 6.0.0. This code is returned when
384
+ an error occurs due to a network connection issue. These network connection
385
+ errors were previously reported as `SERVICE_UNAVAILABLE`.
386
+ - Updated [`SERVICE_UNAVAILABLE`](https://developer.android.com/reference/com/android/billingclient/api/BillingClient.BillingResponseCode#SERVICE_UNAVAILABLE)
387
+ and
388
+ [`SERVICE_TIMEOUT`](https://developer.android.com/reference/com/android/billingclient/api/BillingClient.BillingResponseCode#SERVICE_TIMEOUT).
389
+
390
+ Starting with PBL version 6.0.0, errors due to timeout in processing will be
391
+ returned as `SERVICE_UNAVAILABLE` instead of the current `SERVICE_TIMEOUT`.
392
+
393
+ The behavior does not change in earlier versions of PBL.
394
+ - Removed
395
+ [`SERVICE_TIMEOUT`](https://developer.android.com/reference/com/android/billingclient/api/BillingClient.BillingResponseCode#SERVICE_TIMEOUT).
396
+
397
+ Starting with PBL version 6.0.0, `SERVICE_TIMEOUT` will no longer be
398
+ returned. Previous versions of PBL will still return this code.
399
+ - Added additional logging.
400
+
401
+ The Play Billing Library 6 release includes additional logging, which
402
+ provides insight into API usage (such as success and failure) and service
403
+ connection issues. This information will be used to improve the performance
404
+ of the Play Billing Library and provide better support for errors.
405
+
406
+ ## Google Play Billing Library 5.2.1 Release (2023-06-22)
407
+
408
+ Version 5.2.1 of the Google Play Billing Library and Kotlin extensions are now
409
+ available.
410
+
411
+ ### Summary of changes
412
+
413
+ Update Play Billing Library to be compatible with Android 14.
414
+
415
+ ## Google Play Billing Library 5.2 Release (2023-04-06)
416
+
417
+ Version 5.2.0 of the Google Play Billing Library and Kotlin extensions are now
418
+ available.
419
+
420
+ ### Summary of changes
421
+
422
+ - Added classes to support alternative billing flows on mobile/tablet for users in South Korea:
423
+ - [`AlternativeBillingListener`](https://developer.android.com/reference/com/android/billingclient/api/AlternativeBillingListener)
424
+ - [`AlternativeChoiceDetails`](https://developer.android.com/reference/com/android/billingclient/api/AlternativeChoiceDetails)
425
+ - [`AlternativeChoiceDetails.Product`](https://developer.android.com/reference/com/android/billingclient/api/AlternativeChoiceDetails.Product)
426
+ - Added [`BillingFlowParams.SubscriptionUpdateParams.Builder.setOriginalExternalTransactionId()`](https://developer.android.com/reference/com/android/billingclient/api/BillingFlowParams.SubscriptionUpdateParams.Builder#setOriginalExternalTransactionId(java.lang.String)) method to specify the external transaction id of the originating subscription.
427
+ - Added [`BillingClient.Builder.enableAlternativeBilling()`](https://developer.android.com/reference/com/android/billingclient/api/BillingClient.Builder#enableAlternativeBilling(com.android.billingclient.api.AlternativeBillingListener)) method to allow users in South Korea to select an alternative billing option.
428
+
429
+ ## Google Play Billing Library 5.1 Release (2022-10-31)
430
+
431
+ Version 5.1.0 of the Google Play Billing Library and Kotlin extensions are now
432
+ available.
433
+
434
+ This version contains the following changes.
435
+
436
+ ### Summary of changes
437
+
438
+ - Added [`ProductDetails.SubscriptionOfferDetails.getOfferId()`](https://developer.android.com/reference/com/android/billingclient/api/ProductDetails.SubscriptionOfferDetails#getOfferId()) method to retrieve the offer ID.
439
+ - Added [`ProductDetails.SubscriptionOfferDetails.getBasePlanId()`](https://developer.android.com/reference/com/android/billingclient/api/ProductDetails.SubscriptionOfferDetails#getBasePlanId()) method to retrieve the base plan ID.
440
+ - Updated the `targetSdkVersion` to 31.
441
+
442
+ ## Google Play Billing Library 5.0 Release (2022-05-11)
443
+
444
+ Version 5.0.0 of the Google Play Billing Library and Kotlin extensions are now
445
+ available.
446
+
447
+ This version contains the following changes.
448
+
449
+ ### Summary of changes
450
+
451
+ - Introduced a new model for subscriptions, including new entities that enable you to create multiple offers for a single subscription product. For more information, see the [migration guide](https://developer.android.com/google/play/billing/migrate-gpblv5).
452
+ - Added [`BillingClient.queryProductDetailsAsync()`](https://developer.android.com/reference/com/android/billingclient/api/BillingClient#queryProductDetailsAsync(com.android.billingclient.api.QueryProductDetailsParams,%20com.android.billingclient.api.ProductDetailsResponseListener)) to replace `BillingClient.querySkuDetailsAsync()`.
453
+ - Added `setIsOfferPersonalized()` method for EU personalized pricing disclosure requirements. To learn more about how to use this method, see [Indicate a personalized
454
+ price](https://developer.android.com/google/play/billing/integrate#personalized-price).
455
+ - Removed `queryPurchases()`, which was previously deprecated and replaced by queryPurchasesAsync introduced in Google Play Billing Library 4.0.0.
456
+ - `launchPriceChangeFlow` has been deprecated and will be removed in a future release. To learn more about alternatives, see [Launch a price change
457
+ confirmation flow](https://developer.android.com/google/play/billing/subscriptions#price-change-launch).
458
+ - Removed [`setVrPurchaseFlow()`](https://developer.android.com/reference/com/android/billingclient/api/BillingFlowParams.Builder#setVrPurchaseFlow(boolean)), which was previously used when instantiating a purchase flow. In previous versions, this method redirected the user to complete the purchase on their Android-powered device. Once you remove this method, users will complete the purchase through the standard purchase flow.
459
+
460
+ ## Google Play Billing Library 4.1 release (2022-02-23)
461
+
462
+ Version 4.1.0 of the Google Play Billing Library and Kotlin extensions are now
463
+ available.
464
+
465
+ This version contains the following changes.
466
+
467
+ ### Summary of changes
468
+
469
+ - Added [`BillingClient.showInAppMessages()`](https://developer.android.com/reference/com/android/billingclient/api/BillingClient#showInAppMessages(android.app.Activity,%20com.android.billingclient.api.InAppMessageParams,%20com.android.billingclient.api.InAppMessageResponseListener)) to help with handling subscription payment declines. To learn more about how to use in-app messaging for handling subscriptions payment declines, see [Handling payment
470
+ declines](https://developer.android.com/google/play/billing/subscriptions#payment-declines).
471
+
472
+ ## Google Play Billing Library 4.0 Release (2021-05-18)
473
+
474
+ Version 4.0.0 of the Google Play Billing Library and Kotlin extensions are now
475
+ available.
476
+
477
+ ### Summary of changes
478
+
479
+ - Added
480
+ [`BillingClient.queryPurchasesAsync()`](https://developer.android.com/reference/com/android/billingclient/api/BillingClient#queryPurchasesAsync(java.lang.String,%20com.android.billingclient.api.PurchasesResponseListener))
481
+ to replace
482
+ [`BillingClient.queryPurchases()`](https://developer.android.com/reference/com/android/billingclient/api/BillingClient#queryPurchases(java.lang.String))
483
+ which will be removed in a future release.
484
+
485
+ - Added new subscription replacement mode
486
+ [`IMMEDIATE_AND_CHARGE_FULL_PRICE`](https://developer.android.com/google/play/billing/subscriptions#change).
487
+
488
+ - Added
489
+ [`BillingClient.getConnectionState()`](https://developer.android.com/reference/com/android/billingclient/api/BillingClient#getConnectionState())
490
+ method to retrieve the Play Billing Library's connection state.
491
+
492
+ - Updated Javadoc and implementation to indicate which thread a method can be
493
+ called on and which thread results are posted.
494
+
495
+ - Added
496
+ [`BillingFlowParams.Builder.setSubscriptionUpdateParams()`](https://developer.android.com/reference/com/android/billingclient/api/BillingFlowParams.Builder#setSubscriptionUpdateParams(com.android.billingclient.api.BillingFlowParams.SubscriptionUpdateParams))
497
+ as a new way to initiate subscription updates. This replaces
498
+ `BillingFlowParams#getReplaceSkusProrationMode`,
499
+ `BillingFlowParams#getOldSkuPurchaseToken`, `BillingFlowParams#getOldSku`,
500
+ `BillingFlowParams.Builder#setReplaceSkusProrationMode`,
501
+ `BillingFlowParams.Builder#setOldSku` which have been removed.
502
+
503
+ - Added
504
+ [`Purchase.getQuantity()`](https://developer.android.com/reference/com/android/billingclient/api/Purchase#getQuantity())
505
+ and
506
+ [`PurchaseHistoryRecord.getQuantity()`](https://developer.android.com/reference/com/android/billingclient/api/PurchaseHistoryRecord#getQuantity()).
507
+
508
+ - Added
509
+ [`Purchase#getSkus()`](https://developer.android.com/reference/com/android/billingclient/api/Purchase#getSkus())
510
+ and
511
+ [`PurchaseHistoryRecord#getSkus()`](https://developer.android.com/reference/com/android/billingclient/api/PurchaseHistoryRecord#getSkus()).
512
+ These replace `Purchase#getSku` and `PurchaseHistoryRecord#getSku` which
513
+ have been removed.
514
+
515
+ - Removed `BillingFlowParams#getSku`, `BillingFlowParams#getSkuDetails` and
516
+ `BillingFlowParams#getSkuType`.
517
+
518
+ ## Google Play Billing Library 3.0.3 Release (2021-03-12)
519
+
520
+ Version 3.0.3 of the Google Play Billing Library, Kotlin extension, and Unity
521
+ plugin are now available.
522
+
523
+ ### Java and Kotlin Bug fixes
524
+
525
+ - Fix memory leak when [`endConnection()`](https://developer.android.com/reference/com/android/billingclient/api/BillingClient#endConnection()) is called.
526
+ - Fix issue when the Google Play Billing Library is used by apps which use the single task launch mode. A [`onPurchasesUpdated()`](https://developer.android.com/reference/com/android/billingclient/api/PurchasesUpdatedListener#onpurchasesupdated) callback will be triggered when an app is resumed from the Android launcher and the billing dialog was visible prior to being suspended.
527
+
528
+ ### Unity Bug fixes
529
+
530
+ - Update to Java version 3.0.3 to fix memory leak and resolve issue preventing purchases when an app is resumed from the Android launcher and the billing dialog was visible prior to being suspended.
531
+
532
+ ## Google Play Billing Library 3.0.2 Release (2020-11-24)
533
+
534
+ Version 3.0.2 of the Google Play Billing Library and Kotlin extension are now
535
+ available.
536
+
537
+ ### Bug fixes
538
+
539
+ - Fixed a bug in the Kotlin extension where the coroutine fails with error "Already resumed".
540
+ - Fixed unresolved references when the Kotlin extension is used with the kotlinx.coroutines library version 1.4+.
541
+
542
+ ## Google Play Billing Library 3.0.1 Release (2020-09-30)
543
+
544
+ Version 3.0.1 of the Google Play Billing Library and Kotlin extension are now
545
+ available.
546
+
547
+ ### Bug fixes
548
+
549
+ - Fixed a bug where if the app was killed and restored during the billing flow, `PurchasesUpdatedListener` may not be called with the purchase result.
550
+
551
+ ## Google Play Billing Library 3.0 Release (2020-06-08)
552
+
553
+ Version 3.0.0 of the Google Play Billing Library, Kotlin extension, and Unity
554
+ plugin are now available.
555
+
556
+ ### Summary of changes
557
+
558
+ - Removed rewarded SKU support.
559
+ - Removed the `ChildDirected` and `UnderAgeOfConsent` parameters.
560
+ - Removed deprecated developer payload methods.
561
+ - Removed deprecated methods `BillingFlowParams.setAccountId()` and `BillingFlowParams.setDeveloperId()`.
562
+ - Removed deprecated methods `BillingFlowParams.setOldSkus(String oldSku)` and `BillingFlowParams.addOldSku(String oldSku)`.
563
+ - Added nullability annotations.
564
+
565
+ ### Bug fixes
566
+
567
+ - [`SkuDetails.getIntroductoryPriceCycles()`](https://developer.android.com/reference/com/android/billingclient/api/SkuDetails#getIntroductoryPriceCycles()) now returns `int` instead of `String`.
568
+ - Fixed a bug where the billing flow would be treated as having extra params even if no extra params were set.
569
+
570
+ ## Google Play Billing Library 2.2.1 Release (2020-05-20)
571
+
572
+ Version 2.2.1 of the Google Play Billing library is now available.
573
+
574
+ ### Bug fixes
575
+
576
+ - Updated the default version of the Java Play Billing library that the Kotlin extension depends on.
577
+
578
+ ## Google Play Billing Library 2.2.0 release and Unity support (2020-03-23)
579
+
580
+ Version 2.2.0 of the Google Play Billing provides functionality that helps
581
+ developers ensure purchases are attributed to the correct user. These changes
582
+ replace the need to build custom solutions based on developer payload. As part
583
+ of this update, the developer payload functionality has been deprecated and will
584
+ be removed in a future release. For more information, including recommended
585
+ alternatives, see [Developer payload](https://developer.android.com/google/play/billing/developer-payload).
586
+
587
+ ### Google Play Billing Billing Library 2 for Unity
588
+
589
+ In addition to the current Java and Kotlin versions of Google Play Billing
590
+ Library 2, we released a version of the library for use with Unity. Game
591
+ developers using the Unity in-app purchase API can upgrade now to take advantage
592
+ of all Google Play Billing Library 2 features and to make the subsequent
593
+ upgrades to future versions of the Google Play Billing Library easier.
594
+
595
+ To learn more, see [Use Google Play Billing with
596
+ Unity](https://developer.android.com/google/play/billing/unity).
597
+
598
+ ### Summary of changes
599
+
600
+ - Java Google Play Billing Library
601
+ - In [`AcknowledgePurchaseParams`](https://developer.android.com/reference/com/android/billingclient/api/AcknowledgePurchaseParams), deprecated [`setDeveloperPayload()`](https://developer.android.com/reference/com/android/billingclient/api/AcknowledgePurchaseParams.Builder#setDeveloperPayload(java.lang.String)) and [`getDeveloperPayload()`](https://developer.android.com/reference/com/android/billingclient/api/AcknowledgePurchaseParams#getDeveloperPayload()) methods.
602
+ - In [`ConsumeParams`](https://developer.android.com/reference/com/android/billingclient/api/ConsumeParams), deprecated [`setDeveloperPayload()`](https://developer.android.com/reference/com/android/billingclient/api/ConsumeParams.Builder#setDeveloperPayload(java.lang.String)) and [`getDeveloperPayload()`](https://developer.android.com/reference/com/android/billingclient/api/ConsumeParams#getdeveloperpayload) methods.
603
+ - In [`BillingFlowParams`](https://developer.android.com/reference/com/android/billingclient/api/BillingFlowParams.Builder), renamed [`setAccountId()`](https://developer.android.com/reference/com/android/billingclient/api/BillingFlowParams.Builder#setAccountId(java.lang.String)) to [`setObfuscatedAccountId()`](https://developer.android.com/reference/com/android/billingclient/api/BillingFlowParams.Builder#setObfuscatedAccountId(java.lang.String)), and documented length restriction of 64 characters and restriction disallowing Personally Identifiable Information (PII) in this field. [`setAccountId()`](https://developer.android.com/reference/com/android/billingclient/api/BillingFlowParams.Builder#setaccountid) has been marked as deprecated and will be removed in a future library version.
604
+ - In `BillingFlowParams`, added [`setObfuscatedProfileId()`](https://developer.android.com/reference/com/android/billingclient/api/BillingFlowParams.Builder#setobfuscatedprofileid) which works similarly to [`setObfuscatedAccountId()`](https://developer.android.com/reference/com/android/billingclient/api/BillingFlowParams.Builder#setObfuscatedAccountId(java.lang.String)). For more information, see [Developer payload updates and
605
+ alternatives](https://developer.android.com/google/play/billing/developer-payload).
606
+ - In [`Purchase`](https://developer.android.com/reference/com/android/billingclient/api/Purchase), added the [`getAccountIdentifiers()`](https://developer.android.com/reference/com/android/billingclient/api/Purchase#getAccountIdentifiers()) method to return the obfuscated account identifiers set in `BillingFlowParams`.
607
+ - In [`BillingClient`](https://developer.android.com/reference/com/android/billingclient/api/BillingClient), the [`loadRewardedSku()`](https://developer.android.com/reference/com/android/billingclient/api/BillingClient#loadRewardedSku(com.android.billingclient.api.RewardLoadParams,%20com.android.billingclient.api.RewardResponseListener)) method has been marked deprecated as part of deprecating rewarded SKUs. You can find more information about the deprecation in the [Play Console
608
+ Help
609
+ Center](https://support.google.com/googleplay/android-developer/answer/9155268).
610
+
611
+ ## Google Play Billing Library 2.1.0 Release and Kotlin Extension 2.1.0 Release (2019-12-10)
612
+
613
+ Version 2.1.0 of the Google Play Billing library and the new Kotlin extension
614
+ are now available. The Play Billing Library Kotlin extension provides idiomatic
615
+ API alternatives for Kotlin consumption, featuring better null-safety and
616
+ coroutines. For code examples, see [Use the Google Play Billing
617
+ Library](https://developer.android.com/google/play/billing/billing_library_overview).
618
+
619
+ This version contains the following changes.
620
+
621
+ ### Summary of changes
622
+
623
+ - In [`BillingFlowParams`](https://developer.android.com/reference/com/android/billingclient/api/BillingFlowParams), deprecated `setOldSku(String oldSku)` and replaced with `setOldSku(String
624
+ oldSku, String purchaseToken)`, to disambiguate when multiple accounts on the device own the same sku.
625
+
626
+ ## Google Play Billing Library 2.0.3 Release (2019-08-05)
627
+
628
+ Version 2.0.3 of the Google Play Billing library is now available.
629
+
630
+ ### Bug fixes
631
+
632
+ - Fixed a bug where `querySkuDetailsAsync()` would occasionally fail with code `DEVELOPER_ERROR` instead of returning a successful result.
633
+
634
+ ## Google Play Billing Library 2.0.2 Release (2019-07-08)
635
+
636
+ Version 2.0.2 of the Google Play Billing library is now available. This release
637
+ contains updates to the reference documentation and does not change library
638
+ functionality.
639
+
640
+ ## Google Play Billing Library 2.0.1 Release (2019-06-06)
641
+
642
+ Version 2.0.1 of the Google Play Billing library is now available. This version
643
+ contains the following changes.
644
+
645
+ ### Bug fixes
646
+
647
+ - Fixed a bug where debug messages were being returned as `null` in some cases.
648
+ - Fixed a potential memory leak issue.
649
+
650
+ ## Google Play Billing Library 2.0 Release (2019-05-07)
651
+
652
+ Version 2.0 of the Google Play Billing library is now available. This version
653
+ contains the following changes.
654
+
655
+ ### Purchases must be acknowledged within three days
656
+
657
+ > [!NOTE]
658
+ > **Note:** This section describes a new requirement for acknowledging all purchases. If you are already consuming purchases using `consumeAsync()`, you don't need to make any further changes if you consume purchases within 3 days, as `consumeAsync()` automatically acknowledges a purchase. Failure to properly acknowledge purchases will result in purchases being refunded.
659
+
660
+ > [!NOTE]
661
+ > **Note:** This requirement applies only to apps that use the Google Play Billing Library version 2.0 and newer. This requirement doesn't apply if you use an older version of the Google Play Billing Library, or if you use the AIDL API.
662
+
663
+ Google Play supports purchasing products from inside of your app (in-app) or
664
+ outside of your app (out-of-app). In order for Google Play to ensure a
665
+ consistent purchase experience regardless of where the user purchases your
666
+ product, you must acknowledge all purchases received through the Google Play
667
+ Billing Library as soon as possible after granting entitlement to the user. If
668
+ you don't acknowledge a purchase within three days, the user automatically
669
+ receives a refund, and Google Play revokes the purchase. For [pending
670
+ transactions](https://developer.android.com/google/play/billing/release-notes#2_0_pending) (new in version 2.0), the three-day window starts
671
+ when the purchase has moved to the `PURCHASED` state and does not apply while
672
+ the purchase is in a `PENDING` state.
673
+
674
+ For subscriptions, you must acknowledge any purchase that has a new purchase
675
+ token. This means that all initial purchases, plan changes, and re-signups need
676
+ to be acknowledged, but you don't need to acknowledge subsequent renewals. To
677
+ determine if a purchase needs acknowledgment, you can check the acknowledgement
678
+ field in the purchase.
679
+
680
+ The `Purchase` object now includes an
681
+ [`isAcknowledged()`](https://developer.android.com/reference/com/android/billingclient/api/Purchase#isacknowledged)
682
+ method that indicates whether a purchase has been acknowledged. In addition, the
683
+ Google Play Developer API includes acknowledgement boolean values for both
684
+ [`Purchases.products`](https://developers.google.com/android-publisher/api-ref/purchases/products)
685
+ and
686
+ [`Purchases.subscriptions`](https://developers.google.com/android-publisher/api-ref/purchases/subscriptions).
687
+ Before acknowledging a purchase, be sure to use these methods to determine if
688
+ the purchase has already been acknowledged.
689
+
690
+ You can acknowledge a purchase by using one of the following methods:
691
+
692
+ - For consumable products, use `consumeAsync()`, found in the client API.
693
+ - For products that aren't consumed, use `acknowledgePurchase()`, found in the client API.
694
+ - A new `acknowledge()` method is also available in the Server API.
695
+
696
+ ### BillingFlowParams.setSku() has been removed
697
+
698
+ The previously-deprecated `BillingFlowParams#setSku()` method has been removed
699
+ in this release. Before rendering products in a purchase flow, you must now call
700
+ [`BillingClient.querySkuDetailsAsync()`](https://developer.android.com/reference/com/android/billingclient/api/BillingClient#queryskudetailsasync),
701
+ passing the resulting
702
+ [`SkuDetails`](https://developer.android.com/reference/com/android/billingclient/api/SkuDetails) object to
703
+ [`BillingFlowParams.Builder.setSkuDetails()`](https://developer.android.com/reference/com/android/billingclient/api/BillingFlowParams.Builder#setskudetails).
704
+
705
+ > [!NOTE]
706
+ > **Note:** Caching `SkuDetails` between user sessions is not recommended, as `SkuDetails` objects are valid only for a limited time before you must refresh them again by calling `querySkuDetailsAsync()`.
707
+
708
+ For code examples, see [Use the Google Play Billing
709
+ Library](https://developer.android.com/google/play/billing/billing_library_overview).
710
+
711
+ ### Developer payload is supported
712
+
713
+ Version 2.0 of the Google Play Billing library adds support for *developer
714
+ payload* ---arbitrary strings that can be attached to purchases. You can
715
+ attach a developer payload parameter to a purchase, but only when the purchase
716
+ is acknowledged or consumed. This is unlike developer payload in AIDL, where the
717
+ payload could be specified when launching the purchase flow. Because purchases
718
+ can now be initiated [from outside of your app](https://developer.android.com/google/play/billing/release-notes#2_0_acknowledge), this change
719
+ ensures that you always have an opportunity to add a payload to purchases.
720
+
721
+ To access the payload in the new library, `Purchase` objects now include a
722
+ [`getDeveloperPayload()`](https://developer.android.com/reference/com/android/billingclient/api/Purchase#getdeveloperpayload)
723
+ method.
724
+
725
+ > [!NOTE]
726
+ > **Note:** You cannot modify a payload after it is assigned.
727
+
728
+ ### Consistent offers
729
+
730
+ > [!NOTE]
731
+ > **Note:** This feature is being tested, and general availability is not guaranteed.
732
+
733
+ When you offer a discounted SKU, Google Play now returns the original price of
734
+ the SKU so that you can show users that they are receiving a discount.
735
+
736
+ [`SkuDetails`](https://developer.android.com/reference/com/android/billingclient/api/SkuDetails) contains two
737
+ new methods for retrieving the original SKU price:
738
+
739
+ - [`getOriginalPriceAmountMicros()`](https://developer.android.com/reference/com/android/billingclient/api/SkuDetails#getOriginalPriceAmountMicros())
740
+ - returns the unformatted original price of the SKU before discount.
741
+ - [`getOriginalPrice()`](https://developer.android.com/reference/com/android/billingclient/api/SkuDetails#getOriginalPrice())
742
+ - returns the original price with additional currency formatting.
743
+
744
+ ### Pending transactions
745
+
746
+ With version 2.0 of the Google Play Billing library, you *must* support
747
+ purchases where additional action is required before granting entitlement. For
748
+ example, a user might choose to purchase your in-app product at a physical store
749
+ using cash. This means that the transaction is completed outside of your app. In
750
+ this scenario, you should grant entitlement only after the user has completed
751
+ the transaction.
752
+
753
+ To enable pending purchases, call
754
+ [`enablePendingPurchases()`](https://developer.android.com/reference/com/android/billingclient/api/BillingClient.Builder#enablependingpurchases)
755
+ as part of initializing your app.
756
+
757
+ Use
758
+ [`Purchase.getPurchaseState()`](https://developer.android.com/reference/com/android/billingclient/api/Purchase#getpurchasestate)
759
+ to determine whether the purchase state is `PURCHASED` or `PENDING`. Note that
760
+ you should grant entitlement only when the state is `PURCHASED`. You should
761
+ check for `Purchase` status updates by doing the following:
762
+
763
+ 1. When starting your app, call [`BillingClient.queryPurchases()`](https://developer.android.com/reference/com/android/billingclient/api/BillingClient#querypurchases) to retrieve the list of unconsumed products associated with the user.
764
+ 2. Call `Purchase.getPurchaseState()` on each returned `Purchase` object.
765
+ 3. Implement the [`onPurchasesUpdated()`](https://developer.android.com/reference/com/android/billingclient/api/PurchasesUpdatedListener#onpurchasesupdated) method to respond to changes to `Purchase` objects.
766
+
767
+ In addition, the Google Play Developer API includes a `PENDING` state for
768
+ [`Purchases.products`](https://developers.google.com/android-publisher/api-ref/purchases/products).
769
+ Pending transactions are not supported for subscriptions.
770
+
771
+ This release also introduces a new real-time developer notification type,
772
+ `OneTimeProductNotification`. This notification type contains a single message
773
+ whose value is either `ONE_TIME_PRODUCT_PURCHASED` or
774
+ `ONE_TIME_PRODUCT_CANCELED`. This notification type is sent only for purchases
775
+ associated with delayed forms of payment, such as cash.
776
+
777
+ When acknowledging pending purchases, be sure to acknowledge only when the
778
+ purchase state is `PURCHASED` and not `PENDING`.
779
+
780
+ > [!NOTE]
781
+ > **Note:** Pending transactions can be tested using license testers. In addition to two test credit cards, license testers have access to two new test instruments for delayed forms of payment which automatically complete or cancel after a couple of minutes. While testing your application, you should verify that your application does not grant entitlement or acknowledge the purchase immediately after purchasing with either of these two new instruments. When purchasing using the new test instrument that automatically completes, you should verify that your application grants entitlement and acknowledges the purchase once the purchase completes.
782
+
783
+ ### API changes
784
+
785
+ Version 2.0 of the Google Play Billing library contains several API changes to
786
+ support new features and clarify existing functionality.
787
+
788
+ #### consumeAsync
789
+
790
+ [`consumeAsync()`](https://developer.android.com/reference/com/android/billingclient/api/BillingClient#consumeasync)
791
+ now takes a
792
+ [`ConsumeParams`](https://developer.android.com/reference/com/android/billingclient/api/ConsumeParams) object
793
+ instead of a `purchaseToken`. `ConsumeParams` contains the `purchaseToken` as
794
+ well as an optional developer payload.
795
+
796
+ The previous version of `consumeAsync()` has been removed in this release.
797
+
798
+ #### queryPurchaseHistoryAsync
799
+
800
+ To minimize confusion,
801
+ [`queryPurchaseHistoryAsync()`](https://developer.android.com/reference/com/android/billingclient/api/BillingClient#queryPurchaseHistoryAsync(java.lang.String,%20com.android.billingclient.api.PurchaseHistoryResponseListener))
802
+ now returns a
803
+ [`PurchaseHistoryRecord`](https://developer.android.com/reference/com/android/billingclient/api/PurchaseHistoryRecord)
804
+ object instead of a `Purchase` object. The `PurchaseHistoryRecord` object is the
805
+ same as a `Purchase` object, except that it reflects only the values returned by
806
+ `queryPurchaseHistoryAsync()` and does not contain the `autoRenewing`,
807
+ `orderId`, and `packageName` fields. Note that nothing has changed with the
808
+ returned data---`queryPurchaseHistoryAsync()` returns the same data as
809
+ before.
810
+
811
+ #### BillingResult return values
812
+
813
+ APIs that previously returned a `BillingResponse` integer value now return a
814
+ [`BillingResult`](https://developer.android.com/reference/com/android/billingclient/api/BillingResult)
815
+ object. `BillingResult` contains the `BillingResponse` integer as well as a
816
+ debug string that you can use to diagnose errors. The debug string uses an en-US
817
+ locale and is not meant to be shown to end users.
818
+
819
+ ### Bug fixes
820
+
821
+ - [`SkuDetails.getIntroductoryPriceAmountMicros()`](https://developer.android.com/reference/com/android/billingclient/api/SkuDetails#getIntroductoryPriceAmountMicros()) now returns a `long` instead of a `String`.
822
+
823
+ ## Google Play Billing Library 1.2.2 Release (2019-03-07)
824
+
825
+ Version 1.2.2 of the Google Play Billing library is now available. This version
826
+ contains the following changes.
827
+
828
+ ### Bug fixes
829
+
830
+ - Fixed a threading issue introduced in v1.2.1. Background calls no longer block the main thread.
831
+
832
+ ### Other changes
833
+
834
+ - Although using the main thread is still recommended, you can now instantiate the Google Play Billing Library from a background thread.
835
+ - Instantiation has been fully migrated to the background thread to reduce the chance of causing ANRs.
836
+
837
+ ## Play Billing Library 1.2.1 Release (2019-03-04)
838
+
839
+ Version 1.2.1 of the Google Play Billing library is now available. This version
840
+ contains the following changes.
841
+
842
+ ### Major changes
843
+
844
+ - Added support for [rewarded
845
+ products](https://developer.android.com/google/play/billing/billing_rewarded_products). For more information on monetization options, see [Add rewarded-product-specific
846
+ features](https://developer.android.com/distribute/best-practices/earn/monetization-options).
847
+
848
+ ### Other changes
849
+
850
+ - Added public constructors for `PurchasesResult` and `SkuDetailsResult` to make testing easier.
851
+ - `SkuDetails` objects can use a new method, `getOriginalJson()`.
852
+ - All AIDL service calls are now handled by background threads.
853
+
854
+ ### Bug fixes
855
+
856
+ - Null callback listeners are no longer passed into public APIs.
857
+
858
+ ## Google Play Billing Library 1.2 Release (2018-10-18)
859
+
860
+ Version 1.2 of the Google Play Billing library is now available. This version
861
+ contains the following changes.
862
+
863
+ ### Summary of changes
864
+
865
+ - The Google Play Billing Library is now licensed under the [Android Software
866
+ Development Kit License Agreement](https://developer.android.com/studio/terms).
867
+ - Added the `launchPriceChangeConfirmationFlow` API, which prompts users to review a pending change to a subscription price.
868
+ - Added support for a new proration mode, `DEFERRED`, when upgrading or downgrading a user's subscription.
869
+ - In the `BillingFlowParams` class, replaced `setSku()` with `setSkuDetails()`.
870
+ - Minor bug fixes and code optimizations.
871
+
872
+ #### Price change confirmation
873
+
874
+ You can now change the price of a subscription in Google Play Console
875
+ and prompt users to review and accept the new price when they enter your app.
876
+
877
+ To use this API, create a `PriceChangeFlowParams` object by using the
878
+ `skuDetails` of the subscription product, and then call
879
+ `launchPriceChangeConfirmationFlow()`. Implement the
880
+ `PriceChangeConfirmationListener` to handle the result when the price change
881
+ confirmation flow finishes, as shown in the following code snippet:
882
+
883
+ ### Kotlin
884
+
885
+ ```kotlin
886
+ val priceChangeFlowParams = PriceChangeFlowParams.newBuilder()
887
+ .setSkuDetails(skuDetailsOfThePriceChangedSubscription)
888
+ .build()
889
+
890
+ billingClient.launchPriceChangeConfirmationFlow(activity,
891
+ priceChangeFlowParams,
892
+ object : PriceChangeConfirmationListener() {
893
+ override fun onPriceChangeConfirmationResult(responseCode: Int) {
894
+ // Handle the result.
895
+ }
896
+ })
897
+ ```
898
+
899
+ ### Java
900
+
901
+ ```java
902
+ PriceChangeFlowParams priceChangeFlowParams =
903
+ PriceChangeFlowParams.newBuilder()
904
+ .setSkuDetails(skuDetailsOfThePriceChangedSubscription)
905
+ .build();
906
+
907
+ billingClient.launchPriceChangeConfirmationFlow(activity,
908
+ priceChangeFlowParams,
909
+ new PriceChangeConfirmationListener() {
910
+ @Override
911
+ public void onPriceChangeConfirmationResult(int responseCode) {
912
+ // Handle the result.
913
+ }
914
+ });
915
+ ```
916
+
917
+ The price change confirmation flow displays a dialog containing the new pricing
918
+ information, asking users to accept the new price. This flow returns a response
919
+ code of type
920
+ [`BillingClient.BillingResponse`](https://developer.android.com/reference/com/android/billingclient/api/BillingClient.BillingResponse).
921
+
922
+ #### New proration mode
923
+
924
+ When upgrading or downgrading a user's subscription, you can use a new proration
925
+ mode, `DEFERRED`. This mode updates the user's subscription when it next renews.
926
+ To learn more about how to set this proration mode, see [Set proration
927
+ mode](https://developer.android.com/google/play/billing/billing_subscriptions#set-proration-mode).
928
+
929
+ #### New method for setting SKU details
930
+
931
+ In the `BillingFlowParams` class, the `setSku()` method has been deprecated.
932
+ This change serves to optimize the Google Play Billing flow.
933
+
934
+ When constructing a new instance of `BillingFlowParams` in your in-app billing
935
+ client, we recommend that you instead work with the JSON object directly using
936
+ `setSkuDetails()`, as shown in the following code snippet:
937
+
938
+ In the `BillingFlowParams` Builder class, the `setSku()` method has been
939
+ deprecated. Instead, use the `setSkuDetails()` method, as shown in the following
940
+ code snippet. The object passed into `setSkuDetails()` object comes from the
941
+ [`querySkuDetailsAsync()`](https://developer.android.com/reference/com/android/billingclient/api/BillingClient#querySkuDetailsAsync(com.android.billingclient.api.SkuDetailsParams,%20com.android.billingclient.api.SkuDetailsResponseListener))
942
+ method.
943
+
944
+ ### Kotlin
945
+
946
+ ```kotlin
947
+ private lateinit var mBillingClient: BillingClient
948
+ private val mSkuDetailsMap = HashMap<String, SkuDetails>()
949
+
950
+ private fun querySkuDetails() {
951
+ val skuDetailsParamsBuilder = SkuDetailsParams.newBuilder()
952
+ mBillingClient.querySkuDetailsAsync(skuDetailsParamsBuilder.build()
953
+ ) { responseCode, skuDetailsList ->
954
+ if (responseCode == 0) {
955
+ for (skuDetails in skuDetailsList) {
956
+ mSkuDetailsMap[skuDetails.sku] = skuDetails
957
+ }
958
+ }
959
+ }
960
+ }
961
+
962
+ private fun startPurchase(skuId: String) {
963
+ val billingFlowParams = BillingFlowParams.newBuilder()
964
+ .setSkuDetails(mSkuDetailsMap[skuId])
965
+ .build()
966
+ }
967
+ ```
968
+
969
+ ### Java
970
+
971
+ ```java
972
+ private BillingClient mBillingClient;
973
+ private Map<String, SkuDetails> mSkuDetailsMap = new HashMap<>();
974
+
975
+ private void querySkuDetails() {
976
+ SkuDetailsParams.Builder skuDetailsParamsBuilder
977
+ = SkuDetailsParams.newBuilder();
978
+ mBillingClient.querySkuDetailsAsync(skuDetailsParamsBuilder.build(),
979
+ new SkuDetailsResponseListener() {
980
+ @Override
981
+ public void onSkuDetailsResponse(int responseCode,
982
+ List<SkuDetails> skuDetailsList) {
983
+ if (responseCode == 0) {
984
+ for (SkuDetails skuDetails : skuDetailsList) {
985
+ mSkuDetailsMap.put(skuDetails.getSku(), skuDetails);
986
+ }
987
+ }
988
+ }
989
+ });
990
+ }
991
+
992
+ private void startPurchase(String skuId) {
993
+ BillingFlowParams billingFlowParams = BillingFlowParams.newBuilder()
994
+ .setSkuDetails(mSkuDetailsMap.get(skuId))
995
+ .build();
996
+ }
997
+ ```
998
+
999
+ ## Play Billing Library 1.1 Release (2018-05-07)
1000
+
1001
+ Version 1.1 of the Google Play Billing library is now available. This version
1002
+ contains the following changes.
1003
+
1004
+ ### Summary of changes
1005
+
1006
+ - Added support to specify a proration mode in [`BillingFlowParams`](https://developer.android.com/reference/com/android/billingclient/api/BillingFlowParams) when upgrading/downgrading an existing subscription.
1007
+ - The `replaceSkusProration` boolean flag in [`BillingFlowParams`](https://developer.android.com/reference/com/android/billingclient/api/BillingFlowParams) is no longer supported. Use `replaceSkusProrationMode` instead.
1008
+ - [`launchBillingFlow()`](https://developer.android.com/reference/com/android/billingclient/api/BillingClient.html#launchBillingFlow(android.app.Activity,%0Acom.android.billingclient.api.BillingFlowParams)) now triggers a callback for failed responses.
1009
+
1010
+ ### Behavior changes
1011
+
1012
+ Version 1.1 of the Google Play Billing library contains the following behavior
1013
+ changes.
1014
+
1015
+ #### Developers can set `replaceSkusProrationMode` in [`BillingFlowParams`](https://developer.android.com/reference/com/android/billingclient/api/BillingFlowParams) class
1016
+
1017
+ A `ProrationMode` provides further details on the type of proration when
1018
+ upgrading or downgrading a user's subscription.
1019
+
1020
+ ### Kotlin
1021
+
1022
+ ```kotlin
1023
+ BillingFlowParams.newBuilder()
1024
+ .setSku(skuId)
1025
+ .setType(billingType)
1026
+ .setOldSku(oldSku)
1027
+ .setReplaceSkusProrationMode(replaceSkusProrationMode)
1028
+ .build()
1029
+ ```
1030
+
1031
+ <br />
1032
+
1033
+ <br />
1034
+
1035
+ ### Java
1036
+
1037
+ ```java
1038
+ BillingFlowParams.newBuilder()
1039
+ .setSku(skuId)
1040
+ .setType(billingType)
1041
+ .setOldSku(oldSku)
1042
+ .setReplaceSkusProrationMode(replaceSkusProrationMode)
1043
+ .build();
1044
+ ```
1045
+
1046
+ <br />
1047
+
1048
+ Google Play supports following proration modes:
1049
+
1050
+ |---|---|
1051
+ | `IMMEDIATE_WITH_TIME_PRORATION` | Replacement takes effect immediately, and the new expiration time will be prorated and credited or charged to the user. This is the current default behavior. |
1052
+ | `IMMEDIATE_AND_CHARGE_PRORATED_PRICE` | Replacement takes effect immediately, and the billing cycle remains the same. The price for the remaining period will be charged. **Note**: This option is only available for subscription upgrade. |
1053
+ | `IMMEDIATE_WITHOUT_PRORATION` | Replacement takes effect immediately, and the new price will be charged on next recurrence time. The billing cycle stays the same. |
1054
+
1055
+ ### `replaceSkusProration` is no longer supported in [`BillingFlowParams`](https://developer.android.com/reference/com/android/billingclient/api/BillingFlowParams.html) class
1056
+
1057
+ Developers used to be able to set a boolean flag to charge a prorated amount for
1058
+ a subscription upgrade request. Given that we are supporting `ProrationMode`,
1059
+ which contains more detailed proration instruction, this boolean flag is no
1060
+ longer supported.
1061
+
1062
+ ### [`launchBillingFlow()`](https://developer.android.com/reference/com/android/billingclient/api/BillingClient.html#launchBillingFlow(android.app.Activity,%20com.android.billingclient.api.BillingFlowParams)) now triggers a callback for failed responses
1063
+
1064
+ The Billing Library will always trigger the
1065
+ [`PurhcasesUpdatedListener`](https://developer.android.com/reference/com/android/billingclient/api/PurchasesUpdatedListener)
1066
+ callback and return a
1067
+ [`BillingResponse`](https://developer.android.com/reference/com/android/billingclient/api/BillingClient.BillingResponse)
1068
+ asynchronously. The synchronous return value of
1069
+ [`BillingResponse`](https://developer.android.com/reference/com/android/billingclient/api/BillingClient.BillingResponse)
1070
+ is kept as well.
1071
+
1072
+ ### Bug fixes
1073
+
1074
+ - Properly exits early in async methods when service is disconnected.
1075
+ - [`Builder`](https://developer.android.com/reference/com/android/billingclient/api/BillingClient.Builder) param objects no longer mutates built objects.
1076
+ - Issue [68087141](https://issuetracker.google.com/issues/68087141): [`launchBillingFlow()`](https://developer.android.com/reference/com/android/billingclient/api/BillingClient.html#launchBillingFlow(android.app.Activity,%0Acom.android.billingclient.api.BillingFlowParams)) now trigger callback for failed responses.
1077
+
1078
+ ## Google Play Billing Library 1.0 Release (2017-09-19, [Announcement](https://android-developers.googleblog.com/2017/09/google-play-billing-library-10-released.html))
1079
+
1080
+ Version 1.0 of the Google Play Billing library is now available. This version
1081
+ contains the following changes.
1082
+
1083
+ ### Important changes
1084
+
1085
+ - Embedded billing permission inside library's manifest. It's not necessary to add the `com.android.vending.BILLING` permission inside Android manifest anymore.
1086
+ - New builder added to [`BillingClient.Builder`](https://developer.android.com/reference/com/android/billingclient/api/BillingClient.Builder.html) class.
1087
+ - Introduced builder pattern for [`SkuDetailsParams`](https://developer.android.com/reference/com/android/billingclient/api/SkuDetailsParams.html) class to be used on methods to query SKUs.
1088
+ - Several API methods were updated for consistency (the same return argument names and order).
1089
+
1090
+ ### Behavior changes
1091
+
1092
+ Version 1.0 of the Google Play Billing library contains the following behavior
1093
+ changes.
1094
+
1095
+ #### BillingClient.Builder class
1096
+
1097
+ [`BillingClient.Builder`](https://developer.android.com/reference/com/android/billingclient/api/BillingClient.Builder.html)
1098
+ is now initialized via the newBuilder pattern:
1099
+
1100
+ ### Kotlin
1101
+
1102
+ ```kotlin
1103
+ billingClient = BillingClient.newBuilder(context).setListener(this).build()
1104
+ ```
1105
+
1106
+ ### Java
1107
+
1108
+ ```java
1109
+ billingClient = BillingClient.newBuilder(context).setListener(this).build();
1110
+ ```
1111
+
1112
+ #### launchBillingFlow method is now called using a BillingFlowParams class
1113
+
1114
+ To initiate the billing flow for a purchase or subscription, the
1115
+ [`launchBillingFlow()`](https://developer.android.com/reference/com/android/billingclient/api/BillingClient.html#launchBillingFlow(android.app.Activity,%0Acom.android.billingclient.api.BillingFlowParams)) method receives a
1116
+ [`BillingFlowParams`](https://developer.android.com/reference/com/android/billingclient/api/BillingFlowParams.html)
1117
+ instance initialized with parameters specific to the request:
1118
+
1119
+ ### Kotlin
1120
+
1121
+ ```kotlin
1122
+ BillingFlowParams.newBuilder().setSku(skuId)
1123
+ .setType(billingType)
1124
+ .setOldSku(oldSku)
1125
+ .build()
1126
+
1127
+ // Then, use the BillingFlowParams to start the purchase flow
1128
+ val responseCode = billingClient.launchBillingFlow(builder.build())
1129
+ ```
1130
+
1131
+ ### Java
1132
+
1133
+ ```java
1134
+ BillingFlowParams.newBuilder().setSku(skuId)
1135
+ .setType(billingType)
1136
+ .setOldSku(oldSku)
1137
+ .build();
1138
+
1139
+ // Then, use the BillingFlowParams to start the purchase flow
1140
+ int responseCode = billingClient.launchBillingFlow(builder.build());
1141
+ ```
1142
+
1143
+ #### New way to query available products
1144
+
1145
+ Arguments for
1146
+ [`queryPurchaseHistoryAsync()`](https://developer.android.com/reference/com/android/billingclient/api/BillingClient.html#queryPurchaseHistoryAsync(java.lang.String,%0Acom.android.billingclient.api.PurchaseHistoryResponseListener)) and
1147
+ [`querySkuDetailsAsync()`](https://developer.android.com/reference/com/android/billingclient/api/BillingClient.html#querySkuDetailsAsync(com.android.billingclient.api.SkuDetailsParams,%0Acom.android.billingclient.api.SkuDetailsResponseListener)) methods were wrapped
1148
+ into a Builder pattern:
1149
+
1150
+ ### Kotlin
1151
+
1152
+ ```kotlin
1153
+ val params = SkuDetailsParams.newBuilder()
1154
+ params.setSkusList(skuList)
1155
+ .setType(itemType)
1156
+ billingClient.querySkuDetailsAsync(params.build(), object : SkuDetailsResponseListener() {
1157
+ ...
1158
+ })
1159
+ ```
1160
+
1161
+ ### Java
1162
+
1163
+ ```java
1164
+ SkuDetailsParams.Builder params = SkuDetailsParams.newBuilder();
1165
+ params.setSkusList(skuList)
1166
+ .setType(itemType);
1167
+ billingClient.querySkuDetailsAsync(params.build(), new SkuDetailsResponseListener() {...})
1168
+ ```
1169
+
1170
+ The result is now returned via result code and a list of
1171
+ [`SkuDetails`](https://developer.android.com/reference/com/android/billingclient/api/SkuDetails.html)
1172
+ objects instead of previous wrapper class for your convenience and to be
1173
+ consistent across our API:
1174
+
1175
+ ### Kotlin
1176
+
1177
+ ```kotlin
1178
+ fun onSkuDetailsResponse(@BillingResponse responseCode: Int, skuDetailsList: List<SkuDetails>)
1179
+ ```
1180
+
1181
+ ### Java
1182
+
1183
+ ```java
1184
+ public void onSkuDetailsResponse(@BillingResponse int responseCode, List<SkuDetails> skuDetailsList)
1185
+ ```
1186
+
1187
+ #### Parameters order changed on `onConsumeResponse()` method
1188
+
1189
+ The order of arguments for
1190
+ [`onConsumeResponse`](https://developer.android.com/reference/com/android/billingclient/api/ConsumeResponseListener.html#onConsumeResponse(int,%0Ajava.lang.String)) from the
1191
+ [`ConsumeResponseListener`](https://developer.android.com/reference/com/android/billingclient/api/ConsumeResponseListener.html)
1192
+ interface has changed to be consistent across our API:
1193
+
1194
+ ### Kotlin
1195
+
1196
+ ```kotlin
1197
+ fun onConsumeResponse(@BillingResponse responseCode: Int, outToken: String)
1198
+ ```
1199
+
1200
+ ### Java
1201
+
1202
+ ```java
1203
+ public void onConsumeResponse(@BillingResponse int responseCode, String outToken)
1204
+ ```
1205
+
1206
+ #### Unwrapped PurchaseResult object
1207
+
1208
+ [`PurchaseResult`](https://developer.android.com/reference/com/android/billingclient/api/Purchase.PurchasesResult.html)
1209
+ has been unwraped to be consistent across our API:
1210
+
1211
+ ### Kotlin
1212
+
1213
+ ```kotlin
1214
+ fun onPurchaseHistoryResponse(@BillingResponse responseCode: Int, purchasesList: List<Purchase>)
1215
+ ```
1216
+
1217
+ ### Java
1218
+
1219
+ ```java
1220
+ void onPurchaseHistoryResponse(@BillingResponse int responseCode, List<Purchase> purchasesList)
1221
+ ```
1222
+
1223
+ ### Bug fixes
1224
+
1225
+ - [No response code in PURCHASES_UPDATED Bundle](https://issuetracker.google.com/issues/64075043)
1226
+ - [Fix ProxyBillingActivity and PurchasesUpdatedListener issues during device
1227
+ rotation](https://issuetracker.google.com/issues/63266562)
1228
+
1229
+ ## Developer Preview 1 Release (2017-06-12, [Announcement](https://android-developers.googleblog.com/2017/06/money-made-easily-with-new-google-play.html))
1230
+
1231
+ Developer preview launched, aimed to simplify the development process when it
1232
+ comes to billing, allowing developers to focus their efforts on implementing
1233
+ logic specific to the Android app, such as application architecture and
1234
+ navigation structure.
1235
+
1236
+ The library includes several convenient classes and features for you to use when
1237
+ integrating your Android apps with the Google Play Billing API. The library also
1238
+ provides an abstraction layer on top of the Android Interface Definition
1239
+ Language (AIDL) service, making it easier for developers to define the interface
1240
+ between the app and the Google Play Billing API.