Completing UI Activity assignment

android, eclipse, java

Solution

change your AddToDoActivity code like this

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()");
            finish();
        }
    });

    //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()");
            setDefaultDateTime();
            mTitleText.setText("");
            mDefaultStatusButton.setChecked(true);
            mDefaultPriorityButton.setChecked(true);                        

        }
    });

    // 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  

            Priority priority = getPriority();

            Status status = getStatus();

            String titleString = mTitleText.getText().toString();

            // Date
            String fullDate = dateString + " " + timeString;

            // Package ToDoItem data into an Intent
            Intent data = new Intent();
            ToDoItem.packageIntent(data, titleString, priority, status, fullDate);
            setResult(Activity.RESULT_OK, data);
            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.DAY_OF_MONTH), c.get(Calendar.MONTH), 
                c.get(Calendar.YEAR));

        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 dayOfMonth, int monthOfYear, int year) {

        // 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 day = c.get(Calendar.DAY_OF_MONTH);
            int month = c.get(Calendar.MONTH);
            int year = c.get(Calendar.YEAR);


            // Create a new instance of DatePickerDialog and return it
            return new DatePickerDialog(getActivity(), this, year, month, day);
        }

        @Override
        public void onDateSet(DatePicker view, int dayOfMonth, int monthOfYear,
                int year) {
            setDateString(dayOfMonth, monthOfYear, year);

            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);
    }

}

Problem

I have a UI Lab for Android Programming that I'm trying to complete. I think I'm close, yet so far away. I have four activities that I'm working with but only three of them needed worked on. Here is what I have. I need help with what I'm missing. Here's the first Activity which is AddToDoActivity ``` 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(). Intent intent = new Intent setResult; finish(); } }); //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 setDefaultDateTime(); mTitleText.setText(""); mDefaultStatusButton.setChecked(true); mDefaultPriorityButton.setChecked(true); } }); // 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 = getPriority(); //TODO - Get Status Status status = getStatus(); //TODO - Title String titleString = mTitleText.getText().toString(); // 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 setResult(Activity.RESULT_OK, data); 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); } } ``` Here's the second activity which is ToDoItem ``` 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); } } ``` Here's the third activity which is ToDoListAdapter ``` 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 = getItemPos(); //TODO - Inflate the View for this ToDoItem // from todo_item.xml. LayoutInflater = itemLayout; RelativeLayout itemLayout = m.context.getSystemService(R.layout.todo_item); //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 = ItemLayout.findViewById; setTextView; //TODO - Set up Status CheckBox final CheckBox statusView = ItemLayout.findViewById(R.id.statusCheckBox); statusView.setChecked(checked) statusDone; 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 if isChecked ToDoItem.setStatus status.Done(true); else } }); //TODO - Display Priority in a TextView final TextView priorityView = findViewByID(R.id.PriorityView); PriorityView.setToString(); //TODO - Display Time and Date. // Hint - use ToDoItem.FORMAT.format(toDoItem.getDate()) to get date and time String final TextView dateView = itemLayout.findViewById(R.id.dateView); dateView.setText(ToDoItem.FORMAT); // 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); } } ``` And here is the fourth activity which is ToDoManagerActivity ``` 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 = TextView().getLayoutInflater() .inflate(R.layout.footer_view, null); //TODO - Add footerView to ListView getListView fv = (ListView)findViewById(R.layout.footer_view); footerView.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { log("Entered footerView.OnClickListener.onClick()"); //TODO - Attach Listener to FooterView. Implement onClick(). Intent intent = new Intent(getBaseContext(), AddToDoActivity.class); startActivityForResult(intent, ADD_TODO_ITEM_REQUEST); } }); //TODO - Attach the adapter to this ListActivity's ListView getListView.footer_view.setAdapter(mAdapter, fv); } @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 if requestCode == ADD_TODO_ITEM_REQUEST { also if resultCode != RESULT_OK(true); new mAdapter++; } } // 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); } } ``` Any thought on how to improve the cancelButton code in the AddToDoAcitivity? ``` 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(). Intent intent = new Intent setResult; finish(); } }); ```

Original source