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