diff --git a/app/src/main/java/com/kickstarter/libs/utils/ApplicationLifecycleUtil.java b/app/src/main/java/com/kickstarter/libs/utils/ApplicationLifecycleUtil.java index 1142271d95..0e9bfd3dab 100644 --- a/app/src/main/java/com/kickstarter/libs/utils/ApplicationLifecycleUtil.java +++ b/app/src/main/java/com/kickstarter/libs/utils/ApplicationLifecycleUtil.java @@ -11,6 +11,7 @@ import com.facebook.appevents.AppEventsLogger; import com.kickstarter.KSApplication; import com.kickstarter.libs.CurrentConfigType; +import com.kickstarter.libs.CurrentUserType; import com.kickstarter.libs.Koala; import com.kickstarter.libs.Logout; import com.kickstarter.libs.rx.transformers.Transformers; @@ -23,6 +24,7 @@ public final class ApplicationLifecycleUtil implements Application.ActivityLifec protected @Inject Koala koala; protected @Inject ApiClientType client; protected @Inject CurrentConfigType config; + protected @Inject CurrentUserType currentUser; protected @Inject Logout logout; private final KSApplication application; @@ -55,6 +57,14 @@ public void onActivityResumed(final @NonNull Activity activity) { .compose(Transformers.neverError()) .subscribe(c -> this.config.config(c)); + // Refresh the user + final String accessToken = this.currentUser.getAccessToken(); + + if (ObjectUtils.isNotNull(accessToken)) { + this.client.fetchCurrentUser() + .subscribe(u -> this.currentUser.refresh(u)); + } + this.isInBackground = false; } } diff --git a/app/src/main/java/com/kickstarter/libs/utils/UserUtils.java b/app/src/main/java/com/kickstarter/libs/utils/UserUtils.java index c768c9620e..1b338871d2 100644 --- a/app/src/main/java/com/kickstarter/libs/utils/UserUtils.java +++ b/app/src/main/java/com/kickstarter/libs/utils/UserUtils.java @@ -1,6 +1,7 @@ package com.kickstarter.libs.utils; import android.support.annotation.NonNull; +import android.support.annotation.Nullable; import com.kickstarter.models.Location; import com.kickstarter.models.User; @@ -19,4 +20,16 @@ public static boolean isLocationGermany(final @NonNull User user) { return I18nUtils.isCountryGermany(location.country()); } + + /** + * Returns whether two users are different where equality is determined by matching IDs. + */ + public static boolean userHasChanged(final @Nullable User u1, final @Nullable User u2) { + if (ObjectUtils.isNull(u1) && ObjectUtils.isNull(u2)) { + return false; + } else if (ObjectUtils.isNotNull(u1) && ObjectUtils.isNotNull(u2)) { + return u1.id() != u2.id(); + } + return true; + } } diff --git a/app/src/main/java/com/kickstarter/services/apiresponses/ProjectStatsEnvelope.java b/app/src/main/java/com/kickstarter/services/apiresponses/ProjectStatsEnvelope.java index 2d0d057d9c..d202a8783d 100644 --- a/app/src/main/java/com/kickstarter/services/apiresponses/ProjectStatsEnvelope.java +++ b/app/src/main/java/com/kickstarter/services/apiresponses/ProjectStatsEnvelope.java @@ -2,6 +2,7 @@ import android.os.Parcelable; import android.support.annotation.NonNull; +import android.support.annotation.Nullable; import com.kickstarter.libs.ReferrerType; import com.kickstarter.libs.qualifiers.AutoGson; @@ -20,7 +21,7 @@ public abstract class ProjectStatsEnvelope implements Parcelable { public abstract List fundingDistribution(); public abstract List referralDistribution(); public abstract List rewardDistribution(); - public abstract VideoStats videoStats(); + public abstract @Nullable VideoStats videoStats(); @AutoParcel.Builder public abstract static class Builder { diff --git a/app/src/main/java/com/kickstarter/viewmodels/DiscoveryFragmentViewModel.java b/app/src/main/java/com/kickstarter/viewmodels/DiscoveryFragmentViewModel.java index 181d77fe54..d6143a7d29 100644 --- a/app/src/main/java/com/kickstarter/viewmodels/DiscoveryFragmentViewModel.java +++ b/app/src/main/java/com/kickstarter/viewmodels/DiscoveryFragmentViewModel.java @@ -15,9 +15,11 @@ import com.kickstarter.libs.utils.ListUtils; import com.kickstarter.libs.utils.ObjectUtils; import com.kickstarter.libs.utils.RefTagUtils; +import com.kickstarter.libs.utils.UserUtils; import com.kickstarter.models.Activity; import com.kickstarter.models.Category; import com.kickstarter.models.Project; +import com.kickstarter.models.User; import com.kickstarter.services.ApiClientType; import com.kickstarter.services.DiscoveryParams; import com.kickstarter.services.apiresponses.ActivityEnvelope; @@ -55,8 +57,11 @@ public DiscoveryFragmentViewModel(final @NonNull Environment environment) { this.activitySamplePreference = environment.activitySamplePreference(); this.currentUser = environment.currentUser(); + final Observable changedUser = this.currentUser.observable() + .distinctUntilChanged((u1, u2) -> !UserUtils.userHasChanged(u1, u2)); + final Observable selectedParams = Observable.combineLatest( - this.currentUser.observable(), + changedUser, this.paramsFromActivity.distinctUntilChanged(), (__, params) -> params ); @@ -106,12 +111,13 @@ public DiscoveryFragmentViewModel(final @NonNull Environment environment) { }); this.paramsFromActivity - .compose(combineLatestPair(this.currentUser.isLoggedIn())) + .compose(combineLatestPair(this.currentUser.isLoggedIn().distinctUntilChanged())) .map(pu -> isOnboardingVisible(pu.first, pu.second)) .compose(bindToLifecycle()) .subscribe(this.shouldShowOnboardingView); this.currentUser.loggedInUser() + .distinctUntilChanged((u1, u2) -> !UserUtils.userHasChanged(u1, u2)) .compose(combineLatestPair(this.paramsFromActivity)) .flatMap(__ -> this.fetchActivity()) .filter(this::activityHasNotBeenSeen) @@ -128,14 +134,12 @@ public DiscoveryFragmentViewModel(final @NonNull Environment environment) { this.paramsFromActivity .compose(combineLatestPair(paginator.loadingPage().distinctUntilChanged())) .map(paramsAndPage -> paramsAndPage.first.toBuilder().page(paramsAndPage.second).build()) - .compose(combineLatestPair(this.currentUser.isLoggedIn())) + .compose(combineLatestPair(this.currentUser.isLoggedIn().distinctUntilChanged())) .compose(bindToLifecycle()) - .subscribe(paramsAndLoggedIn -> { - this.koala.trackDiscovery( - paramsAndLoggedIn.first, - isOnboardingVisible(paramsAndLoggedIn.first, paramsAndLoggedIn.second) - ); - }); + .subscribe(paramsAndLoggedIn -> this.koala.trackDiscovery( + paramsAndLoggedIn.first, + isOnboardingVisible(paramsAndLoggedIn.first, paramsAndLoggedIn.second) + )); this.startUpdateActivity .map(Activity::project) diff --git a/app/src/main/java/com/kickstarter/viewmodels/DiscoveryViewModel.java b/app/src/main/java/com/kickstarter/viewmodels/DiscoveryViewModel.java index 13162fa877..b2500c11f5 100644 --- a/app/src/main/java/com/kickstarter/viewmodels/DiscoveryViewModel.java +++ b/app/src/main/java/com/kickstarter/viewmodels/DiscoveryViewModel.java @@ -14,6 +14,7 @@ import com.kickstarter.libs.utils.DiscoveryDrawerUtils; import com.kickstarter.libs.utils.DiscoveryUtils; import com.kickstarter.libs.utils.IntegerUtils; +import com.kickstarter.libs.utils.UserUtils; import com.kickstarter.models.Category; import com.kickstarter.models.User; import com.kickstarter.services.ApiClientType; @@ -120,7 +121,10 @@ public ViewModel(final @NonNull Environment environment) { final Observable currentUser = this.currentUser.observable(); - currentUser.subscribe(updatedUser -> + final Observable changedUser = currentUser + .distinctUntilChanged((u1, u2) -> !UserUtils.userHasChanged(u1, u2)); + + changedUser.subscribe(updatedUser -> this.apiClient.config() .compose(Transformers.neverError()) .subscribe(this.currentConfigType::config)); @@ -198,7 +202,7 @@ public ViewModel(final @NonNull Environment environment) { // to avoid displaying old data. pagerSelectedPage .compose(takeWhen(params)) - .compose(combineLatestPair(currentUser)) + .compose(combineLatestPair(changedUser)) .map(pageAndUser -> pageAndUser.first) .flatMap(currentPage -> Observable.from(DiscoveryParams.Sort.values()) .map(DiscoveryUtils::positionFromSort) diff --git a/app/src/test/java/com/kickstarter/libs/utils/UserUtilsTest.java b/app/src/test/java/com/kickstarter/libs/utils/UserUtilsTest.java new file mode 100644 index 0000000000..7d775855b1 --- /dev/null +++ b/app/src/test/java/com/kickstarter/libs/utils/UserUtilsTest.java @@ -0,0 +1,22 @@ +package com.kickstarter.libs.utils; + +import com.kickstarter.KSRobolectricTestCase; +import com.kickstarter.factories.UserFactory; +import com.kickstarter.models.User; + +import org.junit.Test; + +public class UserUtilsTest extends KSRobolectricTestCase { + + @Test + public void testUserHasChanged() { + final User user15 = UserFactory.user().toBuilder().id(15).build(); + final User user21 = UserFactory.user().toBuilder().id(21).build(); + + assertTrue(UserUtils.userHasChanged(null, UserFactory.user())); + assertTrue(UserUtils.userHasChanged(UserFactory.user(), null)); + assertTrue(UserUtils.userHasChanged(user15, user21)); + assertFalse(UserUtils.userHasChanged(null, null)); + assertFalse(UserUtils.userHasChanged(user15, user15)); + } +}