Android and Linux

Wednesday, September 29, 2010

Linux clipboard to Android, again

(Note: I did a more complete write-up on the XDA forum which may be easier to follow than this.)

Tasker offers an improvement to my previous method of sharing clipboard contents between the phone and linux PC. It's not perfect yet, because there is no reliable way to read a whole file, but Pent said on the Tasker discussion group he'd put that on his todo list.

As of now, this will copy one line perfectly, giving it the same functionality as "Chrome to Phone" to send links to your browser. With a little customization, you could probably get it to imitate the rest of Chrome to Phone's functionality, and this would work on non-Froyo phones too, although it requires ssh with keys, at least rudimentary command line knowledge and only works on Linux and with Tasker, and only on weekdays when the sun it out and your car is full of gas.

Ok, some of that is not required.

Using my previous example in the link above, set up the paste2n1 script on your computer to export the display and grab the clipboard contents from the command line using xsel or xclip.

Once that is done, set up a script on your phone to ssh to the PC and run that script then redirect the output to a file on the sdcard. I'll use /sdacrd/homeclipboard in this example, so your phone script should look something like: ssh USER@IP -i KEYFILE 'paste2n1' > /sdcard/homeclipboard

Now here are the actions to use with Tasker:

1- using the Locale Execute Plugin, execute the script you just wrote for the phone.
2- Variable clear > %LINE
3- Variable set > %ONE to 1
4- Read line > file: homeclipboard, Line: %ONE, To Var: %LINE
5- Set Clipboard %LINE
6- Flash > %LINE
7- Browse URL > URL: %LINE if %LINE matches http*

The last three steps are optional and depend on what you want to do with this task. Step 5 copies it to your phone's clipboard, step 6 pops up a toast notification showing you what was copied and step 7 opens that line in the browser if it is a http link, imitating Chrome To Phone.

If you followed this far, it shouldn't be too hard to figure out how to send a link to the computer. In fact, you should be able to send anything in the clipboard to the computer, as the limiting factor for going the other direction is Tasker's inability to read a whole file and keep the newlines and blank lines intact. The computer doesn't have that problem, so all you'd have to do is use Tasker to write %CLIP to a file then use the Locale Execute Plugin to run a srcipt which transfers it to the computer's clipboard.

After attempting to use this over the cell network today, I realized the rest of the task runs while the first step is still executing, thus copying "old" text to the phone's clipboard. An easy fix is to add Delete File> homeclipboard as the first step, then after the "Read line" action, add a "Go To [the "Read Line"] > if %LINE matches EOF." %LINE will always be EOF until the script execution completes and the homeclipboard file is created.

This could create an infinite loop in Tasker if the connection to the computer is down, as the file would never be created. Another simple way to avoid that would be to add a conditional to the script such as ssh USER@IP -i KEYFILE 'paste2n1' > /sdcard/homeclipboard || echo "failed" > /sdcard/homeclipboard. If it successfully connects, you get the clipboard text. If it fails, you get a failure notice copied to the phone's clipboard, or you could add a step to Tasker to pop up a warning if %LINE matches "Failed" and then stop the Task. There's a lot of simple ways to go about it but, personally, my connection never fails so I'm just winging it.