diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 801ddc0..d106568 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -32,9 +32,13 @@ android:theme="@style/Theme.SimpliTend" tools:targetApi="31"> + - diff --git a/app/src/main/java/com/app/simplitend/caregiverdashboard/fragments/CgDashBoardFragment.java b/app/src/main/java/com/app/simplitend/caregiverdashboard/fragments/CgDashBoardFragment.java index 7961c3d..cb66de0 100644 --- a/app/src/main/java/com/app/simplitend/caregiverdashboard/fragments/CgDashBoardFragment.java +++ b/app/src/main/java/com/app/simplitend/caregiverdashboard/fragments/CgDashBoardFragment.java @@ -4,6 +4,8 @@ import static com.app.simplitend.apputils.NotificationService.CONTENT_TYPE_KEY; import static com.app.simplitend.articles.ArticleShowerActivity.ARTICLE_TITLE; import static com.app.simplitend.articles.ArticleShowerActivity.ARTICLE_URL_KEY; import static com.app.simplitend.cg_geofencing.CgGeoFencingActivity.GEOFENCE_DETAILS_KEY; +import static com.app.simplitend.patient_dashboard.NotificationsActivity.USER_ID; +import static com.app.simplitend.patient_dashboard.NotificationsActivity.USER_TOKEN; import android.app.ProgressDialog; import android.content.BroadcastReceiver; @@ -22,13 +24,6 @@ import androidx.annotation.Nullable; import androidx.fragment.app.Fragment; import androidx.lifecycle.ViewModelProvider; -import com.bumptech.glide.Glide; -import com.google.android.gms.maps.CameraUpdateFactory; -import com.google.android.gms.maps.GoogleMap; -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.MarkerOptions; import com.app.simplitend.R; import com.app.simplitend.apputils.AppUtil; import com.app.simplitend.apputils.CaregiverDataCache; @@ -42,6 +37,7 @@ import com.app.simplitend.caregiverdashboard.mvvm.CgHomeContracts; import com.app.simplitend.caregiverdashboard.mvvm.models.GeoFenceDetails; import com.app.simplitend.cg_geofencing.CgGeoFencingActivity; import com.app.simplitend.databinding.CaregiverDashFragmentBinding; +import com.app.simplitend.patient_dashboard.NotificationsActivity; import com.app.simplitend.patientprofile.ProfileContracts; import com.app.simplitend.patientprofile.medreminder.mvvm.ReminderViewModel; import com.app.simplitend.patientprofile.medreminder.mvvm.models.NearestActivity; @@ -51,6 +47,13 @@ import com.app.simplitend.patientprofile.setuproutine.mvvm.RoutineDetails; import com.app.simplitend.patientprofile.setuproutine.mvvm.RoutineViewModel; import com.app.simplitend.welcome.welcomecg.mvvm.CareGiverData; import com.app.simplitend.welcome.welcomepatient.mvvm.models.PatientData; +import com.bumptech.glide.Glide; +import com.google.android.gms.maps.CameraUpdateFactory; +import com.google.android.gms.maps.GoogleMap; +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.MarkerOptions; import java.text.SimpleDateFormat; import java.util.ArrayList; @@ -226,6 +229,17 @@ public class CgDashBoardFragment extends Fragment implements loadReminders(); loadActivities(); }); + + binding.notifications.setOnClickListener(view -> { + CaregiverDataCache.getCaregiverData(requireActivity(), (careGiverData1 -> { + this.careGiverData = careGiverData1; + + Intent intent = new Intent(requireActivity(), NotificationsActivity.class); + intent.putExtra(USER_ID, careGiverData.caregiver_xid + ""); + intent.putExtra(USER_TOKEN, AppUtil.getCgToken(requireContext())); + startActivity(intent); + }), true); + }); } public void setArticleDetails(ArticleResult articleResult){ diff --git a/app/src/main/java/com/app/simplitend/patient_dashboard/NotificationsActivity.java b/app/src/main/java/com/app/simplitend/patient_dashboard/NotificationsActivity.java new file mode 100644 index 0000000..bc7407e --- /dev/null +++ b/app/src/main/java/com/app/simplitend/patient_dashboard/NotificationsActivity.java @@ -0,0 +1,167 @@ +package com.app.simplitend.patient_dashboard; + +import android.os.Bundle; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; + +import androidx.annotation.NonNull; +import androidx.appcompat.app.AppCompatActivity; +import androidx.recyclerview.widget.DiffUtil; +import androidx.recyclerview.widget.LinearLayoutManager; +import androidx.recyclerview.widget.ListAdapter; +import androidx.recyclerview.widget.RecyclerView; + +import com.app.simplitend.R; +import com.app.simplitend.apputils.RetrofitHelper; +import com.app.simplitend.databinding.ActivityNotificationsBinding; +import com.app.simplitend.databinding.NotificationViewholderBinding; +import com.app.simplitend.welcome.welcomepatient.mvvm.models.CallResponse; + +import java.util.ArrayList; + +import retrofit2.Call; +import retrofit2.Callback; +import retrofit2.Response; +import retrofit2.http.GET; +import retrofit2.http.Header; +import retrofit2.http.Query; + +public class NotificationsActivity extends AppCompatActivity implements Callback>> { + + private ActivityNotificationsBinding binding; + + protected NotificationsApiService apiService; + + protected String user_id; + public static final String USER_ID = "user_id"; + + protected String token; + public static final String USER_TOKEN = "user_token"; + + private NotificationsAdapter notificationsAdapter; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + binding = ActivityNotificationsBinding.inflate(getLayoutInflater()); + setContentView(binding.getRoot()); + + apiService = RetrofitHelper.getRetrofit().create(NotificationsApiService.class); + + user_id = getIntent().getStringExtra(USER_ID); + token = getIntent().getStringExtra(USER_TOKEN); + + binding.notificationRv.setLayoutManager(new LinearLayoutManager(this)); + notificationsAdapter = new NotificationsAdapter(); + binding.notificationRv.setAdapter(notificationsAdapter); + + if (user_id != null){ + binding.progress.setVisibility(View.VISIBLE); + apiService.getNotifications(user_id, user_id, + "Bearer " + token).enqueue(this); + }else{ + binding.errorMsg.setText(R.string.couldn_t_load_notifications); + binding.errorView.setVisibility(View.VISIBLE); + } + + } + + @Override + public void onResponse(Call>> call, Response>> response) { + binding.progress.setVisibility(View.GONE); + if (response.body() != null){ + if (response.code() != 200){ + binding.errorMsg.setText(response.body().message); + binding.errorView.setVisibility(View.VISIBLE); + return; + } + + if (response.body().result == null || response.body().result.isEmpty()){ + binding.errorMsg.setText(R.string.no_notifications); + binding.errorView.setVisibility(View.VISIBLE); + return; + } + + binding.errorView.setVisibility(View.GONE); + binding.notificationRv.setVisibility(View.VISIBLE); + notificationsAdapter.submitList(response.body().result); + + }else{ + binding.errorMsg.setText(R.string.couldn_t_load_notifications); + binding.errorView.setVisibility(View.VISIBLE); + } + } + + @Override + public void onFailure(Call>> call, Throwable t) { + binding.progress.setVisibility(View.GONE); + binding.errorMsg.setText(R.string.couldn_t_load_notifications); + binding.errorView.setVisibility(View.VISIBLE); + } + + // util classes and interfaces + + public static class NotificationsAdapter extends ListAdapter { + + private static final DiffUtil.ItemCallback DIFF_CALLBACK = new DiffUtil.ItemCallback() { + @Override + public boolean areItemsTheSame(@NonNull Notification oldItem, @NonNull Notification newItem) { + return oldItem.id == newItem.id; + } + + @Override + public boolean areContentsTheSame(@NonNull Notification oldItem, @NonNull Notification newItem) { + return oldItem.id == newItem.id; + } + }; + + public NotificationsAdapter(){ + super(DIFF_CALLBACK); + } + + @NonNull + @Override + public NotificationViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { + NotificationViewholderBinding n_binding = NotificationViewholderBinding.inflate(LayoutInflater.from(parent.getContext()), parent, false); + return new NotificationViewHolder(n_binding); + } + + @Override + public void onBindViewHolder(@NonNull NotificationViewHolder holder, int position) { + holder.setData(getItem(position)); + } + + public static class NotificationViewHolder extends RecyclerView.ViewHolder{ + public NotificationViewholderBinding binding; + public NotificationViewHolder(@NonNull NotificationViewholderBinding binding){ + super(binding.getRoot()); + } + + public void setData(Notification notification){ + if (notification == null) return; + + binding.description.setText(notification.description); + } + } + } + + public static class Notification{ + public int id; + public String patient_xid; + public String caregiver_xid; + public String type; + public String date_added; + public String description; + public String created_at; + public String updated_at; + } + + public interface NotificationsApiService{ + + @GET("api/get-notifications") + Call>> getNotifications(@Query("caregiverId") String c_id, + @Query("patientId") String p_id, + @Header("Authorization") String token); + } +} \ No newline at end of file diff --git a/app/src/main/java/com/app/simplitend/patient_dashboard/PatSettingsActivity.java b/app/src/main/java/com/app/simplitend/patient_dashboard/PatSettingsActivity.java index d955338..27bcbe4 100644 --- a/app/src/main/java/com/app/simplitend/patient_dashboard/PatSettingsActivity.java +++ b/app/src/main/java/com/app/simplitend/patient_dashboard/PatSettingsActivity.java @@ -51,6 +51,8 @@ public class PatSettingsActivity extends AppCompatActivity implements CgHomeCont private void clickEvents() { + binding.backBtn.setOnClickListener(v -> onBackPressed()); + binding.deActivate.setOnClickListener(v -> { Intent intent = new Intent(this, DeActivateAccountActivity.class); intent.putExtra(IS_PATIENT_KEY, true); diff --git a/app/src/main/java/com/app/simplitend/patient_dashboard/fragments/PatientDashboardFragment.java b/app/src/main/java/com/app/simplitend/patient_dashboard/fragments/PatientDashboardFragment.java index fa5ce0c..7f16747 100644 --- a/app/src/main/java/com/app/simplitend/patient_dashboard/fragments/PatientDashboardFragment.java +++ b/app/src/main/java/com/app/simplitend/patient_dashboard/fragments/PatientDashboardFragment.java @@ -22,8 +22,6 @@ import androidx.fragment.app.Fragment; import androidx.lifecycle.ViewModelProvider; import androidx.navigation.Navigation; -import com.bumptech.glide.Glide; -import com.bumptech.glide.load.engine.DiskCacheStrategy; import com.app.simplitend.R; import com.app.simplitend.appblocking.FUAActivity; import com.app.simplitend.apputils.AppUtil; @@ -42,6 +40,8 @@ import com.app.simplitend.patientprofile.setuproutine.mvvm.RoutineDetails; import com.app.simplitend.patientprofile.setuproutine.mvvm.RoutineViewModel; import com.app.simplitend.welcome.welcomepatient.fragments.contacts.mvvm.models.ContactData; import com.app.simplitend.welcome.welcomepatient.mvvm.models.PatientData; +import com.bumptech.glide.Glide; +import com.bumptech.glide.load.engine.DiskCacheStrategy; import java.text.SimpleDateFormat; import java.util.ArrayList; diff --git a/app/src/main/java/com/app/simplitend/welcome/welcomepatient/fragments/register/LocationFragment.java b/app/src/main/java/com/app/simplitend/welcome/welcomepatient/fragments/register/LocationFragment.java index 26a007a..1fbe65e 100644 --- a/app/src/main/java/com/app/simplitend/welcome/welcomepatient/fragments/register/LocationFragment.java +++ b/app/src/main/java/com/app/simplitend/welcome/welcomepatient/fragments/register/LocationFragment.java @@ -415,17 +415,19 @@ public class LocationFragment extends Fragment implements OnMapReadyCallback, } if ((fineLocationGranted != null && fineLocationGranted) || (coarseLocationGranted != null && coarseLocationGranted)) { - // one of the location access granted. - Toast.makeText(requireContext(), "Fetching your current location", Toast.LENGTH_SHORT).show(); - if (googleMap != null) { - if (ActivityCompat.checkSelfPermission(requireContext(), Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(requireContext(), Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) { - return; + if (currentLocation == null) { + // one of the location access granted. + Toast.makeText(requireContext(), "Fetching your current location", Toast.LENGTH_SHORT).show(); + if (googleMap != null) { + if (ActivityCompat.checkSelfPermission(requireContext(), Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(requireContext(), Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) { + return; + } + googleMap.setMyLocationEnabled(true); + googleMap.getUiSettings().setMyLocationButtonEnabled(true); } - googleMap.setMyLocationEnabled(true); - googleMap.getUiSettings().setMyLocationButtonEnabled(true); - } - requestLocations(); + requestLocations(); + } } } ).launch(new String[]{Manifest.permission.ACCESS_COARSE_LOCATION, Manifest.permission.ACCESS_FINE_LOCATION}); @@ -433,18 +435,18 @@ public class LocationFragment extends Fragment implements OnMapReadyCallback, @Override public void onLocationChanged(@NonNull Location location) { - Log.d(TAG, "onLocationChanged: " + location); - this.currentLocation = new LatLng(location.getLatitude(), location.getLongitude()); - fusedLocationProviderClient.removeLocationUpdates(this); - Log.d(TAG, "onLocationChanged: location updates removed"); + if (currentLocation == null) { + this.currentLocation = new LatLng(location.getLatitude(), location.getLongitude()); + fusedLocationProviderClient.removeLocationUpdates(this); + Log.d(TAG, "onLocationChanged: location updates removed"); - CameraPosition default_map_pos = new CameraPosition.Builder() - .target(currentLocation) - .zoom(15) - .build(); - - googleMap.animateCamera(CameraUpdateFactory.newCameraPosition(default_map_pos)); + CameraPosition default_map_pos = new CameraPosition.Builder() + .target(currentLocation) + .zoom(15) + .build(); + googleMap.animateCamera(CameraUpdateFactory.newCameraPosition(default_map_pos)); + } } @Override diff --git a/app/src/main/res/drawable/ic_missed_noti.xml b/app/src/main/res/drawable/ic_missed_noti.xml new file mode 100644 index 0000000..8899395 --- /dev/null +++ b/app/src/main/res/drawable/ic_missed_noti.xml @@ -0,0 +1,28 @@ + + + + + + diff --git a/app/src/main/res/drawable/img_no_notifications.png b/app/src/main/res/drawable/img_no_notifications.png new file mode 100644 index 0000000..1a68663 Binary files /dev/null and b/app/src/main/res/drawable/img_no_notifications.png differ diff --git a/app/src/main/res/layout/activity_notifications.xml b/app/src/main/res/layout/activity_notifications.xml new file mode 100644 index 0000000..91c0e4e --- /dev/null +++ b/app/src/main/res/layout/activity_notifications.xml @@ -0,0 +1,85 @@ + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/caregiver_dash_fragment.xml b/app/src/main/res/layout/caregiver_dash_fragment.xml index e32d9f7..e950068 100644 --- a/app/src/main/res/layout/caregiver_dash_fragment.xml +++ b/app/src/main/res/layout/caregiver_dash_fragment.xml @@ -32,6 +32,7 @@ android:layout_height="?android:attr/actionBarSize"> + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index fb66034..915af0f 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -228,8 +228,7 @@ Settings Not now - - AIzaSyDQvd4THJsS62DeDidNzfP3rrnKe7zmM-4 + AIzaSyBSaqTnkexE3TPb3WOdfgB9iX155pXY_ew Search places I accept terms and conditions @@ -430,5 +429,8 @@ https://www.simplitend.com/privacy-policy https://www.simplitend.com/terms-and-conditions Couldn\'t load plans + Notifications + Couldn\'t load notifications + No notifications \ No newline at end of file