Genova t167 Final Activity
Genova t167 Final Activity
SOURCE CODE:
XML DESIGN
Activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent">
<TextView
android:id="@+id/tasksText"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginBottom="16dp"
android:layout_marginLeft="16dp"
android:layout_marginStart="16dp"
android:layout_marginTop="16dp"
android:text="MY PERSONAL BUCKET LIST"
android:textColor="@android:color/black"
android:textSize="32sp"
android:textStyle="bold" />
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/tasksRecyclerView"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_below="@id/tasksText"
app:layoutManager="androidx.recyclerview.widget.LinearLayoutManager"
android:nestedScrollingEnabled="true" />
<com.google.android.material.floatingactionbutton.FloatingActionButton
android:id="@+id/fab"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:layout_alignParentEnd="true"
android:layout_margin="32dp"
android:backgroundTint="@android:color/holo_green_dark"
android:src="@drawable/ic_baseline_add_24"
android:layout_alignParentRight="true" />
</RelativeLayout>
Activity_splash.xml
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_height="match_parent"
android:layout_width="match_parent"
android:background="@android:color/holo_blue_dark">
<ImageView
android:layout_width="200dp"
android:layout_height="200dp"
android:layout_centerInParent="true"
android:src="@drawable/bucket"/>
</RelativeLayout>
New_task.xml
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:padding="16dp">
<EditText
android:id="@+id/newTaskText"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@null"
android:textAppearance="@style/TextAppearance.AppCompat.Medium"
android:hint="New Bucket List" />
<Button
android:id="@+id/newTaskButton"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@id/newTaskText"
android:textSize="16sp"
android:layout_alignParentEnd="true"
android:background="@android:color/transparent"
android:text="Save"
android:textAllCaps="false"
android:textColor="@android:color/holo_green_dark"
android:layout_alignParentRight="true" />
</RelativeLayout>
Task_layout.xml
.cardview.widget.CardView
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
app:cardElevation="4dp"
app:cardCornerRadius="8dp"
android:layout_marginHorizontal="16dp"
android:layout_marginVertical="8dp">
<RelativeLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:padding="8dp">
<CheckBox
android:id="@+id/todoCheckBox"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerHorizontal="true"
android:paddingStart="8dp"
android:buttonTint="@android:color/holo_green_dark"
tools:text="Go to the market and bring vegetables immediately
today."
android:paddingLeft="8dp" />
</RelativeLayout>
</androidx.cardview.widget.CardView>
Colors.xml
<?xml version="1.0" encoding="utf-8"?>
<resources>
<color name="purple_200">#FFBB86FC</color>
<color name="purple_500">#FF6200EE</color>
<color name="purple_700">#FF3700B3</color>
<color name="teal_200">#FF03DAC5</color>
<color name="teal_700">#FF018786</color>
<color name="black">#FF000000</color>
<color name="white">#FFFFFFFF</color>
</resources>
Styles.xml
<resources xmlns:tools="http://schemas.android.com/tools">
<!-- Base application theme. -->
<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
<!-- Customize your theme here. -->
<item name="colorPrimary">@android:color/holo_blue_bright</item>
<item name="colorPrimaryDark">@android:color/holo_blue_dark</item>
<item name="colorAccent">@android:color/holo_green_dark</item>
</style>
</resources>
Strings.xml
<resources>
<string name="app_name">My Personal Bucket List</string>
<string name="save">Save</string>
<string name="new_task">New Task</string>
<string name="tasks">Tasks</string>
</resources>
MainActivity.java
package com.example.mypersonalbucketlist;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
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.AsyncTask;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import com.google.android.material.floatingactionbutton.FloatingActionButton;
import com.example.mypersonalbucketlist.Adapter.ToDoAdapter;
import com.example.mypersonalbucketlist.model.ToDoModel;
import com.example.mypersonalbucketlist.Utils.DatabaseHandler;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.Iterator;
import java.util.List;
import java.util.ListIterator;
import java.util.Objects;
public class MainActivity extends AppCompatActivity implements
DialogCloseListener{
@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);
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);
}
});
}
@Override
public void handleDialogClose(DialogInterface dialog){
taskList = db.getAllTasks();
Collections.reverse(taskList);
tasksAdapter.setTasks(taskList);
tasksAdapter.notifyDataSetChanged();
}
}
AddNewTask.java
package com.example.mypersonalbucketlist;
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;
import com.google.android.material.bottomsheet.BottomSheetDialogFragment;
import com.example.mypersonalbucketlist.Adapter.ToDoAdapter;
import com.example.mypersonalbucketlist.model.ToDoModel;
import com.example.mypersonalbucketlist.Utils.DatabaseHandler;
import java.util.Objects;
@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setStyle(STYLE_NORMAL, R.style.DialogStyle);
}
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable
ViewGroup container,
@Nullable Bundle savedInstanceState) {
getDialog().getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPU
T_ADJUST_RESIZE);
return view;
}
@Override
public void onViewCreated(@NonNull View view, @Nullable Bundle
savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
newTaskText = requireView().findViewById(R.id.newTaskText);
newTaskSaveButton = getView().findViewById(R.id.newTaskButton);
newTaskSaveButton.setTextColor(ContextCompat.getColor(requireContext(),
R.color.black));
}
}
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) {
if(s.toString().equals("")){
newTaskSaveButton.setEnabled(false);
newTaskSaveButton.setTextColor(Color.GRAY);
}
else{
newTaskSaveButton.setEnabled(true);
newTaskSaveButton.setTextColor(ContextCompat.getColor(requireContext(),
R.color.black));
}
}
@Override
public void afterTextChanged(Editable s) {
}
});
@Override
public void onDismiss(@NonNull DialogInterface dialog){
Activity activity = getActivity();
if(activity instanceof DialogCloseListener)
((DialogCloseListener)activity).handleDialogClose(dialog);
}
}
RecyclerItemTouchHelper.java
package com.example.mypersonalbucketlist;
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;
import androidx.core.content.ContextCompat;
import androidx.recyclerview.widget.ItemTouchHelper;
import androidx.recyclerview.widget.RecyclerView;
import com.example.mypersonalbucketlist.Adapter.ToDoAdapter;
@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() {
@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;
if (dX > 0) {
icon = ContextCompat.getDrawable(adapter.getContext(),
R.drawable.ic_baseline_edit);
background = new
ColorDrawable(ContextCompat.getColor(adapter.getContext(), R.color.black));
} else {
icon = ContextCompat.getDrawable(adapter.getContext(),
R.drawable.ic_baseline_delete);
background = new ColorDrawable(Color.RED);
}
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.draw(c);
icon.draw(c);
}
}
SplashActivity.java
package com.example.mypersonalbucketlist;
import androidx.appcompat.app.AppCompatActivity;
import android.content.Intent;
import android.os.Bundle;
import android.os.Handler;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_splash);
getSupportActionBar().hide();
DialogCloseListener.java
package com.example.mypersonalbucketlist;
import android.content.DialogInterface;
DatabaseHandler.java
package com.example.mypersonalbucketlist.Utils;
import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import com.example.mypersonalbucketlist.model.ToDoModel;
import java.util.ArrayList;
import java.util.List;
@Override
public void onCreate(SQLiteDatabase db) {
db.execSQL(CREATE_TODO_TABLE);
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion)
{
// Drop older table if existed
db.execSQL("DROP TABLE IF EXISTS " + TODO_TABLE);
// Create tables again
onCreate(db);
}
task.setTask(cur.getString(cur.getColumnIndex(TASK)));
task.setStatus(cur.getInt(cur.getColumnIndex(STATUS)));
taskList.add(task);
}
while(cur.moveToNext());
}
}
}
finally {
db.endTransaction();
assert cur != null;
cur.close();
}
return taskList;
}
public void updateStatus(int id, int status){
ContentValues cv = new ContentValues();
cv.put(STATUS, status);
db.update(TODO_TABLE, cv, ID + "= ?", new String[]
{String.valueOf(id)});
}
ToDoModel.java
package com.example.mypersonalbucketlist.model;
import android.content.Context;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.CheckBox;
import android.widget.CompoundButton;
import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView;
import com.example.mypersonalbucketlist.AddNewTask;
import com.example.mypersonalbucketlist.MainActivity;
import com.example.mypersonalbucketlist.model.ToDoModel;
import com.example.mypersonalbucketlist.R;
import com.example.mypersonalbucketlist.Utils.DatabaseHandler;
import java.util.List;
@NonNull
@Override
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View itemView = LayoutInflater.from(parent.getContext())
.inflate(R.layout.task_layout, parent, false);
return new ViewHolder(itemView);
}
@Override
public void onBindViewHolder(@NonNull final ViewHolder holder, int
position) {
db.openDatabase();
@Override
public int getItemCount() {
return todoList.size();
}
ViewHolder(View view) {
super(view);
task = view.findViewById(R.id.todoCheckBox);
}
}
}
OUTPUT: