Showing posts with label android. Show all posts
Showing posts with label android. Show all posts

Tuesday, April 23, 2013

Solving Boggle (Scramble with Friends) with a Bot!

Headnote

I am always fascinated by Android games, especially puzzle games. This is how it usually works with me and a puzzle game. I start playing them with random friends. They beat me and I beat them on and off. Then I sit and think, this is so monotonic and algorithmic that a human being shouldn't be sitting and doing it. Then I sit with the computer (with my favorite monkeyrunner Jython in it) and try to come up with a simple algorithm for it. Then i plug in the standard monkeyrunner code to actually feed the output of the program back to the device. Then I usually become #1 among my friends in the leaderboard (often even in the global leaderboard) ;-)

This is one such scenario. Zynga's Scramble with Friends has been really popular among my friends off late. So i hit this routine cycle and ended up with a beautiful bot which usually scores a centum (like the one TamBrahm parents force their kids to get in Mathematics).

With that out of the way, let's begin.

Objective of the Game

The game consists of a 4x4 grid of letters. You have to form as many words you can by starting from a letter and by moving to one of the (upto) 8 adjacent letters. Dead simple, but really interesting and addictive.

The first thing needed to solve this is a dictionary of words. I went on the internet and downloaded a plain text dictionary file which had about 170k words in it. Good enough to start with.

Algorithm - Breadth First Search

The number of valid words is usually very limited. In most games, the total number of valid words is usually < 400. So, a simple Breadth First Search (BFS) will do starting with single letter elements and then add the neighbors recursively. One key insight is, if you come across a prefix that never occurs in the dictionary, you can discard that prefix at that point instead of adding it to the traversal queue.

A rough sketch of the algorithm is as follows:
  • queue = [all 16 characters]
  • while queue is not empty:
    • word = head of queue
    • if word is in dictionary output it [1]
    • for all neighbors adjacent to the last character of word
      • new_word = word + neighbor
      • if dictionary has words with prefix new_word, add new_word to the queue [2]
That's it. Straightforward implementation of a BFS-like algorithm.

Choice of Data Structure

The key to solving this problem efficiently lies in choosing a good data structure for implementing the dictionary. The dictionary needs to support two major operations. One is looking up if a word exists. This is used for step [1] in the above algorithm. The other operation is, given a prefix, check if there is atleast one word containing that prefix in the dictionary. This is used for step [2] in the algorithm mentioned above.

Array ?

One good looking candidate is using a simple array (note that the dictionary is already sorted for us). Look up can be performed using simple binary search. Prefix checking can also be performed using a modified binary search (if search succeeds, then prefix exists. if search fails, prefix existence can be determined by looking at the bounds in which the search failed). Also, note that the dictionary has ~173k words. So, searching is gonna take log(173k) which is approximately 18 hits in the worst case. This is a totally fair deal.

Trie ?

Another possibility is using the Trie, whose raison-d'etre (very reason for existence) is to implement such dictionaries. The Trie implementation is also fairly trivial (since we require only two major operations apart from Trie construction). In the Trie, both the operations are gonna take as many hits as the length of the word or the prefix being looked up. So asymptotically, both these data structures are more or less similar and we don't have a big advantage in using either one over the other since our output is always gonna be < 400 words.

I decided to go with the Trie. After reading this article about Trie implementations in Python, I decided to quickly write my own implementation of Trie. Also, this made life simpler as I couldn't quickly find any good resources about using external libraries within monkeyrunner.

Implementation Quirks

Since I had already used monkeyrunner a few times before, implementation turned out to be pretty straightforward. The following are a few implementation quirks and nuances that the script deals with:
  • Input is manually entered as a raw row-major string of length 16.
  • If the same word can be formed by two different combinations, only one combination is actually considered valid. This is overcome by storing a list of already found words in another Trie.
  • Even though the script finds smaller words first (because of BFS), it actually starts outputting words of length >= 5 first and then after it has exhausted all the lengthier words, it then outputs the smaller words in the reverse order of length (4,3,2). This is to maximize points in case we don't find time to output all the words.
  • The game offers three lifelines. I found the freeze option to be useful to the bot (as each freeze gives you 15 additional seconds of game time). So, the script automatically taps on the freeze lifeline every 30 seconds.
  • We also need to store the co-ordinate of each letter in the queue along with the letters themselves in order to simulate the output in the device.
  • The co-ordinates are hard-coded for Nexus 7 portrait mode.

Code

The whole implementation can be found here: https://github.com/vickyg3/scripts/tree/master/scramble_bot

Sample Video

Here is the exciting part. This is how it looks like when my bot plays the game:



It's always a very nice feelings to watch you script do such beautiful things.

-Vignesh

Wanna do some good deed? Visit http://www.computerkindness.org (Or look for the banner in the top-right of this page).

Saturday, June 23, 2012

Convert your keyboard into an Android game controller!

I have been gifted with a new android phone. It's the big G branded Galaxy Nexus. Its blazingly fast and awesome to use (especially after years of HTC Wildfire usage). Right from day one, i have been really addicted to this game called Temple Runner which wasn't compatible with my old phone.

The game is very straightforward to play and it involves only 4 different operations. Swipe up, left, right and down. Coming from a strong keyboard background, I was never 100% comfortable with touch interfaces as i was with keyboard. And these 4 operations sounded analogous to the accelerate, brake and turn operations while playing a racing game in the computer keyboard.

That got me thinking, is there a way to make the computer keyboard into a game controller for my Android phone? Turns out its fairly straightforward. In this post i'll explain exactly how to do that.

Ingredients
  • Android phone (obviously)
  • USB cable connected in debugging mode
  • Android SDK installed
  • Very very basic python english
There's a tool named monkeyrunner which enables us to send operations from the computer to the phone via a very simple Python API (monkeyrunner tool is a part of Android SDK). A sample code for a controller would look like this:

Code until line 7 is fairly straightforward to understand. The only thing that i would like to explain here is the device object. It is an object of the MonkeyDevice class. This class has all the API methods that you need to use in order to simulate the operations. For example, device.touch(100, 200, MonkeyDevice.DOWN_AND_UP) will simulate a touch event at co-ordinate 100, 200 (with the origin being top left). As simple as that!

You can find the detailed documentation of the monkey device class to know about other methods like drag, type, etc.

The full code which i used for playing Temple Run game is given below:


One point to note is that, the sys.stdin.read(1) line will read one character and wait for the enter key to be pressed. This could be annoying given that you are writing a game controller. In order to avoid the enter key press, if you are on linux run "stty raw" before running this script and if on windows use the getch function in msvcrt module.

-Vignesh

Thursday, September 15, 2011

Google DevFest 2011 - Bangalore!


Atlast, I attended a professional developer meet! And it couldn't be better. It was the Google Developer Fest organized by Google at Lalit Ashok Hotels, Bangalore. Most of the speakers were from Google headquarters, working on key Google products like Android, Chrome, Maps and App Engine.



The registration process went on very easily as they had a QR code in the confirmation mail, and used an android phone to take a picture of the same and verify the registration. Also, they had queues based on alphabets range. The T-Z queue was empty while the other queues were having atleast 20 to 30 people in it. For the first time in my life, i experienced an advantage of my name starting with V!

In this post, I am sharing the raw notes which i took during the keynote and various other talks. Hope this will be of some use.




Keynote - Android
* 550k+ activations per day
* Complex Screen density vs Size matrix - unifying everything => android
* Always use DPI (density per square inch) for specifying assets
* Honeycomb features
* Fragments
* Loaders - wrapper on top of asynctask
* Action bar
* Tabs
* Animation framework
* Compatibility library
* Multiple APK Support

Keynote - Bleeding edge HTML5 - http://india-devfest-keynote.appspot.com
* Interestingly, this keynote isn't called as "Chrome", though most of the topics were Chrome specific
* 160M active users
* Page Visibility API
* Prerendering
* Offline capabilities
* Web animation - CSS3, WebGL
* Native Client
* Future
* Web intents
* Fullscreen content - Fullscreen API
* Web Audio API - Real time processing and analysis of audio
* WebRTC - Real time communication
* Be updated
* chromestatus.com
* updates.html5rocks.com



Android Market - Tony Chan
* 250k + apps, 6B+ downloads
* In app billing, carrier billing
* Licensing
* All licenses allowed
* Code Obfuscation
* Don't reuse sample code
* In app billing
* Sell only digital content
* Reports for developers
* Device Filter
* Ability to exclude handpicked devices
* Multiple APK
* Filter by specific segments (platform version, screen size, etc.)
* App available as one product listing
* Apps upto 4GB coming soon (50mb app + 2gb archive)
* Pay attention to graphics - Featuring in android market depends mainly on that

Android Fragments & Open Accessory ADK - Tony Chan
* Fragments
* Fragments need not always have UI
* Fragments are an investment for the future!
* Fragments vs <include/>
* Fragments (optional UI, has lifecycle, not standalone, no direct interaction with intents) vs Activity
* Open accesory & ADK
* USB Device basics (Descriptor, etc)
* Open Accessory -> A USB host device that can communicate with an android device (e.g. Arudino)
* Use Android Accessory Protocol for communication

Building Integrated Apps on Google Cloud Technologies - Alfred Fuller
* App Engine intro
* Google Storage
* Store data in google's cloud
* Access via RESTful API
* Objects of any type (100GB / object)
* OAuth / Web browser
* Prediction API
* Machine learning API
* Upload training data -> Build model -> Predict new data
* Many machine learning techniques, Asynchronous training, Many platforms access
* BigQuery
* Analyze massive amounts of data in seconds
* SQL like query language, REST, RPC, etc.
* Batch jobs (Mapreduce)
* App Engine Identity API (For secure authentication)

Google Apps Marketplace - Claudio Cherubino
* Google Apps as a pure platform
* Google Apps APIs
* Success Stories
* OpenID SSO & OAuth
* Provisioning API
* Gmail contextual gadgets
* Sidebar gadgets in Gmail/Calendar
Twitter: @ryguyrg @scottmcmullan @stevenbazyl

Chrome Developer Tools - Boris Smus
* Basics - Cheat Sheet
* Revision history for all changes made inline in dev tools
* Aim to transform this into an IDE
* Commandline API - console.log takes n parameters, copy(), inspect() and $0
* Javascript debugging - See call stack, Pretty print
* Breakpoints - Line, Conditional, Exception, DOM, Event, XHR
* Future
* Extensions can extend developer tools too!
* Use chromiumer
* Remote debugging (--remote-debugging-port=31337 , Blackberry PlayBook only)



Google Places API - Chris Broadfoot
* What is a Place -> Abstract & Concrete
* Available as a web service and as a part of javascript maps library

Designing UIs for Phones and Tables
* UI Patterns for Honeycomb
* Action Bar
* App Icon - Where am i?
* View details - What can i see?
* Action buttons - What can i do here?
* Multi Pane Layouts
* Take advantage of screen real estate
* Consolidate multiple related screens into a compound view (similar to iframe in web)
* Screen rotation handling - Stretch (Settings), Stack (Calendar), Expand/Collapse (Gtalk), Show/Hide (Gmail)
* App Navigation
* Beyond the List
* Think and use innovative UIs to replace traditional lists (carousel, slidestack, etc.)
* Do's
* Aim for single APK
* Use compatibility library
* Customize visual design completely, if straying from Holo theme
* Support both landscape and portrait
* Extract dimensions for phones and tablets
* Use theme/style/etc. to reduce redundancy
* Marry OS visual style with your brand
* Don'ts
* Assume API level >= 11 (tablet)
* Assume xlarge == tablet (7" inch tablet is large)
* Use small font sizes
* Overuse fill_parent; Avoid excessively long lines of text
* Think tablets are big phones

Btw, the lunch was awesome too! :-P Overall, a great experience! :-)

-Vignesh

Tuesday, August 9, 2011

How I hacked an android game with Python and OCR!

Math Workout is a famous android game. In fact, it features in the top 5 of google listings for many math game + android related queries. The objective of the game is very very simple. It will fire simple math questions one after the other and you'll have to tap in the correct answer. Its a race against time among other users of the app in the world.

Here's how the app looks like and a few screenshots of questions:















As you can see, the game is fairly straigtforward. So its the time that you have to beat. A naive approach to that would be having a calculator or a computer near by and feeding in the questions to determine the answer and feeding it back to the phone. Totally manual!

Thats when the programming neurons of my brains started itching me that this could be automated and cheated by some mean. Come on think, think! So i sat on to solve this problem during my weekend and started thinking about ways i could attack this problem.

These are the steps that came into my mind in the first thought:

  1. Grab a screenshot of every question
  2. Crop the screenshot so that only the question is visible
  3. Run the cropped image through an OCR engine
  4. Parse the result and evaluate it
  5. Identify the co-ordinates of the resulting number and appropriately simulate touch events in the phone

Bummer! Every step looked a bit complex in itself at first sight. Then came along a bit of googling, and voila, i found the perfect tool that i needed to perform steps 1, 2 and 5. It is the monkeyrunner tool that comes along with the Android SDK. It opens up a Python API through which i can grab and crop screenshots, simulate touch events given an (x,y) co-ordinate. Exactly what i wanted.



Now, I have the cropped image that has the question in hand. Next step is to run it through an OCR engine. Again googling told me that ocrad is an useful OCR command line tool that was available as a part of the GNU project. I installed it and found that it cannot process png images. So i had to run the image through a converter before passing it to ocrad. This small piece of shell script helped me accomplish that:


To keep things simple, the shell script is invoked from python using os.popen(). Now, I have the actual expression as a python string. As you can see from the sample screenshots, few questions can be solved by a direct "eval" whereas others require some processing. Basic operations like addition, subtraction, multiplication and division can be solved using "eval". Whereas questions like "10% of 20", "square root of 9" needs some processing. Thats what this following if else block does:



Now that the expression is evaluated and we have the result in hand, all that's left is to go through the result character by character and simulate touch events in corresponding positions in the screen. I managed to identify the co-ordinates of each number in the screen by trial and error and hard coded those values within two functions named getx() and gety() which will take a character and return its corresponding x and y co-ordinates respectively, and the simulation happens. Here is the code snippet:



To orchestrate this whole process and play the game fully automatically other cosmetic additions like coping up with the frame rate of the phone and taking care of screenshot/ocr lags are to be considered. These are handled by minor if conditions and sleeps for very small amounts of time.

The end result is as you see in the below screenshot :-P



Here is a video of how the game looks like when it is being played by my script:


Though these steps seem like computationally a bit expensive, in practice i found them to be really fast. The script was able to answer approximately 2 questions per second (with an explicit sleep of 0.2 seconds between two questions - which leads to 2 questions every 0.8 seconds). A C/C++ program might run faster than this, but i stopped here as i have accomplished what i wanted. Overall it was a fun filled Sunday! :-)

Here is a link to the full source code of the automated script: auto_math_workout.py (you can find ocr.sh from the gist above in this page - rest of the source code is in the link)

Any comments/feedbacks are welcome! :-)

-Vignesh

Wednesday, December 1, 2010

Android 2.1 USB Tethering in Ubuntu

The worst part about owning an android phone is to wait for updates from your hardware vendor (HTC in my case) to provide OS updates. I am still stuck with Eclair and eagerly awaiting froyo,while the N1 counterparts are eagerly awaiting gingerbread :-P.

Wifi tethering (using the phone as a wifi hotspot) is one of the key features of froyo. Since i don't have froyo, i have to go through a tedious process to setup wifi tethering in my eclair. So, i chose the easier option of USB tethering.

Before i even connected the USB cable, i browsed through the internet and found out there are various methods available for USB tethering. There were many tutorials on how to achieve this. I read all levels of tutorials from rooting the device to installing the SDK to installing a $30 app. Atlast i found a simple app, which could do the trick.

I connected the phone (running android 2.1) and the computer (running ubuntu 10.04 netbook remix) and selected "Enable mobile internet sharing" in the phone. Thats when the miracle happened. A small pop up notification appeared in the top corner saying "Connected to wired network auto usb0". I was surprised. I had just spent half an hour surfing through tutorials to make this work. All of a sudden out of nowhere it works out of the box on just connecting the cable. To ensure i just pinged my blog and it was working like a charm!

So its windows that requires all the crappy drivers and vendor software for USB tethering. In ubuntu it automatically established a LAN (PAN may be) and set the IP, gateways and DNS and works on the go without any manual effort (except for connecting the phone and computer of course ;-))

So for all who want to tether your phone's internet connection, please do not waste your time in reading tutorials and rooting your device. Just boot into linux and connect your phone :-)

P.S.: This post is through the tethered 3g connection :-D

-Vignesh

Saturday, September 18, 2010

Swype - The next generation of text inputs !! :-)

People following me in twitter, facebook or my blog would have known that i recently joined the android community with the purchase of my htc wildfire. Ever since I bought my phone, there is this one thing that I'm madly in love with. It is supposed to be the next generation of input system for touch screens. With a simple tagline "Why type when you can swype", it is really one of the most amazing technologies I have ever seen in my life.

When I first got my phone, being the first time of using a touch phone, I was really happy about the basic touch input that is built in with android as it had a really nice auto corrector and I just needed to key in the text very very approximately. But the moment I installed and started using swype I never turned back. In this article I will be sharing an overview about what swype is, how to get swype for various smartphones and a few alternatives to swype.

What is swype ?

Swype is the most recent innovative technology for text inputs in touch screen based systems. Just like we have the T9 input system for traditional mobile phones, swype is for mobile phones with touch screens. In T9, there are either 3 or 4 characters assigned to a single numeric key and to key in text, you just have to press the correct combination of numbers associated with those particular characters and voila you have the text you wanted keyed in very easily. If there are multiple words possible for a particular combination then you choose the right word you wanted by either pressing the "*" key (in traditional nokia phones), or by pressing the down arrow (in sony ericsson and irritating motorola) or by pressing the "0" key (in the unconventional samsung phones). Once gotten used to, you will feel that T9 is the best way to key in texts in a mobile phone. It is indeed true and people even type without seeing the screen like we do in computers.



Swype is a similar technology for touch screen mobiles. In swype, instead of tapping each and every character in the qwerty virtual keypad shown in the mobile, you just have to elegantly trace through the path of the word you intend to type. Similar to T9, if there are multiple words in the path you traced, swype offers you the list of possible words for you to drag it into the input. You can be very approximate in your path trace yet swype recognizes your word almost perfectly all the times. Though it might sound simple and not very appealing at first, on using it you will realize that almost 90% of the words you type in have unique paths and hence, unlike T9, you very rarely will come across the ambiguous word choosing pop up.



Who can enjoy swyping ?


  • Android
    • Swype comes as a default input method along side touch input in many android devices.

    • If it doesn't come preloaded in your android device, then you can get the official swype beta from http://beta.swype.com. The official beta is closed now but you can download it through someone who has already registered with the beta was open (yes, it is legal to get any number of copies with a single registration! - and don't contact me as I didn't register when the beta was open).

    • If you didn't register for the official beta when it was open and don't know anyone who did, then this is the option for you. Download the apk file from some other source and install it in your device (which is what I've done in my phone). I am not posting any direct links here owing to legal reasons. It is available easily in 4shared.com. Find out the type of display your device has (VGA, QVGA, HVGA, etc.), download the appropriate version and install it.


  • Windows mobile
    • Few devices with windows mobile comes with swype preinstalled. I am not familiar about other options of getting swype for windows mobile.



  • Symbian
    • Swype has partnered with symbian and recently released a public beta for S60 5th edition based symbian phones (nokia 5800, 5230, 5233, N97, N97 Mini to name a few). You can download and install swype for symbian from Nokia Beta Labs. All the installation instructions are also briefed in that page.

    • One drawback i faced with swyping in symbian is that, most of the symbian devices have less sensitive resistive touch screens when compared to their capacitive counterparts in android devices. Although, it is convenient to swype with nails in the symbian devices which is not possible with the capacitive based android devices.




When is swyping easy ?

  • When you are just done with a call and your phone is slightly wet out of your cheeks

  • When have completely dry hands after a long rest of hands (e.g. after a sleep)


When is swyping not so easy ?

  • When you have just washed your hands and wiped it dry using a kerchief/tissue

  • When your hands are wet of course

  • If your fingers are a little bit bigger, then you may have to switch orientation every time you key in text


Alternatives to swype

Every emerging technology is never unique these days. There are always multiple implementations of a single technology and swype is no exception. Here are a few alternatives if swype that I have tried out.


  • Dasur SlideIT Keyboard

    • This is the best alternative for swype I have seen so far. I was using this before I could figure out swype installation in my device.

    • One feature that it had and swype lacks is shortcuts. You can store tiny shortcuts for frequently used lengthy words.

    • The dictionary is no where close to swype's preloaded dictionary of 60000 words. Although, many language packs are additionally available for free.

    • It is available for all major smartphone platforms (android, symbian, windows mobile and even for windows ce). It can be downloaded from the official market of your smartphone ( android market, ovi store, etc. ).

    • For more details visit here.


  • T-Swipe Pro

    • This is a swype alternative that is available only for android devices as far as i have explored.

    • It is a stable piece of software that is terribly slow in recognizing what you swipe.

    • The trial version shows you irritating pop ups asking you to register for full version which is definitely not worth upgrading to.

    • If you badly want to swipe and both swype and slide it key board doesn't work in your device ( which is a very rare case ), then this may be your final destination. I am damn sure you need the patience of handling a tortoise to use this.


To conclude, Swype is definitely one of the major breakthroughs in mobile technology and I am pretty sure that soon enough, swype will be the de facto standard for text input in touch screens. Hoping to see more and more OEM installed swype devices soon.

Note:
This article has been composed entirely in a mobile device using the following input systems:
  • This note is keyed in using the traditional touch input system for android

  • The section about SlideIT Keyboard was keyed in using SlideIT Keyboard itself

  • The section about T-Swipe Pro was keyed in using T-Swipe Pro itself

  • The rest of this article was keyed in using none other than swype itself :-)


P.S.: Thanks to AK Notepad.

-Vignesh

Friday, August 13, 2010

My new HTC Wildfire - Stepping into Android world !! :-)

Those who are following me in twitter/buzz might be knowing that i recently joined the Android community with the purchase of HTC Wildfire. It is one of the most recent phones from HTC released in India. As a matter of fact, i am really happy to see HTC building its base strongly in India (there are already 3 to 4 service centres in chennai alone and one in coimbatore too!). I wanted to buy an Android phone inspired by the adventures with android (nexus one) by varunkumar.

Ok, here i go with my first review of the brand new HTC Wildfire.

Specifications

  • Capacitive touch screen 240x320 QVGA

  • Android 2.1 with HTC Sense UI

  • 512 MB ROM

  • 384 MB RAM

  • microSD slot (2GB included) - expandable upto 32 GB

  • 3G upto 7.2 MBPS, Wi-Fi IEEE 802.11, GPRS, EDGE, Bluetooth v2.1

  • Internal GPS Antenna

  • 5 Megapixel Camers

  • G-Sensor, Proximity Sensor, Digital compass



Pros


  • Look and feel: The phone looks really sleek with a good amount of screen space (with both landscape and portrait orientations obviously).


  • Touchpad Input: This was something i was worrying before i bought this phone, as i have never used a touch pad based phone before. But now i know my worries were totally stupid, the capacitive touch screen in HTC Wildfire is really very good and much better than their resistive equivalents in the recent nokia phones. (N97 users, no offence, but the touchpad here is much better than N97). And yeah, life gets 100 times better with swype installed. We are really in the next generation of text inputs. Waiting to see how swype can change touch based netbooks. (For those who don't know what swype is, look here).


  • Sound Clarity: The sound clarity has been decent as far as i have experimented. (I am not an expert in playing around with the equalizer fields of a music player). To my needs, which are, hearing songs, loud ringtone, it works much more than fine.


  • Sensors: This is one feature that i never expected to be toooooo good. The sensors in the phone are realtime awesome. First is the orientation sensor which works much better than my previous mobile (n79). Even when i am lying down in a bed, the orientation sensor works perfectly. And as HTC says, another major sensor added to wildfire is, when you get a call, the phone automatically reduces the volume when you pick the phone up in your hands. Also, if you just invert the position of the phone, it stops the ringing tone. Another good sensor available is, when you are talking over phone, (with the phone close to your cheeks), the backlight automatically goes off. And it goes on at the instance you get it out of the talking position. On the whole, sensors really stand out in Wildfire


  • Camera Clarity: Again, as far as i have experimented, camera clarity has been quite good. HTC Wildfire comes with a 5 MP camera with autofocus. I will update this area after my friend bala experiments the camera features. The flash makes pictures taken at night also pretty clear.


  • Sync with Google Accounts: I would say Android is really a trademark google's approach for mobile phones as they have shown it with the amount of integration that can be done between your android phone and google account. You can sync everything from contacts and emails to even docs. Google latitude and buzz integration are pretty good too. Even with my slow speed gprs internet, i receive mails just like smses in my wildfire.


  • Context Aware Notifications: I learnt this during my schooling. When we right click somewhere in windows, we will get a pop up menu. But the contents of the menu will vary depending upon where you right click and hence it was called as a "Context Sensitive Menu". Similarly, the notifications in Android are all highly Context Aware (e.g. location information are always opened by google maps and not by the internal browser). And many helpful notifications to save battery power are also really good.


  • Friends Stream: Again this is one of the features that HTC is using in its marketing campaign for Wildfire. It is really a usefull application that connects you with your twitter, facebook and flikr friends. And yeah how can i forget to mention about the contact syncing done by wildfire. Since i had all the contacts in phone memory in my previous phone, i was planning to transfer it to my new one. Thats when i found that wildfire has already picked up many of the phone numbers of my friends from facebook and twitter. Wow! It saved atleast and hour to two of my time :-) And i don't need to update my contact book anymore, my phone does it for me.


  • Innovative Caller ID: Instead of just the boring caller name and caller photo, Wildfire shows the callers facebook status, birthday, etc. This works nicely even with my slow speed gprs connection (probably some caching is done somewhere!).


Cons


  • Battery Backup: Since the phone is almost always connected to internet (via gprs), battery power doesn't last for more than 24 hours. I feel this is okay for people like me who don't have trips often and get ample amount of time to charge it. Anyways, this definitely needs scope of improvement especially if HTC is going to market Wildfire as a business phone.


  • Heating Up: Almost all the gadgets have this problem these days. Wildfire gets heated up a bit too much while charging. Unlike my previous phone, it doesn't get heated up when using gprs/wifi extensively.



Overall, a really good Android phone to buy especially in a relatively expensive mobile phone market like India.

P.S.: Expect a few android from me apps soon ;-)

-Vignesh