Saturday, 5 October 2013

Adding Event to Google Calendar from Android Example

The demonstrated example includes the following steps.

1. Getting authentication from Google Account using OAuth.
2. Listing out the Number calenders associated with your account.
3. Adding the event to the selected calendar from the list.
4. User can Add a new calendar and add the event to that also.


package com.example.eventtogooglecalendar;

import java.io.BufferedReader;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.ArrayList;
import java.util.List;

import org.apache.http.HttpEntity;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.util.EntityUtils;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;

import android.accounts.Account;
import android.accounts.AccountManager;
import android.app.Activity;
import android.app.AlertDialog;
import android.app.Dialog;
import android.app.ProgressDialog;
import android.content.DialogInterface;
import android.content.DialogInterface.OnClickListener;
import android.content.Intent;
import android.os.AsyncTask;
import android.os.Bundle;
import android.widget.EditText;
import android.widget.Toast;

import com.google.android.gms.auth.GoogleAuthException;
import com.google.android.gms.auth.GoogleAuthUtil;
import com.google.android.gms.auth.GooglePlayServicesAvailabilityException;
import com.google.android.gms.auth.UserRecoverableAuthException;
import com.google.android.gms.common.GooglePlayServicesUtil;

public class CalendarActivity extends Activity{
//    Account[] accounts;
    static final int MY_ACTIVITYS_AUTH_REQUEST_CODE_CALENDARSLIST = 1;
    static final int MY_ACTIVITYS_AUTH_REQUEST_CODE_ADDTOCALENDAR = 2;
    static String accountName = "";
    static String calendarID = "";
   
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        // TODO Auto-generated method stub
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
       
        getGoogleAccounts();
    }
   
   
    private void getGoogleAccounts() {
        // TODO Auto-generated method stub
        final AccountManager manager = AccountManager.get(CalendarActivity.this);
        final Account[] accounts = manager.getAccountsByType("com.google");
       
        final ArrayList<String> possibleEmails = new ArrayList<String>();

        for (Account account : accounts) {
         
          possibleEmails.add(account.name);
       
        }
       
        if(possibleEmails.size() > 0)
        {
            List<String> list = possibleEmails;
           
            final CharSequence[] chars = list.toArray(new CharSequence[possibleEmails.size()]);
            AlertDialog.Builder builder = new AlertDialog.Builder(CalendarActivity.this);
            builder.setTitle("Please select an account to which agenda has to get sync.");
            /*builder.setMultiChoiceItems(chars, null, new OnMultiChoiceClickListener() {
               
                @Override
                public void onClick(DialogInterface dialog, int which, boolean isChecked) {
                    // TODO Auto-generated method stub
                   
                }
            });*/
           
            builder.setSingleChoiceItems(chars, -1, new OnClickListener() {
               
                @Override
                public void onClick(DialogInterface dialog, int which) {
                    // TODO Auto-generated method stub
                    accountName = possibleEmails.get(which).trim();
                }
            });
           
            builder.setPositiveButton("Ok",
                    new DialogInterface.OnClickListener() {
                        @Override
                        public void onClick(DialogInterface dialog, int id) {
                                                       
                            
                            if(accountName.trim().length() > 0)
                                getAndUseAuthTokenInAsyncTask(accountName);
                            else
                                Toast.makeText(CalendarActivity.this, "Please select an account.", Toast.LENGTH_SHORT).show();
                           
                        }
                    });
            builder.setNegativeButton("Cancel",
                    new DialogInterface.OnClickListener() {
                        @Override
                        public void onClick(DialogInterface dialog, int id) {

                            dialog.dismiss();
                        }
                    });
           
            builder.show();

        }
    }
   
    void getAndUseAuthTokenInAsyncTask(final String accountname) {
       
       
       
           AsyncTask task = new AsyncTask() {
             ProgressDialog dialog;
            @Override
            protected void onPostExecute(Object result) {
                // TODO Auto-generated method stub
                super.onPostExecute(result);
                dialog.dismiss();
            }

            @Override
            protected void onPreExecute() {
                // TODO Auto-generated method stub
                super.onPreExecute();
               
                dialog = new ProgressDialog(CalendarActivity.this);
                dialog.setCanceledOnTouchOutside(false);
                dialog.setCancelable(false);
                dialog.setMessage("Authenticating....");
                dialog.show();
            }

            @Override
            protected Object doInBackground(Object... params) {
                getAndUseAuthTokenBlockingforCalendar(accountname);
                return null;
            }
           };
           task.execute((Void)null);
       }

    void getAndUseAuthTokenBlockingforCalendar(String accountname) {
           try {

                        final String token = GoogleAuthUtil.getToken(CalendarActivity.this, accountname, "oauth2:https://www.googleapis.com/auth/calendar"); //oauth2:https://www.googleapis.com/auth/calendar
            
              if (token.contains("invalid") ){
                  // invalidate the token that we found is bad so that GoogleAuthUtil won't
                  // return it next time (it may have cached it)
                  GoogleAuthUtil.invalidateToken(CalendarActivity.this, token);
                  // consider retrying getAndUseTokenBlocking() once more
                  return;
              }
              else if(token.length() > 0)
                 {
                 
                       HttpClient client = new DefaultHttpClient();

                     HttpGet request = new HttpGet("https://www.googleapis.com/calendar/v3/users/me/calendarList??maxResults=50&access_token="+token);
                     org.apache.http.HttpResponse response = client.execute(request);
                     HttpEntity entity = response.getEntity();
                     final ArrayList<String> ids = new ArrayList<String>();
                     final ArrayList<String> names = new ArrayList<String>();
                     if(entity!=null) {
                         try {
                           
                              String data = EntityUtils.toString(entity);
                              System.out.println("data :"+data);                          
                              JSONObject mainobject = new JSONObject(data);
                              JSONArray objectarray = mainobject.getJSONArray("items");
                             
                              for(int i = 0; i < objectarray.length(); i++)
                              {
                                  JSONObject subObject  =     (JSONObject) objectarray.get(i);   
                                  String id = subObject.getString("id");
                                  String name  = subObject.getString("summary");
                                   
                                  ids.add(id);
                                  names.add(name);
                                 
                              }
                             
                                  ids.add("111");
                                  names.add("Create New Calendar.");
                           
                           
                            } catch (JSONException e) {
                                // TODO Auto-generated catch block
                                e.printStackTrace();
                            }
                        }
                     if(ids.size() > 0 && names.size() > 0)
                      {
                         runOnUiThread(new Runnable() {
                           
                            @Override
                            public void run() {
                                // TODO Auto-generated method stub
                                 showCalendarsList(ids, names);
                            }
                        });
                       
                      }
                
                 }
              return;
           } catch (GooglePlayServicesAvailabilityException playEx) {
             Dialog alert = GooglePlayServicesUtil.getErrorDialog(playEx.getConnectionStatusCode(), this, MY_ACTIVITYS_AUTH_REQUEST_CODE_CALENDARSLIST);
             System.out.println("GooglePlayServicesAvailabilityException :");
             playEx.printStackTrace();
           } catch (UserRecoverableAuthException userAuthEx) {
            
              startActivityForResult( userAuthEx.getIntent(), MY_ACTIVITYS_AUTH_REQUEST_CODE_CALENDARSLIST);
              System.out.println("UserRecoverableAuthException :");
              userAuthEx.printStackTrace();
              return;
           } catch (IOException transientEx) {
               System.out.println("IOException :");
               transientEx.printStackTrace();
              return;
           } catch (GoogleAuthException authEx) {
               System.out.println("GoogleAuthException :");
               authEx.printStackTrace();
              return;
           }
       }


    private void showCalendarsList(final ArrayList<String> ids, ArrayList<String> names) {

        List<String> list = names;
       
        final CharSequence[] chars = list.toArray(new CharSequence[list.size()]);
        AlertDialog.Builder builder = new AlertDialog.Builder(CalendarActivity.this);
        builder.setTitle("Please select an account to which agenda has to get sync.");
       
        builder.setSingleChoiceItems(chars, -1, new OnClickListener() {
           
            @Override
            public void onClick(DialogInterface dialog, int which) {
                // TODO Auto-generated method stub
                calendarID = ids.get(which).toString();
            }
        });
       
        builder.setPositiveButton("Ok",
                new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int id) {
                       
                        if(!calendarID.trim().equals("111"))
                        {
                            if(calendarID.trim().length() > 0)
                                addEventToCalendar(calendarID);
                            else
                                Toast.makeText(CalendarActivity.this, "Please select any one of the calendar.", Toast.LENGTH_SHORT).show();
                        }
                        else
                        {
                            AlertDialog.Builder builder1 = new AlertDialog.Builder(CalendarActivity.this);
                            builder1.setTitle("Please enter calendar name.");
                            final EditText etxt = new EditText(CalendarActivity.this);
                            builder1.setView(etxt);
                            builder1.setPositiveButton("Create", new OnClickListener() {
                               
                                @Override
                                public void onClick(DialogInterface dialog, int which) {
                                    if(etxt.getEditableText().toString().trim().length() > 0)
                                    {
                                        System.out.println("calendar name :"+etxt.getEditableText().toString().trim());
                                        createNewCalendar(etxt.getEditableText().toString().trim());
                                    }
                                    else
                                    {
                                        Toast.makeText(CalendarActivity.this, "Please enter calendar name.", Toast.LENGTH_SHORT).show();
                                    }

                                }
                            });
                            builder1.setNegativeButton("Cancel", new OnClickListener() {
                               
                                @Override
                                public void onClick(DialogInterface dialog, int which) {
                                    // TODO Auto-generated method stub
                                    dialog.dismiss();
                                }
                            });
                           
                            builder1.show();
                        }
                        System.out.println("selected calendar :"+calendarID);
                    }
                });
        builder.setNegativeButton("Cancel",
                new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int id) {

                        dialog.dismiss();
                    }
                });
       
        builder.show();

   
       
    }


   
        void addEventToCalendar(final String mailid) {                   
           
               AsyncTask task = new AsyncTask() {
                
                   ProgressDialog dialog;
                    @Override
                    protected void onPostExecute(Object result) {
                        // TODO Auto-generated method stub
                        super.onPostExecute(result);
                        dialog.dismiss();
                    }

                    @Override
                    protected void onPreExecute() {
                        // TODO Auto-generated method stub
                        super.onPreExecute();
                       
                        dialog = new ProgressDialog(CalendarActivity.this);
                        dialog.setCanceledOnTouchOutside(false);
                        dialog.setCancelable(false);
                        dialog.setMessage("Adding event to calendar....");
                        dialog.show();
                    }
                   
                @Override
                protected Object doInBackground(Object... params) {
                    addtoCalendar(mailid);
                    return null;
                }
               };
               task.execute((Void)null);
           }


        protected void addtoCalendar(String mailid) {
           
                   try {

                   
                      final String token = GoogleAuthUtil.getToken(CalendarActivity.this, accountName, "oauth2:https://www.googleapis.com/auth/calendar"); //oauth2:https://www.googleapis.com/auth/calendar
                 
                      if (token.contains("invalid") ){
                          // invalidate the token that we found is bad so that GoogleAuthUtil won't
                          // return it next time (it may have cached it)
                          GoogleAuthUtil.invalidateToken(CalendarActivity.this, token);
                          // consider retrying getAndUseTokenBlocking() once more
                          return;
                      }
                      else if(token.length() > 0)
                         {                                                                                   
                                                    
                            String jsonString = "{\"end\": {\"dateTime\": \"2013-10-02T17:10:00\",\"timeZone\": \"Asia/Kolkata\" }, \"start\": { \"dateTime\": \"2013-10-02T16:15:00\",\"timeZone\": \"Asia/Kolkata\" }, \"creator\": { \"self\": true }, \"description\": \"New Event Description\", \"location\": \"Hyderabad\", \"reminders\": { \"useDefault\": true }, \"status\": \"confirmed\", \"summary\": \"Event1 Summery\", \"visibility\": \"default\"}";
                              
                             String url = "https://www.googleapis.com/calendar/v3/calendars/"+ mailid + "/events?access_token=" + token;
                             URL u = new URL(url);
                             HttpURLConnection connection = (HttpURLConnection) u.openConnection();          
                             connection.setDoOutput(true);
                             connection.setDoInput(true);
                             connection.setInstanceFollowRedirects(false);
                             connection.setRequestMethod("POST");
                             String a = connection.getRequestMethod();
                             connection.setRequestProperty("Content-Type", "application/json");
                             connection.setRequestProperty("Accept-Charset", "utf-8");
                             connection.setRequestProperty("Authorization", "OAuth" + token);
                             connection.setUseCaches(false);
                             DataOutputStream wr = new DataOutputStream(connection.getOutputStream ());
                             wr.writeBytes(jsonString);
                             wr.flush();

                             // Get the response
                             BufferedReader rd = new BufferedReader(new InputStreamReader(connection.getInputStream()));
                                 String line;
                                
                            
                             while ((line = rd.readLine()) != null) {
                                System.out.println("respose after adding event:"+line);
                             }
                             wr.close();
                             rd.close();
                            
                             if(connection.getResponseCode() == 200)
                             {
                                 runOnUiThread(new Runnable() {
                                   
                                    @Override
                                    public void run() {
                                        // TODO Auto-generated method stub
                                        Toast.makeText(CalendarActivity.this, "Event added successfully", Toast.LENGTH_SHORT).show();
                                        return;
                                    }
                                });
                               
                             }
                        
                         }
                      return;
                   } catch (GooglePlayServicesAvailabilityException playEx) {
                     Dialog alert = GooglePlayServicesUtil.getErrorDialog(playEx.getConnectionStatusCode(), this, MY_ACTIVITYS_AUTH_REQUEST_CODE_ADDTOCALENDAR);
                     System.out.println("GooglePlayServicesAvailabilityException :");
                     playEx.printStackTrace();
                   } catch (UserRecoverableAuthException userAuthEx) {
                     
                      startActivityForResult( userAuthEx.getIntent(), MY_ACTIVITYS_AUTH_REQUEST_CODE_ADDTOCALENDAR);
                      System.out.println("UserRecoverableAuthException :");
                      userAuthEx.printStackTrace();
                      return;
                   } catch (IOException transientEx) {
                    
                       System.out.println("IOException :");
                       transientEx.printStackTrace();
                      return;
                   } catch (GoogleAuthException authEx) {
                    
                       System.out.println("GoogleAuthException :");
                       authEx.printStackTrace();
                      return;
                   }
              
        }
       
       
        void createNewCalendar(final String calendarName) {                   
           
               AsyncTask task = new AsyncTask() {
                  
                   ProgressDialog dialog;
                    @Override
                    protected void onPostExecute(Object result) {
                        // TODO Auto-generated method stub
                        super.onPostExecute(result);
                        dialog.dismiss();
                    }

                    @Override
                    protected void onPreExecute() {
                        // TODO Auto-generated method stub
                        super.onPreExecute();
                       
                        dialog = new ProgressDialog(CalendarActivity.this);
                        dialog.setCanceledOnTouchOutside(false);
                        dialog.setCancelable(false);
                        dialog.setMessage("Creating calendar....");
                        dialog.show();
                    }
                @Override
                protected Object doInBackground(Object... params) {
                    createCalendar(calendarName);
                    return null;
                }
               };
               task.execute((Void)null);
           }
       
       
        protected void createCalendar(String calendarName) {
           
               try {

                  final String token = GoogleAuthUtil.getToken(CalendarActivity.this, accountName, "oauth2:https://www.googleapis.com/auth/calendar"); //oauth2:https://www.googleapis.com/auth/calendar
             
                  if (token.contains("invalid") ){
                      // invalidate the token that we found is bad so that GoogleAuthUtil won't
                      // return it next time (it may have cached it)
                      GoogleAuthUtil.invalidateToken(CalendarActivity.this, token);
                      // consider retrying getAndUseTokenBlocking() once more
                      return;
                  }
                  else if(token.length() > 0)
                     {                                                                                   
                                                
                        String jsonString = "{\"summary\": \""+calendarName+"\"}";
                          
                         String url = "https://www.googleapis.com/calendar/v3/calendars?access_token=" + token;
                         URL u = new URL(url);
                         HttpURLConnection connection = (HttpURLConnection) u.openConnection();          
                         connection.setDoOutput(true);
                         connection.setDoInput(true);
                         connection.setInstanceFollowRedirects(false);
                         connection.setRequestMethod("POST");
                         String a = connection.getRequestMethod();
                         connection.setRequestProperty("Content-Type", "application/json");
                         connection.setRequestProperty("Accept-Charset", "utf-8");
                         connection.setRequestProperty("Authorization", "OAuth" + token);
                         connection.setUseCaches(false);
                         DataOutputStream wr = new DataOutputStream(connection.getOutputStream ());
                         wr.writeBytes(jsonString);
                         wr.flush();

                         // Get the response
                         BufferedReader rd = new BufferedReader(new InputStreamReader(connection.getInputStream()));
                             String line;
                            
                        
                         while ((line = rd.readLine()) != null) {
                            System.out.println("respose :"+line);
                         }
                         wr.close();
                         rd.close();
                        
                         if(connection.getResponseCode() == 200)
                         {
                             String calendarID = "";
                             runOnUiThread(new Runnable() {
                                   
                                    @Override
                                    public void run() {
                                        // TODO Auto-generated method stub
                                        Toast.makeText(CalendarActivity.this, "Calendar added successfully", Toast.LENGTH_SHORT).show();
                                        return;
                                    }
                                });
                           
                             HttpClient client = new DefaultHttpClient();

                             HttpGet request = new HttpGet("https://www.googleapis.com/calendar/v3/users/me/calendarList??maxResults=50&access_token="+token);
                             org.apache.http.HttpResponse response = client.execute(request);
                             HttpEntity entity = response.getEntity();
                           
                             if(entity!=null) {
                                 try {
                                   
                                      String data = EntityUtils.toString(entity);
                                      System.out.println("data :"+data);                          
                                      JSONObject mainobject = new JSONObject(data);
                                      JSONArray objectarray = mainobject.getJSONArray("items");
                                     
                                      for(int i = 0; i < objectarray.length(); i++)
                                      {
                                          JSONObject subObject  =     (JSONObject) objectarray.get(i);   
                                          String id = subObject.getString("id");
                                          String name  = subObject.getString("summary");
                                          
                                          if(name.equalsIgnoreCase(calendarName.trim()))
                                          {
                                              calendarID = id;
                                              addEventToCalendar(calendarID);
                                              return;
                                          }
                                       
                                      }                                     
                                   
                                    } catch (JSONException e) {
                                        // TODO Auto-generated catch block
                                        e.printStackTrace();
                                    }
                                }
                           
                         }
                    
                     }
                  return;
               } catch (GooglePlayServicesAvailabilityException playEx) {
                 Dialog alert = GooglePlayServicesUtil.getErrorDialog(playEx.getConnectionStatusCode(), this, MY_ACTIVITYS_AUTH_REQUEST_CODE_ADDTOCALENDAR);
                 System.out.println("GooglePlayServicesAvailabilityException :");
                 playEx.printStackTrace();
               } catch (UserRecoverableAuthException userAuthEx) {
                 
                  startActivityForResult( userAuthEx.getIntent(), MY_ACTIVITYS_AUTH_REQUEST_CODE_ADDTOCALENDAR);
                  System.out.println("UserRecoverableAuthException :");
                  userAuthEx.printStackTrace();
                  return;
               } catch (IOException transientEx) {
                
                   System.out.println("IOException :");
                   transientEx.printStackTrace();
                  return;
               } catch (GoogleAuthException authEx) {
                
                   System.out.println("GoogleAuthException :");
                   authEx.printStackTrace();
                  return;
               }
          
    }
   
         @Override
         protected void onActivityResult(int requestCode, int resultCode, Intent data) {
           switch (requestCode) {
               
             case MY_ACTIVITYS_AUTH_REQUEST_CODE_CALENDARSLIST:
                 System.out.println("on activity result :"+resultCode);
                       if (resultCode == RESULT_OK) {
                           getAndUseAuthTokenInAsyncTask(accountName);
                       }
             case MY_ACTIVITYS_AUTH_REQUEST_CODE_ADDTOCALENDAR:
                 System.out.println("on activity result :"+resultCode);
                       if (resultCode == RESULT_OK) {
                           addEventToCalendar(calendarID);
                       }
                
               return;
           }
           super.onActivityResult(requestCode, resultCode, data);
         }

}

No comments:

Post a Comment