Skip to content

[Platform deprecation][Google] Add Android Location Button before 2027-01-27 #5667

Description

@shai-almog

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

  1. 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.
  2. 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.
  3. 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.
  4. 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.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions