#!/bin/sh -e

call_usb_moded() {
    method="$1"; shift

    gdbus call \
        --system \
        --dest com.meego.usb_moded \
        --object-path /com/meego/usb_moded \
        --method "com.meego.usb_moded.${method}" \
        "$@" | sed -e "s/^('//" -e "s/',)$//"
}

# Allow porters to force ADB or SSH by placing a marker file in /userdata.
if [ -e /userdata/.force-adb ]; then
    new_mode="charging_only_adb"
elif [ -e /userdata/.force-ssh ]; then
    new_mode="developer_mode"
# In the emulator, we always want to first have the ADB on
elif systemd-detect-virt --quiet --vm; then
    force_adb_to=1
else
    # OTOH, If phablet user has no password, adb mode has to be disabled.
    adbuser="phablet"
    pwlen="$(getent shadow $adbuser| sed -e "s/^$adbuser://" -e "s/:.*$//" | wc -c)"
    if [ "$pwlen" -le 2 ]; then
        force_adb_to=0
    fi
fi

if [ -z "$new_mode" ] && [ -z "$force_adb_to" ]; then
    # Nothing to do
    exit 0
fi

if [ -z "$new_mode" ]; then
    old_mode=$(call_usb_moded get_config)
    case "$old_mode" in
        developer_mode)
            # We want to stay in developer_mode if porters didn't disable it,
            # even when we don't have password.
            ;;
        charging_only)
            # Special case for usb-moded's built-in modes
            if [ "$force_adb_to" = 0 ]; then
                new_mode="mtp"
            else
                new_mode="mtp_adb"
            fi
            ;;
        *_adb)
            if [ "$force_adb_to" = 0 ]; then
                new_mode="${old_mode%_adb}"
            fi
            ;;
        *)
            if [ "$force_adb_to" = 1 ]; then
                new_mode="${old_mode}_adb"
            fi
            ;;
    esac
fi

if [ -n "$new_mode" ]; then
    # usb-moded uses 2 calls to set "config" and apply "mode".
    call_usb_moded set_config "$new_mode"
    call_usb_moded set_mode "$new_mode"
fi
