The free, multi-party video conferencing offering Google+ Hangout is a pretty fantastic alternative to Skype (and its paid multi-party option). Wouldn't it be wonderful to have a UI control you could drop into any .NET application that gave you all the power of Google+ Hangout? Well, it would... and I've been working on it, but so far it's not proved easy.
First a bit of back story. I have been working on an app which features embedded video conferencing and had gone initially with Skype. Skype has been a somewhat miserable experience thus far, workable but only just. The only way I've been able to integrate with Skype thus far has been their Skype4COM option. Skype4COM allows you to remote control certain features of Skype from a third-party application. You can initiate calls, hangup, mute, and things but you can't hide the original Skype interface or embed its video in your own application. There is a way to do all that, and it's SkypeKit. But for reasons unknown to me they seem to have suspended SkypeKit access. I applied to the program many months ago and my account still says something like, "We'll get back to you about SkypeKit when we're ready for you." I've heard from others that that's just the way it is right now, that they are redoing SkypeKit or something. At any rate... Skype isn't a great solution at the moment. Google+ Hangout on the other hand would be perfect, if only it worked.
I spent a few days a few weeks ago trying to create a Windows control that would let me embed Google+ Hangout inside a Windows control. The logical approach to do that would be to customize a web browser control to load up the web-based Google+ Hangout and just modify the rendered content and inject JS as necessary to achieve the desired control-ifying of Hangout. I've done that before, so I didn't think it would prove so tricky.
Microsoft WebBrowser Control
I first tried using the built-in Microsoft WebBrowser control as the hosting control. I automated Google account sign-in and had it load up the Google+ Hangout page. I hit the first major roadblock. The page gave me a warning about my browser agent not being supported. I went back and added code to spoof it, but that didn't seem to work as the WebBrowser control isn't all that sophisticated and only spoofs the user agent for the first request, not subsequent ones or ones that the loaded page fetches. I tried several alternative WebBrowser extension classes that try to intercept navigating requests and replace them with navigate calls that include the spoofing, but they didn't seem to work properly. If memory serves I did reach a point where I was able to call the JS to start a hangout but everything hung when it tried to install/start the hangout.
The next option I tried was Awesomium, a Chromium-based behind the scenes browser rendering system. After looking at some of their examples and struggling a bit with their concept (which differed radically from the WebBrowser control and MozNET control approaches I was used to) I ended up realizing I could use one of their demo apps as a quick way to test the concept. They had a tabbed web browser demo which I used to access Hangout. I was able to initiate a Hangout but the video of the Hangout was not contained as it should have been within the Awesomium demo browser, the Hangout window was at the top left of the screen whereas the browser was in the middle. So it worked but if they couldn't control where it was rendering then I didn't think an Awesomium would be an easy solution.
MozNET / Xulrunner
Next I tried my old friend, MozNET. MozNET is a XULrunner implementation which I've quite enjoyed using before. There again I wen the easy route first and used a demo browser example to see if I could get it working. Sadly it did not work. It would just hang at the step where Hangout is checking for its plugin. I feel like a MozNET solution wouldn't be too hard to achieve, but I don't have the depth of knowledge in it to make it happen easily. I know MozNET can be made to work with various XPI-based plugins.
Oddly enough, Google+ Hangout doesn't seem to be an XPI plugin. I did a procmon.exe dump of a Firefox when using Hangout and I see access to:
And a separate EXE gets launched:
C:\Users\foo\AppData\Local\Google\Google Talk Plugin\googletalkplugin.exe
But I'm not sure how what is doing the communication between Firefox and the Hangout code.
If anyone has any thoughts they'd like to share, please let me know! I think the world would benefit from an embeddable Google+ Hangout control... I know I would.
If you're serious about playing around with Android I urge you to check out my article on how you can convert a $249 Barnes & Noble Nook Color e-reader into a full Android tablet! I just did it and it's turning out to be one of the coolest gadgets I've had!
Tonight I wanted to play around with the Google Android OS for mobile devices, but having neither an Android tablet or phone I was forced to investigate how I could run it on my computer. I found the answer I was looking for and succeeded in running it on my PC. And here is my super quick guide on how you can do it, too.
You will need the virtual machine software VMware Player or VMware Workstation. If you don't have either, you can download and install VMware Player for free.
Grab the Android Live ISO, the one to use is the Asus Eee PC version. (I tried the generic version and it wouldn't even boot under VMware.) You can navigate to the latest version here or just use this direct link for the 2.2 version.
Configure the VMware Player or VMware Workstation options for this VM. You want to choose:
- CD/DVD pointed at the ISO file you just downloaded for Android
- 512 MB memory
- Any network setting should work (BUT, you will need to follow the instructions in step 3)
- Sound card should be changed to "SB X-Fi Audio"
- 2 GB IDE hard disk (optional)
With the VM powered off, modify the .vmx file that VMware created using a text editor. You MUST change the existing line to now read:
ethernet0.virtualDev = "vlance"
If you don't make this change you will have no network access in Android!
Power on the Android VM and from the bootloader screen choose the first option and everything should work!
Making it Permanent
The above works great for getting a feel for Android, but because this is a "live" version of Android using a ram disk for temporary storage, all your changes will be lost when you shutdown or reboot. To make your environment permanent it's actually very easy:
- Reboot the virtual machine (Power > Reset in VMware)
- Choose the "Install to hard disk" option from the bootloader
- Create a single primary partition in the partition editor, using all available space. Make the partition bootable. Quit the partition editor.
- Allow it to install the OS to the selected partition, using ext3.
- Allow the installer to use Grub as your boot loader.
- Do not attempt to create a virtual SD card (I didn't investigate how this works, so when I tried it it appeared to overwrite the OS I just wrote to disk. So don't do this unless you know what you're doing.)
- Choose to Run Android x86 when asked.
And now you've got a permanent Android x86 virtual machine!
Certain features are not supported by Android x86, primarily those applications which require devices missing from the virtual machine (e.g., the camera). Other applications such as the YouTube application appear to work except that it does not seem to play videos; I suspect this may have to do with specific hardware acceleration missing from the virtualization. Also, see the many debugging and virtualization related options in the app list; you can do things like spoof geolocation. While limited in some respects, this is an excellent tool for testing and debugging your web and mobile apps on Android.
Have fun playing around with it!
I use Gmail frequently (via Google Apps). I use it out of necessity more than preference. The interface I like the best is MS Outlook, but that's on my OQO Model 02 (UMPC). And that computer's performance has degraded (Vista) over time, its extended battery died (swelled up like it was about to have little baby batteries), and the maker (OQO) went bankrupt (making upgrades and batteries unattainable), so my ardor for that platform has waned. And even before that, the ability to switch between the three main computers I use daily and have my latest drafts right there is certainly a benefit of Gmail no one can deny.
So what don't I like about Gmail? To my mind there are two egregious errors in their product:
- Their spam email catching system is great, except for the false positives.
- There are conversations, and then there are sub-conversations. And the one shouldn't be viewed as the other.
Spam is a major problem. I should know, I've used the same email addresses for 12 years now, so I get 1,500+ spam emails a day. And while Gmail does an amazing job at eliminating those from my inbox, it does so at the unacceptable cost of taking away a small fraction of my legit email. Because I get so many spam emails, and because Google offers no sorting options, there's no way I can review my spam mail in Google to catch the legit ones Google has wrongly flagged. And thus, I lose some legit email. Maybe I've lost some from long lost friends, maybe I've lost some from an ex-gf writing to apologize for some distant sin, maybe I've lost some from business colleagues about to offer my company a once in a lifetime opportunity. I'll never know, because Google eats 'em up. I can't believe that Google doesn't have any configurable options for their spam filter. It should at least have an option for turning it off, or for only marking things as spam that are guaranteed to be spam. Let's be clear, some things are safely discarded as spam, if Google has seen the same email sent to 13,492 of their users, that's not an email from my long lost cousin Jim. It can always safely mark that as spam. But Gmail will also mark as spam an email from your long lost cousin Jim that it happens to suspect is spam, based on unspecified criteria. Perhaps Jim's email includes a url pointing to a picture of their newborn baby, who is unfortunately and spam-suspiciously named Buy. Point being Google treats both sorts of things the same, moving both to the spam folder when I should have some control over that. And if you're not going to do that, at least give me access to the spam folder via POP, so that I can examine them more efficiently myself. In Outlook I can quickly clean out my spam folder by various sorting techniques. Since I get so much spam, sorting by title aggregates 98% of the spam and I can just walk through it and delete it in chunks very quickly, rescuing the false positives as I go. Gmail feels, apparently, that sorting email isn't something users would ever want to do, so they provide no such options (unlike everyone else). So, Gmail causes me to lose some valid email, and that is frustrating. I still use Gmail, knowing this, but only just barely, hoping some solution will appear on the horizon.
Everything is not best viewed as one conversation. There are many situations in which Gmail's version of a "conversation view" is unworkable. For example. I post a job ad on Craigslist. I get 150 responses from applicants. Some of the applicants keep the CL post's original title, some change it. Some people insert their own title, but often enough using generic titles that others are also using. Gmail's criteria for a conversation is based on the email subject. So these odd groupings of conversations start to appear in my inbox. One job ad, 150 responses, might show up as 14 different conversations. And, worse yet, I open up one of these conversations and see 25 responses, I then reply to the individual people in the conversation, and when they respond they show up nested within that same conversation, while other new responses are still showing up at the end of the conversation. And when any of those people reply, that entire conversation floats back up to the top, but I've got to go walk through the thing again, looking to see if 1 person or 14 people had replied to these separate but wrongly grouped conversations. It's totally unworkable. I invariably need to switch to Outlook to deal with these situations, otherwise I can't keep track of things and end up failing to respond to lots of people. For god's sake, Gmail, let us turn off the conversation view when we need to!!! One thing I deeply resent is when people or companies think they are so much more clever than everyone else and force a feature on you that you don't necessarily want, and they suppress features you have long needed and relied upon on the grounds that they know better what you need. Gmail is the only email front-end that I know about that forces you to view everything as a conversation, with no option to view it normally. If they really wanted to do the conversation thing right, aside from letting you turn it off when needed, use better criteria for what is a conversation. It should not just be based on the subject of the email. There are hidden headers you can use, which I believe Outlook and others use to thread messages. Also, you can pretty well guess threading based on any quoted content in a response.
Anyway, I have other complaints about Gmail, but those are the two points where their product is (for me) completely broken, and barely usable.