Skip to content

[pull] main from expo:main - #1170

Merged
pull[bot] merged 9 commits into
code:mainfrom
expo:main
Aug 21, 2026
Merged

[pull] main from expo:main#1170
pull[bot] merged 9 commits into
code:mainfrom
expo:main

Conversation

@pull

@pull pull Bot commented Aug 21, 2026

Copy link
Copy Markdown

See Commits and Changes for more details.


Created by pull[bot] (v2.0.0-alpha.4)

Can you help keep this open source service alive? 💖 Please sponsor : )

expo-bot and others added 9 commits August 20, 2026 20:59
… containing a space (#48747)

Co-authored-by: Jakub Grzywacz <kontakt@jakubgrzywacz.pl>
…y --retry

The "started - watch the run" comment is now posted only with
--announce; the eyes reaction stays as the default receipt.

--retry (comment flag or the new dispatch retry input) tells the
publish phase to pass updateLatest to the findings tool, so the
thread's previous findings comment is updated in place instead of
joined by a sibling. The server resolves which comment that is;
no comment id crosses the tool boundary.
# Why

<!--
Please describe the motivation for this PR, and link to relevant GitHub
issues, forums posts, or feature requests.
-->

Fix ENG-26103

# How

<!--
How did you build this feature or fix this bug and why?
-->

- Update EAS Observe docs for GA and update callout about MAUs.

# Test Plan

<!--
Please describe how you tested this change and how a reviewer could
reproduce your test, especially if this PR does not include automated
tests! If possible, please also provide terminal output and/or
screenshots demonstrating your test/reproduction.
-->

Proofread.

# Checklist

<!--
Please check the appropriate items below if they apply to your diff.
-->

- [ ] I added a `changelog.md` entry and rebuilt the package sources
according to [this short
guide](https://github.com/expo/expo/blob/main/CONTRIBUTING.md#-before-submitting)
- [ ] This diff will work correctly for `npx expo prebuild` & EAS Build
(eg: updated a module plugin).
- [x] Conforms with the [Documentation Writing Style
Guide](https://github.com/expo/expo/blob/main/guides/Expo%20Documentation%20Writing%20Style%20Guide.md)
…ups (#49184)

# Why

<!--
Please describe the motivation for this PR, and link to relevant GitHub
issues, forums posts, or feature requests.
-->

Fix ENG-26094

# How

<!--
How did you build this feature or fix this bug and why?
-->

Fix llms.txt generator dropping pages in nested navigation groups in the
`llms.txt` generation script.

# Test Plan

<!--
Please describe how you tested this change and how a reviewer could
reproduce your test, especially if this PR does not include automated
tests! If possible, please also provide terminal output and/or
screenshots demonstrating your test/reproduction.
-->

See [preview](https://pr-49184.expo-docs.pages.dev/llms.txt) and search
for `using-posthog` and there should be two pages:

<img width="1618" height="264" alt="CleanShot 2026-08-21 at 01 26 18@2x"
src="https://github.com/user-attachments/assets/33ddf78a-3b27-444b-8aeb-ce0bfbe9d50c"
/>


# Checklist

<!--
Please check the appropriate items below if they apply to your diff.
-->

- [ ] I added a `changelog.md` entry and rebuilt the package sources
according to [this short
guide](https://github.com/expo/expo/blob/main/CONTRIBUTING.md#-before-submitting)
- [ ] This diff will work correctly for `npx expo prebuild` & EAS Build
(eg: updated a module plugin).
- [ ] Conforms with the [Documentation Writing Style
Guide](https://github.com/expo/expo/blob/main/guides/Expo%20Documentation%20Writing%20Style%20Guide.md)
# Why

`RootModal` is not used anywhere

# How

Remove the file

# Test Plan

<!--
Please describe how you tested this change and how a reviewer could
reproduce your test, especially if this PR does not include automated
tests! If possible, please also provide terminal output and/or
screenshots demonstrating your test/reproduction.
-->

# Checklist

<!--
Please check the appropriate items below if they apply to your diff.
-->

- [ ] I added a `changelog.md` entry and rebuilt the package sources
according to [this short
guide](https://github.com/expo/expo/blob/main/CONTRIBUTING.md#-before-submitting)
- [ ] This diff will work correctly for `npx expo prebuild` & EAS Build
(eg: updated a module plugin).
- [ ] Conforms with the [Documentation Writing Style
Guide](https://github.com/expo/expo/blob/main/guides/Expo%20Documentation%20Writing%20Style%20Guide.md)

Co-authored-by: expo-tuft[bot] <288127324+expo-tuft[bot]@users.noreply.github.com>
# Why

`InteractionManager` is deprecated in react-native and `warns` in tests

# How

<!--
How did you build this feature or fix this bug and why?
-->

# Test Plan

<!--
Please describe how you tested this change and how a reviewer could
reproduce your test, especially if this PR does not include automated
tests! If possible, please also provide terminal output and/or
screenshots demonstrating your test/reproduction.
-->

# Checklist

<!--
Please check the appropriate items below if they apply to your diff.
-->

- [ ] I added a `changelog.md` entry and rebuilt the package sources
according to [this short
guide](https://github.com/expo/expo/blob/main/CONTRIBUTING.md#-before-submitting)
- [ ] This diff will work correctly for `npx expo prebuild` & EAS Build
(eg: updated a module plugin).
- [ ] Conforms with the [Documentation Writing Style
Guide](https://github.com/expo/expo/blob/main/guides/Expo%20Documentation%20Writing%20Style%20Guide.md)

Co-authored-by: expo-tuft[bot] <288127324+expo-tuft[bot]@users.noreply.github.com>
…9202)

Automated upstream sync of generated reference content.

| Generator | Status |
| --- | --- |
| App config schema | ➖ No changes |
| Expo Skills | ➖ No changes |
| EAS CLI reference | ✅ Synced |
| Android permissions | ➖ No changes |

## Files
- `docs/pages/eas/cli.mdx`
- `docs/ui/components/EASCLIReference/data/eas-cli-commands.json`

Co-authored-by: Expo Bot <expo-bot@users.noreply.github.com>
…rror on non-conformant firmwares (#48957)

# Why

`PictureInPictureUtils.applyPiPParams` guards the `setAutoEnterEnabled`
call with `Build.VERSION.SDK_INT >= Build.VERSION_CODES.S`, which is
correct per the platform docs. We have production crashes from **two
different OEMs** whose **stock, unmodified** firmwares report `SDK_INT
>= 31` **and** `PackageManager.FEATURE_PICTURE_IN_PICTURE`, yet whose
`framework.jar` does not contain
`PictureInPictureParams$Builder.setAutoEnterEnabled(Z)`:

| Device                        | Android | `SDK_INT` | ROM state  |
| ----------------------------- | ------- | --------- | ---------- |
| Samsung SM-A325F (Galaxy A32) | 13      | 33        | unmodified |
| motorola one 5G UW ace        | 12      | 31        | unmodified |

Because the API level check and the PiP system-feature check **both
pass**, there is no capability signal left for the library to branch on.
The only way to survive this is to attempt the call and catch the
failure.

**To be clear about where the fault lies: the root cause is the OEM
firmware, not `expo-video`.** `setAutoEnterEnabled` is a standard public
API since API 31, and shipping a build that reports `SDK_INT` 31/33
without it is a compatibility violation on the vendor's side. Trusting
`SDK_INT` as a capability signal is the documented approach, so the
current code isn't wrong.

The problem is that **`expo-video` is the only layer that can do
anything about it.** These are budget devices that will not receive a
firmware update, and app developers have no way out either:

- The `NoSuchMethodError` propagates out of `VideoView.onLayout`, so it
fires on **every layout pass** that mounts a `VideoView` — it cannot be
caught or recovered from in app code.
- It is not opt-in. `findAndSetupPipCandidate` calls `applyPiPParams`
inside the `if (!newAutoEnter)` branch too, so apps that never enable
PiP (`allowsPictureInPicture={false}` or the default) are affected
identically.

In our app the affected screen is the first screen after launch, so
those users cannot get into the app at all — relaunching just crashes
again. We see **3 distinct installations / 24 crash events / 19
sessions** over 90 days; the roughly one-event-per-session ratio is the
signature of launch → crash → relaunch → crash again.

<details>
<summary>Stack trace</summary>

```
java.lang.NoSuchMethodError: No virtual method setAutoEnterEnabled(Z)Landroid/app/PictureInPictureParams$Builder;
in class Landroid/app/PictureInPictureParams$Builder; or its super classes
(declaration of 'android.app.PictureInPictureParams$Builder' appears in /system/framework/framework.jar)

  at expo.modules.video.utils.PictureInPictureUtilsKt.applyPiPParams (PictureInPictureUtils.kt:90)
  at expo.modules.video.utils.PictureInPictureUtilsKt.applyPiPParams$default (PictureInPictureUtils.kt:79)
  at expo.modules.video.managers.PictureInPictureManager.findAndSetupPipCandidate (PictureInPictureManager.kt:78)
  at expo.modules.video.managers.PictureInPictureManager.onPiPParamsChanged (PictureInPictureManager.kt:111)
  at expo.modules.video.VideoView.pipParams_delegate$lambda$2 (VideoView.kt:96)
  at expo.modules.video.delegates.IgnoreSameSet.setValue (IgnoreSameSet.kt:22)
  at expo.modules.video.VideoView.setPipParams (VideoView.kt:94)
  at expo.modules.video.VideoView.onLayout (VideoView.kt:338)
  at android.view.View.layout (View.java:22972)
  at android.view.ViewGroup.layout (ViewGroup.java:6389)
  at com.facebook.react.fabric.mounting.SurfaceMountingManager.updateLayout (SurfaceMountingManager.java:983)
  ...
```

Samsung build fingerprint from the native crash dump, showing a stock
release build:

```
FINGERPRINT: samsung/a32ser/a32:13/TP1A.220624.014/A325FXXSCDXL2:user/release-keys
TAGS: release-keys
SDK: 33
VERSION.RELEASE: 13
```

</details>

Note that one of the two devices is on **Android 12 / API 31 itself** —
the release that introduced `setAutoEnterEnabled`. That suggests some
OEM firmwares from that period shipped without the method fully present,
and that this is not specific to one vendor or SKU. Affected devices
can't be enumerated ahead of time, so a device allowlist/denylist isn't
a viable mitigation.

# How

Treat the setter as best-effort. Auto-enter PiP is the only
functionality lost when it is unavailable, so degrading gracefully is
strictly better than an unrecoverable crash.

Two things worth noting about how this fits the existing code:

1. **This isn't a new pattern — it's a consistency fix.** Every other
PiP framework call in this file already goes through
`runWithPiPMisconfigurationSoftHandling`, which soft-handles
`IllegalStateException` from a misconfigured manifest for exactly the
same reason (the library can't verify device/manifest state up front).
`setAutoEnterEnabled` was the one call sitting _outside_ that
protection:

   ```kotlin
   if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) {
     paramsBuilder.setAutoEnterEnabled(autoEnterPiP)   // <- not wrapped
   }
   runWithPiPMisconfigurationSoftHandling {
activity.setPictureInPictureParams(paramsBuilder.build()) // <- wrapped
   }
   ```

2. **Simply moving the call inside that block would not fix it.**
`NoSuchMethodError` is an `Error` (a `LinkageError`), not an
`Exception`, so it isn't caught by `catch (e: IllegalStateException)`.
It has to be caught explicitly — done inline here, but I'm happy to
widen the helper instead if you'd prefer that shape.

# Test Plan

I don't have access to either affected device, so I could not verify the
fix on failing hardware — the data above comes from production crash
reporting. I want to be upfront about that rather than imply a test I
didn't run.

What I can say about verifiability:

- **This is not a flaky or low-probability bug.** `NoSuchMethodError` is
a static linkage failure — the method is either present in
`framework.jar` or it isn't, with no timing or race component — and the
call site is reached from `View.onLayout`, so it fires on every layout
pass. On an affected firmware build it reproduces **100% of the time**.
(Strictly the unit is the firmware build, not the model — the
fingerprint above is `A325FXXSCDXL2`, so a different build for the same
model may well contain the method.)
- **The change is a provable no-op on conformant devices.**
`setAutoEnterEnabled` either resolves (behaviour identical to before) or
it doesn't (currently a fatal crash). There is no third state, so there
is no behavioural risk to devices that work today.
- The failure path can be simulated on any device by temporarily
replacing the call with `throw NoSuchMethodError()`: before the change
the app crash-loops on any screen containing a `VideoView`; after it,
the video renders and only auto-enter PiP is skipped.

We are already shipping the equivalent change as a `yarn patch` in our
own app, compiled from source (see below), and it builds and passes our
release pipeline — so the change is at least known to compile and not to
regress conformant devices in a real app.

Downstream context: we currently ship this exact change as a `yarn
patch`. On Expo SDK 55 that alone isn't enough, because `expo-video` is
linked as a precompiled AAR, so patching the Kotlin source in
`node_modules` has no effect. We also had to add:

```json
"expo": { "autolinking": { "android": { "buildFromSource": ["expo-video"] } } }
```

which forces `expo-video` to compile from source and measurably
increases Android build times on every build, including CI. An upstream
fix lets us drop both workarounds.

Affected versions: the relevant code block is byte-identical in
`55.0.11` (where we observed the crashes), `55.0.18`, `55.0.19`
(`sdk-55`), `57.0.2` (`latest`) and current `main`.

# Checklist

- [x] I added a `changelog.md` entry and rebuilt the package sources
according to [this short
guide](https://github.com/expo/expo/blob/main/CONTRIBUTING.md#-before-submitting)
- [x] This diff will work correctly for `npx expo prebuild` & EAS Build
(eg: updated a module plugin).
- [ ] Conforms with the [Documentation Writing Style
Guide](https://github.com/expo/expo/blob/main/guides/Expo%20Documentation%20Writing%20Style%20Guide.md)
# Why

Two recent merged PRs were missing the credit in changelog

# How

Add missing credits
@pull pull Bot locked and limited conversation to collaborators Aug 21, 2026
@pull pull Bot added the ⤵️ pull label Aug 21, 2026
@pull
pull Bot merged commit 74dabcd into code:main Aug 21, 2026
3 of 15 checks passed
Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

6 participants