From 1b447137b0e2162e74a3894b1942ac3bc5a683f5 Mon Sep 17 00:00:00 2001 From: Peter Olamit Date: Wed, 12 Jun 2019 11:40:10 -0700 Subject: [PATCH 01/23] HW-52585 UI - Receipt Details --- .../android/common/view/OneClickListener.java | 31 ++ .../common/viewmodel/ListDetailNavigator.java | 30 +- receipt/build.gradle | 6 +- receipt/src/main/AndroidManifest.xml | 14 +- .../receipt/view/ListReceiptActivity.java | 21 +- .../receipt/view/ListReceiptFragment.java | 85 +--- .../receipt/view/ReceiptDetailActivity.java | 72 +++ .../receipt/view/ReceiptDetailFragment.java | 134 ++++++ .../android/receipt/view/ReceiptViewUtil.java | 86 ++++ .../viewmodel/ListReceiptViewModel.java | 9 + .../viewmodel/ReceiptDetailViewModel.java | 34 ++ .../res/layout/activity_receipt_detail.xml | 18 + ...fragment.xml => fragment_list_receipt.xml} | 0 .../res/layout/fragment_receipt_detail.xml | 431 ++++++++++++++++++ receipt/src/main/res/layout/item_receipt.xml | 68 +-- .../res/layout/item_receipt_with_header.xml | 9 +- receipt/src/main/res/layout/receipt.xml | 69 +++ receipt/src/main/res/values/dimens.xml | 1 + receipt/src/main/res/values/strings.xml | 17 + .../ListTransferMethodActivity.java | 2 +- .../ListTransferMethodFragment.java | 2 +- .../SelectTransferMethodFragment.java | 2 +- 22 files changed, 981 insertions(+), 160 deletions(-) create mode 100644 common/src/main/java/com/hyperwallet/android/common/view/OneClickListener.java rename ui/src/main/java/com/hyperwallet/android/ui/view/widget/OneClickListener.java => common/src/main/java/com/hyperwallet/android/common/viewmodel/ListDetailNavigator.java (52%) create mode 100644 receipt/src/main/java/com/hyperwallet/android/receipt/view/ReceiptDetailActivity.java create mode 100644 receipt/src/main/java/com/hyperwallet/android/receipt/view/ReceiptDetailFragment.java create mode 100644 receipt/src/main/java/com/hyperwallet/android/receipt/view/ReceiptViewUtil.java create mode 100644 receipt/src/main/java/com/hyperwallet/android/receipt/viewmodel/ReceiptDetailViewModel.java create mode 100644 receipt/src/main/res/layout/activity_receipt_detail.xml rename receipt/src/main/res/layout/{list_receipt_fragment.xml => fragment_list_receipt.xml} (100%) create mode 100644 receipt/src/main/res/layout/fragment_receipt_detail.xml create mode 100644 receipt/src/main/res/layout/receipt.xml diff --git a/common/src/main/java/com/hyperwallet/android/common/view/OneClickListener.java b/common/src/main/java/com/hyperwallet/android/common/view/OneClickListener.java new file mode 100644 index 000000000..4ac3cbcf6 --- /dev/null +++ b/common/src/main/java/com/hyperwallet/android/common/view/OneClickListener.java @@ -0,0 +1,31 @@ +package com.hyperwallet.android.common.view; + +import android.os.SystemClock; +import android.view.View; + +/** + * Helper class that holds a time of the first click event and won't call onClick callback during a delay. + */ +public abstract class OneClickListener implements View.OnClickListener { + private static final long CLICK_DELAY_MILLIS = 800L; + private long mFirstOccurrenceClickTime; + + @Override + public void onClick(View v) { + if (SystemClock.elapsedRealtime() - mFirstOccurrenceClickTime < CLICK_DELAY_MILLIS) { + return; + } + + onOneClick(v); + mFirstOccurrenceClickTime = SystemClock.elapsedRealtime(); + + } + + /** + * Handle click events with a delay. This callback is time aware and will not appear the second time during a delay. + * + * @param v View + */ + public abstract void onOneClick(View v); +} + diff --git a/ui/src/main/java/com/hyperwallet/android/ui/view/widget/OneClickListener.java b/common/src/main/java/com/hyperwallet/android/common/viewmodel/ListDetailNavigator.java similarity index 52% rename from ui/src/main/java/com/hyperwallet/android/ui/view/widget/OneClickListener.java rename to common/src/main/java/com/hyperwallet/android/common/viewmodel/ListDetailNavigator.java index 33e575c31..dd31e03ad 100644 --- a/ui/src/main/java/com/hyperwallet/android/ui/view/widget/OneClickListener.java +++ b/common/src/main/java/com/hyperwallet/android/common/viewmodel/ListDetailNavigator.java @@ -1,6 +1,6 @@ /* * The MIT License (MIT) - * Copyright (c) 2018 Hyperwallet Systems Inc. + * Copyright (c) 2019 Hyperwallet Systems Inc. * * Permission is hereby granted, free of charge, to any person obtaining a copy of this software and * associated documentation files (the "Software"), to deal in the Software without restriction, @@ -14,33 +14,17 @@ * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ -package com.hyperwallet.android.ui.view.widget; - -import android.os.SystemClock; -import android.view.View; +package com.hyperwallet.android.common.viewmodel; /** - * Helper class that holds a time of the first click event and won't call onClick callback during a delay. + * Detail interface for having a list UI with detail information through navigation */ -public abstract class OneClickListener implements View.OnClickListener { - private static final long CLICK_DELAY_MILLIS = 800L; - private long mFirstOccurrenceClickTime; - - @Override - public void onClick(View v) { - if (SystemClock.elapsedRealtime() - mFirstOccurrenceClickTime < CLICK_DELAY_MILLIS) { - return; - } - - onOneClick(v); - mFirstOccurrenceClickTime = SystemClock.elapsedRealtime(); - - } +public interface ListDetailNavigator { /** - * Handle click events with a delay. This callback is time aware and will not appear the second time during a delay. + * Navigate action * - * @param v View + * @param e Navigation event */ - public abstract void onOneClick(View v); + void navigate(Event e); } diff --git a/receipt/build.gradle b/receipt/build.gradle index 6aa8d9d42..3e8b31635 100644 --- a/receipt/build.gradle +++ b/receipt/build.gradle @@ -10,6 +10,10 @@ dependencies { implementation "androidx.lifecycle:lifecycle-extensions:$lifecycleExtensionsVersion" implementation "androidx.paging:paging-runtime:$pagingRuntimeVersion" + implementation 'androidx.appcompat:appcompat:1.0.2' + implementation 'androidx.constraintlayout:constraintlayout:1.1.3' + implementation 'androidx.legacy:legacy-support-v4:1.0.0' + implementation 'com.google.android.material:material:1.0.0' testImplementation "org.robolectric:robolectric:$robolectricVersion" androidTestImplementation "androidx.test:rules:$testRulesVersion" @@ -108,4 +112,4 @@ sonarqube { property "sonar.libraries", libraries property "sonar.projectName", "android-ui-sdk-receipt" } -} \ No newline at end of file +} diff --git a/receipt/src/main/AndroidManifest.xml b/receipt/src/main/AndroidManifest.xml index 3039f6d18..2d5260645 100644 --- a/receipt/src/main/AndroidManifest.xml +++ b/receipt/src/main/AndroidManifest.xml @@ -1,13 +1,19 @@ - - + + + + \ No newline at end of file diff --git a/receipt/src/main/java/com/hyperwallet/android/receipt/view/ListReceiptActivity.java b/receipt/src/main/java/com/hyperwallet/android/receipt/view/ListReceiptActivity.java index e7f57c821..597d38296 100644 --- a/receipt/src/main/java/com/hyperwallet/android/receipt/view/ListReceiptActivity.java +++ b/receipt/src/main/java/com/hyperwallet/android/receipt/view/ListReceiptActivity.java @@ -33,15 +33,18 @@ import com.hyperwallet.android.common.view.error.DefaultErrorDialogFragment; import com.hyperwallet.android.common.view.error.OnNetworkErrorCallback; import com.hyperwallet.android.common.viewmodel.Event; +import com.hyperwallet.android.common.viewmodel.ListDetailNavigator; import com.hyperwallet.android.model.HyperwalletError; import com.hyperwallet.android.model.HyperwalletErrors; +import com.hyperwallet.android.model.receipt.Receipt; import com.hyperwallet.android.receipt.R; import com.hyperwallet.android.receipt.repository.ReceiptRepositoryFactory; import com.hyperwallet.android.receipt.viewmodel.ListReceiptViewModel; import java.util.List; -public class ListReceiptActivity extends AppCompatActivity implements OnNetworkErrorCallback { +public class ListReceiptActivity extends AppCompatActivity implements OnNetworkErrorCallback, + ListDetailNavigator> { private ListReceiptViewModel mListReceiptViewModel; @@ -76,6 +79,13 @@ public void onChanged(Event event) { } }); + mListReceiptViewModel.getDetailNavigation().observe(this, new Observer>() { + @Override + public void onChanged(Event event) { + navigate(event); + } + }); + if (savedInstanceState == null) { initFragment(ListReceiptFragment.newInstance()); } @@ -130,4 +140,13 @@ private void showErrorOnLoadReceipt(@NonNull final List errors fragment.show(fragmentManager); } } + + @Override + public void navigate(@NonNull final Event event) { + if (!event.isContentConsumed()) { + Intent intent = new Intent(this, ReceiptDetailActivity.class); + intent.putExtra(ReceiptDetailActivity.EXTRA_RECEIPT, event.getContent()); + startActivity(intent); + } + } } diff --git a/receipt/src/main/java/com/hyperwallet/android/receipt/view/ListReceiptFragment.java b/receipt/src/main/java/com/hyperwallet/android/receipt/view/ListReceiptFragment.java index ce6f9fd4d..fa671f4a5 100644 --- a/receipt/src/main/java/com/hyperwallet/android/receipt/view/ListReceiptFragment.java +++ b/receipt/src/main/java/com/hyperwallet/android/receipt/view/ListReceiptFragment.java @@ -16,10 +16,6 @@ */ package com.hyperwallet.android.receipt.view; -import static com.hyperwallet.android.model.receipt.Receipt.Entries.CREDIT; -import static com.hyperwallet.android.model.receipt.Receipt.Entries.DEBIT; - -import android.content.Context; import android.os.Bundle; import android.view.LayoutInflater; import android.view.View; @@ -38,12 +34,12 @@ import androidx.recyclerview.widget.RecyclerView; import com.hyperwallet.android.common.util.DateUtils; +import com.hyperwallet.android.common.view.OneClickListener; import com.hyperwallet.android.model.receipt.Receipt; import com.hyperwallet.android.receipt.R; import com.hyperwallet.android.receipt.viewmodel.ListReceiptViewModel; import java.util.Calendar; -import java.util.Locale; import java.util.Objects; public class ListReceiptFragment extends Fragment { @@ -77,14 +73,14 @@ public void onCreate(@Nullable final Bundle savedInstanceState) { @Override public View onCreateView(@NonNull final LayoutInflater inflater, @Nullable final ViewGroup container, @Nullable Bundle savedInstanceState) { - return inflater.inflate(R.layout.list_receipt_fragment, container, false); + return inflater.inflate(R.layout.fragment_list_receipt, container, false); } @Override public void onViewCreated(@NonNull final View view, @Nullable final Bundle savedInstanceState) { super.onViewCreated(view, savedInstanceState); mProgressBar = view.findViewById(R.id.list_receipt_progress_bar); - mListReceiptAdapter = new ListReceiptAdapter(new ListReceiptItemDiffCallback()); + mListReceiptAdapter = new ListReceiptAdapter(mListReceiptViewModel, new ListReceiptItemDiffCallback()); mListReceiptsView = view.findViewById(R.id.list_receipts); mListReceiptsView.setHasFixedSize(true); mListReceiptsView.setLayoutManager(new LinearLayoutManager(getActivity())); @@ -136,12 +132,14 @@ private static class ListReceiptAdapter extends PagedListAdapter { private static final String HEADER_DATE_FORMAT = "MMMM yyyy"; - private static final String CAPTION_DATE_FORMAT = "MMMM dd, yyyy"; private static final int HEADER_VIEW_TYPE = 1; private static final int DATA_VIEW_TYPE = 0; + private final ListReceiptViewModel mReceiptViewModel; - ListReceiptAdapter(@NonNull final DiffUtil.ItemCallback diffCallback) { + ListReceiptAdapter(@NonNull final ListReceiptViewModel receiptViewModel, + @NonNull final DiffUtil.ItemCallback diffCallback) { super(diffCallback); + mReceiptViewModel = receiptViewModel; } @Override @@ -173,10 +171,10 @@ public ReceiptViewHolder onCreateViewHolder(final @NonNull ViewGroup viewGroup, if (viewType == HEADER_VIEW_TYPE) { View headerView = layout.inflate(R.layout.item_receipt_with_header, viewGroup, false); - return new ReceiptViewHolderWithHeader(headerView); + return new ReceiptViewHolderWithHeader(mReceiptViewModel, headerView); } View dataView = layout.inflate(R.layout.item_receipt, viewGroup, false); - return new ReceiptViewHolder(dataView); + return new ReceiptViewHolder(mReceiptViewModel, dataView); } @Override @@ -188,59 +186,23 @@ public void onBindViewHolder(@NonNull final ReceiptViewHolder holder, final int } class ReceiptViewHolder extends RecyclerView.ViewHolder { - private final TextView mTransactionAmount; - private final TextView mTransactionCurrency; - private final TextView mTransactionDate; - private final TextView mTransactionTitle; - private final TextView mTransactionTypeIcon; - ReceiptViewHolder(@NonNull final View item) { + private ListReceiptViewModel mListReceiptViewModel; + + ReceiptViewHolder(@NonNull final ListReceiptViewModel receiptViewModel, + @NonNull final View item) { super(item); - mTransactionAmount = item.findViewById(R.id.transaction_amount); - mTransactionCurrency = item.findViewById(R.id.transaction_currency); - mTransactionDate = item.findViewById(R.id.transaction_date); - mTransactionTitle = item.findViewById(R.id.transaction_title); - mTransactionTypeIcon = item.findViewById(R.id.transaction_type_icon); + mListReceiptViewModel = receiptViewModel; } void bind(@NonNull final Receipt receipt) { - if (CREDIT.equals(receipt.getEntry())) { - mTransactionAmount.setTextColor(mTransactionAmount.getContext() - .getResources().getColor(R.color.positiveColor)); - mTransactionAmount.setText(mTransactionAmount.getContext() - .getString(R.string.credit_sign, receipt.getAmount())); - mTransactionTypeIcon.setTextColor(mTransactionTypeIcon.getContext() - .getResources().getColor(R.color.positiveColor)); - mTransactionTypeIcon.setBackground(mTransactionTypeIcon.getContext() - .getDrawable(R.drawable.circle_positive)); - mTransactionTypeIcon.setText(mTransactionTypeIcon.getContext().getText(R.string.credit)); - } else if (DEBIT.equals(receipt.getEntry())) { - mTransactionAmount.setTextColor(mTransactionAmount.getContext() - .getResources().getColor(R.color.colorAccent)); - mTransactionAmount.setText(mTransactionAmount.getContext() - .getString(R.string.debit_sign, receipt.getAmount())); - mTransactionTypeIcon.setTextColor(mTransactionTypeIcon.getContext() - .getResources().getColor(R.color.colorAccent)); - mTransactionTypeIcon.setBackground(mTransactionTypeIcon.getContext() - .getDrawable(R.drawable.circle_negative)); - mTransactionTypeIcon.setText(mTransactionTypeIcon.getContext().getText(R.string.debit)); - } - - mTransactionCurrency.setText(receipt.getCurrency()); - mTransactionTitle.setText(getTransactionTitle(receipt.getType(), mTransactionTitle.getContext())); - mTransactionDate.setText(DateUtils.toDateFormat(DateUtils. - fromDateTimeString(receipt.getCreatedOn()), CAPTION_DATE_FORMAT)); - } - - String getTransactionTitle(@NonNull final String receiptType, @NonNull final Context context) { - String showTitle = context.getResources().getString(R.string.unknown_type); - int resourceId = context.getResources().getIdentifier(receiptType.toLowerCase(Locale.ROOT), "string", - context.getPackageName()); - if (resourceId != 0) { - showTitle = context.getResources().getString(resourceId); - } - - return showTitle; + ReceiptViewUtil.setTransactionView(receipt, itemView); + itemView.setOnClickListener(new OneClickListener() { + @Override + public void onOneClick(View v) { + mListReceiptViewModel.setDetailNavigation(receipt); + } + }); } } @@ -248,8 +210,9 @@ class ReceiptViewHolderWithHeader extends ReceiptViewHolder { private final TextView mTransactionHeaderText; - ReceiptViewHolderWithHeader(@NonNull final View item) { - super(item); + ReceiptViewHolderWithHeader(@NonNull final ListReceiptViewModel receiptViewModel, + @NonNull final View item) { + super(receiptViewModel, item); mTransactionHeaderText = item.findViewById(R.id.item_date_header_title); } diff --git a/receipt/src/main/java/com/hyperwallet/android/receipt/view/ReceiptDetailActivity.java b/receipt/src/main/java/com/hyperwallet/android/receipt/view/ReceiptDetailActivity.java new file mode 100644 index 000000000..74641b76f --- /dev/null +++ b/receipt/src/main/java/com/hyperwallet/android/receipt/view/ReceiptDetailActivity.java @@ -0,0 +1,72 @@ +/* + * The MIT License (MIT) + * Copyright (c) 2019 Hyperwallet Systems Inc. + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of this software and + * associated documentation files (the "Software"), to deal in the Software without restriction, + * including without limitation the rights to use, copy, modify, merge, publish, distribute, + * sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT + * NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ +package com.hyperwallet.android.receipt.view; + +import android.os.Bundle; +import android.os.Parcelable; + +import androidx.annotation.NonNull; +import androidx.appcompat.app.AppCompatActivity; +import androidx.fragment.app.Fragment; +import androidx.fragment.app.FragmentManager; +import androidx.fragment.app.FragmentTransaction; +import androidx.lifecycle.ViewModelProviders; + +import com.hyperwallet.android.model.receipt.Receipt; +import com.hyperwallet.android.receipt.R; +import com.hyperwallet.android.receipt.viewmodel.ReceiptDetailViewModel; + +public class ReceiptDetailActivity extends AppCompatActivity { + + public static final String EXTRA_RECEIPT = "RECEIPT"; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_receipt_detail); + + getSupportActionBar().setDisplayHomeAsUpEnabled(true); + getSupportActionBar().setDisplayShowHomeEnabled(true); + getSupportActionBar().setTitle(R.string.title_activity_receipt_detail); + + Parcelable parcel = getIntent().getParcelableExtra(EXTRA_RECEIPT); + if (parcel instanceof Receipt) { + ReceiptDetailViewModel viewModel = ViewModelProviders.of(this).get(ReceiptDetailViewModel.class); + viewModel.setReceipt((Receipt) parcel); + } else { + throw new IllegalArgumentException("Cannot initialize " + ReceiptDetailActivity.class.getName() + + " " + EXTRA_RECEIPT + " argument is not as what is expected."); + } + + if (savedInstanceState == null) { + initFragment(ReceiptDetailFragment.newInstance()); + } + } + + private void initFragment(@NonNull final Fragment fragment) { + FragmentManager fragmentManager = getSupportFragmentManager(); + FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction(); + fragmentTransaction.add(R.id.receipt_detail_fragment, fragment); + fragmentTransaction.commit(); + } + + @Override + public boolean onSupportNavigateUp() { + onBackPressed(); + return true; + } +} diff --git a/receipt/src/main/java/com/hyperwallet/android/receipt/view/ReceiptDetailFragment.java b/receipt/src/main/java/com/hyperwallet/android/receipt/view/ReceiptDetailFragment.java new file mode 100644 index 000000000..4719588f0 --- /dev/null +++ b/receipt/src/main/java/com/hyperwallet/android/receipt/view/ReceiptDetailFragment.java @@ -0,0 +1,134 @@ +/* + * The MIT License (MIT) + * Copyright (c) 2019 Hyperwallet Systems Inc. + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of this software and + * associated documentation files (the "Software"), to deal in the Software without restriction, + * including without limitation the rights to use, copy, modify, merge, publish, distribute, + * sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT + * NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ +package com.hyperwallet.android.receipt.view; + +import android.os.Bundle; +import android.text.TextUtils; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.TextView; + +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import androidx.fragment.app.Fragment; +import androidx.lifecycle.ViewModelProviders; + +import com.hyperwallet.android.common.util.DateUtils; +import com.hyperwallet.android.model.receipt.Receipt; +import com.hyperwallet.android.receipt.R; +import com.hyperwallet.android.receipt.viewmodel.ReceiptDetailViewModel; + +import java.text.DecimalFormat; + +public class ReceiptDetailFragment extends Fragment { + + private static final String DETAIL_DATE_FORMAT = "E MMM dd YYYY - k:mm z"; + private static final String AMOUNT_FORMAT = "#,##0.00"; + private ReceiptDetailViewModel mReceiptDetailViewModel; + + public ReceiptDetailFragment() { + setRetainInstance(true); + } + + public static ReceiptDetailFragment newInstance() { + ReceiptDetailFragment fragment = new ReceiptDetailFragment(); + return fragment; + } + + @Override + public void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + mReceiptDetailViewModel = ViewModelProviders.of(requireActivity()).get(ReceiptDetailViewModel.class); + } + + @Override + public View onCreateView(LayoutInflater inflater, ViewGroup container, + Bundle savedInstanceState) { + return inflater.inflate(R.layout.fragment_receipt_detail, container, false); + } + + @Override + public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) { + super.onViewCreated(view, savedInstanceState); + + Receipt receipt = mReceiptDetailViewModel.getReceipt(); + + // transactions + ReceiptViewUtil.setTransactionView(receipt, view); + + // fee details + if (!TextUtils.isEmpty(receipt.getFee())) { + view.findViewById(R.id.fee_details_layout).setVisibility(View.VISIBLE); + double feeAmount = Double.parseDouble(receipt.getFee()); + double transferAmount = Double.parseDouble(receipt.getAmount()); + double amount = transferAmount - feeAmount; + DecimalFormat decimalFormat = new DecimalFormat(AMOUNT_FORMAT); + + TextView amountView = view.findViewById(R.id.details_amount_value); + amountView.setText(view.getContext().getString(R.string.amount_view_format, + decimalFormat.format(amount), receipt.getCurrency())); + + TextView fee = view.findViewById(R.id.details_fee_value); + fee.setText(view.getContext().getString(R.string.amount_view_format, + decimalFormat.format(feeAmount), receipt.getCurrency())); + + TextView transfer = view.findViewById(R.id.details_transfer_amount_value); + transfer.setText(view.getContext().getString(R.string.amount_view_format, + decimalFormat.format(transferAmount), receipt.getCurrency())); + } + + // receipt details + TextView receiptId = view.findViewById(R.id.receipt_id_value); + receiptId.setText(receipt.getJournalId()); + TextView date = view.findViewById(R.id.date_value); + date.setText(DateUtils.toDateFormat(DateUtils. + fromDateTimeString(receipt.getCreatedOn()), DETAIL_DATE_FORMAT)); + + if (receipt.getDetails() != null) { + if (!TextUtils.isEmpty(receipt.getDetails().getCharityName())) { + view.findViewById(R.id.charity_layout).setVisibility(View.VISIBLE); + TextView charity = view.findViewById(R.id.charity_value); + charity.setText(receipt.getDetails().getCharityName()); + } + + if (!TextUtils.isEmpty(receipt.getDetails().getCheckNumber())) { + view.findViewById(R.id.check_number_layout).setVisibility(View.VISIBLE); + TextView check = view.findViewById(R.id.check_number_value); + check.setText(receipt.getDetails().getCheckNumber()); + } + + if (!TextUtils.isEmpty(receipt.getDetails().getClientPaymentId())) { + view.findViewById(R.id.client_id_layout).setVisibility(View.VISIBLE); + TextView client = view.findViewById(R.id.client_id_value); + client.setText(receipt.getDetails().getClientPaymentId()); + } + + if (!TextUtils.isEmpty(receipt.getDetails().getNotes())) { + view.findViewById(R.id.notes_layout).setVisibility(View.VISIBLE); + TextView notes = view.findViewById(R.id.notes_value); + notes.setText(receipt.getDetails().getNotes()); + } + + if (!TextUtils.isEmpty(receipt.getDetails().getWebsite())) { + view.findViewById(R.id.website_layout).setVisibility(View.VISIBLE); + TextView website = view.findViewById(R.id.notes_value); + website.setText(receipt.getDetails().getWebsite()); + } + } + } +} diff --git a/receipt/src/main/java/com/hyperwallet/android/receipt/view/ReceiptViewUtil.java b/receipt/src/main/java/com/hyperwallet/android/receipt/view/ReceiptViewUtil.java new file mode 100644 index 000000000..ca7bdabf6 --- /dev/null +++ b/receipt/src/main/java/com/hyperwallet/android/receipt/view/ReceiptViewUtil.java @@ -0,0 +1,86 @@ +/* + * The MIT License (MIT) + * Copyright (c) 2019 Hyperwallet Systems Inc. + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of this software and + * associated documentation files (the "Software"), to deal in the Software without restriction, + * including without limitation the rights to use, copy, modify, merge, publish, distribute, + * sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT + * NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ +package com.hyperwallet.android.receipt.view; + +import static com.hyperwallet.android.model.receipt.Receipt.Entries.CREDIT; +import static com.hyperwallet.android.model.receipt.Receipt.Entries.DEBIT; + +import android.content.Context; +import android.view.View; +import android.widget.TextView; + +import androidx.annotation.NonNull; + +import com.hyperwallet.android.common.util.DateUtils; +import com.hyperwallet.android.model.receipt.Receipt; +import com.hyperwallet.android.receipt.R; + +import java.util.Locale; + +final class ReceiptViewUtil { + + private static final String CAPTION_DATE_FORMAT = "MMMM dd, yyyy"; + + private ReceiptViewUtil() { + } + + static void setTransactionView(@NonNull final Receipt receipt, @NonNull final View view) { + TextView transactionTypeIcon = view.findViewById(R.id.transaction_type_icon); + TextView transactionTitle = view.findViewById(R.id.transaction_title); + TextView transactionDate = view.findViewById(R.id.transaction_date); + TextView transactionAmount = view.findViewById(R.id.transaction_amount); + TextView transactionCurrency = view.findViewById(R.id.transaction_currency); + + if (CREDIT.equals(receipt.getEntry())) { + transactionAmount.setTextColor(transactionAmount.getContext() + .getResources().getColor(R.color.positiveColor)); + transactionAmount.setText(transactionAmount.getContext() + .getString(R.string.credit_sign, receipt.getAmount())); + transactionTypeIcon.setTextColor(transactionTypeIcon.getContext() + .getResources().getColor(R.color.positiveColor)); + transactionTypeIcon.setBackground(transactionTypeIcon.getContext() + .getDrawable(R.drawable.circle_positive)); + transactionTypeIcon.setText(transactionTypeIcon.getContext().getText(R.string.credit)); + } else if (DEBIT.equals(receipt.getEntry())) { + transactionAmount.setTextColor(transactionAmount.getContext() + .getResources().getColor(R.color.colorAccent)); + transactionAmount.setText(transactionAmount.getContext() + .getString(R.string.debit_sign, receipt.getAmount())); + transactionTypeIcon.setTextColor(transactionTypeIcon.getContext() + .getResources().getColor(R.color.colorAccent)); + transactionTypeIcon.setBackground(transactionTypeIcon.getContext() + .getDrawable(R.drawable.circle_negative)); + transactionTypeIcon.setText(transactionTypeIcon.getContext().getText(R.string.debit)); + } + + transactionCurrency.setText(receipt.getCurrency()); + transactionTitle.setText(getTransactionTitle(receipt.getType(), transactionTitle.getContext())); + transactionDate.setText(DateUtils.toDateFormat(DateUtils. + fromDateTimeString(receipt.getCreatedOn()), CAPTION_DATE_FORMAT)); + } + + private static String getTransactionTitle(@NonNull final String receiptType, @NonNull final Context context) { + String showTitle = context.getResources().getString(R.string.unknown_type); + int resourceId = context.getResources().getIdentifier(receiptType.toLowerCase(Locale.ROOT), "string", + context.getPackageName()); + if (resourceId != 0) { + showTitle = context.getResources().getString(resourceId); + } + + return showTitle; + } +} diff --git a/receipt/src/main/java/com/hyperwallet/android/receipt/viewmodel/ListReceiptViewModel.java b/receipt/src/main/java/com/hyperwallet/android/receipt/viewmodel/ListReceiptViewModel.java index 57f41b5c1..612a8ae59 100644 --- a/receipt/src/main/java/com/hyperwallet/android/receipt/viewmodel/ListReceiptViewModel.java +++ b/receipt/src/main/java/com/hyperwallet/android/receipt/viewmodel/ListReceiptViewModel.java @@ -32,6 +32,7 @@ public class ListReceiptViewModel extends ViewModel { private MutableLiveData> mErrorEvent = new MutableLiveData<>(); + private MutableLiveData> mDetailNavigation = new MutableLiveData<>(); private Observer> mErrorEventObserver; private ReceiptRepository mReceiptRepository; @@ -66,6 +67,14 @@ public void retryLoadReceipts() { mReceiptRepository.retryLoadReceipt(); } + public LiveData> getDetailNavigation() { + return mDetailNavigation; + } + + public void setDetailNavigation(@NonNull final Receipt receipt) { + mDetailNavigation.postValue(new Event<>(receipt)); + } + @Override protected void onCleared() { super.onCleared(); diff --git a/receipt/src/main/java/com/hyperwallet/android/receipt/viewmodel/ReceiptDetailViewModel.java b/receipt/src/main/java/com/hyperwallet/android/receipt/viewmodel/ReceiptDetailViewModel.java new file mode 100644 index 000000000..23d937e27 --- /dev/null +++ b/receipt/src/main/java/com/hyperwallet/android/receipt/viewmodel/ReceiptDetailViewModel.java @@ -0,0 +1,34 @@ +/* + * The MIT License (MIT) + * Copyright (c) 2019 Hyperwallet Systems Inc. + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of this software and + * associated documentation files (the "Software"), to deal in the Software without restriction, + * including without limitation the rights to use, copy, modify, merge, publish, distribute, + * sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT + * NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ +package com.hyperwallet.android.receipt.viewmodel; + +import androidx.lifecycle.ViewModel; + +import com.hyperwallet.android.model.receipt.Receipt; + +public class ReceiptDetailViewModel extends ViewModel { + + private Receipt mReceipt; + + public Receipt getReceipt() { + return mReceipt; + } + + public void setReceipt(Receipt receipt) { + mReceipt = receipt; + } +} diff --git a/receipt/src/main/res/layout/activity_receipt_detail.xml b/receipt/src/main/res/layout/activity_receipt_detail.xml new file mode 100644 index 000000000..f59621173 --- /dev/null +++ b/receipt/src/main/res/layout/activity_receipt_detail.xml @@ -0,0 +1,18 @@ + + + + + + diff --git a/receipt/src/main/res/layout/list_receipt_fragment.xml b/receipt/src/main/res/layout/fragment_list_receipt.xml similarity index 100% rename from receipt/src/main/res/layout/list_receipt_fragment.xml rename to receipt/src/main/res/layout/fragment_list_receipt.xml diff --git a/receipt/src/main/res/layout/fragment_receipt_detail.xml b/receipt/src/main/res/layout/fragment_receipt_detail.xml new file mode 100644 index 000000000..8d1fb183b --- /dev/null +++ b/receipt/src/main/res/layout/fragment_receipt_detail.xml @@ -0,0 +1,431 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/receipt/src/main/res/layout/item_receipt.xml b/receipt/src/main/res/layout/item_receipt.xml index 4388d4ab7..9d30c3fee 100644 --- a/receipt/src/main/res/layout/item_receipt.xml +++ b/receipt/src/main/res/layout/item_receipt.xml @@ -1,73 +1,9 @@ - - - - - - - - - - + \ No newline at end of file diff --git a/receipt/src/main/res/layout/item_receipt_with_header.xml b/receipt/src/main/res/layout/item_receipt_with_header.xml index 29f002169..4b7e57253 100644 --- a/receipt/src/main/res/layout/item_receipt_with_header.xml +++ b/receipt/src/main/res/layout/item_receipt_with_header.xml @@ -21,6 +21,13 @@ android:textAppearance="@style/TextAppearance.Hyperwallet.Body2"/> - + + + + + \ No newline at end of file diff --git a/receipt/src/main/res/layout/receipt.xml b/receipt/src/main/res/layout/receipt.xml new file mode 100644 index 000000000..db8ab28da --- /dev/null +++ b/receipt/src/main/res/layout/receipt.xml @@ -0,0 +1,69 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/receipt/src/main/res/values/dimens.xml b/receipt/src/main/res/values/dimens.xml index 999d990b2..328889b96 100644 --- a/receipt/src/main/res/values/dimens.xml +++ b/receipt/src/main/res/values/dimens.xml @@ -3,4 +3,5 @@ 10dp 8dp 70dp + 16dp diff --git a/receipt/src/main/res/values/strings.xml b/receipt/src/main/res/values/strings.xml index 6c6730a9e..e0022a543 100644 --- a/receipt/src/main/res/values/strings.xml +++ b/receipt/src/main/res/values/strings.xml @@ -1,6 +1,22 @@ receipt Transactions + Transaction Details + Transaction + Details + Amount: + Fee: + Transfer Amount: + Receipt + Receipt ID: + Date: + Client ID: + Notes: + Charity Name: + Check Number: + Website: + %s %s + Seems like, you don\'t have any Transactions, yet. @@ -115,4 +131,5 @@ Wire Transfer Wire Transfer Fee Wire Transfer Return + MainActivity diff --git a/ui/src/main/java/com/hyperwallet/android/ui/transfermethod/ListTransferMethodActivity.java b/ui/src/main/java/com/hyperwallet/android/ui/transfermethod/ListTransferMethodActivity.java index 9f3f37654..0f29c1df3 100644 --- a/ui/src/main/java/com/hyperwallet/android/ui/transfermethod/ListTransferMethodActivity.java +++ b/ui/src/main/java/com/hyperwallet/android/ui/transfermethod/ListTransferMethodActivity.java @@ -30,12 +30,12 @@ import androidx.fragment.app.FragmentTransaction; import com.google.android.material.floatingactionbutton.FloatingActionButton; +import com.hyperwallet.android.common.view.OneClickListener; import com.hyperwallet.android.common.view.error.DefaultErrorDialogFragment; import com.hyperwallet.android.common.view.error.OnNetworkErrorCallback; import com.hyperwallet.android.hyperwallet_ui.R; import com.hyperwallet.android.model.HyperwalletError; import com.hyperwallet.android.model.transfermethod.HyperwalletTransferMethod; -import com.hyperwallet.android.ui.view.widget.OneClickListener; import java.util.List; diff --git a/ui/src/main/java/com/hyperwallet/android/ui/transfermethod/ListTransferMethodFragment.java b/ui/src/main/java/com/hyperwallet/android/ui/transfermethod/ListTransferMethodFragment.java index d09829047..fe1949269 100644 --- a/ui/src/main/java/com/hyperwallet/android/ui/transfermethod/ListTransferMethodFragment.java +++ b/ui/src/main/java/com/hyperwallet/android/ui/transfermethod/ListTransferMethodFragment.java @@ -49,13 +49,13 @@ import androidx.recyclerview.widget.RecyclerView; import com.hyperwallet.android.common.view.HorizontalDividerItemDecorator; +import com.hyperwallet.android.common.view.OneClickListener; import com.hyperwallet.android.hyperwallet_ui.R; import com.hyperwallet.android.model.HyperwalletError; import com.hyperwallet.android.model.HyperwalletStatusTransition; import com.hyperwallet.android.model.transfermethod.HyperwalletTransferMethod; import com.hyperwallet.android.ui.HyperwalletLocalBroadcast; import com.hyperwallet.android.ui.repository.RepositoryFactory; -import com.hyperwallet.android.ui.view.widget.OneClickListener; import java.util.ArrayList; import java.util.List; diff --git a/ui/src/main/java/com/hyperwallet/android/ui/transfermethod/SelectTransferMethodFragment.java b/ui/src/main/java/com/hyperwallet/android/ui/transfermethod/SelectTransferMethodFragment.java index 154a2bff0..aac497695 100644 --- a/ui/src/main/java/com/hyperwallet/android/ui/transfermethod/SelectTransferMethodFragment.java +++ b/ui/src/main/java/com/hyperwallet/android/ui/transfermethod/SelectTransferMethodFragment.java @@ -39,12 +39,12 @@ import androidx.recyclerview.widget.RecyclerView; import com.hyperwallet.android.common.view.HorizontalDividerItemDecorator; +import com.hyperwallet.android.common.view.OneClickListener; import com.hyperwallet.android.hyperwallet_ui.R; import com.hyperwallet.android.model.HyperwalletError; import com.hyperwallet.android.ui.repository.RepositoryFactory; import com.hyperwallet.android.ui.view.CountrySelectionDialogFragment; import com.hyperwallet.android.ui.view.CurrencySelectionDialogFragment; -import com.hyperwallet.android.ui.view.widget.OneClickListener; import java.util.ArrayList; import java.util.List; From 6f222bdf8fbf82c7492f7495a304fe68c3f13dcb Mon Sep 17 00:00:00 2001 From: Peter Olamit Date: Wed, 12 Jun 2019 11:56:01 -0700 Subject: [PATCH 02/23] remove unnecessary configs --- .../android/common/view/OneClickListener.java | 16 ++++++++++++++++ receipt/build.gradle | 4 ---- receipt/config/lint.xml | 3 +++ receipt/src/main/AndroidManifest.xml | 7 +++++-- .../receipt/view/ReceiptDetailActivity.java | 10 ++++++++++ .../main/res/layout/activity_receipt_detail.xml | 14 ++++++++++++++ receipt/src/main/res/values/dimens.xml | 1 - receipt/src/main/res/values/strings.xml | 1 - 8 files changed, 48 insertions(+), 8 deletions(-) diff --git a/common/src/main/java/com/hyperwallet/android/common/view/OneClickListener.java b/common/src/main/java/com/hyperwallet/android/common/view/OneClickListener.java index 4ac3cbcf6..f244cb244 100644 --- a/common/src/main/java/com/hyperwallet/android/common/view/OneClickListener.java +++ b/common/src/main/java/com/hyperwallet/android/common/view/OneClickListener.java @@ -1,3 +1,19 @@ +/* + * The MIT License (MIT) + * Copyright (c) 2019 Hyperwallet Systems Inc. + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of this software and + * associated documentation files (the "Software"), to deal in the Software without restriction, + * including without limitation the rights to use, copy, modify, merge, publish, distribute, + * sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT + * NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ package com.hyperwallet.android.common.view; import android.os.SystemClock; diff --git a/receipt/build.gradle b/receipt/build.gradle index 3e8b31635..a25d0e955 100644 --- a/receipt/build.gradle +++ b/receipt/build.gradle @@ -10,10 +10,6 @@ dependencies { implementation "androidx.lifecycle:lifecycle-extensions:$lifecycleExtensionsVersion" implementation "androidx.paging:paging-runtime:$pagingRuntimeVersion" - implementation 'androidx.appcompat:appcompat:1.0.2' - implementation 'androidx.constraintlayout:constraintlayout:1.1.3' - implementation 'androidx.legacy:legacy-support-v4:1.0.0' - implementation 'com.google.android.material:material:1.0.0' testImplementation "org.robolectric:robolectric:$robolectricVersion" androidTestImplementation "androidx.test:rules:$testRulesVersion" diff --git a/receipt/config/lint.xml b/receipt/config/lint.xml index 3c83d4bb5..ff446fa9e 100644 --- a/receipt/config/lint.xml +++ b/receipt/config/lint.xml @@ -4,4 +4,7 @@ + + + \ No newline at end of file diff --git a/receipt/src/main/AndroidManifest.xml b/receipt/src/main/AndroidManifest.xml index 2d5260645..bc6466bb8 100644 --- a/receipt/src/main/AndroidManifest.xml +++ b/receipt/src/main/AndroidManifest.xml @@ -8,8 +8,11 @@ - - + + + + + + + + + 10dp 8dp 70dp - 16dp diff --git a/receipt/src/main/res/values/strings.xml b/receipt/src/main/res/values/strings.xml index e0022a543..d6b595c3b 100644 --- a/receipt/src/main/res/values/strings.xml +++ b/receipt/src/main/res/values/strings.xml @@ -131,5 +131,4 @@ Wire Transfer Wire Transfer Fee Wire Transfer Return - MainActivity From 4d879811a436b07286082c56621ff0b97fc4f110 Mon Sep 17 00:00:00 2001 From: Peter Olamit Date: Wed, 12 Jun 2019 14:51:57 -0700 Subject: [PATCH 03/23] formatted amounts --- .../android/receipt/view/ListReceiptFragment.java | 7 +++++-- .../receipt/view/ReceiptDetailFragment.java | 8 +++++--- .../android/receipt/view/ReceiptViewUtil.java | 15 +++++++++------ receipt/src/main/res/layout/item_receipt.xml | 1 + .../main/res/layout/item_receipt_with_header.xml | 1 + 5 files changed, 21 insertions(+), 11 deletions(-) diff --git a/receipt/src/main/java/com/hyperwallet/android/receipt/view/ListReceiptFragment.java b/receipt/src/main/java/com/hyperwallet/android/receipt/view/ListReceiptFragment.java index fa671f4a5..a1de5414e 100644 --- a/receipt/src/main/java/com/hyperwallet/android/receipt/view/ListReceiptFragment.java +++ b/receipt/src/main/java/com/hyperwallet/android/receipt/view/ListReceiptFragment.java @@ -188,16 +188,19 @@ public void onBindViewHolder(@NonNull final ReceiptViewHolder holder, final int class ReceiptViewHolder extends RecyclerView.ViewHolder { private ListReceiptViewModel mListReceiptViewModel; + private View mView; ReceiptViewHolder(@NonNull final ListReceiptViewModel receiptViewModel, @NonNull final View item) { super(item); + mView = item.findViewById(R.id.receipt_item); mListReceiptViewModel = receiptViewModel; } void bind(@NonNull final Receipt receipt) { - ReceiptViewUtil.setTransactionView(receipt, itemView); - itemView.setOnClickListener(new OneClickListener() { + ReceiptViewUtil util = new ReceiptViewUtil(); + util.setTransactionView(receipt, itemView); + mView.setOnClickListener(new OneClickListener() { @Override public void onOneClick(View v) { mListReceiptViewModel.setDetailNavigation(receipt); diff --git a/receipt/src/main/java/com/hyperwallet/android/receipt/view/ReceiptDetailFragment.java b/receipt/src/main/java/com/hyperwallet/android/receipt/view/ReceiptDetailFragment.java index 4719588f0..1c540e48e 100644 --- a/receipt/src/main/java/com/hyperwallet/android/receipt/view/ReceiptDetailFragment.java +++ b/receipt/src/main/java/com/hyperwallet/android/receipt/view/ReceiptDetailFragment.java @@ -16,6 +16,9 @@ */ package com.hyperwallet.android.receipt.view; +import static com.hyperwallet.android.receipt.view.ReceiptViewUtil.AMOUNT_FORMAT; +import static com.hyperwallet.android.receipt.view.ReceiptViewUtil.DETAIL_DATE_FORMAT; + import android.os.Bundle; import android.text.TextUtils; import android.view.LayoutInflater; @@ -37,8 +40,6 @@ public class ReceiptDetailFragment extends Fragment { - private static final String DETAIL_DATE_FORMAT = "E MMM dd YYYY - k:mm z"; - private static final String AMOUNT_FORMAT = "#,##0.00"; private ReceiptDetailViewModel mReceiptDetailViewModel; public ReceiptDetailFragment() { @@ -69,7 +70,8 @@ public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceStat Receipt receipt = mReceiptDetailViewModel.getReceipt(); // transactions - ReceiptViewUtil.setTransactionView(receipt, view); + ReceiptViewUtil util = new ReceiptViewUtil(); + util.setTransactionView(receipt, view); // fee details if (!TextUtils.isEmpty(receipt.getFee())) { diff --git a/receipt/src/main/java/com/hyperwallet/android/receipt/view/ReceiptViewUtil.java b/receipt/src/main/java/com/hyperwallet/android/receipt/view/ReceiptViewUtil.java index ca7bdabf6..0bd7ed3ef 100644 --- a/receipt/src/main/java/com/hyperwallet/android/receipt/view/ReceiptViewUtil.java +++ b/receipt/src/main/java/com/hyperwallet/android/receipt/view/ReceiptViewUtil.java @@ -29,27 +29,30 @@ import com.hyperwallet.android.model.receipt.Receipt; import com.hyperwallet.android.receipt.R; +import java.text.DecimalFormat; import java.util.Locale; final class ReceiptViewUtil { + static final String DETAIL_DATE_FORMAT = "E MMM dd, YYYY - k:mm zzz"; + static final String AMOUNT_FORMAT = "#,##0.00"; private static final String CAPTION_DATE_FORMAT = "MMMM dd, yyyy"; - private ReceiptViewUtil() { - } - - static void setTransactionView(@NonNull final Receipt receipt, @NonNull final View view) { + void setTransactionView(@NonNull final Receipt receipt, @NonNull final View view) { TextView transactionTypeIcon = view.findViewById(R.id.transaction_type_icon); TextView transactionTitle = view.findViewById(R.id.transaction_title); TextView transactionDate = view.findViewById(R.id.transaction_date); TextView transactionAmount = view.findViewById(R.id.transaction_amount); TextView transactionCurrency = view.findViewById(R.id.transaction_currency); + DecimalFormat decimalFormat = new DecimalFormat(AMOUNT_FORMAT); + double amount = Double.parseDouble(receipt.getAmount()); + String formattedAmount = decimalFormat.format(amount); if (CREDIT.equals(receipt.getEntry())) { transactionAmount.setTextColor(transactionAmount.getContext() .getResources().getColor(R.color.positiveColor)); transactionAmount.setText(transactionAmount.getContext() - .getString(R.string.credit_sign, receipt.getAmount())); + .getString(R.string.credit_sign, formattedAmount)); transactionTypeIcon.setTextColor(transactionTypeIcon.getContext() .getResources().getColor(R.color.positiveColor)); transactionTypeIcon.setBackground(transactionTypeIcon.getContext() @@ -59,7 +62,7 @@ static void setTransactionView(@NonNull final Receipt receipt, @NonNull final Vi transactionAmount.setTextColor(transactionAmount.getContext() .getResources().getColor(R.color.colorAccent)); transactionAmount.setText(transactionAmount.getContext() - .getString(R.string.debit_sign, receipt.getAmount())); + .getString(R.string.debit_sign, formattedAmount)); transactionTypeIcon.setTextColor(transactionTypeIcon.getContext() .getResources().getColor(R.color.colorAccent)); transactionTypeIcon.setBackground(transactionTypeIcon.getContext() diff --git a/receipt/src/main/res/layout/item_receipt.xml b/receipt/src/main/res/layout/item_receipt.xml index 9d30c3fee..c30bba973 100644 --- a/receipt/src/main/res/layout/item_receipt.xml +++ b/receipt/src/main/res/layout/item_receipt.xml @@ -1,6 +1,7 @@ diff --git a/receipt/src/main/res/layout/item_receipt_with_header.xml b/receipt/src/main/res/layout/item_receipt_with_header.xml index 4b7e57253..9e5c72649 100644 --- a/receipt/src/main/res/layout/item_receipt_with_header.xml +++ b/receipt/src/main/res/layout/item_receipt_with_header.xml @@ -23,6 +23,7 @@ From 5ffbcb3dac30e8faf8e309073c9e150041026ec6 Mon Sep 17 00:00:00 2001 From: Peter Olamit Date: Wed, 12 Jun 2019 15:12:49 -0700 Subject: [PATCH 04/23] remove static --- .../com/hyperwallet/android/receipt/view/ReceiptViewUtil.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/receipt/src/main/java/com/hyperwallet/android/receipt/view/ReceiptViewUtil.java b/receipt/src/main/java/com/hyperwallet/android/receipt/view/ReceiptViewUtil.java index 0bd7ed3ef..9707915b8 100644 --- a/receipt/src/main/java/com/hyperwallet/android/receipt/view/ReceiptViewUtil.java +++ b/receipt/src/main/java/com/hyperwallet/android/receipt/view/ReceiptViewUtil.java @@ -76,7 +76,7 @@ void setTransactionView(@NonNull final Receipt receipt, @NonNull final View view fromDateTimeString(receipt.getCreatedOn()), CAPTION_DATE_FORMAT)); } - private static String getTransactionTitle(@NonNull final String receiptType, @NonNull final Context context) { + String getTransactionTitle(@NonNull final String receiptType, @NonNull final Context context) { String showTitle = context.getResources().getString(R.string.unknown_type); int resourceId = context.getResources().getIdentifier(receiptType.toLowerCase(Locale.ROOT), "string", context.getPackageName()); From 30d585a4f8556aed24f804930ecf89a4e1c677ea Mon Sep 17 00:00:00 2001 From: Peter Olamit Date: Wed, 12 Jun 2019 15:15:44 -0700 Subject: [PATCH 05/23] fixed variable name --- .../hyperwallet/android/receipt/view/ListReceiptFragment.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/receipt/src/main/java/com/hyperwallet/android/receipt/view/ListReceiptFragment.java b/receipt/src/main/java/com/hyperwallet/android/receipt/view/ListReceiptFragment.java index a1de5414e..309f0a4b6 100644 --- a/receipt/src/main/java/com/hyperwallet/android/receipt/view/ListReceiptFragment.java +++ b/receipt/src/main/java/com/hyperwallet/android/receipt/view/ListReceiptFragment.java @@ -92,8 +92,8 @@ public void onViewCreated(@NonNull final View view, @Nullable final Bundle saved private void registerObservers() { mListReceiptViewModel.getReceiptList().observe(getViewLifecycleOwner(), new Observer>() { @Override - public void onChanged(PagedList transferMethods) { - mListReceiptAdapter.submitList(transferMethods); + public void onChanged(PagedList receipts) { + mListReceiptAdapter.submitList(receipts); } }); From c6926294b279f1992abe1ad1e6c07d312688d7e3 Mon Sep 17 00:00:00 2001 From: Peter Olamit Date: Thu, 13 Jun 2019 08:53:50 -0700 Subject: [PATCH 06/23] refactored methods --- .../receipt/view/ReceiptDetailFragment.java | 45 ++++++++++--------- .../android/receipt/view/ReceiptViewUtil.java | 2 +- .../res/layout/fragment_receipt_detail.xml | 13 ------ 3 files changed, 26 insertions(+), 34 deletions(-) diff --git a/receipt/src/main/java/com/hyperwallet/android/receipt/view/ReceiptDetailFragment.java b/receipt/src/main/java/com/hyperwallet/android/receipt/view/ReceiptDetailFragment.java index 1c540e48e..0c2e719ec 100644 --- a/receipt/src/main/java/com/hyperwallet/android/receipt/view/ReceiptDetailFragment.java +++ b/receipt/src/main/java/com/hyperwallet/android/receipt/view/ReceiptDetailFragment.java @@ -26,6 +26,7 @@ import android.view.ViewGroup; import android.widget.TextView; +import androidx.annotation.IdRes; import androidx.annotation.NonNull; import androidx.annotation.Nullable; import androidx.fragment.app.Fragment; @@ -33,6 +34,7 @@ import com.hyperwallet.android.common.util.DateUtils; import com.hyperwallet.android.model.receipt.Receipt; +import com.hyperwallet.android.model.receipt.ReceiptDetails; import com.hyperwallet.android.receipt.R; import com.hyperwallet.android.receipt.viewmodel.ReceiptDetailViewModel; @@ -102,35 +104,38 @@ public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceStat fromDateTimeString(receipt.getCreatedOn()), DETAIL_DATE_FORMAT)); if (receipt.getDetails() != null) { - if (!TextUtils.isEmpty(receipt.getDetails().getCharityName())) { - view.findViewById(R.id.charity_layout).setVisibility(View.VISIBLE); - TextView charity = view.findViewById(R.id.charity_value); - charity.setText(receipt.getDetails().getCharityName()); + ReceiptDetails receiptDetails = receipt.getDetails(); + if (!TextUtils.isEmpty(receiptDetails.getCharityName())) { + setViewInformation(R.id.charity_layout, R.id.charity_value, + view, receiptDetails.getCharityName()); } - if (!TextUtils.isEmpty(receipt.getDetails().getCheckNumber())) { - view.findViewById(R.id.check_number_layout).setVisibility(View.VISIBLE); - TextView check = view.findViewById(R.id.check_number_value); - check.setText(receipt.getDetails().getCheckNumber()); + if (!TextUtils.isEmpty(receiptDetails.getCheckNumber())) { + setViewInformation(R.id.check_number_layout, R.id.check_number_value, + view, receiptDetails.getCheckNumber()); } - if (!TextUtils.isEmpty(receipt.getDetails().getClientPaymentId())) { - view.findViewById(R.id.client_id_layout).setVisibility(View.VISIBLE); - TextView client = view.findViewById(R.id.client_id_value); - client.setText(receipt.getDetails().getClientPaymentId()); + if (!TextUtils.isEmpty(receiptDetails.getClientPaymentId())) { + setViewInformation(R.id.client_id_layout, R.id.client_id_value, + view, receiptDetails.getClientPaymentId()); } - if (!TextUtils.isEmpty(receipt.getDetails().getNotes())) { - view.findViewById(R.id.notes_layout).setVisibility(View.VISIBLE); - TextView notes = view.findViewById(R.id.notes_value); - notes.setText(receipt.getDetails().getNotes()); + if (!TextUtils.isEmpty(receiptDetails.getNotes())) { + setViewInformation(R.id.notes_layout, R.id.notes_value, + view, receiptDetails.getNotes()); } - if (!TextUtils.isEmpty(receipt.getDetails().getWebsite())) { - view.findViewById(R.id.website_layout).setVisibility(View.VISIBLE); - TextView website = view.findViewById(R.id.notes_value); - website.setText(receipt.getDetails().getWebsite()); + if (!TextUtils.isEmpty(receiptDetails.getWebsite())) { + setViewInformation(R.id.website_layout, R.id.website_value, + view, receiptDetails.getWebsite()); } } } + + private void setViewInformation(@IdRes final int layout, @IdRes final int viewValue, + @NonNull final View view, @NonNull final String value) { + view.findViewById(layout).setVisibility(View.VISIBLE); + TextView textView = view.findViewById(viewValue); + textView.setText(value); + } } diff --git a/receipt/src/main/java/com/hyperwallet/android/receipt/view/ReceiptViewUtil.java b/receipt/src/main/java/com/hyperwallet/android/receipt/view/ReceiptViewUtil.java index 9707915b8..2048d1401 100644 --- a/receipt/src/main/java/com/hyperwallet/android/receipt/view/ReceiptViewUtil.java +++ b/receipt/src/main/java/com/hyperwallet/android/receipt/view/ReceiptViewUtil.java @@ -35,7 +35,7 @@ final class ReceiptViewUtil { static final String DETAIL_DATE_FORMAT = "E MMM dd, YYYY - k:mm zzz"; - static final String AMOUNT_FORMAT = "#,##0.00"; + static final String AMOUNT_FORMAT = "###0.00"; private static final String CAPTION_DATE_FORMAT = "MMMM dd, yyyy"; void setTransactionView(@NonNull final Receipt receipt, @NonNull final View view) { diff --git a/receipt/src/main/res/layout/fragment_receipt_detail.xml b/receipt/src/main/res/layout/fragment_receipt_detail.xml index 8d1fb183b..79aafab7d 100644 --- a/receipt/src/main/res/layout/fragment_receipt_detail.xml +++ b/receipt/src/main/res/layout/fragment_receipt_detail.xml @@ -415,17 +415,4 @@ - - - - - - - - - - - - - \ No newline at end of file From 8987e718d5338b76f05724d55923f304c121c6df Mon Sep 17 00:00:00 2001 From: Peter Olamit Date: Fri, 14 Jun 2019 07:53:36 -0700 Subject: [PATCH 07/23] added 12-HR to 24-HR and vice-versa formatter --- .../android/receipt/view/ReceiptDetailFragment.java | 8 ++++++-- .../hyperwallet/android/receipt/view/ReceiptViewUtil.java | 3 ++- 2 files changed, 8 insertions(+), 3 deletions(-) diff --git a/receipt/src/main/java/com/hyperwallet/android/receipt/view/ReceiptDetailFragment.java b/receipt/src/main/java/com/hyperwallet/android/receipt/view/ReceiptDetailFragment.java index 0c2e719ec..df87097be 100644 --- a/receipt/src/main/java/com/hyperwallet/android/receipt/view/ReceiptDetailFragment.java +++ b/receipt/src/main/java/com/hyperwallet/android/receipt/view/ReceiptDetailFragment.java @@ -17,10 +17,12 @@ package com.hyperwallet.android.receipt.view; import static com.hyperwallet.android.receipt.view.ReceiptViewUtil.AMOUNT_FORMAT; -import static com.hyperwallet.android.receipt.view.ReceiptViewUtil.DETAIL_DATE_FORMAT; +import static com.hyperwallet.android.receipt.view.ReceiptViewUtil.DETAIL_DATE_TIME_12H_FORMAT; +import static com.hyperwallet.android.receipt.view.ReceiptViewUtil.DETAIL_DATE_TIME_24H_FORMAT; import android.os.Bundle; import android.text.TextUtils; +import android.text.format.DateFormat; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; @@ -101,7 +103,9 @@ public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceStat receiptId.setText(receipt.getJournalId()); TextView date = view.findViewById(R.id.date_value); date.setText(DateUtils.toDateFormat(DateUtils. - fromDateTimeString(receipt.getCreatedOn()), DETAIL_DATE_FORMAT)); + fromDateTimeString(receipt.getCreatedOn()), + DateFormat.is24HourFormat(view.getContext()) ? DETAIL_DATE_TIME_24H_FORMAT + : DETAIL_DATE_TIME_12H_FORMAT)); if (receipt.getDetails() != null) { ReceiptDetails receiptDetails = receipt.getDetails(); diff --git a/receipt/src/main/java/com/hyperwallet/android/receipt/view/ReceiptViewUtil.java b/receipt/src/main/java/com/hyperwallet/android/receipt/view/ReceiptViewUtil.java index 2048d1401..57ff33a9f 100644 --- a/receipt/src/main/java/com/hyperwallet/android/receipt/view/ReceiptViewUtil.java +++ b/receipt/src/main/java/com/hyperwallet/android/receipt/view/ReceiptViewUtil.java @@ -34,8 +34,9 @@ final class ReceiptViewUtil { - static final String DETAIL_DATE_FORMAT = "E MMM dd, YYYY - k:mm zzz"; static final String AMOUNT_FORMAT = "###0.00"; + static final String DETAIL_DATE_TIME_24H_FORMAT = "E MMM dd, YYYY - HH:mm zzz"; + static final String DETAIL_DATE_TIME_12H_FORMAT = "E MMM dd, YYYY - hh:mm a zzz"; private static final String CAPTION_DATE_FORMAT = "MMMM dd, yyyy"; void setTransactionView(@NonNull final Receipt receipt, @NonNull final View view) { From 5c0030642938006d7d95ed81296d57c588416a94 Mon Sep 17 00:00:00 2001 From: Peter Olamit Date: Fri, 14 Jun 2019 08:26:41 -0700 Subject: [PATCH 08/23] granular code {^__^} --- .../android/receipt/view/ReceiptDetailFragment.java | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/receipt/src/main/java/com/hyperwallet/android/receipt/view/ReceiptDetailFragment.java b/receipt/src/main/java/com/hyperwallet/android/receipt/view/ReceiptDetailFragment.java index df87097be..baec197ab 100644 --- a/receipt/src/main/java/com/hyperwallet/android/receipt/view/ReceiptDetailFragment.java +++ b/receipt/src/main/java/com/hyperwallet/android/receipt/view/ReceiptDetailFragment.java @@ -78,6 +78,13 @@ public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceStat util.setTransactionView(receipt, view); // fee details + setFeeDetailsView(receipt, view); + + // receipt details + setDetailsView(receipt, view); + } + + private void setFeeDetailsView(@NonNull final Receipt receipt, @NonNull final View view) { if (!TextUtils.isEmpty(receipt.getFee())) { view.findViewById(R.id.fee_details_layout).setVisibility(View.VISIBLE); double feeAmount = Double.parseDouble(receipt.getFee()); @@ -97,8 +104,9 @@ public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceStat transfer.setText(view.getContext().getString(R.string.amount_view_format, decimalFormat.format(transferAmount), receipt.getCurrency())); } + } - // receipt details + private void setDetailsView(@NonNull final Receipt receipt, @NonNull final View view) { TextView receiptId = view.findViewById(R.id.receipt_id_value); receiptId.setText(receipt.getJournalId()); TextView date = view.findViewById(R.id.date_value); From 1241fdc7167265e7a8fdac4000fa606629255298 Mon Sep 17 00:00:00 2001 From: Peter Olamit Date: Fri, 14 Jun 2019 11:50:09 -0700 Subject: [PATCH 09/23] convention --- .../com/hyperwallet/android/common/viewmodel/Event.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/common/src/main/java/com/hyperwallet/android/common/viewmodel/Event.java b/common/src/main/java/com/hyperwallet/android/common/viewmodel/Event.java index a07aab0e1..35c21673a 100644 --- a/common/src/main/java/com/hyperwallet/android/common/viewmodel/Event.java +++ b/common/src/main/java/com/hyperwallet/android/common/viewmodel/Event.java @@ -24,11 +24,11 @@ */ public class Event { - private final T content; + private final T mContent; private boolean mIsContentConsumed; public Event(@NonNull final T t) { - content = t; + mContent = t; } /** @@ -38,7 +38,7 @@ public Event(@NonNull final T t) { @NonNull public T getContent() { mIsContentConsumed = true; - return content; + return mContent; } /** @@ -58,7 +58,7 @@ public boolean isContentConsumed() { public T getContentIfNotConsumed() { if (!mIsContentConsumed) { mIsContentConsumed = true; - return content; + return mContent; } return null; } From 8d9138a80647496b34f1a79ba5313440054428c8 Mon Sep 17 00:00:00 2001 From: Peter Olamit Date: Fri, 14 Jun 2019 14:03:32 -0700 Subject: [PATCH 10/23] fix amount and transfer amount reversed --- .../android/receipt/view/ReceiptDetailFragment.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/receipt/src/main/java/com/hyperwallet/android/receipt/view/ReceiptDetailFragment.java b/receipt/src/main/java/com/hyperwallet/android/receipt/view/ReceiptDetailFragment.java index baec197ab..20eee5fc5 100644 --- a/receipt/src/main/java/com/hyperwallet/android/receipt/view/ReceiptDetailFragment.java +++ b/receipt/src/main/java/com/hyperwallet/android/receipt/view/ReceiptDetailFragment.java @@ -88,8 +88,8 @@ private void setFeeDetailsView(@NonNull final Receipt receipt, @NonNull final Vi if (!TextUtils.isEmpty(receipt.getFee())) { view.findViewById(R.id.fee_details_layout).setVisibility(View.VISIBLE); double feeAmount = Double.parseDouble(receipt.getFee()); - double transferAmount = Double.parseDouble(receipt.getAmount()); - double amount = transferAmount - feeAmount; + double amount = Double.parseDouble(receipt.getAmount()); + double transferAmount = amount - feeAmount; DecimalFormat decimalFormat = new DecimalFormat(AMOUNT_FORMAT); TextView amountView = view.findViewById(R.id.details_amount_value); From 465ecb9d822490702e1854d15d71199affec51ab Mon Sep 17 00:00:00 2001 From: Peter Olamit Date: Mon, 17 Jun 2019 08:48:36 -0700 Subject: [PATCH 11/23] fix date localization formatting to receipt views --- .../ui/receipt/view/ListReceiptFragment.java | 11 +++++-- .../receipt/view/ReceiptDetailFragment.java | 31 ++++++++++++------- .../ui/receipt/view/ReceiptViewUtil.java | 14 ++++++--- receipt/src/main/res/values/strings.xml | 2 +- 4 files changed, 39 insertions(+), 19 deletions(-) diff --git a/receipt/src/main/java/com/hyperwallet/android/ui/receipt/view/ListReceiptFragment.java b/receipt/src/main/java/com/hyperwallet/android/ui/receipt/view/ListReceiptFragment.java index 578e1ca65..1dce9c4ca 100644 --- a/receipt/src/main/java/com/hyperwallet/android/ui/receipt/view/ListReceiptFragment.java +++ b/receipt/src/main/java/com/hyperwallet/android/ui/receipt/view/ListReceiptFragment.java @@ -16,6 +16,11 @@ */ package com.hyperwallet.android.ui.receipt.view; +import static android.text.format.DateUtils.FORMAT_NO_MONTH_DAY; +import static android.text.format.DateUtils.FORMAT_SHOW_DATE; +import static android.text.format.DateUtils.FORMAT_SHOW_YEAR; +import static android.text.format.DateUtils.formatDateTime; + import android.os.Bundle; import android.view.LayoutInflater; import android.view.View; @@ -40,6 +45,7 @@ import com.hyperwallet.android.ui.receipt.viewmodel.ListReceiptViewModel; import java.util.Calendar; +import java.util.Date; import java.util.Objects; public class ListReceiptFragment extends Fragment { @@ -222,8 +228,9 @@ class ReceiptViewHolderWithHeader extends ReceiptViewHolder { @Override void bind(@NonNull final Receipt receipt) { super.bind(receipt); - mTransactionHeaderText.setText(DateUtils.toDateFormat( - DateUtils.fromDateTimeString(receipt.getCreatedOn()), HEADER_DATE_FORMAT)); + Date date = DateUtils.fromDateTimeString(receipt.getCreatedOn()); + mTransactionHeaderText.setText(formatDateTime(mTransactionHeaderText.getContext(), date.getTime(), + FORMAT_SHOW_DATE | FORMAT_SHOW_YEAR | FORMAT_NO_MONTH_DAY)); } } } diff --git a/receipt/src/main/java/com/hyperwallet/android/ui/receipt/view/ReceiptDetailFragment.java b/receipt/src/main/java/com/hyperwallet/android/ui/receipt/view/ReceiptDetailFragment.java index b2b13b92a..9b86ccd41 100644 --- a/receipt/src/main/java/com/hyperwallet/android/ui/receipt/view/ReceiptDetailFragment.java +++ b/receipt/src/main/java/com/hyperwallet/android/ui/receipt/view/ReceiptDetailFragment.java @@ -16,13 +16,18 @@ */ package com.hyperwallet.android.ui.receipt.view; +import static android.text.format.DateUtils.FORMAT_ABBREV_WEEKDAY; +import static android.text.format.DateUtils.FORMAT_SHOW_DATE; +import static android.text.format.DateUtils.FORMAT_SHOW_TIME; +import static android.text.format.DateUtils.FORMAT_SHOW_WEEKDAY; +import static android.text.format.DateUtils.FORMAT_SHOW_YEAR; +import static android.text.format.DateUtils.formatDateTime; + import static com.hyperwallet.android.ui.receipt.view.ReceiptViewUtil.AMOUNT_FORMAT; -import static com.hyperwallet.android.ui.receipt.view.ReceiptViewUtil.DETAIL_DATE_TIME_12H_FORMAT; -import static com.hyperwallet.android.ui.receipt.view.ReceiptViewUtil.DETAIL_DATE_TIME_24H_FORMAT; +import static com.hyperwallet.android.ui.receipt.view.ReceiptViewUtil.DETAIL_TIMEZONE; import android.os.Bundle; import android.text.TextUtils; -import android.text.format.DateFormat; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; @@ -41,6 +46,7 @@ import com.hyperwallet.android.ui.receipt.viewmodel.ReceiptDetailViewModel; import java.text.DecimalFormat; +import java.util.Date; public class ReceiptDetailFragment extends Fragment { @@ -93,15 +99,15 @@ private void setFeeDetailsView(@NonNull final Receipt receipt, @NonNull final Vi DecimalFormat decimalFormat = new DecimalFormat(AMOUNT_FORMAT); TextView amountView = view.findViewById(R.id.details_amount_value); - amountView.setText(view.getContext().getString(R.string.amount_view_format, + amountView.setText(view.getContext().getString(R.string.concat_string_view_format, decimalFormat.format(amount), receipt.getCurrency())); TextView fee = view.findViewById(R.id.details_fee_value); - fee.setText(view.getContext().getString(R.string.amount_view_format, + fee.setText(view.getContext().getString(R.string.concat_string_view_format, decimalFormat.format(feeAmount), receipt.getCurrency())); TextView transfer = view.findViewById(R.id.details_transfer_amount_value); - transfer.setText(view.getContext().getString(R.string.amount_view_format, + transfer.setText(view.getContext().getString(R.string.concat_string_view_format, decimalFormat.format(transferAmount), receipt.getCurrency())); } } @@ -109,11 +115,14 @@ private void setFeeDetailsView(@NonNull final Receipt receipt, @NonNull final Vi private void setDetailsView(@NonNull final Receipt receipt, @NonNull final View view) { TextView receiptId = view.findViewById(R.id.receipt_id_value); receiptId.setText(receipt.getJournalId()); - TextView date = view.findViewById(R.id.date_value); - date.setText(DateUtils.toDateFormat(DateUtils. - fromDateTimeString(receipt.getCreatedOn()), - DateFormat.is24HourFormat(view.getContext()) ? DETAIL_DATE_TIME_24H_FORMAT - : DETAIL_DATE_TIME_12H_FORMAT)); + TextView dateView = view.findViewById(R.id.date_value); + + Date date = DateUtils.fromDateTimeString(receipt.getCreatedOn()); + String timezone = DateUtils.toDateFormat(date, DETAIL_TIMEZONE); + dateView.setText(view.getContext().getString(R.string.concat_string_view_format, + formatDateTime(view.getContext(), date.getTime(), + FORMAT_SHOW_DATE | FORMAT_SHOW_TIME | FORMAT_SHOW_YEAR + | FORMAT_SHOW_WEEKDAY | FORMAT_ABBREV_WEEKDAY), timezone)); if (receipt.getDetails() != null) { ReceiptDetails receiptDetails = receipt.getDetails(); diff --git a/receipt/src/main/java/com/hyperwallet/android/ui/receipt/view/ReceiptViewUtil.java b/receipt/src/main/java/com/hyperwallet/android/ui/receipt/view/ReceiptViewUtil.java index c2c602682..0cb31c922 100644 --- a/receipt/src/main/java/com/hyperwallet/android/ui/receipt/view/ReceiptViewUtil.java +++ b/receipt/src/main/java/com/hyperwallet/android/ui/receipt/view/ReceiptViewUtil.java @@ -16,6 +16,10 @@ */ package com.hyperwallet.android.ui.receipt.view; +import static android.text.format.DateUtils.FORMAT_SHOW_DATE; +import static android.text.format.DateUtils.FORMAT_SHOW_YEAR; +import static android.text.format.DateUtils.formatDateTime; + import static com.hyperwallet.android.model.receipt.Receipt.Entries.CREDIT; import static com.hyperwallet.android.model.receipt.Receipt.Entries.DEBIT; @@ -30,14 +34,13 @@ import com.hyperwallet.android.ui.receipt.R; import java.text.DecimalFormat; +import java.util.Date; import java.util.Locale; final class ReceiptViewUtil { static final String AMOUNT_FORMAT = "###0.00"; - static final String DETAIL_DATE_TIME_24H_FORMAT = "E MMM dd, YYYY - HH:mm zzz"; - static final String DETAIL_DATE_TIME_12H_FORMAT = "E MMM dd, YYYY - hh:mm a zzz"; - private static final String CAPTION_DATE_FORMAT = "MMMM dd, yyyy"; + static final String DETAIL_TIMEZONE = "zzz"; void setTransactionView(@NonNull final Receipt receipt, @NonNull final View view) { TextView transactionTypeIcon = view.findViewById(R.id.transaction_type_icon); @@ -73,8 +76,9 @@ void setTransactionView(@NonNull final Receipt receipt, @NonNull final View view transactionCurrency.setText(receipt.getCurrency()); transactionTitle.setText(getTransactionTitle(receipt.getType(), transactionTitle.getContext())); - transactionDate.setText(DateUtils.toDateFormat(DateUtils. - fromDateTimeString(receipt.getCreatedOn()), CAPTION_DATE_FORMAT)); + Date date = DateUtils.fromDateTimeString(receipt.getCreatedOn()); + transactionDate.setText(formatDateTime(view.getContext(), date.getTime(), + FORMAT_SHOW_DATE | FORMAT_SHOW_YEAR)); } String getTransactionTitle(@NonNull final String receiptType, @NonNull final Context context) { diff --git a/receipt/src/main/res/values/strings.xml b/receipt/src/main/res/values/strings.xml index d6b595c3b..865db7f1a 100644 --- a/receipt/src/main/res/values/strings.xml +++ b/receipt/src/main/res/values/strings.xml @@ -15,7 +15,7 @@ Charity Name: Check Number: Website: - %s %s + %s %s Seems like, you don\'t have any Transactions, yet. From bf61a0551ae2fb579492aae8b1f85d2206da4efb Mon Sep 17 00:00:00 2001 From: Peter Olamit Date: Mon, 17 Jun 2019 09:42:05 -0700 Subject: [PATCH 12/23] update background effect to use ripple, added todos for currency formatting and exception messaging --- common/src/main/res/drawable/view_item_ripple.xml | 8 ++++++++ .../android/ui/receipt/view/ReceiptDetailActivity.java | 4 ++-- .../android/ui/receipt/view/ReceiptDetailFragment.java | 3 ++- .../android/ui/receipt/view/ReceiptViewUtil.java | 2 ++ receipt/src/main/res/layout/item_receipt.xml | 2 +- receipt/src/main/res/layout/item_receipt_with_header.xml | 2 +- 6 files changed, 16 insertions(+), 5 deletions(-) create mode 100644 common/src/main/res/drawable/view_item_ripple.xml diff --git a/common/src/main/res/drawable/view_item_ripple.xml b/common/src/main/res/drawable/view_item_ripple.xml new file mode 100644 index 000000000..4cabe0d43 --- /dev/null +++ b/common/src/main/res/drawable/view_item_ripple.xml @@ -0,0 +1,8 @@ + + + + + \ No newline at end of file diff --git a/receipt/src/main/java/com/hyperwallet/android/ui/receipt/view/ReceiptDetailActivity.java b/receipt/src/main/java/com/hyperwallet/android/ui/receipt/view/ReceiptDetailActivity.java index 9cc136927..b382894f8 100644 --- a/receipt/src/main/java/com/hyperwallet/android/ui/receipt/view/ReceiptDetailActivity.java +++ b/receipt/src/main/java/com/hyperwallet/android/ui/receipt/view/ReceiptDetailActivity.java @@ -58,8 +58,8 @@ public void onClick(View v) { ReceiptDetailViewModel viewModel = ViewModelProviders.of(this).get(ReceiptDetailViewModel.class); viewModel.setReceipt((Receipt) parcel); } else { - throw new IllegalArgumentException("Cannot initialize " + ReceiptDetailActivity.class.getName() - + " " + EXTRA_RECEIPT + " argument is not as what is expected."); + throw new IllegalArgumentException("Argument is not an instance of " + + ReceiptDetailActivity.class.getName()); } if (savedInstanceState == null) { diff --git a/receipt/src/main/java/com/hyperwallet/android/ui/receipt/view/ReceiptDetailFragment.java b/receipt/src/main/java/com/hyperwallet/android/ui/receipt/view/ReceiptDetailFragment.java index 9b86ccd41..fbfadcd17 100644 --- a/receipt/src/main/java/com/hyperwallet/android/ui/receipt/view/ReceiptDetailFragment.java +++ b/receipt/src/main/java/com/hyperwallet/android/ui/receipt/view/ReceiptDetailFragment.java @@ -53,7 +53,6 @@ public class ReceiptDetailFragment extends Fragment { private ReceiptDetailViewModel mReceiptDetailViewModel; public ReceiptDetailFragment() { - setRetainInstance(true); } public static ReceiptDetailFragment newInstance() { @@ -96,6 +95,8 @@ private void setFeeDetailsView(@NonNull final Receipt receipt, @NonNull final Vi double feeAmount = Double.parseDouble(receipt.getFee()); double amount = Double.parseDouble(receipt.getAmount()); double transferAmount = amount - feeAmount; + + //TODO localization of currencies in consideration DecimalFormat decimalFormat = new DecimalFormat(AMOUNT_FORMAT); TextView amountView = view.findViewById(R.id.details_amount_value); diff --git a/receipt/src/main/java/com/hyperwallet/android/ui/receipt/view/ReceiptViewUtil.java b/receipt/src/main/java/com/hyperwallet/android/ui/receipt/view/ReceiptViewUtil.java index 0cb31c922..41def2fcf 100644 --- a/receipt/src/main/java/com/hyperwallet/android/ui/receipt/view/ReceiptViewUtil.java +++ b/receipt/src/main/java/com/hyperwallet/android/ui/receipt/view/ReceiptViewUtil.java @@ -48,6 +48,8 @@ void setTransactionView(@NonNull final Receipt receipt, @NonNull final View view TextView transactionDate = view.findViewById(R.id.transaction_date); TextView transactionAmount = view.findViewById(R.id.transaction_amount); TextView transactionCurrency = view.findViewById(R.id.transaction_currency); + + //TODO localization of currencies in consideration DecimalFormat decimalFormat = new DecimalFormat(AMOUNT_FORMAT); double amount = Double.parseDouble(receipt.getAmount()); String formattedAmount = decimalFormat.format(amount); diff --git a/receipt/src/main/res/layout/item_receipt.xml b/receipt/src/main/res/layout/item_receipt.xml index c30bba973..cfb204c4c 100644 --- a/receipt/src/main/res/layout/item_receipt.xml +++ b/receipt/src/main/res/layout/item_receipt.xml @@ -1,6 +1,6 @@ diff --git a/receipt/src/main/res/layout/item_receipt_with_header.xml b/receipt/src/main/res/layout/item_receipt_with_header.xml index 9e5c72649..9256f3ff8 100644 --- a/receipt/src/main/res/layout/item_receipt_with_header.xml +++ b/receipt/src/main/res/layout/item_receipt_with_header.xml @@ -22,7 +22,7 @@ From 8163d53cb1976cee4a2b6109b020a056e9baa78c Mon Sep 17 00:00:00 2001 From: Peter Olamit Date: Mon, 17 Jun 2019 12:03:52 -0700 Subject: [PATCH 13/23] ui specs changes --- .../receipt/view/ReceiptDetailFragment.java | 16 +- .../res/layout/fragment_receipt_detail.xml | 301 +++++++++--------- receipt/src/main/res/values/strings.xml | 16 +- 3 files changed, 170 insertions(+), 163 deletions(-) diff --git a/receipt/src/main/java/com/hyperwallet/android/ui/receipt/view/ReceiptDetailFragment.java b/receipt/src/main/java/com/hyperwallet/android/ui/receipt/view/ReceiptDetailFragment.java index fbfadcd17..0dc09fde9 100644 --- a/receipt/src/main/java/com/hyperwallet/android/ui/receipt/view/ReceiptDetailFragment.java +++ b/receipt/src/main/java/com/hyperwallet/android/ui/receipt/view/ReceiptDetailFragment.java @@ -82,11 +82,11 @@ public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceStat ReceiptViewUtil util = new ReceiptViewUtil(); util.setTransactionView(receipt, view); - // fee details - setFeeDetailsView(receipt, view); - // receipt details setDetailsView(receipt, view); + + // fee details + setFeeDetailsView(receipt, view); } private void setFeeDetailsView(@NonNull final Receipt receipt, @NonNull final View view) { @@ -142,15 +142,15 @@ private void setDetailsView(@NonNull final Receipt receipt, @NonNull final View view, receiptDetails.getClientPaymentId()); } - if (!TextUtils.isEmpty(receiptDetails.getNotes())) { - setViewInformation(R.id.notes_layout, R.id.notes_value, - view, receiptDetails.getNotes()); - } - if (!TextUtils.isEmpty(receiptDetails.getWebsite())) { setViewInformation(R.id.website_layout, R.id.website_value, view, receiptDetails.getWebsite()); } + + if (!TextUtils.isEmpty(receiptDetails.getNotes())) { + setViewInformation(R.id.receipt_notes_information, R.id.notes_value, + view, receiptDetails.getNotes()); + } } } diff --git a/receipt/src/main/res/layout/fragment_receipt_detail.xml b/receipt/src/main/res/layout/fragment_receipt_detail.xml index 79aafab7d..6939cc71c 100644 --- a/receipt/src/main/res/layout/fragment_receipt_detail.xml +++ b/receipt/src/main/res/layout/fragment_receipt_detail.xml @@ -12,8 +12,11 @@ android:layout_height="match_parent" app:layout_constraintTop_toBottomOf="parent"> - + + - - - - - - - - - - - - - - - - - - - - - - - @@ -174,7 +76,7 @@ android:layout_alignParentTop="true" android:layout_marginStart="@dimen/grid_margin_left" android:layout_marginTop="@dimen/grid_margin_top" - android:text="@string/receipt_id_label" + android:text="@string/journalId" android:textAppearance="@style/TextAppearance.MaterialComponents.Caption" app:layout_constraintLeft_toLeftOf="parent" app:layout_constraintStart_toStartOf="parent" @@ -204,7 +106,7 @@ android:layout_below="@+id/receipt_id_label" android:layout_marginStart="@dimen/grid_margin_left" android:layout_marginTop="@dimen/item_text_top_bottom_margin" - android:text="@string/receipt_date_label" + android:text="@string/createdOn" android:textAppearance="@style/TextAppearance.MaterialComponents.Caption" app:layout_constraintLeft_toLeftOf="parent" app:layout_constraintStart_toStartOf="parent" @@ -241,7 +143,7 @@ android:layout_alignParentTop="true" android:layout_marginStart="@dimen/grid_margin_left" android:layout_marginTop="@dimen/item_text_top_bottom_margin" - android:text="@string/client_id_label" + android:text="@string/clientPaymentId" android:textAppearance="@style/TextAppearance.MaterialComponents.Caption" app:layout_constraintLeft_toLeftOf="parent" app:layout_constraintStart_toStartOf="parent"/> @@ -264,42 +166,6 @@ app:layout_constraintEnd_toEndOf="parent"/> - - - - - - - @@ -349,7 +215,7 @@ android:layout_alignParentTop="true" android:layout_marginStart="@dimen/grid_margin_left" android:layout_marginTop="@dimen/item_text_top_bottom_margin" - android:text="@string/check_number_label" + android:text="@string/checkNumber" android:textAppearance="@style/TextAppearance.MaterialComponents.Caption" app:layout_constraintLeft_toLeftOf="parent" app:layout_constraintStart_toStartOf="parent"/> @@ -385,7 +251,7 @@ android:layout_alignParentTop="true" android:layout_marginStart="@dimen/grid_margin_left" android:layout_marginTop="@dimen/item_text_top_bottom_margin" - android:text="@string/website_label" + android:text="@string/website" android:textAppearance="@style/TextAppearance.MaterialComponents.Caption" app:layout_constraintLeft_toLeftOf="parent" app:layout_constraintStart_toStartOf="parent"/> @@ -408,11 +274,152 @@ app:layout_constraintEnd_toEndOf="parent"/> - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/receipt/src/main/res/values/strings.xml b/receipt/src/main/res/values/strings.xml index 865db7f1a..b40bd2485 100644 --- a/receipt/src/main/res/values/strings.xml +++ b/receipt/src/main/res/values/strings.xml @@ -3,18 +3,18 @@ Transactions Transaction Details Transaction - Details + Fee Specification Amount: Fee: Transfer Amount: Receipt - Receipt ID: - Date: - Client ID: - Notes: - Charity Name: - Check Number: - Website: + Receipt ID: + Date: + Client Transaction ID: + Notes + Charity Name: + Check Number: + Promo Website: %s %s Seems like, you don\'t have any Transactions, From cf23ee8b30e80a179a640019097ea97e2cc89c95 Mon Sep 17 00:00:00 2001 From: Peter Olamit Date: Mon, 17 Jun 2019 13:41:27 -0700 Subject: [PATCH 14/23] update notes value layout --- receipt/src/main/res/layout/fragment_receipt_detail.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/receipt/src/main/res/layout/fragment_receipt_detail.xml b/receipt/src/main/res/layout/fragment_receipt_detail.xml index 6939cc71c..a9abb5ea6 100644 --- a/receipt/src/main/res/layout/fragment_receipt_detail.xml +++ b/receipt/src/main/res/layout/fragment_receipt_detail.xml @@ -308,7 +308,7 @@ android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginStart="@dimen/grid_margin_left" - android:layout_marginTop="@dimen/item_text_top_bottom_margin" + android:layout_marginTop="@dimen/grid_margin_top" android:layout_marginEnd="@dimen/grid_margin_right" android:layout_marginBottom="@dimen/grid_margin_bottom" android:text="@string/text_placeholder" From 83d424dd243e140d67ce69a9eb8f03030963e456 Mon Sep 17 00:00:00 2001 From: Peter Olamit Date: Mon, 17 Jun 2019 14:00:53 -0700 Subject: [PATCH 15/23] try remove lint exception --- receipt/config/lint.xml | 3 --- 1 file changed, 3 deletions(-) diff --git a/receipt/config/lint.xml b/receipt/config/lint.xml index ff446fa9e..3c83d4bb5 100644 --- a/receipt/config/lint.xml +++ b/receipt/config/lint.xml @@ -4,7 +4,4 @@ - - - \ No newline at end of file From 972dd0cb4f1997e5b64ff4aed92df61bcf2083c3 Mon Sep 17 00:00:00 2001 From: Peter Olamit Date: Mon, 17 Jun 2019 14:49:14 -0700 Subject: [PATCH 16/23] fixed lint --- receipt/config/lint.xml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/receipt/config/lint.xml b/receipt/config/lint.xml index 3c83d4bb5..ff446fa9e 100644 --- a/receipt/config/lint.xml +++ b/receipt/config/lint.xml @@ -4,4 +4,7 @@ + + + \ No newline at end of file From 7ddf49d5b7b005cd1c912bbf6a5e02728762f925 Mon Sep 17 00:00:00 2001 From: Peter Olamit Date: Tue, 18 Jun 2019 08:09:45 -0700 Subject: [PATCH 17/23] by design decision removing binding classes into duplicate code --- .../ui/receipt/view/ListReceiptFragment.java | 61 +++++++++++- .../receipt/view/ReceiptDetailFragment.java | 65 ++++++++++++- .../ui/receipt/view/ReceiptViewUtil.java | 96 ------------------- 3 files changed, 119 insertions(+), 103 deletions(-) delete mode 100644 receipt/src/main/java/com/hyperwallet/android/ui/receipt/view/ReceiptViewUtil.java diff --git a/receipt/src/main/java/com/hyperwallet/android/ui/receipt/view/ListReceiptFragment.java b/receipt/src/main/java/com/hyperwallet/android/ui/receipt/view/ListReceiptFragment.java index 1dce9c4ca..e1fd220a2 100644 --- a/receipt/src/main/java/com/hyperwallet/android/ui/receipt/view/ListReceiptFragment.java +++ b/receipt/src/main/java/com/hyperwallet/android/ui/receipt/view/ListReceiptFragment.java @@ -21,6 +21,10 @@ import static android.text.format.DateUtils.FORMAT_SHOW_YEAR; import static android.text.format.DateUtils.formatDateTime; +import static com.hyperwallet.android.model.receipt.Receipt.Entries.CREDIT; +import static com.hyperwallet.android.model.receipt.Receipt.Entries.DEBIT; + +import android.content.Context; import android.os.Bundle; import android.view.LayoutInflater; import android.view.View; @@ -44,8 +48,10 @@ import com.hyperwallet.android.ui.receipt.R; import com.hyperwallet.android.ui.receipt.viewmodel.ListReceiptViewModel; +import java.text.DecimalFormat; import java.util.Calendar; import java.util.Date; +import java.util.Locale; import java.util.Objects; public class ListReceiptFragment extends Fragment { @@ -137,7 +143,7 @@ public boolean areContentsTheSame(@NonNull final Receipt oldItem, @NonNull final private static class ListReceiptAdapter extends PagedListAdapter { - private static final String HEADER_DATE_FORMAT = "MMMM yyyy"; + static final String AMOUNT_FORMAT = "###0.00"; private static final int HEADER_VIEW_TYPE = 1; private static final int DATA_VIEW_TYPE = 0; private final ListReceiptViewModel mReceiptViewModel; @@ -204,14 +210,63 @@ class ReceiptViewHolder extends RecyclerView.ViewHolder { } void bind(@NonNull final Receipt receipt) { - ReceiptViewUtil util = new ReceiptViewUtil(); - util.setTransactionView(receipt, itemView); mView.setOnClickListener(new OneClickListener() { @Override public void onOneClick(View v) { mListReceiptViewModel.setDetailNavigation(receipt); } }); + + // By design decision from here under, this code is also repeated in ReceiptDetailFragment + TextView transactionTypeIcon = itemView.findViewById(R.id.transaction_type_icon); + TextView transactionTitle = itemView.findViewById(R.id.transaction_title); + TextView transactionDate = itemView.findViewById(R.id.transaction_date); + TextView transactionAmount = itemView.findViewById(R.id.transaction_amount); + TextView transactionCurrency = itemView.findViewById(R.id.transaction_currency); + + //TODO localization of currencies in consideration + DecimalFormat decimalFormat = new DecimalFormat(AMOUNT_FORMAT); + double amount = Double.parseDouble(receipt.getAmount()); + String formattedAmount = decimalFormat.format(amount); + + if (CREDIT.equals(receipt.getEntry())) { + transactionAmount.setTextColor(transactionAmount.getContext() + .getResources().getColor(R.color.positiveColor)); + transactionAmount.setText(transactionAmount.getContext() + .getString(R.string.credit_sign, formattedAmount)); + transactionTypeIcon.setTextColor(transactionTypeIcon.getContext() + .getResources().getColor(R.color.positiveColor)); + transactionTypeIcon.setBackground(transactionTypeIcon.getContext() + .getDrawable(R.drawable.circle_positive)); + transactionTypeIcon.setText(transactionTypeIcon.getContext().getText(R.string.credit)); + } else if (DEBIT.equals(receipt.getEntry())) { + transactionAmount.setTextColor(transactionAmount.getContext() + .getResources().getColor(R.color.colorAccent)); + transactionAmount.setText(transactionAmount.getContext() + .getString(R.string.debit_sign, formattedAmount)); + transactionTypeIcon.setTextColor(transactionTypeIcon.getContext() + .getResources().getColor(R.color.colorAccent)); + transactionTypeIcon.setBackground(transactionTypeIcon.getContext() + .getDrawable(R.drawable.circle_negative)); + transactionTypeIcon.setText(transactionTypeIcon.getContext().getText(R.string.debit)); + } + + transactionCurrency.setText(receipt.getCurrency()); + transactionTitle.setText(getTransactionTitle(receipt.getType(), transactionTitle.getContext())); + Date date = DateUtils.fromDateTimeString(receipt.getCreatedOn()); + transactionDate.setText(formatDateTime(itemView.getContext(), date.getTime(), + FORMAT_SHOW_DATE | FORMAT_SHOW_YEAR)); + } + + String getTransactionTitle(@NonNull final String receiptType, @NonNull final Context context) { + String showTitle = context.getResources().getString(R.string.unknown_type); + int resourceId = context.getResources().getIdentifier(receiptType.toLowerCase(Locale.ROOT), "string", + context.getPackageName()); + if (resourceId != 0) { + showTitle = context.getResources().getString(resourceId); + } + + return showTitle; } } diff --git a/receipt/src/main/java/com/hyperwallet/android/ui/receipt/view/ReceiptDetailFragment.java b/receipt/src/main/java/com/hyperwallet/android/ui/receipt/view/ReceiptDetailFragment.java index 0dc09fde9..ae2490c09 100644 --- a/receipt/src/main/java/com/hyperwallet/android/ui/receipt/view/ReceiptDetailFragment.java +++ b/receipt/src/main/java/com/hyperwallet/android/ui/receipt/view/ReceiptDetailFragment.java @@ -23,9 +23,10 @@ import static android.text.format.DateUtils.FORMAT_SHOW_YEAR; import static android.text.format.DateUtils.formatDateTime; -import static com.hyperwallet.android.ui.receipt.view.ReceiptViewUtil.AMOUNT_FORMAT; -import static com.hyperwallet.android.ui.receipt.view.ReceiptViewUtil.DETAIL_TIMEZONE; +import static com.hyperwallet.android.model.receipt.Receipt.Entries.CREDIT; +import static com.hyperwallet.android.model.receipt.Receipt.Entries.DEBIT; +import android.content.Context; import android.os.Bundle; import android.text.TextUtils; import android.view.LayoutInflater; @@ -47,9 +48,13 @@ import java.text.DecimalFormat; import java.util.Date; +import java.util.Locale; public class ReceiptDetailFragment extends Fragment { + static final String AMOUNT_FORMAT = "###0.00"; + static final String DETAIL_TIMEZONE = "zzz"; + private ReceiptDetailViewModel mReceiptDetailViewModel; public ReceiptDetailFragment() { @@ -79,8 +84,7 @@ public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceStat Receipt receipt = mReceiptDetailViewModel.getReceipt(); // transactions - ReceiptViewUtil util = new ReceiptViewUtil(); - util.setTransactionView(receipt, view); + setTransactionView(receipt, view); // receipt details setDetailsView(receipt, view); @@ -89,6 +93,59 @@ public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceStat setFeeDetailsView(receipt, view); } + // By design decision, this code is also repeated in ListReceiptFragment + private void setTransactionView(@NonNull final Receipt receipt, @NonNull final View view) { + TextView transactionTypeIcon = view.findViewById(R.id.transaction_type_icon); + TextView transactionTitle = view.findViewById(R.id.transaction_title); + TextView transactionDate = view.findViewById(R.id.transaction_date); + TextView transactionAmount = view.findViewById(R.id.transaction_amount); + TextView transactionCurrency = view.findViewById(R.id.transaction_currency); + + //TODO localization of currencies in consideration + DecimalFormat decimalFormat = new DecimalFormat(AMOUNT_FORMAT); + double amount = Double.parseDouble(receipt.getAmount()); + String formattedAmount = decimalFormat.format(amount); + + if (CREDIT.equals(receipt.getEntry())) { + transactionAmount.setTextColor(transactionAmount.getContext() + .getResources().getColor(R.color.positiveColor)); + transactionAmount.setText(transactionAmount.getContext() + .getString(R.string.credit_sign, formattedAmount)); + transactionTypeIcon.setTextColor(transactionTypeIcon.getContext() + .getResources().getColor(R.color.positiveColor)); + transactionTypeIcon.setBackground(transactionTypeIcon.getContext() + .getDrawable(R.drawable.circle_positive)); + transactionTypeIcon.setText(transactionTypeIcon.getContext().getText(R.string.credit)); + } else if (DEBIT.equals(receipt.getEntry())) { + transactionAmount.setTextColor(transactionAmount.getContext() + .getResources().getColor(R.color.colorAccent)); + transactionAmount.setText(transactionAmount.getContext() + .getString(R.string.debit_sign, formattedAmount)); + transactionTypeIcon.setTextColor(transactionTypeIcon.getContext() + .getResources().getColor(R.color.colorAccent)); + transactionTypeIcon.setBackground(transactionTypeIcon.getContext() + .getDrawable(R.drawable.circle_negative)); + transactionTypeIcon.setText(transactionTypeIcon.getContext().getText(R.string.debit)); + } + + transactionCurrency.setText(receipt.getCurrency()); + transactionTitle.setText(getTransactionTitle(receipt.getType(), transactionTitle.getContext())); + Date date = DateUtils.fromDateTimeString(receipt.getCreatedOn()); + transactionDate.setText(formatDateTime(view.getContext(), date.getTime(), + FORMAT_SHOW_DATE | FORMAT_SHOW_YEAR)); + } + + private String getTransactionTitle(@NonNull final String receiptType, @NonNull final Context context) { + String showTitle = context.getResources().getString(R.string.unknown_type); + int resourceId = context.getResources().getIdentifier(receiptType.toLowerCase(Locale.ROOT), "string", + context.getPackageName()); + if (resourceId != 0) { + showTitle = context.getResources().getString(resourceId); + } + + return showTitle; + } + private void setFeeDetailsView(@NonNull final Receipt receipt, @NonNull final View view) { if (!TextUtils.isEmpty(receipt.getFee())) { view.findViewById(R.id.fee_details_layout).setVisibility(View.VISIBLE); diff --git a/receipt/src/main/java/com/hyperwallet/android/ui/receipt/view/ReceiptViewUtil.java b/receipt/src/main/java/com/hyperwallet/android/ui/receipt/view/ReceiptViewUtil.java deleted file mode 100644 index 41def2fcf..000000000 --- a/receipt/src/main/java/com/hyperwallet/android/ui/receipt/view/ReceiptViewUtil.java +++ /dev/null @@ -1,96 +0,0 @@ -/* - * The MIT License (MIT) - * Copyright (c) 2019 Hyperwallet Systems Inc. - * - * Permission is hereby granted, free of charge, to any person obtaining a copy of this software and - * associated documentation files (the "Software"), to deal in the Software without restriction, - * including without limitation the rights to use, copy, modify, merge, publish, distribute, - * sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT - * NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, - * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - */ -package com.hyperwallet.android.ui.receipt.view; - -import static android.text.format.DateUtils.FORMAT_SHOW_DATE; -import static android.text.format.DateUtils.FORMAT_SHOW_YEAR; -import static android.text.format.DateUtils.formatDateTime; - -import static com.hyperwallet.android.model.receipt.Receipt.Entries.CREDIT; -import static com.hyperwallet.android.model.receipt.Receipt.Entries.DEBIT; - -import android.content.Context; -import android.view.View; -import android.widget.TextView; - -import androidx.annotation.NonNull; - -import com.hyperwallet.android.model.receipt.Receipt; -import com.hyperwallet.android.ui.common.util.DateUtils; -import com.hyperwallet.android.ui.receipt.R; - -import java.text.DecimalFormat; -import java.util.Date; -import java.util.Locale; - -final class ReceiptViewUtil { - - static final String AMOUNT_FORMAT = "###0.00"; - static final String DETAIL_TIMEZONE = "zzz"; - - void setTransactionView(@NonNull final Receipt receipt, @NonNull final View view) { - TextView transactionTypeIcon = view.findViewById(R.id.transaction_type_icon); - TextView transactionTitle = view.findViewById(R.id.transaction_title); - TextView transactionDate = view.findViewById(R.id.transaction_date); - TextView transactionAmount = view.findViewById(R.id.transaction_amount); - TextView transactionCurrency = view.findViewById(R.id.transaction_currency); - - //TODO localization of currencies in consideration - DecimalFormat decimalFormat = new DecimalFormat(AMOUNT_FORMAT); - double amount = Double.parseDouble(receipt.getAmount()); - String formattedAmount = decimalFormat.format(amount); - - if (CREDIT.equals(receipt.getEntry())) { - transactionAmount.setTextColor(transactionAmount.getContext() - .getResources().getColor(R.color.positiveColor)); - transactionAmount.setText(transactionAmount.getContext() - .getString(R.string.credit_sign, formattedAmount)); - transactionTypeIcon.setTextColor(transactionTypeIcon.getContext() - .getResources().getColor(R.color.positiveColor)); - transactionTypeIcon.setBackground(transactionTypeIcon.getContext() - .getDrawable(R.drawable.circle_positive)); - transactionTypeIcon.setText(transactionTypeIcon.getContext().getText(R.string.credit)); - } else if (DEBIT.equals(receipt.getEntry())) { - transactionAmount.setTextColor(transactionAmount.getContext() - .getResources().getColor(R.color.colorAccent)); - transactionAmount.setText(transactionAmount.getContext() - .getString(R.string.debit_sign, formattedAmount)); - transactionTypeIcon.setTextColor(transactionTypeIcon.getContext() - .getResources().getColor(R.color.colorAccent)); - transactionTypeIcon.setBackground(transactionTypeIcon.getContext() - .getDrawable(R.drawable.circle_negative)); - transactionTypeIcon.setText(transactionTypeIcon.getContext().getText(R.string.debit)); - } - - transactionCurrency.setText(receipt.getCurrency()); - transactionTitle.setText(getTransactionTitle(receipt.getType(), transactionTitle.getContext())); - Date date = DateUtils.fromDateTimeString(receipt.getCreatedOn()); - transactionDate.setText(formatDateTime(view.getContext(), date.getTime(), - FORMAT_SHOW_DATE | FORMAT_SHOW_YEAR)); - } - - String getTransactionTitle(@NonNull final String receiptType, @NonNull final Context context) { - String showTitle = context.getResources().getString(R.string.unknown_type); - int resourceId = context.getResources().getIdentifier(receiptType.toLowerCase(Locale.ROOT), "string", - context.getPackageName()); - if (resourceId != 0) { - showTitle = context.getResources().getString(resourceId); - } - - return showTitle; - } -} From 2be481ea428f42211b108b32ac07d06f17ae0824 Mon Sep 17 00:00:00 2001 From: Peter Olamit Date: Tue, 18 Jun 2019 11:06:30 -0700 Subject: [PATCH 18/23] synced with core sdk --- .../receipt/repository/ReceiptDataSource.java | 4 +-- .../repository/ReceiptDataSourceTest.java | 32 +++++++++---------- 2 files changed, 18 insertions(+), 18 deletions(-) diff --git a/receipt/src/main/java/com/hyperwallet/android/ui/receipt/repository/ReceiptDataSource.java b/receipt/src/main/java/com/hyperwallet/android/ui/receipt/repository/ReceiptDataSource.java index f6e30479b..0b6a7a1e4 100644 --- a/receipt/src/main/java/com/hyperwallet/android/ui/receipt/repository/ReceiptDataSource.java +++ b/receipt/src/main/java/com/hyperwallet/android/ui/receipt/repository/ReceiptDataSource.java @@ -71,7 +71,7 @@ public void loadInitial(@NonNull final LoadInitialParams params, .limit(params.requestedLoadSize) .sortByCreatedOnDesc().build(); - getHyperwallet().listReceipts(queryParam, + getHyperwallet().listUserReceipts(queryParam, new HyperwalletListener>() { @Override public void onSuccess(@Nullable HyperwalletPageList result) { @@ -129,7 +129,7 @@ public void loadAfter(@NonNull LoadParams params, .offset(params.key) .sortByCreatedOnDesc().build(); - getHyperwallet().listReceipts(queryParam, + getHyperwallet().listUserReceipts(queryParam, new HyperwalletListener>() { @Override public void onSuccess(@Nullable HyperwalletPageList result) { diff --git a/receipt/src/test/java/com/hyperwallet/android/ui/receipt/repository/ReceiptDataSourceTest.java b/receipt/src/test/java/com/hyperwallet/android/ui/receipt/repository/ReceiptDataSourceTest.java index 9cf699e83..50aa0ad5e 100644 --- a/receipt/src/test/java/com/hyperwallet/android/ui/receipt/repository/ReceiptDataSourceTest.java +++ b/receipt/src/test/java/com/hyperwallet/android/ui/receipt/repository/ReceiptDataSourceTest.java @@ -96,13 +96,13 @@ public Object answer(InvocationOnMock invocation) { listener.onSuccess(response); return listener; } - }).when(mHyperwallet).listReceipts(any(ReceiptQueryParam.class), + }).when(mHyperwallet).listUserReceipts(any(ReceiptQueryParam.class), ArgumentMatchers.>>any()); // test mReceiptDataSource.loadInitial(mInitialParams, mInitialCallback); - verify(mHyperwallet).listReceipts(any(ReceiptQueryParam.class), + verify(mHyperwallet).listUserReceipts(any(ReceiptQueryParam.class), ArgumentMatchers.>>any()); verify(mInitialCallback).onResult(mListArgumentCaptor.capture(), mPreviousCaptor.capture(), mNextCaptor.capture()); @@ -149,13 +149,13 @@ public Object answer(InvocationOnMock invocation) { listener.onSuccess(null); return listener; } - }).when(mHyperwallet).listReceipts(any(ReceiptQueryParam.class), + }).when(mHyperwallet).listUserReceipts(any(ReceiptQueryParam.class), ArgumentMatchers.>>any()); // test mReceiptDataSource.loadInitial(mInitialParams, mInitialCallback); - verify(mHyperwallet).listReceipts(any(ReceiptQueryParam.class), + verify(mHyperwallet).listUserReceipts(any(ReceiptQueryParam.class), ArgumentMatchers.>>any()); verify(mInitialCallback, never()).onResult(ArgumentMatchers.anyList(), anyInt(), anyInt()); @@ -177,13 +177,13 @@ public Object answer(InvocationOnMock invocation) { listener.onFailure(new HyperwalletException(errors)); return listener; } - }).when(mHyperwallet).listReceipts(any(ReceiptQueryParam.class), + }).when(mHyperwallet).listUserReceipts(any(ReceiptQueryParam.class), ArgumentMatchers.>>any()); // test mReceiptDataSource.loadInitial(mInitialParams, mInitialCallback); - verify(mHyperwallet).listReceipts(any(ReceiptQueryParam.class), + verify(mHyperwallet).listUserReceipts(any(ReceiptQueryParam.class), ArgumentMatchers.>>any()); verify(mInitialCallback, never()).onResult(ArgumentMatchers.anyList(), anyInt(), anyInt()); @@ -211,13 +211,13 @@ public Object answer(InvocationOnMock invocation) { listener.onFailure(new HyperwalletException(errors)); return listener; } - }).when(mHyperwallet).listReceipts(any(ReceiptQueryParam.class), + }).when(mHyperwallet).listUserReceipts(any(ReceiptQueryParam.class), ArgumentMatchers.>>any()); // test mReceiptDataSource.loadInitial(mInitialParams, mInitialCallback); - verify(mHyperwallet).listReceipts(any(ReceiptQueryParam.class), + verify(mHyperwallet).listUserReceipts(any(ReceiptQueryParam.class), ArgumentMatchers.>>any()); verify(mInitialCallback, never()).onResult(ArgumentMatchers.anyList(), anyInt(), anyInt()); @@ -248,13 +248,13 @@ public Object answer(InvocationOnMock invocation) { listener.onSuccess(response); return listener; } - }).when(mHyperwallet).listReceipts(any(ReceiptQueryParam.class), + }).when(mHyperwallet).listUserReceipts(any(ReceiptQueryParam.class), ArgumentMatchers.>>any()); // test mReceiptDataSource.loadAfter(mLoadAfterParams, mLoadAfterCallback); - verify(mHyperwallet).listReceipts(any(ReceiptQueryParam.class), + verify(mHyperwallet).listUserReceipts(any(ReceiptQueryParam.class), ArgumentMatchers.>>any()); verify(mLoadAfterCallback).onResult(mListArgumentCaptor.capture(), mNextCaptor.capture()); @@ -299,13 +299,13 @@ public Object answer(InvocationOnMock invocation) { listener.onSuccess(null); return listener; } - }).when(mHyperwallet).listReceipts(any(ReceiptQueryParam.class), + }).when(mHyperwallet).listUserReceipts(any(ReceiptQueryParam.class), ArgumentMatchers.>>any()); // test mReceiptDataSource.loadAfter(mLoadAfterParams, mLoadAfterCallback); - verify(mHyperwallet).listReceipts(any(ReceiptQueryParam.class), + verify(mHyperwallet).listUserReceipts(any(ReceiptQueryParam.class), ArgumentMatchers.>>any()); verify(mLoadAfterCallback, never()).onResult(ArgumentMatchers.>any(), anyInt()); @@ -327,13 +327,13 @@ public Object answer(InvocationOnMock invocation) { listener.onFailure(new HyperwalletException(errors)); return listener; } - }).when(mHyperwallet).listReceipts(any(ReceiptQueryParam.class), + }).when(mHyperwallet).listUserReceipts(any(ReceiptQueryParam.class), ArgumentMatchers.>>any()); // test mReceiptDataSource.loadAfter(mLoadAfterParams, mLoadAfterCallback); - verify(mHyperwallet).listReceipts(any(ReceiptQueryParam.class), + verify(mHyperwallet).listUserReceipts(any(ReceiptQueryParam.class), ArgumentMatchers.>>any()); verify(mLoadAfterCallback, never()).onResult(ArgumentMatchers.anyList(), anyInt()); @@ -362,13 +362,13 @@ public Object answer(InvocationOnMock invocation) { listener.onFailure(new HyperwalletException(errors)); return listener; } - }).when(mHyperwallet).listReceipts(any(ReceiptQueryParam.class), + }).when(mHyperwallet).listUserReceipts(any(ReceiptQueryParam.class), ArgumentMatchers.>>any()); // test mReceiptDataSource.loadAfter(mLoadAfterParams, mLoadAfterCallback); - verify(mHyperwallet).listReceipts(any(ReceiptQueryParam.class), + verify(mHyperwallet).listUserReceipts(any(ReceiptQueryParam.class), ArgumentMatchers.>>any()); verify(mLoadAfterCallback, never()).onResult(ArgumentMatchers.anyList(), anyInt()); From 7443ad6a5b4c11d1df70666dee478cbcc7db8e6e Mon Sep 17 00:00:00 2001 From: Flavio Mattos Date: Tue, 18 Jun 2019 12:34:14 -0700 Subject: [PATCH 19/23] fixing typo --- .../android/ui/receipt/view/ListReceiptFragment.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/receipt/src/main/java/com/hyperwallet/android/ui/receipt/view/ListReceiptFragment.java b/receipt/src/main/java/com/hyperwallet/android/ui/receipt/view/ListReceiptFragment.java index e1fd220a2..69605557c 100644 --- a/receipt/src/main/java/com/hyperwallet/android/ui/receipt/view/ListReceiptFragment.java +++ b/receipt/src/main/java/com/hyperwallet/android/ui/receipt/view/ListReceiptFragment.java @@ -159,14 +159,14 @@ public int getItemViewType(final int position) { if (position != 0) { Receipt previous = getItem(position - 1); Receipt current = getItem(position); - if (isDataViewType(previous, current)) { + if (isDateViewType(previous, current)) { return DATA_VIEW_TYPE; } } return HEADER_VIEW_TYPE; } - boolean isDataViewType(@NonNull final Receipt previous, @NonNull final Receipt current) { + boolean isDateViewType(@NonNull final Receipt previous, @NonNull final Receipt current) { Calendar prev = Calendar.getInstance(); prev.setTime(DateUtils.fromDateTimeString(previous.getCreatedOn())); Calendar curr = Calendar.getInstance(); From ff14349729d3c9c408a3ae29f3e133f216e191d0 Mon Sep 17 00:00:00 2001 From: Peter Olamit Date: Tue, 18 Jun 2019 13:09:46 -0700 Subject: [PATCH 20/23] revert rename --- .../android/ui/receipt/view/ListReceiptFragment.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/receipt/src/main/java/com/hyperwallet/android/ui/receipt/view/ListReceiptFragment.java b/receipt/src/main/java/com/hyperwallet/android/ui/receipt/view/ListReceiptFragment.java index 69605557c..e1fd220a2 100644 --- a/receipt/src/main/java/com/hyperwallet/android/ui/receipt/view/ListReceiptFragment.java +++ b/receipt/src/main/java/com/hyperwallet/android/ui/receipt/view/ListReceiptFragment.java @@ -159,14 +159,14 @@ public int getItemViewType(final int position) { if (position != 0) { Receipt previous = getItem(position - 1); Receipt current = getItem(position); - if (isDateViewType(previous, current)) { + if (isDataViewType(previous, current)) { return DATA_VIEW_TYPE; } } return HEADER_VIEW_TYPE; } - boolean isDateViewType(@NonNull final Receipt previous, @NonNull final Receipt current) { + boolean isDataViewType(@NonNull final Receipt previous, @NonNull final Receipt current) { Calendar prev = Calendar.getInstance(); prev.setTime(DateUtils.fromDateTimeString(previous.getCreatedOn())); Calendar curr = Calendar.getInstance(); From 43b351f24ebf241796e24c44f0647c7ad03dfa08 Mon Sep 17 00:00:00 2001 From: Shyang Koong Date: Tue, 18 Jun 2019 13:39:10 -0700 Subject: [PATCH 21/23] Automation for receipt details and receipt network retry (#43) --- .../android/ui/receipt/ListReceiptsTest.java | 210 ++++++++++++++++-- .../receipt/repository/ReceiptDataSource.java | 7 + .../test/resources/receipt_list_response.json | 8 +- 3 files changed, 208 insertions(+), 17 deletions(-) diff --git a/receipt/src/androidTest/java/com/hyperwallet/android/ui/receipt/ListReceiptsTest.java b/receipt/src/androidTest/java/com/hyperwallet/android/ui/receipt/ListReceiptsTest.java index 436472ea9..3e939699b 100644 --- a/receipt/src/androidTest/java/com/hyperwallet/android/ui/receipt/ListReceiptsTest.java +++ b/receipt/src/androidTest/java/com/hyperwallet/android/ui/receipt/ListReceiptsTest.java @@ -1,9 +1,19 @@ package com.hyperwallet.android.ui.receipt; +import static android.text.format.DateUtils.FORMAT_ABBREV_WEEKDAY; +import static android.text.format.DateUtils.FORMAT_SHOW_DATE; +import static android.text.format.DateUtils.FORMAT_SHOW_TIME; +import static android.text.format.DateUtils.FORMAT_SHOW_WEEKDAY; +import static android.text.format.DateUtils.FORMAT_SHOW_YEAR; +import static android.text.format.DateUtils.formatDateTime; + import static androidx.test.espresso.Espresso.onView; +import static androidx.test.espresso.action.ViewActions.click; +import static androidx.test.espresso.assertion.ViewAssertions.doesNotExist; import static androidx.test.espresso.assertion.ViewAssertions.matches; import static androidx.test.espresso.matcher.ViewMatchers.hasDescendant; import static androidx.test.espresso.matcher.ViewMatchers.isDisplayed; +import static androidx.test.espresso.matcher.ViewMatchers.withEffectiveVisibility; import static androidx.test.espresso.matcher.ViewMatchers.withId; import static androidx.test.espresso.matcher.ViewMatchers.withParent; import static androidx.test.espresso.matcher.ViewMatchers.withText; @@ -22,11 +32,15 @@ import android.widget.TextView; import androidx.test.core.app.ApplicationProvider; +import androidx.test.espresso.IdlingRegistry; import androidx.test.espresso.contrib.RecyclerViewActions; +import androidx.test.espresso.matcher.ViewMatchers; import androidx.test.ext.junit.runners.AndroidJUnit4; import androidx.test.rule.ActivityTestRule; import com.hyperwallet.android.Hyperwallet; +import com.hyperwallet.android.ui.common.util.DateUtils; +import com.hyperwallet.android.ui.common.util.EspressoIdlingResource; import com.hyperwallet.android.ui.receipt.repository.ReceiptRepositoryFactory; import com.hyperwallet.android.ui.receipt.rule.HyperwalletExternalResourceManager; import com.hyperwallet.android.ui.receipt.rule.HyperwalletMockWebServer; @@ -41,7 +55,11 @@ import org.junit.Test; import org.junit.runner.RunWith; +import java.util.Date; import java.util.Locale; +import java.util.concurrent.TimeUnit; + +import okhttp3.mockwebserver.MockResponse; @RunWith(AndroidJUnit4.class) public class ListReceiptsTest { @@ -69,8 +87,18 @@ public void cleanup() { ReceiptRepositoryFactory.clearInstance(); } + @Before + public void registerIdlingResource() { + IdlingRegistry.getInstance().register(EspressoIdlingResource.getIdlingResource()); + } + + @After + public void unregisterIdlingResource() { + IdlingRegistry.getInstance().unregister(EspressoIdlingResource.getIdlingResource()); + } + @Test - public void testListReceipts_userHasMultipleTransactions() { + public void testListReceipt_userHasMultipleTransactions() { mMockWebServer.mockResponse().withHttpResponseCode(HTTP_OK).withBody(sResourceManager .getResourceContent("receipt_list_response.json")).mock(); mMockWebServer.mockResponse().withHttpResponseCode(HTTP_NO_CONTENT).withBody("").mock(); @@ -92,7 +120,7 @@ public void testListReceipts_userHasMultipleTransactions() { onView(withId(R.id.list_receipts)).check( matches(atPosition(0, hasDescendant(withText("+ 20.00"))))); onView(withId(R.id.list_receipts)).check( - matches(atPosition(0, hasDescendant(withText("June 07, 2019"))))); + matches(atPosition(0, hasDescendant(withText("June 7, 2019"))))); onView(withId(R.id.list_receipts)).check(matches(atPosition(0, hasDescendant(withText("USD"))))); onView(withId(R.id.list_receipts)).check(matches(atPosition(1, @@ -102,7 +130,7 @@ public void testListReceipts_userHasMultipleTransactions() { onView(withId(R.id.list_receipts)).check( matches(atPosition(1, hasDescendant(withText("+ 25.00"))))); onView(withId(R.id.list_receipts)).check( - matches(atPosition(1, hasDescendant(withText("June 02, 2019"))))); + matches(atPosition(1, hasDescendant(withText("June 2, 2019"))))); onView(withId(R.id.list_receipts)).check(matches(atPosition(1, hasDescendant(withText("CAD"))))); onView(withId(R.id.list_receipts)).check(matches(atPosition(2, @@ -112,7 +140,7 @@ public void testListReceipts_userHasMultipleTransactions() { onView(withId(R.id.list_receipts)).check( matches(atPosition(2, hasDescendant(withText("- 1.95"))))); onView(withId(R.id.list_receipts)).check( - matches(atPosition(2, hasDescendant(withText("June 01, 2019"))))); + matches(atPosition(2, hasDescendant(withText("June 1, 2019"))))); onView(withId(R.id.list_receipts)).check(matches(atPosition(2, hasDescendant(withText("USD"))))); onView(withId(R.id.list_receipts)) @@ -124,14 +152,14 @@ public void testListReceipts_userHasMultipleTransactions() { onView(withId(R.id.list_receipts)).check( matches(atPosition(3, hasDescendant(withText("- 18.05"))))); onView(withId(R.id.list_receipts)).check( - matches(atPosition(3, hasDescendant(withText("December 01, 2018"))))); + matches(atPosition(3, hasDescendant(withText("December 1, 2018"))))); onView(withId(R.id.list_receipts)).check(matches(atPosition(3, hasDescendant(withText("USD"))))); onView(withId(R.id.list_receipts)).check(new RecyclerViewCountAssertion(4)); } @Test - public void testListReceipts_displayCreditTransaction() { + public void testListReceipt_userHasCreditTransaction() { mMockWebServer.mockResponse().withHttpResponseCode(HTTP_OK).withBody(sResourceManager .getResourceContent("receipt_credit_response.json")).mock(); mMockWebServer.mockResponse().withHttpResponseCode(HTTP_NO_CONTENT).withBody("").mock(); @@ -153,14 +181,14 @@ public void testListReceipts_displayCreditTransaction() { onView(withId(R.id.list_receipts)).check( matches(atPosition(0, hasDescendant(withText("+ 25.00"))))); onView(withId(R.id.list_receipts)).check( - matches(atPosition(0, hasDescendant(withText("June 02, 2019"))))); + matches(atPosition(0, hasDescendant(withText("June 2, 2019"))))); onView(withId(R.id.list_receipts)).check(matches(atPosition(0, hasDescendant(withText("CAD"))))); onView(withId(R.id.list_receipts)).check(new RecyclerViewCountAssertion(1)); } @Test - public void testListReceipts_displayDebitTransaction() { + public void testListReceipt_userHasDebitTransaction() { mMockWebServer.mockResponse().withHttpResponseCode(HTTP_OK).withBody(sResourceManager .getResourceContent("receipt_debit_response.json")).mock(); mMockWebServer.mockResponse().withHttpResponseCode(HTTP_NO_CONTENT).withBody("").mock(); @@ -182,14 +210,14 @@ public void testListReceipts_displayDebitTransaction() { onView(withId(R.id.list_receipts)).check( matches(atPosition(0, hasDescendant(withText("- 18.05"))))); onView(withId(R.id.list_receipts)).check( - matches(atPosition(0, hasDescendant(withText("May 02, 2019"))))); + matches(atPosition(0, hasDescendant(withText("May 2, 2019"))))); onView(withId(R.id.list_receipts)).check(matches(atPosition(0, hasDescendant(withText("USD"))))); onView(withId(R.id.list_receipts)).check(new RecyclerViewCountAssertion(1)); } @Test - public void testListReceipts_displayUnknownTransactionType() { + public void testListReceipt_userHasUnknownTransactionType() { mMockWebServer.mockResponse().withHttpResponseCode(HTTP_OK).withBody(sResourceManager .getResourceContent("receipt_unknown_type_response.json")).mock(); mMockWebServer.mockResponse().withHttpResponseCode(HTTP_NO_CONTENT).withBody("").mock(); @@ -211,7 +239,7 @@ public void testListReceipts_displayUnknownTransactionType() { onView(withId(R.id.list_receipts)).check( matches(atPosition(0, hasDescendant(withText("+ 25.00"))))); onView(withId(R.id.list_receipts)).check( - matches(atPosition(0, hasDescendant(withText("June 02, 2019"))))); + matches(atPosition(0, hasDescendant(withText("June 2, 2019"))))); onView(withId(R.id.list_receipts)).check(matches(atPosition(0, hasDescendant(withText("CAD"))))); onView(withId(R.id.list_receipts)).check(new RecyclerViewCountAssertion(1)); @@ -231,7 +259,120 @@ public void testListReceipt_userHasNoTransactions() { } @Test - public void testListReceipt_displayPagedTransactions() throws InterruptedException { + public void testListReceipt_clickTransactionDisplaysDetails() { + mMockWebServer.mockResponse().withHttpResponseCode(HTTP_OK).withBody(sResourceManager + .getResourceContent("receipt_list_response.json")).mock(); + mMockWebServer.mockResponse().withHttpResponseCode(HTTP_NO_CONTENT).withBody("").mock(); + + // run test + mActivityTestRule.launchActivity(null); + + // assert + onView(allOf(instanceOf(TextView.class), withParent(withId(R.id.toolbar)))) + .check(matches(withText(R.string.title_activity_receipt_list))); + onView(withId(R.id.list_receipts)).check(matches(isDisplayed())); + + onView(withId(R.id.list_receipts)).perform(RecyclerViewActions.actionOnItemAtPosition(0, click())); + + onView(withId(R.id.transaction_header_text)).check(matches(withText(R.string.transaction_header_text))); + onView(withId(R.id.transaction_type_icon)).check(matches(withText(R.string.credit))); + onView(withId(R.id.transaction_title)).check(matches(withText(R.string.payment))); + onView(withId(R.id.transaction_amount)).check(matches(withText("+ 20.00"))); + onView(withId(R.id.transaction_currency)).check(matches(withText("USD"))); + onView(withId(R.id.transaction_date)).check(matches(withText("June 7, 2019"))); + + onView(withId(R.id.receipt_details_header_label)).check(matches(withText(R.string.receipt_header_label))); + onView(withId(R.id.receipt_id_label)).check(matches(withText(R.string.journalId))); + onView(withId(R.id.receipt_id_value)).check(matches(withText("3051579"))); + onView(withId(R.id.date_label)).check(matches(withText(R.string.createdOn))); + + Date date = DateUtils.fromDateTimeString("2019-06-07T17:08:58"); + String timezone = DateUtils.toDateFormat(date, "zzz"); + String text = mActivityTestRule.getActivity().getApplicationContext().getString( + R.string.concat_string_view_format, + formatDateTime(mActivityTestRule.getActivity().getApplicationContext(), date.getTime(), + FORMAT_SHOW_DATE | FORMAT_SHOW_TIME | FORMAT_SHOW_YEAR + | FORMAT_SHOW_WEEKDAY | FORMAT_ABBREV_WEEKDAY), timezone); + onView(withId(R.id.date_value)).check(matches(withText(text))); + + onView(withId(R.id.client_id_label)).check(matches(withText(R.string.clientPaymentId))); + onView(withId(R.id.client_id_value)).check(matches(withText("8OxXefx5"))); + onView(withId(R.id.charity_label)).check(matches(withText(R.string.charityName))); + onView(withId(R.id.charity_value)).check(matches(withText("Sample Charity"))); + onView(withId(R.id.check_number_label)).check(matches(withText(R.string.checkNumber))); + onView(withId(R.id.check_number_value)).check(matches(withText("Sample Check Number"))); + onView(withId(R.id.website_label)).check(matches(withText(R.string.website))); + onView(withId(R.id.website_value)).check(matches(withText("https://api.sandbox.hyperwallet.com"))); + onView(withText("A Person")).check(doesNotExist()); + + onView(withId(R.id.receipt_notes_header_label)).check(matches(withText(R.string.notes))); + onView(withId(R.id.notes_value)).check( + matches(withText("Sample payment for the period of June 15th, 2019 to July 23, 2019"))); + + onView(withId(R.id.details_header_text)).check(matches(withText(R.string.fee_details_header_text))); + onView(withId(R.id.details_amount_label)).check(matches(withText(R.string.details_amount_label))); + onView(withId(R.id.details_amount_value)).check(matches(withText("20.00 USD"))); + onView(withId(R.id.details_fee_label)).check(matches(withText(R.string.fee_label))); + onView(withId(R.id.details_fee_value)).check(matches(withText("2.25 USD"))); + onView(withId(R.id.details_transfer_amount_label)).check(matches(withText(R.string.transfer_amount_label))); + onView(withId(R.id.details_transfer_amount_value)).check(matches(withText("17.75 USD"))); + } + + @Test + public void testListReceipt_clickTransactionDisplaysDetailsWithoutFees() { + mMockWebServer.mockResponse().withHttpResponseCode(HTTP_OK).withBody(sResourceManager + .getResourceContent("receipt_list_response.json")).mock(); + mMockWebServer.mockResponse().withHttpResponseCode(HTTP_NO_CONTENT).withBody("").mock(); + + // run test + mActivityTestRule.launchActivity(null); + + // assert + onView(allOf(instanceOf(TextView.class), withParent(withId(R.id.toolbar)))) + .check(matches(withText(R.string.title_activity_receipt_list))); + onView(withId(R.id.list_receipts)).check(matches(isDisplayed())); + + onView(withId(R.id.list_receipts)).perform(RecyclerViewActions.actionOnItemAtPosition(3, click())); + + onView(withId(R.id.transaction_header_text)).check(matches(withText(R.string.transaction_header_text))); + onView(withId(R.id.transaction_type_icon)).check(matches(withText(R.string.debit))); + onView(withId(R.id.transaction_title)).check(matches(withText(R.string.transfer_to_prepaid_card))); + onView(withId(R.id.transaction_amount)).check(matches(withText("- 18.05"))); + onView(withId(R.id.transaction_currency)).check(matches(withText("USD"))); + onView(withId(R.id.transaction_date)).check(matches(withText("December 1, 2018"))); + + onView(withId(R.id.receipt_details_header_label)).check(matches(withText(R.string.receipt_header_label))); + onView(withId(R.id.receipt_id_label)).check(matches(withText(R.string.journalId))); + onView(withId(R.id.receipt_id_value)).check(matches(withText("3051590"))); + onView(withId(R.id.date_label)).check(matches(withText(R.string.createdOn))); + + Date date = DateUtils.fromDateTimeString("2018-12-01T17:12:18"); + String timezone = DateUtils.toDateFormat(date, "zzz"); + String text = mActivityTestRule.getActivity().getApplicationContext().getString( + R.string.concat_string_view_format, + formatDateTime(mActivityTestRule.getActivity().getApplicationContext(), date.getTime(), + FORMAT_SHOW_DATE | FORMAT_SHOW_TIME | FORMAT_SHOW_YEAR + | FORMAT_SHOW_WEEKDAY | FORMAT_ABBREV_WEEKDAY), timezone); + onView(withId(R.id.date_value)).check(matches(withText(text))); + + onView(withId(R.id.client_id_label)).check(matches(withEffectiveVisibility(ViewMatchers.Visibility.GONE))); + onView(withId(R.id.client_id_value)).check(matches(withEffectiveVisibility(ViewMatchers.Visibility.GONE))); + onView(withId(R.id.charity_label)).check(matches(withEffectiveVisibility(ViewMatchers.Visibility.GONE))); + onView(withId(R.id.charity_value)).check(matches(withEffectiveVisibility(ViewMatchers.Visibility.GONE))); + onView(withId(R.id.check_number_label)).check(matches(withEffectiveVisibility(ViewMatchers.Visibility.GONE))); + onView(withId(R.id.check_number_value)).check(matches(withEffectiveVisibility(ViewMatchers.Visibility.GONE))); + onView(withId(R.id.website_label)).check(matches(withEffectiveVisibility(ViewMatchers.Visibility.GONE))); + onView(withId(R.id.website_value)).check(matches(withEffectiveVisibility(ViewMatchers.Visibility.GONE))); + + onView(withId(R.id.receipt_notes_information)).check( + matches(withEffectiveVisibility(ViewMatchers.Visibility.GONE))); + onView(withId(R.id.receipt_notes_header_label)).check( + matches(withEffectiveVisibility(ViewMatchers.Visibility.GONE))); + onView(withId(R.id.notes_value)).check(matches(withEffectiveVisibility(ViewMatchers.Visibility.GONE))); + } + + @Test + public void testListReceipt_verifyTransactionsLoadedUponScrolling() throws InterruptedException { mMockWebServer.mockResponse().withHttpResponseCode(HTTP_OK).withBody(sResourceManager .getResourceContent("receipt_list_paged_response.json")).mock(); mMockWebServer.mockResponse().withHttpResponseCode(HTTP_OK).withBody(sResourceManager @@ -265,7 +406,7 @@ public void testListReceipt_displayPagedTransactions() throws InterruptedExcepti } @Test - public void testListReceipts_checkDateTextOnLocaleChange() { + public void testListReceipt_checkDateTextOnLocaleChange() { mMockWebServer.mockResponse().withHttpResponseCode(HTTP_OK).withBody(sResourceManager .getResourceContent("receipt_debit_response.json")).mock(); mMockWebServer.mockResponse().withHttpResponseCode(HTTP_NO_CONTENT).withBody("").mock(); @@ -276,8 +417,47 @@ public void testListReceipts_checkDateTextOnLocaleChange() { // assert onView(withId(R.id.list_receipts)) .check(matches(atPosition(0, hasDescendant(withText("maggio 2019"))))); - onView(withId(R.id.list_receipts)).check(matches(atPosition(0, hasDescendant(withText("maggio 02, 2019"))))); - mActivityTestRule.finishActivity(); + onView(withId(R.id.list_receipts)).check(matches(atPosition(0, hasDescendant(withText("2 maggio 2019"))))); + } + + @Test + public void testListReceipt_displaysNetworkErrorDialogOnConnectionTimeout() { + mMockWebServer.getServer().enqueue(new MockResponse().setResponseCode(HTTP_OK).setBody(sResourceManager + .getResourceContent("receipt_debit_response.json")).throttleBody(1, 5, TimeUnit.SECONDS)); + mMockWebServer.mockResponse().withHttpResponseCode(HTTP_OK).withBody(sResourceManager + .getResourceContent("receipt_debit_response.json")).mock(); + mMockWebServer.mockResponse().withHttpResponseCode(HTTP_NO_CONTENT).withBody("").mock(); + + mActivityTestRule.launchActivity(null); + + // assert error dialog information exist in portrait mode + onView(withText(R.string.error_dialog_connectivity_title)).check(matches(isDisplayed())); + onView(withText(R.string.io_exception)).check(matches(isDisplayed())); + onView(withId(android.R.id.button1)).check(matches(withText(R.string.try_again_button_label))); + onView(withId(android.R.id.button2)).check(matches(withText(R.string.cancel_button_label))); + + // retry button clicked + onView(withId(android.R.id.button1)).perform(click()); + onView(withText(R.string.error_dialog_connectivity_title)).check(doesNotExist()); + + // assert + onView(allOf(instanceOf(TextView.class), withParent(withId(R.id.toolbar)))) + .check(matches(withText(R.string.title_activity_receipt_list))); + onView(withId(R.id.list_receipts)).check(matches(isDisplayed())); + + onView(withId(R.id.list_receipts)) + .check(matches(atPosition(0, hasDescendant(withText("May 2019"))))); + onView(withId(R.id.list_receipts)).check(matches(atPosition(0, + hasDescendant(withText(com.hyperwallet.android.ui.receipt.R.string.debit))))); + onView(withId(R.id.list_receipts)).check( + matches(atPosition(0, hasDescendant(withText(R.string.transfer_to_prepaid_card))))); + onView(withId(R.id.list_receipts)).check( + matches(atPosition(0, hasDescendant(withText("- 18.05"))))); + onView(withId(R.id.list_receipts)).check( + matches(atPosition(0, hasDescendant(withText("May 2, 2019"))))); + onView(withId(R.id.list_receipts)).check(matches(atPosition(0, hasDescendant(withText("USD"))))); + + onView(withId(R.id.list_receipts)).check(new RecyclerViewCountAssertion(1)); } private void setLocale(Locale locale) { diff --git a/receipt/src/main/java/com/hyperwallet/android/ui/receipt/repository/ReceiptDataSource.java b/receipt/src/main/java/com/hyperwallet/android/ui/receipt/repository/ReceiptDataSource.java index 0b6a7a1e4..fd0c3b654 100644 --- a/receipt/src/main/java/com/hyperwallet/android/ui/receipt/repository/ReceiptDataSource.java +++ b/receipt/src/main/java/com/hyperwallet/android/ui/receipt/repository/ReceiptDataSource.java @@ -31,6 +31,7 @@ import com.hyperwallet.android.model.paging.HyperwalletPageList; import com.hyperwallet.android.model.receipt.Receipt; import com.hyperwallet.android.model.receipt.ReceiptQueryParam; +import com.hyperwallet.android.ui.common.util.EspressoIdlingResource; import com.hyperwallet.android.ui.common.viewmodel.Event; import java.util.Calendar; @@ -71,6 +72,7 @@ public void loadInitial(@NonNull final LoadInitialParams params, .limit(params.requestedLoadSize) .sortByCreatedOnDesc().build(); + EspressoIdlingResource.increment(); getHyperwallet().listUserReceipts(queryParam, new HyperwalletListener>() { @Override @@ -86,12 +88,14 @@ public void onSuccess(@Nullable HyperwalletPageList result) { // reset mLoadInitialCallback = null; mLoadInitialParams = null; + EspressoIdlingResource.decrement(); } @Override public void onFailure(HyperwalletException exception) { mIsFetchingData.postValue(Boolean.FALSE); mErrors.postValue(new Event<>(exception.getHyperwalletErrors())); + EspressoIdlingResource.decrement(); } @Override @@ -129,6 +133,7 @@ public void loadAfter(@NonNull LoadParams params, .offset(params.key) .sortByCreatedOnDesc().build(); + EspressoIdlingResource.increment(); getHyperwallet().listUserReceipts(queryParam, new HyperwalletListener>() { @Override @@ -144,12 +149,14 @@ public void onSuccess(@Nullable HyperwalletPageList result) { // reset mLoadAfterCallback = null; mLoadAfterParams = null; + EspressoIdlingResource.decrement(); } @Override public void onFailure(HyperwalletException exception) { mIsFetchingData.postValue(Boolean.FALSE); mErrors.postValue(new Event<>(exception.getHyperwalletErrors())); + EspressoIdlingResource.decrement(); } @Override diff --git a/receipt/src/test/resources/receipt_list_response.json b/receipt/src/test/resources/receipt_list_response.json index 7e7cc58af..4ec2de4fe 100644 --- a/receipt/src/test/resources/receipt_list_response.json +++ b/receipt/src/test/resources/receipt_list_response.json @@ -11,11 +11,15 @@ "sourceToken": "act-12345", "destinationToken": "usr-fa76a738-f43d-48b9-9a7a-7048d44a5d2d", "amount": "20.00", - "fee": "0.00", + "fee": "2.25", "currency": "USD", "details": { "clientPaymentId": "8OxXefx5", - "payeeName": "A Person" + "payeeName": "A Person", + "website": "https://api.sandbox.hyperwallet.com", + "notes": "Sample payment for the period of June 15th, 2019 to July 23, 2019", + "charityName": "Sample Charity", + "checkNumber": "Sample Check Number" } }, { From 9a87a91c19a3c427756a604d0e28912b7088f3f0 Mon Sep 17 00:00:00 2001 From: Peter Olamit Date: Tue, 18 Jun 2019 14:24:52 -0700 Subject: [PATCH 22/23] added finalizer identifiers --- .../android/ui/receipt/view/ReceiptDetailActivity.java | 3 ++- .../android/ui/receipt/view/ReceiptDetailFragment.java | 8 ++++---- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/receipt/src/main/java/com/hyperwallet/android/ui/receipt/view/ReceiptDetailActivity.java b/receipt/src/main/java/com/hyperwallet/android/ui/receipt/view/ReceiptDetailActivity.java index b382894f8..9dd1a85fa 100644 --- a/receipt/src/main/java/com/hyperwallet/android/ui/receipt/view/ReceiptDetailActivity.java +++ b/receipt/src/main/java/com/hyperwallet/android/ui/receipt/view/ReceiptDetailActivity.java @@ -21,6 +21,7 @@ import android.view.View; import androidx.annotation.NonNull; +import androidx.annotation.Nullable; import androidx.appcompat.app.AppCompatActivity; import androidx.appcompat.widget.Toolbar; import androidx.fragment.app.Fragment; @@ -37,7 +38,7 @@ public class ReceiptDetailActivity extends AppCompatActivity { public static final String EXTRA_RECEIPT = "RECEIPT"; @Override - protected void onCreate(Bundle savedInstanceState) { + protected void onCreate(@Nullable final Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_receipt_detail); diff --git a/receipt/src/main/java/com/hyperwallet/android/ui/receipt/view/ReceiptDetailFragment.java b/receipt/src/main/java/com/hyperwallet/android/ui/receipt/view/ReceiptDetailFragment.java index ae2490c09..8e8f99dec 100644 --- a/receipt/src/main/java/com/hyperwallet/android/ui/receipt/view/ReceiptDetailFragment.java +++ b/receipt/src/main/java/com/hyperwallet/android/ui/receipt/view/ReceiptDetailFragment.java @@ -66,19 +66,19 @@ public static ReceiptDetailFragment newInstance() { } @Override - public void onCreate(Bundle savedInstanceState) { + public void onCreate(@Nullable final Bundle savedInstanceState) { super.onCreate(savedInstanceState); mReceiptDetailViewModel = ViewModelProviders.of(requireActivity()).get(ReceiptDetailViewModel.class); } @Override - public View onCreateView(LayoutInflater inflater, ViewGroup container, - Bundle savedInstanceState) { + public View onCreateView(@NonNull final LayoutInflater inflater, @Nullable final ViewGroup container, + @Nullable final Bundle savedInstanceState) { return inflater.inflate(R.layout.fragment_receipt_detail, container, false); } @Override - public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) { + public void onViewCreated(@NonNull final View view, @Nullable final Bundle savedInstanceState) { super.onViewCreated(view, savedInstanceState); Receipt receipt = mReceiptDetailViewModel.getReceipt(); From ca29ad47b33229993c3bbf1c9364cd5689e57d13 Mon Sep 17 00:00:00 2001 From: Shyang Koong Date: Tue, 18 Jun 2019 16:05:18 -0700 Subject: [PATCH 23/23] Updating response throttling --- .../com/hyperwallet/android/ui/receipt/ListReceiptsTest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/receipt/src/androidTest/java/com/hyperwallet/android/ui/receipt/ListReceiptsTest.java b/receipt/src/androidTest/java/com/hyperwallet/android/ui/receipt/ListReceiptsTest.java index 3e939699b..ee3bb4f03 100644 --- a/receipt/src/androidTest/java/com/hyperwallet/android/ui/receipt/ListReceiptsTest.java +++ b/receipt/src/androidTest/java/com/hyperwallet/android/ui/receipt/ListReceiptsTest.java @@ -423,7 +423,7 @@ public void testListReceipt_checkDateTextOnLocaleChange() { @Test public void testListReceipt_displaysNetworkErrorDialogOnConnectionTimeout() { mMockWebServer.getServer().enqueue(new MockResponse().setResponseCode(HTTP_OK).setBody(sResourceManager - .getResourceContent("receipt_debit_response.json")).throttleBody(1, 5, TimeUnit.SECONDS)); + .getResourceContent("receipt_debit_response.json")).throttleBody(512, 15, TimeUnit.SECONDS)); mMockWebServer.mockResponse().withHttpResponseCode(HTTP_OK).withBody(sResourceManager .getResourceContent("receipt_debit_response.json")).mock(); mMockWebServer.mockResponse().withHttpResponseCode(HTTP_NO_CONTENT).withBody("").mock();