Skip to content

Add sticker sending, Find My Friends header in chats, and more QoL features#188

Open
MrMistic wants to merge 13 commits into
OpenBubbles:rustpushfrom
MrMistic:rustpush
Open

Add sticker sending, Find My Friends header in chats, and more QoL features#188
MrMistic wants to merge 13 commits into
OpenBubbles:rustpushfrom
MrMistic:rustpush

Conversation

@MrMistic
Copy link
Copy Markdown

@MrMistic MrMistic commented Mar 16, 2026

Summary

Found myself wishing for more QoL features, so I decided to add them myself. This PR adds user-generated sticker sending support, fixes sticker rendering issues, integrates Find My Friends for location display in the iOS chat header, and adds several quality-of-life features including sticker management, shared album uploads, per-chat notification settings, attachment picker customization, and sticker backup/restore.


Find My Friends Integration

  • Fetches and displays the short address of a friend based on their location in the iOS (Cupertino) chat header, just like on real iPhones
  • Address caching to avoid redundant lookups
  • Overflow fix: Avatar shrinks from 54→40px when location row is present to prevent layout overflow

Sticker Rendering Fix (Addresses Issue #121)

  • HEIC→PNG conversion in sticker_holder.dart and reaction.dart using FlutterImageCompress (same pattern as loadAndGetProperties)
  • Error handling: try/catch around sticker image loading, firstWhereOrNull for safe lookup, errorBuilder on Image.memory()
  • Stickerback loading: Include stickerback in the attachment loading filter in chat.dart so reaction sticker messages get their attachments loaded

Sticker Sending

Enables users to save images as stickers and send them as proper iMessage stickers (not regular image attachments).
Creates a sticker folder on device to enable quicker selection for saved stickers.

Save as Sticker:

  • Stickers directory in filesystem_service.dart at /Android/data/[package]/stickers/
  • saveAsSticker() method in attachments_service.dart
  • Save button in fullscreen image viewer (both Material and iOS skins, positioned next to the download button)
  • Save option in message long-press popup menu for image attachments

Sticker Picker:

  • New StickerPicker widget with grid UI, HEIC thumbnail support, and empty state
  • Integrated into the existing attachment picker

Send Path:

  • isStickerSend flag flows through conversation_view_controller.dartSendAnimation (sets balloonBundleId) → rustpush_service.dart
  • Rustpush detects com.apple.Stickers.UserGenerated.MessagesExtension bundle ID and builds PartExtension.sticker + ExtensionApp
  • Flag is cleared after send in conversation_text_field.dart

Sticker Manager

  • New settings panel for managing saved stickers (add/delete) accessible from settings
  • Grid view of all saved stickers with delete confirmation

Shared Album Upload Support

  • Upload photos to shared iCloud photo albums from within the app
  • Copies selected photos to the synced folder and triggers syncNow

Attachment Picker Order

  • Reorderable list in settings to customize the order of attachment picker options (files, location pin send, polls, etc)
  • Added iOS apps (like OpenPigeon) still appear on the top of the picker list, just like before

Per-Chat Notification Settings (Android)

  • Notification Settings button: Opens Android's notification channel settings for the chat's normal notification channel
  • Notify Anyway Settings button: Opens Android's notification channel settings for the chat's DND-bypass notification channel
  • Both buttons appear in the per-chat notification settings dialog on Android only
  • Fixed the existing handler to only set setBypassDnd(true) on notify-anyway channels (was incorrectly set on all channels)

Stickers in Settings Backup

  • Saved stickers are now included in settings backup and restore
  • Sticker files are base64-encoded into the backup JSON under a "stickers" key
  • Backward-compatible: old backups without stickers restore normally

All Files Changed

Find My Friends header:

  • cupertino_header.dart — Location fetching + address caching + overflow fix

Sticker Rendering (#121):

  • sticker_holder.dart — HEIC conversion + error handling
  • reaction.dart — HEIC conversion for stickerback path
  • chat.dart — Stickerback attachment loading filter

Sticker Sending:

  • sticker_picker.dartNew file: grid picker widget
  • text_field_attachment_picker.dart — Sticker picker integration
  • details_menu_action.dartSaveAsSticker enum
  • message_popup.dart — Long-press save as sticker
  • send_animation.dartballoonBundleId for stickers
  • conversation_text_field.dart — Clear isStickerSend after send
  • fullscreen_image.dart — Sticker save button + dynamic action list fix
  • filesystem_service.dart — Stickers directory getter
  • attachments_service.dartsaveAsSticker() method
  • conversation_view_controller.dartisStickerSend flag
  • rustpush_service.dartPartExtension.sticker + ExtensionApp in send path

Sticker Manager:

  • sticker_manager_panel.dartNew file: settings panel for sticker management

Shared Albums:

  • Shared album upload support files

Attachment Picker Order:

  • attachment_picker_order_panel.dartNew file: reorderable picker order settings

Notification Settings:

  • notification_settings_dialog.dart — Per-chat notification and notify-anyway settings buttons
  • OpenConversationNotificationSettingsHandler.kt — Fixed DND bypass to only apply to notify-anyway channels

Sticker Backup:

  • backup_restore_panel.dart — Export/import stickers in settings backup

MrMistic and others added 2 commits March 16, 2026 16:40
Added Find My Friends integration to fetch and display the short address of a friend based on their location. Implemented caching for address retrieval to optimize performance.
…erback attachment loading

- sticker_holder.dart: Add HEIC→PNG conversion in checkImage() using
  FlutterImageCompress (same pattern as loadAndGetProperties), wrap in
  try/catch, use firstWhereOrNull, add errorBuilder to Image.memory()
- reaction.dart: Same HEIC→PNG conversion and error handling for
  STICKERBACK sticker rendering path
- chat.dart: Include 'stickerback' in attachment loading filter so
  STICKERBACK reaction messages get their attachments loaded

Fixes OpenBubbles#121
@MrMistic MrMistic changed the title Add sticker sending & fix sticker rendering Add sticker sending, fix sticker rendering, and integrate Find My Friends Mar 16, 2026
@MrMistic
Copy link
Copy Markdown
Author

Haven't been able to get pypush fairplay certs to work for me yet so I would love for someone else to test these features out!

- Add stickers directory in filesystem_service (Android external storage)
- Add saveAsSticker() method in attachments_service
- Add SaveAsSticker action to details_menu_action enum
- Add Save as Sticker button to fullscreen image viewer (both skins)
- Add Save as Sticker to message long-press popup (image attachments)
- Create StickerPicker widget with grid UI, HEIC support, empty state
- Integrate sticker picker into attachment picker message wheel
- Wire up send path: isStickerSend flag flows through SendAnimation
  to set balloonBundleId, then rustpush_service detects it to build
  PartExtension.sticker + ExtensionApp with UserGenerated bundle ID
- Fix fullscreen_image NavigationBar index mapping (dynamic action list)
@willh34
Copy link
Copy Markdown

willh34 commented Mar 24, 2026

I'm not sure if copperboy really checks pull requests or not, I'd make a post in the discord if I were you: https://discord.gg/yV9Zzc8c

MrMistic added 7 commits March 30, 2026 05:39
- Add 'Show Location in iOS Chat (BETA)' toggle in conversation settings
- Location feature is now disabled by default
- Fix header overflow: shrink avatar when location row is displayed
- New 'Manage Stickers (BETA)' option in Settings > Attachments & Media
- Grid view of all saved stickers with thumbnails and HEIC support
- Add stickers via file picker (multi-select)
- Long-press to delete with confirmation dialog
- Empty state with instructions
- New 'Attachment Picker Order' in Settings > Conversation Settings
- Reorderable list with drag handles, matching Message Options Order pattern
- iMessage apps always stay at top, only static items are reorderable
- Sort persisted across sessions
- Stable debug keystore for consistent APK signing across builds
- 'Add Photos' button appears below each synced album in Shared Albums panel
- Opens media picker for multi-select photos/videos
- Copies selected files to the album's synced folder (Pictures/<album name>/)
- Triggers syncNow() to upload new files to iCloud
- Sync status display shows upload progress automatically
- Button only shows for albums that have sync enabled (Android only)
@MrMistic MrMistic changed the title Add sticker sending, fix sticker rendering, and integrate Find My Friends Add sticker sending, fix sticker rendering, integrate Find My Friends, and add QoL features Apr 16, 2026
@MrMistic MrMistic changed the title Add sticker sending, fix sticker rendering, integrate Find My Friends, and add QoL features Add sticker sending, Find My Friends header in chats, and more QoL features Apr 16, 2026
@MrMistic
Copy link
Copy Markdown
Author

I've gotten the builds to work and the features seem to work as intended! Try for yourself: https://github.com/MrMistic/openbubbles-app/actions/runs/24489483000

MrMistic added 3 commits April 16, 2026 14:57
… Visual Look Up stickers

- Add ML Kit Subject Segmentation dependency (on-device, beta)
- Register com.google.mlkit.vision.DEPENDENCIES meta-data for auto model download
- CreateSubjectSticker.kt: native handler that runs segmentation and saves transparent PNG
- Register handler in MethodCallHandler
- createSubjectSticker() method in attachments_service with error handling
- Create Sticker button in fullscreen viewer AppBar (top-right, styled like Done), Android-only, images-only
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