Full Kitkat experience on Nexus 4

November 28th, 2013 1 comment

After a big delay, Google has finally started to push Kitkat update to Nexus 4. Now after reading so much about the cool updates, mainly the full screen wallpaper, translucent status bar, etc. it was very disappointing to not get all these features after the upgrade. My Nexus 4 looked exactly the same.

kitkat_nexus_4_default_home

Finally, a quick Google search came to my rescue and I found that our friends at Android Police have already found a solution to this. It was noticed that the Nexus 4 update contains all the required code for these features, just that they are not enabled by default. A small package installation fills up this gap and gives you the stunning look of Kitkat.

The custom package can be downloaded from any one of the Android Police’s mirrors. You can download it directly on your phone or download it on PC and then transfer it to your phone.

Once the package is downloaded on phone, go to your phone’s Settings -> Security and check the Unknown Sources option. This is required to install any application from outside of Play Store. After this setting is turned ON, tap on the downloaded package to install it.

Once installed, simply tap on the Home button and you will be presented with an option to select the launcher application (since we just installed a new launcher along with the default one). Select Google Search Launcher and tap on Always to make it a permanent option.kitkat_nexus_4_select_launcher

 

BANG!! Your home screen should now be completely transformed and look similar to this.

kitkat_nexus_4_new_home

Along with this change, you will notice that Google Now has moved to its new home, the left home screen. This also means that your home screens on left moves to right and you might has to do some work to readjust your app icons there. But the effort is worth.

Here are some more screens after installing the package.

kitkat_nexus_4_app_screen

kitkat_nexus_4_google_now

jqGrid: Custom Pagination

July 22nd, 2012 6 comments

Being a big fan of jqGrid, I implement it in almost all my projects where the conventional listing is required. Our wonderful UI team then takes it further by beautifying it as per the design needs. Every portion of jqGrid is themeble to such an extent that we never needed to make any extra efforts to make it look better. But all these years, there’s only one thing that I found really ugly (!) in jqGrid – its pagination bar. It never goes well with the custom design which mostly expects a cool looking paging style instead of the drop-down and the text box for pagination.

The need to change this finally came up very prominently in one of my current projects and I started off as usual by Google’ing for help. Surprising, I got very less help in regards to changing the complete look and feel of the pagination. Most of them including the official jqGrid wiki page for pagination only talked about changing the display format of current components on pagination section. Finally, one of the posts on Stackoverflow talked about replacing the current pagination in DOM with a new one and linking it to grid. I decided to take that approach which would also give a complete freedom of implementing my own custom pagination logic for jqGrid.

I used loadComplete callback of jqGrid to remove default pagination and replaced it with my custom HTML code created using jQuery.

To begin with, add the following in your loadComplete to remove default pagination

jQuery("#pager').html('');

Next, get the total page count and call your custom pagination function to build the pagination list whatever way you want

var pageCount = Math.ceil(totalData / $("#mygrid').getGridParam("rowNum"));

if (pageCount > 1) {
var custom_pager = BuildGroupedPagination(parseInt(this.p.page), pageCount, 'mygrid');
jQuery("#pager').append(custom_pager);
}

The function BuildGroupedPagination() now has the responsibility to creating the HTML for pagination, attaching events to each page number and returning the whole structure back to be added in place of existing pagination that we removed above. Following is my implementation of BuildGroupedPagination(). You can use the same or write your own if your application demands something else.

function BuildGroupedPagination(current_page, total_pages, gridId)
{
    var strPages = "";
    var intMaxPages = 0;
    var intMinPages = 0;
    var intPaginI = 0;
    var li;
    var link;
    
    var myPageRefresh = function(e) {
        var newPage = $(e.target).text();
        $("#"+gridId).trigger("reloadGrid",[{page:newPage}]);
        e.preventDefault();
    };

    var custom_pager = $('<ul>', {id: 'custom_pager', class: 'clearfix'});

	if (total_pages > 10)
	{
		if (total_pages > 3)
		{
			intMaxPages = 3;
		}
		else
		{
			intMaxPages = total_pages;
		} 

		for (intPaginI = 1; intPaginI <= intMaxPages; intPaginI++)
		{
            link = jQuery('<a>', {href:'#', click:myPageRefresh});
            link.text(String(intPaginI));

			if (intPaginI == current_page)
			{
               current = 'current_page';
			}
			else
			{
                current = '';
			}
            
            li = jQuery('<li>', {id: current}).append(link);

            jQuery(custom_pager).append(li);
		} 

		if (total_pages > 3)
		{
			if ((current_page > 1) && (current_page < total_pages))
			{
				if (current_page > 5)
				{
                    li = jQuery('<li>', {'class': 'pageMiddle'}).append('...');
                    jQuery(custom_pager).append(li);
				}

				if (current_page > 4)
				{
					intMinPages = current_page;
				}
				else
				{
					intMinPages = 5;
				} 

				if (current_page < total_pages - 4)
				{
					intMaxPages = current_page;
				}
				else
				{
					intMaxPages = total_pages - 4;
				} 

				for (intPaginI = intMinPages - 1 ; intPaginI <= intMaxPages + 1; intPaginI++)
				{
                    link = jQuery('<a>', {href:'#', click:myPageRefresh});
                    link.text(String(intPaginI));
                    
					if (intPaginI == current_page)
					{
						current = 'current_page';
					}
					else
					{
						current = '';
					}
                    
                    li = jQuery('<li>', {id: current}).append(link);

                    jQuery(custom_pager).append(li);
				}

				if (current_page < total_pages - 4)
				{
                    li = jQuery('<li>', {'class': 'pageMiddle'}).append('...');
                    jQuery(custom_pager).append(li);
				}
			}
			else
			{
				li = jQuery('<li>', {'class': 'pageMiddle'}).append('...');
                jQuery(custom_pager).append(li);
			} 

			for (intPaginI = total_pages - 2; intPaginI <= total_pages; intPaginI++) {
                link = jQuery('<a>', {href:'#', click:myPageRefresh});
                link.text(String(intPaginI));
                
				if (intPaginI == current_page) {
					current = 'current_page';
				}
				else {
					current = '';
				}
                
                 li = jQuery('<li>', {id: current}).append(link);

                jQuery(custom_pager).append(li);
			}
		}
	}
	else
	{
		for (intPaginI = 1; intPaginI <= total_pages; intPaginI++)
		{
            link = jQuery('<a>', {href:'#', click:myPageRefresh});
            link.text(String(intPaginI));
            
			if (intPaginI == current_page)
			{
                current = 'current_page';
			}
			else
			{
                current = '';
			}
            
             li = jQuery('<li>', {id: current}).append(link);

            jQuery(custom_pager).append(li);
		}
	}
	return custom_pager;
}

The above logic is based on the code provided at Shawson’s blog. A big thanks to him for saving my few hours of coding :).

Now, with the pagination logic in place, you can write your own CSS to match your theme/layout. Here’s how it look in my case

jqGrid with custom pagination

I would love to see your comments if you know the better approach for doing the same or any ways to improve the above implementation.

PHP, Suhosin and POST data

January 9th, 2012 1 comment

Last week one of my clients reported an issue showing some notices spilled by the application on their development and QA servers. After some regular debugging process, we noticed that the application is not receiving the complete POST data.

Solution was simple, open php.ini, check and increase the value for post_max_size. BANG!!! No change (ofcourse apache was restarted after change in ini). Some more time was spent debugging various things. Even the stupidest thing like whether browser is sending full data to server was also checked. But nothing helped. We again started scanning phpinfo for some help when suddenly we noticed that the servers were having Suhosin patch installed and active (suhosin.ini was a part of additional .ini files).

Suhosin is an advanced protection system for PHP installations. It was designed to protect servers and users from known and unknown flaws in PHP applications and the PHP core.

 

We started scanning phpinfo for Suhosin specific settings … EUREKA … we found the following -

suhosin.request.max_vars = 200
suhosin.post.max_vars = 200

 

Suhosin controls the number of variables that can be passed to a PHP script no matter what you set for post size in php.ini. The default value of this setting is 200 which means your PHP script will only see the first 200 values in $_POST array. All other data is silently truncated. We got this value increased to the one we needed for our script and everything was back to normal.

I spent quite a long time in finding and solving this issue and thus decided to quickly blog about this. Hope this tip will help someone save their quality time.

P.S.: Suhosin has lot of other configurations that may affect your scripts in some way. So, if you get into such a situation where everything looks normal in php.ini, look for Suhosin and its settings. You may find the solution to your problem just like I did.

Tags: , ,

Multipart posting with Apache Benchmark

March 21st, 2011 3 comments

Last week I wanted to load test an upload functionality created for one of the projects. The testing team was busy with other stuff so I decided to do it on my own. Being a hardcore programmer and someone who has never used any of the regular testing tools (read M$ Window$ based tools) I had the only option of using Apache Benchmark on my Ubuntu 10.10

Since I had already used ab (the Apache Benchmark command name), I was pretty confident that within few minutes I will be done. But multipart form posting wasn’t as straightforward as I had thought. My initial assumption was to provide a file path to -p option of ab and it would handle the stuff required for multipart posting. Unfortunately that wasn’t the case. I realized that I had to provide a file name but it should contain the complete information about the data to be posted. In other words, I had to manage the boundary required for multipart posting.

After some research and this small but important tip, I managed to prepare the POST data in the required format along with the correct Content-type required by Apache Benchmark. The final command looked like

ab -n 10 -c 2 -C PHPSESSID=rk53j7gsrmaiuc3gvo86ipltr1 -p /var/www/post_data.txt -T "multipart/form-data; boundary=1234567890" http://my-domain.com/upload.php

Following is the breakdown of options provided to the command –

I provided the cookie information (option -C ) along with the command since my upload script checks for authentication.
-p allows me to provide a file name which contains the complete information about the data to be POSTed along with multipart boundaries.
-T is for Content-type header. This is where I also tell ab about the boundary in my POST data along with the standard multipart/form-data content type.
And then finally the URL of where all the data has to be posted.

The contents of the post_data.txt file are

--1234567890
Content-Disposition: form-data; name="ID"

3
--1234567890
Content-Disposition: form-data; name="videofile"; filename="ab1_pod.avi"
Content-Type: video/x-msvideo

[base64 encoded file content here]
--1234567890--

Remember that the format of the file should be exactly the same (your boundary label can be different than mine though). Even if you miss a single new line or add an extra new line somewhere then you won’t get the expected results.

Finally to base64 encode the file to be posted, you can simply use PHP code as follows and paste the content in the above placeholder.

echo base64_encode(file_get_contents('/home/aditya/Videos/my_video.avi'));

That’s it. Happy testing.
As always, comments and suggestions are most welcome.

gnuNify 2010 – My Experience

March 17th, 2010 No comments

Well, lot of my speaker friends have written about their experience in just concluded gnuNify 2010. You can read about them here, here, here and here as well. More or less I also share the same views. So I will follow the DRY principle in this case.

I am writing this post just for the records that I attended gnuNify 2010 as a speaker and delivered sessions on two very important topics in web development.

Abbas and me took some photos of the event in our free time. I have uploaded them on Flick. Do check them. And feel free to tag yourself if you find your pretty face ;) somewhere in any of the photos.

Finally, a big thanks to Mr. Harshad Gune and his whole team at SICSR for organizing such a nice event. It was great to be there with you all. See you all at gnuNify 2011 :)