This commit is contained in:
2023-10-12 21:04:28 +05:30
parent ddaac51b1d
commit 0a5db1f808
44 changed files with 463 additions and 109 deletions

View File

@@ -66,6 +66,8 @@ public abstract class AppUtil {
public static final String IMAGE_BASE_URL = "https://simplitend.betadelivery.com/storage/upload/";
private static final String TAG = "AppUtil";
public static final int LOCATION_REQUEST_CODE = 12;
public static final String NOTIFICATION_ACTION = "com.simplitend.NOTIFICATION_ACTION";
// fields

View File

@@ -103,6 +103,7 @@ public class ArticlesActivity extends AppCompatActivity
}
binding.searchEt.setText("");
AppUtil.closeKeyboard(this);
});
binding.searchEt.setOnEditorActionListener((textView, i, keyEvent) -> {

View File

@@ -13,6 +13,8 @@ public class GeoFenceDetails implements Serializable {
public String created_at;
public String updated_at;
public PatientCurrLocation patient_radius_location;
public GeoFenceDetails(){}
@Override

View File

@@ -0,0 +1,12 @@
package com.app.simplitend.caregiverdashboard.mvvm.models;
import java.io.Serializable;
public class PatientCurrLocation implements Serializable {
public int id;
public String patient_xid;
public String lat;
public String lng;
public String created_at;
public String updated_at;
}

View File

@@ -1,6 +1,7 @@
package com.app.simplitend.cg_geofencing;
import android.app.Activity;
import android.app.PendingIntent;
import android.app.ProgressDialog;
import android.content.Intent;
import android.graphics.Color;
@@ -17,18 +18,6 @@ import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;
import androidx.lifecycle.ViewModelProvider;
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.CircleOptions;
import com.google.android.gms.maps.model.LatLng;
import com.google.android.gms.maps.model.MarkerOptions;
import com.google.android.libraries.places.api.Places;
import com.google.android.libraries.places.api.model.Place;
import com.google.android.libraries.places.widget.Autocomplete;
import com.google.android.libraries.places.widget.model.AutocompleteActivityMode;
import com.google.android.material.bottomsheet.BottomSheetDialog;
import com.app.simplitend.R;
import com.app.simplitend.apputils.AppUtil;
import com.app.simplitend.apputils.CaregiverDataCache;
@@ -39,6 +28,19 @@ import com.app.simplitend.databinding.ActivityCgGeofencingBinding;
import com.app.simplitend.databinding.GeofenceBottomSheetBinding;
import com.app.simplitend.welcome.welcomecg.mvvm.CareGiverData;
import com.app.simplitend.welcome.welcomepatient.mvvm.models.PatientData;
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.BitmapDescriptorFactory;
import com.google.android.gms.maps.model.CircleOptions;
import com.google.android.gms.maps.model.LatLng;
import com.google.android.gms.maps.model.MarkerOptions;
import com.google.android.libraries.places.api.Places;
import com.google.android.libraries.places.api.model.Place;
import com.google.android.libraries.places.widget.Autocomplete;
import com.google.android.libraries.places.widget.model.AutocompleteActivityMode;
import com.google.android.material.bottomsheet.BottomSheetDialog;
import java.util.Arrays;
import java.util.HashMap;
@@ -72,7 +74,7 @@ public class CgGeoFencingActivity extends AppCompatActivity implements OnMapRead
private GoogleMap mMap;
private LatLng mLatLng;
private LatLng mLatLng, pat_cur_latLng;
private ActivityResultLauncher<Intent> startAutocompleteMapSearch;
@@ -90,6 +92,13 @@ public class CgGeoFencingActivity extends AppCompatActivity implements OnMapRead
try {
geoFenceDetails = (GeoFenceDetails) intent.getSerializableExtra(GEOFENCE_DETAILS_KEY);
if (geoFenceDetails == null) throw new Exception();
try {
pat_cur_latLng = new LatLng(Double.parseDouble(geoFenceDetails.patient_radius_location.lat),
Double.parseDouble(geoFenceDetails.patient_radius_location.lng));
}catch (Exception e){
pat_cur_latLng = null;
}
} catch (Exception e) {
Toast.makeText(this, "Couldn't load Geofence.", Toast.LENGTH_SHORT).show();
geoFenceDetails = new GeoFenceDetails();
@@ -395,9 +404,22 @@ public class CgGeoFencingActivity extends AppCompatActivity implements OnMapRead
MarkerOptions markerOptions = new MarkerOptions()
.position(latLng)
.title(patientData.first_name + "");
.draggable(false)
.icon(BitmapDescriptorFactory.fromResource(R.drawable.img_home_marker))
.title("Home location");
mMap.addMarker(markerOptions);
if (pat_cur_latLng != null){
MarkerOptions pat_cur_marker = new MarkerOptions()
.position(pat_cur_latLng)
.draggable(false)
.icon(BitmapDescriptorFactory.fromResource(R.drawable.img_pat_curr_location))
.title(patientData.first_name + "");
mMap.addMarker(pat_cur_marker);
}
mMap.animateCamera(CameraUpdateFactory.newLatLngZoom(latLng, 13));
}

View File

@@ -132,6 +132,10 @@ public class CgSubscriptionActivity extends AppCompatActivity
}), true);
});
binding.backBtn.setOnClickListener(view -> {
onBackPressed();
});
binding.contactAdmin.setOnClickListener(view -> {
contactMail();
});

View File

@@ -1,6 +1,7 @@
package com.app.simplitend.patient_dashboard;
import static com.app.simplitend.patientgeofencing.GeoFenceHelper.GEOFENCE_TAG;
import static com.app.simplitend.patientgeofencing.PatientLocationUpdatesReceiver.LOCATION_REQUEST_TAG;
import android.Manifest;
import android.app.role.RoleManager;
@@ -13,6 +14,7 @@ import android.util.Log;
import androidx.activity.result.contract.ActivityResultContracts;
import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.app.ActivityCompat;
import androidx.lifecycle.ViewModelProvider;
import com.app.simplitend.R;
@@ -25,6 +27,7 @@ public class DashBoardActivity extends AppCompatActivity implements CgHomeContra
protected PatientMainViewModel viewModel;
public static final int LOCATION_REQUEST_CODE = 1001;
public static final int LOCATION_REQUEST_CODE_2 = 2002;
private GeoFenceDetails geoFenceDetails;
@@ -43,13 +46,13 @@ public class DashBoardActivity extends AppCompatActivity implements CgHomeContra
"", "Bearer " + AppUtil.getPatientToken(this),
this);
if (result){
if (result) {
// permission granted
if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.Q) {
RoleManager roleManager = getSystemService(RoleManager.class);
Intent i = roleManager.createRequestRoleIntent(RoleManager.ROLE_CALL_SCREENING);
startActivityForResult(i, 1214, null);
}else{
} else {
Intent intent = new Intent(TelecomManager.ACTION_CHANGE_DEFAULT_DIALER);
intent.putExtra(TelecomManager.EXTRA_CHANGE_DEFAULT_DIALER_PACKAGE_NAME, getPackageName());
startActivity(intent);
@@ -59,20 +62,30 @@ public class DashBoardActivity extends AppCompatActivity implements CgHomeContra
}
private void validateAndAddGeofence(GeoFenceDetails geoFenceDetails) {
if (geoFenceDetails.radius != null && geoFenceDetails.type != null){
if (geoFenceDetails.radius != null && geoFenceDetails.type != null) {
PatientDataCache.getPatientData(this, (patientData -> {
if (patientData != null){
if (patientData != null) {
if (AppUtil.shouldAddPatientGeofence(this,
geoFenceDetails.radius, geoFenceDetails.type, patientData)){
geoFenceDetails.radius, geoFenceDetails.type, patientData)) {
// should add a geofence
viewModel.setGeofence(this, geoFenceDetails, patientData);
}else{
} else {
Log.d(GEOFENCE_TAG, "onGeofenceDetailsFetched: should not add patient geofence because GEOFENCE DETAILS: " + geoFenceDetails + " PATIENT DETAILS: " + patientData);
}
}
}), false);
}
if (geoFenceDetails.patient_radius_location != null) {
if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
Log.d(LOCATION_REQUEST_TAG, "addLocationUpdates: REQUESTING FINE LOCATION PERMISSION");
ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.ACCESS_FINE_LOCATION}, LOCATION_REQUEST_CODE_2);
return;
}
viewModel.addLocationUpdates(this);
}
}
@@ -91,13 +104,23 @@ public class DashBoardActivity extends AppCompatActivity implements CgHomeContra
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
if (requestCode == LOCATION_REQUEST_CODE){
if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED){
if (requestCode == LOCATION_REQUEST_CODE) {
if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
Log.d(GEOFENCE_TAG, "onRequestPermissionsResult: PERMISSION GRANTED");
if (geoFenceDetails != null){
if (geoFenceDetails != null) {
validateAndAddGeofence(geoFenceDetails);
}
}
} else if (requestCode == LOCATION_REQUEST_CODE_2) {
if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
Log.d(LOCATION_REQUEST_TAG, "onRequestPermissionsResult: PERMISSION GRANTED");
if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
return;
}
viewModel.addLocationUpdates(this);
}
}
}
}

View File

@@ -3,11 +3,12 @@ package com.app.simplitend.patient_dashboard;
import static com.app.simplitend.patient_dashboard.DashBoardActivity.LOCATION_REQUEST_CODE;
import static com.app.simplitend.patientgeofencing.GeoFenceHelper.GEOFENCE_ID;
import static com.app.simplitend.patientgeofencing.GeoFenceHelper.GEOFENCE_TAG;
import static com.app.simplitend.patientgeofencing.PatientLocationUpdatesReceiver.LOCATION_REQUEST_TAG;
import android.Manifest;
import android.app.Activity;
import android.app.PendingIntent;
import android.content.Context;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.os.Build;
import android.os.Handler;
@@ -29,15 +30,19 @@ import com.app.simplitend.caregiverdashboard.mvvm.CgHomeRepository;
import com.app.simplitend.caregiverdashboard.mvvm.NotificationApiService;
import com.app.simplitend.caregiverdashboard.mvvm.models.GeoFenceDetails;
import com.app.simplitend.patientgeofencing.GeoFenceHelper;
import com.app.simplitend.patientgeofencing.PatientLocationUpdatesReceiver;
import com.app.simplitend.patientprofile.PatientProfileAPIService;
import com.app.simplitend.patientprofile.medreminder.mvvm.models.NearestActivity;
import com.app.simplitend.patientprofile.medreminder.mvvm.models.NearestReminder;
import com.app.simplitend.patientprofile.medreminder.mvvm.models.ReminderResult;
import com.app.simplitend.patientprofile.setuproutine.mvvm.RoutineDetails;
import com.app.simplitend.welcome.welcomepatient.mvvm.models.CallResponse;
import com.app.simplitend.welcome.welcomepatient.mvvm.models.PatientData;
import com.google.android.gms.location.FusedLocationProviderClient;
import com.google.android.gms.location.Geofence;
import com.google.android.gms.location.GeofencingClient;
import com.google.android.gms.location.GeofencingRequest;
import com.google.android.gms.location.LocationRequest;
import com.google.android.gms.location.LocationServices;
import com.google.android.gms.maps.model.LatLng;
@@ -94,6 +99,35 @@ public class PatientMainViewModel extends ViewModel {
}
}
@RequiresPermission(Manifest.permission.ACCESS_FINE_LOCATION)
public void addLocationUpdates(Activity activity) {
Log.d(LOCATION_REQUEST_TAG, "REQUESTING LOCATION UPDATES");
FusedLocationProviderClient fusedLocationClient = LocationServices.getFusedLocationProviderClient(activity);
LocationRequest locationRequest = new LocationRequest();
locationRequest.setInterval(10_000);
locationRequest.setSmallestDisplacement(100);
locationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY);
Intent intent = new Intent(activity, PatientLocationUpdatesReceiver.class);
PendingIntent pendingIntent ;
if(Build.VERSION.SDK_INT > 30){
pendingIntent = PendingIntent.getBroadcast(activity, LOCATION_REQUEST_CODE, intent, PendingIntent.FLAG_UPDATE_CURRENT | PendingIntent.FLAG_MUTABLE);
} else{
pendingIntent = PendingIntent.getBroadcast(activity, LOCATION_REQUEST_CODE, intent, PendingIntent.FLAG_UPDATE_CURRENT);
}
fusedLocationClient.requestLocationUpdates(locationRequest, pendingIntent)
.addOnCompleteListener(task -> {
if (task.isSuccessful() && task.getException() == null){
Log.d(LOCATION_REQUEST_TAG, "LOCATION UPDATES ADDED");
}else{
Log.d(LOCATION_REQUEST_TAG, "CANNOT ADD LOCATION UPDATES " + task.getException());
}
});
}
public void getGeoFenceDetails(String p_id,
String cg_xid,
@NonNull String token,
@@ -405,7 +439,28 @@ public class PatientMainViewModel extends ViewModel {
}
}
public void contactWhiteList(Context context) {
public void updatePatientCurrentLocation(@NonNull LatLng latLng,
@NonNull String patient_id,
@NonNull String token){
PatientProfileAPIService apiService = RetrofitHelper.getRetrofit().create(PatientProfileAPIService.class);
Map<String, String> body = new HashMap<>();
body.put("patient_id", patient_id);
body.put("lat", latLng.latitude + "");
body.put("lng", latLng.longitude + "");
apiService.updatePatientCurrLocation(body, token)
.enqueue(new Callback<CallResponse<Object>>() {
@Override
public void onResponse(Call<CallResponse<Object>> call, Response<CallResponse<Object>> response) {
Log.d(TAG, "PATIENT CURRENT LOCATION UPDATED");
}
@Override
public void onFailure(Call<CallResponse<Object>> call, Throwable t) {
Log.e(TAG, "onFailure: PATIENT CURRENT LOCATION UPDATE", t);
}
});
}
}

View File

@@ -98,15 +98,37 @@ public class ChatFragment extends Fragment implements SocketHelper.Callback<Mess
return;
}
SocketHelper.getInstance().sendMessage(binding.messageEt.getText().toString().trim(), nick_name, patient_id);
binding.messageEt.setText("");
enableDenButton(false);
if (SocketHelper.getInstance().isConnected()) {
SocketHelper.getInstance().sendMessage(binding.messageEt.getText().toString().trim(), nick_name, patient_id);
binding.messageEt.setText("");
enableDenButton(false);
} else {
Toast.makeText(requireContext(), "Check internet connection", Toast.LENGTH_SHORT).show();
}
});
}
private void initViews() {
try {
try {
int res = Integer.parseInt(receiver_image);
binding.receiverImage.setImageResource(res);
}catch (Exception e){
if (receiver_image != null){
Glide.with(requireContext())
.load(receiver_image)
.placeholder(android.R.color.darker_gray)
.error(R.drawable.ic_contact)
.into(binding.receiverImage);
}
}
}catch (Exception e){
// do nothing
binding.receiverImage.setImageResource(R.drawable.ic_contact);
}
binding.chatTitle.setText(receiver_name);
MessagesListAdapter.HoldersConfig holdersConfig = new MessagesListAdapter.HoldersConfig();
@@ -152,6 +174,7 @@ public class ChatFragment extends Fragment implements SocketHelper.Callback<Mess
if (messageAdapter == null) return;
messageAdapter.addToStart(message, true);
binding.noChats.setVisibility(View.GONE);
});
}

View File

@@ -27,6 +27,7 @@ public class ReceiverViewHolder extends MessagesListAdapter.OutcomingMessageView
super.onBind(message);
message_txt.setText(message.getText());
message_txt.setTextColor(Color.BLACK);
try {
try {
int res = Integer.parseInt(message.getUser().getAvatar());

View File

@@ -68,6 +68,10 @@ public class SocketHelper {
}
}
public boolean isConnected(){
return mSocket.connected();
}
public void closeConnection() {
if (mSocket.connected()) {
mSocket.disconnect();

View File

@@ -10,14 +10,11 @@ import static com.app.simplitend.patient_dashboard.NotificationsActivity.USER_TO
import static com.app.simplitend.patient_dashboard.fragments.CallsActivity.CALL_CONTACT_LIST_KEY;
import android.app.Activity;
import android.app.role.RoleManager;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.content.res.Resources;
import android.os.Bundle;
import android.telecom.TelecomManager;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
@@ -32,7 +29,6 @@ import androidx.navigation.Navigation;
import com.app.simplitend.R;
import com.app.simplitend.appblocking.FUAActivity;
import com.app.simplitend.apputils.AppUtil;
import com.app.simplitend.apputils.CaregiverDataCache;
import com.app.simplitend.apputils.Constants;
import com.app.simplitend.apputils.PatientDataCache;
import com.app.simplitend.caregiverdashboard.mvvm.CaregiverMainViewModel;
@@ -210,6 +206,8 @@ public class PatientDashboardFragment extends Fragment implements ProfileContrac
sender_image = AppUtil.IMAGE_BASE_URL + patientData.profile_photo;
}
patientData.caregiver_profile_photo = null;
String receiver_image;
if (patientData.caregiver_profile_photo == null){
receiver_image = String.valueOf(R.drawable.caregiver_img);

View File

@@ -0,0 +1,28 @@
package com.app.simplitend.patientgeofencing;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.location.Location;
import android.location.LocationManager;
import android.os.Bundle;
import android.util.Log;
import com.google.maps.model.LatLng;
public class PatientLocationUpdatesReceiver extends BroadcastReceiver {
public static final String LOCATION_REQUEST_TAG = "LOCATION_REQUEST_TAG";
private static final String LOCATION_EXTRA_KEY = "com.google.android.location.LOCATION";
@Override
public void onReceive(Context context, Intent intent) {
Log.d(LOCATION_REQUEST_TAG, "LOCATION UPDATE RECEIVED");
Location location = intent.getParcelableExtra(LOCATION_EXTRA_KEY);
if (location != null) {
Log.d(LOCATION_REQUEST_TAG, new LatLng(location.getLatitude(), location.getLongitude()).toString());
}else{
Log.e(LOCATION_REQUEST_TAG, "LOCATION RECEIVED IS NULL");
}
}
}

View File

@@ -75,4 +75,7 @@ public interface PatientProfileAPIService {
@Header("patientRoutineId") int patient_routine_id,
@Header("Authorization") String token);
@POST("api/patient-current-location-update")
Call<CallResponse<Object>> updatePatientCurrLocation(@Body Map<String, String> body,
@Header("Authorization") String token);
}

View File

@@ -122,6 +122,10 @@ public class AddReminderFragment extends Fragment implements CompoundButton.OnCh
getDate();
});
binding.removeDateBtn.setOnClickListener(v -> {
binding.getDate.setText(null);
});
binding.addReminder.setOnClickListener(v -> {
AppUtil.closeKeyboard(requireActivity());
@@ -356,10 +360,10 @@ public class AddReminderFragment extends Fragment implements CompoundButton.OnCh
binding.quantity.setError("Required");
}
if (binding.getDate.getText().toString().trim().isEmpty()) {
allOkay = false;
binding.getDate.setError("Required");
}
// if (binding.getDate.getText().toString().trim().isEmpty()) {
// allOkay = false;
// binding.getDate.setError("Required");
// }
if (allOkay) {
boolean anyOneSelected = false;

View File

@@ -258,11 +258,6 @@ public class AddRoutineFragment extends Fragment implements CompoundButton.OnChe
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");

View File

@@ -110,20 +110,7 @@ public class CgAuthActivity extends AppCompatActivity {
@Override
public void afterTextChanged(Editable editable) {
if (editable.length() == 4) {
AppUtil.closeKeyboard(CgAuthActivity.this);
if (editable.toString().equals("0000")) {
gotoCgDash();
} else {
YoYo.with(Techniques.Wobble)
.playOn(binding.pin);
binding.pin.setError("Invalid pin.");
binding.pin.setText(null);
}
}
}
});
@@ -184,7 +171,6 @@ public class CgAuthActivity extends AppCompatActivity {
break;
case BiometricManager.BIOMETRIC_SUCCESS:
case BiometricManager.BIOMETRIC_ERROR_NONE_ENROLLED:
binding.fingerprintOr.setVisibility(View.VISIBLE);
binding.fingerprintView.setVisibility(View.VISIBLE);
break;
}

View File

@@ -157,6 +157,7 @@ public class CreateContactFragment extends Fragment implements WelcomeContracts.
getString(R.string.yes), getString(R.string.no),
v -> {
}, v -> {
binding.sosCheck.setChecked(true);
});
}
});