#!/bin/bash # Interactive ADB file transfer menu # Author: Naomi Carrigan & Hikari 💕 set -euo pipefail # Color codes for pretty output RED='\033[0;31m' GREEN='\033[0;32m' BLUE='\033[0;34m' YELLOW='\033[1;33m' CYAN='\033[0;36m' MAGENTA='\033[0;35m' NC='\033[0m' # No Color # ASCII art banner banner() { echo -e "${CYAN}" echo "╔═══════════════════════════════════╗" echo "║ 📱 ADB File Transfer 📱 ║" echo "║ Made with 💕 by Hikari ║" echo "╚═══════════════════════════════════╝" echo -e "${NC}" } # Check if ADB is available and device connected check_adb_status() { if ! command -v adb &> /dev/null; then echo -e "${RED}❌ ADB not found${NC}" return 1 fi if adb devices | grep -q "device$"; then local device=$(adb devices | grep "device$" | awk '{print $1}') local model=$(adb shell getprop ro.product.model 2>/dev/null | tr -d '\r\n') local android_version=$(adb shell getprop ro.build.version.release 2>/dev/null | tr -d '\r\n') echo -e "${GREEN}✅ Device connected${NC}" echo -e "${YELLOW}📱 Model: ${model:-Unknown}${NC}" echo -e "${YELLOW}🤖 Android: ${android_version:-Unknown}${NC}" echo -e "${YELLOW}🔌 ID: ${device}${NC}" return 0 else echo -e "${RED}❌ No device connected${NC}" return 1 fi } # Quick actions menu quick_actions() { echo -e "\n${BLUE}⚡ Quick Actions${NC}" echo "1) Pull all photos from camera" echo "2) Pull all screenshots" echo "3) Pull WhatsApp media" echo "4) Push files to Downloads" echo "5) Back to main menu" echo "" read -p "Select action (1-5): " action case $action in 1) # Pull camera photos echo -e "${CYAN}📸 Pulling camera photos...${NC}" local backup_dir="$HOME/Pictures/android-camera-$(date +%Y%m%d-%H%M%S)" mkdir -p "$backup_dir" if adb pull /sdcard/DCIM/Camera/ "$backup_dir/"; then echo -e "${GREEN}✅ Photos backed up to: $backup_dir${NC}" echo "Files: $(find "$backup_dir" -type f | wc -l)" echo "Size: $(du -sh "$backup_dir" | cut -f1)" else echo -e "${RED}❌ Failed to pull photos${NC}" fi ;; 2) # Pull screenshots echo -e "${CYAN}📸 Pulling screenshots...${NC}" local screenshot_dir="$HOME/Pictures/android-screenshots-$(date +%Y%m%d-%H%M%S)" mkdir -p "$screenshot_dir" # Try multiple possible screenshot locations local found=false for path in "/sdcard/Pictures/Screenshots" "/sdcard/Screenshots" "/sdcard/DCIM/Screenshots"; do if adb shell "test -d '$path' && echo 'exists'" 2>/dev/null | grep -q "exists"; then if adb pull "$path" "$screenshot_dir/"; then found=true break fi fi done if [[ "$found" == true ]]; then echo -e "${GREEN}✅ Screenshots backed up to: $screenshot_dir${NC}" echo "Files: $(find "$screenshot_dir" -type f | wc -l)" else echo -e "${RED}❌ No screenshots found or failed to pull${NC}" fi ;; 3) # Pull WhatsApp media echo -e "${CYAN}💬 Pulling WhatsApp media...${NC}" local whatsapp_dir="$HOME/Pictures/whatsapp-backup-$(date +%Y%m%d-%H%M%S)" mkdir -p "$whatsapp_dir" if adb shell "test -d '/sdcard/WhatsApp/Media' && echo 'exists'" 2>/dev/null | grep -q "exists"; then if adb pull /sdcard/WhatsApp/Media/ "$whatsapp_dir/"; then echo -e "${GREEN}✅ WhatsApp media backed up to: $whatsapp_dir${NC}" echo "Files: $(find "$whatsapp_dir" -type f | wc -l)" echo "Size: $(du -sh "$whatsapp_dir" | cut -f1)" else echo -e "${RED}❌ Failed to pull WhatsApp media${NC}" fi else echo -e "${RED}❌ WhatsApp media folder not found${NC}" fi ;; 4) # Push to Downloads echo -e "${CYAN}📤 Push files to Downloads folder${NC}" read -p "Enter file/folder path to push: " -e local_path local_path="${local_path/#\~/$HOME}" if [[ -e "$local_path" ]]; then if adb push "$local_path" /sdcard/Download/; then echo -e "${GREEN}✅ Files pushed to Downloads folder${NC}" else echo -e "${RED}❌ Failed to push files${NC}" fi else echo -e "${RED}❌ Path not found: $local_path${NC}" fi ;; 5) return ;; *) echo -e "${RED}Invalid choice${NC}" ;; esac echo "" read -p "Press Enter to continue..." } # Device info device_info() { echo -e "\n${BLUE}📱 Device Information${NC}" echo "================================" # Basic info echo -e "${YELLOW}Model:${NC} $(adb shell getprop ro.product.model 2>/dev/null | tr -d '\r\n')" echo -e "${YELLOW}Manufacturer:${NC} $(adb shell getprop ro.product.manufacturer 2>/dev/null | tr -d '\r\n')" echo -e "${YELLOW}Android Version:${NC} $(adb shell getprop ro.build.version.release 2>/dev/null | tr -d '\r\n')" echo -e "${YELLOW}SDK Version:${NC} $(adb shell getprop ro.build.version.sdk 2>/dev/null | tr -d '\r\n')" # Storage info echo -e "\n${CYAN}Storage:${NC}" adb shell df -h /sdcard | tail -n 1 | awk '{print " Used: " $3 " / " $2 " (" $5 ")"}' # Battery info echo -e "\n${CYAN}Battery:${NC}" local battery_level=$(adb shell dumpsys battery | grep "level:" | awk '{print $2}') local battery_status=$(adb shell dumpsys battery | grep "status:" | awk '{print $2}') echo " Level: ${battery_level}%" echo " Status: ${battery_status}" echo "" read -p "Press Enter to continue..." } # Main menu main_menu() { while true; do clear banner # Check device status echo -e "${MAGENTA}Device Status:${NC}" if ! check_adb_status; then echo -e "\n${YELLOW}Please connect your Android device and enable USB debugging${NC}" echo "" read -p "Press Enter to retry or Ctrl+C to exit..." continue fi echo -e "\n${GREEN}Main Menu:${NC}" echo "1) Push files to Android" echo "2) Pull files from Android" echo "3) Quick actions" echo "4) Device information" echo "5) Exit" echo "" read -p "Select option (1-5): " choice case $choice in 1) echo -e "\n${CYAN}Starting push mode...${NC}\n" bash "$(dirname "$0")/push.sh" ;; 2) echo -e "\n${CYAN}Starting pull mode...${NC}\n" bash "$(dirname "$0")/pull.sh" ;; 3) quick_actions ;; 4) device_info ;; 5) echo -e "${GREEN}👋 Goodbye!${NC}" exit 0 ;; *) echo -e "${RED}Invalid choice${NC}" sleep 1 ;; esac done } # Run main menu main_menu