[FREE] StatusComposer — WhatsApp-Style Status Editor Extension

StatusComposer is a powerful extension for building Status/Story editors

Features:
:camera_with_flash: Full-screen status composer with photo, video and animated GIF support — pass in any media path (camera capture or gallery pick) and get a polished, WhatsApp-style editing screen
:artist_palette: Sticker tray (emoji stickers), freehand draw mode with 4 brush styles + color/width picker, and interactive/draggable stickers (Time, Location, Mood tag, Caption tag) built right into the composer
:framed_picture: Text status support — solid-color and gradient canvas backgrounds, 5 text styles, 12 color swatches, 10 fonts
:control_knobs: 9 built-in filters (Original, Vivid, Warm, Cool, B&W, Sepia, Fade, Contrast, Vintage) with a live-preview strip — applies to the whole canvas (background + stickers + text + drawing), baked directly into photo and video exports
:musical_note: Add background music to a video status — pick any audio file from the device, trim the start point with a live preview, and it's muxed straight into the exported video
:scissors: Standalone Crop screen — use it independently when you only need cropping, not the full editor — plus pinch-zoom/pan/rotate directly on the canvas inside the full composer too
:clapper_board: Standalone Trim screen — trim videos on their own without opening the full composer (60s max window)
:eye: Standalone Preview screen — let users review/confirm media with zero editing tools, great for a final "confirm before posting" step
:paintbrush: Style-your-photo — shape and border options for the background media
:videocassette: Video exports now also return a JPEG thumbnail frame alongside the file
:memo: Optional caption input — enable/disable per call with allowCaption
:artist_palette: Fully customizable theming — set your own dialog background color and accent color (applies to Send/Done buttons and all dialog buttons) so the composer matches your app's brand
:file_folder: Custom save location — choose the exact gallery subfolder (under Pictures/ or Movies/) exported photos/videos land in, instead of a generic default
:bar_chart: Two ways to show export progress — use the composer's built-in Rendering/Trimming/Saving overlay, or hide it completely and build your own progress bar using the Processing event
:globe_with_meridians: Lightweight and WebView-friendly — designed to slot straight into HTML/WebView-based social apps

Built with Fast CLI

com.zebdroid.storycomposer.aix (211.8 KB) New Version
:mobile_phone: See it in action

This extension powers the status/story composer in Jazly, my social app — you can install it and try the full editor (filters, stickers, draw, music, everything) yourself:
[Jazly Play Store link ]

:puzzle_piece: Blocks

Methods

  1. OpenComposer(mediaPath, allowCaption)
    Opens the full WhatsApp-style status composer screen (sticker tray, draw mode, interactive stickers, filters, music).

  2. OpenCrop(mediaPath)
    Opens a crop-only screen for a photo.

  3. OpenTrim(mediaPath)
    Opens a trim-only screen for a video.

  4. OpenPreview(mediaPath)
    Opens a preview-only screen — view and confirm, no editing.

  5. SetThemeColors(dialogBackgroundColor, accentColor)
    Sets the popup-dialog background color and the composer's overall accent color (Send button, Done button, dialog buttons, etc). Call before opening the composer; pass 0 to keep defaults.

  6. SetSaveFolder(folderName)
    Sets the gallery subfolder (under Pictures/ or Movies/) exported photos/videos are saved into. Call before opening the composer.

  7. SetShowProcessingUI(show)
    Shows or hides the composer's built-in processing overlay during export. Pass false to build your own progress UI using the Processing event.

:high_voltage: Events

AfterComposerClosed(resultPath, resultVideoPath, resultOverlayPath, resultThumbnailPath, caption) — Fires when the composer is closed with a saved result. resultThumbnailPath is only populated for video exports (empty otherwise).

ComposerCancelled() — Fires when the user backs out without saving.

ComposerError(reason) — Fires when the composer could not complete normally.

Processing(percent, stage) — Fires zero or more times during export/processing with a 0–100 percent (or -1 if no numeric progress) and a stage label (e.g. "Rendering", "Saving"), so you can build your own progress UI.

3 Likes

Hi, I'm currently working on a photo editing project similar to the WhatsApp one I started a couple of months ago, and I came across your interesting extension, but... should this happen? It happens with the .aia.

This extension will not work in companion..build real apk.

1 Like

Update — new build available :tada:

A few solid additions and fixes since the first release:

:control_knobs: Filters — 9 built-in presets (Original, Vivid, Warm, Cool, B&W, Sepia, Fade, Contrast, Vintage) with a live-preview thumbnail strip. Works on photo, video, and applies to the whole canvas (background + stickers + text + drawing), not just the media itself. Baked directly into exported videos too, not just the in-app preview.

:musical_note: Add Music (video mode) — pick any audio file from the device, trim the starting offset with a live preview, and it gets muxed straight into the exported video. Note: this replaces the video's original audio track (no mixing in this pass).

:framed_picture: GIF support — animated GIFs can now be used as the background, same as photo/video. Stickers, text, and drawing all composite over it correctly. (Android has no built-in GIF encoder, so export keeps the original GIF untouched + a separate overlay layer for compositing at playback — trimming isn't possible for GIFs.)

:videocassette: Video thumbnails — video exports now also return a JPEG thumbnail frame.

:warning: Breaking change: AfterComposerClosed now has 5 parameters instead of 4 — resultThumbnailPath was added right after resultOverlayPath:
AfterComposerClosed(resultPath, resultVideoPath, resultOverlayPath, resultThumbnailPath, caption)
Existing projects will show this block as a mismatched "bad block" after updating — just delete and re-drop it, then rewire your handler with the new socket.

:adhesive_bandage: Fix — Hitting Send/Done on a video with zero edits (no trim, no filter, no stickers/drawing, no music) now returns the exact same file path you originally passed into OpenComposer, instead of silently creating and returning a duplicate copy of it.

Could you add example blocks, screenshots and an example project to your first post.

1 Like

Sure ! I will add tonight