Friday, October 7, 2011

Simple Android Project


<?xml version="1.0" encoding="utf-8"?>
<LinearLayout android:id="@+id/linear1"
    android:layout_weight="1" android:orientation="vertical"
    android:layout_width="fill_parent" android:layout_height="fill_parent"
    android:background="#ffffffff" xmlns:android="">

    <LinearLayout android:id="@+id/linear2"
        android:orientation="vertical" android:layout_width="fill_parent"
        android:layout_height="wrap_content" xmlns:android="">

        <ImageView android:id="@+id/test_image" android:src="@drawable/header"
            android:layout_width="fill_parent" android:layout_height="fill_parent" />

    <GridView xmlns:android=""
        android:id="@+id/gridview" android:layout_width="wrap_content"
        android:layout_height="fill_parent" android:columnWidth="90dp"
        android:numColumns="2" android:verticalSpacing="5dp"
        android:horizontalSpacing="5dp" android:stretchMode="columnWidth"
        android:gravity="center" android:background="@layout/black_white_gradient" />



import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.view.Window;
import android.widget.AdapterView;
import android.widget.GridView;
import android.widget.Toast;
import android.widget.AdapterView.OnItemClickListener;

public class Home extends Activity {
    /** Called when the activity is first created. */
    public void onCreate(Bundle savedInstanceState) {

        GridView gridview = (GridView) findViewById(;
        gridview.setAdapter(new ImageAdapter(this));


        gridview.setOnItemClickListener(new OnItemClickListener() {
            public void onItemClick(AdapterView<?> parent, View v,
                    int position, long id) {

                Intent myIntent = null;
                String positionString = "";
                switch (position) {
                case 0:
                    // FlightInfo
                    positionString = "Flight Info";
                    myIntent = new Intent(Home.this, SearchFlights.class);
                // case 1:
                // // AirportInfo
                // positionString = "Airport Info";
                // myIntent = new Intent(Home.this, SearchFlights.class);
                // startActivity(myIntent);
                // break;

                Toast.makeText(Home.this, "" + positionString,


import android.content.Context;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.GridView;
import android.widget.ImageView;

public class ImageAdapter extends BaseAdapter {

    private Context mContext;

    public ImageAdapter(Context c) {
        mContext = c;

    public int getCount() {
        return mThumbIds.length;

    public Object getItem(int position) {
        return null;

    public long getItemId(int position) {
        return 0;

    // create a new ImageView for each item referenced by the Adapter
    public View getView(int position, View convertView, ViewGroup parent) {
        ImageView imageView;
        if (convertView == null) { // if it's not recycled, initialize some
                                    // attributes
            imageView = new ImageView(mContext);
            imageView.setLayoutParams(new GridView.LayoutParams(126, 126));
            imageView.setPadding(8, 8, 8, 8);
        } else {
            imageView = (ImageView) convertView;

        return imageView;

    // references to our images
    private Integer[] mThumbIds = { R.drawable.flight_info,
            R.drawable.flight_schedule, R.drawable.check_in,
            R.drawable.check_out };


<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android=""


import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;

import com.serendibit.flightstats.webservice.WebserviceClient;

import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.TextView;

public class ListViewByFlight extends ListActivity {

    private ProgressDialog m_ProgressDialog = null;
    private ArrayList<FlightVO> m_flights = null;
    private FlightsAdapter m_adapter;
    private Runnable viewFlights;

    Intent myIntent = null;

    private String strAirLine, strFlightNo, strFlightFromDate, strFlightToDate;

    public static SearchByFlightNo byFlightNo;

    public void onCreate(Bundle savedInstanceState) {

        strAirLine = byFlightNo.getStrAirLine();
        strFlightNo = byFlightNo.getStrFlightNo();
        strFlightFromDate = byFlightNo.getStrFlightFromDate();
        strFlightToDate = byFlightNo.getStrFlightToDate();

        m_flights = new ArrayList<FlightVO>();
        this.m_adapter = new FlightsAdapter(this, R.layout.row, m_flights);

        viewFlights = new Runnable() {
            public void run() {
        Thread thread = new Thread(null, viewFlights, "MagentoBackground");
        m_ProgressDialog =,
                "Please wait...", "Retrieving data ...", true);

    private Runnable returnRes = new Runnable() {

        public void run() {
            if (m_flights != null && m_flights.size() > 0) {
                for (int i = 0; i < m_flights.size(); i++)

    private void getFlights() {
        try {
            int count = 0;
            int objLength;
            // Call flight info web service
            WebserviceClient client = new WebserviceClient();

            String resultXML = client.getFlightInfoByFlightNo(strAirLine,
                    strFlightNo, strFlightFromDate, strFlightToDate);

            Object obj = new Parser().parse(resultXML);

            if (obj instanceof String) {
                // SearchByFlightNo.error =
                // "Incorrect parameter or Connection error";
                myIntent = new Intent(ListViewByFlight.this,
            } else if (obj instanceof List) {

                m_flights = new ArrayList<FlightVO>();
                FlightVO o1;
                List<HashMap<String, String>> fillMaps = new ArrayList<HashMap<String, String>>();
                for (count = 0; count < ((List<FlightVO>) obj).size(); count++) {
                    o1 = new FlightVO();
                    o1.setFlightNumber(((List<FlightVO>) obj).get(count)
                            + ((List<FlightVO>) obj).get(count)
                    o1.setDepartureDate(((List<FlightVO>) obj).get(count)
                            .getDepartureDate().substring(0, 10)
                            + " "
                            + ((List<FlightVO>) obj).get(count)
                                    .getDepartureDate().substring(11, 16));
                    o1.setFlyRoot("from ("
                            + ((List<FlightVO>) obj).get(count).getOrigin()
                            + ") to "
                            + "("
                            + ((List<FlightVO>) obj).get(count).getDestination()
                                    .getAirportCode() + ")");
            Log.i("ARRAY", "" + m_flights.size());
        } catch (Exception e) {
            Log.e("BACKGROUND_PROC", e.getMessage());

    private class FlightsAdapter extends ArrayAdapter<FlightVO> {

        private ArrayList<FlightVO> items;

        public FlightsAdapter(Context context, int textViewResourceId,
                ArrayList<FlightVO> items) {
            super(context, textViewResourceId, items);
            this.items = items;

        public View getView(int position, View convertView, ViewGroup parent) {
            View v = convertView;
            if (v == null) {
                LayoutInflater vi = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);
                v = vi.inflate(R.layout.row, null);

            FlightVO o = items.get(position);
            if (o != null) {
                TextView tvFlightNo = (TextView) v
                TextView tvDateTime = (TextView) v.findViewById(;
                if (tvFlightNo != null) {
                    tvFlightNo.setText("Flight: " + o.getFlightNumber());
                if (tvDateTime != null) {
                    tvDateTime.setText("Fly Date: "
                            + o.getDepartureDate()
                            + "\nRoot: "
                            + o.getFlyRoot());
            return v;



import org.apache.http.HttpResponse;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.DefaultHttpClient;

import android.util.Log;

public class WebserviceClient {

    String URLbase = "";

    private String call(String url) {
        Log.i("URL :", url);
        String content = null;
        HttpClient mClient = new DefaultHttpClient();
        HttpGet get = new HttpGet(url);
        try {
            HttpResponse res = mClient.execute(get);

            InputStream is = res.getEntity().getContent();
            BufferedReader rd = new BufferedReader(new InputStreamReader(is));
            String line;
            StringBuffer response = new StringBuffer();
            while ((line = rd.readLine()) != null) {

            content = response.toString();

            System.out.println("content :" + content);
        } catch (Exception e) {
        return content;

    public String getFlightInfoByFlightNo(String airlineCode, String flightNo,
            String fromDate, String toDate) {
        String url = URLbase
                + "&info.specificationFlights[0].airline.airlineCode="
                + airlineCode + "&info.specificationFlights[0].flightNumber="
                + flightNo
                + "&info.specificationFlights[0].searchCodeshares=true"
                + "&info.specificationDateRange.departureDateTimeMin="
                + fromDate + "T00:00"
                + "&info.specificationDateRange.departureDateTimeMax=" + toDate
                + "T23:59";

        return call(url);

    public String getFlightInfoByDestination(String from, String to,
            String fromDate, String toDate) {

        String url = URLbase
                + "&info.specificationDepartures[0].airport.airportCode="
                + from + "&info.specificationArrivals[0].airport.airportCode="
                + to + "&info.specificationDateRange.departureDateTimeMin="
                + fromDate + "T00:00"
                + "&info.specificationDateRange.departureDateTimeMax=" + toDate
                + "T23:59"
                + "&info.flightHistoryGetRecordsRequestedData.codeshares=true";

        return call(url);

Thursday, October 6, 2011

How to develop games on Android

One of the biggest markets in smart phones is games.  I am sure most of us would have played around with “Angry Birds” .  In this games tutorial you will learn different methods of developing  “Android Games”
At the end of the post is the video on how the code below works and the zip of all the source files used in this example.
Android Games can be developed in 3 ways
1)   Developing games using Android/Java libraries
2)   Developing games using External Libraries like OpenGL
3)   Developing games by porting existing c-game (pc game) to android.
Before getting started I assume that the reader is familiar with the basics of android programming like using activity, creating views, handling motion/touch events etc.
Also, apart from android sdk and eclipse some other tools are required for the game development. Details of the tools required, how to configure and use them will be explained as and when required. I will recommend to check out our last posts

Before starting with the game development lets understand the term “Main Loop”.

Main Loop:

Not just android any game written on any language consists of a set of custom views which are constantly refreshed/re-painted/re-drawn.  In some games we need to update the screen or re-draw the view elements at regular intervals.
E.g. consider two games (i) Android Snake Game (ii) Android Number Game for kids as shown.

In android snake game the snake has to move irrespective of the user input. Here the screen has to regularly re-drawn/re-painted to create the motion effect of the snake. Where as in the Number  game we need not redraw the screen now and then. The screen must be updated/re-drawn only when the user clicks/touches the screen.
So in the snake game we must re-draw the screen at regular intervals say 1sec in order to do that we make use of threads, while loops etc. and create a refresh/re-draw handler that updates screen regularly. This refresh/re-draw loop created is called “Main Loop”.
Note: It’s not that all games require Main Loop it depends on the game you are building.
In order to understand refresh handler we shall build a
“Ball Game” . In this game the user gets some points when ever he clicks on the ball, when the ball in the circle of the same color,  here I’m neither going to explain the score logic nor the UI events all that I’m going to focus on is the game view and refresh handler.

Before dicing into this code, I will recommend going through

Creating a Custom Widget in android

public class ballview extends View{
/* Refer to the above link for more information on using View class */
int width,height;
private Paint circlePaint,circlePaint1,circlePaint2,circlePaint3;
private Drawable[] mDrawable;
/* This will start your Refresh Handler  */
private RefreshHandler mRedrawHandler=new RefreshHandler();
private int[] posx,posy;
/* Create different constructors for your view class */
public ballview(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
/* Create different constructors for your view class */
public ballview(Context context, AttributeSet attrs) {
super(context, attrs);
/* Create different constructors for your view class */
public ballview(Context context) {
Initialize all the variables. The image files can be downloaded from the zip file attached to the post.
Here the random function is used to select random position on the screen while the balls are falling down from the top

protected void initCalview()
mDrawable=new Drawable[4];
posx=new int[16];
posy=new int[16];
mDrawable[0] = this.getResources().getDrawable(R.drawable.bluen);
mDrawable[1] = this.getResources().getDrawable(R.drawable.greenn);
mDrawable[2] = this.getResources().getDrawable(R.drawable.redn);
mDrawable[3] = this.getResources().getDrawable(R.drawable.yellown);
for(int i=0;i<16;i++)
posx[i]=(int)(Math.random() * (250- 1 + 1) ) + 1;
posy[i]=(int)(Math.random() * (250 – 1 + 1) ) + 1;
More information on onMeasure method  can be found on Creating a Custom Widget in android
protected void onMeasure(int widthSpec, int heightSpec)
int specWidth=MeasureSpec.getSize(widthSpec);
int specHeight=MeasureSpec.getSize(heightSpec);
public void set_pos()
int x;
int px=this.getMeasuredWidth();
int py=this.getMeasuredHeight();
this.layout(width/2, 0, 0, 0);
/* Initialize different paint objects to draw circles of different colors */
circlePaint=new Paint(Paint.ANTI_ALIAS_FLAG);
circlePaint1=new Paint(Paint.ANTI_ALIAS_FLAG);
circlePaint2=new Paint(Paint.ANTI_ALIAS_FLAG);
circlePaint3=new Paint(Paint.ANTI_ALIAS_FLAG);
protected void onDraw(Canvas canvas)
int rad=Math.min(width/4, height/4);
/* Paint the circle objects on the canvas */
canvas.drawCircle(width/4,height/4, rad, circlePaint);
canvas.drawCircle(width-rad,height-rad, rad, circlePaint1);
canvas.drawCircle(width-rad,height/4,rad/2, circlePaint2);
canvas.drawCircle(width/4,height-rad, rad/2, circlePaint3);
//int i=0;
for(int i=0;i<8;i++)
/* Refresh Handler re-draws the view and at this point waits/stops for a sec and after the
waiting period it again redraws the view and the process repeats.
Thus your screen gets updated regularly and you feel as if balls are falling from the top*/
RefreshHandler class : This class updates the view every sec. It increments the Y-axis value and selects the
random X-axis position every second and repaints the screen this creates a feel as if  balls are falling from the top
class RefreshHandler extends Handler {
public void handleMessage(Message msg) {
for(int i=0;i<8;i++)
posx[i]=(int)(Math.random() * (250- 1 + 1) ) + 1;
public void sleep(long delayMillis) {
sendMessageDelayed(obtainMessage(0), delayMillis);
/* Now Create an Activity and Display the View created above */
public class main extends Activity {
public void onCreate(Bundle savedInstanceState) {
LinearLayout linear=new LinearLayout(this);
ballview ball= new ballview(this);

Parsing JSON Results in Android

One of the common requirements for an android programmer is how to parse incoming JSON results from another web service or application into android. JSON is a data interchange format, and serves the same purpose as that of XML. XML is slowly being replaced by JSON because it’s easy to parse, light weight, and efficient too. We had talked about SOAP vs JSON earlier and not going to go into details again.
Let us focus on how to parse JSON results in Android.
We can parse JSON by 2 methods
i)  Using JSONObject and JSONTokener classes provided by Android SDK.
ii) Using external libraries. E.g GSON, Jackson etc.
(for more details refer
Let’s consider JSON data of the form:
“name”: “myName”,
“message”: ["myMessage1","myMessage2"],
“place”: “myPlace”,
“date”:  ”thisDate”

Parsing JSON data using JSONTokener

class main extends Activity {
public void onCreate(Bundle savedInstanceState) {
try {
/* Inflate TextView from the layout */
TextView tv = (TextView)findViewById(;
/* JSON data considered as an example. Generally this data is obtained
from a web service.*/
String json = “{”
+ “  \”name\”: \”myName\”, ”
+ “  \”message\”: [\"myMessage1\",\"myMessage2\"],”
+ “  \”place\”: \”myPlace\”, ”
+ “  \”date\”: \”thisDate\” ”
+ “}”;
/* Create a JSON object and parse the required values */
JSONObject object = (JSONObject) new JSONTokener(json).nextValue();
String name = object.getString(“name”);
String place = object.getString(“place”);
String date = object.getString(“date”);
JSONArray message = object.getJSONArray(“message”);
tv.setText(“Name: “+ name +”\n\n”);
tv.append(“Place: “+ place +”\n\n”);
tv.append(“Date: “+ date +”\n\n”);
for(int i=0;i<message.length();i++)
tv.append(“Message: “+ message.getString(i) +”\n\n”);
} catch (JSONException e) {e.printStackTrace();}
catch(Exception ex){ex.printStackTrace();}

Tuesday, May 31, 2011

Installing iOS SDK and Xcode on Windows 7

Apple has been adamantly refusing to create an iPhone SDK support for Windows-based machines. Luckily, there is a work around to be able to fully run the iOS SDK and Xcode support for most all PC's.

The following steps involve installing a virtual machine on your PC, updating the virtual machine to 10.6.5, then running the machine and downloading and installing the iOS SDK and Xcode on to the virtual machine.

There are other ways to install OS X on your machine but they involve creating a new partition and installing the Operating System directly to your hard drive. Those ways are much harder and have more confusing steps that could potentially damage your computer. This method is easier and safer to use.

The process will take 3-4 hours, but most of the time is consumed by large downloads. There's no software to buy or developer fees to pay.


1. Follow the steps here to download and install a virtualized version of OS X on your PC.

2. Make sure you have updated to the latest version of OS X, Xcode won't work with older versions of OS X.

3. Once you've updated, in the virtual machine, go to the the Apple Developer page. Create a new account. Then go to the downloads page.

4. Scroll down to the downloads. Click on Xcode and iOS SDK. The download will likely take around 1 hour but depending on your connection, it could take longer.

5. Once the download is finished, double-click on the .dmg file, then click on Xcode and iPhone SDK.

6. Follow the on-screen directions then wait for the installation to finish.

7. Once it's done, you will NOT find the iPhone SDK in your dock. You will need to click on your hard drive (the icon at the top right of your screen). Then Click on Developer, then on Applications.

8. You will now see an icon for Xcode, click it and you can start coding applications.

If the icons don't show up, you may not have enough virtual hard drive space to fit the program. Make sure you have at least 10 GB of free memory in the virtual machine. Restarting your machine may be another way to make the icon appear.

Now you can start coding an app for your personal use. You will be able to test your app on the iPhone simulator in Xcode but you will not be able to add the app to your own device. To add an app that you've created to your device, see the two options below.

Option 1: If you want to submit your app to the App Store, you will need to pay Apple $100 for an official Developers Certificate. This will allow you to sell your app to a very large audience but Apple does place large restrictions on its approval of submissions.

Option 2: If you don't want to pay the $100, you can develop your application for Cydia (similar to the App Store). This option will also allow you to place your app on to your iPhone, not just only in the Xcode simulator.

Cydia is the unofficial App Store for users who have jailbroken and want to sell/share their apps. There are almost no restrictions as to what kind of apps that can be added to Cydia.

To develop for Cydia, you will need to have your device jailbroken (How do I jailbreak?) and before you start developing your app, you will need to follow these steps to create an alternate Certificate.

How to Virtualize OS X on Windows 7

With newer computers, it is now possible to run two Operating Systems at once, one running inside of another. This guide will describe the process of running Mac OS X 10.6.2 on a machine already running Windows 7 or Vista. This process will likely work on Windows XP but has not been tested.

This will enable you to run all programs for the Mac Operating System on your PC.


A laptop or desktop computer that supports virtualization (most newer computers do).
At least 1 GB of RAM (the more, the better).
VMware Player (virtualization software, you will need to create a free account).
Snow Leopard 10.6.2 (Operating System). (extra files for installation).


Before you start, make sure that you have enabled Virtualization in the BIOS of your computer. This is usually disabled by default by computer manufacturers.

1. Unzip Snowy_VM and navigate to the following file: Snowy_VM\Snowy_VM\Mac OS X Server 10.6 (experimental).vmwarevm\Mac OS X Server 10.6 (experimental).vmx.

Double click this file, it will open VMware Player.

2. You should see a black screen now. On the blue VMware bar, press Virtual Machine > Virtual Machine Settings > CD/DVD > Settings.

3. On the left, click Use ISO image file, then click Browse.

4. Now select the Snow Leopard 10.6.2 iso file downloaded from the torrent above. Press OK to close the box and return to the black screen.

5.  On the blue VMware bar, press Virtual Machine > Send Ctrl + Alt + Del. The machine will now boot up with the iso file. Once the text appears, press F8 on your keyboard.

This is the screen where you can enter in boot flags. Depending on your computer, you may have a different flag from another computer. Many computers have worked without boot flag, so try that first (just press Enter).

A gray screen will appear. In a few moments, a language box will appear. If it does, go down to step 6.

If this screen doesn't appear for 10 minutes you will need to enter a boot flag. Go to the blue VMware bar, press Virtual Machine > Power > Reset. Press F8 at the same screen again. Now enter -x -v busratio=20 cpus=1 arch=i386 -x32. If you get to the language screen, move to step 6.

If you still don't get the language screen, press Virtual Machine > Power > Reset. Press F8 at the same screen again. Now enter -v at the boot screen. This will allow you to figure out exactly where the problem is computer is freezing. You can then Google your error.

6. Follow the on-screen steps until you reach Install Summary.

7. Here, click on Customize.

8. Select Mac OS_X_10.6.2. Under Kernels, select Legacy_kernel_10.2.0. Under Graphic_Drivers, select GraphicEnabler. Click Done.Click Install. This process should take around 10-15 minutes.

9. Once it's done, the count down from Step 5 will appear, press F8. Then on the blue VMware bar, press Virtual Machine > Virtual Machine Settings > CD/DVD > Settings.

10. Now go to Snowy_VM\Snowy_VM\darwin_snow.iso.

11. On the blue VMware bar, press Virtual Machine > Send Ctrl + Alt + Del.

12. Now wait until OS X 10.6.2 boots up! Just follow the simple setup instructions to create your user account and you'll be on OS X Snow Leopard. If the boot time is extremely long, go to the blue VMware bar, press Virtual Machine > Power > Power off. Then double click the name of your machine in the left column to start it up again.

13. When shutting down the machine, use the X in the top right corner or use the blue VMware bar, press Virtual Machine > Power > Power off.

14. Now to update to the latest OS X version, follow steps 2-4 on this guide:

15. To enable an internet connection on the OS X machine, see this guide:

16. To enable sound and get a full-screen native resolution working see this guide: 

Follow this video tutorial