I tried to do that on android and it's practically impossible to end up with a sane UI for that since it requires to enter full info on unspent outputs. SegWit/BCash protects from entering incorrect amount and producing huge fee but it complicates things even more.
In order to enter unspent outputs info you have few choices - entering raw hex transactions, entering a json from a web service or using a some sort of tx constructor. So for practical point of use it's much easier to use hardware wallets.