diff --git a/app/build.gradle b/app/build.gradle
index 10c8a2c..c92aede 100644
--- a/app/build.gradle
+++ b/app/build.gradle
@@ -102,6 +102,9 @@ dependencies {
// biometrics
implementation "androidx.biometric:biometric:1.1.0"
+ // Stripe Android SDK
+ implementation 'com.stripe:stripe-android:20.28.0'
+
implementation 'androidx.appcompat:appcompat:1.6.0'
implementation 'com.google.android.material:material:1.8.0'
implementation 'androidx.constraintlayout:constraintlayout:2.1.4'
diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index 57e9678..9799ec4 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -67,6 +67,15 @@
android:value="" />
+
+
+
+
+
subscriptionPlans;
+
+ private ProgressDialog progressDialog;
+
+ private SubscriptionPresenter presenter;
+
+ private PaymentSheet paymentSheet;
+
+ @Override
+ protected void onCreate(@Nullable Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ binding = CgSubscriptionLayoutBinding.inflate(getLayoutInflater());
+ setContentView(binding.getRoot());
+
+ presenter = SubscriptionPresenter.getPresenter();
+
+ initViews();
+
+ clickEvents();
+
+ }
+
+ private void clickEvents() {
+ binding.makePayment.setOnClickListener(view -> {
+ payForSubscription();
+ });
+ }
+
+ private void payForSubscription() {
+ int position = binding.viewPager.getCurrentItem();
+ if (subscriptionPlans == null || position < 0 || position >= subscriptionPlans.size()){
+ Toast.makeText(this, "Couldn't load plan.", Toast.LENGTH_SHORT).show();
+ return;
+ }
+
+ progressDialog.setTitle("Please wait...");
+ progressDialog.setMessage("while we take you to the payment gateway.");
+ progressDialog.setCancelable(false);
+ progressDialog.show();
+
+ SubscriptionPlan plan = subscriptionPlans.get(position);
+
+ Map body = new HashMap<>();
+
+ RequestBody name_body = RequestBody.create("Aditya Gaikwad", MediaType.parse("text/plain"));
+ body.put("name", name_body);
+
+ RequestBody email_body = RequestBody.create("test@gmail.com", MediaType.parse("text/plain"));
+ body.put("email", email_body);
+
+ RequestBody price_body = RequestBody.create("595", MediaType.parse("text/plain"));
+ body.put("price", price_body);
+
+ RequestBody subscription_xid_body = RequestBody.create("4", MediaType.parse("text/plain"));
+ body.put("subscription_xid", subscription_xid_body);
+
+ RequestBody caregiver_xid_body = RequestBody.create("4", MediaType.parse("text/plain"));
+ body.put("caregiver_xid", caregiver_xid_body);
+
+ String token = "Bearer " + AppUtil.getCgToken(this);
+
+ presenter.getPaymentCred(token, body, this);
+
+ }
+
+ private void initViews() {
+ binding.viewPager.registerOnPageChangeCallback(new ViewPager2.OnPageChangeCallback() {
+ @Override
+ public void onPageSelected(int position) {
+ super.onPageSelected(position);
+ if (subscriptionPlans == null
+ || position < 0 || position >= subscriptionPlans.size()) return;
+
+ String btn_text = "Make payment $" + subscriptionPlans.get(position).plan_value;
+ binding.makePayment.setText(btn_text);
+ }
+ });
+
+ // loading subscription plans
+ progressDialog = new ProgressDialog(this);
+
+ progressDialog.setTitle("Please wait....");
+ progressDialog.setMessage("while we fetch subscription plans for you.");
+ progressDialog.setCancelable(false);
+ progressDialog.show();
+
+
+ String token = "Bearer " + AppUtil.getCgToken(this);
+ presenter.getSubscriptionPlans(token, this);
+
+ paymentSheet = new PaymentSheet(this, this::onPaymentSheetResult);
+ }
+
+ // payment callback
+ public void onPaymentSheetResult(final PaymentSheetResult paymentSheetResult) {
+ // implemented in the next steps
+ if (paymentSheetResult instanceof PaymentSheetResult.Canceled) {
+ Toast.makeText(this, "Payment canceled.", Toast.LENGTH_SHORT).show();
+ } else if (paymentSheetResult instanceof PaymentSheetResult.Failed) {
+ Log.e(TAG, "Got error: ", ((PaymentSheetResult.Failed) paymentSheetResult).getError());
+ Toast.makeText(this, "Payment failed.", Toast.LENGTH_SHORT).show();
+ } else if (paymentSheetResult instanceof PaymentSheetResult.Completed) {
+ // Display for example, an order confirmation screen
+ Log.d(TAG, "Completed");
+ Toast.makeText(this, "Payment successful.", Toast.LENGTH_SHORT).show();
+ }
+
+ }
+
+ // get payment credentials callback
+ @Override
+ public void onPaymentCredFetched(SubscriptionCredentials credentials) {
+ if (credentials == null){
+ progressDialog.dismiss();
+ Toast.makeText(this, "Something went wrong.", Toast.LENGTH_SHORT).show();
+ return;
+ }
+
+ final PaymentSheet.CustomerConfiguration customerConfig = new PaymentSheet.CustomerConfiguration(
+ credentials.customerId,
+ credentials.ephemeralKey
+ );
+ String paymentIntentClientSecret = credentials.paymentIntent;
+ PaymentConfiguration.init(getApplicationContext(), credentials.stripe_publish_key);
+
+ // dismissing dialog now
+ progressDialog.dismiss();
+
+ final PaymentSheet.Configuration configuration = new PaymentSheet.Configuration.Builder("SimpliTend")
+ .customer(customerConfig)
+ .allowsDelayedPaymentMethods(true)
+ .build();
+ paymentSheet.presentWithPaymentIntent(
+ paymentIntentClientSecret,
+ configuration
+ );
+
+ }
+
+ @Override
+ public void onPaymentCredFetchFailed(Throwable throwable, String message) {
+ progressDialog.dismiss();
+ Toast.makeText(this, "" + message, Toast.LENGTH_SHORT).show();
+ }
+
+ @Override
+ public void onSubscriptionFetched(ArrayList subscriptionPlans) {
+ this.subscriptionPlans = subscriptionPlans;
+ progressDialog.dismiss();
+
+ // loading plans
+ PlanAdapter planAdapter = new PlanAdapter(subscriptionPlans);
+ binding.viewPager.setAdapter(planAdapter);
+ binding.circleIndicator.setViewPager(binding.viewPager);
+ }
+
+ @Override
+ public void onSubsFetchFailed(Throwable t, String message) {
+ progressDialog.dismiss();
+ Toast.makeText(this, "" + message, Toast.LENGTH_SHORT).show();
+ }
+}
diff --git a/app/src/main/java/com/ssb/simplitend/cg_subscription/PlanAdapter.java b/app/src/main/java/com/ssb/simplitend/cg_subscription/PlanAdapter.java
new file mode 100644
index 0000000..61d0183
--- /dev/null
+++ b/app/src/main/java/com/ssb/simplitend/cg_subscription/PlanAdapter.java
@@ -0,0 +1,71 @@
+package com.ssb.simplitend.cg_subscription;
+
+import android.view.LayoutInflater;
+import android.view.ViewGroup;
+
+import androidx.annotation.NonNull;
+import androidx.recyclerview.widget.RecyclerView;
+
+import com.ssb.simplitend.R;
+import com.ssb.simplitend.databinding.SubscriptionViewholderBinding;
+
+import java.util.ArrayList;
+
+public class PlanAdapter extends RecyclerView.Adapter{
+
+ private final ArrayList subscriptionPlans;
+
+ public PlanAdapter(@NonNull ArrayList subscriptionPlans) {
+ this.subscriptionPlans = subscriptionPlans;
+ }
+
+ @NonNull
+ @Override
+ public PlanViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
+ SubscriptionViewholderBinding binding = SubscriptionViewholderBinding.inflate(
+ LayoutInflater.from(parent.getContext()),
+ parent,
+ false
+ );
+ return new PlanViewHolder(binding);
+ }
+
+ @Override
+ public void onBindViewHolder(@NonNull PlanViewHolder holder, int position) {
+ holder.setData(subscriptionPlans.get(position), position);
+ }
+
+ @Override
+ public int getItemCount() {
+ return subscriptionPlans.size();
+ }
+
+ public static class PlanViewHolder extends RecyclerView.ViewHolder{
+
+ public SubscriptionViewholderBinding binding;
+
+ public PlanViewHolder(@NonNull SubscriptionViewholderBinding binding) {
+ super(binding.getRoot());
+ this.binding = binding;
+ }
+
+ public void setData(SubscriptionPlan subscriptionPlan, int position){
+ if (subscriptionPlan == null) return;
+
+ binding.planName.setText(subscriptionPlan.plan_name);
+
+ String price = "$" + subscriptionPlan.plan_value;
+ binding.planValue.setText(price);
+
+ switch (position){
+ case 0:
+ binding.image.setImageResource(R.drawable.ic_sub_1);
+ break;
+ case 1:
+ default:
+ binding.image.setImageResource(R.drawable.ic_sub_2);
+ }
+
+ }
+ }
+}
diff --git a/app/src/main/java/com/ssb/simplitend/cg_subscription/SubscriptionPlan.java b/app/src/main/java/com/ssb/simplitend/cg_subscription/SubscriptionPlan.java
new file mode 100644
index 0000000..49e1f70
--- /dev/null
+++ b/app/src/main/java/com/ssb/simplitend/cg_subscription/SubscriptionPlan.java
@@ -0,0 +1,23 @@
+package com.ssb.simplitend.cg_subscription;
+
+public class SubscriptionPlan{
+ public int id;
+ public String plan_name;
+ public String plan_value;
+ public String plan_details;
+ public String stripe_product_id;
+ public String stripe_price_id;
+ public String active;
+ public String deleted_at;
+ public String created_by;
+ public String updated_by;
+ public String created_at;
+ public String updated_at;
+
+ public SubscriptionPlan(){}
+
+ public SubscriptionPlan(String plan_name, String plan_value) {
+ this.plan_name = plan_name;
+ this.plan_value = plan_value;
+ }
+}
diff --git a/app/src/main/java/com/ssb/simplitend/cg_subscription/mvp/SubscriptionApiService.java b/app/src/main/java/com/ssb/simplitend/cg_subscription/mvp/SubscriptionApiService.java
new file mode 100644
index 0000000..edd538d
--- /dev/null
+++ b/app/src/main/java/com/ssb/simplitend/cg_subscription/mvp/SubscriptionApiService.java
@@ -0,0 +1,28 @@
+package com.ssb.simplitend.cg_subscription.mvp;
+
+import com.ssb.simplitend.cg_subscription.SubscriptionPlan;
+import com.ssb.simplitend.welcome.welcomepatient.mvvm.models.CallResponse;
+
+import java.util.ArrayList;
+import java.util.Map;
+
+import okhttp3.RequestBody;
+import retrofit2.Call;
+import retrofit2.http.GET;
+import retrofit2.http.Header;
+import retrofit2.http.Multipart;
+import retrofit2.http.POST;
+import retrofit2.http.PartMap;
+
+public interface SubscriptionApiService {
+
+ @GET("api/list-of-plans")
+ Call>> getSubscriptionPlans(@Header("Authorization") String token);
+
+ @Multipart
+ @POST("api/pay-subscription")
+ Call> paySubscription(
+ @Header("Authorization") String token,
+ @PartMap Map body);
+
+}
diff --git a/app/src/main/java/com/ssb/simplitend/cg_subscription/mvp/SubscriptionContracts.java b/app/src/main/java/com/ssb/simplitend/cg_subscription/mvp/SubscriptionContracts.java
new file mode 100644
index 0000000..75fe652
--- /dev/null
+++ b/app/src/main/java/com/ssb/simplitend/cg_subscription/mvp/SubscriptionContracts.java
@@ -0,0 +1,25 @@
+package com.ssb.simplitend.cg_subscription.mvp;
+
+import com.ssb.simplitend.cg_subscription.SubscriptionPlan;
+
+import java.util.ArrayList;
+
+public interface SubscriptionContracts {
+
+ interface GetSubPlansCallback{
+
+ void onSubscriptionFetched(ArrayList subscriptionPlans);
+
+ void onSubsFetchFailed(Throwable t, String message);
+
+ }
+
+ interface PaySubscriptionCallback{
+
+ void onPaymentCredFetched(SubscriptionCredentials credentials);
+
+ void onPaymentCredFetchFailed(Throwable throwable, String message);
+
+ }
+
+}
diff --git a/app/src/main/java/com/ssb/simplitend/cg_subscription/mvp/SubscriptionCredentials.java b/app/src/main/java/com/ssb/simplitend/cg_subscription/mvp/SubscriptionCredentials.java
new file mode 100644
index 0000000..e5861b7
--- /dev/null
+++ b/app/src/main/java/com/ssb/simplitend/cg_subscription/mvp/SubscriptionCredentials.java
@@ -0,0 +1,10 @@
+package com.ssb.simplitend.cg_subscription.mvp;
+
+public class SubscriptionCredentials{
+ public String customerId;
+ public String paymentIntent;
+ public String ephemeralKey;
+ public String stripe_publish_key;
+
+ public SubscriptionCredentials(){}
+}
diff --git a/app/src/main/java/com/ssb/simplitend/cg_subscription/mvp/SubscriptionPresenter.java b/app/src/main/java/com/ssb/simplitend/cg_subscription/mvp/SubscriptionPresenter.java
new file mode 100644
index 0000000..0b1427d
--- /dev/null
+++ b/app/src/main/java/com/ssb/simplitend/cg_subscription/mvp/SubscriptionPresenter.java
@@ -0,0 +1,89 @@
+package com.ssb.simplitend.cg_subscription.mvp;
+
+import androidx.annotation.NonNull;
+
+import com.ssb.simplitend.apputils.AppUtil;
+import com.ssb.simplitend.apputils.RetrofitHelper;
+import com.ssb.simplitend.cg_subscription.CgSubscriptionActivity;
+import com.ssb.simplitend.cg_subscription.SubscriptionPlan;
+import com.ssb.simplitend.welcome.welcomepatient.mvvm.models.CallResponse;
+
+import java.util.ArrayList;
+import java.util.Map;
+
+import okhttp3.RequestBody;
+import retrofit2.Call;
+import retrofit2.Callback;
+import retrofit2.Response;
+
+public class SubscriptionPresenter {
+
+ private static SubscriptionPresenter presenter;
+
+ private final SubscriptionApiService apiService;
+
+ private SubscriptionPresenter(){
+ apiService = RetrofitHelper.getRetrofit().create(SubscriptionApiService.class);
+ }
+
+ public static synchronized SubscriptionPresenter getPresenter(){
+ if (presenter == null){
+ presenter = new SubscriptionPresenter();
+ }
+
+ return presenter;
+ }
+
+ public void getSubscriptionPlans(@NonNull String token, @NonNull SubscriptionContracts.GetSubPlansCallback subPlansCallback){
+ apiService.getSubscriptionPlans(token)
+ .enqueue(new Callback>>() {
+ @Override
+ public void onResponse(Call>> call, Response>> response) {
+ if (response.body() != null){
+ if (response.body().status != 200 || response.body().result == null){
+ subPlansCallback.onSubsFetchFailed(new Exception(), response.body().message);
+ return;
+ }
+
+ subPlansCallback.onSubscriptionFetched(response.body().result);
+ }else{
+ subPlansCallback.onSubsFetchFailed(new Exception(), "Please try again later.");
+ }
+ }
+
+ @Override
+ public void onFailure(Call>> call, Throwable t) {
+ subPlansCallback.onSubsFetchFailed(new Exception(), "Please try again later.");
+ }
+ });
+ }
+
+ public void getPaymentCred(@NonNull String token,
+ Map body,
+ @NonNull SubscriptionContracts.PaySubscriptionCallback paySubscriptionCallback){
+
+ apiService.paySubscription(token, body)
+ .enqueue(new Callback>() {
+ @Override
+ public void onResponse(Call> call, Response> response) {
+ if (response.body() != null){
+ if (response.body().status != 200 || response.body().result == null){
+ paySubscriptionCallback.onPaymentCredFetchFailed(new Exception(), response.body().message);
+ return;
+ }
+
+ paySubscriptionCallback.onPaymentCredFetched(response.body().result);
+ }else{
+ paySubscriptionCallback.onPaymentCredFetchFailed(new Exception(), "Please try again later.");
+ }
+ }
+
+ @Override
+ public void onFailure(Call> call, Throwable t) {
+ paySubscriptionCallback.onPaymentCredFetchFailed(new Exception(), "Please try again later.");
+ }
+ });
+
+ }
+
+}
diff --git a/app/src/main/java/com/ssb/simplitend/welcome/welcomepatient/fragments/SignInFragment.java b/app/src/main/java/com/ssb/simplitend/welcome/welcomepatient/fragments/SignInFragment.java
index 61129de..4a8103b 100644
--- a/app/src/main/java/com/ssb/simplitend/welcome/welcomepatient/fragments/SignInFragment.java
+++ b/app/src/main/java/com/ssb/simplitend/welcome/welcomepatient/fragments/SignInFragment.java
@@ -15,6 +15,7 @@ import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.fragment.app.Fragment;
import androidx.lifecycle.ViewModelProvider;
+import androidx.navigation.NavOptions;
import androidx.navigation.Navigation;
import com.ssb.simplitend.R;
@@ -159,10 +160,17 @@ public class SignInFragment extends Fragment implements WelcomeContracts.Registe
Toast.makeText(requireContext(), "Log in successful.", Toast.LENGTH_SHORT).show();
- Intent intent = new Intent(requireActivity(), DashBoardActivity.class);
- intent.setFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);
- startActivity(intent);
- requireActivity().finish();
+ if (patientResult.patientData != null){
+ if (patientResult.patientData.isCareGiverLink == 1){
+ gotoProfileProgress();
+ return;
+ }
+ }
+
+ // no patient data or no caregiver contact yet added thus sending to contactlist
+ gotoContactList();
+
+ // TODO: 09-08-2023 don't do anything further more.
}
@Override
@@ -177,4 +185,23 @@ public class SignInFragment extends Fragment implements WelcomeContracts.Registe
dialog.dismiss();
}), null, null);
}
-}
+
+ private void gotoProfileProgress(){
+ NavOptions navOptions = new NavOptions.Builder()
+ .setPopUpTo(R.id.signInFragment, true)
+ .build();
+
+ Navigation.findNavController(binding.getRoot())
+ .navigate(R.id.action_signInFragment_to_profileProgressFragment, null, navOptions);
+ }
+
+ private void gotoContactList(){
+ NavOptions navOptions = new NavOptions.Builder()
+ .setPopUpTo(R.id.welcomeFragment, true)
+ .build();
+
+ Navigation.findNavController(binding.getRoot())
+ .navigate(R.id.action_signInFragment_to_contactListFragment, null, navOptions);
+ }
+
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/ssb/simplitend/welcome/welcomepatient/fragments/contacts/ContactListFragment.java b/app/src/main/java/com/ssb/simplitend/welcome/welcomepatient/fragments/contacts/ContactListFragment.java
index 0882a30..f21afa1 100644
--- a/app/src/main/java/com/ssb/simplitend/welcome/welcomepatient/fragments/contacts/ContactListFragment.java
+++ b/app/src/main/java/com/ssb/simplitend/welcome/welcomepatient/fragments/contacts/ContactListFragment.java
@@ -69,10 +69,7 @@ public class ContactListFragment extends Fragment {
private void clickEvents() {
binding.backBtn.setOnClickListener(v -> {
- if (Navigation.findNavController(v).getPreviousBackStackEntry() != null){
- Navigation.findNavController(v).popBackStack();
- Toast.makeText(requireContext(), "Back done", Toast.LENGTH_SHORT).show();
- }
+ requireActivity().onBackPressed();
});
binding.createContact.setOnClickListener(v ->
diff --git a/app/src/main/java/com/ssb/simplitend/welcome/welcomepatient/fragments/register/SplashFragment.java b/app/src/main/java/com/ssb/simplitend/welcome/welcomepatient/fragments/register/SplashFragment.java
index 2ed6073..c5d7051 100644
--- a/app/src/main/java/com/ssb/simplitend/welcome/welcomepatient/fragments/register/SplashFragment.java
+++ b/app/src/main/java/com/ssb/simplitend/welcome/welcomepatient/fragments/register/SplashFragment.java
@@ -3,6 +3,7 @@ package com.ssb.simplitend.welcome.welcomepatient.fragments.register;
import android.content.Intent;
import android.os.Bundle;
import android.os.Handler;
+import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
@@ -37,13 +38,12 @@ public class SplashFragment extends Fragment implements ProfileContracts.Profile
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
binding = SplashFragmentBinding.inflate(inflater, container, false);
-
return binding.getRoot();
}
@Override
- public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
- super.onViewCreated(view, savedInstanceState);
+ public void onResume() {
+ super.onResume();
checkIfAhyUser();
}
@@ -83,24 +83,22 @@ public class SplashFragment extends Fragment implements ProfileContracts.Profile
}
}
- private void gotoDashBoard(){
- Intent intent = new Intent(requireActivity(), DashBoardActivity.class);
- intent.setFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);
- startActivity(intent);
- requireActivity().finish();
+ private void gotoProfileProgress(){
+ NavOptions navOptions = new NavOptions.Builder()
+ .setPopUpTo(R.id.splashFragment, true)
+ .build();
+
+ Navigation.findNavController(binding.getRoot())
+ .navigate(R.id.action_splashFragment_to_profileProgressFragment, null, navOptions);
}
public void gotoWelcomeFragment(){
- new Handler().postDelayed(() -> {
+ NavOptions navOptions = new NavOptions.Builder()
+ .setPopUpTo(R.id.splashFragment, true)
+ .build();
- NavOptions navOptions = new NavOptions.Builder()
- .setPopUpTo(R.id.splashFragment, true)
- .build();
-
- Navigation.findNavController(binding.mainIcon)
- .navigate(R.id.action_splashFragment_to_welcomeFragment, null, navOptions);
-
- }, 1000);
+ Navigation.findNavController(binding.getRoot())
+ .navigate(R.id.action_splashFragment_to_welcomeFragment, null, navOptions);
}
@Override
@@ -108,7 +106,7 @@ public class SplashFragment extends Fragment implements ProfileContracts.Profile
if (patientData.isCareGiverLink == 1){
// user has already added caregiver as a contact
// thus, sending it to dashboard
- gotoDashBoard();
+ gotoProfileProgress();
}else{
// user has not added caregiver contact.
// thus, sending it to contact list to add caregiver contact.
@@ -116,7 +114,7 @@ public class SplashFragment extends Fragment implements ProfileContracts.Profile
.setPopUpTo(R.id.splashFragment, true)
.build();
- Navigation.findNavController(binding.mainIcon)
+ Navigation.findNavController(binding.getRoot())
.navigate(R.id.action_splashFragment_to_contactListFragment, null, navOptions);
}
}
diff --git a/app/src/main/res/drawable/ic_sub_1.xml b/app/src/main/res/drawable/ic_sub_1.xml
new file mode 100644
index 0000000..2cb4f56
--- /dev/null
+++ b/app/src/main/res/drawable/ic_sub_1.xml
@@ -0,0 +1,824 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/app/src/main/res/drawable/ic_sub_2.xml b/app/src/main/res/drawable/ic_sub_2.xml
new file mode 100644
index 0000000..18ccc6c
--- /dev/null
+++ b/app/src/main/res/drawable/ic_sub_2.xml
@@ -0,0 +1,3368 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/app/src/main/res/drawable/ic_sub_dash.xml b/app/src/main/res/drawable/ic_sub_dash.xml
new file mode 100644
index 0000000..28e190a
--- /dev/null
+++ b/app/src/main/res/drawable/ic_sub_dash.xml
@@ -0,0 +1,12 @@
+
+
+
diff --git a/app/src/main/res/drawable/ic_sub_done.xml b/app/src/main/res/drawable/ic_sub_done.xml
new file mode 100644
index 0000000..d1603cf
--- /dev/null
+++ b/app/src/main/res/drawable/ic_sub_done.xml
@@ -0,0 +1,18 @@
+
+
+
+
diff --git a/app/src/main/res/layout/cg_sign_in_fragment.xml b/app/src/main/res/layout/cg_sign_in_fragment.xml
index 48607f5..83edc16 100644
--- a/app/src/main/res/layout/cg_sign_in_fragment.xml
+++ b/app/src/main/res/layout/cg_sign_in_fragment.xml
@@ -46,7 +46,7 @@
android:fontFamily="@font/nunito_medium"
android:textColor="@color/black"
android:layout_gravity="start"
- android:textSize="@dimen/_18ssp"
+ android:textSize="@dimen/_16ssp"
android:layout_marginHorizontal="15dp"
android:layout_marginTop="35sp"
/>
@@ -82,7 +82,7 @@
android:layout_marginHorizontal="15dp"
android:fontFamily="@font/nunito_medium"
android:textColor="@color/black"
- android:textSize="@dimen/_18ssp"
+ android:textSize="@dimen/_16ssp"
/>
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/contact_list_fragment.xml b/app/src/main/res/layout/contact_list_fragment.xml
index 0ad258c..0092bdf 100644
--- a/app/src/main/res/layout/contact_list_fragment.xml
+++ b/app/src/main/res/layout/contact_list_fragment.xml
@@ -10,7 +10,8 @@
android:id="@+id/back_btn"
android:layout_width="35sp"
android:layout_height="35sp"
- android:layout_margin="15dp"
+ android:layout_marginHorizontal="15dp"
+ android:layout_marginTop="15dp"
android:contentDescription="@string/back_button"
android:padding="5dp"
android:paddingStart="-15dp"
diff --git a/app/src/main/res/layout/profile_progress_fragment.xml b/app/src/main/res/layout/profile_progress_fragment.xml
index ef2c266..3457c0b 100644
--- a/app/src/main/res/layout/profile_progress_fragment.xml
+++ b/app/src/main/res/layout/profile_progress_fragment.xml
@@ -470,7 +470,6 @@
android:layout_height="wrap_content"
android:layout_marginStart="15dp"
android:layout_marginVertical="20dp"
- android:text="@string/proceed"
android:textAppearance="@style/TextAppearance.Material3.TitleMedium"
android:textAllCaps="false"
android:fontFamily="@font/nunito_regular"
diff --git a/app/src/main/res/layout/sign_in_fragment.xml b/app/src/main/res/layout/sign_in_fragment.xml
index c554001..4adef14 100644
--- a/app/src/main/res/layout/sign_in_fragment.xml
+++ b/app/src/main/res/layout/sign_in_fragment.xml
@@ -129,20 +129,20 @@
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/navigation/welcome_nav_graph.xml b/app/src/main/res/navigation/welcome_nav_graph.xml
index 0804fba..36db11c 100644
--- a/app/src/main/res/navigation/welcome_nav_graph.xml
+++ b/app/src/main/res/navigation/welcome_nav_graph.xml
@@ -41,6 +41,12 @@
+
+
+
OR
Unlock with Fingerprint or FaceID
Enter Login pin
+ Remote access to patient\'s profile and setting
+ Real time patient tracking
+ Real-time alerts and notifications
+ Setup geo-fence zone
\ No newline at end of file