diff --git a/app/build.gradle b/app/build.gradle index 6ab49db85b..3debf57c1f 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -229,10 +229,6 @@ dependencies { implementation "com.google.dagger:dagger:$dagger_version" kapt "com.google.dagger:dagger-compiler:$dagger_version" implementation 'com.jakewharton:process-phoenix:2.1.2' - final rx_binding_version = '1.0.1' - implementation "com.jakewharton.rxbinding:rxbinding:$rx_binding_version" - implementation "com.jakewharton.rxbinding:rxbinding-recyclerview-v7:$rx_binding_version" - implementation "com.jakewharton.rxbinding:rxbinding-support-v4:$rx_binding_version" implementation "com.jakewharton.timber:timber:5.0.1" implementation 'com.stripe:stripe-android:20.47.3' final okhttp_version = '4.10.+' @@ -241,14 +237,9 @@ dependencies { final retrofit_version = "2.9.+" implementation "com.squareup.retrofit2:retrofit:$retrofit_version" - implementation "com.squareup.retrofit2:adapter-rxjava:$retrofit_version" implementation "com.squareup.retrofit2:adapter-rxjava2:$retrofit_version" implementation "com.squareup.retrofit2:converter-gson:$retrofit_version" - final rx_lifecycle_version = "0.3.0" - implementation "com.trello:rxlifecycle:$rx_lifecycle_version" - implementation "com.trello:rxlifecycle-components:$rx_lifecycle_version" implementation 'io.reactivex.rxjava2:rxandroid:2.1.1' - implementation 'io.reactivex.rxjava2:rxjava:2.2.21' implementation 'net.danlew:android.joda:2.10.7' // Analytics Segment-Braze diff --git a/app/src/androidTest/java/com/kickstarter/screenshoot/testing/di/AndroidTestApplicationModule.kt b/app/src/androidTest/java/com/kickstarter/screenshoot/testing/di/AndroidTestApplicationModule.kt index fab02380fc..03b31df2c2 100644 --- a/app/src/androidTest/java/com/kickstarter/screenshoot/testing/di/AndroidTestApplicationModule.kt +++ b/app/src/androidTest/java/com/kickstarter/screenshoot/testing/di/AndroidTestApplicationModule.kt @@ -8,11 +8,11 @@ import com.kickstarter.ApplicationModule import com.kickstarter.libs.ApiEndpoint import com.kickstarter.libs.InternalToolsType import com.kickstarter.libs.NoopInternalTools -import com.kickstarter.mock.services.MockApiClient -import com.kickstarter.mock.services.MockApolloClient -import com.kickstarter.services.ApiClientType -import com.kickstarter.services.ApiService -import com.kickstarter.services.ApolloClientType +import com.kickstarter.mock.services.MockApiClientV2 +import com.kickstarter.mock.services.MockApolloClientV2 +import com.kickstarter.services.ApiClientTypeV2 +import com.kickstarter.services.ApiServiceV2 +import com.kickstarter.services.ApolloClientTypeV2 import dagger.Module import dagger.Provides import javax.inject.Singleton @@ -35,13 +35,13 @@ class AndroidTestApplicationModule(private val application: Application) : Appli @Provides @Singleton - internal fun provideApiClientType(apiService: ApiService, gson: Gson): ApiClientType { - return MockApiClient() + internal fun provideApiClientType(apiService: ApiServiceV2, gson: Gson): ApiClientTypeV2 { + return MockApiClientV2() } @Provides @Singleton - internal fun provideApolloClientType(apolloClient: ApolloClient): ApolloClientType { - return MockApolloClient() + internal fun provideApolloClientType(apolloClient: ApolloClient): ApolloClientTypeV2 { + return MockApolloClientV2() } } diff --git a/app/src/external/java/com/kickstarter/ExternalApplicationModule.java b/app/src/external/java/com/kickstarter/ExternalApplicationModule.java index 2f5db3a0cb..32d510055f 100644 --- a/app/src/external/java/com/kickstarter/ExternalApplicationModule.java +++ b/app/src/external/java/com/kickstarter/ExternalApplicationModule.java @@ -6,19 +6,12 @@ import com.kickstarter.libs.InternalToolsType; import com.kickstarter.libs.NoopInternalTools; import com.kickstarter.libs.utils.Secrets; -import com.kickstarter.mock.services.MockApiClient; import com.kickstarter.mock.services.MockApiClientV2; -import com.kickstarter.mock.services.MockApolloClient; import com.kickstarter.mock.services.MockApolloClientV2; -import com.kickstarter.services.ApiClient; -import com.kickstarter.services.ApiClientType; import com.kickstarter.services.ApiClientTypeV2; import com.kickstarter.services.ApiClientV2; -import com.kickstarter.services.ApiService; import com.kickstarter.services.ApiServiceV2; -import com.kickstarter.services.ApolloClientType; import com.kickstarter.services.ApolloClientTypeV2; -import com.kickstarter.services.KSApolloClient; import com.kickstarter.services.KSApolloClientV2; import javax.inject.Singleton; @@ -44,13 +37,6 @@ static InternalToolsType providesInternalToolsType() { return new NoopInternalTools(); } - @Provides - @Singleton - @NonNull - static ApiClientType provideApiClientType(final @NonNull ApiService apiService, final @NonNull Gson gson) { - return Secrets.IS_OSS ? new MockApiClient() : new ApiClient(apiService, gson); - } - @Provides @Singleton @NonNull @@ -58,12 +44,6 @@ static ApiClientTypeV2 provideApiClientTypeV2(final @NonNull ApiServiceV2 apiSer return Secrets.IS_OSS ? new MockApiClientV2() : new ApiClientV2(apiService, gson); } - @Provides - @Singleton - @NonNull - static ApolloClientType provideApolloClientType(final @NonNull ApolloClient apolloClient) { - return Secrets.IS_OSS ? new MockApolloClient() : new KSApolloClient(apolloClient); - } @Provides @Singleton diff --git a/app/src/internal/java/com/kickstarter/InternalApplicationModule.java b/app/src/internal/java/com/kickstarter/InternalApplicationModule.java index e14f0ad610..f4d8a7bd69 100644 --- a/app/src/internal/java/com/kickstarter/InternalApplicationModule.java +++ b/app/src/internal/java/com/kickstarter/InternalApplicationModule.java @@ -11,19 +11,12 @@ import com.kickstarter.libs.preferences.StringPreferenceType; import com.kickstarter.libs.qualifiers.ApiEndpointPreference; import com.kickstarter.libs.utils.Secrets; -import com.kickstarter.mock.services.MockApiClient; import com.kickstarter.mock.services.MockApiClientV2; -import com.kickstarter.mock.services.MockApolloClient; import com.kickstarter.mock.services.MockApolloClientV2; -import com.kickstarter.services.ApiClient; -import com.kickstarter.services.ApiClientType; import com.kickstarter.services.ApiClientTypeV2; import com.kickstarter.services.ApiClientV2; -import com.kickstarter.services.ApiService; import com.kickstarter.services.ApiServiceV2; -import com.kickstarter.services.ApolloClientType; import com.kickstarter.services.ApolloClientTypeV2; -import com.kickstarter.services.KSApolloClient; import com.kickstarter.services.KSApolloClientV2; import javax.inject.Singleton; @@ -54,12 +47,6 @@ InternalToolsType providesInternalToolsType() { return new InternalTools(); } - @Provides - @Singleton - @NonNull - static ApolloClientType provideApolloClientType(final @NonNull ApolloClient apolloClient) { - return Secrets.IS_OSS ? new MockApolloClient() : new KSApolloClient(apolloClient); - } @Provides @Singleton @@ -68,13 +55,6 @@ static ApolloClientTypeV2 provideApolloClientTypeV2(final @NonNull ApolloClient return Secrets.IS_OSS ? new MockApolloClientV2() : new KSApolloClientV2(apolloClient, gson); } - @Provides - @Singleton - @NonNull - static ApiClientType provideApiClientType(final @NonNull ApiService apiService, final @NonNull Gson gson) { - return Secrets.IS_OSS ? new MockApiClient() : new ApiClient(apiService, gson); - } - @Provides @Singleton @NonNull diff --git a/app/src/main/java/com/kickstarter/ApplicationModule.java b/app/src/main/java/com/kickstarter/ApplicationModule.java index 887dfc6151..266ed4d0c3 100644 --- a/app/src/main/java/com/kickstarter/ApplicationModule.java +++ b/app/src/main/java/com/kickstarter/ApplicationModule.java @@ -16,12 +16,8 @@ import com.kickstarter.libs.ApiEndpoint; import com.kickstarter.libs.AttributionEvents; import com.kickstarter.libs.Build; -import com.kickstarter.libs.CurrentConfig; import com.kickstarter.libs.CurrentConfigV2; -import com.kickstarter.libs.CurrentConfigType; import com.kickstarter.libs.CurrentConfigTypeV2; -import com.kickstarter.libs.CurrentUser; -import com.kickstarter.libs.CurrentUserType; import com.kickstarter.libs.CurrentUserTypeV2; import com.kickstarter.libs.DateTimeTypeConverter; import com.kickstarter.libs.DeviceRegistrar; @@ -56,7 +52,6 @@ import com.kickstarter.libs.preferences.StringPreferenceType; import com.kickstarter.libs.qualifiers.AccessTokenPreference; import com.kickstarter.libs.qualifiers.ActivitySamplePreference; -import com.kickstarter.libs.qualifiers.ApiRetrofit; import com.kickstarter.libs.qualifiers.ApiRetrofitV2; import com.kickstarter.libs.qualifiers.AppRatingPreference; import com.kickstarter.libs.qualifiers.ApplicationContext; @@ -69,11 +64,8 @@ import com.kickstarter.libs.qualifiers.WebRetrofit; import com.kickstarter.libs.utils.PlayServicesCapability; import com.kickstarter.libs.utils.Secrets; -import com.kickstarter.services.ApiClientType; import com.kickstarter.services.ApiClientTypeV2; -import com.kickstarter.services.ApiService; import com.kickstarter.services.ApiServiceV2; -import com.kickstarter.services.ApolloClientType; import com.kickstarter.services.ApolloClientTypeV2; import com.kickstarter.services.KSWebViewClient; import com.kickstarter.services.interceptors.ApiRequestInterceptor; @@ -97,16 +89,14 @@ import androidx.preference.PreferenceManager; import dagger.Module; import dagger.Provides; +import io.reactivex.Scheduler; import okhttp3.CookieJar; import okhttp3.JavaNetCookieJar; import okhttp3.OkHttpClient; import okhttp3.logging.HttpLoggingInterceptor; import retrofit2.Retrofit; -import retrofit2.adapter.rxjava.RxJavaCallAdapterFactory; import retrofit2.adapter.rxjava2.RxJava2CallAdapterFactory; import retrofit2.converter.gson.GsonConverterFactory; -import rx.Scheduler; -import rx.schedulers.Schedulers; import type.CustomType; @Module @@ -120,15 +110,11 @@ public ApplicationModule(final @NonNull Application application) { @Provides @Singleton static Environment provideEnvironment(final @NonNull @ActivitySamplePreference IntPreferenceType activitySamplePreference, - final @NonNull ApiClientType apiClient, final @NonNull ApiClientTypeV2 apiClientV2, - final @NonNull ApolloClientType apolloClient, final @NonNull ApolloClientTypeV2 apolloClientV2, final @NonNull Build build, final @NonNull CookieManager cookieManager, - final @NonNull CurrentConfigType currentConfig, final @NonNull CurrentConfigTypeV2 currentConfig2, - final @NonNull CurrentUserType currentUser, final @NonNull CurrentUserTypeV2 currentUser2, final @NonNull @FirstSessionPreference BooleanPreferenceType firstSessionPreference, final @NonNull Gson gson, @@ -141,8 +127,7 @@ static Environment provideEnvironment(final @NonNull @ActivitySamplePreference I final @NonNull AttributionEvents attributionEvents, final @NonNull Logout logout, final @NonNull PlayServicesCapability playServicesCapability, - final @NonNull Scheduler scheduler, - final @NonNull io.reactivex.Scheduler schedulerV2, + final @NonNull Scheduler schedulerV2, final @NonNull SharedPreferences sharedPreferences, final @NonNull Stripe stripe, final @NonNull @WebEndpoint String webEndpoint, @@ -151,15 +136,11 @@ static Environment provideEnvironment(final @NonNull @ActivitySamplePreference I return Environment.builder() .activitySamplePreference(activitySamplePreference) - .apiClient(apiClient) .apiClientV2(apiClientV2) - .apolloClient(apolloClient) .apolloClientV2(apolloClientV2) .build(build) .cookieManager(cookieManager) - .currentConfig(currentConfig) .currentConfig2(currentConfig2) - .currentUser(currentUser) .currentUserV2(currentUser2) .firstSessionPreference(firstSessionPreference) .gson(gson) @@ -172,7 +153,6 @@ static Environment provideEnvironment(final @NonNull @ActivitySamplePreference I .attributionEvents(attributionEvents) .logout(logout) .playServicesCapability(playServicesCapability) - .scheduler(scheduler) .schedulerV2(schedulerV2) .sharedPreferences(sharedPreferences) .stripe(stripe) @@ -252,16 +232,6 @@ static OkHttpClient provideOkHttpClient(final @NonNull ApiRequestInterceptor api .build(); } - @Provides - @Singleton - @ApiRetrofit - @NonNull - static Retrofit provideApiRetrofit(final @NonNull ApiEndpoint apiEndpoint, - final @NonNull Gson gson, - final @NonNull OkHttpClient okHttpClient) { - return createRetrofit(apiEndpoint.url(), gson, okHttpClient); - } - @Provides @Singleton @ApiRetrofitV2 @@ -289,13 +259,6 @@ static GraphQLInterceptor provideGraphQLInterceptor(final @NonNull String client return new GraphQLInterceptor(clientId, currentUser, build); } - @Provides - @Singleton - @NonNull - static ApiService provideApiService(final @ApiRetrofit @NonNull Retrofit retrofit) { - return retrofit.create(ApiService.class); - } - @Provides @Singleton @NonNull @@ -334,26 +297,17 @@ static HttpLoggingInterceptor provideHttpLoggingInterceptor() { static Retrofit provideWebRetrofit(@NonNull @WebEndpoint final String webEndpoint, final @NonNull Gson gson, final @NonNull OkHttpClient okHttpClient) { - return createRetrofit(webEndpoint, gson, okHttpClient); + return createRetrofitV2(webEndpoint, gson, okHttpClient); } @Provides @Singleton @NonNull - static WebRequestInterceptor provideWebRequestInterceptor(final @NonNull CurrentUserType currentUser, + static WebRequestInterceptor provideWebRequestInterceptor(final @NonNull CurrentUserTypeV2 currentUser, @NonNull @WebEndpoint final String endpoint, final @NonNull InternalToolsType internalTools, final @NonNull Build build) { return new WebRequestInterceptor(currentUser, endpoint, internalTools, build); } - private static @NonNull Retrofit createRetrofit(final @NonNull String baseUrl, final @NonNull Gson gson, final @NonNull OkHttpClient okHttpClient) { - return new Retrofit.Builder() - .client(okHttpClient) - .baseUrl(baseUrl) - .addConverterFactory(GsonConverterFactory.create(gson)) - .addCallAdapterFactory(RxJavaCallAdapterFactory.create()) - .build(); - } - private static @NonNull Retrofit createRetrofitV2(final @NonNull String baseUrl, final @NonNull Gson gson, final @NonNull OkHttpClient okHttpClient) { return new Retrofit.Builder() .client(okHttpClient) @@ -438,9 +392,8 @@ SegmentTrackingClient provideSegmentTrackingClient( @Singleton static AnalyticEvents provideAnalytics( final @ApplicationContext @NonNull Context context, - final @NonNull CurrentUserType currentUser, + final @NonNull CurrentUserTypeV2 currentUser, final @NonNull Build build, - final @NonNull CurrentConfigType currentConfig, final @NonNull FeatureFlagClientType ffClient, final @NonNull SegmentTrackingClient segmentClient) { final List clients = Arrays.asList(segmentClient); @@ -454,12 +407,6 @@ static AttributionEvents provideAttributionEvents( return new AttributionEvents(apolloClient); } - @Provides - @Singleton - static Scheduler provideScheduler() { - return Schedulers.computation(); - } - @Provides @Singleton static io.reactivex.Scheduler provideSchedulerV2() { @@ -486,14 +433,6 @@ static Build provideBuild(final @NonNull PackageInfo packageInfo) { return new Build(packageInfo); } - @Provides - @Singleton - static CurrentConfigType provideCurrentConfig(final @NonNull AssetManager assetManager, - final @NonNull Gson gson, - final @ConfigPreference @NonNull StringPreferenceType configPreference) { - return new CurrentConfig(assetManager, gson, configPreference); - } - @Provides @Singleton static CurrentConfigTypeV2 provideCurrentConfig2(final @NonNull AssetManager assetManager, @@ -514,14 +453,6 @@ static CookieManager provideCookieManager() { return new CookieManager(); } - @Provides - @Singleton - static CurrentUserType provideCurrentUser(final @AccessTokenPreference @NonNull StringPreferenceType accessTokenPreference, - final @NonNull DeviceRegistrarType deviceRegistrar, final @NonNull Gson gson, - final @NonNull @UserPreference StringPreferenceType userPreference) { - return new CurrentUser(accessTokenPreference, deviceRegistrar, gson, userPreference); - } - @Provides @Singleton static CurrentUserTypeV2 provideCurrentUser2(final @AccessTokenPreference @NonNull StringPreferenceType accessTokenPreference, @@ -593,8 +524,8 @@ static KSWebViewClient provideKSWebViewClient(final @NonNull OkHttpClient okHttp @Provides @Singleton - static Logout provideLogout(final @NonNull CookieManager cookieManager, final @NonNull CurrentUserType currentUser, final @NonNull CurrentUserTypeV2 currentUserV2) { - return new Logout(cookieManager, currentUser, currentUserV2); + static Logout provideLogout(final @NonNull CookieManager cookieManager, final @NonNull CurrentUserTypeV2 currentUser, final @NonNull CurrentUserTypeV2 currentUserV2) { + return new Logout(cookieManager, currentUserV2); } @Provides diff --git a/app/src/main/java/com/kickstarter/libs/ActivityLifecycleType.java b/app/src/main/java/com/kickstarter/libs/ActivityLifecycleType.java deleted file mode 100644 index e511206c13..0000000000 --- a/app/src/main/java/com/kickstarter/libs/ActivityLifecycleType.java +++ /dev/null @@ -1,17 +0,0 @@ -package com.kickstarter.libs; - -import com.trello.rxlifecycle.ActivityEvent; - -import rx.Observable; - -/** - * A type implements this interface when it can describe its lifecycle in terms of - * creation, starting, stopping and destroying. - */ -public interface ActivityLifecycleType { - - /** - * An observable that describes the lifecycle of the object, from CREATE to DESTROY. - */ - Observable lifecycle(); -} diff --git a/app/src/main/java/com/kickstarter/libs/BaseBottomSheetDialogFragment.java b/app/src/main/java/com/kickstarter/libs/BaseBottomSheetDialogFragment.java deleted file mode 100644 index 3139df9fb0..0000000000 --- a/app/src/main/java/com/kickstarter/libs/BaseBottomSheetDialogFragment.java +++ /dev/null @@ -1,231 +0,0 @@ -package com.kickstarter.libs; - -import android.content.Context; -import android.content.Intent; -import android.os.Bundle; -import android.view.LayoutInflater; -import android.view.View; -import android.view.ViewGroup; - -import androidx.annotation.CallSuper; -import androidx.annotation.NonNull; -import androidx.annotation.Nullable; - -import com.google.android.material.bottomsheet.BottomSheetDialogFragment; -import com.kickstarter.libs.qualifiers.RequiresFragmentViewModel; -import com.kickstarter.libs.utils.extensions.BundleExtKt; -import com.kickstarter.ui.data.ActivityResult; -import com.trello.rxlifecycle.FragmentEvent; -import com.trello.rxlifecycle.RxLifecycle; -import com.trello.rxlifecycle.components.FragmentLifecycleProvider; - -import rx.Observable; -import rx.subjects.BehaviorSubject; -import timber.log.Timber; - -public class BaseBottomSheetDialogFragment extends BottomSheetDialogFragment implements FragmentLifecycleProvider, FragmentLifecycleType { - private static final String VIEW_MODEL_KEY = "FragmentViewModel"; - private final BehaviorSubject lifecycle = BehaviorSubject.create(); - protected ViewModelType viewModel; - - /** - * Returns an observable of the fragment's lifecycle events. - */ - @Override - public final @NonNull Observable lifecycle() { - return this.lifecycle.asObservable(); - } - - /** - * Completes an observable when an {@link FragmentEvent} occurs in the fragment's lifecycle. - */ - @Override - public final @NonNull - Observable.Transformer bindUntilEvent(final @NonNull FragmentEvent event) { - return RxLifecycle.bindUntilFragmentEvent(this.lifecycle, event); - } - - /** - * Completes an observable when the lifecycle event opposing the current lifecyle event is emitted. - * For example, if a subscription is made during {@link FragmentEvent#CREATE}, the observable will be completed - * in {@link FragmentEvent#DESTROY}. - */ - @Override - public final @NonNull - Observable.Transformer bindToLifecycle() { - return RxLifecycle.bindFragment(this.lifecycle); - } - - /** - * Called before `onCreate`, when a fragment is attached to its context. - */ - @CallSuper - @Override - public void onAttach(final @NonNull Context context) { - super.onAttach(context); - Timber.d("onAttach %s", this.toString()); - this.lifecycle.onNext(FragmentEvent.ATTACH); - } - - @CallSuper - @Override - public void onCreate(final @Nullable Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - Timber.d("onCreate %s", this.toString()); - - this.lifecycle.onNext(FragmentEvent.CREATE); - - assignViewModel(savedInstanceState); - - this.viewModel.arguments(getArguments()); - } - - /** - * Called when a fragment instantiates its user interface view, between `onCreate` and `onActivityCreated`. - * Can return null for non-graphical fragments. - */ - @CallSuper - @Override - public @Nullable - View onCreateView(final @NonNull LayoutInflater inflater, final @Nullable ViewGroup container, - final @Nullable Bundle savedInstanceState) { - final View view = super.onCreateView(inflater, container, savedInstanceState); - Timber.d("onCreateView %s", this.toString()); - this.lifecycle.onNext(FragmentEvent.CREATE_VIEW); - return view; - } - - @CallSuper - @Override - public void onStart() { - super.onStart(); - Timber.d("onStart %s", this.toString()); - this.lifecycle.onNext(FragmentEvent.START); - } - - @CallSuper - @Override - public void onResume() { - super.onResume(); - Timber.d("onResume %s", this.toString()); - this.lifecycle.onNext(FragmentEvent.RESUME); - - assignViewModel(null); - if (this.viewModel != null) { - this.viewModel.onResume(this); - } - } - - @CallSuper - @Override - public void onPause() { - this.lifecycle.onNext(FragmentEvent.PAUSE); - super.onPause(); - Timber.d("onPause %s", this.toString()); - - if (this.viewModel != null) { - this.viewModel.onPause(); - } - } - - @CallSuper - @Override - public void onStop() { - this.lifecycle.onNext(FragmentEvent.STOP); - super.onStop(); - Timber.d("onStop %s", this.toString()); - } - - /** - * Called when the view created by `onCreateView` has been detached from the fragment. - * The lifecycle subject must be pinged before it is destroyed by the fragment. - */ - @CallSuper - @Override - public void onDestroyView() { - this.lifecycle.onNext(FragmentEvent.DESTROY_VIEW); - super.onDestroyView(); - } - - @CallSuper - @Override - public void onDestroy() { - this.lifecycle.onNext(FragmentEvent.DESTROY); - super.onDestroy(); - Timber.d("onDestroy %s", this.toString()); - - if (this.viewModel != null) { - this.viewModel.onDestroy(); - } - } - - /** - * Called after `onDestroy` when the fragment is no longer attached to its activity. - */ - @CallSuper - @Override - public void onDetach() { - Timber.d("onDetach %s", this.toString()); - super.onDetach(); - - if (getActivity().isFinishing()) { - if (this.viewModel != null) { - // Order of the next two lines is important: the lifecycle should update before we - // complete the view publish subject in the view model. - this.lifecycle.onNext(FragmentEvent.DETACH); - this.viewModel.onDetach(); - - FragmentViewModelManager.getInstance().destroy(this.viewModel); - this.viewModel = null; - } - } - } - - @CallSuper - @Override - public void onSaveInstanceState(final @NonNull Bundle outState) { - super.onSaveInstanceState(outState); - - final Bundle viewModelEnvelope = new Bundle(); - if (this.viewModel != null) { - FragmentViewModelManager.getInstance().save(this.viewModel, viewModelEnvelope); - } - - outState.putBundle(VIEW_MODEL_KEY, viewModelEnvelope); - } - - @CallSuper - @Override - public void onActivityResult(final int requestCode, final int resultCode, final @Nullable Intent data) { - super.onActivityResult(requestCode, resultCode, data); - Timber.d("onActivityResult %s", this.toString()); - this.viewModel.activityResult(ActivityResult.create(requestCode, resultCode, data)); - } - - /** - * setState will indicate if the fragment has suffer any animation changes on the parents container - * - In case no animation externally applied to the fragment call this method with `false` value - * - In case some animation externally applied to the Fragment as is the case for: - * `BackingFragment` and `RewardsFragment` call this method with `true` value when needed - * - * @param state = true in case the fragment is displayed on the screen with full width/height - * state = false in case the fragment is displayed on the screen but hidden or width/Height = 0 - */ - public void setState(final Boolean state) { - if (this.viewModel != null) { - this.viewModel.isExpanded(state); - } - } - - private void assignViewModel(final @Nullable Bundle viewModelEnvelope) { - if (this.viewModel == null) { - final RequiresFragmentViewModel annotation = getClass().getAnnotation(RequiresFragmentViewModel.class); - final Class viewModelClass = annotation == null ? null : (Class) annotation.value(); - if (viewModelClass != null) { - this.viewModel = FragmentViewModelManager.getInstance().fetch(getContext(), - viewModelClass, - BundleExtKt.maybeGetBundle(viewModelEnvelope, VIEW_MODEL_KEY)); - } - } - } -} diff --git a/app/src/main/java/com/kickstarter/libs/BaseFragment.java b/app/src/main/java/com/kickstarter/libs/BaseFragment.java deleted file mode 100644 index c7da5132a5..0000000000 --- a/app/src/main/java/com/kickstarter/libs/BaseFragment.java +++ /dev/null @@ -1,230 +0,0 @@ -package com.kickstarter.libs; - -import android.content.Context; -import android.content.Intent; -import android.os.Bundle; -import android.view.LayoutInflater; -import android.view.View; -import android.view.ViewGroup; - -import com.kickstarter.libs.qualifiers.RequiresFragmentViewModel; -import com.kickstarter.libs.utils.extensions.BundleExtKt; -import com.kickstarter.ui.data.ActivityResult; -import com.trello.rxlifecycle.FragmentEvent; -import com.trello.rxlifecycle.RxLifecycle; -import com.trello.rxlifecycle.components.FragmentLifecycleProvider; - -import androidx.annotation.CallSuper; -import androidx.annotation.NonNull; -import androidx.annotation.Nullable; -import androidx.fragment.app.Fragment; -import rx.Observable; -import rx.subjects.BehaviorSubject; -import timber.log.Timber; - -public class BaseFragment extends Fragment implements FragmentLifecycleProvider, - FragmentLifecycleType { - - private final BehaviorSubject lifecycle = BehaviorSubject.create(); - - private static final String VIEW_MODEL_KEY = "FragmentViewModel"; - protected ViewModelType viewModel; - - /** - * Returns an observable of the fragment's lifecycle events. - */ - @Override - public final @NonNull Observable lifecycle() { - return this.lifecycle.asObservable(); - } - - /** - * Completes an observable when an {@link FragmentEvent} occurs in the fragment's lifecycle. - */ - @Override - public final @NonNull Observable.Transformer bindUntilEvent(final @NonNull FragmentEvent event) { - return RxLifecycle.bindUntilFragmentEvent(this.lifecycle, event); - } - - /** - * Completes an observable when the lifecycle event opposing the current lifecyle event is emitted. - * For example, if a subscription is made during {@link FragmentEvent#CREATE}, the observable will be completed - * in {@link FragmentEvent#DESTROY}. - */ - @Override - public final @NonNull Observable.Transformer bindToLifecycle() { - return RxLifecycle.bindFragment(this.lifecycle); - } - - /** - * Called before `onCreate`, when a fragment is attached to its context. - */ - @CallSuper - @Override - public void onAttach(final @NonNull Context context) { - super.onAttach(context); - Timber.d("onAttach %s", this.toString()); - this.lifecycle.onNext(FragmentEvent.ATTACH); - } - - @CallSuper - @Override - public void onCreate(final @Nullable Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - Timber.d("onCreate %s", this.toString()); - - this.lifecycle.onNext(FragmentEvent.CREATE); - - assignViewModel(savedInstanceState); - - this.viewModel.arguments(getArguments()); - } - - /** - * Called when a fragment instantiates its user interface view, between `onCreate` and `onActivityCreated`. - * Can return null for non-graphical fragments. - */ - @CallSuper - @Override - public @Nullable View onCreateView(final @NonNull LayoutInflater inflater, final @Nullable ViewGroup container, - final @Nullable Bundle savedInstanceState) { - final View view = super.onCreateView(inflater, container, savedInstanceState); - Timber.d("onCreateView %s", this.toString()); - this.lifecycle.onNext(FragmentEvent.CREATE_VIEW); - return view; - } - - @CallSuper - @Override - public void onStart() { - super.onStart(); - Timber.d("onStart %s", this.toString()); - this.lifecycle.onNext(FragmentEvent.START); - } - - @CallSuper - @Override - public void onResume() { - super.onResume(); - Timber.d("onResume %s", this.toString()); - this.lifecycle.onNext(FragmentEvent.RESUME); - - assignViewModel(null); - if (this.viewModel != null) { - this.viewModel.onResume(this); - } - } - - @CallSuper - @Override - public void onPause() { - this.lifecycle.onNext(FragmentEvent.PAUSE); - super.onPause(); - Timber.d("onPause %s", this.toString()); - - if (this.viewModel != null) { - this.viewModel.onPause(); - } - } - - @CallSuper - @Override - public void onStop() { - this.lifecycle.onNext(FragmentEvent.STOP); - super.onStop(); - Timber.d("onStop %s", this.toString()); - } - - /** - * Called when the view created by `onCreateView` has been detached from the fragment. - * The lifecycle subject must be pinged before it is destroyed by the fragment. - */ - @CallSuper - @Override - public void onDestroyView() { - this.lifecycle.onNext(FragmentEvent.DESTROY_VIEW); - super.onDestroyView(); - } - - @CallSuper - @Override - public void onDestroy() { - this.lifecycle.onNext(FragmentEvent.DESTROY); - super.onDestroy(); - Timber.d("onDestroy %s", this.toString()); - - if (this.viewModel != null) { - this.viewModel.onDestroy(); - } - } - - /** - * Called after `onDestroy` when the fragment is no longer attached to its activity. - */ - @CallSuper - @Override - public void onDetach() { - Timber.d("onDetach %s", this.toString()); - super.onDetach(); - - if (getActivity().isFinishing()) { - if (this.viewModel != null) { - // Order of the next two lines is important: the lifecycle should update before we - // complete the view publish subject in the view model. - this.lifecycle.onNext(FragmentEvent.DETACH); - this.viewModel.onDetach(); - - FragmentViewModelManager.getInstance().destroy(this.viewModel); - this.viewModel = null; - } - } - } - - @CallSuper - @Override - public void onSaveInstanceState(final @NonNull Bundle outState) { - super.onSaveInstanceState(outState); - - final Bundle viewModelEnvelope = new Bundle(); - if (this.viewModel != null) { - FragmentViewModelManager.getInstance().save(this.viewModel, viewModelEnvelope); - } - - outState.putBundle(VIEW_MODEL_KEY, viewModelEnvelope); - } - - @CallSuper - @Override - public void onActivityResult(final int requestCode, final int resultCode, final @Nullable Intent data) { - super.onActivityResult(requestCode, resultCode, data); - Timber.d("onActivityResult %s", this.toString()); - this.viewModel.activityResult(ActivityResult.create(requestCode, resultCode, data)); - } - - /** - * setState will indicate if the fragment has suffer any animation changes on the parents container - * - In case no animation externally applied to the fragment call this method with `false` value - * - In case some animation externally applied to the Fragment as is the case for: - * `BackingFragment` and `RewardsFragment` call this method with `true` value when needed - * - * @param state = true in case the fragment is displayed on the screen with full width/height - * state = false in case the fragment is displayed on the screen but hidden or width/Height = 0 - */ - public void setState(final Boolean state) { - if (this.viewModel != null) { - this.viewModel.isExpanded(state); - } - } - - private void assignViewModel(final @Nullable Bundle viewModelEnvelope) { - if (this.viewModel == null) { - final RequiresFragmentViewModel annotation = getClass().getAnnotation(RequiresFragmentViewModel.class); - final Class viewModelClass = annotation == null ? null : (Class) annotation.value(); - if (viewModelClass != null) { - this.viewModel = FragmentViewModelManager.getInstance().fetch(getContext(), - viewModelClass, - BundleExtKt.maybeGetBundle(viewModelEnvelope, VIEW_MODEL_KEY)); - } - } - } -} diff --git a/app/src/main/java/com/kickstarter/libs/CurrentConfig.kt b/app/src/main/java/com/kickstarter/libs/CurrentConfig.kt deleted file mode 100644 index 689e314302..0000000000 --- a/app/src/main/java/com/kickstarter/libs/CurrentConfig.kt +++ /dev/null @@ -1,96 +0,0 @@ -package com.kickstarter.libs - -import android.content.res.AssetManager -import com.google.gson.Gson -import com.kickstarter.libs.preferences.StringPreferenceType -import com.kickstarter.libs.rx.transformers.Transformers -import com.kickstarter.libs.utils.extensions.addToDisposable -import com.kickstarter.libs.utils.extensions.isNotNull -import io.reactivex.Observable -import io.reactivex.android.schedulers.AndroidSchedulers -import io.reactivex.disposables.CompositeDisposable -import io.reactivex.subjects.BehaviorSubject -import timber.log.Timber -import java.io.IOException - -class CurrentConfig( - assetManager: AssetManager, - gson: Gson, - configPreference: StringPreferenceType -) : CurrentConfigType { - private val config = BehaviorSubject.create() - private val disposables = CompositeDisposable() - - init { - // Loads config from disk - - val diskConfig = Observable.just(ASSET_PATH) - .map { configJSONString(it, assetManager) } - .filter { gson.fromJson(it, Config::class.java).isNotNull() } - .map { gson.fromJson(it, Config::class.java) } - .map { it } - .compose(Transformers.neverErrorV2()) - .subscribeOn(AndroidSchedulers.mainThread()) - - // Loads config from string preference - val prefConfig = Observable.just(configPreference) - .filter { it.get().isNotNull() } - .map { it.get() } - .map { it } - .filter { gson.fromJson(it, Config::class.java).isNotNull() } - .map { gson.fromJson(it, Config::class.java) } - .map { it } - .compose(Transformers.neverErrorV2()) - .subscribeOn(AndroidSchedulers.mainThread()) - - // Seed config observable with what's cached - Observable.concat(prefConfig, diskConfig) - .take(1) - .subscribe { t: Config -> config.onNext(t) } - .addToDisposable(disposables) - - // Cache any new values to preferences - config.skip(1) - .filter { it.isNotNull() } - .map { it } - .subscribe { configPreference.set(gson.toJson(it, Config::class.java)) } - .addToDisposable(disposables) - } - - /** - * Get an observable representation of the current config. Emits immediately with the freshes copy of the config - * and then emits again for any fresher values. - */ - override fun observable(): Observable { - return this.config - } - - override fun config(config: Config) { - this.config.onNext(config) - } - - /** - * @param assetPath Path where `server-config.json` lives. - * @param assetManager Asset manager to use to load `server-config.json`. - * @return A string representation of the config JSON. - */ - private fun configJSONString(assetPath: String, assetManager: AssetManager): String { - try { - val input = assetManager.open(assetPath) - val buffer = ByteArray(input.available()) - input.read(buffer) - input.close() - - return String(buffer) - } catch (e: IOException) { - Timber.e(e) - // TODO: This should probably be fatal? - } - - return "{}" - } - - companion object { - private const val ASSET_PATH = "json/server-config.json" - } -} diff --git a/app/src/main/java/com/kickstarter/libs/CurrentConfigType.kt b/app/src/main/java/com/kickstarter/libs/CurrentConfigType.kt deleted file mode 100644 index ad23aabf44..0000000000 --- a/app/src/main/java/com/kickstarter/libs/CurrentConfigType.kt +++ /dev/null @@ -1,15 +0,0 @@ -package com.kickstarter.libs - -import io.reactivex.Observable - -interface CurrentConfigType { - /** - * Returns the config as an observable. - */ - fun observable(): Observable - - /** - * Set a new config. - */ - fun config(config: Config) -} diff --git a/app/src/main/java/com/kickstarter/libs/CurrentUser.java b/app/src/main/java/com/kickstarter/libs/CurrentUser.java deleted file mode 100644 index caec0f50d5..0000000000 --- a/app/src/main/java/com/kickstarter/libs/CurrentUser.java +++ /dev/null @@ -1,87 +0,0 @@ -package com.kickstarter.libs; - -import com.google.gson.Gson; -import com.kickstarter.libs.preferences.StringPreferenceType; -import com.kickstarter.libs.utils.extensions.AnyExtKt; -import com.kickstarter.models.User; - -import androidx.annotation.NonNull; -import androidx.annotation.Nullable; -import rx.Observable; -import rx.subjects.BehaviorSubject; -import timber.log.Timber; - -public class CurrentUser extends CurrentUserType { - private final StringPreferenceType accessTokenPreference; - private final DeviceRegistrarType deviceRegistrar; - private final StringPreferenceType userPreference; - - private final BehaviorSubject user = BehaviorSubject.create(); - - public CurrentUser(final @NonNull StringPreferenceType accessTokenPreference, - final @NonNull DeviceRegistrarType deviceRegistrar, - final @NonNull Gson gson, - final @NonNull StringPreferenceType userPreference) { - this.accessTokenPreference = accessTokenPreference; - this.deviceRegistrar = deviceRegistrar; - this.userPreference = userPreference; - - this.user - .skip(1) - .filter(AnyExtKt::isNotNull) - .subscribe(u -> userPreference.set(gson.toJson(u, User.class))); - - this.user.onNext(gson.fromJson(userPreference.get(), User.class)); - } - - @Override - public @Nullable User getUser() { - return this.user.getValue(); - } - - @Override - public boolean exists() { - return getUser() != null; - } - - public String getAccessToken() { - return this.accessTokenPreference.get(); - } - - @Override - public void login(final @NonNull User newUser) { - Timber.d("Login user %s", newUser.name()); - this.user.onNext(newUser); - } - - @Override - public void setToken(final @NonNull String accessToken) { - // - Clean previous token in case there is any - this.accessTokenPreference.delete(); - this.deviceRegistrar.unregisterDevice(); - - // - Register new token - this.accessTokenPreference.set(accessToken); - this.deviceRegistrar.registerDevice(); - } - - @Override - public void logout() { - Timber.d("Logout current user"); - - this.userPreference.delete(); - this.accessTokenPreference.delete(); - this.user.onNext(null); - this.deviceRegistrar.unregisterDevice(); - } - - @Override - public void refresh(final @NonNull User freshUser) { - this.user.onNext(freshUser); - } - - @Override - public @NonNull Observable observable() { - return this.user; - } -} diff --git a/app/src/main/java/com/kickstarter/libs/CurrentUserType.java b/app/src/main/java/com/kickstarter/libs/CurrentUserType.java deleted file mode 100644 index deb40dbcdd..0000000000 --- a/app/src/main/java/com/kickstarter/libs/CurrentUserType.java +++ /dev/null @@ -1,85 +0,0 @@ -package com.kickstarter.libs; - -import com.kickstarter.libs.utils.extensions.AnyExtKt; -import com.kickstarter.models.User; - -import androidx.annotation.NonNull; -import androidx.annotation.Nullable; -import rx.Observable; - -public abstract class CurrentUserType { - - /*** - * Persist a new token, - * - retrieved form #exchange endpoint {/v1/oauth/authorizations/exchange} - * - retrieved from Facebook login - * - retrieved from endpoint {/xauth/access_token} soon to be deprecated - */ - public abstract void setToken(final @NonNull String accessToken); - - /** - * Call when a user has logged in. The implementation of `CurrentUserType` is responsible - * for persisting the user. - */ - public abstract void login(final @NonNull User newUser); - - /** - * Call when a user should be logged out. - */ - public abstract void logout(); - - /** - * Get the logged in user's access token. - */ - public abstract @Nullable String getAccessToken(); - - /** - * Updates the persisted current user with a fresh, new user. - */ - public abstract void refresh(final @NonNull User freshUser); - - /** - * Returns an observable representing the current user. It emits immediately - * with the current user, and then again each time the user is updated. - */ - public abstract @NonNull Observable observable(); - - /** - * Returns the most recently emitted user from the user observable. - * @deprecated Prefer {@link #observable()} - */ - @Deprecated - public abstract @Nullable User getUser(); - - /** - * Returns a boolean that determines if there is a currently logged in user or not. - * @deprecated Prefer {@link #observable()} - */ - @Deprecated - public boolean exists() { - return getUser() != null; - } - - /** - * Emits a boolean that determines if the user is logged in or not. The returned - * observable will emit immediately with the logged in state, and then again - * each time the current user is updated. - */ - public @NonNull Observable isLoggedIn() { - return observable().map(AnyExtKt::isNotNull); - } - - /** - * Emits only values of a logged in user. The returned observable may never emit. - */ - public @NonNull Observable loggedInUser() { - return observable().filter(AnyExtKt::isNotNull); - } - - /** - * Emits only values of a logged out user. The returned observable may never emit. - */ - public @NonNull Observable loggedOutUser() { - return observable().filter(AnyExtKt::isNull); - } -} diff --git a/app/src/main/java/com/kickstarter/libs/CurrentUserV2.kt b/app/src/main/java/com/kickstarter/libs/CurrentUserV2.kt index 244cd7e57a..b6022b2992 100644 --- a/app/src/main/java/com/kickstarter/libs/CurrentUserV2.kt +++ b/app/src/main/java/com/kickstarter/libs/CurrentUserV2.kt @@ -83,22 +83,17 @@ class CurrentUserV2( private val gson: Gson, private val userPreference: StringPreferenceType ) : CurrentUserTypeV2() { - val user = BehaviorSubject.create>() + private val user = BehaviorSubject.create>() + init { - user - .filter { it.isPresent() } - .map { it.getValue() } - .skip(1) - .filter { `object`: User? -> `object`.isNotNull() } - .subscribe { u: User? -> - userPreference.set(gson.toJson(u, User::class.java)) - }.dispose() - - if (gson.fromJson(userPreference.get(), User::class.java) != null) { - user.onNext(KsOptional.of(gson.fromJson(userPreference.get(), User::class.java))) + val persistedUser = gson.fromJson(userPreference.get(), User::class.java) + if (persistedUser != null) { + user.onNext(KsOptional.of(persistedUser)) } else { user.onNext(KsOptional.empty()) } + + Timber.d("${this.javaClass} init persisted User: $persistedUser") } override fun getUser(): User? { @@ -113,8 +108,10 @@ class CurrentUserV2( get() = accessTokenPreference.get() override fun login(newUser: User) { - Timber.d("Login user %s", newUser.name()) user.onNext(KsOptional.of(newUser)) + userPreference.set(gson.toJson(newUser, User::class.java)) + + Timber.d("${this.javaClass} Login user %s", newUser.name()) } override fun setToken(accessToken: String) { @@ -125,19 +122,22 @@ class CurrentUserV2( // - Register new token accessTokenPreference.set(accessToken) deviceRegistrar.registerDevice() + + Timber.d("${this.javaClass} setToken: $accessToken") } override fun logout() { - Timber.d("Logout current user") - userPreference.delete() accessTokenPreference.delete() user.onNext(KsOptional.empty()) + userPreference.delete() deviceRegistrar.unregisterDevice() + Timber.d("${this.javaClass} Logout current user") } override fun refresh(freshUser: User) { user.onNext(KsOptional.of(freshUser)) userPreference.set(gson.toJson(freshUser, User::class.java)) + Timber.d("${this.javaClass} Refresh current user") } override fun observable(): Observable> { diff --git a/app/src/main/java/com/kickstarter/libs/Environment.kt b/app/src/main/java/com/kickstarter/libs/Environment.kt index e23aab989f..36b5be2753 100644 --- a/app/src/main/java/com/kickstarter/libs/Environment.kt +++ b/app/src/main/java/com/kickstarter/libs/Environment.kt @@ -6,25 +6,18 @@ import com.kickstarter.libs.featureflag.FeatureFlagClientType import com.kickstarter.libs.preferences.BooleanPreferenceType import com.kickstarter.libs.preferences.IntPreferenceType import com.kickstarter.libs.utils.PlayServicesCapability -import com.kickstarter.services.ApiClientType import com.kickstarter.services.ApiClientTypeV2 -import com.kickstarter.services.ApolloClientType import com.kickstarter.services.ApolloClientTypeV2 import com.stripe.android.Stripe -import rx.Scheduler import java.net.CookieManager class Environment private constructor( private val activitySamplePreference: IntPreferenceType?, - private val apiClient: ApiClientType?, private val apiClientV2: ApiClientTypeV2?, - private val apolloClient: ApolloClientType?, private val apolloClientV2: ApolloClientTypeV2?, private val build: Build?, private val cookieManager: CookieManager?, - private val currentConfig: CurrentConfigType?, private val currentConfigV2: CurrentConfigTypeV2?, - private val currentUser: CurrentUserType?, private val currentUserV2: CurrentUserTypeV2?, private val firstSessionPreference: BooleanPreferenceType?, private val gson: Gson?, @@ -37,7 +30,6 @@ class Environment private constructor( private val attributionEvents: AttributionEvents?, private val logout: Logout?, private val playServicesCapability: PlayServicesCapability?, - private val scheduler: Scheduler?, private val schedulerV2: io.reactivex.Scheduler?, private val sharedPreferences: SharedPreferences?, private val stripe: Stripe?, @@ -46,15 +38,11 @@ class Environment private constructor( private val featureFlagClient: FeatureFlagClientType? ) { fun activitySamplePreference() = this.activitySamplePreference - fun apiClient() = this.apiClient fun apiClientV2() = this.apiClientV2 - fun apolloClient() = this.apolloClient fun apolloClientV2() = this.apolloClientV2 fun build() = this.build fun cookieManager() = this.cookieManager - fun currentConfig() = this.currentConfig fun currentConfigV2() = this.currentConfigV2 - fun currentUser() = this.currentUser fun currentUserV2() = this.currentUserV2 fun firstSessionPreference() = this.firstSessionPreference fun gson() = this.gson @@ -67,7 +55,6 @@ class Environment private constructor( fun attributionEvents() = this.attributionEvents fun logout() = this.logout fun playServicesCapability() = this.playServicesCapability - fun scheduler() = this.scheduler fun schedulerV2() = this.schedulerV2 fun sharedPreferences() = this.sharedPreferences fun stripe() = this.stripe @@ -77,15 +64,11 @@ class Environment private constructor( data class Builder( private var activitySamplePreference: IntPreferenceType? = null, - private var apiClient: ApiClientType? = null, private var apiClientV2: ApiClientTypeV2? = null, - private var apolloClient: ApolloClientType? = null, private var apolloClientV2: ApolloClientTypeV2? = null, private var build: Build? = null, private var cookieManager: CookieManager? = null, - private var currentConfig: CurrentConfigType? = null, private var currentConfigV2: CurrentConfigTypeV2? = null, - private var currentUser: CurrentUserType? = null, private var currentUserV2: CurrentUserTypeV2? = null, private var firstSessionPreference: BooleanPreferenceType? = null, private var gson: Gson? = null, @@ -98,7 +81,6 @@ class Environment private constructor( private var attributionEvents: AttributionEvents? = null, private var logout: Logout? = null, private var playServicesCapability: PlayServicesCapability? = null, - private var scheduler: Scheduler? = null, private var schedulerV2: io.reactivex.Scheduler? = null, private var sharedPreferences: SharedPreferences? = null, private var stripe: Stripe? = null, @@ -107,15 +89,11 @@ class Environment private constructor( private var featureFlagClient: FeatureFlagClientType? = null ) { fun activitySamplePreference(activitySamplePreference: IntPreferenceType) = apply { this.activitySamplePreference = activitySamplePreference } - fun apiClient(apiClient: ApiClientType) = apply { this.apiClient = apiClient } fun apiClientV2(apiClientV2: ApiClientTypeV2) = apply { this.apiClientV2 = apiClientV2 } - fun apolloClient(apolloClient: ApolloClientType) = apply { this.apolloClient = apolloClient } fun apolloClientV2(apolloClientV2: ApolloClientTypeV2) = apply { this.apolloClientV2 = apolloClientV2 } fun build(build: Build) = apply { this.build = build } fun cookieManager(cookieManager: CookieManager) = apply { this.cookieManager = cookieManager } - fun currentConfig(currentConfig: CurrentConfigType) = apply { this.currentConfig = currentConfig } fun currentConfig2(currentConfig2: CurrentConfigTypeV2) = apply { this.currentConfigV2 = currentConfig2 } - fun currentUser(currentUser: CurrentUserType) = apply { this.currentUser = currentUser } fun currentUserV2(currentUserV2: CurrentUserTypeV2) = apply { this.currentUserV2 = currentUserV2 } fun firstSessionPreference(firstSessionPreference: BooleanPreferenceType) = apply { this.firstSessionPreference = firstSessionPreference } fun gson(gson: Gson) = apply { this.gson = gson } @@ -128,7 +106,6 @@ class Environment private constructor( fun attributionEvents(attributionEvents: AttributionEvents) = apply { this.attributionEvents = attributionEvents } fun logout(logout: Logout) = apply { this.logout = logout } fun playServicesCapability(playServicesCapability: PlayServicesCapability) = apply { this.playServicesCapability = playServicesCapability } - fun scheduler(scheduler: Scheduler) = apply { this.scheduler = scheduler } fun schedulerV2(schedulerV2: io.reactivex.Scheduler) = apply { this.schedulerV2 = schedulerV2 } fun sharedPreferences(sharedPreferences: SharedPreferences) = apply { this.sharedPreferences = sharedPreferences } fun stripe(stripe: Stripe) = apply { this.stripe = stripe } @@ -139,15 +116,11 @@ class Environment private constructor( fun build() = Environment( activitySamplePreference = activitySamplePreference, - apiClient = apiClient, apiClientV2 = apiClientV2, - apolloClient = apolloClient, apolloClientV2 = apolloClientV2, build = build, cookieManager = cookieManager, - currentConfig = currentConfig, currentConfigV2 = currentConfigV2, - currentUser = currentUser, currentUserV2 = currentUserV2, firstSessionPreference = firstSessionPreference, gson = gson, @@ -160,7 +133,6 @@ class Environment private constructor( attributionEvents = attributionEvents, logout = logout, playServicesCapability = playServicesCapability, - scheduler = scheduler, schedulerV2 = schedulerV2, sharedPreferences = sharedPreferences, stripe = stripe, @@ -172,15 +144,11 @@ class Environment private constructor( fun toBuilder() = Builder( activitySamplePreference = activitySamplePreference, - apiClient = apiClient, apiClientV2 = apiClientV2, - apolloClient = apolloClient, apolloClientV2 = apolloClientV2, build = build, cookieManager = cookieManager, - currentConfig = currentConfig, currentConfigV2 = currentConfigV2, - currentUser = currentUser, currentUserV2 = currentUserV2, firstSessionPreference = firstSessionPreference, gson = gson, @@ -193,7 +161,6 @@ class Environment private constructor( attributionEvents = attributionEvents, logout = logout, playServicesCapability = playServicesCapability, - scheduler = scheduler, schedulerV2 = schedulerV2, sharedPreferences = sharedPreferences, stripe = stripe, diff --git a/app/src/main/java/com/kickstarter/libs/FragmentLifecycleType.java b/app/src/main/java/com/kickstarter/libs/FragmentLifecycleType.java deleted file mode 100644 index c373cd066d..0000000000 --- a/app/src/main/java/com/kickstarter/libs/FragmentLifecycleType.java +++ /dev/null @@ -1,17 +0,0 @@ -package com.kickstarter.libs; - -import com.trello.rxlifecycle.FragmentEvent; - -import rx.Observable; - -/** - * A type implements this interface when it can describe its lifecycle in terms of attaching, view creation, starting, - * stopping, destroying, and detaching. - */ -public interface FragmentLifecycleType { - - /** - * An observable that describes the lifecycle of the object, from ATTACH to DETACH. - */ - Observable lifecycle(); -} diff --git a/app/src/main/java/com/kickstarter/libs/FragmentViewModel.java b/app/src/main/java/com/kickstarter/libs/FragmentViewModel.java deleted file mode 100644 index 08ccf46af2..0000000000 --- a/app/src/main/java/com/kickstarter/libs/FragmentViewModel.java +++ /dev/null @@ -1,119 +0,0 @@ -package com.kickstarter.libs; - -import android.content.Context; -import android.os.Bundle; - -import com.kickstarter.libs.utils.extensions.AnyExtKt; -import com.kickstarter.ui.data.ActivityResult; -import com.trello.rxlifecycle.FragmentEvent; - -import androidx.annotation.CallSuper; -import androidx.annotation.NonNull; -import androidx.annotation.Nullable; -import rx.Observable; -import rx.subjects.PublishSubject; -import timber.log.Timber; - -/** - * A view model bound to the lifecycle and arguments of a Fragment, from ATTACH to DETACH. - */ -public class FragmentViewModel { - - private final PublishSubject viewChange = PublishSubject.create(); - private final Observable view = this.viewChange.filter(AnyExtKt::isNotNull); - - private final PublishSubject activityResult = PublishSubject.create(); - private final PublishSubject arguments = PublishSubject.create(); - protected final PublishSubject isExpanded = PublishSubject.create(); - protected final AnalyticEvents analyticEvents; - protected final PublishSubject optimizelyReady = PublishSubject.create(); - - public FragmentViewModel(final @NonNull Environment environment) { - this.analyticEvents = environment.analytics(); - } - - @CallSuper - protected void onCreate(final @NonNull Context context, final @Nullable Bundle savedInstanceState) { - Timber.d("onCreate %s", this.toString()); - dropView(); - } - - /** - * Takes activity result data from the activity. - */ - public void activityResult(final @NonNull ActivityResult activityResult) { - this.activityResult.onNext(activityResult); - } - - /** - * Takes bundle arguments from the view. - */ - public void arguments(final @Nullable Bundle bundle) { - this.arguments.onNext(bundle); - } - - - protected @NonNull Observable arguments() { - return this.arguments; - } - - @CallSuper - protected void onResume(final @NonNull ViewType view) { - Timber.d("onResume %s", this.toString()); - onTakeView(view); - } - - @CallSuper - protected void onPause() { - Timber.d("onPause %s", this.toString()); - dropView(); - } - - @CallSuper - protected void onDestroy() { - Timber.d("onDestroy %s", this.toString()); - dropView(); - } - - @CallSuper - protected void onDetach() { - Timber.d("onDetach %s", this.toString()); - this.viewChange.onCompleted(); - } - - private void onTakeView(final @NonNull ViewType view) { - Timber.d("onTakeView %s %s", this.toString(), view.toString()); - this.viewChange.onNext(view); - } - - private void dropView() { - Timber.d("dropView %s", this.toString()); - this.viewChange.onNext(null); - } - - protected final @NonNull Observable activityResult() { - return this.activityResult; - } - - protected final @NonNull Observable view() { - return this.view; - } - - /** - * By composing this transformer with an observable you guarantee that every observable in your view model - * will be properly completed when the view model completes. - * - * It is required that *every* observable in a view model do `.compose(bindToLifecycle())` before calling - * `subscribe`. - */ - public @NonNull Observable.Transformer bindToLifecycle() { - return source -> source.takeUntil( - this.view.switchMap(FragmentLifecycleType::lifecycle) - .filter(FragmentEvent.DETACH::equals) - ); - } - - public void isExpanded(final boolean state) { - this.isExpanded.onNext(state); - } -} diff --git a/app/src/main/java/com/kickstarter/libs/FragmentViewModelManager.java b/app/src/main/java/com/kickstarter/libs/FragmentViewModelManager.java deleted file mode 100644 index 9f486ece0c..0000000000 --- a/app/src/main/java/com/kickstarter/libs/FragmentViewModelManager.java +++ /dev/null @@ -1,105 +0,0 @@ -package com.kickstarter.libs; - -import android.content.Context; -import android.os.Bundle; - -import com.kickstarter.KSApplication; -import com.kickstarter.libs.utils.extensions.BundleExtKt; - -import java.lang.reflect.Constructor; -import java.lang.reflect.InvocationTargetException; -import java.util.HashMap; -import java.util.Iterator; -import java.util.Map; -import java.util.UUID; - -import androidx.annotation.NonNull; -import androidx.annotation.Nullable; - -public final class FragmentViewModelManager { - private static final String VIEW_MODEL_ID_KEY = "fragment_view_model_id"; - private static final String VIEW_MODEL_STATE_KEY = "fragment_view_model_state"; - - private static final FragmentViewModelManager instance = new FragmentViewModelManager(); - private final Map viewModels = new HashMap<>(); - - public static @NonNull FragmentViewModelManager getInstance() { - return instance; - } - - @SuppressWarnings("unchecked") - public T fetch(final @NonNull Context context, final @NonNull Class viewModelClass, - final @Nullable Bundle savedInstanceState) { - final String id = fetchId(savedInstanceState); - FragmentViewModel viewModel = this.viewModels.get(id); - - if (viewModel == null) { - viewModel = create(context, viewModelClass, savedInstanceState, id); - } - - return (T) viewModel; - } - - public void destroy(final @NonNull FragmentViewModel viewModel) { - viewModel.onDestroy(); - - final Iterator> iterator = this.viewModels.entrySet().iterator(); - while (iterator.hasNext()) { - final Map.Entry entry = iterator.next(); - if (viewModel.equals(entry.getValue())) { - iterator.remove(); - } - } - } - - public void save(final @NonNull FragmentViewModel viewModel, final @NonNull Bundle envelope) { - envelope.putString(VIEW_MODEL_ID_KEY, findIdForViewModel(viewModel)); - - final Bundle state = new Bundle(); - envelope.putBundle(VIEW_MODEL_STATE_KEY, state); - } - - private FragmentViewModel create(final @NonNull Context context, final @NonNull Class viewModelClass, - final @Nullable Bundle savedInstanceState, final @NonNull String id) { - - final KSApplication application = (KSApplication) context.getApplicationContext(); - final Environment environment = application.component().environment(); - final FragmentViewModel viewModel; - - try { - final Constructor constructor = viewModelClass.getConstructor(Environment.class); - viewModel = (FragmentViewModel) constructor.newInstance(environment); - // Need to catch these exceptions separately, otherwise the compiler turns them into `ReflectiveOperationException`. - // That exception is only available in API19+ - } catch (IllegalAccessException exception) { - throw new RuntimeException(exception); - } catch (InvocationTargetException exception) { - throw new RuntimeException(exception); - } catch (InstantiationException exception) { - throw new RuntimeException(exception); - } catch (NoSuchMethodException exception) { - throw new RuntimeException(exception); - } - - this.viewModels.put(id, viewModel); - viewModel.onCreate(context, BundleExtKt.maybeGetBundle(savedInstanceState, VIEW_MODEL_STATE_KEY)); - - return viewModel; - } - - private String fetchId(final @Nullable Bundle savedInstanceState) { - return savedInstanceState != null ? - savedInstanceState.getString(VIEW_MODEL_ID_KEY) : - UUID.randomUUID().toString(); - } - - private String findIdForViewModel(final @NonNull FragmentViewModel viewModel) { - for (final Map.Entry entry : this.viewModels.entrySet()) { - if (viewModel.equals(entry.getValue())) { - return entry.getKey(); - } - } - - throw new RuntimeException("Cannot find view model in map!"); - } -} diff --git a/app/src/main/java/com/kickstarter/libs/Logout.java b/app/src/main/java/com/kickstarter/libs/Logout.java deleted file mode 100644 index 8dcb4a240b..0000000000 --- a/app/src/main/java/com/kickstarter/libs/Logout.java +++ /dev/null @@ -1,25 +0,0 @@ -package com.kickstarter.libs; - -import com.facebook.login.LoginManager; - -import java.net.CookieManager; - -import androidx.annotation.NonNull; - -public final class Logout { - private final CookieManager cookieManager; - private final CurrentUserType currentUser; - private final CurrentUserTypeV2 currentUserV2; - public Logout(final @NonNull CookieManager cookieManager, final @NonNull CurrentUserType currentUser, final @NonNull CurrentUserTypeV2 currentUserV2) { - this.cookieManager = cookieManager; - this.currentUser = currentUser; - this.currentUserV2 = currentUserV2; - } - - public void execute() { - this.currentUser.logout(); - this.currentUserV2.logout(); - this.cookieManager.getCookieStore().removeAll(); - LoginManager.getInstance().logOut(); - } -} diff --git a/app/src/main/java/com/kickstarter/libs/Logout.kt b/app/src/main/java/com/kickstarter/libs/Logout.kt new file mode 100644 index 0000000000..27b8e08275 --- /dev/null +++ b/app/src/main/java/com/kickstarter/libs/Logout.kt @@ -0,0 +1,15 @@ +package com.kickstarter.libs + +import com.facebook.login.LoginManager +import java.net.CookieManager + +class Logout( + private val cookieManager: CookieManager, + private val currentUserV2: CurrentUserTypeV2 +) { + fun execute() { + currentUserV2.logout() + cookieManager.cookieStore.removeAll() + LoginManager.getInstance().logOut() + } +} diff --git a/app/src/main/java/com/kickstarter/libs/RecyclerViewPaginator.java b/app/src/main/java/com/kickstarter/libs/RecyclerViewPaginator.java deleted file mode 100644 index 7237e5f02b..0000000000 --- a/app/src/main/java/com/kickstarter/libs/RecyclerViewPaginator.java +++ /dev/null @@ -1,112 +0,0 @@ -package com.kickstarter.libs; - -import android.util.Pair; - -import com.jakewharton.rxbinding.support.v7.widget.RxRecyclerView; -import com.kickstarter.libs.utils.extensions.BoolenExtKt; -import com.kickstarter.libs.utils.Secrets; - -import androidx.annotation.NonNull; -import androidx.recyclerview.widget.LinearLayoutManager; -import androidx.recyclerview.widget.RecyclerView; -import rx.Observable; -import rx.Subscription; -import rx.functions.Action0; -import rx.subjects.PublishSubject; - -import static com.kickstarter.libs.rx.transformers.Transformers.combineLatestPair; - -public final class RecyclerViewPaginator { - private final @NonNull RecyclerView recyclerView; - private final @NonNull Boolean isScrollEnabled; - private final @NonNull Action0 nextPage; - private final Observable isLoading; - private Subscription subscription; - private Subscription retrySubscription; - private final PublishSubject retryLoadingNextPageSubject = PublishSubject.create(); - - public RecyclerViewPaginator(final @NonNull RecyclerView recyclerView, final @NonNull Action0 nextPage, final @NonNull Observable isLoading) { - this.recyclerView = recyclerView; - this.nextPage = nextPage; - this.isLoading = isLoading; - this.isScrollEnabled =true; - start(); - } - - public RecyclerViewPaginator(final @NonNull RecyclerView recyclerView, final @NonNull Action0 nextPage, final @NonNull Observable isLoading, final @NonNull Boolean isScrollEnabled) { - this.recyclerView = recyclerView; - this.nextPage = nextPage; - this.isLoading = isLoading; - this.isScrollEnabled =isScrollEnabled; - start(); - } - - /** - * Begin listening to the recycler view scroll events to determine - * when pagination should happen. - */ - public void start() { - stop(); - - final Observable> lastVisibleAndCount = RxRecyclerView.scrollEvents(this.recyclerView) - .filter(__ -> BoolenExtKt.isFalse(Secrets.IS_OSS)) - .map(__ -> this.recyclerView.getLayoutManager()) - .ofType(LinearLayoutManager.class) - .map(this::displayedItemFromLinearLayout) - .filter(item -> item.second != 0) - .distinctUntilChanged(); - - final Observable isNotLoading = this.isLoading - .distinctUntilChanged() - .filter(loading -> !loading); - - final Observable> loadNextPage = lastVisibleAndCount - .compose(combineLatestPair(isNotLoading)) - .distinctUntilChanged() - .map(p -> p.first) - .filter(this::visibleItemIsCloseToBottom); - - this.subscription = loadNextPage - .subscribe(__ ->{ - if(this.isScrollEnabled) { - this.nextPage.call(); - } - }); - - this.retrySubscription = this.retryLoadingNextPageSubject - .subscribe(__ -> - this.nextPage.call() - ); - } - - public void reload() { - this.retryLoadingNextPageSubject.onNext(null); - } - - /** - * Stop listening to recycler view scroll events and discard the - * associated resources. This should be done when the object that - * created `this` is released. - */ - public void stop() { - if (this.subscription != null) { - this.subscription.unsubscribe(); - this.subscription = null; - } - if (this.retrySubscription != null) { - this.retrySubscription.unsubscribe(); - this.retrySubscription = null; - } - } - - /** - * Returns a (visibleItem, totalItemCount) pair given a linear layout manager. - */ - private @NonNull Pair displayedItemFromLinearLayout(final @NonNull LinearLayoutManager manager) { - return new Pair<>(manager.findLastVisibleItemPosition(), manager.getItemCount()); - } - - private boolean visibleItemIsCloseToBottom(final @NonNull Pair visibleItemOfTotal) { - return visibleItemOfTotal.first == visibleItemOfTotal.second - 1; - } -} diff --git a/app/src/main/java/com/kickstarter/libs/qualifiers/RequiresFragmentViewModel.java b/app/src/main/java/com/kickstarter/libs/qualifiers/RequiresFragmentViewModel.java deleted file mode 100644 index b9e7a1fdf7..0000000000 --- a/app/src/main/java/com/kickstarter/libs/qualifiers/RequiresFragmentViewModel.java +++ /dev/null @@ -1,13 +0,0 @@ -package com.kickstarter.libs.qualifiers; - -import com.kickstarter.libs.FragmentViewModel; - -import java.lang.annotation.Inherited; -import java.lang.annotation.Retention; -import java.lang.annotation.RetentionPolicy; - -@Inherited -@Retention(RetentionPolicy.RUNTIME) -public @interface RequiresFragmentViewModel { - Class value(); -} diff --git a/app/src/main/java/com/kickstarter/libs/rx/operators/ApiErrorOperator.kt b/app/src/main/java/com/kickstarter/libs/rx/operators/ApiErrorOperator.kt deleted file mode 100644 index bac2d5d405..0000000000 --- a/app/src/main/java/com/kickstarter/libs/rx/operators/ApiErrorOperator.kt +++ /dev/null @@ -1,60 +0,0 @@ -package com.kickstarter.libs.rx.operators - -import com.google.gson.Gson -import com.kickstarter.services.ApiException -import com.kickstarter.services.ResponseException -import com.kickstarter.services.apiresponses.ErrorEnvelope -import retrofit2.Response -import rx.Observable -import rx.Subscriber -import kotlin.Exception - -/** - * Takes a [retrofit2.Response], if it's successful send it to [Subscriber.onNext], otherwise - * attempt to parse the error. - * - * Errors that conform to the API's error format are converted into an [ApiException] exception and sent to - * [Subscriber.onError], otherwise a more generic [ResponseException] is sent to [Subscriber.onError]. - * - * @param The response type. - */ -class ApiErrorOperator(private val gson: Gson?) : Observable.Operator> { - override fun call(subscriber: Subscriber): Subscriber> { - val gson = gson - return object : Subscriber?>() { - override fun onCompleted() { - if (!subscriber.isUnsubscribed) { - subscriber.onCompleted() - } - } - - override fun onError(e: Throwable) { - if (!subscriber.isUnsubscribed) { - subscriber.onError(e) - } - } - - override fun onNext(response: Response?) { - if (subscriber.isUnsubscribed) { - return - } - - response?.let { - if (response != null && !response.isSuccessful) { - val envelope: ErrorEnvelope? = try { - gson?.fromJson(response.errorBody()?.string(), ErrorEnvelope::class.java) - } catch (e: Exception) { - null - } - envelope?.let { - subscriber.onError(ApiException(envelope, response)) - } ?: subscriber.onError(ResponseException(response)) - } else { - subscriber.onNext(response.body()) - subscriber.onCompleted() - } - } ?: subscriber.onError(Exception()) - } - } - } -} diff --git a/app/src/main/java/com/kickstarter/libs/rx/operators/Operators.java b/app/src/main/java/com/kickstarter/libs/rx/operators/Operators.java deleted file mode 100644 index ae031bbb03..0000000000 --- a/app/src/main/java/com/kickstarter/libs/rx/operators/Operators.java +++ /dev/null @@ -1,20 +0,0 @@ -package com.kickstarter.libs.rx.operators; - -import com.google.gson.Gson; -import com.kickstarter.services.ApiException; -import com.kickstarter.services.ResponseException; - -import androidx.annotation.NonNull; -import rx.Subscriber; - -public final class Operators { - private Operators() {} - - /** - * When a response errors, send an {@link ApiException} or {@link ResponseException} to - * {@link Subscriber#onError}, otherwise send the response to {@link Subscriber#onNext}. - */ - public static @NonNull ApiErrorOperator apiError(final @NonNull Gson gson) { - return new ApiErrorOperator<>(gson); - } -} diff --git a/app/src/main/java/com/kickstarter/libs/rx/transformers/CoalesceTransformer.java b/app/src/main/java/com/kickstarter/libs/rx/transformers/CoalesceTransformer.java deleted file mode 100644 index 1e7a8c7235..0000000000 --- a/app/src/main/java/com/kickstarter/libs/rx/transformers/CoalesceTransformer.java +++ /dev/null @@ -1,21 +0,0 @@ -package com.kickstarter.libs.rx.transformers; - -import androidx.annotation.NonNull; - -import com.kickstarter.libs.utils.extensions.AnyExtKt; - -import rx.Observable; - -public final class CoalesceTransformer implements Observable.Transformer { - private final T theDefault; - - public CoalesceTransformer(final @NonNull T theDefault) { - this.theDefault = theDefault; - } - - @Override - public @NonNull Observable call(final @NonNull Observable source) { - return source - .map(AnyExtKt.coalesceWith(this.theDefault)); - } -} diff --git a/app/src/main/java/com/kickstarter/libs/rx/transformers/CombineLatestPairTransformer.java b/app/src/main/java/com/kickstarter/libs/rx/transformers/CombineLatestPairTransformer.java deleted file mode 100644 index 6c405ab1e1..0000000000 --- a/app/src/main/java/com/kickstarter/libs/rx/transformers/CombineLatestPairTransformer.java +++ /dev/null @@ -1,19 +0,0 @@ -package com.kickstarter.libs.rx.transformers; - -import android.util.Pair; - -import androidx.annotation.NonNull; -import rx.Observable; - -public final class CombineLatestPairTransformer implements Observable.Transformer> { - @NonNull private final Observable second; - - public CombineLatestPairTransformer(final @NonNull Observable second) { - this.second = second; - } - - @Override - @NonNull public Observable> call(final @NonNull Observable first) { - return Observable.combineLatest(first, this.second, Pair::new); - } -} diff --git a/app/src/main/java/com/kickstarter/libs/rx/transformers/CompletedTransformer.java b/app/src/main/java/com/kickstarter/libs/rx/transformers/CompletedTransformer.java deleted file mode 100644 index 0582d9b0ca..0000000000 --- a/app/src/main/java/com/kickstarter/libs/rx/transformers/CompletedTransformer.java +++ /dev/null @@ -1,17 +0,0 @@ -package com.kickstarter.libs.rx.transformers; - -import androidx.annotation.NonNull; - -import rx.Notification; -import rx.Observable; - -public final class CompletedTransformer implements Observable.Transformer, Void> { - - @Override - public @NonNull Observable call(final @NonNull Observable> source) { - return source - .filter(Notification::isOnCompleted) - .map(__ -> null); - } -} - diff --git a/app/src/main/java/com/kickstarter/libs/rx/transformers/ErrorsTransformer.java b/app/src/main/java/com/kickstarter/libs/rx/transformers/ErrorsTransformer.java deleted file mode 100644 index 6c612a908e..0000000000 --- a/app/src/main/java/com/kickstarter/libs/rx/transformers/ErrorsTransformer.java +++ /dev/null @@ -1,17 +0,0 @@ -package com.kickstarter.libs.rx.transformers; - -import androidx.annotation.NonNull; - -import rx.Notification; -import rx.Observable; - -public final class ErrorsTransformer implements Observable.Transformer, Throwable> { - - @Override - public @NonNull Observable call(final @NonNull Observable> source) { - return source - .filter(Notification::hasThrowable) - .map(Notification::getThrowable); - } -} - diff --git a/app/src/main/java/com/kickstarter/libs/rx/transformers/IgnoreValuesTransformer.java b/app/src/main/java/com/kickstarter/libs/rx/transformers/IgnoreValuesTransformer.java deleted file mode 100644 index b160cb0ed7..0000000000 --- a/app/src/main/java/com/kickstarter/libs/rx/transformers/IgnoreValuesTransformer.java +++ /dev/null @@ -1,12 +0,0 @@ -package com.kickstarter.libs.rx.transformers; - -import androidx.annotation.NonNull; - -import rx.Observable; - -public final class IgnoreValuesTransformer implements Observable.Transformer { - @Override - @NonNull public Observable call(final @NonNull Observable source) { - return source.map(__ -> null); - } -} diff --git a/app/src/main/java/com/kickstarter/libs/rx/transformers/IncrementalCountTransformer.java b/app/src/main/java/com/kickstarter/libs/rx/transformers/IncrementalCountTransformer.java deleted file mode 100644 index aa952722a2..0000000000 --- a/app/src/main/java/com/kickstarter/libs/rx/transformers/IncrementalCountTransformer.java +++ /dev/null @@ -1,22 +0,0 @@ -package com.kickstarter.libs.rx.transformers; - -import androidx.annotation.NonNull; - -import rx.Observable; - -public final class IncrementalCountTransformer implements Observable.Transformer { - final int firstPage; - - public IncrementalCountTransformer() { - this.firstPage = 1; - } - - public IncrementalCountTransformer(final int firstPage) { - this.firstPage = firstPage; - } - - @Override - public Observable call(final @NonNull Observable source) { - return source.scan(this.firstPage-1, (accum, __) -> accum + 1).skip(1); - } -} diff --git a/app/src/main/java/com/kickstarter/libs/rx/transformers/NeverApiErrorTransformer.java b/app/src/main/java/com/kickstarter/libs/rx/transformers/NeverApiErrorTransformer.java deleted file mode 100644 index d5b336f95d..0000000000 --- a/app/src/main/java/com/kickstarter/libs/rx/transformers/NeverApiErrorTransformer.java +++ /dev/null @@ -1,38 +0,0 @@ -package com.kickstarter.libs.rx.transformers; - -import com.kickstarter.services.apiresponses.ErrorEnvelope; - -import androidx.annotation.NonNull; -import androidx.annotation.Nullable; -import rx.Observable; -import rx.functions.Action1; - -public final class NeverApiErrorTransformer implements Observable.Transformer { - private final @Nullable Action1 errorAction; - - protected NeverApiErrorTransformer() { - this.errorAction = null; - } - - protected NeverApiErrorTransformer(final @Nullable Action1 errorAction) { - this.errorAction = errorAction; - } - - @Override - public @NonNull Observable call(final @NonNull Observable source) { - return source - .doOnError(e -> { - final ErrorEnvelope env = ErrorEnvelope.fromThrowable(e); - if (env != null && this.errorAction != null) { - this.errorAction.call(env); - } - }) - .onErrorResumeNext(e -> { - if (ErrorEnvelope.fromThrowable(e) == null) { - return Observable.error(e); - } else { - return Observable.empty(); - } - }); - } -} diff --git a/app/src/main/java/com/kickstarter/libs/rx/transformers/NeverErrorTransformer.java b/app/src/main/java/com/kickstarter/libs/rx/transformers/NeverErrorTransformer.java deleted file mode 100644 index 02397ff553..0000000000 --- a/app/src/main/java/com/kickstarter/libs/rx/transformers/NeverErrorTransformer.java +++ /dev/null @@ -1,30 +0,0 @@ -package com.kickstarter.libs.rx.transformers; - -import androidx.annotation.NonNull; -import androidx.annotation.Nullable; - -import rx.Observable; -import rx.functions.Action1; - -public final class NeverErrorTransformer implements Observable.Transformer { - private final @Nullable Action1 errorAction; - - protected NeverErrorTransformer() { - this.errorAction = null; - } - - protected NeverErrorTransformer(final @Nullable Action1 errorAction) { - this.errorAction = errorAction; - } - - @Override - @NonNull public Observable call(final @NonNull Observable source) { - return source - .doOnError(e -> { - if (this.errorAction != null) { - this.errorAction.call(e); - } - }) - .onErrorResumeNext(Observable.empty()); - } -} diff --git a/app/src/main/java/com/kickstarter/libs/rx/transformers/ObserveForUITransformer.java b/app/src/main/java/com/kickstarter/libs/rx/transformers/ObserveForUITransformer.java deleted file mode 100644 index 8c1e080f62..0000000000 --- a/app/src/main/java/com/kickstarter/libs/rx/transformers/ObserveForUITransformer.java +++ /dev/null @@ -1,22 +0,0 @@ -package com.kickstarter.libs.rx.transformers; - -import com.kickstarter.libs.utils.ThreadUtils; - -import androidx.annotation.NonNull; -import rx.Observable; -import rx.android.schedulers.AndroidSchedulers; -import rx.schedulers.Schedulers; - -public final class ObserveForUITransformer implements Observable.Transformer { - @Override - public @NonNull Observable call(final @NonNull Observable source) { - - return source.flatMap(value -> { - if (ThreadUtils.isMainThread()) { - return Observable.just(value).observeOn(Schedulers.immediate()); - } else { - return Observable.just(value).observeOn(AndroidSchedulers.mainThread()); - } - }); - } -} diff --git a/app/src/main/java/com/kickstarter/libs/rx/transformers/TakePairWhenTransformer.java b/app/src/main/java/com/kickstarter/libs/rx/transformers/TakePairWhenTransformer.java deleted file mode 100644 index 8ec915c1bb..0000000000 --- a/app/src/main/java/com/kickstarter/libs/rx/transformers/TakePairWhenTransformer.java +++ /dev/null @@ -1,20 +0,0 @@ -package com.kickstarter.libs.rx.transformers; - -import android.util.Pair; - -import androidx.annotation.NonNull; -import rx.Observable; - -public final class TakePairWhenTransformer implements Observable.Transformer> { - @NonNull private final Observable when; - - public TakePairWhenTransformer(final @NonNull Observable when) { - this.when = when; - } - - @Override - @NonNull - public Observable> call(final @NonNull Observable source) { - return this.when.withLatestFrom(source, (x, y) -> new Pair<>(y, x)); - } -} diff --git a/app/src/main/java/com/kickstarter/libs/rx/transformers/TakeWhenTransformer.java b/app/src/main/java/com/kickstarter/libs/rx/transformers/TakeWhenTransformer.java deleted file mode 100644 index 40ad2b66ff..0000000000 --- a/app/src/main/java/com/kickstarter/libs/rx/transformers/TakeWhenTransformer.java +++ /dev/null @@ -1,19 +0,0 @@ -package com.kickstarter.libs.rx.transformers; - -import androidx.annotation.NonNull; - -import rx.Observable; - -public final class TakeWhenTransformer implements Observable.Transformer { - @NonNull private final Observable when; - - public TakeWhenTransformer(final @NonNull Observable when) { - this.when = when; - } - - @Override - @NonNull - public Observable call(final @NonNull Observable source) { - return this.when.withLatestFrom(source, (__, x) -> x); - } -} diff --git a/app/src/main/java/com/kickstarter/libs/rx/transformers/Transformers.java b/app/src/main/java/com/kickstarter/libs/rx/transformers/Transformers.java index aa87b3c2b1..0ea1afc8a3 100644 --- a/app/src/main/java/com/kickstarter/libs/rx/transformers/Transformers.java +++ b/app/src/main/java/com/kickstarter/libs/rx/transformers/Transformers.java @@ -5,31 +5,9 @@ import com.kickstarter.services.ApiException; import com.kickstarter.services.apiresponses.ErrorEnvelope; -import rx.Observable; - public final class Transformers { private Transformers() {} - /** - * Transforms `null` values emitted from an observable into `theDefault`. - */ - public static @NonNull CoalesceTransformer coalesce(final @NonNull T theDefault) { - return new CoalesceTransformer<>(theDefault); - } - - /** - * Emits when a materialized stream is completed. - */ - public static @NonNull CompletedTransformer completed() { - return new CompletedTransformer<>(); - } - - /** - * Emits when an error is thrown in a materialized stream. - */ - public static @NonNull ErrorsTransformer errors() { - return new ErrorsTransformer<>(); - } /** * Emits when an error is thrown in a materialized stream. @@ -39,13 +17,6 @@ private Transformers() {} return new ErrorsTransformerV2<>(); } - /** - * Prevents an observable from erroring by chaining `onErrorResumeNext`. - */ - public static NeverErrorTransformer neverError() { - return new NeverErrorTransformer<>(); - } - /** * Prevents an observable from erroring by chaining `onErrorResumeNext`. * Adapted to RxJava 2 @@ -54,13 +25,6 @@ public static NeverErrorTransformerV2 neverErrorV2() { return new NeverErrorTransformerV2<>(); } - /** - * Prevents an observable from erroring on any {@link ApiException} exceptions. - */ - public static NeverApiErrorTransformer neverApiError() { - return new NeverApiErrorTransformer<>(); - } - /** * Prevents an observable from erroring on any {@link ApiException} exceptions, * and any errors that do occur will be piped into the supplied @@ -83,15 +47,6 @@ public static TakeWhenTransformerV2 takeWhenV2(final @NonNull io.re return new TakeWhenTransformerV2<>(when); } - /** - * Emits the latest value of the source `when` observable whenever the - * `when` observable emits. - */ - // TODO: Delete this when last RX1 is removed - public static TakePairWhenTransformer takePairWhen(final @NonNull Observable when) { - return new TakePairWhenTransformer<>(when); - } - /** * Emits the latest value of the source `when` observable whenever the * `when` observable emits. @@ -106,14 +61,6 @@ public static ZipPairTransformerV2 zipPairV2(final @NonNull io.reac return new ZipPairTransformerV2<>(second); } - /** - * Emits the latest values from two observables whenever either emits. - */ - // TODO: Delete this when last RX1 is removed - public static CombineLatestPairTransformer combineLatestPair(final @NonNull Observable second) { - return new CombineLatestPairTransformer<>(second); - } - /** * Emits the latest values from two observables whenever either emits. */ @@ -121,37 +68,10 @@ public static CombineLatestPairTransformerV2 combineLatestPair(fina return new CombineLatestPairTransformerV2<>(second); } - /** - * Converts an observable of any type into an observable of `null`s. This is useful for forcing - * Java's type system into knowing we have a stream of `Void`. Simply doing `.map(__ -> null)` - * is not enough since Java doesn't know if that is a `null` String, Integer, Void, etc. - * - * This transformer allows the following pattern: - * - * ``` - * myObservable - * .compose(takeWhen(click)) - * .compose(ignoreValues()) - * .subscribe(subject::onNext) - * ``` - */ - public static @NonNull IgnoreValuesTransformer ignoreValues() { - return new IgnoreValuesTransformer<>(); - } - public static @NonNull IgnoreValuesTransformerV2 ignoreValuesV2() { return new IgnoreValuesTransformerV2<>(); } - - /** - * Emits the number of times the source has emitted for every emission of the source. The - * first emitted value will be `1`. - */ - public static @NonNull IncrementalCountTransformer incrementalCount() { - return new IncrementalCountTransformer<>(); - } - /** * Emits the number of times the source has emitted for every emission of the source. The * first emitted value will be `1`. @@ -160,12 +80,6 @@ public static CombineLatestPairTransformerV2 combineLatestPair(fina return new IncrementalCountTransformerV2<>(); } - /** - * Emits an observable of values from a materialized stream. - */ - public static @NonNull ValuesTransformer values() { - return new ValuesTransformer<>(); - } /** * Emits an observable of values from a materialized stream. @@ -175,18 +89,6 @@ public static CombineLatestPairTransformerV2 combineLatestPair(fina return new ValuesTransformerV2<>(); } - /** - * If called on the main thread, schedule the work immediately. Otherwise delay execution of the work by adding it - * to a message queue, where it will be executed on the main thread. - * - * This is particularly useful for RecyclerViews; if subscriptions in these views are delayed for a frame, then - * the view temporarily shows recycled content and frame rate stutters. To address that, we can use `observeForUI()` - * to execute the work immediately rather than wait for a frame. - */ - public static @NonNull ObserveForUITransformer observeForUI() { - return new ObserveForUITransformer<>(); - } - public static @NonNull ObserveForUITransformerV2 observeForUIV2() { return new ObserveForUITransformerV2<>(); } diff --git a/app/src/main/java/com/kickstarter/libs/rx/transformers/ValuesTransformer.java b/app/src/main/java/com/kickstarter/libs/rx/transformers/ValuesTransformer.java deleted file mode 100644 index 19d6ea22da..0000000000 --- a/app/src/main/java/com/kickstarter/libs/rx/transformers/ValuesTransformer.java +++ /dev/null @@ -1,17 +0,0 @@ -package com.kickstarter.libs.rx.transformers; - -import androidx.annotation.NonNull; - -import rx.Notification; -import rx.Observable; - -public final class ValuesTransformer implements Observable.Transformer, T> { - - @Override - public @NonNull Observable call(final @NonNull Observable> source) { - return source - .filter(Notification::isOnNext) - .map(Notification::getValue); - } -} - diff --git a/app/src/main/java/com/kickstarter/libs/rx/transformers/WaitUntilTransformer.java b/app/src/main/java/com/kickstarter/libs/rx/transformers/WaitUntilTransformer.java deleted file mode 100644 index 8664ee31ba..0000000000 --- a/app/src/main/java/com/kickstarter/libs/rx/transformers/WaitUntilTransformer.java +++ /dev/null @@ -1,18 +0,0 @@ -package com.kickstarter.libs.rx.transformers; - -import androidx.annotation.NonNull; - -import rx.Observable; - -public final class WaitUntilTransformer implements Observable.Transformer { - @NonNull private final Observable until; - - public WaitUntilTransformer(final @NonNull Observable until) { - this.until = until; - } - - @Override - public Observable call(final @NonNull Observable source) { - return this.until.take(1).flatMap(__ -> source); - } -} diff --git a/app/src/main/java/com/kickstarter/libs/utils/ApplicationLifecycleUtil.kt b/app/src/main/java/com/kickstarter/libs/utils/ApplicationLifecycleUtil.kt index 6b10f4003e..e97178d464 100644 --- a/app/src/main/java/com/kickstarter/libs/utils/ApplicationLifecycleUtil.kt +++ b/app/src/main/java/com/kickstarter/libs/utils/ApplicationLifecycleUtil.kt @@ -13,10 +13,8 @@ import com.kickstarter.libs.CurrentConfigTypeV2 import com.kickstarter.libs.CurrentUserTypeV2 import com.kickstarter.libs.Logout import com.kickstarter.libs.preferences.StringPreferenceType -import com.kickstarter.libs.rx.transformers.Transformers import com.kickstarter.libs.utils.extensions.addToDisposable import com.kickstarter.libs.utils.extensions.isNotNull -import com.kickstarter.libs.utils.extensions.isNull import com.kickstarter.libs.utils.extensions.syncUserFeatureFlagsFromPref import com.kickstarter.services.ApiClientTypeV2 import com.kickstarter.services.apiresponses.ErrorEnvelope @@ -47,12 +45,10 @@ class ApplicationLifecycleUtil(private val application: KSApplication) : @Inject var featuresFlagPreference: StringPreferenceType? = null private var isInBackground = true - private var isLoggedIn = false private val disposables = CompositeDisposable() init { application.component().inject(this) - currentUser.observable().filter { it.isPresent() }.subscribe { isLoggedIn = true }.addToDisposable(disposables) } override fun onActivityCreated(activity: Activity, bundle: Bundle?) {} @@ -117,17 +113,14 @@ class ApplicationLifecycleUtil(private val application: KSApplication) : private fun refreshUser() { val accessToken = currentUser.accessToken ?: "" - // Check if the access token is null and the user is still logged in. - if (isLoggedIn && accessToken.isNull()) { - forceLogout("access_token_null") - } else { - if (accessToken.isNotNull() && accessToken.isNotEmpty()) { - client.fetchCurrentUser() - .compose(Transformers.neverErrorV2()) - .subscribe { user -> - currentUser.refresh(user) - }.addToDisposable(disposables) - } + if (accessToken.isNotNull() && accessToken.isNotEmpty()) { + client.fetchCurrentUser() + .doOnError { + forceLogout(it.message ?: "") + } + .subscribe { user -> + currentUser.refresh(user) + }.addToDisposable(disposables) } } diff --git a/app/src/main/java/com/kickstarter/libs/utils/ListUtils.java b/app/src/main/java/com/kickstarter/libs/utils/ListUtils.java index 001c83bc19..12ced6ea1e 100644 --- a/app/src/main/java/com/kickstarter/libs/utils/ListUtils.java +++ b/app/src/main/java/com/kickstarter/libs/utils/ListUtils.java @@ -2,10 +2,10 @@ import java.util.ArrayList; import java.util.List; +import java.util.function.BiFunction; import androidx.annotation.NonNull; import androidx.annotation.Nullable; -import rx.functions.Func2; public final class ListUtils { private ListUtils() { @@ -65,7 +65,7 @@ public static boolean contains(final @NonNull List xs, final @NonNull T y /** * Returns true if `y` is equal to any of the values in `xs`, where equality is determined by a given function. */ - public static boolean contains(final @NonNull List xs, final @NonNull T y, final @NonNull Func2 equality) { + public static boolean contains(final @NonNull List xs, final @NonNull T y, final @NonNull BiFunction equality) { return ListUtils.indexOf(xs, y, equality) != -1; } @@ -81,7 +81,7 @@ public static boolean contains(final @NonNull List xs, final @NonNull T y * determined by a given function. */ public static @NonNull List difference(final @NonNull List lhs, final @NonNull List rhs, - final @NonNull Func2 equality) { + final @NonNull BiFunction equality) { final List result = new ArrayList<>(); for (final T litem : lhs) { @@ -110,7 +110,7 @@ public static boolean contains(final @NonNull List xs, final @NonNull T y * Returns the first element in `xs` that equals `x`, or `null` if `x` is not found in `xs`. Equality is determined * by the given function. */ - public static @Nullable T find(final @NonNull List xs, final @NonNull T y, final @NonNull Func2 equality) { + public static @Nullable T find(final @NonNull List xs, final @NonNull T y, final @NonNull BiFunction equality) { final int idx = ListUtils.indexOf(xs, y, equality); if (idx == -1) { return null; @@ -147,9 +147,9 @@ public static int indexOf(final @NonNull List xs, final @NonNull T y) { * Returns the index of the first element in `xs` that equals `x`, or `-1` if `x` is not found in `xs`. Equality is determined * by the given function. */ - public static int indexOf(final @NonNull List xs, final @NonNull T y, final @NonNull Func2 equality) { + public static int indexOf(final @NonNull List xs, final @NonNull T y, final @NonNull BiFunction equality) { for (int idx = 0; idx < xs.size(); idx++) { - if (equality.call(xs.get(idx), y)) { + if (equality.apply(xs.get(idx), y)) { return idx; } } @@ -166,7 +166,7 @@ public static int indexOf(final @NonNull List xs, final @NonNull T y, fin /** * Returns a list containing the elements of `lhs` that exist in `rhs`, where equality is determined by the given function. */ - public static @NonNull List intersection(final @NonNull List lhs, final @NonNull List rhs, final @NonNull Func2 equality) { + public static @NonNull List intersection(final @NonNull List lhs, final @NonNull List rhs, final @NonNull BiFunction equality) { final List result = new ArrayList<>(); for (final T litem : lhs) { if (ListUtils.contains(rhs, litem, equality)) { diff --git a/app/src/main/java/com/kickstarter/libs/utils/SwitchCompatUtils.java b/app/src/main/java/com/kickstarter/libs/utils/SwitchCompatUtils.java index 2b65b4c794..5cc403303d 100644 --- a/app/src/main/java/com/kickstarter/libs/utils/SwitchCompatUtils.java +++ b/app/src/main/java/com/kickstarter/libs/utils/SwitchCompatUtils.java @@ -4,7 +4,6 @@ import androidx.annotation.NonNull; import androidx.appcompat.widget.SwitchCompat; -import rx.functions.Action1; public final class SwitchCompatUtils { private SwitchCompatUtils() {} @@ -17,11 +16,4 @@ public static void setCheckedWithoutAnimation(final @NonNull SwitchCompat switch switchCompat.setChecked(checked); switchCompat.setVisibility(View.VISIBLE); } - - /** - * Set toggle state without any animations. - */ - public static Action1 setCheckedWithoutAnimation(final @NonNull SwitchCompat switchCompat) { - return (checked) -> setCheckedWithoutAnimation(switchCompat, checked); - } } diff --git a/app/src/main/java/com/kickstarter/libs/utils/ViewUtils.java b/app/src/main/java/com/kickstarter/libs/utils/ViewUtils.java index 5c5479a633..8b4d3bb9c7 100644 --- a/app/src/main/java/com/kickstarter/libs/utils/ViewUtils.java +++ b/app/src/main/java/com/kickstarter/libs/utils/ViewUtils.java @@ -29,8 +29,6 @@ import com.kickstarter.R; import com.kickstarter.ui.views.ConfirmDialog; -import rx.functions.Action1; - public final class ViewUtils { private ViewUtils() {} @@ -162,10 +160,6 @@ public static void showToastFromTop(final @NonNull Context context, final @NonNu toast.show(); } - public static Action1 showToast(final @NonNull Context context) { - return (message) -> showToast(context, message); - } - /** * @deprecated Sets the visiblity of a view to {@link View#VISIBLE} or {@link View#GONE}. Setting * the view to GONE removes it from the layout so that it no longer takes up any space. @@ -179,15 +173,6 @@ public static void setGone(final @NonNull View view, final boolean gone) { } } - /** - * @deprecated Sets the visiblity of a view .Setting the view to GONE removes it from the layout - * so that it no longer takes up any space. - */ - @Deprecated - public static Action1 setGone(final @NonNull View view) { - return (gone) -> setGone(view, gone); - } - /** * @deprecated Sets the visibility of a view to {@link View#VISIBLE} or {@link View#INVISIBLE}. Setting * the view to INVISIBLE makes it hidden, but it still takes up space. @@ -200,13 +185,4 @@ public static void setInvisible(final @NonNull View view, final boolean hidden) view.setVisibility(View.VISIBLE); } } - - /** - * @deprecated Sets the visibility of a view . Setting the view to INVISIBLE makes it hidden, - * but it still takes up space. - */ - @Deprecated - public static Action1 setInvisible(final @NonNull View view) { - return (invisible) -> setInvisible(view, invisible); - } } diff --git a/app/src/main/java/com/kickstarter/libs/utils/extensions/AnyExt.kt b/app/src/main/java/com/kickstarter/libs/utils/extensions/AnyExt.kt index 9efaa4e894..5f40849646 100644 --- a/app/src/main/java/com/kickstarter/libs/utils/extensions/AnyExt.kt +++ b/app/src/main/java/com/kickstarter/libs/utils/extensions/AnyExt.kt @@ -1,7 +1,6 @@ package com.kickstarter.libs.utils.extensions import io.reactivex.functions.Function -import rx.functions.Func1 fun T?.isNull(): Boolean { return this == null @@ -18,10 +17,6 @@ fun T?.coalesce(theDefault: T): T { return theDefault } -fun coalesceWith(theDefault: T): Func1 { - return Func1 { it.coalesce(theDefault) } -} - fun coalesceWithV2(theDefault: T): Function { return Function { it.coalesce(theDefault) } } diff --git a/app/src/main/java/com/kickstarter/libs/utils/extensions/ProjectExt.kt b/app/src/main/java/com/kickstarter/libs/utils/extensions/ProjectExt.kt index 5248923e48..a3ec4e0559 100644 --- a/app/src/main/java/com/kickstarter/libs/utils/extensions/ProjectExt.kt +++ b/app/src/main/java/com/kickstarter/libs/utils/extensions/ProjectExt.kt @@ -15,9 +15,9 @@ import com.kickstarter.models.Urls import com.kickstarter.models.User import com.kickstarter.models.Web import com.kickstarter.services.DiscoveryParams +import io.reactivex.Observable import org.joda.time.DateTime import org.joda.time.Duration -import rx.Observable import type.CreditCardTypes import kotlin.math.floor @@ -241,10 +241,10 @@ fun List.fillRootCategoryForFeaturedProjects(rootCategories: List rootCategory.id() == categoryParentId } .take(1) - .toBlocking().single() + .blockingFirst() // Sub in the found root category in our featured project. val newCategory = category.toBuilder().parent(projectRootCategory).build() diff --git a/app/src/main/java/com/kickstarter/mock/MockCurrentConfig.java b/app/src/main/java/com/kickstarter/mock/MockCurrentConfig.java deleted file mode 100644 index 977ccaae6d..0000000000 --- a/app/src/main/java/com/kickstarter/mock/MockCurrentConfig.java +++ /dev/null @@ -1,24 +0,0 @@ -package com.kickstarter.mock; - -import com.kickstarter.libs.Config; -import com.kickstarter.libs.CurrentConfigType; - -import androidx.annotation.NonNull; - -import io.reactivex.Observable; -import io.reactivex.subjects.BehaviorSubject; - -public final class MockCurrentConfig implements CurrentConfigType { - - private final BehaviorSubject config = BehaviorSubject.create(); - - @Override - public @NonNull Observable observable() { - return this.config; - } - - @Override - public void config(final @NonNull Config config) { - this.config.onNext(config); - } -} diff --git a/app/src/main/java/com/kickstarter/mock/services/MockApiClient.kt b/app/src/main/java/com/kickstarter/mock/services/MockApiClient.kt deleted file mode 100644 index 436079a22b..0000000000 --- a/app/src/main/java/com/kickstarter/mock/services/MockApiClient.kt +++ /dev/null @@ -1,416 +0,0 @@ -package com.kickstarter.mock.services - -import com.google.gson.JsonObject -import com.kickstarter.libs.Config -import com.kickstarter.mock.factories.ActivityEnvelopeFactory -import com.kickstarter.mock.factories.ActivityFactory -import com.kickstarter.mock.factories.BackingFactory.backing -import com.kickstarter.mock.factories.CategoryFactory.artCategory -import com.kickstarter.mock.factories.CategoryFactory.bluesCategory -import com.kickstarter.mock.factories.CategoryFactory.ceramicsCategory -import com.kickstarter.mock.factories.CategoryFactory.gamesCategory -import com.kickstarter.mock.factories.CategoryFactory.musicCategory -import com.kickstarter.mock.factories.CategoryFactory.photographyCategory -import com.kickstarter.mock.factories.CategoryFactory.tabletopGamesCategory -import com.kickstarter.mock.factories.CategoryFactory.textilesCategory -import com.kickstarter.mock.factories.CategoryFactory.worldMusicCategory -import com.kickstarter.mock.factories.LocationFactory.sydney -import com.kickstarter.mock.factories.MessageThreadEnvelopeFactory -import com.kickstarter.mock.factories.MessageThreadsEnvelopeFactory -import com.kickstarter.mock.factories.ProjectFactory.allTheWayProject -import com.kickstarter.mock.factories.ProjectFactory.project -import com.kickstarter.mock.factories.ProjectFactory.successfulProject -import com.kickstarter.mock.factories.ShippingRulesEnvelopeFactory.shippingRules -import com.kickstarter.mock.factories.SurveyResponseFactory -import com.kickstarter.mock.factories.UpdateFactory -import com.kickstarter.mock.factories.UserFactory.user -import com.kickstarter.models.Backing -import com.kickstarter.models.Category -import com.kickstarter.models.Location -import com.kickstarter.models.Message -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 -import com.kickstarter.services.ApiClientType -import com.kickstarter.services.DiscoveryParams -import com.kickstarter.services.apiresponses.AccessTokenEnvelope -import com.kickstarter.services.apiresponses.ActivityEnvelope -import com.kickstarter.services.apiresponses.DiscoverEnvelope -import com.kickstarter.services.apiresponses.EmailVerificationEnvelope -import com.kickstarter.services.apiresponses.EmailVerificationEnvelope.Companion.builder -import com.kickstarter.services.apiresponses.MessageThreadEnvelope -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.UpdatesEnvelope -import com.kickstarter.ui.data.Mailbox -import com.kickstarter.ui.data.MessageSubject -import rx.Observable -import rx.subjects.PublishSubject - -open class MockApiClient : ApiClientType { - private val observable = PublishSubject.create>>() - - /** - * Emits when endpoints on the client are called. The key in the pair is the underscore-separated - * name of the method, and the value is a map of argument names/values. - */ - fun observable(): Observable>> { - return observable - } - - override fun config(): Observable { - return Observable.empty() - } - - override fun fetchActivities(): Observable { - return Observable.just( - ActivityEnvelopeFactory.activityEnvelope(listOf(ActivityFactory.activity())) - ) - } - - override fun fetchActivities(count: Int?): Observable { - return fetchActivities().take(count ?: 0) - } - - override fun fetchActivitiesWithPaginationPath(paginationPath: String): Observable { - return Observable.empty() - } - - override fun fetchCategories(): Observable> { - return Observable.just( - listOf( - artCategory(), - bluesCategory(), - ceramicsCategory(), - gamesCategory(), - musicCategory(), - photographyCategory(), - tabletopGamesCategory(), - textilesCategory(), - worldMusicCategory() - ) - ) - } - - override fun fetchProjectNotifications(): Observable> { - return Observable.empty() - } - - override fun fetchProject(param: String): Observable { - return Observable.just( - project() - .toBuilder() - .slug(param) - .build() - ) - } - - override fun fetchProject(project: Project): Observable { - return Observable.just(project) - } - - override fun fetchProjects(params: DiscoveryParams): Observable { - return Observable.just( - DiscoverEnvelope - .builder() - .projects( - listOf( - project(), - allTheWayProject(), - successfulProject() - ) - ) - .urls( - DiscoverEnvelope.UrlsEnvelope - .builder() - .api( - DiscoverEnvelope.UrlsEnvelope.ApiEnvelope - .builder() - .moreProjects("http://more.projects.please") - .build() - ) - .build() - ) - .stats( - DiscoverEnvelope.StatsEnvelope - .builder() - .count(10) - .build() - ) - .build() - ) - } - - override fun fetchProjects(isMember: Boolean): Observable { - return Observable.empty() - } - - override fun fetchProjects(paginationUrl: String): Observable { - return Observable.empty() - } - - override fun fetchProjectStats(project: Project): Observable { - return Observable.empty() - } - - override fun fetchMessagesForBacking(backing: Backing): Observable { - return Observable.just(MessageThreadEnvelopeFactory.messageThreadEnvelope()) - } - - override fun fetchMessagesForThread(messageThread: MessageThread): Observable { - return Observable.just(MessageThreadEnvelopeFactory.messageThreadEnvelope()) - } - - override fun fetchMessagesForThread(messageThreadId: Long): Observable { - return Observable.just(MessageThreadEnvelopeFactory.messageThreadEnvelope()) - } - - override fun fetchMessageThreads( - project: Project?, - mailbox: Mailbox - ): Observable { - return Observable.just(MessageThreadsEnvelopeFactory.messageThreadsEnvelope()) - } - - override fun fetchMessageThreadsWithPaginationPath(paginationPath: String): Observable { - return Observable.empty() - } - - override fun fetchShippingRules( - project: Project, - reward: Reward - ): Observable { - return Observable.just(shippingRules()) - } - - override fun fetchUpdate(projectParam: String, updateParam: String): Observable { - return Observable.just(UpdateFactory.update()) - } - - override fun fetchUpdate(update: Update): Observable { - return Observable.empty() - } - - override fun fetchUpdates(project: Project): Observable { - return Observable.just( - UpdatesEnvelope - .builder() - .updates( - listOf( - UpdateFactory.update(), - UpdateFactory.update() - ) - ) - .urls( - UpdatesEnvelope.UrlsEnvelope - .builder() - .api( - UpdatesEnvelope.UrlsEnvelope.ApiEnvelope - .builder() - .moreUpdates("http://more.updates.please") - .build() - ) - .build() - ) - .build() - ) - } - - override fun fetchUpdates(paginationPath: String): Observable { - return Observable.empty() - } - - override fun loginWithFacebook(accessToken: String): Observable { - return Observable.just( - AccessTokenEnvelope.builder() - .user( - user() - .toBuilder() - .build() - ) - .accessToken("deadbeef") - .build() - ) - } - - override fun loginWithFacebook( - fbAccessToken: String, - code: String - ): Observable { - return Observable.just( - AccessTokenEnvelope.builder() - .user( - user() - .toBuilder() - .build() - ) - .accessToken("deadbeef") - .build() - ) - } - - override fun registerWithFacebook( - fbAccessToken: String, - sendNewsletters: Boolean - ): Observable { - return Observable.just( - AccessTokenEnvelope.builder() - .user( - user() - .toBuilder() - .build() - ) - .accessToken("deadbeef") - .build() - ) - } - - override fun fetchProjectBacking(project: Project, user: User): Observable { - return Observable.just(backing(project, user)) - } - - override fun fetchCategory(param: String): Observable { - return Observable.just(musicCategory()) - } - - override fun fetchCategory(category: Category): Observable { - return Observable.empty() - } - - override fun fetchCurrentUser(): Observable { - return Observable.empty() - } - - override fun fetchLocation(param: String): Observable { - return Observable.just(sydney()) - } - - override fun login(email: String, password: String): Observable { - return Observable.just( - AccessTokenEnvelope.builder() - .user( - user() - .toBuilder() - .build() - ) - .accessToken("deadbeef") - .build() - ) - } - - override fun login( - email: String, - password: String, - code: String - ): Observable { - return Observable.just( - AccessTokenEnvelope.builder() - .user( - user() - .toBuilder() - .build() - ) - .accessToken("deadbeef") - .build() - ) - } - - override fun markAsRead(messageThread: MessageThread): Observable { - return Observable.empty() - } - - override fun postBacking( - project: Project, - backing: Backing, - checked: Boolean - ): Observable { - return Observable.just(backing()) - } - - override fun registerPushToken(token: String): Observable { - return Observable.empty() - } - - override fun resetPassword(email: String): Observable { - return Observable.just(user()) - } - - override fun sendMessage(messageSubject: MessageSubject, body: String): Observable { - return Observable.empty() - } - - override fun signup( - name: String, - email: String, - password: String, - passwordConfirmation: String, - sendNewsletters: Boolean - ): Observable { - return Observable.just( - AccessTokenEnvelope.builder() - .user( - user() - .toBuilder() - .name(name) - .build() - ) - .accessToken("deadbeef") - .build() - ) - } - - override fun saveProject(project: Project): Observable { - return Observable.just(project.toBuilder().isStarred(true).build()) - } - - override fun fetchSurveyResponse(surveyResponseId: Long): Observable { - return Observable.just( - SurveyResponseFactory.surveyResponse().toBuilder().id(surveyResponseId).build() - ) - } - - override fun toggleProjectSave(project: Project): Observable { - return Observable.just(project.toBuilder().isStarred(!project.isStarred()).build()) - } - - override fun fetchUnansweredSurveys(): Observable> { - return Observable.just( - listOf( - SurveyResponseFactory.surveyResponse(), - SurveyResponseFactory.surveyResponse() - ) - ) - } - - override fun updateProjectNotifications( - projectNotification: ProjectNotification, - checked: Boolean - ): Observable { - return Observable.just( - projectNotification.toBuilder().email(checked).mobile(checked).build() - ) - } - - override fun updateUserSettings(user: User): Observable { - val map: Map = mapOf(Pair("user", user)) - observable.onNext( - Pair("update_user_settings", map) - ) - return Observable.just(user) - } - - override fun verifyEmail(token: String): Observable { - return Observable.just( - builder() - .code(200) - .message("") - .build() - ) - } -} diff --git a/app/src/main/java/com/kickstarter/mock/services/MockApolloClient.kt b/app/src/main/java/com/kickstarter/mock/services/MockApolloClientV2.kt similarity index 60% rename from app/src/main/java/com/kickstarter/mock/services/MockApolloClient.kt rename to app/src/main/java/com/kickstarter/mock/services/MockApolloClientV2.kt index 5ed3ab1ccd..ae7731bf76 100644 --- a/app/src/main/java/com/kickstarter/mock/services/MockApolloClient.kt +++ b/app/src/main/java/com/kickstarter/mock/services/MockApolloClientV2.kt @@ -6,22 +6,15 @@ import SendEmailVerificationMutation import UpdateUserCurrencyMutation import UpdateUserEmailMutation import UpdateUserPasswordMutation -import UserPrivacyQuery import android.util.Pair import com.kickstarter.features.pledgedprojectsoverview.data.PledgedProjectsOverviewEnvelope import com.kickstarter.features.pledgedprojectsoverview.data.PledgedProjectsOverviewQueryData import com.kickstarter.mock.factories.BackingFactory import com.kickstarter.mock.factories.CategoryFactory -import com.kickstarter.mock.factories.CheckoutFactory -import com.kickstarter.mock.factories.CommentEnvelopeFactory import com.kickstarter.mock.factories.CommentFactory -import com.kickstarter.mock.factories.CreatorDetailsFactory -import com.kickstarter.mock.factories.DiscoverEnvelopeFactory import com.kickstarter.mock.factories.ErroredBackingFactory import com.kickstarter.mock.factories.PageInfoEnvelopeFactory import com.kickstarter.mock.factories.ProjectFactory -import com.kickstarter.mock.factories.RewardFactory -import com.kickstarter.mock.factories.ShippingRulesEnvelopeFactory import com.kickstarter.mock.factories.StoredCardFactory import com.kickstarter.mock.factories.UpdateFactory import com.kickstarter.models.Backing @@ -41,7 +34,6 @@ import com.kickstarter.models.Reward import com.kickstarter.models.StoredCard import com.kickstarter.models.User import com.kickstarter.models.UserPrivacy -import com.kickstarter.services.ApolloClientType import com.kickstarter.services.ApolloClientTypeV2 import com.kickstarter.services.DiscoveryParams import com.kickstarter.services.apiresponses.DiscoverEnvelope @@ -56,7 +48,6 @@ import com.kickstarter.services.mutations.PostCommentData import com.kickstarter.services.mutations.SavePaymentMethodData import com.kickstarter.services.mutations.UpdateBackingData import com.kickstarter.viewmodels.usecases.TPEventInputData -import rx.Observable import type.CurrencyCode import java.util.Collections @@ -349,244 +340,3 @@ open class MockApolloClientV2 : ApolloClientTypeV2 { return io.reactivex.Observable.empty() } } - -open class MockApolloClient : ApolloClientType { - - override fun getProjectBacking(slug: String): Observable { - return Observable.just(BackingFactory.backing()) - } - - override fun createSetupIntent(project: Project?): Observable { - return Observable.just("") - } - - override fun getProject(project: Project): Observable { - return Observable.just(project) - } - - override fun getProject(slug: String): Observable { - return Observable.just( - ProjectFactory.project() - .toBuilder() - .slug(slug) - .build() - ) - } - - override fun getProjects(discoveryParams: DiscoveryParams, cursor: String?): Observable { - return Observable.just( - DiscoverEnvelope - .builder() - .projects( - listOf( - ProjectFactory.project(), - ProjectFactory.allTheWayProject(), - ProjectFactory.successfulProject() - ) - ) - .urls( - DiscoverEnvelope.UrlsEnvelope - .builder() - .api( - DiscoverEnvelope.UrlsEnvelope.ApiEnvelope - .builder() - .moreProjects("http://more.projects.please") - .build() - ) - .build() - ) - .stats( - DiscoverEnvelope.StatsEnvelope - .builder() - .count(10) - .build() - ) - .build() - ) - } - - override fun getProjects(isMember: Boolean): Observable { - return Observable.just(DiscoverEnvelopeFactory.discoverEnvelope(emptyList())) - } - - override fun fetchCategories(): Observable> { - return Observable.just(CategoryFactory.rootCategories()) - } - - override fun fetchCategory(param: String): Observable { - return Observable.just(CategoryFactory.musicCategory()) - } - - override fun getProjectAddOns(slug: String, location: Location): Observable> { - val reward = RewardFactory.reward().toBuilder().isAddOn(true).quantity(2).build() - return Observable.just(listOf(reward, reward)) - } - - override fun watchProject(project: Project): Observable { - return Observable.just(project.toBuilder().isStarred(true).build()) - } - - override fun unWatchProject(project: Project): Observable { - return Observable.just(project.toBuilder().isStarred(false).build()) - } - - override fun cancelBacking(backing: Backing, note: String): Observable { - return Observable.just(true) - } - - override fun createBacking(createBackingData: CreateBackingData): Observable { - return Observable.just(CheckoutFactory.requiresAction(false)) - } - - override fun getBacking(backingId: String): Observable { - return Observable.just(BackingFactory.backing()) - } - - override fun getShippingRules(reward: Reward): Observable { - return Observable.just(ShippingRulesEnvelopeFactory.shippingRules()) - } - - override fun getProjectComments(slug: String, cursor: String?, limit: Int): Observable { - return Observable.just( - CommentEnvelope.builder() - .pageInfoEnvelope( - PageInfoEnvelopeFactory.pageInfoEnvelope() - ) - .comments(listOf(CommentFactory.comment())) - .totalCount(1) - .build() - ) - } - - override fun getProjectUpdates( - slug: String, - cursor: String?, - limit: Int - ): Observable { - return Observable.just( - UpdatesGraphQlEnvelope.builder() - .pageInfoEnvelope( - PageInfoEnvelopeFactory.pageInfoEnvelope() - ) - .updates(listOf(UpdateFactory.update())) - .totalCount(1) - .build() - ) - } - - override fun getProjectUpdateComments( - updateId: String, - cursor: String?, - limit: Int - ): Observable { - return Observable.just( - CommentEnvelope.builder() - .pageInfoEnvelope( - PageInfoEnvelopeFactory.pageInfoEnvelope() - ) - .comments(listOf(CommentFactory.comment())) - .commentableId(updateId) - .totalCount(1) - .build() - ) - } - - override fun getRepliesForComment(comment: Comment, cursor: String?, pageSize: Int): Observable { - return Observable.just(CommentEnvelopeFactory.emptyCommentsEnvelope()) - } - - override fun getComment(commentableId: String): Observable { - return Observable.just(CommentFactory.comment()) - } - - override fun createComment(comment: PostCommentData): Observable { - return Observable.just(CommentFactory.comment()) - } - - override fun clearUnseenActivity(): Observable { - return Observable.just(0) - } - - override fun createPassword(password: String, confirmPassword: String): Observable { - return Observable.just( - CreatePasswordMutation.Data( - CreatePasswordMutation.UpdateUserAccount( - "", - CreatePasswordMutation.User("", "sample@ksr.com", true) - ) - ) - ) - } - - override fun creatorDetails(slug: String): Observable { - return Observable.just(CreatorDetailsFactory.creatorDetails()) - } - - override fun deletePaymentSource(paymentSourceId: String): Observable { - return Observable.just(DeletePaymentSourceMutation.Data(DeletePaymentSourceMutation.PaymentSourceDelete("", ""))) - } - - override fun erroredBackings(): Observable> { - return Observable.just(Collections.singletonList(ErroredBackingFactory.erroredBacking())) - } - - override fun getStoredCards(): Observable> { - return Observable.just(Collections.singletonList(StoredCardFactory.discoverCard())) - } - - override fun savePaymentMethod(savePaymentMethodData: SavePaymentMethodData): Observable { - return Observable.just(StoredCardFactory.discoverCard()) - } - - override fun sendMessage(project: Project, recipient: User, body: String): Observable { - return Observable.just(1L) - } - - override fun updateBacking(updateBackingData: UpdateBackingData): Observable { - return Observable.just(CheckoutFactory.requiresAction(false)) - } - - override fun updateUserCurrencyPreference(currency: CurrencyCode): Observable { - return Observable.just( - UpdateUserCurrencyMutation.Data( - UpdateUserCurrencyMutation.UpdateUserProfile( - "", - UpdateUserCurrencyMutation.User("", "USD") - ) - ) - ) - } - - override fun updateUserPassword(currentPassword: String, newPassword: String, confirmPassword: String): Observable { - return Observable.just( - UpdateUserPasswordMutation.Data( - UpdateUserPasswordMutation.UpdateUserAccount( - "", - UpdateUserPasswordMutation.User("", "some@email.com", true, true) - ) - ) - ) - } - - override fun userPrivacy(): Observable { - return Observable.just( - UserPrivacyQuery.Data( - UserPrivacyQuery.Me( - "", - "Some Name", - "some@email.com", - true, - true, - true, - true, - "USD", - emptyList() - ) - ) - ) - } - - override fun triggerThirdPartyEvent(eventInput: TPEventInputData): Observable> { - return Observable.just(Pair(true, "")) - } -} diff --git a/app/src/main/java/com/kickstarter/services/ApiClient.java b/app/src/main/java/com/kickstarter/services/ApiClient.java deleted file mode 100644 index 5315185f0f..0000000000 --- a/app/src/main/java/com/kickstarter/services/ApiClient.java +++ /dev/null @@ -1,513 +0,0 @@ -package com.kickstarter.services; - -import com.google.gson.Gson; -import com.google.gson.JsonObject; -import com.kickstarter.libs.Config; -import com.kickstarter.libs.rx.operators.ApiErrorOperator; -import com.kickstarter.libs.rx.operators.Operators; -import com.kickstarter.libs.utils.extensions.AnyExtKt; -import com.kickstarter.models.Activity; -import com.kickstarter.models.Backing; -import com.kickstarter.models.Category; -import com.kickstarter.models.Location; -import com.kickstarter.models.Message; -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; -import com.kickstarter.services.apirequests.BackingBody; -import com.kickstarter.services.apirequests.LoginWithFacebookBody; -import com.kickstarter.services.apirequests.MessageBody; -import com.kickstarter.services.apirequests.ProjectNotificationBody; -import com.kickstarter.services.apirequests.PushTokenBody; -import com.kickstarter.services.apirequests.RegisterWithFacebookBody; -import com.kickstarter.services.apirequests.ResetPasswordBody; -import com.kickstarter.services.apirequests.SettingsBody; -import com.kickstarter.services.apirequests.SignupBody; -import com.kickstarter.services.apirequests.XauthBody; -import com.kickstarter.services.apiresponses.AccessTokenEnvelope; -import com.kickstarter.services.apiresponses.ActivityEnvelope; -import com.kickstarter.services.apiresponses.CategoriesEnvelope; -import com.kickstarter.services.apiresponses.DiscoverEnvelope; -import com.kickstarter.services.apiresponses.EmailVerificationEnvelope; -import com.kickstarter.services.apiresponses.MessageThreadEnvelope; -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.services.apiresponses.UpdatesEnvelope; -import com.kickstarter.ui.data.Mailbox; -import com.kickstarter.ui.data.MessageSubject; - -import java.util.Arrays; -import java.util.List; - -import androidx.annotation.NonNull; -import androidx.annotation.Nullable; -import retrofit2.Response; -import rx.Observable; -import rx.schedulers.Schedulers; - -import com.kickstarter.libs.utils.extensions.BoolenExtKt; - -public final class ApiClient implements ApiClientType { - private final ApiService service; - private final Gson gson; - - public ApiClient(final @NonNull ApiService service, final @NonNull Gson gson) { - this.gson = gson; - this.service = service; - } - - @Override - public @NonNull Observable config() { - return this.service - .config() - .lift(apiErrorOperator()) - .subscribeOn(Schedulers.io()); - } - - @Override - public @NonNull Observable fetchActivities() { - return fetchActivities(null); - } - - @Override - public @NonNull Observable fetchActivities(final @Nullable Integer count) { - final List categories = Arrays.asList( - Activity.CATEGORY_BACKING, - Activity.CATEGORY_CANCELLATION, - Activity.CATEGORY_FAILURE, - Activity.CATEGORY_LAUNCH, - Activity.CATEGORY_SUCCESS, - Activity.CATEGORY_UPDATE, - Activity.CATEGORY_FOLLOW - ); - - return this.service - .activities(categories, count) - .lift(apiErrorOperator()) - .subscribeOn(Schedulers.io()); - } - - @Override - public @NonNull Observable fetchActivitiesWithPaginationPath(final @NonNull String paginationPath) { - return this.service - .activities(paginationPath) - .lift(apiErrorOperator()) - .subscribeOn(Schedulers.io()); - } - - @Override - public @NonNull Observable> fetchCategories() { - return this.service - .categories() - .lift(apiErrorOperator()) - .map(CategoriesEnvelope::categories) - .subscribeOn(Schedulers.io()); - } - - @Override - public @NonNull Observable fetchCategory(final @NonNull String id) { - return this.service - .category(id) - .lift(apiErrorOperator()) - .subscribeOn(Schedulers.io()); - } - - @Override - public @NonNull Observable fetchCategory(final @NonNull Category category) { - return fetchCategory(String.valueOf(category.id())); - } - - @Override - public @NonNull Observable fetchCurrentUser() { - return this.service - .currentUser() - .lift(apiErrorOperator()) - .subscribeOn(Schedulers.io()); - } - - @Override - public @NonNull Observable fetchLocation(final @NonNull String param) { - return this.service.location(param) - .subscribeOn(Schedulers.io()) - .lift(apiErrorOperator()); - } - - @Override - public @NonNull Observable> fetchProjectNotifications() { - return this.service - .projectNotifications() - .lift(apiErrorOperator()) - .subscribeOn(Schedulers.io()); - } - - @Override - public @NonNull Observable fetchProject(final @NonNull String param) { - return this.service - .project(param) - .lift(apiErrorOperator()) - .subscribeOn(Schedulers.io()); - } - - @Override - public @NonNull Observable fetchProject(final @NonNull Project project) { - return fetchProject(project.param()).startWith(project); - } - - @Override - public @NonNull Observable fetchProjects(final boolean isMember) { - return this.service - .projects(isMember ? 1 : 0) - .lift(apiErrorOperator()) - .subscribeOn(Schedulers.io()); - } - - @Override - public @NonNull Observable fetchProjects(final @NonNull DiscoveryParams params) { - return this.service - .projects(params.queryParams()) - .lift(apiErrorOperator()) - .subscribeOn(Schedulers.io()); - } - - @Override - public @NonNull Observable fetchProjects(final @NonNull String paginationUrl) { - return this.service - .projects(paginationUrl) - .lift(apiErrorOperator()) - .subscribeOn(Schedulers.io()); - } - - @Override - public @NonNull Observable fetchProjectStats(final @NonNull Project project) { - return this.service - .projectStats(project.param()) - .lift(apiErrorOperator()) - .subscribeOn(Schedulers.io()); - } - - @Override - public @NonNull Observable fetchProjectBacking(final @NonNull Project project, final @NonNull User user) { - return this.service - .projectBacking(project.param(), user.param()) - .lift(apiErrorOperator()) - .subscribeOn(Schedulers.io()); - } - - @Override - public @NonNull Observable fetchMessagesForBacking(final @NonNull Backing backing) { - return this.service - .messagesForBacking(backing.projectId(), backing.backerId()) - .lift(apiErrorOperator()) - .subscribeOn(Schedulers.io()); - } - - @Override - public @NonNull Observable fetchMessagesForThread(final @NonNull MessageThread messageThread) { - return this.service - .messagesForThread(messageThread.id()) - .lift(apiErrorOperator()) - .subscribeOn(Schedulers.io()); - } - - @Override - public @NonNull Observable fetchMessagesForThread(final @NonNull Long messageThreadId) { - return this.service - .messagesForThread(messageThreadId) - .lift(apiErrorOperator()) - .subscribeOn(Schedulers.io()); - } - - @Override - public @NonNull Observable fetchMessageThreads(final @Nullable Project project, - final @NonNull Mailbox mailbox) { - - final Observable> apiResponse = project == null - ? this.service.messageThreads(mailbox.getType()) - : this.service.messageThreads(project.id(), mailbox.getType()); - - return apiResponse - .lift(apiErrorOperator()) - .subscribeOn(Schedulers.io()); - } - - @Override - public @NonNull Observable fetchMessageThreadsWithPaginationPath(final @NonNull String paginationPath) { - return this.service - .paginatedMessageThreads(paginationPath) - .lift(apiErrorOperator()) - .subscribeOn(Schedulers.io()); - } - - @Override - public @NonNull Observable 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 fetchSurveyResponse(final long surveyResponseId) { - return this.service - .surveyResponse(surveyResponseId) - .lift(apiErrorOperator()) - .subscribeOn(Schedulers.io()); - } - - @Override - public @NonNull Observable> fetchUnansweredSurveys() { - return this.service - .unansweredSurveys() - .lift(apiErrorOperator()) - .subscribeOn(Schedulers.io()); - } - - @Override - public @NonNull Observable fetchUpdate(final @NonNull String projectParam, final @NonNull String updateParam) { - return this.service - .update(projectParam, updateParam) - .lift(apiErrorOperator()) - .subscribeOn(Schedulers.io()); - } - - @Override - public @NonNull Observable fetchUpdate(final @NonNull Update update) { - final String projectParam = AnyExtKt.numToString(update.projectId()); - final String updateParam = AnyExtKt.numToString(update.id()); - - return fetchUpdate(projectParam, updateParam) - .startWith(update); - } - - @Override - public @NonNull Observable fetchUpdates(final @NonNull Project project) { - return this.service - .updates(project.param()) - .lift(apiErrorOperator()) - .subscribeOn(Schedulers.io()); - } - - @Override - public @NonNull Observable fetchUpdates(final @NonNull String paginationPath) { - return this.service - .paginatedUpdates(paginationPath) - .lift(apiErrorOperator()) - .subscribeOn(Schedulers.io()); - } - - @Override - public @NonNull Observable loginWithFacebook(final @NonNull String accessToken) { - return this.service - .login(LoginWithFacebookBody.builder().accessToken(accessToken).build()) - .lift(apiErrorOperator()) - .subscribeOn(Schedulers.io()); - } - - @Override - public @NonNull Observable loginWithFacebook(final @NonNull String fbAccessToken, final @NonNull String code) { - return this.service - .login(LoginWithFacebookBody.builder().accessToken(fbAccessToken).code(code).build()) - .lift(apiErrorOperator()) - .subscribeOn(Schedulers.io()); - } - - @Override - public @NonNull Observable login(final @NonNull String email, final @NonNull String password) { - return this.service - .login(XauthBody.builder() - .email(email) - .password(password) - .build()) - .lift(apiErrorOperator()) - .subscribeOn(Schedulers.io()); - } - - @Override - public @NonNull Observable login(final @NonNull String email, final @NonNull String password, - final @NonNull String code) { - return this.service - .login(XauthBody.builder() - .email(email) - .password(password) - .code(code) - .build()) - .lift(apiErrorOperator()) - .subscribeOn(Schedulers.io()); - } - - @Override - public @NonNull Observable markAsRead(final @NonNull MessageThread messageThread) { - return this.service - .markAsRead(messageThread.id()) - .lift(apiErrorOperator()) - .subscribeOn(Schedulers.io()); - } - - @Override - public @NonNull Observable registerPushToken(final @NonNull String token) { - return this.service - .registerPushToken(PushTokenBody.builder().token(token).pushServer("development").build()) - .lift(apiErrorOperator()) - .subscribeOn(Schedulers.io()); - } - - @Override - public @NonNull Observable registerWithFacebook(final @NonNull String fbAccessToken, final boolean sendNewsletters) { - return this.service - .login(RegisterWithFacebookBody.builder() - .accessToken(fbAccessToken) - .sendNewsletters(sendNewsletters) - .newsletterOptIn(sendNewsletters) - .build()) - .lift(apiErrorOperator()) - .subscribeOn(Schedulers.io()); - } - - @Override - public @NonNull Observable resetPassword(final @NonNull String email) { - return this.service - .resetPassword(ResetPasswordBody.builder().email(email).build()) - .lift(apiErrorOperator()) - .subscribeOn(Schedulers.io()); - } - - @Override - public @NonNull Observable sendMessage(final @NonNull MessageSubject messageSubject, final @NonNull String body) { - final MessageBody messageBody = MessageBody.builder().body(body).build(); - - return messageSubject - .value( - backing -> this.service - .sendMessageToBacking(backing.projectId(), backing.backerId(), messageBody), - messageThread -> this.service - .sendMessageToThread(messageThread.id(), messageBody), - project -> this.service - .sendMessageToProject(project.id(), messageBody) - ) - .lift(apiErrorOperator()) - .subscribeOn(Schedulers.io()); - } - - @Override - public @NonNull Observable signup(final @NonNull String name, final @NonNull String email, - final @NonNull String password, final @NonNull String passwordConfirmation, - final boolean sendNewsletters) { - return this.service - .signup( - SignupBody.builder() - .name(name) - .email(email) - .password(password) - .passwordConfirmation(passwordConfirmation) - .sendNewsletters(sendNewsletters) - .newsletterOptIn(sendNewsletters) - .build()) - .lift(apiErrorOperator()) - .subscribeOn(Schedulers.io()); - } - - @Override - public @NonNull Observable saveProject(final @NonNull Project project) { - return this.service - .starProject(project.param()) - .lift(apiErrorOperator()) - .map(StarEnvelope::project) - .subscribeOn(Schedulers.io()); - } - - @Override - public @NonNull Observable toggleProjectSave(final @NonNull Project project) { - return this.service - .toggleProjectStar(project.param()) - .lift(apiErrorOperator()) - .map(StarEnvelope::project) - .subscribeOn(Schedulers.io()); - } - - @Override - public @NonNull Observable postBacking(final @NonNull Project project, final @NonNull Backing backing, final boolean checked) { - return this.service - .putProjectBacking(project.id(), backing.backerId(), BackingBody.builder() - .backer(backing.backerId()) - .id(backing.id()) - .backerCompletedAt(checked ? 1 : 0) - .build()) - .lift(apiErrorOperator()) - .subscribeOn(Schedulers.io()); - } - - @Override - public @NonNull Observable updateProjectNotifications(final @NonNull ProjectNotification projectNotification, final boolean checked) { - return this.service - .updateProjectNotifications(projectNotification.id(), - ProjectNotificationBody.builder() - .email(checked) - .mobile(checked) - .build()) - .lift(apiErrorOperator()) - .subscribeOn(Schedulers.io()); - } - - @Override - public @NonNull Observable updateUserSettings(final @NonNull User user) { - return this.service - .updateUserSettings( - SettingsBody.builder() - .optedOutOfRecommendations(BoolenExtKt.isTrue(user.optedOutOfRecommendations()) ? 1 : 0) - .notifyMobileOfBackings(BoolenExtKt.isTrue(user.notifyMobileOfBackings())) - .notifyMobileOfComments(BoolenExtKt.isTrue(user.notifyMobileOfComments())) - .notifyMobileOfCreatorEdu(BoolenExtKt.isTrue(user.notifyMobileOfCreatorEdu())) - .notifyMobileOfFollower(BoolenExtKt.isTrue(user.notifyMobileOfFollower())) - .notifyMobileOfFriendActivity(BoolenExtKt.isTrue(user.notifyMobileOfFriendActivity())) - .notifyMobileOfMessages(BoolenExtKt.isTrue(user.notifyMobileOfMessages())) - .notifyMobileOfPostLikes(BoolenExtKt.isTrue(user.notifyMobileOfPostLikes())) - .notifyMobileOfUpdates(BoolenExtKt.isTrue(user.notifyMobileOfUpdates())) - .notifyMobileOfMarketingUpdate(BoolenExtKt.isTrue(user.notifyMobileOfMarketingUpdate())) - .notifyOfBackings(BoolenExtKt.isTrue(user.notifyOfBackings())) - .notifyOfComments(BoolenExtKt.isTrue(user.notifyOfComments())) - .notifyOfCommentReplies(BoolenExtKt.isTrue(user.notifyOfCommentReplies())) - .notifyOfCreatorDigest(BoolenExtKt.isTrue(user.notifyOfCreatorDigest())) - .notifyOfCreatorEdu(BoolenExtKt.isTrue(user.notifyOfCreatorEdu())) - .notifyOfFollower(BoolenExtKt.isTrue(user.notifyOfFollower())) - .notifyOfFriendActivity(BoolenExtKt.isTrue(user.notifyOfFriendActivity())) - .notifyOfMessages(BoolenExtKt.isTrue(user.notifyOfMessages())) - .notifyOfUpdates(BoolenExtKt.isTrue(user.notifyOfUpdates())) - .alumniNewsletter(BoolenExtKt.isTrue(user.alumniNewsletter()) ? 1 : 0) - .artsCultureNewsletter(BoolenExtKt.isTrue(user.artsCultureNewsletter()) ? 1 : 0) - .filmNewsletter(BoolenExtKt.isTrue(user.filmNewsletter()) ? 1 : 0) - .gamesNewsletter(BoolenExtKt.isTrue(user.gamesNewsletter()) ? 1 : 0) - .happeningNewsletter(BoolenExtKt.isTrue(user.happeningNewsletter()) ? 1 : 0) - .inventNewsletter(BoolenExtKt.isTrue(user.inventNewsletter()) ? 1 : 0) - .musicNewsletter(BoolenExtKt.isTrue(user.musicNewsletter()) ? 1 : 0) - .promoNewsletter(BoolenExtKt.isTrue(user.promoNewsletter()) ? 1 : 0) - .publishingNewsletter(BoolenExtKt.isTrue(user.publishingNewsletter()) ? 1 : 0) - .showPublicProfile(BoolenExtKt.isTrue(user.showPublicProfile()) ? 1 : 0) - .social(BoolenExtKt.isTrue(user.social()) ? 1 : 0) - .weeklyNewsletter(BoolenExtKt.isTrue(user.weeklyNewsletter()) ? 1 : 0) - .build()) - .lift(apiErrorOperator()) - .subscribeOn(Schedulers.io()); - } - - @NonNull - @Override - public Observable verifyEmail(final @NonNull String token) { - return this.service.verifyEmail(token) - .lift(apiErrorOperator()) - .subscribeOn(Schedulers.io()); - } - - /** - * Utility to create a new {@link ApiErrorOperator}, saves us from littering references to gson throughout the client. - */ - private @NonNull ApiErrorOperator apiErrorOperator() { - return Operators.apiError(this.gson); - } -} diff --git a/app/src/main/java/com/kickstarter/services/ApiClientType.java b/app/src/main/java/com/kickstarter/services/ApiClientType.java deleted file mode 100644 index d587d0b317..0000000000 --- a/app/src/main/java/com/kickstarter/services/ApiClientType.java +++ /dev/null @@ -1,126 +0,0 @@ -package com.kickstarter.services; - -import com.google.gson.JsonObject; -import com.kickstarter.libs.Config; -import com.kickstarter.models.Backing; -import com.kickstarter.models.Category; -import com.kickstarter.models.Location; -import com.kickstarter.models.Message; -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; -import com.kickstarter.services.apiresponses.AccessTokenEnvelope; -import com.kickstarter.services.apiresponses.ActivityEnvelope; -import com.kickstarter.services.apiresponses.DiscoverEnvelope; -import com.kickstarter.services.apiresponses.EmailVerificationEnvelope; -import com.kickstarter.services.apiresponses.MessageThreadEnvelope; -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.UpdatesEnvelope; -import com.kickstarter.ui.data.Mailbox; -import com.kickstarter.ui.data.MessageSubject; - -import java.util.List; - -import androidx.annotation.NonNull; -import androidx.annotation.Nullable; -import rx.Observable; - -public interface ApiClientType { - @NonNull Observable config(); - - @NonNull Observable fetchActivities(); - - @NonNull Observable fetchActivities(final @Nullable Integer count); - - @NonNull Observable fetchActivitiesWithPaginationPath(final @NonNull String paginationPath); - - @NonNull Observable> fetchCategories(); - - @NonNull Observable fetchCategory(final @NonNull String param); - - @NonNull Observable fetchCategory(final @NonNull Category category); - - @NonNull Observable fetchCurrentUser(); - - @NonNull Observable fetchLocation(final @NonNull String param); - - @NonNull Observable> fetchProjectNotifications(); - - @NonNull Observable fetchProject(final @NonNull String param); - - @NonNull Observable fetchProject(final @NonNull Project project); - - @NonNull Observable fetchProjects(final boolean isMember); - - @NonNull Observable fetchProjects(final @NonNull DiscoveryParams params); - - @NonNull Observable fetchProjects(final @NonNull String paginationUrl); - - @NonNull Observable fetchProjectStats(final @NonNull Project project); - - @NonNull Observable fetchProjectBacking(final @NonNull Project project, final @NonNull User user); - - @NonNull Observable fetchMessagesForBacking(final @NonNull Backing backing); - - @NonNull Observable fetchMessagesForThread(final @NonNull MessageThread messageThread); - - @NonNull Observable fetchMessagesForThread(final @NonNull Long messageThreadId); - - @NonNull Observable fetchMessageThreads(final @Nullable Project project, final @NonNull Mailbox mailbox); - - @NonNull Observable fetchMessageThreadsWithPaginationPath(final @NonNull String paginationPath); - - @NonNull Observable fetchShippingRules(final @NonNull Project project, final @NonNull Reward reward); - - @NonNull Observable fetchUpdate(final @NonNull String projectParam, final @NonNull String updateParam); - - @NonNull Observable fetchUpdate(final @NonNull Update update); - - @NonNull Observable fetchUpdates(final @NonNull Project project); - - @NonNull Observable fetchUpdates(final @NonNull String paginationPath); - - @NonNull Observable loginWithFacebook(final @NonNull String accessToken); - - @NonNull Observable loginWithFacebook(final @NonNull String fbAccessToken, final @NonNull String code); - - @NonNull Observable login(final @NonNull String email, final @NonNull String password); - - @NonNull Observable login(final @NonNull String email, final @NonNull String password, final @NonNull String code); - - @NonNull Observable markAsRead(final @NonNull MessageThread messageThread); - - @NonNull Observable postBacking(final @NonNull Project project, final @NonNull Backing backing, final boolean checked); - - @NonNull Observable registerPushToken(final @NonNull String token); - - @NonNull Observable registerWithFacebook(final @NonNull String fbAccessToken, boolean sendNewsletters); - - @NonNull Observable resetPassword(final @NonNull String email); - - @NonNull Observable sendMessage(final @NonNull MessageSubject messageSubject, final @NonNull String body); - - @NonNull Observable signup(final @NonNull String name, final @NonNull String email, final @NonNull String password, - final @NonNull String passwordConfirmation, final boolean sendNewsletters); - - @NonNull Observable saveProject(final @NonNull Project project); - - @NonNull Observable fetchSurveyResponse(final long surveyResponseId); - - @NonNull Observable toggleProjectSave(final @NonNull Project project); - - @NonNull Observable> fetchUnansweredSurveys(); - - @NonNull Observable updateProjectNotifications(final @NonNull ProjectNotification projectNotification, final boolean checked); - - @NonNull Observable updateUserSettings(final @NonNull User user); - - @NonNull Observable verifyEmail(final @NonNull String token); -} diff --git a/app/src/main/java/com/kickstarter/services/ApiService.java b/app/src/main/java/com/kickstarter/services/ApiService.java deleted file mode 100644 index 4b9bc54cd5..0000000000 --- a/app/src/main/java/com/kickstarter/services/ApiService.java +++ /dev/null @@ -1,193 +0,0 @@ -package com.kickstarter.services; - -import com.google.gson.JsonObject; -import com.kickstarter.libs.Config; -import com.kickstarter.models.Backing; -import com.kickstarter.models.Category; -import com.kickstarter.models.Location; -import com.kickstarter.models.Message; -import com.kickstarter.models.MessageThread; -import com.kickstarter.models.Project; -import com.kickstarter.models.ProjectNotification; -import com.kickstarter.models.SurveyResponse; -import com.kickstarter.models.Update; -import com.kickstarter.models.User; -import com.kickstarter.services.apirequests.BackingBody; -import com.kickstarter.services.apirequests.LoginWithFacebookBody; -import com.kickstarter.services.apirequests.MessageBody; -import com.kickstarter.services.apirequests.ProjectNotificationBody; -import com.kickstarter.services.apirequests.PushTokenBody; -import com.kickstarter.services.apirequests.RegisterWithFacebookBody; -import com.kickstarter.services.apirequests.ResetPasswordBody; -import com.kickstarter.services.apirequests.SettingsBody; -import com.kickstarter.services.apirequests.SignupBody; -import com.kickstarter.services.apirequests.XauthBody; -import com.kickstarter.services.apiresponses.AccessTokenEnvelope; -import com.kickstarter.services.apiresponses.ActivityEnvelope; -import com.kickstarter.services.apiresponses.CategoriesEnvelope; -import com.kickstarter.services.apiresponses.DiscoverEnvelope; -import com.kickstarter.services.apiresponses.EmailVerificationEnvelope; -import com.kickstarter.services.apiresponses.MessageThreadEnvelope; -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.services.apiresponses.UpdatesEnvelope; - -import java.util.List; -import java.util.Map; - -import androidx.annotation.NonNull; -import androidx.annotation.Nullable; -import retrofit2.Response; -import retrofit2.http.Body; -import retrofit2.http.GET; -import retrofit2.http.POST; -import retrofit2.http.PUT; -import retrofit2.http.Path; -import retrofit2.http.Query; -import retrofit2.http.QueryMap; -import retrofit2.http.Url; -import rx.Observable; - -public interface ApiService { - @GET("/v1/activities") - Observable> activities(@NonNull @Query("categories[]") List categories, - @Nullable @Query("count") Integer count); - - @GET - Observable> activities(@Url @NonNull String paginationUrl); - - @GET("/v1/categories") - Observable> categories(); - - @GET("/v1/categories/{param}") - Observable> category(@Path("param") String param); - - @GET("/v1/app/android/config") - Observable> config(); - - @GET("/v1/users/self") - Observable> currentUser(); - - @GET("/v1/locations/{param}") - Observable> location(@Path("param") String param); - - @POST("/xauth/access_token") - Observable> login(@Body XauthBody body); - - @PUT("/v1/facebook/access_token?intent=login") - Observable> login(@Body LoginWithFacebookBody body); - - @PUT("/v1/facebook/access_token?intent=register") - Observable> login(@Body RegisterWithFacebookBody body); - - @PUT("/v1/message_threads/{message_thread_id}/read") - Observable> markAsRead(@Path("message_thread_id") long messageThreadId); - - @GET("/v1/projects/{project_id}/backers/{backer_id}/messages") - Observable> messagesForBacking( - @Path("project_id") long projectId, @Path("backer_id") long backerId - ); - - @GET("/v1/message_threads/{message_thread_id}/messages") - Observable> messagesForThread(@Path("message_thread_id") long messageThreadId); - - @GET("/v1/message_threads/{mailbox}") - Observable> messageThreads(@Path("mailbox") String mailbox); - - @GET("/v1/projects/{project_id}/message_threads/{mailbox}") - Observable> messageThreads( - @Path("project_id") long projectId, - @Path("mailbox") String mailbox - ); - - @GET - Observable> paginatedMessageThreads(@Url String paginationPath); - - @GET("/v1/projects/{project_param}/backers/{user_param}") - Observable> projectBacking( - @Path("project_param") String projectParam, - @Path("user_param") String userParam - ); - - @PUT("/v1/projects/{project_param}/backers/{user_param}") - Observable> putProjectBacking( - @Path("project_param") long projectParam, - @Path("user_param") long userParam, - @Body BackingBody backingBody - ); - - @GET("/v1/projects/{param}") - Observable> project(@Path("param") String param); - - @GET("/v1/users/self/notifications") - Observable>> projectNotifications(); - - @GET("/v1/users/self/projects") - Observable> projects(@Query("member") int isMember); - - @GET("/v1/discover") - Observable> projects(@QueryMap Map params); - - @GET - Observable> projects(@Url String paginationUrl); - - @GET("/v1/projects/{project_param}/stats") - Observable> projectStats(@Path("project_param") String projectParam); - - @POST("/v1/users/self/push_tokens") - Observable> registerPushToken(@Body PushTokenBody body); - - @POST("/v1/users/reset") - Observable> resetPassword(@Body ResetPasswordBody body); - - @POST("/v1/message_threads/{message_thread_id}/messages") - Observable> sendMessageToThread(@Path("message_thread_id") long messageThreadId, @Body MessageBody body); - - @POST("/v1/projects/{project_id}/backers/{backer_id}/messages") - Observable> sendMessageToBacking( - @Path("project_id") long projectId, @Path("backer_id") long backerId, @Body MessageBody body - ); - - @POST("/v1/projects/{project_id}/messages") - Observable> sendMessageToProject(@Path("project_id") long projectId, @Body MessageBody body); - - @GET("/v1/projects/{project_id}/rewards/{reward_id}/shipping_rules") - Observable> shippingRules(@Path("project_id") long projectId, @Path("reward_id") long rewardId); - - @POST("/v1/users") - Observable> signup(@Body SignupBody body); - - @PUT("/v1/projects/{param}/star") - Observable> starProject(@Path("param") String param); - - @GET("/v1/users/self/surveys/{survey_response_id}") - Observable> surveyResponse(@Path("survey_response_id") long surveyResponseId); - - @POST("/v1/projects/{param}/star/toggle") - Observable> toggleProjectStar(@Path("param") String param); - - @GET("/v1/users/self/surveys/unanswered") - Observable>> unansweredSurveys(); - - @GET("/v1/projects/{project_param}/updates/{update_param}") - Observable> update(@Path("project_param") String projectParam, @Path("update_param") String updateParam); - - @GET("/v1/projects/{project_param}/updates") - Observable> updates(@Path("project_param") String projectParam); - - @GET - Observable> paginatedUpdates(@Url String paginationUrl); - - @PUT("/v1/users/self/notifications/{id}") - Observable> updateProjectNotifications(@Path("id") long projectNotificationId, - @Body ProjectNotificationBody projectNotificationBody); - - @PUT("/v1/users/self") - Observable> updateUserSettings(@Body SettingsBody body); - - @POST("/v1/users/self/verify_email") - Observable> verifyEmail(@Query("email_access_token") String token); -} diff --git a/app/src/main/java/com/kickstarter/services/ApolloClientType.kt b/app/src/main/java/com/kickstarter/services/ApolloClientType.kt deleted file mode 100644 index 61acfc6eb4..0000000000 --- a/app/src/main/java/com/kickstarter/services/ApolloClientType.kt +++ /dev/null @@ -1,107 +0,0 @@ -package com.kickstarter.services - -import CreatePasswordMutation -import DeletePaymentSourceMutation -import UpdateUserCurrencyMutation -import UpdateUserPasswordMutation -import UserPrivacyQuery -import android.util.Pair -import com.kickstarter.models.Backing -import com.kickstarter.models.Category -import com.kickstarter.models.Checkout -import com.kickstarter.models.Comment -import com.kickstarter.models.CreatorDetails -import com.kickstarter.models.ErroredBacking -import com.kickstarter.models.Location -import com.kickstarter.models.Project -import com.kickstarter.models.Reward -import com.kickstarter.models.StoredCard -import com.kickstarter.models.User -import com.kickstarter.services.apiresponses.DiscoverEnvelope -import com.kickstarter.services.apiresponses.ShippingRulesEnvelope -import com.kickstarter.services.apiresponses.commentresponse.CommentEnvelope -import com.kickstarter.services.apiresponses.updatesresponse.UpdatesGraphQlEnvelope -import com.kickstarter.services.mutations.CreateBackingData -import com.kickstarter.services.mutations.PostCommentData -import com.kickstarter.services.mutations.SavePaymentMethodData -import com.kickstarter.services.mutations.UpdateBackingData -import com.kickstarter.viewmodels.usecases.TPEventInputData -import rx.Observable -import type.CurrencyCode - -interface ApolloClientType { - fun cancelBacking(backing: Backing, note: String): Observable - - fun createBacking(createBackingData: CreateBackingData): Observable - - fun createSetupIntent(project: Project? = null): Observable - - fun getBacking(backingId: String): Observable - - fun getShippingRules(reward: Reward): Observable - - fun clearUnseenActivity(): Observable - - fun fetchCategories(): Observable> - - fun fetchCategory(param: String): Observable - - fun getProject(slug: String): Observable - - fun getProject(project: Project): Observable - - fun getProjects(discoveryParams: DiscoveryParams, cursor: String? = null): Observable - - // - Get projects from the Creator Dashboard - fun getProjects(isMember: Boolean): Observable - - fun getProjectComments(slug: String, cursor: String?, limit: Int = PAGE_SIZE): Observable - - fun getProjectUpdates(slug: String, cursor: String?, limit: Int = PAGE_SIZE): Observable - - fun getProjectUpdateComments(updateId: String, cursor: String?, limit: Int = PAGE_SIZE): Observable - - fun getRepliesForComment(comment: Comment, cursor: String? = null, pageSize: Int = REPLIES_PAGE_SIZE): Observable - - fun getComment(commentableId: String): Observable - - fun createComment(comment: PostCommentData): Observable - - fun createPassword(password: String, confirmPassword: String): Observable - - fun creatorDetails(slug: String): Observable - - fun deletePaymentSource(paymentSourceId: String): Observable - - fun erroredBackings(): Observable> - - fun getProjectBacking(slug: String): Observable - - fun getProjectAddOns(slug: String, locationId: Location): Observable> - - fun watchProject(project: Project): Observable - - fun unWatchProject(project: Project): Observable - - fun getStoredCards(): Observable> - - fun savePaymentMethod(savePaymentMethodData: SavePaymentMethodData): Observable - - fun sendMessage(project: Project, recipient: User, body: String): Observable - - fun updateBacking(updateBackingData: UpdateBackingData): Observable - - fun updateUserCurrencyPreference(currency: CurrencyCode): Observable - - fun updateUserPassword(currentPassword: String = "", newPassword: String, confirmPassword: String): Observable - - fun userPrivacy(): Observable - - fun triggerThirdPartyEvent(eventInput: TPEventInputData): Observable> -} - -private const val PAGE_SIZE = 25 - -const val DISCOVERY_PAGE_SIZE = 15 - -private const val REPLIES_PAGE_SIZE = 7 diff --git a/app/src/main/java/com/kickstarter/services/KSApolloClient.kt b/app/src/main/java/com/kickstarter/services/KSApolloClient.kt deleted file mode 100644 index 7ec45de697..0000000000 --- a/app/src/main/java/com/kickstarter/services/KSApolloClient.kt +++ /dev/null @@ -1,1289 +0,0 @@ -package com.kickstarter.services - -import CancelBackingMutation -import ClearUserUnseenActivityMutation -import CreateBackingMutation -import CreatePasswordMutation -import DeletePaymentSourceMutation -import ErroredBackingsQuery -import FetchProjectsQuery -import GetProjectBackingQuery -import GetRootCategoriesQuery -import GetShippingRulesForRewardIdQuery -import ProjectCreatorDetailsQuery -import SavePaymentMethodMutation -import SendMessageMutation -import TriggerThirdPartyEventMutation -import UnwatchProjectMutation -import UpdateBackingMutation -import UpdateUserCurrencyMutation -import UpdateUserPasswordMutation -import UserPaymentsQuery -import UserPrivacyQuery -import WatchProjectMutation -import android.util.Pair -import com.apollographql.apollo.ApolloCall -import com.apollographql.apollo.ApolloClient -import com.apollographql.apollo.api.Response -import com.apollographql.apollo.exception.ApolloException -import com.kickstarter.libs.utils.extensions.isNotNull -import com.kickstarter.libs.utils.extensions.isNull -import com.kickstarter.libs.utils.extensions.toBoolean -import com.kickstarter.libs.utils.extensions.toProjectSort -import com.kickstarter.models.Backing -import com.kickstarter.models.Category -import com.kickstarter.models.Checkout -import com.kickstarter.models.Comment -import com.kickstarter.models.CreatorDetails -import com.kickstarter.models.ErroredBacking -import com.kickstarter.models.Location -import com.kickstarter.models.Project -import com.kickstarter.models.Reward -import com.kickstarter.models.StoredCard -import com.kickstarter.models.User -import com.kickstarter.services.apiresponses.DiscoverEnvelope -import com.kickstarter.services.apiresponses.ShippingRulesEnvelope -import com.kickstarter.services.apiresponses.commentresponse.CommentEnvelope -import com.kickstarter.services.apiresponses.commentresponse.PageInfoEnvelope -import com.kickstarter.services.apiresponses.updatesresponse.UpdatesGraphQlEnvelope -import com.kickstarter.services.mutations.CreateBackingData -import com.kickstarter.services.mutations.PostCommentData -import com.kickstarter.services.mutations.SavePaymentMethodData -import com.kickstarter.services.mutations.UpdateBackingData -import com.kickstarter.services.transformers.backingTransformer -import com.kickstarter.services.transformers.categoryTransformer -import com.kickstarter.services.transformers.commentTransformer -import com.kickstarter.services.transformers.complexRewardItemsTransformer -import com.kickstarter.services.transformers.decodeRelayId -import com.kickstarter.services.transformers.encodeRelayId -import com.kickstarter.services.transformers.getTriggerThirdPartyEventMutation -import com.kickstarter.services.transformers.projectTransformer -import com.kickstarter.services.transformers.rewardTransformer -import com.kickstarter.services.transformers.shippingRulesListTransformer -import com.kickstarter.services.transformers.updateTransformer -import com.kickstarter.viewmodels.usecases.TPEventInputData -import rx.Observable -import rx.schedulers.Schedulers -import rx.subjects.PublishSubject -import type.BackingState -import type.CurrencyCode -import type.PaymentTypes - -class KSApolloClient(val service: ApolloClient) : ApolloClientType { - - override fun cancelBacking(backing: Backing, note: String): Observable { - return Observable.defer { - val ps = PublishSubject.create() - service.mutate( - CancelBackingMutation.builder() - .backingId(encodeRelayId(backing)) - .note(note) - .build() - ) - .enqueue(object : ApolloCall.Callback() { - override fun onFailure(exception: ApolloException) { - ps.onError(exception) - } - - override fun onResponse(response: Response) { - if (response.hasErrors()) { - ps.onNext(response.errors?.first()?.message) - } else { - val state = response.data?.cancelBacking()?.backing()?.status() - val success = state == BackingState.CANCELED - ps.onNext(success) - } - ps.onCompleted() - } - }) - return@defer ps - } - } - - override fun createSetupIntent(project: Project?): Observable { - return Observable.defer { - val createSetupIntentMut = CreateSetupIntentMutation.builder() - .apply { - if (project != null) this.projectId(encodeRelayId(project)) - } - .build() - - val ps = PublishSubject.create() - this.service.mutate(createSetupIntentMut) - .enqueue(object : ApolloCall.Callback() { - override fun onFailure(exception: ApolloException) { - ps.onError(exception) - } - - override fun onResponse(response: Response) { - if (response.hasErrors()) ps.onError(java.lang.Exception(response.errors?.first()?.message)) - else { - ps.onNext(response.data?.createSetupIntent()?.clientSecret()) - } - ps.onCompleted() - } - }) - return@defer ps - } - } - - override fun createBacking(createBackingData: CreateBackingData): Observable { - return Observable.defer { - val createBackingMutation = CreateBackingMutation.builder() - .projectId(encodeRelayId(createBackingData.project)) - .amount(createBackingData.amount) - .paymentType(PaymentTypes.CREDIT_CARD.rawValue()) - .paymentSourceId(createBackingData.paymentSourceId) - .setupIntentClientSecret(createBackingData.setupIntentClientSecret) - .locationId(createBackingData.locationId?.let { it }) - .rewardIds(createBackingData.rewardsIds?.let { list -> list.map { encodeRelayId(it) } }) - .refParam(createBackingData.refTag?.tag()) - .build() - - val ps = PublishSubject.create() - - this.service.mutate(createBackingMutation) - .enqueue(object : ApolloCall.Callback() { - override fun onFailure(exception: ApolloException) { - ps.onError(exception) - } - - override fun onResponse(response: Response) { - if (response.hasErrors()) { - ps.onError(java.lang.Exception(response.errors?.first()?.message)) - } - - val checkoutPayload = response.data?.createBacking()?.checkout() - - // TODO: Add new status field to backing model - val backing = Checkout.Backing.builder() - .clientSecret( - checkoutPayload?.backing()?.fragments()?.checkoutBacking() - ?.clientSecret() - ) - .requiresAction( - checkoutPayload?.backing()?.fragments()?.checkoutBacking() - ?.requiresAction() ?: false - ) - .build() - - ps.onNext( - Checkout.builder() - .id(decodeRelayId(checkoutPayload?.id())) - .backing(backing) - .build() - ) - ps.onCompleted() - } - }) - return@defer ps - } - } - - override fun getBacking(backingId: String): Observable { - return Observable.defer { - val ps = PublishSubject.create() - - this.service.query( - GetBackingQuery.builder() - .backingId(backingId).build() - ) - .enqueue(object : ApolloCall.Callback() { - override fun onFailure(e: ApolloException) { - ps.onError(e) - } - - override fun onResponse(response: Response) { - response.data?.let { data -> - Observable.just(data.backing()) - .filter { it?.fragments()?.backing() != null } - .map { backingObj -> - backingTransformer( - backingObj?.fragments()?.backing() - ) - } - .filter { it.isNotNull() } - .subscribe { - ps.onNext(it) - ps.onCompleted() - } - } - } - }) - return@defer ps - }.subscribeOn(Schedulers.io()) - } - - override fun clearUnseenActivity(): Observable { - return Observable.defer { - val ps = PublishSubject.create() - service.mutate( - ClearUserUnseenActivityMutation.builder() - .build() - ) - .enqueue(object : ApolloCall.Callback() { - override fun onFailure(exception: ApolloException) { - ps.onError(exception) - } - - override fun onResponse(response: Response) { - if (response.hasErrors()) { - ps.onError(java.lang.Exception(response.errors?.first()?.message)) - } - response.data?.clearUserUnseenActivity()?.activityIndicatorCount().let { - handleResponse(it, ps) - } - } - }) - return@defer ps - } - } - - override fun getProjectUpdates( - slug: String, - cursor: String?, - limit: Int - ): Observable { - return Observable.defer { - val ps = PublishSubject.create() - - this.service.query( - GetProjectUpdatesQuery.builder() - .cursor(cursor) - .slug(slug) - .limit(limit) - .build() - ) - .enqueue(object : ApolloCall.Callback() { - override fun onFailure(e: ApolloException) { - ps.onError(e) - } - - override fun onResponse(response: Response) { - response.data?.let { data -> - Observable.just(data.project()) - .filter { it?.posts() != null } - .map { project -> - - val updates = project?.posts()?.edges()?.map { edge -> - updateTransformer( - edge?.node()?.fragments()?.post() - ).toBuilder() - .build() - } - - UpdatesGraphQlEnvelope.builder() - .updates(updates) - .totalCount(project?.posts()?.totalCount() ?: 0) - .pageInfoEnvelope( - createPageInfoObject( - project?.posts()?.pageInfo()?.fragments() - ?.pageInfo() - ) - ) - .build() - } - .filter { it.isNotNull() } - .subscribe { - ps.onNext(it) - ps.onCompleted() - } - } - } - }) - return@defer ps - }.subscribeOn(Schedulers.io()) - } - - override fun getProjectComments( - slug: String, - cursor: String?, - limit: Int - ): Observable { - return Observable.defer { - val ps = PublishSubject.create() - - this.service.query( - GetProjectCommentsQuery.builder() - .cursor(cursor) - .slug(slug) - .limit(limit) - .build() - ) - .enqueue(object : ApolloCall.Callback() { - override fun onFailure(e: ApolloException) { - ps.onError(e) - } - - override fun onResponse(response: Response) { - response.data?.let { data -> - Observable.just(data.project()) - .filter { it?.comments() != null } - .map { project -> - - val comments = project?.comments()?.edges()?.map { edge -> - commentTransformer( - edge?.node()?.fragments()?.comment() - ).toBuilder() - .cursor(edge?.cursor()) - .build() - } - - CommentEnvelope.builder() - .commentableId(project?.id()) - .comments(comments) - .totalCount(project?.comments()?.totalCount() ?: 0) - .pageInfoEnvelope( - createPageInfoObject( - project?.comments()?.pageInfo()?.fragments() - ?.pageInfo() - ) - ) - .build() - } - .filter { it.isNotNull() } - .subscribe { - ps.onNext(it) - ps.onCompleted() - } - } - } - }) - return@defer ps - }.subscribeOn(Schedulers.io()) - } - - override fun getProjectUpdateComments( - updateId: String, - cursor: String?, - limit: Int - ): Observable { - return Observable.defer { - val ps = PublishSubject.create() - - this.service.query( - GetProjectUpdateCommentsQuery.builder() - .cursor(cursor) - .id(updateId) - .limit(limit) - .build() - ) - .enqueue(object : ApolloCall.Callback() { - override fun onFailure(e: ApolloException) { - ps.onError(e) - } - - override fun onResponse(response: Response) { - response.data?.let { data -> - Observable.just(data.post()) - .filter { it?.fragments()?.freeformPost()?.comments() != null } - .map { post -> - - val comments = - post?.fragments()?.freeformPost()?.comments()?.edges() - ?.map { edge -> - commentTransformer( - edge?.node()?.fragments()?.comment() - ).toBuilder() - .cursor(edge?.cursor()) - .build() - } - - CommentEnvelope.builder() - .comments(comments) - .commentableId(post?.id()) - .totalCount( - post?.fragments()?.freeformPost()?.comments() - ?.totalCount() ?: 0 - ) - .pageInfoEnvelope( - createPageInfoObject( - post?.fragments()?.freeformPost()?.comments() - ?.pageInfo()?.fragments()?.pageInfo() - ) - ) - .build() - } - .filter { it.isNotNull() } - .subscribe { - ps.onNext(it) - ps.onCompleted() - } - } - } - }) - return@defer ps - }.subscribeOn(Schedulers.io()) - } - - override fun getRepliesForComment( - comment: Comment, - cursor: String?, - pageSize: Int - ): Observable { - return Observable.defer { - val ps = PublishSubject.create() - this.service.query( - GetRepliesForCommentQuery.builder() - .commentableId(encodeRelayId(comment)) - .cursor(cursor) - .pageSize(pageSize) - .build() - ).enqueue(object : ApolloCall.Callback() { - override fun onFailure(e: ApolloException) { - ps.onError(e) - } - - override fun onResponse(response: Response) { - response.data?.let { responseData -> - Observable.just(createCommentEnvelop(responseData)) - .subscribe { - ps.onNext(it) - ps.onCompleted() - } - } - } - }) - return@defer ps - }.subscribeOn(Schedulers.io()) - } - - override fun getProject(project: Project): Observable { - return getProject(project.slug() ?: "") - } - - override fun getProject(slug: String): Observable { - return Observable.defer { - val ps = PublishSubject.create() - this.service.query( - FetchProjectQuery.builder() - .slug(slug) - .build() - ).enqueue(object : ApolloCall.Callback() { - override fun onFailure(e: ApolloException) { - ps.onError(e) - } - - override fun onResponse(response: Response) { - response.data?.let { responseData -> - Observable.just( - projectTransformer( - responseData.project()?.fragments()?.fullProject() - ) - ) - .subscribeOn(Schedulers.io()) - .subscribe { - ps.onNext(it) - ps.onCompleted() - } - } - } - }) - return@defer ps - }.subscribeOn(Schedulers.io()) - } - - override fun fetchCategories(): Observable> { - return Observable.defer { - val ps = PublishSubject.create>() - this.service.query( - GetRootCategoriesQuery.builder() - .build() - ).enqueue(object : ApolloCall.Callback() { - override fun onFailure(e: ApolloException) { - ps.onError(e) - } - - override fun onResponse(response: Response) { - response.data?.let { responseData -> - val subCategories = responseData.rootCategories() - .flatMap { it.subcategories()?.nodes().orEmpty() } - .map { - categoryTransformer(it.fragments().category()) - } - val rootCategories = responseData.rootCategories() - .map { categoryTransformer(it.fragments().category()) }.toMutableList() - .apply { - addAll(subCategories) - } - Observable.just(rootCategories) - .subscribeOn(Schedulers.io()) - .subscribe { - ps.onNext(it) - ps.onCompleted() - } - } - } - }) - return@defer ps - }.subscribeOn(Schedulers.io()) - } - - override fun fetchCategory(categoryParam: String): Observable { - return Observable.defer { - val ps = PublishSubject.create() - this.service.query( - FetchCategoryQuery.builder() - .categoryParam(categoryParam) - .build() - ).enqueue(object : ApolloCall.Callback() { - override fun onFailure(e: ApolloException) { - ps.onError(e) - } - - override fun onResponse(response: Response) { - response.data?.let { responseData -> - val category = categoryTransformer(responseData.category()?.fragments()?.category()) - - Observable.just(category) - .subscribeOn(Schedulers.io()) - .subscribe { - ps.onNext(it) - ps.onCompleted() - } - } - } - }) - return@defer ps - }.subscribeOn(Schedulers.io()) - } - - override fun getProjects( - discoveryParams: DiscoveryParams, - slug: String? - ): Observable { - return Observable.defer { - val ps = PublishSubject.create() - this.service.query( - buildFetchProjectsQuery(discoveryParams, slug) - ).enqueue(object : ApolloCall.Callback() { - override fun onFailure(e: ApolloException) { - ps.onError(e) - } - - override fun onResponse(response: Response) { - response.data?.let { responseData -> - val projects = responseData.projects()?.edges()?.map { - projectTransformer(it.node()?.fragments()?.projectCard()) - } - val pageInfoEnvelope = - responseData.projects()?.pageInfo()?.fragments()?.pageInfo()?.let { - createPageInfoObject(it) - } - val discoverEnvelope = DiscoverEnvelope.builder() - .projects(projects) - .pageInfoEnvelope(pageInfoEnvelope) - .build() - Observable.just(discoverEnvelope) - .subscribeOn(Schedulers.io()) - .subscribe { - ps.onNext(it) - ps.onCompleted() - } - } - } - }) - return@defer ps - }.subscribeOn(Schedulers.io()) - } - - private fun buildFetchProjectsQuery( - discoveryParams: DiscoveryParams, - slug: String? - ): FetchProjectsQuery { - val query = FetchProjectsQuery.builder() - .sort(discoveryParams.sort()?.toProjectSort()) - .apply { - slug?.let { cursor -> this.cursor(cursor) } - discoveryParams.category()?.id()?.let { id -> this.categoryId(id.toString()) } - discoveryParams.recommended() - ?.let { isRecommended -> this.recommended(isRecommended) } - discoveryParams.starred()?.let { isStarred -> this.starred(isStarred.toBoolean()) } - discoveryParams.backed()?.let { isBacked -> this.backed(isBacked.toBoolean()) } - discoveryParams.staffPicks()?.let { isPicked -> this.staffPicks(isPicked) } - } - .build() - - return query - } - - override fun getProjects(isMember: Boolean): Observable { - return Observable.defer { - val ps = PublishSubject.create() - return@defer ps - }.subscribeOn(Schedulers.io()) - } - - override fun getComment(commentableId: String): Observable { - return Observable.defer { - val ps = PublishSubject.create() - this.service.query( - GetCommentQuery.builder() - .commentableId(commentableId) - .build() - ).enqueue(object : ApolloCall.Callback() { - override fun onFailure(e: ApolloException) { - ps.onError(e) - } - - override fun onResponse(response: Response) { - response.data?.let { responseData -> - Observable.just(mapGetCommentQueryResponseToComment(responseData)) - .subscribe { - ps.onNext(it) - ps.onCompleted() - } - } - } - }) - return@defer ps - }.subscribeOn(Schedulers.io()) - } - - override fun createComment(comment: PostCommentData): Observable { - return Observable.defer { - val ps = PublishSubject.create() - this.service.mutate( - CreateCommentMutation.builder() - .parentId(comment.parent?.let { encodeRelayId(it) }) - .commentableId(comment.commentableId) - .clientMutationId(comment.clientMutationId) - .body(comment.body) - .build() - ) - .enqueue(object : ApolloCall.Callback() { - override fun onFailure(exception: ApolloException) { - ps.onError(exception) - } - - override fun onResponse(response: Response) { - if (response.hasErrors()) { - ps.onError(java.lang.Exception(response.errors?.first()?.message)) - } - /* make a copy of what you posted. just in case - * we want to update the list without doing - * a full refresh. - */ - ps.onNext( - commentTransformer( - response.data?.createComment()?.comment()?.fragments()?.comment() - ) - ) - ps.onCompleted() - } - }) - return@defer ps - } - } - - override fun createPassword( - password: String, - confirmPassword: String - ): Observable { - return Observable.defer { - val ps = PublishSubject.create() - service.mutate( - CreatePasswordMutation.builder() - .password(password) - .passwordConfirmation(confirmPassword) - .build() - ) - .enqueue(object : ApolloCall.Callback() { - override fun onFailure(exception: ApolloException) { - ps.onError(exception) - } - - override fun onResponse(response: Response) { - if (response.hasErrors()) { - ps.onError(java.lang.Exception(response.errors?.first()?.message)) - } - ps.onNext(response.data) - ps.onCompleted() - } - }) - return@defer ps - } - } - - override fun creatorDetails(slug: String): Observable { - return Observable.defer { - val ps = PublishSubject.create() - service.query( - ProjectCreatorDetailsQuery.builder() - .slug(slug) - .build() - ) - .enqueue(object : ApolloCall.Callback() { - override fun onFailure(exception: ApolloException) { - ps.onError(exception) - } - - override fun onResponse(response: Response) { - if (response.hasErrors()) { - ps.onError(Exception(response.errors?.first()?.message)) - } - - response.data?.project()?.creator()?.let { - ps.onNext( - CreatorDetails.builder() - .backingsCount(it.backingsCount()) - .launchedProjectsCount(it.launchedProjects()?.totalCount() ?: 1) - .build() - ) - ps.onCompleted() - } - } - }) - return@defer ps - } - } - - override fun deletePaymentSource(paymentSourceId: String): Observable { - return Observable.defer { - val ps = PublishSubject.create() - service.mutate( - DeletePaymentSourceMutation.builder() - .paymentSourceId(paymentSourceId) - .build() - ) - .enqueue(object : ApolloCall.Callback() { - override fun onFailure(exception: ApolloException) { - ps.onError(exception) - } - - override fun onResponse(response: Response) { - if (response.hasErrors()) { - ps.onError(Exception(response.errors?.first()?.message)) - } - ps.onNext(response.data) - ps.onCompleted() - } - }) - return@defer ps - } - } - - override fun erroredBackings(): Observable> { - return Observable.defer { - val ps = PublishSubject.create>() - this.service.query(ErroredBackingsQuery.builder().build()) - .enqueue(object : ApolloCall.Callback() { - override fun onFailure(exception: ApolloException) { - ps.onError(exception) - } - - override fun onResponse(response: Response) { - if (response.hasErrors()) { - ps.onError(Exception(response.errors?.first()?.message)) - } else { - Observable.just(response.data) - .map { cards -> cards?.me()?.backings()?.nodes() } - .map { list -> - val erroredBackings = list?.asSequence()?.map { - val project = ErroredBacking.Project.builder() - .finalCollectionDate( - it.project()?.finalCollectionDate() - ) - .name(it.project()?.name()) - .slug(it.project()?.slug()) - .build() - ErroredBacking.builder() - .project(project) - .build() - } - erroredBackings?.toList() ?: listOf() - } - .subscribe { - ps.onNext(it) - ps.onCompleted() - } - } - } - }) - return@defer ps - } - } - - override fun getProjectBacking(slug: String): Observable { - return Observable.defer { - val ps = PublishSubject.create() - - this.service.query( - GetProjectBackingQuery.builder() - .slug(slug) - .build() - ) - .enqueue(object : ApolloCall.Callback() { - override fun onFailure(e: ApolloException) { - ps.onError(e) - } - - override fun onResponse(response: Response) { - response.data?.let { data -> - Observable.just(data.project()?.backing()) - .filter { it?.fragments()?.backing() != null } - .map { backingObj -> - backingTransformer( - backingObj?.fragments()?.backing() - ) - } - .subscribe { - ps.onNext(it) - ps.onCompleted() - } - } - } - }) - return@defer ps - }.subscribeOn(Schedulers.io()) - } - - override fun getShippingRules(reward: Reward): Observable { - return Observable.defer { - val ps = PublishSubject.create() - - this.service.query( - GetShippingRulesForRewardIdQuery.builder() - .rewardId(encodeRelayId(reward)) - .build() - ) - .enqueue(object : ApolloCall.Callback() { - override fun onFailure(e: ApolloException) { - ps.onError(e) - } - - override fun onResponse(response: Response) { - response.data?.let { data -> - Observable.just(data?.node() as? GetShippingRulesForRewardIdQuery.AsReward) - .filter { !it?.shippingRulesExpanded()?.nodes().isNullOrEmpty() } - .map { - it?.shippingRulesExpanded()?.nodes()?.mapNotNull { node -> - node.fragments().shippingRule() - } - } - .filter { it.isNotNull() } - .subscribe { shippingList -> - val shippingEnvelope = shippingRulesListTransformer(shippingList ?: emptyList()) - ps.onNext(shippingEnvelope) - ps.onCompleted() - } - } - } - }) - return@defer ps - }.subscribeOn(Schedulers.io()) - } - - override fun getProjectAddOns(slug: String, locationId: Location): Observable> { - return Observable.defer { - val ps = PublishSubject.create>() - - this.service.query( - GetProjectAddOnsQuery.builder() - .slug(slug) - .locationId(encodeRelayId(locationId)) - .build() - ) - .enqueue(object : ApolloCall.Callback() { - override fun onFailure(e: ApolloException) { - ps.onError(e) - } - - override fun onResponse(response: Response) { - response.data?.let { data -> - Observable.just(data.project()?.addOns()) - .filter { it?.nodes() != null } - .map> { addOnsList -> - addOnsList?.let { - getAddOnsFromProject( - it - ) - } ?: emptyList() - } - .subscribe { - ps.onNext(it) - ps.onCompleted() - } - } - } - }) - return@defer ps - } - } - - override fun watchProject(project: Project): Observable { - return Observable.defer { - val ps = PublishSubject.create() - this.service.mutate( - WatchProjectMutation.builder().id(encodeRelayId(project)).build() - ) - .enqueue(object : ApolloCall.Callback() { - override fun onFailure(exception: ApolloException) { - ps.onError(exception) - } - - override fun onResponse(response: Response) { - if (response.hasErrors()) { - ps.onError(java.lang.Exception(response.errors?.first()?.message)) - } - /* make a copy of what you posted. just in case - * we want to update the list without doing - * a full refresh. - */ - ps.onNext( - projectTransformer( - response.data?.watchProject()?.project()?.fragments()?.fullProject() - ) - ) - ps.onCompleted() - } - }) - return@defer ps - } - } - - override fun unWatchProject(project: Project): Observable { - return Observable.defer { - val ps = PublishSubject.create() - this.service.mutate( - UnwatchProjectMutation.builder().id(encodeRelayId(project)).build() - ) - .enqueue(object : ApolloCall.Callback() { - override fun onFailure(exception: ApolloException) { - ps.onError(exception) - } - - override fun onResponse(response: Response) { - if (response.hasErrors()) { - ps.onError(java.lang.Exception(response.errors?.first()?.message)) - } - /* make a copy of what you posted. just in case - * we want to update the list without doing - * a full refresh. - */ - ps.onNext( - projectTransformer( - response.data?.watchProject()?.project()?.fragments()?.fullProject() - ) - ) - ps.onCompleted() - } - }) - return@defer ps - } - } - - private fun getAddOnsFromProject(addOnsGr: GetProjectAddOnsQuery.AddOns): List { - return addOnsGr.nodes()?.map { node -> - val shippingRulesGr = - node.shippingRulesExpanded()?.nodes()?.map { it.fragments().shippingRule() } - ?: emptyList() - rewardTransformer( - node.fragments().reward(), - shippingRulesGr, - addOnItems = complexRewardItemsTransformer(node.items()?.fragments()?.rewardItems()) - ) - }?.toList() ?: emptyList() - } - - override fun getStoredCards(): Observable> { - return Observable.defer { - val ps = PublishSubject.create>() - this.service.query(UserPaymentsQuery.builder().build()) - .enqueue(object : ApolloCall.Callback() { - override fun onFailure(exception: ApolloException) { - ps.onError(exception) - } - - override fun onResponse(response: Response) { - if (response.hasErrors()) { - ps.onError(Exception(response.errors?.first()?.message)) - } else { - Observable.just(response.data) - .map { cards -> cards?.me()?.storedCards()?.nodes() } - .map { list -> - val storedCards = list?.asSequence()?.map { - StoredCard.builder() - .expiration(it.expirationDate()) - .id(it.id()) - .lastFourDigits(it.lastFour()) - .type(it.type()) - .build() - } - storedCards?.toList() ?: listOf() - } - .subscribe { - ps.onNext(it) - ps.onCompleted() - } - } - } - }) - return@defer ps - } - } - - override fun savePaymentMethod(savePaymentMethodData: SavePaymentMethodData): Observable { - return Observable.defer { - val ps = PublishSubject.create() - service.mutate( - SavePaymentMethodMutation.builder() - .paymentType(savePaymentMethodData.paymentType) - .stripeToken(savePaymentMethodData.stripeToken) - .stripeCardId(savePaymentMethodData.stripeCardId) - .reusable(savePaymentMethodData.reusable) - .intentClientSecret(savePaymentMethodData.intentClientSecret) - .build() - ) - .enqueue(object : ApolloCall.Callback() { - override fun onFailure(exception: ApolloException) { - ps.onError(exception) - } - - override fun onResponse(response: Response) { - if (response.hasErrors()) { - ps.onError(Exception(response.errors?.first()?.message)) - } - - val paymentSource = response.data?.createPaymentSource()?.paymentSource() - paymentSource?.let { - val storedCard = StoredCard.builder() - .expiration(it.expirationDate()) - .id(it.id()) - .lastFourDigits(it.lastFour()) - .type(it.type()) - .build() - ps.onNext(storedCard) - ps.onCompleted() - } - } - }) - return@defer ps - } - } - - override fun sendMessage(project: Project, recipient: User, body: String): Observable { - return Observable.defer { - val ps = PublishSubject.create() - service.mutate( - SendMessageMutation.builder() - .projectId(encodeRelayId(project)) - .recipientId(encodeRelayId(recipient)) - .body(body) - .build() - ) - .enqueue(object : ApolloCall.Callback() { - override fun onFailure(exception: ApolloException) { - ps.onError(exception) - } - - override fun onResponse(response: Response) { - if (response.hasErrors()) { - ps.onError(Exception(response.errors?.first()?.message)) - } - handleResponse( - decodeRelayId( - response.data?.sendMessage()?.conversation()?.id() - ), - ps - ) - } - }) - return@defer ps - } - } - - override fun updateBacking(updateBackingData: UpdateBackingData): Observable { - return Observable.defer { - val updateBackingMutation = UpdateBackingMutation.builder() - .backingId(encodeRelayId(updateBackingData.backing)) - .amount(updateBackingData.amount.toString()) - .locationId(updateBackingData.locationId) - .rewardIds(updateBackingData.rewardsIds?.let { list -> list.map { encodeRelayId(it) } }) - .apply { - updateBackingData.paymentSourceId?.let { this.paymentSourceId(it) } - updateBackingData.intentClientSecret?.let { this.intentClientSecret(it) } - } - .build() - - val ps = PublishSubject.create() - service.mutate(updateBackingMutation) - .enqueue(object : ApolloCall.Callback() { - override fun onFailure(exception: ApolloException) { - ps.onError(exception) - } - - override fun onResponse(response: Response) { - if (response.hasErrors()) { - ps.onError(java.lang.Exception(response.errors?.first()?.message)) - } - - val checkoutPayload = response.data?.updateBacking()?.checkout() - val backing = Checkout.Backing.builder() - .clientSecret( - checkoutPayload?.backing()?.fragments()?.checkoutBacking() - ?.clientSecret() - ) - .requiresAction( - checkoutPayload?.backing()?.fragments()?.checkoutBacking() - ?.requiresAction() ?: false - ) - .build() - - ps.onNext( - Checkout.builder() - .id(decodeRelayId(checkoutPayload?.id())) - .backing(backing) - .build() - ) - ps.onCompleted() - } - }) - return@defer ps - } - } - - override fun updateUserCurrencyPreference(currency: CurrencyCode): Observable { - return Observable.defer { - val ps = PublishSubject.create() - service.mutate( - UpdateUserCurrencyMutation.builder() - .chosenCurrency(currency) - .build() - ) - .enqueue(object : ApolloCall.Callback() { - override fun onFailure(exception: ApolloException) { - ps.onError(exception) - } - - override fun onResponse(response: Response) { - if (response.hasErrors()) { - ps.onError(Exception(response.errors?.first()?.message)) - } - ps.onNext(response.data) - ps.onCompleted() - } - }) - return@defer ps - } - } - - override fun updateUserPassword( - currentPassword: String, - newPassword: String, - confirmPassword: String - ): Observable { - return Observable.defer { - val ps = PublishSubject.create() - service.mutate( - UpdateUserPasswordMutation.builder() - .currentPassword(currentPassword) - .password(newPassword) - .passwordConfirmation(confirmPassword) - .build() - ) - .enqueue(object : ApolloCall.Callback() { - override fun onFailure(exception: ApolloException) { - ps.onError(exception) - } - - override fun onResponse(response: Response) { - if (response.hasErrors()) { - ps.onError(Exception(response.errors?.first()?.message)) - } - ps.onNext(response.data) - ps.onCompleted() - } - }) - return@defer ps - } - } - - override fun userPrivacy(): Observable { - return Observable.defer { - val ps = PublishSubject.create() - service.query(UserPrivacyQuery.builder().build()) - .enqueue(object : ApolloCall.Callback() { - override fun onFailure(exception: ApolloException) { - ps.onError(exception) - } - - override fun onResponse(response: Response) { - ps.onNext(response.data) - ps.onCompleted() - } - }) - return@defer ps - } - } - override fun triggerThirdPartyEvent(eventInput: TPEventInputData): Observable> { - return Observable.defer { - val ps = PublishSubject.create>() - - val mutation = getTriggerThirdPartyEventMutation(eventInput) - - service.mutate(mutation) - .enqueue(object : ApolloCall.Callback() { - override fun onFailure(exception: ApolloException) { - ps.onError(exception) - } - - override fun onResponse(response: Response) { - if (response.hasErrors()) { - ps.onError(Exception(response.errors?.first()?.message ?: "")) - } - - response.data?.let { - val message = it.triggerThirdPartyEvent()?.message() ?: "" - val isSuccess = it.triggerThirdPartyEvent()?.success() ?: false - ps.onNext(Pair(isSuccess, message)) - } - ps.onCompleted() - } - }) - return@defer ps - } - } -} - -private fun createPageInfoObject(pageFr: fragment.PageInfo?): PageInfoEnvelope { - return PageInfoEnvelope.builder() - .endCursor(pageFr?.endCursor() ?: "") - .hasNextPage(pageFr?.hasNextPage() ?: false) - .hasPreviousPage(pageFr?.hasPreviousPage() ?: false) - .startCursor(pageFr?.startCursor() ?: "") - .build() -} - -private fun createCommentEnvelop(responseData: GetRepliesForCommentQuery.Data): CommentEnvelope { - val replies = (responseData.commentable() as? GetRepliesForCommentQuery.AsComment)?.replies() - val listOfComments = replies?.nodes()?.map { commentFragment -> - commentTransformer(commentFragment.fragments().comment()) - } ?: emptyList() - val totalCount = replies?.totalCount() ?: 0 - val pageInfo = createPageInfoObject(replies?.pageInfo()?.fragments()?.pageInfo()) - - return CommentEnvelope.builder() - .comments(listOfComments) - .pageInfoEnvelope(pageInfo) - .totalCount(totalCount) - .build() -} - -private fun mapGetCommentQueryResponseToComment(responseData: GetCommentQuery.Data): Comment { - val commentFragment = - (responseData.commentable() as? GetCommentQuery.AsComment)?.fragments()?.comment() - return commentTransformer(commentFragment) -} - -private fun handleResponse(it: T, ps: PublishSubject) { - when { - it.isNull() -> { - ps.onError(Exception()) - } - else -> { - ps.onNext(it) - ps.onCompleted() - } - } -} diff --git a/app/src/main/java/com/kickstarter/services/firebase/ResetDeviceIdWorker.kt b/app/src/main/java/com/kickstarter/services/firebase/ResetDeviceIdWorker.kt index 9903f17a64..00770109c4 100644 --- a/app/src/main/java/com/kickstarter/services/firebase/ResetDeviceIdWorker.kt +++ b/app/src/main/java/com/kickstarter/services/firebase/ResetDeviceIdWorker.kt @@ -9,7 +9,6 @@ import com.kickstarter.KSApplication import com.kickstarter.libs.Build import com.kickstarter.libs.FirebaseHelper import com.kickstarter.libs.qualifiers.ApplicationContext -import com.kickstarter.services.ApiClientType import timber.log.Timber import java.io.IOException import javax.inject.Inject @@ -17,8 +16,6 @@ import javax.inject.Inject class ResetDeviceIdWorker(@ApplicationContext applicationContext: Context, params: WorkerParameters) : Worker(applicationContext, params) { @Inject lateinit var build: Build - @Inject - lateinit var apiClient: ApiClientType override fun doWork(): Result { (applicationContext as KSApplication).component().inject(this) diff --git a/app/src/main/java/com/kickstarter/services/interceptors/WebRequestInterceptor.kt b/app/src/main/java/com/kickstarter/services/interceptors/WebRequestInterceptor.kt index 4da9ed9d15..49aa846a01 100644 --- a/app/src/main/java/com/kickstarter/services/interceptors/WebRequestInterceptor.kt +++ b/app/src/main/java/com/kickstarter/services/interceptors/WebRequestInterceptor.kt @@ -2,7 +2,7 @@ package com.kickstarter.services.interceptors import android.net.Uri import com.kickstarter.libs.Build -import com.kickstarter.libs.CurrentUserType +import com.kickstarter.libs.CurrentUserTypeV2 import com.kickstarter.libs.InternalToolsType import com.kickstarter.libs.utils.WebUtils.userAgent import com.kickstarter.libs.utils.extensions.isHivequeenUri @@ -19,7 +19,7 @@ import java.io.IOException * Interceptor for web requests to Kickstarter, not API requests. Used by web views and the web client. */ class WebRequestInterceptor( - private val currentUser: CurrentUserType, + private val currentUser: CurrentUserTypeV2, private val endpoint: String, private val internalTools: InternalToolsType, private val build: Build @@ -29,9 +29,9 @@ class WebRequestInterceptor( init { currentUser.observable() - .subscribe { - loggedInUser = it - } + .filter { it.isPresent() } + .map { loggedInUser = it.getValue() } + .subscribe() } @Throws(IOException::class) diff --git a/app/src/main/java/com/kickstarter/ui/activities/EditorialActivity.kt b/app/src/main/java/com/kickstarter/ui/activities/EditorialActivity.kt index 22dab72d4c..ac82b1e627 100644 --- a/app/src/main/java/com/kickstarter/ui/activities/EditorialActivity.kt +++ b/app/src/main/java/com/kickstarter/ui/activities/EditorialActivity.kt @@ -5,7 +5,6 @@ import androidx.activity.addCallback import androidx.activity.viewModels import androidx.appcompat.app.AppCompatActivity import androidx.core.view.isGone -import com.jakewharton.rxbinding.view.RxView import com.kickstarter.R import com.kickstarter.databinding.ActivityEditorialBinding import com.kickstarter.libs.rx.transformers.Transformers.observeForUIV2 @@ -77,8 +76,9 @@ class EditorialActivity : AppCompatActivity() { } .addToDisposable(disposables) - RxView.clicks(binding.editorialRetryContainer.root) - .subscribe { this.viewModel.inputs.retryContainerClicked() } + binding.editorialRetryContainer.root.setOnClickListener { + this.viewModel.inputs.retryContainerClicked() + } } private fun discoveryFragment(): DiscoveryFragment = supportFragmentManager.findFragmentById(R.id.fragment_discovery) as DiscoveryFragment diff --git a/app/src/main/java/com/kickstarter/ui/activities/FacebookConfirmationActivity.kt b/app/src/main/java/com/kickstarter/ui/activities/FacebookConfirmationActivity.kt index 6306361a44..84584073e5 100644 --- a/app/src/main/java/com/kickstarter/ui/activities/FacebookConfirmationActivity.kt +++ b/app/src/main/java/com/kickstarter/ui/activities/FacebookConfirmationActivity.kt @@ -4,7 +4,6 @@ import android.content.Intent import android.os.Bundle import androidx.activity.ComponentActivity import androidx.activity.viewModels -import com.jakewharton.rxbinding.view.RxView import com.kickstarter.R import com.kickstarter.databinding.FacebookConfirmationLayoutBinding import com.kickstarter.libs.ActivityRequestCodes @@ -52,8 +51,9 @@ class FacebookConfirmationActivity : ComponentActivity() { .subscribe { ViewUtils.showDialog(this, getString(R.string.signup_error_title), it) } .addToDisposable(disposables) - RxView.clicks(binding.newsletterSwitch) - .subscribe { viewModel.inputs.sendNewslettersClick(binding.newsletterSwitch.isChecked) } + binding.newsletterSwitch.setOnClickListener { + viewModel.inputs.sendNewslettersClick(binding.newsletterSwitch.isChecked) + } binding.createNewAccountButton.setOnClickListener { createNewAccountClick() diff --git a/app/src/main/java/com/kickstarter/ui/activities/LoginToutActivity.kt b/app/src/main/java/com/kickstarter/ui/activities/LoginToutActivity.kt index a2bbbe643a..cd0f926d2d 100644 --- a/app/src/main/java/com/kickstarter/ui/activities/LoginToutActivity.kt +++ b/app/src/main/java/com/kickstarter/ui/activities/LoginToutActivity.kt @@ -174,7 +174,7 @@ class LoginToutActivity : ComponentActivity() { showErrorMessageToasts() .observeOn(AndroidSchedulers.mainThread()) - .subscribe { ViewUtils.showToast(this) } + .subscribe { ViewUtils.showToast(this, it ?: "") } .addToDisposable(disposables) viewModel.outputs.showUnauthorizedErrorDialog() diff --git a/app/src/main/java/com/kickstarter/ui/activities/MessageThreadsActivity.kt b/app/src/main/java/com/kickstarter/ui/activities/MessageThreadsActivity.kt index 4709686811..7fee5d6201 100644 --- a/app/src/main/java/com/kickstarter/ui/activities/MessageThreadsActivity.kt +++ b/app/src/main/java/com/kickstarter/ui/activities/MessageThreadsActivity.kt @@ -115,7 +115,7 @@ class MessageThreadsActivity : AppCompatActivity() { viewModel.outputs.unreadCountToolbarTextViewIsGone() .observeOn(AndroidSchedulers.mainThread()) .subscribe { - ViewUtils.setGone(binding.messageThreadsToolbar.messageThreadsToolbarUnreadCountTextView) + ViewUtils.setGone(binding.messageThreadsToolbar.messageThreadsToolbarUnreadCountTextView, it) } .addToDisposable(disposables) diff --git a/app/src/main/java/com/kickstarter/ui/activities/ProjectPageActivity.kt b/app/src/main/java/com/kickstarter/ui/activities/ProjectPageActivity.kt index ebd2c7ed6e..ec08674d7a 100644 --- a/app/src/main/java/com/kickstarter/ui/activities/ProjectPageActivity.kt +++ b/app/src/main/java/com/kickstarter/ui/activities/ProjectPageActivity.kt @@ -43,7 +43,6 @@ import com.google.firebase.crashlytics.FirebaseCrashlytics import com.kickstarter.R import com.kickstarter.databinding.ActivityProjectPageBinding import com.kickstarter.libs.ActivityRequestCodes -import com.kickstarter.libs.BaseFragment import com.kickstarter.libs.Either import com.kickstarter.libs.Environment import com.kickstarter.libs.KSString @@ -51,7 +50,6 @@ import com.kickstarter.libs.MessagePreviousScreenType import com.kickstarter.libs.ProjectPagerTabs import com.kickstarter.libs.featureflag.FeatureFlagClientType import com.kickstarter.libs.featureflag.FlagKey -import com.kickstarter.libs.rx.transformers.Transformers import com.kickstarter.libs.utils.ApplicationUtils import com.kickstarter.libs.utils.UrlUtils import com.kickstarter.libs.utils.ViewUtils @@ -437,12 +435,14 @@ class ProjectPageActivity : .addToDisposable(disposables) binding.mediaHeader.outputs.onFullScreenClicked() - .compose(Transformers.observeForUI()) + .observeOn(AndroidSchedulers.mainThread()) .subscribe { viewModel.inputs.fullScreenVideoButtonClicked(it) } + .addToDisposable(disposables) binding.mediaHeader.outputs.playButtonClicks() - .compose(Transformers.observeForUI()) + .observeOn(AndroidSchedulers.mainThread()) .subscribe { viewModel.inputs.onVideoPlayButtonClicked() } + .addToDisposable(disposables) this.viewModel.outputs.onOpenVideoInFullScreen() .subscribeOn(Schedulers.io()) @@ -934,9 +934,6 @@ class ProjectPageActivity : private fun setFragmentsState(expand: Boolean) { supportFragmentManager.fragments.map { fragment -> when (fragment) { - is BaseFragment<*> -> { - fragment.setState(expand && fragment.isVisible) - } is RewardsFragment -> { fragment.setState(expand && fragment.isVisible) } diff --git a/app/src/main/java/com/kickstarter/ui/adapters/DiscoveryPagerAdapter.kt b/app/src/main/java/com/kickstarter/ui/adapters/DiscoveryPagerAdapter.kt index 94bf96cf37..df71f4dc55 100644 --- a/app/src/main/java/com/kickstarter/ui/adapters/DiscoveryPagerAdapter.kt +++ b/app/src/main/java/com/kickstarter/ui/adapters/DiscoveryPagerAdapter.kt @@ -9,7 +9,7 @@ import com.kickstarter.models.Category import com.kickstarter.services.DiscoveryParams import com.kickstarter.ui.ArgumentsKey import com.kickstarter.ui.fragments.DiscoveryFragment -import rx.Observable +import io.reactivex.Observable class DiscoveryPagerAdapter( fragmentManager: FragmentManager, @@ -48,52 +48,56 @@ class DiscoveryPagerAdapter( * Passes along root categories to its fragment position to help fetch appropriate projects. */ fun takeCategoriesForPosition(categories: List, position: Int) { - Observable.from(fragments) + Observable.fromIterable(fragments) .filter(DiscoveryFragment::isInstantiated) .filter(DiscoveryFragment::isAttached) .filter { frag: DiscoveryFragment -> val fragmentPosition = frag.arguments?.getInt(ArgumentsKey.DISCOVERY_SORT_POSITION) fragmentPosition == position } - .subscribe { frag: DiscoveryFragment -> frag.takeCategories(categories) } + .map { frag: DiscoveryFragment -> frag.takeCategories(categories) } + .subscribe() } /** * Take current params from activity and pass to the appropriate fragment. */ fun takeParams(params: DiscoveryParams) { - Observable.from(fragments) + Observable.fromIterable(fragments) .filter(DiscoveryFragment::isInstantiated) .filter(DiscoveryFragment::isAttached) .filter { frag: DiscoveryFragment -> val fragmentPosition = frag.arguments?.getInt(ArgumentsKey.DISCOVERY_SORT_POSITION) params.sort().positionFromSort() == fragmentPosition } - .subscribe { frag: DiscoveryFragment -> frag.updateParams(params) } + .map { frag: DiscoveryFragment -> frag.updateParams(params) } + .subscribe() } /** * Call when the view model tells us to clear specific pages. */ fun clearPages(pages: List) { - Observable.from(fragments) + Observable.fromIterable(fragments) .filter(DiscoveryFragment::isInstantiated) .filter(DiscoveryFragment::isAttached) .filter { frag: DiscoveryFragment -> val fragmentPosition = frag.arguments?.getInt(ArgumentsKey.DISCOVERY_SORT_POSITION) pages.contains(fragmentPosition) } - .subscribe { obj: DiscoveryFragment -> obj.clearPage() } + .map { obj: DiscoveryFragment -> obj.clearPage() } + .subscribe() } fun scrollToTop(position: Int) { - Observable.from(fragments) + Observable.fromIterable(fragments) .filter(DiscoveryFragment::isInstantiated) .filter(DiscoveryFragment::isAttached) .filter { frag: DiscoveryFragment -> val fragmentPosition = frag.arguments?.getInt(ArgumentsKey.DISCOVERY_SORT_POSITION) position == fragmentPosition } - .subscribe { obj: DiscoveryFragment -> obj.scrollToTop() } + .map { obj: DiscoveryFragment -> obj.scrollToTop() } + .subscribe() } } diff --git a/app/src/main/java/com/kickstarter/ui/adapters/KSAdapter.java b/app/src/main/java/com/kickstarter/ui/adapters/KSAdapter.java index 36dd0d9855..7ca5727685 100644 --- a/app/src/main/java/com/kickstarter/ui/adapters/KSAdapter.java +++ b/app/src/main/java/com/kickstarter/ui/adapters/KSAdapter.java @@ -12,7 +12,6 @@ import com.kickstarter.BuildConfig; import com.kickstarter.libs.utils.ExceptionUtils; import com.kickstarter.ui.viewholders.KSViewHolder; -import com.trello.rxlifecycle.ActivityEvent; import java.util.ArrayList; import java.util.List; @@ -60,13 +59,9 @@ public void insertSection(final int location, final @NonNull List section public void onViewDetachedFromWindow(final @NonNull KSViewHolder holder) { super.onViewDetachedFromWindow(holder); - // View holders are "stopped" when they are detached from the window for recycling - holder.lifecycleEvent(ActivityEvent.STOP); - // View holders are "destroy" when they are detached from the window and no adapter is listening // to events, so ostensibly the view holder is being deallocated. if (!hasObservers()) { - holder.lifecycleEvent(ActivityEvent.DESTROY); holder.destroy(); } } @@ -74,16 +69,11 @@ public void onViewDetachedFromWindow(final @NonNull KSViewHolder holder) { @Override public void onViewAttachedToWindow(final @NonNull KSViewHolder holder) { super.onViewAttachedToWindow(holder); - - // View holders are "started" when they are attached to the new window because this means - // it has been recycled. - holder.lifecycleEvent(ActivityEvent.START); } @Override public final @NonNull KSViewHolder onCreateViewHolder(final @NonNull ViewGroup viewGroup, final @LayoutRes int layout) { final KSViewHolder viewHolder = viewHolder(layout, viewGroup); - viewHolder.lifecycleEvent(ActivityEvent.CREATE); return viewHolder; } diff --git a/app/src/main/java/com/kickstarter/ui/adapters/KSListAdapter.kt b/app/src/main/java/com/kickstarter/ui/adapters/KSListAdapter.kt index 89c4ae44d2..d972552c22 100644 --- a/app/src/main/java/com/kickstarter/ui/adapters/KSListAdapter.kt +++ b/app/src/main/java/com/kickstarter/ui/adapters/KSListAdapter.kt @@ -11,7 +11,6 @@ import com.google.firebase.crashlytics.FirebaseCrashlytics import com.kickstarter.BuildConfig import com.kickstarter.libs.utils.ExceptionUtils import com.kickstarter.ui.viewholders.KSViewHolder -import com.trello.rxlifecycle.ActivityEvent import java.util.ArrayList abstract class KSListAdapter( @@ -74,30 +73,13 @@ abstract class KSListAdapter( override fun onViewDetachedFromWindow(holder: KSViewHolder) { super.onViewDetachedFromWindow(holder) - // View holders are "stopped" when they are detached from the window for recycling - holder.lifecycleEvent(ActivityEvent.STOP) - - // View holders are "destroy" when they are detached from the window and no adapter is listening - // to events, so ostensibly the view holder is being deallocated. if (!hasObservers()) { - holder.lifecycleEvent(ActivityEvent.DESTROY) holder.destroy() } } - override fun onViewAttachedToWindow(holder: KSViewHolder) { - super.onViewAttachedToWindow(holder) - - // View holders are "started" when they are attached to the new window because this means - // it has been recycled. - holder.lifecycleEvent(ActivityEvent.START) - } - override fun onCreateViewHolder(viewGroup: ViewGroup, @LayoutRes layout: Int): KSViewHolder { val viewHolder = viewHolder(layout, viewGroup) - - viewHolder.lifecycleEvent(ActivityEvent.CREATE) - return viewHolder } diff --git a/app/src/main/java/com/kickstarter/ui/adapters/RewardCardAdapter.kt b/app/src/main/java/com/kickstarter/ui/adapters/RewardCardAdapter.kt index 08a010f051..6371101fd1 100644 --- a/app/src/main/java/com/kickstarter/ui/adapters/RewardCardAdapter.kt +++ b/app/src/main/java/com/kickstarter/ui/adapters/RewardCardAdapter.kt @@ -19,7 +19,7 @@ import com.kickstarter.ui.viewholders.RewardAddCardViewHolder import com.kickstarter.ui.viewholders.RewardCardSelectedViewHolder import com.kickstarter.ui.viewholders.RewardCardUnselectedViewHolder import com.kickstarter.ui.viewholders.State -import rx.Observable +import io.reactivex.Observable class RewardCardAdapter(private val delegate: Delegate) : KSAdapter() { interface Delegate : RewardCardUnselectedViewHolder.Delegate, RewardAddCardViewHolder.Delegate @@ -61,9 +61,9 @@ class RewardCardAdapter(private val delegate: Delegate) : KSAdapter() { fun takeCards(cards: List, project: Project) { sections().clear() addSection( - Observable.from(cards) + Observable.fromIterable(cards) .map { Pair(it, project) } - .toList().toBlocking().single() + .toList().blockingGet() ) addSection(listOf(null)) notifyDataSetChanged() diff --git a/app/src/main/java/com/kickstarter/ui/adapters/ShippingRulesAdapter.kt b/app/src/main/java/com/kickstarter/ui/adapters/ShippingRulesAdapter.kt index 89ea44134e..663274c144 100644 --- a/app/src/main/java/com/kickstarter/ui/adapters/ShippingRulesAdapter.kt +++ b/app/src/main/java/com/kickstarter/ui/adapters/ShippingRulesAdapter.kt @@ -11,7 +11,6 @@ import com.kickstarter.models.Project import com.kickstarter.models.ShippingRule import com.kickstarter.ui.viewholders.KSArrayViewHolder import com.kickstarter.ui.viewholders.ShippingRuleViewHolder -import rx.Observable class ShippingRulesAdapter(ctx: Context, private val resourceId: Int, val items: ArrayList>, private val delegate: Delegate) : KSArrayAdapter>(ctx, resourceId, items) { @@ -67,9 +66,10 @@ class ShippingRulesAdapter(ctx: Context, private val resourceId: Int, val items: this.filteredItems.clear() this.filteredItems.addAll( - Observable.from(rules) - .map { rule -> Pair.create(rule, project) } - .toList().toBlocking().single() + rules.map { + rule -> + Pair.create(rule, project) + } ) notifyDataSetChanged() } diff --git a/app/src/main/java/com/kickstarter/ui/adapters/UpdatesAdapter.kt b/app/src/main/java/com/kickstarter/ui/adapters/UpdatesAdapter.kt index bd37d894f8..855da7eb57 100644 --- a/app/src/main/java/com/kickstarter/ui/adapters/UpdatesAdapter.kt +++ b/app/src/main/java/com/kickstarter/ui/adapters/UpdatesAdapter.kt @@ -12,7 +12,7 @@ import com.kickstarter.models.Update import com.kickstarter.ui.viewholders.EmptyViewHolder import com.kickstarter.ui.viewholders.KSViewHolder import com.kickstarter.ui.viewholders.UpdateCardViewHolder -import rx.Observable +import io.reactivex.Observable class UpdatesAdapter(private val delegate: Delegate) : KSAdapter() { @@ -34,9 +34,9 @@ class UpdatesAdapter(private val delegate: Delegate) : KSAdapter() { sections().clear() addSection( - Observable.from(updates) + Observable.fromIterable(updates) .map { update -> Pair.create(project, update) } - .toList().toBlocking().single() + .toList().blockingGet() ) if (updates.isEmpty()) { diff --git a/app/src/main/java/com/kickstarter/ui/viewholders/AddOnViewHolder.kt b/app/src/main/java/com/kickstarter/ui/viewholders/AddOnViewHolder.kt index 009895fe9d..7ccf976fdb 100644 --- a/app/src/main/java/com/kickstarter/ui/viewholders/AddOnViewHolder.kt +++ b/app/src/main/java/com/kickstarter/ui/viewholders/AddOnViewHolder.kt @@ -29,7 +29,9 @@ class AddOnViewHolder(private val binding: ItemAddOnBinding) : KSViewHolder(bind this.viewModel.outputs.conversionIsGone() .compose(observeForUIV2()) - .subscribe { ViewUtils.setGone(binding.addOnConversionTextView) } + .subscribe { + ViewUtils.setGone(binding.addOnConversionTextView, it) + } .addToDisposable(disposables) this.viewModel.outputs.conversion() @@ -69,7 +71,9 @@ class AddOnViewHolder(private val binding: ItemAddOnBinding) : KSViewHolder(bind this.viewModel.outputs.rewardItemsAreGone() .compose(observeForUIV2()) - .subscribe { ViewUtils.setGone(binding.addOnItemsContainer.addOnItemLayout) } + .subscribe { + ViewUtils.setGone(binding.addOnItemsContainer.addOnItemLayout, it) + } .addToDisposable(disposables) this.viewModel.outputs.isAddonTitleGone() diff --git a/app/src/main/java/com/kickstarter/ui/viewholders/KSArrayViewHolder.kt b/app/src/main/java/com/kickstarter/ui/viewholders/KSArrayViewHolder.kt index 6ca4b7058c..999b4d1355 100644 --- a/app/src/main/java/com/kickstarter/ui/viewholders/KSArrayViewHolder.kt +++ b/app/src/main/java/com/kickstarter/ui/viewholders/KSArrayViewHolder.kt @@ -3,50 +3,11 @@ package com.kickstarter.ui.viewholders import android.content.Context import android.view.View import com.kickstarter.KSApplication -import com.kickstarter.libs.ActivityLifecycleType import com.kickstarter.libs.Environment -import com.trello.rxlifecycle.ActivityEvent -import com.trello.rxlifecycle.RxLifecycle -import rx.Observable -import rx.subjects.PublishSubject -abstract class KSArrayViewHolder(private val view: View) : ActivityLifecycleType { - - private val lifecycle = PublishSubject.create() +abstract class KSArrayViewHolder(private val view: View) { abstract fun bindData(any: Any?) - override fun lifecycle(): Observable { - return this.lifecycle - } - - /** - * This method is intended to be called only from `KSArrayAdapter` in order for it to inform the view holder - * of its lifecycle. - */ - fun lifecycleEvent(event: ActivityEvent) { - this.lifecycle.onNext(event) - - if (ActivityEvent.DESTROY == event) { - destroy() - } - } - - /** - * Completes an observable when an [ActivityEvent] occurs in the activity's lifecycle. - */ - fun bindUntilEvent(event: ActivityEvent): Observable.Transformer { - return RxLifecycle.bindUntilActivityEvent(this.lifecycle, event) - } - - /** - * Completes an observable when the lifecycle event opposing the current lifecyle event is emitted. - * For example, if a subscription is made during [ActivityEvent.CREATE], the observable will be completed - * in [ActivityEvent.DESTROY]. - */ - fun bindToLifecycle(): Observable.Transformer { - return RxLifecycle.bindActivity(this.lifecycle) - } - /** * Called when the ViewHolder is being detached. Subclasses should override if they need to do any work * when the ViewHolder is being de-allocated. diff --git a/app/src/main/java/com/kickstarter/ui/viewholders/KSViewHolder.java b/app/src/main/java/com/kickstarter/ui/viewholders/KSViewHolder.java index 1cbb4c9916..a13618627a 100644 --- a/app/src/main/java/com/kickstarter/ui/viewholders/KSViewHolder.java +++ b/app/src/main/java/com/kickstarter/ui/viewholders/KSViewHolder.java @@ -8,20 +8,12 @@ import androidx.recyclerview.widget.RecyclerView; import com.kickstarter.KSApplication; -import com.kickstarter.libs.ActivityLifecycleType; import com.kickstarter.libs.Environment; -import com.trello.rxlifecycle.ActivityEvent; -import com.trello.rxlifecycle.RxLifecycle; - -import rx.Observable; -import rx.subjects.PublishSubject; import timber.log.Timber; -public abstract class KSViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener, - ActivityLifecycleType { +public abstract class KSViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener { private final View view; - private final @NonNull PublishSubject lifecycle = PublishSubject.create(); public KSViewHolder(final @NonNull View view) { super(view); @@ -55,38 +47,6 @@ public void onBind() {} */ abstract public void bindData(final @Nullable Object data) throws Exception; - @Override - public @NonNull Observable lifecycle() { - return this.lifecycle; - } - - /** - * This method is intended to be called only from `KSAdapter` in order for it to inform the view holder - * of its lifecycle. - */ - public void lifecycleEvent(final @NonNull ActivityEvent event) { - this.lifecycle.onNext(event); - - if (ActivityEvent.DESTROY.equals(event)) { - destroy(); - } - } - - /** - * Completes an observable when an {@link ActivityEvent} occurs in the activity's lifecycle. - */ - public final @NonNull Observable.Transformer bindUntilEvent(final @NonNull ActivityEvent event) { - return RxLifecycle.bindUntilActivityEvent(this.lifecycle, event); - } - - /** - * Completes an observable when the lifecycle event opposing the current lifecyle event is emitted. - * For example, if a subscription is made during {@link ActivityEvent#CREATE}, the observable will be completed - * in {@link ActivityEvent#DESTROY}. - */ - public final @NonNull Observable.Transformer bindToLifecycle() { - return RxLifecycle.bindActivity(this.lifecycle); - } /** * Called when the ViewHolder is being detached. Subclasses should override if they need to do any work diff --git a/app/src/main/java/com/kickstarter/ui/viewholders/ProjectNotificationViewHolder.kt b/app/src/main/java/com/kickstarter/ui/viewholders/ProjectNotificationViewHolder.kt index cd45c95531..909032d9b0 100644 --- a/app/src/main/java/com/kickstarter/ui/viewholders/ProjectNotificationViewHolder.kt +++ b/app/src/main/java/com/kickstarter/ui/viewholders/ProjectNotificationViewHolder.kt @@ -4,7 +4,7 @@ import com.kickstarter.R import com.kickstarter.databinding.ProjectNotificationViewBinding import com.kickstarter.libs.rx.transformers.Transformers import com.kickstarter.libs.utils.SwitchCompatUtils -import com.kickstarter.libs.utils.ViewUtils +import com.kickstarter.libs.utils.ViewUtils.showToast import com.kickstarter.libs.utils.extensions.addToDisposable import com.kickstarter.models.ProjectNotification import com.kickstarter.viewmodels.ProjectNotificationViewModel @@ -28,13 +28,13 @@ class ProjectNotificationViewHolder(binding: ProjectNotificationViewBinding) : viewModel.outputs.enabledSwitch() .compose(Transformers.observeForUIV2()) - .subscribe { SwitchCompatUtils.setCheckedWithoutAnimation(binding.enabledSwitch) } + .subscribe { SwitchCompatUtils.setCheckedWithoutAnimation(binding.enabledSwitch, it) } .addToDisposable(disposables) viewModel.outputs.showUnableToSaveProjectNotificationError() .map { context().getString(R.string.profile_settings_error) } .observeOn(AndroidSchedulers.mainThread()) - .subscribe { ViewUtils.showToast(context()) } + .subscribe { showToast(context(), it) } .addToDisposable(disposables) } diff --git a/app/src/main/java/com/kickstarter/ui/viewholders/RewardViewHolder.kt b/app/src/main/java/com/kickstarter/ui/viewholders/RewardViewHolder.kt index 73c4252610..7bb345e75c 100644 --- a/app/src/main/java/com/kickstarter/ui/viewholders/RewardViewHolder.kt +++ b/app/src/main/java/com/kickstarter/ui/viewholders/RewardViewHolder.kt @@ -5,7 +5,6 @@ import android.util.Pair import android.view.View import androidx.core.view.isGone import androidx.recyclerview.widget.LinearLayoutManager -import com.jakewharton.rxbinding.view.RxView import com.kickstarter.R import com.kickstarter.databinding.ItemRewardBinding import com.kickstarter.libs.rx.transformers.Transformers.observeForUIV2 @@ -183,9 +182,9 @@ class RewardViewHolder(private val binding: ItemRewardBinding, val delegate: Del } .addToDisposable(disposables) - RxView.clicks(this.binding.rewardPledgeButton) - .compose(bindToLifecycle()) - .subscribe { this.viewModel.inputs.rewardClicked(this.adapterPosition) } + this.binding.rewardPledgeButton.setOnClickListener { + this.viewModel.inputs.rewardClicked(this.adapterPosition) + } this.viewModel.outputs.hasAddOnsAvailable() .filter { it.isNotNull() } diff --git a/app/src/main/java/com/kickstarter/ui/viewholders/UpdateCardViewHolder.kt b/app/src/main/java/com/kickstarter/ui/viewholders/UpdateCardViewHolder.kt index 87a311d2e0..903b232907 100644 --- a/app/src/main/java/com/kickstarter/ui/viewholders/UpdateCardViewHolder.kt +++ b/app/src/main/java/com/kickstarter/ui/viewholders/UpdateCardViewHolder.kt @@ -2,7 +2,6 @@ package com.kickstarter.ui.viewholders import android.util.Pair import androidx.core.view.isGone -import com.jakewharton.rxbinding.view.RxView import com.kickstarter.R import com.kickstarter.databinding.ItemUpdateCardBinding import com.kickstarter.libs.rx.transformers.Transformers.observeForUIV2 @@ -79,9 +78,9 @@ class UpdateCardViewHolder(private val binding: ItemUpdateCardBinding, val deleg .subscribe { this.binding.updateTitle.text = it } .addToDisposable(disposables) - RxView.clicks(this.binding.updateContainer) - .compose(bindToLifecycle()) - .subscribe { this.viewModel.inputs.updateClicked() } + this.binding.updateContainer.setOnClickListener { + this.viewModel.inputs.updateClicked() + } } private fun setBackersOnlyVisibility(show: Boolean) { diff --git a/app/src/main/java/com/kickstarter/ui/views/MediaHeader.kt b/app/src/main/java/com/kickstarter/ui/views/MediaHeader.kt index c8e739b807..ea342be3d9 100644 --- a/app/src/main/java/com/kickstarter/ui/views/MediaHeader.kt +++ b/app/src/main/java/com/kickstarter/ui/views/MediaHeader.kt @@ -16,8 +16,8 @@ import com.kickstarter.libs.utils.extensions.photoHeightFromWidthRatio import com.kickstarter.libs.utils.extensions.toVisibility import com.kickstarter.ui.data.MediaElement import com.kickstarter.ui.extensions.loadImageWithResize -import rx.Observable -import rx.subjects.PublishSubject +import io.reactivex.Observable +import io.reactivex.subjects.PublishSubject class MediaHeader @JvmOverloads constructor( context: Context, @@ -26,7 +26,7 @@ class MediaHeader @JvmOverloads constructor( ) : ConstraintLayout(context, attrs, defStyleAttr) { private var binding: MediaHeaderBinding = MediaHeaderBinding.inflate(LayoutInflater.from(context), this, true) - private var playButtonClicks = PublishSubject.create() + private var playButtonClicks = PublishSubject.create() private var onFullScreenClicked = PublishSubject.create>() interface Inputs { @@ -65,7 +65,7 @@ class MediaHeader @JvmOverloads constructor( interface Outputs { - fun playButtonClicks(): Observable + fun playButtonClicks(): Observable fun onFullScreenClicked(): Observable> } @@ -124,7 +124,7 @@ class MediaHeader @JvmOverloads constructor( } } val outputs: Outputs = object : Outputs { - override fun playButtonClicks(): Observable = playButtonClicks + override fun playButtonClicks(): Observable = playButtonClicks override fun onFullScreenClicked(): Observable> = onFullScreenClicked } @@ -134,7 +134,7 @@ class MediaHeader @JvmOverloads constructor( binding.videoPlayButtonOverlay.isGone = true binding.videoProjectView.isVisible = true binding.videoProjectView.setPlayerPlayWhenReadyFlag(true) - playButtonClicks.onNext(null) + playButtonClicks.onNext(Unit) } binding.videoProjectView.setOnFullScreenClickedListener(object : OnFullScreenOpenedClickedListener { diff --git a/app/src/main/java/com/kickstarter/viewmodels/FacebookConfirmationViewModel.kt b/app/src/main/java/com/kickstarter/viewmodels/FacebookConfirmationViewModel.kt index 102266c6e5..ddc86fa55d 100644 --- a/app/src/main/java/com/kickstarter/viewmodels/FacebookConfirmationViewModel.kt +++ b/app/src/main/java/com/kickstarter/viewmodels/FacebookConfirmationViewModel.kt @@ -45,7 +45,7 @@ interface FacebookConfirmationViewModel { ViewModel(), Inputs, Outputs { private val client = requireNotNull(environment.apiClientV2()) private val loginUserCase = LoginUseCase(environment) - private val currentConfig = requireNotNull(environment.currentConfig()) + private val currentConfig = requireNotNull(environment.currentConfigV2()) private fun registerWithFacebookSuccess(envelope: AccessTokenEnvelope) { loginUserCase.setToken(envelope.accessToken()) diff --git a/app/src/main/java/com/kickstarter/viewmodels/projectpage/PrelaunchProjectViewModel.kt b/app/src/main/java/com/kickstarter/viewmodels/projectpage/PrelaunchProjectViewModel.kt index 5ea06aac7a..f28210f119 100644 --- a/app/src/main/java/com/kickstarter/viewmodels/projectpage/PrelaunchProjectViewModel.kt +++ b/app/src/main/java/com/kickstarter/viewmodels/projectpage/PrelaunchProjectViewModel.kt @@ -89,7 +89,7 @@ interface PrelaunchProjectViewModel { private val showShareSheet = PublishSubject.create>() private val startLoginToutActivity = PublishSubject.create() private val showSavedPrompt = PublishSubject.create() - private val currentProject2 = rx.subjects.PublishSubject.create() + private val currentProject2 = PublishSubject.create() @VisibleForTesting(otherwise = VisibleForTesting.PRIVATE) val onThirdPartyEventSent = BehaviorSubject.create() diff --git a/app/src/main/java/com/kickstarter/viewmodels/usecases/GetUserPrivacyUseCase.kt b/app/src/main/java/com/kickstarter/viewmodels/usecases/GetUserPrivacyUseCaseV2.kt similarity index 56% rename from app/src/main/java/com/kickstarter/viewmodels/usecases/GetUserPrivacyUseCase.kt rename to app/src/main/java/com/kickstarter/viewmodels/usecases/GetUserPrivacyUseCaseV2.kt index 67f8767c77..ae9416a9f7 100644 --- a/app/src/main/java/com/kickstarter/viewmodels/usecases/GetUserPrivacyUseCase.kt +++ b/app/src/main/java/com/kickstarter/viewmodels/usecases/GetUserPrivacyUseCaseV2.kt @@ -1,17 +1,7 @@ package com.kickstarter.viewmodels.usecases import com.kickstarter.models.UserPrivacy -import com.kickstarter.services.ApolloClientType import com.kickstarter.services.ApolloClientTypeV2 -import rx.Observable - -class GetUserPrivacyUseCase( - private val apolloClient: ApolloClientType -) { - fun getUserPrivacy(): Observable { - return apolloClient.userPrivacy() - } -} class GetUserPrivacyUseCaseV2( private val apolloClient: ApolloClientTypeV2 diff --git a/app/src/main/java/com/kickstarter/viewmodels/usecases/LoginUseCase.kt b/app/src/main/java/com/kickstarter/viewmodels/usecases/LoginUseCase.kt index cd486be717..0a71ba24fd 100644 --- a/app/src/main/java/com/kickstarter/viewmodels/usecases/LoginUseCase.kt +++ b/app/src/main/java/com/kickstarter/viewmodels/usecases/LoginUseCase.kt @@ -5,29 +5,23 @@ import com.kickstarter.libs.rx.transformers.Transformers import com.kickstarter.models.User class LoginUseCase(environment: Environment) { - private val currentUser = requireNotNull(environment.currentUser()) private val currentUserV2 = requireNotNull(environment.currentUserV2()) - private val apolloClient = requireNotNull(environment.apolloClient()) private val apolloClientV2 = requireNotNull(environment.apolloClientV2()) fun logout() { - currentUser.logout() currentUserV2.logout() } fun setToken(accessToken: String) { - currentUser.setToken(accessToken) currentUserV2.setToken(accessToken) } fun setUser(user: User) { - currentUser.login(user) currentUserV2.login(user) } fun loginAndUpdateUserPrivacy(newUser: User, accessToken: String): io.reactivex.Observable { currentUserV2.setToken(accessToken) - currentUser.setToken(accessToken) return GetUserPrivacyUseCaseV2(apolloClientV2).getUserPrivacy() .compose(Transformers.neverErrorV2()) .map { @@ -38,7 +32,6 @@ class LoginUseCase(environment: Environment) { .isEmailVerified(it.isEmailVerified) .hasPassword(it.hasPassword).build() currentUserV2.login(updated) - currentUser.login(updated) return@map updated } } diff --git a/app/src/main/java/com/kickstarter/viewmodels/usecases/RefreshUserUseCase.kt b/app/src/main/java/com/kickstarter/viewmodels/usecases/RefreshUserUseCase.kt index 8183c548b6..2a1aeb92d3 100644 --- a/app/src/main/java/com/kickstarter/viewmodels/usecases/RefreshUserUseCase.kt +++ b/app/src/main/java/com/kickstarter/viewmodels/usecases/RefreshUserUseCase.kt @@ -4,11 +4,9 @@ import com.kickstarter.libs.Environment import com.kickstarter.models.User class RefreshUserUseCase(environment: Environment) { - private val currentUser = requireNotNull(environment.currentUser()) private val currentUserV2 = requireNotNull(environment.currentUserV2()) fun refresh(newUser: User) { - currentUser.refresh(newUser) currentUserV2.refresh(newUser) } } diff --git a/app/src/main/java/com/kickstarter/viewmodels/usecases/SendThirdPartyEventUseCase.kt b/app/src/main/java/com/kickstarter/viewmodels/usecases/SendThirdPartyEventUseCase.kt deleted file mode 100644 index 4f57ce30e0..0000000000 --- a/app/src/main/java/com/kickstarter/viewmodels/usecases/SendThirdPartyEventUseCase.kt +++ /dev/null @@ -1,70 +0,0 @@ -package com.kickstarter.viewmodels.usecases - -import android.content.SharedPreferences -import android.util.Pair -import com.kickstarter.libs.CurrentUserType -import com.kickstarter.libs.featureflag.FeatureFlagClientType -import com.kickstarter.libs.featureflag.FlagKey -import com.kickstarter.libs.rx.transformers.Transformers -import com.kickstarter.libs.utils.ThirdPartyEventValues -import com.kickstarter.models.Project -import com.kickstarter.services.ApolloClientType -import com.kickstarter.ui.SharedPreferenceKey -import com.kickstarter.ui.data.CheckoutData -import com.kickstarter.ui.data.PledgeData -import rx.Observable - -class SendThirdPartyEventUseCase( - sharedPreferences: SharedPreferences, - ffClient: FeatureFlagClientType, -) : BuildInput { - private val canSendEventFlag = ( - ffClient.getBoolean(FlagKey.ANDROID_CONSENT_MANAGEMENT) && - sharedPreferences.getBoolean(SharedPreferenceKey.CONSENT_MANAGEMENT_PREFERENCE, false) && - (ffClient.getBoolean(FlagKey.ANDROID_CAPI_INTEGRATION) || ffClient.getBoolean(FlagKey.ANDROID_GOOGLE_ANALYTICS)) - ) - - /** - * Send third party analytics events, with it's properties. - * - * @param draftPledge pledge holds the values for pledgeAmount and Shipping amount required for the analytics events, when the Checkout has not taken place yet. - * and example for this type of events will be ThirdPartyEventValues.EventName.ADD_PAYMENT_INFO, ad the payment methods can change or be added before the - * pledge is done. - * - * @param checkoutAndPledgeData.first holds the information around Checkout, this information is only available once the user hits pledge and becomes a backer. - * @param checkoutAndPledgeData.second holds the user selection of reward/addOns, selected location. - */ - fun sendThirdPartyEvent( - project: Observable, - apolloClient: ApolloClientType, - checkoutAndPledgeData: Observable?> = Observable.just(Pair(null, null)), - currentUser: CurrentUserType, - eventName: ThirdPartyEventValues.EventName, - firebaseScreen: String = "", - firebasePreviousScreen: String = "", - draftPledge: Pair? = null, - ): Observable> { - - return project - .filter { it.sendThirdPartyEvents() ?: false && canSendEventFlag } - .compose(Transformers.combineLatestPair(currentUser.observable())) - .compose(Transformers.combineLatestPair(checkoutAndPledgeData)) - .map { - this.buildInput( - eventName = eventName, - canSendEventFlag = canSendEventFlag, - firebaseScreen = firebaseScreen, - firebasePreviousScreen = firebasePreviousScreen, - draftPledge = draftPledge, - rawData = it - ) - } - .switchMap { input -> - apolloClient.triggerThirdPartyEvent( - input - ) - .compose(Transformers.neverError()).share() - } - .share() - } -} diff --git a/app/src/test/java/com/kickstarter/KSRobolectricTestCase.kt b/app/src/test/java/com/kickstarter/KSRobolectricTestCase.kt index bcffbb9b52..daab3e1e51 100644 --- a/app/src/test/java/com/kickstarter/KSRobolectricTestCase.kt +++ b/app/src/test/java/com/kickstarter/KSRobolectricTestCase.kt @@ -14,14 +14,15 @@ import com.kickstarter.libs.MockTrackingClient import com.kickstarter.libs.TrackingClientType import com.kickstarter.libs.featureflag.FeatureFlagClientType import com.kickstarter.libs.utils.Secrets +import com.kickstarter.libs.utils.extensions.addToDisposable import com.kickstarter.mock.MockCurrentConfigV2 import com.kickstarter.mock.MockFeatureFlagClient import com.kickstarter.mock.factories.ConfigFactory -import com.kickstarter.mock.services.MockApiClient -import com.kickstarter.mock.services.MockApolloClient import com.kickstarter.mock.services.MockApolloClientV2 import com.kickstarter.models.User import com.stripe.android.Stripe +import io.reactivex.disposables.CompositeDisposable +import io.reactivex.subscribers.TestSubscriber import junit.framework.TestCase import org.joda.time.DateTimeUtils import org.junit.After @@ -29,7 +30,6 @@ import org.junit.Before import org.junit.Rule import org.junit.runner.RunWith import org.robolectric.annotation.Config -import rx.observers.TestSubscriber import kotlin.jvm.Throws @RunWith(KSRobolectricGradleTestRunner::class) @Config( @@ -45,6 +45,7 @@ abstract class KSRobolectricTestCase : TestCase() { lateinit var segmentTrack: TestSubscriber lateinit var segmentIdentify: TestSubscriber + private val disposables = CompositeDisposable() @get:Rule val composeTestRule = createComposeRule() @@ -52,6 +53,8 @@ abstract class KSRobolectricTestCase : TestCase() { @Before @Throws(Exception::class) public override fun setUp() { + // - clean subscriptions + disposables.clear() super.setUp() val mockApolloClientV2 = MockApolloClientV2() @@ -68,8 +71,6 @@ abstract class KSRobolectricTestCase : TestCase() { mockCurrentConfigV2.config(config) environment = component.environment().toBuilder() - .apiClient(MockApiClient()) - .apolloClient(MockApolloClient()) .apolloClientV2(mockApolloClientV2) .currentConfig2(mockCurrentConfigV2) .ksCurrency(KSCurrency(mockCurrentConfigV2)) @@ -104,8 +105,8 @@ abstract class KSRobolectricTestCase : TestCase() { TrackingClientType.Type.SEGMENT, ffClient ) - segmentTrackingClient.eventNames.subscribe(segmentTrack) - segmentTrackingClient.identifiedUser.subscribe(segmentIdentify) + segmentTrackingClient.eventNames.subscribe { segmentTrack.onNext(it) }.addToDisposable(disposables) + segmentTrackingClient.identifiedUser.subscribe { segmentIdentify.onNext(it) }.addToDisposable(disposables) return segmentTrackingClient } } diff --git a/app/src/test/java/com/kickstarter/features/pledgedprojectsoverview/viewmodel/PledgedProjectsOverviewViewModelTest.kt b/app/src/test/java/com/kickstarter/features/pledgedprojectsoverview/viewmodel/PledgedProjectsOverviewViewModelTest.kt index 36570bbcdc..176b3eac51 100644 --- a/app/src/test/java/com/kickstarter/features/pledgedprojectsoverview/viewmodel/PledgedProjectsOverviewViewModelTest.kt +++ b/app/src/test/java/com/kickstarter/features/pledgedprojectsoverview/viewmodel/PledgedProjectsOverviewViewModelTest.kt @@ -21,6 +21,7 @@ import com.kickstarter.mock.services.MockApolloClientV2 import com.kickstarter.models.Project import com.kickstarter.services.mutations.CreateOrUpdateBackingAddressData import io.reactivex.Observable +import io.reactivex.subscribers.TestSubscriber import kotlinx.coroutines.ExperimentalCoroutinesApi import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.toList @@ -28,7 +29,6 @@ import kotlinx.coroutines.launch import kotlinx.coroutines.test.UnconfinedTestDispatcher import kotlinx.coroutines.test.runTest import org.junit.Test -import rx.observers.TestSubscriber @OptIn(ExperimentalCoroutinesApi::class) class PledgedProjectsOverviewViewModelTest : KSRobolectricTestCase() { @@ -262,7 +262,7 @@ class PledgedProjectsOverviewViewModelTest : KSRobolectricTestCase() { } val segmentTrack: TestSubscriber = TestSubscriber() - trackingClient.eventNames.subscribe(segmentTrack) + val subscription = trackingClient.eventNames.subscribe { segmentTrack.onNext(it) } val pagingSource = PledgedProjectsPagingSource( mockApolloClientV2, @@ -302,6 +302,7 @@ class PledgedProjectsOverviewViewModelTest : KSRobolectricTestCase() { ) segmentTrack.assertValue(EventName.PAGE_VIEWED.eventName) + subscription.dispose() } } diff --git a/app/src/test/java/com/kickstarter/libs/MockCurrentUser.java b/app/src/test/java/com/kickstarter/libs/MockCurrentUser.java deleted file mode 100644 index 97c4cee56e..0000000000 --- a/app/src/test/java/com/kickstarter/libs/MockCurrentUser.java +++ /dev/null @@ -1,58 +0,0 @@ -package com.kickstarter.libs; - -import com.kickstarter.models.User; - -import androidx.annotation.NonNull; -import androidx.annotation.Nullable; -import rx.Observable; -import rx.subjects.BehaviorSubject; - -public class MockCurrentUser extends CurrentUserType { - private final BehaviorSubject user = BehaviorSubject.create((User) null); - private @Nullable String accessToken; - - public MockCurrentUser() { - this.user.onNext(null); - } - - public MockCurrentUser(final @NonNull User initialUser) { - this.user.onNext(initialUser); - } - - @Override - public void setToken(final @NonNull String accessToken) { - this.accessToken = accessToken; - } - - @Override - public void login(final @NonNull User newUser) { - this.user.onNext(newUser); - } - - @Override - public void logout() { - this.user.onNext(null); - this.accessToken = null; - } - - @Override - public @Nullable String getAccessToken() { - return this.accessToken; - } - - @Override - public void refresh(final @NonNull User freshUser) { - this.user.onNext(freshUser); - } - - @Override - public Observable observable() { - return this.user; - } - - @Nullable - @Override - public User getUser() { - return this.user.getValue(); - } -} diff --git a/app/src/test/java/com/kickstarter/libs/MockTrackingClient.kt b/app/src/test/java/com/kickstarter/libs/MockTrackingClient.kt index 2e5d23f039..f285c784df 100644 --- a/app/src/test/java/com/kickstarter/libs/MockTrackingClient.kt +++ b/app/src/test/java/com/kickstarter/libs/MockTrackingClient.kt @@ -4,9 +4,9 @@ import com.kickstarter.libs.featureflag.FeatureFlagClientType import com.kickstarter.libs.utils.extensions.currentVariants import com.kickstarter.mock.factories.ConfigFactory.config import com.kickstarter.models.User +import io.reactivex.subjects.BehaviorSubject +import io.reactivex.subjects.PublishSubject import org.joda.time.DateTime -import rx.subjects.BehaviorSubject -import rx.subjects.PublishSubject class MockTrackingClient( currentUser: CurrentUserTypeV2, @@ -28,7 +28,6 @@ class MockTrackingClient( override fun reset() { loggedInUser = null - identifiedUser.onNext(null) } override fun isEnabled(): Boolean { diff --git a/app/src/test/java/com/kickstarter/libs/SegmentTest.kt b/app/src/test/java/com/kickstarter/libs/SegmentTest.kt index f527a8e4e2..3e45878be3 100644 --- a/app/src/test/java/com/kickstarter/libs/SegmentTest.kt +++ b/app/src/test/java/com/kickstarter/libs/SegmentTest.kt @@ -49,6 +49,7 @@ import com.kickstarter.libs.utils.EventName.CTA_CLICKED import com.kickstarter.libs.utils.EventName.PAGE_VIEWED import com.kickstarter.libs.utils.EventName.VIDEO_PLAYBACK_COMPLETED import com.kickstarter.libs.utils.EventName.VIDEO_PLAYBACK_STARTED +import com.kickstarter.libs.utils.extensions.addToDisposable import com.kickstarter.mock.MockCurrentConfigV2 import com.kickstarter.mock.MockFeatureFlagClient import com.kickstarter.mock.factories.AvatarFactory @@ -71,6 +72,7 @@ import com.kickstarter.services.DiscoveryParams import com.kickstarter.ui.SharedPreferenceKey import com.kickstarter.ui.data.PledgeData import com.kickstarter.ui.data.PledgeFlowContext +import io.reactivex.disposables.CompositeDisposable import io.reactivex.subjects.BehaviorSubject import org.joda.time.DateTime import org.junit.Test @@ -80,6 +82,7 @@ class SegmentTest : KSRobolectricTestCase() { private val propertiesTest = BehaviorSubject.create>() lateinit var build: Build lateinit var context: Context + private val disposables = CompositeDisposable() private val mockShared: SharedPreferences = MockSharedPreferences() @@ -181,8 +184,8 @@ class SegmentTest : KSRobolectricTestCase() { @Test fun testDefaultProperties() { val client = client(null) - client.eventNames.subscribe(this.segmentTrack) - client.eventProperties.subscribe { this.propertiesTest.onNext(it) } + client.eventNames.subscribe { this.segmentTrack.onNext(it) }.addToDisposable(disposables) + client.eventProperties.subscribe { this.propertiesTest.onNext(it) }.addToDisposable(disposables) val segment = AnalyticEvents(listOf(client)) segment.trackAppOpen() @@ -197,9 +200,9 @@ class SegmentTest : KSRobolectricTestCase() { fun testDefaultProperties_LoggedInUser() { val user = user() val client = client(user) - client.eventNames.subscribe(this.segmentTrack) - client.eventProperties.subscribe { this.propertiesTest.onNext(it) } - client.identifiedUser.subscribe(this.segmentIdentify) + client.eventNames.subscribe { this.segmentTrack.onNext(it) }.addToDisposable(disposables) + client.eventProperties.subscribe { this.propertiesTest.onNext(it) }.addToDisposable(disposables) + client.identifiedUser.subscribe { this.segmentIdentify.onNext(it) }.addToDisposable(disposables) val segment = AnalyticEvents(listOf(client)) segment.trackAppOpen() @@ -216,9 +219,9 @@ class SegmentTest : KSRobolectricTestCase() { fun testDefaultProperties_LoggedInUser_isAdmin() { val user = user().toBuilder().isAdmin(true).build() val client = client(user) - client.eventNames.subscribe(this.segmentTrack) - client.eventProperties.subscribe { this.propertiesTest.onNext(it) } - client.identifiedUser.subscribe(this.segmentIdentify) + client.eventNames.subscribe { this.segmentTrack.onNext(it) }.addToDisposable(disposables) + client.eventProperties.subscribe { this.propertiesTest.onNext(it) }.addToDisposable(disposables) + client.identifiedUser.subscribe { this.segmentIdentify.onNext(it) }.addToDisposable(disposables) val segment = AnalyticEvents(listOf(client)) segment.trackAppOpen() @@ -235,9 +238,9 @@ class SegmentTest : KSRobolectricTestCase() { .id(12) .build() val client = client(user) - client.eventNames.subscribe(this.segmentTrack) - client.eventProperties.subscribe { this.propertiesTest.onNext(it) } - client.identifiedUser.subscribe(this.segmentIdentify) + client.eventNames.subscribe { this.segmentTrack.onNext(it) }.addToDisposable(disposables) + client.eventProperties.subscribe { this.propertiesTest.onNext(it) }.addToDisposable(disposables) + client.identifiedUser.subscribe { this.segmentIdentify.onNext(it) }.addToDisposable(disposables) val segment = AnalyticEvents(listOf(client)) segment.trackActivityFeedPageViewed() @@ -258,9 +261,9 @@ class SegmentTest : KSRobolectricTestCase() { val user = user() val project = project() val client = client(user) - client.eventNames.subscribe(this.segmentTrack) - client.eventProperties.subscribe { this.propertiesTest.onNext(it) } - client.identifiedUser.subscribe(this.segmentIdentify) + client.eventNames.subscribe { this.segmentTrack.onNext(it) }.addToDisposable(disposables) + client.eventProperties.subscribe { this.propertiesTest.onNext(it) }.addToDisposable(disposables) + client.identifiedUser.subscribe { this.segmentIdentify.onNext(it) }.addToDisposable(disposables) val segment = AnalyticEvents(listOf(client)) val projectData = ProjectDataFactory.project(project, RefTag.discovery(), RefTag.recommended()) @@ -282,9 +285,9 @@ class SegmentTest : KSRobolectricTestCase() { fun testDiscoveryProperties_AllProjects() { val user = user() val client = client(user) - client.eventNames.subscribe(this.segmentTrack) - client.eventProperties.subscribe { this.propertiesTest.onNext(it) } - client.identifiedUser.subscribe(this.segmentIdentify) + client.eventNames.subscribe { this.segmentTrack.onNext(it) }.addToDisposable(disposables) + client.eventProperties.subscribe { this.propertiesTest.onNext(it) }.addToDisposable(disposables) + client.identifiedUser.subscribe { this.segmentIdentify.onNext(it) }.addToDisposable(disposables) val segment = AnalyticEvents(listOf(client)) val params = DiscoveryParams @@ -304,9 +307,9 @@ class SegmentTest : KSRobolectricTestCase() { fun testDiscoveryPageViewed() { val user = user() val client = client(user) - client.eventNames.subscribe(this.segmentTrack) - client.eventProperties.subscribe { this.propertiesTest.onNext(it) } - client.identifiedUser.subscribe(this.segmentIdentify) + client.eventNames.subscribe { this.segmentTrack.onNext(it) }.addToDisposable(disposables) + client.eventProperties.subscribe { this.propertiesTest.onNext(it) }.addToDisposable(disposables) + client.identifiedUser.subscribe { this.segmentIdentify.onNext(it) }.addToDisposable(disposables) val segment = AnalyticEvents(listOf(client)) val params = DiscoveryParams @@ -333,9 +336,9 @@ class SegmentTest : KSRobolectricTestCase() { fun testDiscoveryProjectCtaClickedProperties_AllProjects() { val user = user() val client = client(user) - client.eventNames.subscribe(this.segmentTrack) - client.eventProperties.subscribe { this.propertiesTest.onNext(it) } - client.identifiedUser.subscribe(this.segmentIdentify) + client.eventNames.subscribe { this.segmentTrack.onNext(it) }.addToDisposable(disposables) + client.eventProperties.subscribe { this.propertiesTest.onNext(it) }.addToDisposable(disposables) + client.identifiedUser.subscribe { this.segmentIdentify.onNext(it) }.addToDisposable(disposables) val segment = AnalyticEvents(listOf(client)) val project = project().toBuilder().build() @@ -366,9 +369,9 @@ class SegmentTest : KSRobolectricTestCase() { fun testDiscoveryProjectCtaClickedProperties_Recommended() { val user = user() val client = client(user) - client.eventNames.subscribe(this.segmentTrack) - client.eventProperties.subscribe { this.propertiesTest.onNext(it) } - client.identifiedUser.subscribe(this.segmentIdentify) + client.eventNames.subscribe { this.segmentTrack.onNext(it) }.addToDisposable(disposables) + client.eventProperties.subscribe { this.propertiesTest.onNext(it) }.addToDisposable(disposables) + client.identifiedUser.subscribe { this.segmentIdentify.onNext(it) }.addToDisposable(disposables) val segment = AnalyticEvents(listOf(client)) val project = project().toBuilder().build() @@ -416,9 +419,9 @@ class SegmentTest : KSRobolectricTestCase() { val project = project() val user = user() val client = client(user) - client.eventNames.subscribe(this.segmentTrack) - client.eventProperties.subscribe { this.propertiesTest.onNext(it) } - client.identifiedUser.subscribe(this.segmentIdentify) + client.eventNames.subscribe { this.segmentTrack.onNext(it) }.addToDisposable(disposables) + client.eventProperties.subscribe { this.propertiesTest.onNext(it) }.addToDisposable(disposables) + client.identifiedUser.subscribe { this.segmentIdentify.onNext(it) }.addToDisposable(disposables) val segment = AnalyticEvents(listOf(client)) val params = DiscoveryParams @@ -463,9 +466,9 @@ class SegmentTest : KSRobolectricTestCase() { val project = project() val user = user() val client = client(user) - client.eventNames.subscribe(this.segmentTrack) - client.eventProperties.subscribe { this.propertiesTest.onNext(it) } - client.identifiedUser.subscribe(this.segmentIdentify) + client.eventNames.subscribe { this.segmentTrack.onNext(it) }.addToDisposable(disposables) + client.eventProperties.subscribe { this.propertiesTest.onNext(it) }.addToDisposable(disposables) + client.identifiedUser.subscribe { this.segmentIdentify.onNext(it) }.addToDisposable(disposables) val segment = AnalyticEvents(listOf(client)) val projectData = ProjectDataFactory.project(project, RefTag.discovery(), RefTag.recommended()) @@ -497,9 +500,9 @@ class SegmentTest : KSRobolectricTestCase() { fun testSearchResultPageViewed_Properties() { val user = user() val client = client(user) - client.eventNames.subscribe(this.segmentTrack) - client.eventProperties.subscribe { this.propertiesTest.onNext(it) } - client.identifiedUser.subscribe(this.segmentIdentify) + client.eventNames.subscribe { this.segmentTrack.onNext(it) }.addToDisposable(disposables) + client.eventProperties.subscribe { this.propertiesTest.onNext(it) }.addToDisposable(disposables) + client.identifiedUser.subscribe { this.segmentIdentify.onNext(it) }.addToDisposable(disposables) val segment = AnalyticEvents(listOf(client)) val params = DiscoveryParams @@ -536,9 +539,9 @@ class SegmentTest : KSRobolectricTestCase() { fun testDiscoveryProperties_NoCategory() { val user = user() val client = client(user) - client.eventNames.subscribe(this.segmentTrack) - client.eventProperties.subscribe { this.propertiesTest.onNext(it) } - client.identifiedUser.subscribe(this.segmentIdentify) + client.eventNames.subscribe { this.segmentTrack.onNext(it) }.addToDisposable(disposables) + client.eventProperties.subscribe { this.propertiesTest.onNext(it) }.addToDisposable(disposables) + client.identifiedUser.subscribe { this.segmentIdentify.onNext(it) }.addToDisposable(disposables) val segment = AnalyticEvents(listOf(client)) val params = DiscoveryParams @@ -575,9 +578,9 @@ class SegmentTest : KSRobolectricTestCase() { fun testDiscoveryActivity_CTA_Clicked_Properties() { val user = user() val client = client(user) - client.eventNames.subscribe(this.segmentTrack) - client.eventProperties.subscribe { this.propertiesTest.onNext(it) } - client.identifiedUser.subscribe(this.segmentIdentify) + client.eventNames.subscribe { this.segmentTrack.onNext(it) }.addToDisposable(disposables) + client.eventProperties.subscribe { this.propertiesTest.onNext(it) }.addToDisposable(disposables) + client.identifiedUser.subscribe { this.segmentIdentify.onNext(it) }.addToDisposable(disposables) val segment = AnalyticEvents(listOf(client)) segment.trackDiscoverProjectCTAClicked() @@ -597,9 +600,9 @@ class SegmentTest : KSRobolectricTestCase() { fun testDiscoveryProperties_Category() { val user = user() val client = client(user) - client.eventNames.subscribe(this.segmentTrack) - client.eventProperties.subscribe { this.propertiesTest.onNext(it) } - client.identifiedUser.subscribe(this.segmentIdentify) + client.eventNames.subscribe { this.segmentTrack.onNext(it) }.addToDisposable(disposables) + client.eventProperties.subscribe { this.propertiesTest.onNext(it) }.addToDisposable(disposables) + client.identifiedUser.subscribe { this.segmentIdentify.onNext(it) }.addToDisposable(disposables) val segment = AnalyticEvents(listOf(client)) val params = DiscoveryParams @@ -636,9 +639,9 @@ class SegmentTest : KSRobolectricTestCase() { fun testSearchCta_Properties() { val user = user() val client = client(user) - client.eventNames.subscribe(this.segmentTrack) - client.eventProperties.subscribe { this.propertiesTest.onNext(it) } - client.identifiedUser.subscribe(this.segmentIdentify) + client.eventNames.subscribe { this.segmentTrack.onNext(it) }.addToDisposable(disposables) + client.eventProperties.subscribe { this.propertiesTest.onNext(it) }.addToDisposable(disposables) + client.identifiedUser.subscribe { this.segmentIdentify.onNext(it) }.addToDisposable(disposables) val segment = AnalyticEvents(listOf(client)) val params = DiscoveryParams @@ -680,8 +683,8 @@ class SegmentTest : KSRobolectricTestCase() { val project = project() val client = client(null) - client.eventNames.subscribe(this.segmentTrack) - client.eventProperties.subscribe { this.propertiesTest.onNext(it) } + client.eventNames.subscribe { this.segmentTrack.onNext(it) }.addToDisposable(disposables) + client.eventProperties.subscribe { this.propertiesTest.onNext(it) }.addToDisposable(disposables) val segment = AnalyticEvents(listOf(client)) segment.trackProjectScreenViewed(ProjectDataFactory.project(project, RefTag.discovery(), RefTag.recommended()), EventContextValues.ContextSectionName.OVERVIEW.contextName) @@ -706,8 +709,8 @@ class SegmentTest : KSRobolectricTestCase() { val project = ProjectFactory.projectWithAddOns() val client = client(null) - client.eventNames.subscribe(this.segmentTrack) - client.eventProperties.subscribe { this.propertiesTest.onNext(it) } + client.eventNames.subscribe { this.segmentTrack.onNext(it) }.addToDisposable(disposables) + client.eventProperties.subscribe { this.propertiesTest.onNext(it) }.addToDisposable(disposables) val segment = AnalyticEvents(listOf(client)) segment.trackProjectScreenViewed( @@ -729,8 +732,8 @@ class SegmentTest : KSRobolectricTestCase() { .build() val client = client(null) - client.eventNames.subscribe(this.segmentTrack) - client.eventProperties.subscribe { this.propertiesTest.onNext(it) } + client.eventNames.subscribe { this.segmentTrack.onNext(it) }.addToDisposable(disposables) + client.eventProperties.subscribe { this.propertiesTest.onNext(it) }.addToDisposable(disposables) val segment = AnalyticEvents(listOf(client)) segment.trackProjectScreenViewed( @@ -753,8 +756,8 @@ class SegmentTest : KSRobolectricTestCase() { .build() val client = client(null) - client.eventNames.subscribe(this.segmentTrack) - client.eventProperties.subscribe { this.propertiesTest.onNext(it) } + client.eventNames.subscribe { this.segmentTrack.onNext(it) }.addToDisposable(disposables) + client.eventProperties.subscribe { this.propertiesTest.onNext(it) }.addToDisposable(disposables) val segment = AnalyticEvents(listOf(client)) segment.trackProjectScreenViewed( @@ -772,8 +775,8 @@ class SegmentTest : KSRobolectricTestCase() { val project = ProjectFactory.projectWithAddOns() val client = client(null) - client.eventNames.subscribe(this.segmentTrack) - client.eventProperties.subscribe { this.propertiesTest.onNext(it) } + client.eventNames.subscribe { this.segmentTrack.onNext(it) }.addToDisposable(disposables) + client.eventProperties.subscribe { this.propertiesTest.onNext(it) }.addToDisposable(disposables) val segment = AnalyticEvents(listOf(client)) segment.trackProjectScreenViewed( @@ -790,8 +793,8 @@ class SegmentTest : KSRobolectricTestCase() { val project = ProjectFactory.projectWithAddOns() val client = client(null) - client.eventNames.subscribe(this.segmentTrack) - client.eventProperties.subscribe { this.propertiesTest.onNext(it) } + client.eventNames.subscribe { this.segmentTrack.onNext(it) }.addToDisposable(disposables) + client.eventProperties.subscribe { this.propertiesTest.onNext(it) }.addToDisposable(disposables) val segment = AnalyticEvents(listOf(client)) segment.trackProjectPageTabChanged( @@ -810,8 +813,8 @@ class SegmentTest : KSRobolectricTestCase() { .prelaunchActivated(true) .build() val client = client(null) - client.eventNames.subscribe(this.segmentTrack) - client.eventProperties.subscribe { this.propertiesTest.onNext(it) } + client.eventNames.subscribe { this.segmentTrack.onNext(it) }.addToDisposable(disposables) + client.eventProperties.subscribe { this.propertiesTest.onNext(it) }.addToDisposable(disposables) val segment = AnalyticEvents(listOf(client)) segment.trackProjectScreenViewed( ProjectDataFactory.project(project, RefTag.discovery(), RefTag.recommended()), @@ -829,8 +832,8 @@ class SegmentTest : KSRobolectricTestCase() { .prelaunchActivated(false) .build() val client = client(null) - client.eventNames.subscribe(this.segmentTrack) - client.eventProperties.subscribe { this.propertiesTest.onNext(it) } + client.eventNames.subscribe { this.segmentTrack.onNext(it) }.addToDisposable(disposables) + client.eventProperties.subscribe { this.propertiesTest.onNext(it) }.addToDisposable(disposables) val segment = AnalyticEvents(listOf(client)) segment.trackProjectScreenViewed( ProjectDataFactory.project(project, RefTag.discovery(), RefTag.recommended()), @@ -846,9 +849,9 @@ class SegmentTest : KSRobolectricTestCase() { val project = project() val user = user() val client = client(user) - client.eventNames.subscribe(this.segmentTrack) - client.eventProperties.subscribe { this.propertiesTest.onNext(it) } - client.identifiedUser.subscribe(this.segmentIdentify) + client.eventNames.subscribe { this.segmentTrack.onNext(it) }.addToDisposable(disposables) + client.eventProperties.subscribe { this.propertiesTest.onNext(it) }.addToDisposable(disposables) + client.identifiedUser.subscribe { this.segmentIdentify.onNext(it) }.addToDisposable(disposables) val segment = AnalyticEvents(listOf(client)) segment.trackProjectScreenViewed( @@ -876,8 +879,8 @@ class SegmentTest : KSRobolectricTestCase() { val project = backedProject() val user = user() val client = client(user) - client.eventNames.subscribe(this.segmentTrack) - client.eventProperties.subscribe { this.propertiesTest.onNext(it) } + client.eventNames.subscribe { this.segmentTrack.onNext(it) }.addToDisposable(disposables) + client.eventProperties.subscribe { this.propertiesTest.onNext(it) }.addToDisposable(disposables) val segment = AnalyticEvents(listOf(client)) segment.trackProjectScreenViewed( @@ -904,8 +907,8 @@ class SegmentTest : KSRobolectricTestCase() { val project = project().toBuilder().build() val creator = creator() val client = client(creator) - client.eventNames.subscribe(this.segmentTrack) - client.eventProperties.subscribe { this.propertiesTest.onNext(it) } + client.eventNames.subscribe { this.segmentTrack.onNext(it) }.addToDisposable(disposables) + client.eventProperties.subscribe { this.propertiesTest.onNext(it) }.addToDisposable(disposables) val segment = AnalyticEvents(listOf(client)) segment.trackProjectScreenViewed( @@ -939,8 +942,8 @@ class SegmentTest : KSRobolectricTestCase() { val project = project().toBuilder().isStarred(true).build() val user = user() val client = client(user) - client.eventNames.subscribe(this.segmentTrack) - client.eventProperties.subscribe { this.propertiesTest.onNext(it) } + client.eventNames.subscribe { this.segmentTrack.onNext(it) }.addToDisposable(disposables) + client.eventProperties.subscribe { this.propertiesTest.onNext(it) }.addToDisposable(disposables) val segment = AnalyticEvents(listOf(client)) segment.trackProjectScreenViewed( @@ -966,8 +969,8 @@ class SegmentTest : KSRobolectricTestCase() { val project = project() val user = user() val client = client(user) - client.eventNames.subscribe(this.segmentTrack) - client.eventProperties.subscribe { this.propertiesTest.onNext(it) } + client.eventNames.subscribe { this.segmentTrack.onNext(it) }.addToDisposable(disposables) + client.eventProperties.subscribe { this.propertiesTest.onNext(it) }.addToDisposable(disposables) val segment = AnalyticEvents(listOf(client)) val projectData = ProjectDataFactory.project(project, RefTag.discovery(), RefTag.recommended()) @@ -992,8 +995,8 @@ class SegmentTest : KSRobolectricTestCase() { val project = project() val user = user() val client = client(user) - client.eventNames.subscribe(this.segmentTrack) - client.eventProperties.subscribe { this.propertiesTest.onNext(it) } + client.eventNames.subscribe { this.segmentTrack.onNext(it) }.addToDisposable(disposables) + client.eventProperties.subscribe { this.propertiesTest.onNext(it) }.addToDisposable(disposables) val segment = AnalyticEvents(listOf(client)) val projectData = ProjectDataFactory.project(project, RefTag.discovery(), RefTag.recommended()) @@ -1020,8 +1023,8 @@ class SegmentTest : KSRobolectricTestCase() { val project = project() val user = user() val client = client(user) - client.eventNames.subscribe(this.segmentTrack) - client.eventProperties.subscribe { this.propertiesTest.onNext(it) } + client.eventNames.subscribe { this.segmentTrack.onNext(it) }.addToDisposable(disposables) + client.eventProperties.subscribe { this.propertiesTest.onNext(it) }.addToDisposable(disposables) val segment = AnalyticEvents(listOf(client)) val projectData = ProjectDataFactory.project(project, RefTag.discovery(), RefTag.recommended()) @@ -1053,8 +1056,9 @@ class SegmentTest : KSRobolectricTestCase() { val project = project() val user = user() val client = client(user) - client.eventNames.subscribe(this.segmentTrack) - client.eventProperties.subscribe { this.propertiesTest.onNext(it) } + client.eventNames.subscribe { this.segmentTrack.onNext(it) }.addToDisposable(disposables) + client.eventProperties.subscribe { this.propertiesTest.onNext(it) }.addToDisposable(disposables) + val segment = AnalyticEvents(listOf(client)) val projectData = ProjectDataFactory.project(project, RefTag.discovery(), RefTag.recommended()) @@ -1099,8 +1103,9 @@ class SegmentTest : KSRobolectricTestCase() { val creator = creator() val client = client(creator) - client.eventNames.subscribe(this.segmentTrack) - client.eventProperties.subscribe { this.propertiesTest.onNext(it) } + client.eventNames.subscribe { this.segmentTrack.onNext(it) }.addToDisposable(disposables) + client.eventProperties.subscribe { this.propertiesTest.onNext(it) }.addToDisposable(disposables) + val segment = AnalyticEvents(listOf(client)) val projectData = ProjectDataFactory.project(project, RefTag.discovery(), RefTag.recommended()) @@ -1132,8 +1137,9 @@ class SegmentTest : KSRobolectricTestCase() { val project = backedProject() val user = user() val client = client(user) - client.eventNames.subscribe(this.segmentTrack) - client.eventProperties.subscribe { this.propertiesTest.onNext(it) } + client.eventNames.subscribe { this.segmentTrack.onNext(it) }.addToDisposable(disposables) + client.eventProperties.subscribe { this.propertiesTest.onNext(it) }.addToDisposable(disposables) + val segment = AnalyticEvents(listOf(client)) val projectData = ProjectDataFactory.project(project, RefTag.discovery(), RefTag.recommended()) @@ -1160,8 +1166,9 @@ class SegmentTest : KSRobolectricTestCase() { val project = backedProject() val user = user() val client = client(user) - client.eventNames.subscribe(this.segmentTrack) - client.eventProperties.subscribe { this.propertiesTest.onNext(it) } + client.eventNames.subscribe { this.segmentTrack.onNext(it) }.addToDisposable(disposables) + client.eventProperties.subscribe { this.propertiesTest.onNext(it) }.addToDisposable(disposables) + val segment = AnalyticEvents(listOf(client)) val projectData = ProjectDataFactory.project(project, RefTag.discovery(), RefTag.recommended()) @@ -1194,8 +1201,9 @@ class SegmentTest : KSRobolectricTestCase() { val project = project() val user = user() val client = client(user) - client.eventNames.subscribe(this.segmentTrack) - client.eventProperties.subscribe { this.propertiesTest.onNext(it) } + client.eventNames.subscribe { this.segmentTrack.onNext(it) }.addToDisposable(disposables) + client.eventProperties.subscribe { this.propertiesTest.onNext(it) }.addToDisposable(disposables) + val segment = AnalyticEvents(listOf(client)) val projectData = ProjectDataFactory.project(project, RefTag.discovery(), RefTag.recommended()) @@ -1226,8 +1234,9 @@ class SegmentTest : KSRobolectricTestCase() { fun testActivityFeedsProperties() { val user = user() val client = client(user) - client.eventNames.subscribe(this.segmentTrack) - client.eventProperties.subscribe { this.propertiesTest.onNext(it) } + client.eventNames.subscribe { this.segmentTrack.onNext(it) }.addToDisposable(disposables) + client.eventProperties.subscribe { this.propertiesTest.onNext(it) }.addToDisposable(disposables) + val segment = AnalyticEvents(listOf(client)) segment.trackActivityFeedPageViewed() @@ -1243,8 +1252,9 @@ class SegmentTest : KSRobolectricTestCase() { @Test fun testTwoFactorAuthProperties() { val client = client(null) - client.eventNames.subscribe(this.segmentTrack) - client.eventProperties.subscribe { this.propertiesTest.onNext(it) } + client.eventNames.subscribe { this.segmentTrack.onNext(it) }.addToDisposable(disposables) + client.eventProperties.subscribe { this.propertiesTest.onNext(it) }.addToDisposable(disposables) + val segment = AnalyticEvents(listOf(client)) segment.trackTwoFactorAuthPageViewed() @@ -1261,8 +1271,8 @@ class SegmentTest : KSRobolectricTestCase() { val project = project() val user = user() val client = client(user) - client.eventNames.subscribe(this.segmentTrack) - client.eventProperties.subscribe { this.propertiesTest.onNext(it) } + client.eventNames.subscribe { this.segmentTrack.onNext(it) }.addToDisposable(disposables) + client.eventProperties.subscribe { this.propertiesTest.onNext(it) }.addToDisposable(disposables) val videoLength = 100L val videoStartedPosition = 0L @@ -1295,8 +1305,8 @@ class SegmentTest : KSRobolectricTestCase() { fun testLoginPageViewed() { val client = client(null) - client.eventNames.subscribe(this.segmentTrack) - client.eventProperties.subscribe { this.propertiesTest.onNext(it) } + client.eventNames.subscribe { this.segmentTrack.onNext(it) }.addToDisposable(disposables) + client.eventProperties.subscribe { this.propertiesTest.onNext(it) }.addToDisposable(disposables) val segment = AnalyticEvents(listOf(client)) segment.trackLoginPagedViewed() @@ -1316,8 +1326,8 @@ class SegmentTest : KSRobolectricTestCase() { val user = user() val client = client(user) - client.eventNames.subscribe(this.segmentTrack) - client.eventProperties.subscribe { this.propertiesTest.onNext(it) } + client.eventNames.subscribe { this.segmentTrack.onNext(it) }.addToDisposable(disposables) + client.eventProperties.subscribe { this.propertiesTest.onNext(it) }.addToDisposable(disposables) val segment = AnalyticEvents(listOf(client)) @@ -1343,8 +1353,8 @@ class SegmentTest : KSRobolectricTestCase() { val user = user() val client = client(user) - client.eventNames.subscribe(this.segmentTrack) - client.eventProperties.subscribe { this.propertiesTest.onNext(it) } + client.eventNames.subscribe { this.segmentTrack.onNext(it) }.addToDisposable(disposables) + client.eventProperties.subscribe { this.propertiesTest.onNext(it) }.addToDisposable(disposables) val segment = AnalyticEvents(listOf(client)) @@ -1366,8 +1376,8 @@ class SegmentTest : KSRobolectricTestCase() { @Test fun testSignUpInitiateCtaClicked_Properties() { val client = client(null) - client.eventNames.subscribe(this.segmentTrack) - client.eventProperties.subscribe { this.propertiesTest.onNext(it) } + client.eventNames.subscribe { this.segmentTrack.onNext(it) }.addToDisposable(disposables) + client.eventProperties.subscribe { this.propertiesTest.onNext(it) }.addToDisposable(disposables) val segment = AnalyticEvents(listOf(client)) segment.trackSignUpInitiateCtaClicked() @@ -1387,8 +1397,8 @@ class SegmentTest : KSRobolectricTestCase() { fun testSignUpPageViewed_Properties() { val client = client(null) - client.eventNames.subscribe(this.segmentTrack) - client.eventProperties.subscribe { this.propertiesTest.onNext(it) } + client.eventNames.subscribe { this.segmentTrack.onNext(it) }.addToDisposable(disposables) + client.eventProperties.subscribe { this.propertiesTest.onNext(it) }.addToDisposable(disposables) val segment = AnalyticEvents(listOf(client)) segment.trackSignUpPageViewed() @@ -1408,9 +1418,9 @@ class SegmentTest : KSRobolectricTestCase() { val user = user() val project = project() val client = client(user) - client.eventNames.subscribe(this.segmentTrack) - client.eventProperties.subscribe { this.propertiesTest.onNext(it) } - client.identifiedUser.subscribe(this.segmentIdentify) + client.eventNames.subscribe { this.segmentTrack.onNext(it) }.addToDisposable(disposables) + client.eventProperties.subscribe { this.propertiesTest.onNext(it) }.addToDisposable(disposables) + client.identifiedUser.subscribe { this.segmentIdentify.onNext(it) }.addToDisposable(disposables) val segment = AnalyticEvents(listOf(client)) val commentId = "1" @@ -1436,9 +1446,9 @@ class SegmentTest : KSRobolectricTestCase() { val user = user() val project = project() val client = client(user) - client.eventNames.subscribe(this.segmentTrack) - client.eventProperties.subscribe { this.propertiesTest.onNext(it) } - client.identifiedUser.subscribe(this.segmentIdentify) + client.eventNames.subscribe { this.segmentTrack.onNext(it) }.addToDisposable(disposables) + client.eventProperties.subscribe { this.propertiesTest.onNext(it) }.addToDisposable(disposables) + client.identifiedUser.subscribe { this.segmentIdentify.onNext(it) }.addToDisposable(disposables) val segment = AnalyticEvents(listOf(client)) val reply = "comment" @@ -1468,9 +1478,9 @@ class SegmentTest : KSRobolectricTestCase() { val user = user() val project = project() val client = client(user) - client.eventNames.subscribe(this.segmentTrack) - client.eventProperties.subscribe { this.propertiesTest.onNext(it) } - client.identifiedUser.subscribe(this.segmentIdentify) + client.eventNames.subscribe { this.segmentTrack.onNext(it) }.addToDisposable(disposables) + client.eventProperties.subscribe { this.propertiesTest.onNext(it) }.addToDisposable(disposables) + client.identifiedUser.subscribe { this.segmentIdentify.onNext(it) }.addToDisposable(disposables) val segment = AnalyticEvents(listOf(client)) val reply = "comment" @@ -1502,8 +1512,8 @@ class SegmentTest : KSRobolectricTestCase() { fun testLoginOrSignUpPageViewed_Properties() { val client = client(null) - client.eventNames.subscribe(this.segmentTrack) - client.eventProperties.subscribe { this.propertiesTest.onNext(it) } + client.eventNames.subscribe { this.segmentTrack.onNext(it) }.addToDisposable(disposables) + client.eventProperties.subscribe { this.propertiesTest.onNext(it) }.addToDisposable(disposables) val segment = AnalyticEvents(listOf(client)) segment.trackLoginOrSignUpPagedViewed() @@ -1524,8 +1534,8 @@ class SegmentTest : KSRobolectricTestCase() { val client = client(user) val ppoCards = listOf(PPOCardFactory.confirmAddressCard(), PPOCardFactory.confirmAddressCard(), PPOCardFactory.fixPaymentCard()) - client.eventNames.subscribe(this.segmentTrack) - client.eventProperties.subscribe { this.propertiesTest.onNext(it) } + client.eventNames.subscribe { this.segmentTrack.onNext(it) }.addToDisposable(disposables) + client.eventProperties.subscribe { this.propertiesTest.onNext(it) }.addToDisposable(disposables) val segment = AnalyticEvents(listOf(client)) @@ -1554,8 +1564,8 @@ class SegmentTest : KSRobolectricTestCase() { val client = client(user) val ppoCards = listOf(PPOCardFactory.confirmAddressCard(), PPOCardFactory.confirmAddressCard(), PPOCardFactory.fixPaymentCard()) - client.eventNames.subscribe(this.segmentTrack) - client.eventProperties.subscribe { this.propertiesTest.onNext(it) } + client.eventNames.subscribe { this.segmentTrack.onNext(it) }.addToDisposable(disposables) + client.eventProperties.subscribe { this.propertiesTest.onNext(it) }.addToDisposable(disposables) val segment = AnalyticEvents(listOf(client)) @@ -1587,8 +1597,8 @@ class SegmentTest : KSRobolectricTestCase() { val client = client(user) val ppoCards = listOf(PPOCardFactory.confirmAddressCard(), PPOCardFactory.confirmAddressCard(), PPOCardFactory.fixPaymentCard()) - client.eventNames.subscribe(this.segmentTrack) - client.eventProperties.subscribe { this.propertiesTest.onNext(it) } + client.eventNames.subscribe { this.segmentTrack.onNext(it) }.addToDisposable(disposables) + client.eventProperties.subscribe { this.propertiesTest.onNext(it) }.addToDisposable(disposables) val segment = AnalyticEvents(listOf(client)) @@ -1619,8 +1629,8 @@ class SegmentTest : KSRobolectricTestCase() { val client = client(user) val ppoCards = listOf(PPOCardFactory.confirmAddressCard(), PPOCardFactory.confirmAddressCard(), PPOCardFactory.fixPaymentCard()) - client.eventNames.subscribe(this.segmentTrack) - client.eventProperties.subscribe { this.propertiesTest.onNext(it) } + client.eventNames.subscribe { this.segmentTrack.onNext(it) }.addToDisposable(disposables) + client.eventProperties.subscribe { this.propertiesTest.onNext(it) }.addToDisposable(disposables) val segment = AnalyticEvents(listOf(client)) @@ -1652,8 +1662,8 @@ class SegmentTest : KSRobolectricTestCase() { val client = client(user) val ppoCards = listOf(PPOCardFactory.confirmAddressCard(), PPOCardFactory.confirmAddressCard(), PPOCardFactory.fixPaymentCard()) - client.eventNames.subscribe(this.segmentTrack) - client.eventProperties.subscribe { this.propertiesTest.onNext(it) } + client.eventNames.subscribe { this.segmentTrack.onNext(it) }.addToDisposable(disposables) + client.eventProperties.subscribe { this.propertiesTest.onNext(it) }.addToDisposable(disposables) val segment = AnalyticEvents(listOf(client)) @@ -1685,8 +1695,8 @@ class SegmentTest : KSRobolectricTestCase() { val client = client(user) val ppoCards = listOf(PPOCardFactory.confirmAddressCard(), PPOCardFactory.confirmAddressCard(), PPOCardFactory.fixPaymentCard()) - client.eventNames.subscribe(this.segmentTrack) - client.eventProperties.subscribe { this.propertiesTest.onNext(it) } + client.eventNames.subscribe { this.segmentTrack.onNext(it) }.addToDisposable(disposables) + client.eventProperties.subscribe { this.propertiesTest.onNext(it) }.addToDisposable(disposables) val segment = AnalyticEvents(listOf(client)) @@ -1718,8 +1728,8 @@ class SegmentTest : KSRobolectricTestCase() { val client = client(user) val ppoCards = listOf(PPOCardFactory.confirmAddressCard(), PPOCardFactory.confirmAddressCard(), PPOCardFactory.fixPaymentCard()) - client.eventNames.subscribe(this.segmentTrack) - client.eventProperties.subscribe { this.propertiesTest.onNext(it) } + client.eventNames.subscribe { this.segmentTrack.onNext(it) }.addToDisposable(disposables) + client.eventProperties.subscribe { this.propertiesTest.onNext(it) }.addToDisposable(disposables) val segment = AnalyticEvents(listOf(client)) @@ -1750,8 +1760,8 @@ class SegmentTest : KSRobolectricTestCase() { val user = user() val client = client(user) - client.eventNames.subscribe(this.segmentTrack) - client.eventProperties.subscribe { this.propertiesTest.onNext(it) } + client.eventNames.subscribe { this.segmentTrack.onNext(it) }.addToDisposable(disposables) + client.eventProperties.subscribe { this.propertiesTest.onNext(it) }.addToDisposable(disposables) val segment = AnalyticEvents(listOf(client)) @@ -1795,8 +1805,8 @@ class SegmentTest : KSRobolectricTestCase() { .category(null) .build() - client.eventNames.subscribe(this.segmentTrack) - client.eventProperties.subscribe { this.propertiesTest.onNext(it) } + client.eventNames.subscribe { this.segmentTrack.onNext(it) }.addToDisposable(disposables) + client.eventProperties.subscribe { this.propertiesTest.onNext(it) }.addToDisposable(disposables) val segment = AnalyticEvents(listOf(client)) diff --git a/app/src/test/java/com/kickstarter/libs/rx/operators/ApiErrorOperatorTest.kt b/app/src/test/java/com/kickstarter/libs/rx/operators/ApiErrorOperatorTest.kt deleted file mode 100644 index 09731ceb24..0000000000 --- a/app/src/test/java/com/kickstarter/libs/rx/operators/ApiErrorOperatorTest.kt +++ /dev/null @@ -1,100 +0,0 @@ -package com.kickstarter.libs.rx.operators - -import com.google.gson.Gson -import com.kickstarter.KSRobolectricTestCase -import com.kickstarter.services.apiresponses.ErrorEnvelope -import com.kickstarter.services.apiresponses.ErrorEnvelope.Companion.builder -import okhttp3.MediaType.Companion.toMediaTypeOrNull -import okhttp3.ResponseBody -import okhttp3.ResponseBody.Companion.toResponseBody -import org.junit.Test -import retrofit2.Response -import rx.observers.TestSubscriber -import rx.subjects.PublishSubject -import java.lang.Exception - -class ApiErrorOperatorTest : KSRobolectricTestCase() { - @Test - fun testErrorResponse() { - val gson = Gson() - val response = PublishSubject.create>() - val result = response.lift(Operators.apiError(gson)) - val resultTest = TestSubscriber() - result.subscribe(resultTest) - response.onNext(Response.error(400, ResponseBody.create(null, ""))) - resultTest.assertNoValues() - assertEquals(1, resultTest.onErrorEvents.size) - } - - @Test - fun testErrorResponseErrorBodyJSON() { - val gson = Gson() - val response = PublishSubject.create>() - val result = response.lift(Operators.apiError(gson)) - val resultTest = TestSubscriber() - result.subscribe(resultTest) - val envelope = builder() - .ksrCode(ErrorEnvelope.TFA_FAILED) - .httpCode(400) - .build() - val jsonString = Gson().toJson(envelope) - response.onNext( - Response.error( - 400, - jsonString.toResponseBody("application/json; charset=utf-8".toMediaTypeOrNull()) - ) - ) - resultTest.assertNoValues() - assertEquals(1, resultTest.onErrorEvents.size) - } - - @Test - fun testErrorResponseBadJSON() { - val gson = Gson() - val response = PublishSubject.create>() - val result = response.lift(Operators.apiError(gson)) - val resultTest = TestSubscriber() - result.subscribe(resultTest) - val message = "{malformed json}" - val body = message.toResponseBody("application/json; charset=utf-8".toMediaTypeOrNull()) - response.onNext(Response.error(503, body)) - resultTest.assertNoValues() - assertEquals(1, resultTest.onErrorEvents.size) - } - - @Test - fun testResponseNull() { - val gson = Gson() - val response = PublishSubject.create?>() - val result = response.lift(Operators.apiError(gson)) - val resultTest = TestSubscriber() - result.subscribe(resultTest) - response.onNext(null) - resultTest.assertNoValues() - assertEquals(1, resultTest.onErrorEvents.size) - } - - @Test - fun testExceptionErrorResponse() { - val gson = Gson() - val response = PublishSubject.create>() - val result = response.lift(Operators.apiError(gson)) - val resultTest = TestSubscriber() - result.subscribe(resultTest) - response.onError(Exception()) - resultTest.assertNoValues() - assertEquals(1, resultTest.onErrorEvents.size) - } - - @Test - fun testSuccessResponse() { - val gson = Gson() - val response = PublishSubject.create>() - val result = response.lift(Operators.apiError(gson)) - val resultTest = TestSubscriber() - result.subscribe(resultTest) - response.onNext(Response.success(42)) - resultTest.assertValues(42) - resultTest.assertCompleted() - } -} diff --git a/app/src/test/java/com/kickstarter/libs/rx/transformers/CoalesceTransformerTest.java b/app/src/test/java/com/kickstarter/libs/rx/transformers/CoalesceTransformerTest.java deleted file mode 100644 index 7112120894..0000000000 --- a/app/src/test/java/com/kickstarter/libs/rx/transformers/CoalesceTransformerTest.java +++ /dev/null @@ -1,31 +0,0 @@ -package com.kickstarter.libs.rx.transformers; - -import org.junit.Test; - -import rx.Observable; -import rx.observers.TestSubscriber; -import rx.subjects.PublishSubject; - -import static com.kickstarter.libs.rx.transformers.Transformers.coalesce; - -public final class CoalesceTransformerTest { - @Test - public void testCoalesceTransformer() { - final Integer theDefault = 100; - final PublishSubject source = PublishSubject.create(); - final Observable result = source - .compose(coalesce(theDefault)); - - final TestSubscriber resultTest = TestSubscriber.create(); - result.subscribe(resultTest); - - source.onNext(1); - resultTest.assertValue(1); - - source.onNext(2); - resultTest.assertValues(1, 2); - - source.onNext(null); - resultTest.assertValues(1, 2, theDefault); - } -} diff --git a/app/src/test/java/com/kickstarter/libs/rx/transformers/CompletedTransformerTest.java b/app/src/test/java/com/kickstarter/libs/rx/transformers/CompletedTransformerTest.java deleted file mode 100644 index 814e8e0aa6..0000000000 --- a/app/src/test/java/com/kickstarter/libs/rx/transformers/CompletedTransformerTest.java +++ /dev/null @@ -1,41 +0,0 @@ -package com.kickstarter.libs.rx.transformers; - -import org.junit.Test; - -import rx.Observable; -import rx.observers.TestSubscriber; -import rx.subjects.PublishSubject; - -public final class CompletedTransformerTest { - @Test - public void testEmitsCompleted() { - final PublishSubject source = PublishSubject.create(); - final Observable result = source - .materialize() - .compose(Transformers.completed()); - - final TestSubscriber resultTest = new TestSubscriber<>(); - result.subscribe(resultTest); - - source.onNext(1); - resultTest.assertNoValues(); - - // Only emit when a completed notification occurs. - source.onCompleted(); - resultTest.assertValueCount(1); - } - - @Test - public void testErrorDoesNotEmitACompletedNotification() { - final PublishSubject source = PublishSubject.create(); - final Observable result = source - .materialize() - .compose(Transformers.completed()); - - final TestSubscriber resultTest = new TestSubscriber<>(); - result.subscribe(resultTest); - - source.onError(new Throwable()); - resultTest.assertValueCount(0); - } -} diff --git a/app/src/test/java/com/kickstarter/libs/rx/transformers/ErrorsTransformerTest.java b/app/src/test/java/com/kickstarter/libs/rx/transformers/ErrorsTransformerTest.java deleted file mode 100644 index 4821a214dd..0000000000 --- a/app/src/test/java/com/kickstarter/libs/rx/transformers/ErrorsTransformerTest.java +++ /dev/null @@ -1,41 +0,0 @@ -package com.kickstarter.libs.rx.transformers; - -import org.junit.Test; - -import rx.Observable; -import rx.observers.TestSubscriber; -import rx.subjects.PublishSubject; - -public final class ErrorsTransformerTest { - @Test - public void testEmitsErrors() { - final PublishSubject source = PublishSubject.create(); - final Observable result = source - .materialize() - .compose(Transformers.errors()); - - final TestSubscriber resultTest = new TestSubscriber<>(); - result.subscribe(resultTest); - - source.onNext(1); - resultTest.assertNoValues(); - - // Only emit when an error is thrown. - source.onError(new Throwable()); - resultTest.assertValueCount(1); - } - - @Test - public void testCompletedDoesNotEmitAnErrorNotification() { - final PublishSubject source = PublishSubject.create(); - final Observable result = source - .materialize() - .compose(Transformers.errors()); - - final TestSubscriber resultTest = new TestSubscriber<>(); - result.subscribe(resultTest); - - source.onCompleted(); - resultTest.assertValueCount(0); - } -} diff --git a/app/src/test/java/com/kickstarter/libs/rx/transformers/NeverErrorTransformerTest.java b/app/src/test/java/com/kickstarter/libs/rx/transformers/NeverErrorTransformerTest.java deleted file mode 100644 index 5b6592c369..0000000000 --- a/app/src/test/java/com/kickstarter/libs/rx/transformers/NeverErrorTransformerTest.java +++ /dev/null @@ -1,38 +0,0 @@ -package com.kickstarter.libs.rx.transformers; - -import com.kickstarter.KSRobolectricTestCase; - -import org.junit.Test; - -import rx.Observable; -import rx.observers.TestSubscriber; - -public class NeverErrorTransformerTest extends KSRobolectricTestCase { - @Test - public void testNeverError_emitsSameValuesAsSource() { - - final Observable source = Observable.just(1, 2, 3, 4); - final Observable result = source.compose(Transformers.neverError()); - - final TestSubscriber resultTest = TestSubscriber.create(); - result.subscribe(resultTest); - - resultTest.assertValues(1, 2, 3, 4); - resultTest.assertCompleted(); - } - - @Test - public void testNeverError_emitsSameValuesAndSkipsError() { - - final Observable errorsOnLast = Observable.just(1, 2, 3, 4) - .flatMap(i -> i < 4 ? Observable.just(i) : Observable.error(new RuntimeException())); - final Observable result = errorsOnLast.compose(Transformers.neverError()); - - final TestSubscriber resultTest = TestSubscriber.create(); - result.subscribe(resultTest); - - resultTest.assertValues(1, 2, 3); - resultTest.assertCompleted(); - resultTest.assertNoErrors(); - } -} diff --git a/app/src/test/java/com/kickstarter/libs/rx/transformers/ObserveForUITransformerTest.java b/app/src/test/java/com/kickstarter/libs/rx/transformers/ObserveForUITransformerTest.java deleted file mode 100644 index 6d05c6d21a..0000000000 --- a/app/src/test/java/com/kickstarter/libs/rx/transformers/ObserveForUITransformerTest.java +++ /dev/null @@ -1,62 +0,0 @@ -package com.kickstarter.libs.rx.transformers; - -import com.kickstarter.KSRobolectricTestCase; - -import org.junit.After; -import org.junit.Before; -import org.junit.Test; -import org.robolectric.shadows.ShadowLooper; - -import java.util.concurrent.atomic.AtomicInteger; - -import rx.Observable; -import rx.android.plugins.RxAndroidPlugins; -import rx.android.schedulers.AndroidSchedulers; -import rx.schedulers.Schedulers; - -import static com.kickstarter.libs.rx.transformers.Transformers.observeForUI; - -public final class ObserveForUITransformerTest extends KSRobolectricTestCase { - @Before - public void setUp() { - RxAndroidPlugins.getInstance().reset(); - } - - @After - public void tearDown() { - RxAndroidPlugins.getInstance().reset(); - } - - @Test - public void test() { - final AtomicInteger x = new AtomicInteger(); - - Observable.just(1) - .observeOn(AndroidSchedulers.mainThread()) - .subscribe(x::set); - - // Main looper is paused, so value should not change. - assertEquals(0, x.get()); - - Observable.just(2) - .observeOn(Schedulers.immediate()) - .subscribe(x::set); - - // Since the work used the immediate scheduler, it is unaffected by the main looper being paused. - assertEquals(2, x.get()); - - Observable.just(3) - .compose(observeForUI()) - .subscribe(x::set); - - // The main looper is paused but the code is executing on the main thread, so observeForUI() should schedule the - // work immediately rather than queueing it up. - assertEquals(3, x.get()); - - // Run the queued work. - ShadowLooper.runUiThreadTasks(); - - // Code observed using `AndroidSchedulers.mainThread()` is now run. - assertEquals(1, x.get()); - } -} diff --git a/app/src/test/java/com/kickstarter/libs/rx/transformers/TakePairWhenTransformerTest.java b/app/src/test/java/com/kickstarter/libs/rx/transformers/TakePairWhenTransformerTest.java deleted file mode 100644 index 0285385991..0000000000 --- a/app/src/test/java/com/kickstarter/libs/rx/transformers/TakePairWhenTransformerTest.java +++ /dev/null @@ -1,72 +0,0 @@ -package com.kickstarter.libs.rx.transformers; - -import android.util.Pair; - -import com.kickstarter.KSRobolectricTestCase; - -import org.junit.Test; - -import rx.Observable; -import rx.observers.TestSubscriber; -import rx.subjects.PublishSubject; - -public class TakePairWhenTransformerTest extends KSRobolectricTestCase { - - @Test - public void testPairTakeWhen_sourceEmitsFirst() { - - final PublishSubject source = PublishSubject.create(); - final PublishSubject sample = PublishSubject.create(); - final Observable> pair = source.compose(Transformers.takePairWhen(sample)); - - final TestSubscriber> resultTest = TestSubscriber.create(); - pair.subscribe(resultTest); - - source.onNext(1); - resultTest.assertNoValues(); - - source.onNext(2); - resultTest.assertNoValues(); - - sample.onNext("a"); - resultTest.assertValues(Pair.create(2, "a")); - - sample.onNext("b"); - resultTest.assertValues(Pair.create(2, "a"), Pair.create(2, "b")); - - source.onNext(3); - resultTest.assertValues(Pair.create(2, "a"), Pair.create(2, "b")); - - sample.onNext("c"); - resultTest.assertValues(Pair.create(2, "a"), Pair.create(2, "b"), Pair.create(3, "c")); - } - - @Test - public void testPairTakeWhen_sourceEmitsSecond() { - - final PublishSubject source = PublishSubject.create(); - final PublishSubject sample = PublishSubject.create(); - final Observable> pair = source.compose(Transformers.takePairWhen(sample)); - - final TestSubscriber> resultTest = TestSubscriber.create(); - pair.subscribe(resultTest); - - sample.onNext("a"); - resultTest.assertNoValues(); - - sample.onNext("b"); - resultTest.assertNoValues(); - - source.onNext(1); - resultTest.assertNoValues(); - - sample.onNext("c"); - resultTest.assertValues(Pair.create(1, "c")); - - source.onNext(2); - resultTest.assertValues(Pair.create(1, "c")); - - sample.onNext("d"); - resultTest.assertValues(Pair.create(1, "c"), Pair.create(2, "d")); - } -} diff --git a/app/src/test/java/com/kickstarter/libs/rx/transformers/ValuesTransformerTest.java b/app/src/test/java/com/kickstarter/libs/rx/transformers/ValuesTransformerTest.java deleted file mode 100644 index 0ef36593a7..0000000000 --- a/app/src/test/java/com/kickstarter/libs/rx/transformers/ValuesTransformerTest.java +++ /dev/null @@ -1,52 +0,0 @@ -package com.kickstarter.libs.rx.transformers; - -import org.junit.Test; - -import rx.Observable; -import rx.observers.TestSubscriber; -import rx.subjects.PublishSubject; - -public final class ValuesTransformerTest { - - @Test - public void testEmitsOnNext() { - final PublishSubject source = PublishSubject.create(); - final Observable result = source - .materialize() - .compose(Transformers.values()); - - final TestSubscriber resultTest = new TestSubscriber<>(); - result.subscribe(resultTest); - - // onNext should emit values. - source.onNext(1); - resultTest.assertValues(1); - - source.onNext(2); - resultTest.assertValues(1, 2); - - // Completing the source stream should not emit values. - source.onCompleted(); - resultTest.assertValues(1, 2); - } - - @Test - public void testErrorsDoNotEmit() { - final PublishSubject source = PublishSubject.create(); - final Observable result = source - .materialize() - .compose(Transformers.values()); - - final TestSubscriber resultTest = new TestSubscriber<>(); - result.subscribe(resultTest); - - // - source.onNext(1); - resultTest.assertValues(1); - - // An error in the source stream should not emit values. - source.onError(new Throwable()); - - resultTest.assertValues(1); - } -} diff --git a/app/src/test/java/com/kickstarter/libs/utils/ListUtilsTest.java b/app/src/test/java/com/kickstarter/libs/utils/ListUtilsTest.java index 50b393f224..ddcc09135f 100644 --- a/app/src/test/java/com/kickstarter/libs/utils/ListUtilsTest.java +++ b/app/src/test/java/com/kickstarter/libs/utils/ListUtilsTest.java @@ -4,8 +4,8 @@ import java.util.Arrays; import java.util.List; +import java.util.function.BiFunction; -import rx.functions.Func2; public final class ListUtilsTest extends TestCase { @@ -18,7 +18,7 @@ public void testAllReplaced() { public void testContains() { final List xs = Arrays.asList(1, 2, 3, 4, 5); - final Func2 equality = (x, y) -> x % 2 == 0 && y % 2 == 0; + final BiFunction equality = (x, y) -> x % 2 == 0 && y % 2 == 0; assertTrue(ListUtils.contains(xs, 8, equality)); assertFalse(ListUtils.contains(xs, 1, equality)); @@ -35,7 +35,7 @@ public void testDifference() { public void testIndexOf() { final List xs = Arrays.asList(1, 2, 3, 4, 5); - final Func2 equality = (x, y) -> x % 2 == 0 && y % 2 == 0; + final BiFunction equality = (x, y) -> x % 2 == 0 && y % 2 == 0; assertEquals(1, ListUtils.indexOf(xs, 2, equality)); assertEquals(1, ListUtils.indexOf(xs, 4, equality)); @@ -52,7 +52,7 @@ public void testIntersection() { public void testFind() { final List xs = Arrays.asList(1, 2, 3, 4, 5); - final Func2 equality = (x, y) -> x % 2 == 0 && y % 2 == 0; + final BiFunction equality = (x, y) -> x % 2 == 0 && y % 2 == 0; assertEquals(Integer.valueOf(2), ListUtils.find(xs, 2, equality)); assertEquals(Integer.valueOf(2), ListUtils.find(xs, 4, equality)); diff --git a/app/src/test/java/com/kickstarter/libs/utils/extensions/AnyExtKtTest.kt b/app/src/test/java/com/kickstarter/libs/utils/extensions/AnyExtKtTest.kt index 81198118ef..b8f5c11082 100644 --- a/app/src/test/java/com/kickstarter/libs/utils/extensions/AnyExtKtTest.kt +++ b/app/src/test/java/com/kickstarter/libs/utils/extensions/AnyExtKtTest.kt @@ -5,6 +5,7 @@ import io.reactivex.Observable import io.reactivex.disposables.CompositeDisposable import io.reactivex.subjects.PublishSubject import io.reactivex.subscribers.TestSubscriber +import org.junit.After import org.junit.Assert.assertThrows import org.junit.Test @@ -12,6 +13,11 @@ class AnyExtKtTest : KSRobolectricTestCase() { val disposables = CompositeDisposable() + @After + fun cleanUp() { + disposables.clear() + } + @Test fun testIsNull() { val nullVal: Any? = null @@ -44,21 +50,18 @@ class AnyExtKtTest : KSRobolectricTestCase() { @Test fun testCoalesceWith() { val theDefault = 100 - val source = rx.subjects.PublishSubject.create() + val source = PublishSubject.create() val result = source - .map(coalesceWith(theDefault)) + .map(coalesceWithV2(theDefault)) val resultTest = TestSubscriber.create() - result.subscribe { resultTest.onNext(it) } + result.subscribe { resultTest.onNext(it) }.addToDisposable(disposables) source.onNext(1) resultTest.assertValue(1) source.onNext(2) resultTest.assertValues(1, 2) - - source.onNext(null) - resultTest.assertValues(1, 2, theDefault) } @Test diff --git a/app/src/test/java/com/kickstarter/models/EnvironmentTest.kt b/app/src/test/java/com/kickstarter/models/EnvironmentTest.kt index 4044fcccd0..cfbd745982 100644 --- a/app/src/test/java/com/kickstarter/models/EnvironmentTest.kt +++ b/app/src/test/java/com/kickstarter/models/EnvironmentTest.kt @@ -1,7 +1,7 @@ package com.kickstarter.models import com.kickstarter.KSRobolectricTestCase -import com.kickstarter.libs.MockCurrentUser +import com.kickstarter.libs.MockCurrentUserV2 import com.kickstarter.mock.factories.UserFactory import org.junit.Test @@ -12,12 +12,9 @@ class EnvironmentTest : KSRobolectricTestCase() { val environment = environment() assertNotNull(environment.activitySamplePreference()) - assertNotNull(environment.apiClient()) - assertNotNull(environment.apolloClient()) assertNotNull(environment.build()) assertNotNull(environment.cookieManager()) - assertNotNull(environment.currentConfig()) - assertNotNull(environment.currentUser()) + assertNotNull(environment.currentUserV2()) assertNotNull(environment.firstSessionPreference()) assertNotNull(environment.gson()) assertNotNull(environment.hasSeenAppRatingPreference()) @@ -29,7 +26,7 @@ class EnvironmentTest : KSRobolectricTestCase() { assertNotNull(environment.attributionEvents()) assertNotNull(environment.logout()) assertNotNull(environment.playServicesCapability()) - assertNotNull(environment.scheduler()) + assertNotNull(environment.schedulerV2()) assertNotNull(environment.sharedPreferences()) assertNotNull(environment.stripe()) assertNotNull(environment.webEndpoint()) @@ -37,8 +34,8 @@ class EnvironmentTest : KSRobolectricTestCase() { @Test fun testToBuilderInit() { - val collaborator = MockCurrentUser(UserFactory.collaborator()) - val environment = environment().toBuilder().currentUser(collaborator).build() - assertEquals(environment.currentUser(), collaborator) + val collaborator = MockCurrentUserV2(UserFactory.collaborator()) + val environment = environment().toBuilder().currentUserV2(collaborator).build() + assertEquals(environment.currentUserV2(), collaborator) } } diff --git a/app/src/test/java/com/kickstarter/viewmodels/ChangePasswordViewModelTest.kt b/app/src/test/java/com/kickstarter/viewmodels/ChangePasswordViewModelTest.kt index ac14a6c974..0994c45588 100644 --- a/app/src/test/java/com/kickstarter/viewmodels/ChangePasswordViewModelTest.kt +++ b/app/src/test/java/com/kickstarter/viewmodels/ChangePasswordViewModelTest.kt @@ -196,7 +196,8 @@ class ChangePasswordViewModelTest : KSRobolectricTestCase() { ), successStates ) - currentUser.assertValues(user, null) + + // TODO: Force Logout logic after succesful password change is living on the UI, should be moved to the VM and tested } private fun getMockClientWithUser(user: User) = MockTrackingClient( diff --git a/app/src/test/java/com/kickstarter/viewmodels/CommentsViewHolderViewModelTest.kt b/app/src/test/java/com/kickstarter/viewmodels/CommentsViewHolderViewModelTest.kt index b1e03c5594..589f79b30e 100644 --- a/app/src/test/java/com/kickstarter/viewmodels/CommentsViewHolderViewModelTest.kt +++ b/app/src/test/java/com/kickstarter/viewmodels/CommentsViewHolderViewModelTest.kt @@ -2,7 +2,6 @@ package com.kickstarter.viewmodels import com.kickstarter.KSRobolectricTestCase import com.kickstarter.libs.Environment -import com.kickstarter.libs.MockCurrentUser import com.kickstarter.libs.MockCurrentUserV2 import com.kickstarter.libs.utils.extensions.addToDisposable import com.kickstarter.mock.factories.AvatarFactory @@ -231,7 +230,7 @@ class CommentsViewHolderViewModelTest : KSRobolectricTestCase() { @Test fun testCommentReplyButtonVisibility_whenUserLoggedInAndProjectBacked_shouldSendTrue() { val environment = environment().toBuilder() - .currentUser(MockCurrentUser(UserFactory.user())) + .currentUserV2(MockCurrentUserV2(UserFactory.user())) .build() setUpEnvironment(environment) val comment = CommentFactory.comment() @@ -243,7 +242,7 @@ class CommentsViewHolderViewModelTest : KSRobolectricTestCase() { @Test fun testCommentReplyButtonVisibility_whenUserLoggedInAndProjectNotBacked_shouldSendFalse() { val environment = environment().toBuilder() - .currentUser(MockCurrentUser(UserFactory.user())) + .currentUserV2(MockCurrentUserV2(UserFactory.user())) .build() setUpEnvironment(environment) val comment = CommentFactory.comment() @@ -284,7 +283,7 @@ class CommentsViewHolderViewModelTest : KSRobolectricTestCase() { val repliesCount = BehaviorSubject.create() val environment = environment().toBuilder() - .currentUser(MockCurrentUser(UserFactory.user())) + .currentUserV2(MockCurrentUserV2(UserFactory.user())) .build() setUpEnvironment(environment) val comment = CommentFactory.comment(repliesCount = 1) @@ -423,7 +422,7 @@ class CommentsViewHolderViewModelTest : KSRobolectricTestCase() { return Observable.just(responseComment) } }) - .currentUser(MockCurrentUser(currentUser)) + .currentUserV2(MockCurrentUserV2(currentUser)) .build() setUpEnvironment(env) @@ -568,7 +567,7 @@ class CommentsViewHolderViewModelTest : KSRobolectricTestCase() { @Test fun testCommentsViewModel_whenCommentFlagged_shouldSetStatusToFlagged() { - val env = environment().toBuilder().currentUser(MockCurrentUser(UserFactory.user())).build() + val env = environment().toBuilder().currentUserV2(MockCurrentUserV2(UserFactory.user())).build() setUpEnvironment(env) val commentCardData = CommentFactory.liveCommentCardData(createdAt = createdAt, currentUser = currentUser, hasFlaggings = true) @@ -594,7 +593,7 @@ class CommentsViewHolderViewModelTest : KSRobolectricTestCase() { @Test fun testCommentsViewModel_whenCommentFlaggedAndSustained_shouldNotSetStatusToFlagged() { - val env = environment().toBuilder().currentUser(MockCurrentUser(UserFactory.user())).build() + val env = environment().toBuilder().currentUserV2(MockCurrentUserV2(UserFactory.user())).build() setUpEnvironment(env) val commentCardData = CommentFactory.liveCommentCardData(createdAt = createdAt, currentUser = currentUser, hasFlaggings = true, sustained = true) @@ -606,7 +605,7 @@ class CommentsViewHolderViewModelTest : KSRobolectricTestCase() { @Test fun testCommentsViewModel_whenCommentFlaggedAndDeleted_shouldNotSetStatusToFlagged() { - val env = environment().toBuilder().currentUser(MockCurrentUser(UserFactory.user())).build() + val env = environment().toBuilder().currentUserV2(MockCurrentUserV2(UserFactory.user())).build() setUpEnvironment(env) val commentCardData = CommentFactory.liveCommentCardData(createdAt = createdAt, currentUser = currentUser, isDelete = true, hasFlaggings = true, sustained = false) @@ -669,7 +668,7 @@ class CommentsViewHolderViewModelTest : KSRobolectricTestCase() { val author = UserFactory.user().toBuilder().id(1).build() val currentUser = UserFactory.user().toBuilder().id(1).build() val environment = environment().toBuilder() - .currentUser(MockCurrentUser(currentUser)) + .currentUserV2(MockCurrentUserV2(currentUser)) .build() setUpEnvironment(environment) @@ -689,7 +688,7 @@ class CommentsViewHolderViewModelTest : KSRobolectricTestCase() { fun commentBadge_whenCreator_shouldEmitCreator() { val currentUser = UserFactory.user().toBuilder().id(1).build() val environment = environment().toBuilder() - .currentUser(MockCurrentUser(currentUser)) + .currentUserV2(MockCurrentUserV2(currentUser)) .build() setUpEnvironment(environment) @@ -711,7 +710,7 @@ class CommentsViewHolderViewModelTest : KSRobolectricTestCase() { fun commentBadge_whenSuperBacker_shouldEmitSuperbacker() { val currentUser = UserFactory.user().toBuilder().id(1).build() val environment = environment().toBuilder() - .currentUser(MockCurrentUser(currentUser)) + .currentUserV2(MockCurrentUserV2(currentUser)) .build() setUpEnvironment(environment) @@ -733,7 +732,7 @@ class CommentsViewHolderViewModelTest : KSRobolectricTestCase() { fun commentBadge_whenNoBadge_shouldEmitNoBadge() { val currentUser = UserFactory.user().toBuilder().id(1).build() val environment = environment().toBuilder() - .currentUser(MockCurrentUser(currentUser)) + .currentUserV2(MockCurrentUserV2(currentUser)) .build() setUpEnvironment(environment) diff --git a/app/src/test/java/com/kickstarter/viewmodels/CommentsViewModelTest.kt b/app/src/test/java/com/kickstarter/viewmodels/CommentsViewModelTest.kt index 45447a09b7..961135d285 100644 --- a/app/src/test/java/com/kickstarter/viewmodels/CommentsViewModelTest.kt +++ b/app/src/test/java/com/kickstarter/viewmodels/CommentsViewModelTest.kt @@ -3,7 +3,6 @@ package com.kickstarter.viewmodels import android.content.Intent import android.util.Pair import com.kickstarter.KSRobolectricTestCase -import com.kickstarter.libs.MockCurrentUser import com.kickstarter.libs.MockCurrentUserV2 import com.kickstarter.libs.utils.EventName import com.kickstarter.libs.utils.extensions.addToDisposable @@ -543,7 +542,7 @@ class CommentsViewModelTest : KSRobolectricTestCase() { val intent = Intent().putExtra(IntentKey.UPDATE, UpdateFactory.update()) val vm = Factory( - environment().toBuilder().currentUser(MockCurrentUser(currentUser)).build(), + environment().toBuilder().currentUserV2(MockCurrentUserV2(currentUser)).build(), intent ).create(CommentsViewModel::class.java) diff --git a/app/src/test/java/com/kickstarter/viewmodels/CreatePasswordViewModelTest.kt b/app/src/test/java/com/kickstarter/viewmodels/CreatePasswordViewModelTest.kt index 530f6ca5a7..b1603690d5 100644 --- a/app/src/test/java/com/kickstarter/viewmodels/CreatePasswordViewModelTest.kt +++ b/app/src/test/java/com/kickstarter/viewmodels/CreatePasswordViewModelTest.kt @@ -143,7 +143,7 @@ class CreatePasswordViewModelTest : KSRobolectricTestCase() { this.vm.inputs.createPasswordClicked() this.success.assertValue("test@emai") - currentUser.assertValues(user, null) + // TODO: Force Logout logic after succesful change is living on the UI, should be moved to the VM and tested } private fun getMockClientWithUser(user: User) = MockTrackingClient( diff --git a/app/src/test/java/com/kickstarter/viewmodels/FacebookConfimationViewModelTest.kt b/app/src/test/java/com/kickstarter/viewmodels/FacebookConfimationViewModelTest.kt index c39bd9a9f3..d15104df9e 100644 --- a/app/src/test/java/com/kickstarter/viewmodels/FacebookConfimationViewModelTest.kt +++ b/app/src/test/java/com/kickstarter/viewmodels/FacebookConfimationViewModelTest.kt @@ -2,9 +2,9 @@ package com.kickstarter.viewmodels import android.content.Intent import com.kickstarter.KSRobolectricTestCase -import com.kickstarter.libs.CurrentConfigType +import com.kickstarter.libs.CurrentConfigTypeV2 import com.kickstarter.libs.utils.extensions.addToDisposable -import com.kickstarter.mock.MockCurrentConfig +import com.kickstarter.mock.MockCurrentConfigV2 import com.kickstarter.mock.factories.ApiExceptionFactory import com.kickstarter.mock.factories.ConfigFactory.config import com.kickstarter.mock.services.MockApiClientV2 @@ -85,9 +85,9 @@ class FacebookConfimationViewModelTest : KSRobolectricTestCase() { @Test fun testToggleSendNewsLetter_isNotChecked() { - val currentConfig: CurrentConfigType = MockCurrentConfig() + val currentConfig: CurrentConfigTypeV2 = MockCurrentConfigV2() currentConfig.config(config().toBuilder().countryCode("US").build()) - val environment = environment().toBuilder().currentConfig(currentConfig).build() + val environment = environment().toBuilder().currentConfig2(currentConfig).build() val vm = FacebookConfirmationViewModel.FacebookConfirmationViewModel(environment) vm.outputs.sendNewslettersIsChecked().subscribe { this.sendNewslettersIsChecked.onNext(it) }.addToDisposable(disposables) diff --git a/app/src/test/java/com/kickstarter/viewmodels/LoginToutViewModelTest.kt b/app/src/test/java/com/kickstarter/viewmodels/LoginToutViewModelTest.kt index 7f6d27fe99..3c0f5fec1e 100644 --- a/app/src/test/java/com/kickstarter/viewmodels/LoginToutViewModelTest.kt +++ b/app/src/test/java/com/kickstarter/viewmodels/LoginToutViewModelTest.kt @@ -3,7 +3,6 @@ package com.kickstarter.viewmodels import com.facebook.FacebookAuthorizationException import com.kickstarter.KSRobolectricTestCase import com.kickstarter.libs.Environment -import com.kickstarter.libs.MockCurrentUser import com.kickstarter.libs.MockCurrentUserV2 import com.kickstarter.libs.featureflag.FlagKey import com.kickstarter.libs.utils.EventName @@ -50,7 +49,8 @@ class LoginToutViewModelTest : KSRobolectricTestCase() { .addToDisposable(disposables) vm.outputs.showDisclaimerActivity().subscribe { showDisclaimerActivity.onNext(it) } .addToDisposable(disposables) - environment.currentUser()?.observable()?.subscribe { currentUser.onNext(it) } + environment.currentUserV2()?.observable()?.subscribe { currentUser.onNext(it.getValue()) } + ?.addToDisposable(disposables) vm.outputs.finishOauthWithSuccessfulResult().subscribe { finishOathWithSuccessfulResult.onNext(it) } @@ -104,7 +104,7 @@ class LoginToutViewModelTest : KSRobolectricTestCase() { @Test fun facebookLogin_error_reset_password_WithFeatureFlag_Enabled() { - val currentUser = MockCurrentUser() + val currentUser = MockCurrentUserV2() val mockFeatureFlagClientType: MockFeatureFlagClient = object : MockFeatureFlagClient() { override fun getBoolean(FlagKey: FlagKey): Boolean { @@ -114,7 +114,7 @@ class LoginToutViewModelTest : KSRobolectricTestCase() { val environment = environment() .toBuilder() - .currentUser(currentUser) + .currentUserV2(currentUser) .featureFlagClient(mockFeatureFlagClientType) .build() setUpEnvironment(environment, LoginReason.DEFAULT) @@ -138,7 +138,7 @@ class LoginToutViewModelTest : KSRobolectricTestCase() { @Test fun facebookLogin_error_login_WithFeatureFlag_Enabled() { - val currentUser = MockCurrentUser() + val currentUser = MockCurrentUserV2() val mockFeatureFlagClient: MockFeatureFlagClient = object : MockFeatureFlagClient() { override fun getBoolean(FlagKey: FlagKey): Boolean { @@ -148,7 +148,7 @@ class LoginToutViewModelTest : KSRobolectricTestCase() { val environment = environment() .toBuilder() - .currentUser(currentUser) + .currentUserV2(currentUser) .featureFlagClient(mockFeatureFlagClient) .apiClientV2(object : MockApiClientV2() { override fun loginWithFacebook(accessToken: String): Observable { @@ -178,10 +178,10 @@ class LoginToutViewModelTest : KSRobolectricTestCase() { @Test fun facebookLogin_error() { - val currentUser = MockCurrentUser() + val currentUser = MockCurrentUserV2() val environment = environment() .toBuilder() - .currentUser(currentUser) + .currentUserV2(currentUser) .apiClientV2(object : MockApiClientV2() { override fun loginWithFacebook(accessToken: String): Observable { return Observable.error(Throwable("error")) diff --git a/app/src/test/java/com/kickstarter/viewmodels/MessagesViewModelTest.kt b/app/src/test/java/com/kickstarter/viewmodels/MessagesViewModelTest.kt index 1bbffb6508..545a50670b 100644 --- a/app/src/test/java/com/kickstarter/viewmodels/MessagesViewModelTest.kt +++ b/app/src/test/java/com/kickstarter/viewmodels/MessagesViewModelTest.kt @@ -6,7 +6,6 @@ import com.kickstarter.KSRobolectricTestCase import com.kickstarter.libs.CurrentUserTypeV2 import com.kickstarter.libs.Environment import com.kickstarter.libs.MessagePreviousScreenType -import com.kickstarter.libs.MockCurrentUser import com.kickstarter.libs.MockCurrentUserV2 import com.kickstarter.libs.utils.extensions.addToDisposable import com.kickstarter.libs.utils.extensions.reduceProjectPayload @@ -328,7 +327,7 @@ class MessagesViewModelTest : KSRobolectricTestCase() { // Start the view model with a message thread. setUpEnvironment( - environment().toBuilder().currentUser(MockCurrentUser(user())).build(), + environment().toBuilder().currentUserV2(MockCurrentUserV2(user())).build(), messagesContextIntent(messageThread()) ) diff --git a/app/src/test/java/com/kickstarter/viewmodels/PledgeFragmentViewModelTest.kt b/app/src/test/java/com/kickstarter/viewmodels/PledgeFragmentViewModelTest.kt index c9c8b32000..dfdb8ffeb6 100644 --- a/app/src/test/java/com/kickstarter/viewmodels/PledgeFragmentViewModelTest.kt +++ b/app/src/test/java/com/kickstarter/viewmodels/PledgeFragmentViewModelTest.kt @@ -16,7 +16,6 @@ import com.kickstarter.libs.utils.EventName import com.kickstarter.libs.utils.RefTagUtils import com.kickstarter.libs.utils.extensions.addToDisposable import com.kickstarter.libs.utils.extensions.trimAllWhitespace -import com.kickstarter.mock.MockCurrentConfig import com.kickstarter.mock.MockCurrentConfigV2 import com.kickstarter.mock.MockFeatureFlagClient import com.kickstarter.mock.factories.BackingFactory @@ -2348,7 +2347,7 @@ class PledgeFragmentViewModelTest : KSRobolectricTestCase() { .build() val config = ConfigFactory.configForUSUser() - val currentConfig = MockCurrentConfig() + val currentConfig = MockCurrentConfigV2() currentConfig.config(config) val germanyShippingRule = ShippingRuleFactory.germanyShippingRule() @@ -2501,7 +2500,7 @@ class PledgeFragmentViewModelTest : KSRobolectricTestCase() { .build() val config = ConfigFactory.configForUSUser() - val currentConfig = MockCurrentConfig() + val currentConfig = MockCurrentConfigV2() currentConfig.config(config) val germanyShippingRule = ShippingRuleFactory.germanyShippingRule() @@ -3127,7 +3126,7 @@ class PledgeFragmentViewModelTest : KSRobolectricTestCase() { .build() val config = ConfigFactory.configForUSUser() - val currentConfig = MockCurrentConfig() + val currentConfig = MockCurrentConfigV2() currentConfig.config(config) val germanyShippingRule = ShippingRuleFactory.germanyShippingRule() diff --git a/app/src/test/java/com/kickstarter/viewmodels/PrelaunchProjectViewModelTest.kt b/app/src/test/java/com/kickstarter/viewmodels/PrelaunchProjectViewModelTest.kt index 7fd964044a..578aca9f28 100644 --- a/app/src/test/java/com/kickstarter/viewmodels/PrelaunchProjectViewModelTest.kt +++ b/app/src/test/java/com/kickstarter/viewmodels/PrelaunchProjectViewModelTest.kt @@ -5,7 +5,6 @@ import android.content.SharedPreferences import android.util.Pair import com.kickstarter.KSRobolectricTestCase import com.kickstarter.libs.Environment -import com.kickstarter.libs.MockCurrentUser import com.kickstarter.libs.MockCurrentUserV2 import com.kickstarter.libs.featureflag.FlagKey import com.kickstarter.libs.utils.ThirdPartyEventValues @@ -25,6 +24,7 @@ import com.kickstarter.viewmodels.projectpage.PrelaunchProjectViewModel import com.kickstarter.viewmodels.usecases.TPEventInputData import io.reactivex.Observable import io.reactivex.disposables.CompositeDisposable +import io.reactivex.subjects.BehaviorSubject import io.reactivex.subscribers.TestSubscriber import okhttp3.ResponseBody import org.joda.time.DateTime @@ -33,7 +33,6 @@ import org.junit.After import org.junit.Test import org.mockito.Mockito import retrofit2.HttpException -import rx.subjects.BehaviorSubject import java.util.concurrent.TimeUnit class PrelaunchProjectViewModelTest : KSRobolectricTestCase() { @@ -214,10 +213,9 @@ class PrelaunchProjectViewModelTest : KSRobolectricTestCase() { @Test fun testToggleBookmark() { - val currentUser = MockCurrentUser() val currentUserV2 = MockCurrentUserV2() - val mockedEnv = testEnvironment.toBuilder().currentUser(currentUser) + val mockedEnv = testEnvironment.toBuilder() .currentUserV2(currentUserV2).build() setUpEnvironment(mockedEnv) @@ -225,16 +223,15 @@ class PrelaunchProjectViewModelTest : KSRobolectricTestCase() { assertEquals(project.value, prelaunchProject) - currentUser.refresh(UserFactory.user()) currentUserV2.refresh(UserFactory.user()) vm.inputs.bookmarkButtonClicked() - assertEquals(project.value.isStarred(), true) + assertEquals(project.value?.isStarred(), true) vm.inputs.bookmarkButtonClicked() - assertEquals(project.value.isStarred(), false) + assertEquals(project.value?.isStarred(), false) } @Test @@ -249,16 +246,14 @@ class PrelaunchProjectViewModelTest : KSRobolectricTestCase() { val expectedName = "Best Project 2K19" val expectedShareUrl = "https://www.kck.str/projects/" + creator.id().toString() + "/" + slug + "?ref=android_project_share" - assertEquals(showShareSheet.value.first, expectedName) - assertEquals(showShareSheet.value.second, expectedShareUrl) + assertEquals(showShareSheet.value?.first, expectedName) + assertEquals(showShareSheet.value?.second, expectedShareUrl) } @Test fun testLoggedOutStarProjectFlow() { - val currentUser = MockCurrentUser() val currentUserV2 = MockCurrentUserV2() - - val mockedEnv = testEnvironment.toBuilder().currentUser(currentUser) + val mockedEnv = testEnvironment.toBuilder() .currentUserV2(currentUserV2).build() setUpEnvironment(mockedEnv) @@ -271,21 +266,20 @@ class PrelaunchProjectViewModelTest : KSRobolectricTestCase() { // Try starring while logged out vm.inputs.bookmarkButtonClicked() - assertEquals(project.value.isStarred(), false) + assertEquals(project.value?.isStarred(), false) this.showSavedPrompt.assertValueCount(0) this.startLoginToutActivity.assertValueCount(1) // Login - currentUser.refresh(UserFactory.user()) currentUserV2.refresh(UserFactory.user()) vm.inputs.bookmarkButtonClicked() vm.inputs.bookmarkButtonClicked() - assertEquals(true, project.value.isStarred()) + assertEquals(true, project.value?.isStarred()) this.showSavedPrompt.assertValueCount(1) vm.inputs.bookmarkButtonClicked() - assertEquals(false, project.value.isStarred()) + assertEquals(false, project.value?.isStarred()) this.showSavedPrompt.assertValueCount(1) } @@ -314,10 +308,9 @@ class PrelaunchProjectViewModelTest : KSRobolectricTestCase() { } } - val currentUser = MockCurrentUser() val currentUserV2 = MockCurrentUserV2() - val mockedEnv = testEnvironment.toBuilder().currentUser(currentUser) + val mockedEnv = testEnvironment.toBuilder() .currentUserV2(currentUserV2) .featureFlagClient(mockFeatureFlagClient) .sharedPreferences(sharedPreferences) diff --git a/app/src/test/java/com/kickstarter/viewmodels/ProfileViewModelTest.kt b/app/src/test/java/com/kickstarter/viewmodels/ProfileViewModelTest.kt index 52d786bb0f..0cc3c43deb 100644 --- a/app/src/test/java/com/kickstarter/viewmodels/ProfileViewModelTest.kt +++ b/app/src/test/java/com/kickstarter/viewmodels/ProfileViewModelTest.kt @@ -2,7 +2,7 @@ package com.kickstarter.viewmodels import com.kickstarter.KSRobolectricTestCase import com.kickstarter.libs.Environment -import com.kickstarter.libs.MockCurrentUser +import com.kickstarter.libs.MockCurrentUserV2 import com.kickstarter.libs.utils.EventName import com.kickstarter.libs.utils.NumberUtils import com.kickstarter.libs.utils.extensions.addToDisposable @@ -220,10 +220,10 @@ class ProfileViewModelTest : KSRobolectricTestCase() { @Test fun testProfileViewModel_shouldEmitProjectPage() { - val user = MockCurrentUser() + val user = MockCurrentUserV2() val environment = environment().toBuilder() - .currentUser(user) + .currentUserV2(user) .build() setUpEnvironment(environment) diff --git a/app/src/test/java/com/kickstarter/viewmodels/ProjectOverviewViewModelTest.kt b/app/src/test/java/com/kickstarter/viewmodels/ProjectOverviewViewModelTest.kt index 1d8683f4a1..81ab96a007 100644 --- a/app/src/test/java/com/kickstarter/viewmodels/ProjectOverviewViewModelTest.kt +++ b/app/src/test/java/com/kickstarter/viewmodels/ProjectOverviewViewModelTest.kt @@ -10,7 +10,6 @@ import com.kickstarter.libs.utils.NumberUtils import com.kickstarter.libs.utils.ProgressBarUtils import com.kickstarter.libs.utils.extensions.addToDisposable import com.kickstarter.libs.utils.extensions.deadlineCountdownValue -import com.kickstarter.mock.MockCurrentConfig import com.kickstarter.mock.MockCurrentConfigV2 import com.kickstarter.mock.factories.CategoryFactory import com.kickstarter.mock.factories.ConfigFactory @@ -565,7 +564,7 @@ class ProjectOverviewViewModelTest : KSRobolectricTestCase() { .country("US") .build() val config = ConfigFactory.configForUSUser() - val currentConfig = MockCurrentConfig() + val currentConfig = MockCurrentConfigV2() currentConfig.config(config) setUpEnvironment(environment(), project(project)) diff --git a/app/src/test/java/com/kickstarter/viewmodels/RewardCardUnselectedViewHolderViewModelTest.kt b/app/src/test/java/com/kickstarter/viewmodels/RewardCardUnselectedViewHolderViewModelTest.kt index 7600a25786..2eca01fd25 100644 --- a/app/src/test/java/com/kickstarter/viewmodels/RewardCardUnselectedViewHolderViewModelTest.kt +++ b/app/src/test/java/com/kickstarter/viewmodels/RewardCardUnselectedViewHolderViewModelTest.kt @@ -12,9 +12,9 @@ import com.kickstarter.models.Backing import com.kickstarter.models.StoredCard import com.stripe.android.model.CardBrand import io.reactivex.disposables.CompositeDisposable +import io.reactivex.subscribers.TestSubscriber import org.junit.After import org.junit.Test -import rx.observers.TestSubscriber import java.util.Date import java.util.GregorianCalendar diff --git a/app/src/test/java/com/kickstarter/viewmodels/RootCommentViewHolderViewModelTest.kt b/app/src/test/java/com/kickstarter/viewmodels/RootCommentViewHolderViewModelTest.kt index efa0ba4b42..bb5bcb5eb2 100644 --- a/app/src/test/java/com/kickstarter/viewmodels/RootCommentViewHolderViewModelTest.kt +++ b/app/src/test/java/com/kickstarter/viewmodels/RootCommentViewHolderViewModelTest.kt @@ -2,7 +2,7 @@ package com.kickstarter.viewmodels import com.kickstarter.KSRobolectricTestCase import com.kickstarter.libs.Environment -import com.kickstarter.libs.MockCurrentUser +import com.kickstarter.libs.MockCurrentUserV2 import com.kickstarter.libs.utils.extensions.addToDisposable import com.kickstarter.mock.factories.CommentFactory import com.kickstarter.mock.factories.UserFactory @@ -85,7 +85,7 @@ class RootCommentViewHolderViewModelTest : KSRobolectricTestCase() { val author = UserFactory.user().toBuilder().id(1).build() val currentUser = UserFactory.user().toBuilder().id(1).build() val environment = environment().toBuilder() - .currentUser(MockCurrentUser(currentUser)) + .currentUserV2(MockCurrentUserV2(currentUser)) .build() setupEnvironment(environment) @@ -104,7 +104,7 @@ class RootCommentViewHolderViewModelTest : KSRobolectricTestCase() { fun commentBadge_whenSuperBacker_shouldEmitSuperbacker() { val currentUser = UserFactory.user().toBuilder().id(1).build() val environment = environment().toBuilder() - .currentUser(MockCurrentUser(currentUser)) + .currentUserV2(MockCurrentUserV2(currentUser)) .build() setupEnvironment(environment) @@ -125,7 +125,7 @@ class RootCommentViewHolderViewModelTest : KSRobolectricTestCase() { fun commentBadge_whenCollaborator_shouldEmitCollaborator() { val currentUser = UserFactory.user().toBuilder().id(1).build() val environment = environment().toBuilder() - .currentUser(MockCurrentUser(currentUser)) + .currentUserV2(MockCurrentUserV2(currentUser)) .build() setupEnvironment(environment) @@ -149,7 +149,7 @@ class RootCommentViewHolderViewModelTest : KSRobolectricTestCase() { fun commentBadge_whenNoBadge_shouldEmitNoBadge() { val currentUser = UserFactory.user().toBuilder().id(1).build() val environment = environment().toBuilder() - .currentUser(MockCurrentUser(currentUser)) + .currentUserV2(MockCurrentUserV2(currentUser)) .build() setupEnvironment(environment) diff --git a/app/src/test/java/com/kickstarter/viewmodels/SearchViewModelTest.kt b/app/src/test/java/com/kickstarter/viewmodels/SearchViewModelTest.kt index b164635de8..3b4a4dee9f 100644 --- a/app/src/test/java/com/kickstarter/viewmodels/SearchViewModelTest.kt +++ b/app/src/test/java/com/kickstarter/viewmodels/SearchViewModelTest.kt @@ -3,7 +3,7 @@ package com.kickstarter.viewmodels import android.util.Pair import com.kickstarter.KSRobolectricTestCase import com.kickstarter.libs.Environment -import com.kickstarter.libs.MockCurrentUser +import com.kickstarter.libs.MockCurrentUserV2 import com.kickstarter.libs.RefTag import com.kickstarter.libs.RefTag.Companion.search import com.kickstarter.libs.RefTag.Companion.searchFeatured @@ -384,7 +384,7 @@ class SearchViewModelTest : KSRobolectricTestCase() { @Test fun testProjectPage_whenFeatureFlagOn_shouldEmitProjectPage() { - val user = MockCurrentUser() + val user = MockCurrentUserV2() val mockFeatureFlagClient: MockFeatureFlagClient = object : MockFeatureFlagClient() { override fun getBoolean(FlagKey: FlagKey): Boolean { @@ -403,7 +403,7 @@ class SearchViewModelTest : KSRobolectricTestCase() { } } val env = environment().toBuilder() - .currentUser(user) + .currentUserV2(user) .featureFlagClient(mockFeatureFlagClient) .schedulerV2(scheduler) .apiClientV2(apiClient) diff --git a/app/src/test/java/com/kickstarter/viewmodels/SetPasswordViewModelTest.kt b/app/src/test/java/com/kickstarter/viewmodels/SetPasswordViewModelTest.kt index db3885b536..7c19f1b63c 100644 --- a/app/src/test/java/com/kickstarter/viewmodels/SetPasswordViewModelTest.kt +++ b/app/src/test/java/com/kickstarter/viewmodels/SetPasswordViewModelTest.kt @@ -4,7 +4,6 @@ import UpdateUserPasswordMutation import android.content.Intent import com.kickstarter.KSRobolectricTestCase import com.kickstarter.libs.Environment -import com.kickstarter.libs.MockCurrentUser import com.kickstarter.libs.MockCurrentUserV2 import com.kickstarter.libs.utils.extensions.addToDisposable import com.kickstarter.mock.factories.ApiExceptionFactory @@ -94,7 +93,7 @@ class SetPasswordViewModelTest : KSRobolectricTestCase() { @Test fun testSuccess() { val user = UserFactory.userNeedPassword() - val mockUser = MockCurrentUser(user) + val mockUser = MockCurrentUserV2(user) val currentUserV2 = MockCurrentUserV2() val environment = environment().toBuilder().apolloClientV2(object : MockApolloClientV2() { @@ -113,7 +112,7 @@ class SetPasswordViewModelTest : KSRobolectricTestCase() { ) } }) - .currentUser(mockUser) + .currentUserV2(mockUser) .currentUserV2(currentUserV2) .build() @@ -129,8 +128,6 @@ class SetPasswordViewModelTest : KSRobolectricTestCase() { this.vm.inputs.savePasswordClicked() this.success.assertValue("test@email.com") - - assertEquals(false, mockUser.user?.needsPassword()) } @Test diff --git a/app/src/test/java/com/kickstarter/viewmodels/ShippingRuleViewHolderViewModelTest.kt b/app/src/test/java/com/kickstarter/viewmodels/ShippingRuleViewHolderViewModelTest.kt index 214614dea7..77d1a72145 100644 --- a/app/src/test/java/com/kickstarter/viewmodels/ShippingRuleViewHolderViewModelTest.kt +++ b/app/src/test/java/com/kickstarter/viewmodels/ShippingRuleViewHolderViewModelTest.kt @@ -3,7 +3,7 @@ package com.kickstarter.viewmodels import com.kickstarter.KSRobolectricTestCase import com.kickstarter.libs.Environment import com.kickstarter.libs.utils.extensions.addToDisposable -import com.kickstarter.mock.MockCurrentConfig +import com.kickstarter.mock.MockCurrentConfigV2 import com.kickstarter.mock.factories.ConfigFactory import com.kickstarter.mock.factories.ProjectFactory import com.kickstarter.mock.factories.ShippingRuleFactory @@ -35,11 +35,11 @@ class ShippingRuleViewHolderViewModelTest : KSRobolectricTestCase() { @Test fun testShippingRuleText() { val config = ConfigFactory.configForUSUser() - val currentConfig = MockCurrentConfig() + val currentConfig = MockCurrentConfigV2() currentConfig.config(config) val environment = environment().toBuilder() - .currentConfig(currentConfig) + .currentConfig2(currentConfig) .build() setupEnvironment(environment) diff --git a/app/src/test/java/com/kickstarter/viewmodels/ThanksViewModelTest.kt b/app/src/test/java/com/kickstarter/viewmodels/ThanksViewModelTest.kt index 65a6f6cd5d..9b3cfe999e 100644 --- a/app/src/test/java/com/kickstarter/viewmodels/ThanksViewModelTest.kt +++ b/app/src/test/java/com/kickstarter/viewmodels/ThanksViewModelTest.kt @@ -4,10 +4,8 @@ import android.content.Intent import android.content.SharedPreferences import android.util.Pair import com.kickstarter.KSRobolectricTestCase -import com.kickstarter.libs.CurrentUserType import com.kickstarter.libs.CurrentUserTypeV2 import com.kickstarter.libs.Environment -import com.kickstarter.libs.MockCurrentUser import com.kickstarter.libs.MockCurrentUserV2 import com.kickstarter.libs.RefTag import com.kickstarter.libs.RefTag.Companion.thanks @@ -221,7 +219,7 @@ class ThanksViewModelTest : KSRobolectricTestCase() { val hasSeenAppRatingPreference = MockBooleanPreference(false) val hasSeenGamesNewsletterPreference = MockBooleanPreference(false) val user = user().toBuilder().gamesNewsletter(false).build() - val currentUser: CurrentUserType = MockCurrentUser(user) + val currentUser: CurrentUserTypeV2 = MockCurrentUserV2(user) val project = project() .toBuilder() .category(tabletopGamesCategory()) @@ -236,7 +234,7 @@ class ThanksViewModelTest : KSRobolectricTestCase() { val environment = environment() .toBuilder() - .currentUser(currentUser) + .currentUserV2(currentUser) .featureFlagClient(mockFeatureFlagClient) .hasSeenAppRatingPreference(hasSeenAppRatingPreference) .hasSeenGamesNewsletterPreference(hasSeenGamesNewsletterPreference) @@ -273,10 +271,10 @@ class ThanksViewModelTest : KSRobolectricTestCase() { fun testThanksViewModel_dontShowGamesNewsletterDialogIfRootCategoryIsNotGames() { val hasSeenGamesNewsletterPreference = MockBooleanPreference(false) val user = user().toBuilder().gamesNewsletter(false).build() - val currentUser: CurrentUserType = MockCurrentUser(user) + val currentUser: CurrentUserTypeV2 = MockCurrentUserV2(user) val environment = environment() .toBuilder() - .currentUser(currentUser) + .currentUserV2(currentUser) .hasSeenGamesNewsletterPreference(hasSeenGamesNewsletterPreference) .build() @@ -294,10 +292,10 @@ class ThanksViewModelTest : KSRobolectricTestCase() { fun testThanksViewModel_dontShowGamesNewsletterDialogIfUserHasAlreadySeen() { val hasSeenGamesNewsletterPreference = MockBooleanPreference(true) val user = user().toBuilder().gamesNewsletter(false).build() - val currentUser: CurrentUserType = MockCurrentUser(user) + val currentUser: CurrentUserTypeV2 = MockCurrentUserV2(user) val environment = environment() .toBuilder() - .currentUser(currentUser) + .currentUserV2(currentUser) .hasSeenGamesNewsletterPreference(hasSeenGamesNewsletterPreference) .build() @@ -526,7 +524,7 @@ class ThanksViewModelTest : KSRobolectricTestCase() { setUpEnvironment( environment().toBuilder() - .currentUser(MockCurrentUser(user)) + .currentUserV2(MockCurrentUserV2(user)) .sharedPreferences(sharedPreferences) .featureFlagClient(mockFeatureFlagClient) .build(), diff --git a/app/src/test/java/com/kickstarter/viewmodels/UpdateViewModelTest.kt b/app/src/test/java/com/kickstarter/viewmodels/UpdateViewModelTest.kt index 48111ff3f2..2ebc3b6d05 100644 --- a/app/src/test/java/com/kickstarter/viewmodels/UpdateViewModelTest.kt +++ b/app/src/test/java/com/kickstarter/viewmodels/UpdateViewModelTest.kt @@ -4,7 +4,7 @@ import android.content.Intent import android.net.Uri import android.util.Pair import com.kickstarter.KSRobolectricTestCase -import com.kickstarter.libs.MockCurrentUser +import com.kickstarter.libs.MockCurrentUserV2 import com.kickstarter.libs.RefTag import com.kickstarter.libs.utils.NumberUtils import com.kickstarter.libs.utils.extensions.addToDisposable @@ -131,9 +131,9 @@ class UpdateViewModelTest : KSRobolectricTestCase() { @Test fun testUpdateViewModel_whenFeatureFlagOn_shouldEmitProjectPage() { - val user = MockCurrentUser() + val user = MockCurrentUserV2() val environment = environment().toBuilder() - .currentUser(user) + .currentUserV2(user) .build() val vm = UpdateViewModel.UpdateViewModel(environment) val startProjectActivity = TestSubscriber>() diff --git a/app/src/test/java/com/kickstarter/viewmodels/usecases/SendThirdPartyEventUseCaseTest.kt b/app/src/test/java/com/kickstarter/viewmodels/usecases/SendThirdPartyEventUseCaseTest.kt deleted file mode 100644 index 1d9ff5dbc1..0000000000 --- a/app/src/test/java/com/kickstarter/viewmodels/usecases/SendThirdPartyEventUseCaseTest.kt +++ /dev/null @@ -1,442 +0,0 @@ -package com.kickstarter.viewmodels.usecases - -import android.content.SharedPreferences -import android.util.Pair -import com.kickstarter.KSRobolectricTestCase -import com.kickstarter.libs.CurrentUserType -import com.kickstarter.libs.Environment -import com.kickstarter.libs.MockCurrentUser -import com.kickstarter.libs.featureflag.FlagKey -import com.kickstarter.libs.utils.ThirdPartyEventValues -import com.kickstarter.mock.MockFeatureFlagClient -import com.kickstarter.mock.factories.CheckoutDataFactory -import com.kickstarter.mock.factories.ProjectDataFactory -import com.kickstarter.mock.factories.ProjectFactory -import com.kickstarter.mock.factories.RewardFactory -import com.kickstarter.mock.factories.UserFactory -import com.kickstarter.mock.services.MockApolloClient -import com.kickstarter.models.Project -import com.kickstarter.models.Reward -import com.kickstarter.services.transformers.encodeRelayId -import com.kickstarter.ui.SharedPreferenceKey -import com.kickstarter.ui.data.CheckoutData -import com.kickstarter.ui.data.PledgeData -import com.kickstarter.ui.data.PledgeFlowContext -import org.junit.Test -import org.mockito.Mockito -import rx.Observable -import rx.observers.TestSubscriber - -class SendThirdPartyEventUseCaseTest : KSRobolectricTestCase() { - - private var mockSharedPreferences: SharedPreferences = Mockito.mock(SharedPreferences::class.java) - - private val sendThirdPartyEventObservable = TestSubscriber.create>() - - private val mockFeatureFlagClientType: MockFeatureFlagClient = - object : MockFeatureFlagClient() { - override fun getBoolean(FlagKey: FlagKey): Boolean { - return true - } - } - - val currentUser: CurrentUserType = MockCurrentUser(UserFactory.user().toBuilder().id(7272).email("some@email.com").build()) - private fun setUpEnvironment(mockFeatureFlagClient: MockFeatureFlagClient = mockFeatureFlagClientType): Environment { - return environment() - .toBuilder() - .currentUser(currentUser) - .sharedPreferences(mockSharedPreferences) - .featureFlagClient(mockFeatureFlagClient) - .build() - } - - @Test - fun testEvents_whenFeatureFlagOff_doesNotSendEvent() { - Mockito.`when`( - mockSharedPreferences - .getBoolean(SharedPreferenceKey.CONSENT_MANAGEMENT_PREFERENCE, false) - ) - .thenReturn(true) - - val mockFeatureFlagClientType: MockFeatureFlagClient = - object : MockFeatureFlagClient() { - override fun getBoolean(FlagKey: FlagKey): Boolean { - return false - } - } - - val project = ProjectFactory.project().toBuilder().sendThirdPartyEvents(true).build() - - val checkoutData = CheckoutDataFactory.checkoutData( - 3L, - 20.0, - 30.0 - ) - - val pledgeData = PledgeData.with( - PledgeFlowContext.NEW_PLEDGE, - ProjectDataFactory.project(project), - RewardFactory.reward(), - listOf(RewardFactory.addOn(), RewardFactory.addOnMultiple()), - null - ) - - subscribeToThirdPartyEvent(Observable.just(project), setUpEnvironment(mockFeatureFlagClientType), Observable.just(Pair(checkoutData, pledgeData)), ThirdPartyEventValues.EventName.PURCHASE) - sendThirdPartyEventObservable.assertNoValues() - } - - @Test - fun testEvents_whenUserDeclinesConsent_doesNotSendEvent() { - Mockito.`when`( - mockSharedPreferences - .getBoolean(SharedPreferenceKey.CONSENT_MANAGEMENT_PREFERENCE, false) - ) - .thenReturn(false) - - val project = ProjectFactory.project().toBuilder().sendThirdPartyEvents(true).build() - - val checkoutData = CheckoutDataFactory.checkoutData( - 3L, - 20.0, - 30.0 - ) - - val pledgeData = PledgeData.with( - PledgeFlowContext.NEW_PLEDGE, - ProjectDataFactory.project(project), - RewardFactory.reward(), - listOf(RewardFactory.addOn(), RewardFactory.addOnMultiple()), - null - ) - - subscribeToThirdPartyEvent(Observable.just(project), setUpEnvironment(), Observable.just(Pair(checkoutData, pledgeData)), ThirdPartyEventValues.EventName.PURCHASE) - sendThirdPartyEventObservable.assertNoValues() - } - - @Test - fun testEvents_whenCanSendThirdPartyEventsFalse_doesNotSendEvents() { - Mockito.`when`( - mockSharedPreferences - .getBoolean(SharedPreferenceKey.CONSENT_MANAGEMENT_PREFERENCE, false) - ) - .thenReturn(true) - - val project = ProjectFactory.project().toBuilder().sendThirdPartyEvents(false).build() - - val checkoutData = CheckoutDataFactory.checkoutData( - 3L, - 20.0, - 30.0 - ) - - val pledgeData = PledgeData.with( - PledgeFlowContext.NEW_PLEDGE, - ProjectDataFactory.project(project), - RewardFactory.reward(), - listOf(RewardFactory.addOn(), RewardFactory.addOnMultiple()), - null - ) - - subscribeToThirdPartyEvent(Observable.just(project), setUpEnvironment(), Observable.just(Pair(checkoutData, pledgeData)), ThirdPartyEventValues.EventName.PURCHASE) - sendThirdPartyEventObservable.assertNoValues() - } - - @Test - fun testSendThirdPartyPurchaseEvent() { - Mockito.`when`( - mockSharedPreferences - .getBoolean(SharedPreferenceKey.CONSENT_MANAGEMENT_PREFERENCE, false) - ) - .thenReturn(true) - - val project = ProjectFactory.project().toBuilder().sendThirdPartyEvents(true).build() - - val checkoutData = CheckoutDataFactory.checkoutData( - 3L, - 20.0, - 30.0 - ) - val addons = listOf(RewardFactory.addOn().toBuilder().build(), RewardFactory.addOnMultiple().toBuilder().id(242).build()) - val pledgeData = PledgeData.with( - PledgeFlowContext.NEW_PLEDGE, - ProjectDataFactory.project(project), - RewardFactory.reward(), - addons, - null - ) - subscribeToThirdPartyEvent(Observable.just(project), setUpEnvironment(), Observable.just(Pair(checkoutData, pledgeData)), ThirdPartyEventValues.EventName.PURCHASE) - sendThirdPartyEventObservable.assertValue(Pair(true, "")) - } - - @Test - fun testInputForPurchaseEvent() { - Mockito.`when`( - mockSharedPreferences - .getBoolean(SharedPreferenceKey.CONSENT_MANAGEMENT_PREFERENCE, false) - ) - .thenReturn(true) - - val project = ProjectFactory.project().toBuilder().sendThirdPartyEvents(true).build() - - val checkoutData = CheckoutDataFactory.checkoutData( - 3L, - 20.0, - 30.0 - ) - val addons = listOf(RewardFactory.addOn().toBuilder().build(), RewardFactory.addOnMultiple().toBuilder().id(242).build()) - val pledgeData = PledgeData.with( - PledgeFlowContext.NEW_PLEDGE, - ProjectDataFactory.project(project), - RewardFactory.reward(), - addons, - null - ) - - val user = UserFactory - .user() - .toBuilder() - .id(7272) - .build() - - val useCase = SendThirdPartyEventUseCase(mockSharedPreferences, mockFeatureFlagClientType) - - // - The input is built and sent to the Mutation before any network call happens, test here the proper values for the input - val input: TPEventInputData = useCase.buildInput( - eventName = ThirdPartyEventValues.EventName.PURCHASE, - canSendEventFlag = true, - rawData = Pair(Pair(project, user), Pair(checkoutData, pledgeData)) - ) - - assertEquals(ThirdPartyEventValues.EventName.PURCHASE.value, input.eventName) - assertEquals(encodeRelayId(project), input.projectId) - assertEquals(null, input.firebaseScreen) - assertEquals(null, input.firebaseScreen) - assertEquals(3, input.items.size) - assertEquals("242", input.items?.get(2)?.itemId) - assertEquals(100.0, input.items?.get(2)?.price) - assertEquals(20.0, input.shipping) - assertEquals("3", input.transactionId) - assertEquals("7272", input.userId) - - assertEquals(true, input.appData.androidConsent) - assertEquals(false, input.appData.iOSConsent) - assertEquals("a2", input.appData.extInfo.first()) - assertEquals(16, input.appData.extInfo.size) - assertEquals("7.0", input.appData.extInfo[4]) - } - - @Test - fun testSendThirdPartyScreenViewEvent() { - Mockito.`when`( - mockSharedPreferences - .getBoolean(SharedPreferenceKey.CONSENT_MANAGEMENT_PREFERENCE, false) - ) - .thenReturn(true) - - val project = ProjectFactory.project().toBuilder().sendThirdPartyEvents(true).build() - - subscribeToThirdPartyEvent( - Observable.just(project), - setUpEnvironment(), - eventName = ThirdPartyEventValues.EventName.SCREEN_VIEW, - firebaseScreen = ThirdPartyEventValues.ScreenName.PROJECT.value, - firebasePreviousScreen = ThirdPartyEventValues.ScreenName.DISCOVERY.value - ) - - sendThirdPartyEventObservable.assertValue(Pair(true, "")) - } - - fun testInputForScreenViewEvent() { - Mockito.`when`( - mockSharedPreferences - .getBoolean(SharedPreferenceKey.CONSENT_MANAGEMENT_PREFERENCE, false) - ) - .thenReturn(true) - - val project = ProjectFactory.project().toBuilder().sendThirdPartyEvents(true).build() - - val user = UserFactory.user() - val useCase = SendThirdPartyEventUseCase(mockSharedPreferences, mockFeatureFlagClientType) - - // - The input is built and sent to the Mutation before any network call happens, test here the proper values for the input - val input: TPEventInputData = useCase.buildInput( - eventName = ThirdPartyEventValues.EventName.SCREEN_VIEW, - firebaseScreen = ThirdPartyEventValues.ScreenName.PROJECT.value, - firebasePreviousScreen = ThirdPartyEventValues.ScreenName.DISCOVERY.value, - canSendEventFlag = true, - rawData = Pair(Pair(project, user), Pair(null, null)) - ) - - assertEquals(ThirdPartyEventValues.EventName.SCREEN_VIEW.value, input.eventName) - assertEquals(encodeRelayId(project), input.projectId) - assertEquals("7272", input.userId) - assertEquals(ThirdPartyEventValues.ScreenName.PROJECT.value, input.firebaseScreen) - assertEquals(ThirdPartyEventValues.ScreenName.DISCOVERY.value, input.firebasePreviousScreen) - - assertEquals(true, input.appData.androidConsent) - assertEquals(false, input.appData.iOSConsent) - assertEquals("a2", input.appData.extInfo.first()) - assertEquals(16, input.appData.extInfo.size) - assertEquals("6.0.1", input.appData.extInfo[4]) - } - - @Test - fun testSendThirdPartyAddPaymentInfoEventSuccess() { - Mockito.`when`( - mockSharedPreferences - .getBoolean(SharedPreferenceKey.CONSENT_MANAGEMENT_PREFERENCE, false) - ) - .thenReturn(true) - - val project = ProjectFactory.project().toBuilder().sendThirdPartyEvents(true).build() - - val addons = listOf(RewardFactory.addOn().toBuilder().build(), RewardFactory.addOnMultiple().toBuilder().id(242).build()) - val pledgeData = PledgeData.with( - PledgeFlowContext.NEW_PLEDGE, - ProjectDataFactory.project(project), - RewardFactory.reward(), - addons, - null - ) - subscribeToThirdPartyEvent(Observable.just(project), setUpEnvironment(), Observable.just(Pair(null, pledgeData)), ThirdPartyEventValues.EventName.PURCHASE) - sendThirdPartyEventObservable.assertValue(Pair(true, "")) - } - - @Test - fun testSendThirdPartyAddPaymentInfoEventFail() { - Mockito.`when`( - mockSharedPreferences - .getBoolean(SharedPreferenceKey.CONSENT_MANAGEMENT_PREFERENCE, false) - ) - .thenReturn(true) - - val project = ProjectFactory.project().toBuilder().sendThirdPartyEvents(true).build() - - val addons = listOf(RewardFactory.addOn().toBuilder().build(), RewardFactory.addOnMultiple().toBuilder().id(242).build()) - val pledgeData = PledgeData.with( - PledgeFlowContext.NEW_PLEDGE, - ProjectDataFactory.project(project), - RewardFactory.reward(), - addons, - null - ) - - val testResul = Pair(false, "Error message here") - val environment = setUpEnvironment() - .toBuilder() - .apolloClient(object : MockApolloClient() { - override fun triggerThirdPartyEvent(eventInput: TPEventInputData): Observable> { - return Observable.just(testResul) - } - }) - .build() - - val useCase = SendThirdPartyEventUseCase( - requireNotNull(environment.sharedPreferences()), - requireNotNull(environment.featureFlagClient()) - ) - - useCase.sendThirdPartyEvent( - project = Observable.just(project), - apolloClient = requireNotNull(environment.apolloClient()), - checkoutAndPledgeData = Observable.just(Pair(null, pledgeData)), - currentUser = requireNotNull(environment.currentUser()), - eventName = ThirdPartyEventValues.EventName.PURCHASE - ) - .subscribe(sendThirdPartyEventObservable) - - sendThirdPartyEventObservable.assertValue(testResul) - } - - @Test - fun testInputForAddPaymentMethodEvent() { - Mockito.`when`( - mockSharedPreferences - .getBoolean(SharedPreferenceKey.CONSENT_MANAGEMENT_PREFERENCE, false) - ) - .thenReturn(true) - - val project = ProjectFactory.project().toBuilder().sendThirdPartyEvents(true).build() - - val draftPledge = Pair( - 50.0, - 10.0 - ) - - val addons = listOf(RewardFactory.addOn().toBuilder().build(), RewardFactory.addOnMultiple().toBuilder().id(242).build()) - val pledgeData = PledgeData.with( - PledgeFlowContext.NEW_PLEDGE, - ProjectDataFactory.project(project), - RewardFactory.reward(), - addons, - null - ) - - val user = UserFactory - .user() - .toBuilder() - .id(7272) - .build() - - val useCase = SendThirdPartyEventUseCase(mockSharedPreferences, mockFeatureFlagClientType) - - // - The input is built and sent to the Mutation before any network call happens, test here the proper values for the input - val input: TPEventInputData = useCase.buildInput( - eventName = ThirdPartyEventValues.EventName.PURCHASE, - canSendEventFlag = true, - draftPledge = draftPledge, - rawData = Pair(Pair(project, user), Pair(null, pledgeData)) - ) - - assertEquals(ThirdPartyEventValues.EventName.PURCHASE.value, input.eventName) - assertEquals(encodeRelayId(project), input.projectId) - assertEquals(null, input.firebaseScreen) - assertEquals(null, input.firebaseScreen) - assertEquals("242", input.items?.get(2)?.itemId) - assertEquals(100.0, input.items?.get(2)?.price) - assertEquals(50.0, input.pledgeAmount) - assertEquals(10.0, input.shipping) - assertEquals("", input.transactionId) - assertEquals("7272", input.userId) - assertEquals(3, input.items.size) - - assertEquals(true, input.appData.androidConsent) - assertEquals(false, input.appData.iOSConsent) - assertEquals("a2", input.appData.extInfo.first()) - assertEquals(16, input.appData.extInfo.size) - assertEquals("7.0", input.appData.extInfo[4]) - } - - private fun subscribeToThirdPartyEvent( - project: Observable, - environment: Environment, - checkoutAndPledgeData: Observable?> = Observable.just(Pair(null, null)), - eventName: ThirdPartyEventValues.EventName, - firebaseScreen: String = "", - firebasePreviousScreen: String = "", - ) { - - val apolloClient = object : MockApolloClient() { - override fun triggerThirdPartyEvent(eventInput: TPEventInputData): Observable> { - return Observable.just(Pair(true, "")) - } - } - - val useCase = SendThirdPartyEventUseCase( - requireNotNull(environment.sharedPreferences()), - requireNotNull(environment.featureFlagClient()) - ) - - useCase.sendThirdPartyEvent( - project = project, - apolloClient = apolloClient, - checkoutAndPledgeData = checkoutAndPledgeData, - currentUser = requireNotNull(environment.currentUser()), - eventName = eventName, - firebaseScreen = firebaseScreen, - firebasePreviousScreen = firebasePreviousScreen - ).subscribe { - sendThirdPartyEventObservable.onNext(it) - } - } -} diff --git a/app/src/test/java/com/kickstarter/viewmodels/usecases/SendThirdPartyEventUseCaseV2Test.kt b/app/src/test/java/com/kickstarter/viewmodels/usecases/SendThirdPartyEventUseCaseV2Test.kt index babf00584a..85216d2c8b 100644 --- a/app/src/test/java/com/kickstarter/viewmodels/usecases/SendThirdPartyEventUseCaseV2Test.kt +++ b/app/src/test/java/com/kickstarter/viewmodels/usecases/SendThirdPartyEventUseCaseV2Test.kt @@ -3,9 +3,9 @@ package com.kickstarter.viewmodels.usecases import android.content.SharedPreferences import android.util.Pair import com.kickstarter.KSRobolectricTestCase -import com.kickstarter.libs.CurrentUserType +import com.kickstarter.libs.CurrentUserTypeV2 import com.kickstarter.libs.Environment -import com.kickstarter.libs.MockCurrentUser +import com.kickstarter.libs.MockCurrentUserV2 import com.kickstarter.libs.featureflag.FlagKey import com.kickstarter.libs.utils.ThirdPartyEventValues import com.kickstarter.libs.utils.extensions.addToDisposable @@ -25,10 +25,10 @@ import com.kickstarter.ui.data.PledgeData import com.kickstarter.ui.data.PledgeFlowContext import io.reactivex.Observable import io.reactivex.disposables.CompositeDisposable +import io.reactivex.subscribers.TestSubscriber import org.junit.After import org.junit.Test import org.mockito.Mockito -import rx.observers.TestSubscriber class SendThirdPartyEventUseCaseV2Test : KSRobolectricTestCase() { @@ -45,11 +45,11 @@ class SendThirdPartyEventUseCaseV2Test : KSRobolectricTestCase() { } } - val currentUser: CurrentUserType = MockCurrentUser(UserFactory.user().toBuilder().id(7272).email("some@email.com").build()) + val currentUser: CurrentUserTypeV2 = MockCurrentUserV2(UserFactory.user().toBuilder().id(7272).email("some@email.com").build()) private fun setUpEnvironment(mockFeatureFlagClient: MockFeatureFlagClient = mockFeatureFlagClientType): Environment { return environment() .toBuilder() - .currentUser(currentUser) + .currentUserV2(currentUser) .sharedPreferences(mockSharedPreferences) .featureFlagClient(mockFeatureFlagClient) .build()