{ # android-webview-kiosk — Android TV fullscreen WebView kiosk showing a # hardcoded Grafana dashboard, remote-launched via Sony Bravia IP control. # # Deviation from lab Go template: this flake provides a DEV SHELL ONLY. # Gradle fetches Maven deps from the network, so the APK is built impurely: # nix develop --command gradle :app:assembleRelease # There is no `nix build` output and no container/push pipeline. description = "Android TV fullscreen WebView kiosk for the Grafana house dashboard"; inputs = { nixpkgs.url = "github:NixOS/nixpkgs/release-25.11"; flake-utils.url = "github:numtide/flake-utils"; }; outputs = { self, nixpkgs, flake-utils, }: flake-utils.lib.eachDefaultSystem ( system: let pkgs = import nixpkgs { inherit system; config = { allowUnfree = true; # Android SDK android_sdk.accept_license = true; }; }; buildToolsVersion = "34.0.0"; androidComposition = pkgs.androidenv.composeAndroidPackages { platformVersions = [ "34" ]; buildToolsVersions = [ buildToolsVersion ]; includeEmulator = false; includeSystemImages = false; includeNDK = false; }; androidSdk = androidComposition.androidsdk; sdkRoot = "${androidSdk}/libexec/android-sdk"; fonts = with pkgs; [ noto-fonts dejavu_fonts freefont_ttf ]; # NixOS gotcha: AGP downloads a dynamically-linked aapt2 from Maven # that can't run on NixOS. android.aapt2FromMavenOverride is a Gradle # *project* property; `-Dorg.gradle.project.` on the command line # sets one. It must be a CLI arg, not GRADLE_OPTS: the gradle package # in nixpkgs 25.11 is a raw `exec java ... GradleMain "$@"` wrapper # that ignores GRADLE_OPTS (fixed post-25.11 in nixpkgs PR #449037 — # once we're past 25.11, plain GRADLE_OPTS works and this wrapper can go). gradle = pkgs.symlinkJoin { name = "gradle-nixos-aapt2"; paths = [ pkgs.gradle ]; nativeBuildInputs = [ pkgs.makeWrapper ]; postBuild = '' wrapProgram $out/bin/gradle \ --add-flags "-Dorg.gradle.project.android.aapt2FromMavenOverride=${sdkRoot}/build-tools/${buildToolsVersion}/aapt2" ''; }; in { devShells.default = pkgs.mkShell { packages = [ androidSdk pkgs.jdk17 gradle # wrapped, see above pkgs.imagemagick # banner/icon generation pkgs.android-tools # adb for sideloading ] ++ fonts; ANDROID_HOME = sdkRoot; ANDROID_SDK_ROOT = sdkRoot; FONTCONFIG_FILE = pkgs.makeFontsConf { fontDirectories = fonts; }; }; } ); }