{ # 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 ]; in { devShells.default = pkgs.mkShell { packages = [ androidSdk pkgs.jdk17 pkgs.gradle 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; }; # NixOS gotcha: AGP downloads a dynamically-linked aapt2 from Maven # that can't run on NixOS. AGP reads the override from gradle.properties # as a project property (not a JVM system property), so GRADLE_OPTS -D # flags don't work. The shellHook writes the correct nix store path # directly into gradle.properties so providers.gradleProperty() finds it. shellHook = '' sed -i "s|android.aapt2FromMavenOverride=.*|android.aapt2FromMavenOverride=${sdkRoot}/build-tools/${buildToolsVersion}/aapt2|" gradle.properties ''; }; } ); }