diff --git a/.idea/deploymentTargetDropDown.xml b/.idea/deploymentTargetDropDown.xml index 468e843..758cc80 100644 --- a/.idea/deploymentTargetDropDown.xml +++ b/.idea/deploymentTargetDropDown.xml @@ -1,18 +1,6 @@ - - - - - - - - - - - - diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index e6c44dc..adfcbc8 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -2,6 +2,7 @@ + @@ -18,26 +19,32 @@ android:theme="@style/Theme.SimpliTend" tools:targetApi="31"> - + + + + - - + android:exported="false" + android:screenOrientation="portrait" /> + android:exported="false" + android:screenOrientation="portrait" /> - diff --git a/app/src/main/java/com/ssb/simplitend/apputils/AppUtil.java b/app/src/main/java/com/ssb/simplitend/apputils/AppUtil.java index 2d5c318..82a5268 100644 --- a/app/src/main/java/com/ssb/simplitend/apputils/AppUtil.java +++ b/app/src/main/java/com/ssb/simplitend/apputils/AppUtil.java @@ -4,7 +4,9 @@ import android.app.Activity; import android.app.AlertDialog; import android.content.Context; import android.content.DialogInterface; +import android.content.Intent; import android.content.SharedPreferences; +import android.net.Uri; import android.os.Handler; import android.util.Log; import android.view.LayoutInflater; @@ -31,6 +33,7 @@ import java.util.ArrayList; public abstract class AppUtil { + public static final String IMAGE_BASE_URL = "https://simplitend.betadelivery.com/storage/upload/"; private static final String TAG = "AppUtil"; // fields @@ -269,4 +272,10 @@ public abstract class AppUtil { saveCgData(null, -1, context); setWantSecurityFlag(context, NOT_ASKED_CG_SECURITY); } + + public static void dialPhone(Activity activity, String phone_number) { + Intent intent = new Intent(Intent.ACTION_DIAL, Uri.fromParts("tel", + phone_number, null)); + if (activity != null) activity.startActivity(intent); + } } diff --git a/app/src/main/java/com/ssb/simplitend/articles/ArticleApiService.java b/app/src/main/java/com/ssb/simplitend/articles/ArticleApiService.java new file mode 100644 index 0000000..50cf71a --- /dev/null +++ b/app/src/main/java/com/ssb/simplitend/articles/ArticleApiService.java @@ -0,0 +1,15 @@ +package com.ssb.simplitend.articles; + +import com.ssb.simplitend.welcome.welcomepatient.mvvm.models.CallResponse; + +import java.util.ArrayList; + +import retrofit2.Call; +import retrofit2.http.GET; + +public interface ArticleApiService { + + @GET("api/get-list-of-news-articles") + Call>> getArticles(); + +} diff --git a/app/src/main/java/com/ssb/simplitend/articles/ArticleContracts.java b/app/src/main/java/com/ssb/simplitend/articles/ArticleContracts.java new file mode 100644 index 0000000..bf0d996 --- /dev/null +++ b/app/src/main/java/com/ssb/simplitend/articles/ArticleContracts.java @@ -0,0 +1,13 @@ +package com.ssb.simplitend.articles; + +import java.util.ArrayList; + +public interface ArticleContracts { + + interface GetArticleCallback{ + void onArticlesFetched(ArrayList articleResults); + + void onArticleFetchFailed(Throwable t, String message); + } + +} diff --git a/app/src/main/java/com/ssb/simplitend/articles/ArticlePresenter.java b/app/src/main/java/com/ssb/simplitend/articles/ArticlePresenter.java new file mode 100644 index 0000000..75b6149 --- /dev/null +++ b/app/src/main/java/com/ssb/simplitend/articles/ArticlePresenter.java @@ -0,0 +1,57 @@ +package com.ssb.simplitend.articles; + +import androidx.annotation.NonNull; + +import com.ssb.simplitend.apputils.RetrofitHelper; +import com.ssb.simplitend.welcome.welcomepatient.mvvm.models.CallResponse; + +import java.util.ArrayList; + +import retrofit2.Call; +import retrofit2.Callback; +import retrofit2.Response; + +public class ArticlePresenter { + + private static ArticlePresenter articlePresenter; + + private ArticleApiService apiService; + + private ArticlePresenter(){ + this.apiService = RetrofitHelper.getRetrofit() + .create(ArticleApiService.class); + } + + public static synchronized ArticlePresenter getArticlePresenter() { + if (articlePresenter == null) { + articlePresenter = new ArticlePresenter(); + } + + return articlePresenter; + } + + public void getArticles(@NonNull ArticleContracts.GetArticleCallback getArticleCallback){ + apiService.getArticles() + .enqueue(new Callback>>() { + @Override + public void onResponse(Call>> call, Response>> response) { + if (response.body() != null){ + if (response.body().status != 200 || response.body().result == null){ + getArticleCallback.onArticleFetchFailed(new Exception(), response.body().message); + return; + } + + getArticleCallback.onArticlesFetched(response.body().result); + }else{ + getArticleCallback.onArticleFetchFailed(new Exception(), "Please try again later."); + } + } + + @Override + public void onFailure(Call>> call, Throwable t) { + getArticleCallback.onArticleFetchFailed(new Exception(), "Please try again later."); + } + }); + } + +} diff --git a/app/src/main/java/com/ssb/simplitend/articles/ArticleResult.java b/app/src/main/java/com/ssb/simplitend/articles/ArticleResult.java new file mode 100644 index 0000000..ee1d95b --- /dev/null +++ b/app/src/main/java/com/ssb/simplitend/articles/ArticleResult.java @@ -0,0 +1,26 @@ +package com.ssb.simplitend.articles; + +class ArticleCategory{ + public int id; + public String title; +} + +public class ArticleResult{ + public int id; + public String article_category_xid; + public String article_title; + public String article_detail; + public String article_link; + public String article_author; + public String article_datetime; + public String small_image; + public String large_image; + public String tags; + public String active; + public String deleted_at; + public String created_by; + public String updated_by; + public String created_at; + public String updated_at; + public ArticleCategory article_category; +} diff --git a/app/src/main/java/com/ssb/simplitend/articles/ArticleShowerActivity.java b/app/src/main/java/com/ssb/simplitend/articles/ArticleShowerActivity.java new file mode 100644 index 0000000..b8d91fd --- /dev/null +++ b/app/src/main/java/com/ssb/simplitend/articles/ArticleShowerActivity.java @@ -0,0 +1,69 @@ +package com.ssb.simplitend.articles; + +import androidx.appcompat.app.AppCompatActivity; + +import android.content.Intent; +import android.os.Bundle; +import android.webkit.WebSettings; +import android.webkit.WebViewClient; +import android.widget.Toast; + +import com.ssb.simplitend.R; +import com.ssb.simplitend.databinding.ActivityArticleShowerBinding; + +public class ArticleShowerActivity extends AppCompatActivity { + + protected ActivityArticleShowerBinding binding; + + private String url, title; + + public static final String ARTICLE_URL_KEY = "article_url"; + public static final String ARTICLE_TITLE = "article_title"; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + binding = ActivityArticleShowerBinding.inflate(getLayoutInflater()); + setContentView(binding.getRoot()); + + initViews(); + + clickEvents(); + + } + + private void initViews() { + + Intent intent = getIntent(); + if (intent != null){ + url = intent.getStringExtra(ARTICLE_URL_KEY); + title = intent.getStringExtra(ARTICLE_TITLE); + if (title != null){ + binding.toolbar.setTitle(title); + } + + loadUrl(); + } + } + + private void loadUrl() { + if (url == null){ + Toast.makeText(this, "Couldn't load the article.", Toast.LENGTH_SHORT).show(); + return; + } + + binding.webView.getSettings().setJavaScriptEnabled(true); + binding.webView.getSettings().setBuiltInZoomControls(true); + binding.webView.getSettings().setDisplayZoomControls(false); + + binding.webView.setWebViewClient(new WebViewClient()); + + binding.webView.loadUrl(url); + } + + private void clickEvents() { + binding.toolbar.setNavigationOnClickListener(v -> { + onBackPressed(); + }); + } +} \ No newline at end of file diff --git a/app/src/main/java/com/ssb/simplitend/articles/ArticlesActivity.java b/app/src/main/java/com/ssb/simplitend/articles/ArticlesActivity.java new file mode 100644 index 0000000..3e9b3b2 --- /dev/null +++ b/app/src/main/java/com/ssb/simplitend/articles/ArticlesActivity.java @@ -0,0 +1,91 @@ +package com.ssb.simplitend.articles; + +import static com.ssb.simplitend.articles.ArticleShowerActivity.ARTICLE_TITLE; +import static com.ssb.simplitend.articles.ArticleShowerActivity.ARTICLE_URL_KEY; + +import androidx.appcompat.app.AppCompatActivity; +import androidx.recyclerview.widget.LinearLayoutManager; + +import android.app.ProgressDialog; +import android.content.Intent; +import android.os.Bundle; +import android.widget.Toast; + +import com.ssb.simplitend.R; +import com.ssb.simplitend.databinding.ActivityArticlesBinding; + +import java.util.ArrayList; + +public class ArticlesActivity extends AppCompatActivity + implements ArticlesAdapter.ArticleClickListener, ArticleContracts.GetArticleCallback { + + protected ActivityArticlesBinding binding; + + private ArticlePresenter presenter; + + private ArticlesAdapter articlesAdapter; + + private ProgressDialog progressDialog; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + binding = ActivityArticlesBinding.inflate(getLayoutInflater()); + setContentView(binding.getRoot()); + + presenter = ArticlePresenter.getArticlePresenter(); + + initViews(); + + clickEvents(); + + getArticles(); + + } + + private void getArticles() { + progressDialog.setTitle("Please wait..."); + progressDialog.setMessage("while we fetch the articles"); + progressDialog.setCancelable(false); + progressDialog.show(); + + presenter.getArticles(this); + } + + private void initViews() { + + progressDialog = new ProgressDialog(this); + + binding.articlesRv.setLayoutManager(new LinearLayoutManager(this)); + articlesAdapter = new ArticlesAdapter(this); + binding.articlesRv.setAdapter(articlesAdapter); + } + + private void clickEvents() { + binding.backBtn.setOnClickListener(v -> { + onBackPressed(); + }); + } + + @Override + public void onArticleClick(ArticleResult articleResult) { + Intent intent = new Intent(this, ArticleShowerActivity.class); + intent.putExtra(ARTICLE_URL_KEY, articleResult.article_link); + intent.putExtra(ARTICLE_TITLE, articleResult.article_title); + startActivity(intent); + } + + @Override + public void onArticlesFetched(ArrayList articleResults) { + progressDialog.dismiss(); + + articlesAdapter.submitList(articleResults); + } + + @Override + public void onArticleFetchFailed(Throwable t, String message) { + progressDialog.dismiss(); + + Toast.makeText(this, "" + message, Toast.LENGTH_SHORT).show(); + } +} \ No newline at end of file diff --git a/app/src/main/java/com/ssb/simplitend/articles/ArticlesAdapter.java b/app/src/main/java/com/ssb/simplitend/articles/ArticlesAdapter.java new file mode 100644 index 0000000..78f1227 --- /dev/null +++ b/app/src/main/java/com/ssb/simplitend/articles/ArticlesAdapter.java @@ -0,0 +1,117 @@ +package com.ssb.simplitend.articles; + +import android.view.LayoutInflater; +import android.view.ViewGroup; + +import androidx.annotation.NonNull; +import androidx.recyclerview.widget.DiffUtil; +import androidx.recyclerview.widget.ListAdapter; +import androidx.recyclerview.widget.RecyclerView; + +import com.bumptech.glide.Glide; +import com.ssb.simplitend.apputils.AppUtil; +import com.ssb.simplitend.databinding.ArticleViewHolderBinding; + +import java.text.SimpleDateFormat; +import java.util.Date; +import java.util.Locale; +import java.util.TimeZone; + +public class ArticlesAdapter extends ListAdapter { + + private final ArticleClickListener articleClickListener; + + private static final DiffUtil.ItemCallback DIFF_UTIL = new DiffUtil.ItemCallback() { + @Override + public boolean areItemsTheSame(@NonNull ArticleResult oldItem, @NonNull ArticleResult newItem) { + return oldItem.id == newItem.id; + } + + @Override + public boolean areContentsTheSame(@NonNull ArticleResult oldItem, @NonNull ArticleResult newItem) { + return false; + } + }; + + public ArticlesAdapter(@NonNull ArticleClickListener articleClickListener){ + super(DIFF_UTIL); + this.articleClickListener = articleClickListener; + } + + @NonNull + @Override + public ArticleViewHOlder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { + ArticleViewHolderBinding binding = ArticleViewHolderBinding.inflate( + LayoutInflater.from(parent.getContext()), + parent, false); + return new ArticleViewHOlder(binding); + } + + @Override + public void onBindViewHolder(@NonNull ArticleViewHOlder holder, int position) { + holder.setData(getItem(position)); + + holder.binding.card.setOnClickListener(v -> { + articleClickListener.onArticleClick(getItem(position)); + }); + } + + public static class ArticleViewHOlder extends RecyclerView.ViewHolder{ + public ArticleViewHolderBinding binding; + + public ArticleViewHOlder(@NonNull ArticleViewHolderBinding binding) { + super(binding.getRoot()); + this.binding = binding; + } + + public void setData(ArticleResult articleResult){ + if (articleResult == null) return; + + Glide.with(itemView.getContext()) + .load(AppUtil.IMAGE_BASE_URL + articleResult.large_image) + .placeholder(android.R.color.darker_gray) + .error(android.R.color.darker_gray) + .into(binding.articleImg); + + if (articleResult.article_title == null){ + articleResult.article_title = "No title"; + } + + binding.title.setText(articleResult.article_title); + + if (articleResult.article_author == null){ + articleResult.article_author = "No author"; + } + + binding.authorName.setText(articleResult.article_author); + + try { + if (articleResult.created_at == null) throw new Exception(); + // parsing time of created at + SimpleDateFormat format = new SimpleDateFormat( + "yyyy-MM-dd'T'HH:mm:ss.SSS'Z'", Locale.US); + format.setTimeZone(TimeZone.getTimeZone("UTC")); + + Date date = format.parse(articleResult.created_at); + if (date == null) throw new Exception(); + + SimpleDateFormat pretty_format = new SimpleDateFormat("dd MMM yy, HH:mm a", Locale.getDefault()); + String time = pretty_format.format(date); + + binding.createdAt.setText(time); + + }catch (Exception e){ + // do nothing + String none = "None"; + binding.createdAt.setText(none); + } + + } + } + + // interfaces + @FunctionalInterface + public interface ArticleClickListener{ + void onArticleClick(ArticleResult articleResult); + } +} diff --git a/app/src/main/java/com/ssb/simplitend/caregiverdashboard/activities/CaregiverDashActivity.java b/app/src/main/java/com/ssb/simplitend/caregiverdashboard/activities/CaregiverDashActivity.java index dbf5614..997e3ac 100644 --- a/app/src/main/java/com/ssb/simplitend/caregiverdashboard/activities/CaregiverDashActivity.java +++ b/app/src/main/java/com/ssb/simplitend/caregiverdashboard/activities/CaregiverDashActivity.java @@ -12,6 +12,7 @@ import androidx.lifecycle.ViewModelProvider; import com.ssb.simplitend.R; import com.ssb.simplitend.apputils.CaregiverDataCache; +import com.ssb.simplitend.articles.ArticlesActivity; import com.ssb.simplitend.caregiverdashboard.fragments.CaregiverChatsFragment; import com.ssb.simplitend.caregiverdashboard.fragments.DashBoardFragment; import com.ssb.simplitend.caregiverdashboard.fragments.MyPatientFragment; @@ -21,6 +22,7 @@ import com.ssb.simplitend.customsviews.HomeBottomNav; import com.ssb.simplitend.customsviews.MenuItem; import com.ssb.simplitend.databinding.CaregiverDashboardActivityBinding; import com.ssb.simplitend.databinding.CaregiverDashboardMenuBinding; +import com.ssb.simplitend.faqs.FAQ_Activity; import com.ssb.simplitend.welcome.welcomecg.mvvm.CareGiverData; import com.yarolegovich.slidingrootnav.SlidingRootNavBuilder; import com.yarolegovich.slidingrootnav.callback.DragStateListener; @@ -77,6 +79,8 @@ public class CaregiverDashActivity extends AppCompatActivity implements // initializing dashboard fragment replaceFragment(new DashBoardFragment()); + + setLayoutDetails(); } @@ -96,6 +100,17 @@ public class CaregiverDashActivity extends AppCompatActivity implements binding.tint.setVisibility(View.GONE); } }); + + menuBinding.articles.setOnClickListener(v -> { + Intent intent = new Intent(this, ArticlesActivity.class); + startActivity(intent); + }); + + menuBinding.faqs.setOnClickListener(v -> { + Intent intent = new Intent(this, FAQ_Activity.class); + startActivity(intent); + }); + } private void watchSubscription(){ @@ -112,6 +127,14 @@ public class CaregiverDashActivity extends AppCompatActivity implements } } + private void setLayoutDetails() { + if (careGiverData == null || careGiverData.patientDetails == null){ + return; + } + + menuBinding.name.setText(careGiverData.patientDetails.first_name); + } + private void replaceFragment(Fragment fragment){ getSupportFragmentManager().beginTransaction() .replace(R.id.fcv_cg_home, fragment) @@ -143,7 +166,16 @@ public class CaregiverDashActivity extends AppCompatActivity implements // setting up toolbar accordingly binding.toolbar.setNavigationIcon(AppCompatResources.getDrawable(this, R.drawable.ic_menu)); binding.toolbar.setNavigationIconTint(getResources().getColor(R.color.black)); - binding.toolbar.setTitle("Welcome Aditya"); + + String first_name = ""; + if (careGiverData != null && careGiverData.patientDetails != null && careGiverData.patientDetails.first_name != null){ + String[] name = careGiverData.patientDetails.first_name.split(" "); + if (name.length > 0){ + first_name = name[0]; + } + } + + binding.toolbar.setTitle("Welcome " + first_name); }else if (selectedItem == MenuItem.MY_PATIENT){ replaceFragment(new MyPatientFragment()); diff --git a/app/src/main/java/com/ssb/simplitend/caregiverdashboard/fragments/MyPatientFragment.java b/app/src/main/java/com/ssb/simplitend/caregiverdashboard/fragments/MyPatientFragment.java index aae7c61..f9fc220 100644 --- a/app/src/main/java/com/ssb/simplitend/caregiverdashboard/fragments/MyPatientFragment.java +++ b/app/src/main/java/com/ssb/simplitend/caregiverdashboard/fragments/MyPatientFragment.java @@ -1,22 +1,34 @@ package com.ssb.simplitend.caregiverdashboard.fragments; +import static com.ssb.simplitend.caregiverdashboard.activities.PatientProfileShowerActivity.*; + +import android.content.Intent; 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; import androidx.fragment.app.Fragment; +import com.ssb.simplitend.apputils.AppUtil; +import com.ssb.simplitend.apputils.CaregiverDataCache; +import com.ssb.simplitend.caregiverdashboard.activities.PatientProfileInfoActivity; +import com.ssb.simplitend.caregiverdashboard.activities.PatientProfileShowerActivity; +import com.ssb.simplitend.cg_geofencing.CgGeoFencingActivity; import com.ssb.simplitend.databinding.CaregiverDashFragmentBinding; import com.ssb.simplitend.databinding.MyPatientFragmentBinding; +import com.ssb.simplitend.welcome.welcomecg.mvvm.CareGiverData; public class MyPatientFragment extends Fragment { // view binding protected MyPatientFragmentBinding binding; + private CareGiverData careGiverData; + public MyPatientFragment(){ // required empty } @@ -26,6 +38,66 @@ public class MyPatientFragment extends Fragment { public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { binding = MyPatientFragmentBinding.inflate(inflater, container, false); + initViews(); + + clickEvents(); + return binding.getRoot(); } + + private void initViews() { + CaregiverDataCache.getCaregiverData(requireContext(), (careGiverData1 -> { + this.careGiverData = careGiverData1; + if (careGiverData1 == null || careGiverData1.patientDetails == null){ + Toast.makeText(requireContext(), "Couldn't load patient details.", Toast.LENGTH_SHORT).show(); + return; + } + + binding.name.setText(careGiverData1.patientDetails.first_name); + binding.phoneNumber.setText(careGiverData1.patientDetails.phone_number); + + }), true); + } + + private void clickEvents() { + + binding.peronalInfo.setOnClickListener(v -> { + Intent intent = new Intent(requireActivity(), PatientProfileInfoActivity.class); + startActivity(intent); + }); + + binding.geofence.setOnClickListener(v -> { + Intent intent = new Intent(requireActivity(), CgGeoFencingActivity.class); + startActivity(intent); + }); + + binding.medication.setOnClickListener(v -> { + gotoProfileShower(MED_REMINDER_F); + }); + + binding.contacts.setOnClickListener(v -> { + gotoProfileShower(CONTACTS_F); + }); + + binding.medRecords.setOnClickListener(v -> { + gotoProfileShower(MED_INFO_F); + }); + + binding.patActivities.setOnClickListener(v -> { + gotoProfileShower(ACTIVITY_F); + }); + + binding.phoneNumber.setOnClickListener(v -> { + if (careGiverData != null && careGiverData.patientDetails != null){ + AppUtil.dialPhone(requireActivity(), careGiverData.patientDetails.phone_number); + } + }); + + } + + private void gotoProfileShower(String which_f) { + Intent intent = new Intent(requireActivity(), PatientProfileShowerActivity.class); + intent.putExtra(WHICH_FRAGMENT, which_f); + startActivity(intent); + } } diff --git a/app/src/main/java/com/ssb/simplitend/faqs/FAQAdapter.java b/app/src/main/java/com/ssb/simplitend/faqs/FAQAdapter.java new file mode 100644 index 0000000..cffd25a --- /dev/null +++ b/app/src/main/java/com/ssb/simplitend/faqs/FAQAdapter.java @@ -0,0 +1,78 @@ +package com.ssb.simplitend.faqs; + +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; + +import androidx.annotation.NonNull; +import androidx.recyclerview.widget.AsyncDifferConfig; +import androidx.recyclerview.widget.DiffUtil; +import androidx.recyclerview.widget.ListAdapter; +import androidx.recyclerview.widget.RecyclerView; + +import com.ssb.simplitend.R; +import com.ssb.simplitend.databinding.FaqViewholderBinding; + +public class FAQAdapter extends ListAdapter { + + private static final DiffUtil.ItemCallback DIFF_UTIL = new DiffUtil.ItemCallback() { + @Override + public boolean areItemsTheSame(@NonNull FAQResult oldItem, @NonNull FAQResult newItem) { + return oldItem.id == newItem.id; + } + + @Override + public boolean areContentsTheSame(@NonNull FAQResult oldItem, @NonNull FAQResult newItem) { + return false; + } + }; + + public FAQAdapter(){ + super(DIFF_UTIL); + } + + @NonNull + @Override + public FAQViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { + FaqViewholderBinding binding = FaqViewholderBinding.inflate(LayoutInflater.from(parent.getContext()), + parent, false); + return new FAQViewHolder(binding); + } + + @Override + public void onBindViewHolder(@NonNull FAQViewHolder holder, int position) { + holder.setDate(getItem(position)); + + holder.binding.addRemove.setOnClickListener(v -> { + int visibility = holder.binding.answer.getVisibility(); + + if (visibility == View.VISIBLE){ + holder.binding.addRemove.setImageResource(R.drawable.ic_add_primary); + holder.binding.answer.setVisibility(View.GONE); + }else{ + holder.binding.addRemove.setImageResource(R.drawable.ic_remove_primary); + holder.binding.answer.setVisibility(View.VISIBLE); + } + }); + + } + + public static class FAQViewHolder extends RecyclerView.ViewHolder{ + public FaqViewholderBinding binding; + + public FAQViewHolder(@NonNull FaqViewholderBinding binding) { + super(binding.getRoot()); + this.binding = binding; + } + + public void setDate(FAQResult result){ + if (result == null) return; + + binding.title.setText(result.faq_question); + binding.answer.setText(result.faq_answer); + binding.answer.setVisibility(View.GONE); + binding.addRemove.setImageResource(R.drawable.ic_add_primary); + } + } + +} diff --git a/app/src/main/java/com/ssb/simplitend/faqs/FAQApiService.java b/app/src/main/java/com/ssb/simplitend/faqs/FAQApiService.java new file mode 100644 index 0000000..d29d706 --- /dev/null +++ b/app/src/main/java/com/ssb/simplitend/faqs/FAQApiService.java @@ -0,0 +1,15 @@ +package com.ssb.simplitend.faqs; + +import com.ssb.simplitend.welcome.welcomepatient.mvvm.models.CallResponse; + +import java.util.ArrayList; + +import retrofit2.Call; +import retrofit2.http.GET; + +public interface FAQApiService { + + @GET("api/get-list-of-faqs") + Call>> getFAQs(); + +} diff --git a/app/src/main/java/com/ssb/simplitend/faqs/FAQContracts.java b/app/src/main/java/com/ssb/simplitend/faqs/FAQContracts.java new file mode 100644 index 0000000..4b558d6 --- /dev/null +++ b/app/src/main/java/com/ssb/simplitend/faqs/FAQContracts.java @@ -0,0 +1,13 @@ +package com.ssb.simplitend.faqs; + +import java.util.ArrayList; + +public interface FAQContracts { + + interface GETFAQsCallback{ + void onFAQsFetched(ArrayList faqResults); + + void onFAQsFetchedFailed(Throwable t, String message); + } + +} diff --git a/app/src/main/java/com/ssb/simplitend/faqs/FAQResult.java b/app/src/main/java/com/ssb/simplitend/faqs/FAQResult.java new file mode 100644 index 0000000..9b7cb51 --- /dev/null +++ b/app/src/main/java/com/ssb/simplitend/faqs/FAQResult.java @@ -0,0 +1,22 @@ +package com.ssb.simplitend.faqs; + +class FaqCategory{ + public int id; + public String title; +} + +public class FAQResult{ + public int id; + public String faq_category_xid; + public String faq_question; + public String faq_answer; + public String small_image; + public String large_image; + public String active; + public String deleted_at; + public String created_by; + public String updated_by; + public String created_at; + public String updated_at; + public FaqCategory faq_category; +} diff --git a/app/src/main/java/com/ssb/simplitend/faqs/FAQ_Activity.java b/app/src/main/java/com/ssb/simplitend/faqs/FAQ_Activity.java new file mode 100644 index 0000000..958ff9d --- /dev/null +++ b/app/src/main/java/com/ssb/simplitend/faqs/FAQ_Activity.java @@ -0,0 +1,79 @@ +package com.ssb.simplitend.faqs; + +import androidx.appcompat.app.AppCompatActivity; +import androidx.recyclerview.widget.LinearLayoutManager; + +import android.app.ProgressDialog; +import android.os.Bundle; +import android.widget.Toast; + +import com.ssb.simplitend.R; +import com.ssb.simplitend.articles.ArticlesAdapter; +import com.ssb.simplitend.databinding.ActivityFaqBinding; + +import java.util.ArrayList; + +public class FAQ_Activity extends AppCompatActivity implements FAQContracts.GETFAQsCallback { + + private ActivityFaqBinding binding; + + private FAQsPresenter presenter; + + private ProgressDialog progressDialog; + + private FAQAdapter faqAdapter; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + binding = ActivityFaqBinding.inflate(getLayoutInflater()); + setContentView(binding.getRoot()); + + presenter = FAQsPresenter.getFaqsPresenter(); + + initViews(); + + clickEvents(); + + getFAQs(); + + } + + private void initViews() { + progressDialog = new ProgressDialog(this); + + binding.faqsRv.setLayoutManager(new LinearLayoutManager(this)); + faqAdapter = new FAQAdapter(); + binding.faqsRv.setAdapter(faqAdapter); + } + + private void clickEvents() { + binding.backBtn.setOnClickListener(v -> { + onBackPressed(); + }); + } + + private void getFAQs() { + progressDialog.setTitle("Please wait..."); + progressDialog.setMessage("while we fetch the FAQs"); + progressDialog.setCancelable(false); + progressDialog.show(); + + presenter.getFAQs(this); + } + + @Override + public void onFAQsFetched(ArrayList faqResults) { + progressDialog.dismiss(); + + faqAdapter.submitList(faqResults); + + } + + @Override + public void onFAQsFetchedFailed(Throwable t, String message) { + progressDialog.dismiss(); + + Toast.makeText(this, "" + message, Toast.LENGTH_SHORT).show(); + } +} \ No newline at end of file diff --git a/app/src/main/java/com/ssb/simplitend/faqs/FAQsPresenter.java b/app/src/main/java/com/ssb/simplitend/faqs/FAQsPresenter.java new file mode 100644 index 0000000..f740543 --- /dev/null +++ b/app/src/main/java/com/ssb/simplitend/faqs/FAQsPresenter.java @@ -0,0 +1,60 @@ +package com.ssb.simplitend.faqs; + +import androidx.annotation.NonNull; + +import com.ssb.simplitend.apputils.RetrofitHelper; +import com.ssb.simplitend.articles.ArticleApiService; +import com.ssb.simplitend.articles.ArticleContracts; +import com.ssb.simplitend.articles.ArticleResult; +import com.ssb.simplitend.welcome.welcomepatient.mvvm.models.CallResponse; + +import java.util.ArrayList; + +import retrofit2.Call; +import retrofit2.Callback; +import retrofit2.Response; + +public class FAQsPresenter { + + private static FAQsPresenter faqsPresenter; + + private FAQApiService apiService; + + private FAQsPresenter(){ + this.apiService = RetrofitHelper.getRetrofit() + .create(FAQApiService.class); + } + + public static synchronized FAQsPresenter getFaqsPresenter() { + if (faqsPresenter == null) { + faqsPresenter = new FAQsPresenter(); + } + + return faqsPresenter; + } + + public void getFAQs(@NonNull FAQContracts.GETFAQsCallback faqCallbacks){ + apiService.getFAQs() + .enqueue(new Callback>>() { + @Override + public void onResponse(Call>> call, Response>> response) { + if (response.body() != null){ + if (response.body().status != 200 || response.body().result == null){ + faqCallbacks.onFAQsFetchedFailed(new Exception(), response.body().message); + return; + } + + faqCallbacks.onFAQsFetched(response.body().result); + }else{ + faqCallbacks.onFAQsFetchedFailed(new Exception(), "Please try again later."); + } + } + + @Override + public void onFailure(Call>> call, Throwable t) { + faqCallbacks.onFAQsFetchedFailed(new Exception(), "Please try again later."); + } + }); + } + +} diff --git a/app/src/main/java/com/ssb/simplitend/welcome/welcomepatient/fragments/contacts/ContactInfoFragment.java b/app/src/main/java/com/ssb/simplitend/welcome/welcomepatient/fragments/contacts/ContactInfoFragment.java index 59bec53..76bc6eb 100644 --- a/app/src/main/java/com/ssb/simplitend/welcome/welcomepatient/fragments/contacts/ContactInfoFragment.java +++ b/app/src/main/java/com/ssb/simplitend/welcome/welcomepatient/fragments/contacts/ContactInfoFragment.java @@ -79,7 +79,7 @@ public class ContactInfoFragment extends Fragment implements WelcomeContracts.De private void loadUserData() { Glide.with(requireContext()) - .load("https://simplitend.betadelivery.com/storage/upload/" + contactData.contact_photo) + .load(AppUtil.IMAGE_BASE_URL + contactData.contact_photo) .placeholder(android.R.color.darker_gray) .error(R.drawable.ic_contact) .fitCenter().into(binding.image); diff --git a/app/src/main/java/com/ssb/simplitend/welcome/welcomepatient/fragments/contacts/CreateContactFragment.java b/app/src/main/java/com/ssb/simplitend/welcome/welcomepatient/fragments/contacts/CreateContactFragment.java index 1d15781..52adda1 100644 --- a/app/src/main/java/com/ssb/simplitend/welcome/welcomepatient/fragments/contacts/CreateContactFragment.java +++ b/app/src/main/java/com/ssb/simplitend/welcome/welcomepatient/fragments/contacts/CreateContactFragment.java @@ -531,7 +531,7 @@ public class CreateContactFragment extends Fragment implements WelcomeContracts. if (contactData.contact_photo != null) { Glide.with(requireContext()) - .load("https://simplitend.betadelivery.com/storage/upload/" + contactData.contact_photo) + .load(AppUtil.IMAGE_BASE_URL + contactData.contact_photo) .placeholder(android.R.color.darker_gray) .error(R.drawable.ic_contact) .fitCenter().into(binding.image); diff --git a/app/src/main/java/com/ssb/simplitend/welcome/welcomepatient/fragments/contacts/mvvm/AddContactAdapter.java b/app/src/main/java/com/ssb/simplitend/welcome/welcomepatient/fragments/contacts/mvvm/AddContactAdapter.java index 32930f4..d61b3cc 100644 --- a/app/src/main/java/com/ssb/simplitend/welcome/welcomepatient/fragments/contacts/mvvm/AddContactAdapter.java +++ b/app/src/main/java/com/ssb/simplitend/welcome/welcomepatient/fragments/contacts/mvvm/AddContactAdapter.java @@ -16,6 +16,7 @@ import androidx.recyclerview.widget.RecyclerView; import com.bumptech.glide.Glide; import com.ssb.simplitend.R; +import com.ssb.simplitend.apputils.AppUtil; import com.ssb.simplitend.databinding.AddContactViewholderBinding; import com.ssb.simplitend.welcome.welcomepatient.fragments.contacts.mvvm.models.ContactData; @@ -108,7 +109,7 @@ public class AddContactAdapter extends ListAdapter + + + + diff --git a/app/src/main/res/drawable/ic_contacts_2.xml b/app/src/main/res/drawable/ic_contacts_2.xml new file mode 100644 index 0000000..db09628 --- /dev/null +++ b/app/src/main/res/drawable/ic_contacts_2.xml @@ -0,0 +1,14 @@ + + + + diff --git a/app/src/main/res/drawable/ic_freq_app_2.xml b/app/src/main/res/drawable/ic_freq_app_2.xml new file mode 100644 index 0000000..4ac9cde --- /dev/null +++ b/app/src/main/res/drawable/ic_freq_app_2.xml @@ -0,0 +1,22 @@ + + + + + + diff --git a/app/src/main/res/drawable/ic_location.xml b/app/src/main/res/drawable/ic_location.xml new file mode 100644 index 0000000..950f1ca --- /dev/null +++ b/app/src/main/res/drawable/ic_location.xml @@ -0,0 +1,18 @@ + + + + + diff --git a/app/src/main/res/drawable/ic_med_records.xml b/app/src/main/res/drawable/ic_med_records.xml new file mode 100644 index 0000000..264f5fb --- /dev/null +++ b/app/src/main/res/drawable/ic_med_records.xml @@ -0,0 +1,26 @@ + + + + + + + diff --git a/app/src/main/res/drawable/ic_medication.xml b/app/src/main/res/drawable/ic_medication.xml new file mode 100644 index 0000000..78090a5 --- /dev/null +++ b/app/src/main/res/drawable/ic_medication.xml @@ -0,0 +1,10 @@ + + + diff --git a/app/src/main/res/drawable/ic_pat_activites.xml b/app/src/main/res/drawable/ic_pat_activites.xml new file mode 100644 index 0000000..5bcf3b8 --- /dev/null +++ b/app/src/main/res/drawable/ic_pat_activites.xml @@ -0,0 +1,54 @@ + + + + + + + + + + + + + + diff --git a/app/src/main/res/drawable/ic_remove_primary.xml b/app/src/main/res/drawable/ic_remove_primary.xml new file mode 100644 index 0000000..061e430 --- /dev/null +++ b/app/src/main/res/drawable/ic_remove_primary.xml @@ -0,0 +1,15 @@ + + + + diff --git a/app/src/main/res/drawable/ic_subs_plan.xml b/app/src/main/res/drawable/ic_subs_plan.xml new file mode 100644 index 0000000..4a8ae28 --- /dev/null +++ b/app/src/main/res/drawable/ic_subs_plan.xml @@ -0,0 +1,14 @@ + + + + diff --git a/app/src/main/res/drawable/top_round_corner_25dp.xml b/app/src/main/res/drawable/top_round_corner_25dp.xml new file mode 100644 index 0000000..bc1fea2 --- /dev/null +++ b/app/src/main/res/drawable/top_round_corner_25dp.xml @@ -0,0 +1,12 @@ + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_article_shower.xml b/app/src/main/res/layout/activity_article_shower.xml new file mode 100644 index 0000000..1ac309a --- /dev/null +++ b/app/src/main/res/layout/activity_article_shower.xml @@ -0,0 +1,30 @@ + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_articles.xml b/app/src/main/res/layout/activity_articles.xml new file mode 100644 index 0000000..bc13880 --- /dev/null +++ b/app/src/main/res/layout/activity_articles.xml @@ -0,0 +1,84 @@ + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_faq.xml b/app/src/main/res/layout/activity_faq.xml new file mode 100644 index 0000000..1523307 --- /dev/null +++ b/app/src/main/res/layout/activity_faq.xml @@ -0,0 +1,40 @@ + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/article_view_holder.xml b/app/src/main/res/layout/article_view_holder.xml new file mode 100644 index 0000000..c254d6d --- /dev/null +++ b/app/src/main/res/layout/article_view_holder.xml @@ -0,0 +1,132 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/caregiver_dashboard_activity.xml b/app/src/main/res/layout/caregiver_dashboard_activity.xml index 4e49574..5f6da50 100644 --- a/app/src/main/res/layout/caregiver_dashboard_activity.xml +++ b/app/src/main/res/layout/caregiver_dashboard_activity.xml @@ -21,7 +21,6 @@ android:layout_width="match_parent" android:layout_height="?android:attr/actionBarSize" - android:layout_marginTop="15dp" android:background="@android:color/transparent" app:title="Welcome Aditya" diff --git a/app/src/main/res/layout/caregiver_dashboard_menu.xml b/app/src/main/res/layout/caregiver_dashboard_menu.xml index 91b0dae..0389b81 100644 --- a/app/src/main/res/layout/caregiver_dashboard_menu.xml +++ b/app/src/main/res/layout/caregiver_dashboard_menu.xml @@ -3,6 +3,7 @@ android:layout_width="match_parent" android:layout_height="match_parent" xmlns:app="http://schemas.android.com/apk/res-auto" + xmlns:tools="http://schemas.android.com/tools" android:orientation="horizontal" android:weightSum="10" android:background="@color/cg_dash_bg"> @@ -58,11 +59,12 @@ > + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/my_patient_fragment.xml b/app/src/main/res/layout/my_patient_fragment.xml index bfc6809..c7e6ff0 100644 --- a/app/src/main/res/layout/my_patient_fragment.xml +++ b/app/src/main/res/layout/my_patient_fragment.xml @@ -1,26 +1,688 @@ - - + + + - + \ No newline at end of file + android:layout_below="@id/title" + + android:layout_centerInParent="true" + + android:layout_marginTop="15dp" + android:contentDescription="@string/patient_profile" + android:elevation="15dp" + + android:src="@drawable/static_3" + + /> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/values/colors.xml b/app/src/main/res/values/colors.xml index c846114..c042681 100644 --- a/app/src/main/res/values/colors.xml +++ b/app/src/main/res/values/colors.xml @@ -12,6 +12,8 @@ #1B6DC1 #C9E0FB + #005F9A + #005F9A #545454 diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index b2c5728..5044f60 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -252,7 +252,7 @@ Update your loved one\'s profile information. Setup a geofence to\nprotect your loved one. Be notified if your loved one ventures too far from home or a designated safe area - For example, you may use your phone to examine and verify your loved one\'s medication schedule. + For example, you may use your phone to verify and update your loved one\'s medication schedule. Be notified if your loved one ventures too far from home or a designated safe area. Skip Get started @@ -326,6 +326,14 @@ Enter a message Syncing patient information We are currently syncing patient data. This may take a few seconds. + Patient profile + Contacts + Medication + Medical Records + Patient activities + Subscription plan + Geofence + FAQ Kms