TBR: java/projects/todos: SwipeableCardViewHolder and SwipeableTouchHelperCallback

Use these abstract classes to eliminate a lot of the duplicate code
surrounding our RecyclerViews and swipe handlers.

We also no longer draw to the canvas, instead relying on xml-based
layouts to be visible/gone'd by the program.

Change-Id: I8011c28d2b7370800cacfbbe2663de23f6580da8
diff --git a/projects/todos/app/src/main/java/io/v/todos/MainActivity.java b/projects/todos/app/src/main/java/io/v/todos/MainActivity.java
index a92793e..e2229b8 100644
--- a/projects/todos/app/src/main/java/io/v/todos/MainActivity.java
+++ b/projects/todos/app/src/main/java/io/v/todos/MainActivity.java
@@ -7,10 +7,6 @@
 import android.app.Activity;
 import android.content.DialogInterface;
 import android.content.Intent;
-import android.graphics.Bitmap;
-import android.graphics.BitmapFactory;
-import android.graphics.Canvas;
-import android.graphics.Paint;
 import android.os.Bundle;
 import android.support.v7.app.AlertDialog;
 import android.support.v7.widget.RecyclerView;
@@ -89,68 +85,7 @@
         recyclerView.setAdapter(adapter);
 
         // TODO(alexfandrianto): Very much copy-pasted between MainActivity and TodoListActivity.
-        new ItemTouchHelper(new ItemTouchHelper.SimpleCallback(
-                ItemTouchHelper.UP | ItemTouchHelper.DOWN,
-                ItemTouchHelper.LEFT | ItemTouchHelper.RIGHT) {
-            private Paint paint = new Paint();
-            private Bitmap deleteIcon = BitmapFactory.decodeResource(
-                    getResources(), android.R.drawable.ic_input_delete);
-            private Bitmap doneIcon = BitmapFactory.decodeResource(
-                    getResources(), android.R.drawable.checkbox_on_background);
-
-            @Override
-            public void onChildDraw(Canvas c, RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder, float dX, float dY, int actionState, boolean isCurrentlyActive) {
-                // TODO(alexfandrianto): Refactor further. Is there another way to do this?
-                if (actionState == ItemTouchHelper.ACTION_STATE_SWIPE) {
-                    // Get RecyclerView item from the ViewHolder
-                    View itemView = viewHolder.itemView;
-
-                    if (dX > 0) {
-                        /* Set your color for positive displacement */
-                        paint.setColor(0xFF00FF00);
-
-                        // Draw Rect with varying right side, equal to displacement dX
-                        c.drawRect((float) itemView.getLeft(), (float) itemView.getTop(), dX,
-                                (float) itemView.getBottom(), paint);
-
-                        c.drawBitmap(doneIcon,
-                                (float) itemView.getLeft() + 32,
-                                (float) itemView.getTop() + ((float) itemView.getBottom() - (float) itemView.getTop() - doneIcon.getHeight())/2,
-                                paint);
-                    } else {
-                        /* Set your color for negative displacement */
-                        paint.setColor(0xFFFF0000);
-
-                        // Draw Rect with varying left side, equal to the item's right side plus negative displacement dX
-                        c.drawRect((float) itemView.getRight() + dX, (float) itemView.getTop(),
-                                (float) itemView.getRight(), (float) itemView.getBottom(), paint);
-
-
-                        //Set the image icon for Left swipe
-                        c.drawBitmap(deleteIcon,
-                                (float) itemView.getRight() - 32 - deleteIcon.getWidth(),
-                                (float) itemView.getTop() + ((float) itemView.getBottom() - (float) itemView.getTop() - deleteIcon.getHeight())/2,
-                                paint);
-                    }
-
-                    super.onChildDraw(c, recyclerView, viewHolder, dX, dY, actionState, isCurrentlyActive);
-                }
-            }
-
-            @Override
-            public boolean onMove(final RecyclerView recyclerView,
-                                  final RecyclerView.ViewHolder viewHolder,
-                                  final RecyclerView.ViewHolder target) {
-
-
-                /*editListStructure(l -> l.add(target.getAdapterPosition(),
-                        l.remove(viewHolder.getAdapterPosition())));*/
-
-                // TODO(alexfandrianto): Actually, I really doubt that we want to do this. It's super complex..
-                Log.d(SNACKOOS, "Moving is hard.");
-                return false;
-            }
-
+        new ItemTouchHelper(new SwipeableTouchHelperCallback() {
             @Override
             public void onSwiped(final RecyclerView.ViewHolder viewHolder, final int direction) {
                 if (direction == ItemTouchHelper.RIGHT) {
diff --git a/projects/todos/app/src/main/java/io/v/todos/SwipeableCardViewHolder.java b/projects/todos/app/src/main/java/io/v/todos/SwipeableCardViewHolder.java
new file mode 100644
index 0000000..a600579
--- /dev/null
+++ b/projects/todos/app/src/main/java/io/v/todos/SwipeableCardViewHolder.java
@@ -0,0 +1,32 @@
+// Copyright 2016 The Vanadium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package io.v.todos;
+
+import android.support.v7.widget.CardView;
+import android.support.v7.widget.RecyclerView;
+import android.view.View;
+
+public abstract class SwipeableCardViewHolder extends RecyclerView.ViewHolder {
+    private CardView cardView;
+    private View swipeLeftView;
+    private View swipeRightView;
+
+    public SwipeableCardViewHolder(View itemView) {
+        super(itemView);
+
+        cardView = (CardView)itemView.findViewById(R.id.card);
+        swipeLeftView = itemView.findViewById(R.id.swipe_left);
+        swipeRightView = itemView.findViewById(R.id.swipe_right);
+    }
+
+    public CardView getCardView() {
+        return cardView;
+    }
+
+    public void decideBackground(float dX) {
+        swipeLeftView.setVisibility(dX < 0 ? View.VISIBLE : View.GONE);
+        swipeRightView.setVisibility(dX > 0 ? View.VISIBLE : View.GONE);
+    }
+}
diff --git a/projects/todos/app/src/main/java/io/v/todos/SwipeableTouchHelperCallback.java b/projects/todos/app/src/main/java/io/v/todos/SwipeableTouchHelperCallback.java
new file mode 100644
index 0000000..58856c3
--- /dev/null
+++ b/projects/todos/app/src/main/java/io/v/todos/SwipeableTouchHelperCallback.java
@@ -0,0 +1,62 @@
+// Copyright 2016 The Vanadium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package io.v.todos;
+
+import android.graphics.Canvas;
+import android.support.v7.widget.RecyclerView;
+import android.support.v7.widget.helper.ItemTouchHelper;
+
+/**
+ * SwipeableTouchHelperCallback wraps the SimpleCallback for SwipeableCardViewHolders.
+ * Subclasses should only override the onSwiped method since onMove is disabled.
+ */
+public abstract class SwipeableTouchHelperCallback extends ItemTouchHelper.SimpleCallback {
+    SwipeableTouchHelperCallback() {
+        super(ItemTouchHelper.UP | ItemTouchHelper.DOWN,
+              ItemTouchHelper.LEFT | ItemTouchHelper.RIGHT);
+    }
+
+    @Override
+    public boolean onMove(final RecyclerView recyclerView,
+                          final RecyclerView.ViewHolder viewHolder,
+                          final RecyclerView.ViewHolder target) {
+        return false;
+    }
+
+    @Override
+    public boolean isLongPressDragEnabled() {
+        return false;
+    }
+
+    @Override
+    public void clearView(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder) {
+        SwipeableCardViewHolder holder = (SwipeableCardViewHolder)viewHolder;
+        holder.decideBackground(0);
+        getDefaultUIUtil().clearView(holder.getCardView());
+    }
+
+    @Override
+    public void onSelectedChanged(RecyclerView.ViewHolder viewHolder, int actionState) {
+        if (viewHolder != null) {
+            getDefaultUIUtil().onSelected(((SwipeableCardViewHolder) viewHolder).getCardView());
+        }
+    }
+
+    public void onChildDraw(Canvas c, RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder,
+                            float dX, float dY, int actionState, boolean isCurrentlyActive) {
+        SwipeableCardViewHolder holder = (SwipeableCardViewHolder)viewHolder;
+        holder.decideBackground(dX);
+        getDefaultUIUtil().onDraw(c, recyclerView, holder.getCardView(), dX, dY, actionState,
+                isCurrentlyActive);
+    }
+
+    public void onChildDrawOver(Canvas c, RecyclerView recyclerView,
+                                RecyclerView.ViewHolder viewHolder, float dX, float dY,
+                                int actionState, boolean isCurrentlyActive) {
+        SwipeableCardViewHolder holder = (SwipeableCardViewHolder)viewHolder;
+        getDefaultUIUtil().onDrawOver(c, recyclerView, holder.getCardView(), dX, dY, actionState,
+                isCurrentlyActive);
+    }
+}
diff --git a/projects/todos/app/src/main/java/io/v/todos/TaskViewHolder.java b/projects/todos/app/src/main/java/io/v/todos/TaskViewHolder.java
index 632441f..b4f4ace 100644
--- a/projects/todos/app/src/main/java/io/v/todos/TaskViewHolder.java
+++ b/projects/todos/app/src/main/java/io/v/todos/TaskViewHolder.java
@@ -4,8 +4,6 @@
 
 package io.v.todos;
 
-import android.support.v7.widget.CardView;
-import android.support.v7.widget.RecyclerView;
 import android.view.View;
 import android.widget.ImageView;
 import android.widget.TextView;
@@ -13,34 +11,29 @@
 /**
  * @author alexfandrianto
  */
-public class TaskViewHolder extends RecyclerView.ViewHolder{
-    private CardView myView;
+public class TaskViewHolder extends SwipeableCardViewHolder {
     private boolean showDone = true;
 
     public TaskViewHolder(View itemView) {
         super(itemView);
-
-        myView = (CardView)itemView;
     }
 
     public void bindTask(Task task, View.OnClickListener listener) {
-        // TODO(alexfandrianto): Now might be a good time to set data in myView.
-
-        final ImageView doneMark = (ImageView)myView.findViewById(R.id.task_done);
+        final ImageView doneMark = (ImageView) itemView.findViewById(R.id.task_done);
         doneMark.setVisibility(task.getDone() ? View.VISIBLE : View.GONE);
 
-        final TextView name=(TextView)myView.findViewById(R.id.task_text);
+        final TextView name=(TextView) itemView.findViewById(R.id.task_text);
         name.setText(task.getText());
 
-        final TextView created=(TextView)myView.findViewById(R.id.task_time);
+        final TextView created=(TextView) itemView.findViewById(R.id.task_time);
         created.setText(computeCreated(task));
 
-        myView.setCardBackgroundColor(task.getDone() ? 0xFFCCCCCC : 0xFFFFFFFF);
+        getCardView().setCardBackgroundColor(task.getDone() ? 0xFFCCCCCC : 0xFFFFFFFF);
 
-        myView.setTag(task.getKey());
-        myView.setOnClickListener(listener);
+        itemView.setTag(task.getKey());
+        itemView.setOnClickListener(listener);
 
-        myView.setVisibility(!showDone && task.getDone() ? View.GONE : View.VISIBLE);
+        itemView.setVisibility(!showDone && task.getDone() ? View.GONE : View.VISIBLE);
     }
 
     private String computeCreated(Task task) {
diff --git a/projects/todos/app/src/main/java/io/v/todos/TodoListActivity.java b/projects/todos/app/src/main/java/io/v/todos/TodoListActivity.java
index 2fc7086..d049da2 100644
--- a/projects/todos/app/src/main/java/io/v/todos/TodoListActivity.java
+++ b/projects/todos/app/src/main/java/io/v/todos/TodoListActivity.java
@@ -7,10 +7,6 @@
 import android.app.Activity;
 import android.content.DialogInterface;
 import android.content.Intent;
-import android.graphics.Bitmap;
-import android.graphics.BitmapFactory;
-import android.graphics.Canvas;
-import android.graphics.Paint;
 import android.os.Bundle;
 import android.support.v7.app.AlertDialog;
 import android.support.v7.widget.RecyclerView;
@@ -89,69 +85,7 @@
         RecyclerView recyclerView = (RecyclerView)findViewById(R.id.recycler);
         recyclerView.setAdapter(adapter);
 
-        new ItemTouchHelper(new ItemTouchHelper.SimpleCallback(
-                ItemTouchHelper.UP | ItemTouchHelper.DOWN,
-                ItemTouchHelper.LEFT | ItemTouchHelper.RIGHT) {
-
-            private Paint paint = new Paint();
-            private Bitmap deleteIcon = BitmapFactory.decodeResource(
-                    getResources(), android.R.drawable.ic_input_delete);
-            private Bitmap doneIcon = BitmapFactory.decodeResource(
-                    getResources(), android.R.drawable.checkbox_on_background);
-
-            @Override
-            public void onChildDraw(Canvas c, RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder, float dX, float dY, int actionState, boolean isCurrentlyActive) {
-                // TODO(alexfandrianto): Refactor further. Is there another way to do this?
-                if (actionState == ItemTouchHelper.ACTION_STATE_SWIPE) {
-                    // Get RecyclerView item from the ViewHolder
-                    View itemView = viewHolder.itemView;
-
-                    if (dX > 0) {
-                        /* Set your color for positive displacement */
-                        paint.setColor(0xFF00FF00);
-
-                        // Draw Rect with varying right side, equal to displacement dX
-                        c.drawRect((float) itemView.getLeft(), (float) itemView.getTop(), dX,
-                                (float) itemView.getBottom(), paint);
-
-                        c.drawBitmap(doneIcon,
-                                (float) itemView.getLeft() + 32,
-                                (float) itemView.getTop() + ((float) itemView.getBottom() - (float) itemView.getTop() - doneIcon.getHeight())/2,
-                                paint);
-                    } else {
-                        /* Set your color for negative displacement */
-                        paint.setColor(0xFFFF0000);
-
-                        // Draw Rect with varying left side, equal to the item's right side plus negative displacement dX
-                        c.drawRect((float) itemView.getRight() + dX, (float) itemView.getTop(),
-                                (float) itemView.getRight(), (float) itemView.getBottom(), paint);
-
-
-                        //Set the image icon for Left swipe
-                        c.drawBitmap(deleteIcon,
-                                (float) itemView.getRight() - 32 - deleteIcon.getWidth(),
-                                (float) itemView.getTop() + ((float) itemView.getBottom() - (float) itemView.getTop() - deleteIcon.getHeight())/2,
-                                paint);
-                    }
-
-                    super.onChildDraw(c, recyclerView, viewHolder, dX, dY, actionState, isCurrentlyActive);
-                }
-            }
-
-            @Override
-            public boolean onMove(final RecyclerView recyclerView,
-                                  final RecyclerView.ViewHolder viewHolder,
-                                  final RecyclerView.ViewHolder target) {
-
-
-                /*editListStructure(l -> l.add(target.getAdapterPosition(),
-                        l.remove(viewHolder.getAdapterPosition())));*/
-
-                // TODO(alexfandrianto): Actually, I really doubt that we want to do this. It's super complex..
-                Log.d(SNACKOO_LISTS, "Moving is hard.");
-                return false;
-            }
-
+        new ItemTouchHelper(new SwipeableTouchHelperCallback() {
             @Override
             public void onSwiped(final RecyclerView.ViewHolder viewHolder, final int direction) {
                 if (direction == ItemTouchHelper.RIGHT) {
diff --git a/projects/todos/app/src/main/java/io/v/todos/TodoListViewHolder.java b/projects/todos/app/src/main/java/io/v/todos/TodoListViewHolder.java
index f0d36c4..f99beb2 100644
--- a/projects/todos/app/src/main/java/io/v/todos/TodoListViewHolder.java
+++ b/projects/todos/app/src/main/java/io/v/todos/TodoListViewHolder.java
@@ -4,39 +4,31 @@
 
 package io.v.todos;
 
-import android.support.v7.widget.CardView;
-import android.support.v7.widget.RecyclerView;
 import android.view.View;
 import android.widget.TextView;
 
 /**
  * @author alexfandrianto
  */
-public class TodoListViewHolder extends RecyclerView.ViewHolder {
-    private CardView myView;
-
+public class TodoListViewHolder extends SwipeableCardViewHolder {
     public TodoListViewHolder(View itemView) {
         super(itemView);
-
-        myView = (CardView)itemView;
     }
 
     public void bindTodoList(TodoList todoList, View.OnClickListener listener) {
-        // TODO(alexfandrianto): Now might be a good time to set data in myView.
-
-        final TextView name=(TextView)myView.findViewById(R.id.todo_list_name);
+        final TextView name=(TextView) itemView.findViewById(R.id.todo_list_name);
         name.setText(todoList.getName());
 
-        final TextView completedStatus=(TextView)myView.findViewById(R.id.todo_list_completed);
+        final TextView completedStatus=(TextView) itemView.findViewById(R.id.todo_list_completed);
         completedStatus.setText(computeCompleted(todoList));
 
-        final TextView timeAgo=(TextView)myView.findViewById(R.id.todo_list_time);
+        final TextView timeAgo=(TextView) itemView.findViewById(R.id.todo_list_time);
         timeAgo.setText(computeTimeAgo(todoList));
 
-        myView.setCardBackgroundColor(todoList.getDone() ? 0xFFCCCCCC : 0xFFFFFFFF);
+        getCardView().setCardBackgroundColor(todoList.getDone() ? 0xFFCCCCCC : 0xFFFFFFFF);
 
-        myView.setTag(todoList.getKey());
-        myView.setOnClickListener(listener);
+        itemView.setTag(todoList.getKey());
+        itemView.setOnClickListener(listener);
     }
 
     private String computeTimeAgo(TodoList todoList) {
diff --git a/projects/todos/app/src/main/res/layout/task_row.xml b/projects/todos/app/src/main/res/layout/task_row.xml
index 8fedb85..8d95a3a 100644
--- a/projects/todos/app/src/main/res/layout/task_row.xml
+++ b/projects/todos/app/src/main/res/layout/task_row.xml
@@ -1,51 +1,81 @@
 <?xml version="1.0" encoding="utf-8"?>
-<android.support.v7.widget.CardView xmlns:android="http://schemas.android.com/apk/res/android"
+<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
     android:layout_width="match_parent"
-    android:layout_height="match_parent"
-    xmlns:card_view="http://schemas.android.com/apk/res-auto"
-    android:layout_marginBottom="1dp"
-    card_view:cardElevation="1dp"
-    card_view:cardBackgroundColor="#DDDDFF"
-    card_view:cardCornerRadius="5dp">
-
-    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
-        android:orientation="horizontal"
+    android:layout_height="match_parent">
+    <LinearLayout
+        android:id="@+id/swipe_right"
         android:layout_width="match_parent"
-        android:layout_height="wrap_content">
-
-        <ImageView android:id="@+id/task_done"
+        android:layout_height="match_parent"
+        android:background="#00FF00"
+        android:visibility="gone">
+        <ImageView
             android:layout_width="wrap_content"
             android:layout_height="wrap_content"
-            android:layout_weight = "0"
             android:src="@android:drawable/checkbox_on_background"
             android:layout_gravity="center_vertical"
-            android:layout_margin="@dimen/fab_margin"
-            android:visibility="gone"/>
+            android:layout_margin="@dimen/fab_margin"/>
+    </LinearLayout>
+    <LinearLayout
+        android:id="@+id/swipe_left"
+        android:layout_width="match_parent"
+        android:layout_height="match_parent"
+        android:background="#FF0000"
+        android:gravity="right"
+        android:visibility="gone">
+        <ImageView
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:src="@android:drawable/ic_input_delete"
+            android:layout_gravity="center_vertical"
+            android:layout_margin="@dimen/fab_margin"/>
+    </LinearLayout>
+    <android.support.v7.widget.CardView android:id="@+id/card"
+        android:layout_width="match_parent"
+        android:layout_height="match_parent"
+        xmlns:card_view="http://schemas.android.com/apk/res-auto"
+        android:layout_marginBottom="1dp"
+        card_view:cardElevation="1dp"
+        card_view:cardBackgroundColor="#DDDDFF">
 
-        <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
-            android:orientation="vertical"
-            android:layout_width="fill_parent"
-            android:layout_weight = "1"
+        <LinearLayout
+            android:orientation="horizontal"
+            android:layout_width="match_parent"
             android:layout_height="wrap_content">
 
-            <TextView android:id="@+id/task_text"
-                android:layout_width="fill_parent"
+            <ImageView android:id="@+id/task_done"
+                android:layout_width="wrap_content"
                 android:layout_height="wrap_content"
-                android:layout_weight = "1"
-                android:gravity="center_vertical"
-                android:textStyle="bold"
-                android:textSize="22sp"
-                android:textColor="#000000"
-                android:layout_margin="5dp"  />
+                android:layout_weight = "0"
+                android:src="@android:drawable/checkbox_on_background"
+                android:layout_gravity="center_vertical"
+                android:layout_margin="@dimen/fab_margin"
+                android:visibility="gone"/>
 
-            <TextView android:id="@+id/task_time"
+            <LinearLayout
+                android:orientation="vertical"
                 android:layout_width="fill_parent"
-                android:layout_height="wrap_content"
                 android:layout_weight = "1"
-                android:gravity="center_vertical"
-                android:textSize="12sp"
-                android:textColor="#333333"
-                android:layout_margin="5dp" />
+                android:layout_height="wrap_content">
+
+                <TextView android:id="@+id/task_text"
+                    android:layout_width="fill_parent"
+                    android:layout_height="wrap_content"
+                    android:layout_weight = "1"
+                    android:gravity="center_vertical"
+                    android:textStyle="bold"
+                    android:textSize="22sp"
+                    android:textColor="#000000"
+                    android:layout_margin="5dp"  />
+
+                <TextView android:id="@+id/task_time"
+                    android:layout_width="fill_parent"
+                    android:layout_height="wrap_content"
+                    android:layout_weight = "1"
+                    android:gravity="center_vertical"
+                    android:textSize="12sp"
+                    android:textColor="#333333"
+                    android:layout_margin="5dp" />
+            </LinearLayout>
         </LinearLayout>
-    </LinearLayout>
-</android.support.v7.widget.CardView>
\ No newline at end of file
+    </android.support.v7.widget.CardView>
+</FrameLayout>
\ No newline at end of file
diff --git a/projects/todos/app/src/main/res/layout/todo_list_row.xml b/projects/todos/app/src/main/res/layout/todo_list_row.xml
index f69ddfb..9006102 100644
--- a/projects/todos/app/src/main/res/layout/todo_list_row.xml
+++ b/projects/todos/app/src/main/res/layout/todo_list_row.xml
@@ -1,51 +1,83 @@
 <?xml version="1.0" encoding="utf-8"?>
-<android.support.v7.widget.CardView xmlns:android="http://schemas.android.com/apk/res/android"
+<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
     android:layout_width="match_parent"
-    android:layout_height="match_parent"
-    xmlns:card_view="http://schemas.android.com/apk/res-auto"
-    android:layout_marginBottom="1dp"
-    card_view:cardElevation="1dp"
-    card_view:cardBackgroundColor="#DDDDFF"
-    card_view:cardCornerRadius="5dp">
-
-    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
-        android:orientation="vertical"
+    android:layout_height="match_parent">
+    <LinearLayout
+        android:id="@+id/swipe_right"
         android:layout_width="match_parent"
-        android:layout_height="wrap_content">
-
-        <TextView android:id="@+id/todo_list_name"
-            android:layout_width="fill_parent"
-            android:layout_weight = "1"
+        android:layout_height="match_parent"
+        android:background="#00FF00"
+        android:visibility="gone">
+        <ImageView
+            android:layout_width="wrap_content"
             android:layout_height="wrap_content"
-            android:gravity="center_vertical"
-            android:textStyle="bold"
-            android:textSize="22sp"
-            android:textColor="#000000"
-            android:layout_margin="5dp" />
+            android:src="@android:drawable/checkbox_on_background"
+            android:layout_gravity="center_vertical"
+            android:layout_margin="@dimen/fab_margin"/>
+    </LinearLayout>
+    <LinearLayout
+        android:id="@+id/swipe_left"
+        android:layout_width="match_parent"
+        android:layout_height="match_parent"
+        android:background="#FF0000"
+        android:gravity="right"
+        android:visibility="gone">
+        <ImageView
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:src="@android:drawable/ic_input_delete"
+            android:layout_gravity="center_vertical"
+            android:layout_margin="@dimen/fab_margin"/>
+    </LinearLayout>
+
+    <android.support.v7.widget.CardView android:id="@+id/card"
+        android:layout_width="match_parent"
+        android:layout_height="match_parent"
+        xmlns:card_view="http://schemas.android.com/apk/res-auto"
+        android:layout_marginBottom="1dp"
+        card_view:cardElevation="1dp"
+        card_view:cardBackgroundColor="#DDDDFF"
+        card_view:cardCornerRadius="5dp">
 
         <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
-            android:orientation="horizontal"
+            android:orientation="vertical"
             android:layout_width="match_parent"
-            android:layout_height="wrap_content"
-            android:layout_weight = "1">
+            android:layout_height="wrap_content">
 
-            <TextView android:id="@+id/todo_list_completed"
-                android:layout_width="wrap_content"
+            <TextView android:id="@+id/todo_list_name"
+                android:layout_width="fill_parent"
                 android:layout_weight = "1"
-                android:layout_height="fill_parent"
+                android:layout_height="wrap_content"
                 android:gravity="center_vertical"
-                android:textSize="12sp"
-                android:textColor="#333333"
+                android:textStyle="bold"
+                android:textSize="22sp"
+                android:textColor="#000000"
                 android:layout_margin="5dp" />
 
-            <TextView android:id="@+id/todo_list_time"
-                android:layout_width="wrap_content"
-                android:layout_weight = "1"
-                android:layout_height="fill_parent"
-                android:gravity="center_vertical"
-                android:textSize="12sp"
-                android:textColor="#333333"
-                android:layout_margin="5dp" />
+            <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+                android:orientation="horizontal"
+                android:layout_width="match_parent"
+                android:layout_height="wrap_content"
+                android:layout_weight = "1">
+
+                <TextView android:id="@+id/todo_list_completed"
+                    android:layout_width="wrap_content"
+                    android:layout_weight = "1"
+                    android:layout_height="fill_parent"
+                    android:gravity="center_vertical"
+                    android:textSize="12sp"
+                    android:textColor="#333333"
+                    android:layout_margin="5dp" />
+
+                <TextView android:id="@+id/todo_list_time"
+                    android:layout_width="wrap_content"
+                    android:layout_weight = "1"
+                    android:layout_height="fill_parent"
+                    android:gravity="center_vertical"
+                    android:textSize="12sp"
+                    android:textColor="#333333"
+                    android:layout_margin="5dp" />
+            </LinearLayout>
         </LinearLayout>
-    </LinearLayout>
-</android.support.v7.widget.CardView>
\ No newline at end of file
+    </android.support.v7.widget.CardView>
+</FrameLayout>
\ No newline at end of file