# 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