summaryrefslogtreecommitdiff
path: root/mediaproviderutils.sh
diff options
context:
space:
mode:
author Tyler Saunders <tylersaunders@google.com> 2023-01-30 12:47:07 +0000
committer Tyler Saunders <tylersaunders@google.com> 2023-01-31 14:18:19 +0000
commit78122a865e8b826c835a5c6ea677d7d900b5075a (patch)
tree1b642bcce4f7d3d2db7ace4877c05d215d285bac /mediaproviderutils.sh
parenta7bf9bc5891d29d278a0e6e68846fe4a52033b77 (diff)
Add shell support for creating media_grants.
* Allows inserting media_grant rows via an adb shell content call. * Renamed sqlite3.sh to mediaproviderutils.sh & included a new helper function to make adding grants simpler. * Add end-to-end test of MediaStore.grantMediaReadForPackage Sample adb command to add a media grant: ``` adb shell content call --method 'grant_media_read_for_package' \ --uri 'content://media' \ --extra 'uri':s:$URI \ --extra 'android.intent.extra.PACKAGE_NAME':s:$PACKAGE_NAME ``` Change-Id: I4ddfa43c5617af63f470e9c2f376e9c665b26d96
Diffstat (limited to 'mediaproviderutils.sh')
-rw-r--r--mediaproviderutils.sh153
1 files changed, 153 insertions, 0 deletions
diff --git a/mediaproviderutils.sh b/mediaproviderutils.sh
new file mode 100644
index 000000000..e3c5c08da
--- /dev/null
+++ b/mediaproviderutils.sh
@@ -0,0 +1,153 @@
+# Shell utility functions for mediaprovider developers.
+# sudo apt-get install rlwrap to have a more fully featured sqlite CLI
+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 sqlite3-pull () {
+ adb root
+ if [ -z "$1" ]
+ then
+ dir=$(pwd)
+ else
+ dir=$1
+ fi
+ package=$(get-package)
+
+ rm $dir/external.db
+ rm $dir/external.db-wal
+
+ 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"
+
+ rlwrap sqlite3 $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-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