1 package com.sudogeeks.talking_reminder;
3 import android.content.Intent;
4 import android.os.Bundle;
5 import android.view.ContextMenu;
6 import android.view.LayoutInflater;
7 import android.view.Menu;
8 import android.view.MenuItem;
9 import android.view.View;
10 import android.view.ViewGroup;
11 import android.widget.ImageView;
12 import android.widget.TextView;
13 import android.widget.Toast;
15 import androidx.annotation.NonNull;
16 import androidx.annotation.Nullable;
17 import androidx.appcompat.app.AppCompatActivity;
18 import androidx.appcompat.view.ActionMode;
19 import androidx.appcompat.widget.Toolbar;
20 import androidx.recyclerview.widget.LinearLayoutManager;
21 import androidx.recyclerview.widget.RecyclerView;
23 import com.amulyakhare.textdrawable.TextDrawable;
24 import com.amulyakhare.textdrawable.util.ColorGenerator;
25 import com.bignerdranch.android.multiselector.ModalMultiSelectorCallback;
26 import com.bignerdranch.android.multiselector.MultiSelector;
27 import com.bignerdranch.android.multiselector.SwappingHolder;
28 import com.firebase.ui.auth.AuthUI;
29 import com.google.android.material.floatingactionbutton.FloatingActionButton;
30 import com.google.firebase.auth.FirebaseAuth;
31 import com.google.firebase.auth.FirebaseUser;
32 import com.google.firebase.database.ChildEventListener;
33 import com.google.firebase.database.DataSnapshot;
34 import com.google.firebase.database.DatabaseError;
35 import com.google.firebase.database.DatabaseReference;
36 import com.google.firebase.database.FirebaseDatabase;
38 import java.text.DateFormat;
39 import java.text.ParseException;
40 import java.text.SimpleDateFormat;
41 import java.util.ArrayList;
42 import java.util.Arrays;
43 import java.util.Collections;
44 import java.util.Comparator;
45 import java.util.LinkedHashMap;
46 import java.util.List;
53 private static final int RC_SIGN_IN = 123;
54 private RecyclerView reminderListView;
56 private Toolbar mToolbar;
57 private TextView mNoReminderView;
58 private FloatingActionButton mAddReminderButton;
59 private int mTempPost;
60 private LinkedHashMap<Integer, Integer> IDmap =
new LinkedHashMap<>();
62 private MultiSelector mMultiSelector =
new MultiSelector();
64 private FirebaseDatabase firebaseDatabase;
65 private DatabaseReference reminderDatabaseReference;
66 private ChildEventListener dbChildEventListener;
67 private FirebaseAuth firebaseAuth;
68 private FirebaseAuth.AuthStateListener authStateListener;
69 private ArrayList<ReminderDO> reminderDOArrayList =
new ArrayList<>();
71 private ModalMultiSelectorCallback mDeleteMode =
new ModalMultiSelectorCallback(mMultiSelector) {
74 public boolean onCreateActionMode(ActionMode actionMode, Menu menu) {
75 getMenuInflater().inflate(R.menu.menu_add_reminder, menu);
86 public boolean onActionItemClicked(ActionMode actionMode, MenuItem menuItem) {
87 switch (menuItem.getItemId()) {
90 case R.id.discard_reminder:
95 for (
int i = IDmap.size(); i >= 0; i--) {
96 if (mMultiSelector.isSelected(i, 0)) {
97 int id = IDmap.get(i);
104 mAdapter.removeItemSelected(i);
106 mAlarmReceiver.
cancelAlarm(getApplicationContext(),
id);
111 mMultiSelector.clearSelections();
117 Toast.makeText(getApplicationContext(),
119 Toast.LENGTH_SHORT).show();
125 if (mTest.isEmpty()) {
126 mNoReminderView.setVisibility(View.VISIBLE);
128 mNoReminderView.setVisibility(View.GONE);
134 case R.id.save_reminder:
138 mMultiSelector.clearSelections();
154 protected void onCreate(Bundle savedInstanceState) {
155 super.onCreate(savedInstanceState);
156 setContentView(R.layout.activity_main);
159 firebaseDatabase = FirebaseDatabase.getInstance();
160 firebaseAuth = FirebaseAuth.getInstance();
161 FirebaseUser user = firebaseAuth.getCurrentUser();
164 authStateListener =
new FirebaseAuth.AuthStateListener() {
166 public void onAuthStateChanged(@NonNull FirebaseAuth firebaseAuth) {
167 FirebaseUser user = firebaseAuth.getCurrentUser();
170 reminderDatabaseReference = firebaseDatabase.getReference().child(
"reminders").child(user.getUid());
171 Toast.makeText(
MainActivity.this,
"You're now signed in.\nWelcome to Talking ReminderDO!", Toast.LENGTH_SHORT).show();
172 attachDatabaseReadListener();
175 startActivityForResult(
177 .createSignInIntentBuilder()
178 .setIsSmartLockEnabled(
false)
179 .setAvailableProviders(Arrays.asList(
180 new AuthUI.IdpConfig.GoogleBuilder().build(),
181 new AuthUI.IdpConfig.EmailBuilder().build()))
192 mToolbar = findViewById(R.id.toolbar);
193 mAddReminderButton = findViewById(R.id.add_reminder);
194 reminderListView = findViewById(R.id.reminder_list);
195 mNoReminderView = findViewById(R.id.no_reminder_text);
201 if (mTest.isEmpty()) {
202 mNoReminderView.setVisibility(View.VISIBLE);
207 registerForContextMenu(reminderListView);
210 reminderListView.setAdapter(mAdapter);
213 setSupportActionBar(mToolbar);
214 mToolbar.setTitle(R.string.app_name);
217 mAddReminderButton.setOnClickListener(
new View.OnClickListener() {
219 public void onClick(View v) {
221 startActivity(intent);
233 private void attachDatabaseReadListener() {
235 if (dbChildEventListener ==
null) {
236 dbChildEventListener =
new ChildEventListener() {
239 public void onChildAdded(@NonNull DataSnapshot dataSnapshot, @Nullable String s) {
241 reminderDOArrayList.add(reminderObject);
245 public void onChildChanged(@NonNull DataSnapshot dataSnapshot, @Nullable String s) {
249 public void onChildRemoved(@NonNull DataSnapshot dataSnapshot) {
253 public void onChildMoved(@NonNull DataSnapshot dataSnapshot, @Nullable String s) {
257 public void onCancelled(@NonNull DatabaseError databaseError) {
261 reminderDatabaseReference.addChildEventListener(dbChildEventListener);
267 private void detachDatabaseReadListener() {
268 if (dbChildEventListener !=
null) {
269 reminderDatabaseReference.removeEventListener(dbChildEventListener);
270 dbChildEventListener =
null;
280 if (authStateListener !=
null) {
281 firebaseAuth.removeAuthStateListener(authStateListener);
283 detachDatabaseReadListener();
295 getMenuInflater().inflate(R.menu.menu_add_reminder, menu);
301 private void selectReminder(
int mClickID) {
302 String mStringClickID = Integer.toString(mClickID);
308 startActivityForResult(i, 1);
320 super.onActivityResult(requestCode, resultCode, data);
323 if (requestCode == RC_SIGN_IN) {
325 if (resultCode == RESULT_OK) {
326 Toast.makeText(
this,
"Signed in", Toast.LENGTH_SHORT);
328 }
else if (requestCode == RESULT_CANCELED) {
329 Toast.makeText(
this,
"Sign in cancelled", Toast.LENGTH_SHORT);
342 firebaseAuth.addAuthStateListener(authStateListener);
346 if (mTest.isEmpty()) {
347 mNoReminderView.setVisibility(View.VISIBLE);
349 mNoReminderView.setVisibility(View.GONE);
360 return new LinearLayoutManager(
this, LinearLayoutManager.VERTICAL,
false);
379 getMenuInflater().inflate(R.menu.main_menu, menu);
390 switch (item.getItemId()) {
393 AuthUI.getInstance().signOut(
this);
396 return super.onOptionsItemSelected(item);
405 public class SimpleAdapter extends RecyclerView.Adapter<SimpleAdapter.VerticalItemHolder> {
406 private ArrayList<ReminderItem> mItems;
409 mItems =
new ArrayList<>();
412 public void onDeleteItem(
int count) {
417 public void removeItemSelected(
int selected) {
418 if (mItems.isEmpty())
return;
419 mItems.remove(selected);
420 notifyItemRemoved(selected);
432 LayoutInflater inflater = LayoutInflater.from(container.getContext());
433 View root = inflater.inflate(R.layout.recycle_items, container,
false);
459 return mItems.size();
463 public void setItemCount(
int count) {
466 notifyDataSetChanged();
482 List<String> Titles =
new ArrayList<>();
483 List<String> Repeats =
new ArrayList<>();
484 List<String> RepeatNos =
new ArrayList<>();
485 List<String> RepeatTypes =
new ArrayList<>();
486 List<String> Actives =
new ArrayList<>();
487 List<String> DateAndTime =
new ArrayList<>();
488 List<Integer> IDList =
new ArrayList<>();
489 List<DateTimeSorter> DateTimeSortList =
new ArrayList<>();
493 Titles.add(reminderDO.getTitle());
494 DateAndTime.add(reminderDO.getDate() +
" " + reminderDO.getTime());
495 Repeats.add(reminderDO.getRepeat());
496 RepeatNos.add(reminderDO.getRepeatNo());
497 RepeatTypes.add(reminderDO.getRepeatType());
498 Actives.add(reminderDO.getActive());
499 IDList.add(reminderDO.getID());
505 for (
int k = 0; k < Titles.size(); k++) {
506 DateTimeSortList.add(
new DateTimeSorter(key, DateAndTime.get(k)));
517 int i = item.getIndex();
520 RepeatNos.get(i), RepeatTypes.get(i), Actives.get(i)));
521 IDmap.put(k, IDList.get(i));
531 public String mTitle;
532 public String mDateTime;
533 public String mRepeat;
534 public String mRepeatNo;
535 public String mRepeatType;
536 public String mActive;
547 public ReminderItem(String Title, String DateTime, String Repeat, String RepeatNo, String RepeatType, String Active) {
549 this.mDateTime = DateTime;
550 this.mRepeat = Repeat;
551 this.mRepeatNo = RepeatNo;
552 this.mRepeatType = RepeatType;
553 this.mActive = Active;
561 DateFormat f =
new SimpleDateFormat(
"dd/mm/yyyy hh:mm");
563 public int compare(Object a, Object b) {
568 return f.parse(o1).compareTo(f.parse(o2));
569 }
catch (ParseException e) {
570 throw new IllegalArgumentException(e);
579 implements View.OnClickListener, View.OnLongClickListener {
580 private TextView mTitleText, mDateAndTimeText, mRepeatInfoText;
581 private ImageView mActiveImage, mThumbnailImage;
582 private ColorGenerator mColorGenerator = ColorGenerator.DEFAULT;
583 private TextDrawable mDrawableBuilder;
594 super(itemView, mMultiSelector);
595 itemView.setOnClickListener(
this);
596 itemView.setOnLongClickListener(
this);
597 itemView.setLongClickable(
true);
603 mTitleText = itemView.findViewById(R.id.recycle_title);
604 mDateAndTimeText = itemView.findViewById(R.id.recycle_date_time);
605 mRepeatInfoText = itemView.findViewById(R.id.recycle_repeat_info);
606 mActiveImage = itemView.findViewById(R.id.active_image);
607 mThumbnailImage = itemView.findViewById(R.id.thumbnail_image);
616 if (!mMultiSelector.tapSelection(
this)) {
617 mTempPost = reminderListView.getChildAdapterPosition(view);
619 int mReminderClickID = IDmap.get(mTempPost);
620 selectReminder(mReminderClickID);
622 }
else if (mMultiSelector.getSelectedPositions().isEmpty()) {
635 activity.startSupportActionMode(mDeleteMode);
636 mMultiSelector.setSelected(
this,
true);
645 mTitleText.setText(reminderTitle);
648 if (reminderTitle !=
null && !reminderTitle.isEmpty()) {
649 letter = reminderTitle.substring(0, 1);
652 int color = mColorGenerator.getRandomColor();
655 mDrawableBuilder = TextDrawable.builder()
656 .buildRound(letter, color);
657 mThumbnailImage.setImageDrawable(mDrawableBuilder);
665 mDateAndTimeText.setText(datetime);
675 if (repeat.equals(
"true")) {
676 mRepeatInfoText.setText(
"Every " + repeatNo +
" " + repeatType +
"(s)");
677 }
else if (repeat.equals(
"false")) {
678 mRepeatInfoText.setText(
"Repeat Off");
687 if (active.equals(
"true")) {
688 mActiveImage.setImageResource(R.drawable.ic_notifications_active);
689 }
else if (active.equals(
"false")) {
690 mActiveImage.setImageResource(R.drawable.ic_notifications_off);