diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 1d4c917..2eb517f 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -29,9 +29,14 @@ android:supportsRtl="true" android:theme="@style/Theme.SimpliTend" tools:targetApi="31"> + + android:exported="false" + android:screenOrientation="portrait" /> contactList; + + public synchronized static void setContactList(ArrayList newContactList){ + contactList = newContactList; + } + + public synchronized static void getContactList(Context context, + String token, + @NonNull PatientDataCache.GetContactList callBack, + boolean show_progress){ + if (contactList != null){ + callBack.contactList(contactList); + return; + } + + updateContactList(context, token, callBack, show_progress); + } + + private static void updateContactList(Context context, String token, GetContactList callBack, boolean show_progress) { + WelcomeApiService apiService = RetrofitHelper.getRetrofit().create(WelcomeApiService.class); + + ProgressDialog progressDialog = new ProgressDialog(context); + progressDialog.setTitle("Please wait..."); + progressDialog.setMessage("while we fetch details for you..."); + progressDialog.setCancelable(false); + if (show_progress) { + progressDialog.show(); + } + + apiService.getContactList(token) + .enqueue(new Callback>>() { + @Override + public void onResponse(Call>> call, Response>> response) { + progressDialog.dismiss(); + if (response.code() == 200 && response.body() != null && response.body().result != null){ + ArrayList contactList = new ArrayList<>(); + + for (ContactListResponse contactResponse : response.body().result){ + contactResponse.contact_data.contact_id = contactResponse.id; + contactResponse.contact_data.is_doctor = contactResponse.is_doctor; + contactList.add(contactResponse.contact_data); + } + + setContactList(contactList); + callBack.contactList(contactList); + }else{ + callBack.contactList(null); + } + } + + @Override + public void onFailure(Call>> call, Throwable t) { + progressDialog.dismiss(); + callBack.contactList(null); + } + }); + } + public synchronized static void setPatientData(PatientData data){ patientData = data; } @@ -77,4 +140,9 @@ public class PatientDataCache { public interface GetPatientCallBack{ void patientData(PatientData patientData); } + + @FunctionalInterface + public interface GetContactList{ + void contactList(ArrayList contactList); + } } diff --git a/app/src/main/java/com/ssb/simplitend/caregiverdashboard/activities/PatientProfileShowerActivity.java b/app/src/main/java/com/ssb/simplitend/caregiverdashboard/activities/PatientProfileShowerActivity.java index 9e58fa5..fe3c707 100644 --- a/app/src/main/java/com/ssb/simplitend/caregiverdashboard/activities/PatientProfileShowerActivity.java +++ b/app/src/main/java/com/ssb/simplitend/caregiverdashboard/activities/PatientProfileShowerActivity.java @@ -1,12 +1,11 @@ package com.ssb.simplitend.caregiverdashboard.activities; -import androidx.appcompat.app.AppCompatActivity; -import androidx.fragment.app.Fragment; -import androidx.fragment.app.FragmentManager; - import android.os.Bundle; import android.widget.Toast; +import androidx.appcompat.app.AppCompatActivity; +import androidx.fragment.app.Fragment; + import com.ssb.simplitend.R; import com.ssb.simplitend.databinding.ActivityPatientProfileShowerBinding; import com.ssb.simplitend.patientprofile.medicalinfo.MedicalInfoFragment; diff --git a/app/src/main/java/com/ssb/simplitend/caregiverdashboard/fragments/CgDashBoardFragment.java b/app/src/main/java/com/ssb/simplitend/caregiverdashboard/fragments/CgDashBoardFragment.java index f3466e1..537b638 100644 --- a/app/src/main/java/com/ssb/simplitend/caregiverdashboard/fragments/CgDashBoardFragment.java +++ b/app/src/main/java/com/ssb/simplitend/caregiverdashboard/fragments/CgDashBoardFragment.java @@ -377,6 +377,8 @@ public class CgDashBoardFragment extends Fragment implements if (nearestReminder.upcoming_time == null){ binding.nearestReminder.setText(R.string.all_reminder_done); + viewModel.upcomingReminderText = binding.nearestReminder.getText().toString(); + viewModel.dailyReminderText = binding.dailyReminder.getText().toString(); return; } @@ -460,6 +462,9 @@ public class CgDashBoardFragment extends Fragment implements if (nearestActivity.upcoming_time == null){ binding.upcomingActivity.setText(R.string.no_upcoming_activities); + + viewModel.upcomingActivityText = binding.upcomingActivity.getText().toString(); + viewModel.ongoingActivityText = binding.onGoingActivity.getText().toString(); return; } diff --git a/app/src/main/java/com/ssb/simplitend/patient_dashboard/DirectionToHomeActivity.java b/app/src/main/java/com/ssb/simplitend/patient_dashboard/DirectionToHomeActivity.java index 8b5db14..9c31b1b 100644 --- a/app/src/main/java/com/ssb/simplitend/patient_dashboard/DirectionToHomeActivity.java +++ b/app/src/main/java/com/ssb/simplitend/patient_dashboard/DirectionToHomeActivity.java @@ -5,8 +5,11 @@ import android.content.Intent; import android.content.pm.PackageManager; import android.location.Location; import android.location.LocationManager; +import android.net.Uri; import android.os.Bundle; import android.provider.Settings; +import android.view.View; +import android.widget.LinearLayout; import android.widget.Toast; import androidx.activity.result.ActivityResultLauncher; @@ -27,9 +30,9 @@ import com.google.android.gms.maps.OnMapReadyCallback; import com.google.android.gms.maps.SupportMapFragment; import com.google.android.gms.maps.model.LatLng; import com.google.android.gms.maps.model.LatLngBounds; -import com.google.android.gms.maps.model.Marker; import com.google.android.gms.maps.model.MarkerOptions; import com.google.android.gms.maps.model.PolylineOptions; +import com.google.android.material.bottomsheet.BottomSheetBehavior; import com.google.maps.DirectionsApi; import com.google.maps.GeoApiContext; import com.google.maps.android.PolyUtil; @@ -46,6 +49,12 @@ public class DirectionToHomeActivity extends AppCompatActivity protected ActivityDirectionToHomeBinding binding; + public static final String LAT_KEY = "lat_key"; + public static final String LNG_KEY = "lng_key"; + + private double pat_lat, pat_lng; + private double pat_cur_lat, pat_cur_lng; + private ActivityResultLauncher locationPermissionLauncher; private ActivityResultLauncher enableLocationIntent; private FusedLocationProviderClient fusedLocationProviderClient; @@ -53,16 +62,49 @@ public class DirectionToHomeActivity extends AppCompatActivity private LocationRequest locationRequest; private GoogleMap mGoogleMap; + private BottomSheetBehavior bottomSheetBehavior; + @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); binding = ActivityDirectionToHomeBinding.inflate(getLayoutInflater()); setContentView(binding.getRoot()); + Intent intent = getIntent(); + if (intent != null && intent.hasExtra(LAT_KEY) && intent.hasExtra(LNG_KEY)){ + pat_lat = intent.getDoubleExtra(LAT_KEY, 0); + pat_lng = intent.getDoubleExtra(LNG_KEY, 0); + }else { + finish(); + return; + } + getLocationPermission(); initViews(); + clickEvents(); + + } + + private void clickEvents() { + binding.closeBtn.setOnClickListener(v -> { + if(bottomSheetBehavior.getState() == BottomSheetBehavior.STATE_EXPANDED){ + bottomSheetBehavior.setState(BottomSheetBehavior.STATE_COLLAPSED); + } + }); + + binding.goBtn.setOnClickListener(v -> { + String cur_location = pat_cur_lat + "," + pat_cur_lng; + String pat_location = pat_lat + "," + pat_lng; + Intent intent = new Intent(android.content.Intent.ACTION_VIEW, + Uri.parse("http://maps.google.com/maps?saddr=" + cur_location + "&daddr=" + pat_location)); + startActivity(intent); + }); + + binding.backBtn.setOnClickListener(v -> { + onBackPressed(); + }); } @Override @@ -86,6 +128,23 @@ public class DirectionToHomeActivity extends AppCompatActivity fusedLocationProviderClient = LocationServices.getFusedLocationProviderClient(this); locationRequest = new LocationRequest.Builder(LocationRequest.PRIORITY_HIGH_ACCURACY, 5000) .build(); + + bottomSheetBehavior = BottomSheetBehavior.from(binding.directionBs); + bottomSheetBehavior.addBottomSheetCallback(new BottomSheetBehavior.BottomSheetCallback() { + @Override + public void onStateChanged(@NonNull View bottomSheet, int newState) { + if (newState == BottomSheetBehavior.STATE_COLLAPSED){ + binding.closeBtn.setVisibility(View.GONE); + }else if (newState == BottomSheetBehavior.STATE_EXPANDED){ + binding.closeBtn.setVisibility(View.VISIBLE); + } + } + + @Override + public void onSlide(@NonNull View bottomSheet, float slideOffset) { + + } + }); } private void getLocationPermission() { @@ -168,6 +227,8 @@ public class DirectionToHomeActivity extends AppCompatActivity } private void addMarkersToMap(DirectionsResult results, GoogleMap mMap) throws Exception { + pat_cur_lat = results.routes[0].legs[0].startLocation.lat; + pat_cur_lng = results.routes[0].legs[0].startLocation.lng; mMap.addMarker(new MarkerOptions().position(new com.google.android.gms.maps.model.LatLng(results.routes[0].legs[0].startLocation.lat,results.routes[0].legs[0].startLocation.lng)).title("Your location")); mMap.addMarker(new MarkerOptions().position(new com.google.android.gms.maps.model.LatLng(results.routes[0].legs[0].endLocation.lat,results.routes[0].legs[0].endLocation.lng)).title("Senior's location")); } @@ -184,7 +245,7 @@ public class DirectionToHomeActivity extends AppCompatActivity int padding = ((getWindowManager().getDefaultDisplay().getWidth() * 10) / 100); // offset from edges of the map // in pixels CameraUpdate cu = CameraUpdateFactory.newLatLngBounds(bounds, - padding); + padding+100); mMap.animateCamera(cu); } @@ -232,15 +293,21 @@ public class DirectionToHomeActivity extends AppCompatActivity .apiKey(getString(R.string.GOOGLE_MAPS_API_KEY)) .build()) .origin(new com.google.maps.model.LatLng(location.getLatitude(), location.getLongitude())) - .destination(new com.google.maps.model.LatLng(28.42104670992253, 76.92862066485148)) + .destination(new com.google.maps.model.LatLng(pat_lat, pat_lng)) .alternatives(true) .await(); addMarkersToMap(directionsResult, mGoogleMap); positionCamera(directionsResult.routes[0], mGoogleMap); addPolyline(directionsResult, mGoogleMap); + + binding.progress.setVisibility(View.GONE); + binding.progress.setEnabled(false); + binding.directionBs.setVisibility(View.VISIBLE); } catch (Exception e) { Toast.makeText(this, "Couldn't load routes", Toast.LENGTH_SHORT).show(); + binding.progress.setVisibility(View.GONE); + binding.progress.setEnabled(false); } } diff --git a/app/src/main/java/com/ssb/simplitend/patient_dashboard/fragments/CallsActivity.java b/app/src/main/java/com/ssb/simplitend/patient_dashboard/fragments/CallsActivity.java new file mode 100644 index 0000000..a7436b4 --- /dev/null +++ b/app/src/main/java/com/ssb/simplitend/patient_dashboard/fragments/CallsActivity.java @@ -0,0 +1,178 @@ +package com.ssb.simplitend.patient_dashboard.fragments; + +import android.app.Dialog; +import android.os.Bundle; +import android.text.InputFilter; +import android.view.View; +import android.widget.ImageButton; +import android.widget.TableLayout; +import android.widget.Toast; + +import androidx.appcompat.app.AppCompatActivity; +import androidx.recyclerview.widget.GridLayoutManager; +import androidx.recyclerview.widget.LinearLayoutManager; + +import com.google.android.material.bottomsheet.BottomSheetDialog; +import com.google.i18n.phonenumbers.PhoneNumberUtil; +import com.google.i18n.phonenumbers.Phonenumber; +import com.ssb.simplitend.R; +import com.ssb.simplitend.apputils.AppUtil; +import com.ssb.simplitend.databinding.ActivityCallsBinding; +import com.ssb.simplitend.databinding.CallListDialogBinding; +import com.ssb.simplitend.databinding.CreateContactViewHolderBinding; +import com.ssb.simplitend.welcome.welcomepatient.fragments.contacts.mvvm.AddContactAdapter; +import com.ssb.simplitend.welcome.welcomepatient.fragments.contacts.mvvm.models.ContactData; + +import java.util.ArrayList; + +public class CallsActivity extends AppCompatActivity implements AddContactAdapter.ContactClickListener { + + protected ActivityCallsBinding binding; + + public static final String CALL_CONTACT_LIST_KEY = "contact_list_key"; + + protected AddContactAdapter contactAdapter; + protected ArrayList contactList; + + private String select_phone_number; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + binding = ActivityCallsBinding.inflate(getLayoutInflater()); + setContentView(binding.getRoot()); + + contactList = (ArrayList) getIntent().getSerializableExtra(CALL_CONTACT_LIST_KEY); + + initViews(); + + clickEvents(); + } + + private void clickEvents() { + binding.backBtn.setOnClickListener(view -> onBackPressed()); + } + + private void initViews() { + binding.contactRv.setLayoutManager(new GridLayoutManager(this, 2, LinearLayoutManager.VERTICAL, false)); + contactAdapter = new AddContactAdapter(); + binding.contactRv.setAdapter(contactAdapter); + contactAdapter.setContactClickListener(this); + + if (contactList != null){ + contactAdapter.submitList(contactList); + }else{ + Toast.makeText(this, "Couldn't load contact list", Toast.LENGTH_SHORT).show(); + } + } + + private void showContactDialog(ContactData contactData) { + CallListDialogBinding dialogBinding = CallListDialogBinding.inflate(getLayoutInflater()); + BottomSheetDialog bsd = new BottomSheetDialog(this, R.style.BottomSheetDialog); + bsd.setContentView(dialogBinding.getRoot()); + + boolean default_contact_set = false; + if (contactData.phone_number != null) { + addContactView(contactData.phone_number, default_contact_set = true, dialogBinding.contactTable, contactData); + select_phone_number = contactData.phone_number; + } + + // adding contacts to Contact_rv + if (contactData.extra_phone_numbers != null && !contactData.extra_phone_numbers.isEmpty()) { + String[] phone_numbers = contactData.extra_phone_numbers.split(","); + + for (String phone_number : phone_numbers) { + addContactView(phone_number, phone_numbers.length == 1 && !default_contact_set, dialogBinding.contactTable, contactData); + } + } + + dialogBinding.callBtn.setOnClickListener(v -> { + if (select_phone_number == null){ + Toast.makeText(this, "Select a contact", Toast.LENGTH_SHORT).show(); + return; + } + + AppUtil.dialPhone(this, select_phone_number); + }); + + dialogBinding.messageBtn.setOnClickListener(v -> { + if (select_phone_number == null){ + Toast.makeText(this, "Select a contact", Toast.LENGTH_SHORT).show(); + return; + } + + AppUtil.messageNumber(this, select_phone_number); + }); + + bsd.show(); + } + + private void addContactView(String contact_number, boolean id_default, + TableLayout tableLayout, ContactData contactData) { + CreateContactViewHolderBinding contact_binding = CreateContactViewHolderBinding.inflate(getLayoutInflater()); + + contact_binding.createCountryCodes.setVisibility(View.GONE); + contact_binding.createCountryCodes.setEnabled(false); + + contact_binding.createPhoneNumber.setText(contact_number); + contact_binding.createPhoneNumber.setEnabled(false); + + contact_binding.defaultCheck.setOnClickListener(v -> { + if (!contact_binding.defaultCheck.isSelected()) { + selectDefaultContact(tableLayout.indexOfChild(contact_binding.getRoot()), tableLayout); + select_phone_number = contact_number; + } + }); + + contact_binding.delete.setOnClickListener(v -> { + if (tableLayout.getChildCount() == 1) { + Toast.makeText(this, "Cannot be deleted", Toast.LENGTH_SHORT).show(); + return; + } + + try { + tableLayout.removeView(contact_binding.getRoot()); + } catch (Exception e) { + Toast.makeText(this, "Couldn't delete contact.", Toast.LENGTH_SHORT).show(); + } + }); + + contact_binding.defaultCheck.setSelected(id_default); + + // if contact is a doctor we wont allow the contact to be changes + if (contactData != null && contactData.is_doctor != null && contactData.is_doctor.equals("1")){ + contact_binding.createPhoneNumber.setEnabled(false); + contact_binding.createCountryCodes.setEnabled(false); + contact_binding.defaultCheck.setEnabled(false); + } + + tableLayout.addView(contact_binding.getRoot()); + } + + private void selectDefaultContact(int index, TableLayout tableLayout) { + int count = tableLayout.getChildCount(); + if (index >= 0 && index < count) { + // unselecting all other editBoxes + for (int i = 0; i < count; i++) { + View view = tableLayout.getChildAt(i); + if (view != null) { + ImageButton default_check = view.findViewById(R.id.default_check); + if (default_check != null) { + + if (i == index) { + default_check.setSelected(true); + } else { + default_check.setSelected(false); + } + + } + } + } + } + } + + @Override + public void onContactClick(ContactData contactData, int position) { + showContactDialog(contactData); + } +} \ No newline at end of file diff --git a/app/src/main/java/com/ssb/simplitend/patient_dashboard/fragments/PatientDashboardFragment.java b/app/src/main/java/com/ssb/simplitend/patient_dashboard/fragments/PatientDashboardFragment.java index 444e7f4..d1848f8 100644 --- a/app/src/main/java/com/ssb/simplitend/patient_dashboard/fragments/PatientDashboardFragment.java +++ b/app/src/main/java/com/ssb/simplitend/patient_dashboard/fragments/PatientDashboardFragment.java @@ -1,5 +1,9 @@ package com.ssb.simplitend.patient_dashboard.fragments; +import static com.ssb.simplitend.patient_dashboard.DirectionToHomeActivity.LAT_KEY; +import static com.ssb.simplitend.patient_dashboard.DirectionToHomeActivity.LNG_KEY; +import static com.ssb.simplitend.patient_dashboard.fragments.CallsActivity.CALL_CONTACT_LIST_KEY; + import android.app.Activity; import android.content.BroadcastReceiver; import android.content.Context; @@ -9,6 +13,7 @@ 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; @@ -24,9 +29,11 @@ import com.ssb.simplitend.apputils.PatientDataCache; import com.ssb.simplitend.databinding.PatientDashboardFragmentBinding; import com.ssb.simplitend.patient_dashboard.DirectionToHomeActivity; import com.ssb.simplitend.welcome.activities.WelcomeActivity; +import com.ssb.simplitend.welcome.welcomepatient.fragments.contacts.mvvm.models.ContactData; import com.ssb.simplitend.welcome.welcomepatient.mvvm.models.PatientData; import java.text.SimpleDateFormat; +import java.util.ArrayList; import java.util.Calendar; import java.util.Locale; @@ -37,6 +44,8 @@ public class PatientDashboardFragment extends Fragment { private PatientData patientData; + private ArrayList contactList; + // date suffixes String[] suffixes = // 0 1 2 3 4 5 6 7 8 9 @@ -79,6 +88,11 @@ public class PatientDashboardFragment extends Fragment { setDetails(); }), true); + PatientDataCache.getContactList(requireContext(),"Bearer " + AppUtil.getPatientToken(requireContext()), + (contactList1 -> { + this.contactList = contactList1; + }), false); + return binding.getRoot(); } @@ -140,7 +154,24 @@ public class PatientDashboardFragment extends Fragment { binding.closeReminder.setOnClickListener(v -> removeReminder()); binding.calls.setOnClickListener(v -> { + PatientDataCache.getContactList(requireContext(), + "Bearer " + AppUtil.getPatientToken(requireContext()), (contactList1 -> { + this.contactList = contactList1; + + if (contactList != null){ + Intent intent = new Intent(requireActivity(), CallsActivity.class); + intent.putExtra(CALL_CONTACT_LIST_KEY, contactList); + startActivity(intent); + + }else{ + Toast.makeText(requireContext(), "Couldn't load contact list", Toast.LENGTH_SHORT).show(); + } + }), true); + }); + + binding.calls.setOnLongClickListener(v -> { addReminder(); + return true; }); binding.profile.setOnClickListener(v -> { @@ -153,9 +184,21 @@ public class PatientDashboardFragment extends Fragment { }); binding.directions.setOnClickListener(v -> { - Intent intent = new Intent(requireActivity(), DirectionToHomeActivity.class); - startActivity(intent); + if (patientData == null) return; + + try { + Intent intent = new Intent(requireActivity(), DirectionToHomeActivity.class); + double lat = Double.parseDouble(patientData.lat); + double lng = Double.parseDouble(patientData.lng); + intent.putExtra(LAT_KEY, lat); + intent.putExtra(LNG_KEY, lng); + startActivity(intent); + }catch (Exception e){ + Toast.makeText(requireContext(), "Couldn't load your home location", Toast.LENGTH_SHORT).show(); + } }); + + } private void updateTime() { diff --git a/app/src/main/res/drawable/ic_close_cross.xml b/app/src/main/res/drawable/ic_close_cross.xml new file mode 100644 index 0000000..c5dad40 --- /dev/null +++ b/app/src/main/res/drawable/ic_close_cross.xml @@ -0,0 +1,13 @@ + + + diff --git a/app/src/main/res/drawable/ic_dotted_dash.xml b/app/src/main/res/drawable/ic_dotted_dash.xml new file mode 100644 index 0000000..262115e --- /dev/null +++ b/app/src/main/res/drawable/ic_dotted_dash.xml @@ -0,0 +1,12 @@ + + + diff --git a/app/src/main/res/drawable/ic_plus.xml b/app/src/main/res/drawable/ic_plus.xml new file mode 100644 index 0000000..4ec6aa1 --- /dev/null +++ b/app/src/main/res/drawable/ic_plus.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/layout/activity_calls.xml b/app/src/main/res/layout/activity_calls.xml new file mode 100644 index 0000000..39a59e4 --- /dev/null +++ b/app/src/main/res/layout/activity_calls.xml @@ -0,0 +1,55 @@ + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_direction_to_home.xml b/app/src/main/res/layout/activity_direction_to_home.xml index 18818f9..bd66aea 100644 --- a/app/src/main/res/layout/activity_direction_to_home.xml +++ b/app/src/main/res/layout/activity_direction_to_home.xml @@ -1,38 +1,177 @@ - - - - - - + android:layout_height="match_parent" + android:orientation="vertical"> - \ No newline at end of file + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/call_list_dialog.xml b/app/src/main/res/layout/call_list_dialog.xml new file mode 100644 index 0000000..5f9c9b9 --- /dev/null +++ b/app/src/main/res/layout/call_list_dialog.xml @@ -0,0 +1,104 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/create_contact_view_holder.xml b/app/src/main/res/layout/create_contact_view_holder.xml index 4bb5285..3319cd4 100644 --- a/app/src/main/res/layout/create_contact_view_holder.xml +++ b/app/src/main/res/layout/create_contact_view_holder.xml @@ -89,8 +89,9 @@ No ongoing activity No upcoming activities Direction to home + Directions + Your location + Home Address + go + Call and message your loved ones + Select number to cal or message + Call \ No newline at end of file