Friday, January 20, 2012
Publishing Android applications - Part 4
Here is the detailed documentation on how to publish already developed application:
http://developer.android.com/guide/publishing/publishing.html
Before we move on for publishing the application, there are few things we need to do:
testing. testing:
Make sure you test your application on emulator thoroughly and then on the real device.
this article lists out some keyboard shortcuts to change the orientation of the device. This will help
test your application in different orientation. Creating virtual devices of different sizes and testing the application
on them will help find any presentation issues with your application.
Performance and SDK compatibility: make sure your application performs as expected and
there are no bottleneck in the speed. Apart from this, try to develop the application for older SDK versions
so that it can run on most of the Android devices. e.g. SDK 2.1 is currently installed on almost 50% of Android devices.
If you develop on later versions then your application will not be compatible and hence will not be installed on these many devices.
Getting ready for the publishing...
1. give required permissions to your application
<uses-permission android:name="android.permission.INTERNET"/>
2. choose right icon and name of the application
<application android:label="@string/my_app_name" android:icon="@drawable/my_icon">
3. increment version number in manifest file
...package="com.example" android:versionCode="1"
android:versionName="1.0"...
note that on every update, you need to increment the value of versionCode where as
versionName is your choosen name of the version.
4. SDK compatibility
make sure you set right values for android:minSdkVersion, android:targetSdkVersion and android:maxSdkVersion attributes.
5. export and sign your application and generate .apk file
go to File > Export
click on "Export Android Application"
now fill in all the options and generate the .apk file. make sure you store the .key file for later application update.
now navigate to http://market.android.com/publish and upload the application.
Monday, January 16, 2012
Login to your Google Account on Without Typing Anything
Logging in to your accounts using public computers may be at risk due to virus, key loggers or any other programs which may collect your account credentials and later compromise your account.
Today Google came up with the novel idea “allowing users to login using their trusted phones”.
Here is the solution:
Step 1: open https://accounts.google.com/sesame on the computer which you feel might be at risk.
opening the above link will show a QR code.

Step 2: make sure you have smart phone with QR code reader application (e.g. Google Goggle, Bakodo, Red Laser etc). Scan the bar code shown on your computer screen (from Step 1).
Step 3: you will be shown a URL to open and sign in with your google account (Gmail or iGoogle).
Step 4: within a few moments, Google will sign-in the page and your page on screen will redirected to either Gmail or iGoogle as per your selection in Step 3.
Step 5: now continue using your google account on the computer.
Step 6: After you are done your work on the computer, don’t forget to sign off manually.
All is fine so far and loved the creative way to reduce the risk of account take over. This is fantastic and a great way to avoid risk.
However I did not like “Step 6”, why? its because sign-up and sign-in are done differently and from different devices. Since Google has knowledge about both of these devices, so why can’t allow sign off using my device? what if I forgot to sign-off from computer, any way to do the same from my phone device which was used to sign-in? how about when user marks in his device for sign-off and the next action on google account (related to the session with the same QR code) on the computer logs off automatically?
This may be another checkpoint where there needs some improvements.
Google has solved its problem here however the same problem exists for other websites and for whole internet space. The internet needs it badly, to make surfing a better experience.
Hope Google still working on this to make it a general solution which whole industry could benefit.
Well done and Good Luck Google!!!
-a programmer’s opinion.
Thursday, January 5, 2012
Android: Creating Multi-Column Layout with ArrayAdapter
here are the steps:
Step 1. insert a simple list view which you would turn it to multi column.
file: main.xml
[xml]
<ListView android:id="@+id/mylist" android:layout_width="wrap_content" android:layout_height="wrap_content">
</ListView>
[/xml]
Step 2. create a row format which will be shown for each row in the list. (multi column view).
file: mylistrow.xml
[xml]
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:paddingTop="4dip"
android:paddingBottom="6dip"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:orientation="horizontal">
<TextView android:id="@+id/column1"
android:gravity=”left”
android:layout_width="50dip"
android:layout_height="wrap_content"/>
<TextView android:id="@+id/column2"
android:gravity=”center”
android:layout_width="70dip"
android:layout_height="wrap_content"
android:layout_weight="1"/>
<TextView android:id="@+id/column3"
android:gravity=”right”
android:layout_width="60dip"
android:layout_height="wrap_content"
android:layout_weight="1"/>
</LinearLayout>
[/xml]
notice the gravity field, which means how you would like to change the orientation of the text. The last two columns have layout weight 1 which means the extra space in the row will be evenly distributed to these columns in order to fill the space. you can read more about weight here.Step 3. using SimpleAdapter to configure the data binding to these columns
[java]
ListView list = (ListView) findViewById(R.id.mylist);
ArrayList<HashMap<String, String>> mylistData =
new ArrayList<HashMap<String, String>>();
String[] columnTags = new String[] {"col1", "col2", "col3"};
int[] columnIds = new int[] {R.id.column1, R.id.column2, R.id.column3};
for(int i=0; i<3; i++)
{
HashMap<String,String> map = new HashMap<String, String>();
//initialize row data
for(int j=0; j<3; j++)
{
map.put(columnTags[j], "row”+i+”col"+j);
}
mylistData.add(map);
}
SimpleAdapter arrayAdapter =
new SimpleAdapter(this, mylistData, R.layout.mylistrow,
columnTags , columnIds);
list.setAdapter(arrayAdapter);
[/java]
Here is how the list will look like:
row0col0 row0col1 row0col2 row1col0 row1col1 row1col2 row2col0 row2col1 row2col2
for more details on how to use advanced features of the listview, refer here.
Sunday, January 1, 2012
Wordpress: how to generate DocBook style posts
The site uses "DocBook XSL Stylesheets" tool to generate the contents and manage the revisions. As we all know that most of the blogging sites are based on WordPress. I have done my homework on how easy it is to convert the wordpress posts into revision based article.
sample screenshot:

Here is the code base which you can try out.
Note that all these code changes have to happen in your theme code.
1. functions.php
add below function to functions.php file.
[php]
<?php
function get_post_revision_info($postId) {
global $wpdb;
$sql = "("
. " SELECT ID, post_author, post_name, post_modified, post_parent, post_type"
. " FROM wp_posts"
. " WHERE post_parent =".$postId.""
. " AND post_type = \"revision\""
. " )"
. " UNION"
. " ("
. " SELECT ID, post_author, post_name, post_modified, post_parent, post_type"
. " FROM wp_posts"
. " WHERE id =".$postId.""
. " AND post_type = \"post\""
. " ) ORDER BY `ID` ASC";
$posts=$wpdb->get_results($sql);
$header="";
$lastrevision = "1";
$output="";
$postYear = date('Y'); ;
if ($posts)
{
$cnt = 1;
$output .= "<h3>Revision History</h3>";
$output .="<table>";
foreach ($posts as $post)
{
$lastrevision = $cnt;
$author = get_the_author_meta( 'display_name', $post->post_author);
$datetime = strtotime($post->post_modified);
$modified = date( 'm.d.Y', $datetime);
$rev = "Revision ".$cnt.".0";
$updated = "updated";
if($post->post_type == "post")
{
$updated = "created";
$postYear = date( 'Y', $post->post_modified ); //post created date
}
$output .="<tr>";
$output .="<td>".$rev."<td>"."<td> </td>";
$output .="<td>".$updated."<td>"."<td> </td>";
$output .="<td>".$modified."<td>"."<td> </td>";
$output .="<td>".$author."<td>"."<td> </td>";
$output .="</tr>";
$cnt++;
}
$output .="</table>";
}
else
{
$output .= "no revision history found.<br />";
$output = $sql;
}
$curYear = date('Y'); ;
$copyright = "Copyright © ".$postYear . (($postYear != $curYear) ? '-' . $curYear : ''). " ".get_the_author();
$header .= "Author ".get_the_author()."<br>";
$header .= "Current Version ".$lastrevision.".0"."<br>"; //1.0, 2.0...
$header .= $copyright."<br>";
$header .= date("m.d.Y")."<br>";
$footer = "<h3>Excerpts:</h3>";
$footer .= "<i>".get_the_excerpt()."</i><br/><br/>";
$footer .= "<h2>Article Details</h2>";
return "<h2>".$header."</h2><br/>".$output."<br/><br/>".$footer."<br/>";
}
[/php]
2. single.php
add below code (a call to post_revision_info) in single.php
[php]
<div class="entry-content">
<?php print get_post_revision_info(get_the_ID()); ?>
[/php]
This is my first version of the code. it may not generate the well-formed HTML code or may not suit to your theme.
so please change the code according to your need.
your comments will encourage me to come up with more articles on the related topic.