APPENDIX-SOURCE CODE:
Main Activity.java:
package com.example.doit;
import androidx.appcompat.app.AppCompatActivity;
import androidx.recyclerview.widget.ItemTouchHelper;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
import android.content.DialogInterface;
import android.os.Bundle;
import android.view.View;
import com.google.android.material.floatingactionbutton.FloatingActionButton;
import com.example.doit.Adapters.ToDoAdapter;
import com.example.doit.Model.ToDoModel;
import com.example.doit.Utils.DatabaseHandler;
import java.util.Collections;
import java.util.List;
import java.util.Objects;
public class MainActivity extends AppCompatActivity implements DialogCloseListener{
private DatabaseHandler db;
private RecyclerView tasksRecyclerView;
private ToDoAdapter tasksAdapter;
private FloatingActionButton fab;
private List<ToDoModel> taskList;
28
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Objects.requireNonNull(getSupportActionBar()).hide();
db = new DatabaseHandler(this);
db.openDatabase();
tasksRecyclerView = findViewById(R.id.tasksRecyclerView);
tasksRecyclerView.setLayoutManager(new LinearLayoutManager(this));
tasksAdapter = new ToDoAdapter(db,MainActivity.this);
tasksRecyclerView.setAdapter(tasksAdapter);
ItemTouchHelper itemTouchHelper = new
ItemTouchHelper(new RecyclerItemTouchHelper(tasksAdapter));
itemTouchHelper.attachToRecyclerView(tasksRecyclerView);
fab = findViewById(R.id.fab);
taskList = db.getAllTasks();
Collections.reverse(taskList);
tasksAdapter.setTasks(taskList);
fab.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
AddNewTask.newInstance().show(getSupportFragmentManager(),
AddNewTask.TAG);
});
29
@Override
public void handleDialogClose(DialogInterface dialog){
taskList = db.getAllTasks();
Collections.reverse(taskList);
tasksAdapter.setTasks(taskList);
tasksAdapter.notifyDataSetChanged();
Add New Task .java:
package com.example.doit;
import android.app.Activity;
import android.content.DialogInterface;
import android.graphics.Color;
import android.os.Bundle;
import android.text.Editable;
import android.text.TextWatcher;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.view.WindowManager;
import android.widget.Button;
import android.widget.EditText;import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.core.content.ContextCompat;
30
import com.google.android.material.bottomsheet.BottomSheetDialogFragment;
import com.example.doit.Model.ToDoModel;
import com.example.doit.Utils.DatabaseHandler;
import com.example.doit.R;
import java.util.Objects;
public class AddNewTask extends BottomSheetDialogFragment {
public static final String TAG = "ActionBottomDialog";
private EditText newTaskText;
private Button newTaskSaveButton;
private DatabaseHandler db;
public static AddNewTask newInstance(){
return new AddNewTask();
@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setStyle(STYLE_NORMAL, R.style.DialogStyle);
}
@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup
container,
@Nullable Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.new_task, container, false);
getDialog().getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_A
DJUST_RESIZE);
31
return view;
@Override
public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
newTaskText = Objects.requireNonNull(getView()).findViewById(R.id.newTaskText);
newTaskSaveButton = getView().findViewById(R.id.newTaskButton);
boolean isUpdate = false;
final Bundle bundle = getArguments();
if(bundle != null){
isUpdate = true;
String task = bundle.getString("task");
newTaskText.setText(task);
assert task != null;
if(task.length()>0)
newTaskSaveButton.setTextColor(ContextCompat.getColor(Objects.requireNonNull(getContext
()), R.color.colorPrimaryDark));
db = new DatabaseHandler(getActivity());
db.openDatabase();
newTaskText.addTextChangedListener(new TextWatcher() {
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
32
if(s.toString().equals("")){
newTaskSaveButton.setEnabled(false);
newTaskSaveButton.setTextColor(Color.GRAY);
else{
newTaskSaveButton.setEnabled(true);
newTaskSaveButton.setTextColor(ContextCompat.getColor(Objects.requireNonNull(getContext
()), R.color.colorPrimaryDark));
@Override
public void afterTextChanged(Editable s) {
});
final boolean finalIsUpdate = isUpdate;
newTaskSaveButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
String text = newTaskText.getText().toString();
if(finalIsUpdate){
db.updateTask(bundle.getInt("id"), text);
else {
ToDoModel task = new ToDoModel();
task.setTask(text);
33
task.setStatus(0);
db.insertTask(task);
dismiss();
});
@Override
public void onDismiss(@NonNull DialogInterface dialog){
Activity activity = getActivity();
if(activity instanceof DialogCloseListener)
((DialogCloseListener)activity).handleDialogClose(dialog);
Recycleritem TouchHelper.java:
package com.example.doit;
import android.content.DialogInterface;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.drawable.ColorDrawable;
import android.graphics.drawable.Drawable;
import android.view.View;
import androidx.annotation.NonNull;
import androidx.appcompat.app.AlertDialog;
34
import androidx.core.content.ContextCompat;
import androidx.recyclerview.widget.ItemTouchHelper;
import androidx.recyclerview.widget.RecyclerView;
import com.example.doit.Adapters.ToDoAdapter;
import com.example.doit.R;
public class RecyclerItemTouchHelper extends ItemTouchHelper.SimpleCallback {
private ToDoAdapter adapter;
public RecyclerItemTouchHelper(ToDoAdapter adapter) {
super(0, ItemTouchHelper.LEFT | ItemTouchHelper.RIGHT);
this.adapter = adapter;
@Override
public boolean onMove(@NonNull RecyclerView recyclerView, @NonNull
RecyclerView.ViewHolder viewHolder, @NonNull RecyclerView.ViewHolder target) {
return false;
@Override
public void onSwiped(@NonNull final RecyclerView.ViewHolder viewHolder, int direction)
final int position = viewHolder.getAdapterPosition();
if (direction == ItemTouchHelper.LEFT) {
AlertDialog.Builder builder = new AlertDialog.Builder(adapter.getContext());
builder.setTitle("Delete Task");
builder.setMessage("Are you sure you want to delete this Task?");
builder.setPositiveButton("Confirm",
new DialogInterface.OnClickListener() {
35
@Override
public void onClick(DialogInterface dialog, int which) {
adapter.deleteItem(position);
});
builder.setNegativeButton(android.R.string.cancel, new
DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
adapter.notifyItemChanged(viewHolder.getAdapterPosition());
});
AlertDialog dialog = builder.create();
dialog.show();
} else {
adapter.editItem(position);
@Override
public void onChildDraw(@NonNull Canvas c, @NonNull RecyclerView recyclerView,
@NonNull RecyclerView.ViewHolder viewHolder, float dX, float dY, int actionState, boolean
isCurrentlyActive) { super.onChildDraw(c, recyclerView, viewHolder, dX, dY, actionState,
isCurrentlyActive);
Drawable icon;
ColorDrawable background;
View itemView = viewHolder.itemView;
int backgroundCornerOffset = 20;
36
if (dX > 0) {
icon = ContextCompat.getDrawable(adapter.getContext(), R.drawable.ic_baseline_edit);
background = new ColorDrawable(ContextCompat.getColor(adapter.getContext(),
R.color.colorPrimaryDark));
} else {
icon = ContextCompat.getDrawable(adapter.getContext(),
R.drawable.ic_baseline_delete);
background = new ColorDrawable(Color.RED);
assert icon != null;
int iconMargin = (itemView.getHeight() - icon.getIntrinsicHeight()) / 2;
int iconTop = itemView.getTop() + (itemView.getHeight() - icon.getIntrinsicHeight()) / 2;
int iconBottom = iconTop + icon.getIntrinsicHeight();
if (dX > 0) { // Swiping to the right
int iconLeft = itemView.getLeft() + iconMargin;
int iconRight = itemView.getLeft() + iconMargin + icon.getIntrinsicWidth();
icon.setBounds(iconLeft, iconTop, iconRight, iconBottom);
background.setBounds(itemView.getLeft(), itemView.getTop(),
itemView.getLeft() + ((int) dX) + backgroundCornerOffset, itemView.getBottom());
} else if (dX < 0) { // Swiping to the left
int iconLeft = itemView.getRight() - iconMargin - icon.getIntrinsicWidth();
int iconRight = itemView.getRight() - iconMargin;
icon.setBounds(iconLeft, iconTop, iconRight, iconBottom);
background.setBounds(itemView.getRight() + ((int) dX) - backgroundCornerOffset,
itemView.getTop(), itemView.getRight(), itemView.getBottom());
37
} else { // view is unSwiped
background.setBounds(0, 0, 0, 0);
background.draw(c);
icon.draw(c);
Context appContext = InstrumentationRegistry.getInstrumentation().getTargetContext();
assertEquals("net.penguincoders.doit", appContext.getPackageName());