diff --git a/app/src/main/java/app/nexd/android/ui/helper/checkout/CheckoutFragment.kt b/app/src/main/java/app/nexd/android/ui/helper/checkout/CheckoutFragment.kt index 22b07c0..cbdb1b1 100644 --- a/app/src/main/java/app/nexd/android/ui/helper/checkout/CheckoutFragment.kt +++ b/app/src/main/java/app/nexd/android/ui/helper/checkout/CheckoutFragment.kt @@ -31,6 +31,8 @@ class CheckoutFragment : Fragment() { override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) + progressBar.visibility = View.VISIBLE + recyclerView_helpRequests.adapter = adapter recyclerView_helpRequests.layoutManager = LinearLayoutManager(context) adapter.registerItemBinders( @@ -38,11 +40,13 @@ class CheckoutFragment : Fragment() { ) vm.getShoppingList().observe(viewLifecycleOwner, Observer { shoppingList -> + progressBar.visibility = View.VISIBLE adapter.removeAllSections() val requestList = ListSection() requestList.addAll(shoppingList.helpRequests) adapter.addSection(requestList) + progressBar.visibility = View.GONE }) button_deliver.setOnClickListener { diff --git a/app/src/main/java/app/nexd/android/ui/helper/delivery/DeliveryFragment.kt b/app/src/main/java/app/nexd/android/ui/helper/delivery/DeliveryFragment.kt index 4c3a9f1..56e4703 100644 --- a/app/src/main/java/app/nexd/android/ui/helper/delivery/DeliveryFragment.kt +++ b/app/src/main/java/app/nexd/android/ui/helper/delivery/DeliveryFragment.kt @@ -32,6 +32,8 @@ class DeliveryFragment : Fragment() { override fun onActivityCreated(savedInstanceState: Bundle?) { super.onActivityCreated(savedInstanceState) + progressBar.visibility = View.VISIBLE + recyclerView_helpRequests.adapter = adapter recyclerView_helpRequests.layoutManager = LinearLayoutManager(context) @@ -40,11 +42,13 @@ class DeliveryFragment : Fragment() { ) vm.getShoppingList().observe(viewLifecycleOwner, Observer { shoppingList -> + progressBar.visibility = View.VISIBLE adapter.removeAllSections() val requestList = ListSection() requestList.addAll(shoppingList.helpRequests) adapter.addSection(requestList) + progressBar.visibility = View.GONE context?.let { context -> closeRequest.setOnClickListener { diff --git a/app/src/main/java/app/nexd/android/ui/helper/detail/HelperDetailFragment.kt b/app/src/main/java/app/nexd/android/ui/helper/detail/HelperDetailFragment.kt index 63f3233..6b0c2ef 100644 --- a/app/src/main/java/app/nexd/android/ui/helper/detail/HelperDetailFragment.kt +++ b/app/src/main/java/app/nexd/android/ui/helper/detail/HelperDetailFragment.kt @@ -12,6 +12,7 @@ import androidx.recyclerview.widget.LinearLayoutManager import app.nexd.android.api.model.HelpRequestArticle import app.nexd.android.databinding.FragmentHelperRequestDetailBinding import app.nexd.android.ui.common.HelpRequestArticleBinder +import app.nexd.android.ui.helper.detail.HelperDetailViewModel.Progress.* import mva2.adapter.ListSection import mva2.adapter.MultiViewAdapter import org.koin.androidx.viewmodel.ext.android.viewModel @@ -66,8 +67,23 @@ class HelperDetailFragment : Fragment() { viewModel.idOfRequest.observe(viewLifecycleOwner, Observer { idOfRequest -> binding.buttonAccept.setOnClickListener { viewModel.acceptRequest(idOfRequest) - findNavController().popBackStack() } }) + + viewModel.progress.observe(viewLifecycleOwner, Observer { progress -> + when (progress) { + Loading -> { + binding.progressBar.visibility = View.VISIBLE + } + Idle -> { + binding.progressBar.visibility = View.GONE + } + Finished -> { + binding.progressBar.visibility = View.GONE + findNavController().popBackStack() + } + } + + }) } } diff --git a/app/src/main/java/app/nexd/android/ui/helper/detail/HelperDetailViewModel.kt b/app/src/main/java/app/nexd/android/ui/helper/detail/HelperDetailViewModel.kt index 7bb874f..bf6bb3c 100644 --- a/app/src/main/java/app/nexd/android/ui/helper/detail/HelperDetailViewModel.kt +++ b/app/src/main/java/app/nexd/android/ui/helper/detail/HelperDetailViewModel.kt @@ -14,6 +14,11 @@ import io.reactivex.schedulers.Schedulers.io class HelperDetailViewModel(private val api: Api) : ViewModel() { + sealed class Progress { + object Idle : Progress() + object Loading : Progress() + object Finished : Progress() + } val additionalRequest = MutableLiveData() val firstName = MutableLiveData() @@ -27,6 +32,8 @@ class HelperDetailViewModel(private val api: Api) : ViewModel() { val buttonText = MutableLiveData() val idOfRequest = MutableLiveData() + val progress = MutableLiveData(Progress.Loading) + private val compositeDisposable = CompositeDisposable() fun acceptRequest(requestId: Long) { @@ -53,6 +60,8 @@ class HelperDetailViewModel(private val api: Api) : ViewModel() { .subscribeOn(io()) .doOnError { Log.e("Error", it.message.toString()) + }.doOnComplete { + progress.value = Progress.Finished } .blockingSubscribe() } @@ -62,8 +71,12 @@ class HelperDetailViewModel(private val api: Api) : ViewModel() { val disposable = observable .observeOn(AndroidSchedulers.mainThread()) + .doOnComplete { + progress.value = Progress.Idle + } .subscribeBy( onNext = { + requestArticles.value = it.articles firstName.value = it.firstName lastName.value = it.lastName @@ -76,7 +89,6 @@ class HelperDetailViewModel(private val api: Api) : ViewModel() { requestIsAccepted.value = (it.helpListId != null) } ) - compositeDisposable.add(disposable) } diff --git a/app/src/main/java/app/nexd/android/ui/helper/shoppingList/ShoppingListFragment.kt b/app/src/main/java/app/nexd/android/ui/helper/shoppingList/ShoppingListFragment.kt index 4720ec5..a058aa3 100644 --- a/app/src/main/java/app/nexd/android/ui/helper/shoppingList/ShoppingListFragment.kt +++ b/app/src/main/java/app/nexd/android/ui/helper/shoppingList/ShoppingListFragment.kt @@ -8,7 +8,6 @@ import androidx.fragment.app.Fragment import androidx.lifecycle.Observer import androidx.navigation.fragment.findNavController import androidx.recyclerview.widget.LinearLayoutManager -import app.nexd.android.R import app.nexd.android.databinding.FragmentShoppingListBinding import app.nexd.android.ui.helper.shoppingList.ShoppingListFragmentDirections.Companion.toCheckoutFragment import kotlinx.android.synthetic.main.fragment_shopping_list.* @@ -38,6 +37,8 @@ class ShoppingListFragment : Fragment() { override fun onActivityCreated(savedInstanceState: Bundle?) { super.onActivityCreated(savedInstanceState) + binding.progressBar.visibility = View.VISIBLE + adapter = MultiViewAdapter() recyclerView_shoppingList.addItemDecoration(adapter.itemDecoration) recyclerView_shoppingList.layoutManager = LinearLayoutManager(context) @@ -50,11 +51,14 @@ class ShoppingListFragment : Fragment() { ) viewModel.getShoppingListArticles().observe(viewLifecycleOwner, Observer { shoppingListEntries -> + binding.progressBar.visibility = View.VISIBLE adapter.removeAllSections() val listSection = ListSection() listSection.addAll(shoppingListEntries) adapter.addSection(listSection) + binding.progressBar.visibility = View.GONE + button_checkout.setOnClickListener { findNavController().navigate(toCheckoutFragment()) } diff --git a/app/src/main/java/app/nexd/android/ui/seeker/call/PhoneCallFragment.kt b/app/src/main/java/app/nexd/android/ui/seeker/call/PhoneCallFragment.kt index 2827d1a..4dd4a81 100644 --- a/app/src/main/java/app/nexd/android/ui/seeker/call/PhoneCallFragment.kt +++ b/app/src/main/java/app/nexd/android/ui/seeker/call/PhoneCallFragment.kt @@ -26,6 +26,7 @@ class PhoneCallFragment : Fragment() { override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) + progressBar.visibility = View.VISIBLE vm.getPhoneNumber().observe(viewLifecycleOwner, Observer { phoneNumber -> textView_details.text = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { @@ -33,11 +34,13 @@ class PhoneCallFragment : Fragment() { getString(R.string.seeker_phone_call_text, phoneNumber), Html.FROM_HTML_MODE_LEGACY ) + } else { Html.fromHtml( getString(R.string.seeker_phone_call_text, phoneNumber) ) } + progressBar.visibility = View.GONE }) } diff --git a/app/src/main/java/app/nexd/android/ui/seeker/create/address/SeekerCreateRequestConfirmAddressFragment.kt b/app/src/main/java/app/nexd/android/ui/seeker/create/address/SeekerCreateRequestConfirmAddressFragment.kt index d5bc41e..11799ea 100644 --- a/app/src/main/java/app/nexd/android/ui/seeker/create/address/SeekerCreateRequestConfirmAddressFragment.kt +++ b/app/src/main/java/app/nexd/android/ui/seeker/create/address/SeekerCreateRequestConfirmAddressFragment.kt @@ -51,6 +51,7 @@ class SeekerCreateRequestConfirmAddressFragment : Fragment() { } binding.buttonConfirm.setOnClickListener { + binding.progressBar.visibility = View.VISIBLE vm.sendRequest() } } @@ -65,11 +66,13 @@ class SeekerCreateRequestConfirmAddressFragment : Fragment() { // } is Error -> { + binding.progressBar.visibility = View.GONE it.message?.let { errorMessageId -> DefaultSnackbar(binding.root, errorMessageId, Snackbar.LENGTH_SHORT) } } is Finished -> { + binding.progressBar.visibility = View.GONE findNavController().navigate(SeekerCreateRequestConfirmAddressFragmentDirections.toSeekerOverviewFragment()) } else -> Log.d( diff --git a/app/src/main/java/app/nexd/android/ui/seeker/create/articles/SeekerCreateRequestEnterArticlesFragment.kt b/app/src/main/java/app/nexd/android/ui/seeker/create/articles/SeekerCreateRequestEnterArticlesFragment.kt index e05a574..8b11368 100644 --- a/app/src/main/java/app/nexd/android/ui/seeker/create/articles/SeekerCreateRequestEnterArticlesFragment.kt +++ b/app/src/main/java/app/nexd/android/ui/seeker/create/articles/SeekerCreateRequestEnterArticlesFragment.kt @@ -76,13 +76,15 @@ class SeekerCreateRequestEnterArticlesFragment : Fragment() { articleListSection = ListSection() articleListSection!!.addAll(articles) adapter.addSection(articleListSection!!) + binding.progressBar.visibility = View.GONE } + }) vm.progress.observe(viewLifecycleOwner, Observer { when (it) { is Idle -> { - //nothing to do + binding.progressBar.visibility = View.VISIBLE } is Loading -> { findNavController().navigate(SeekerCreateRequestEnterArticlesFragmentDirections.toSeekerCreateRequestConfirmAddressFragment()) @@ -91,6 +93,7 @@ class SeekerCreateRequestEnterArticlesFragment : Fragment() { // state not reachable } is Error -> { + binding.progressBar.visibility = View.GONE it.message?.let { errorMessageId -> DefaultSnackbar(binding.root, errorMessageId, Snackbar.LENGTH_SHORT) } diff --git a/app/src/main/java/app/nexd/android/ui/seeker/detail/SeekerDetailFragment.kt b/app/src/main/java/app/nexd/android/ui/seeker/detail/SeekerDetailFragment.kt index 7cd59c8..f005f82 100644 --- a/app/src/main/java/app/nexd/android/ui/seeker/detail/SeekerDetailFragment.kt +++ b/app/src/main/java/app/nexd/android/ui/seeker/detail/SeekerDetailFragment.kt @@ -43,14 +43,18 @@ class SeekerDetailFragment : Fragment() { HelpRequestArticleBinder() ) + progressBar.visibility = View.VISIBLE + vm.progress.observe(viewLifecycleOwner) { when (it) { is SeekerDetailViewModel.Progress.Idle -> { } is SeekerDetailViewModel.Progress.Error -> { + progressBar.visibility = View.GONE Toast.makeText(requireContext(), getText(R.string.helper_request_detail_message_error_on_cancellation), Toast.LENGTH_LONG).show() } is SeekerDetailViewModel.Progress.Canceled -> { + progressBar.visibility = View.GONE // show information Toast.makeText(requireContext(), getText(R.string.helper_request_detail_message_cancelled), Toast.LENGTH_LONG).show() findNavController().navigateUp() @@ -67,8 +71,9 @@ class SeekerDetailFragment : Fragment() { textView_additionalRequest_label.visibility = if (request.additionalRequest.isNullOrBlank()) View.GONE else View.VISIBLE textView_additionalRequest.text = request.additionalRequest - + progressBar.visibility = View.GONE button_cancel.setOnClickListener { + progressBar.visibility = View.VISIBLE vm.cancelRequest(request) } } diff --git a/app/src/main/java/app/nexd/android/ui/seeker/overview/SeekerOverviewFragment.kt b/app/src/main/java/app/nexd/android/ui/seeker/overview/SeekerOverviewFragment.kt index 56a0579..4d09ed9 100644 --- a/app/src/main/java/app/nexd/android/ui/seeker/overview/SeekerOverviewFragment.kt +++ b/app/src/main/java/app/nexd/android/ui/seeker/overview/SeekerOverviewFragment.kt @@ -40,13 +40,17 @@ class SeekerOverviewFragment : Fragment() { SeekerOverviewHelpRequestBinder() ) + progressBar.visibility = View.VISIBLE + vm.getHelpRequests().observe(viewLifecycleOwner, Observer { requests -> adapter.removeAllSections() if (requests.isEmpty()) { + progressBar.visibility = View.GONE textView_empty.visibility = View.VISIBLE } else { textView_empty.visibility = View.GONE + progressBar.visibility = View.GONE val requestsSection = ListSection() requestsSection.addAll(requests) adapter.addSection(requestsSection) diff --git a/app/src/main/res/layout/fragment_checkout.xml b/app/src/main/res/layout/fragment_checkout.xml index 7f33600..571ac63 100644 --- a/app/src/main/res/layout/fragment_checkout.xml +++ b/app/src/main/res/layout/fragment_checkout.xml @@ -6,14 +6,28 @@ android:layout_height="match_parent" tools:background="@color/colorPrimary" android:paddingTop="@dimen/topPadding" - android:paddingHorizontal="@dimen/horizontalPadding" + tools:context=".ui.helper.checkout.CheckoutFragment"> + + + android:layout_height="wrap_content" + android:layout_marginHorizontal="15dp"> + + + + @@ -83,7 +100,8 @@ android:layout_width="match_parent" android:layout_height="wrap_content" app:cardCornerRadius="@dimen/radius" - android:layout_marginTop="10dp" + + android:layout_margin="15dp" app:layout_constraintBottom_toTopOf="@id/button_accept" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" @@ -127,6 +145,7 @@ android:id="@+id/button_accept" android:layout_width="match_parent" android:layout_height="wrap_content" + android:layout_margin="15dp" android:background="@drawable/rounded_white" android:enabled="@{!viewModel.requestIsAccepted}" android:text="@{viewModel.requestIsAccepted? @string/helper_request_detail_button_accepted : @string/helper_request_detail_button_accept}" diff --git a/app/src/main/res/layout/fragment_phone_call.xml b/app/src/main/res/layout/fragment_phone_call.xml index c47815d..2d10293 100644 --- a/app/src/main/res/layout/fragment_phone_call.xml +++ b/app/src/main/res/layout/fragment_phone_call.xml @@ -1,16 +1,27 @@ - - + android:layout_height="wrap_content" + android:layout_alignParentTop="true" + android:layout_marginTop="-6dp" + android:layout_marginBottom="-8dp" + android:indeterminate="true" + android:indeterminateTint="@color/colorPrimaryDark" + android:max="100" + android:padding="0dp" + android:visibility="gone" + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintTop_toTopOf="parent" /> + android:layout_margin="15dp" + app:layout_constraintBottom_toBottomOf="parent" + app:layout_constraintEnd_toEndOf="parent" + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintTop_toTopOf="parent" /> - - - \ No newline at end of file + \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_seeker_create_request_confirm_address.xml b/app/src/main/res/layout/fragment_seeker_create_request_confirm_address.xml index fef6a7b..d3ed9fa 100644 --- a/app/src/main/res/layout/fragment_seeker_create_request_confirm_address.xml +++ b/app/src/main/res/layout/fragment_seeker_create_request_confirm_address.xml @@ -1,7 +1,7 @@ + xmlns:app="http://schemas.android.com/apk/res-auto" + xmlns:tools="http://schemas.android.com/tools"> @@ -10,214 +10,235 @@ type="app.nexd.android.ui.seeker.create.SeekerCreateRequestViewModel" /> - + android:layout_height="match_parent"> - + android:layout_height="wrap_content" + android:layout_alignParentTop="true" + android:layout_marginTop="-6dp" + android:layout_marginBottom="-8dp" + android:indeterminate="true" + android:indeterminateTint="@color/colorPrimaryDark" + android:max="100" + android:padding="0dp" + android:visibility="gone" + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintTop_toTopOf="parent" /> + + - - - - - - - + android:paddingTop="@dimen/topPadding"> - + android:textSize="24sp" + android:textStyle="bold" + app:layout_constraintEnd_toEndOf="parent" + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintTop_toTopOf="parent" /> - - - + app:layout_constraintEnd_toEndOf="parent" + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintTop_toBottomOf="@id/textView_enter_address" /> + android:textCursorDrawable="@android:color/white" + app:layout_constraintEnd_toEndOf="parent" + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintTop_toBottomOf="@id/editText_first_name" /> + + + + + + + + + + + + + + + - - + android:textColorHint="@color/grey_500" + android:textCursorDrawable="@android:color/white" + app:layout_constraintEnd_toEndOf="parent" + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintTop_toBottomOf="@id/linearLayout_zipCode_city" /> - - -