#!/bin/bash

#set -vex

script_start_time=$(date +%s)

default_vktrace_exe=../build/vktrace/vktrace
default_vktrace32_exe=../build32/vktrace/vktrace32
default_target_abi=$(adb shell getprop ro.product.cpu.abi)
default_activity=android.app.NativeActivity

#
# Parse parameters
#

function printUsage {
   echo "Supported parameters are:"
   echo "    --serial <target device serial number>"
   echo "    --abi <abi to install>"
   echo "    --vktrace <full path to vktrace on host> (optional)"
   echo "    --package <package name>"
   echo "    --actvity <launchable-activity name>"
   echo "    --frame <frame number to capture> (optional)"
   echo
   echo "i.e. ${0##*/} --serial 01234567 \\"
   echo "              --abi arm64-v8a \\"
   echo "              --vktrace ../build/vktrace/vktrace \\"
   echo "              --package com.example.foo \\"
   echo "              --actvity android.app.NativeActivity \\"
   echo "              --frame 100"
   exit 1
}

if [[ $(($# % 2)) -ne 0 ]]
then
    echo Parameters must be provided in pairs.
    echo parameter count = $#
    echo
    printUsage
    exit 1
fi

while [[ $# -gt 0 ]]
do
    case $1 in
        --serial)
            # include the flag, because we need to leave it off if not provided
            serial="$2"
            serialFlag="-s $serial"
            shift 2
            ;;
        --abi)
            target_abi="$2"
            shift 2
            ;;
        --vktrace)
            vktrace_exe="$2"
            shift 2
            ;;
        --package)
            package="$2"
            shift 2
            ;;
        --activity)
            activity="$2"
            shift 2
            ;;
        --frame)
            frame="$2"
            shift 2
            ;;
        -*)
            # unknown option
            echo Unknown option: $1
            echo
            printUsage
            exit 1
            ;;
    esac
done

echo serial = $serial

if [[ -z $serial ]]
then
    echo Please provide a serial number.
    echo
    printUsage
    exit 1
fi

if [[ $(adb devices) != *"$serial"* ]];
then
    echo Device not found: $serial
    echo
    printUsage
    exit 1
fi

if [[ -z $target_abi ]];
then
    echo Using default target_abi
    target_abi=$default_target_abi
fi
echo target_abi = $target_abi

if [[ $target_abi == "armeabi-v7a" ]] ||
   [[ $target_abi == "mips" ]] ||
   [[ $target_abi == "x86" ]];
then
    echo Targeting 32-bit abi $target_abi
    target_32bit_abi=1
fi

if [[ -z $vktrace_exe ]];
then
    echo Using default vktrace_exe
    vktrace_exe=$default_vktrace_exe
    if [[ $target_32bit_abi ]]
    then
        vktrace_exe=$default_vktrace32_exe
    fi
else
    if [[ $target_32bit_abi ]]
    then
       echo Ensure your vktrace is 32-bit, i.e. vktrace32
    fi
fi
echo vktrace_exe = $vktrace_exe

if [[ -z $package ]];
then
    echo target package name required
    exit 1
fi
echo package = $package

if [[ -z $activity ]];
then
    echo Using default activity
    activity=$default_activity
fi
echo activity = $activity

if [[ -z $frame ]];
then
    echo Not attempting to record any screenshot
else
    echo Attempting to record screenshot of frame $frame
fi

function printLayerBuild() {
    echo "To build layers:"
    echo "./update_external_sources_android.sh"
    echo "./android-generate.sh"
    echo "ndk-build -j"
}

function printvktraceBuild() {
    echo "To build vktrace"
    echo "pushd .."
    echo "mkdir build"
    echo "cd build"
    echo "cmake -DCMAKE_BUILD_TYPE=Debug .."
    echo "make -j"
}

#
# If any parameter not found, print how to build it
#

if [ ! -f $vktrace_exe ]; then
    echo "$vktrace_exe not found!"
    printvktraceBuild
    exit 1
fi

#
# Check for required tools
#

adb_path=$(which adb)
if [[ $? == 0 ]];
then
    echo using $adb_path
else
    echo adb not found, exiting
    echo check your NDK for it and add to path
    exit 1
fi
aapt_path=$(which aapt)
if [[ $? == 0 ]];
then
    echo using $aapt_path
else
    echo aapt not found, exiting
    echo check your NDK for it and add to path
    exit 1
fi
jar_path=$(which jar)
if [[ $? == 0 ]];
then
    echo using $jar_path
else
    echo jar not found, exiting
    exit 1
fi

apk_contents=$(jar tvf $apk)
if [[ $apk_contents != *"libVkLayer_screenshot.so"* ]] ||
   [[ $apk_contents != *"libVkLayer_vktrace_layer.so"* ]];
then
    echo Your APK does not contain the following layers:
    echo     libVkLayer_screenshot.so
    echo     libVkLayer_vktrace_layer.so
    echo You\'ll need to provide them another way.
    echo Continuing...
fi

#
# Start up
#

# We want to halt on errors here
set -e

# Wake up the device
adb $serialFlag shell input keyevent "KEYCODE_MENU"
adb $serialFlag shell input keyevent "KEYCODE_HOME"

# clean up anything lingering from previous runs
adb $serialFlag shell am force-stop $package

# Ensure vktrace wasn't already running
let "script_run_time=$(date +%s)-$script_start_time"
killall --older-than "$script_run_time"s vktrace || echo continuing...

# Enable trace layer
adb $serialFlag shell setprop debug.vulkan.layer.1 VK_LAYER_LUNARG_vktrace

# Start vktrace
adb $serialFlag reverse localabstract:vktrace tcp:34201
sleep 1
$vktrace_exe -v full -o $package.vktrace &

# Start the target activity
adb $serialFlag shell am start $package/$activity

# wait for a keystroke, indicating when tracing should stop
read -rsn1

# stop our background vktrace
kill $!

# clean up
adb $serialFlag shell am force-stop $package
adb $serialFlag shell setprop debug.vulkan.layer.1 '""'

exit 0
