oss.ridendivideapp.PlacesAutoCompleteActivity.java Source code

Java tutorial

Introduction

Here is the source code for oss.ridendivideapp.PlacesAutoCompleteActivity.java

Source

/********************************************************************************************************
**
** RidenDivide- An open source project for the Android platform, helps users to carpool
** Application written in Java
** Application uses Google Places API
** 
** Copyright (C) 2012 Harini Ramakrishnan and Vinutha Veerayya Hiremath
**
** Please see the file License in this distribution for license terms. 
** Below is the link to the file License.
** https://github.com/HariniVinutha/RideNdivide/blob/master/License
**
** Following is the link for the repository- https://github.com/HariniVinutha/RideNdivide
**
** This program is free software: you can redistribute it and/or modify
** it under the terms of the GNU General Public License as published by
** the Free Software Foundation, either version 3 of the License, or
** (at your option) any later version.
**  
** This program is distributed in the hope that it will be useful,
** but WITHOUT ANY WARRANTY; without even the implied warranty of
** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
** GNU General Public License for more details.
** 
** You should have received a copy of the GNU General Public License
** along with this program.  If not, see <http://www.gnu.org/licenses/>.
** 
** Written by Harini Ramakrishnan <harini.ramki@gmail.com> and 
** Vinutha Veerayya Hiremath <mail2vintu@gmail.com>
** 
** References - http://android.vexedlogic.com/2011/07/16/android-date-time-setting-dialog/
** http://stackoverflow.com/questions/3574644/how-can-i-find-the-latitude-and-longitude-from-address
** License- http://stackexchange.com/legal
** https://developers.google.com/places/documentation/
** License - https://developers.google.com/readme/terms, http://www.google.com/intl/en/policies/terms/
** https://developers.google.com/academy/apis/maps/places/autocomplete-android
** License- https://developers.google.com/readme/terms, http://www.google.com/intl/en/policies/terms/
** http://misc.phillipmartin.info/misc_carpool_01.htm
** License - http://www.phillipmartin.info/clipart/homepage2.htm
**
*********************************************************************************************************/

package oss.ridendivideapp;

import android.app.*;
import android.app.DatePickerDialog.OnDateSetListener;
import android.app.TimePickerDialog.OnTimeSetListener;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.ArrayAdapter;
import android.widget.AutoCompleteTextView;
import android.widget.Button;
import android.widget.DatePicker;
import android.widget.EditText;
import android.widget.Spinner;
import android.widget.TimePicker;
import android.app.Activity;
import android.app.Dialog;
import android.content.DialogInterface;
import android.content.Intent;
import java.io.IOException;
import java.io.InputStream;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.impl.client.DefaultHttpClient;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import oss.ridendivideapp.PlacesAutoCompleteAdapter;
import oss.ridendivideapp.DBAdapter;

/*********************************************************************************************************
** PlacesAutoCompleteActivity is used by the carpool host to enter ride details like from and to address, 
** radius, seats, date and time.
*********************************************************************************************************/
public class PlacesAutoCompleteActivity extends Activity implements OnItemClickListener {

    /* Defining variables */
    private AutoCompleteTextView gr_frm_acView, gr_to_acView;
    private PlacesAutoCompleteAdapter gr_frm_adapter, gr_to_adapter;
    private Spinner sp_seats;
    String gr_frm_addr, gr_to_addr, str_usrid, str_date, str_time;
    private Button buttonSubmit, buttonCancel, datePicker, timePicker;
    private EditText et_radius = null;
    private EditText et_cost = null;
    String[] str_seats = { "1", "2", "3", "4", "5", "6", "7" };
    String selected_seat = "0";
    int rad_value;
    float cost_value;
    Long time;
    Double frm_lattitude, frm_longitude, to_lattitude, to_longitude;
    JSONObject jsonObject_main_frm, jsonObject_main_to;
    int flag;
    private DBAdapter gr_datasource;

    /* Create calendar instance to set/get date and time */
    private Calendar dateTime = Calendar.getInstance();
    private SimpleDateFormat dateFormatter = new SimpleDateFormat("MMMM dd, yyyy");
    private SimpleDateFormat timeFormatter = new SimpleDateFormat("hh:mm a");
    private static final int DIALOG_DATE = 1;
    private static final int DIALOG_TIME = 2;

    /* Called when the activity is first created */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        try {

            super.onCreate(savedInstanceState);
            setContentView(R.layout.give_ride_content);
            /* Creating DBAdapter instance */
            gr_datasource = new DBAdapter(this);

            /* Get email ID from previous activity to maintain session */
            Bundle extras = getIntent().getExtras();
            if (extras != null) {
                str_usrid = extras.getString("usrid");
            }

            buttonSubmit = (Button) findViewById(R.id.btn_gr_submit);
            buttonCancel = (Button) findViewById(R.id.btn_gr_cancel);
            /* Get radius and cost */
            et_radius = (EditText) this.findViewById(R.id.txt_gr_radius);
            et_cost = (EditText) this.findViewById(R.id.txt_gr_cost);

            /* Adding PlacesAutoComplete adapter to the FROM autocomplete field */
            gr_frm_acView = (AutoCompleteTextView) findViewById(R.id.txt_gr_from);
            gr_frm_adapter = new PlacesAutoCompleteAdapter(this, R.layout.frm_item_list);
            gr_frm_acView.setAdapter(gr_frm_adapter);
            gr_frm_acView.setOnItemClickListener(this);

            /* Adding PlacesAutoComplete adapter to the TO autocomplete field */
            gr_to_acView = (AutoCompleteTextView) findViewById(R.id.txt_gr_to);
            gr_to_adapter = new PlacesAutoCompleteAdapter(this, R.layout.to_item_list);
            gr_to_acView.setAdapter(gr_to_adapter);
            gr_to_acView.setOnItemClickListener(this);

            /* Adding array adapter to spinner control for seats */
            sp_seats = (Spinner) findViewById(R.id.spn_gr_seats);
            ArrayAdapter<String> seats_adapter = new ArrayAdapter<String>(this,
                    android.R.layout.simple_spinner_item, str_seats);
            sp_seats.setAdapter(seats_adapter);

            /* Prompt a dialog box upon Date button click */
            datePicker = (Button) findViewById(R.id.btn_gr_datepicker);
            datePicker.setText(dateFormatter.format(dateTime.getTime()));
            datePicker.setOnClickListener(new View.OnClickListener() {
                public void onClick(View v) {
                    showDialog(DIALOG_DATE);
                }
            });

            /* Prompt a dialog box upon Time button click */
            timePicker = (Button) findViewById(R.id.btn_gr_timepicker);
            timePicker.setText(timeFormatter.format(dateTime.getTime()));
            timePicker.setOnClickListener(new View.OnClickListener() {

                public void onClick(View v) {
                    showDialog(DIALOG_TIME);
                }
            });

            buttonSubmit.setOnClickListener(buttonSubmitOnClickListener);
            buttonCancel.setOnClickListener(buttonCancelOnClickListener);
            sp_seats.setOnItemSelectedListener(spinnerseatsOnItemSelectedListener);
        } catch (Exception e) {
            Log.e("Places AutoComplete Activity OnCreate:", e.toString());
        }

    }

    /* Get selected seat from spinner control */
    Spinner.OnItemSelectedListener spinnerseatsOnItemSelectedListener = new Spinner.OnItemSelectedListener() {
        @Override

        public void onItemSelected(AdapterView<?> arg0, View arg1, int arg2, long arg3) {
            int item = sp_seats.getSelectedItemPosition();
            selected_seat = str_seats[item].toString();
        }

        public void onNothingSelected(AdapterView<?> arg0) {
            flag = 1;

        }
    };

    Button.OnClickListener buttonSubmitOnClickListener = new Button.OnClickListener() {
        @Override
        public void onClick(View arg0) {
            try {
                /* Open Database */
                gr_datasource.open();
                /* Get from and to address from autocomplete fields */
                gr_frm_addr = gr_frm_acView.getText().toString();
                gr_to_addr = gr_to_acView.getText().toString();

                flag = 0;
                /* Checking if FROM and TO address is empty */
                if (gr_frm_addr.length() == 0) {
                    gr_frm_acView.setError("Enter from address");
                    flag = 1;
                } else if (gr_to_addr.length() == 0) {
                    gr_to_acView.setError("Enter to address");
                    flag = 1;
                }
                /* Radius validation */
                String str_radius = et_radius.getText().toString();
                if (str_radius.length() == 0) {
                    et_radius.setError("Enter valid radius");
                    flag = 1;
                } else {
                    rad_value = Integer.valueOf(et_radius.getText().toString());
                    if (rad_value < 0 || rad_value > 20) {
                        et_radius.setError("Limit 20 miles");
                        flag = 1;
                    }
                }
                /* Cost Validation */
                String str_cost = et_cost.getText().toString();
                if (str_cost.length() == 0) {
                    et_cost.setError("Enter valid cost");
                    flag = 1;
                } else {
                    cost_value = Float.valueOf(et_cost.getText().toString());
                    if (cost_value < 0 || cost_value > 1000) {
                        et_cost.setError("Limit 1000 dollars");
                        flag = 1;
                    }
                }

                if (flag == 0) {
                    /* Function call to calculate lattitudes and longitudes for FROM address */
                    jsonObject_main_frm = getLocationInfo(gr_frm_addr);
                    frm_lattitude = getLattitude(jsonObject_main_frm);
                    frm_longitude = getLongitude(jsonObject_main_frm);

                    /* Function call to calculate lattitudes and longitudes for TO address */
                    jsonObject_main_to = getLocationInfo(gr_to_addr);
                    to_lattitude = getLattitude(jsonObject_main_to);
                    to_longitude = getLongitude(jsonObject_main_to);

                    str_date = datePicker.getText().toString();
                    /* Convert time to milliseconds */
                    time = dateTime.getTimeInMillis();
                    /* Insert into RIDEDETAILS table */
                    long id;
                    id = gr_datasource.insertridedetails(str_usrid, gr_frm_addr, gr_to_addr, rad_value, str_date,
                            time, selected_seat, cost_value, frm_lattitude, frm_longitude, to_lattitude,
                            to_longitude);
                    /* Close database object */
                    gr_datasource.close();

                    /* On inserting Ride Details redirect to choose ride screen or exit */
                    AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder(
                            PlacesAutoCompleteActivity.this);
                    alertDialogBuilder.setTitle("Ride 'n Divide");
                    alertDialogBuilder.setMessage("Thank you, for giving a ride! Do you want to check other rides?")
                            .setCancelable(false)
                            .setPositiveButton("Check Rides", new DialogInterface.OnClickListener() {
                                public void onClick(DialogInterface dialog, int id) {
                                    Intent reselect = new Intent(PlacesAutoCompleteActivity.this,
                                            ChooseRideActivity.class);
                                    reselect.putExtra("usrid", str_usrid);
                                    startActivity(reselect);
                                }
                            }).setNegativeButton("Exit", new DialogInterface.OnClickListener() {
                                public void onClick(DialogInterface dialog, int id) {
                                    dialog.cancel();
                                    PlacesAutoCompleteActivity.this.finish();

                                }
                            });

                    AlertDialog alertDialog = alertDialogBuilder.create();
                    alertDialog.show();
                }

            } catch (Exception e) {
                Log.e("Places AutoComplete Activity buttonsubmit:", e.toString());
            }
        }

    };

    Button.OnClickListener buttonCancelOnClickListener = new Button.OnClickListener() {
        @Override
        public void onClick(View arg0) {
            /* On clicking cancel, code to exit/reset */
            AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder(PlacesAutoCompleteActivity.this);
            alertDialogBuilder.setTitle("Ride 'n Divide");
            alertDialogBuilder.setMessage("Are you sure you want to exit?").setCancelable(false)
                    .setPositiveButton("Yes", new DialogInterface.OnClickListener() {
                        public void onClick(DialogInterface dialog, int id) {
                            PlacesAutoCompleteActivity.this.finish();
                        }
                    }).setNegativeButton("No", new DialogInterface.OnClickListener() {
                        public void onClick(DialogInterface dialog, int id) {
                            gr_frm_acView.setText("");
                            gr_to_acView.setText("");
                            et_radius.setText("");
                            et_cost.setText("");
                            dialog.cancel();
                        }
                    });

            AlertDialog alertDialog = alertDialogBuilder.create();
            alertDialog.show();
        }
    };

    public void onItemClick(AdapterView<?> adapterView, View view, int position, long id) {
        /* Get selected FROM and TO address from matching list values */
        if (view == gr_frm_acView) {
            gr_frm_addr = (String) adapterView.getItemAtPosition(position);

        } else if (view == gr_to_acView) {
            gr_to_addr = (String) adapterView.getItemAtPosition(position);

        }
    }

    public static JSONObject getLocationInfo(String address) {
        StringBuilder stringBuilder = new StringBuilder();
        try {
            /* Code to get top 5 matching addresses to populate autocomplete list
             by parsing through values in a JSON object   */
            address = address.replaceAll(" ", "%20");
            HttpPost httppost = new HttpPost(
                    "http://maps.google.com/maps/api/geocode/json?address=" + address + "&sensor=false");
            HttpClient client = new DefaultHttpClient();
            HttpResponse response;
            stringBuilder = new StringBuilder();
            response = client.execute(httppost);
            HttpEntity entity = response.getEntity();
            InputStream stream = entity.getContent();
            int b;
            while ((b = stream.read()) != -1) {
                stringBuilder.append((char) b);
            }
        } catch (ClientProtocolException e) {
        } catch (IOException e) {
        }

        JSONObject jsonObject = new JSONObject();
        try {
            jsonObject = new JSONObject(stringBuilder.toString());
        } catch (JSONException e) {
            Log.e("JSON Object", "JSON Exception", e);
            e.printStackTrace();
        }

        return jsonObject;
    }

    public static double getLattitude(JSONObject jsonObject) {
        double lattitude = 0;
        try {
            /* Get lattitude from JSON object */
            lattitude = ((JSONArray) jsonObject.get("results")).getJSONObject(0).getJSONObject("geometry")
                    .getJSONObject("location").getDouble("lat");

        } catch (JSONException e) {

            Log.e("JSON Object", "JSON Exception", e);
        }

        return lattitude;
    }

    public static double getLongitude(JSONObject jsonObject) {
        double longitude = 0;
        try {
            /* Get longitude from JSON object */
            longitude = ((JSONArray) jsonObject.get("results")).getJSONObject(0).getJSONObject("geometry")
                    .getJSONObject("location").getDouble("lng");

        } catch (JSONException e) {
            Log.e("JSON Object", "JSON Exception", e);
        }

        return longitude;
    }

    @Override
    protected Dialog onCreateDialog(int id) {
        switch (id) {
        case DIALOG_DATE:
            return new DatePickerDialog(this, new OnDateSetListener() {
                /* Code to set/get date in a dialog box */
                @Override
                public void onDateSet(DatePicker view, int year, int monthOfYear, int dayOfMonth) {
                    dateTime.set(year, monthOfYear, dayOfMonth);
                    datePicker.setText(dateFormatter.format(dateTime.getTime()));
                }
            }, dateTime.get(Calendar.YEAR), dateTime.get(Calendar.MONTH), dateTime.get(Calendar.DAY_OF_MONTH));

        case DIALOG_TIME:
            return new TimePickerDialog(this, new OnTimeSetListener() {
                /* Code to set/get time in a dialog box */
                @Override
                public void onTimeSet(TimePicker view, int hourOfDay, int minute) {
                    dateTime.set(Calendar.HOUR_OF_DAY, hourOfDay);
                    dateTime.set(Calendar.MINUTE, minute);
                    timePicker.setText(timeFormatter.format(dateTime.getTime()));

                }
            }, dateTime.get(Calendar.HOUR_OF_DAY), dateTime.get(Calendar.MINUTE), false);

        }
        return null;
    }
}