# Shell utility functions for mediaprovider developers.
# sudo apt-get install rlwrap to have a more fully featured sqlite CLI
# sudo apt-get install sqlitebrowser to navigate the database with a GUI
set -x # enable debugging

function add-media-grant () {
# add a media grant to -p package for -id file_id

  function usage() {

    cat <<EOF

    Usage: $(basename "$BASH_SOURCE[0]") [-i] id value [-p] package value

    Adds a media grant for specified package and file._id

    Available Options:

    -i, --id         The files._id in mediaprovider database
    -p, --package    Package name i.e. com.android.package

EOF


  }

  # If we don't have any params, just print the documentation.
  if [ -z "$1" ]
  then

    usage

  else

      # parse incoming arguments
      while [[ "$#" -gt 0 ]]
      do case $1 in
        -i|--id) id="$2"
        shift;;
      -p|--package) packagename="$2"
        shift;;
      *) usage; return
      esac
      shift
    done

  echo "Adding media_grant for id=$id to package $packagename"

  uri='content\\://media/picker/0/com.android.providers.media.photopicker/media/'
  uriWithId="${uri}$id"

  if [ -z "$id" ] || [ -z "$packagename" ]
  then
    usage; return
  fi


  adb wait-for-device
  adb shell content call --method 'grant_media_read_for_package' \
    --uri 'content://media' \
    --extra 'uri':s:"$uriWithId" \
    --extra 'android.intent.extra.PACKAGE_NAME':s:"$packagename"

  fi
}

function media-pull () {
    adb root && adb wait-for-device
    dir=$(get-dir $1)
    package=$(get-package)

    if [ -f "$dir/external.db" ]; then
      rm "$dir/external.db"
    fi
    if [ -f "$dir/external.db-wal" ]; then
      rm "$dir/external.db-wal"
    fi

    adb pull /data/user/0/$package/databases/external.db $dir/external.db
    adb pull /data/user/0/$package/databases/external.db-wal "$dir/external.db-wal"

    sqlite3 $dir/external.db "drop trigger files_insert"
    sqlite3 $dir/external.db "drop trigger files_update"
    sqlite3 $dir/external.db "drop trigger files_delete"
}

function sqlite3-pull () {
      dir="$(get-dir $1)"
      media-pull "$dir"
      rlwrap sqlite3 "$dir"/external.db
}

function sqlitebrowser-pull () {
    dir="$(get-dir "$1")"
    media-pull "$dir"
    sqlitebrowser "$dir"/external.db
}


function sqlite3-push () {
    adb root
    if [ -z "$1" ]
    then
        dir=$(pwd)
    else
        dir=$1
    fi
    package=$(get-package)

    adb push $dir/external.db /data/user/0/$package/databases/external.db
    adb push $dir/external.db-wal /data/user/0/$package/databases/external.db-wal

    sqlite3-trigger-upgrade
}

function sqlite3-trigger-upgrade () {
    package=$(get-package)

    # Doesn't actually upgrade the db because db version is hardcoded in code
    # It however triggers upgrade path
    check_string="/data/user/0/$package/databases/external.db \"pragma user_version\""
    version=$(adb shell sqlite3 $check_string)
    echo "Old version: $version"

    version=$((version+1))
    upgrade_string="/data/user/0/$package/databases/external.db \"pragma user_version=$version\""
    adb shell sqlite3 $upgrade_string

    version=$(adb shell sqlite3 $check_string)
    echo "New version: $version"

    adb shell am force-stop $package
}

function get-id-from-data () {
    adb root
    path="$1"
    package=$(get-package)
    dir="/data/user/0/$package/databases/external.db"
    clause="\"select _id from files where _data='$path';\""
    echo $clause
    adb shell sqlite3 $dir $clause
}

function get-data-from-id () {
    adb root
    _id="$1"
    package=$(get-package)
    dir="/data/user/0/$package/databases/external.db"
    clause="\"select _data from files where _id='$_id';\""
    echo $clause
    adb shell sqlite3 $dir $clause
}

function get-dir (){
    if [ -z "$1" ]
    then
        dir=$(pwd)
    else
        dir=$1
    fi
    echo "$dir"
}

function get-package() {
    if [ -z "$(adb shell pm list package com.android.providers.media.module)" ]
    then
        echo "com.google.android.providers.media.module"
    else
        echo "com.android.providers.media.module"
    fi
}

set +x  # disable debugging