Skip to content

Commit 5b6d12b

Browse files
authored
Merge pull request #2 from certified84/notification-feature
Notification feature
2 parents de1199a + 21f481e commit 5b6d12b

File tree

13 files changed

+267
-77
lines changed

13 files changed

+267
-77
lines changed

app/build.gradle

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -74,7 +74,6 @@ dependencies {
7474
implementation "com.romandanylyk:pageindicatorview:1.0.3@aar"
7575

7676
// horizontal number picker
77-
implementation 'me.angrybyte.picker:picker:1.3.1'
7877
implementation 'com.shawnlin:number-picker:2.4.6'
7978

8079
// circle image

app/src/main/java/com/certified/notes/adapters/HomeCourseRecyclerAdapter.java

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@ public boolean areContentsTheSame(@NonNull Course oldItem, @NonNull Course newIt
2929
}
3030
};
3131

32+
private OnCourseClickedListener listener;
3233
public HomeCourseRecyclerAdapter() {
3334
super(DIFF_CALLBACK);
3435
}
@@ -47,14 +48,29 @@ public void onBindViewHolder(ViewHolder holder, int position) {
4748
holder.mCourseCode.setText(course.getCourseCode());
4849
}
4950

50-
protected static class ViewHolder extends RecyclerView.ViewHolder {
51+
public void setOnCourseClickedListener(OnCourseClickedListener listener) {
52+
this.listener = listener;
53+
}
54+
55+
public interface OnCourseClickedListener {
56+
void onCourseClick();
57+
}
58+
59+
protected class ViewHolder extends RecyclerView.ViewHolder {
5160

5261
public final TextView mCourseCode, mCourseTitle;
5362

5463
public ViewHolder(View itemView) {
5564
super(itemView);
5665
mCourseCode = itemView.findViewById(R.id.tv_course_code);
5766
mCourseTitle = itemView.findViewById(R.id.tv_course_title);
67+
68+
itemView.setOnClickListener(v -> {
69+
int position = getAdapterPosition();
70+
if (listener != null && position != RecyclerView.NO_POSITION) {
71+
listener.onCourseClick();
72+
}
73+
});
5874
}
5975
}
6076
}

app/src/main/java/com/certified/notes/adapters/HomeNoteRecyclerAdapter.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -67,10 +67,10 @@ public void setOnNoteClickedListener(OnNoteClickedListener listener) {
6767
}
6868

6969
public interface OnNoteClickedListener {
70-
void onNoteClick(Note note);
70+
void onNoteClick();
7171
}
7272

73-
public class ViewHolder extends RecyclerView.ViewHolder {
73+
protected class ViewHolder extends RecyclerView.ViewHolder {
7474

7575
public final TextView mNoteContent;
7676
public final TextView mNoteTitle;
@@ -83,7 +83,7 @@ public ViewHolder(View itemView) {
8383
itemView.setOnClickListener(v -> {
8484
int position = getAdapterPosition();
8585
if (listener != null && position != RecyclerView.NO_POSITION) {
86-
listener.onNoteClick(getItem(position));
86+
listener.onNoteClick();
8787
}
8888
});
8989
}

app/src/main/java/com/certified/notes/adapters/NoteRecyclerAdapterKt.kt

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,8 @@ import com.like.OnLikeListener
2222
import java.util.*
2323

2424
class NoteRecyclerAdapterKt(private val mContext: Context, private val mOwner: LifecycleOwner,
25-
private val mViewModel: NotesViewModel) : ListAdapter<Note, NoteRecyclerAdapterKt.ViewHolder>(
25+
private val mViewModel: NotesViewModel
26+
) : ListAdapter<Note, NoteRecyclerAdapterKt.ViewHolder>(
2627
DIFF_CALLBACK
2728
) {
2829

app/src/main/java/com/certified/notes/room/NotesDatabase.java

Lines changed: 30 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -66,36 +66,36 @@ public void onCreate(@NonNull SupportSQLiteDatabase db) {
6666
NotesDao notesDao = instance.mNotesDao();
6767

6868
// notesDao.deleteAllNotes();
69-
notesDao.insertNote(note1);
70-
notesDao.insertNote(note2);
71-
notesDao.insertNote(note3);
72-
notesDao.insertNote(note4);
73-
notesDao.insertNote(note5);
74-
notesDao.insertNote(note6);
75-
notesDao.insertNote(note7);
76-
notesDao.insertNote(note8);
77-
78-
// notesDao.deleteAllCourses();
79-
notesDao.insertCourse(course1);
80-
notesDao.insertCourse(course2);
81-
notesDao.insertCourse(course3);
82-
notesDao.insertCourse(course4);
83-
notesDao.insertCourse(course5);
84-
notesDao.insertCourse(course6);
85-
notesDao.insertCourse(course7);
86-
notesDao.insertCourse(course8);
87-
notesDao.insertCourse(course9);
88-
notesDao.insertCourse(course10);
89-
90-
// notesDao.deleteAllTodos();
91-
notesDao.insertTodo(todo1);
92-
notesDao.insertTodo(todo2);
93-
notesDao.insertTodo(todo3);
94-
notesDao.insertTodo(todo4);
95-
notesDao.insertTodo(todo5);
96-
notesDao.insertTodo(todo6);
97-
notesDao.insertTodo(todo7);
98-
notesDao.insertTodo(todo8);
69+
// notesDao.insertNote(note1);
70+
// notesDao.insertNote(note2);
71+
// notesDao.insertNote(note3);
72+
// notesDao.insertNote(note4);
73+
// notesDao.insertNote(note5);
74+
// notesDao.insertNote(note6);
75+
// notesDao.insertNote(note7);
76+
// notesDao.insertNote(note8);
77+
//
78+
//// notesDao.deleteAllCourses();
79+
// notesDao.insertCourse(course1);
80+
// notesDao.insertCourse(course2);
81+
// notesDao.insertCourse(course3);
82+
// notesDao.insertCourse(course4);
83+
// notesDao.insertCourse(course5);
84+
// notesDao.insertCourse(course6);
85+
// notesDao.insertCourse(course7);
86+
// notesDao.insertCourse(course8);
87+
// notesDao.insertCourse(course9);
88+
// notesDao.insertCourse(course10);
89+
//
90+
//// notesDao.deleteAllTodos();
91+
// notesDao.insertTodo(todo1);
92+
// notesDao.insertTodo(todo2);
93+
// notesDao.insertTodo(todo3);
94+
// notesDao.insertTodo(todo4);
95+
// notesDao.insertTodo(todo5);
96+
// notesDao.insertTodo(todo6);
97+
// notesDao.insertTodo(todo7);
98+
// notesDao.insertTodo(todo8);
9999

100100
notesDao.insertUser(user);
101101
});

app/src/main/java/com/certified/notes/ui/HomeFragment.java

Lines changed: 97 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@
3636
import com.google.android.material.card.MaterialCardView;
3737
import com.google.android.material.dialog.MaterialAlertDialogBuilder;
3838
import com.google.android.material.textview.MaterialTextView;
39+
import com.shawnlin.numberpicker.NumberPicker;
3940

4041
import java.util.ArrayList;
4142
import java.util.List;
@@ -53,6 +54,7 @@ public class HomeFragment extends Fragment implements View.OnClickListener, Popu
5354
private NavController mNavController;
5455
private NotesViewModel mViewModel;
5556
private MaterialCardView cardView;
57+
private TodoRecyclerAdapter todoRecyclerAdapter;
5658

5759
public HomeFragment() {
5860
// Required empty public constructor
@@ -108,33 +110,43 @@ private void init() {
108110

109111
HomeNoteRecyclerAdapter noteRecyclerAdapter = new HomeNoteRecyclerAdapter(ID_NOT_SET);
110112
mViewModel.getRandomNotes().observe(getViewLifecycleOwner(), notes -> {
111-
if (notes != null)
113+
if (notes != null) {
112114
noteRecyclerAdapter.submitList(notes);
115+
btnShowAllNotes.setClickable(true);
116+
}
113117
else {
114118
tvAddNoteDescription.setVisibility(View.VISIBLE);
115119
btnAddNote.setVisibility(View.VISIBLE);
120+
btnShowAllNotes.setClickable(false);
116121
}
117122
});
123+
118124
recyclerNotes.setAdapter(noteRecyclerAdapter);
119125
recyclerNotes.setLayoutManager(noteLayoutManager);
120126
recyclerNotes.setClipToPadding(false);
121127
recyclerNotes.setClipChildren(false);
128+
noteRecyclerAdapter.setOnNoteClickedListener(() -> mNavController.navigate(R.id.notesFragment));
122129

123130
HomeCourseRecyclerAdapter courseRecyclerAdapter = new HomeCourseRecyclerAdapter();
124131
mViewModel.getRandomCourses().observe(getViewLifecycleOwner(), courses -> {
125-
if (courses != null)
132+
if (courses != null) {
126133
courseRecyclerAdapter.submitList(courses);
134+
btnShowAllCourses.setClickable(true);
135+
}
127136
else {
128137
tvAddCourseDescription.setVisibility(View.VISIBLE);
129138
btnAddCourse.setVisibility(View.VISIBLE);
139+
btnShowAllCourses.setClickable(false);
130140
}
131141
});
142+
132143
recyclerCourses.setLayoutManager(courseLayoutManager);
133144
recyclerCourses.setAdapter(courseRecyclerAdapter);
134145
recyclerCourses.setClipToPadding(false);
135146
recyclerCourses.setClipChildren(false);
147+
courseRecyclerAdapter.setOnCourseClickedListener(() -> mNavController.navigate(R.id.coursesFragment));
136148

137-
TodoRecyclerAdapter todoRecyclerAdapter = new TodoRecyclerAdapter(getContext(), mViewModel);
149+
todoRecyclerAdapter = new TodoRecyclerAdapter(getContext(), mViewModel);
138150
mViewModel.getAllTodos().observe(getViewLifecycleOwner(), todos -> {
139151
if (todos.size() != 0)
140152
todoRecyclerAdapter.submitList(todos);
@@ -144,8 +156,10 @@ private void init() {
144156
btnAddTodo.setVisibility(View.VISIBLE);
145157
}
146158
});
159+
147160
recyclerTodos.setLayoutManager(todoLayoutManager);
148161
recyclerTodos.setAdapter(todoRecyclerAdapter);
162+
149163
todoRecyclerAdapter.setOnTodoClickedListener(todo -> {
150164
LayoutInflater inflater = this.getLayoutInflater();
151165
View view = inflater.inflate(R.layout.dialog_new_todo, null);
@@ -231,7 +245,7 @@ private void launchNoteDialog() {
231245
builder.setBackground(getContext().getDrawable(R.drawable.alert_dialog_bg));
232246
}
233247
AlertDialog alertDialog = builder.create();
234-
alertDialog.setCancelable(false);
248+
// alertDialog.setCancelable(false);
235249
alertDialog.setOnShowListener(dialog -> {
236250
alertDialog.getButton(AlertDialog.BUTTON_NEGATIVE).setTextColor(Color.RED);
237251
alertDialog.getButton(AlertDialog.BUTTON_POSITIVE).setTextColor(Color.RED);
@@ -292,13 +306,88 @@ private void launchNoteDialog() {
292306
}
293307

294308
public void launchCourseDialog() {
295-
btnAddCourse.setVisibility(View.GONE);
296-
tvAddCourseDescription.setVisibility(View.GONE);
309+
LayoutInflater inflater = getLayoutInflater();
310+
View view = inflater.inflate(R.layout.dialog_new_course, null);
311+
MaterialAlertDialogBuilder builder = new MaterialAlertDialogBuilder(requireContext());
312+
313+
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP)
314+
builder.setBackground(getContext().getDrawable(R.drawable.alert_dialog_bg));
315+
316+
AlertDialog alertDialog = builder.create();
317+
alertDialog.setOnShowListener(v -> {
318+
alertDialog.getButton(AlertDialog.BUTTON_NEGATIVE).setTextColor(Color.RED);
319+
alertDialog.getButton(AlertDialog.BUTTON_POSITIVE).setTextColor(Color.RED);
320+
});
321+
alertDialog.setView(view);
322+
323+
MaterialTextView tvCourseDialogTitle = view.findViewById(R.id.tv_course_dialog_title);
324+
EditText etCourseCode = view.findViewById(R.id.et_course_code);
325+
EditText etCourseTitle = view.findViewById(R.id.et_course_title);
326+
NumberPicker picker = view.findViewById(R.id.number_picker_course_unit);
327+
MaterialButton btnSave = view.findViewById(R.id.btn_save);
328+
MaterialButton btnCancel = view.findViewById(R.id.btn_cancel);
329+
330+
picker.setMinValue(1);
331+
picker.setMaxValue(4);
332+
tvCourseDialogTitle.setText(getString(R.string.add_course));
333+
btnCancel.setOnClickListener(v -> alertDialog.dismiss());
334+
btnSave.setOnClickListener(v -> {
335+
String courseCode = etCourseCode.getText().toString().trim();
336+
String courseTitle = etCourseTitle.getText().toString().trim();
337+
int courseUnit = picker.getValue();
338+
int MARK_NOT_SET = 0;
339+
int GRADE_POINT_NOT_SET = 0;
340+
if (!courseCode.isEmpty() && !courseTitle.isEmpty()) {
341+
Course course = new Course(courseCode, courseTitle, courseUnit, MARK_NOT_SET, "F", GRADE_POINT_NOT_SET);
342+
mViewModel.insertCourse(course);
343+
344+
btnAddCourse.setVisibility(View.GONE);
345+
tvAddCourseDescription.setVisibility(View.GONE);
346+
347+
alertDialog.dismiss();
348+
} else
349+
Toast.makeText(getContext(), getString(R.string.all_fields_are_required), Toast.LENGTH_SHORT).show();
350+
});
351+
alertDialog.show();
297352
}
298353

299354
public void launchTodoDialog() {
300-
btnAddTodo.setVisibility(View.GONE);
301-
tvAddTodoDescription.setVisibility(View.GONE);
355+
LayoutInflater inflater = getLayoutInflater();
356+
View view = inflater.inflate(R.layout.dialog_new_todo, null);
357+
MaterialAlertDialogBuilder builder = new MaterialAlertDialogBuilder(requireContext());
358+
359+
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP)
360+
builder.setBackground(getContext().getDrawable(R.drawable.alert_dialog_bg));
361+
362+
AlertDialog alertDialog = builder.create();
363+
alertDialog.setOnShowListener(v -> {
364+
alertDialog.getButton(AlertDialog.BUTTON_NEGATIVE).setTextColor(Color.RED);
365+
alertDialog.getButton(AlertDialog.BUTTON_POSITIVE).setTextColor(Color.RED);
366+
});
367+
alertDialog.setView(view);
368+
369+
MaterialTextView tvTodoDialogTitle = view.findViewById(R.id.tv_todo_dialog_title);
370+
EditText etTodo = view.findViewById(R.id.et_todo);
371+
MaterialButton btnSave = view.findViewById(R.id.btn_save);
372+
MaterialButton btnCancel = view.findViewById(R.id.btn_cancel);
373+
374+
tvTodoDialogTitle.setText(getString(R.string.add_todo));
375+
btnCancel.setOnClickListener(v -> alertDialog.dismiss());
376+
btnSave.setOnClickListener(v -> {
377+
String todoContent = etTodo.getText().toString().trim();
378+
if (!todoContent.isEmpty()) {
379+
Todo todo = new Todo(todoContent, false);
380+
mViewModel.insertTodo(todo);
381+
382+
btnAddTodo.setVisibility(View.GONE);
383+
tvAddTodoDescription.setVisibility(View.GONE);
384+
todoRecyclerAdapter.notifyDataSetChanged();
385+
386+
alertDialog.dismiss();
387+
} else
388+
Toast.makeText(getContext(), "", Toast.LENGTH_SHORT).show();
389+
});
390+
alertDialog.show();
302391
}
303392

304393
private void launchDeleteDialog(int id) {

0 commit comments

Comments
 (0)