Files
sxmo-utils/scripts/modem/sxmo_modemtext.sh
Willow Barraco 4913fac4ee Cleanup virtual keyboard management
Some devices doesn't need a virtual keyboard, aka Nokia N900, aka
Pinephone with keyboard. This give a way to disable this feature
completely.

Also, we remove the sxmo_dmenu_with_kb.sh script, cause it is poorly
used, and give inconsistent behavior between menus. The user can already open
the keyboard very easily.

For this same reason, we remove some random "sxmo_keyboards.sh open". If
this isn't necessary cause of a specific usage (aka dtmf special
layout.

I also dropped some code in sxmo_dmenu.sh that adapt the available size
depending on if the keyboard is open or not. The keyboard can be open
later, so this is dumb to rely on this, and we should alway be able to
open/close it, and to read all lines.

I adapted the inputhandler a bit when keyboard is disabled. If you guys
think about better usage of freed handler, I'm open!
2024-03-25 17:32:26 +01:00

222 lines
5.9 KiB
Bash
Executable File

#!/bin/sh
# SPDX-License-Identifier: AGPL-3.0-only
# Copyright 2022 Sxmo Contributors
# include common definitions
# shellcheck source=configs/default_hooks/sxmo_hook_icons.sh
. sxmo_hook_icons.sh
# shellcheck source=scripts/core/sxmo_common.sh
. sxmo_common.sh
set -e
err() {
sxmo_log "$1"
echo "$1" | dmenu
kill $$
}
choosenumbermenu() {
# Prompt for number
NUMBER="$(
printf %b "\n$icon_cls Cancel\n$icon_grp More contacts\n$(sxmo_contacts.sh | grep -E "\+[0-9]+$")" |
awk NF |
sxmo_dmenu.sh -p "Number" -i |
cut -d: -f2 |
tr -d -- '- '
)"
if echo "$NUMBER" | grep -q "Morecontacts"; then
NUMBER="$( #joined words without space is not a bug
printf %b "\nCancel\n$(sxmo_contacts.sh --all)" |
grep . |
sxmo_dmenu.sh -p "Number" -i |
cut -d: -f2 |
tr -d -- '- '
)"
fi
if printf %s "$NUMBER" | grep -q "Cancel"; then
exit 1
elif NUMBER="$(sxmo_validnumber.sh "$NUMBER")"; then
printf %s "$NUMBER"
else
sxmo_notify_user.sh "That doesn't seem like a valid number"
fi
}
sendtextmenu() {
if [ -n "$1" ]; then
NUMBER="$1"
else
NUMBER="$(choosenumbermenu)"
fi
[ -z "$NUMBER" ] && exit 1
DRAFT="$SXMO_LOGDIR/$NUMBER/draft.txt"
if [ ! -f "$DRAFT" ]; then
mkdir -p "$(dirname "$DRAFT")"
echo "$SXMO_DEFAULT_DRAFT" > "$DRAFT"
fi
# shellcheck disable=SC2086
sxmo_terminal.sh $EDITOR "$DRAFT"
while true
do
# We use them in printf statements
export icon_cls
export icon_att
export icon_usr
ATTACHMENTS=
if [ -f "$SXMO_LOGDIR/$NUMBER/draft.attachments.txt" ]; then
# shellcheck disable=SC2016
ATTACHMENTS="$(
tr '\n' '\0' < "$SXMO_LOGDIR/$NUMBER/draft.attachments.txt" |
xargs -0 -I{} sh -c 'printf "%s %s %s :: %s\n" "$icon_cls" "$icon_att" "$(basename "{}")" "{}"'
)"
fi
RECIPIENTS=
if [ "$(printf %s "$NUMBER" | xargs pnc find | wc -l)" -gt 1 ]; then
# shellcheck disable=SC2016
RECIPIENTS="$(printf %s "$NUMBER" | xargs pnc find | xargs -I{} sh -c 'printf "$icon_cls $icon_usr "$(sxmo_contacts.sh --name {})" :: {}\n"')"
fi
CHOICES="$(printf "%s Send to %s (%s)\n%b\n%s Add Recipient\n%b\n%s Add Attachment\n%s Edit '%s'\n%s Cancel\n" \
"$icon_snd" "$(sxmo_contacts.sh --name "$NUMBER")" "$NUMBER" "$RECIPIENTS" "$icon_usr" "$ATTACHMENTS" "$icon_att" "$icon_edt" \
"$(cat "$SXMO_LOGDIR/$NUMBER/draft.txt")" "$icon_cls" \
| awk NF
)"
CONFIRM="$(printf %b "$CHOICES" | dmenu -i -p "Confirm")"
case "$CONFIRM" in
*"Send"*)
if sxmo_modemsendsms.sh "$NUMBER" -f "$DRAFT"; then
rm "$DRAFT"
sxmo_log "Sent text to $NUMBER"
exit 0
else
err "Failed to send txt to $NUMBER"
fi
;;
# Remove Attachment
"$icon_cls $icon_att"*)
FILE="$(printf %s "$CONFIRM" | awk -F' :: ' '{print $2}')"
sed -i "\|$FILE|d" "$SXMO_LOGDIR/$NUMBER/draft.attachments.txt"
if [ ! -s "$SXMO_LOGDIR/$NUMBER/draft.attachments.txt" ] ; then
rm "$SXMO_LOGDIR/$NUMBER/draft.attachments.txt"
fi
;;
# Remove Recipient
"$icon_cls $icon_usr"*)
if [ "$(printf %s "$NUMBER" | xargs pnc find | wc -l)" -gt 1 ]; then
OLDNUMBER="$NUMBER"
RECIPIENT="$(printf %s "$CONFIRM" | awk -F' :: ' '{print $2}')"
NUMBER="$(printf %s "$OLDNUMBER" | sed "s/$RECIPIENT//")"
mkdir -p "$SXMO_LOGDIR/$NUMBER"
DRAFT="$SXMO_LOGDIR/$NUMBER/draft.txt"
if [ -f "$SXMO_LOGDIR/$OLDNUMBER/draft.txt" ]; then
# TODO: if there is already a DRAFT warn the user?
mv "$SXMO_LOGDIR/$OLDNUMBER/draft.txt" "$DRAFT"
fi
if [ -f "$SXMO_LOGDIR/$OLDNUMBER/draft.attachments.txt" ]; then
mv "$SXMO_LOGDIR/$OLDNUMBER/draft.attachments.txt" \
"$SXMO_LOGDIR/$NUMBER/draft.attachments.txt"
fi
[ -e "$SXMO_LOGDIR/$NUMBER/sms.txt" ] || touch "$SXMO_LOGDIR/$NUMBER/sms.txt"
sxmo_hook_tailtextlog.sh "$NUMBER" &
fi
;;
*"Edit"*)
sendtextmenu "$NUMBER"
;;
*"Add Attachment")
ATTACHMENT="$(sxmo_files.sh "$HOME" --select-only)"
if [ -f "$ATTACHMENT" ]; then
printf "%s\n" "$ATTACHMENT" >> "$SXMO_LOGDIR/$NUMBER/draft.attachments.txt"
fi
;;
*"Add Recipient")
OLDNUMBER="$NUMBER"
ADDEDNUMBER="$(choosenumbermenu)"
if ! echo "$ADDEDNUMBER" | grep -q '^+'; then
echo "We can't add numbers that don't start with +"
elif echo "$OLDNUMBER" | grep -q "$ADDEDNUMBER"; then
echo "Number already a recipient."
else
NUMBER="$(printf %s%s "$NUMBER" "$ADDEDNUMBER" | xargs pnc find | sort -u | tr -d '\n')"
mkdir -p "$SXMO_LOGDIR/$NUMBER"
DRAFT="$SXMO_LOGDIR/$NUMBER/draft.txt"
if [ -f "$SXMO_LOGDIR/$OLDNUMBER/draft.txt" ]; then
# TODO: if there is already a DRAFT warn the user?
mv "$SXMO_LOGDIR/$OLDNUMBER/draft.txt" "$DRAFT"
fi
if [ -f "$SXMO_LOGDIR/$OLDNUMBER/draft.attachments.txt" ]; then
mv "$SXMO_LOGDIR/$OLDNUMBER/draft.attachments.txt" \
"$SXMO_LOGDIR/$NUMBER/draft.attachments.txt"
fi
[ -e "$SXMO_LOGDIR/$NUMBER/sms.txt" ] || touch "$SXMO_LOGDIR/$NUMBER/sms.txt"
sxmo_hook_tailtextlog.sh "$NUMBER" &
fi
;;
*"Cancel")
exit 1
;;
esac
done
}
conversationloop() {
if [ -n "$1" ]; then
NUMBER="$1"
else
NUMBER="$(choosenumbermenu)"
fi
set -e
sxmo_keyboard.sh open
while true; do
DRAFT="$SXMO_LOGDIR/$NUMBER/draft.txt"
if [ ! -f "$DRAFT" ]; then
mkdir -p "$(dirname "$DRAFT")"
touch "$DRAFT"
fi
# shellcheck disable=SC2086
$EDITOR "$DRAFT"
sxmo_modemsendsms.sh "$NUMBER" -f "$DRAFT" || continue
rm "$DRAFT"
done
}
readtextmenu() {
# E.g. only display logfiles for directories that exist and join w contact name
ENTRIES="$(cat <<EOF
$icon_cls Close Menu
$icon_edt Send a Text
$(sxmo_contacts.sh --texted)
EOF
)"
PICKED="$(printf %b "$ENTRIES" | sxmo_dmenu.sh -p "Texts" -i)" || exit
if echo "$PICKED" | grep "Close Menu"; then
exit 1
elif echo "$PICKED" | grep "Send a Text"; then
sendtextmenu
else
sxmo_hook_tailtextlog.sh "$(echo "$PICKED" | cut -d: -f2 | sed 's/^ //')"
fi
}
if [ -z "$*" ]; then
readtextmenu
else
"$@"
fi