Files
simplex-chat/apps/multiplatform
another-simple-pixel 6c6f1aef69 Ae/wallpaper light n dark v4 (#6899)
* light wallpapers: v4 color formula

all 6 light wallpapers recalculated with the new formula: received
messages are white (read more often, max readability), sent messages
muted in the hue — same pattern as Telegram. tint/chroma tuned per
wallpaper on device.

the formula lives outside the app (node script), only the resulting
oklch constants are in kotlin. LIGHT is served from _background/_tint/
_colors; DARK/SIMPLEX/BLACK keep the generator.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

* wallpapers: tune dark theme + refine light pattern intensity

Calibrated full dark theme palette for all 6 preset wallpapers using the
shared chroma formula (bg-anchored, two-cluster muted/color, per-hue P3
saturation). Each wallpaper now has its own dark bg, tint, and bubble
colors instead of a shared neutral gray. Hearts hue shifted from 15° to
5° (slightly cooler), school from 239° to 249° (slightly warmer); hearts,
school and travel had per-wallpaper saturation reduced for visual
balance. wallpaperBackgrounds() now accepts a dark color override.

Light pattern tint also refined for flowers/hearts/kids/school/travel
using a coverage+sharpness regression on the pattern textures, so dense
patterns like hearts read calmer and sparse ones like flowers read
clearer. Light bubbles and backgrounds unchanged from the v4 formula.

Cats remains the calibration anchor for both themes.

* wallpapers: tune black theme (#6912)

* wallpapers: tune black theme

Replaced the legacy hex-derived BLACK palette with calibrated values for
all 6 preset wallpapers. Pure black bg (#000000) replaces the near-black
gray (#070707) — with the chroma formula's "muted side at zero" rule the
BLACK theme now reads as truly hyper-contrast. Each wallpaper's tint and
bubble colors are tuned to its own hue (cats 70°, flowers 130°, hearts 5°,
kids 192°, school 249°, travel 315°) with chroma pulled to per-hue P3
boundary, capped to keep pattern visibility consistent across textures.

* fix color space

* wallpapers: recalibrate all presets + hue-tinted panels

Recalculated bg/tint/bubble colors for all 6 wallpapers across LIGHT/DARK/BLACK
using unified oklch formula. Added subtle hue tint to panel backgrounds (status bar,
top app bar, nav bar) so they pick up the wallpaper's color. Hearts and school use
different hues in dark themes, so added PresetWallpaper.hue(theme) to handle that.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* wallpapers: formula dev tools, normalized patterns, desktop fixes

- Formula dev UI (developer tools only): sliders for all color parameters
  per theme (LIGHT/DARK/BLACK), live preview, copyable Kotlin code output
- oklch color formula ported to Kotlin (generateSchemeLight/Dark/Black)
- sRGB gamut boundary for Desktop (maxChromaSRGB), P3 for Android
- Normalized pattern PNGs (consistent element size across wallpapers)
- Desktop pattern scale 0.55 + draft/final rendering (fast during drag,
  SCALE_SMOOTH on release)
- Hue-tinted toolbar via ThemeColor.TOOLBAR + AppColors.toolbar
- Received tint slider for light themes

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* wallpapers: fix toolbar color picker + received tint default

Toolbar color: direct replacement instead of alpha-mixing, picker
opens with actual visible toolbar color (panelBackgroundColor),
copy-code hint shows file and line number.

Received tint: default derived from hardcoded colors (fallback 0.005).

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* wallpapers: extend pattern depth slider range to 10

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* wallpapers: add BG Lightness slider for light themes

Offset ±0.05 to formula background L, independent of other slots.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* wallpapers: denser hearts pattern + recalibrated LIGHT colors

Tuned LIGHT theme colors for all 6 presets via the formula sliders.
Hearts pattern PNG replaced with a denser variant (all four density
variants regenerated).

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* wallpapers: revert iOS hearts variants to old format

The denser hearts PNG is shipped only as the multiplatform @4x file
(used by Android and Desktop). iOS still uses the old pattern renderer
which expects the old non-normalized layout, so the @1x/@2x/@3x
variants are reverted to their previous state to avoid visual breakage
on iOS.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

---------

Co-authored-by: Evgeny Poberezkin <evgeny@poberezkin.com>
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Co-authored-by: Evgeny Poberezkin <evgeny@poberezkin.com>
2026-05-13 16:10:01 +01:00
..
2023-06-29 12:53:11 +01:00
2026-01-24 17:59:46 +00:00

Android App Development

This is a guide to contributing to the develop of the SimpleX android and desktop apps.

Project Overview

This is the Kotlin Multiplatform (KMP) mobile and desktop client for SimpleX Chat, sharing code between Android and Desktop (JVM) platforms using Compose Multiplatform for UI.

Build Commands

# Android debug APK
./gradlew assembleDebug

# Android release APK
./gradlew assembleRelease

# Desktop distribution (current OS)
./gradlew :desktop:packageDistributionForCurrentOS

# Run desktop/JVM tests
./gradlew desktopTest

# Run Android instrumented tests (requires connected device/emulator)
./gradlew connectedAndroidTest

# Build native libraries for all platforms
./gradlew common:cmakeBuild -PcrossCompile

# Clean build
./gradlew clean

Architecture

Module Structure

  • common/ - Shared code (Compose UI, models, business logic)
    • src/commonMain/ - Cross-platform code
    • src/androidMain/ - Android-specific implementations
    • src/desktopMain/ - Desktop-specific implementations
  • android/ - Android app container
  • desktop/ - Desktop JVM app container

Key Components (common/src/commonMain/kotlin/chat/simplex/common/)

  • model/ChatModel.kt - Main state container with reactive properties (MutableState, MutableStateFlow)
  • model/SimpleXAPI.kt - API bindings to Haskell core library via FFI
  • platform/Core.kt - FFI interface to native libapp library
  • platform/ - Platform abstraction layer (expect/actual pattern for Android/Desktop specifics)
  • views/ - Compose UI screens organized by feature (chat, chatlist, call, usersettings, etc.)
  • ui/theme/ - Design system (colors, typography, shapes)

Native Integration

The app calls into a Haskell core library via JNI/FFI:

  • CMake builds in common/src/commonMain/cpp/android/ and cpp/desktop/
  • Cross-compilation toolchains in cpp/toolchains/
  • Built libraries go to cpp/desktop/libs/ (organized by platform)

Configuration

local.properties (create from local.properties.example)

compression.level=0          # APK compression (0-9)
enable_debuggable=true       # Debug mode
application_id.suffix=.debug # Multiple app instances on same device
app.name=SimpleX Debug       # App name for debug builds

gradle.properties

Contains versions (Kotlin, Compose, AGP) and app version info. Key settings:

  • kotlin.jvm.target=11
  • database.backend=sqlite (or postgres)

Testing

Tests are in:

  • common/src/commonTest/kotlin/ - Cross-platform tests
  • common/src/desktopTest/kotlin/ - Desktop-specific tests (run with ./gradlew desktopTest)
  • android/src/androidTest/ - Android instrumented tests

Resources & Localization

  • String resources: common/src/commonMain/resources/MR/base/strings.xml + 21 language variants
  • Uses Moko Resources (dev.icerock.moko:resources) for cross-platform resource management
  • The adjustFormatting gradle task validates string resources during build

Platform-Specific Notes

Android

  • Min SDK 26, Target SDK 35
  • NDK 23.1.7779620
  • Supports ABI splits: arm64-v8a, armeabi-v7a
  • Deep linking requires SHA certificate fingerprint in assetlinks.json (see README.md)

Desktop

  • Distributions: DMG (macOS), MSI/EXE (Windows), DEB (Linux)
  • Mac signing/notarization configured via local.properties
  • Video playback uses VLCJ

Gotchas

In order for the SimpleX app to be automatically adopted for opening links from https://simplex.chat the SHA certificate fingerprint for the App installed on the phone must be in the hosted assetlinks.json file on simplex.chat.

The accepted fingerprints are in the sha256_cert_fingerprints list.

To find your SHA certificate fingerprint perform the following steps.

  1. Build and install your development version of the app as usual
  2. From the terminal in Android studio run adb shell pm get-app-links chat.simplex.app
  3. Copy the signature listed in signatures in the result
  4. Add your signature to assetlinks.json in the website repo and make a PR. On approval, wait a few minutes for the changes to propagate to the public website and then you should be able to verify SimpleX.

More information is available here. If there is no response when running the pm get-app-links command, the intents in AndroidManifest.xml are likely misspecified. A verification attempt can be triggered using adb shell pm verify-app-links --re-verify chat.simplex.app.

Note that this is not an issue for the app store build of the app as this is signed with our app store credentials and thus there is a stable signature over users. Developers do not have general access to these credentials for development and testing.

Adding icons

  1. Find a Material symbol in Rounded category.

  2. Set weight to 400, grade to -25 and size to 48px.

  3. Click on the icon, choose Android and download XML file.

  4. Update the color to black (#FF000000) and the size to "24.dp", as in other icons.

For example, this is add reaction icon.