This commit is contained in:
ADITYA
2023-07-24 09:57:58 +05:30
parent 97d0569969
commit 55ef83e93a
28 changed files with 1381 additions and 414 deletions

View File

@@ -1,13 +1,16 @@
package com.ssb.simplitend.patientprofile;
import com.ssb.simplitend.patientprofile.medicalinfo.mvvm.MedicationInfo;
import com.ssb.simplitend.patientprofile.medreminder.mvvm.models.FreqNMedTypeResult;
import com.ssb.simplitend.patientprofile.medreminder.mvvm.models.Reminder;
import com.ssb.simplitend.patientprofile.medreminder.mvvm.models.ReminderResult;
import com.ssb.simplitend.patientprofile.setuproutine.mvvm.RoutineDetails;
import com.ssb.simplitend.welcome.mvvm.models.CallResponse;
import java.util.List;
import java.util.Map;
import okhttp3.RequestBody;
import retrofit2.Call;
import retrofit2.http.Body;
import retrofit2.http.GET;
@@ -38,4 +41,35 @@ public interface PatientProfileAPIService {
@Header("patientReminderId") int patient_reminder_id,
@Header("Authorization") String token);
// medical information apis
@Multipart
@POST("api/patient-medical-details-store/{id}")
Call<CallResponse<MedicationInfo>> addNUpdateMedicalInfo(@PartMap Map<String, RequestBody> body,
@Path("id") int patient_id,
@Header("Authorization") String token);
@GET("api/get-medical-details/{id}")
Call<CallResponse<MedicationInfo>> getMedicalInfo(@Path("id") int patient_id,
@Header("Authorization") String token);
// routines apis
@GET("api/get-routine-details/{id}")
Call<CallResponse<List<RoutineDetails>>> getRoutines(@Path("id") int patient_id,
@Query("weekday") int week_day,
@Header("Authorization") String token);
@POST("api/patient-routine-store/{id}")
Call<CallResponse<RoutineDetails>> addNUpdateRoutine(@Path("id") int patient_id,
@Body RoutineDetails routineDetails,
@Header("Authorization") String token);
@POST("api/patient-routine-delete")
Call<CallResponse<Object>> deleteRoutine(@Header("patientId") int patient_id,
@Header("patientRoutineId") int patient_routine_id,
@Header("Authorization") String token);
}

View File

@@ -1,7 +1,9 @@
package com.ssb.simplitend.patientprofile;
import com.ssb.simplitend.patientprofile.medicalinfo.mvvm.MedicationInfo;
import com.ssb.simplitend.patientprofile.medreminder.mvvm.models.FreqNMedTypeResult;
import com.ssb.simplitend.patientprofile.medreminder.mvvm.models.ReminderResult;
import com.ssb.simplitend.patientprofile.setuproutine.mvvm.RoutineDetails;
import java.util.List;
@@ -27,9 +29,39 @@ public interface ProfileContracts {
}
interface ReminderDeleteCallback{
void onReminderDeleted(int adapterPostion);
void onReminderDeleted(int adapterPosition);
void onReminderDeleteFailed(Throwable t, String message);
}
interface AddMedicalIntoCallback{
void onMedicalInfoAdded(MedicationInfo medicationInfo);
void onMedicalInfoAddFailed(Throwable t, String message);
}
interface GetMedicationInfoCallback{
void onMedicalInfoFetched(MedicationInfo medicationInfo);
void onMedicationInfoFetchedFailed(Throwable t, String message);
}
interface GetRoutinesCallback{
void onRoutinesFetched(List<RoutineDetails> routineList);
void onRoutinesFetchedFailed(Throwable t, String message);
}
interface RoutineDeleteCallback{
void onRoutineDeleted(int adapterPosition);
void onRoutineDeleteFailed(Throwable t, String message);
}
interface AddNUpdateRoutineCallback{
void onRoutineAdded(RoutineDetails medicationInfo);
void onRoutineAddFailed(Throwable t, String message);
}
}

View File

@@ -1,27 +1,43 @@
package com.ssb.simplitend.patientprofile.medicalinfo;
import android.app.ProgressDialog;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Toast;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.fragment.app.Fragment;
import androidx.lifecycle.ViewModelProvider;
import androidx.navigation.Navigation;
import com.ssb.simplitend.R;
import com.ssb.simplitend.apputils.AppUtil;
import com.ssb.simplitend.apputils.ProfileProgress;
import com.ssb.simplitend.patientprofile.medicalinfo.mvvm.MedicalInfo;
import com.ssb.simplitend.databinding.AddMedicalInfoBinding;
import com.ssb.simplitend.patientprofile.ProfileContracts;
import com.ssb.simplitend.patientprofile.medicalinfo.mvvm.MedicalInfoViewModel;
import com.ssb.simplitend.patientprofile.medicalinfo.mvvm.MedicationInfo;
public class AddMedicalInfoFragment extends Fragment {
import java.util.HashMap;
import java.util.Map;
import okhttp3.MediaType;
import okhttp3.RequestBody;
public class AddMedicalInfoFragment extends Fragment implements
ProfileContracts.AddMedicalIntoCallback {
// view binding
protected AddMedicalInfoBinding binding;
private MedicalInfo medicalInfo;
private MedicalInfoViewModel medicalInfoViewModel;
private ProgressDialog progressDialog;
private MedicationInfo medicalInfo;
public static final String MEDICAL_INFO_KEY = "medical_info";
public AddMedicalInfoFragment(){
@@ -33,6 +49,8 @@ public class AddMedicalInfoFragment extends Fragment {
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
binding = AddMedicalInfoBinding.inflate(inflater, container, false);
medicalInfoViewModel = new ViewModelProvider(requireActivity()).get(MedicalInfoViewModel.class);
initViews();
clickEvents();
@@ -41,24 +59,24 @@ public class AddMedicalInfoFragment extends Fragment {
}
private void initViews() {
progressDialog = new ProgressDialog(requireContext());
Bundle bundle = getArguments();
if (bundle != null){
medicalInfo = (MedicalInfo) bundle.getSerializable(MEDICAL_INFO_KEY);
if (medicalInfo != null){
binding.title.setText(getString(R.string.edit_medical_information));
setLayoutInfo();
}
if (bundle != null && bundle.getSerializable(MEDICAL_INFO_KEY) != null){
medicalInfo = (MedicationInfo) bundle.getSerializable(MEDICAL_INFO_KEY);
setLayoutInfo();
}
}
private void setLayoutInfo() {
if (medicalInfo == null) return;
binding.diagnosis.setText(medicalInfo.diagnosis);
binding.primaryDoc.setText(medicalInfo.primary_doc);
binding.docContact.setText(medicalInfo.doc_contact);
binding.hospitalPref.setText(medicalInfo.hospital_pref);
binding.primaryDoc.setText(medicalInfo.primary_care_doctor);
binding.docContact.setText(medicalInfo.doctor_phone_number);
binding.hospitalPref.setText(medicalInfo.hospital_preference);
binding.allergies.setText(medicalInfo.allergies);
binding.dietRestrict.setText(medicalInfo.diet_restriction);
@@ -72,26 +90,145 @@ public class AddMedicalInfoFragment extends Fragment {
binding.addBtn.setOnClickListener(v -> {
ProfileProgress.MEDICAL_INFO_ADDED = true;
if (medicalInfo != null){
// save changes animation
AppUtil.showSOSDecision(requireContext(),
getString(R.string.make_changes), getString(R.string.yes), getString(R.string.no),
v2 -> {
// yes click
AppUtil.showAnimateDBS(requireContext(), getString(R.string.changes_successful),
R.raw.done_anim_primary, 3000,
v4 -> {
Navigation.findNavController(v).popBackStack();
});
}, v3 -> {
// no click
});
}else{
Navigation.findNavController(v).popBackStack();
if (allOkay()){
if (medicalInfo != null){
AppUtil.showSOSDecision(requireContext(),
getString(R.string.make_changes), getString(R.string.yes), getString(R.string.no),
yes -> {
// yes click
addMedicationInfo();
}, no -> {
// no click
});
}else{
addMedicationInfo();
}
}
});
}
private void addMedicationInfo() {
progressDialog.setTitle("Please wait");
progressDialog.setMessage("while we add your medical information.");
progressDialog.setCancelable(false);
progressDialog.show();
Map<String, RequestBody> body = new HashMap<>();
RequestBody diagnosis_body = RequestBody.create(binding.diagnosis.getText().toString().trim(),
MediaType.parse("text/plain"));
body.put("diagnosis", diagnosis_body);
RequestBody primary_doc_body = RequestBody.create(binding.primaryDoc.getText().toString().trim(),
MediaType.parse("text/plain"));
body.put("primary_care_doctor", primary_doc_body);
RequestBody doc_contact_body = RequestBody.create(binding.docContact.getText().toString().trim(),
MediaType.parse("text/plain"));
body.put("doctor_phone_number", doc_contact_body);
RequestBody hospital_pref_body = RequestBody.create(binding.hospitalPref.getText().toString().trim(),
MediaType.parse("text/plain"));
body.put("hospital_preference", hospital_pref_body);
RequestBody allergies_body = RequestBody.create(binding.allergies.getText().toString().trim(),
MediaType.parse("text/plain"));
body.put("allergies", allergies_body);
RequestBody diet_restriction_body = RequestBody.create(binding.dietRestrict.getText().toString().trim(),
MediaType.parse("text/plain"));
body.put("diet_restriction", diet_restriction_body);
RequestBody is_update_body;
if (medicalInfo == null){
// intent is to add medical info
// thus, is_update is 0
is_update_body = RequestBody.create("0",
MediaType.parse("text/plain"));
}else{
// intent is to update info
// thus, is_update is 1
is_update_body = RequestBody.create("1",
MediaType.parse("text/plain"));
}
body.put("is_update", is_update_body);
String token = "Bearer " + AppUtil.getUserToken(requireContext());
medicalInfoViewModel.addNUpdateMedicalInfo(body,
AppUtil.getPatientUid(requireContext()),
token,
this);
}
private boolean allOkay() {
boolean allOkay = true;
if (binding.diagnosis.getText().toString().trim().isEmpty()){
allOkay = false;
binding.diagnosis.setError("Required");
}
if (binding.primaryDoc.getText().toString().trim().isEmpty()){
allOkay = false;
binding.primaryDoc.setError("Required");
}
if (binding.docContact.getText().toString().trim().isEmpty()){
allOkay = false;
binding.docContact.setError("Required");
}
if (binding.hospitalPref.getText().toString().trim().isEmpty()){
allOkay = false;
binding.hospitalPref.setError("Required");
}
if (binding.allergies.getText().toString().trim().isEmpty()){
allOkay = false;
binding.allergies.setError("Required");
}
if (binding.dietRestrict.getText().toString().trim().isEmpty()){
allOkay = false;
binding.dietRestrict.setError("Required");
}
return allOkay;
}
@Override
public void onMedicalInfoAdded(MedicationInfo medicationInfo) {
progressDialog.dismiss();
if (this.medicalInfo == null){
Toast.makeText(requireContext(), "Medical information added successfully", Toast.LENGTH_SHORT).show();
Navigation.findNavController(binding.getRoot()).popBackStack(R.id.medicalInfoFragment, false);
}else{
AppUtil.showAnimateDBS(requireContext(), getString(R.string.changes_successful),
R.raw.done_anim_primary, 3000,
yes -> {
Navigation.findNavController(binding.getRoot()).popBackStack(R.id.medicalInfoFragment, false);
});
}
}
@Override
public void onMedicalInfoAddFailed(Throwable t, String message) {
progressDialog.dismiss();
AppUtil.showAlert(requireContext(),
getString(R.string.something_went_wrong),
message,
getString(R.string.ok),
((dialog, which) -> {
dialog.dismiss();
}), null, null);
}
}

View File

@@ -1,25 +1,39 @@
package com.ssb.simplitend.patientprofile.medicalinfo;
import static com.ssb.simplitend.patientprofile.medicalinfo.AddMedicalInfoFragment.MEDICAL_INFO_KEY;
import android.app.ProgressDialog;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Toast;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.fragment.app.Fragment;
import androidx.lifecycle.ViewModelProvider;
import androidx.navigation.Navigation;
import com.ssb.simplitend.R;
import com.ssb.simplitend.apputils.AppUtil;
import com.ssb.simplitend.apputils.ProfileProgress;
import com.ssb.simplitend.databinding.MedicalIntoFragmentBinding;
import com.ssb.simplitend.patientprofile.medicalinfo.mvvm.MedicalInfo;
import com.ssb.simplitend.patientprofile.ProfileContracts;
import com.ssb.simplitend.patientprofile.medicalinfo.mvvm.MedicalInfoViewModel;
import com.ssb.simplitend.patientprofile.medicalinfo.mvvm.MedicationInfo;
public class MedicalInfoFragment extends Fragment {
public class MedicalInfoFragment extends Fragment implements ProfileContracts.GetMedicationInfoCallback {
// view binding
protected MedicalIntoFragmentBinding binding;
private MedicalInfoViewModel medicalInfoViewModel;
private ProgressDialog progressDialog;
private MedicationInfo medicationInfo;
public MedicalInfoFragment(){
// required empty const.
}
@@ -29,6 +43,8 @@ public class MedicalInfoFragment extends Fragment {
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
binding = MedicalIntoFragmentBinding.inflate(inflater, container, false);
medicalInfoViewModel = new ViewModelProvider(requireActivity()).get(MedicalInfoViewModel.class);
initViews();
clickEvents();
@@ -37,17 +53,18 @@ public class MedicalInfoFragment extends Fragment {
}
private void initViews() {
progressDialog = new ProgressDialog(requireContext());
if (ProfileProgress.MEDICAL_INFO_ADDED){
binding.medicalInfo.setVisibility(View.VISIBLE);
binding.noData.setVisibility(View.GONE);
binding.addMedInfo.setVisibility(View.GONE);
}else{
binding.noData.setVisibility(View.VISIBLE);
binding.medicalInfo.setVisibility(View.GONE);
binding.addMedInfo.setVisibility(View.VISIBLE);
}
// loading medical info
progressDialog.setTitle("Please wait..");
progressDialog.setMessage("while we load your medical information.");
progressDialog.setCancelable(false);
progressDialog.show();
String token = "Bearer " + AppUtil.getUserToken(requireContext());
medicalInfoViewModel.getMedicalInfo(AppUtil.getPatientUid(requireContext()),
token, this);
}
private void clickEvents() {
@@ -61,16 +78,53 @@ public class MedicalInfoFragment extends Fragment {
binding.editBtn.setOnClickListener(v -> {
Bundle bundle = new Bundle();
MedicalInfo medicalInfo = new MedicalInfo("Cognitive impairment and memeory loss.",
"Dr. Sandeep Kanojia", "+63456398456", "Baycrest Health Sciences",
"Latex allergy", "Lorum ipsum dummy is simple dummy");
bundle.putSerializable(AddMedicalInfoFragment.MEDICAL_INFO_KEY, medicalInfo);
if (medicationInfo != null){
Bundle bundle = new Bundle();
bundle.putSerializable(MEDICAL_INFO_KEY, medicationInfo);
Navigation.findNavController(v).navigate(R.id.action_medicalInfoFragment_to_addMedicalInfoFragment, bundle);
}
Navigation.findNavController(v).navigate(R.id.action_medicalInfoFragment_to_addMedicalInfoFragment, bundle);
});
binding.done.setOnClickListener(v -> Navigation.findNavController(v).popBackStack());
}
private void loadMedicalInfo(MedicationInfo medicationInfo) {
binding.diagnosis.setText(medicationInfo.diagnosis);
binding.primaryDoc.setText(medicationInfo.primary_care_doctor);
binding.docContact.setText(medicationInfo.doctor_phone_number);
binding.hospitalPref.setText(medicationInfo.hospital_preference);
binding.allergies.setText(medicationInfo.allergies);
binding.dietRestrict.setText(medicationInfo.diet_restriction);
}
@Override
public void onMedicalInfoFetched(MedicationInfo medicationInfo) {
this.medicationInfo = medicationInfo;
progressDialog.dismiss();
if (medicationInfo != null){
binding.medicalInfo.setVisibility(View.VISIBLE);
binding.noData.setVisibility(View.GONE);
binding.addMedInfo.setVisibility(View.GONE);
binding.editBtn.setVisibility(View.VISIBLE);
loadMedicalInfo(medicationInfo);
}else{
binding.noData.setVisibility(View.VISIBLE);
binding.medicalInfo.setVisibility(View.GONE);
binding.addMedInfo.setVisibility(View.VISIBLE);
binding.editBtn.setVisibility(View.GONE);
}
}
@Override
public void onMedicationInfoFetchedFailed(Throwable t, String message) {
progressDialog.dismiss();
Toast.makeText(requireContext(), "Couldn't load medical information.", Toast.LENGTH_SHORT).show();
}
}

View File

@@ -1,20 +0,0 @@
package com.ssb.simplitend.patientprofile.medicalinfo.mvvm;
import java.io.Serializable;
public class MedicalInfo implements Serializable {
public String diagnosis, primary_doc, doc_contact, hospital_pref
, allergies, diet_restriction;
public MedicalInfo() {}
public MedicalInfo(String diagnosis, String primary_doc, String doc_contact, String hospital_pref, String allergies, String diet_restriction) {
this.diagnosis = diagnosis;
this.primary_doc = primary_doc;
this.doc_contact = doc_contact;
this.hospital_pref = hospital_pref;
this.allergies = allergies;
this.diet_restriction = diet_restriction;
}
}

View File

@@ -0,0 +1,33 @@
package com.ssb.simplitend.patientprofile.medicalinfo.mvvm;
import androidx.annotation.NonNull;
import androidx.lifecycle.ViewModel;
import com.ssb.simplitend.patientprofile.ProfileContracts;
import java.util.Map;
import okhttp3.RequestBody;
public class MedicalInfoViewModel extends ViewModel {
private final MedicalIntoRepository medicalIntoRepository;
public MedicalInfoViewModel(){
medicalIntoRepository = MedicalIntoRepository.getMedicalIntoRepository();
}
public void addNUpdateMedicalInfo(Map<String, RequestBody> body,
int patient_id,
String token,
@NonNull ProfileContracts.AddMedicalIntoCallback medicalIntoCallback){
medicalIntoRepository.addNUpdateMedicalInfo(body, patient_id, token, medicalIntoCallback);
}
public void getMedicalInfo(int patient_id,
String token,
@NonNull ProfileContracts.GetMedicationInfoCallback medicationInfoCallback){
medicalIntoRepository.getMedicalInfo(patient_id, token, medicationInfoCallback);
}
}

View File

@@ -0,0 +1,97 @@
package com.ssb.simplitend.patientprofile.medicalinfo.mvvm;
import android.util.Log;
import androidx.annotation.NonNull;
import com.ssb.simplitend.apputils.RetrofitHelper;
import com.ssb.simplitend.patientprofile.PatientProfileAPIService;
import com.ssb.simplitend.patientprofile.ProfileContracts;
import com.ssb.simplitend.welcome.mvvm.models.CallResponse;
import java.util.Map;
import okhttp3.RequestBody;
import retrofit2.Call;
import retrofit2.Callback;
import retrofit2.Response;
public class MedicalIntoRepository {
private static final String TAG = "MedicalIntoRepository";
private static MedicalIntoRepository medicalIntoRepository;
private PatientProfileAPIService apiService;
private MedicalIntoRepository(){
apiService = RetrofitHelper.getRetrofit().create(PatientProfileAPIService.class);
}
public static synchronized MedicalIntoRepository getMedicalIntoRepository(){
if (medicalIntoRepository == null){
medicalIntoRepository = new MedicalIntoRepository();
}
return medicalIntoRepository;
}
public void addNUpdateMedicalInfo(Map<String, RequestBody> body,
int patient_id,
String token,
@NonNull ProfileContracts.AddMedicalIntoCallback medicalIntoCallback){
apiService.addNUpdateMedicalInfo(body, patient_id, token)
.enqueue(new Callback<CallResponse<MedicationInfo>>() {
@Override
public void onResponse(Call<CallResponse<MedicationInfo>> call, Response<CallResponse<MedicationInfo>> response) {
if (response.body() != null){
if (response.body().status != 200 || response.body().result == null){
medicalIntoCallback.onMedicalInfoAddFailed(new Exception(), response.body().message);
return;
}
medicalIntoCallback.onMedicalInfoAdded(response.body().result);
}else{
medicalIntoCallback.onMedicalInfoAddFailed(new Exception(), "Please try again later.");
}
}
@Override
public void onFailure(Call<CallResponse<MedicationInfo>> call, Throwable t) {
medicalIntoCallback.onMedicalInfoAddFailed(new Exception(), "Please try again later.");
Log.e(TAG, "onFailure: ", t);
}
});
}
public void getMedicalInfo(int patient_id,
String token,
@NonNull ProfileContracts.GetMedicationInfoCallback medicationInfoCallback){
apiService.getMedicalInfo(patient_id, token)
.enqueue(new Callback<CallResponse<MedicationInfo>>() {
@Override
public void onResponse(Call<CallResponse<MedicationInfo>> call, Response<CallResponse<MedicationInfo>> response) {
if (response.body() != null){
if (response.body().status != 200){
medicationInfoCallback.onMedicationInfoFetchedFailed(new Exception(), response.body().message);
return;
}
medicationInfoCallback.onMedicalInfoFetched(response.body().result);
}else{
medicationInfoCallback.onMedicationInfoFetchedFailed(new Exception(), "Please try again later.");
}
}
@Override
public void onFailure(Call<CallResponse<MedicationInfo>> call, Throwable t) {
medicationInfoCallback.onMedicationInfoFetchedFailed(new Exception(), "Please try again later.");
}
});
}
}

View File

@@ -0,0 +1,20 @@
package com.ssb.simplitend.patientprofile.medicalinfo.mvvm;
import java.io.Serializable;
public class MedicationInfo implements Serializable {
public String patient_xid;
public String diagnosis;
public String primary_care_doctor;
public String doctor_phone_number;
public String hospital_preference;
public String allergies;
public String diet_restriction;
public String updated_at;
public String created_at;
public int id;
public String is_update;
public MedicationInfo(){}
}

View File

@@ -111,8 +111,21 @@ public class AddReminderFragment extends Fragment implements CompoundButton.OnCh
AppUtil.closeKeyboard(requireActivity());
if (allOkay()) {
adReminder();
if (reminder != null){
AppUtil.showSOSDecision(requireContext(), getString(R.string.make_changes),
getString(R.string.yes), getString(R.string.no),
v1 -> {
// yes click
adReminder();
}, v2 -> {
// no click
});
}else{
adReminder();
}
}
});
}
@@ -585,18 +598,11 @@ public class AddReminderFragment extends Fragment implements CompoundButton.OnCh
} else {
AppUtil.showSOSDecision(requireContext(), getString(R.string.make_changes),
getString(R.string.yes), getString(R.string.no),
v1 -> {
// yes click
AppUtil.showAnimateDBS(requireContext(),
getString(R.string.changes_successful), R.raw.done_anim_primary,
3000, v3 -> {
// here v3 is null
Navigation.findNavController(binding.getRoot()).popBackStack(R.id.reminderFragment, false, true);
});
}, v2 -> {
// no click
AppUtil.showAnimateDBS(requireContext(),
getString(R.string.changes_successful), R.raw.done_anim_primary,
3000, v3 -> {
// here v3 is null
Navigation.findNavController(binding.getRoot()).popBackStack(R.id.reminderFragment, false, true);
});
}
}

View File

@@ -21,7 +21,6 @@ import com.ssb.simplitend.databinding.RemindersFragmentBinding;
import com.ssb.simplitend.patientprofile.ProfileContracts;
import com.ssb.simplitend.patientprofile.medreminder.mvvm.ReminderAdapter;
import com.ssb.simplitend.patientprofile.medreminder.mvvm.ReminderViewModel;
import com.ssb.simplitend.patientprofile.medreminder.mvvm.models.Reminder;
import com.ssb.simplitend.patientprofile.medreminder.mvvm.models.ReminderResult;
import java.util.ArrayList;
@@ -108,16 +107,6 @@ public class ReminderFragment extends Fragment implements RecyclerTouchListener.
binding.backBtn.setOnClickListener(v -> Navigation.findNavController(v).popBackStack());
binding.editBtn.setOnClickListener(v -> {
Bundle bundle = new Bundle();
Reminder reminder = new Reminder("Vitamin D3", "05:00 PM", "5 Capsules");
bundle.putSerializable(AddReminderFragment.REMINDER_KEY, reminder);
Navigation.findNavController(binding.getRoot())
.navigate(R.id.action_reminderFragment_to_addReminderFragment, bundle);
});
}
private void loadReminderList(int day_of_week){

View File

@@ -23,12 +23,12 @@ public class ReminderAdapter extends ListAdapter<ReminderResult, ReminderAdapter
private static final DiffUtil.ItemCallback<ReminderResult> DIFF_CALLBACK = new DiffUtil.ItemCallback<ReminderResult>() {
@Override
public boolean areItemsTheSame(@NonNull ReminderResult oldItem, @NonNull ReminderResult newItem) {
return oldItem.id == newItem.id;
return false;
}
@Override
public boolean areContentsTheSame(@NonNull ReminderResult oldItem, @NonNull ReminderResult newItem) {
return oldItem.equals(newItem);
return false;
}
};

View File

@@ -1,6 +1,7 @@
package com.ssb.simplitend.patientprofile.setuproutine;
import android.annotation.SuppressLint;
import android.app.ProgressDialog;
import android.app.TimePickerDialog;
import android.os.Bundle;
import android.view.LayoutInflater;
@@ -9,23 +10,30 @@ import android.view.View;
import android.view.ViewGroup;
import android.widget.CompoundButton;
import android.widget.TextView;
import android.widget.Toast;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.appcompat.content.res.AppCompatResources;
import androidx.fragment.app.Fragment;
import androidx.lifecycle.ViewModelProvider;
import androidx.navigation.Navigation;
import com.ssb.simplitend.R;
import com.ssb.simplitend.apputils.AppUtil;
import com.ssb.simplitend.databinding.AddRoutineFragmentBinding;
import com.ssb.simplitend.patientprofile.setuproutine.mvvm.Routine;
import com.ssb.simplitend.patientprofile.ProfileContracts;
import com.ssb.simplitend.patientprofile.setuproutine.mvvm.RoutineDetails;
import com.ssb.simplitend.patientprofile.setuproutine.mvvm.RoutineViewModel;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.Locale;
import java.util.Objects;
public class AddRoutineFragment extends Fragment implements CompoundButton.OnCheckedChangeListener{
public class AddRoutineFragment extends Fragment implements CompoundButton.OnCheckedChangeListener,
ProfileContracts.AddNUpdateRoutineCallback {
// view binding
protected AddRoutineFragmentBinding binding;
@@ -33,7 +41,11 @@ public class AddRoutineFragment extends Fragment implements CompoundButton.OnChe
private boolean[] week_state;
public static final String ROUTINE_KEY = "routine_key";
private Routine routine;
private RoutineDetails routine;
private RoutineViewModel routineViewModel;
private ProgressDialog progressDialog;
public AddRoutineFragment() {
// required empty const.
@@ -44,6 +56,8 @@ public class AddRoutineFragment extends Fragment implements CompoundButton.OnChe
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
binding = AddRoutineFragmentBinding.inflate(inflater, container, false);
routineViewModel = new ViewModelProvider(requireActivity()).get(RoutineViewModel.class);
initViews();
clickEvents();
@@ -54,10 +68,14 @@ public class AddRoutineFragment extends Fragment implements CompoundButton.OnChe
@SuppressLint("ClickableViewAccessibility")
private void initViews() {
progressDialog = new ProgressDialog(requireContext());
setUpWeekSelection();
Bundle bundle = getArguments();
if (bundle != null){
routine = (Routine) bundle.getSerializable(ROUTINE_KEY);
if (bundle != null && bundle.getSerializable(ROUTINE_KEY) != null){
routine = (RoutineDetails) bundle.getSerializable(ROUTINE_KEY);
setLayoutDetails();
}
@@ -83,42 +101,158 @@ public class AddRoutineFragment extends Fragment implements CompoundButton.OnChe
binding.title.setText(getString(R.string.edit_routine));
binding.addRoutine.setText(getString(R.string.save));
binding.routineName.setText(routine.routine_name);
binding.routineName.setText(routine.routine_title);
binding.routineDescription.setText(routine.routine_description);
binding.startTime.setText(routine.start_time_str);
binding.endTime.setText(routine.end_time_str);
SimpleDateFormat input_sdf = new SimpleDateFormat("HH:mm:ss", Locale.getDefault());
SimpleDateFormat output_sdf = new SimpleDateFormat("hh:mm a", Locale.getDefault());
String start_time, end_time;
try {
Date start_date = input_sdf.parse(routine.routine_start_time);
start_time = output_sdf.format(Objects.requireNonNull(start_date));
Date end_date = input_sdf.parse(routine.routine_end_time);
end_time = output_sdf.format(Objects.requireNonNull(end_date));
} catch (Exception e) {
start_time = routine.routine_start_time;
end_time = routine.routine_end_time;
}
binding.startTime.setText(start_time);
binding.endTime.setText(end_time);
binding.startTime.setHint(routine.routine_start_time);
binding.endTime.setHint(routine.routine_end_time);
setSelectionState(0, week_state[0] = routine.sun.equals("1"));
setSelectionState(1, week_state[1] = routine.mon.equals("1"));
setSelectionState(2, week_state[2] = routine.tue.equals("1"));
setSelectionState(3, week_state[3] = routine.wed.equals("1"));
setSelectionState(4, week_state[4] = routine.thu.equals("1"));
setSelectionState(5, week_state[5] = routine.fri.equals("1"));
setSelectionState(6, week_state[6] = routine.sat.equals("1"));
}
private void clickEvents() {
binding.backBtn.setOnClickListener(v -> Navigation.findNavController(v).popBackStack());
binding.startTime.setOnClickListener(v -> getTime(binding.startTime));
binding.endTime.setOnClickListener(v -> getTime(binding.endTime));
binding.startTime.setOnClickListener(v -> {
AppUtil.closeKeyboard(requireActivity());
getTime(binding.startTime);
});
binding.endTime.setOnClickListener(v -> {
AppUtil.closeKeyboard(requireActivity());
getTime(binding.endTime);
});
binding.addRoutine.setOnClickListener(v -> {
if (routine == null){
Navigation.findNavController(v).popBackStack(R.id.routineFragment, false, true);
}else{
AppUtil.showSOSDecision(requireContext(), getString(R.string.make_changes),
getString(R.string.yes), getString(R.string.no),
v1 -> {
// yes click
AppUtil.showAnimateDBS(requireContext(),
getString(R.string.changes_successful), R.raw.done_anim_primary,
3000, v3 -> {
// here v3 is null
Navigation.findNavController(v).popBackStack(R.id.routineFragment, false, true);
});
}, v2 -> {
// no click
});
AppUtil.closeKeyboard(requireActivity());
if (allOkay()) {
if (routine != null){
AppUtil.showSOSDecision(requireContext(), getString(R.string.make_changes),
getString(R.string.yes), getString(R.string.no),
v1 -> {
// yes click
addRoutine();
}, v2 -> {
// no click
});
}else{
addRoutine();
}
}
});
setUpWeekSelection();
}
private void addRoutine() {
progressDialog.setTitle("Please wait...");
progressDialog.setMessage("while we save your reminder.");
progressDialog.setCancelable(false);
progressDialog.show();
RoutineDetails routineDetails = new RoutineDetails();
routineDetails.routine_title = binding.routineName.getText().toString().trim();
routineDetails.routine_description = binding.routineDescription.getText().toString().trim();
// saving the actual format of time i.e. HH:mm:ss as hint
// and saving the formatted time as text i.e. hh:mm a
routineDetails.routine_start_time = binding.startTime.getHint().toString();
routineDetails.routine_end_time = binding.endTime.getHint().toString();
routineDetails.sun = week_state[0] ? "1" : "0";
routineDetails.mon = week_state[1] ? "1" : "0";
routineDetails.tue = week_state[2] ? "1" : "0";
routineDetails.wed = week_state[3] ? "1" : "0";
routineDetails.thu = week_state[4] ? "1" : "0";
routineDetails.fri = week_state[5] ? "1" : "0";
routineDetails.sat = week_state[6] ? "1" : "0";
if (routine != null) {
// this intent is to update the reminder
routineDetails.is_update = 1;
routineDetails.patientRoutineId = routine.id;
} else {
routineDetails.is_update = 0;
}
String token = "Bearer " + AppUtil.getUserToken(requireContext());
routineViewModel.addNUpdateRoutine(AppUtil.getPatientUid(requireContext()),
routineDetails,
token,
this);
}
private boolean allOkay() {
boolean allOkay = true;
if (binding.routineName.getText().toString().trim().isEmpty()){
allOkay = false;
binding.routineName.setError("Required");
}
if (binding.routineDescription.getText().toString().trim().isEmpty()){
allOkay = false;
binding.routineDescription.setError("Required");
}
if (binding.startTime.getText().toString().trim().isEmpty()){
allOkay = false;
binding.startTime.setError("Required");
}
if (binding.endTime.getText().toString().trim().isEmpty()){
allOkay = false;
binding.endTime.setError("Required");
}
if (allOkay) {
boolean anyOneSelected = false;
for (int i = 0; i < week_state.length; i++) {
if (week_state[i]) {
// this week day is selected
anyOneSelected = true;
break;
}
}
if (!anyOneSelected) {
// none are selected
allOkay = false;
Toast.makeText(requireContext(), "Select a week day.", Toast.LENGTH_SHORT).show();
}
}
return allOkay;
}
// set selection and un-selection of week day
@@ -151,9 +285,11 @@ public class AddRoutineFragment extends Fragment implements CompoundButton.OnChe
cal.set(Calendar.MINUTE, minute);
SimpleDateFormat sdf = new SimpleDateFormat("hh:mm a", Locale.getDefault());
SimpleDateFormat sdf2 = new SimpleDateFormat("HH:mm:ss", Locale.getDefault());
String selected_time = sdf.format(cal.getTime());
textView.setText(selected_time);
textView.setHint(sdf2.format(cal.getTime()));
}, calendar.getTime().getHours(), calendar.getTime().getMinutes(), false);
@@ -265,4 +401,39 @@ public class AddRoutineFragment extends Fragment implements CompoundButton.OnChe
setSelectionState(i, week_state[i] = isChecked);
}
}
// add update routine callback
@Override
public void onRoutineAdded(RoutineDetails medicationInfo) {
progressDialog.dismiss();
if (this.routine == null) {
Toast.makeText(requireContext(), "Routine added successfully.", Toast.LENGTH_SHORT).show();
Navigation.findNavController(binding.getRoot())
.popBackStack(R.id.routineFragment, false, true);
} else {
AppUtil.showAnimateDBS(requireContext(),
getString(R.string.changes_successful), R.raw.done_anim_primary,
3000, v3 -> {
// here v3 is null
Navigation.findNavController(binding.getRoot()).popBackStack(R.id.routineFragment, false, true);
});
}
}
@Override
public void onRoutineAddFailed(Throwable t, String message) {
progressDialog.dismiss();
AppUtil.showAlert(requireContext(),
getString(R.string.something_went_wrong),
message,
getString(R.string.ok),
((dialog, which) -> {
dialog.dismiss();
}), null, null);
}
}

View File

@@ -2,10 +2,12 @@ package com.ssb.simplitend.patientprofile.setuproutine;
import static com.ssb.simplitend.patientprofile.setuproutine.AddRoutineFragment.ROUTINE_KEY;
import android.app.ProgressDialog;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Toast;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
@@ -17,23 +19,31 @@ import androidx.recyclerview.widget.LinearLayoutManager;
import com.ssb.simplitend.R;
import com.ssb.simplitend.apputils.AppUtil;
import com.ssb.simplitend.databinding.RoutineFragmentBinding;
import com.ssb.simplitend.patientprofile.setuproutine.mvvm.Routine;
import com.ssb.simplitend.patientprofile.ProfileContracts;
import com.ssb.simplitend.patientprofile.medreminder.WeekDayViewHolder;
import com.ssb.simplitend.patientprofile.setuproutine.mvvm.RoutineAdapter;
import com.ssb.simplitend.patientprofile.setuproutine.mvvm.RoutineDetails;
import com.ssb.simplitend.patientprofile.setuproutine.mvvm.RoutineViewModel;
public class RoutineFragment extends Fragment implements RoutineAdapter.ClickListener, RoutineAdapter.DeleteClickListener {
import java.util.ArrayList;
import java.util.Calendar;
import java.util.List;
public class RoutineFragment extends Fragment implements RoutineAdapter.ClickListener,
RoutineAdapter.DeleteClickListener,
ProfileContracts.GetRoutinesCallback,
ProfileContracts.RoutineDeleteCallback {
// view binding
protected RoutineFragmentBinding binding;
// selection state for week days
/*
true -> date selected
false -> date unselected
*/
private boolean[] selection_state;
private RoutineAdapter routineAdapter;
private RoutineViewModel viewModel;
private ArrayList<WeekDayViewHolder> weekDayViewsList;
private RoutineViewModel routineViewModel;
private ProgressDialog progressDialog;
public RoutineFragment(){
// required empty const.
@@ -44,6 +54,8 @@ public class RoutineFragment extends Fragment implements RoutineAdapter.ClickLis
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
binding = RoutineFragmentBinding.inflate(inflater, container, false);
routineViewModel = new ViewModelProvider(requireActivity()).get(RoutineViewModel.class);
initViews();
clickEvents();
@@ -52,163 +64,293 @@ public class RoutineFragment extends Fragment implements RoutineAdapter.ClickLis
}
private void clickEvents() {
// date selections
binding.day.setOnClickListener(v -> {
setDayOfWeek(0);
loadRoutineList(weekDayViewsList.get(0).day_of_week);
});
binding.day2.setOnClickListener(v -> {
setDayOfWeek(1);
loadRoutineList(weekDayViewsList.get(1).day_of_week);
});
binding.day3.setOnClickListener(v -> {
setDayOfWeek(2);
loadRoutineList(weekDayViewsList.get(2).day_of_week);
});
binding.day4.setOnClickListener(v -> {
setDayOfWeek(3);
loadRoutineList(weekDayViewsList.get(3).day_of_week);
});
binding.day5.setOnClickListener(v -> {
setDayOfWeek(4);
loadRoutineList(weekDayViewsList.get(4).day_of_week);
});
binding.day6.setOnClickListener(v -> {
setDayOfWeek(5);
loadRoutineList(weekDayViewsList.get(5).day_of_week);
});
binding.day7.setOnClickListener(v -> {
setDayOfWeek(6);
loadRoutineList(weekDayViewsList.get(6).day_of_week);
});
binding.backBtn.setOnClickListener(v -> Navigation.findNavController(v).popBackStack());
binding.addRoutine.setOnClickListener(v -> {
Navigation.findNavController(v).navigate(R.id.action_routineFragment_to_addRoutineFragment);
});
// date selections
binding.sun.setOnClickListener(v -> {
setSelectionState(0, selection_state[0] = !selection_state[0]);
loadRoutineList();
});
binding.mon.setOnClickListener(v -> {
setSelectionState(1, selection_state[1] = !selection_state[1]);
loadRoutineList();
});
binding.tue.setOnClickListener(v -> {
setSelectionState(2, selection_state[2] = !selection_state[2]);
loadRoutineList();
});
binding.wed.setOnClickListener(v -> {
setSelectionState(3, selection_state[3] = !selection_state[3]);
loadRoutineList();
});
binding.thu.setOnClickListener(v -> {
setSelectionState(4, selection_state[4] = !selection_state[4]);
loadRoutineList();
});
binding.fri.setOnClickListener(v -> {
setSelectionState(5, selection_state[5] = !selection_state[5]);
loadRoutineList();
});
binding.sat.setOnClickListener(v -> {
setSelectionState(6, selection_state[6] = !selection_state[6]);
loadRoutineList();
});
}
private void loadRoutineList(int day_of_week) {
Toast.makeText(requireContext(), "loading for " + routineViewModel.getDayOfWeek(day_of_week-1), Toast.LENGTH_SHORT).show();
progressDialog.setTitle("Please wait...");
progressDialog.setMessage("while we fetch reminders list for you.");
progressDialog.setCancelable(false);
progressDialog.show();
day_of_week--; // because, at server side day_of_week starts from 0
String token = "Bearer " + AppUtil.getUserToken(requireContext());
int patient_uid = AppUtil.getPatientUid(requireContext());
routineViewModel.getRoutines(patient_uid, token, day_of_week, this);
}
private void initViews() {
selection_state = new boolean[7];
progressDialog = new ProgressDialog(requireContext());
viewModel = new ViewModelProvider(requireActivity()).get(RoutineViewModel.class);
}
private void loadRoutineList() {
binding.noData.setVisibility(View.GONE);
binding.routineRv.setVisibility(View.VISIBLE);
binding.routineRv.setLayoutManager(new LinearLayoutManager(requireContext()));
binding.routineRv.setAdapter(viewModel.getRoutineAdapter());
routineAdapter = new RoutineAdapter();
routineAdapter.setDeleteClickListener(this);
routineAdapter.setClickListener(this);
binding.routineRv.setAdapter(routineAdapter);
viewModel.getRoutineAdapter().setDeleteClickListener(this);
viewModel.getRoutineAdapter().setClickListener(this);
Calendar calendar = Calendar.getInstance();
viewModel.getRoutineAdapter().submitList(viewModel.getRoutines());
String today_date = routineViewModel.getMonthOfYear(calendar.get(Calendar.MONTH));
today_date = today_date.concat(", " + calendar.get(Calendar.DAY_OF_MONTH));
binding.todayDate.setText(today_date);
// show days of week
setDayOfWeekViews();
setDayOfWeek(routineViewModel.selected_dow);
loadRoutineList(weekDayViewsList.get(routineViewModel.selected_dow).day_of_week);
}
private void setSelectionState(int position, boolean selection){
if (selection){
switch (position){
case 0:
// sun
binding.sun.setBackgroundResource(R.drawable.seleted_item_primary);
binding.sunT1.setTextColor(getResources().getColor(R.color.white_bg));
binding.sunT2.setTextColor(getResources().getColor(R.color.white_bg));
break;
case 1:
// mon
binding.mon.setBackgroundResource(R.drawable.seleted_item_primary);
binding.monT1.setTextColor(getResources().getColor(R.color.white_bg));
binding.monT2.setTextColor(getResources().getColor(R.color.white_bg));
break;
case 2:
// tue
binding.tue.setBackgroundResource(R.drawable.seleted_item_primary);
binding.tue1.setTextColor(getResources().getColor(R.color.white_bg));
binding.tue2.setTextColor(getResources().getColor(R.color.white_bg));
break;
case 3:
// wed
binding.wed.setBackgroundResource(R.drawable.seleted_item_primary);
binding.wed1.setTextColor(getResources().getColor(R.color.white_bg));
binding.wed2.setTextColor(getResources().getColor(R.color.white_bg));
break;
case 4:
// thu
binding.thu.setBackgroundResource(R.drawable.seleted_item_primary);
binding.thu1.setTextColor(getResources().getColor(R.color.white_bg));
binding.thu2.setTextColor(getResources().getColor(R.color.white_bg));
break;
case 5:
// fri
binding.fri.setBackgroundResource(R.drawable.seleted_item_primary);
binding.fri1.setTextColor(getResources().getColor(R.color.white_bg));
binding.fri2.setTextColor(getResources().getColor(R.color.white_bg));
break;
case 6:
// sat
binding.sat.setBackgroundResource(R.drawable.seleted_item_primary);
binding.sat1.setTextColor(getResources().getColor(R.color.white_bg));
binding.sat2.setTextColor(getResources().getColor(R.color.white_bg));
break;
}
private void setDayOfWeekViews() {
weekDayViewsList = new ArrayList<>();
// adding all day_views to the list
WeekDayViewHolder day1 = new WeekDayViewHolder(binding.day, binding.dayT1, binding.dayT2);
weekDayViewsList.add(day1);
WeekDayViewHolder day2 = new WeekDayViewHolder(binding.day2, binding.day2T1, binding.day2T2);
weekDayViewsList.add(day2);
WeekDayViewHolder day3 = new WeekDayViewHolder(binding.day3, binding.day31, binding.day32);
weekDayViewsList.add(day3);
WeekDayViewHolder day4 = new WeekDayViewHolder(binding.day4, binding.day41, binding.day42);
weekDayViewsList.add(day4);
WeekDayViewHolder day5 = new WeekDayViewHolder(binding.day5, binding.day51, binding.day52);
weekDayViewsList.add(day5);
WeekDayViewHolder day6 = new WeekDayViewHolder(binding.day6, binding.day61, binding.day62);
weekDayViewsList.add(day6);
WeekDayViewHolder day7 = new WeekDayViewHolder(binding.day7, binding.day71, binding.day72);
weekDayViewsList.add(day7);
Calendar calendar = Calendar.getInstance();
for (int i = 0; i<7; i++){
WeekDayViewHolder dayViewHolder = weekDayViewsList.get(i);
dayViewHolder.day_of_week = calendar.get(Calendar.DAY_OF_WEEK);
dayViewHolder.day.setText(routineViewModel.getDayOfWeek(dayViewHolder.day_of_week - 1));
dayViewHolder.date.setText(String.valueOf(calendar.get(Calendar.DAY_OF_MONTH)));
calendar.add(Calendar.DAY_OF_WEEK, 1);
}
}
private void setDayOfWeek(int selection){
clearSelection();
switch (routineViewModel.selected_dow = selection){
case 0:
binding.day.setBackgroundResource(R.drawable.seleted_item_primary);
binding.dayT1.setTextColor(getResources().getColor(R.color.white_bg));
binding.dayT2.setTextColor(getResources().getColor(R.color.white_bg));
break;
case 1:
binding.day2.setBackgroundResource(R.drawable.seleted_item_primary);
binding.day2T1.setTextColor(getResources().getColor(R.color.white_bg));
binding.day2T2.setTextColor(getResources().getColor(R.color.white_bg));
break;
case 2:
binding.day3.setBackgroundResource(R.drawable.seleted_item_primary);
binding.day31.setTextColor(getResources().getColor(R.color.white_bg));
binding.day32.setTextColor(getResources().getColor(R.color.white_bg));
break;
case 3:
binding.day4.setBackgroundResource(R.drawable.seleted_item_primary);
binding.day41.setTextColor(getResources().getColor(R.color.white_bg));
binding.day42.setTextColor(getResources().getColor(R.color.white_bg));
break;
case 4:
binding.day5.setBackgroundResource(R.drawable.seleted_item_primary);
binding.day51.setTextColor(getResources().getColor(R.color.white_bg));
binding.day52.setTextColor(getResources().getColor(R.color.white_bg));
break;
case 5:
binding.day6.setBackgroundResource(R.drawable.seleted_item_primary);
binding.day61.setTextColor(getResources().getColor(R.color.white_bg));
binding.day62.setTextColor(getResources().getColor(R.color.white_bg));
break;
case 6:
binding.day7.setBackgroundResource(R.drawable.seleted_item_primary);
binding.day71.setTextColor(getResources().getColor(R.color.white_bg));
binding.day72.setTextColor(getResources().getColor(R.color.white_bg));
break;
}
}
private void clearSelection(){
switch (routineViewModel.selected_dow){
case 0:
binding.day.setBackgroundColor(getResources().getColor(R.color.white_bg));
binding.dayT1.setTextColor(getResources().getColor(R.color.black));
binding.dayT2.setTextColor(getResources().getColor(R.color.black));
break;
case 1:
binding.day2.setBackgroundColor(getResources().getColor(R.color.white_bg));
binding.day2T1.setTextColor(getResources().getColor(R.color.black));
binding.day2T2.setTextColor(getResources().getColor(R.color.black));
break;
case 2:
binding.day3.setBackgroundColor(getResources().getColor(R.color.white_bg));
binding.day31.setTextColor(getResources().getColor(R.color.black));
binding.day32.setTextColor(getResources().getColor(R.color.black));
break;
case 3:
binding.day4.setBackgroundColor(getResources().getColor(R.color.white_bg));
binding.day41.setTextColor(getResources().getColor(R.color.black));
binding.day42.setTextColor(getResources().getColor(R.color.black));
break;
case 4:
binding.day5.setBackgroundColor(getResources().getColor(R.color.white_bg));
binding.day51.setTextColor(getResources().getColor(R.color.black));
binding.day52.setTextColor(getResources().getColor(R.color.black));
break;
case 5:
binding.day6.setBackgroundColor(getResources().getColor(R.color.white_bg));
binding.day61.setTextColor(getResources().getColor(R.color.black));
binding.day62.setTextColor(getResources().getColor(R.color.black));
break;
case 6:
binding.day7.setBackgroundColor(getResources().getColor(R.color.white_bg));
binding.day71.setTextColor(getResources().getColor(R.color.black));
binding.day72.setTextColor(getResources().getColor(R.color.black));
break;
}
}
// delete routine callback
@Override
public void onRoutineDeleted(int adapterPosition) {
Toast.makeText(requireContext(), "Reminder deleted.", Toast.LENGTH_SHORT).show();
progressDialog.dismiss();
loadRoutineList(weekDayViewsList.get(routineViewModel.selected_dow).day_of_week);
}
@Override
public void onRoutineDeleteFailed(Throwable t, String message) {
progressDialog.dismiss();
AppUtil.showAlert(requireContext(),
getString(R.string.something_went_wrong),
message,
getString(R.string.ok),
((dialog, which) -> {
dialog.dismiss();
}), null, null);
}
// get routine callback
@Override
public void onRoutinesFetched(List<RoutineDetails> routineList) {
progressDialog.dismiss();
if (routineList != null && routineList.size() > 0){
// reminders are present
binding.routineRv.setVisibility(View.VISIBLE);
binding.noData.setVisibility(View.GONE);
routineAdapter.submitList(routineList);
}else{
switch (position){
case 0:
// sun
binding.sun.setBackgroundColor(getResources().getColor(R.color.white_bg));
binding.sunT1.setTextColor(getResources().getColor(R.color.black));
binding.sunT2.setTextColor(getResources().getColor(R.color.black));
break;
case 1:
// mon
binding.mon.setBackgroundColor(getResources().getColor(R.color.white_bg));
binding.monT1.setTextColor(getResources().getColor(R.color.black));
binding.monT2.setTextColor(getResources().getColor(R.color.black));
break;
case 2:
// tue
binding.tue.setBackgroundColor(getResources().getColor(R.color.white_bg));
binding.tue1.setTextColor(getResources().getColor(R.color.black));
binding.tue2.setTextColor(getResources().getColor(R.color.black));
break;
case 3:
// wed
binding.wed.setBackgroundColor(getResources().getColor(R.color.white_bg));
binding.wed1.setTextColor(getResources().getColor(R.color.black));
binding.wed2.setTextColor(getResources().getColor(R.color.black));
break;
case 4:
// thu
binding.thu.setBackgroundColor(getResources().getColor(R.color.white_bg));
binding.thu1.setTextColor(getResources().getColor(R.color.black));
binding.thu2.setTextColor(getResources().getColor(R.color.black));
break;
case 5:
// fri
binding.fri.setBackgroundColor(getResources().getColor(R.color.white_bg));
binding.fri1.setTextColor(getResources().getColor(R.color.black));
binding.fri2.setTextColor(getResources().getColor(R.color.black));
break;
case 6:
// sat
binding.sat.setBackgroundColor(getResources().getColor(R.color.white_bg));
binding.sat1.setTextColor(getResources().getColor(R.color.black));
binding.sat2.setTextColor(getResources().getColor(R.color.black));
break;
}
binding.routineRv.setVisibility(View.GONE);
binding.noData.setVisibility(View.VISIBLE);
}
}
@Override
public void onDelete(Routine routine, int position) {
public void onRoutinesFetchedFailed(Throwable t, String message) {
progressDialog.dismiss();
binding.routineRv.setVisibility(View.GONE);
binding.noData.setVisibility(View.VISIBLE);
AppUtil.showAlert(requireContext(),
getString(R.string.something_went_wrong),
message,
getString(R.string.ok),
((dialog, which) -> {
dialog.dismiss();
}), null, null);
}
@Override
public void onDelete(RoutineDetails routine, int position) {
AppUtil.showSOSDecision(requireContext(), getString(R.string.delete_med_routine),
getString(R.string.yes), getString(R.string.no),
v1-> {
// yes click
progressDialog.setTitle("Please wait...");
progressDialog.setMessage("while we delete the routine for you.");
progressDialog.setCancelable(false);
progressDialog.show();
String token = "Bearer " + AppUtil.getUserToken(requireContext());
routineViewModel.deleteRoutine(AppUtil.getPatientUid(requireContext()),
routine.id,
position,
token,
this);
}, v2 -> {
// no click
});
@@ -216,7 +358,7 @@ public class RoutineFragment extends Fragment implements RoutineAdapter.ClickLis
}
@Override
public void onClick(Routine routine, int position) {
public void onClick(RoutineDetails routine, int position) {
Bundle bundle = new Bundle();
bundle.putSerializable(ROUTINE_KEY, routine);

View File

@@ -10,17 +10,22 @@ import androidx.recyclerview.widget.RecyclerView;
import com.ssb.simplitend.databinding.RoutineViewholderBinding;
public class RoutineAdapter extends ListAdapter<Routine, RoutineAdapter.RoutineViewHolder> {
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Locale;
import java.util.Objects;
private static final DiffUtil.ItemCallback<Routine> DIFF_UTIL = new DiffUtil.ItemCallback<Routine>() {
public class RoutineAdapter extends ListAdapter<RoutineDetails, RoutineAdapter.RoutineViewHolder> {
private static final DiffUtil.ItemCallback<RoutineDetails> DIFF_UTIL = new DiffUtil.ItemCallback<RoutineDetails>() {
@Override
public boolean areItemsTheSame(@NonNull Routine oldItem, @NonNull Routine newItem) {
public boolean areItemsTheSame(@NonNull RoutineDetails oldItem, @NonNull RoutineDetails newItem) {
// TODO: 10-07-2023
return false;
}
@Override
public boolean areContentsTheSame(@NonNull Routine oldItem, @NonNull Routine newItem) {
public boolean areContentsTheSame(@NonNull RoutineDetails oldItem, @NonNull RoutineDetails newItem) {
// TODO: 10-07-2023
return false;
}
@@ -29,7 +34,7 @@ public class RoutineAdapter extends ListAdapter<Routine, RoutineAdapter.RoutineV
private DeleteClickListener deleteClickListener;
private ClickListener clickListener;
public RoutineAdapter(){
public RoutineAdapter() {
super(DIFF_UTIL);
}
@@ -53,7 +58,8 @@ public class RoutineAdapter extends ListAdapter<Routine, RoutineAdapter.RoutineV
holder.setData(getItem(position), position);
holder.binding.delete.setOnClickListener(v -> {
if (deleteClickListener != null) deleteClickListener.onDelete(getItem(position), position);
if (deleteClickListener != null)
deleteClickListener.onDelete(getItem(position), position);
});
holder.binding.card.setOnClickListener(v -> {
@@ -62,28 +68,46 @@ public class RoutineAdapter extends ListAdapter<Routine, RoutineAdapter.RoutineV
}
public static class RoutineViewHolder extends RecyclerView.ViewHolder{
public static class RoutineViewHolder extends RecyclerView.ViewHolder {
RoutineViewholderBinding binding;
public RoutineViewHolder(RoutineViewholderBinding binding){
public RoutineViewHolder(RoutineViewholderBinding binding) {
super(binding.getRoot());
this.binding = binding;
}
public void setData(Routine routine, int position){
public void setData(RoutineDetails routine, int position) {
binding.routineName.setText(routine.routine_name);
binding.routineName.setText(routine.routine_title);
binding.description.setText(routine.routine_description);
String time_slot = routine.start_time_str + " - " + routine.end_time_str;
// converting time format from hh:mm:ss to hh:mm s
SimpleDateFormat input_sdf = new SimpleDateFormat("HH:mm:ss", Locale.getDefault());
SimpleDateFormat output_sdf = new SimpleDateFormat("hh:mm a", Locale.getDefault());
String start_time, end_time;
try {
Date start_date = input_sdf.parse(routine.routine_start_time);
start_time = output_sdf.format(Objects.requireNonNull(start_date)).replace(".", "").toUpperCase();
Date end_date = input_sdf.parse(routine.routine_end_time);
end_time = output_sdf.format(Objects.requireNonNull(end_date)).replace(".", "").toUpperCase();
} catch (Exception e) {
start_time = routine.routine_start_time;
end_time = routine.routine_end_time;
}
String time_slot = start_time + " - " + end_time;
binding.timeSlot.setText(time_slot);
// static
String start_slot = routine.start_time_str.substring(0, 2) + " " + routine.start_time_str.substring(routine.start_time_str.length()-2);
// static in format of hh a
String start_slot = start_time.substring(0, 2) + " " + start_time.substring(start_time.length() - 2);
binding.startTimeStatic.setText(start_slot);
String end_slot = routine.end_time_str.substring(0, 2) + " " + routine.end_time_str.substring(routine.end_time_str.length()-2);
String end_slot = end_time.substring(0, 2) + " " + end_time.substring(end_time.length() - 2);
binding.endTimeStatic.setText(end_slot);
}
@@ -93,13 +117,13 @@ public class RoutineAdapter extends ListAdapter<Routine, RoutineAdapter.RoutineV
// interfaces
@FunctionalInterface
public interface DeleteClickListener{
void onDelete(Routine routine, int position);
public interface DeleteClickListener {
void onDelete(RoutineDetails routineDetails, int position);
}
@FunctionalInterface
public interface ClickListener{
void onClick(Routine routine, int position);
public interface ClickListener {
void onClick(RoutineDetails routineDetails, int position);
}
}

View File

@@ -0,0 +1,44 @@
package com.ssb.simplitend.patientprofile.setuproutine.mvvm;
import java.io.Serializable;
import java.util.Objects;
public class RoutineDetails implements Serializable {
public int id;
public int is_update;
public int patientRoutineId;
public String patient_xid;
public String routine_title;
public String routine_description;
public String reminder_everyday_flag;
public String reminder_weekday_flag;
public String routine_start_time;
public String routine_end_time;
public String mon;
public String tue;
public String wed;
public String thu;
public String fri;
public String sat;
public String sun;
public String active;
public String deleted_at;
public String created_by;
public String updated_by;
public String created_at;
public String updated_at;
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
RoutineDetails that = (RoutineDetails) o;
return id == that.id && Objects.equals(routine_title, that.routine_title) && Objects.equals(routine_description, that.routine_description) && Objects.equals(routine_start_time, that.routine_start_time) && Objects.equals(routine_end_time, that.routine_end_time);
}
@Override
public int hashCode() {
return Objects.hash(id, routine_title, routine_description, routine_start_time, routine_end_time);
}
}

View File

@@ -1,28 +1,97 @@
package com.ssb.simplitend.patientprofile.setuproutine.mvvm;
import androidx.annotation.NonNull;
import androidx.lifecycle.ViewModel;
import com.ssb.simplitend.patientprofile.ProfileContracts;
import java.util.ArrayList;
public class RoutineViewModel extends ViewModel {
private final ArrayList<Routine> routines;
private final RoutineAdapter routineAdapter;
private final RoutinesRepository routinesRepository;
// selected day of week
public int selected_dow;
public RoutineViewModel(){
this.routineAdapter = new RoutineAdapter();
this.routinesRepository = RoutinesRepository.getRoutineRepository();
// init static data in routine list
this.routines = new ArrayList<>();
routines.add(new Routine("Doctor appointment", "Meet your heart specialist Abraham at 4:00 pm", "07 : 00 AM", "09 : 00 AM"));
routines.add(new Routine("Take medicines", "Lorem Ipsum is simply dummy.", "11 : 00 AM", "12 : 00 PM"));
// selection state default
selected_dow = 0;
}
public RoutineAdapter getRoutineAdapter() {
return routineAdapter;
public void getRoutines(int patient_id,
String token,
int week_day,
@NonNull ProfileContracts.GetRoutinesCallback routinesCallback){
routinesRepository.getRoutines(patient_id, token, week_day, routinesCallback);
}
public ArrayList<Routine> getRoutines() {
return routines;
public void addNUpdateRoutine(int patient_id,
RoutineDetails routineDetails,
String token,
@NonNull ProfileContracts.AddNUpdateRoutineCallback routineCallback){
routinesRepository.addNUpdateRoutine(patient_id, routineDetails, token, routineCallback);
}
public void deleteRoutine(int patient_id,
int patient_routine_id,
int adapterPosition,
String token,
@NonNull ProfileContracts.RoutineDeleteCallback deleteCallback){
routinesRepository.deleteRoutine(patient_id, patient_routine_id, adapterPosition, token, deleteCallback);
}
public String getDayOfWeek(int position){
switch (position){
case 0:
return "Sun";
case 1:
return "Mon";
case 2:
return "Tue";
case 3:
return "Wed";
case 4:
return "Thu";
case 5:
return "Fri";
case 6:
return "Sat";
}
return "";
}
public String getMonthOfYear(int month){
switch (month){
case 1:
return "January";
case 2:
return "February";
case 3:
return "March";
case 4:
return "April";
case 5:
return "May";
case 6:
return "June";
case 7:
return "July";
case 8:
return "August";
case 9:
return "September";
case 10:
return "October";
case 11:
return "November";
case 12:
return "December";
}
return "";
}
}

View File

@@ -0,0 +1,125 @@
package com.ssb.simplitend.patientprofile.setuproutine.mvvm;
import androidx.annotation.NonNull;
import com.ssb.simplitend.apputils.RetrofitHelper;
import com.ssb.simplitend.patientprofile.PatientProfileAPIService;
import com.ssb.simplitend.patientprofile.ProfileContracts;
import com.ssb.simplitend.welcome.mvvm.models.CallResponse;
import java.util.List;
import retrofit2.Call;
import retrofit2.Callback;
import retrofit2.Response;
import retrofit2.http.Body;
import retrofit2.http.Header;
import retrofit2.http.Path;
public class RoutinesRepository {
private static RoutinesRepository routineRepository;
private final PatientProfileAPIService apiService;
private RoutinesRepository(){
this.apiService = RetrofitHelper.getRetrofit().create(PatientProfileAPIService.class);
}
public static synchronized RoutinesRepository getRoutineRepository(){
if (routineRepository == null){
routineRepository = new RoutinesRepository();
}
return routineRepository;
}
public void getRoutines(int patient_id,
String token,
int week_day,
@NonNull ProfileContracts.GetRoutinesCallback routinesCallback){
apiService.getRoutines(patient_id, week_day, token)
.enqueue(new Callback<CallResponse<List<RoutineDetails>>>() {
@Override
public void onResponse(Call<CallResponse<List<RoutineDetails>>> call, Response<CallResponse<List<RoutineDetails>>> response) {
if (response.body() != null){
if (response.body().status != 200 || response.body().result == null){
routinesCallback.onRoutinesFetchedFailed(new Exception(), response.body().message);
return;
}
routinesCallback.onRoutinesFetched(response.body().result);
}else{
routinesCallback.onRoutinesFetchedFailed(new Exception(), "Please try again later.");
}
}
@Override
public void onFailure(Call<CallResponse<List<RoutineDetails>>> call, Throwable t) {
routinesCallback.onRoutinesFetchedFailed(new Exception(), "Please try again later.");
}
});
}
public void addNUpdateRoutine(int patient_id,
RoutineDetails routineDetails,
String token,
@NonNull ProfileContracts.AddNUpdateRoutineCallback routineCallback){
apiService.addNUpdateRoutine(patient_id, routineDetails, token)
.enqueue(new Callback<CallResponse<RoutineDetails>>() {
@Override
public void onResponse(Call<CallResponse<RoutineDetails>> call, Response<CallResponse<RoutineDetails>> response) {
if (response.body() != null){
if (response.body().status != 200 || response.body().result == null){
routineCallback.onRoutineAddFailed(new Exception(), response.body().message);
return;
}
routineCallback.onRoutineAdded(response.body().result);
}else{
routineCallback.onRoutineAddFailed(new Exception(), "Please try again later.");
}
}
@Override
public void onFailure(Call<CallResponse<RoutineDetails>> call, Throwable t) {
routineCallback.onRoutineAddFailed(new Exception(), "Please try again later.");
}
});
}
public void deleteRoutine(int patient_id,
int patient_routine_id,
int adapterPosition,
String token,
@NonNull ProfileContracts.RoutineDeleteCallback deleteCallback){
apiService.deleteRoutine(patient_id, patient_routine_id, token)
.enqueue(new Callback<CallResponse<Object>>() {
@Override
public void onResponse(Call<CallResponse<Object>> call, Response<CallResponse<Object>> response) {
if (response.body() != null){
if (response.body().status != 200){
deleteCallback.onRoutineDeleteFailed(new Exception(), response.body().message);
return;
}
deleteCallback.onRoutineDeleted(adapterPosition);
}else{
deleteCallback.onRoutineDeleteFailed(new Exception(), "Please try again later.");
}
}
@Override
public void onFailure(Call<CallResponse<Object>> call, Throwable t) {
deleteCallback.onRoutineDeleteFailed(new Exception(), "Please try again later.");
}
});
}
}

View File

@@ -24,6 +24,7 @@ import com.ssb.simplitend.apputils.AppUtil;
import com.ssb.simplitend.databinding.CheckMailFragmentBinding;
import com.ssb.simplitend.welcome.mvvm.WelcomeContracts;
import com.ssb.simplitend.welcome.mvvm.WelcomeViewModel;
import com.ssb.simplitend.welcome.mvvm.models.OTPSentResponse;
import java.util.HashMap;
import java.util.Map;
@@ -31,7 +32,8 @@ import java.util.Map;
import okhttp3.MediaType;
import okhttp3.RequestBody;
public class CheckMailFragment extends Fragment implements WelcomeContracts.VerifyOTPCallback {
public class CheckMailFragment extends Fragment implements WelcomeContracts.VerifyOTPCallback,
WelcomeContracts.SendOTPToEmailCallback{
// view binding
protected CheckMailFragmentBinding binding;
@@ -223,6 +225,10 @@ public class CheckMailFragment extends Fragment implements WelcomeContracts.Veri
});
binding.resendOtp.setOnClickListener(v -> {
sendOTP();
});
}
private void verifyOTP() {
@@ -241,6 +247,17 @@ public class CheckMailFragment extends Fragment implements WelcomeContracts.Veri
viewModel.verifyOTP(body, this);
}
private void sendOTP() {
progressDialog.setTitle("Please wait...");
progressDialog.setMessage("while we resend an OTP to your email.");
progressDialog.setCancelable(false);
progressDialog.show();
viewModel.sendOTPToEmail(email_id,
this);
}
private String getOTPFromInputs() {
return binding.otp1.getText().toString() +
binding.otp2.getText().toString() +
@@ -297,4 +314,27 @@ public class CheckMailFragment extends Fragment implements WelcomeContracts.Veri
Toast.makeText(requireContext(), message, Toast.LENGTH_SHORT).show();
}
// resend otp call back
@Override
public void onOTPSent(OTPSentResponse otpSentResponse) {
progressDialog.dismiss();
user_id = otpSentResponse.principal_xid;
Toast.makeText(requireContext(), "OTP resent successfully.", Toast.LENGTH_SHORT).show();
}
@Override
public void onOTPSentFailed(Throwable t, String message) {
progressDialog.dismiss();
AppUtil.showAlert(requireContext(),
getString(R.string.something_went_wrong),
message,
getString(R.string.ok),
((dialog, which) -> {
dialog.dismiss();
}), null, null);
}
}