Teams Winter 2011/team5/assignment/tutorial

From CDOT Wiki
Revision as of 14:30, 16 April 2011 by Abhishekbh (talk | contribs)
Jump to: navigation, search

Create Android Project

1.1 Setup Eclipse with the ADT plugin as directed to ttp://www.vogella.de/articles/Android/article.html#installation here] 1.2. Create a new android project in your eclipse: File -> New -> Android Project:

Database Helper


package dps914.team5.thingsToDo;

import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteException;
import android.database.sqlite.SQLiteOpenHelper;
import android.util.Log;

public class DAL {
	// Logcat Tag
	private static final String TAG = DAL.class.getSimpleName();

	// DB info
	private static final String DATABASE_NAME = "mytasks.db";
	private static final String DATABASE_TABLE = "mytasks_table";
	private static final int DATABASE_VERSION = 1;

	// DB Attributes
	public static final String KEY_ROW_ID = "_id";
	public static final String KEY_TASK_NAME = "task_name";
	public static final String KEY_TASK_DESC = "task_desc";
	public static final String KEY_TASK_LAT = "task_latitude";
	public static final String KEY_TASK_LONG = "task_longitude";
	public static final String KEY_TASK_ADDRESS = "task_address";
	public static final String KEY_TASK_COMPLETE_TIME = "task_complete_time";
	public static final String KEY_TASK_CREATE_TIME = "task_create_time";
	public static final String KEY_TASK_COMPLETED = "task_completed";
	public static final String KEY_TASK_GEOLOCATED = "task_geolocated";

	// DB Stuff
	private Context ctx;
	private SQLiteDatabase db;

	// Create DB String
	private static final String CREATE_TABLE =
	        "create table mytasks_table ("
	        	+ "_id integer primary key autoincrement, "
	            + "task_name text not null,"
	            + "task_desc text,"
	            + "task_latitude real,"
	            + "task_longitude real,"
	            + "task_address text,"
	            + "task_complete_time text,"
	            + "task_create_time text,"
	            + "task_completed boolean default 0,"
	            + "task_geolocated boolean default 0"
	            +");";

	/*
	 * DAL
	 * DAL Context Constructor
	 */
	public DAL(Context context) {
		ctx = context;
		OpenHelper oh = new OpenHelper(ctx);
		db = oh.getWritableDatabase();	
	}

	/*
	 * close
	 * Close DB
	 */
    public void close() {
    	db.close();
    }

    /*
     * createRow
     * Insert a new row
     */
    public void createRow(String tName, String tDesc, String address, String createTime, String completeTime, boolean geolocated, float tLat, float tLong) {
        ContentValues initialValues = new ContentValues();
        initialValues.put(KEY_TASK_NAME, tName);
        initialValues.put(KEY_TASK_DESC, tDesc);
        initialValues.put(KEY_TASK_LAT, tLat);
        initialValues.put(KEY_TASK_LONG, tLong);
        initialValues.put(KEY_TASK_ADDRESS, address);
        initialValues.put(KEY_TASK_COMPLETE_TIME, completeTime);
        initialValues.put(KEY_TASK_CREATE_TIME, createTime);
        initialValues.put(KEY_TASK_COMPLETED, 1);
        initialValues.put(KEY_TASK_GEOLOCATED, geolocated);
        db.insert(DATABASE_TABLE, null, initialValues);
    }

    /*
     * updateRow
     * Update a row based on rowId
     */
    public void updateRow(long rowId, String tName, String tDesc, String address, String createTime, String completeTime, boolean completed, boolean geolocated, float tLat, float tLong) {
        ContentValues updatedValues = new ContentValues();
        updatedValues.put(KEY_TASK_NAME, tName);
        updatedValues.put(KEY_TASK_DESC, tDesc);
        updatedValues.put(KEY_TASK_LAT, tLat);
        updatedValues.put(KEY_TASK_LONG, tLong);
        updatedValues.put(KEY_TASK_ADDRESS, address);
        updatedValues.put(KEY_TASK_COMPLETE_TIME, completeTime);
        updatedValues.put(KEY_TASK_CREATE_TIME, createTime);
        updatedValues.put(KEY_TASK_COMPLETED, completed);
        updatedValues.put(KEY_TASK_GEOLOCATED, geolocated);
        db.update(DATABASE_TABLE, updatedValues,"_id='" + rowId + "'", null);
    }

    /*
     * getAllRows
     * Retrieve all rows
     */
    public Cursor getAllRows() {
        try {
            return db.query(DATABASE_TABLE, new String[] {KEY_ROW_ID, KEY_TASK_NAME, KEY_TASK_DESC , KEY_TASK_LAT, KEY_TASK_LONG, KEY_TASK_ADDRESS, KEY_TASK_COMPLETE_TIME, KEY_TASK_CREATE_TIME, KEY_TASK_COMPLETED, KEY_TASK_GEOLOCATED}, null, null, null, null, null);           
        } catch (SQLiteException e) {
            Log.e(TAG, "Exception on query");
            return null;
        }
    }

    /*
     * getRowByName
     * Retrieve specific rows by name
     */
    public Cursor getRowByName(String taskName) {
        Cursor cursor = db.query("mytasks_table", new String[] {"_id", "task_name", "task_desc", "task_address", "task_geolocated"}, 
                "task_name like '" + taskName + "'", null, null, null, null);

        return cursor;
    }

    /*
     * getRowByName
     * Retrieve specific rows by id
     */
    public Cursor getRowById(int _id) {
        Cursor cursor = db.query("mytasks_table", new String[] {"_id", "task_name", "task_desc", "task_address", "task_geolocated"}, 
                "_id = '" + _id + "'", null, null, null, null);

        return cursor;
    }

    /*
     * updateRow
     * Update row by id
     */
    public void updateRow(String tName, String tDesc, String address, float tLat, float tLong, int _id) {
        ContentValues updatedValues = new ContentValues();
        updatedValues.put(KEY_TASK_NAME, tName);
        updatedValues.put(KEY_TASK_DESC, tDesc);
        updatedValues.put(KEY_TASK_ADDRESS, address);
        updatedValues.put(KEY_TASK_LAT, tLat);
        updatedValues.put(KEY_TASK_LONG, tLong);
        db.update(DATABASE_TABLE, updatedValues,"_id='" + _id + "'", null);
    }

    /*
     * deleteRow
     * Delete a row
     */
    public void deleteRow(long rowId) {
		db.delete(DATABASE_TABLE, "_id=" + rowId, null);
    }

    /*
     * OpenHelper
     * Opens the DB, and updates it if needed
     */
    private static class OpenHelper extends SQLiteOpenHelper {
    	public OpenHelper(Context context) {
    		super(context, DATABASE_NAME, null, DATABASE_VERSION);	
    	}

    	@Override
    	public void onCreate(SQLiteDatabase db) {
    		Log.d(TAG, "onCreate sql " + CREATE_TABLE);
    		db.execSQL(CREATE_TABLE);	
    	}

    	@Override
    	public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
    		db.execSQL("DROP TABLE IF EXISTS " + DATABASE_TABLE);
    		onCreate(db);
    	}
    }
}

ThingsToDo Activity Code


package dps914.team5.thingsToDo;

import android.app.ListActivity;
import android.content.Intent;
import android.database.Cursor;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.widget.AdapterView;
import android.widget.CheckBox;
import android.widget.ListAdapter;
import android.widget.ListView;
import android.widget.SimpleCursorAdapter;
import android.widget.TableRow;
import android.widget.TextView;

public class ThingsToDo extends ListActivity {
	// UI Connections
    private TableRow titleBarMain;
    private TextView titlebarText;

	// Tag for Log
    private static final String TAG = null;

	// DB Helper and Cursor
	private DAL dbHelper;
	private Cursor cur;

	// Selected task id
	private int listViewTasksId;

    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        // Create the DAL
        dbHelper = new DAL(ThingsToDo.this);

        // Get UI Elements
        titleBarMain = (TableRow)findViewById(R.id.titleBarMain);
        
        // Retrieve Tasks
        retrieveTasks();
    }

	private void retrieveTasks() {
		cur = dbHelper.getAllRows();
    	startManagingCursor(cur);
    	SimpleCursorAdapter cursorAdapter = new SimpleCursorAdapter(
    			this,
    			R.layout.task_row,
    			cur,
    			new String[] {DAL.KEY_TASK_NAME, DAL.KEY_TASK_COMPLETE_TIME, DAL.KEY_TASK_COMPLETED, DAL.KEY_ROW_ID},
    			new int[] {R.id.task_name, R.id.task_date}
    	);
    	ListAdapter adapter = cursorAdapter;
    	setListAdapter(adapter);

    	final ListView tasksList = getListView();

    	// Upon Task Select - Click Listener
        tasksList.setOnItemClickListener(new ListView.OnItemClickListener() {
            public void onItemClick(AdapterView<?> a, View v, int position, long id) {
                try {
                    // Remembers the selected Index
                    setListViewTasksId(tasksList.getSelectedItemPosition());
                    Log.d(TAG, "############################## Selected POSITION " + position);
                    Log.d(TAG, "############################## Selected ID " + id);
                    Log.d(TAG, "############################## Selected ADAPTERVIEW " + a);
                    Log.d(TAG, "############################## Selected ADAPTERVIEWPOSITION " + tasksList.getItemAtPosition(position));

                    String taskNameRetrieved = (String)((Cursor)tasksList.getItemAtPosition(position)).getString(1); 

        			Intent shiftIntent = new Intent(ThingsToDo.this, TTDEditTask.class);
        			shiftIntent.putExtra("taskName", taskNameRetrieved);
        			shiftIntent.putExtra("taskId", id);

        			startActivity(shiftIntent);
        			Log.d(TAG, "############################## Activity Started");
                } catch(Exception e) {
                    Log.d(TAG, "############################## Exception in onItemClick " + e);
                }
            }
        });
	}

	@Override
	public boolean onCreateOptionsMenu(Menu menu) {
		MenuInflater inflater = getMenuInflater();
		inflater.inflate(R.menu.main_menu, menu);
		return super.onCreateOptionsMenu(menu);
	}

	@Override
	public boolean onOptionsItemSelected(MenuItem item) {
		switch (item.getItemId()) {
			// Edit Contact
			case R.id.contact_create:
				Log.d(TAG, "############################## Create button clicked");
				Intent i = new Intent(this, TTDNewTask.class);
				startActivity(i);
				break;

			// Exit App
			case R.id.contact_exit:
				Log.d(TAG, "############################## Exit button clicked");
				finish();
				break;
		}
		return super.onOptionsItemSelected(item);
	}

	@Override
	public boolean onMenuItemSelected(int featureId, MenuItem item) {
		return super.onMenuItemSelected(featureId, item);
	}

	public void setListViewTasksId(int listViewTasksId) {
		this.listViewTasksId = listViewTasksId;
	}

	public int getListViewTasksId() {
		return listViewTasksId;
	}

	public void setTitleBarMain(TableRow titleBarMain) {
		this.titleBarMain = titleBarMain;
	}

	public TableRow getTitleBarMain() {
		return titleBarMain;
	}

	public void setTitlebarText(TextView titlebarText) {
		this.titlebarText = titlebarText;
	}

	public TextView getTitlebarText() {
		return titlebarText;
	}
}

ThingsToDo Activity Layout


<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    >
    <TableRow
		android:layout_height="wrap_content"
		android:layout_width="match_parent"
		android:id="@+id/titleBarMain"
		android:background="#848285"
	>
		<TextView  
		    android:layout_width="fill_parent" 
		    android:layout_height="wrap_content" 
		    android:text="@string/titlebar_text"
		    android:gravity="center_horizontal"
		    android:textColor="#ffffff"
		    android:textStyle="bold"
		    android:padding="3sp"
		    android:textSize="15sp"
		    />
    </TableRow>
    <ListView
			android:layout_height="wrap_content"
			android:layout_width="match_parent"
			android:headerDividersEnabled="true"
			android:footerDividersEnabled="true"
			android:id="@+id/android:list"/>
</LinearLayout>


And a row layout for the list layout:


<?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:layout_gravity="fill_horizontal"
	android:orientation="vertical"
>
	<TableRow
		android:id="@+id/TableRow07"
		android:layout_height="wrap_content"
		android:layout_width="match_parent"
	>
		<CheckBox
			android:text=""
			android:id="@+id/cb_task_done"
			android:layout_width="wrap_content"
			android:layout_height="wrap_content"
		/>
		<LinearLayout
				android:id="@+id/linearLayout23"
				android:layout_width="wrap_content"
				android:layout_height="wrap_content"
				android:orientation="vertical"
		>
			<TextView
				android:id="@+id/task_name"
				android:text="@string/view_task_name"
				android:layout_gravity="left"
				android:height="30sp"
				android:layout_height="wrap_content"
				android:layout_width="wrap_content"
				android:textSize="20sp"
				android:padding="1sp"
			/>
			<TextView
				android:id="@+id/task_date"
				android:text="@string/view_task_date"
				android:layout_gravity="left"
				android:layout_height="wrap_content"
				android:layout_width="wrap_content"
				android:textSize="10sp"
				android:padding="1sp"
			/>
		</LinearLayout>
	</TableRow>
</LinearLayout>

ThingsToDo Activity Menu


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

<menu xmlns:android="http://schemas.android.com/apk/res/android">
	<item
		android:title="@string/main_menu_create"
		android:id="@+id/contact_create"
		android:icon="@android:drawable/ic_menu_edit"
	/>
	<item
		android:title="@string/main_menu_exit"
		android:id="@+id/contact_exit"
		android:icon="@android:drawable/ic_menu_close_clear_cancel"
	/>
</menu>

TTDNewTask Activity Code


package dps914.team5.thingsToDo;


import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;
import java.util.List;
import java.util.SimpleTimeZone;
import java.util.TimeZone;


import android.app.Activity;
import android.app.AlarmManager;
import android.app.DatePickerDialog;
import android.app.Dialog;
import android.app.PendingIntent;
import android.app.TimePickerDialog;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.location.Address;
import android.location.Geocoder;
import android.location.Location;
import android.location.LocationListener;
import android.location.LocationManager;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.DatePicker;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.TimePicker;
import android.widget.CheckBox;
import android.widget.Toast;


public class TTDNewTask extends Activity {
	// Tag for Log
	private static final String TAG = null;
	private Geocoder localGeoCoder;
	//private MapView myMap;


	// Location based variables
	private LocationManager locationManager;
	private static final long ALERT_RADIUS = 1000;
	private static final long ALERT_EXPIRATION = -1;


	// User Input Values
	private String task_name = null;
	private String task_desc = null;
	private String task_address = null;
	private String sdf_time = null;
	private boolean task_geolocated = false;


	private PendingIntent pendingIntent;


	// UI for date and time
	static final int DATE_DIALOG_ID = 0;
	static final int TIME_DIALOG_ID = 1;


	private int dueHour= 0;
	private int dueMin= 0;
	private int dueDate= 22;
	private int dueMon= 9;
	private int dueYear= 2011;
	StringBuilder dueTime = null;


	/**
	 * @return the dueHour
	 */
	protected int getDueHour() {
		return dueHour;
	}


	/**
	 * @param dueHour the dueHour to set
	 */
	protected void setDueHour(int dueHour) {
		this.dueHour = dueHour;
	}


	/**
	 * @return the dueMin
	 */
	protected int getDueMin() {
		return dueMin;
	}


	/**
	 * @param dueMin the dueMin to set
	 */
	protected void setDueMin(int dueMin) {
		this.dueMin = dueMin;
	}


	/**
	 * @return the dueDate
	 */
	protected int getDueDate() {
		return dueDate;
	}


	/**
	 * @param dueDate the dueDate to set
	 */
	protected void setDueDate(int dueDate) {
		this.dueDate = dueDate;
	}


	/**
	 * @return the dueMon
	 */
	protected int getDueMon() {
		return dueMon;
	}


	/**
	 * @param dueMon the dueMon to set
	 */
	protected void setDueMon(int dueMon) {
		this.dueMon = dueMon;
	}


	/**
	 * @return the dueYear
	 */
	protected int getDueYear() {
		return dueYear;
	}


	/**
	 * @param dueYear the dueYear to set
	 */
	protected void setDueYear(int dueYear) {
		this.dueYear = dueYear;
	}
	
	// Date format to am/pm
	protected String hourToTwelve(int incomingHour, int incomingMinute) {
		String am_pm = " AM";
		String retVal = null;
		
		if (incomingHour > 11) {
			am_pm = " PM";
		} else if (incomingHour == 0) {
			
		}
		
		if (incomingMinute < 10) {
			if (incomingHour == 0) {
				retVal = "0" + incomingHour + ":0" + incomingMinute + am_pm;
			} else {
				retVal = incomingHour + ":0" + incomingMinute + am_pm;	
			}
		} else {
			if (incomingHour == 0) {
				retVal = "0" + incomingHour + ":" + incomingMinute + am_pm;
			} else {
				retVal = incomingHour + ":" + incomingMinute + am_pm;	
			}
		}


		return retVal;
	}


	// Date format to month
	protected String setMonthOutput (int incomingMonthIndex) {
		String[] months = {"Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"};
		return months[incomingMonthIndex];
	}


	// Callback for datepicker
	final DatePickerDialog.OnDateSetListener mDateSetListener =
		new DatePickerDialog.OnDateSetListener() {
			public void onDateSet(DatePicker view, int year, int monthOfYear, int dayOfMonth) {
				Log.d(TAG, "############################## Year: " + year);
				Log.d(TAG, "############################## Mon: " + monthOfYear);
				Log.d(TAG, "############################## Date: " + dayOfMonth);
				setDueYear(year);
				setDueMon(monthOfYear);
				setDueDate(dayOfMonth);
				dueTime = new StringBuilder().append("Due On: ").append(setMonthOutput(dueMon)).append(" ").append(dueDate).append(", ").append(dueYear).append(" at ");
				Log.d(TAG, "############################## StringBuilder: : " + dueTime.toString());
				showDialog(TIME_DIALOG_ID);
			}
		};


		// Callback for timepicker
		final TimePickerDialog.OnTimeSetListener mTimeSetListener =
			new TimePickerDialog.OnTimeSetListener() {
				public void onTimeSet(TimePicker view, int hourOfDay, int minute) {
					Log.d(TAG, "############################## Hour: " + hourOfDay);
					Log.d(TAG, "############################## Min: " + minute);
					setDueHour(hourOfDay);
					setDueMin(minute);
					dueTime.append(" ").append(hourToTwelve(hourOfDay, minute));
					Log.d(TAG, "############################## StringBuilder: : " + dueTime.toString());
				}
			};


	// Dialog handler
	@Override
	protected Dialog onCreateDialog (int id) {
		String[] ids = TimeZone.getAvailableIDs(-5 * 60 * 60 * 1000);
		if (ids.length == 0)
			System.exit(0);
		SimpleTimeZone edt = new SimpleTimeZone(-7 * 60 * 60 * 1000, ids[0]);
		Calendar calendar = new GregorianCalendar(edt);
		Date nowTime = new Date();
		calendar.setTime(nowTime);


		switch (id) {
			case DATE_DIALOG_ID:
				return new DatePickerDialog(this, mDateSetListener, calendar.get(Calendar.YEAR), calendar.get(Calendar.MONTH), calendar.get(Calendar.DATE) + 1);
			case TIME_DIALOG_ID:
				return new TimePickerDialog(this, mTimeSetListener, calendar.get(Calendar.HOUR), calendar.get(Calendar.MINUTE), false);
    		}
		return null;
	}


    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.ttd_new_task);
        Log.d(TAG, "############################## New Task");


        // Buttons and Checkboxes
        Button datetime_button = (Button) findViewById(R.id.btn_dueon);
		Button save_button = (Button) findViewById(R.id.btn_save);
		CheckBox geolocate_button = (CheckBox) findViewById(R.id.checkbox_geolocate);


        // UI Elements to erase
        final EditText addressEdit = (EditText) findViewById(R.id.task_address_edit);
        addressEdit.setVisibility(View.GONE);
        final TextView addressEditLabel = (TextView) findViewById(R.id.TextView03);
        addressEditLabel.setVisibility(View.GONE);


        // Location manager
        locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
        locationManager.requestLocationUpdates(
                		LocationManager.GPS_PROVIDER, 
                		1000, 
                		1,
                		new LocalLocationListener()
        );


////////////////////////////////////////////////////////////////////////////////////////
        // Show Dialog
        datetime_button.setOnClickListener(new OnClickListener() {
			public void onClick(View arg0) {
				Log.d(TAG, "############################## Due On Clicked");
				try {
					showDialog(DATE_DIALOG_ID);
				} catch (Exception e) {
					Log.d(TAG, "############################## Exception: " + e.getMessage());
				}
			}
        });


        // Show address edit text
        geolocate_button.setOnClickListener(new OnClickListener() {
			public void onClick(View arg0) {
				Log.d(TAG, "############################## Add Address Clicked");
				if (addressEdit.getVisibility() == 0) {
					addressEdit.setVisibility(View.GONE);
					addressEditLabel.setVisibility(View.GONE);
				} else {
					addressEdit.setVisibility(View.VISIBLE);
					addressEditLabel.setVisibility(View.VISIBLE);
				}
				task_geolocated = false;
			}
		});
////////////////////////////////////////////////////////////////////////////////////////
		// Save Button
		save_button.setOnClickListener(new OnClickListener() {
			public void onClick(View arg0) {
				// DAL
				DAL localDal = new DAL(TTDNewTask.this);


				// User's Values
				task_name = ((EditText)findViewById(R.id.task_name_edit)).getText().toString();
				task_desc = ((EditText)findViewById(R.id.task_desc_edit)).getText().toString();
				task_address = ((EditText)findViewById(R.id.task_address_edit)).getText().toString();


				// Current Time
				Date now = new Date();
				SimpleDateFormat textTime = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss");
				sdf_time = textTime.format(now);


				// Address logcat
				Log.d(TAG, "############################## Address: "+ task_address);
				Log.d(TAG, "############################## Going into geolocateAddress()");


				// Geolocate address
				Float[] returnedLocation = this.geolocateAddress(task_address);


				// Latitude and Longitude logcat
				Log.d(TAG, "############################## Latitude: "+ returnedLocation[0]);
				Log.d(TAG, "############################## Longitude: "+ returnedLocation[1]);


				Log.d(TAG, "############################################################");
				Log.d(TAG, "############################################################");
				Log.d(TAG, "############################################################");
				Log.d(TAG, "############################################################");
				Log.d(TAG, "############################## Name: "+ task_name);
				Log.d(TAG, "############################## Desc: "+ task_desc);
				Log.d(TAG, "############################## Addr: "+ task_address);
				Log.d(TAG, "############################## SDF: "+ sdf_time);
				//Log.d(TAG, "############################## DUE: "+ dueTime.toString());
				Log.d(TAG, "############################## Geolocated: "+ task_geolocated);
				Log.d(TAG, "############################## Lat: "+ returnedLocation[0]);
				Log.d(TAG, "############################## Long: "+ returnedLocation[1]);
				Log.d(TAG, "############################################################");
				Log.d(TAG, "############################################################");
				Log.d(TAG, "############################################################");
				Log.d(TAG, "############################################################");


				addProximityAlert(43.7700,-79.3437);
				//addProximityAlert(returnedLocation[0],returnedLocation[1]);


				// Save and End
				localDal.createRow(task_name, task_desc, task_address, sdf_time, dueTime.toString(), task_geolocated, returnedLocation[0], returnedLocation[1]);
				Log.d(TAG, "############################## row saved");
				Log.d(TAG, "############################## save button clicked");


				// Set Alarm
				Intent alarmServiceIntent = new Intent(TTDNewTask.this, TaskAlarmService.class);
				alarmServiceIntent.putExtra("taskName", task_name);
				pendingIntent = PendingIntent.getService(TTDNewTask.this, 0, alarmServiceIntent, 0);


				AlarmManager alarmManager = (AlarmManager)getSystemService(ALARM_SERVICE);


				Calendar calendar = Calendar.getInstance();
				calendar.set(Calendar.YEAR, dueYear);
				calendar.set(Calendar.MONTH, dueMon);
				calendar.set(Calendar.DATE, dueDate);
				calendar.set(Calendar.HOUR, dueHour);
				calendar.set(Calendar.MINUTE, dueMin);


				Log.d(TAG, "Year: " + dueYear);
				Log.d(TAG, "Month: " + dueMon);
				Log.d(TAG, "Date: " + dueDate);
				Log.d(TAG, "Hour: " + dueHour);
				Log.d(TAG, "Minute: " + dueMin);


				alarmManager.set(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), pendingIntent);


				Toast.makeText(TTDNewTask.this, "Alarm Set", Toast.LENGTH_LONG).show();


				// End activity
				finish();
			}


			private void addProximityAlert(double latitude, double longitude) {
				Intent tempIntent = new Intent(TTDNewTask.this, ProximityBroadcastReceiver.class);
				pendingIntent = PendingIntent.getService(TTDNewTask.this, 0, tempIntent, 0);


				PendingIntent proximityIntent = PendingIntent.getBroadcast(TTDNewTask.this, 0, tempIntent, 0);


				try {
					locationManager.addProximityAlert(latitude,longitude,ALERT_RADIUS,ALERT_EXPIRATION,proximityIntent);
				} catch (Exception e) {
					Log.d(TAG, "Could not set proximity alert: " + e);
				}


				//IntentFilter filter = new IntentFilter(ANON_ALERT_INTENT);
				//registerReceiver(new ProximityBroadcastReceiver(), filter);
			}


			protected Float[] geolocateAddress(String addressIncoming) {
				localGeoCoder = new Geocoder(TTDNewTask.this);
				Float[] retArr = {(float) 0.0, (float) 0.0};


		        try {
		        	Log.d(TAG, "############################## Address: " + addressIncoming);
		        	// Geolocate Address
		        	List<Address> foundAdresses = localGeoCoder.getFromLocationName(addressIncoming, 1);


		        	// If Address not found
/*		            if (foundAdresses.size() == 0) {
                      Log.d(TAG, "############################## Lat and Long NOT FOUND");
		              Dialog locationError = new AlertDialog.Builder(TTDNewTask.this)
		                .setIcon(0)
		                .setTitle("Error")
		                .setPositiveButton(R.string.task_ok, null)
		                .setMessage("Sorry, your address doesn't exist.")
		                .create();
		              locationError.show(); 
		            } else {*/
                      Log.d(TAG, "############################## Found Lat and Long");
		            	// Get Latitude and Longitude
		              for (int i = 0; i < foundAdresses.size(); ++i) {
		            	// Set returned latitude and longitude
		                Address returnedAddress = foundAdresses.get(i);
				        retArr[0] = (float) returnedAddress.getLatitude();
				        retArr[1] = (float) returnedAddress.getLongitude();
		              }
		              // Show on Map
		              //navigateToLocation((geolocatedLat * 1000000), (geolocatedLonlon * 1000000), myMap);
		            //}
		          }
		          catch (Exception e) {
		        	  Log.d(TAG, "############################## Exception: " + e);
		          }


	              Log.d(TAG, "############################## LAT: " + retArr[0]);
	              Log.d(TAG, "############################## LON: " + retArr[1]);
		          
				return retArr;
			}
		});
    }


    public class LocalLocationListener implements LocationListener {
    	public void onLocationChanged(Location location) {}
    	public void onStatusChanged(String s, int i, Bundle b) {}
    	public void onProviderDisabled(String s) {}
    	public void onProviderEnabled(String s) {}
    }
}

TTDNewTask Activity Layout


<?xml version="1.0" encoding="utf-8"?>
<TableLayout
	xmlns:android="http://schemas.android.com/apk/res/android"
	android:layout_width="match_parent"
	android:layout_height="match_parent">
    <TableRow
		android:layout_height="wrap_content"
		android:layout_width="match_parent"
		android:id="@+id/titleBarNew"
		android:background="#848285"
	>
		<TextView  
		    android:layout_width="fill_parent" 
		    android:layout_height="wrap_content" 
		    android:text="@string/titlebar_new_text"
		    android:gravity="center_horizontal"
		    android:textColor="#ffffff"
		    android:textStyle="bold"
		    android:padding="3sp"
		    android:textSize="15sp"
		    />
    </TableRow>
	<TableRow android:id="@+id/TableRow01">
		<TextView
			android:id="@+id/TextView01"
			android:text="@string/task_name"
			android:width="115px"
		/>
	</TableRow>
	<TableRow android:id="@+id/TableRow11">
		<EditText
			android:id="@+id/task_name_edit"
			android:hint="eg. Get groceries                "
			android:layout_height="match_parent"
			android:layout_width="match_parent"/>
	</TableRow>
	<TableRow android:id="@+id/TableRow02">
		<TextView
			android:id="@+id/TextView02"
			android:text="@string/task_desc"
			android:width="115px"
		/>
	</TableRow>
	<TableRow android:id="@+id/TableRow12">
		<EditText
			android:id="@+id/task_desc_edit"
			android:hint="eg. milk, tomatoes, eggs                "
			android:layout_height="match_parent"
			android:layout_width="match_parent"/>
	</TableRow>
	<TableRow android:id="@+id/TableRow03">
		<CheckBox
			android:text="@string/task_geolocated"
			android:id="@+id/checkbox_geolocate"
			android:layout_width="match_parent"
			android:layout_height="match_parent"
		/>
	</TableRow>
	<TableRow android:id="@+id/TableRow04">
		<TextView
			android:id="@+id/TextView03"
			android:text="@string/task_address"
			android:width="115px"
		/>
	</TableRow>
	<TableRow android:id="@+id/TableRow14">
		<EditText
			android:id="@+id/task_address_edit"
			android:hint="24 Sussex Drive, Ottawa, Canada"
			android:layout_width="wrap_content"
			android:layout_height="wrap_content"
		/>
	</TableRow>
	<TableRow android:id="@+id/TableRow05">
		<Button
			android:text="@string/task_date"
			android:id="@+id/btn_dueon"
			android:layout_width="wrap_content"
			android:layout_height="wrap_content"
		/>
	</TableRow>
	<TableRow android:id="@+id/TableRow06">
		<Button
			android:text="@string/task_save"
			android:id="@+id/btn_save"
			android:layout_width="wrap_content"
			android:layout_height="wrap_content"
		/>
	</TableRow>
</TableLayout>


TTDEditTask Activity Code


package dps914.team5.thingsToDo;

import java.util.List;

import android.app.Activity;
import android.app.AlertDialog;
import android.app.Dialog;
import android.database.Cursor;
import android.location.Address;
import android.location.Geocoder;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.CheckBox;
import android.widget.EditText;
import android.widget.TextView;

public class TTDEditTask extends Activity {
	// Tag for Log
	private static final String TAG = "TaskMan";
	private Geocoder localGeoCoder;
	private int task_geolocated = 0;
	private int taskIdRetrieved = 0;

    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.ttd_edit_task);
        Log.d(TAG, "############################## Edit Task");

		// DbHelper
		DAL dalInstance = new DAL(TTDEditTask.this);
		String taskNameRetrieved = null;
		String taskDescRetrieved = null;
		String taskAddressRetrieved = null;

		// UI Objects
		EditText taskNameDisplay = (EditText) findViewById(R.id.task_name_edit);
		EditText taskDescDisplay = (EditText) findViewById(R.id.task_desc_edit);
		EditText taskAddressDisplay = (EditText) findViewById(R.id.task_address_edit);
		CheckBox geolocate_button = (CheckBox) findViewById(R.id.checkbox_geolocate);
		Button saveEditTask = (Button) findViewById(R.id.btn_save);

        // UI Elements to erase
        final EditText addressEdit = (EditText) findViewById(R.id.task_address_edit);
        addressEdit.setVisibility(View.GONE);
        final TextView addressEditLabel = (TextView) findViewById(R.id.TextView03);
        addressEditLabel.setVisibility(View.GONE);

		// Get name from extras bundle
        // taskIdRetrieved = Integer.parseInt(this.getIntent().getExtras().getString("taskId").trim());
        String taskNameExtras = this.getIntent().getExtras().getString("taskName").trim();

		// Query DB using incoming taskName
		Cursor retVal = dalInstance.getRowByName(taskNameExtras);
		Log.d(TAG, ">>>>>>>>1: " + retVal.getColumnName(0));
		Log.d(TAG, ">>>>>>>>2: " + retVal.getColumnName(1));
		Log.d(TAG, ">>>>>>>>3: " + retVal.getColumnName(2));
		//Log.d(TAG, ">>>>>>>>4: " + retVal.getColumnName(3));
		//Log.d(TAG, ">>>>>>>>5: " + taskIdRetrieved);

		// Set cursor to first row
		if (retVal.moveToFirst()) {
			Log.d(TAG, ">>>>>>>>>>>> Found record");
			// Read the retrieved values
			taskNameRetrieved = retVal.getString(retVal.getColumnIndex("task_name"));
			taskDescRetrieved = retVal.getString(retVal.getColumnIndex("task_desc"));
			taskAddressRetrieved = retVal.getString(retVal.getColumnIndex("task_address"));
			taskIdRetrieved = retVal.getInt(retVal.getColumnIndex("_id"));
			taskIdRetrieved = 1;
			task_geolocated = retVal.getInt(retVal.getColumnIndex("task_geolocated"));
			Log.d(TAG, ">>>>>>>>>>>> Task Geolocated? " + task_geolocated);
			Log.d(TAG, ">>>>>>>>>>>> Task Address: " + taskAddressRetrieved);
		}

		// If address exists, then show the address edittext
		if (taskAddressRetrieved != null || taskAddressRetrieved != "") {
			Log.d(TAG, ">>>>>>>>>>>> Task is geolocated");
			addressEdit.setVisibility(View.VISIBLE);
			addressEditLabel.setVisibility(View.VISIBLE);
			geolocate_button.setVisibility(View.GONE);
		}

		// Read Cursor into UI
		taskNameDisplay.setText(taskNameRetrieved);
		taskDescDisplay.setText(taskDescRetrieved);
		taskAddressDisplay.setText(taskAddressRetrieved);
		Log.d(TAG, "UI Changed");

        // Show address edit text
        geolocate_button.setOnClickListener(new OnClickListener() {
			public void onClick(View arg0) {
				Log.d(TAG, "############################## Add Address Clicked");
				if (addressEdit.getVisibility() == 0) {
					addressEdit.setVisibility(View.GONE);
					addressEditLabel.setVisibility(View.GONE);
				} else {
					addressEdit.setVisibility(View.VISIBLE);
					addressEditLabel.setVisibility(View.VISIBLE);
				}
				setTask_geolocated(1);
			}
		});

		// Save Button
		saveEditTask.setOnClickListener(new OnClickListener() {
			public void onClick(View arg0) {
				Log.d(TAG, "Button Clicked");
				DAL localDAL = new DAL(TTDEditTask.this);

				// UI Objects
				EditText taskNameDisplay = (EditText) findViewById(R.id.task_name_edit);
				EditText taskDescDisplay = (EditText) findViewById(R.id.task_desc_edit);
				EditText taskAddressDisplay = (EditText) findViewById(R.id.task_address_edit);

				Float[] returnedLocation = geolocateAddress(taskAddressDisplay.getText().toString());

				try {
					// Update Row
					localDAL.updateRow(
										taskNameDisplay.getText().toString(),
										taskDescDisplay.getText().toString(),
										taskAddressDisplay.getText().toString(),
										returnedLocation[0],
										returnedLocation[1],
										taskIdRetrieved
										);
					Log.d(TAG, "UPDATED ROW");
					} catch (Exception e) {
						Log.d(TAG, "COULD NOT UPDATE ROW");
						Log.d(TAG, "" + e);
					}
				finish();
			}
		});
    }

	protected Float[] geolocateAddress(String addressIncoming) {
		localGeoCoder = new Geocoder(TTDEditTask.this);
		Float[] retArr = {(float) 0.0, (float) 0.0};

        try {
        	Log.d(TAG, "############################## Address: " + addressIncoming);
        	// Geolocate Address
        	List<Address> foundAdresses = localGeoCoder.getFromLocationName(addressIncoming, 1);

        	// If Address not found
            if (foundAdresses.size() == 0) {
              Log.d(TAG, "############################## Lat and Long NOT FOUND");
              Dialog locationError = new AlertDialog.Builder(TTDEditTask.this)
                .setIcon(0)
                .setTitle("Error")
                .setPositiveButton(R.string.task_ok, null)
                .setMessage("Sorry, your address doesn't exist.")
                .create();
              locationError.show(); 
            } else {
              Log.d(TAG, "############################## Found Lat and Long");
            	// Get Latitude and Longitude
              for (int i = 0; i < foundAdresses.size(); ++i) {
            	// Set returned latitude and longitude
                Address returnedAddress = foundAdresses.get(i);
		        retArr[0] = (float) returnedAddress.getLatitude();
		        retArr[1] = (float) returnedAddress.getLongitude();
              }
              // Show on Map
              //navigateToLocation((geolocatedLat * 1000000), (geolocatedLonlon * 1000000), myMap);
            }
          }
          catch (Exception e) {
        	  Log.d(TAG, "############################## Exception: " + e);
          }

          Log.d(TAG, "############################## LAT: " + retArr[0]);
          Log.d(TAG, "############################## LON: " + retArr[1]);
          
		return retArr;
	}
	public void setTask_geolocated(int task_geolocated) {
		this.task_geolocated = task_geolocated;
	}
	public int isTask_geolocated() {
		return task_geolocated;
	}
}

TTDEditTask Activity Layout


<?xml version="1.0" encoding="utf-8"?>
<TableLayout
  xmlns:android="http://schemas.android.com/apk/res/android"
  android:layout_width="match_parent"
  android:layout_height="match_parent">
	<TableRow android:id="@+id/TableRow01">
		<TextView
			android:id="@+id/TextView01"
			android:text="@string/task_name"
			android:width="115px"
		/>
	</TableRow>
	<TableRow android:id="@+id/TableRow11">
		<EditText
			android:id="@+id/task_name_edit"
			android:hint="eg. Get groceries"
			android:layout_height="match_parent"
			android:layout_width="match_parent"/>
	</TableRow>
	<TableRow android:id="@+id/TableRow02">
		<TextView
			android:id="@+id/TextView02"
			android:text="@string/task_desc"
			android:width="115px"
		/>
	</TableRow>
	<TableRow android:id="@+id/TableRow12">
		<EditText
			android:id="@+id/task_desc_edit"
			android:hint="eg. milk, tomatoes, eggs"
			android:layout_height="match_parent"
			android:layout_width="match_parent"/>
	</TableRow>
	<TableRow android:id="@+id/TableRow03">
		<CheckBox
			android:text="@string/task_geolocated"
			android:id="@+id/checkbox_geolocate"
			android:layout_width="wrap_content"
			android:layout_height="wrap_content"
		/>
		<CheckBox
			android:text="@string/task_geolocated_remove"
			android:id="@+id/checkbox_geolocate_remove"
			android:layout_width="wrap_content"
			android:layout_height="wrap_content"
		/>
	</TableRow>
	<TableRow android:id="@+id/TableRow04">
		<TextView
			android:id="@+id/TextView03"
			android:text="@string/task_address"
			android:width="115px"
		/>
	</TableRow>
	<TableRow android:id="@+id/TableRow14">
		<EditText
			android:id="@+id/task_address_edit"
			android:hint="24 Sussex Drive, Ottawa, Canada"
			android:layout_width="wrap_content"
			android:layout_height="wrap_content"
		/>
	</TableRow>
	<TableRow android:id="@+id/TableRow05">
		<Button
			android:text="@string/task_date"
			android:id="@+id/btn_dueon"
			android:layout_width="wrap_content"
			android:layout_height="wrap_content"
		/>
	</TableRow>
	<TableRow android:id="@+id/TableRow06">
		<Button
			android:text="@string/task_save"
			android:id="@+id/btn_save"
			android:layout_width="wrap_content"
			android:layout_height="wrap_content"
		/>
	</TableRow>
</TableLayout>

TaskAlarmService - Service Code


package dps914.team5.thingsToDo;


import android.app.Notification;
import android.app.NotificationManager;
import android.app.PendingIntent;
import android.app.Service;
import android.content.Context;
import android.content.Intent;
import android.os.IBinder;
import android.widget.Toast;


public class TaskAlarmService extends Service {
	private static final int NOTIFICATION_ID = 1001;
	private String taskName = null;


	/**
	 * @return the taskName
	 */
	protected String getTaskName() {
		return taskName;
	}


	/**
	 * @param taskName the taskName to set
	 */
	protected void setTaskName(String taskName) {
		this.taskName = taskName;
	}


	@Override
	public void onCreate() {
	 // TODO Auto-generated method stub
	}


	/* (non-Javadoc)
	 * @see android.app.Service#onStartCommand(android.content.Intent, int, int)
	 */
	@Override
	public int onStartCommand(Intent intent, int flags, int startId) {
		// Get name from extras bundle
		setTaskName(intent.getExtras().getString("taskName").trim());
		Toast.makeText(this, "THIS: " + intent.getExtras().getString("taskName").trim(), Toast.LENGTH_LONG).show();
		getFromNotificationManager();
		return super.onStartCommand(intent, flags, startId);
	}


	public void getFromNotificationManager() {
		// Notification Manager
		String ns = Context.NOTIFICATION_SERVICE;
		NotificationManager notificationManager = (NotificationManager) getSystemService(ns);


		notificationManager.notify(NOTIFICATION_ID, createNotification());
	}


	public Notification createNotification() {
		//int icon = android.R.drawable.ic_popup_reminder;
		int icon = android.R.drawable.ic_menu_agenda;
		CharSequence tickerText = "TTD: Reminder!";
		long when = System.currentTimeMillis();
		Notification notification = new Notification(icon, tickerText, when);


		Context context = getApplicationContext();
		CharSequence contentTitle = "TTD: Reminder!";
		CharSequence contentText = "Remember: " + taskName;
		Intent notificationIntent = new Intent(this, TaskAlarmService.class);
		PendingIntent contentIntent = PendingIntent.getActivity(this, 0, notificationIntent, 0);


		// Notification Defaults
		notification.defaults |= Notification.DEFAULT_SOUND;
		//notification.defaults |= Notification.DEFAULT_VIBRATE;
		//notification.defaults |= Notification.DEFAULT_LIGHTS;
		notification.flags |= Notification.FLAG_AUTO_CANCEL;


		notification.setLatestEventInfo(context, contentTitle, contentText, contentIntent);
		return notification;
	}


	@Override
	public IBinder onBind(Intent intent) {
	 return null;
	}


	@Override
	public void onDestroy() {
	 super.onDestroy();
	}


	@Override
	public void onStart(Intent intent, int startId) {
	 super.onStart(intent, startId);
	}


	@Override
	public boolean onUnbind(Intent intent) {
	 return super.onUnbind(intent);
	}
}

ProximityBroadcastReceiver - Broadcast Receiver Code

package dps914.team5.thingsToDo;


import android.app.Notification; import android.app.NotificationManager; import android.app.PendingIntent; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.location.LocationManager; import android.util.Log;


public class ProximityBroadcastReceiver extends BroadcastReceiver { private static final int NOTIFICATION_ID = 1001; // Tag for Log private static final String TAG = null;


@Override public void onReceive(Context context, Intent intent) { String key = LocationManager.KEY_PROXIMITY_ENTERING; Boolean locale = intent.getBooleanExtra(key, false);


if (locale) { Log.d(TAG, "Entering alarm area"); } else { Log.d(TAG, "Exiting alarm area"); }


// Notification Manager NotificationManager notificationManager = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);


PendingIntent pendingIntent = PendingIntent.getActivity(context, 0, null, 0);


// Notification Notification notification = createNotification(); notification.setLatestEventInfo(context, "Proximity Alert!", "TTD Reminder", pendingIntent);


// Deploy Notification notificationManager.notify(NOTIFICATION_ID, notification); }


// Create Notification private Notification createNotification() { Notification notification = new Notification();


// Flags and Defaults notification.icon = android.R.drawable.ic_menu_agenda; notification.when = System.currentTimeMillis(); notification.flags |= Notification.FLAG_AUTO_CANCEL; notification.flags |= Notification.FLAG_SHOW_LIGHTS; notification.defaults |= Notification.DEFAULT_VIBRATE; notification.defaults |= Notification.DEFAULT_LIGHTS;


return notification; } } </pre>