Local notifications: - NotificationHelper posts per-room notifications from the sync loop - Notifications suppressed when room is active (ChatScreen DisposableEffect) - Deferred for encrypted rooms until room key arrives; fires with real body - Notification tap navigates to the room via pendingRoomId StateFlow - POST_NOTIFICATIONS permission requested at runtime (API 33+) FCM push (app killed): - MatrixFirebaseMessagingService handles token refresh and data messages - Pusher registered with homeserver pointing to Cloudflare Worker gateway - gateway/src/index.js: Cloudflare Worker forwards Matrix pushes to FCM v1 API using a service-account JWT signed with Web Crypto - last_sync_token persisted in SharedPreferences so restored sessions start with an incremental sync and fire notifications immediately (fixes missed-on-wake bug) - Default FCM notification channel declared in manifest Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
83 lines
2.9 KiB
Nix
83 lines
2.9 KiB
Nix
{
|
|
description = "Nix dev shell for building matrix-android from the CLI";
|
|
|
|
inputs = {
|
|
flake-utils.url = "github:numtide/flake-utils";
|
|
nixpkgs.url = "github:NixOS/nixpkgs/nixos-unstable";
|
|
};
|
|
|
|
outputs = { self, flake-utils, nixpkgs }:
|
|
flake-utils.lib.eachDefaultSystem (system:
|
|
let
|
|
pkgs = import nixpkgs {
|
|
inherit system;
|
|
config.allowUnfree = true;
|
|
config.android_sdk.accept_license = true;
|
|
config.permittedInsecurePackages = [ "olm-3.2.16" ];
|
|
};
|
|
|
|
androidComposition = pkgs.androidenv.composeAndroidPackages {
|
|
platformVersions = [ "31" "35" ];
|
|
buildToolsVersions = [ "30.0.2" "34.0.0" "35.0.0" ];
|
|
includeEmulator = true;
|
|
includeNDK = true;
|
|
includeSources = false;
|
|
includeSystemImages = true;
|
|
systemImageTypes = [ "google_apis" ];
|
|
abiVersions = [ "x86_64" ];
|
|
};
|
|
|
|
androidSdk = androidComposition.androidsdk;
|
|
androidSdkRoot = "${androidSdk}/libexec/android-sdk";
|
|
in
|
|
{
|
|
devShells.default = pkgs.mkShell {
|
|
packages = [
|
|
pkgs.gradle
|
|
pkgs.jdk17
|
|
androidSdk
|
|
pkgs.matrix-commander
|
|
pkgs.nodejs_20
|
|
pkgs.wrangler
|
|
];
|
|
|
|
ANDROID_HOME = androidSdkRoot;
|
|
ANDROID_SDK_ROOT = androidSdkRoot;
|
|
JAVA_HOME = pkgs.jdk17.home;
|
|
|
|
shellHook = ''
|
|
export ANDROID_USER_HOME="$PWD/.android"
|
|
export GRADLE_USER_HOME="$PWD/.gradle"
|
|
export PATH="$ANDROID_SDK_ROOT/platform-tools:$PATH"
|
|
export GRADLE_OPTS="-Dorg.gradle.project.android.aapt2FromMavenOverride=$ANDROID_SDK_ROOT/build-tools/35.0.0/aapt2"
|
|
|
|
cat > local.properties <<EOF
|
|
# Generated by nix develop.
|
|
sdk.dir=$ANDROID_SDK_ROOT
|
|
EOF
|
|
|
|
# Launches the Pixel_3a_API_35 AVD. System images come from the nix SDK.
|
|
# The emulator window is shown by default.
|
|
start-avd() {
|
|
local avd_name="Pixel_3a_API_35"
|
|
local avd_dir="$HOME/.android/avd/$avd_name.avd"
|
|
if [ ! -d "$avd_dir" ]; then
|
|
echo "Creating AVD $avd_name..."
|
|
echo "no" | avdmanager create avd \
|
|
-n "$avd_name" \
|
|
-k "system-images;android-35;google_apis;x86_64" \
|
|
-d "pixel_3a" --force
|
|
fi
|
|
emulator -avd "$avd_name" -no-snapshot-load "$@" &
|
|
echo "Emulator starting (PID $!) — run 'adb wait-for-device' to wait for boot"
|
|
}
|
|
|
|
echo "matrix-android dev shell"
|
|
echo " JAVA_HOME=$JAVA_HOME"
|
|
echo " ANDROID_SDK_ROOT=$ANDROID_SDK_ROOT"
|
|
echo " Build with: gradle assembleDebug"
|
|
echo " Emulator: start-avd"
|
|
'';
|
|
};
|
|
});
|
|
}
|