Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

User can view shipping countries from pledge screen #517

Merged
merged 87 commits into from Jun 4, 2019
Merged
Show file tree
Hide file tree
Changes from 68 commits
Commits
Show all changes
87 commits
Select commit Hold shift + click to select a range
96a8bec
Start of shipping rules work:
eoji Apr 15, 2019
2e970b7
Created Adapters, ViewHolders and ViewModel for shipping rules
Scollaco Apr 15, 2019
7ff3618
the shipping rules are in a semi working state. The search is not fil…
Rcureton Apr 17, 2019
af44ed7
showing rules in list but they're not clickable
Rcureton Apr 18, 2019
7b30f0d
setting up clicklistener
Rcureton Apr 19, 2019
2e29d67
fixing the filter in the adapter
Rcureton Apr 22, 2019
9fd2ab4
Fixed bug the freezes app after showing filters
Scollaco Apr 22, 2019
7667ac2
Merge branch 'reward-shipping' of https://github.com/kickstarter/andr…
Scollaco Apr 22, 2019
cdee61f
Merge branch 'master' of github.com:kickstarter/android-oss into rewa…
Rcureton Apr 22, 2019
367370a
fixing things
Rcureton Apr 22, 2019
af73ac1
Merge branch 'reward-shipping' of github.com:kickstarter/android-oss …
Rcureton Apr 22, 2019
5c02341
list selections working with dropdown dismissing:
Rcureton Apr 22, 2019
9d99636
Fixed filtering and made it case-insensitive
Scollaco Apr 22, 2019
8154692
Cleanup
Scollaco Apr 22, 2019
a20c96d
added statelistdrawable for reward button
Rcureton Apr 23, 2019
44d6dee
Added logic to hide shipping rules row if reward is non shippable
Scollaco Apr 23, 2019
8e2b16e
Merge branch 'reward-shipping' of https://github.com/kickstarter/andr…
Scollaco Apr 23, 2019
d5e92ca
removed changes with pledge button state
Rcureton Apr 23, 2019
d8fb59b
added tests to pledgefragment
Rcureton Apr 23, 2019
661a671
Created ShippingRulesEnvelopeFactory
Scollaco Apr 23, 2019
9df4eea
Merge branch 'reward-shipping' of https://github.com/kickstarter/andr…
Scollaco Apr 23, 2019
47c1c08
Project buildable again
Scollaco Apr 23, 2019
984f8f8
Created ShippingRulesEnvelope class in java, created ShippingRulesFac…
Scollaco Apr 24, 2019
443809d
added tests and then fixed the dropdown style
Rcureton Apr 24, 2019
031ec71
Merge branch 'reward-shipping' of github.com:kickstarter/android-oss …
Rcureton Apr 24, 2019
69b92fc
wrote tests for the shippingruleviewholderviewmodel
Rcureton Apr 24, 2019
22ef11d
added tests in pledgefragment
Rcureton Apr 24, 2019
fdba896
Created ShippingRuleFactory and wrote missing unit tests
Scollaco Apr 25, 2019
dfd74a9
Fixed unit test / Cleanup
Scollaco Apr 25, 2019
ab74798
fixed checkstyle errors
Rcureton Apr 25, 2019
c014f97
Merge branch 'master' into reward-shipping
Rcureton Apr 25, 2019
fe626be
merged in changes from master
Rcureton Apr 25, 2019
cc1a304
Fixed tests
Scollaco Apr 25, 2019
612a710
Merge branch 'reward-shipping' of https://github.com/kickstarter/andr…
Scollaco Apr 25, 2019
b6461ba
fixed line spacing, alphabetized methods
Rcureton Apr 26, 2019
afe4fdd
Merge branch 'reward-shipping' of github.com:kickstarter/android-oss …
Rcureton Apr 26, 2019
fca3404
PR feedback
Scollaco Apr 26, 2019
a4ac4f4
fixed style
Rcureton Apr 26, 2019
e1f226e
Merge branch 'reward-shipping' of github.com:kickstarter/android-oss …
Rcureton Apr 26, 2019
2cbbbe3
fixed the background click indicator for the shipping rules
Rcureton Apr 26, 2019
2627ba1
Merge branch 'master' into reward-shipping
Rcureton Apr 26, 2019
817aadf
added drawable for loading states in pledge fragment
Rcureton Apr 26, 2019
456cddc
added test for kscurrency method
Rcureton Apr 29, 2019
43b9da1
added logic for emitting the total amount when a reward doesn't have …
Rcureton Apr 29, 2019
f3dccc5
fixed shipping rule item height and foreground click
Rcureton May 2, 2019
9c00b9d
added text sizes to shipping rule item and autocompletetext
Rcureton May 3, 2019
3b3c3cf
fixed shipping rule row background and conversion text
Rcureton May 15, 2019
dec7a68
updated user preference method and have proper currency conversion
Rcureton May 15, 2019
fa0551d
fixed and updated tests for pledge fragment
Rcureton May 15, 2019
e93fa97
Merge remote-tracking branch 'oss/master' into reward-shipping
Scollaco May 16, 2019
5824700
removed id from item reward
Rcureton May 16, 2019
a48371c
fixed failing tests and unused code
Rcureton May 16, 2019
a637a55
removed line
Rcureton May 16, 2019
acd9ac8
fixed filtering for shipping rules
Rcureton May 20, 2019
f5889f3
added helper method for shipping enabled and filtered out when a rewa…
Rcureton May 21, 2019
612a38f
fixed tests in pledgefragmentvm and also fixed network call on config…
Rcureton May 21, 2019
92add32
updated tests in pledgefragment
Rcureton May 21, 2019
f2542f7
fixed the tests
Rcureton May 21, 2019
85f6b7c
Added take(1) function to the shippingRules observable so we only fet…
Scollaco May 23, 2019
02b010c
fixed context nullability in pledgefragment
Rcureton May 23, 2019
0006359
Merge branch 'reward-shipping' of github.com:kickstarter/android-oss …
Rcureton May 23, 2019
24150e0
removed unused method in reward model
Rcureton May 23, 2019
5df6dbb
removed lines and updated method description
Rcureton May 23, 2019
bdefc00
fixed conversion method in kscurrency and fixed dimens
Rcureton May 23, 2019
fe7c3d7
refactored hide keyboard method
Rcureton May 28, 2019
a30f8f6
Added .share() to the shippingRules Observable in order to avoid it b…
Scollaco May 28, 2019
0e611a2
added method to hide keyboard
Rcureton May 28, 2019
81d01a7
Merge branch 'reward-shipping' of github.com:kickstarter/android-oss …
Rcureton May 28, 2019
2fea121
refactored keyboard method and fixed plus sign
Rcureton May 30, 2019
e007444
fixed failing test by adding trampoline to delay scheduler
Rcureton May 30, 2019
1ee05ae
fixed icon spacing with plus sign
Rcureton May 31, 2019
43c0f89
Added logic to update pledge total amount when stepper changes value …
Scollaco May 31, 2019
7685126
fixed plus sign spacing
Rcureton Jun 3, 2019
d262d06
merged in changes
Rcureton Jun 3, 2019
05b70b3
Merge branch 'reward-shipping' of github.com:kickstarter/android-oss …
Rcureton Jun 3, 2019
f67bd8b
Added property on ProjectActivity to avoid rewards_container height t…
Scollaco Jun 3, 2019
64e11f3
Now using the right property to handle keyboard issue
Scollaco Jun 3, 2019
0b209d7
changed the dropdown anchor
Rcureton Jun 4, 2019
6463590
Moved hideKeyboard to activity extensions. Clearing focus after shipp…
eoji Jun 4, 2019
b0ef1fb
removed unused dropdown code and fixed anchor to shipping row
Rcureton Jun 4, 2019
0473c14
using setUpEnvironment in tests
eoji Jun 4, 2019
008e121
Merge branch 'reward-shipping' of github.com:kickstarter/android-oss …
eoji Jun 4, 2019
494870e
Merge branch 'master' into reward-shipping
Rcureton Jun 4, 2019
791a4ed
merged in changes from master
Rcureton Jun 4, 2019
334108d
updated test with precision
Rcureton Jun 4, 2019
818414d
fixed missing tests
Rcureton Jun 4, 2019
44da83d
fixed code format
Rcureton Jun 4, 2019
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
46 changes: 44 additions & 2 deletions app/src/main/java/com/kickstarter/libs/KSCurrency.java
@@ -1,9 +1,13 @@
package com.kickstarter.libs;

import android.os.Parcelable;
import android.text.SpannableString;
import android.text.Spanned;
import android.text.style.RelativeSizeSpan;

import com.kickstarter.libs.utils.NumberUtils;
import com.kickstarter.models.Project;
import com.kickstarter.ui.views.CenterSpan;

import java.math.RoundingMode;

Expand Down Expand Up @@ -87,20 +91,58 @@ public String formatWithProjectCurrency(final double initialValue, final @NonNul
return NumberUtils.format(currencyOptions.value(), numberOptions);
}

/**
* Returns a currency string appropriate to the user's locale, chosenCurrency and project preferred currency.
*
* @param initialValue Value to display, local to the project's currency.
* @param project The project to use to look up currency information.
* @param roundingMode This determines whether we should round the values down or up.
*/
public SpannableString formatWithProjectCurrency(final double initialValue, final @NonNull Project project, final @NonNull RoundingMode roundingMode, final int precision) {

final CurrencyOptions currencyOptions = projectCurrencyOptions(initialValue, roundingMode, project);

final NumberOptions numberOptions = NumberOptions.builder()
.currencySymbol(currencyOptions.currencySymbol())
.roundingMode(roundingMode)
.precision(precision)
.build();

final String currency = NumberUtils.format(currencyOptions.value(), numberOptions);
final String symbol = currencyOptions.currencySymbol();
final SpannableString string = new SpannableString(currency);

final int startOfSymbol = currency.indexOf(symbol);
final int endOfSymbol = startOfSymbol + symbol.length();
string.setSpan(new RelativeSizeSpan(.5f), startOfSymbol, endOfSymbol, Spanned.SPAN_INCLUSIVE_INCLUSIVE);
string.setSpan(new CenterSpan(), startOfSymbol, endOfSymbol, Spanned.SPAN_INCLUSIVE_INCLUSIVE);

if (precision > 0) {
final int length = string.length();
final int startOfPrecision = length - precision - 1;
string.setSpan(new RelativeSizeSpan(.5f), startOfPrecision, length, Spanned.SPAN_INCLUSIVE_INCLUSIVE);
string.setSpan(new CenterSpan(), startOfPrecision, length, Spanned.SPAN_INCLUSIVE_INCLUSIVE);
}

return string;
}

/**
* Returns a currency string appropriate to the user's locale and preferred currency.
*
* @param initialValue Value to display, local to the project's currency.
* @param project The project to use to look up currency information.
* @param roundingMode This determines whether we should round the values down or up.
*/
public String formatWithUserPreference(final double initialValue, final @NonNull Project project, final @NonNull RoundingMode roundingMode) {

public String formatWithUserPreference(final double initialValue, final @NonNull Project project, final @NonNull RoundingMode roundingMode, final int precision) {

final CurrencyOptions currencyOptions = userCurrencyOptions(initialValue, roundingMode, project);

final NumberOptions numberOptions = NumberOptions.builder()
.currencySymbol(currencyOptions.currencySymbol())
.roundingMode(roundingMode)
.precision(precision)
.build();

return NumberUtils.format(currencyOptions.value(), numberOptions);
Expand Down Expand Up @@ -167,7 +209,7 @@ public String formatWithUserPreference(final double initialValue, final @NonNull
.country(project.country())
.currencyCode("")
.currencySymbol(shouldShowDollar ? "$": getSymbolForCurrency(project.currentCurrency()))
.value(roundingMode == RoundingMode.UP ? (float) Math.ceil(value) : (float) Math.floor(value) * fxRate)
.value((roundingMode == RoundingMode.UP ? (float) Math.ceil(value) : (float) Math.floor(value)) * fxRate)
.build();
}

Expand Down
@@ -0,0 +1,24 @@
package com.kickstarter.mock.factories

import com.kickstarter.models.Location
import com.kickstarter.models.ShippingRule

class ShippingRuleFactory private constructor() {
companion object {
fun usShippingRule(): ShippingRule {
return ShippingRule.builder()
.id(10)
.cost(30.0)
.location(LocationFactory.unitedStates())
.build()
}

fun germanyShippingRule(): ShippingRule {
return ShippingRule.builder()
.id(10)
.cost(30.0)
.location(LocationFactory.germany())
.build()
}
}
}
@@ -0,0 +1,25 @@
package com.kickstarter.mock.factories

import com.kickstarter.models.ShippingRule
import com.kickstarter.services.apiresponses.ShippingRulesEnvelope

class ShippingRulesEnvelopeFactory private constructor() {

companion object {

fun shippingRules(): ShippingRulesEnvelope {
return ShippingRulesEnvelope.builder()
.shippingRules(listOf(
ShippingRuleFactory.usShippingRule(),
ShippingRuleFactory.germanyShippingRule())
)
.build()
}

fun emptyShippingRules(): ShippingRulesEnvelope {
return ShippingRulesEnvelope.builder()
.shippingRules(listOf())
.build()
}
}
}
Expand Up @@ -13,6 +13,7 @@
import com.kickstarter.mock.factories.MessageThreadEnvelopeFactory;
import com.kickstarter.mock.factories.MessageThreadsEnvelopeFactory;
import com.kickstarter.mock.factories.ProjectFactory;
import com.kickstarter.mock.factories.ShippingRulesEnvelopeFactory;
import com.kickstarter.mock.factories.SurveyResponseFactory;
import com.kickstarter.mock.factories.UpdateFactory;
import com.kickstarter.mock.factories.UserFactory;
Expand All @@ -25,6 +26,7 @@
import com.kickstarter.models.MessageThread;
import com.kickstarter.models.Project;
import com.kickstarter.models.ProjectNotification;
import com.kickstarter.models.Reward;
import com.kickstarter.models.SurveyResponse;
import com.kickstarter.models.Update;
import com.kickstarter.models.User;
Expand All @@ -38,6 +40,7 @@
import com.kickstarter.services.apiresponses.MessageThreadsEnvelope;
import com.kickstarter.services.apiresponses.ProjectStatsEnvelope;
import com.kickstarter.services.apiresponses.ProjectsEnvelope;
import com.kickstarter.services.apiresponses.ShippingRulesEnvelope;
import com.kickstarter.ui.data.Mailbox;
import com.kickstarter.ui.data.MessageSubject;

Expand Down Expand Up @@ -203,6 +206,11 @@ public class MockApiClient implements ApiClientType {
public @NonNull Observable<MessageThreadsEnvelope> fetchMessageThreadsWithPaginationPath(final @NonNull String paginationPath) {
return Observable.empty();
}
@NonNull
@Override
public Observable<ShippingRulesEnvelope> fetchShippingRules(@NonNull final Project project, @NonNull final Reward reward) {
return Observable.just(ShippingRulesEnvelopeFactory.Companion.shippingRules());
}

@Override
public @NonNull Observable<Update> fetchUpdate(final @NonNull String projectParam, final @NonNull String updateParam) {
Expand Down
1 change: 1 addition & 0 deletions app/src/main/java/com/kickstarter/models/Reward.java
Expand Up @@ -61,4 +61,5 @@ public boolean isAllGone() {
public boolean isLimited() {
return this.limit() != null && !this.isAllGone();
}

}
36 changes: 36 additions & 0 deletions app/src/main/java/com/kickstarter/models/ShippingRule.kt
@@ -0,0 +1,36 @@
package com.kickstarter.models

import android.os.Parcelable
import androidx.annotation.Nullable
import auto.parcel.AutoParcel
import com.kickstarter.libs.qualifiers.AutoGson

@AutoGson
@AutoParcel
abstract class ShippingRule : Parcelable {
@Nullable abstract fun id(): Long?
abstract fun cost(): Double
abstract fun location(): Location

@AutoParcel.Builder
abstract class Builder {
abstract fun id(id: Long?): Builder
abstract fun cost(cost: Double): Builder
abstract fun location(location: Location): Builder
abstract fun build(): ShippingRule
}

override fun toString(): String {
return location().displayableName()
}

abstract fun toBuilder(): Builder

companion object {

fun builder(): Builder {
return AutoParcel_ShippingRule.Builder()
}
}

}
10 changes: 10 additions & 0 deletions app/src/main/java/com/kickstarter/services/ApiClient.java
Expand Up @@ -15,6 +15,7 @@
import com.kickstarter.models.MessageThread;
import com.kickstarter.models.Project;
import com.kickstarter.models.ProjectNotification;
import com.kickstarter.models.Reward;
import com.kickstarter.models.SurveyResponse;
import com.kickstarter.models.Update;
import com.kickstarter.models.User;
Expand All @@ -38,6 +39,7 @@
import com.kickstarter.services.apiresponses.MessageThreadsEnvelope;
import com.kickstarter.services.apiresponses.ProjectStatsEnvelope;
import com.kickstarter.services.apiresponses.ProjectsEnvelope;
import com.kickstarter.services.apiresponses.ShippingRulesEnvelope;
import com.kickstarter.services.apiresponses.StarEnvelope;
import com.kickstarter.ui.data.Mailbox;
import com.kickstarter.ui.data.MessageSubject;
Expand Down Expand Up @@ -268,6 +270,14 @@ public ApiClient(final @NonNull ApiService service, final @NonNull Gson gson) {
.subscribeOn(Schedulers.io());
}

@Override
public @NonNull Observable<ShippingRulesEnvelope> fetchShippingRules(final @NonNull Project project, final @NonNull Reward reward) {
return this.service
.shippingRules(project.id(), reward.id())
.lift(apiErrorOperator())
.subscribeOn(Schedulers.io());
}

@Override
public @NonNull Observable<SurveyResponse> fetchSurveyResponse(final long surveyResponseId) {
return this.service
Expand Down
4 changes: 4 additions & 0 deletions app/src/main/java/com/kickstarter/services/ApiClientType.java
Expand Up @@ -10,6 +10,7 @@
import com.kickstarter.models.MessageThread;
import com.kickstarter.models.Project;
import com.kickstarter.models.ProjectNotification;
import com.kickstarter.models.Reward;
import com.kickstarter.models.SurveyResponse;
import com.kickstarter.models.Update;
import com.kickstarter.models.User;
Expand All @@ -21,6 +22,7 @@
import com.kickstarter.services.apiresponses.MessageThreadsEnvelope;
import com.kickstarter.services.apiresponses.ProjectStatsEnvelope;
import com.kickstarter.services.apiresponses.ProjectsEnvelope;
import com.kickstarter.services.apiresponses.ShippingRulesEnvelope;
import com.kickstarter.ui.data.Mailbox;
import com.kickstarter.ui.data.MessageSubject;

Expand Down Expand Up @@ -81,6 +83,8 @@ public interface ApiClientType {

@NonNull Observable<MessageThreadsEnvelope> fetchMessageThreadsWithPaginationPath(final @NonNull String paginationPath);

@NonNull Observable<ShippingRulesEnvelope> fetchShippingRules(final @NonNull Project project, final @NonNull Reward reward);

@NonNull Observable<Update> fetchUpdate(final @NonNull String projectParam, final @NonNull String updateParam);

@NonNull Observable<Update> fetchUpdate(final @NonNull Update update);
Expand Down
4 changes: 4 additions & 0 deletions app/src/main/java/com/kickstarter/services/ApiService.java
Expand Up @@ -33,6 +33,7 @@
import com.kickstarter.services.apiresponses.MessageThreadsEnvelope;
import com.kickstarter.services.apiresponses.ProjectStatsEnvelope;
import com.kickstarter.services.apiresponses.ProjectsEnvelope;
import com.kickstarter.services.apiresponses.ShippingRulesEnvelope;
import com.kickstarter.services.apiresponses.StarEnvelope;

import java.util.List;
Expand Down Expand Up @@ -167,6 +168,9 @@ Observable<Response<Message>> sendMessageToBacking(
@POST("/v1/projects/{project_id}/messages")
Observable<Response<Message>> sendMessageToProject(@Path("project_id") long projectId, @Body MessageBody body);

@GET("/v1/projects/{project_id}/rewards/{reward_id}/shipping_rules")
Observable<Response<ShippingRulesEnvelope>> shippingRules(@Path("project_id") long projectId, @Path("reward_id") long rewardId);

@POST("/v1/users")
Observable<Response<AccessTokenEnvelope>> signup(@Body SignupBody body);

Expand Down
@@ -0,0 +1,28 @@
package com.kickstarter.services.apiresponses;

import android.os.Parcelable;

import com.kickstarter.libs.qualifiers.AutoGson;
import com.kickstarter.models.ShippingRule;

import java.util.List;

import auto.parcel.AutoParcel;

@AutoGson
@AutoParcel
public abstract class ShippingRulesEnvelope implements Parcelable {
public abstract List<ShippingRule> shippingRules();

@AutoParcel.Builder
public abstract static class Builder {
public abstract Builder shippingRules(List<ShippingRule> ___);
public abstract ShippingRulesEnvelope build();
}

public static Builder builder() {
return new AutoParcel_ShippingRulesEnvelope.Builder();
}

public abstract Builder toBuilder();
}
27 changes: 27 additions & 0 deletions app/src/main/java/com/kickstarter/ui/adapters/KSArrayAdapter.kt
@@ -0,0 +1,27 @@
package com.kickstarter.ui.adapters

import android.content.Context
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.ArrayAdapter
import androidx.annotation.LayoutRes
import androidx.annotation.NonNull
import com.kickstarter.ui.viewholders.KSArrayViewHolder

abstract class KSArrayAdapter<T>(val ctx: Context, private val resourceId: Int, items: ArrayList<T> = arrayListOf()) : ArrayAdapter<T>(ctx, resourceId, items){

override fun getView(position: Int, convertView: View?, parent: ViewGroup): View {
val view = convertView ?: LayoutInflater.from(context).inflate(resourceId, parent, false)
val viewHolder = viewHolder(resourceId, view)
viewHolder.bindData(getItem(position))
return view
}

/**
* Returns a new KSArrayViewHolder given a layout and view.
*/
@NonNull
protected abstract fun viewHolder(@LayoutRes layout: Int, @NonNull view: View): KSArrayViewHolder

}