13bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root# /* vim: set ai ts=4 ft=sh: */
23bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root#
33bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root# Copyright 2011, The Android Open Source Project
43bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root#
53bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root# Licensed under the Apache License, Version 2.0 (the "License");
63bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root# you may not use this file except in compliance with the License.
73bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root# You may obtain a copy of the License at
83bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root#
93bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root#     http://www.apache.org/licenses/LICENSE-2.0
103bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root#
113bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root# Unless required by applicable law or agreed to in writing, software
123bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root# distributed under the License is distributed on an "AS IS" BASIS,
133bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
143bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root# See the License for the specific language governing permissions and
153bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root# limitations under the License.
163bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root#
173bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root
183bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root_adb() {
193bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root    unset -v have
203bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root    type $1 &> /dev/null && have="yes"
213bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root
223bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root    if [ "$have" != "yes" ]; then
233bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root        return
243bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root    fi
253bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root
263bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root    local where i cur serial
273bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root    COMPREPLY=()
283bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root
293bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root    serial="${ANDROID_SERIAL:-none}"
303bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root    where=OPTIONS
313bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root    for ((i=1; i <= COMP_CWORD; i++)); do
323bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root        cur="${COMP_WORDS[i]}"
333bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root        case "${cur}" in
343bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root            -s)
353bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root                where=OPT_SERIAL
363bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root                ;;
373bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root            -p)
383bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root                where=OPT_PATH
393bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root                ;;
403bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root            -*)
413bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root                where=OPTIONS
423bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root                ;;
433bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root            *)
443bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root                if [[ $where == OPT_SERIAL ]]; then
453bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root                    where=OPT_SERIAL_ARG
463bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root                elif [[ $where == OPT_SERIAL_ARG ]]; then
473bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root                    serial=${cur}
483bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root                    where=OPTIONS
493bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root                else
503bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root                    where=COMMAND
513bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root                    break
523bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root                fi
533bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root                ;;
543bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root        esac
553bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root    done
563bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root
573bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root    if [[ $where == COMMAND && $i -ge $COMP_CWORD ]]; then
583bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root        where=OPTIONS
593bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root    fi
603bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root
613bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root    OPTIONS="-d -e -s -p"
623bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root    COMMAND="devices connect disconnect push pull sync shell emu logcat lolcat forward jdwp install uninstall bugreport help version start-server kill-server get-state get-serialno status-window remount reboot reboot-bootloader root usb tcpip"
633bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root
643bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root    case $where in
653bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root        OPTIONS|OPT_SERIAL|OPT_PATH)
663bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root            COMPREPLY=( $(compgen -W "$OPTIONS $COMMAND" -- "$cur") )
673bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root            ;;
683bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root        OPT_SERIAL_ARG)
697d56e24dd9ebe85d255afbb21c1da4f82b51cc3eJP Abgrall            local devices=$(command adb devices 2> /dev/null | grep -v "List of devices" | awk '{ print $1 }')
703bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root            COMPREPLY=( $(compgen -W "${devices}" -- ${cur}) )
713bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root            ;;
723bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root        COMMAND)
733bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root            if [[ $i -eq $COMP_CWORD ]]; then
743bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root                COMPREPLY=( $(compgen -W "$COMMAND" -- "$cur") )
753bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root            else
763bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root                i=$((i+1))
773bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root                case "${cur}" in
783bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root                    install)
793bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root                        _adb_cmd_install "$serial" $i
803bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root                        ;;
810ac2b21e5d9798e40c1dca70ed72e704d0acc293Chirayu Desai                    sideload)
820ac2b21e5d9798e40c1dca70ed72e704d0acc293Chirayu Desai                        _adb_cmd_sideload "$serial" $i
830ac2b21e5d9798e40c1dca70ed72e704d0acc293Chirayu Desai                        ;;
843bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root                    pull)
853bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root                        _adb_cmd_pull "$serial" $i
863bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root                        ;;
873bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root                    push)
883bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root                        _adb_cmd_push "$serial" $i
893bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root                        ;;
903bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root                    reboot)
913bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root                        if [[ $COMP_CWORD == $i ]]; then
923bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root                            args="bootloader recovery"
933bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root                            COMPREPLY=( $(compgen -W "${args}" -- "${COMP_WORDS[i]}") )
943bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root                        fi
953bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root                        ;;
963bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root                    shell)
973bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root                        _adb_cmd_shell "$serial" $i
983bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root                        ;;
993bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root                    uninstall)
1003bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root                        _adb_cmd_uninstall "$serial" $i
1013bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root                        ;;
1023bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root                esac
1033bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root            fi
1043bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root            ;;
1053bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root    esac
1063bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root
1073bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root    return 0
1083bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root}
1093bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root
1103bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root_adb_cmd_install() {
1113bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root    local serial i cur where
1123bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root
1133bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root    serial=$1
1143bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root    i=$2
1153bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root
1163bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root    where=OPTIONS
1173bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root    for ((; i <= COMP_CWORD; i++)); do
1183bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root        cur="${COMP_WORDS[i]}"
1193bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root        case "${cur}" in
1203bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root            -*)
1213bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root                where=OPTIONS
1223bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root                ;;
1233bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root            *)
1243bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root                where=FILE
1253bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root                break
1263bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root                ;;
1273bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root        esac
1283bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root    done
1293bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root
1303bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root    cur="${COMP_WORDS[COMP_CWORD]}"
1313bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root    if [[ $where == OPTIONS ]]; then
13231c667a772ef6ba491232daf658195d5fcdcb86cKenny Root        COMPREPLY=( $(compgen -W "-d -l -r -s" -- "${cur}") )
1333bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root        return
1343bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root    fi
1353bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root
1363bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root    _adb_util_complete_local_file "${cur}" '!*.apk'
1373bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root}
1383bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root
1390ac2b21e5d9798e40c1dca70ed72e704d0acc293Chirayu Desai_adb_cmd_sideload() {
1400ac2b21e5d9798e40c1dca70ed72e704d0acc293Chirayu Desai    local serial i cur
1410ac2b21e5d9798e40c1dca70ed72e704d0acc293Chirayu Desai
1420ac2b21e5d9798e40c1dca70ed72e704d0acc293Chirayu Desai    serial=$1
1430ac2b21e5d9798e40c1dca70ed72e704d0acc293Chirayu Desai    i=$2
1440ac2b21e5d9798e40c1dca70ed72e704d0acc293Chirayu Desai
1450ac2b21e5d9798e40c1dca70ed72e704d0acc293Chirayu Desai    cur="${COMP_WORDS[COMP_CWORD]}"
1460ac2b21e5d9798e40c1dca70ed72e704d0acc293Chirayu Desai
1470ac2b21e5d9798e40c1dca70ed72e704d0acc293Chirayu Desai    _adb_util_complete_local_file "${cur}" '!*.zip'
1480ac2b21e5d9798e40c1dca70ed72e704d0acc293Chirayu Desai}
1490ac2b21e5d9798e40c1dca70ed72e704d0acc293Chirayu Desai
1503bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root_adb_cmd_push() {
1513bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root    local serial IFS=$'\n' i cur
1523bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root
1533bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root    serial=$1
1543bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root    i=$2
1553bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root
1563bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root    cur="${COMP_WORDS[COMP_CWORD]}"
1573bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root
1583bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root    if [[ $COMP_CWORD == $i ]]; then
1593bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root        _adb_util_complete_local_file "${cur}"
1603bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root    elif [[ $COMP_CWORD == $(($i+1)) ]]; then
1613bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root        if [ "${cur}" == "" ]; then
1623bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root            cur="/"
1633bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root        fi
1643bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root        _adb_util_list_files $serial "${cur}"
1653bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root    fi
1663bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root}
1673bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root
1683bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root_adb_cmd_pull() {
1693bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root    local serial IFS=$'\n' i cur
1703bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root
1713bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root    serial=$1
1723bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root    i=$2
1733bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root
1743bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root    cur="${COMP_WORDS[COMP_CWORD]}"
1753bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root
1763bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root    if [[ $COMP_CWORD == $i ]]; then
1773bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root        if [ "${cur}" == "" ]; then
1783bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root            cur="/"
1793bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root        fi
1803bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root        _adb_util_list_files $serial "${cur}"
1813bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root    elif [[ $COMP_CWORD == $(($i+1)) ]]; then
1823bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root        _adb_util_complete_local_file "${cur}"
1833bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root    fi
1843bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root}
1853bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root
1863bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root_adb_cmd_shell() {
1873bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root    local serial IFS=$'\n' i cur
1883bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root    local -a args
1893bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root
1903bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root    serial=$1
1913bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root    i=$2
1923bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root
1933bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root    cur="${COMP_WORDS[i]}"
1943bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root    if [ "$serial" != "none" ]; then
1953bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root        args=(-s $serial)
1963bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root    fi
1973bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root
1983bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root    if [[ $i -eq $COMP_CWORD && ${cur:0:1} != "/" ]]; then
1993bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root        paths=$(command adb ${args[@]} shell echo '$'PATH 2> /dev/null | tr -d '\r' | tr : '\n')
2003bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root        COMMAND=$(command adb ${args[@]} shell ls $paths '2>' /dev/null | tr -d '\r' | {
2013bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root            while read -r tmp; do
2023bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root                command=${tmp##*/}
2033bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root                printf '%s\n' "$command"
2043bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root            done
2053bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root        })
2063bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root        COMPREPLY=( $(compgen -W "$COMMAND" -- "$cur") )
2073bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root        return 0
2083bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root    fi
2093bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root
2103bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root    i=$((i+1))
2113bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root    case "$cur" in
2123bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root        ls)
2133bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root            _adb_shell_ls $serial $i
2143bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root            ;;
2153bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root        /*)
2163bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root            _adb_util_list_files $serial "$cur"
2173bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root            ;;
2183bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root        *)
2193bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root            COMPREPLY=( )
2203bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root            ;;
2213bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root    esac
2223bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root
2233bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root    return 0
2243bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root}
2253bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root
2263bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root_adb_cmd_uninstall() {
2273bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root    local serial i where cur packages
2283bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root
2293bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root    serial=$1
2303bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root    i=$2
2313bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root    if [ "$serial" != "none" ]; then
2323bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root        args=(-s $serial)
2333bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root    fi
2343bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root
2353bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root    where=OPTIONS
2363bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root    for ((; i <= COMP_CWORD; i++)); do
2373bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root        cur="${COMP_WORDS[i]}"
2383bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root        case "${cur}" in
2393bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root            -*)
2403bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root                where=OPTIONS
2413bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root                ;;
2423bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root            *)
2433bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root                where=FILE
2443bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root                break
2453bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root                ;;
2463bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root        esac
2473bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root    done
2483bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root
2493bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root    cur="${COMP_WORDS[COMP_CWORD]}"
2503bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root    if [[ $where == OPTIONS ]]; then
2513bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root        COMPREPLY=( $(compgen -W "-k" -- "${cur}") )
2523bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root    fi
2533bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root
2543bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root    packages="$(
2553bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root        command adb ${args[@]} shell pm list packages '2>' /dev/null 2> /dev/null | tr -d '\r' | {
2563bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root            while read -r tmp; do
2573bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root                local package=${tmp#package:}
2583bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root                echo -n "${package} "
2593bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root            done
2603bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root        }
2613bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root    )"
2623bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root
2633bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root    COMPREPLY=( ${COMPREPLY[@]:-} $(compgen -W "${packages}" -- "${cur}") )
2643bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root}
2653bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root
2663bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root_adb_shell_ls() {
2673bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root    local serial i cur file
2683bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root    local -a args
2693bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root
2703bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root    serial=$1
2713bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root    i=$2
2723bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root    if [ "$serial" != "none" ]; then
2733bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root        args=(-s $serial)
2743bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root    fi
2753bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root
2763bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root    where=OPTIONS
2773bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root    for ((; i <= COMP_CWORD; i++)); do
2783bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root        cur="${COMP_WORDS[i]}"
2793bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root        case "${cur}" in
2803bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root            -*)
2813bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root                where=OPTIONS
2823bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root                ;;
2833bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root            *)
2843bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root                where=FILE
2853bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root                break
2863bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root                ;;
2873bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root        esac
2883bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root    done
2893bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root
2903bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root    file="${COMP_WORDS[COMP_CWORD]}"
2913bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root    if [[ ${file} == "" ]]; then
2923bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root        file="/"
2933bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root    fi
2943bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root
2953bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root    case $where in
2963bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root        OPTIONS)
2973bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root            COMPREPLY=( $(compgen -W "$OPTIONS" -- "$cur") )
2983bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root            _adb_util_list_files $serial "$file"
2993bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root            ;;
3003bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root        FILE)
3013bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root            _adb_util_list_files $serial "$file"
3023bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root            ;;
3033bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root    esac
3043bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root
3053bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root    return 0
3063bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root}
3073bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root
3083bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root_adb_util_list_files() {
3093bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root    local serial dir IFS=$'\n'
3103bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root    local -a toks
3113bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root    local -a args
3123bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root
3133bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root    serial="$1"
3143bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root    file="$2"
3153bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root
3163bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root    if [ "$serial" != "none" ]; then
3173bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root        args=(-s $serial)
3183bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root    fi
3193bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root
3203bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root    toks=( ${toks[@]-} $(
3213bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root        command adb ${args[@]} shell ls -dF ${file}"*" '2>' /dev/null 2> /dev/null | tr -d '\r' | {
3223bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root            while read -r tmp; do
3233bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root                filetype=${tmp%% *}
3243bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root                filename=${tmp:${#filetype}+1}
3253bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root                if [[ ${filetype:${#filetype}-1:1} == d ]]; then
3263bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root                    printf '%s/\n' "$filename"
3273bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root                else
3283bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root                    printf '%s\n' "$filename"
3293bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root                fi
3303bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root            done
3313bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root        }
3323bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root    ))
3333bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root
3343bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root    # Since we're probably doing file completion here, don't add a space after.
3353bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root    if [[ $(type -t compopt) = "builtin" ]]; then
3363bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root        compopt -o nospace
3373bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root    fi
3383bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root
3393bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root    COMPREPLY=( ${COMPREPLY[@]:-} "${toks[@]}" )
3403bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root}
3413bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root
3423bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root_adb_util_complete_local_file()
3433bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root{
34491fcc30acea4a45bf749338a5f614f3848290cf5Jeff Brown    local file xspec i j IFS=$'\n'
3453bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root    local -a dirs files
3463bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root
3473bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root    file=$1
3483bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root    xspec=$2
3493bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root
3503bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root    # Since we're probably doing file completion here, don't add a space after.
3513bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root    if [[ $(type -t compopt) = "builtin" ]]; then
3523bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root        compopt -o plusdirs
3533bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root        if [[ "${xspec}" == "" ]]; then
3543bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root            COMPREPLY=( ${COMPREPLY[@]:-} $(compgen -f -- "${cur}") )
3553bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root        else
3563bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root            compopt +o filenames
3573bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root            COMPREPLY=( ${COMPREPLY[@]:-} $(compgen -f -X "${xspec}" -- "${cur}") )
3583bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root        fi
3593bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root    else
3603bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root        # Work-around for shells with no compopt
3613bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root
3623bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root        dirs=( $(compgen -d -- "${cur}" ) )
3633bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root
3643bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root        if [[ "${xspec}" == "" ]]; then
3653bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root            files=( ${COMPREPLY[@]:-} $(compgen -f -- "${cur}") )
3663bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root        else
3673bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root            files=( ${COMPREPLY[@]:-} $(compgen -f -X "${xspec}" -- "${cur}") )
3683bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root        fi
3693bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root
3703bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root        COMPREPLY=( $(
3713bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root            for i in "${files[@]}"; do
3723bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root                local skip=
3733bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root                for j in "${dirs[@]}"; do
3743bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root                    if [[ $i == $j ]]; then
3753bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root                        skip=1
3763bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root                        break
3773bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root                    fi
3783bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root                done
3793bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root                [[ -n $skip ]] || printf "%s\n" "$i"
3803bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root            done
3813bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root        ))
3823bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root
3833bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root        COMPREPLY=( ${COMPREPLY[@]:-} $(
3843bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root            for i in "${dirs[@]}"; do
3853bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root                printf "%s/\n" "$i"
3863bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root            done
3873bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root        ))
3883bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root    fi
3893bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root}
3903bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root
3913bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root
3923bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Rootif [[ $(type -t compopt) = "builtin" ]]; then
3933bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root    complete -F _adb adb
3943bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Rootelse
3953bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root    complete -o nospace -F _adb adb
3963bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Rootfi
397