matrix-android/flake.nix
ltadeu6 de6386d614 Add push notifications via local sync loop and FCM
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>
2026-05-17 19:55:59 -03:00

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"
'';
};
});
}