Impact summary
Urgency: High. From 2027-01-27, Google Play requires apps targeting Android 17 (API level 37)+ to use the Android Location Button for transactional, one-time precise-location use cases. Persistent ACCESS_FINE_LOCATION remains available only for justified core functionality and requires a Play Console declaration.
Codename One currently treats all foreground location use as broad precise-location permission use: referencing the location API injects ACCESS_FINE_LOCATION and ACCESS_COARSE_LOCATION, and obtaining the Android LocationManager unconditionally checks ACCESS_FINE_LOCATION. One-shot CN1 calls such as getCurrentLocationSync() therefore have no policy-compliant Location Button path.
Official requirement and deadline
Hard policy enforcement deadline: 2027-01-27.
First affected platform/store combination: Google Play apps targeting Android 17 / API 37+ that need one-time/session precise location, or that retain ACCESS_FINE_LOCATION without an approved persistent core-use justification.
Concrete Codename One applicability
Verified against codenameone/CodenameOne master at 134f6ec227792da11b595a77eda6c06d3c0a2b8f:
CodenameOne/src/com/codename1/location/LocationManager.java
- Exposes one-shot
getCurrentLocation* flows as well as continuous listeners and background/geofence APIs, but does not distinguish policy-minimized session access.
Ports/Android/src/com/codename1/impl/android/AndroidImplementation.java
getLocationManager() unconditionally checks Manifest.permission.ACCESS_FINE_LOCATION before returning the native manager.
Ports/Android/src/com/codename1/location/AndroidLocationManager.java
- Requests normal GPS/provider updates; there is no system Location Button session or temporary permission flow.
maven/codenameone-maven-plugin/src/main/java/com/codename1/builders/AndroidGradleBuilder.java
- Location API detection emits both
ACCESS_FINE_LOCATION and ACCESS_COARSE_LOCATION into the generated manifest without USE_LOCATION_BUTTON or an onlyForLocationButton flag.
codenameone/BuildDaemon master at 09cd713c6abe9455d0574ed0a1ff0776bee84754
AndroidBuilder, AndroidGradleBuilder, and PermissionInjections mirror broad location permission generation for hosted builds.
- No
USE_LOCATION_BUTTON, onlyForLocationButton, androidx.core.locationbutton, or platform Location Button implementation exists on the default branch.
Deduplication across open and closed issues/PRs used Location Button, USE_LOCATION_BUTTON, onlyForLocationButton, API 37, 2027-01-27, and the official notice name. No tracking item or completed migration was found.
Affected users and failure mode
- CN1 apps targeting API 37+ that use one-time precise location for nearby search, address fill, tagging, or one-time sharing.
- Apps with continuous navigation, tracking, geofence, or background location can retain broad access only when it is core functionality and properly declared.
- Failure mode: Play policy declaration/review burden; update rejection or policy enforcement for one-time use implemented with broad permission; or a broken location feature if the app removes
ACCESS_FINE_LOCATION without a CN1 Location Button path.
Proposed migration
- Investigation/API design
- Define a CN1 UI/API seam for a system-rendered Location Button and session-scoped result, distinct from persistent
LocationManager listeners.
- Decide fallback semantics for Android <=16 and for non-Android platforms without weakening Android 17 policy behavior.
- Implementation
- Integrate the AndroidX Location Button (or stable platform boundary) and route its granted session into a one-shot CN1 location result.
- Inject
USE_LOCATION_BUTTON and the correct onlyForLocationButton flag only for picker-only flows; do not inject unrestricted ACCESS_FINE_LOCATION for those apps.
- Preserve existing continuous/background/geofence APIs and document their Play declaration obligations.
- Add any compile SDK 37/toolchain requirement to Maven and BuildDaemon in a coordinated change.
- CI and beta validation
- Add manifest-generation tests for button-only versus persistent location use.
- Test grant, denial, cancellation, configuration change, session expiry, process/activity recreation, and fallback behavior.
- Validate Android 17 gesture/UI behavior on device/emulator and both Maven/local and BuildDaemon/hosted AAB generation.
- Release and communication
- Ship framework, builder, and BuildDaemon support together.
- Publish a migration example for
getCurrentLocationSync()-style one-time use and a separate declaration checklist for persistent location apps.
Internal target dates
- 90-day checkpoint / API and dependency decision: 2026-10-29
- 60-day checkpoint / implementation complete: 2026-11-28
- Android 17 UI, CI, and hosted-build validation complete: 2026-12-14
- Release and customer communication no later than 2026-12-28, preserving the required 30-day buffer before 2027-01-27 enforcement
Risks, unknowns, and verification plan
- The official guide currently calls the AndroidX Location Button library experimental; pin and retest the chosen version before release.
- A native system-rendered button must fit CN1 layout/lifecycle semantics without being covered, restyled incompatibly, or detached during form transitions.
- The manifest flag must not coexist incorrectly with persistent fine-location use in the same app; define an explicit conflict/upgrade rule.
- BuildCloud does not yet show an API 37 default image in the inspected BuildDaemon source; direct API 37 compilation needs coordinated toolchain availability.
- Verify Play Console pre-launch/policy checks, Android 17 session-only access after button tap, denial/revocation, older-device fallback, and persistent-location declaration documentation.
Impact summary
Urgency: High. From 2027-01-27, Google Play requires apps targeting Android 17 (API level 37)+ to use the Android Location Button for transactional, one-time precise-location use cases. Persistent
ACCESS_FINE_LOCATIONremains available only for justified core functionality and requires a Play Console declaration.Codename One currently treats all foreground location use as broad precise-location permission use: referencing the location API injects
ACCESS_FINE_LOCATIONandACCESS_COARSE_LOCATION, and obtaining the AndroidLocationManagerunconditionally checksACCESS_FINE_LOCATION. One-shot CN1 calls such asgetCurrentLocationSync()therefore have no policy-compliant Location Button path.Official requirement and deadline
ACCESS_FINE_LOCATION.USE_LOCATION_BUTTON; picker-only precise access uses theonlyForLocationButtonpermission flag.Hard policy enforcement deadline: 2027-01-27.
First affected platform/store combination: Google Play apps targeting Android 17 / API 37+ that need one-time/session precise location, or that retain
ACCESS_FINE_LOCATIONwithout an approved persistent core-use justification.Concrete Codename One applicability
Verified against
codenameone/CodenameOnemasterat134f6ec227792da11b595a77eda6c06d3c0a2b8f:CodenameOne/src/com/codename1/location/LocationManager.javagetCurrentLocation*flows as well as continuous listeners and background/geofence APIs, but does not distinguish policy-minimized session access.Ports/Android/src/com/codename1/impl/android/AndroidImplementation.javagetLocationManager()unconditionally checksManifest.permission.ACCESS_FINE_LOCATIONbefore returning the native manager.Ports/Android/src/com/codename1/location/AndroidLocationManager.javamaven/codenameone-maven-plugin/src/main/java/com/codename1/builders/AndroidGradleBuilder.javaACCESS_FINE_LOCATIONandACCESS_COARSE_LOCATIONinto the generated manifest withoutUSE_LOCATION_BUTTONor anonlyForLocationButtonflag.codenameone/BuildDaemonmasterat09cd713c6abe9455d0574ed0a1ff0776bee84754AndroidBuilder,AndroidGradleBuilder, andPermissionInjectionsmirror broad location permission generation for hosted builds.USE_LOCATION_BUTTON,onlyForLocationButton,androidx.core.locationbutton, or platform Location Button implementation exists on the default branch.Deduplication across open and closed issues/PRs used
Location Button,USE_LOCATION_BUTTON,onlyForLocationButton, API 37,2027-01-27, and the official notice name. No tracking item or completed migration was found.Affected users and failure mode
ACCESS_FINE_LOCATIONwithout a CN1 Location Button path.Proposed migration
LocationManagerlisteners.USE_LOCATION_BUTTONand the correctonlyForLocationButtonflag only for picker-only flows; do not inject unrestrictedACCESS_FINE_LOCATIONfor those apps.getCurrentLocationSync()-style one-time use and a separate declaration checklist for persistent location apps.Internal target dates
Risks, unknowns, and verification plan