Skip to content

Fix FaceTime notification tap intents#3080

Draft
franklinho wants to merge 4 commits into
BlueBubblesApp:masterfrom
franklinho:codex/facetime-notification-pendingintent-fix
Draft

Fix FaceTime notification tap intents#3080
franklinho wants to merge 4 commits into
BlueBubblesApp:masterfrom
franklinho:codex/facetime-notification-pendingintent-fix

Conversation

@franklinho

@franklinho franklinho commented Jul 9, 2026

Copy link
Copy Markdown

Summary

Fixes incoming FaceTime notification tap intents so the notification body opens the current call overlay instead of potentially reusing a stale PendingIntent.

Also includes narrow Android build fixes needed to validate this branch from the current 1.15 app source.

Problem

CreateIncomingFaceTimeNotification currently creates the body tap PendingIntent with:

  • request code 0 for every call
  • FLAG_IMMUTABLE
  • no FLAG_UPDATE_CURRENT

Android compares PendingIntents using the wrapped intent identity and request code, not extras. That means a prior OpenSummary intent can be reused and keep stale/missing extras such as callUuid. When the user taps an incoming FaceTime notification, the app may launch/clear the notification without the Dart intent handler seeing the current callUuid, so it never shows the FaceTime overlay or answer option.

What changed

  • Use the FaceTime notificationId as the body tap request code instead of 0.
  • Use FLAG_IMMUTABLE | FLAG_UPDATE_CURRENT for the FaceTime body, answer, and ignore intents.
  • Replace the dead chipweinberger/flutter_isolate Git dependency with the hosted flutter_isolate: ^2.1.0 package, matching newer app branches.
  • Align Kotlin's JVM target with the existing Java 17 compile target.
  • Bump video_player to ^2.9.1 and override video_player_android to 2.7.16, avoiding the older Android plugin's Java 8 -Werror failure on modern JDKs while staying Dart 3.5-compatible.

Local evidence

Observed on an Android BlueBubbles 1.15.0 client with server FaceTime calling enabled:

  • Server emitted incoming call status with UUIDs:
    • Incoming FaceTime call ... (Call UUID: 189796D2-3653-49F1-9710-A7AA565B3519)
    • Incoming FaceTime call ... (Call UUID: 199ACD00-D7D3-44A6-B9B6-8DFA6C05A85D)
  • Android created NEW_FACETIME_NOTIFICATION notifications on com.bluebubbles.incoming_facetimes.
  • Tapping the notification removed it, but logs did not show AnswerFaceTime, showFaceTimeOverlay, or equivalent handling of callUuid after the tap.

This points to the notification click intent losing/not carrying the current call extras rather than a server/helper detection regression.

Verification

Validated locally with Flutter 3.24.5 / Dart 3.5.4:

flutter pub get
flutter build apk --debug --flavor prod --target lib/main.dart
flutter build apk --debug --flavor beta --target lib/main.dart

Results:

Built build/app/outputs/flutter-apk/app-prod-debug.apk
Built build/app/outputs/flutter-apk/app-beta-debug.apk

Installed the beta debug flavor side-by-side on the same Android device as com.bluebubbles.messaging.beta, seeded it with the same server URL/password, and confirmed it connected to the server.

Runtime tap-path validation:

adb shell am start \
  -n com.bluebubbles.messaging.beta/com.bluebubbles.messaging.MainActivity \
  --es callUuid CODEX-BODY-TAP-UUID \
  --es caller CodexCaller \
  --ez answer false \
  -t OpenSummary

Android delivered the intent to the running app:

Intent { typ=OpenSummary cmp=com.bluebubbles.messaging.beta/com.bluebubbles.messaging.MainActivity (has extras) }

The app then opened the incoming FaceTime overlay with CodexCaller, Incoming FaceTime Video Call, and Accept/Ignore actions. This verifies that once the notification body tap delivers the current callUuid, the Dart side opens the FaceTime option correctly.

Device install limitation:

The connected phone has the Play-signed production package installed. Android correctly rejected replacing it with a debug-signed prod APK:

INSTALL_FAILED_UPDATE_INCOMPATIBLE: Existing package com.bluebubbles.messaging signatures do not match newer version

So the patched production package was built, but not installed over the user's configured production app.

@zlshames

Copy link
Copy Markdown
Member

Hey @franklinho thank you for contributing! The one thing I'll request is that you rebase from the development branch. The master branch doesn't include all of the rewrites I've done for the betas that are currently out. I'm wondering if some of what you've done, i've already made changes to. Not totally sure right now

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants