From ede01c7d27423df527b09580ae19a588797267af Mon Sep 17 00:00:00 2001 From: Aditya_WDI Date: Tue, 10 Oct 2023 21:04:08 +0530 Subject: [PATCH] . --- app/build.gradle | 5 + app/src/main/AndroidManifest.xml | 1 + .../activities/CgProfileProgressActivity.java | 49 +++++++- .../PatientMainViewModel.java | 2 +- .../patient_dashboard/chats/ChatFragment.java | 57 +++++++-- .../patient_dashboard/chats/SocketHelper.java | 110 ++++++++++++++++++ .../fragments/CgRegisterFragment.java | 5 +- .../contacts/AddContactFragment.java | 17 +-- .../contacts/CreateContactFragment.java | 18 +-- .../fragments/register/RegisterFragment.java | 5 +- .../layout/activity_cg_profile_progress.xml | 1 + 11 files changed, 235 insertions(+), 35 deletions(-) create mode 100644 app/src/main/java/com/app/simplitend/patient_dashboard/chats/SocketHelper.java diff --git a/app/build.gradle b/app/build.gradle index 7ebab15..d0d228e 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -41,6 +41,11 @@ dependencies { // This is due to new api's in java which are not available in android's lower version coreLibraryDesugaring 'com.android.tools:desugar_jdk_libs:2.0.3' + // socket IO for chat + implementation ('io.socket:socket.io-client:1.0.0') { + exclude group: 'org.json', module: 'json' + } + implementation 'com.google.firebase:firebase-crashlytics:18.3.2' implementation 'com.google.firebase:firebase-analytics:21.2.0' diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 72e1ad2..8c51482 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -26,6 +26,7 @@ android:allowBackup="true" android:dataExtractionRules="@xml/data_extraction_rules" android:fullBackupContent="@xml/backup_rules" + android:usesCleartextTraffic="true" android:icon="@mipmap/ic_launcher" android:label="@string/app_name" android:requestLegacyExternalStorage="true" diff --git a/app/src/main/java/com/app/simplitend/caregiverdashboard/activities/CgProfileProgressActivity.java b/app/src/main/java/com/app/simplitend/caregiverdashboard/activities/CgProfileProgressActivity.java index 5f881fe..cf0597c 100644 --- a/app/src/main/java/com/app/simplitend/caregiverdashboard/activities/CgProfileProgressActivity.java +++ b/app/src/main/java/com/app/simplitend/caregiverdashboard/activities/CgProfileProgressActivity.java @@ -1,5 +1,6 @@ package com.app.simplitend.caregiverdashboard.activities; +import android.app.ProgressDialog; import android.content.Intent; import android.os.Bundle; import android.os.Handler; @@ -7,7 +8,12 @@ import android.view.View; import android.widget.Toast; import androidx.appcompat.app.AppCompatActivity; +import androidx.lifecycle.ViewModelProvider; +import com.app.simplitend.apputils.AppUtil; +import com.app.simplitend.caregiverdashboard.mvvm.CaregiverMainViewModel; +import com.app.simplitend.caregiverdashboard.mvvm.CgHomeContracts; +import com.app.simplitend.caregiverdashboard.mvvm.models.GeoFenceDetails; import com.bumptech.glide.Glide; import com.app.simplitend.R; import com.app.simplitend.apputils.CaregiverDataCache; @@ -16,20 +22,28 @@ import com.app.simplitend.databinding.ActivityCgProfileProgressBinding; import com.app.simplitend.welcome.welcomecg.mvvm.CareGiverData; import static com.app.simplitend.caregiverdashboard.activities.PatientProfileShowerActivity.*; +import static com.app.simplitend.cg_geofencing.CgGeoFencingActivity.GEOFENCE_DETAILS_KEY; -public class CgProfileProgressActivity extends AppCompatActivity { +public class CgProfileProgressActivity extends AppCompatActivity implements CgHomeContracts.GetGeoFenceCallback { // view binding protected ActivityCgProfileProgressBinding binding; private CareGiverData careGiverData; + private CaregiverMainViewModel viewModel; + + private ProgressDialog progressDialog; + @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); binding = ActivityCgProfileProgressBinding.inflate(getLayoutInflater()); setContentView(binding.getRoot()); + viewModel = new ViewModelProvider(this).get(CaregiverMainViewModel.class); + progressDialog = new ProgressDialog(this); + startAnimation(); new Handler().postDelayed(() -> { @@ -68,8 +82,15 @@ public class CgProfileProgressActivity extends AppCompatActivity { }); binding.geoFencing.setOnClickListener(v -> { - Intent intent = new Intent(this, CgGeoFencingActivity.class); - startActivity(intent); + progressDialog.setTitle("please wait..."); + progressDialog.setMessage("while we load GeoFence."); + progressDialog.setCancelable(false); + progressDialog.show(); + + viewModel.getGeoFenceDetails("", + careGiverData.caregiver_xid + "", + "Bearer " + AppUtil.getCgToken(this), + this); }); binding.medicReminder.setOnClickListener(v -> { @@ -104,4 +125,26 @@ public class CgProfileProgressActivity extends AppCompatActivity { intent.putExtra(WHICH_FRAGMENT, which_f); startActivity(intent); } + + @Override + public void onGeofenceDetailsFetched(GeoFenceDetails geoFenceDetails) { + progressDialog.dismiss(); + try { + Intent intent = new Intent(this, CgGeoFencingActivity.class); + intent.putExtra(GEOFENCE_DETAILS_KEY, geoFenceDetails); + startActivity(intent); + } catch (Exception e) { + // do nothing + } + } + + @Override + public void onGeofenceDetailsFetchFailed(Throwable throwable, String message) { + progressDialog.dismiss(); + try { + Toast.makeText(this, message, Toast.LENGTH_SHORT).show(); + } catch (Exception e) { + // do nothing + } + } } \ No newline at end of file diff --git a/app/src/main/java/com/app/simplitend/patient_dashboard/PatientMainViewModel.java b/app/src/main/java/com/app/simplitend/patient_dashboard/PatientMainViewModel.java index 1da36c7..eb806f5 100644 --- a/app/src/main/java/com/app/simplitend/patient_dashboard/PatientMainViewModel.java +++ b/app/src/main/java/com/app/simplitend/patient_dashboard/PatientMainViewModel.java @@ -113,7 +113,7 @@ public class PatientMainViewModel extends ViewModel { if (ContextCompat.checkSelfPermission(activity, Manifest.permission.ACCESS_BACKGROUND_LOCATION) != PackageManager.PERMISSION_GRANTED) { Log.d(GEOFENCE_TAG, "setGeofence: REQUESTING BACKGROUND LOCATION PERMISSION" ); AppUtil.showSOSDecision(activity, - "Testing content\nWe understand your privacy.\nTo enable Geofencing we need to access your location while the app is closed.\nKindly click on the Settings button below and select \"Allow all the time\"", + "To enable caregivers to receive notifications even when the app is closed, go to the settings menu and select allow all the time", "Settings", "No thanks", view -> { // No thanks click ActivityCompat.requestPermissions(activity, new String[]{Manifest.permission.ACCESS_BACKGROUND_LOCATION}, LOCATION_REQUEST_CODE); diff --git a/app/src/main/java/com/app/simplitend/patient_dashboard/chats/ChatFragment.java b/app/src/main/java/com/app/simplitend/patient_dashboard/chats/ChatFragment.java index d53323b..870b81a 100644 --- a/app/src/main/java/com/app/simplitend/patient_dashboard/chats/ChatFragment.java +++ b/app/src/main/java/com/app/simplitend/patient_dashboard/chats/ChatFragment.java @@ -1,6 +1,7 @@ package com.app.simplitend.patient_dashboard.chats; import android.os.Bundle; +import android.util.Log; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; @@ -10,20 +11,24 @@ import androidx.annotation.Nullable; import androidx.fragment.app.Fragment; import com.app.simplitend.R; +import com.app.simplitend.databinding.ChatFragmentBinding; import com.app.simplitend.patient_dashboard.chats.mvvm.Author; import com.app.simplitend.patient_dashboard.chats.mvvm.Message; import com.app.simplitend.patient_dashboard.chats.mvvm.Receiver; -import com.app.simplitend.databinding.ChatFragmentBinding; import com.stfalcon.chatkit.messages.MessagesListAdapter; -public class ChatFragment extends Fragment { +import io.socket.emitter.Emitter; + +public class ChatFragment extends Fragment implements Emitter.Listener { + + private static final String TAG = "SOCKET_CHAT_TAG"; // view binding protected ChatFragmentBinding binding; public static final String CHAT_ITEM_KEY = "chat_item_key"; - private MessagesListAdapter messageAdapter; + protected MessagesListAdapter messageAdapter; public ChatFragment() { // required @@ -34,7 +39,27 @@ public class ChatFragment extends Fragment { public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { binding = ChatFragmentBinding.inflate(inflater, container, false); - socketConnection(); + SocketHelper socketHelper = SocketHelper.getInstance(); + socketHelper.establishConnection(); + + socketHelper.joinChatRoom("BILAL", new Runnable() { + @Override + public void run() { + Log.d(TAG, "ROOM JOINED AS BILAL"); + } + }); + + socketHelper.getMessage(new SocketHelper.Callback() { + @Override + public void onSuccess(Object result) { + + } + + @Override + public void onError(Exception e) { + + } + }); initViews(); @@ -43,8 +68,16 @@ public class ChatFragment extends Fragment { return binding.getRoot(); } - private void socketConnection() { - + @Override + public void onDestroyView() { + super.onDestroyView(); + SocketHelper.getInstance().closeConnection(); + SocketHelper.getInstance().leaveChatRoom("BILAL", new Runnable() { + @Override + public void run() { + Log.d(TAG, "LEAVED ROOM AS ADITYA"); + } + }); } private void clickEvents() { @@ -55,17 +88,14 @@ public class ChatFragment extends Fragment { }); binding.sendBtn.setOnClickListener(v -> { - if (!binding.messageEt.getText().toString().trim().isEmpty()){ - messageAdapter.addToStart(new Message(new Author(), binding.messageEt.getText().toString().trim()), true); - binding.messageEt.setText(null); - } + SocketHelper.getInstance().sendMessage("Hi there", "Bilal"); }); } private void initViews() { - binding.chatTitle.setText("Aditya"); + binding.chatTitle.setText("BILAL"); MessagesListAdapter.HoldersConfig holdersConfig = new MessagesListAdapter.HoldersConfig(); holdersConfig.setOutcomingLayout(R.layout.sender_msg_viewholder); @@ -85,4 +115,9 @@ public class ChatFragment extends Fragment { messageAdapter.addToStart(new Message(new Author(), "Good morning"), true); messageAdapter.addToStart(new Message(new Receiver(), "Good morning mate!"), true); } + + @Override + public void call(Object... args) { + Log.d(TAG, "call: " + args); + } } \ No newline at end of file diff --git a/app/src/main/java/com/app/simplitend/patient_dashboard/chats/SocketHelper.java b/app/src/main/java/com/app/simplitend/patient_dashboard/chats/SocketHelper.java new file mode 100644 index 0000000..aac6ce7 --- /dev/null +++ b/app/src/main/java/com/app/simplitend/patient_dashboard/chats/SocketHelper.java @@ -0,0 +1,110 @@ +package com.app.simplitend.patient_dashboard.chats; + +import android.util.Log; + +import org.json.JSONArray; + +import io.socket.client.IO; +import io.socket.client.Socket; +import io.socket.emitter.Emitter; + +public class SocketHelper { + + private static final String TAG = "SOCKET_CHAT_TAG"; + + private static final String kHost = "http://77.68.102.23:3002/"; + private static final String kConnectUser = "connectUser"; + private static final String kUserList = "userList"; + private static final String kExitUser = "exitUser"; + + private static SocketHelper instance; + private Socket mSocket; + + private SocketHelper() { + try { + IO.Options options = new IO.Options(); + options.forceNew = true; + options.reconnection = true; + mSocket = IO.socket(kHost, options); + + mSocket.on(Socket.EVENT_CONNECT, new Emitter.Listener() { + @Override + public void call(Object... args) { + Log.d(TAG, "Socket connected "); + } + }); + + mSocket.on(Socket.EVENT_DISCONNECT, new Emitter.Listener() { + @Override + public void call(Object... args) { + Log.d(TAG, "Socket disconnected "); + } + }); + + mSocket.on(Socket.EVENT_CONNECT_ERROR, new Emitter.Listener() { + @Override + public void call(Object... args) { + Exception e = (Exception) args[0]; + Log.e(TAG, "call: ", e); + } + }); + } catch (Exception e) { + e.printStackTrace(); + Log.e(TAG, "SocketHelper: ", e); + } + } + + public static synchronized SocketHelper getInstance() { + if (instance == null) { + instance = new SocketHelper(); + } + return instance; + } + + public void establishConnection() { + if (!mSocket.connected()) { + mSocket.connect(); + } + } + + public void closeConnection() { + if (mSocket.connected()) { + mSocket.disconnect(); + } + } + + public void joinChatRoom(String nickname, final Runnable completion) { + mSocket.emit(kConnectUser, nickname); + completion.run(); + } + + public void leaveChatRoom(String nickname, final Runnable completion) { + mSocket.emit(kExitUser, nickname); + completion.run(); + } + + public void getMessage(final Callback callback) { + mSocket.on("newChatMessage", new Emitter.Listener() { + @Override + public void call(Object... args) { + if (args.length >= 3) { + String nickName = (String) args[0]; + String message = (String) args[1]; + String date = (String) args[2]; + + Log.d(TAG, " Message received " + message); + } + } + }); + } + + public void sendMessage(String message, String nickname) { + mSocket.emit("chatMessage", nickname, message); + } + + public interface Callback { + void onSuccess(T result); + void onError(Exception e); + } +} + diff --git a/app/src/main/java/com/app/simplitend/welcome/welcomecg/fragments/CgRegisterFragment.java b/app/src/main/java/com/app/simplitend/welcome/welcomecg/fragments/CgRegisterFragment.java index 6b07e18..35c71af 100644 --- a/app/src/main/java/com/app/simplitend/welcome/welcomecg/fragments/CgRegisterFragment.java +++ b/app/src/main/java/com/app/simplitend/welcome/welcomecg/fragments/CgRegisterFragment.java @@ -217,9 +217,8 @@ public class CgRegisterFragment extends Fragment implements WelcomeContracts.Reg }); binding.tncBtn.setOnClickListener(v -> { - Intent intent = new Intent(Intent.ACTION_VIEW); - intent.setData(Uri.parse(getString(R.string.terms_n_conditions_link))); - startActivity(intent); + AppUtil.openLink(requireActivity(), getString(R.string.terms_n_conditions_link), + getString(R.string.terms_conditions_)); }); binding.pwdInfo.setOnClickListener(v -> { diff --git a/app/src/main/java/com/app/simplitend/welcome/welcomepatient/fragments/contacts/AddContactFragment.java b/app/src/main/java/com/app/simplitend/welcome/welcomepatient/fragments/contacts/AddContactFragment.java index 51b5115..707cad4 100644 --- a/app/src/main/java/com/app/simplitend/welcome/welcomepatient/fragments/contacts/AddContactFragment.java +++ b/app/src/main/java/com/app/simplitend/welcome/welcomepatient/fragments/contacts/AddContactFragment.java @@ -155,16 +155,19 @@ public class AddContactFragment extends Fragment implements WelcomeContracts.Con @Override public void onContactClick(ContactData contactData, int position) { - if (contacts_count == 9 && !is_doctor_set){ - // last contact to be added - // and doctor not yet set - Toast.makeText(requireContext(), "Contact is reserved for doctor, Please add medical information.", Toast.LENGTH_SHORT).show(); - return; - } - if (contactData.id == -1){ // a new contact should be added + if (contacts_count == 9 && !is_doctor_set){ + // last contact to be added + // and doctor not yet set + AppUtil.showAlert(requireContext(), + "This contact is reserved", + "Contact is reserved for your primary doctor, Please add medical information.", + getString(R.string.ok), ((dialogInterface, i) -> {}), null, null); + return; + } + AppUtil.showAlert(requireContext(), "Select contact", "Add from contacts or manually?", diff --git a/app/src/main/java/com/app/simplitend/welcome/welcomepatient/fragments/contacts/CreateContactFragment.java b/app/src/main/java/com/app/simplitend/welcome/welcomepatient/fragments/contacts/CreateContactFragment.java index c5bab04..3c580a3 100644 --- a/app/src/main/java/com/app/simplitend/welcome/welcomepatient/fragments/contacts/CreateContactFragment.java +++ b/app/src/main/java/com/app/simplitend/welcome/welcomepatient/fragments/contacts/CreateContactFragment.java @@ -27,12 +27,6 @@ import androidx.fragment.app.FragmentManager; import androidx.lifecycle.ViewModelProvider; import androidx.navigation.Navigation; -import com.bumptech.glide.Glide; -import com.github.dhaval2404.imagepicker.ImagePicker; -import com.google.android.material.bottomsheet.BottomSheetDialog; -import com.google.i18n.phonenumbers.PhoneNumberUtil; -import com.google.i18n.phonenumbers.Phonenumber; -import com.skydoves.powerspinner.PowerSpinnerView; import com.app.simplitend.R; import com.app.simplitend.apputils.AppUtil; import com.app.simplitend.databinding.CreateContactViewHolderBinding; @@ -42,6 +36,12 @@ import com.app.simplitend.welcome.welcomepatient.fragments.contacts.mvvm.Contact import com.app.simplitend.welcome.welcomepatient.fragments.contacts.mvvm.models.ContactData; import com.app.simplitend.welcome.welcomepatient.fragments.contacts.mvvm.models.ContactListResponse; import com.app.simplitend.welcome.welcomepatient.mvvm.WelcomeContracts; +import com.bumptech.glide.Glide; +import com.github.dhaval2404.imagepicker.ImagePicker; +import com.google.android.material.bottomsheet.BottomSheetDialog; +import com.google.i18n.phonenumbers.PhoneNumberUtil; +import com.google.i18n.phonenumbers.Phonenumber; +import com.skydoves.powerspinner.PowerSpinnerView; import java.io.File; import java.util.ArrayList; @@ -199,7 +199,11 @@ public class CreateContactFragment extends Fragment implements WelcomeContracts. String[] phone_numbers = getAllPhoneNumbers(); if (!phone_numbers[3].equals("0")) { - Toast.makeText(requireContext(), "Please select a default contact.", Toast.LENGTH_SHORT).show(); + AppUtil.showAlert(requireContext(), + "Select a default number", + "Your contact has multiple phone numbers. Please set one as the default. All numbers will be saved in the contact, and you will still be able to access them.", + getString(R.string.ok), + (dialogInterface, i) -> {}, null, null); return; } diff --git a/app/src/main/java/com/app/simplitend/welcome/welcomepatient/fragments/register/RegisterFragment.java b/app/src/main/java/com/app/simplitend/welcome/welcomepatient/fragments/register/RegisterFragment.java index 697f1be..4ae193f 100644 --- a/app/src/main/java/com/app/simplitend/welcome/welcomepatient/fragments/register/RegisterFragment.java +++ b/app/src/main/java/com/app/simplitend/welcome/welcomepatient/fragments/register/RegisterFragment.java @@ -228,9 +228,8 @@ public class RegisterFragment extends Fragment implements WelcomeContracts.Verif }); binding.tncBtn.setOnClickListener(v -> { - Intent intent = new Intent(Intent.ACTION_VIEW); - intent.setData(Uri.parse(getString(R.string.terms_n_conditions_link))); - startActivity(intent); + AppUtil.openLink(requireActivity(), getString(R.string.terms_n_conditions_link), + getString(R.string.terms_conditions_)); }); } diff --git a/app/src/main/res/layout/activity_cg_profile_progress.xml b/app/src/main/res/layout/activity_cg_profile_progress.xml index 4e5439a..5deaefd 100644 --- a/app/src/main/res/layout/activity_cg_profile_progress.xml +++ b/app/src/main/res/layout/activity_cg_profile_progress.xml @@ -495,6 +495,7 @@