Changes

Jump to: navigation, search

Teams Winter 2011/team5/assignment/tutorial

44,948 bytes added, 15:30, 16 April 2011
no edit summary
 
 
=== Create Android Project ===
1.1 Setup Eclipse with the ADT plugin as directed to ttp://www.vogella.de/articles/Android/article.html#installation here]
=== Database Helper ===
<pre>
 
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);
}
}
}
 
</pre>
=== ThingsToDo Activity Code ===
<pre>
 
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;
}
}
</pre>
 
== ThingsToDo Activity Layout ==
<pre>
 
<?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>
 
</pre><br/>
 
And a row layout for the list layout:<br/>
 
<pre>
 
<?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>
 
</pre>
 
== ThingsToDo Activity Menu ==
<pre>
 
<?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>
 
</pre>
 
=== TTDNewTask Activity Code ===
 
<pre>
 
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) {}
}
}
 
</pre>
 
== TTDNewTask Activity Layout ==
<pre>
 
<?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>
 
 
</pre>
=== TTDEditTask Activity Code ===
<pre>
 
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;
}
}
 
</pre>
 
== TTDEditTask Activity Layout ==
<pre>
 
<?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>
 
</pre>
 
=== TaskAlarmService - Service Code ===
 
<pre>
 
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);
}
}
 
</pre>
 
=== 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);
}
=== First Activity Code - Book Manager ===
// Create Notification private Notification createNotification() { Notification notification == First Activity Layout ==new Notification();
== First Activity Menus ==
// Flags and Defaults notification.icon =android.R.drawable.ic_menu_agenda; notification.when = First Activity Context Menu System.currentTimeMillis(); notification.flags |=Notification.FLAG_AUTO_CANCEL; notification.flags |=Notification.FLAG_SHOW_LIGHTS; notification.defaults |= Notification.DEFAULT_VIBRATE; notification.defaults |= Notification.DEFAULT_LIGHTS;
=== Edit Activity Code ===
== Edit Activity Layouts == return notification; }}</pre>
1
edit

Navigation menu