1 package com.sudogeeks.talking_reminder;
3 import android.Manifest;
4 import android.app.AlertDialog;
5 import android.app.DatePickerDialog;
6 import android.app.TimePickerDialog;
7 import android.content.Context;
8 import android.content.DialogInterface;
9 import android.content.Intent;
10 import android.content.pm.PackageManager;
11 import android.net.Uri;
12 import android.os.Bundle;
13 import android.os.Environment;
14 import android.text.Editable;
15 import android.text.InputType;
16 import android.text.TextWatcher;
17 import android.view.Menu;
18 import android.view.MenuItem;
19 import android.view.View;
20 import android.widget.DatePicker;
21 import android.widget.EditText;
22 import android.widget.Switch;
23 import android.widget.TextView;
24 import android.widget.TimePicker;
25 import android.widget.Toast;
27 import androidx.appcompat.app.AppCompatActivity;
28 import androidx.appcompat.widget.Toolbar;
29 import androidx.core.app.ActivityCompat;
30 import androidx.core.content.ContextCompat;
31 import androidx.core.content.FileProvider;
33 import com.google.android.material.floatingactionbutton.FloatingActionButton;
34 import com.google.firebase.auth.FirebaseAuth;
35 import com.google.firebase.auth.FirebaseUser;
36 import com.google.firebase.database.DatabaseReference;
37 import com.google.firebase.database.FirebaseDatabase;
38 import com.google.gson.Gson;
39 import com.google.gson.GsonBuilder;
42 import java.io.FileOutputStream;
43 import java.util.Calendar;
51 private static final String KEY_TITLE =
"title_key";
52 private static final String KEY_TIME =
"time_key";
53 private static final String KEY_DATE =
"date_key";
54 private static final String KEY_REPEAT =
"repeat_key";
55 private static final String KEY_REPEAT_NO =
"repeat_no_key";
56 private static final String KEY_REPEAT_TYPE =
"repeat_type_key";
57 private static final String KEY_ACTIVE =
"active_key";
59 private static final long milMinute = 60000L;
60 private static final long milHour = 3600000L;
61 private static final long milDay = 86400000L;
62 private static final long milWeek = 604800000L;
63 private static final long milMonth = 2592000000L;
64 private static final int MY_PERMISSIONS_REQUEST_WRITE_CONTACTS = 1;
65 private Toolbar mToolbar;
66 private EditText mTitleText;
67 private TextView mDateText, mTimeText, mRepeatText, mRepeatNoText, mRepeatTypeText;
68 private FloatingActionButton mFAB1;
69 private FloatingActionButton mFAB2;
70 private Calendar mCalendar;
71 private int mYear, mMonth, mHour, mMinute, mDay;
72 private long mRepeatTime;
73 private String mTitle;
76 private String mRepeat;
77 private String mRepeatNo;
78 private String mRepeatType;
79 private String mActive;
81 private FirebaseAuth firebaseAuth = FirebaseAuth.getInstance();
82 private FirebaseDatabase firebaseDatabase = FirebaseDatabase.getInstance();
83 private DatabaseReference dbReference = firebaseDatabase.getReference().child(
"reminders");
90 protected void onCreate(Bundle savedInstanceState) {
91 super.onCreate(savedInstanceState);
92 setContentView(R.layout.activity_add_reminder);
95 mToolbar = findViewById(R.id.toolbar);
96 mTitleText = findViewById(R.id.reminder_title);
97 mDateText = findViewById(R.id.set_date);
98 mTimeText = findViewById(R.id.set_time);
99 mRepeatText = findViewById(R.id.set_repeat);
100 mRepeatNoText = findViewById(R.id.set_repeat_no);
101 mRepeatTypeText = findViewById(R.id.set_repeat_type);
102 mFAB1 = findViewById(R.id.starred1);
103 mFAB2 = findViewById(R.id.starred2);
106 setSupportActionBar(mToolbar);
107 getSupportActionBar().setTitle(R.string.activity_add_reminder_label);
108 getSupportActionBar().setDisplayHomeAsUpEnabled(
true);
109 getSupportActionBar().setHomeButtonEnabled(
true);
114 mRepeatNo = Integer.toString(1);
115 mRepeatType =
"Hour";
117 mCalendar = Calendar.getInstance();
118 mHour = mCalendar.get(Calendar.HOUR_OF_DAY);
119 mMinute = mCalendar.get(Calendar.MINUTE);
120 mYear = mCalendar.get(Calendar.YEAR);
121 mMonth = mCalendar.get(Calendar.MONTH) + 1;
122 mDay = mCalendar.get(Calendar.DATE);
124 mDate = mDay +
"/" + mMonth +
"/" + mYear;
125 mTime = mHour +
":" + mMinute;
128 mTitleText.addTextChangedListener(
new TextWatcher() {
131 public void beforeTextChanged(CharSequence s,
int start,
int count,
int after) {
135 public void onTextChanged(CharSequence s,
int start,
int before,
int count) {
136 mTitle = s.toString().trim();
137 mTitleText.setError(
null);
141 public void afterTextChanged(Editable s) {
146 mDateText.setText(mDate);
147 mTimeText.setText(mTime);
148 mRepeatNoText.setText(mRepeatNo);
149 mRepeatTypeText.setText(mRepeatType);
150 mRepeatText.setText(
"Every " + mRepeatNo +
" " + mRepeatType +
"(s)");
153 if (savedInstanceState !=
null) {
154 String savedTitle = savedInstanceState.getString(KEY_TITLE);
155 mTitleText.setText(savedTitle);
158 String savedTime = savedInstanceState.getString(KEY_TIME);
159 mTimeText.setText(savedTime);
162 String savedDate = savedInstanceState.getString(KEY_DATE);
163 mDateText.setText(savedDate);
166 String saveRepeat = savedInstanceState.getString(KEY_REPEAT);
167 mRepeatText.setText(saveRepeat);
168 mRepeat = saveRepeat;
170 String savedRepeatNo = savedInstanceState.getString(KEY_REPEAT_NO);
171 mRepeatNoText.setText(savedRepeatNo);
172 mRepeatNo = savedRepeatNo;
174 String savedRepeatType = savedInstanceState.getString(KEY_REPEAT_TYPE);
175 mRepeatTypeText.setText(savedRepeatType);
176 mRepeatType = savedRepeatType;
178 mActive = savedInstanceState.getString(KEY_ACTIVE);
182 if (mActive.equals(
"false")) {
186 }
else if (mActive.equals(
"true")) {
194 protected void onSaveInstanceState(Bundle outState) {
195 super.onSaveInstanceState(outState);
197 outState.putCharSequence(KEY_TITLE, mTitleText.getText());
198 outState.putCharSequence(KEY_TIME, mTimeText.getText());
199 outState.putCharSequence(KEY_DATE, mDateText.getText());
200 outState.putCharSequence(KEY_REPEAT, mRepeatText.getText());
201 outState.putCharSequence(KEY_REPEAT_NO, mRepeatNoText.getText());
202 outState.putCharSequence(KEY_REPEAT_TYPE, mRepeatTypeText.getText());
203 outState.putCharSequence(KEY_ACTIVE, mActive);
212 Calendar now = Calendar.getInstance();
213 TimePickerDialog timePickerDialog =
new TimePickerDialog(
this,
214 new TimePickerDialog.OnTimeSetListener() {
217 public void onTimeSet(TimePicker timePicker,
int hourOfDay,
223 mTime = hourOfDay +
":" +
"0" + minute;
225 mTime = hourOfDay +
":" + minute;
227 mTimeText.setText(mTime);
229 }, mHour, mMinute,
false);
230 timePickerDialog.show();
239 Calendar now = Calendar.getInstance();
240 DatePickerDialog datePickerDialog =
new DatePickerDialog(
this,
241 new DatePickerDialog.OnDateSetListener() {
244 public void onDateSet(DatePicker datePicker,
int year,
245 int monthOfYear,
int dayOfMonth) {
248 mMonth = monthOfYear + 1;
250 mDate = mDay +
"/" + mMonth +
"/" + mYear;
251 mDateText.setText(mDate);
254 }, mYear, mMonth, mDay);
255 datePickerDialog.show();
261 public void selectFab1(View v) {
262 mFAB1 = findViewById(R.id.starred1);
264 mFAB2 = findViewById(R.id.starred2);
270 public void selectFab2(View v) {
271 mFAB2 = findViewById(R.id.starred2);
273 mFAB1 = findViewById(R.id.starred1);
285 boolean on = ((Switch) view).isChecked();
288 mRepeatText.setText(
"Every " + mRepeatNo +
" " + mRepeatType +
"(s)");
291 mRepeatText.setText(R.string.repeat_off);
300 final String[] items =
new String[5];
309 AlertDialog.Builder builder =
new AlertDialog.Builder(
this);
310 builder.setTitle(
"Select Type");
311 builder.setItems(items,
new DialogInterface.OnClickListener() {
313 public void onClick(DialogInterface dialog,
int item) {
315 mRepeatType = items[item];
316 mRepeatTypeText.setText(mRepeatType);
317 mRepeatText.setText(
"Every " + mRepeatNo +
" " + mRepeatType +
"(s)");
320 AlertDialog alert = builder.create();
330 AlertDialog.Builder alert =
new AlertDialog.Builder(
this);
331 alert.setTitle(
"Enter Number");
334 final EditText input =
new EditText(
this);
335 input.setInputType(InputType.TYPE_CLASS_NUMBER);
336 alert.setView(input);
337 alert.setPositiveButton(
"Ok",
338 new DialogInterface.OnClickListener() {
339 public void onClick(DialogInterface dialog,
int whichButton) {
341 if (input.getText().toString().length() == 0) {
342 mRepeatNo = Integer.toString(1);
343 mRepeatNoText.setText(mRepeatNo);
344 mRepeatText.setText(
"Every " + mRepeatNo +
" " + mRepeatType +
"(s)");
346 mRepeatNo = input.getText().toString().trim();
347 mRepeatNoText.setText(mRepeatNo);
348 mRepeatText.setText(
"Every " + mRepeatNo +
" " + mRepeatType +
"(s)");
352 alert.setNegativeButton(
"Cancel",
new DialogInterface.OnClickListener() {
353 public void onClick(DialogInterface dialog,
int whichButton) {
360 public boolean isExternalStorageWritable() {
361 String state = Environment.getExternalStorageState();
362 return Environment.MEDIA_MOUNTED.equals(state);
373 talkingReminderDO.setTitle(mTitle);
374 talkingReminderDO.setDate(mDate);
375 talkingReminderDO.setTime(mTime);
376 talkingReminderDO.setRepeat(mRepeat);
377 talkingReminderDO.setRepeatNo(mRepeatNo);
378 talkingReminderDO.setRepeatType(mRepeatType);
380 Gson gson =
new GsonBuilder().setPrettyPrinting().create();
384 FileOutputStream outputStream;
385 if (ContextCompat.checkSelfPermission(
ReminderAddActivity.this, Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {
387 if (ActivityCompat.shouldShowRequestPermissionRationale(
ReminderAddActivity.this, Manifest.permission.WRITE_EXTERNAL_STORAGE)) {
391 ActivityCompat.requestPermissions(
ReminderAddActivity.this,
new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, MY_PERMISSIONS_REQUEST_WRITE_CONTACTS);
396 String fileContents = gson.toJson(talkingReminderDO);
397 outputStream = openFileOutput(filename, Context.MODE_PRIVATE);
398 outputStream.write(fileContents.getBytes());
399 outputStream.close();
404 }
catch (Exception e) {
418 int ID = rb.
addReminder(
new ReminderDO(mTitle, mDate, mTime, mRepeat, mRepeatNo, mRepeatType, mActive));
421 ReminderDO reminderDO =
new ReminderDO(mTitle, mDate, mTime, mRepeat, mRepeatNo, mRepeatType, mActive);
422 FirebaseUser user = firebaseAuth.getCurrentUser();
423 reminderDO.setOwnerID(user.getEmail());
424 reminderDO.setReceiverID(
"null");
425 dbReference.child(user.getUid()).push().setValue(reminderDO);
429 mCalendar.set(Calendar.MONTH, --mMonth);
430 mCalendar.set(Calendar.YEAR, mYear);
431 mCalendar.set(Calendar.DAY_OF_MONTH, mDay);
432 mCalendar.set(Calendar.HOUR_OF_DAY, mHour);
433 mCalendar.set(Calendar.MINUTE, mMinute);
434 mCalendar.set(Calendar.SECOND, 0);
437 if (mRepeatType.equals(
"Minute")) {
438 mRepeatTime = Integer.parseInt(mRepeatNo) * milMinute;
439 }
else if (mRepeatType.equals(
"Hour")) {
440 mRepeatTime = Integer.parseInt(mRepeatNo) * milHour;
441 }
else if (mRepeatType.equals(
"Day")) {
442 mRepeatTime = Integer.parseInt(mRepeatNo) * milDay;
443 }
else if (mRepeatType.equals(
"Week")) {
444 mRepeatTime = Integer.parseInt(mRepeatNo) * milWeek;
445 }
else if (mRepeatType.equals(
"Month")) {
446 mRepeatTime = Integer.parseInt(mRepeatNo) * milMonth;
450 if (mActive.equals(
"true")) {
451 if (mRepeat.equals(
"true")) {
453 }
else if (mRepeat.equals(
"false")) {
459 Toast.makeText(getApplicationContext(),
"Saved",
460 Toast.LENGTH_SHORT).show();
471 super.onBackPressed();
482 getMenuInflater().inflate(R.menu.menu_add_reminder, menu);
494 switch (item.getItemId()) {
498 case android.R.id.home:
504 case R.id.save_reminder:
505 mTitleText.setText(mTitle);
507 if (mTitleText.getText().toString().trim().length() == 0)
508 mTitleText.setError(
"ReminderDO Title cannot be blank!");
517 case R.id.discard_reminder:
518 Toast.makeText(getApplicationContext(),
"Discarded",
519 Toast.LENGTH_SHORT).show();
526 case R.id.send_reminder:
528 Context context =
this;
530 String filename =
Utility.FILE_NAME_PREFIX +
"." +
Utility.FILE_EXTENSION;
549 File filePath = context.getFilesDir();
550 File fileToSend =
new File(filePath, filename);
551 Uri fileUri = FileProvider.getUriForFile(context,
552 "com.sudogeeks.talking_reminder.fileprovider", fileToSend);
553 Intent share =
new Intent();
554 share.setAction(Intent.ACTION_SEND);
555 share.putExtra(Intent.EXTRA_STREAM, fileUri);
556 share.setType(
"text/" +
Utility.FILE_EXTENSION);
558 share.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
562 Intent shareIntent = Intent.createChooser(share,
null);
563 startActivity(shareIntent);
569 return super.onOptionsItemSelected(item);