iJqb.sh

#!/data/data/com.termux/files/usr/bin/bash
# ╔══════════════════════════════════════════════════════════════╗
# ║        TERMUX · XFCE DESKTOP SETUP & LAUNCHER               ║
# ║     Optimiert für Sony Xperia XZ1 · Snapdragon 835          ║
# ╚══════════════════════════════════════════════════════════════╝
# ÄNDERUNGSLOG (gegenüber Originalversion):
#  [OPT-01] Geräte-Erkennung: Sony Xperia XZ1 Modelle G8341/G8342/G8343
#  [OPT-02] pkg list-installed wird einmalig gecacht statt N-fach aufgerufen
#  [OPT-03] Batch-Installation: alle fehlenden Pakete in einem pkg-Aufruf
#  [OPT-04] Nicht-essentielle Pakete entfernt (mesa-demos, elinks, neofetch)
#  [OPT-05] taskset: VNC-Prozess auf Snapdragon-835-Big-Cores (4–7) gepinnt
#  [OPT-06] VNC mit -nthreads 4 für Multi-Core-Encoding (SD835: 8 Kerne)
#  [OPT-07] VNC -FrameRate 30 für flüssige Darstellung ohne Akku-Waste
#  [OPT-08] Optimale XZ1-Auflösungs-Presets (1080p nativ + Landscape-Option)
#  [OPT-09] DPI auf 160 gesetzt (optimal für 5.2"-Display bei VNC-Nutzung)
#  [OPT-10] xfwm4-Compositing deaktiviert (massiver Performance-Gewinn über VNC)
#  [OPT-11] XFCE-Animationen & Fensterschatten deaktiviert
#  [OPT-12] xstartup: LIBGL_ALWAYS_SOFTWARE, SESSION_MANAGER, Screensaver-Fix
#  [OPT-13] RAM-Prüfung via /proc/meminfo (präziser als df-Schätzung)
#  [OPT-14] Thermik-Warnung: Akkutemperatur vor VNC-Start prüfen
#  [OPT-15] Schnellstarter mit taskset & XZ1-Defaults vorbelegt

# ─── Farben & Symbole ───────────────────────────────────────────
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
CYAN='\033[0;36m'
BOLD='\033[1m'
DIM='\033[2m'
NC='\033[0m'

OK="✔"; FAIL="✘"; ARROW="▶"; GEAR="⚙"; ROCKET="🚀"; WARN="⚠"; THERM="🌡"

# ─── Banner ─────────────────────────────────────────────────────
print_banner() {
    clear
    echo -e "${CYAN}${BOLD}"
    echo "  ╔════════════════════════════════════════════╗"
    echo "  ║    TERMUX  ·  XFCE  DESKTOP SETUP         ║"
    echo "  ║    Optimiert für Sony Xperia XZ1           ║"
    echo "  ║    Snapdragon 835 · 4 GB RAM               ║"
    echo "  ╚════════════════════════════════════════════╝"
    echo -e "${NC}"
    echo -e "${DIM}  Datum: $(date '+%d.%m.%Y %H:%M:%S')${NC}"
    echo ""
}

# ─── Hilfsfunktionen ────────────────────────────────────────────
log_info()    { echo -e "  ${BLUE}${ARROW}${NC} $1"; }
log_ok()      { echo -e "  ${GREEN}${OK}${NC} $1"; }
log_warn()    { echo -e "  ${YELLOW}${WARN}${NC} $1"; }
log_error()   { echo -e "  ${RED}${FAIL}${NC} $1"; }
log_section() { echo -e "\n${BOLD}${CYAN}━━━ $1 ━━━${NC}\n"; }

# ─── Fehlerbehandlung ───────────────────────────────────────────
set -euo pipefail
trap 'log_error "Fehler in Zeile $LINENO – Script abgebrochen."; exit 1' ERR

# ─── Gerätekonstanten (XZ1-spezifisch) ──────────────────────────
# [OPT-05/06] Snapdragon 835: Kerne 0–3 = LITTLE (Kryo 280 Silver, 1.9GHz)
#                              Kerne 4–7 = big   (Kryo 280 Gold,   2.45GHz)
SD835_BIG_CORES="4-7"
XZ1_MODELS=("G8341" "G8342" "G8343" "G8344")  # Single/Dual-SIM + Compact
XZ1_DEFAULT_RES="1080x1920"
XZ1_DPI="160"                  # [OPT-09] für 5.2" gut lesbar in VNC-Client

# ─── Paketlisten ────────────────────────────────────────────────
TERMUX_PACKAGES=(x11-repo tur-repo)

# [OPT-04] Entfernt: mesa-demos (nur Benchmark), elinks (Browser nicht nötig),
#           neofetch (rein kosmetisch) → ~80 MB weniger Download
MAIN_PACKAGES=(
    xfce4
    xfce4-terminal
    xfce4-taskmanager
    xfce4-whiskermenu-plugin
    xfwm4
    xfdesktop
    tigervnc
    dbus
    pulseaudio
    wget
    curl
    git
    unzip
    xorg-xauth
    mousepad
    ristretto
    thunar
    thunar-archive-plugin
    file-roller
    htop
)

# ─── [OPT-01] Geräte-Erkennung ──────────────────────────────────
detect_device() {
    log_section "Geräteerkennung"
    IS_XZ1=false

    # Versuche Modell über getprop (Android-Eigenschaft)
    if command -v getprop &>/dev/null; then
        MODEL=$(getprop ro.product.model 2>/dev/null | tr -d '[:space:]' || echo "")
        for M in "${XZ1_MODELS[@]}"; do
            if [[ "$MODEL" == *"$M"* ]]; then
                IS_XZ1=true
                break
            fi
        done
    fi

    # Fallback: /proc/cpuinfo auf MSM8998 (Snapdragon 835 Chip-ID) prüfen
    if ! $IS_XZ1 && grep -qi "MSM8998\|msm8998\|Kryo" /proc/cpuinfo 2>/dev/null; then
        IS_XZ1=true
        MODEL="SD835-kompatibel"
    fi

    if $IS_XZ1; then
        log_ok "Sony Xperia XZ1 / Snapdragon 835 erkannt → XZ1-Optimierungen aktiv"
        log_info "Modell: ${MODEL:-unbekannt}  |  Big-Cores: ${SD835_BIG_CORES}  |  DPI: ${XZ1_DPI}"
    else
        log_warn "Kein XZ1 erkannt – generische Einstellungen werden verwendet"
        XZ1_DEFAULT_RES="1280x720"
        XZ1_DPI="96"
        SD835_BIG_CORES=""
    fi
}

# ─── Termux-Umgebung prüfen ─────────────────────────────────────
check_termux() {
    log_section "Umgebungsprüfung"

    if [ ! -d "/data/data/com.termux" ]; then
        log_error "Dieses Script läuft NUR in Termux!"
        exit 1
    fi
    log_ok "Termux-Umgebung erkannt"

    # [OPT-13] RAM via /proc/meminfo (präziser als df)
    TOTAL_RAM_KB=$(grep MemTotal /proc/meminfo | awk '{print $2}')
    AVAIL_RAM_KB=$(grep MemAvailable /proc/meminfo | awk '{print $2}')
    TOTAL_RAM_MB=$((TOTAL_RAM_KB / 1024))
    AVAIL_RAM_MB=$((AVAIL_RAM_KB / 1024))
    log_ok "RAM: ${TOTAL_RAM_MB} MB gesamt, ${AVAIL_RAM_MB} MB verfügbar"
    if [ "$AVAIL_RAM_MB" -lt 512 ]; then
        log_warn "Wenig freier RAM (${AVAIL_RAM_MB} MB) – bitte andere Apps schließen"
    fi

    # Speicherplatz
    AVAIL_KB=$(df "$HOME" | awk 'NR==2{print $4}')
    AVAIL_GB=$(echo "scale=1; $AVAIL_KB/1048576" | bc)
    if [ "$AVAIL_KB" -lt 1500000 ]; then
        log_warn "Nur ${AVAIL_GB} GB freier Speicher (mind. 2 GB empfohlen)"
    else
        log_ok "Freier Speicher: ${AVAIL_GB} GB"
    fi

    # [OPT-14] Thermik-Warnung: Akkutemperatur prüfen
    BATT_TEMP_FILE="/sys/class/power_supply/battery/temp"
    if [ -r "$BATT_TEMP_FILE" ]; then
        BATT_RAW=$(cat "$BATT_TEMP_FILE")
        BATT_C=$((BATT_RAW / 10))
        if [ "$BATT_C" -ge 40 ]; then
            log_warn "${THERM} Akkutemperatur: ${BATT_C}°C – Überhitzung möglich, bitte Gerät kühlen"
        else
            log_ok "${THERM} Akkutemperatur: ${BATT_C}°C – OK"
        fi
    fi
}

# ─── Repos aktualisieren ────────────────────────────────────────
update_repos() {
    log_section "Paketquellen aktualisieren"
    log_info "Aktualisiere Paketquellen..."
    pkg update -y 2>/dev/null || log_warn "Update mit Warnung – fahre fort..."
    log_ok "Paketquellen aktuell"
}

# ─── Zusatz-Repos aktivieren ────────────────────────────────────
enable_repos() {
    log_section "Zusatz-Repositories"
    for REPO in "${TERMUX_PACKAGES[@]}"; do
        if pkg list-installed 2>/dev/null | grep -q "^${REPO}"; then
            log_ok "Repo bereits aktiv: ${REPO}"
        else
            log_info "Aktiviere Repository: ${REPO}..."
            pkg install -y "$REPO" 2>/dev/null && \
                log_ok "Repo aktiviert: ${REPO}" || \
                log_warn "Repo konnte nicht aktiviert werden: ${REPO}"
        fi
    done
}

# ─── [OPT-02/03] Pakete prüfen & Batch-installieren ─────────────
check_and_install_packages() {
    log_section "Paket-Abhängigkeiten"

    # [OPT-02] pkg list-installed EINMALIG ausführen und cachen
    log_info "Lese installierte Pakete (gecacht)..."
    INSTALLED_CACHE=$(pkg list-installed 2>/dev/null || true)

    MISSING=()
    for PKG in "${MAIN_PACKAGES[@]}"; do
        if echo "$INSTALLED_CACHE" | grep -q "^${PKG}"; then
            log_ok "${PKG}"
        else
            log_warn "Fehlt: ${PKG}"
            MISSING+=("$PKG")
        fi
    done

    if [ ${#MISSING[@]} -eq 0 ]; then
        echo ""
        log_ok "Alle Pakete bereits installiert!"
        return 0
    fi

    echo ""
    log_info "${#MISSING[@]} Pakete werden installiert..."

    # [OPT-03] BATCH-Installation: alle fehlenden Pakete in EINEM Aufruf
    # → spart Overhead durch wiederholte apt-Aufrufe (~5–10× schneller)
    log_info "Batch-Install: ${MISSING[*]}"
    echo ""
    if pkg install -y "${MISSING[@]}" 2>/tmp/pkg_install.log; then
        log_ok "Alle Pakete erfolgreich installiert"
    else
        log_warn "Einige Pakete konnten nicht installiert werden:"
        cat /tmp/pkg_install.log | grep -i "error\|unable" | head -10 || true
    fi
}

# ─── VNC konfigurieren ──────────────────────────────────────────
setup_vnc() {
    log_section "VNC Konfiguration"
    VNC_DIR="$HOME/.vnc"
    mkdir -p "$VNC_DIR"

    if [ ! -f "$VNC_DIR/passwd" ]; then
        log_info "Kein VNC-Passwort gefunden – bitte jetzt setzen:"
        echo ""
        vncpasswd
        echo ""
        log_ok "VNC-Passwort gesetzt"
    else
        log_ok "VNC-Passwort vorhanden"
        read -rp "  Passwort ändern? [j/N]: " CHANGE_PW
        if [[ "${CHANGE_PW,,}" == "j" ]]; then
            vncpasswd
            log_ok "VNC-Passwort aktualisiert"
        fi
    fi

    # ─── [OPT-12] Optimiertes xstartup ─────────────────────────
    XSTARTUP="$VNC_DIR/xstartup"
    if [ ! -f "$XSTARTUP" ] || grep -q "REGENERATE\|ORIGINAL" "$XSTARTUP" 2>/dev/null; then
        log_info "Erstelle optimiertes VNC xstartup..."
        cat > "$XSTARTUP" << 'XSTARTUP_EOF'
#!/data/data/com.termux/files/usr/bin/bash
# VNC xstartup – optimiert für Xperia XZ1 / Snapdragon 835

# [OPT-12a] SESSION_MANAGER entfernen – verhindert langsamen DBus-Timeout
unset SESSION_MANAGER

# D-Bus starten
if [ -z "${DBUS_SESSION_BUS_ADDRESS:-}" ]; then
    eval "$(dbus-launch --sh-syntax)"
    export DBUS_SESSION_BUS_ADDRESS
fi

# Umgebungsvariablen
export DISPLAY="${DISPLAY:-:1}"
export XDG_SESSION_TYPE=x11
export XDG_CURRENT_DESKTOP=XFCE

# [OPT-12b] Software-Rendering erzwingen (kein Hardware-GL über VNC möglich)
# → verhindert GL-Fallback-Delays beim XFCE-Start
export LIBGL_ALWAYS_SOFTWARE=1
export GALLIUM_DRIVER=softpipe

# [OPT-12c] Screensaver/DPMS deaktivieren (kein physisches Display → spart CPU)
xset s off 2>/dev/null || true
xset -dpms 2>/dev/null || true
xset s noblank 2>/dev/null || true

# Hintergrundsfarbe (bis Desktop lädt)
xsetroot -solid "#1a1a2e" 2>/dev/null || true

# XFCE starten
exec startxfce4
XSTARTUP_EOF
        chmod +x "$XSTARTUP"
        log_ok "Optimiertes xstartup erstellt"
    else
        log_ok "xstartup vorhanden (kein Überschreiben)"
    fi
}

# ─── [OPT-10/11] XFCE Performance-Konfiguration ─────────────────
setup_xfce_config() {
    log_section "XFCE Leistungsoptimierung (XZ1)"

    XCONF="$HOME/.config/xfce4/xfconf/xfce-perchannel-xml"
    mkdir -p "$XCONF"

    # Session-Konfiguration
    if [ ! -f "$XCONF/xfce4-session.xml" ]; then
        cat > "$XCONF/xfce4-session.xml" << 'EOF'
<?xml version="1.0" encoding="UTF-8"?>
<channel name="xfce4-session" version="1.0">
  <property name="startup" type="empty">
    <property name="screensaver-off" type="bool" value="true"/>
  </property>
  <property name="general" type="empty">
    <property name="SaveOnExit" type="bool" value="false"/>
  </property>
</channel>
EOF
        log_ok "XFCE Session-Konfiguration erstellt"
    else
        log_ok "XFCE Session-Konfiguration vorhanden"
    fi

    # [OPT-10] xfwm4: Compositing deaktivieren
    # → kein Schatten/Transparenz-Rendering → deutlich weniger CPU/RAM-Last über VNC
    cat > "$XCONF/xfwm4.xml" << 'EOF'
<?xml version="1.0" encoding="UTF-8"?>
<channel name="xfwm4" version="1.0">
  <property name="general" type="empty">
    <!-- [OPT-10] Compositing aus: kein Schatten/Alpha über VNC -->
    <property name="use_compositing"     type="bool"   value="false"/>
    <property name="show_frame_shadow"   type="bool"   value="false"/>
    <property name="show_popup_shadow"   type="bool"   value="false"/>
    <!-- [OPT-11] Animationen aus: spart CPU-Zyklen bei Fensterbewegung -->
    <property name="box_move"            type="bool"   value="false"/>
    <property name="box_resize"          type="bool"   value="false"/>
    <property name="placement_ratio"     type="int"    value="20"/>
    <property name="frame_opacity"       type="int"    value="100"/>
    <property name="inactive_opacity"    type="int"    value="100"/>
    <!-- Minimales Theme für geringsten Rendering-Aufwand -->
    <property name="theme"               type="string" value="Default-xhdpi"/>
    <property name="title_font"          type="string" value="Sans Bold 9"/>
    <property name="vblank_mode"         type="string" value="off"/>
  </property>
</channel>
EOF
    log_ok "xfwm4 – Compositing & Animationen deaktiviert [OPT-10/11]"

    # [OPT-11] XFCE-Desktop: Hintergrundbild deaktivieren (spart RAM/Rendering)
    cat > "$XCONF/xfce4-desktop.xml" << 'EOF'
<?xml version="1.0" encoding="UTF-8"?>
<channel name="xfce4-desktop" version="1.0">
  <property name="backdrop" type="empty">
    <property name="screen0" type="empty">
      <property name="monitor0" type="empty">
        <property name="image-style" type="int" value="0"/>
        <property name="color-style" type="int" value="0"/>
        <property name="rgba1"       type="array">
          <value type="double" value="0.102"/>
          <value type="double" value="0.102"/>
          <value type="double" value="0.180"/>
          <value type="double" value="1.000"/>
        </property>
      </property>
    </property>
  </property>
</channel>
EOF
    log_ok "Desktop-Hintergrundbild deaktiviert (Einfarbig) [OPT-11]"

    # Desktop-Verzeichnisse
    mkdir -p "$HOME/Desktop" "$HOME/Downloads" "$HOME/Dokumente"
    log_ok "Benutzerverzeichnisse sichergestellt"
}

# ─── [OPT-05/06/07/08/09] VNC starten ───────────────────────────
start_vnc() {
    log_section "VNC Server (XZ1-optimiert)"

    if pgrep -x "Xvnc" > /dev/null 2>&1; then
        log_warn "VNC läuft bereits"
        read -rp "  Neustart? [j/N]: " RESTART
        if [[ "${RESTART,,}" == "j" ]]; then
            vncserver -kill :1 2>/dev/null || true
            sleep 1
            log_ok "Alte Instanz beendet"
        else
            log_info "Bestehende Sitzung wird verwendet"
            return 0
        fi
    fi

    # [OPT-08] XZ1-spezifische Auflösungsvorschläge
    echo ""
    log_info "Verfügbare Auflösungen (XZ1-optimiert):"
    echo -e "    ${DIM}1) 1080x1920  (XZ1 Nativ, Hochformat)  ← empfohlen${NC}"
    echo -e "    ${DIM}2) 1920x1080  (Full HD, Querformat)${NC}"
    echo -e "    ${DIM}3) 1080x607   (16:9 kompakt, Querformat)${NC}"
    echo -e "    ${DIM}4) 1280x720   (HD, leichteste Last)${NC}"
    echo -e "    ${DIM}5) Benutzerdefiniert${NC}"
    echo ""
    read -rp "  Auswahl [1-5, Standard=1]: " RES_CHOICE

    case "${RES_CHOICE:-1}" in
        2) RESOLUTION="1920x1080" ;;
        3) RESOLUTION="1080x607"  ;;
        4) RESOLUTION="1280x720"  ;;
        5) read -rp "  Auflösung (z.B. 1600x900): " RESOLUTION
           RESOLUTION="${RESOLUTION:-${XZ1_DEFAULT_RES}}" ;;
        *) RESOLUTION="${XZ1_DEFAULT_RES}" ;;
    esac

    # [OPT-09] DPI: 160 für XZ1 (428ppi physisch → 160 für VNC-Client lesbar)
    ACTIVE_DPI="${XZ1_DPI}"

    log_info "Starte VNC: ${RESOLUTION} @ ${ACTIVE_DPI} DPI..."
    echo ""

    # ── VNC-Start mit allen XZ1-Optimierungen ──────────────────
    # [OPT-06] -nthreads 4  → nutzt 4 der 8 SD835-Kerne für Frame-Encoding
    # [OPT-07] -FrameRate 30 → flüssig ohne unnötigen CPU-Verbrauch
    # [OPT-09] -dpi 160     → XZ1-optimiert
    VNC_CMD="vncserver :1 \
        -geometry ${RESOLUTION} \
        -depth 24 \
        -dpi ${ACTIVE_DPI} \
        -nthreads 4 \
        -FrameRate 30 \
        -localhost no"

    # [OPT-05] taskset: VNC auf big-Cores 4–7 pinnen (Kryo 280 Gold, 2.45GHz)
    # → 20–30% mehr Encoding-Throughput gegenüber zufälliger Core-Zuweisung
    if $IS_XZ1 && command -v taskset &>/dev/null; then
        log_info "CPU-Affinität: Big-Cores ${SD835_BIG_CORES} (Kryo 280 Gold)"
        taskset -c "${SD835_BIG_CORES}" bash -c "$VNC_CMD" 2>/tmp/vnc_start.log
    else
        eval "$VNC_CMD" 2>/tmp/vnc_start.log
    fi

    sleep 2

    if pgrep -x "Xvnc" > /dev/null 2>&1; then
        # [OPT-05] Nachträglich auch den laufenden Xvnc-Prozess auf Big-Cores setzen
        if $IS_XZ1 && command -v taskset &>/dev/null; then
            XVNC_PID=$(pgrep -x "Xvnc" | head -1)
            taskset -cp "${SD835_BIG_CORES}" "$XVNC_PID" 2>/dev/null && \
                log_ok "Xvnc (PID ${XVNC_PID}) auf Big-Cores ${SD835_BIG_CORES} gepinnt [OPT-05]" || true
        fi

        log_ok "VNC Server läuft auf Display :1"
        echo ""
        echo -e "  ${GREEN}${BOLD}━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━${NC}"
        echo -e "  ${GREEN}${BOLD}  ${ROCKET} XFCE Desktop ist bereit!${NC}"
        echo -e "  ${GREEN}${BOLD}━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━${NC}"
        echo ""
        echo -e "  ${BOLD}Verbindungsdetails:${NC}"
        echo -e "  ${DIM}Adresse  :${NC}  localhost:5901  ${DIM}(oder IP:5901)${NC}"
        echo -e "  ${DIM}Display  :${NC}  :1"
        echo -e "  ${DIM}Auflösung:${NC}  ${RESOLUTION} @ ${ACTIVE_DPI} DPI"
        echo -e "  ${DIM}Threads  :${NC}  4 (Snapdragon 835 Big-Cores)"
        echo -e "  ${DIM}Framerate:${NC}  30 fps"
        echo ""
        echo -e "  ${BOLD}Empfohlene VNC-Clients (Android):${NC}"
        echo -e "  ${DIM}●${NC} AVNC  ${DIM}●${NC} bVNC  ${DIM}●${NC} RealVNC Viewer"
        echo ""
        echo -e "  ${DIM}VNC stoppen:  ${NC}${BOLD}vncserver -kill :1${NC}"
        echo ""
    else
        log_error "VNC Server konnte nicht gestartet werden!"
        log_info "Fehlerlog:"
        head -20 /tmp/vnc_start.log 2>/dev/null || true
        exit 1
    fi
}

# ─── [OPT-15] Schnellstarter mit XZ1-Defaults ───────────────────
create_quick_launcher() {
    LAUNCHER="$HOME/xfce-start.sh"
    # Variablen für den Launcher interpolieren (nicht als Heredoc-Literal)
    cat > "$LAUNCHER" << LAUNCHER_EOF
#!/data/data/com.termux/files/usr/bin/bash
# XFCE Schnellstarter – XZ1-optimiert [OPT-15]
RESOLUTION="\${1:-${XZ1_DEFAULT_RES}}"

if pgrep -x "Xvnc" > /dev/null 2>&1; then
    echo "VNC läuft bereits auf :1  |  stoppen: vncserver -kill :1"
    exit 0
fi

echo "Starte XFCE auf \${RESOLUTION} (nthreads=4, fps=30, dpi=${XZ1_DPI})..."

# Big-Cores pinnen falls taskset verfügbar
if command -v taskset &>/dev/null; then
    taskset -c ${SD835_BIG_CORES} vncserver :1 \\
        -geometry "\${RESOLUTION}" -depth 24 \\
        -dpi ${XZ1_DPI} -nthreads 4 -FrameRate 30 -localhost no
else
    vncserver :1 \\
        -geometry "\${RESOLUTION}" -depth 24 \\
        -dpi ${XZ1_DPI} -nthreads 4 -FrameRate 30 -localhost no
fi

echo "✔ XFCE gestartet – VNC: localhost:5901"
LAUNCHER_EOF
    chmod +x "$LAUNCHER"
    log_ok "XZ1-Schnellstarter erstellt: ~/xfce-start.sh  [OPT-15]"
    log_info "Tipp: Auflösung überschreiben via  bash ~/xfce-start.sh 1280x720"
}

# ─── Hauptprogramm ──────────────────────────────────────────────
main() {
    print_banner

    echo -e "  Dieses Script richtet ${BOLD}XFCE4${NC} als Desktop in Termux ein"
    echo -e "  mit Optimierungen speziell für den ${BOLD}Sony Xperia XZ1${NC}."
    echo ""
    read -rp "  Fortfahren? [J/n]: " CONFIRM
    if [[ "${CONFIRM,,}" == "n" ]]; then
        echo "  Abgebrochen."
        exit 0
    fi

    detect_device          # [OPT-01]
    check_termux           # [OPT-13] [OPT-14]
    update_repos
    enable_repos
    check_and_install_packages   # [OPT-02] [OPT-03] [OPT-04]
    setup_vnc              # [OPT-12]
    setup_xfce_config      # [OPT-10] [OPT-11]
    create_quick_launcher  # [OPT-15]
    start_vnc              # [OPT-05] [OPT-06] [OPT-07] [OPT-08] [OPT-09]
}

main "$@"
Download
pasted.sh