From a32260ddf45dcbb5cd0928b86677eb6334c163a3 Mon Sep 17 00:00:00 2001 From: Satyajit Ghosh Date: Sat, 22 Jan 2022 20:51:13 +0530 Subject: [PATCH 1/3] alarms are now refreshed properly so that it doesnot get cancelled during reboot or uninstall --- .idea/deploymentTargetDropDown.xml | 17 ++++ app/src/main/AndroidManifest.xml | 1 + .../mediclock/AlarmRefreshService.java | 81 +++++++++++++++++++ .../satyajitghosh/mediclock/HomeActivity.java | 2 +- .../satyajitghosh/mediclock/MainActivity.java | 1 + .../mediclock/MyBroadcastReceiver.java | 2 +- .../mediclock/UpdateActivity.java | 2 +- 7 files changed, 103 insertions(+), 3 deletions(-) create mode 100644 .idea/deploymentTargetDropDown.xml create mode 100644 app/src/main/java/com/satyajitghosh/mediclock/AlarmRefreshService.java diff --git a/.idea/deploymentTargetDropDown.xml b/.idea/deploymentTargetDropDown.xml new file mode 100644 index 0000000..93c7cee --- /dev/null +++ b/.idea/deploymentTargetDropDown.xml @@ -0,0 +1,17 @@ + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 7f8b19b..e43cb3b 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -37,6 +37,7 @@ + diff --git a/app/src/main/java/com/satyajitghosh/mediclock/AlarmRefreshService.java b/app/src/main/java/com/satyajitghosh/mediclock/AlarmRefreshService.java new file mode 100644 index 0000000..821b3d5 --- /dev/null +++ b/app/src/main/java/com/satyajitghosh/mediclock/AlarmRefreshService.java @@ -0,0 +1,81 @@ +package com.satyajitghosh.mediclock; + +import android.app.Service; +import android.content.Intent; +import android.os.IBinder; +import android.util.Log; +import android.widget.Toast; + +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; + +import com.google.android.gms.auth.api.signin.GoogleSignIn; +import com.google.android.gms.auth.api.signin.GoogleSignInAccount; +import com.google.firebase.database.ChildEventListener; +import com.google.firebase.database.DataSnapshot; +import com.google.firebase.database.DatabaseError; +import com.google.firebase.database.DatabaseReference; +import com.google.firebase.database.FirebaseDatabase; + +import java.util.Iterator; +import java.util.Objects; + +public class AlarmRefreshService extends Service { + private DatabaseReference mDatabase; + protected GoogleSignInAccount account; + + @Override + public int onStartCommand(Intent intent, int flags, int startId) { + Log.d("RefreshService","It is refreshed"); + GoogleSignInAccount account = GoogleSignIn.getLastSignedInAccount(this); + FirebaseDatabase database = FirebaseDatabase.getInstance(); + mDatabase = FirebaseDatabase.getInstance().getReference().child("MedicineRecord").child(Objects.requireNonNull(account.getId())); + mDatabase.addChildEventListener(new ChildEventListener() { + @Override + public void onChildAdded(@NonNull DataSnapshot snapshot, @Nullable String previousChildName) { + refreshData(snapshot); + } + + @Override + public void onChildChanged(@NonNull DataSnapshot snapshot, @Nullable String previousChildName) { + refreshData(snapshot); + } + + @Override + public void onChildRemoved(@NonNull DataSnapshot snapshot) { + + } + + @Override + public void onChildMoved(@NonNull DataSnapshot snapshot, @Nullable String previousChildName) { + + } + + @Override + public void onCancelled(@NonNull DatabaseError error) { + + } + }); + + return super.onStartCommand(intent, flags, startId); + } + + @Override + public void onDestroy() { + super.onDestroy(); + } + + @Nullable + @Override + public IBinder onBind(Intent intent) { + return null; + } + public void refreshData(DataSnapshot snapshot) { + + MedicineRecordHandler mrd = snapshot.getValue(MedicineRecordHandler.class); + AlarmManagerHandler.initAlarm(mrd,getApplicationContext()); + Log.d("RefreshService",mrd.getName()+" refreshed"); + } + + + } diff --git a/app/src/main/java/com/satyajitghosh/mediclock/HomeActivity.java b/app/src/main/java/com/satyajitghosh/mediclock/HomeActivity.java index c7f7a12..e560c90 100644 --- a/app/src/main/java/com/satyajitghosh/mediclock/HomeActivity.java +++ b/app/src/main/java/com/satyajitghosh/mediclock/HomeActivity.java @@ -96,7 +96,7 @@ public void onClick(View view) { time ); myRef.child("MedicineRecord").child(PersonID).child(mrh.getName() + AlarmManagerHandler.setUniqueNotificationId()).setValue(mrh); // It writes the new data to FireBase Database - AlarmManagerHandler.initAlarm(mrh, getApplicationContext()); //It set up the alarm for that record + // AlarmManagerHandler.initAlarm(mrh, getApplicationContext()); //It set up the alarm for that record Toast.makeText(getApplicationContext(), "Added Successfully", Toast.LENGTH_SHORT).show(); } else { InputValidationHandler.showDialog(HomeActivity.this); // It shows a dialog box informing user to fill the required fields. diff --git a/app/src/main/java/com/satyajitghosh/mediclock/MainActivity.java b/app/src/main/java/com/satyajitghosh/mediclock/MainActivity.java index 35459b3..f06cefa 100644 --- a/app/src/main/java/com/satyajitghosh/mediclock/MainActivity.java +++ b/app/src/main/java/com/satyajitghosh/mediclock/MainActivity.java @@ -36,6 +36,7 @@ protected void onCreate(Bundle savedInstanceState) { // the GoogleSignInAccount will be non-null. GoogleSignInAccount account = GoogleSignIn.getLastSignedInAccount(this); if (account != null) { + startService(new Intent(this,AlarmRefreshService.class)); String personName = account.getDisplayName(); startActivity(new Intent(MainActivity.this, DisplayMedicineActivity.class).putExtra("UserName", personName).putExtra("Id", account.getId()) .addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_CLEAR_TASK | Intent.FLAG_ACTIVITY_NEW_TASK) diff --git a/app/src/main/java/com/satyajitghosh/mediclock/MyBroadcastReceiver.java b/app/src/main/java/com/satyajitghosh/mediclock/MyBroadcastReceiver.java index c3fc84c..82d3b3f 100644 --- a/app/src/main/java/com/satyajitghosh/mediclock/MyBroadcastReceiver.java +++ b/app/src/main/java/com/satyajitghosh/mediclock/MyBroadcastReceiver.java @@ -19,7 +19,7 @@ public void onReceive(Context context, Intent intent) { String MedicineName=intent.getStringExtra("MedicineName"); String Food=intent.getStringExtra("Food"); - context.startForegroundService(new Intent(context,MyAlarmService.class) + context.startService(new Intent(context,MyAlarmService.class) .putExtra("MedicineName",MedicineName) .putExtra("Food",Food) ); diff --git a/app/src/main/java/com/satyajitghosh/mediclock/UpdateActivity.java b/app/src/main/java/com/satyajitghosh/mediclock/UpdateActivity.java index aafe657..a58cfda 100644 --- a/app/src/main/java/com/satyajitghosh/mediclock/UpdateActivity.java +++ b/app/src/main/java/com/satyajitghosh/mediclock/UpdateActivity.java @@ -66,7 +66,7 @@ public void onClick(View view) { myRef.child(key).setValue(getData()); //Updates the data to the FireBase DataBase - AlarmManagerHandler.initAlarm(getData(), getApplicationContext()); + // AlarmManagerHandler.initAlarm(getData(), getApplicationContext()); startActivity( new Intent(UpdateActivity.this, DisplayMedicineActivity.class) From bdcecd78d9305cc012eff2c67176ce92b29b3703 Mon Sep 17 00:00:00 2001 From: Satyajit Ghosh Date: Sat, 22 Jan 2022 21:02:24 +0530 Subject: [PATCH 2/3] notification now not invoked immediately if the time passed for that day --- .../com/satyajitghosh/mediclock/AlarmManagerHandler.java | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/com/satyajitghosh/mediclock/AlarmManagerHandler.java b/app/src/main/java/com/satyajitghosh/mediclock/AlarmManagerHandler.java index aa09ec4..c84d7a5 100644 --- a/app/src/main/java/com/satyajitghosh/mediclock/AlarmManagerHandler.java +++ b/app/src/main/java/com/satyajitghosh/mediclock/AlarmManagerHandler.java @@ -46,9 +46,14 @@ public static void addAlert(Context context, int hour, int minute, String medici Calendar cal = Calendar.getInstance(); cal.set(Calendar.HOUR_OF_DAY, hour); cal.set(Calendar.MINUTE, minute); - cal.set(Calendar.SECOND, 00); - long time = cal.getTimeInMillis(); + cal.set(Calendar.SECOND, 0); + + // if alarm time has already passed, increment day by 1 + if (cal.getTimeInMillis() <= System.currentTimeMillis()) { + cal.set(Calendar.DAY_OF_MONTH, cal.get(Calendar.DAY_OF_MONTH) + 1); + } + long time = cal.getTimeInMillis(); Intent intent = new Intent(context, MyBroadcastReceiver.class) .putExtra("MedicineName", medicineName) From f3325b347b9658e827d4a48439cc3c4a62e25246 Mon Sep 17 00:00:00 2001 From: Satyajit Ghosh Date: Sat, 22 Jan 2022 22:53:17 +0530 Subject: [PATCH 3/3] update times ui is ready --- .idea/misc.xml | 4 +- app/src/main/AndroidManifest.xml | 26 ++-- .../mediclock/DisplayMedicineActivity.java | 6 + .../mediclock/TimeChangeActivity.java | 117 ++++++++++++++++++ .../res/drawable/ic_baseline_settings_24.xml | 5 + .../res/layout/activity_display_medicine.xml | 15 ++- .../main/res/layout/activity_time_change.xml | 97 +++++++++++++++ app/src/main/res/values/themes.xml | 9 ++ 8 files changed, 264 insertions(+), 15 deletions(-) create mode 100644 app/src/main/java/com/satyajitghosh/mediclock/TimeChangeActivity.java create mode 100644 app/src/main/res/drawable/ic_baseline_settings_24.xml create mode 100644 app/src/main/res/layout/activity_time_change.xml diff --git a/.idea/misc.xml b/.idea/misc.xml index b6cf899..3e855f7 100644 --- a/.idea/misc.xml +++ b/.idea/misc.xml @@ -6,14 +6,16 @@ + - + + diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index e43cb3b..0946cf4 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -1,12 +1,13 @@ + - - - - - + + + + + + @@ -31,14 +35,10 @@ - - - - - - - + + + + - \ No newline at end of file diff --git a/app/src/main/java/com/satyajitghosh/mediclock/DisplayMedicineActivity.java b/app/src/main/java/com/satyajitghosh/mediclock/DisplayMedicineActivity.java index 2806d39..6582aee 100644 --- a/app/src/main/java/com/satyajitghosh/mediclock/DisplayMedicineActivity.java +++ b/app/src/main/java/com/satyajitghosh/mediclock/DisplayMedicineActivity.java @@ -79,6 +79,12 @@ public void onClick(View view) { ); } }); + findViewById(R.id.setting_btn).setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + startActivity(new Intent(getApplicationContext(),TimeChangeActivity.class)); + } + }); } /** diff --git a/app/src/main/java/com/satyajitghosh/mediclock/TimeChangeActivity.java b/app/src/main/java/com/satyajitghosh/mediclock/TimeChangeActivity.java new file mode 100644 index 0000000..b9679e4 --- /dev/null +++ b/app/src/main/java/com/satyajitghosh/mediclock/TimeChangeActivity.java @@ -0,0 +1,117 @@ +package com.satyajitghosh.mediclock; + +import androidx.appcompat.app.AppCompatActivity; +import androidx.fragment.app.Fragment; + +import android.app.FragmentManager; +import android.app.FragmentTransaction; +import android.os.Bundle; +import android.view.View; +import android.widget.Button; +import android.widget.FrameLayout; +import android.widget.TextView; + +import com.google.android.material.timepicker.MaterialTimePicker; +import com.google.android.material.timepicker.TimeFormat; + +public class TimeChangeActivity extends AppCompatActivity { + String time = "0000"; + private TextView morning_edit_time; + private TextView lunch_edit_time; + private TextView night_edit_time; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_time_change); + morning_edit_time=findViewById(R.id.morning_edit_time); + lunch_edit_time=findViewById(R.id.afternoon_edit_time); + night_edit_time=findViewById(R.id.night_edit_time); + + morning_edit_time.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + + MaterialTimePicker picker = + new MaterialTimePicker.Builder() + .setTimeFormat(TimeFormat.CLOCK_24H) + .setHour(12) + .setMinute(10) + .build(); + + picker.show(getSupportFragmentManager(), "tag"); + + picker.addOnPositiveButtonClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + morning_edit_time.setText(timeTextView(picker.getHour(),picker.getMinute())); + } + }); + + } + }); + lunch_edit_time.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + + MaterialTimePicker picker = + new MaterialTimePicker.Builder() + .setTimeFormat(TimeFormat.CLOCK_24H) + .setHour(12) + .setMinute(10) + .build(); + + picker.show(getSupportFragmentManager(), "tag"); + + picker.addOnPositiveButtonClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + lunch_edit_time.setText(timeTextView(picker.getHour(),picker.getMinute())); + } + }); + + } + }); + night_edit_time.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + + MaterialTimePicker picker = + new MaterialTimePicker.Builder() + .setTimeFormat(TimeFormat.CLOCK_24H) + .setHour(12) + .setMinute(10) + .build(); + + picker.show(getSupportFragmentManager(), "tag"); + + picker.addOnPositiveButtonClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + night_edit_time.setText(timeTextView(picker.getHour(),picker.getMinute())); + } + }); + + } + }); + } + public String timeTextView(int hour,int minute){ + String result=""; + if(hour<10){ + result="0"+Integer.toString(hour); + } + else{ + result=Integer.toString(hour); + } + result+=":"; + if(minute<10){ + result+="0"+Integer.toString(minute); + } + else{ + result+=Integer.toString(minute); + } + + return result; + } + + } diff --git a/app/src/main/res/drawable/ic_baseline_settings_24.xml b/app/src/main/res/drawable/ic_baseline_settings_24.xml new file mode 100644 index 0000000..b240b83 --- /dev/null +++ b/app/src/main/res/drawable/ic_baseline_settings_24.xml @@ -0,0 +1,5 @@ + + + diff --git a/app/src/main/res/layout/activity_display_medicine.xml b/app/src/main/res/layout/activity_display_medicine.xml index 8982168..10f2dc5 100644 --- a/app/src/main/res/layout/activity_display_medicine.xml +++ b/app/src/main/res/layout/activity_display_medicine.xml @@ -31,12 +31,25 @@ android:layout_alignParentEnd="true" android:layout_alignParentRight="false" android:layout_alignParentBottom="false" - android:layout_marginHorizontal="40dp" + android:layout_marginHorizontal="60dp" android:layout_marginTop="60dp" android:clickable="true" app:srcCompat="@drawable/ic_baseline_add_box_24" tools:ignore="SpeakableTextPresentCheck" /> + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/values/themes.xml b/app/src/main/res/values/themes.xml index 84720c9..d106de8 100644 --- a/app/src/main/res/values/themes.xml +++ b/app/src/main/res/values/themes.xml @@ -14,6 +14,15 @@ false + + \ No newline at end of file