Files
SimpliTend/app/src/main/java/com/app/simplitend/apputils/BottomNotificationActivity.java
14Sandee 5611a29b71 .
2023-12-28 20:23:12 +05:30

568 lines
24 KiB
Java

package com.app.simplitend.apputils;
import static com.app.simplitend.apputils.AppUtil.ACTIVITY_NOTIFICATIONS;
import static com.app.simplitend.apputils.AppUtil.DIRECTIONS_NOTIFICATIONS;
import static com.app.simplitend.apputils.AppUtil.GEOFENCE_NOTIFICATIONS;
import static com.app.simplitend.apputils.AppUtil.MEDICATIONS_NOTIFICATIONS;
import static com.app.simplitend.apputils.AppUtil.MEDICATION_REFILL_NOTIFICATIONS;
import static com.app.simplitend.apputils.AppUtil.SOS_NOTIFICATIONS;
import static com.app.simplitend.apputils.AppUtil.getCgNotificationPref;
import static com.app.simplitend.apputils.Constants.ACTIVITY_EXTRA_KEY;
import static com.app.simplitend.apputils.Constants.MEDICATION_REFILL;
import static com.app.simplitend.apputils.Constants.REMINDER_EXTRA_KEY;
import static com.app.simplitend.apputils.NotificationService.CONTENT_TYPE_KEY;
import static com.app.simplitend.apputils.NotificationService.NOTIFICATION_CONTENT_ID_KEY;
import static com.app.simplitend.apputils.NotificationService.NOTIFICATION_SENIOR_ADDRESS_KEY;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.Toast;
import androidx.annotation.Nullable;
import androidx.appcompat.app.AppCompatActivity;
import com.app.simplitend.R;
import com.app.simplitend.caregiverdashboard.mvvm.CaregiverMainViewModel;
import com.app.simplitend.chats.ChatsActivity;
import com.app.simplitend.databinding.BottomSheetAlertBinding;
import com.app.simplitend.patient_dashboard.PatientMainViewModel;
import com.app.simplitend.patientprofile.medreminder.mvvm.models.ReminderResult;
import com.app.simplitend.patientprofile.setuproutine.mvvm.RoutineDetails;
import com.bumptech.glide.Glide;
import com.google.android.material.bottomsheet.BottomSheetDialog;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Locale;
import java.util.Objects;
public class BottomNotificationActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_bottom_notification);
// to solve Android Oreo problem where we cannot set activity's orientation to portrait in the manifest
// if (android.os.Build.VERSION.SDK_INT != Build.VERSION_CODES.O) {
// setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
// }
if (AppUtil.getCgToken(this) != null){
// handle caregiver bottom sheets
handleCaregiverBottomSheets();
}else{
handleSeniorBottomSheets();
}
View view = findViewById(R.id.bsa_tint);
if (view != null){
view.setOnClickListener(v -> {
finish();
});
}
}
private void handleSeniorBottomSheets() {
Intent intent = getIntent();
String content_type = intent.getStringExtra(CONTENT_TYPE_KEY);
int id = intent.getIntExtra(NOTIFICATION_CONTENT_ID_KEY, -1);
if (id != -1){
if (Constants.ACTIVITY_TIME.equals(content_type) && PatientMainViewModel.activityList != null) {
for (RoutineDetails routine : PatientMainViewModel.activityList) {
if (id == routine.id) {
intent.putExtra(Constants.ACTIVITY_EXTRA_KEY, routine);
break;
}
}
} else if (Constants.MEDICINE_TIME.equals(content_type) && PatientMainViewModel.remindersList != null) {
for (ReminderResult reminder : PatientMainViewModel.remindersList) {
if (id == reminder.id) {
intent.putExtra(Constants.REMINDER_EXTRA_KEY, reminder);
break;
}
}
}
}
try {
showSeniorBottomAlert(this, content_type, intent);
} catch (Exception e) {
// do nothing
}
}
private void handleCaregiverBottomSheets() {
Intent intent = getIntent();
String content_type = intent.getStringExtra(CONTENT_TYPE_KEY);
int id = intent.getIntExtra(NOTIFICATION_CONTENT_ID_KEY, -1);
if (id != -1) {
if (Constants.ACTIVITY_TIME.equals(content_type) && CaregiverMainViewModel.activityList != null) {
for (RoutineDetails routine : CaregiverMainViewModel.activityList) {
if (id == routine.id) {
intent.putExtra(Constants.ACTIVITY_EXTRA_KEY, routine);
break;
}
}
} else if (Constants.MEDICINE_TIME.equals(content_type) && CaregiverMainViewModel.remindersList != null) {
for (ReminderResult reminder : CaregiverMainViewModel.remindersList) {
if (id == reminder.id) {
intent.putExtra(Constants.REMINDER_EXTRA_KEY, reminder);
break;
}
}
} else if (Constants.MEDICATION_REFILL.equals(content_type) && CaregiverMainViewModel.remindersList != null) {
for (ReminderResult reminder : CaregiverMainViewModel.remindersList) {
if (id == reminder.id) {
intent.putExtra(Constants.REMINDER_EXTRA_KEY, reminder);
}
}
}
}
// caregiver logged in
CaregiverDataCache.getCaregiverData(this, careGiverData -> {
String patient_name = null;
if (careGiverData != null && careGiverData.patientDetails != null) {
patient_name = careGiverData.patientDetails.first_name;
} else {
patient_name = "Your loved one";
}
try {
showCgBottomAlert(this,
patient_name,
content_type,
intent);
} catch (Exception e) {
// do nothing
}
}, false);
}
public void showCgBottomAlert(Context context,
String patient_name,
@Nullable String content_type, Intent intent) throws Exception {
if (content_type == null) return;
BottomSheetDialog bsd = new BottomSheetDialog(context, R.style.BottomSheetDialog);
BottomSheetAlertBinding binding = BottomSheetAlertBinding.inflate(LayoutInflater.from(context));
bsd.setContentView(binding.getRoot());
bsd.setOnDismissListener(dialogInterface -> {
BottomNotificationActivity.this.finish();
});
binding.close.setOnClickListener(v -> bsd.dismiss());
String title = intent.getStringExtra(NotificationService.NOTIFICATION_TITLE_KEY);
String body = intent.getStringExtra(NotificationService.NOTIFICATION_BODY_KEY);
switch (content_type) {
case Constants.BATTERY_LOW:
setUpCgBottomSheet(binding,
R.drawable.img_out_of_geo,
title, "Battery remaining",
"25%", "Text senior", view -> {
bsd.dismiss();
finish();
Intent chatsIntent = new Intent(this, ChatsActivity.class);
startActivity(chatsIntent);
});
bsd.show();
break;
case Constants.PATIENT_OUT_OF_GEOFENCE:
if (!getCgNotificationPref(context, GEOFENCE_NOTIFICATIONS)){
// notifications are off by user
return;
}
title = patient_name + " is outside of geofence zone!";
String senior_distance = intent.getStringExtra(NOTIFICATION_SENIOR_ADDRESS_KEY);
try {
double distance = Double.parseDouble(senior_distance);
if (distance == 0) throw new Exception();
senior_distance = distance + " miles away from home";
}catch (Exception e){
senior_distance = "Unable to locate";
}
setUpCgBottomSheet(binding,
R.drawable.img_out_of_geo,
title, "Current location",
senior_distance, "Call senior",
v -> {
CaregiverDataCache.getCaregiverData(context, (careGiverData -> {
bsd.dismiss();
if (careGiverData == null || careGiverData.patientDetails == null) {
Toast.makeText(context, "Couldn't load data", Toast.LENGTH_SHORT).show();
return;
}
AppUtil.dialPhone(context, careGiverData.patientDetails.phone_number);
}), true);
});
bsd.show();
break;
case Constants.ACTIVITY_TIME:
if (!getCgNotificationPref(context, ACTIVITY_NOTIFICATIONS)){
// notifications are off by user
return;
}
String routine_description = null;
try {
RoutineDetails routine = (RoutineDetails) intent.getSerializableExtra(ACTIVITY_EXTRA_KEY);
if (routine != null) {
title = "Remind " + patient_name;
String start_time, end_time;
try {
SimpleDateFormat input_sdf = new SimpleDateFormat("HH:mm:ss", Locale.getDefault());
SimpleDateFormat output_sdf = new SimpleDateFormat("hh:mm a", Locale.getDefault());
Date start_date = input_sdf.parse(routine.routine_start_time);
Date end_date = input_sdf.parse(routine.routine_end_time);
start_time = output_sdf.format(Objects.requireNonNull(start_date));
end_time = output_sdf.format(Objects.requireNonNull(end_date));
} catch (Exception e) {
start_time = routine.routine_start_time;
end_time = routine.routine_end_time;
}
body = routine.routine_title;
routine_description = start_time + " - " + end_time;
}
} catch (Exception e) {
// do nothing
}
setUpCgBottomSheet(binding,
R.drawable.img_activity_time,
title, body,
routine_description, "Text senior", view -> {
bsd.dismiss();
finish();
Intent chatsIntent = new Intent(this, ChatsActivity.class);
startActivity(chatsIntent);
});
bsd.show();
break;
case Constants.MEDICINE_TIME:
if (!getCgNotificationPref(context, MEDICATIONS_NOTIFICATIONS)){
// notifications are off by user
return;
}
String description = null;
try {
ReminderResult reminder = (ReminderResult) intent.getSerializableExtra(REMINDER_EXTRA_KEY);
if (reminder != null) {
title = "It's time for " + patient_name + "'s medicines";
body = "Medication Reminder:\n" + reminder.medicine_name + "\n" + reminder.medication_quantity;
try {
body += " " + reminder.medication_type.get(0).title;
}catch (Exception e){
// do nothing
body += " unit";
}
if (reminder.medication_instruction == null) reminder.medication_instruction = "None";
description = "Instructions: " + reminder.medication_instruction;
}
} catch (Exception e) {
// do nothing
}
setUpCgBottomSheet(binding,
R.drawable.img_medication_time,
title, body,
description, "Text senior", view -> {
bsd.dismiss();
finish();
Intent chatsIntent = new Intent(this, ChatsActivity.class);
startActivity(chatsIntent);
});
bsd.show();
break;
case Constants.PATIENT_REQUESTED_DIRECTION:
if (!getCgNotificationPref(context, DIRECTIONS_NOTIFICATIONS)){
// notifications are off by user
return;
}
title = patient_name + " requested for directions to home";
body = "Current location:";
String doh_distance = intent.getStringExtra(NOTIFICATION_SENIOR_ADDRESS_KEY);
try {
double distance = Double.parseDouble(doh_distance);
if (distance == 0) throw new Exception();
doh_distance = distance + " miles away from home";
}catch (Exception e){
doh_distance = "Unable to locate";
}
setUpCgBottomSheet(binding,
R.drawable.img_directioin_requested,
title, body,
doh_distance, "Call senior",
v -> {
CaregiverDataCache.getCaregiverData(context, (careGiverData -> {
bsd.dismiss();
if (careGiverData == null || careGiverData.patientDetails == null) {
Toast.makeText(context, "Couldn't load data", Toast.LENGTH_SHORT).show();
return;
}
AppUtil.dialPhone(context, careGiverData.patientDetails.phone_number);
}), true);
});
bsd.show();
break;
case Constants.PATIENT_REQUESTED_SOS:
if (!getCgNotificationPref(context, SOS_NOTIFICATIONS)){
// notifications are off by user
return;
}
title = patient_name + " called the emergency number";
body = "Please contact " + patient_name;
setUpCgBottomSheet(binding,
R.drawable.img_sos_requested,
title, body,
null, "Call senior",
v -> {
CaregiverDataCache.getCaregiverData(context, (careGiverData -> {
bsd.dismiss();
if (careGiverData == null || careGiverData.patientDetails == null) {
Toast.makeText(context, "Couldn't load data", Toast.LENGTH_SHORT).show();
return;
}
AppUtil.dialPhone(context, careGiverData.patientDetails.phone_number);
}), true);
});
bsd.show();
break;
case MEDICATION_REFILL:
if (!getCgNotificationPref(context, MEDICATION_REFILL_NOTIFICATIONS)){
// notifications are off by user
return;
}
String refill_description = null;
title = "Refill medication";
try {
ReminderResult reminder = (ReminderResult) intent.getSerializableExtra(REMINDER_EXTRA_KEY);
if (reminder != null) {
body = reminder.medicine_name;
if (reminder.medication_instruction == null) reminder.medication_instruction = "None";
refill_description = "Quantity to be refilled: " + reminder.medication_quantity;
}
} catch (Exception e) {
// do nothing
}
setUpCgBottomSheet(binding,
R.drawable.img_med_refill,
title, body,
refill_description, "Text senior", view -> {
// bsd.dismiss();
// text_senior_click.onClick(null);
CaregiverDataCache.getCaregiverData(context,
(careGiverData -> {
if (careGiverData != null && careGiverData.patientDetails != null){
AppUtil.messageNumber(context, careGiverData.patientDetails.phone_number);
}
}), true);
});
bsd.show();
break;
}
// already returning
}
private void setUpCgBottomSheet(BottomSheetAlertBinding binding,
int img_res,
String title, String description_title,
String description, String btn_text,
View.OnClickListener btn_clickListener) {
// binding.image.setImageResource(img_res);
Glide.with(binding.image)
.load(img_res)
.into(binding.image);
binding.title.setText(title);
binding.descriptionTitle.setText(description_title);
binding.description.setText(description);
binding.btn.setText(btn_text);
binding.btn.setOnClickListener(btn_clickListener);
}
public void showSeniorBottomAlert(Context context, @Nullable String content_type, Intent intent) throws Exception {
if (content_type == null) return;
BottomSheetDialog bsd = new BottomSheetDialog(context, R.style.BottomSheetDialog);
BottomSheetAlertBinding binding = BottomSheetAlertBinding.inflate(LayoutInflater.from(context));
bsd.setContentView(binding.getRoot());
bsd.setOnDismissListener(dialogInterface -> {
BottomNotificationActivity.this.finish();
});
binding.close.setOnClickListener(v -> bsd.dismiss());
String title = intent.getStringExtra(NotificationService.NOTIFICATION_TITLE_KEY);
String body = intent.getStringExtra(NotificationService.NOTIFICATION_BODY_KEY);
switch (content_type) {
case Constants.ACTIVITY_TIME:
if (!getCgNotificationPref(context, ACTIVITY_NOTIFICATIONS)) {
// notifications are off by user
return;
}
String routine_description = null;
try {
RoutineDetails routine = (RoutineDetails) intent.getSerializableExtra(ACTIVITY_EXTRA_KEY);
if (routine != null) {
title = "Reminder";
String start_time, end_time;
try {
SimpleDateFormat input_sdf = new SimpleDateFormat("HH:mm:ss", Locale.getDefault());
SimpleDateFormat output_sdf = new SimpleDateFormat("hh:mm a", Locale.getDefault());
Date start_date = input_sdf.parse(routine.routine_start_time);
Date end_date = input_sdf.parse(routine.routine_end_time);
start_time = output_sdf.format(Objects.requireNonNull(start_date));
end_time = output_sdf.format(Objects.requireNonNull(end_date));
} catch (Exception e) {
start_time = routine.routine_start_time;
end_time = routine.routine_end_time;
}
body = routine.routine_title;
routine_description = start_time + " - " + end_time;
}
} catch (Exception e) {
// do nothing
}
setUpSeniorBottomSheet(binding,
R.drawable.img_activity_time,
title, body,
routine_description, "Close", view -> {
bsd.dismiss();
finish();
});
bsd.show();
break;
case Constants.MEDICINE_TIME:
if (!getCgNotificationPref(context, MEDICATIONS_NOTIFICATIONS)) {
// notifications are off by user
return;
}
String description = null;
try {
ReminderResult reminder = (ReminderResult) intent.getSerializableExtra(REMINDER_EXTRA_KEY);
if (reminder != null) {
String med_time = AppUtil.formatDate("HH:mm:ss", "hh:mm a", reminder.medicine_time);
if (med_time == null){
med_time = reminder.medicine_time;
}
title = med_time + " Medication reminder:";
body = reminder.medicine_name + "\n" + reminder.medication_quantity;
try {
body += " " + reminder.medication_type.get(0).title;
} catch (Exception e) {
// do nothing
body += " unit";
}
if (reminder.medication_instruction == null)
reminder.medication_instruction = "None";
description = "Instructions: " + reminder.medication_instruction;
}
} catch (Exception e) {
// do nothing
}
setUpSeniorBottomSheet(binding,
R.drawable.img_medication_time,
title, body,
description, "Close", view -> {
bsd.dismiss();
finish();
});
bsd.show();
break;
}
}
private void setUpSeniorBottomSheet(BottomSheetAlertBinding binding,
int img_res,
String title, String description_title,
String description, String btn_text,
View.OnClickListener btn_clickListener) {
// binding.image.setImageResource(img_res);
Glide.with(binding.image)
.load(img_res)
.into(binding.image);
binding.title.setText(title);
binding.descriptionTitle.setText(description_title);
binding.description.setText(description);
binding.close.setVisibility(View.GONE);
binding.btn.setText(btn_text);
binding.btn.setOnClickListener(btn_clickListener);
}
}