1# Shell utility functions for mediaprovider developers. 2# sudo apt-get install rlwrap to have a more fully featured sqlite CLI 3# sudo apt-get install sqlitebrowser to navigate the database with a GUI 4set -x # enable debugging 5 6function add-media-grant () { 7# add a media grant to -p package for -id file_id 8 9 function usage() { 10 11 cat <<EOF 12 13 Usage: $(basename "$BASH_SOURCE[0]") [-i] id value [-p] package value 14 15 Adds a media grant for specified package and file._id 16 17 Available Options: 18 19 -i, --id The files._id in mediaprovider database 20 -p, --package Package name i.e. com.android.package 21 22EOF 23 24 25 } 26 27 # If we don't have any params, just print the documentation. 28 if [ -z "$1" ] 29 then 30 31 usage 32 33 else 34 35 # parse incoming arguments 36 while [[ "$#" -gt 0 ]] 37 do case $1 in 38 -i|--id) id="$2" 39 shift;; 40 -p|--package) packagename="$2" 41 shift;; 42 *) usage; return 43 esac 44 shift 45 done 46 47 echo "Adding media_grant for id=$id to package $packagename" 48 49 uri='content\\://media/picker/0/com.android.providers.media.photopicker/media/' 50 uriWithId="${uri}$id" 51 52 if [ -z "$id" ] || [ -z "$packagename" ] 53 then 54 usage; return 55 fi 56 57 58 adb wait-for-device 59 adb shell content call --method 'grant_media_read_for_package' \ 60 --uri 'content://media' \ 61 --extra 'uri':s:"$uriWithId" \ 62 --extra 'android.intent.extra.PACKAGE_NAME':s:"$packagename" 63 64 fi 65} 66 67function media-pull () { 68 adb root && adb wait-for-device 69 dir=$(get-dir $1) 70 package=$(get-package) 71 72 if [ -f "$dir/external.db" ]; then 73 rm "$dir/external.db" 74 fi 75 if [ -f "$dir/external.db-wal" ]; then 76 rm "$dir/external.db-wal" 77 fi 78 79 adb pull /data/user/0/$package/databases/external.db $dir/external.db 80 adb pull /data/user/0/$package/databases/external.db-wal "$dir/external.db-wal" 81 82 sqlite3 $dir/external.db "drop trigger files_insert" 83 sqlite3 $dir/external.db "drop trigger files_update" 84 sqlite3 $dir/external.db "drop trigger files_delete" 85} 86 87function sqlite3-pull () { 88 dir="$(get-dir $1)" 89 media-pull "$dir" 90 rlwrap sqlite3 "$dir"/external.db 91} 92 93function sqlitebrowser-pull () { 94 dir="$(get-dir "$1")" 95 media-pull "$dir" 96 sqlitebrowser "$dir"/external.db 97} 98 99 100function sqlite3-push () { 101 adb root 102 if [ -z "$1" ] 103 then 104 dir=$(pwd) 105 else 106 dir=$1 107 fi 108 package=$(get-package) 109 110 adb push $dir/external.db /data/user/0/$package/databases/external.db 111 adb push $dir/external.db-wal /data/user/0/$package/databases/external.db-wal 112 113 sqlite3-trigger-upgrade 114} 115 116function sqlite3-trigger-upgrade () { 117 package=$(get-package) 118 119 # Doesn't actually upgrade the db because db version is hardcoded in code 120 # It however triggers upgrade path 121 check_string="/data/user/0/$package/databases/external.db \"pragma user_version\"" 122 version=$(adb shell sqlite3 $check_string) 123 echo "Old version: $version" 124 125 version=$((version+1)) 126 upgrade_string="/data/user/0/$package/databases/external.db \"pragma user_version=$version\"" 127 adb shell sqlite3 $upgrade_string 128 129 version=$(adb shell sqlite3 $check_string) 130 echo "New version: $version" 131 132 adb shell am force-stop $package 133} 134 135function get-id-from-data () { 136 adb root 137 path="$1" 138 package=$(get-package) 139 dir="/data/user/0/$package/databases/external.db" 140 clause="\"select _id from files where _data='$path';\"" 141 echo $clause 142 adb shell sqlite3 $dir $clause 143} 144 145function get-data-from-id () { 146 adb root 147 _id="$1" 148 package=$(get-package) 149 dir="/data/user/0/$package/databases/external.db" 150 clause="\"select _data from files where _id='$_id';\"" 151 echo $clause 152 adb shell sqlite3 $dir $clause 153} 154 155function get-dir (){ 156 if [ -z "$1" ] 157 then 158 dir=$(pwd) 159 else 160 dir=$1 161 fi 162 echo "$dir" 163} 164 165function get-package() { 166 if [ -z "$(adb shell pm list package com.android.providers.media.module)" ] 167 then 168 echo "com.google.android.providers.media.module" 169 else 170 echo "com.android.providers.media.module" 171 fi 172} 173 174set +x # disable debugging 175