
function _pidcat()
{
  local cur prev opts cmds c subcommand device_selected
  COMPREPLY=()
  cur="${COMP_WORDS[COMP_CWORD]}"
  prev="${COMP_WORDS[COMP_CWORD-1]}"
  prevprev="${COMP_WORDS[COMP_CWORD-2]}"
  opts="-d -e -h -l -s -w
        --always-display-tags --color-gc --device --emulator --help --min-level
        --serial --tag-width"
  device_selected=""

  # if there are multiple devices plugged in, prompt the user to specify which
  # so that the list of installed packaged can be fetched from the device

  case "${prev}" in
      -d|-e|--device|--emulator)
          device_selected="${prev}"
          ;;
  esac

  # use device set by serial number
  case "${prevprev}" in
      -s|--serial)
          device_selected="-s ${prev}"
          ;;
  esac

  if [ -z "$device_selected" ]; then
      local num_devices=$(( $(adb devices 2>/dev/null|wc -l) - 2 ))
      if [ "$num_devices" -gt "1" ]; then
          # With multiple devices, you must choose a device first.
          COMPREPLY=( $(compgen -W "-d -e -s --device --emulator --serial" -- ${cur}) )
          return 0
      fi
  fi

  case "${cur}" in
      -*)
          COMPREPLY=( $(compgen -W "$opts" -- ${cur}) )
          return 0
          ;;
  esac

  case "${prev}" in
      -l|--min-level)
          COMPREPLY=( $(compgen -W "V D I W E F" -- ${cur}) )
          return 0;
          ;;
      -s|--serial)
          if [ -z "$device_selected" ]; then
              # Use 'adb devices' to list serial numbers.
              COMPREPLY=( $(compgen -W "$(adb devices|grep 'device$'|cut -f1)" -- ${cur} ) )
              return 0
          fi
          ;;
  esac

  # if we can get the package names, then use those
  local apks=$(adb $device_selected shell ls /data/data 2>/dev/null | tr '\n' ' ' | tr -d '\r')
  COMPREPLY=( $(compgen -W "$apks" -- ${cur}) )
  return 0
}
complete -F _pidcat pidcat

# Local variables:
# mode: shell-script
# sh-basic-offset: 4
# sh-indent-comment: t
# indent-tabs-mode: nil
# End:
# ex: ts=4 sw=4 et filetype=sh
