Sunday 23 December 2012

Open a new Activity on Receiving the notification in Android

Hello Droid Guys,

In this tutorial , I am going to explain how to open a new activity class
whenever a push notification comes on your device.

Step 1. For this first of all follow Android Goggle Cloud Messaging  . 
            In this blog I already explain how to register your application for GCM,
            Obtaining the sender id and getting the registration id from GCM server.


step 2. Once you complete the step-1 then inside your GCMIntentService.java class add
            following code.
      @Override  
      protected void onMessage(Context context, Intent arg1) {  
           Log.i(TAG, "new message= ");  
            String message = "success on server";  
         //  displayMessage(context, message);  
          // notifies user  
          generateNotification(context, message);  
      }  


Now,

    /**  
    * Issues a notification to inform the user that server has sent a message.  
    */  
   private static void generateNotification(Context context, String message) {  
     int icon = R.drawable.ic_launcher;  
     long when = System.currentTimeMillis();  
     NotificationManager notificationManager = (NotificationManager)  
         context.getSystemService(Context.NOTIFICATION_SERVICE);  
     Notification notification = new Notification(icon, message, when);  
     String title = context.getString(R.string.app_name);  
     Intent notificationIntent = new Intent(context, Messenger.class);  
     notificationIntent.putExtra("MESSAGE",message);  
     notificationIntent.putExtra("ISNOTIFICATION",true);  
     // set intent so it does not start a new activity  
     notificationIntent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP |  
         Intent.FLAG_ACTIVITY_SINGLE_TOP | Intent.FLAG_ACTIVITY_NEW_TASK);  
     PendingIntent intent =  
         PendingIntent.getActivity(context, 0, notificationIntent, 0);  
     notification.setLatestEventInfo(context, title, message, intent);  
     notification.flags |= Notification.FLAG_AUTO_CANCEL;  
     notificationManager.notify(0, notification);  
   }  



This , will helps you to open a new class whenever apush notification comes.
On tapping the Notification from notification bar.

Enjoy Coding... :)
Cheers :)

Also see this link for help
      1. Google Cloud Messaging 

Android Goggle Cloud Messaging | GCM | Android push notification


Hello Droid Guys,

This tutorial helps you to implement “Google Cloud Messaging for Android (GCM)"  and
sending "Android Push Notification" using GCM.
 According to Google, “Google Cloud Messaging for Android (GCM)" is a service which
 helps developer in sending data from server to there "Android Application" whenever
 there is new data added on server. Also , No need to request server after every time 
 period(the timely fashion which we mostly did to fetch updated data from server after a
 fixed time period for e,g after every 6hrs,or a day).
1. How it works ?
       1. Android device sends a "sender id" and "application id" to GCM server for 
           registration.
       2. After Successfully registration on server, the GCM server generate a 
           "Registration id" and returns it.
       3. After receiving this "registration id" the device send this "registration id "
           to our server (i.e. my mysql server).
       4. Our server store this "registration id" into database for later usage.



 Registering Your Application for “Google Cloud Messaging for Android (GCM)":

  Step-1. Goto Here and create a new project. (If you haven’t created already 
               otherwise it will take you to dashboard).

   
  
  Step-2. Click on create project and check your browser url, It will change some thing
                like:
               " https://code.google.com/apis/console/#project:4815162342 "
           
               
                Note: This Id will be used by the Android Device while Registering for Push Notification.

Step-3.   Choose Service tab from the left side menu on the web page. and turn on 
                    “ Google Cloud Messaging for Android “
             
android google cloud messaging example


Step-4. Go to API Access tab from the left menu of web pagee and press Create new
                  Server key and note down the generated key.

android google cloud messaging example



Creating Andrid application for GCM:

Note: Before starting to create android application , first update your ADT plugin to 20.
1. Go to window => android Sdk => extras=> choose Google Cloud Messaging for Android Library.

android push notification example
     
Now Start Creating Android application project and remember to add gcm .jar inside your project lib folder.
You can easily find this gcm.jar inside your  android_sdk/extras/google/gcm  after updating your ADT and 
SDk.
Now place following file inside your project
1.PushAndroidActivity.java
 package com.mukesh.gcm;  
 import static com.mukesh.gcm.CommonUtilities.SENDER_ID;  
 import android.app.Activity;  
 import android.os.Bundle;  
 import android.util.Log;  
 import android.widget.TextView;  
 import com.google.android.gcm.GCMRegistrar;  
 public class PushAndroidActivity extends Activity {  
      private String TAG = "** pushAndroidActivity **";  
      private TextView mDisplay;  
      @Override  
      public void onCreate(Bundle savedInstanceState) {  
           super.onCreate(savedInstanceState);  
           checkNotNull(SENDER_ID, "SENDER_ID");  
           GCMRegistrar.checkDevice(this);  
           GCMRegistrar.checkManifest(this);  
           setContentView(R.layout.main);  
           mDisplay = (TextView) findViewById(R.id.display);  
           final String regId = GCMRegistrar.getRegistrationId(this);  
           Log.i(TAG, "registration id ===== " + regId);  
           if (regId.equals("")) {  
                GCMRegistrar.register(this, SENDER_ID);  
           } else {  
                Log.v(TAG, "Already registered");  
           }  
           mDisplay.setText("ffffff  " + regId);  
      }  
      private void checkNotNull(Object reference, String name) {  
           if (reference == null) {  
                throw new NullPointerException(getString(R.string.error_config,  
                          name));  
           }  
      }  
      @Override  
      protected void onPause() {  
           super.onPause();  
           GCMRegistrar.unregister(this);  
      }  
 }  


2.GCMIntentService.java
 package com.mukesh.gcm;  
 import static com.mukesh.gcm.CommonUtilities.SENDER_ID;  
 import android.content.Context;  
 import android.content.Intent;  
 import android.util.Log;  
 import com.google.android.gcm.GCMBaseIntentService;  
 public class GCMIntentService extends GCMBaseIntentService {  
      public GCMIntentService() {  
           super(SENDER_ID);  
      }  
      private static final String TAG = "===GCMIntentService===";  
      @Override  
      protected void onRegistered(Context arg0, String registrationId) {  
           Log.i(TAG, "Device registered: regId = " + registrationId);  
      }  
      @Override  
      protected void onUnregistered(Context arg0, String arg1) {  
           Log.i(TAG, "unregistered = " + arg1);  
      }  
      @Override  
      protected void onMessage(Context arg0, Intent arg1) {  
           Log.i(TAG, "new message= ");  
      }  
      @Override  
      protected void onError(Context arg0, String errorId) {  
           Log.i(TAG, "Received error: " + errorId);  
      }  
      @Override  
      protected boolean onRecoverableError(Context context, String errorId) {  
           return super.onRecoverableError(context, errorId);  
      }  
 }  


3. CommonUtilities.java

 package com.mukesh.gcm;  
     public final class CommonUtilities {  
     static final String SENDER_ID = "4815162342";  
 }  


4. AndroidManifest.xml

 <?xml version="1.0" encoding="utf-8"?>  
 <manifest xmlns:android="http://schemas.android.com/apk/res/android"  
      package="com.mukesh.gcm" android:versionCode="1" android:versionName="1.0">  
      <uses-sdk android:minSdkVersion="8" android:targetSdkVersion="16" />  
      <permission android:name="com.mukesh.gcma.permission.C2D_MESSAGE"  
           android:protectionLevel="signature" />  
      <uses-permission android:name="com.mukesh.gcm.permission.C2D_MESSAGE" />  
      <uses-permission android:name="android.permission.GET_ACCOUNTS" />  
      <uses-permission android:name="android.permission.WAKE_LOCK" />  
      <uses-permission android:name="android.permission.INTERNET" />  
      <uses-permission android:name="com.google.android.c2dm.permission.RECEIVE" />  
      <application android:icon="@drawable/ic_launcher"  
           android:label="@string/app_name">  
           <activity android:name=".PushAndroidActivity" android:label="@string/app_name">  
                <intent-filter>  
                     <action android:name="android.intent.action.MAIN" />  
                     <category android:name="android.intent.category.LAUNCHER" />  
                </intent-filter>  
           </activity>  
           <receiver android:name="com.google.android.gcm.GCMBroadcastReceiver"  
                android:permission="com.google.android.c2dm.permission.SEND">  
                <intent-filter>  
                     <action android:name="com.google.android.c2dm.intent.RECEIVE" />  
                     <action android:name="com.google.android.c2dm.intent.REGISTRATION" />  
                     <category android:name="com.mukesh.gcm" />  
                </intent-filter>  
           </receiver>  
           <service android:name=".GCMIntentService" />  
      </application>  
 </manifest>   



Enjoy Coding... :)
Cheers :)

Also see this blog for more help:
     1. Open| Launch Activity on receiving Push Notification 

Android toggle button


Hello Droid Guys,

Today ,I am sharing the code of custom toggle button in android. How to make a toggle switch button like
iPhone.




1. Create a new project in Eclipse File New ⇒ Android ⇒ Application Project and fill the required details.
2. Create required files needed to show a toggle switch button. I am using my default activity_main.xml as where I place the toggle button code and created a new xml file inside
 drawable in which I change my toggle button on selection
1. activity_main.xml

 <?xml version="1.0" encoding="utf-8"?>  
 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"  
   android:layout_width="fill_parent"  
   android:layout_height="fill_parent"  
   android:gravity="center"  
   android:orientation="vertical"  
   android:padding="10dp" >  
   <ToggleButton  
     android:id="@+id/toggle"  
     android:layout_width="wrap_content"  
     android:layout_height="wrap_content"  
     android:background="@drawable/btntoggle_selector"  
     android:textColor="@android:color/transparent"  
     android:textOff="Off"  
     android:textOn="On" />  
 </LinearLayout>  





2.btntoggle_selector



1:  <?xml version="1.0" encoding="utf-8"?>  
2:  <selector xmlns:android="http://schemas.android.com/apk/res/android">  
3:    <item android:drawable="@drawable/on" android:state_checked="true" android:state_pressed="true"/>  
4:    <item android:drawable="@drawable/on" android:state_checked="true" android:state_focused="false"/>  
5:    <item android:drawable="@drawable/off" android:state_checked="false" android:state_pressed="true"/>  
6:    <item android:drawable="@drawable/off" android:state_checked="false" android:state_focused="false"/>  
7:  </selector>  



3.CustomToggleButtonActivity


1:  package com.mukesh.customtogglebutton;  
2:  import android.app.Activity;  
3:  import android.os.Bundle;  
4:  import android.view.View;  
5:  import android.view.View.OnClickListener;  
6:  import android.widget.Toast;  
7:  import android.widget.ToggleButton;  
8:  import com.technotalkative.customtogglebutton.R;  
9:  public class CustomToggleButtonActivity extends Activity {  
10:       ToggleButton toggleBtn;  
11:       /** Called when the activity is first created. */  
12:       @Override  
13:       public void onCreate(Bundle savedInstanceState) {  
14:            super.onCreate(savedInstanceState);  
15:            setContentView(R.layout.main);  
16:            toggleBtn = (ToggleButton) findViewById(R.id.toggle);  
17:            toggleBtn.setOnClickListener(new OnClickListener() {  
18:                 public void onClick(View v) {  
19:                      String state = toggleBtn.getText().toString();  
20:                      Toast.makeText(CustomToggleButtonActivity.this,  
21:                                "Toggle State :" + state, Toast.LENGTH_LONG).show();  
22:                 }  
23:            });  
24:       }  
25:  }  




     You can use default android switches :


android switch

Android toggle button


               
              
    Enjoy coding ... :)

Friday 14 December 2012

Photo capture Intent causes NullPointerException on Samsung phones only

Hello Dorid Guys,

Yesterday, I came across  a weird situation . In my application ,I am capturing an image from camera and displaying it inside an imageview. I tested its functionality on many of android device and its working 
fine except "Samsung Galaxy Tab".
In Samsung device the capture intent will be "Null" and I am getting null pointer exception while capturing image from camera in android Samsung S2.

Following code I am using which running fine in all devices except Samsung :

For capturing Image from camera:

Intent captureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
startActivityForResult(captureIntent, CAMERA_CAPTURE);

For choosing an image from gallery:

Intent gallaryIntent = new Intent(Intent.ACTION_PICK,
android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
startActivityForResult(gallaryIntent, RESULT_LOAD_IMAGE);


And finally the onActivityResult(int requestCode, int resultCode, Intent data) :

protected void onActivityResult(int requestCode, int resultCode, Intent data) {
  super.onActivityResult(requestCode, resultCode, data);
if (resultCode == RESULT_OK) {
       
       if (requestCode == RESULT_LOAD_IMAGE) {
         picUri = data.getData();
         performCrop();
        }

       if (requestCode == CAMERA_CAPTURE) {
  // get the Uri for the captured image
  picUri = data.getData();
  if (picUri != null) {
   performCrop();
  }
 }
 // user is returning from cropping the image
  if (requestCode == PIC_CROP) {
  // get the returned data
  Bundle extras = data.getExtras();
  // get the cropped bitmap
  rectangleBitmap = extras.getParcelable("data");
  // retrieve a reference to the ImageView
  GraphicsUtil graphicsUtil = new GraphicsUtil();
  rectangleBitmap = graphicsUtil.getRoundedCornerBitmap(
  rectangleBitmap, 16);
  ImageView picView = (ImageView) findViewById(R.id.imgView);
  // display the returned cropped image
  picView.setImageBitmap(rectangleBitmap);
  btnMakeMotekon.setBackgroundDrawable(getResources()
                .getDrawable(R.drawable.make));
  btnMakeMotekon.setEnabled(true);
  btnNext.setEnabled(true);
 }
}
}

Now the crop image method, picking the image from gallery or camera and crop it.


private void performCrop() {
 // take care of exceptions
 try {
 // call the standard crop action intent (the user device may not support it)
 Intent cropIntent = new Intent("com.android.camera.action.CROP");
 // indicate image type and Uri
 cropIntent.setDataAndType(picUri, "image/*");
 // set crop properties
 cropIntent.putExtra("crop", "true");
 // indicate aspect of desired crop
 cropIntent.putExtra("aspectX", 1);
 cropIntent.putExtra("aspectY", 1);
 // indicate output X and Y
 cropIntent.putExtra("outputX", 256);
 cropIntent.putExtra("outputY", 256);
 // retrieve data on return
 cropIntent.putExtra("return-data", true);
 // start the activity - we handle returning in onActivityResult
 startActivityForResult(cropIntent, PIC_CROP);
 }catch (ActivityNotFoundException anfe) {
  // display an error message
  String errorMessage = "Whoops - your device doesn't support the 
                   crop action!";
  Toast toast = Toast.makeText(this, errorMessage,
                    Toast.LENGTH_SHORT);
  toast.show();
 }
}


The above code is working fine in most of the devices but when test it on Samsung S2 . I am getting the NullPointerException.
This is very tough time for me because my client wants to release the Application ASAP. And because of this issue he is delaying its time. 

After spending a full day and a night a found the fix for this problem, I added some extra code inside the
onActivityResult method.

The trick is:

if(picUri != null) {
    // do it the normal way
else {
    // do it the "Samsung" way
}



And it works :)
Here is my source code:


 protected void onActivityResult(int requestCode, int resultCode, Intent data) {  
   super.onActivityResult(requestCode, resultCode, data);  
  if (resultCode == RESULT_OK) {  
  if (requestCode == RESULT_LOAD_IMAGE) {  
    picUri = data.getData();  
    performCrop();  
  }  
  if (requestCode == CAMERA_CAPTURE) {  
  // get the Uri for the captured image  
  picUri = data.getData();  
  /*  
  * In samsung , the picUri will be null and application will  
  * give runtime error In else part we are doing the code for  
  * samsung device  
  */  
  if (picUri != null) {  
    // do it the normal way  
    performCrop();  
  } else {  
   // Describe the columns you'd like to have returned.  
   // Selecting from the Thumbnails location gives you both the  
   // Thumbnail Image ID, as well as the original image ID  
   String[] projection = {  
     MediaStore.Images.Thumbnails._ID, // The columns we wANT  
  MediaStore.Images.Thumbnails.IMAGE_ID,  
  MediaStore.Images.Thumbnails.KIND,  
  MediaStore.Images.Thumbnails.DATA };  
   String selection = MediaStore.Images.Thumbnails.KIND + "=" + // Select  
                // only        // mini's  
     MediaStore.Images.Thumbnails.MINI_KIND;  
      String sort = MediaStore.Images.Thumbnails._ID + " DESC";  
      // At the moment, this is a bit of a hack, as I'm returning  
   // ALL images, and just taking the latest one. There is a  
   // better way to narrow this down I think with a WHERE  
   // clause which is currently the selection variable  
      Cursor myCursor = this.managedQuery(  
   MediaStore.Images.Thumbnails.EXTERNAL_CONTENT_URI,  
   projection, selection, null, sort);  
   long imageId = 0l;  
   long thumbnailImageId = 0l;  
   String thumbnailPath = "";  
   try {  
     myCursor.moveToFirst();  
     imageId = myCursor.getLong(myCursor   .getColumnIndexOrThrow(MediaStore.Images.Thumbnails.IMAGE_ID));  
         thumbnailImageId = myCursor.getLong(myCursor   .getColumnIndexOrThrow(MediaStore.Images.Thumbnails._ID));  
     thumbnailPath = myCursor  
  .getString(myCursor    .getColumnIndexOrThrow(MediaStore.Images.Thumbnails.DATA));  
   } finally {  
     myCursor.close();  
  }  
  // Create new Cursor to obtain the file Path for the large  
  // image  
  String[] largeFileProjection = {  
         MediaStore.Images.ImageColumns._ID,  
   MediaStore.Images.ImageColumns.DATA };  
  String largeFileSort = MediaStore.Images.ImageColumns._ID  
     + " DESC";  
  myCursor = this.managedQuery(  
   MediaStore.Images.Media.EXTERNAL_CONTENT_URI,  
   largeFileProjection, null, null, largeFileSort);  
   String largeImagePath = "";  
  try {  
    myCursor.moveToFirst();  
       // This will actually give yo uthe file path location of  
    // the image.  
    largeImagePath = myCursor  
   .getString(myCursor  
  .getColumnIndexOrThrow(MediaStore.Images.ImageColumns.DATA));  
  } finally {  
  myCursor.close();  
  }  
  // These are the two URI's you'll be interested in. They  
  // give you a handle to the actual images  
  Uri uriLargeImage = Uri.withAppendedPath(  
  MediaStore.Images.Media.EXTERNAL_CONTENT_URI,  
  String.valueOf(imageId));  
  Uri uriThumbnailImage = Uri.withAppendedPath(  
  MediaStore.Images.Thumbnails.EXTERNAL_CONTENT_URI,  
   String.valueOf(thumbnailImageId));  
  picUri = uriLargeImage;  
  performCrop();  
  }  
  }  
 }  

Hope this will helps Some one.
Enjoy Coding :)

Thursday 6 December 2012

Close Popup window on click of backbuttun in android

 Hello Dorid Guys,  
 Yesterday, I stuck in a weird situation , the android popup button will not closed on pressing back  
 button . On android physical back button pressed I am calling popupWindow.dismiss();  
 But it not works for me :( .  
 After spending 1-2 hrs on it , finally I Solved this issue.  
 I am Doing following three steps :  
 1. Initializing the popup window first:  
    View view = LayoutInflater.from(MyDialogActivity.this).inflate(R.layout.poup_icon, null);  
    popupWindow = new PopupWindow(view, LayoutParams.WRAP_CONTENT,    
                 LayoutParams.WRAP_CONTENT, true);  
 2. After initialization call this  
     popupWindow.setBackgroundDrawable(new BitmapDrawable());   
 3. Finally, at the end inside your back button pressed code call this  
     @Override  
      public void onBackPressed() {  
       if(popupWindow != null)  
         popupWindow.dismiss();  
       else  
         super.onBackPressed();  
      }  
 Here is my full source code:  
 package com.popup.activities;  
 import android.app.Activity;  
 import android.content.Context;  
 import android.os.Bundle;  
 import android.widget.ImageView;  
 import android.widget.PopupWindow;  
 public class MyDialogActivity extends Activity {  
  Context mContext = MyDialogActivity.this;  
  PopupWindow popupWindow;  
  ImageView emojiIcon;  
  @Override  
  public void onCreate(Bundle savedInstanceState) {  
   super.onCreate(savedInstanceState);  
       setContentView(R.layout.activity_my_dialog);  
   ImageView emojiIcon = (ImageView) findViewById(R.id.motekon_icon);  
   //onclick of icom  
   emojiIcon.setOnClickListener(new OnClickListener() {  
   @Override  
     public void onClick(View v) {  
  View view = LayoutInflater.from(mContext).inflate(R.layout.popup_        icon, null);  
  popupWindow = new PopupWindow(view, LayoutParams.MATCH_PARENT,  
           LayoutParams.WRAP_CONTENT, true);  
      popupWindow.setBackgroundDrawable(new BitmapDrawable());  
      popupWindow.showAtLocation(view, Gravity.BOTTOM, 0, 0);  
      final GridView gridView = (GridView)view.  
                     findViewById(R.id.gridView1);  
  gridView.setOnItemClickListener(new OnItemClickListener() {  
  public void onItemClick(AdapterView<?> arg0, View v,   
                      int position, long arg3) {  
   popupWindow.dismiss();  
  }  
  });  
      gridView.setAdapter(your adapter);  
  }  
  });  
   }  
   @Override  
   protected void onPause() {  
  super.onPause();  
  if (popupWindow != null)  
  popupWindow.dismiss();  
   }  
  @Override  
  public void onBackPressed() {  
   if (popupWindow != null)  
  popupWindow.dismiss();  
   else  
     super.onBackPressed();  
  }  
 }  
 This is what I am doing in my code and it solve my problem.  
 May this will help some one.  
 Enjoy Coding :)  

Tuesday 13 November 2012

Android horizontal listview | horizontal listview | android listview | android custom horizontal listview

Hello Droid Guys,

In android , there is ListView tag in xml, with the help of this we can show
list view but its apperance is vertically not horizontally and if you want to show
a horizontal listview then you have to make your custom view,


1. Create a new project in Eclipse File New ⇒ Android ⇒ Application Project and fill the required details.
2. Create required files needed to generate a list view. I am using  activity_horizontal_list_view.xml as list view and created a new xml file for single list item named  listview_item.xml

horizontal list view example
Horizontal listView

activity_horizontal_list_view.xml 

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@android:color/white"
    android:orientation="vertical" >
    <ImageView
        android:id="@+id/selected_imageview"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:layout_above="@+id/gallery_relative_layout"
        android:layout_marginLeft="30dip"
        android:layout_marginRight="30dip"
        android:layout_marginTop="30dip"
        android:background="@drawable/natureimage1" />
    <RelativeLayout
        android:id="@+id/gallery_relative_layout"
        android:layout_width="wrap_content"
        android:layout_height="150dip"
        android:layout_alignParentBottom="true"
        android:orientation="horizontal" >
        <com.mukesh.ui.HorizontalView
            android:id="@+id/gallery"
            android:layout_width="match_parent"
            android:layout_height="75dp"
            android:layout_marginLeft="20dip"
            android:layout_marginRight="20dip"
            android:layout_marginTop="15dp"
            android:smoothScrollbar="true"
            android:spacing="20dip" >
        </com.mukesh.ui.HorizontalView>
    </RelativeLayout>
</RelativeLayout>
listview_item.xml

<?xml version="1.0" encoding="utf-8"?>

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:gravity="center"
    android:orientation="vertical" >

    <ImageView
        android:id="@+id/icon"
        android:layout_width="72dp"
        android:layout_height="75dp" />

</RelativeLayout>





3. HorizontalView.Java : These class help us to create view. This is my custom 
               view class which help us in showing listview Horizontally.
     

package com.mukesh.ui;

import java.util.LinkedList;
import java.util.Queue;

import android.content.Context;
import android.database.DataSetObserver;
import android.graphics.Rect;
import android.util.AttributeSet;
import android.view.GestureDetector;
import android.view.GestureDetector.OnGestureListener;
import android.view.MotionEvent;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ListAdapter;
import android.widget.Scroller;

public class HorizontalView extends AdapterView {

 public boolean mAlwaysOverrideTouch = true;
 protected ListAdapter mAdapter;
 private int mLeftViewIndex = -1;
 private int mRightViewIndex = 0;
 protected int mCurrentX;
 protected int mNextX;
 private int mMaxX = Integer.MAX_VALUE;
 private int mDisplayOffset = 0;
 protected Scroller mScroller;
 private GestureDetector mGesture;
 private Queue mRemovedViewQueue = new LinkedList();
 private OnItemSelectedListener mOnItemSelected;
 private OnItemClickListener mOnItemClicked;
 private OnItemLongClickListener mOnItemLongClicked;
 private boolean mDataChanged = false;

 public HorizontalView(Context context, AttributeSet attrs) {
  super(context, attrs);
  initView();
 }

 private synchronized void initView() {
  mLeftViewIndex = -1;
  mRightViewIndex = 0;
  mDisplayOffset = 0;
  mCurrentX = 0;
  mNextX = 0;
  mMaxX = Integer.MAX_VALUE;
  mScroller = new Scroller(getContext());
  mGesture = new GestureDetector(getContext(), mOnGesture);
 }

 @Override
 public void setOnItemSelectedListener(
   AdapterView.OnItemSelectedListener listener) {
  mOnItemSelected = listener;
 }

 @Override
 public void setOnItemClickListener(AdapterView.OnItemClickListener listener) {
  mOnItemClicked = listener;
 }

 @Override
 public void setOnItemLongClickListener(
   AdapterView.OnItemLongClickListener listener) {
  mOnItemLongClicked = listener;
 }

 private DataSetObserver mDataObserver = new DataSetObserver() {

  @Override
  public void onChanged() {
   synchronized (HorizontalView.this) {
    mDataChanged = true;
   }
   invalidate();
   requestLayout();
  }

  @Override
  public void onInvalidated() {
   reset();
   invalidate();
   requestLayout();
  }

 };

 @Override
 public ListAdapter getAdapter() {
  return mAdapter;
 }

 @Override
 public View getSelectedView() {
  // TODO: implement
  return null;
 }

 @Override
 public void setAdapter(ListAdapter adapter) {
  if (mAdapter != null) {
   mAdapter.unregisterDataSetObserver(mDataObserver);
  }
  mAdapter = adapter;
  mAdapter.registerDataSetObserver(mDataObserver);
  reset();
 }

 private synchronized void reset() {
  initView();
  removeAllViewsInLayout();
  requestLayout();
 }

 @Override
 public void setSelection(int position) {
  // TODO: implement
 }

 private void addAndMeasureChild(final View child, int viewPos) {
  LayoutParams params = child.getLayoutParams();
  if (params == null) {
   params = new LayoutParams(LayoutParams.FILL_PARENT,
     LayoutParams.FILL_PARENT);
  }

  addViewInLayout(child, viewPos, params, true);
  child.measure(
    MeasureSpec.makeMeasureSpec(getWidth(), MeasureSpec.AT_MOST),
    MeasureSpec.makeMeasureSpec(getHeight(), MeasureSpec.AT_MOST));
 }

 @Override
 protected synchronized void onLayout(boolean changed, int left, int top,
   int right, int bottom) {
  super.onLayout(changed, left, top, right, bottom);

  if (mAdapter == null) {
   return;
  }

  if (mDataChanged) {
   int oldCurrentX = mCurrentX;
   initView();
   removeAllViewsInLayout();
   mNextX = oldCurrentX;
   mDataChanged = false;
  }

  if (mScroller.computeScrollOffset()) {
   int scrollx = mScroller.getCurrX();
   mNextX = scrollx;
  }

  if (mNextX <= 0) {
   mNextX = 0;
   mScroller.forceFinished(true);
  }
  if (mNextX >= mMaxX) {
   mNextX = mMaxX;
   mScroller.forceFinished(true);
  }

  int dx = mCurrentX - mNextX;

  // removeNonVisibleItems(dx);
  fillList(dx);
  positionItems(dx);

  mCurrentX = mNextX;

  if (!mScroller.isFinished()) {
   post(new Runnable() {
    @Override
    public void run() {
     requestLayout();
    }
   });

  }
 }

 private void fillList(final int dx) {
  int edge = 0;
  View child = getChildAt(getChildCount() - 1);
  if (child != null) {
   edge = child.getRight();
  }
  fillListRight(edge, dx);

  edge = 0;
  child = getChildAt(0);
  if (child != null) {
   edge = child.getLeft();
  }
  fillListLeft(edge, dx);

 }

 private void fillListRight(int rightEdge, final int dx) {
  while (rightEdge + dx < getWidth()
    && mRightViewIndex < mAdapter.getCount()) {

   View child = mAdapter.getView(mRightViewIndex,
     mRemovedViewQueue.poll(), this);
   addAndMeasureChild(child, -1);
   rightEdge += child.getMeasuredWidth();

   if (mRightViewIndex == mAdapter.getCount() - 1) {
    mMaxX = mCurrentX + rightEdge - getWidth();
   }

   if (mMaxX < 0) {
    mMaxX = 0;
   }
   mRightViewIndex++;
  }

 }

 private void fillListLeft(int leftEdge, final int dx) {
  while (leftEdge + dx > 0 && mLeftViewIndex >= 0) {
   View child = mAdapter.getView(mLeftViewIndex,
     mRemovedViewQueue.poll(), this);
   addAndMeasureChild(child, 0);
   leftEdge -= child.getMeasuredWidth();
   mLeftViewIndex--;
   mDisplayOffset -= child.getMeasuredWidth();
  }
 }

 /*
  * private void removeNonVisibleItems(final int dx) { View child =
  * getChildAt(0); while(child != null && child.getRight() + dx <= 0) {
  * mDisplayOffset += child.getMeasuredWidth();
  * mRemovedViewQueue.offer(child); removeViewInLayout(child);
  * mLeftViewIndex++; child = getChildAt(0);
  * 
  * }
  * 
  * child = getChildAt(getChildCount()-1); while(child != null &&
  * child.getLeft() + dx >= getWidth()) { mRemovedViewQueue.offer(child);
  * removeViewInLayout(child); mRightViewIndex--; child =
  * getChildAt(getChildCount()-1); } }
  */

 private void positionItems(final int dx) {
  if (getChildCount() > 0) {
   mDisplayOffset += dx;
   int left = mDisplayOffset;
   for (int i = 0; i < getChildCount(); i++) {
    View child = getChildAt(i);
    int childWidth = child.getMeasuredWidth();
    child.layout(left, 0, left + childWidth,
      child.getMeasuredHeight());
    left += childWidth;
   }
  }
 }

 public synchronized void scrollTo(int x) {
  mScroller.startScroll(mNextX, 0, x - mNextX, 0);
  requestLayout();
 }

 @Override
 public boolean dispatchTouchEvent(MotionEvent ev) {
  boolean handled = super.dispatchTouchEvent(ev);
  handled |= mGesture.onTouchEvent(ev);
  return handled;
 }

 protected boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX,
   float velocityY) {
  synchronized (HorizontalView.this) {
   mScroller.fling(mNextX, 0, (int) -velocityX, 0, 0, mMaxX, 0, 0);
  }
  requestLayout();

  return true;
 }

 protected boolean onDown(MotionEvent e) {
  mScroller.forceFinished(true);
  return true;
 }

 private OnGestureListener mOnGesture = new GestureDetector.SimpleOnGestureListener() {

  @Override
  public boolean onDown(MotionEvent e) {
   return HorizontalView.this.onDown(e);
  }

  @Override
  public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX,
    float velocityY) {
   return HorizontalView.this.onFling(e1, e2, velocityX, velocityY);
  }

  @Override
  public boolean onScroll(MotionEvent e1, MotionEvent e2,
    float distanceX, float distanceY) {

   synchronized (HorizontalView.this) {
    mNextX += (int) distanceX;
   }
   requestLayout();

   return true;
  }

  @Override
  public boolean onSingleTapConfirmed(MotionEvent e) {
   for (int i = 0; i < getChildCount(); i++) {
    View child = getChildAt(i);
    if (isEventWithinView(e, child)) {
     if (mOnItemClicked != null) {
      mOnItemClicked.onItemClick(HorizontalView.this, child,
        mLeftViewIndex + 1 + i,
        mAdapter.getItemId(mLeftViewIndex + 1 + i));
     }
     if (mOnItemSelected != null) {
      mOnItemSelected.onItemSelected(HorizontalView.this,
        child, mLeftViewIndex + 1 + i,
        mAdapter.getItemId(mLeftViewIndex + 1 + i));
     }
     break;
    }

   }
   return true;
  }

  @Override
  public void onLongPress(MotionEvent e) {
   int childCount = getChildCount();
   for (int i = 0; i < childCount; i++) {
    View child = getChildAt(i);
    if (isEventWithinView(e, child)) {
     if (mOnItemLongClicked != null) {
      mOnItemLongClicked.onItemLongClick(HorizontalView.this,
        child, mLeftViewIndex + 1 + i,
        mAdapter.getItemId(mLeftViewIndex + 1 + i));
     }
     break;
    }

   }
  }

  private boolean isEventWithinView(MotionEvent e, View child) {
   Rect viewRect = new Rect();
   int[] childPosition = new int[2];
   child.getLocationOnScreen(childPosition);
   int left = childPosition[0];
   int right = left + child.getWidth();
   int top = childPosition[1];
   int bottom = top + child.getHeight();
   viewRect.set(left, top, right, bottom);
   return viewRect.contains((int) e.getRawX(), (int) e.getRawY());
  }
 };

}




4. Now my Activity class(HorizontalListView.java ) and adapter class
   (HorizontalImageAdapter.java )




A.HorizontalListView.java


package com.mukesh.horizontallistview;

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

import com.mukesh.ui.HorizontalView;

import android.os.Bundle;
import android.app.Activity;
import android.graphics.drawable.Drawable;

public class HorizontalListView extends Activity {

 private List drawables;
 private HorizontalImageAdapter imageAdapter;
 private HorizontalView listView;

 @Override
 public void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.activity_horizontal_list_view);

  listView = (HorizontalView) findViewById(R.id.gallery);
  getDrawablesList();
  setupUI();
 }

 private void setupUI() {
  imageAdapter = new HorizontalImageAdapter(this, drawables);

  listView.setAdapter(imageAdapter);

 }

 private void getDrawablesList() {

      drawables = new ArrayList();
      drawables.add(getResources().getDrawable(R.drawable.natureimage1));
      drawables.add(getResources().getDrawable(R.drawable.natureimage2));
      drawables.add(getResources().getDrawable(R.drawable.natureimage3));
      drawables.add(getResources().getDrawable(R.drawable.natureimage4));
      drawables.add(getResources().getDrawable(R.drawable.natureimage5));
      drawables.add(getResources().getDrawable(R.drawable.natureimage6));
      drawables.add(getResources().getDrawable(R.drawable.natureimage7));
      drawables.add(getResources().getDrawable(R.drawable.natureimage8));
      drawables.add(getResources().getDrawable(R.drawable.natureimage9));
      drawables.add(getResources().getDrawable(R.drawable.natureimage10));
      drawables.add(getResources().getDrawable(R.drawable.natureimage12));
      drawables.add(getResources().getDrawable(R.drawable.natureimage13));
      drawables.add(getResources().getDrawable(R.drawable.natureimage15));

 }

}




B. HorizontalImageAdapter.java 
package com.mukesh.horizontallistview; import java.util.List; import android.app.Activity; import android.graphics.drawable.Drawable; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.BaseAdapter; import android.widget.ImageView; public class HorizontalImageAdapter extends BaseAdapter { private Activity context; private static ImageView imageView; private List plotsImages; private static ViewHolder holder; private LayoutInflater l_Inflater; public HorizontalImageAdapter(Activity context, List plotsImages) { this.context = context; this.plotsImages = plotsImages; l_Inflater = LayoutInflater.from(context); } @Override public int getCount() { return plotsImages.size(); } @Override public Object getItem(int position) { return null; } @Override public long getItemId(int position) { return 0; } @Override public View getView(int position, View convertView, ViewGroup parent) { if (convertView == null) { holder = new ViewHolder(); convertView = l_Inflater.inflate(R.layout.listview_item, null); holder = new ViewHolder(); holder.imageView = (ImageView) convertView.findViewById(R.id.icon); convertView.setTag(holder); } else { holder = (ViewHolder) convertView.getTag(); } holder.imageView.setImageDrawable(plotsImages.get(position)); return convertView; } private static class ViewHolder { ImageView imageView; } }


This is what I am doing to show Horizontal listviw in android.


Cheers :)
Enjoy Coding....

Thursday 8 November 2012

turn on or off the wifi connection in android Programatically



Hello Android Guys,

This is a simple tutorial which covers following parts:
     1. Programatically  turn on or turn off the wifi connection without going to setting option
         in android. For this you have to do two things

     A. Passing Permission inside your AndroidManifest.xml file:
   <uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />

     B. Inside your Activity
              I. For turning off the wifi

       WifiManager wifiManager = (WifiManager)context.getSystemService
                                                                                          (Context.WIFI_SERVICE);
       wifiManager.setWifiEnabled(false); 

             II. For turning on the wifi   

        WifiManager wifiManager = (WifiManager)context.getSystemService
                                                                                                  (Context.WIFI_SERVICE);
        wifiManager.setWifiEnabled(true); 


Hope , this will Help some one.
Cheers :)
Happy Coding :)


Can't create handler inside thread that has not called Looper.prepare()


Hello Friend ,

Today, I Stuck with a Weird issue. Calling a thread inside ui thread handler. I am facing
"Can't create handler inside thread that has not called Looper.prepare()" error.

After spending lots of time finally , my problem is fixed. Here is my approach.
     1. Calling the Looper.prepare() just next run
     2. Calling Looper.loop()
     3. Finally you need to destroy or kill your looper using- Looper.getMyLooper().quit().


Here is my Code,

Note: Please declare this variable in your class private volatile Looper mMyLooper;


private Handler handler = new Handler() {
 @Override
 public void handleMessage(Message msg) {

 final SyncRequestManager test = new SyncRequestManager(Test.this);
 try {
            message = message.replaceAll("\n", "");
            progressDialog= ProgressDialog.show(Test.this,
                   "", "Shairing please wait....",true);

        new Thread() {
                  public void run() {
                         try{
                             Looper.prepare();
                             JSONObject jsonObject = test.postOnFacebookWall(mess                      age,byteArray);

                                 JSONObject response = jsonObject.getJSONObject("response");
                                 final String iconUrl = response.getString("icon");
                                 Log.i(" Response" , ""+response);
                                 Log.i(" Icon" , ""+iconUrl);

                                      final FacebookUtil fbUtil = new FacebookUtil(ShareMotekon.this);
       fbUtil.postMessageOnWall(message, iconUrl,byteArray);
       sleep(8000);
      } catch (Exception e) {
          Log.d("Exception", e.getMessage());
      }
           progressDialog.dismiss();                       
           mhandler.sendEmptyMessage(0);
     }
   }.start();
 } catch (Exception e) {
 e.printStackTrace();

   }
  }
};


private Handler mhandler = new Handler() {

  @Override
    public void handleMessage(Message msg) {
   btnNext.setEnabled(true);
   Toast.makeText(ShareMotekon.this,
                       "Message Shared Successfully!", Toast.LENGTH_LONG).show();

    Log.d("INSIDE HANDLER","FB SHARE");

    myLooper = Looper.myLooper();
            Looper.loop();
                         myLooper.quit();  
             }
    };


May , this will help some one.
Enjoy Coding :)

Tuesday 23 October 2012

Android Search Functionality with ListView same as Google search functionality


Hello Friends,

Hello Friends , have you searching for Google like search functionality in your Android
application ??

custom listview search
Search bar in android
custom listview search in android
search icon inside edit text



1. Create a new project in Eclipse File New ⇒ Android ⇒ Application Project and fill the required details.
2. Create required files needed to generate a listview. I am using my default activity_main.xml as listview and created a new xml file for single listitem named listview.xml
activity_main.xml

<?xml version="1.0" encoding="utf-8"?>

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"

    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical" >

    <EditText
        android:id="@+id/EditText01"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:drawableLeft="@android:drawable/ic_menu_search"
        android:hint="Search" >
    </EditText>

    <ListView
        android:id="@+id/ListView01"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content" >
    </ListView>

</LinearLayout>



listview.xml




<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:background="@android:color/background_dark"
    android:gravity="left|center"
    android:paddingBottom="5px"
    android:paddingLeft="5px"
    android:paddingTop="5px" >

    <TextView
        android:id="@+id/TextView01"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginLeft="10px"
        android:textColor="#0099CC"
        android:textSize="20px"
        android:textStyle="bold" >
    </TextView>

</LinearLayout>


MainActivity.java


package com.mukesh.customsearch;

import java.util.ArrayList;

import android.os.Bundle;
import android.app.Activity;
import android.text.Editable;
import android.text.TextWatcher;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.EditText;
import android.widget.ListView;
import android.widget.TextView;

public class MainActivity extends Activity {

        EditText edittext;
        ListView listview;

        String[] text = { "One", "HTC One X", "Samsung Galaxy S3", "Samsung 
         Galaxy Note 800", "HTC Sense", "HTC Sensation XE", "HTC Wildfire S",
                        "HTC Wildfire", "Wildfire S", "HTC" };

        int textlength = 0;

        ArrayList<String> text_sort = new ArrayList<String>();
        ArrayList<Integer> image_sort = new ArrayList<Integer>();

        public void onCreate(Bundle savedInstanceState) {

                super.onCreate(savedInstanceState);
                setContentView(R.layout.activity_main);

                edittext = (EditText) findViewById(R.id.EditText01);
                listview = (ListView) findViewById(R.id.ListView01);
                listview.setAdapter(new CustomAdapter(text));

                edittext.addTextChangedListener(new TextWatcher() {

                        public void afterTextChanged(Editable s) {

                        }

                        public void beforeTextChanged(CharSequence s, int start,                                 int count,
                                        int after) {

                        }

                        public void onTextChanged(CharSequence s, int start, int                                       before,
                                        int count) {

                                textlength = edittext.getText().length();
                                text_sort.clear();
                                image_sort.clear();

                                for (int i = 0; i < text.length; i++) {
                                        String name = text[i];
                                        String searchtext = edittext.getText()
                                                        .toString();
                                        if (textlength <= text[i].length()) {
                                                if (name.toLowerCase().indexOf
                                             (searchtext.toLowerCase())!= -1) {
                                                        text_sort.add(text[i]);
                                                }
                                        }
                                }

                        listview.setAdapter(new CustomAdapter(text_sort));

                        }
                });
        }

        class CustomAdapter extends BaseAdapter {

                String[] data_text;

                CustomAdapter() {

                }

                CustomAdapter(String[] text) {
                        data_text = text;
                }

                CustomAdapter(ArrayList<String> text) {

                        data_text = new String[text.size()];

                        for (int i = 0; i < text.size(); i++) {
                                data_text[i] = text.get(i);
                        }

                }

                public int getCount() {
                        return data_text.length;
                }

                public String getItem(int position) {
                        return null;
                }

                public long getItemId(int position) {
                        return position;
                }

                public View getView(int position, View convertView,
                                         ViewGroup parent) {

                        LayoutInflater inflater = getLayoutInflater();
                        View row;

                        row = inflater.inflate(R.layout.listview, parent, false);

                        TextView textview = (TextView) row.findViewById(R.id.Text                                               View01);

                        textview.setText(data_text[position]);

                        return (row);

                }
        }

}




Enjoy Coding :)





 

Copyright @ 2013 Android Developers Blog.