summaryrefslogtreecommitdiffstats
path: root/Android/05-UserInterface/UILab/src/course/labs/todomanager
diff options
context:
space:
mode:
Diffstat (limited to 'Android/05-UserInterface/UILab/src/course/labs/todomanager')
-rw-r--r--Android/05-UserInterface/UILab/src/course/labs/todomanager/AddToDoActivity.java258
-rw-r--r--Android/05-UserInterface/UILab/src/course/labs/todomanager/ToDoItem.java107
-rw-r--r--Android/05-UserInterface/UILab/src/course/labs/todomanager/ToDoListAdapter.java114
-rw-r--r--Android/05-UserInterface/UILab/src/course/labs/todomanager/ToDoManagerActivity.java185
4 files changed, 664 insertions, 0 deletions
diff --git a/Android/05-UserInterface/UILab/src/course/labs/todomanager/AddToDoActivity.java b/Android/05-UserInterface/UILab/src/course/labs/todomanager/AddToDoActivity.java
new file mode 100644
index 0000000..6604871
--- /dev/null
+++ b/Android/05-UserInterface/UILab/src/course/labs/todomanager/AddToDoActivity.java
@@ -0,0 +1,258 @@
+package course.labs.todomanager;
+
+import java.util.Calendar;
+import java.util.Date;
+
+import android.app.Activity;
+import android.app.DatePickerDialog;
+import android.app.Dialog;
+import android.app.DialogFragment;
+import android.app.TimePickerDialog;
+import android.content.Intent;
+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.RadioButton;
+import android.widget.RadioGroup;
+import android.widget.TextView;
+import android.widget.TimePicker;
+import course.labs.todomanager.ToDoItem.Priority;
+import course.labs.todomanager.ToDoItem.Status;
+
+public class AddToDoActivity extends Activity {
+
+ // 7 days in milliseconds - 7 * 24 * 60 * 60 * 1000
+ private static final int SEVEN_DAYS = 604800000;
+
+ private static final String TAG = "Lab-UserInterface";
+
+ private static String timeString;
+ private static String dateString;
+ private static TextView dateView;
+ private static TextView timeView;
+
+
+ private Date mDate;
+ private RadioGroup mPriorityRadioGroup;
+ private RadioGroup mStatusRadioGroup;
+ private EditText mTitleText;
+ private RadioButton mDefaultStatusButton;
+ private RadioButton mDefaultPriorityButton;
+
+ @Override
+ protected void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ setContentView(R.layout.add_todo);
+
+ mTitleText = (EditText) findViewById(R.id.title);
+ mDefaultStatusButton = (RadioButton) findViewById(R.id.statusNotDone);
+ mDefaultPriorityButton = (RadioButton) findViewById(R.id.medPriority);
+ mPriorityRadioGroup = (RadioGroup) findViewById(R.id.priorityGroup);
+ mStatusRadioGroup = (RadioGroup) findViewById(R.id.statusGroup);
+ dateView = (TextView) findViewById(R.id.date);
+ timeView = (TextView) findViewById(R.id.time);
+
+ // Set the default date and time
+ setDefaultDateTime();
+
+ // OnClickListener for the Date button, calls showDatePickerDialog() to show
+ // the Date dialog
+ final Button datePickerButton = (Button) findViewById(R.id.date_picker_button);
+ datePickerButton.setOnClickListener(new OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ showDatePickerDialog();
+ }
+ });
+
+ // OnClickListener for the Time button, calls showTimePickerDialog() to show
+ // the Time Dialog
+ final Button timePickerButton = (Button) findViewById(R.id.time_picker_button);
+ timePickerButton.setOnClickListener(new OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ showTimePickerDialog();
+ }
+ });
+
+ // OnClickListener for the Cancel Button
+ final Button cancelButton = (Button) findViewById(R.id.cancelButton);
+ cancelButton.setOnClickListener(new OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ log("Entered cancelButton.OnClickListener.onClick()");
+ //TODO - Implement onClick().
+ }
+ });
+
+ // OnClickListener for the Reset Button
+ final Button resetButton = (Button) findViewById(R.id.resetButton);
+ resetButton.setOnClickListener(new OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ log("Entered resetButton.OnClickListener.onClick()");
+ //TODO - Reset data fields to default values
+ }
+ });
+
+ // OnClickListener for the Submit Button
+ // Implement onClick().
+ final Button submitButton = (Button) findViewById(R.id.submitButton);
+ submitButton.setOnClickListener(new OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ log("Entered submitButton.OnClickListener.onClick()");
+
+ // Gather ToDoItem data
+
+ //TODO - Get Priority
+ Priority priority = null;
+
+ //TODO - Get Status
+ Status status = null;
+
+ //TODO - Title
+ String titleString = null;
+
+ // Date
+ String fullDate = dateString + " " + timeString;
+
+ // Package ToDoItem data into an Intent
+ Intent data = new Intent();
+ ToDoItem.packageIntent(data, titleString, priority, status, fullDate);
+ //TODO - return data Intent and finish
+ }
+ });
+ }
+
+ // Do not modify below here
+ // Use this method to set the default date and time
+ private void setDefaultDateTime() {
+
+ // Default is current time + 7 days
+ mDate = new Date();
+ mDate = new Date(mDate.getTime() + SEVEN_DAYS);
+
+ Calendar c = Calendar.getInstance();
+ c.setTime(mDate);
+
+ setDateString(c.get(Calendar.YEAR), c.get(Calendar.MONTH), c.get(Calendar.DAY_OF_MONTH));
+
+ dateView.setText(dateString);
+
+ setTimeString(c.get(Calendar.HOUR_OF_DAY), c.get(Calendar.MINUTE), c.get(Calendar.MILLISECOND));
+
+ timeView.setText(timeString);
+ }
+
+ private static void setDateString(int year, int monthOfYear, int dayOfMonth) {
+ // Increment monthOfYear for Calendar/Date -> Time Format setting
+ monthOfYear++;
+ String mon = "" + monthOfYear;
+ String day = "" + dayOfMonth;
+
+ if (monthOfYear < 10)
+ mon = "0" + monthOfYear;
+ if (dayOfMonth < 10)
+ day = "0" + dayOfMonth;
+
+ dateString = year + "-" + mon + "-" + day;
+ }
+
+ private static void setTimeString(int hourOfDay, int minute, int mili) {
+ String hour = "" + hourOfDay;
+ String min = "" + minute;
+
+ if (hourOfDay < 10)
+ hour = "0" + hourOfDay;
+ if (minute < 10)
+ min = "0" + minute;
+
+ timeString = hour + ":" + min + ":00";
+ }
+
+ private Priority getPriority() {
+
+ switch (mPriorityRadioGroup.getCheckedRadioButtonId()) {
+ case R.id.lowPriority:
+ return Priority.LOW;
+ case R.id.highPriority:
+ return Priority.HIGH;
+ default:
+ return Priority.MED;
+ }
+ }
+
+ private Status getStatus() {
+
+ switch (mStatusRadioGroup.getCheckedRadioButtonId()) {
+ case R.id.statusDone:
+ return Status.DONE;
+ default:
+ return Status.NOTDONE;
+ }
+ }
+
+ // DialogFragment used to pick a ToDoItem deadline date
+ public static class DatePickerFragment extends DialogFragment implements
+ DatePickerDialog.OnDateSetListener {
+
+ @Override
+ public Dialog onCreateDialog(Bundle savedInstanceState) {
+ // Use the current date as the default date in the picker
+ final Calendar c = Calendar.getInstance();
+ int year = c.get(Calendar.YEAR);
+ int month = c.get(Calendar.MONTH);
+ int day = c.get(Calendar.DAY_OF_MONTH);
+ // Create a new instance of DatePickerDialog and return it
+ return new DatePickerDialog(getActivity(), this, year, month, day);
+ }
+
+ @Override
+ public void onDateSet(DatePicker view, int year, int monthOfYear, int dayOfMonth) {
+ setDateString(year, monthOfYear, dayOfMonth);
+ dateView.setText(dateString);
+ }
+ }
+
+ // DialogFragment used to pick a ToDoItem deadline time
+ public static class TimePickerFragment extends DialogFragment implements
+ TimePickerDialog.OnTimeSetListener {
+ @Override
+ public Dialog onCreateDialog(Bundle savedInstanceState) {
+ // Use the current time as the default values for the picker
+ final Calendar c = Calendar.getInstance();
+ int hour = c.get(Calendar.HOUR_OF_DAY);
+ int minute = c.get(Calendar.MINUTE);
+ // Create a new instance of TimePickerDialog and return
+ return new TimePickerDialog(getActivity(), this, hour, minute, true);
+ }
+ public void onTimeSet(TimePicker view, int hourOfDay, int minute) {
+ setTimeString(hourOfDay, minute, 0);
+ timeView.setText(timeString);
+ }
+ }
+
+ private void showDatePickerDialog() {
+ DialogFragment newFragment = new DatePickerFragment();
+ newFragment.show(getFragmentManager(), "datePicker");
+ }
+
+ private void showTimePickerDialog() {
+ DialogFragment newFragment = new TimePickerFragment();
+ newFragment.show(getFragmentManager(), "timePicker");
+ }
+
+ private void log(String msg) {
+ try {
+ Thread.sleep(500);
+ } catch (InterruptedException e) {
+ e.printStackTrace();
+ }
+ Log.i(TAG, msg);
+ }
+}
diff --git a/Android/05-UserInterface/UILab/src/course/labs/todomanager/ToDoItem.java b/Android/05-UserInterface/UILab/src/course/labs/todomanager/ToDoItem.java
new file mode 100644
index 0000000..7990eb7
--- /dev/null
+++ b/Android/05-UserInterface/UILab/src/course/labs/todomanager/ToDoItem.java
@@ -0,0 +1,107 @@
+package course.labs.todomanager;
+
+import java.text.ParseException;
+import java.text.SimpleDateFormat;
+import java.util.Date;
+import java.util.Locale;
+
+import android.content.Intent;
+
+// Do not modify
+
+public class ToDoItem {
+
+ public static final String ITEM_SEP = System.getProperty("line.separator");
+
+ public enum Priority {
+ LOW, MED, HIGH
+ };
+
+ public enum Status {
+ NOTDONE, DONE
+ };
+
+ public final static String TITLE = "title";
+ public final static String PRIORITY = "priority";
+ public final static String STATUS = "status";
+ public final static String DATE = "date";
+ public final static String FILENAME = "filename";
+
+ public final static SimpleDateFormat FORMAT = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.US);
+
+ private String mTitle = new String();
+ private Priority mPriority = Priority.LOW;
+ private Status mStatus = Status.NOTDONE;
+ private Date mDate = new Date();
+
+ ToDoItem(String title, Priority priority, Status status, Date date) {
+ this.mTitle = title;
+ this.mPriority = priority;
+ this.mStatus = status;
+ this.mDate = date;
+ }
+
+ // Create a new ToDoItem from data packaged in an Intent
+ ToDoItem(Intent intent) {
+ mTitle = intent.getStringExtra(ToDoItem.TITLE);
+ mPriority = Priority.valueOf(intent.getStringExtra(ToDoItem.PRIORITY));
+ mStatus = Status.valueOf(intent.getStringExtra(ToDoItem.STATUS));
+ try {
+ mDate = ToDoItem.FORMAT.parse(intent.getStringExtra(ToDoItem.DATE));
+ } catch (ParseException e) {
+ mDate = new Date();
+ }
+ }
+
+ public String getTitle() {
+ return mTitle;
+ }
+
+ public void setTitle(String title) {
+ mTitle = title;
+ }
+
+ public Priority getPriority() {
+ return mPriority;
+ }
+
+ public void setPriority(Priority priority) {
+ mPriority = priority;
+ }
+
+ public Status getStatus() {
+ return mStatus;
+ }
+
+ public void setStatus(Status status) {
+ mStatus = status;
+ }
+
+ public Date getDate() {
+ return mDate;
+ }
+
+ public void setDate(Date date) {
+ mDate = date;
+ }
+
+ // Take a set of String data values and
+ // package them for transport in an Intent
+ public static void packageIntent(Intent intent, String title, Priority priority, Status status, String date) {
+
+ intent.putExtra(ToDoItem.TITLE, title);
+ intent.putExtra(ToDoItem.PRIORITY, priority.toString());
+ intent.putExtra(ToDoItem.STATUS, status.toString());
+ intent.putExtra(ToDoItem.DATE, date);
+ }
+
+ public String toString() {
+ return mTitle + ITEM_SEP + mPriority + ITEM_SEP + mStatus + ITEM_SEP + FORMAT.format(mDate);
+ }
+
+ public String toLog() {
+ return "Title:" + mTitle + ITEM_SEP + "Priority:" + mPriority
+ + ITEM_SEP + "Status:" + mStatus + ITEM_SEP + "Date:"
+ + FORMAT.format(mDate);
+ }
+}
diff --git a/Android/05-UserInterface/UILab/src/course/labs/todomanager/ToDoListAdapter.java b/Android/05-UserInterface/UILab/src/course/labs/todomanager/ToDoListAdapter.java
new file mode 100644
index 0000000..5f16ac8
--- /dev/null
+++ b/Android/05-UserInterface/UILab/src/course/labs/todomanager/ToDoListAdapter.java
@@ -0,0 +1,114 @@
+package course.labs.todomanager;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import android.content.Context;
+import android.util.Log;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.BaseAdapter;
+import android.widget.CheckBox;
+import android.widget.CompoundButton;
+import android.widget.CompoundButton.OnCheckedChangeListener;
+import android.widget.RelativeLayout;
+import android.widget.TextView;
+import course.labs.todomanager.ToDoItem.Status;
+
+public class ToDoListAdapter extends BaseAdapter {
+
+ // List of ToDoItems
+ private final List<ToDoItem> mItems = new ArrayList<ToDoItem>();
+
+ private final Context mContext;
+
+ private static final String TAG = "Lab-UserInterface";
+
+ public ToDoListAdapter(Context context) {
+ mContext = context;
+ }
+
+ // Add a ToDoItem to the adapter
+ // Notify observers that the data set has changed
+ public void add(ToDoItem item) {
+ mItems.add(item);
+ notifyDataSetChanged();
+ }
+
+ // Clears the list adapter of all items.
+ public void clear(){
+ mItems.clear();
+ notifyDataSetChanged();
+ }
+
+ // Returns the number of ToDoItems
+ @Override
+ public int getCount() {
+ return mItems.size();
+ }
+
+ // Retrieve the number of ToDoItems
+ @Override
+ public Object getItem(int pos) {
+ return mItems.get(pos);
+ }
+
+ // Get the ID for the ToDoItem
+ // In this case it's just the position
+ @Override
+ public long getItemId(int pos) {
+ return pos;
+ }
+
+ //Create a View to display the ToDoItem
+ // at specified position in mItems
+ @Override
+ public View getView(int position, View convertView, ViewGroup parent) {
+ //TODO - Get the current ToDoItem
+ final ToDoItem toDoItem = null;
+
+ //TODO - Inflate the View for this ToDoItem
+ // from todo_item.xml.
+ RelativeLayout itemLayout = null;
+
+ //TODO - Fill in specific ToDoItem data
+ // Remember that the data that goes in this View
+ // corresponds to the user interface elements defined
+ // in the layout file
+
+ //TODO - Display Title in TextView
+ final TextView titleView = null;
+
+ // TODO - Set up Status CheckBox
+ final CheckBox statusView = null;
+
+ statusView.setOnCheckedChangeListener(new OnCheckedChangeListener() {
+ @Override
+ public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
+ log("Entered onCheckedChanged()");
+ // TODO - Set up and implement an OnCheckedChangeListener, which
+ // is called when the user toggles the status checkbox
+ }
+ });
+
+ //TODO - Display Priority in a TextView
+ final TextView priorityView = null;
+
+ // TODO - Display Time and Date.
+ // Hint - use ToDoItem.FORMAT.format(toDoItem.getDate()) to get date and time String
+ final TextView dateView = null;
+
+ // Return the View you just created
+ return itemLayout;
+ }
+
+ private void log(String msg) {
+ try {
+ Thread.sleep(500);
+ } catch (InterruptedException e) {
+ e.printStackTrace();
+ }
+ Log.i(TAG, msg);
+ }
+}
diff --git a/Android/05-UserInterface/UILab/src/course/labs/todomanager/ToDoManagerActivity.java b/Android/05-UserInterface/UILab/src/course/labs/todomanager/ToDoManagerActivity.java
new file mode 100644
index 0000000..fe8d9eb
--- /dev/null
+++ b/Android/05-UserInterface/UILab/src/course/labs/todomanager/ToDoManagerActivity.java
@@ -0,0 +1,185 @@
+package course.labs.todomanager;
+
+import java.io.BufferedReader;
+import java.io.BufferedWriter;
+import java.io.FileInputStream;
+import java.io.FileNotFoundException;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.InputStreamReader;
+import java.io.OutputStreamWriter;
+import java.io.PrintWriter;
+import java.text.ParseException;
+import java.util.Date;
+
+import android.app.ListActivity;
+import android.content.Intent;
+import android.os.Bundle;
+import android.util.Log;
+import android.view.LayoutInflater;
+import android.view.Menu;
+import android.view.MenuItem;
+import android.view.View;
+import android.view.View.OnClickListener;
+import android.widget.TextView;
+import course.labs.todomanager.ToDoItem.Priority;
+import course.labs.todomanager.ToDoItem.Status;
+
+public class ToDoManagerActivity extends ListActivity {
+
+ // Add a ToDoItem Request Code
+ private static final int ADD_TODO_ITEM_REQUEST = 0;
+
+ private static final String FILE_NAME = "TodoManagerActivityData.txt";
+ private static final String TAG = "Lab-UserInterface";
+
+ // IDs for menu items
+ private static final int MENU_DELETE = Menu.FIRST;
+ private static final int MENU_DUMP = Menu.FIRST + 1;
+
+ ToDoListAdapter mAdapter;
+
+ @Override
+ public void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+
+ // Create a new TodoListAdapter for this ListActivity's ListView
+ mAdapter = new ToDoListAdapter(getApplicationContext());
+
+ // Put divider between ToDoItems and FooterView
+ getListView().setFooterDividersEnabled(true);
+
+ //TODO - Inflate footerView for footer_view.xml file
+ TextView footerView = null;
+ //TODO - Add footerView to ListView
+
+ footerView.setOnClickListener(new OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ log("Entered footerView.OnClickListener.onClick()");
+ //TODO - Attach Listener to FooterView. Implement onClick().
+ }
+ });
+
+ //TODO - Attach the adapter to this ListActivity's ListView
+ }
+
+ @Override
+ protected void onActivityResult(int requestCode, int resultCode, Intent data) {
+ log("Entered onActivityResult()");
+
+ // TODO - Check result code and request code.
+ // If user submitted a new ToDoItem
+ // Create a new ToDoItem from the data Intent
+ // and then add it to the adapter
+ }
+
+ // Do not modify below here
+ @Override
+ public void onResume() {
+ super.onResume();
+ // Load saved ToDoItems, if necessary
+ if (mAdapter.getCount() == 0)
+ loadItems();
+ }
+
+ @Override
+ protected void onPause() {
+ super.onPause();
+ // Save ToDoItems
+ saveItems();
+ }
+
+ @Override
+ public boolean onCreateOptionsMenu(Menu menu) {
+ super.onCreateOptionsMenu(menu);
+ menu.add(Menu.NONE, MENU_DELETE, Menu.NONE, "Delete all");
+ menu.add(Menu.NONE, MENU_DUMP, Menu.NONE, "Dump to log");
+ return true;
+ }
+
+ @Override
+ public boolean onOptionsItemSelected(MenuItem item) {
+ switch (item.getItemId()) {
+ case MENU_DELETE:
+ mAdapter.clear();
+ return true;
+ case MENU_DUMP:
+ dump();
+ return true;
+ default:
+ return super.onOptionsItemSelected(item);
+ }
+ }
+
+ private void dump() {
+ for (int i = 0; i < mAdapter.getCount(); i++) {
+ String data = ((ToDoItem) mAdapter.getItem(i)).toLog();
+ log("Item " + i + ": " + data.replace(ToDoItem.ITEM_SEP, ","));
+ }
+ }
+
+ // Load stored ToDoItems
+ private void loadItems() {
+ BufferedReader reader = null;
+ try {
+ FileInputStream fis = openFileInput(FILE_NAME);
+ reader = new BufferedReader(new InputStreamReader(fis));
+
+ String title = null;
+ String priority = null;
+ String status = null;
+ Date date = null;
+
+ while (null != (title = reader.readLine())) {
+ priority = reader.readLine();
+ status = reader.readLine();
+ date = ToDoItem.FORMAT.parse(reader.readLine());
+ mAdapter.add(new ToDoItem(title, Priority.valueOf(priority),
+ Status.valueOf(status), date));
+ }
+
+ } catch (FileNotFoundException e) {
+ e.printStackTrace();
+ } catch (IOException e) {
+ e.printStackTrace();
+ } catch (ParseException e) {
+ e.printStackTrace();
+ } finally {
+ if (null != reader) {
+ try {
+ reader.close();
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+ }
+ }
+ }
+
+ // Save ToDoItems to file
+ private void saveItems() {
+ PrintWriter writer = null;
+ try {
+ FileOutputStream fos = openFileOutput(FILE_NAME, MODE_PRIVATE);
+ writer = new PrintWriter(new BufferedWriter(new OutputStreamWriter( fos)));
+ for (int idx = 0; idx < mAdapter.getCount(); idx++) {
+ writer.println(mAdapter.getItem(idx));
+ }
+ } catch (IOException e) {
+ e.printStackTrace();
+ } finally {
+ if (null != writer) {
+ writer.close();
+ }
+ }
+ }
+
+ private void log(String msg) {
+ try {
+ Thread.sleep(500);
+ } catch (InterruptedException e) {
+ e.printStackTrace();
+ }
+ Log.i(TAG, msg);
+ }
+}