- Keep max lastSeen per user so relay's newest-first delivery doesn't
overwrite a fresh timestamp with a stale one
- Serialize event processing on Main dispatcher to eliminate
ConcurrentModificationException on geohashParticipants maps
- Immediately refresh people list on channel switch so sampling data
is reflected before the first relay response arrives
This change prevents the app's content from being visible in the recents screen on Android 13 (Tiramisu) and newer devices.
It achieves this by calling `setRecentsScreenshotEnabled(false)` in the `onCreate` method of `MainActivity` after checking the device's SDK version. This enhances user privacy by hiding potentially sensitive information from the system's app overview.
* feat: Introduce Gradle property to control APK splits
This commit introduces a new Gradle project property, `buildSplitApks`, to conditionally enable or disable the generation of ABI-specific (arm64, x86_64) and universal APKs.
Key changes:
- In `app/build.gradle.kts`, the `splits.abi.isEnable` flag is now dynamically set based on the `buildSplitApks` property.
- APK splitting is disabled by default to support standard Android App Bundle (`bundleRelease`) builds.
- The release workflow (`release.yml`) is updated to pass `-PbuildSplitApks=true` when building release APKs for GitHub.
- The general Android build workflow (`android-build.yml`) is also modified to enable splits only for the `Release` variant, ensuring debug builds are not affected.
* chore: Simplify and automate APK split builds
This commit simplifies the build process by automatically enabling ABI splits for APKs (`assemble`) and disabling them for AABs (`bundle`).
This removes the need to manually pass the `-PbuildSplitApks=true` property. The build script now intelligently determines whether to create architecture-specific APKs based on the task being executed (e.g., `assembleRelease` vs. `bundleRelease`).
The GitHub Actions workflows (`release.yml`, `android-build.yml`) have been updated to remove this now-redundant property, streamlining the CI configuration.
* feat: Build and release per-architecture APKs
This commit modifies the build process to generate separate APKs for different CPU architectures (arm64-v8a, x86_64) and a universal APK. This allows for smaller, optimized downloads for users and provides specific builds for platforms like Chromebooks.
Key changes:
- In `app/build.gradle.kts`, enables ABI splits to create `arm64-v8a`, `x86_64`, and `universal` APKs during the `assembleRelease` task.
- Updates the `release.yml` GitHub Actions workflow to rename and upload each of these APKs as distinct release assets.
- Removes the previous `arm64-v8a` only filter to allow for multi-architecture builds.
* feat: Allow manual triggering of Android CI workflow
This adds the `workflow_dispatch` event to the `android-build.yml` GitHub Actions workflow.
This change enables the Android CI pipeline to be run manually from the GitHub UI, in addition to the existing triggers for pushes and pull requests.
* feat: add product flavors and TorProvider abstraction
Introduces build flavors to separate Tor functionality from the standard build, reducing APK size for users who don't need Tor.
- Creates `standard` and `tor` product flavors.
- The `standard` flavor is the default, lightweight build.
- The `tor` flavor includes the Arti (Tor) dependency and is identified by the `.tor` application ID suffix.
- Adds a `TorProvider` interface and a `TorProviderFactory` to abstract Tor implementation details between flavors.
Prepares architecture for optional Tor support to reduce APK size
from 142MB to ~4-5MB for standard builds
Related to #454
* Refactor: implement StandardTorProvider and RealTorProvider
This commit refactors the Tor integration by introducing a `TorProvider` interface and creating separate implementations for 'tor' and 'standard' product flavors.
- The original `TorManager` singleton has been moved into `RealTorProvider` for the 'tor' flavor.
- A no-op `StandardTorProvider` is introduced for the 'standard' flavor, which reports Tor as unavailable.
- A `TorProviderFactory` is used to create the appropriate provider at runtime based on the build variant.
* refactor: migrate to TorProvider abstraction
Replaced direct calls to the static `TorManager` with an instance obtained from `TorProviderFactory`.
This change allows for different Tor implementations based on build flavors, improving modularity and abstracting the Tor provider logic.
Updated `BitchatApplication`, `ChatHeader`, `OkHttpProvider`, and `AboutSheet` to use the new factory pattern for accessing Tor functionalities.
* build: add flavor-specific ProGuard rules and CI/CD
- Split ProGuard rules: base, standard-specific, tor-specific
- Move Arti/Guardian Project rules to proguard-tor.pro
- Update CI/CD workflow to build both flavors
- Add separate artifact uploads for each flavor
- Add descriptive release notes template
CI now builds both standard (~4-5MB) and tor (~140MB) APKs."
resolves#454
* refactor: centralize network reset logic
Extracts the repeated network connection reset logic into a new private function `resetNetworkConnections()`.
This change also replaces direct `_statusFlow.value = ...` assignments with the safer `_statusFlow.update { ... }` function to prevent race conditions.
* ci: run separate build steps for flavors
* feat: disable Tor toggle if not available in build
* ci: parallelize builds and add conditional tor lint
Optimizes CI workflow:
- Parallel matrix builds (4 runners instead of sequential)
- Conditional tor lint only when app/src/tor/ changes in PRs
- Merged test+lint jobs to reduce setup overhead
Reduces CI time by ~50% (8-11 min vs 18-26 min)
* refactor: Unify Tor implementation and remove build flavors
This commit refactors the Tor integration by removing the `standard` and `tor` product flavors in favor of a single, unified build that always includes a custom-built Arti (Tor) library.
Key changes include:
* **Removed Build Flavors:** Deleted the `standard` and `tor` product flavors from `build.gradle.kts`, simplifying the build process and CI configuration.
* **Unified Tor Manager:** Replaced the `TorProvider` interface and flavor-specific implementations (`StandardTorProvider`, `RealTorProvider`) with a new singleton, `ArtiTorManager`. This class now manages the Arti lifecycle for all builds.
* **Custom Arti Wrapper:** Introduced a new `ArtiProxy` class to provide a compatible API wrapper around the custom-built native Arti library (`libarti_android.so`). This replaces the dependency on the external `arti-mobile-ex` library.
* **Updated Proguard:** Consolidated and updated Proguard rules into the main `proguard-rules.pro` file to keep the necessary `ArtiTorManager` and native library classes.
* **CI/CD Simplification:** Updated GitHub Actions workflows (`release.yml`, `android-build.yml`) to build and release a single APK instead of separate ones for each flavor.
* build: Configure ABI filters for debug and release builds
For debug builds, include `x86_64` to support emulators.
For release builds, only include `arm64-v8a` to minimize the final APK size.
* feat: Ignore jniLibs directory
This change adds the `app/src/main/jniLibs/` directory to the `.gitignore` file to prevent native libraries from being committed to the repository.
* feat: Refine .gitignore for Arti build artifacts
Improves the `.gitignore` file by:
- Ignoring all `build/` directories except for `tools/arti-build/`.
- Adding specific ignores for Arti build artifacts, including the cloned source repository and the Rust build cache directory.
* feat: Update arti android native library
* feat: add build script and JNI wrapper for Arti
Adds a comprehensive build system for creating custom Arti (Tor in Rust) shared libraries for Android. This replaces the dependency on external, outdated AARs with a fully transparent and reproducible build process.
Key changes:
- Introduces `build-arti.sh`, a script to clone the official Arti repository, apply a JNI wrapper, and build `.so` files for Android.
- Adds `ARTI_VERSION` to pin the build to a specific Arti release (v1.7.0).
- Implements a new Rust JNI wrapper (`src/lib.rs`) that exposes core functions like `initialize`, `startSocksProxy`, and `stop` to the Android app.
- Includes a `Cargo.toml` with release profile optimizations for size (`lto`, `strip`, `opt-level = "z"`).
- Provides detailed documentation in `README.md` explaining the build process, prerequisites, and architecture.
* build script for mac
* consolidate both scripts
* improve script
---------
Co-authored-by: callebtc <93376500+callebtc@users.noreply.github.com>