TODOs: Consolidate AlertDialogs in UIUtil

This shoves more of the code into the UIUtil class to clean up the
Activity code a bit more.

Change-Id: I8964377646bec6650fe9fa3ad2f3fc468b8170e6
diff --git a/app/src/main/java/io/v/todos/MainActivity.java b/app/src/main/java/io/v/todos/MainActivity.java
index 0b8e1c0..ec9fcee 100644
--- a/app/src/main/java/io/v/todos/MainActivity.java
+++ b/app/src/main/java/io/v/todos/MainActivity.java
@@ -5,17 +5,13 @@
 package io.v.todos;
 
 import android.app.Activity;
-import android.content.DialogInterface;
 import android.content.Intent;
 import android.os.Bundle;
-import android.support.v7.app.AlertDialog;
 import android.support.v7.widget.RecyclerView;
 import android.support.v7.widget.helper.ItemTouchHelper;
 import android.view.Menu;
 import android.view.MenuItem;
 import android.view.View;
-import android.view.WindowManager;
-import android.widget.EditText;
 import android.widget.Toolbar;
 
 import io.v.todos.model.DataList;
@@ -102,7 +98,8 @@
             }
         }).attachToRecyclerView(recyclerView);
 
-        mPersistence = PersistenceFactory.getMainPersistence(this, new ListEventListener<ListMetadata>() {
+        mPersistence = PersistenceFactory.getMainPersistence(this,
+                new ListEventListener<ListMetadata>() {
             @Override
             public void onItemAdd(ListMetadata item) {
                 int position = snackoosList.insertInOrder(item);
@@ -136,23 +133,13 @@
         v.setVisibility(adapter.getItemCount() == 0 ? View.VISIBLE : View.GONE);
     }
 
-    public void addCallback(View view) {
-        final EditText todoItem = new EditText(this);
-
-        AlertDialog dialog = new AlertDialog.Builder(this)
-                .setTitle("New Todo")
-                .setView(todoItem)
-                .setPositiveButton("Add", new DialogInterface.OnClickListener() {
-                    public void onClick(DialogInterface dialog, int whichButton) {
-                        mPersistence.addTodoList(new ListSpec(todoItem.getText().toString()));
-                    }
-                })
-                .setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
-                    public void onClick(DialogInterface dialog, int whichButton) {
-                    }
-                }).show();
-        dialog.getWindow().setSoftInputMode(
-                WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE);
+    public void initiateItemAdd(View view) {
+        UIUtil.showAddDialog(this, "New Todo List", new UIUtil.DialogResponseListener() {
+            @Override
+            public void handleResponse(String response) {
+                mPersistence.addTodoList(new ListSpec(response));
+            }
+        });
     }
 
     // The following methods are boilerplate for handling the Menu in the top right corner.
diff --git a/app/src/main/java/io/v/todos/TodoListActivity.java b/app/src/main/java/io/v/todos/TodoListActivity.java
index d198a4e..7d22c42 100644
--- a/app/src/main/java/io/v/todos/TodoListActivity.java
+++ b/app/src/main/java/io/v/todos/TodoListActivity.java
@@ -5,17 +5,13 @@
 package io.v.todos;
 
 import android.app.Activity;
-import android.content.DialogInterface;
 import android.content.Intent;
 import android.os.Bundle;
-import android.support.v7.app.AlertDialog;
 import android.support.v7.widget.RecyclerView;
 import android.support.v7.widget.helper.ItemTouchHelper;
 import android.view.Menu;
 import android.view.MenuItem;
 import android.view.View;
-import android.view.WindowManager;
-import android.widget.EditText;
 import android.widget.Toolbar;
 
 import io.v.todos.model.DataList;
@@ -84,10 +80,11 @@
         new ItemTouchHelper(new SwipeableTouchHelperCallback() {
             @Override
             public void onSwiped(final RecyclerView.ViewHolder viewHolder, final int direction) {
+                String fbKey = (String)viewHolder.itemView.getTag();
                 if (direction == ItemTouchHelper.RIGHT) {
-                    markAsDone((String)viewHolder.itemView.getTag());
+                    mPersistence.updateTask(snackoosList.findByKey(fbKey).withToggleDone());
                 } else if (direction == ItemTouchHelper.LEFT) {
-                    deleteTodoItem((String)viewHolder.itemView.getTag());
+                    mPersistence.deleteTask(fbKey);
                 }
             }
         }).attachToRecyclerView(recyclerView);
@@ -155,100 +152,45 @@
         v.setVisibility(adapter.getItemCount() == 0 ? View.VISIBLE : View.GONE);
     }
 
-    public void addTodoItem(String todo) {
-        mPersistence.addTask(new TaskSpec(todo));
-    }
-
-    public void updateTodoItem(String fbKey, String todo) {
-        mPersistence.updateTask(snackoosList.findByKey(fbKey).withText(todo));
-    }
-    public void markAsDone(String fbKey) {
-        mPersistence.updateTask(snackoosList.findByKey(fbKey).withToggleDone());
-    }
-
-    public void deleteTodoItem(String fbKey) {
-        mPersistence.deleteTask(fbKey);
-    }
-
-    public void addCallback(View view) {
-        final EditText todoItem = new EditText(this);
-
-        AlertDialog dialog = new AlertDialog.Builder(this)
-                .setTitle("New Todo")
-                .setView(todoItem)
-                .setPositiveButton("Add", new DialogInterface.OnClickListener() {
-                    public void onClick(DialogInterface dialog, int whichButton) {
-                        addTodoItem(todoItem.getText().toString());
-                    }
-                })
-                .setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
-                    public void onClick(DialogInterface dialog, int whichButton) {
-                    }
-                }).show();
-        dialog.getWindow().setSoftInputMode(
-                WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE);
+    public void initiateItemAdd(View view) {
+        UIUtil.showAddDialog(this, "New Task", new UIUtil.DialogResponseListener() {
+            @Override
+            public void handleResponse(String response) {
+                mPersistence.addTask(new TaskSpec(response));
+            }
+        });
     }
 
     private void initiateTaskEdit(final String fbKey) {
-        final EditText todoItem = new EditText(this);
-        todoItem.setText(snackoosList.findByKey(fbKey).text);
+        UIUtil.showEditDialog(this, "Editing Task", snackoosList.findByKey(fbKey).text,
+                new UIUtil.DialogResponseListener() {
+            @Override
+            public void handleResponse(String response) {
+                mPersistence.updateTask(snackoosList.findByKey(fbKey).withText(response));
+            }
 
-        AlertDialog dialog = new AlertDialog.Builder(this)
-                .setTitle("Editing Task")
-                .setView(todoItem)
-                .setPositiveButton("Save", new DialogInterface.OnClickListener() {
-                    public void onClick(DialogInterface dialog, int whichButton) {
-                        updateTodoItem(fbKey, todoItem.getText().toString());
-                    }
-                })
-                .setNeutralButton("Delete", new DialogInterface.OnClickListener() {
-                    public void onClick(DialogInterface dialog, int whichButton) {
-                        deleteTodoItem(fbKey);
-                    }
-                })
-                .setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
-                    public void onClick(DialogInterface dialog, int whichButton) {
-                    }
-                }).show();
-        dialog.getWindow().setSoftInputMode(
-                WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE);
+            @Override
+            public void handleDelete() {
+                mPersistence.deleteTask(fbKey);
+            }
+        });
     }
 
     private void initiateTodoListEdit() {
-        final EditText todoItem = new EditText(this);
-        todoItem.setText(snackoo.getName());
+        UIUtil.showEditDialog(this, "Editing Todo List", snackoo.getName(),
+                new UIUtil.DialogResponseListener() {
+            @Override
+            public void handleResponse(String response) {
+                mPersistence.updateTodoList(new ListSpec(response));
+            }
 
-        AlertDialog dialog = new AlertDialog.Builder(this)
-                .setTitle("Editing Todo List")
-                .setView(todoItem)
-                .setPositiveButton("Save", new DialogInterface.OnClickListener() {
-                    public void onClick(DialogInterface dialog, int whichButton) {
-                        updateTodoList(todoItem.getText().toString());
-                    }
-                })
-                .setNeutralButton("Delete", new DialogInterface.OnClickListener() {
-                    public void onClick(DialogInterface dialog, int whichButton) {
-                        deleteTodoList();
-                    }
-                })
-                .setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
-                    public void onClick(DialogInterface dialog, int whichButton) {
-                    }
-                }).show();
-        dialog.getWindow().setSoftInputMode(
-                WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE);
+            @Override
+            public void handleDelete() {
+                mPersistence.deleteTodoList();
+            }
+        });
     }
 
-
-    public void updateTodoList(String name) {
-        mPersistence.updateTodoList(new ListSpec(name));
-    }
-
-    public void deleteTodoList() {
-        mPersistence.deleteTodoList();
-    }
-
-
     // The following methods are boilerplate for handling the Menu in the top right corner.
     @Override
     public boolean onCreateOptionsMenu(Menu menu) {
diff --git a/app/src/main/java/io/v/todos/UIUtil.java b/app/src/main/java/io/v/todos/UIUtil.java
index dd302d3..d17b822 100644
--- a/app/src/main/java/io/v/todos/UIUtil.java
+++ b/app/src/main/java/io/v/todos/UIUtil.java
@@ -4,7 +4,12 @@
 
 package io.v.todos;
 
+import android.content.Context;
+import android.content.DialogInterface;
+import android.support.v7.app.AlertDialog;
 import android.text.format.DateUtils;
+import android.view.WindowManager;
+import android.widget.EditText;
 
 /**
  * Created by alexfandrianto on 4/18/16.
@@ -13,4 +18,55 @@
     public static String computeTimeAgo(String prefix, long startTime) {
         return prefix + ": " + DateUtils.getRelativeTimeSpanString(startTime);
     }
+
+    public static void showAddDialog(Context context, String title,
+                                     final DialogResponseListener addListener) {
+        final EditText todoItem = new EditText(context);
+
+        AlertDialog dialog = new AlertDialog.Builder(context)
+                .setTitle(title)
+                .setView(todoItem)
+                .setPositiveButton("Add", new DialogInterface.OnClickListener() {
+                    public void onClick(DialogInterface dialog, int whichButton) {
+                        addListener.handleResponse(todoItem.getText().toString());
+                    }
+                })
+                .setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
+                    public void onClick(DialogInterface dialog, int whichButton) {
+                    }
+                }).show();
+        dialog.getWindow().setSoftInputMode(
+                WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE);
+    }
+
+    public static void showEditDialog(Context context, String title, String defaultValue,
+                                      final DialogResponseListener editListener) {
+        final EditText todoItem = new EditText(context);
+        todoItem.setText(defaultValue);
+
+        AlertDialog dialog = new AlertDialog.Builder(context)
+                .setTitle(title)
+                .setView(todoItem)
+                .setPositiveButton("Save", new DialogInterface.OnClickListener() {
+                    public void onClick(DialogInterface dialog, int whichButton) {
+                        editListener.handleResponse(todoItem.getText().toString());
+                    }
+                })
+                .setNeutralButton("Delete", new DialogInterface.OnClickListener() {
+                    public void onClick(DialogInterface dialog, int whichButton) {
+                        editListener.handleDelete();
+                    }
+                })
+                .setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
+                    public void onClick(DialogInterface dialog, int whichButton) {
+                    }
+                }).show();
+        dialog.getWindow().setSoftInputMode(
+                WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE);
+    }
+
+    public static abstract class DialogResponseListener {
+        public abstract void handleResponse(String response);
+        public void handleDelete() {}
+    }
 }
diff --git a/app/src/main/res/layout/content_main.xml b/app/src/main/res/layout/content_main.xml
index 4e1d05e..db458e2 100644
--- a/app/src/main/res/layout/content_main.xml
+++ b/app/src/main/res/layout/content_main.xml
@@ -36,5 +36,5 @@
         android:src="@android:drawable/ic_input_add"
         android:layout_margin="@dimen/fab_margin"
         android:clickable="true"
-        android:onClick="addCallback"/>
+        android:onClick="initiateItemAdd"/>
 </RelativeLayout>