+# ----------------------------------------------------------------- AGI
+
+# The .desktop and MIME files the .deb ships, replayed for the .zip install so
+# both routes leave the same system behind.
+agi_desktop_files() {
+ cat >/usr/share/applications/google-agi.desktop <<'DESKTOP'
+[Desktop Entry]
+Encoding=UTF-8
+Type=Application
+Name=Android GPU Inspector
+Comment=Android GPU Inspector
+Categories=Development;Debugger;Graphics;3DGraphics
+Icon=/opt/agi/icon.png
+Exec=/opt/agi/agi %f
+Terminal=false
+MimeType=application/x-gfxtrace;application/x-perfetto
+DESKTOP
+
+ mkdir -p /usr/share/mime/packages
+ cat >/usr/share/mime/packages/agi.xml <<'MIME'
+<?xml version="1.0" encoding="UTF-8"?>
+<mime-info xmlns="http://www.freedesktop.org/standards/shared-mime-info">
+ <mime-type type="application/x-gfxtrace">
+ <comment>Graphics API Trace</comment>
+ <glob pattern="*.gfxtrace"/>
+ </mime-type>
+ <mime-type type="application/x-perfetto">
+ <comment>System Profile Trace</comment>
+ <glob pattern="*.perfetto"/>
+ </mime-type>
+</mime-info>
+MIME
+
+ command -v update-mime-database >/dev/null 2>&1 \
+ && update-mime-database /usr/share/mime >/dev/null 2>&1
+ command -v update-desktop-database >/dev/null 2>&1 \
+ && update-desktop-database /usr/share/applications >/dev/null 2>&1
+ return 0
+}
+
+agi_download() {
+ # $1 = url, $2 = destination file
+ echo " fetching $(basename "$1")..."
+ curl -fL --retry 3 --progress-bar -o "$2" "$1"
+}
+
+# Every dependency the .deb names has to exist in the archive, or dpkg will
+# refuse the package. openjdk-22-jre does not exist in any Ubuntu release,
+# so rewrite that line to the JRE we just installed. Only the control member
+# is rebuilt -- unpacking and recompressing the 230MB payload with dpkg-deb
+# would take minutes and change nothing.
+deb_depends_satisfiable() {
+ local dep
+ while IFS= read -r dep; do
+ dep=$(echo "$dep" | sed 's/(.*)//; s/^[[:space:]]*//; s/[[:space:]]*$//')
+ [ -z "$dep" ] && continue
+ pkg_available "$dep" || return 1
+ done < <(dpkg-deb -f "$1" Depends 2>/dev/null | tr ',' '\n')
+ return 0
+}
+
+rewrite_deb_depends() {
+ # $1 = .deb, $2 = new Depends line, $3 = scratch directory
+ local deb="$1" depends="$2" work="$3/control"
+ command -v ar >/dev/null 2>&1 || return 1
+ rm -rf "$work"
+ mkdir -p "$work/c" || return 1
+ ( cd "$work" && ar x "$deb" control.tar.xz ) || return 1
+ tar xf "$work/control.tar.xz" -C "$work/c" || return 1
+ sed -i "s|^Depends:.*|Depends: $depends|" "$work/c/control" || return 1
+ rm -f "$work/control.tar.xz"
+ ( cd "$work/c" && tar cJf ../control.tar.xz . ) || return 1
+ ( cd "$work" && ar r "$deb" control.tar.xz ) || return 1
+ # Make sure dpkg still understands the archive we just edited.
+ dpkg-deb -f "$deb" Depends >/dev/null 2>&1 || return 1
+}
+
+install_agi_deb() {
+ local ver="$1" tmp="$2" deb="$tmp/agi.deb" depends
+
+ agi_download "$AGI_BASE_URL/v$ver/agi-$ver-linux.deb" "$deb" || return 1
+
+ if ! deb_depends_satisfiable "$deb"; then
+ depends="${AGI_JRE:-default-jre}"
+ [ -n "$AGI_GTK" ] && depends="$depends, $AGI_GTK"
+ [ -n "$AGI_WEBKIT" ] && depends="$depends, $AGI_WEBKIT"
+ echo " retargeting the package's Depends at: $depends"
+ rewrite_deb_depends "$deb" "$depends" "$tmp" || {
+ red " could not rewrite the .deb's dependencies."
+ return 1
+ }
+ fi
+
+ if ! dpkg -i "$deb"; then
+ red " dpkg reported a problem; asking apt to resolve it..."
+ apt-get -f install -y || return 1
+ dpkg -i "$deb" || return 1
+ fi
+}
+
+install_agi_zip() {
+ local ver="$1" tmp="$2"
+
+ agi_download "$AGI_BASE_URL/v$ver/agi-$ver-linux.zip" "$tmp/agi.zip" || return 1
+ unzip -q "$tmp/agi.zip" -d "$tmp/unpacked" || return 1
+ [ -x "$tmp/unpacked/agi/agi" ] || {
+ red " the zip did not contain agi/agi -- leaving /opt/agi alone."
+ return 1
+ }
+
+ # Only ever replace a directory that looks like a previous AGI install.
+ if [ -e /opt/agi ] && [ ! -e /opt/agi/build.properties ]; then
+ red " /opt/agi exists but is not an AGI install; refusing to replace it."
+ return 1
+ fi
+
+ rm -rf /opt/agi
+ mv "$tmp/unpacked/agi" /opt/agi || return 1
+ chown -R root:root /opt/agi
+ ln -sf /opt/agi/agi /usr/local/bin/agi
+ agi_desktop_files
+}
+
+AGI_OK=0
+if [ "$WANT_AGI" -eq 1 ]; then