| # 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 |