From 6feb3b2aa2b561b164791834fcbc68369975a035 Mon Sep 17 00:00:00 2001 From: Tran Huu Tin Date: Wed, 28 Mar 2018 15:51:14 +0700 Subject: [PATCH 01/45] Upgrade AGP to 3.1.0 (#278) * Upgradle gradle plugin * AccountData shoulds needs domain at runtime * Include in immutableGson in packaging * Use the module * Prefer Google * 27 now * Revert this * Revert this --- .travis.yml | 6 ++---- AccountData/build.gradle | 14 +++++++------- CommonCoreLegacy/build.gradle | 8 +++++--- TripKitAndroid/build.gradle | 4 ++-- TripKitData/build.gradle | 4 ++-- TripKitDomainLegacy/build.gradle | 4 ++-- TripKitSamples/build.gradle | 1 - ValidBookingCountData/build.gradle | 4 ++-- build.gradle | 4 ++-- dependencies.gradle | 16 ++++++++-------- trip-kit-booking/build.gradle | 7 ++++--- 11 files changed, 36 insertions(+), 36 deletions(-) diff --git a/.travis.yml b/.travis.yml index aa5d6bc60..dc0b637cb 100644 --- a/.travis.yml +++ b/.travis.yml @@ -14,12 +14,10 @@ android: - platform-tools # The BuildTools version used by your project - - build-tools-26.0.2 + - build-tools-27.0.3 # The SDK version used to compile your project - - android-24 - - android-25 - - android-26 + - android-27 # Additional components - extra-google-google_play_services diff --git a/AccountData/build.gradle b/AccountData/build.gradle index db970bdd7..cc34b523d 100644 --- a/AccountData/build.gradle +++ b/AccountData/build.gradle @@ -35,16 +35,16 @@ dependencies { implementation libs.retrofitAdapterRxJava implementation libs.retrofit implementation libs.gson - compileOnly project(":AccountDomain") - compileOnly project(":TripKitDomain") - + implementation project(":AccountDomain") + implementation project(":TripKitDomain") implementation libs.dagger kapt libs.daggerCompiler - annotationProcessor libs.value - compileOnly libs.valueAnnotations + kapt libs.value + compileOnly libs.builderAnnotations - compileOnly libs.gsonAnnotations + implementation libs.immutablesGson + compileOnly libs.valueAnnotations implementation libs.kotlin -} +} \ No newline at end of file diff --git a/CommonCoreLegacy/build.gradle b/CommonCoreLegacy/build.gradle index 1b3771a02..43ea331e0 100644 --- a/CommonCoreLegacy/build.gradle +++ b/CommonCoreLegacy/build.gradle @@ -3,6 +3,7 @@ apply plugin: "com.android.library" // See https://jitpack.io/docs/ANDROID/. apply plugin: "com.github.dcendents.android-maven" apply plugin: "kotlin-android" +apply plugin: "kotlin-kapt" // For https://github.com/dcendents/android-maven-gradle-plugin. group = "com.skedgo.tripkit" @@ -55,8 +56,9 @@ dependencies { implementation project(':TripKitDomain') implementation libs.kotlin - annotationProcessor libs.value + + kapt libs.value compileOnly libs.valueAnnotations compileOnly libs.builderAnnotations - compileOnly libs.gsonAnnotations -} + implementation libs.immutablesGson +} \ No newline at end of file diff --git a/TripKitAndroid/build.gradle b/TripKitAndroid/build.gradle index de48e311d..c226becbb 100644 --- a/TripKitAndroid/build.gradle +++ b/TripKitAndroid/build.gradle @@ -75,10 +75,10 @@ dependencies { implementation libs.dagger kapt libs.daggerCompiler - annotationProcessor libs.value + kapt libs.value compileOnly libs.valueAnnotations compileOnly libs.builderAnnotations - compileOnly libs.gsonAnnotations + implementation libs.immutablesGson api project(':CommonCoreLegacy') api project(':TripKitDomain') api project(':TripKitDomainLegacy') diff --git a/TripKitData/build.gradle b/TripKitData/build.gradle index 6b3a3f678..edf4680d0 100644 --- a/TripKitData/build.gradle +++ b/TripKitData/build.gradle @@ -38,9 +38,9 @@ dependencies { implementation libs.rxrelay1 implementation libs.jodaTimeAndroid kapt libs.daggerCompiler - annotationProcessor libs.value + kapt libs.value compileOnly libs.valueAnnotations compileOnly libs.builderAnnotations - compileOnly libs.gsonAnnotations + implementation libs.immutablesGson implementation libs.kotlin } diff --git a/TripKitDomainLegacy/build.gradle b/TripKitDomainLegacy/build.gradle index 78a76b525..15c341678 100644 --- a/TripKitDomainLegacy/build.gradle +++ b/TripKitDomainLegacy/build.gradle @@ -29,10 +29,10 @@ dependencies { implementation libs.dagger kapt libs.daggerCompiler - annotationProcessor libs.value + kapt libs.value compileOnly libs.valueAnnotations compileOnly libs.builderAnnotations - compileOnly libs.gsonAnnotations + implementation libs.immutablesGson implementation libs.kotlin implementation libs.rxjava } diff --git a/TripKitSamples/build.gradle b/TripKitSamples/build.gradle index 19544b4d4..86819c04e 100644 --- a/TripKitSamples/build.gradle +++ b/TripKitSamples/build.gradle @@ -42,7 +42,6 @@ dependencies { implementation libs.rxjava implementation libs.rxAndroid kapt libs.dataBindingCompiler - annotationProcessor libs.dataBindingCompiler implementation libs.rxLifecycleComponents implementation libs.bindingCollectionAdapterRecyclerView diff --git a/ValidBookingCountData/build.gradle b/ValidBookingCountData/build.gradle index c8c1d9af0..658bb58f3 100644 --- a/ValidBookingCountData/build.gradle +++ b/ValidBookingCountData/build.gradle @@ -37,10 +37,10 @@ dependencies { implementation libs.dagger kapt libs.daggerCompiler - annotationProcessor libs.value + kapt libs.value compileOnly libs.valueAnnotations compileOnly libs.builderAnnotations - compileOnly libs.gsonAnnotations + implementation libs.immutablesGson implementation libs.kotlin implementation project(':TripKitDomain') diff --git a/build.gradle b/build.gradle index 772c586a0..9b98edbd0 100644 --- a/build.gradle +++ b/build.gradle @@ -3,8 +3,8 @@ buildscript { ext.kotlinVersion = versions.kotlinVersion repositories { - jcenter() google() + jcenter() } dependencies { @@ -40,8 +40,8 @@ allprojects { } repositories { - jcenter() google() + jcenter() maven { url "https://jitpack.io" } } } \ No newline at end of file diff --git a/dependencies.gradle b/dependencies.gradle index f9b5b95ef..ed700ac08 100644 --- a/dependencies.gradle +++ b/dependencies.gradle @@ -8,15 +8,15 @@ def versions = new Expando() versions.immutablesVersion = "2.5.5" versions.devMinSdkVersion = 21 versions.proMinSdkVersion = 15 -versions.compileSdkVersion = 26 -versions.buildToolsVersion = "26.0.2" -versions.targetSdkVersion = 23 +versions.compileSdkVersion = 27 +versions.buildToolsVersion = "27.0.3" +versions.targetSdkVersion = 25 versions.playServicesVersion = "11.4.2" versions.firebaseAppIndexingVersion = "11.4.2" // See change-log at https://github.com/JetBrains/kotlin/blob/master/ChangeLog.md. -versions.kotlinVersion = "1.2.21" -versions.supportLibraryVersion = "26.0.0" -versions.androidGradlePlugin = "3.0.1" +versions.kotlinVersion = "1.2.30" +versions.supportLibraryVersion = "27.1.0" +versions.androidGradlePlugin = "3.1.0" versions.okHttpVersion = "3.8.1" versions.retrofitVersion = "2.3.0" versions.architectureComponents = "1.0.0" @@ -54,9 +54,9 @@ libs.supportV4 = "com.android.support:support-v4:$versions.supportLibraryVersion libs.appCompat = "com.android.support:appcompat-v7:$versions.supportLibraryVersion" libs.value = "org.immutables:value:$versions.immutablesVersion" -libs.valueAnnotations = "org.immutables:value:$versions.immutablesVersion" +libs.valueAnnotations = "org.immutables:value:$versions.immutablesVersion:annotations" libs.builderAnnotations = "org.immutables:builder:$versions.immutablesVersion" -libs.gsonAnnotations = "org.immutables:gson:$versions.immutablesVersion" +libs.immutablesGson = "org.immutables:gson:$versions.immutablesVersion:annotations" libs.immutablesAndroidStub = "org.immutables:android-stub:$versions.immutablesVersion" libs.dagger = "com.google.dagger:dagger:$versions.dagger" diff --git a/trip-kit-booking/build.gradle b/trip-kit-booking/build.gradle index b5f50ea30..068edef1f 100644 --- a/trip-kit-booking/build.gradle +++ b/trip-kit-booking/build.gradle @@ -1,6 +1,7 @@ apply plugin: 'com.android.library' apply plugin: 'com.github.dcendents.android-maven' apply plugin: "kotlin-android" +apply plugin: "kotlin-kapt" // For https://github.com/dcendents/android-maven-gradle-plugin. group = 'com.skedgo' @@ -51,12 +52,12 @@ dependencies { implementation "com.squareup.retrofit2:converter-gson:2.0.2" implementation "com.squareup.retrofit2:adapter-rxjava:2.0.2" implementation libs.kotlin - annotationProcessor libs.daggerCompiler + kapt libs.daggerCompiler - annotationProcessor libs.value + kapt libs.value compileOnly libs.valueAnnotations compileOnly libs.builderAnnotations - compileOnly libs.gsonAnnotations + implementation libs.immutablesGson } uploadArchives { From ecf95f3b1fb0909aa4857153271d58f6a400058b Mon Sep 17 00:00:00 2001 From: Tran Huu Tin Date: Thu, 29 Mar 2018 02:25:21 +0700 Subject: [PATCH 02/45] Update modeInfo and RealtimeAlert models (#279) * Add fromDate * Rename to modeInfo * Fix this annotation * Remove modeIdentifier * Add alt * Add remoteIconIsTemplate * Add mavenCentral() * Add MavenCentral --- .../com/skedgo/android/common/model/RealtimeAlert.java | 6 ++++++ .../src/main/java/skedgo/tripkit/routing/ModeInfo.java | 8 ++++++++ .../com/skedgo/android/tripkit/alerts/AlertBlock.java | 2 +- .../tripkit/alerts/{TransportType.java => ModeInfo.java} | 6 +++--- build.gradle | 2 ++ 5 files changed, 20 insertions(+), 4 deletions(-) rename TripKitAndroid/src/main/java/com/skedgo/android/tripkit/alerts/{TransportType.java => ModeInfo.java} (77%) diff --git a/CommonCoreLegacy/src/main/java/com/skedgo/android/common/model/RealtimeAlert.java b/CommonCoreLegacy/src/main/java/com/skedgo/android/common/model/RealtimeAlert.java index c86163cda..1144d780b 100644 --- a/CommonCoreLegacy/src/main/java/com/skedgo/android/common/model/RealtimeAlert.java +++ b/CommonCoreLegacy/src/main/java/com/skedgo/android/common/model/RealtimeAlert.java @@ -33,6 +33,7 @@ public RealtimeAlert createFromParcel(Parcel in) { .remoteIcon(in.readString()) .alertAction((AlertAction) in.readParcelable(AlertAction.class.getClassLoader())) .lastUpdated(in.readLong()) + .fromDate(in.readLong()) .build(); } @@ -53,6 +54,10 @@ public RealtimeAlert[] newArray(int size) { return -1L; } + @Value.Default public long fromDate() { + return -1L; + } + @Deprecated @Nullable public abstract String serviceTripID(); @Deprecated @Nullable public abstract String stopCode(); @@ -75,5 +80,6 @@ public RealtimeAlert[] newArray(int size) { out.writeString(remoteIcon()); out.writeParcelable(alertAction(), 0); out.writeLong(lastUpdated()); + out.writeLong(fromDate()); } } \ No newline at end of file diff --git a/CommonCoreLegacy/src/main/java/skedgo/tripkit/routing/ModeInfo.java b/CommonCoreLegacy/src/main/java/skedgo/tripkit/routing/ModeInfo.java index 60ecb1c2b..b10773315 100644 --- a/CommonCoreLegacy/src/main/java/skedgo/tripkit/routing/ModeInfo.java +++ b/CommonCoreLegacy/src/main/java/skedgo/tripkit/routing/ModeInfo.java @@ -10,6 +10,7 @@ /** * @see Mode Identifiers */ +// FIXME let's remove Parcelable and maybe migrate to a data class public class ModeInfo implements Parcelable { public static final Creator CREATOR = new Creator() { @Override @@ -32,6 +33,7 @@ public ModeInfo[] newArray(int size) { @SerializedName("description") private String description; @SerializedName("identifier") private String id; @SerializedName("color") private ServiceColor color; + private boolean remoteIconIsTemplate; public ModeInfo() {} @@ -43,6 +45,7 @@ private ModeInfo(@NonNull Parcel source) { description = source.readString(); id = source.readString(); color = source.readParcelable(ServiceColor.class.getClassLoader()); + remoteIconIsTemplate = source.readInt() == 1; } /** @@ -71,6 +74,11 @@ public void writeToParcel(Parcel dest, int flags) { dest.writeString(description); dest.writeString(id); dest.writeParcelable(color, 0); + dest.writeInt(remoteIconIsTemplate ? 1 : 0); + } + + public boolean getRemoteIconIsTemplate() { + return remoteIconIsTemplate; } public String getLocalIconName() { diff --git a/TripKitAndroid/src/main/java/com/skedgo/android/tripkit/alerts/AlertBlock.java b/TripKitAndroid/src/main/java/com/skedgo/android/tripkit/alerts/AlertBlock.java index 62370fa09..c5d1bad61 100644 --- a/TripKitAndroid/src/main/java/com/skedgo/android/tripkit/alerts/AlertBlock.java +++ b/TripKitAndroid/src/main/java/com/skedgo/android/tripkit/alerts/AlertBlock.java @@ -17,7 +17,7 @@ public interface AlertBlock { @Nullable String disruptionType(); @Nullable String[] operators(); @Nullable Route[] routes(); - @Nullable TransportType transportType(); + @Nullable ModeInfo modeInfo(); @Nullable String[] stopCodes(); @Nullable String[] serviceTripIDs(); } \ No newline at end of file diff --git a/TripKitAndroid/src/main/java/com/skedgo/android/tripkit/alerts/TransportType.java b/TripKitAndroid/src/main/java/com/skedgo/android/tripkit/alerts/ModeInfo.java similarity index 77% rename from TripKitAndroid/src/main/java/com/skedgo/android/tripkit/alerts/TransportType.java rename to TripKitAndroid/src/main/java/com/skedgo/android/tripkit/alerts/ModeInfo.java index 61c3098ff..3bd21ccdb 100644 --- a/TripKitAndroid/src/main/java/com/skedgo/android/tripkit/alerts/TransportType.java +++ b/TripKitAndroid/src/main/java/com/skedgo/android/tripkit/alerts/ModeInfo.java @@ -11,9 +11,9 @@ @Value.Immutable @Gson.TypeAdapters -@JsonAdapter(GsonAdaptersTransportType.class) -public interface TransportType { +@JsonAdapter(GsonAdaptersModeInfo.class) +public interface ModeInfo { @Nullable ServiceColor color(); @Nullable String identifier(); - String modeIdentifier(); + @Nullable String alt(); } \ No newline at end of file diff --git a/build.gradle b/build.gradle index 9b98edbd0..1d35ccca4 100644 --- a/build.gradle +++ b/build.gradle @@ -3,6 +3,7 @@ buildscript { ext.kotlinVersion = versions.kotlinVersion repositories { + mavenCentral() google() jcenter() } @@ -41,6 +42,7 @@ allprojects { repositories { google() + mavenCentral() jcenter() maven { url "https://jitpack.io" } } From 1bae88f8be06bc00cdd5cd4e6d546feb50b59602 Mon Sep 17 00:00:00 2001 From: Tran Huu Tin Date: Sun, 8 Apr 2018 21:36:04 +0700 Subject: [PATCH 03/45] Tin/support modes filter (#280) Support modes filter --- .../skedgo/android/tripkit/DefaultModeFilter.kt | 9 +++++++++ .../java/com/skedgo/android/tripkit/ModeFilter.kt | 8 ++++++++ .../android/tripkit/QueryGeneratorImpl.java | 7 ++++--- .../skedgo/android/tripkit/RouteServiceImpl.java | 13 +++++++------ .../skedgo/tripkit/a2brouting/RouteService.kt | 4 +++- .../tripkit/a2brouting/SingleRouteService.java | 8 ++++++-- .../android/tripkit/QueryGeneratorImplTest.java | 15 +++++++++------ .../android/tripkit/RouteServiceImplTest.java | 4 +++- .../a2brouting/SingleRouteServiceTest.java | 11 ++++++++--- 9 files changed, 57 insertions(+), 22 deletions(-) create mode 100644 TripKitAndroid/src/main/java/com/skedgo/android/tripkit/DefaultModeFilter.kt create mode 100644 TripKitAndroid/src/main/java/com/skedgo/android/tripkit/ModeFilter.kt diff --git a/TripKitAndroid/src/main/java/com/skedgo/android/tripkit/DefaultModeFilter.kt b/TripKitAndroid/src/main/java/com/skedgo/android/tripkit/DefaultModeFilter.kt new file mode 100644 index 000000000..d6beec0a0 --- /dev/null +++ b/TripKitAndroid/src/main/java/com/skedgo/android/tripkit/DefaultModeFilter.kt @@ -0,0 +1,9 @@ +package com.skedgo.android.tripkit + +import com.skedgo.android.common.model.Region + +class DefaultModeFilter : ModeFilter { + override fun execute(region: Region): List? { + return region.transportModeIds + } +} \ No newline at end of file diff --git a/TripKitAndroid/src/main/java/com/skedgo/android/tripkit/ModeFilter.kt b/TripKitAndroid/src/main/java/com/skedgo/android/tripkit/ModeFilter.kt new file mode 100644 index 000000000..edfe30dc4 --- /dev/null +++ b/TripKitAndroid/src/main/java/com/skedgo/android/tripkit/ModeFilter.kt @@ -0,0 +1,8 @@ +package com.skedgo.android.tripkit + +import com.skedgo.android.common.model.Region + +interface ModeFilter { + + fun execute(region: Region): List? +} \ No newline at end of file diff --git a/TripKitAndroid/src/main/java/com/skedgo/android/tripkit/QueryGeneratorImpl.java b/TripKitAndroid/src/main/java/com/skedgo/android/tripkit/QueryGeneratorImpl.java index c3d88ab93..0104c9803 100644 --- a/TripKitAndroid/src/main/java/com/skedgo/android/tripkit/QueryGeneratorImpl.java +++ b/TripKitAndroid/src/main/java/com/skedgo/android/tripkit/QueryGeneratorImpl.java @@ -14,8 +14,9 @@ import rx.Observable; import rx.functions.Func1; +import rx.functions.Func2; -final class QueryGeneratorImpl implements Func1>> { +final class QueryGeneratorImpl implements Func2>> { private final RegionService regionService; private final ModeCombinationStrategy modeCombinationStrategy = new ModeCombinationStrategy(); private final TripRegionResolver tripRegionResolver; @@ -26,7 +27,7 @@ final class QueryGeneratorImpl implements Func1>> } @Override - public Observable> call(@NonNull final Query query) { + public Observable> call(@NonNull final Query query, @NonNull final ModeFilter modeFilter) { final Location departure = query.getFromLocation(); if (departure == null) { return Observable.error(new NullPointerException("Departure is null")); @@ -42,7 +43,7 @@ public Observable> call(@NonNull final Query query) { @Override public Observable> call(Region region) { query.setRegion(region); - final ArrayList modeIds = region.getTransportModeIds(); + final List modeIds = modeFilter.execute(region); if (modeIds != null) { query.setTransportModeIds(new ArrayList<>(modeIds)); } diff --git a/TripKitAndroid/src/main/java/com/skedgo/android/tripkit/RouteServiceImpl.java b/TripKitAndroid/src/main/java/com/skedgo/android/tripkit/RouteServiceImpl.java index 3aa2021cb..3eb9dd055 100644 --- a/TripKitAndroid/src/main/java/com/skedgo/android/tripkit/RouteServiceImpl.java +++ b/TripKitAndroid/src/main/java/com/skedgo/android/tripkit/RouteServiceImpl.java @@ -18,13 +18,14 @@ import rx.Observable; import rx.functions.Func1; +import rx.functions.Func2; import skedgo.tripkit.a2brouting.FailoverA2bRoutingApi; import skedgo.tripkit.a2brouting.RouteService; import skedgo.tripkit.a2brouting.ToWeightingProfileString; import skedgo.tripkit.routing.TripGroup; final class RouteServiceImpl implements RouteService { - private final Func1>> queryGenerator; + private final Func2>> queryGenerator; private final ExcludedTransitModesAdapter excludedTransitModesAdapter; @Nullable private final Co2Preferences co2Preferences; @Nullable private final TripPreferences tripPreferences; @@ -32,7 +33,7 @@ final class RouteServiceImpl implements RouteService { private final FailoverA2bRoutingApi routingApi; RouteServiceImpl( - @NonNull Func1>> queryGenerator, + @NonNull Func2>> queryGenerator, @Nullable ExcludedTransitModesAdapter excludedTransitModesAdapter, @Nullable Co2Preferences co2Preferences, @Nullable TripPreferences tripPreferences, @@ -55,8 +56,8 @@ private static String toCoordinatesText(Location location) { } @NonNull @Override - public Observable> routeAsync(@NonNull Query query) { - return flatSubQueries(query) + public Observable> routeAsync(@NonNull Query query, @NonNull ModeFilter modeFilter) { + return flatSubQueries(query, modeFilter) .flatMap(new Func1>>() { @Override public Observable> call(Query subQuery) { final Region region = subQuery.getRegion(); @@ -136,8 +137,8 @@ public Observable> routeAsync(@NonNull Query query) { return options; } - private Observable flatSubQueries(@NonNull Query query) { - return queryGenerator.call(query) + private Observable flatSubQueries(@NonNull Query query, @NonNull ModeFilter modeFilter) { + return queryGenerator.call(query, modeFilter) .flatMap(new Func1, Observable>() { @Override public Observable call(List queries) { diff --git a/TripKitAndroid/src/main/java/skedgo/tripkit/a2brouting/RouteService.kt b/TripKitAndroid/src/main/java/skedgo/tripkit/a2brouting/RouteService.kt index dd7c7ca2f..3c3510824 100644 --- a/TripKitAndroid/src/main/java/skedgo/tripkit/a2brouting/RouteService.kt +++ b/TripKitAndroid/src/main/java/skedgo/tripkit/a2brouting/RouteService.kt @@ -1,6 +1,8 @@ package skedgo.tripkit.a2brouting import com.skedgo.android.common.model.Query +import com.skedgo.android.tripkit.DefaultModeFilter +import com.skedgo.android.tripkit.ModeFilter import rx.Observable import skedgo.tripkit.routing.TripGroup @@ -18,5 +20,5 @@ interface RouteService { * So be sure to [Observable.observeOn] with [rx.android.schedulers.AndroidSchedulers.mainThread] * to render [TripGroup]s on the main thread. */ - fun routeAsync(query: Query): Observable> + fun routeAsync(query: Query, modeFilter: ModeFilter = DefaultModeFilter()): Observable> } diff --git a/TripKitAndroid/src/main/java/skedgo/tripkit/a2brouting/SingleRouteService.java b/TripKitAndroid/src/main/java/skedgo/tripkit/a2brouting/SingleRouteService.java index 80c50af8c..d1141267a 100644 --- a/TripKitAndroid/src/main/java/skedgo/tripkit/a2brouting/SingleRouteService.java +++ b/TripKitAndroid/src/main/java/skedgo/tripkit/a2brouting/SingleRouteService.java @@ -3,6 +3,9 @@ import android.support.annotation.NonNull; import com.skedgo.android.common.model.Query; +import com.skedgo.android.tripkit.ModeFilter; + +import org.jetbrains.annotations.NotNull; import java.util.List; @@ -30,9 +33,10 @@ public SingleRouteService(RouteService routeService) { this.routeService = routeService; } - @NonNull @Override public Observable> routeAsync(@NonNull Query query) { + @NotNull @Override + public Observable> routeAsync(@NotNull Query query, @NotNull ModeFilter modeFilter) { cancellationSignal.onNext(null); - return routeService.routeAsync(query) + return routeService.routeAsync(query, modeFilter) .takeUntil(cancellationSignal.asObservable()); } } diff --git a/TripKitAndroid/src/test/java/com/skedgo/android/tripkit/QueryGeneratorImplTest.java b/TripKitAndroid/src/test/java/com/skedgo/android/tripkit/QueryGeneratorImplTest.java index 64598ed9a..0b40bcf83 100644 --- a/TripKitAndroid/src/test/java/com/skedgo/android/tripkit/QueryGeneratorImplTest.java +++ b/TripKitAndroid/src/test/java/com/skedgo/android/tripkit/QueryGeneratorImplTest.java @@ -23,6 +23,7 @@ import rx.Observable; import rx.functions.Func1; +import rx.functions.Func2; import rx.observers.TestSubscriber; import static java.util.Arrays.asList; @@ -35,7 +36,9 @@ @Config(constants = BuildConfig.class) public class QueryGeneratorImplTest { @Mock RegionService regionService; - private Func1>> queryGenerator; + private Func2>> queryGenerator; + + ModeFilter modeFilter = new DefaultModeFilter(); @Before public void setUp() { @@ -46,7 +49,7 @@ public void setUp() { @Test public void shouldPropagateNullPointerExceptionIfDepartureIsNull() { final TestSubscriber> subscriber = new TestSubscriber<>(); - queryGenerator.call(new Query()).subscribe(subscriber); + queryGenerator.call(new Query(), modeFilter).subscribe(subscriber); subscriber.awaitTerminalEvent(); assertThat(subscriber.getOnErrorEvents()) .hasSize(1) @@ -61,7 +64,7 @@ public void shouldPropagateNullPointerExceptionIfArrivalIsNull() { query.setFromLocation(new Location()); final TestSubscriber> subscriber = new TestSubscriber<>(); - queryGenerator.call(query).subscribe(subscriber); + queryGenerator.call(query, modeFilter).subscribe(subscriber); subscriber.awaitTerminalEvent(); assertThat(subscriber.getOnErrorEvents()) .hasSize(1) @@ -95,7 +98,7 @@ public Observable answer(InvocationOnMock invocation) throws Throwable { }); final TestSubscriber> subscriber = new TestSubscriber<>(); - queryGenerator.call(query).subscribe(subscriber); + queryGenerator.call(query, modeFilter).subscribe(subscriber); subscriber.awaitTerminalEvent(); assertThat(subscriber.getOnErrorEvents()) .hasSize(1) @@ -128,7 +131,7 @@ public Observable answer(InvocationOnMock invocation) throws Throwable { }); final TestSubscriber> subscriber = new TestSubscriber<>(); - queryGenerator.call(query).subscribe(subscriber); + queryGenerator.call(query, modeFilter).subscribe(subscriber); subscriber.awaitTerminalEvent(); assertThat(subscriber.getOnErrorEvents()) .hasSize(1) @@ -150,7 +153,7 @@ public void shouldGenerateQueriesProperly() { .thenReturn(Observable.just(createBangaloreRegion())); final TestSubscriber> subscriber = new TestSubscriber<>(); - queryGenerator.call(query).subscribe(subscriber); + queryGenerator.call(query, modeFilter).subscribe(subscriber); subscriber.awaitTerminalEvent(); subscriber.assertNoErrors(); diff --git a/TripKitAndroid/src/test/java/com/skedgo/android/tripkit/RouteServiceImplTest.java b/TripKitAndroid/src/test/java/com/skedgo/android/tripkit/RouteServiceImplTest.java index 770f1470f..48ddea50c 100644 --- a/TripKitAndroid/src/test/java/com/skedgo/android/tripkit/RouteServiceImplTest.java +++ b/TripKitAndroid/src/test/java/com/skedgo/android/tripkit/RouteServiceImplTest.java @@ -2,6 +2,7 @@ import com.skedgo.android.common.model.Location; import com.skedgo.android.common.model.Query; +import com.skedgo.android.common.model.Region; import com.skedgo.android.common.model.TimeTag; import com.skedgo.android.tripkit.routing.ExtraQueryMapProvider; @@ -19,6 +20,7 @@ import rx.Observable; import rx.functions.Func1; +import rx.functions.Func2; import skedgo.tripkit.a2brouting.FailoverA2bRoutingApi; import static org.assertj.core.api.Java6Assertions.assertThat; @@ -26,7 +28,7 @@ import static org.mockito.Mockito.when; public class RouteServiceImplTest extends TripKitAndroidRobolectricTest { - @Mock Func1>> queryGenerator; + @Mock Func2>> queryGenerator; @Mock ExcludedTransitModesAdapter excludedTransitModesAdapter; @Mock Co2Preferences co2Preferences; @Mock TripPreferences tripPreferences; diff --git a/TripKitAndroid/src/test/java/skedgo/tripkit/a2brouting/SingleRouteServiceTest.java b/TripKitAndroid/src/test/java/skedgo/tripkit/a2brouting/SingleRouteServiceTest.java index a1bc5e38d..c30034ee6 100644 --- a/TripKitAndroid/src/test/java/skedgo/tripkit/a2brouting/SingleRouteServiceTest.java +++ b/TripKitAndroid/src/test/java/skedgo/tripkit/a2brouting/SingleRouteServiceTest.java @@ -1,10 +1,13 @@ package skedgo.tripkit.a2brouting; import com.skedgo.android.common.model.Query; +import com.skedgo.android.tripkit.DefaultModeFilter; +import com.skedgo.android.tripkit.ModeFilter; import org.junit.Before; import org.junit.Rule; import org.junit.Test; +import org.mockito.ArgumentMatchers; import org.mockito.Mock; import org.mockito.junit.MockitoJUnit; import org.mockito.junit.MockitoRule; @@ -22,6 +25,8 @@ public class SingleRouteServiceTest { @Rule public MockitoRule rule = MockitoJUnit.rule(); @Mock RouteService routeService; + + ModeFilter modeFilter = new DefaultModeFilter(); private SingleRouteService singleRouteService; @Before public void before() { @@ -36,14 +41,14 @@ public class SingleRouteServiceTest { @Test public void shouldCancelPreviousRequest_withQuery() { final PublishSubject> emitter1 = PublishSubject.create(); final PublishSubject> emitter2 = PublishSubject.create(); - when(routeService.routeAsync(any(Query.class))) + when(routeService.routeAsync(any(Query.class), ArgumentMatchers.eq(modeFilter))) .thenReturn(emitter1.asObservable()) .thenReturn(emitter2.asObservable()); - singleRouteService.routeAsync(mock(Query.class)).subscribe(); + singleRouteService.routeAsync(mock(Query.class), modeFilter).subscribe(); assertThat(emitter1.hasObservers()).isTrue(); - singleRouteService.routeAsync(mock(Query.class)).subscribe(); + singleRouteService.routeAsync(mock(Query.class), modeFilter).subscribe(); assertThat(emitter1.hasObservers()).isFalse(); assertThat(emitter2.hasObservers()).isTrue(); } From cebe4c0070392f39f0beb1df9d4addfc497570ec Mon Sep 17 00:00:00 2001 From: Tran Huu Tin Date: Sat, 14 Apr 2018 11:37:30 +0700 Subject: [PATCH 04/45] Add helper methods to query (#281) * Add these * This is NonNull --- .../main/java/com/skedgo/android/common/model/Query.java | 8 ++++++++ .../src/main/java/skedgo/tripkit/routing/ModeInfo.java | 2 +- 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/CommonCoreLegacy/src/main/java/com/skedgo/android/common/model/Query.java b/CommonCoreLegacy/src/main/java/com/skedgo/android/common/model/Query.java index 76592f03d..d8d3b7b90 100644 --- a/CommonCoreLegacy/src/main/java/com/skedgo/android/common/model/Query.java +++ b/CommonCoreLegacy/src/main/java/com/skedgo/android/common/model/Query.java @@ -132,6 +132,14 @@ public void setUnit(final String unit) { } } + public boolean originIsCurrentLocation() { + return mFromLocation == null; + } + + public boolean destinationIsCurrentLocation() { + return mToLocation == null; + } + @Nullable public Location getFromLocation() { return mFromLocation; diff --git a/CommonCoreLegacy/src/main/java/skedgo/tripkit/routing/ModeInfo.java b/CommonCoreLegacy/src/main/java/skedgo/tripkit/routing/ModeInfo.java index b10773315..b959e210c 100644 --- a/CommonCoreLegacy/src/main/java/skedgo/tripkit/routing/ModeInfo.java +++ b/CommonCoreLegacy/src/main/java/skedgo/tripkit/routing/ModeInfo.java @@ -51,7 +51,7 @@ private ModeInfo(@NonNull Parcel source) { /** * Indicates a human-readable name of the transport (e.g, "Train"). */ - @Nullable + @NonNull public String getAlternativeText() { return alternativeText; } From 807f5099089e6d58440e7dae577bf98c115655c9 Mon Sep 17 00:00:00 2001 From: Tran Huu Tin Date: Mon, 23 Apr 2018 00:21:23 +0700 Subject: [PATCH 05/45] Add API to print local time (#282) --- .../skedgo/tripkit/datetime/PrintTimeImpl.kt | 26 +++++++++++-------- .../java/skedgo/tripkit/datetime/PrintTime.kt | 2 ++ 2 files changed, 17 insertions(+), 11 deletions(-) diff --git a/TripKitData/src/main/java/skedgo/tripkit/datetime/PrintTimeImpl.kt b/TripKitData/src/main/java/skedgo/tripkit/datetime/PrintTimeImpl.kt index 69d48312a..2bfa01f69 100644 --- a/TripKitData/src/main/java/skedgo/tripkit/datetime/PrintTimeImpl.kt +++ b/TripKitData/src/main/java/skedgo/tripkit/datetime/PrintTimeImpl.kt @@ -3,6 +3,7 @@ package skedgo.tripkit.datetime import android.content.Context import android.text.format.DateFormat import org.joda.time.DateTime +import org.joda.time.LocalTime import org.joda.time.format.DateTimeFormat import rx.Observable import rx.schedulers.Schedulers.computation @@ -14,15 +15,18 @@ internal class PrintTimeImpl constructor( private val patternFor24Hour = "H:mm" private val patternFor12Hour = "h:mm a" - override fun execute(dateTime: DateTime): Observable - = Observable - .fromCallable { - val formatter = if (DateFormat.is24HourFormat(context)) { - DateTimeFormat.forPattern(patternFor24Hour).withLocale(Locale.getDefault()) - } else { - DateTimeFormat.forPattern(patternFor12Hour).withLocale(Locale.getDefault()) - } - formatter.print(dateTime) - } - .subscribeOn(computation()) + override fun printLocalTime(localTime: LocalTime): String { + val formatter = if (DateFormat.is24HourFormat(context)) { + DateTimeFormat.forPattern(patternFor24Hour).withLocale(Locale.getDefault()) + } else { + DateTimeFormat.forPattern(patternFor12Hour).withLocale(Locale.getDefault()) + } + return formatter.print(localTime) + } + + override fun execute(dateTime: DateTime): Observable { + return Observable + .fromCallable { this.printLocalTime(dateTime.toLocalTime()) } + .subscribeOn(computation()) + } } \ No newline at end of file diff --git a/TripKitDomain/src/main/java/skedgo/tripkit/datetime/PrintTime.kt b/TripKitDomain/src/main/java/skedgo/tripkit/datetime/PrintTime.kt index 4650df03b..25b541860 100644 --- a/TripKitDomain/src/main/java/skedgo/tripkit/datetime/PrintTime.kt +++ b/TripKitDomain/src/main/java/skedgo/tripkit/datetime/PrintTime.kt @@ -1,6 +1,7 @@ package skedgo.tripkit.datetime import org.joda.time.DateTime +import org.joda.time.LocalTime import rx.Observable /** @@ -9,4 +10,5 @@ import rx.Observable */ interface PrintTime { fun execute(dateTime: DateTime): Observable + fun printLocalTime(localTime: LocalTime): String } From d7eec7bacd8c309496d56da67bd1840e0fc654e3 Mon Sep 17 00:00:00 2001 From: Tran Huu Tin Date: Thu, 26 Apr 2018 22:22:40 +0700 Subject: [PATCH 06/45] Relax logic of determining skedgo urls (#275) * Relax logic of determining skedgo urls * Fix test --- .../skedgo/android/tripkit/BaseUrlOverridingInterceptor.java | 3 ++- .../android/tripkit/BaseUrlOverridingInterceptorTest.java | 4 ++-- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/TripKitAndroid/src/main/java/com/skedgo/android/tripkit/BaseUrlOverridingInterceptor.java b/TripKitAndroid/src/main/java/com/skedgo/android/tripkit/BaseUrlOverridingInterceptor.java index 3edac4a3f..569bb906f 100644 --- a/TripKitAndroid/src/main/java/com/skedgo/android/tripkit/BaseUrlOverridingInterceptor.java +++ b/TripKitAndroid/src/main/java/com/skedgo/android/tripkit/BaseUrlOverridingInterceptor.java @@ -24,7 +24,8 @@ final class BaseUrlOverridingInterceptor implements Interceptor { final Request request = chain.request(); final HttpUrl requestUrl = request.url(); final List pathSegments = requestUrl.pathSegments(); - if (!TextUtils.isEmpty(newBaseUrl) && pathSegments.get(0).equals("satapp")) { + boolean isFromSkedGo = pathSegments.get(0).equals("satapp") || requestUrl.host().contains("skedgo.com") || requestUrl.host().contains("tripgo.com"); + if (!TextUtils.isEmpty(newBaseUrl) && isFromSkedGo) { final HttpUrl tempUrl = requestUrl.newBuilder().removePathSegment(0).build(); final String query = tempUrl.query(); final String encodedPath = TextUtils.join("/", tempUrl.encodedPathSegments()); diff --git a/TripKitAndroid/src/test/java/com/skedgo/android/tripkit/BaseUrlOverridingInterceptorTest.java b/TripKitAndroid/src/test/java/com/skedgo/android/tripkit/BaseUrlOverridingInterceptorTest.java index e06365229..1178aa290 100644 --- a/TripKitAndroid/src/test/java/com/skedgo/android/tripkit/BaseUrlOverridingInterceptorTest.java +++ b/TripKitAndroid/src/test/java/com/skedgo/android/tripkit/BaseUrlOverridingInterceptorTest.java @@ -76,12 +76,12 @@ public class BaseUrlOverridingInterceptorTest { })); } - @Test public void ignoreNonSatappRequest() throws IOException { + @Test public void ignoreNonTripgoRequest() throws IOException { when(baseUrlAdapter.call()).thenReturn("https://granduni.buzzhives.com/satapp-beta/"); final Interceptor.Chain chain = mock(Interceptor.Chain.class); final Request chainRequest = new Request.Builder() - .url(HttpUrl.parse("https://skedgo.com/tripgo")) + .url(HttpUrl.parse("https://google.com/haha")) .build(); when(chain.request()).thenReturn(chainRequest); From 7eb38e7630597908f03e2d28d7a0426505ef0f1a Mon Sep 17 00:00:00 2001 From: Tran Huu Tin Date: Tue, 8 May 2018 13:03:12 +0700 Subject: [PATCH 07/45] Separate binding adapters (#283) --- .../android/tripkit/booking/ui/view/util/ViewUtils.kt | 6 ++---- .../src/main/res/layout/field_booking_form.xml | 2 +- 2 files changed, 3 insertions(+), 5 deletions(-) diff --git a/trip-kit-booking-ui/src/main/java/com/skedgo/android/tripkit/booking/ui/view/util/ViewUtils.kt b/trip-kit-booking-ui/src/main/java/com/skedgo/android/tripkit/booking/ui/view/util/ViewUtils.kt index 5f9360d31..25e8264c7 100644 --- a/trip-kit-booking-ui/src/main/java/com/skedgo/android/tripkit/booking/ui/view/util/ViewUtils.kt +++ b/trip-kit-booking-ui/src/main/java/com/skedgo/android/tripkit/booking/ui/view/util/ViewUtils.kt @@ -5,7 +5,7 @@ import android.webkit.WebView import android.widget.ImageView import com.skedgo.android.tripkit.booking.ui.BookingUiComponent -@BindingAdapter("imageUrl") +@BindingAdapter("bookingImageUrl") fun loadImageUrl(component: BookingUiComponent, view: ImageView, imageUrl: String) { component.picasso() .load(imageUrl) @@ -17,6 +17,4 @@ fun setUrl(v: WebView, url: String?) { if (url != null) { v.loadUrl(url) } -} - - +} \ No newline at end of file diff --git a/trip-kit-booking-ui/src/main/res/layout/field_booking_form.xml b/trip-kit-booking-ui/src/main/res/layout/field_booking_form.xml index 1e3b5bb4c..e4b5ff469 100644 --- a/trip-kit-booking-ui/src/main/res/layout/field_booking_form.xml +++ b/trip-kit-booking-ui/src/main/res/layout/field_booking_form.xml @@ -26,7 +26,7 @@ android:layout_height="40dp" android:layout_marginRight="@dimen/spacing_normal" android:visibility="@{viewModel.hasImageUrl}" - app:imageUrl = "@{viewModel.imageUrl}"/> + app:bookingImageUrl = "@{viewModel.imageUrl}"/> Date: Sat, 12 May 2018 22:05:02 +0700 Subject: [PATCH 08/45] Turn by turn (#284) * Add segment turn by turn info * Publish artifacts * Publish artifacts * Databinding v2 * Obfuscate tripkit booking * Pass JsonAdapter Annotations to immutable class --- AccountData/build.gradle | 8 +++ .../tripkit/account/data/LogInBody.java | 9 ++- .../tripkit/account/data/LogInResponse.java | 9 ++- .../tripkit/account/data/LogOutResponse.java | 9 ++- .../tripkit/account/data/SignUpBody.java | 9 ++- .../tripkit/account/data/SignUpResponse.java | 9 ++- AccountDomain/build.gradle | 9 +++ CommonCoreLegacy/build.gradle | 12 +++- .../android/common/model/AlertAction.java | 9 ++- .../skedgo/android/common/model/Booking.java | 3 + .../common/model/BookingConfirmation.java | 9 ++- .../model/BookingConfirmationAction.java | 9 ++- .../model/BookingConfirmationImage.java | 9 ++- .../model/BookingConfirmationPurchase.java | 9 ++- .../model/BookingConfirmationStatus.java | 9 ++- .../android/common/model/BookingProvider.java | 9 ++- .../android/common/model/BookingSource.java | 9 ++- .../android/common/model/PurchaseBrand.java | 9 ++- .../android/common/model/RealtimeAlert.java | 9 ++- .../skedgo/android/common/model/Street.java | 9 ++- .../java/skedgo/tripkit/routing/Provider.java | 9 ++- .../java/skedgo/tripkit/routing/Source.java | 9 ++- .../skedgo/tripkit/routing/TripSegment.java | 12 ++++ .../java/skedgo/tripkit/routing/TurnByTurn.kt | 5 ++ TripKitAndroid/build.gradle | 11 +++ .../com/skedgo/android/tripkit/CarPark.java | 9 ++- .../skedgo/android/tripkit/LocationInfo.java | 3 + .../android/tripkit/LocationInfoDetails.java | 4 ++ .../android/tripkit/ServiceResponse.java | 9 ++- .../android/tripkit/TransitService.java | 4 ++ .../android/tripkit/alerts/AlertBlock.java | 9 ++- .../android/tripkit/alerts/ModeInfo.java | 9 ++- .../tripkit/alerts/RealtimeAlertResponse.java | 9 ++- .../skedgo/android/tripkit/alerts/Route.java | 9 ++- .../android/tripkit/tsp/RegionInfo.java | 9 ++- .../android/tripkit/tsp/RegionInfoBody.java | 9 ++- .../tripkit/tsp/RegionInfoResponse.java | 9 ++- TripKitData/build.gradle | 9 +++ TripKitDomain/build.gradle | 10 +++ TripKitDomainLegacy/build.gradle | 9 +++ ValidBookingCountData/build.gradle | 8 +++ .../data/ValidBookingCountResponse.java | 9 ++- ValidBookingCountDomain/build.gradle | 8 +++ build.gradle | 2 +- dependencies.gradle | 2 +- .../1.1/trip-kit-booking-1.1.aar | Bin 161917 -> 0 bytes .../1.1/trip-kit-booking-1.1.aar.md5 | 1 - .../1.1/trip-kit-booking-1.1.aar.sha1 | 1 - .../1.1/trip-kit-booking-1.1.pom | 65 ------------------ .../1.1/trip-kit-booking-1.1.pom.md5 | 1 - .../1.1/trip-kit-booking-1.1.pom.sha1 | 1 - .../trip-kit-booking/maven-metadata.xml | 13 ---- .../trip-kit-booking/maven-metadata.xml.md5 | 1 - .../trip-kit-booking/maven-metadata.xml.sha1 | 1 - route-persistence/build.gradle | 2 +- trip-kit-booking-ui/build.gradle | 14 ++-- trip-kit-booking/build.gradle | 4 +- .../tripkit/booking/AccessTokenResponse.java | 3 + .../android/tripkit/booking/AuthProvider.java | 9 ++- .../android/tripkit/booking/CompanyInfo.java | 9 ++- .../tripkit/booking/LogOutResponse.java | 9 ++- .../android/tripkit/booking/QuickBooking.java | 9 ++- .../MyBookingsConfirmationResponse.java | 9 ++- .../mybookings/MyBookingsResponse.java | 9 ++- 64 files changed, 370 insertions(+), 162 deletions(-) create mode 100644 CommonCoreLegacy/src/main/java/skedgo/tripkit/routing/TurnByTurn.kt delete mode 100644 maven/com/skedgo/trip-kit-booking/1.1/trip-kit-booking-1.1.aar delete mode 100644 maven/com/skedgo/trip-kit-booking/1.1/trip-kit-booking-1.1.aar.md5 delete mode 100644 maven/com/skedgo/trip-kit-booking/1.1/trip-kit-booking-1.1.aar.sha1 delete mode 100644 maven/com/skedgo/trip-kit-booking/1.1/trip-kit-booking-1.1.pom delete mode 100644 maven/com/skedgo/trip-kit-booking/1.1/trip-kit-booking-1.1.pom.md5 delete mode 100644 maven/com/skedgo/trip-kit-booking/1.1/trip-kit-booking-1.1.pom.sha1 delete mode 100644 maven/com/skedgo/trip-kit-booking/maven-metadata.xml delete mode 100644 maven/com/skedgo/trip-kit-booking/maven-metadata.xml.md5 delete mode 100644 maven/com/skedgo/trip-kit-booking/maven-metadata.xml.sha1 diff --git a/AccountData/build.gradle b/AccountData/build.gradle index cc34b523d..d2641a287 100644 --- a/AccountData/build.gradle +++ b/AccountData/build.gradle @@ -47,4 +47,12 @@ dependencies { compileOnly libs.valueAnnotations implementation libs.kotlin +} + +uploadArchives { + repositories { + mavenDeployer { + repository(url: "file://${localMaven}") + } + } } \ No newline at end of file diff --git a/AccountData/src/main/java/skedgo/tripkit/account/data/LogInBody.java b/AccountData/src/main/java/skedgo/tripkit/account/data/LogInBody.java index 1ef7dee75..3ba08d7f5 100644 --- a/AccountData/src/main/java/skedgo/tripkit/account/data/LogInBody.java +++ b/AccountData/src/main/java/skedgo/tripkit/account/data/LogInBody.java @@ -5,8 +5,13 @@ import org.immutables.gson.Gson; import org.immutables.value.Value; -@Gson.TypeAdapters -@Value.Immutable +import static org.immutables.gson.Gson.TypeAdapters; +import static org.immutables.value.Value.Immutable; +import static org.immutables.value.Value.Style; + +@TypeAdapters +@Immutable +@Style(passAnnotations = JsonAdapter.class) @JsonAdapter(GsonAdaptersLogInBody.class) abstract class LogInBody { public abstract String password(); diff --git a/AccountData/src/main/java/skedgo/tripkit/account/data/LogInResponse.java b/AccountData/src/main/java/skedgo/tripkit/account/data/LogInResponse.java index 31fbb339d..5548cffe9 100644 --- a/AccountData/src/main/java/skedgo/tripkit/account/data/LogInResponse.java +++ b/AccountData/src/main/java/skedgo/tripkit/account/data/LogInResponse.java @@ -7,8 +7,13 @@ import org.immutables.gson.Gson; import org.immutables.value.Value; -@Gson.TypeAdapters -@Value.Immutable +import static org.immutables.gson.Gson.TypeAdapters; +import static org.immutables.value.Value.Immutable; +import static org.immutables.value.Value.Style; + +@TypeAdapters +@Immutable +@Style(passAnnotations = JsonAdapter.class) @JsonAdapter(GsonAdaptersLogInResponse.class) abstract class LogInResponse { @Nullable public abstract String userToken(); diff --git a/AccountData/src/main/java/skedgo/tripkit/account/data/LogOutResponse.java b/AccountData/src/main/java/skedgo/tripkit/account/data/LogOutResponse.java index f3d2b9f6f..902fb401f 100644 --- a/AccountData/src/main/java/skedgo/tripkit/account/data/LogOutResponse.java +++ b/AccountData/src/main/java/skedgo/tripkit/account/data/LogOutResponse.java @@ -5,7 +5,12 @@ import org.immutables.gson.Gson; import org.immutables.value.Value; -@Gson.TypeAdapters -@Value.Immutable +import static org.immutables.gson.Gson.TypeAdapters; +import static org.immutables.value.Value.Immutable; +import static org.immutables.value.Value.Style; + +@TypeAdapters +@Immutable +@Style(passAnnotations = JsonAdapter.class) @JsonAdapter(GsonAdaptersLogOutResponse.class) abstract class LogOutResponse {} \ No newline at end of file diff --git a/AccountData/src/main/java/skedgo/tripkit/account/data/SignUpBody.java b/AccountData/src/main/java/skedgo/tripkit/account/data/SignUpBody.java index 94ca8c1fc..99314a59c 100644 --- a/AccountData/src/main/java/skedgo/tripkit/account/data/SignUpBody.java +++ b/AccountData/src/main/java/skedgo/tripkit/account/data/SignUpBody.java @@ -5,8 +5,13 @@ import org.immutables.gson.Gson; import org.immutables.value.Value; -@Gson.TypeAdapters -@Value.Immutable +import static org.immutables.gson.Gson.TypeAdapters; +import static org.immutables.value.Value.Immutable; +import static org.immutables.value.Value.Style; + +@TypeAdapters +@Immutable +@Style(passAnnotations = JsonAdapter.class) @JsonAdapter(GsonAdaptersSignUpBody.class) abstract class SignUpBody { public abstract String password(); diff --git a/AccountData/src/main/java/skedgo/tripkit/account/data/SignUpResponse.java b/AccountData/src/main/java/skedgo/tripkit/account/data/SignUpResponse.java index 7413b1b8f..89b0d9f3c 100644 --- a/AccountData/src/main/java/skedgo/tripkit/account/data/SignUpResponse.java +++ b/AccountData/src/main/java/skedgo/tripkit/account/data/SignUpResponse.java @@ -7,8 +7,13 @@ import org.immutables.gson.Gson; import org.immutables.value.Value; -@Gson.TypeAdapters -@Value.Immutable +import static org.immutables.gson.Gson.TypeAdapters; +import static org.immutables.value.Value.Immutable; +import static org.immutables.value.Value.Style; + +@TypeAdapters +@Immutable +@Style(passAnnotations = JsonAdapter.class) @JsonAdapter(GsonAdaptersSignUpResponse.class) abstract class SignUpResponse { @Nullable public abstract String userToken(); diff --git a/AccountDomain/build.gradle b/AccountDomain/build.gradle index 353bc770a..eb4ae6a9f 100644 --- a/AccountDomain/build.gradle +++ b/AccountDomain/build.gradle @@ -23,3 +23,12 @@ dependencies { implementation libs.kotlin compileOnly project(":TripKitDomain") } + + +uploadArchives { + repositories { + mavenDeployer { + repository(url: "file://${localMaven}") + } + } +} \ No newline at end of file diff --git a/CommonCoreLegacy/build.gradle b/CommonCoreLegacy/build.gradle index 43ea331e0..92b3ea0e8 100644 --- a/CommonCoreLegacy/build.gradle +++ b/CommonCoreLegacy/build.gradle @@ -7,6 +7,7 @@ apply plugin: "kotlin-kapt" // For https://github.com/dcendents/android-maven-gradle-plugin. group = "com.skedgo.tripkit" +version = "1.2" android { compileSdkVersion versions.compileSdkVersion @@ -61,4 +62,13 @@ dependencies { compileOnly libs.valueAnnotations compileOnly libs.builderAnnotations implementation libs.immutablesGson -} \ No newline at end of file +} + +uploadArchives { + repositories { + mavenDeployer { + repository(url: "file://${localMaven}") + } + } +} + diff --git a/CommonCoreLegacy/src/main/java/com/skedgo/android/common/model/AlertAction.java b/CommonCoreLegacy/src/main/java/com/skedgo/android/common/model/AlertAction.java index dbe098efb..50922e4fb 100644 --- a/CommonCoreLegacy/src/main/java/com/skedgo/android/common/model/AlertAction.java +++ b/CommonCoreLegacy/src/main/java/com/skedgo/android/common/model/AlertAction.java @@ -12,8 +12,13 @@ import java.util.ArrayList; import java.util.List; -@Value.Immutable -@Gson.TypeAdapters +import static org.immutables.gson.Gson.TypeAdapters; +import static org.immutables.value.Value.Immutable; +import static org.immutables.value.Value.Style; + +@Immutable +@TypeAdapters +@Style(passAnnotations = JsonAdapter.class) @JsonAdapter(GsonAdaptersAlertAction.class) public abstract class AlertAction implements Parcelable { diff --git a/CommonCoreLegacy/src/main/java/com/skedgo/android/common/model/Booking.java b/CommonCoreLegacy/src/main/java/com/skedgo/android/common/model/Booking.java index 7965dff4f..0bd50e7c2 100644 --- a/CommonCoreLegacy/src/main/java/com/skedgo/android/common/model/Booking.java +++ b/CommonCoreLegacy/src/main/java/com/skedgo/android/common/model/Booking.java @@ -4,6 +4,7 @@ import android.os.Parcelable; import android.support.annotation.Nullable; +import com.google.gson.annotations.JsonAdapter; import com.google.gson.annotations.SerializedName; import org.immutables.gson.Gson; @@ -14,6 +15,8 @@ @Gson.TypeAdapters @Value.Immutable +@Value.Style(passAnnotations = JsonAdapter.class) +@JsonAdapter(GsonAdaptersBooking.class) public abstract class Booking implements Parcelable { public static final Creator CREATOR = new Creator() { @SuppressWarnings("unchecked") diff --git a/CommonCoreLegacy/src/main/java/com/skedgo/android/common/model/BookingConfirmation.java b/CommonCoreLegacy/src/main/java/com/skedgo/android/common/model/BookingConfirmation.java index 0d947c82a..03f3014bd 100644 --- a/CommonCoreLegacy/src/main/java/com/skedgo/android/common/model/BookingConfirmation.java +++ b/CommonCoreLegacy/src/main/java/com/skedgo/android/common/model/BookingConfirmation.java @@ -12,8 +12,13 @@ import java.util.ArrayList; import java.util.List; -@Gson.TypeAdapters -@Value.Immutable +import static org.immutables.gson.Gson.TypeAdapters; +import static org.immutables.value.Value.Immutable; +import static org.immutables.value.Value.Style; + +@TypeAdapters +@Immutable +@Style(passAnnotations = JsonAdapter.class) @JsonAdapter(GsonAdaptersBookingConfirmation.class) public abstract class BookingConfirmation implements Parcelable { public static final Creator CREATOR = new Creator() { diff --git a/CommonCoreLegacy/src/main/java/com/skedgo/android/common/model/BookingConfirmationAction.java b/CommonCoreLegacy/src/main/java/com/skedgo/android/common/model/BookingConfirmationAction.java index fb07cd331..de967bd0d 100644 --- a/CommonCoreLegacy/src/main/java/com/skedgo/android/common/model/BookingConfirmationAction.java +++ b/CommonCoreLegacy/src/main/java/com/skedgo/android/common/model/BookingConfirmationAction.java @@ -9,8 +9,13 @@ import org.immutables.gson.Gson; import org.immutables.value.Value; -@Gson.TypeAdapters -@Value.Immutable +import static org.immutables.gson.Gson.TypeAdapters; +import static org.immutables.value.Value.Immutable; +import static org.immutables.value.Value.Style; + +@TypeAdapters +@Immutable +@Style(passAnnotations = JsonAdapter.class) @JsonAdapter(GsonAdaptersBookingConfirmationAction.class) public abstract class BookingConfirmationAction implements Parcelable { public static final String TYPE_CANCEL = "CANCEL"; diff --git a/CommonCoreLegacy/src/main/java/com/skedgo/android/common/model/BookingConfirmationImage.java b/CommonCoreLegacy/src/main/java/com/skedgo/android/common/model/BookingConfirmationImage.java index 6beae8052..9a1e216e0 100644 --- a/CommonCoreLegacy/src/main/java/com/skedgo/android/common/model/BookingConfirmationImage.java +++ b/CommonCoreLegacy/src/main/java/com/skedgo/android/common/model/BookingConfirmationImage.java @@ -9,8 +9,13 @@ import org.immutables.gson.Gson; import org.immutables.value.Value; -@Gson.TypeAdapters -@Value.Immutable +import static org.immutables.gson.Gson.TypeAdapters; +import static org.immutables.value.Value.Immutable; +import static org.immutables.value.Value.Style; + +@TypeAdapters +@Immutable +@Style(passAnnotations = JsonAdapter.class) @JsonAdapter(GsonAdaptersBookingConfirmationImage.class) public abstract class BookingConfirmationImage implements Parcelable { public static final Creator CREATOR = new Creator() { diff --git a/CommonCoreLegacy/src/main/java/com/skedgo/android/common/model/BookingConfirmationPurchase.java b/CommonCoreLegacy/src/main/java/com/skedgo/android/common/model/BookingConfirmationPurchase.java index 9670504f9..585bc1dbe 100644 --- a/CommonCoreLegacy/src/main/java/com/skedgo/android/common/model/BookingConfirmationPurchase.java +++ b/CommonCoreLegacy/src/main/java/com/skedgo/android/common/model/BookingConfirmationPurchase.java @@ -9,8 +9,13 @@ import org.immutables.gson.Gson; import org.immutables.value.Value; -@Gson.TypeAdapters -@Value.Immutable +import static org.immutables.gson.Gson.TypeAdapters; +import static org.immutables.value.Value.Immutable; +import static org.immutables.value.Value.Style; + +@TypeAdapters +@Immutable +@Style(passAnnotations = JsonAdapter.class) @JsonAdapter(GsonAdaptersBookingConfirmationPurchase.class) public abstract class BookingConfirmationPurchase implements Parcelable { diff --git a/CommonCoreLegacy/src/main/java/com/skedgo/android/common/model/BookingConfirmationStatus.java b/CommonCoreLegacy/src/main/java/com/skedgo/android/common/model/BookingConfirmationStatus.java index 2592df5d7..c54873ba1 100644 --- a/CommonCoreLegacy/src/main/java/com/skedgo/android/common/model/BookingConfirmationStatus.java +++ b/CommonCoreLegacy/src/main/java/com/skedgo/android/common/model/BookingConfirmationStatus.java @@ -9,8 +9,13 @@ import org.immutables.gson.Gson; import org.immutables.value.Value; -@Gson.TypeAdapters -@Value.Immutable +import static org.immutables.gson.Gson.TypeAdapters; +import static org.immutables.value.Value.Immutable; +import static org.immutables.value.Value.Style; + +@TypeAdapters +@Immutable +@Style(passAnnotations = JsonAdapter.class) @JsonAdapter(GsonAdaptersBookingConfirmationStatus.class) public abstract class BookingConfirmationStatus implements Parcelable { diff --git a/CommonCoreLegacy/src/main/java/com/skedgo/android/common/model/BookingProvider.java b/CommonCoreLegacy/src/main/java/com/skedgo/android/common/model/BookingProvider.java index 5dba4c092..a71d7a483 100644 --- a/CommonCoreLegacy/src/main/java/com/skedgo/android/common/model/BookingProvider.java +++ b/CommonCoreLegacy/src/main/java/com/skedgo/android/common/model/BookingProvider.java @@ -11,8 +11,13 @@ import skedgo.tripkit.routing.ServiceColor; -@Gson.TypeAdapters -@Value.Immutable +import static org.immutables.gson.Gson.TypeAdapters; +import static org.immutables.value.Value.Immutable; +import static org.immutables.value.Value.Style; + +@TypeAdapters +@Immutable +@Style(passAnnotations = JsonAdapter.class) @JsonAdapter(GsonAdaptersBookingProvider.class) public abstract class BookingProvider implements Parcelable { public static final Creator CREATOR = new Creator() { diff --git a/CommonCoreLegacy/src/main/java/com/skedgo/android/common/model/BookingSource.java b/CommonCoreLegacy/src/main/java/com/skedgo/android/common/model/BookingSource.java index 4102e786e..82a9ea651 100644 --- a/CommonCoreLegacy/src/main/java/com/skedgo/android/common/model/BookingSource.java +++ b/CommonCoreLegacy/src/main/java/com/skedgo/android/common/model/BookingSource.java @@ -9,8 +9,13 @@ import org.immutables.gson.Gson; import org.immutables.value.Value; -@Gson.TypeAdapters -@Value.Immutable +import static org.immutables.gson.Gson.TypeAdapters; +import static org.immutables.value.Value.Immutable; +import static org.immutables.value.Value.Style; + +@TypeAdapters +@Immutable +@Style(passAnnotations = JsonAdapter.class) @JsonAdapter(GsonAdaptersBookingSource.class) public abstract class BookingSource implements Parcelable { diff --git a/CommonCoreLegacy/src/main/java/com/skedgo/android/common/model/PurchaseBrand.java b/CommonCoreLegacy/src/main/java/com/skedgo/android/common/model/PurchaseBrand.java index 09d3f4e5e..bb7789b08 100644 --- a/CommonCoreLegacy/src/main/java/com/skedgo/android/common/model/PurchaseBrand.java +++ b/CommonCoreLegacy/src/main/java/com/skedgo/android/common/model/PurchaseBrand.java @@ -11,8 +11,13 @@ import skedgo.tripkit.routing.ServiceColor; -@Gson.TypeAdapters -@Value.Immutable +import static org.immutables.gson.Gson.TypeAdapters; +import static org.immutables.value.Value.Immutable; +import static org.immutables.value.Value.Style; + +@TypeAdapters +@Immutable +@Style(passAnnotations = JsonAdapter.class) @JsonAdapter(GsonAdaptersPurchaseBrand.class) public abstract class PurchaseBrand implements Parcelable { diff --git a/CommonCoreLegacy/src/main/java/com/skedgo/android/common/model/RealtimeAlert.java b/CommonCoreLegacy/src/main/java/com/skedgo/android/common/model/RealtimeAlert.java index 1144d780b..4ef4a2745 100644 --- a/CommonCoreLegacy/src/main/java/com/skedgo/android/common/model/RealtimeAlert.java +++ b/CommonCoreLegacy/src/main/java/com/skedgo/android/common/model/RealtimeAlert.java @@ -10,11 +10,16 @@ import org.immutables.gson.Gson; import org.immutables.value.Value; +import static org.immutables.gson.Gson.TypeAdapters; +import static org.immutables.value.Value.Immutable; +import static org.immutables.value.Value.Style; + /** * @see RealtimeAlert */ -@Value.Immutable -@Gson.TypeAdapters +@Immutable +@TypeAdapters +@Style(passAnnotations = JsonAdapter.class) @JsonAdapter(GsonAdaptersRealtimeAlert.class) public abstract class RealtimeAlert implements Parcelable { public static final String SEVERITY_ALERT = "alert"; diff --git a/CommonCoreLegacy/src/main/java/com/skedgo/android/common/model/Street.java b/CommonCoreLegacy/src/main/java/com/skedgo/android/common/model/Street.java index d11fcbb00..5b0070b19 100644 --- a/CommonCoreLegacy/src/main/java/com/skedgo/android/common/model/Street.java +++ b/CommonCoreLegacy/src/main/java/com/skedgo/android/common/model/Street.java @@ -9,8 +9,13 @@ import org.immutables.gson.Gson; import org.immutables.value.Value; -@Value.Immutable -@Gson.TypeAdapters +import static org.immutables.gson.Gson.TypeAdapters; +import static org.immutables.value.Value.Immutable; +import static org.immutables.value.Value.Style; + +@Immutable +@TypeAdapters +@Style(passAnnotations = JsonAdapter.class) @JsonAdapter(GsonAdaptersStreet.class) public abstract class Street implements Parcelable { public static final Creator CREATOR = new Creator() { diff --git a/CommonCoreLegacy/src/main/java/skedgo/tripkit/routing/Provider.java b/CommonCoreLegacy/src/main/java/skedgo/tripkit/routing/Provider.java index 550d86502..54c9db746 100644 --- a/CommonCoreLegacy/src/main/java/skedgo/tripkit/routing/Provider.java +++ b/CommonCoreLegacy/src/main/java/skedgo/tripkit/routing/Provider.java @@ -9,8 +9,13 @@ import org.immutables.gson.Gson; import org.immutables.value.Value; -@Gson.TypeAdapters -@Value.Immutable +import static org.immutables.gson.Gson.TypeAdapters; +import static org.immutables.value.Value.Immutable; +import static org.immutables.value.Value.Style; + +@TypeAdapters +@Immutable +@Style(passAnnotations = JsonAdapter.class) @JsonAdapter(GsonAdaptersProvider.class) public abstract class Provider implements Parcelable { public static final Creator CREATOR = new Creator() { diff --git a/CommonCoreLegacy/src/main/java/skedgo/tripkit/routing/Source.java b/CommonCoreLegacy/src/main/java/skedgo/tripkit/routing/Source.java index 4417ccb99..eeb2c4209 100644 --- a/CommonCoreLegacy/src/main/java/skedgo/tripkit/routing/Source.java +++ b/CommonCoreLegacy/src/main/java/skedgo/tripkit/routing/Source.java @@ -9,8 +9,13 @@ import org.immutables.gson.Gson; import org.immutables.value.Value; -@Gson.TypeAdapters -@Value.Immutable +import static org.immutables.gson.Gson.TypeAdapters; +import static org.immutables.value.Value.Immutable; +import static org.immutables.value.Value.Style; + +@TypeAdapters +@Immutable +@Style(passAnnotations = JsonAdapter.class) @JsonAdapter(GsonAdaptersSource.class) public abstract class Source implements Parcelable { public static final Creator CREATOR = new Creator() { diff --git a/CommonCoreLegacy/src/main/java/skedgo/tripkit/routing/TripSegment.java b/CommonCoreLegacy/src/main/java/skedgo/tripkit/routing/TripSegment.java index c5595b58e..a70c1cec4 100644 --- a/CommonCoreLegacy/src/main/java/skedgo/tripkit/routing/TripSegment.java +++ b/CommonCoreLegacy/src/main/java/skedgo/tripkit/routing/TripSegment.java @@ -101,6 +101,7 @@ public TripSegment createFromParcel(Parcel in) { segment.metres = in.readInt(); segment.metresSafe = in.readInt(); segment.metresUnsafe = in.readInt(); + segment.turnByTurn = in.readString(); return segment; } @@ -186,6 +187,8 @@ public TripSegment[] newArray(int size) { private int metresSafe; @SerializedName("metresUnsafe") private int metresUnsafe; + @SerializedName("turn-by-turn") + private String turnByTurn; /** * FIXME: Should replace this with Quantity Strings. @@ -494,6 +497,14 @@ public void setMetresUnsafe(int metresUnsafe) { this.metresUnsafe = metresUnsafe; } + @Nullable public TurnByTurn getTurnByTurn() { + if (turnByTurn != null) { + return TurnByTurn.valueOf(turnByTurn); + } else { + return null; + } + } + @Override public int describeContents() { return 0; @@ -540,6 +551,7 @@ public void writeToParcel(Parcel out, int flags) { out.writeInt(metres); out.writeInt(metresSafe); out.writeInt(metresUnsafe); + out.writeString(turnByTurn); } public boolean isContinuation() { diff --git a/CommonCoreLegacy/src/main/java/skedgo/tripkit/routing/TurnByTurn.kt b/CommonCoreLegacy/src/main/java/skedgo/tripkit/routing/TurnByTurn.kt new file mode 100644 index 000000000..e36327e84 --- /dev/null +++ b/CommonCoreLegacy/src/main/java/skedgo/tripkit/routing/TurnByTurn.kt @@ -0,0 +1,5 @@ +package skedgo.tripkit.routing + +enum class TurnByTurn { + CYCLING, DRIVING, WALKING +} \ No newline at end of file diff --git a/TripKitAndroid/build.gradle b/TripKitAndroid/build.gradle index c226becbb..6043abe62 100644 --- a/TripKitAndroid/build.gradle +++ b/TripKitAndroid/build.gradle @@ -7,6 +7,7 @@ apply plugin: "kotlin-kapt" // For https://github.com/dcendents/android-maven-gradle-plugin. group = "com.skedgo.tripkit" +version = "1.2" android { compileSdkVersion versions.compileSdkVersion @@ -84,3 +85,13 @@ dependencies { api project(':TripKitDomainLegacy') api project(':TripKitData') } + + + +uploadArchives { + repositories { + mavenDeployer { + repository(url: "file://${localMaven}") + } + } +} diff --git a/TripKitAndroid/src/main/java/com/skedgo/android/tripkit/CarPark.java b/TripKitAndroid/src/main/java/com/skedgo/android/tripkit/CarPark.java index 069d92d56..e2312d1d1 100644 --- a/TripKitAndroid/src/main/java/com/skedgo/android/tripkit/CarPark.java +++ b/TripKitAndroid/src/main/java/com/skedgo/android/tripkit/CarPark.java @@ -5,8 +5,13 @@ import org.immutables.gson.Gson; import org.immutables.value.Value; -@Gson.TypeAdapters -@Value.Immutable +import static org.immutables.gson.Gson.TypeAdapters; +import static org.immutables.value.Value.Immutable; +import static org.immutables.value.Value.Style; + +@TypeAdapters +@Immutable +@Style(passAnnotations = JsonAdapter.class) @JsonAdapter(GsonAdaptersCarPark.class) public abstract class CarPark { public abstract String identifier(); diff --git a/TripKitAndroid/src/main/java/com/skedgo/android/tripkit/LocationInfo.java b/TripKitAndroid/src/main/java/com/skedgo/android/tripkit/LocationInfo.java index 44d3c8de2..f2ff67e3e 100644 --- a/TripKitAndroid/src/main/java/com/skedgo/android/tripkit/LocationInfo.java +++ b/TripKitAndroid/src/main/java/com/skedgo/android/tripkit/LocationInfo.java @@ -2,6 +2,7 @@ import android.support.annotation.Nullable; +import com.google.gson.annotations.JsonAdapter; import com.skedgo.android.common.model.ScheduledStop; import org.immutables.gson.Gson; @@ -9,6 +10,8 @@ @Gson.TypeAdapters @Value.Immutable +@Value.Style(passAnnotations = JsonAdapter.class) +@JsonAdapter(GsonAdaptersLocationInfo.class) public interface LocationInfo { @Nullable LocationInfoDetails details(); @Nullable ScheduledStop stop(); diff --git a/TripKitAndroid/src/main/java/com/skedgo/android/tripkit/LocationInfoDetails.java b/TripKitAndroid/src/main/java/com/skedgo/android/tripkit/LocationInfoDetails.java index f036c90f1..536f83376 100644 --- a/TripKitAndroid/src/main/java/com/skedgo/android/tripkit/LocationInfoDetails.java +++ b/TripKitAndroid/src/main/java/com/skedgo/android/tripkit/LocationInfoDetails.java @@ -2,11 +2,15 @@ import android.support.annotation.Nullable; +import com.google.gson.annotations.JsonAdapter; + import org.immutables.gson.Gson; import org.immutables.value.Value; @Gson.TypeAdapters @Value.Immutable +@Value.Style(passAnnotations = JsonAdapter.class) +@JsonAdapter(GsonAdaptersLocationInfoDetails.class) public abstract class LocationInfoDetails { @Nullable public abstract String w3w(); @Nullable public abstract String w3wInfoURL(); diff --git a/TripKitAndroid/src/main/java/com/skedgo/android/tripkit/ServiceResponse.java b/TripKitAndroid/src/main/java/com/skedgo/android/tripkit/ServiceResponse.java index 071b1fa55..29b4d1507 100644 --- a/TripKitAndroid/src/main/java/com/skedgo/android/tripkit/ServiceResponse.java +++ b/TripKitAndroid/src/main/java/com/skedgo/android/tripkit/ServiceResponse.java @@ -11,8 +11,13 @@ import java.util.List; -@Value.Immutable -@Gson.TypeAdapters +import static org.immutables.gson.Gson.TypeAdapters; +import static org.immutables.value.Value.Immutable; +import static org.immutables.value.Value.Style; + +@Immutable +@TypeAdapters +@Style(passAnnotations = JsonAdapter.class) @JsonAdapter(GsonAdaptersServiceResponse.class) public interface ServiceResponse { String realTimeStatus(); diff --git a/TripKitAndroid/src/main/java/com/skedgo/android/tripkit/TransitService.java b/TripKitAndroid/src/main/java/com/skedgo/android/tripkit/TransitService.java index 28b3178de..4e5512e7e 100644 --- a/TripKitAndroid/src/main/java/com/skedgo/android/tripkit/TransitService.java +++ b/TripKitAndroid/src/main/java/com/skedgo/android/tripkit/TransitService.java @@ -1,5 +1,7 @@ package com.skedgo.android.tripkit; +import com.google.gson.annotations.JsonAdapter; + import skedgo.tripkit.routing.RealTimeVehicle; import skedgo.tripkit.routing.Shape; @@ -10,6 +12,8 @@ @Value.Immutable @Gson.TypeAdapters +@JsonAdapter(GsonAdaptersTransitService.class) +@Value.Style(passAnnotations = JsonAdapter.class) public interface TransitService { List shapes(); diff --git a/TripKitAndroid/src/main/java/com/skedgo/android/tripkit/alerts/AlertBlock.java b/TripKitAndroid/src/main/java/com/skedgo/android/tripkit/alerts/AlertBlock.java index c5d1bad61..3be23e46a 100644 --- a/TripKitAndroid/src/main/java/com/skedgo/android/tripkit/alerts/AlertBlock.java +++ b/TripKitAndroid/src/main/java/com/skedgo/android/tripkit/alerts/AlertBlock.java @@ -8,8 +8,13 @@ import org.immutables.gson.Gson; import org.immutables.value.Value; -@Value.Immutable -@Gson.TypeAdapters +import static org.immutables.gson.Gson.TypeAdapters; +import static org.immutables.value.Value.Immutable; +import static org.immutables.value.Value.Style; + +@Immutable +@TypeAdapters +@Style(passAnnotations = JsonAdapter.class) @JsonAdapter(GsonAdaptersAlertBlock.class) public interface AlertBlock { @Nullable RealtimeAlert alert(); diff --git a/TripKitAndroid/src/main/java/com/skedgo/android/tripkit/alerts/ModeInfo.java b/TripKitAndroid/src/main/java/com/skedgo/android/tripkit/alerts/ModeInfo.java index 3bd21ccdb..e8f9a47b6 100644 --- a/TripKitAndroid/src/main/java/com/skedgo/android/tripkit/alerts/ModeInfo.java +++ b/TripKitAndroid/src/main/java/com/skedgo/android/tripkit/alerts/ModeInfo.java @@ -9,8 +9,13 @@ import skedgo.tripkit.routing.ServiceColor; -@Value.Immutable -@Gson.TypeAdapters +import static org.immutables.gson.Gson.TypeAdapters; +import static org.immutables.value.Value.Immutable; +import static org.immutables.value.Value.Style; + +@Immutable +@TypeAdapters +@Style(passAnnotations = JsonAdapter.class) @JsonAdapter(GsonAdaptersModeInfo.class) public interface ModeInfo { @Nullable ServiceColor color(); diff --git a/TripKitAndroid/src/main/java/com/skedgo/android/tripkit/alerts/RealtimeAlertResponse.java b/TripKitAndroid/src/main/java/com/skedgo/android/tripkit/alerts/RealtimeAlertResponse.java index 42fbec790..bafaf1c59 100644 --- a/TripKitAndroid/src/main/java/com/skedgo/android/tripkit/alerts/RealtimeAlertResponse.java +++ b/TripKitAndroid/src/main/java/com/skedgo/android/tripkit/alerts/RealtimeAlertResponse.java @@ -9,8 +9,13 @@ import java.util.List; -@Value.Immutable -@Gson.TypeAdapters +import static org.immutables.gson.Gson.TypeAdapters; +import static org.immutables.value.Value.Immutable; +import static org.immutables.value.Value.Style; + +@Immutable +@TypeAdapters +@Style(passAnnotations = JsonAdapter.class) @JsonAdapter(GsonAdaptersRealtimeAlertResponse.class) public interface RealtimeAlertResponse { @Nullable List alerts(); diff --git a/TripKitAndroid/src/main/java/com/skedgo/android/tripkit/alerts/Route.java b/TripKitAndroid/src/main/java/com/skedgo/android/tripkit/alerts/Route.java index 1400ed102..2079e4400 100644 --- a/TripKitAndroid/src/main/java/com/skedgo/android/tripkit/alerts/Route.java +++ b/TripKitAndroid/src/main/java/com/skedgo/android/tripkit/alerts/Route.java @@ -9,8 +9,13 @@ import skedgo.tripkit.routing.ModeInfo; -@Value.Immutable -@Gson.TypeAdapters +import static org.immutables.gson.Gson.TypeAdapters; +import static org.immutables.value.Value.Immutable; +import static org.immutables.value.Value.Style; + +@Immutable +@TypeAdapters +@Style(passAnnotations = JsonAdapter.class) @JsonAdapter(GsonAdaptersRoute.class) public abstract class Route { public abstract String id(); diff --git a/TripKitAndroid/src/main/java/com/skedgo/android/tripkit/tsp/RegionInfo.java b/TripKitAndroid/src/main/java/com/skedgo/android/tripkit/tsp/RegionInfo.java index 43fbe36eb..e98916e5d 100644 --- a/TripKitAndroid/src/main/java/com/skedgo/android/tripkit/tsp/RegionInfo.java +++ b/TripKitAndroid/src/main/java/com/skedgo/android/tripkit/tsp/RegionInfo.java @@ -10,8 +10,13 @@ import java.util.List; -@Value.Immutable -@Gson.TypeAdapters +import static org.immutables.gson.Gson.TypeAdapters; +import static org.immutables.value.Value.Immutable; +import static org.immutables.value.Value.Style; + +@Immutable +@TypeAdapters +@Style(passAnnotations = JsonAdapter.class) @JsonAdapter(GsonAdaptersRegionInfo.class) public abstract class RegionInfo { @Nullable public abstract List transitModes(); diff --git a/TripKitAndroid/src/main/java/com/skedgo/android/tripkit/tsp/RegionInfoBody.java b/TripKitAndroid/src/main/java/com/skedgo/android/tripkit/tsp/RegionInfoBody.java index a2978434d..14062cc7f 100644 --- a/TripKitAndroid/src/main/java/com/skedgo/android/tripkit/tsp/RegionInfoBody.java +++ b/TripKitAndroid/src/main/java/com/skedgo/android/tripkit/tsp/RegionInfoBody.java @@ -6,8 +6,13 @@ import org.immutables.gson.Gson; import org.immutables.value.Value; -@Value.Immutable -@Gson.TypeAdapters +import static org.immutables.gson.Gson.TypeAdapters; +import static org.immutables.value.Value.Immutable; +import static org.immutables.value.Value.Style; + +@Immutable +@TypeAdapters +@Style(passAnnotations = JsonAdapter.class) @JsonAdapter(GsonAdaptersRegionInfoBody.class) public interface RegionInfoBody { /** diff --git a/TripKitAndroid/src/main/java/com/skedgo/android/tripkit/tsp/RegionInfoResponse.java b/TripKitAndroid/src/main/java/com/skedgo/android/tripkit/tsp/RegionInfoResponse.java index 9e9e1f2e0..ac4aee624 100644 --- a/TripKitAndroid/src/main/java/com/skedgo/android/tripkit/tsp/RegionInfoResponse.java +++ b/TripKitAndroid/src/main/java/com/skedgo/android/tripkit/tsp/RegionInfoResponse.java @@ -9,8 +9,13 @@ import java.util.List; -@Gson.TypeAdapters -@Value.Immutable +import static org.immutables.gson.Gson.TypeAdapters; +import static org.immutables.value.Value.Immutable; +import static org.immutables.value.Value.Style; + +@TypeAdapters +@Immutable +@Style(passAnnotations = JsonAdapter.class) @JsonAdapter(GsonAdaptersRegionInfoResponse.class) public interface RegionInfoResponse { @Nullable List regions(); diff --git a/TripKitData/build.gradle b/TripKitData/build.gradle index edf4680d0..f5dc66b14 100644 --- a/TripKitData/build.gradle +++ b/TripKitData/build.gradle @@ -7,6 +7,7 @@ apply plugin: "kotlin-kapt" // For https://github.com/dcendents/android-maven-gradle-plugin. group = "com.skedgo.tripkit" +version = "1.2" android { compileSdkVersion versions.compileSdkVersion @@ -44,3 +45,11 @@ dependencies { implementation libs.immutablesGson implementation libs.kotlin } +uploadArchives { + repositories { + mavenDeployer { + repository(url: "file://${localMaven}") + } + } +} + diff --git a/TripKitDomain/build.gradle b/TripKitDomain/build.gradle index e6a77fc8b..6b0d04ac8 100644 --- a/TripKitDomain/build.gradle +++ b/TripKitDomain/build.gradle @@ -5,6 +5,7 @@ apply plugin: 'maven' // To publish via JitPack. group = 'com.skedgo.tripkit' +version = "1.2" // To fix error of converting bytecode to dex. targetCompatibility = '1.7' @@ -26,3 +27,12 @@ dependencies { compileOnly libs.immutablesAndroidStub compileOnly libs.value } + + +uploadArchives { + repositories { + mavenDeployer { + repository(url: "file://${localMaven}") + } + } +} diff --git a/TripKitDomainLegacy/build.gradle b/TripKitDomainLegacy/build.gradle index 15c341678..056eabb1c 100644 --- a/TripKitDomainLegacy/build.gradle +++ b/TripKitDomainLegacy/build.gradle @@ -7,6 +7,7 @@ apply plugin: "kotlin-kapt" // For https://github.com/dcendents/android-maven-gradle-plugin. group = "com.skedgo.tripkit" +version = "1.2" android { compileSdkVersion versions.compileSdkVersion @@ -36,3 +37,11 @@ dependencies { implementation libs.kotlin implementation libs.rxjava } + +uploadArchives { + repositories { + mavenDeployer { + repository(url: "file://${localMaven}") + } + } +} diff --git a/ValidBookingCountData/build.gradle b/ValidBookingCountData/build.gradle index 658bb58f3..d7ac0e3d0 100644 --- a/ValidBookingCountData/build.gradle +++ b/ValidBookingCountData/build.gradle @@ -46,3 +46,11 @@ dependencies { implementation project(':TripKitDomain') implementation project(':ValidBookingCountDomain') } + +uploadArchives { + repositories { + mavenDeployer { + repository(url: "file://${localMaven}") + } + } +} \ No newline at end of file diff --git a/ValidBookingCountData/src/main/java/skedgo/tripkit/validbookingcount/data/ValidBookingCountResponse.java b/ValidBookingCountData/src/main/java/skedgo/tripkit/validbookingcount/data/ValidBookingCountResponse.java index 06deb7a7b..787914aac 100644 --- a/ValidBookingCountData/src/main/java/skedgo/tripkit/validbookingcount/data/ValidBookingCountResponse.java +++ b/ValidBookingCountData/src/main/java/skedgo/tripkit/validbookingcount/data/ValidBookingCountResponse.java @@ -5,8 +5,13 @@ import org.immutables.gson.Gson; import org.immutables.value.Value; -@Value.Immutable -@Gson.TypeAdapters +import static org.immutables.gson.Gson.TypeAdapters; +import static org.immutables.value.Value.Immutable; +import static org.immutables.value.Value.Style; + +@Immutable +@TypeAdapters +@Style(passAnnotations = JsonAdapter.class) @JsonAdapter(GsonAdaptersValidBookingCountResponse.class) interface ValidBookingCountResponse { int count(); diff --git a/ValidBookingCountDomain/build.gradle b/ValidBookingCountDomain/build.gradle index 44dfcd347..08baa5021 100644 --- a/ValidBookingCountDomain/build.gradle +++ b/ValidBookingCountDomain/build.gradle @@ -25,4 +25,12 @@ dependencies { // Use `compileOnly` to achieve similar effect of `provided` scope. // See more https://blog.gradle.org/introducing-compile-only-dependencies. compileOnly project(":AccountDomain") +} + +uploadArchives { + repositories { + mavenDeployer { + repository(url: "file://${localMaven}") + } + } } \ No newline at end of file diff --git a/build.gradle b/build.gradle index 1d35ccca4..a7b1a3dd5 100644 --- a/build.gradle +++ b/build.gradle @@ -21,7 +21,7 @@ buildscript { } ext { - tripKitAndroidMaven = "${rootDir}/maven/" + localMaven = "${rootDir}/../maven/" } allprojects { diff --git a/dependencies.gradle b/dependencies.gradle index ed700ac08..0fc85203e 100644 --- a/dependencies.gradle +++ b/dependencies.gradle @@ -84,7 +84,7 @@ libs.materialProgressBar = "me.zhanghai.android.materialprogressbar:library:1.4. libs.timber = "com.jakewharton.timber:timber:4.5.1" libs.rxtry = "com.github.thuytrinh:RxTry:c2f002df6c" libs.koptional = "com.gojuno.koptional:koptional:1.2.0" -libs.bindingCollectionAdapterRecyclerView = "me.tatarka.bindingcollectionadapter2:bindingcollectionadapter-recyclerview:2.2.0" +libs.bindingCollectionAdapterRecyclerView = "me.tatarka.bindingcollectionadapter2:bindingcollectionadapter-recyclerview:2.3.0-beta1" libs.rxLifecycleComponents = "com.github.skedgo:RxLifecycleComponents:v1.3" // See changelog at http://developer.android.com/tools/revisions/gradle-plugin.html diff --git a/maven/com/skedgo/trip-kit-booking/1.1/trip-kit-booking-1.1.aar b/maven/com/skedgo/trip-kit-booking/1.1/trip-kit-booking-1.1.aar deleted file mode 100644 index dd05d6d19fe064d39bb4b26308b29cbcddb66875..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 161917 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%0DmUn^VAqu|- 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 B!C?RZ diff --git a/maven/com/skedgo/trip-kit-booking/1.1/trip-kit-booking-1.1.aar.md5 b/maven/com/skedgo/trip-kit-booking/1.1/trip-kit-booking-1.1.aar.md5 deleted file mode 100644 index 9e9463857..000000000 --- a/maven/com/skedgo/trip-kit-booking/1.1/trip-kit-booking-1.1.aar.md5 +++ /dev/null @@ -1 +0,0 @@ -18a6ec2584fe66600609af8e30aa5574 \ No newline at end of file diff --git a/maven/com/skedgo/trip-kit-booking/1.1/trip-kit-booking-1.1.aar.sha1 b/maven/com/skedgo/trip-kit-booking/1.1/trip-kit-booking-1.1.aar.sha1 deleted file mode 100644 index 29b04f827..000000000 --- a/maven/com/skedgo/trip-kit-booking/1.1/trip-kit-booking-1.1.aar.sha1 +++ /dev/null @@ -1 +0,0 @@ -a1a8f589825c380e5f2eb8f272352f5362bc2954 \ No newline at end of file diff --git a/maven/com/skedgo/trip-kit-booking/1.1/trip-kit-booking-1.1.pom b/maven/com/skedgo/trip-kit-booking/1.1/trip-kit-booking-1.1.pom deleted file mode 100644 index c2b881313..000000000 --- a/maven/com/skedgo/trip-kit-booking/1.1/trip-kit-booking-1.1.pom +++ /dev/null @@ -1,65 +0,0 @@ - - - 4.0.0 - com.skedgo - trip-kit-booking - 1.1 - aar - - - com.skedgo - trip-kit - 1.0 - compile - - - com.squareup.okhttp3 - okhttp - 3.2.0 - compile - - - com.squareup.okhttp3 - logging-interceptor - 3.2.0 - compile - - - com.squareup.retrofit2 - converter-gson - 2.0.2 - compile - - - com.squareup.retrofit2 - adapter-rxjava - 2.0.2 - compile - - - rxjava - * - - - - - com.squareup.retrofit2 - retrofit - 2.0.2 - compile - - - okhttp - * - - - - - com.google.dagger - dagger - 2.7 - compile - - - diff --git a/maven/com/skedgo/trip-kit-booking/1.1/trip-kit-booking-1.1.pom.md5 b/maven/com/skedgo/trip-kit-booking/1.1/trip-kit-booking-1.1.pom.md5 deleted file mode 100644 index 87d25ef1e..000000000 --- a/maven/com/skedgo/trip-kit-booking/1.1/trip-kit-booking-1.1.pom.md5 +++ /dev/null @@ -1 +0,0 @@ -ce40f9ead1a1854fd5b6668b700dfbd4 \ No newline at end of file diff --git a/maven/com/skedgo/trip-kit-booking/1.1/trip-kit-booking-1.1.pom.sha1 b/maven/com/skedgo/trip-kit-booking/1.1/trip-kit-booking-1.1.pom.sha1 deleted file mode 100644 index 071d48897..000000000 --- a/maven/com/skedgo/trip-kit-booking/1.1/trip-kit-booking-1.1.pom.sha1 +++ /dev/null @@ -1 +0,0 @@ -ee4194d4677f839e9bfa96dcb82e77797602cfa8 \ No newline at end of file diff --git a/maven/com/skedgo/trip-kit-booking/maven-metadata.xml b/maven/com/skedgo/trip-kit-booking/maven-metadata.xml deleted file mode 100644 index 15676f552..000000000 --- a/maven/com/skedgo/trip-kit-booking/maven-metadata.xml +++ /dev/null @@ -1,13 +0,0 @@ - - - com.skedgo - trip-kit-booking - - 1.1 - - 1.0 - 1.1 - - 20170203183554 - - diff --git a/maven/com/skedgo/trip-kit-booking/maven-metadata.xml.md5 b/maven/com/skedgo/trip-kit-booking/maven-metadata.xml.md5 deleted file mode 100644 index 3e617be4c..000000000 --- a/maven/com/skedgo/trip-kit-booking/maven-metadata.xml.md5 +++ /dev/null @@ -1 +0,0 @@ -778e8a2020eec37d6fe54ec5ab28bcd4 \ No newline at end of file diff --git a/maven/com/skedgo/trip-kit-booking/maven-metadata.xml.sha1 b/maven/com/skedgo/trip-kit-booking/maven-metadata.xml.sha1 deleted file mode 100644 index a40fe855c..000000000 --- a/maven/com/skedgo/trip-kit-booking/maven-metadata.xml.sha1 +++ /dev/null @@ -1 +0,0 @@ -80ebe9703bedba1d8637e6854b0d888b8c61f76b \ No newline at end of file diff --git a/route-persistence/build.gradle b/route-persistence/build.gradle index 9e1182bd1..5b6f4fffe 100644 --- a/route-persistence/build.gradle +++ b/route-persistence/build.gradle @@ -60,7 +60,7 @@ dependencies { uploadArchives { repositories { mavenDeployer { - repository(url: "file://${tripKitAndroidMaven}") + repository(url: "file://${localMaven}") } } } diff --git a/trip-kit-booking-ui/build.gradle b/trip-kit-booking-ui/build.gradle index 8bf1d69c3..20c2467e5 100644 --- a/trip-kit-booking-ui/build.gradle +++ b/trip-kit-booking-ui/build.gradle @@ -3,10 +3,6 @@ apply plugin: 'com.github.dcendents.android-maven' apply plugin: 'kotlin-android' apply plugin: 'kotlin-kapt' -// For https://github.com/dcendents/android-maven-gradle-plugin. -group = 'com.skedgo' -version = '1.0' - android { compileSdkVersion versions.compileSdkVersion buildToolsVersion versions.buildToolsVersion @@ -59,3 +55,13 @@ dependencies { kapt libs.dataBindingCompiler } +group = ext.versions.tripGoGroup +version = ext.versions.tripGoLibrary + +uploadArchives { + repositories { + mavenDeployer { + repository(url: "file://${localMaven}") + } + } +} diff --git a/trip-kit-booking/build.gradle b/trip-kit-booking/build.gradle index 068edef1f..9e568ed09 100644 --- a/trip-kit-booking/build.gradle +++ b/trip-kit-booking/build.gradle @@ -63,7 +63,7 @@ dependencies { uploadArchives { repositories { mavenDeployer { - repository(url: "file://${tripKitAndroidMaven}") + repository(url: "file://${localMaven}") } } -} +} \ No newline at end of file diff --git a/trip-kit-booking/src/main/java/com/skedgo/android/tripkit/booking/AccessTokenResponse.java b/trip-kit-booking/src/main/java/com/skedgo/android/tripkit/booking/AccessTokenResponse.java index a3fefea02..f7fa8dd0a 100644 --- a/trip-kit-booking/src/main/java/com/skedgo/android/tripkit/booking/AccessTokenResponse.java +++ b/trip-kit-booking/src/main/java/com/skedgo/android/tripkit/booking/AccessTokenResponse.java @@ -2,6 +2,7 @@ import android.support.annotation.Nullable; +import com.google.gson.annotations.JsonAdapter; import com.google.gson.annotations.SerializedName; import org.immutables.gson.Gson; @@ -9,6 +10,8 @@ @Value.Immutable @Gson.TypeAdapters +@Value.Style(passAnnotations = JsonAdapter.class) +@JsonAdapter(AccessTokenResponse.class) public interface AccessTokenResponse { @SerializedName("access_token") String accessToken(); diff --git a/trip-kit-booking/src/main/java/com/skedgo/android/tripkit/booking/AuthProvider.java b/trip-kit-booking/src/main/java/com/skedgo/android/tripkit/booking/AuthProvider.java index 23a209f63..27eec36d0 100644 --- a/trip-kit-booking/src/main/java/com/skedgo/android/tripkit/booking/AuthProvider.java +++ b/trip-kit-booking/src/main/java/com/skedgo/android/tripkit/booking/AuthProvider.java @@ -7,8 +7,13 @@ import org.immutables.gson.Gson; import org.immutables.value.Value; -@Gson.TypeAdapters -@Value.Immutable +import static org.immutables.gson.Gson.TypeAdapters; +import static org.immutables.value.Value.Immutable; +import static org.immutables.value.Value.Style; + +@TypeAdapters +@Immutable +@Style(passAnnotations = JsonAdapter.class) @JsonAdapter(GsonAdaptersAuthProvider.class) public interface AuthProvider { @Nullable String modeIdentifier(); diff --git a/trip-kit-booking/src/main/java/com/skedgo/android/tripkit/booking/CompanyInfo.java b/trip-kit-booking/src/main/java/com/skedgo/android/tripkit/booking/CompanyInfo.java index 46d89dd56..366ec6ceb 100644 --- a/trip-kit-booking/src/main/java/com/skedgo/android/tripkit/booking/CompanyInfo.java +++ b/trip-kit-booking/src/main/java/com/skedgo/android/tripkit/booking/CompanyInfo.java @@ -7,8 +7,13 @@ import org.immutables.gson.Gson; import org.immutables.value.Value; -@Gson.TypeAdapters -@Value.Immutable +import static org.immutables.gson.Gson.TypeAdapters; +import static org.immutables.value.Value.Immutable; +import static org.immutables.value.Value.Style; + +@TypeAdapters +@Immutable +@Style(passAnnotations = JsonAdapter.class) @JsonAdapter(GsonAdaptersCompanyInfo.class) public interface CompanyInfo { @Nullable String name(); diff --git a/trip-kit-booking/src/main/java/com/skedgo/android/tripkit/booking/LogOutResponse.java b/trip-kit-booking/src/main/java/com/skedgo/android/tripkit/booking/LogOutResponse.java index a80929cb5..8e10d7670 100644 --- a/trip-kit-booking/src/main/java/com/skedgo/android/tripkit/booking/LogOutResponse.java +++ b/trip-kit-booking/src/main/java/com/skedgo/android/tripkit/booking/LogOutResponse.java @@ -5,8 +5,13 @@ import org.immutables.gson.Gson; import org.immutables.value.Value; -@Gson.TypeAdapters -@Value.Immutable +import static org.immutables.gson.Gson.TypeAdapters; +import static org.immutables.value.Value.Immutable; +import static org.immutables.value.Value.Style; + +@TypeAdapters +@Immutable +@Style(passAnnotations = JsonAdapter.class) @JsonAdapter(GsonAdaptersLogOutResponse.class) public abstract class LogOutResponse { /** diff --git a/trip-kit-booking/src/main/java/com/skedgo/android/tripkit/booking/QuickBooking.java b/trip-kit-booking/src/main/java/com/skedgo/android/tripkit/booking/QuickBooking.java index 756f9b691..290b6183f 100644 --- a/trip-kit-booking/src/main/java/com/skedgo/android/tripkit/booking/QuickBooking.java +++ b/trip-kit-booking/src/main/java/com/skedgo/android/tripkit/booking/QuickBooking.java @@ -10,8 +10,13 @@ import org.immutables.gson.Gson; import org.immutables.value.Value; -@Gson.TypeAdapters -@Value.Immutable +import static org.immutables.gson.Gson.TypeAdapters; +import static org.immutables.value.Value.Immutable; +import static org.immutables.value.Value.Style; + +@TypeAdapters +@Immutable +@Style(passAnnotations = JsonAdapter.class) @JsonAdapter(GsonAdaptersQuickBooking.class) public abstract class QuickBooking implements Parcelable { public static final Creator CREATOR = new Creator() { diff --git a/trip-kit-booking/src/main/java/com/skedgo/android/tripkit/booking/mybookings/MyBookingsConfirmationResponse.java b/trip-kit-booking/src/main/java/com/skedgo/android/tripkit/booking/mybookings/MyBookingsConfirmationResponse.java index 7dbd459bc..e157461ba 100644 --- a/trip-kit-booking/src/main/java/com/skedgo/android/tripkit/booking/mybookings/MyBookingsConfirmationResponse.java +++ b/trip-kit-booking/src/main/java/com/skedgo/android/tripkit/booking/mybookings/MyBookingsConfirmationResponse.java @@ -10,8 +10,13 @@ import java.util.List; -@Value.Immutable -@Gson.TypeAdapters +import static org.immutables.gson.Gson.TypeAdapters; +import static org.immutables.value.Value.Immutable; +import static org.immutables.value.Value.Style; + +@Immutable +@TypeAdapters +@Style(passAnnotations = JsonAdapter.class) @JsonAdapter(GsonAdaptersMyBookingsConfirmationResponse.class) public abstract class MyBookingsConfirmationResponse { diff --git a/trip-kit-booking/src/main/java/com/skedgo/android/tripkit/booking/mybookings/MyBookingsResponse.java b/trip-kit-booking/src/main/java/com/skedgo/android/tripkit/booking/mybookings/MyBookingsResponse.java index 6aaa1916c..87df221ca 100644 --- a/trip-kit-booking/src/main/java/com/skedgo/android/tripkit/booking/mybookings/MyBookingsResponse.java +++ b/trip-kit-booking/src/main/java/com/skedgo/android/tripkit/booking/mybookings/MyBookingsResponse.java @@ -7,8 +7,13 @@ import java.util.List; -@Value.Immutable -@Gson.TypeAdapters +import static org.immutables.gson.Gson.TypeAdapters; +import static org.immutables.value.Value.Immutable; +import static org.immutables.value.Value.Style; + +@Immutable +@TypeAdapters +@Style(passAnnotations = JsonAdapter.class) @JsonAdapter(GsonAdaptersMyBookingsResponse.class) public abstract class MyBookingsResponse { public abstract List bookings(); From 3dc52f2fa1e64664254edb1988ab019746a7a972 Mon Sep 17 00:00:00 2001 From: Tran Huu Tin Date: Fri, 25 May 2018 13:42:40 +0700 Subject: [PATCH 09/45] Add proguard config for tripkit (#287) * Add Proguard config for tripkit * Remove facebook --- CommonCoreLegacy/build.gradle | 6 ++++++ CommonCoreLegacy/proguard-rules.pro | 3 +++ dependencies.gradle | 1 - trip-kit-booking/proguard-rules.pro | 1 + 4 files changed, 10 insertions(+), 1 deletion(-) create mode 100644 CommonCoreLegacy/proguard-rules.pro create mode 100644 trip-kit-booking/proguard-rules.pro diff --git a/CommonCoreLegacy/build.gradle b/CommonCoreLegacy/build.gradle index 92b3ea0e8..da7e2ce67 100644 --- a/CommonCoreLegacy/build.gradle +++ b/CommonCoreLegacy/build.gradle @@ -25,6 +25,12 @@ android { } } + buildTypes { + release { + consumerProguardFile 'proguard-rules.pro' + } + } + lintOptions { checkReleaseBuilds true abortOnError false diff --git a/CommonCoreLegacy/proguard-rules.pro b/CommonCoreLegacy/proguard-rules.pro new file mode 100644 index 000000000..f5f817b7d --- /dev/null +++ b/CommonCoreLegacy/proguard-rules.pro @@ -0,0 +1,3 @@ +-keep class com.skedgo.android.common.model.** { *; } +-keep class skedgo.tripkit.routing.ModeInfo { *; } +-keep class skedgo.tripkit.routing.SegmentType { *; } \ No newline at end of file diff --git a/dependencies.gradle b/dependencies.gradle index 0fc85203e..a73b1a4f8 100644 --- a/dependencies.gradle +++ b/dependencies.gradle @@ -41,7 +41,6 @@ libs.playServicesPlaces = "com.google.android.gms:play-services-places:$versions libs.playServicesAnalytics = "com.google.android.gms:play-services-analytics:$versions.playServicesVersion" libs.playServicesGcm = "com.google.android.gms:play-services-gcm:$versions.playServicesVersion" libs.firebaseAppIndexing = "com.google.firebase:firebase-appindexing:$versions.firebaseAppIndexingVersion" -libs.facebookSdk = "com.facebook.android:facebook-android-sdk:4.28.0" libs.androidMapsUtils = "com.github.skedgo:android-maps-utils:241fc89" // Support Library package diff --git a/trip-kit-booking/proguard-rules.pro b/trip-kit-booking/proguard-rules.pro new file mode 100644 index 000000000..15be52b65 --- /dev/null +++ b/trip-kit-booking/proguard-rules.pro @@ -0,0 +1 @@ +-keep class com.skedgo.android.tripkit.booking.BookingError { *; } \ No newline at end of file From 627b8f46f9f46b04024e708242964160489981e2 Mon Sep 17 00:00:00 2001 From: Tran Huu Tin Date: Fri, 1 Jun 2018 19:59:01 +0700 Subject: [PATCH 10/45] Integrate myki (#288) * Set default component * Handle empty booking form (response 204) (#286) * Handle empty booking form (response 204) * Fix tests * Add test and fix some stuff * Add null form test * Add !! * Remove gcm dependency * Use firebase job dispatcher * Notify the scheduler when finished * Reverse `needsReschedule` * Fix tests --- TripKitAndroid/build.gradle | 2 +- TripKitAndroid/src/main/AndroidManifest.xml | 5 +- .../tripkit/android/FetchRegionsService.kt | 98 ++++++++++++------- .../android/FetchRegionsServiceTest.kt | 8 +- .../booking/ui/BookingUiComponent.java | 4 +- .../booking/ui/activity/BookingActivity.kt | 11 ++- .../activity/ExternalProviderAuthActivity.kt | 2 +- .../tripkit/booking/ui/view/util/ViewUtils.kt | 12 ++- .../ui/viewmodel/BookingFormViewModel.kt | 2 +- .../src/main/res/layout/field_password.xml | 7 +- .../ui/viewmodel/BookingFormViewModelTest.kt | 19 ++++ .../tripkit/booking/BookingServiceImpl.java | 53 ---------- .../tripkit/booking/BookingServiceImpl.kt | 40 ++++++++ .../tripkit/booking/NullBookingForm.kt | 3 + .../tripkit/booking/BookingServiceTest.java | 28 +++++- 15 files changed, 179 insertions(+), 115 deletions(-) delete mode 100644 trip-kit-booking/src/main/java/com/skedgo/android/tripkit/booking/BookingServiceImpl.java create mode 100644 trip-kit-booking/src/main/java/com/skedgo/android/tripkit/booking/BookingServiceImpl.kt create mode 100644 trip-kit-booking/src/main/java/com/skedgo/android/tripkit/booking/NullBookingForm.kt diff --git a/TripKitAndroid/build.gradle b/TripKitAndroid/build.gradle index 6043abe62..a4b130269 100644 --- a/TripKitAndroid/build.gradle +++ b/TripKitAndroid/build.gradle @@ -60,7 +60,6 @@ dependencies { androidTestImplementation libs.assertjCore implementation libs.kotlin - implementation libs.playServicesGcm implementation libs.jodaTimeAndroid implementation 'com.github.skedgo:commons-collections:v1.0' @@ -73,6 +72,7 @@ dependencies { implementation libs.rxjava implementation libs.rxAndroid implementation libs.androidMapsUtils + implementation 'com.firebase:firebase-jobdispatcher:0.8.5' implementation libs.dagger kapt libs.daggerCompiler diff --git a/TripKitAndroid/src/main/AndroidManifest.xml b/TripKitAndroid/src/main/AndroidManifest.xml index 1ee1b3772..039611f63 100644 --- a/TripKitAndroid/src/main/AndroidManifest.xml +++ b/TripKitAndroid/src/main/AndroidManifest.xml @@ -5,10 +5,9 @@ + android:exported="false"> - + diff --git a/TripKitAndroid/src/main/java/skedgo/tripkit/android/FetchRegionsService.kt b/TripKitAndroid/src/main/java/skedgo/tripkit/android/FetchRegionsService.kt index efc3b1d64..74097d16e 100644 --- a/TripKitAndroid/src/main/java/skedgo/tripkit/android/FetchRegionsService.kt +++ b/TripKitAndroid/src/main/java/skedgo/tripkit/android/FetchRegionsService.kt @@ -1,51 +1,73 @@ package skedgo.tripkit.android import android.content.Context -import com.google.android.gms.gcm.* +import com.firebase.jobdispatcher.* +import rx.Completable import rx.Observable -import java.util.concurrent.TimeUnit - -class FetchRegionsService : GcmTaskService() { - override fun onRunTask(taskParams: TaskParams): Int = - Observable - .fromCallable { - // Pulling this into fromCallable() is actually a trick to deal with an issue - // when this getInstance() was called before we initialize TripKit after - // the super.onCreate() in the sub Application class. - // So when it happens, we just let it throw error, and thus - // the task is rescheduled after TripKit initialization. - TripKit.getInstance() - } - .refreshRegions() +import rx.Subscription +import rx.schedulers.Schedulers - companion object { - fun scheduleAsync(context: Context): Observable = - Observable.create { subscriber -> - val task = OneoffTask.Builder() - .setService(FetchRegionsService::class.java) - .setTag("FetchRegions") - .setExecutionWindow(0, TimeUnit.MINUTES.toSeconds(1)) - .setPersisted(true) - .setUpdateCurrent(true) - .setRequiredNetwork(Task.NETWORK_STATE_CONNECTED) - .setRequiresCharging(true) - .build() - GcmNetworkManager.getInstance(context.applicationContext) - .schedule(task) - subscriber.onCompleted() + +class FetchRegionsService : JobService() { + var runningJob: Subscription? = null + + override fun onStopJob(job: JobParameters?): Boolean { + if (runningJob != null && runningJob!!.isUnsubscribed.not()) { + runningJob?.unsubscribe() + return true + } else { + return false + } + } + + override fun onStartJob(job: JobParameters): Boolean { + runningJob = Observable + .fromCallable { + // Pulling this into fromCallable() is actually a trick to deal with an issue + // when this getInstance() was called before we initialize TripKit after + // the super.onCreate() in the sub Application class. + // So when it happens, we just let it throw error, and thus + // the task is rescheduled after TripKit initialization. + TripKit.getInstance() } + .refreshRegions() + .subscribeOn(Schedulers.io()) + .subscribe({ }, + { jobFinished(job, false) }, + { jobFinished(job, true) }) + return true + } + + + companion object { + fun scheduleAsync(context: Context): Observable { + return Completable + .fromAction { + val dispatcher = FirebaseJobDispatcher(GooglePlayDriver(context)) + val myJob = dispatcher.newJobBuilder() + .setService(FetchRegionsService::class.java) + .setTag("FetchRegions") + .setRecurring(false) + .setLifetime(Lifetime.UNTIL_NEXT_BOOT) + .setTrigger(Trigger.NOW) + .setReplaceCurrent(true) + .setRetryStrategy(RetryStrategy.DEFAULT_EXPONENTIAL) + .setConstraints( + Constraint.ON_ANY_NETWORK, + Constraint.DEVICE_CHARGING + ) + .build() + dispatcher.mustSchedule(myJob) + } + .toObservable() + } } } -internal fun Observable.refreshRegions() = this + +fun Observable.refreshRegions(): Observable = this .flatMap { it.regionService .refreshAsync() .toObservable() - } - .map { GcmNetworkManager.RESULT_SUCCESS } - .onErrorReturn { GcmNetworkManager.RESULT_RESCHEDULE } - // To avoid NoSuchElementException when using first(). - .defaultIfEmpty(GcmNetworkManager.RESULT_SUCCESS) - .toBlocking() - .first() + } \ No newline at end of file diff --git a/TripKitAndroid/src/test/java/skedgo/tripkit/android/FetchRegionsServiceTest.kt b/TripKitAndroid/src/test/java/skedgo/tripkit/android/FetchRegionsServiceTest.kt index 5f910a29f..2d16396a2 100644 --- a/TripKitAndroid/src/test/java/skedgo/tripkit/android/FetchRegionsServiceTest.kt +++ b/TripKitAndroid/src/test/java/skedgo/tripkit/android/FetchRegionsServiceTest.kt @@ -1,13 +1,11 @@ package skedgo.tripkit.android -import com.google.android.gms.gcm.GcmNetworkManager import com.nhaarman.mockito_kotlin.mock import com.skedgo.android.tripkit.RegionService import com.skedgo.android.tripkit.TripKitAndroidRobolectricTest import org.amshove.kluent.When import org.amshove.kluent.calling import org.amshove.kluent.itReturns -import org.amshove.kluent.shouldBe import org.junit.Test import rx.Completable import rx.Observable @@ -24,13 +22,15 @@ class FetchRegionsServiceTest : TripKitAndroidRobolectricTest() { @Test fun `should succeed if emitting nothing`() { Observable.just(tripKit) .refreshRegions() - .shouldBe(GcmNetworkManager.RESULT_SUCCESS) + .test() + .assertCompleted() } @Test fun `should reschedule if encountering error`() { When calling regionService.refreshAsync() itReturns Completable.error { RuntimeException() } Observable.just(tripKit) .refreshRegions() - .shouldBe(GcmNetworkManager.RESULT_RESCHEDULE) + .test() + .assertError(RuntimeException::class.java) } } diff --git a/trip-kit-booking-ui/src/main/java/com/skedgo/android/tripkit/booking/ui/BookingUiComponent.java b/trip-kit-booking-ui/src/main/java/com/skedgo/android/tripkit/booking/ui/BookingUiComponent.java index 063bd2567..570bc9fa5 100644 --- a/trip-kit-booking-ui/src/main/java/com/skedgo/android/tripkit/booking/ui/BookingUiComponent.java +++ b/trip-kit-booking-ui/src/main/java/com/skedgo/android/tripkit/booking/ui/BookingUiComponent.java @@ -1,5 +1,7 @@ package com.skedgo.android.tripkit.booking.ui; +import android.databinding.DataBindingComponent; + import com.skedgo.android.tripkit.booking.BookingModule; import com.skedgo.android.tripkit.booking.ui.activity.BookingActivity; import com.skedgo.android.tripkit.booking.ui.activity.ExternalProviderAuthActivity; @@ -15,7 +17,7 @@ BookingUiModule.class, BookingModule.class }) -public interface BookingUiComponent { +public interface BookingUiComponent extends DataBindingComponent { Picasso picasso(); void inject(BookingActivity activity); diff --git a/trip-kit-booking-ui/src/main/java/com/skedgo/android/tripkit/booking/ui/activity/BookingActivity.kt b/trip-kit-booking-ui/src/main/java/com/skedgo/android/tripkit/booking/ui/activity/BookingActivity.kt index be3bb3092..156bd1eaf 100644 --- a/trip-kit-booking-ui/src/main/java/com/skedgo/android/tripkit/booking/ui/activity/BookingActivity.kt +++ b/trip-kit-booking-ui/src/main/java/com/skedgo/android/tripkit/booking/ui/activity/BookingActivity.kt @@ -51,7 +51,8 @@ open class BookingActivity : RxAppCompatActivity() { } } - @Inject lateinit var viewModel: BookingFormViewModel + @Inject + lateinit var viewModel: BookingFormViewModel val binding: ActivityBookingBinding by lazy { DataBindingUtil.setContentView(this, R.layout.activity_booking) } @@ -63,15 +64,16 @@ open class BookingActivity : RxAppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) - DaggerBookingUiComponent.builder() + val bookingUiComponent = DaggerBookingUiComponent.builder() .bookingUiModule(BookingUiModule(applicationContext)) .build() + DataBindingUtil.setDefaultComponent(bookingUiComponent) + bookingUiComponent .inject(this) supportActionBar?.setDisplayShowHomeEnabled(true) supportActionBar?.setDisplayHomeAsUpEnabled(true) - - binding.setViewModel(viewModel) + binding.viewModel = viewModel viewModel.onUpdateFormTitle .asObservable() @@ -127,6 +129,7 @@ open class BookingActivity : RxAppCompatActivity() { startActivityForResult(intent, RQ_BOOKING) }, onError) + viewModel.onExternalForm .asObservable() .observeOn(mainThread()) diff --git a/trip-kit-booking-ui/src/main/java/com/skedgo/android/tripkit/booking/ui/activity/ExternalProviderAuthActivity.kt b/trip-kit-booking-ui/src/main/java/com/skedgo/android/tripkit/booking/ui/activity/ExternalProviderAuthActivity.kt index 718a73002..c016d91fe 100644 --- a/trip-kit-booking-ui/src/main/java/com/skedgo/android/tripkit/booking/ui/activity/ExternalProviderAuthActivity.kt +++ b/trip-kit-booking-ui/src/main/java/com/skedgo/android/tripkit/booking/ui/activity/ExternalProviderAuthActivity.kt @@ -53,7 +53,7 @@ class ExternalProviderAuthActivity : RxAppCompatActivity() { .build() .inject(this) - binding.setViewModel(viewModel) + binding.viewModel = viewModel val args = intent.extras viewModel.handleArgs(args) diff --git a/trip-kit-booking-ui/src/main/java/com/skedgo/android/tripkit/booking/ui/view/util/ViewUtils.kt b/trip-kit-booking-ui/src/main/java/com/skedgo/android/tripkit/booking/ui/view/util/ViewUtils.kt index 25e8264c7..685178c6e 100644 --- a/trip-kit-booking-ui/src/main/java/com/skedgo/android/tripkit/booking/ui/view/util/ViewUtils.kt +++ b/trip-kit-booking-ui/src/main/java/com/skedgo/android/tripkit/booking/ui/view/util/ViewUtils.kt @@ -6,10 +6,14 @@ import android.widget.ImageView import com.skedgo.android.tripkit.booking.ui.BookingUiComponent @BindingAdapter("bookingImageUrl") -fun loadImageUrl(component: BookingUiComponent, view: ImageView, imageUrl: String) { - component.picasso() - .load(imageUrl) - .into(view) +fun loadImageUrl(component: BookingUiComponent, view: ImageView, imageUrl: String?) { + if (imageUrl == null) { + view.setImageBitmap(null) + } else { + component.picasso() + .load(imageUrl) + .into(view) + } } @BindingAdapter("url") diff --git a/trip-kit-booking-ui/src/main/java/com/skedgo/android/tripkit/booking/ui/viewmodel/BookingFormViewModel.kt b/trip-kit-booking-ui/src/main/java/com/skedgo/android/tripkit/booking/ui/viewmodel/BookingFormViewModel.kt index efe4f4c03..7ea27446f 100644 --- a/trip-kit-booking-ui/src/main/java/com/skedgo/android/tripkit/booking/ui/viewmodel/BookingFormViewModel.kt +++ b/trip-kit-booking-ui/src/main/java/com/skedgo/android/tripkit/booking/ui/viewmodel/BookingFormViewModel.kt @@ -79,7 +79,7 @@ class BookingFormViewModel } .observeOn(mainThread()) .doOnNext { nextBookingForm -> - if (nextBookingForm == null) { + if (nextBookingForm == null || nextBookingForm == NullBookingForm) { onDone.onNext(nextBookingForm) } else { bookingForm = nextBookingForm diff --git a/trip-kit-booking-ui/src/main/res/layout/field_password.xml b/trip-kit-booking-ui/src/main/res/layout/field_password.xml index 550982a29..c73fb15e1 100644 --- a/trip-kit-booking-ui/src/main/res/layout/field_password.xml +++ b/trip-kit-booking-ui/src/main/res/layout/field_password.xml @@ -3,6 +3,7 @@ xmlns:tools="http://schemas.android.com/tools"> + @@ -24,10 +25,10 @@ android:layout_height="wrap_content" android:layout_alignParentRight="true" android:layout_toRightOf="@id/titleView" - android:text="@{viewModel.editText}" - android:inputType="textPassword" /> + android:inputType="textPassword" + android:onTextChanged="@{viewModel.onTextChanged}" + android:text="@{viewModel.editText}" /> - \ No newline at end of file diff --git a/trip-kit-booking-ui/src/test/java/com/skedgo/android/tripkit/booking/ui/viewmodel/BookingFormViewModelTest.kt b/trip-kit-booking-ui/src/test/java/com/skedgo/android/tripkit/booking/ui/viewmodel/BookingFormViewModelTest.kt index 467bbea89..90830e34c 100644 --- a/trip-kit-booking-ui/src/test/java/com/skedgo/android/tripkit/booking/ui/viewmodel/BookingFormViewModelTest.kt +++ b/trip-kit-booking-ui/src/test/java/com/skedgo/android/tripkit/booking/ui/viewmodel/BookingFormViewModelTest.kt @@ -289,4 +289,23 @@ class BookingFormViewModelTest { subscriber.assertValue(null) subscriberDone.assertValue(null) } + + @Test fun shouldEmitDoneOnFetchNullBookingForm() { + val bookingFormAction = mock() + + val bundle = Bundle() + bundle.putInt(KEY_TYPE, BOOKING_TYPE_ACTION) + bundle.putParcelable(KEY_FORM, bookingFormAction) + + whenever(getBookingFormFromAction.execute(bookingFormAction)).thenReturn(Observable.just(NullBookingForm)) + + val subscriber = TestSubscriber() + val subscriberDone = TestSubscriber() + + viewModel.onDone.subscribe(subscriberDone) + viewModel.fetchBookingFormAsync(bundle).subscribe(subscriber) + + subscriber.assertValue(NullBookingForm) + subscriberDone.assertValue(NullBookingForm) + } } \ No newline at end of file diff --git a/trip-kit-booking/src/main/java/com/skedgo/android/tripkit/booking/BookingServiceImpl.java b/trip-kit-booking/src/main/java/com/skedgo/android/tripkit/booking/BookingServiceImpl.java deleted file mode 100644 index 8784b71d0..000000000 --- a/trip-kit-booking/src/main/java/com/skedgo/android/tripkit/booking/BookingServiceImpl.java +++ /dev/null @@ -1,53 +0,0 @@ -package com.skedgo.android.tripkit.booking; - -import android.support.annotation.VisibleForTesting; - -import com.google.gson.Gson; - -import java.io.IOException; - -import retrofit2.Response; -import rx.Observable; -import rx.Single; -import rx.functions.Func1; - -public class BookingServiceImpl implements BookingService { - - private final BookingApi bookingApi; - private final Gson gson; - @VisibleForTesting Func1, Observable> handleBookingResponse = - new Func1, Observable>() { - @Override - public Observable call(final Response bookingFormResponse) { - - if (!bookingFormResponse.isSuccessful()) { - try { - BookingError e = asBookingError(bookingFormResponse.errorBody().string()); - return Observable.error(e); - } catch (IOException e) { - return Observable.error(e); - } - } - return Observable.just(bookingFormResponse.body()); - } - }; - - public BookingServiceImpl(BookingApi bookingApi, Gson gson) { - this.bookingApi = bookingApi; - this.gson = gson; - } - - @Override public Observable getFormAsync(String url) { - return bookingApi.getFormAsync(url).flatMap(handleBookingResponse); - } - - @Override public Observable postFormAsync(String url, InputForm inputForm) { - - return bookingApi.postFormAsync(url, inputForm) - .flatMap(handleBookingResponse); - } - - @VisibleForTesting BookingError asBookingError(String bookingErrorJson) { - return gson.fromJson(bookingErrorJson, BookingError.class); - } -} diff --git a/trip-kit-booking/src/main/java/com/skedgo/android/tripkit/booking/BookingServiceImpl.kt b/trip-kit-booking/src/main/java/com/skedgo/android/tripkit/booking/BookingServiceImpl.kt new file mode 100644 index 000000000..768046521 --- /dev/null +++ b/trip-kit-booking/src/main/java/com/skedgo/android/tripkit/booking/BookingServiceImpl.kt @@ -0,0 +1,40 @@ +package com.skedgo.android.tripkit.booking + +import com.google.gson.Gson +import retrofit2.Response +import rx.Observable +import rx.functions.Func1 +import java.io.IOException + +class BookingServiceImpl(private val bookingApi: BookingApi, private val gson: Gson) : BookingService { + var handleBookingResponse: Func1, Observable> = + Func1 { bookingFormResponse -> + if (!bookingFormResponse.isSuccessful) { + try { + val e = asBookingError(bookingFormResponse.errorBody()!!.string()) + return@Func1 Observable.error(e) + } catch (e: IOException) { + return@Func1 Observable.error(e) + } + + } else { + if (bookingFormResponse.code() == 204) { + Observable.just(NullBookingForm as BookingForm) + } else { + Observable.just(bookingFormResponse.body()!!) + } + } + } + + override fun getFormAsync(url: String): Observable { + return bookingApi.getFormAsync(url).flatMap(handleBookingResponse) + } + + override fun postFormAsync(url: String, inputForm: InputForm): Observable = + bookingApi.postFormAsync(url, inputForm) + .flatMap(handleBookingResponse) + + fun asBookingError(bookingErrorJson: String): BookingError { + return gson.fromJson(bookingErrorJson, BookingError::class.java) + } +} diff --git a/trip-kit-booking/src/main/java/com/skedgo/android/tripkit/booking/NullBookingForm.kt b/trip-kit-booking/src/main/java/com/skedgo/android/tripkit/booking/NullBookingForm.kt new file mode 100644 index 000000000..7ed742027 --- /dev/null +++ b/trip-kit-booking/src/main/java/com/skedgo/android/tripkit/booking/NullBookingForm.kt @@ -0,0 +1,3 @@ +package com.skedgo.android.tripkit.booking + +object NullBookingForm : BookingForm() \ No newline at end of file diff --git a/trip-kit-booking/src/test/java/com/skedgo/android/tripkit/booking/BookingServiceTest.java b/trip-kit-booking/src/test/java/com/skedgo/android/tripkit/booking/BookingServiceTest.java index 7196cae23..42db1bcb1 100644 --- a/trip-kit-booking/src/test/java/com/skedgo/android/tripkit/booking/BookingServiceTest.java +++ b/trip-kit-booking/src/test/java/com/skedgo/android/tripkit/booking/BookingServiceTest.java @@ -10,6 +10,7 @@ import org.robolectric.annotation.Config; import okhttp3.MediaType; +import okhttp3.Protocol; import okhttp3.ResponseBody; import retrofit2.Response; import rx.Observable; @@ -135,7 +136,7 @@ public class BookingServiceTest { final TestSubscriber subscriber = new TestSubscriber<>(); - service.handleBookingResponse.call(response).subscribe(subscriber); + service.getHandleBookingResponse().call(response).subscribe(subscriber); subscriber.awaitTerminalEvent(); subscriber.assertNoErrors(); @@ -145,6 +146,29 @@ public class BookingServiceTest { } + @Test public void shouldHandleBookingEmptyResponse() { + + final Response response = Response.success( + new BookingForm(), + new okhttp3.Response.Builder() + .request(new okhttp3.Request.Builder().url("http://skedgo.com").build()) + .code(204) + .message("") + .protocol(Protocol.HTTP_1_1) + .build()); + + final TestSubscriber subscriber = new TestSubscriber<>(); + + service.getHandleBookingResponse().call(response).subscribe(subscriber); + subscriber.awaitTerminalEvent(); + subscriber.assertNoErrors(); + + BookingForm result = subscriber.getOnNextEvents().get(0); + + assertThat(NullBookingForm.INSTANCE).isEqualTo(result); + + } + @Test public void shouldHandleBookingErrorResponse() { String responseError = "{\"error\":\"That userToken is unrecognised.\",\"errorCode\":401,\"usererror\":false}"; @@ -154,7 +178,7 @@ public class BookingServiceTest { final TestSubscriber subscriber = new TestSubscriber<>(); - service.handleBookingResponse.call(response).subscribe(subscriber); + service.getHandleBookingResponse().call(response).subscribe(subscriber); subscriber.awaitTerminalEvent(); subscriber.assertError(BookingError.class); From 16baed8b74ae475b1a6ce48a2c17dac83f00949c Mon Sep 17 00:00:00 2001 From: Emmanuel Lagarrigue Lazarte Date: Sat, 2 Jun 2018 11:29:15 -0300 Subject: [PATCH 11/45] Handle myki specific auth booking form (#289) * Set default component * Handle empty booking form (response 204) (#286) * Handle empty booking form (response 204) * Fix tests * Add test and fix some stuff * Add null form test * Add !! * Remove gcm dependency * Use firebase job dispatcher * Notify the scheduler when finished * Reverse `needsReschedule` * Handle myki specific auth booking form --- .../main/java/skedgo/tripkit/android/FetchRegionsService.kt | 5 +---- .../java/com/skedgo/android/tripkit/booking/BookingForm.java | 4 ++-- .../com/skedgo/android/tripkit/booking/BookingFormTest.java | 2 +- 3 files changed, 4 insertions(+), 7 deletions(-) diff --git a/TripKitAndroid/src/main/java/skedgo/tripkit/android/FetchRegionsService.kt b/TripKitAndroid/src/main/java/skedgo/tripkit/android/FetchRegionsService.kt index 74097d16e..17cc869a3 100644 --- a/TripKitAndroid/src/main/java/skedgo/tripkit/android/FetchRegionsService.kt +++ b/TripKitAndroid/src/main/java/skedgo/tripkit/android/FetchRegionsService.kt @@ -6,8 +6,6 @@ import rx.Completable import rx.Observable import rx.Subscription import rx.schedulers.Schedulers - - class FetchRegionsService : JobService() { var runningJob: Subscription? = null @@ -64,10 +62,9 @@ class FetchRegionsService : JobService() { } } - fun Observable.refreshRegions(): Observable = this .flatMap { it.regionService .refreshAsync() .toObservable() - } \ No newline at end of file + } diff --git a/trip-kit-booking/src/main/java/com/skedgo/android/tripkit/booking/BookingForm.java b/trip-kit-booking/src/main/java/com/skedgo/android/tripkit/booking/BookingForm.java index 1c588bc6d..d37b2f336 100644 --- a/trip-kit-booking/src/main/java/com/skedgo/android/tripkit/booking/BookingForm.java +++ b/trip-kit-booking/src/main/java/com/skedgo/android/tripkit/booking/BookingForm.java @@ -102,8 +102,8 @@ public boolean isOAuthForm() { return "authForm".equals(getType()); } - public boolean isPayIQAuthForm() { - return "payiq".equals(value); + public boolean isSpecificAuthForm() { + return "payiq".equals(value) || "myki".equals(value); } public boolean isUberAuthForm() { diff --git a/trip-kit-booking/src/test/java/com/skedgo/android/tripkit/booking/BookingFormTest.java b/trip-kit-booking/src/test/java/com/skedgo/android/tripkit/booking/BookingFormTest.java index bd98784f5..eda38ba46 100644 --- a/trip-kit-booking/src/test/java/com/skedgo/android/tripkit/booking/BookingFormTest.java +++ b/trip-kit-booking/src/test/java/com/skedgo/android/tripkit/booking/BookingFormTest.java @@ -405,7 +405,7 @@ public class BookingFormTest { JsonReader reader = new JsonReader(new StringReader(authBookingFormJson)); BookingForm bookingForm = gson.fromJson(reader, BookingForm.class); - assertThat(bookingForm.isPayIQAuthForm()).isTrue(); + assertThat(bookingForm.isSpecificAuthForm()).isTrue(); } From f33b404f2a0ee30833099c3f7432cd95ce24ffd8 Mon Sep 17 00:00:00 2001 From: Tran Huu Tin Date: Mon, 4 Jun 2018 17:14:31 +0700 Subject: [PATCH 12/45] Fix Requesting Regions too frequently (#291) --- .../java/skedgo/tripkit/android/FetchRegionsService.kt | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/TripKitAndroid/src/main/java/skedgo/tripkit/android/FetchRegionsService.kt b/TripKitAndroid/src/main/java/skedgo/tripkit/android/FetchRegionsService.kt index 17cc869a3..c831cb602 100644 --- a/TripKitAndroid/src/main/java/skedgo/tripkit/android/FetchRegionsService.kt +++ b/TripKitAndroid/src/main/java/skedgo/tripkit/android/FetchRegionsService.kt @@ -30,7 +30,8 @@ class FetchRegionsService : JobService() { } .refreshRegions() .subscribeOn(Schedulers.io()) - .subscribe({ }, + .toCompletable() + .subscribe( { jobFinished(job, false) }, { jobFinished(job, true) }) return true @@ -50,10 +51,7 @@ class FetchRegionsService : JobService() { .setTrigger(Trigger.NOW) .setReplaceCurrent(true) .setRetryStrategy(RetryStrategy.DEFAULT_EXPONENTIAL) - .setConstraints( - Constraint.ON_ANY_NETWORK, - Constraint.DEVICE_CHARGING - ) + .setConstraints(Constraint.ON_ANY_NETWORK) .build() dispatcher.mustSchedule(myJob) } From 403a26d780ad1bdf36c29ad5131d864e9811bab3 Mon Sep 17 00:00:00 2001 From: Tran Huu Tin Date: Mon, 11 Jun 2018 01:32:54 +0700 Subject: [PATCH 13/45] Upgrades gradle (#292) * Set default component * Handle empty booking form (response 204) (#286) * Handle empty booking form (response 204) * Fix tests * Add test and fix some stuff * Add null form test * Add !! * Remove gcm dependency * Use firebase job dispatcher * Notify the scheduler when finished * Reverse `needsReschedule` * Use 2.1 pluging for gradle 4.6+ * Upgrade gradle --- build.gradle | 2 +- gradle/wrapper/gradle-wrapper.properties | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/build.gradle b/build.gradle index a7b1a3dd5..0c4da76a8 100644 --- a/build.gradle +++ b/build.gradle @@ -16,7 +16,7 @@ buildscript { classpath 'com.jakewharton.hugo:hugo-plugin:1.2.1' // To deploy AAR files to local maven. - classpath 'com.github.dcendents:android-maven-gradle-plugin:1.5' + classpath 'com.github.dcendents:android-maven-gradle-plugin:2.1' } } diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 610ad4c51..73bb13d55 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -2,4 +2,4 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-4.5-all.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-4.7-all.zip From ac936e05f319a167248bf7d29febf261646b6f04 Mon Sep 17 00:00:00 2001 From: Tran Huu Tin Date: Sun, 17 Jun 2018 15:26:39 +0700 Subject: [PATCH 14/45] Target sdk 27 (#294) * Target sdk 27 * target 27 for samples module --- CommonCoreLegacy/build.gradle | 2 +- TripKitAndroid/build.gradle | 2 +- TripKitSamples/build.gradle | 2 +- dependencies.gradle | 4 ++-- route-persistence/build.gradle | 4 ++-- trip-kit-booking-ui/build.gradle | 2 +- trip-kit-booking/build.gradle | 2 +- 7 files changed, 9 insertions(+), 9 deletions(-) diff --git a/CommonCoreLegacy/build.gradle b/CommonCoreLegacy/build.gradle index da7e2ce67..f7d93ebde 100644 --- a/CommonCoreLegacy/build.gradle +++ b/CommonCoreLegacy/build.gradle @@ -15,7 +15,7 @@ android { defaultConfig { minSdkVersion 15 - targetSdkVersion 25 + targetSdkVersion 27 testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" } diff --git a/TripKitAndroid/build.gradle b/TripKitAndroid/build.gradle index a4b130269..743dce240 100644 --- a/TripKitAndroid/build.gradle +++ b/TripKitAndroid/build.gradle @@ -15,7 +15,7 @@ android { defaultConfig { minSdkVersion 15 - targetSdkVersion 25 + targetSdkVersion 27 testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" } diff --git a/TripKitSamples/build.gradle b/TripKitSamples/build.gradle index 86819c04e..f2800ec0c 100644 --- a/TripKitSamples/build.gradle +++ b/TripKitSamples/build.gradle @@ -10,7 +10,7 @@ android { defaultConfig { applicationId "skedgo.tripkit.samples" minSdkVersion 15 - targetSdkVersion 25 + targetSdkVersion 27 versionCode 1 versionName "1.0" testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" diff --git a/dependencies.gradle b/dependencies.gradle index a73b1a4f8..cfe16b343 100644 --- a/dependencies.gradle +++ b/dependencies.gradle @@ -10,12 +10,12 @@ versions.devMinSdkVersion = 21 versions.proMinSdkVersion = 15 versions.compileSdkVersion = 27 versions.buildToolsVersion = "27.0.3" -versions.targetSdkVersion = 25 +versions.targetSdkVersion = 27 versions.playServicesVersion = "11.4.2" versions.firebaseAppIndexingVersion = "11.4.2" // See change-log at https://github.com/JetBrains/kotlin/blob/master/ChangeLog.md. versions.kotlinVersion = "1.2.30" -versions.supportLibraryVersion = "27.1.0" +versions.supportLibraryVersion = "27.1.1" versions.androidGradlePlugin = "3.1.0" versions.okHttpVersion = "3.8.1" versions.retrofitVersion = "2.3.0" diff --git a/route-persistence/build.gradle b/route-persistence/build.gradle index 5b6f4fffe..1cb03cf6d 100644 --- a/route-persistence/build.gradle +++ b/route-persistence/build.gradle @@ -23,7 +23,7 @@ android { defaultConfig { minSdkVersion 15 - targetSdkVersion 25 + targetSdkVersion 27 versionCode 1 versionName '1.0' testInstrumentationRunner 'android.support.test.runner.AndroidJUnitRunner' @@ -40,7 +40,7 @@ android { dependencies { implementation project(':CommonCoreLegacy') implementation 'com.github.skedgo:sqlite-utils:v1.0' - implementation 'com.android.support:appcompat-v7:25.3.0' + implementation 'com.android.support:appcompat-v7:27.1.1' implementation libs.gson implementation libs.supportAnnotations implementation project(":TripKitDomain") diff --git a/trip-kit-booking-ui/build.gradle b/trip-kit-booking-ui/build.gradle index 20c2467e5..29a5ef1f0 100644 --- a/trip-kit-booking-ui/build.gradle +++ b/trip-kit-booking-ui/build.gradle @@ -9,7 +9,7 @@ android { defaultConfig { minSdkVersion 15 - targetSdkVersion 25 + targetSdkVersion 27 testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" } diff --git a/trip-kit-booking/build.gradle b/trip-kit-booking/build.gradle index 9e568ed09..f5be290ff 100644 --- a/trip-kit-booking/build.gradle +++ b/trip-kit-booking/build.gradle @@ -13,7 +13,7 @@ android { defaultConfig { minSdkVersion 15 - targetSdkVersion 25 + targetSdkVersion 27 testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" } From 85dfcbb4d034f285f5033bc992ec48c62f0c9548 Mon Sep 17 00:00:00 2001 From: Tran Huu Tin Date: Sun, 17 Jun 2018 16:30:21 +0700 Subject: [PATCH 15/45] Update dependencies (#295) * Target sdk 27 * target 27 for samples module * Update dependencies --- dependencies.gradle | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/dependencies.gradle b/dependencies.gradle index cfe16b343..17a2e6ea6 100644 --- a/dependencies.gradle +++ b/dependencies.gradle @@ -33,7 +33,7 @@ libs.assertjCore = "org.assertj:assertj-core:2.6.0" libs.jodaTime = "joda-time:joda-time:2.9.9:no-tzdb" libs.jodaTimeTzdb = "joda-time:joda-time:2.9.9" libs.jodaTimeAndroid = "net.danlew:android.joda:2.9.9" -libs.androidJob = "com.evernote:android-job:1.1.11" +libs.androidJob = "com.evernote:android-job:1.2.6" libs.androidReactiveLocation = "com.github.skedgo:Android-ReactiveLocation:1de14cd99af0253d82184c04d91ebe3447914a54" libs.playServicesMaps = "com.google.android.gms:play-services-maps:$versions.playServicesVersion" libs.playServicesLocation = "com.google.android.gms:play-services-location:$versions.playServicesVersion" @@ -84,7 +84,7 @@ libs.timber = "com.jakewharton.timber:timber:4.5.1" libs.rxtry = "com.github.thuytrinh:RxTry:c2f002df6c" libs.koptional = "com.gojuno.koptional:koptional:1.2.0" libs.bindingCollectionAdapterRecyclerView = "me.tatarka.bindingcollectionadapter2:bindingcollectionadapter-recyclerview:2.3.0-beta1" -libs.rxLifecycleComponents = "com.github.skedgo:RxLifecycleComponents:v1.3" +libs.rxLifecycleComponents = "com.github.skedgo:RxLifecycleComponents:v1.5" // See changelog at http://developer.android.com/tools/revisions/gradle-plugin.html // and https://twitter.com/AGPVersions. From 40410ab4875739f7e96a4ecf877b75f4cd51f344 Mon Sep 17 00:00:00 2001 From: Tran Huu Tin Date: Fri, 22 Jun 2018 21:48:06 +0700 Subject: [PATCH 16/45] Fix stops disappearing (#297) * Target sdk 27 * target 27 for samples module * Update dependencies * Fix stops disappearing by adding includeStops=true query * Fix tests --- .../skedgo/android/tripkit/MainModule.java | 2 +- .../skedgo/android/tripkit/TripUpdateApi.java | 15 --- .../skedgo/android/tripkit/TripUpdateApi.kt | 16 +++ .../android/tripkit/TripUpdaterImpl.java | 74 ------------- .../skedgo/android/tripkit/TripUpdaterImpl.kt | 45 ++++++++ .../android/tripkit/TripUpdaterImplTest.java | 104 ------------------ .../android/tripkit/TripUpdaterImplTest.kt | 104 ++++++++++++++++++ 7 files changed, 166 insertions(+), 194 deletions(-) delete mode 100644 TripKitAndroid/src/main/java/com/skedgo/android/tripkit/TripUpdateApi.java create mode 100644 TripKitAndroid/src/main/java/com/skedgo/android/tripkit/TripUpdateApi.kt delete mode 100644 TripKitAndroid/src/main/java/com/skedgo/android/tripkit/TripUpdaterImpl.java create mode 100644 TripKitAndroid/src/main/java/com/skedgo/android/tripkit/TripUpdaterImpl.kt delete mode 100644 TripKitAndroid/src/test/java/com/skedgo/android/tripkit/TripUpdaterImplTest.java create mode 100644 TripKitAndroid/src/test/java/com/skedgo/android/tripkit/TripUpdaterImplTest.kt diff --git a/TripKitAndroid/src/main/java/com/skedgo/android/tripkit/MainModule.java b/TripKitAndroid/src/main/java/com/skedgo/android/tripkit/MainModule.java index 5256858ee..cd36446c2 100644 --- a/TripKitAndroid/src/main/java/com/skedgo/android/tripkit/MainModule.java +++ b/TripKitAndroid/src/main/java/com/skedgo/android/tripkit/MainModule.java @@ -171,7 +171,7 @@ public MainModule(@NonNull Configs configs) { } @Singleton @Provides TripUpdater getTripUpdater(TripUpdateApi api, Gson gson) { - return new TripUpdaterImpl(context.getResources(), api, "12", gson); + return new TripUpdaterImpl(context.getResources(), api, gson); } @Provides LocationInfoApi getLocationInfoApi(Gson gson, OkHttpClient httpClient) { diff --git a/TripKitAndroid/src/main/java/com/skedgo/android/tripkit/TripUpdateApi.java b/TripKitAndroid/src/main/java/com/skedgo/android/tripkit/TripUpdateApi.java deleted file mode 100644 index 74d47158a..000000000 --- a/TripKitAndroid/src/main/java/com/skedgo/android/tripkit/TripUpdateApi.java +++ /dev/null @@ -1,15 +0,0 @@ -package com.skedgo.android.tripkit; - -import skedgo.tripkit.routing.RoutingResponse; - -import retrofit2.http.GET; -import retrofit2.http.Query; -import retrofit2.http.Url; -import rx.Observable; - -interface TripUpdateApi { - @GET Observable fetchUpdateAsync( - @Url String url, - @Query("v") String apiVersion - ); -} \ No newline at end of file diff --git a/TripKitAndroid/src/main/java/com/skedgo/android/tripkit/TripUpdateApi.kt b/TripKitAndroid/src/main/java/com/skedgo/android/tripkit/TripUpdateApi.kt new file mode 100644 index 000000000..0e57594c1 --- /dev/null +++ b/TripKitAndroid/src/main/java/com/skedgo/android/tripkit/TripUpdateApi.kt @@ -0,0 +1,16 @@ +package com.skedgo.android.tripkit + +import skedgo.tripkit.routing.RoutingResponse + +import retrofit2.http.GET +import retrofit2.http.Query +import retrofit2.http.Url +import rx.Observable + +internal interface TripUpdateApi { + + @GET fun fetchUpdateAsync( + @Url url: String, + @Query("includeStops") includeStops: Boolean = true + ): Observable +} \ No newline at end of file diff --git a/TripKitAndroid/src/main/java/com/skedgo/android/tripkit/TripUpdaterImpl.java b/TripKitAndroid/src/main/java/com/skedgo/android/tripkit/TripUpdaterImpl.java deleted file mode 100644 index fb79a4eea..000000000 --- a/TripKitAndroid/src/main/java/com/skedgo/android/tripkit/TripUpdaterImpl.java +++ /dev/null @@ -1,74 +0,0 @@ -package com.skedgo.android.tripkit; - -import android.content.res.Resources; -import android.support.annotation.NonNull; -import android.text.TextUtils; - -import com.google.gson.Gson; -import skedgo.tripkit.routing.RoutingResponse; -import skedgo.tripkit.routing.Trip; -import skedgo.tripkit.routing.TripGroup; - -import org.apache.commons.collections4.CollectionUtils; - -import java.util.List; - -import rx.Observable; -import rx.functions.Func1; -import rx.schedulers.Schedulers; - -final class TripUpdaterImpl implements TripUpdater { - private final Resources resources; - private final TripUpdateApi api; - private final String apiVersion; - private final Gson gson; - - TripUpdaterImpl( - @NonNull Resources resources, - @NonNull TripUpdateApi api, - @NonNull String apiVersion, - @NonNull Gson gson) { - this.resources = resources; - this.api = api; - this.apiVersion = apiVersion; - this.gson = gson; - } - - @NonNull @Override - public Observable getUpdateAsync(@NonNull String tripUrl) { - Trip trip = new Trip(); - trip.setUpdateURL(tripUrl); - return getUpdateAsync(trip); - } - - @NonNull @Override - public Observable getUpdateAsync(@NonNull Trip trip) { - if (TextUtils.isEmpty(trip.getUpdateURL())) { - return Observable.empty(); - } - - return api.fetchUpdateAsync(trip.getUpdateURL(), apiVersion) - .map(new Func1>() { - @Override public List call(RoutingResponse response) { - response.processRawData(resources, gson); - return response.getTripGroupList(); - } - }) - .filter(new Func1, Boolean>() { - @Override public Boolean call(List groups) { - return CollectionUtils.isNotEmpty(groups); - } - }) - .map(new Func1, Trip>() { - @Override public Trip call(List groups) { - return groups.get(0).getDisplayTrip(); - } - }) - .filter(new Func1() { - @Override public Boolean call(Trip trip) { - return trip != null; - } - }) - .subscribeOn(Schedulers.io()); - } -} \ No newline at end of file diff --git a/TripKitAndroid/src/main/java/com/skedgo/android/tripkit/TripUpdaterImpl.kt b/TripKitAndroid/src/main/java/com/skedgo/android/tripkit/TripUpdaterImpl.kt new file mode 100644 index 000000000..c76ab2afb --- /dev/null +++ b/TripKitAndroid/src/main/java/com/skedgo/android/tripkit/TripUpdaterImpl.kt @@ -0,0 +1,45 @@ +package com.skedgo.android.tripkit + +import android.content.res.Resources +import android.text.TextUtils + +import com.google.gson.Gson +import skedgo.tripkit.routing.RoutingResponse +import skedgo.tripkit.routing.Trip +import skedgo.tripkit.routing.TripGroup + +import org.apache.commons.collections4.CollectionUtils + +import rx.Observable +import rx.functions.Func1 +import rx.schedulers.Schedulers + +internal class TripUpdaterImpl( + private val resources: Resources, + private val api: TripUpdateApi, + private val gson: Gson) : TripUpdater { + + override fun getUpdateAsync(tripUrl: String): Observable { + val trip = Trip() + trip.updateURL = tripUrl + return getUpdateAsync(trip) + } + + override fun getUpdateAsync(trip: Trip): Observable { + val updateURL = trip.updateURL + return if (updateURL.isNullOrEmpty()) { + Observable.empty() + } else { + api.fetchUpdateAsync(updateURL!!) + .map { response -> + response.processRawData(resources, gson) + response.tripGroupList + } + .filter { it != null && it.isNotEmpty() } + .map { it.first().displayTrip } + .filter { it != null } + .map { it!! } + .subscribeOn(Schedulers.io()) + } + } +} \ No newline at end of file diff --git a/TripKitAndroid/src/test/java/com/skedgo/android/tripkit/TripUpdaterImplTest.java b/TripKitAndroid/src/test/java/com/skedgo/android/tripkit/TripUpdaterImplTest.java deleted file mode 100644 index c43ff0ebd..000000000 --- a/TripKitAndroid/src/test/java/com/skedgo/android/tripkit/TripUpdaterImplTest.java +++ /dev/null @@ -1,104 +0,0 @@ -package com.skedgo.android.tripkit; - -import android.content.res.Resources; - -import com.google.gson.Gson; -import skedgo.tripkit.routing.RoutingResponse; -import skedgo.tripkit.routing.Trip; -import skedgo.tripkit.routing.TripGroup; - -import org.junit.Before; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.mockito.Mock; -import org.mockito.MockitoAnnotations; -import org.robolectric.annotation.Config; - -import java.util.ArrayList; - -import rx.Observable; -import rx.observers.TestSubscriber; - -import static java.util.Collections.singletonList; -import static org.assertj.core.api.Java6Assertions.*; -import static org.mockito.Matchers.eq; -import static org.mockito.Mockito.mock; -import static org.mockito.Mockito.when; - -@RunWith(TestRunner.class) -@Config(constants = BuildConfig.class) -public class TripUpdaterImplTest { - @Mock Resources resources; - @Mock TripUpdateApi api; - private String apiVersion = "11"; - private TripUpdaterImpl updater; - - @Before public void before() { - MockitoAnnotations.initMocks(this); - updater = new TripUpdaterImpl(resources, api, apiVersion, new Gson()); - } - - @Test public void shouldReturnEmpty() { - final Trip trip = mock(Trip.class); - final TestSubscriber subscriber = new TestSubscriber<>(); - updater.getUpdateAsync(trip).subscribe(subscriber); - subscriber.awaitTerminalEvent(); - subscriber.assertNoErrors(); - subscriber.assertNoValues(); - } - - @Test public void shouldReturnDisplayTrip() { - final TripGroup group = mock(TripGroup.class); - final Trip trip = mock(Trip.class); - final String updateUrl = "https://goo.gl/f2yv7k"; - when(trip.getUpdateURL()).thenReturn(updateUrl); - final Trip displayTrip = mock(Trip.class); - when(group.getDisplayTrip()).thenReturn(displayTrip); - final RoutingResponse response = mock(RoutingResponse.class); - when(response.getTripGroupList()) - .thenReturn(new ArrayList<>(singletonList(group))); - when(api.fetchUpdateAsync(eq(updateUrl), eq(apiVersion))) - .thenReturn(Observable.just(response)); - - final TestSubscriber subscriber = new TestSubscriber<>(); - updater.getUpdateAsync(trip).subscribe(subscriber); - subscriber.awaitTerminalEvent(); - subscriber.assertNoErrors(); - assertThat(subscriber.getOnNextEvents()).containsExactly(displayTrip); - } - - @Test public void shouldReturnEmptyIfNoGroupsAvailable() { - final Trip trip = mock(Trip.class); - final String updateUrl = "https://goo.gl/f2yv7k"; - when(trip.getUpdateURL()).thenReturn(updateUrl); - final RoutingResponse response = mock(RoutingResponse.class); - when(response.getTripGroupList()).thenReturn(null); - when(api.fetchUpdateAsync(eq(updateUrl), eq(apiVersion))) - .thenReturn(Observable.just(response)); - - final TestSubscriber subscriber = new TestSubscriber<>(); - updater.getUpdateAsync(trip).subscribe(subscriber); - subscriber.awaitTerminalEvent(); - subscriber.assertNoErrors(); - subscriber.assertNoValues(); - } - - @Test public void shouldReturnEmptyIfNoTripsAvailable() { - final Trip trip = mock(Trip.class); - final String updateUrl = "https://goo.gl/f2yv7k"; - when(trip.getUpdateURL()).thenReturn(updateUrl); - final TripGroup group = mock(TripGroup.class); - when(group.getDisplayTrip()).thenReturn(null); - final RoutingResponse response = mock(RoutingResponse.class); - when(response.getTripGroupList()) - .thenReturn(new ArrayList<>(singletonList(group))); - when(api.fetchUpdateAsync(eq(updateUrl), eq(apiVersion))) - .thenReturn(Observable.just(response)); - - final TestSubscriber subscriber = new TestSubscriber<>(); - updater.getUpdateAsync(trip).subscribe(subscriber); - subscriber.awaitTerminalEvent(); - subscriber.assertNoErrors(); - subscriber.assertNoValues(); - } -} \ No newline at end of file diff --git a/TripKitAndroid/src/test/java/com/skedgo/android/tripkit/TripUpdaterImplTest.kt b/TripKitAndroid/src/test/java/com/skedgo/android/tripkit/TripUpdaterImplTest.kt new file mode 100644 index 000000000..ce2641203 --- /dev/null +++ b/TripKitAndroid/src/test/java/com/skedgo/android/tripkit/TripUpdaterImplTest.kt @@ -0,0 +1,104 @@ +package com.skedgo.android.tripkit + +import android.content.res.Resources + +import com.google.gson.Gson +import com.nhaarman.mockito_kotlin.eq +import com.nhaarman.mockito_kotlin.whenever +import skedgo.tripkit.routing.RoutingResponse +import skedgo.tripkit.routing.Trip +import skedgo.tripkit.routing.TripGroup + +import org.junit.Before +import org.junit.Test +import org.junit.runner.RunWith +import org.mockito.Mock +import org.mockito.MockitoAnnotations +import org.robolectric.annotation.Config + +import java.util.ArrayList + +import rx.Observable +import rx.observers.TestSubscriber + +import org.assertj.core.api.Java6Assertions.* +import org.mockito.Mockito.mock + +@RunWith(TestRunner::class) +@Config(constants = BuildConfig::class) +class TripUpdaterImplTest { + @Mock + internal var resources: Resources? = null + @Mock + internal var api: TripUpdateApi? = null + private var updater: TripUpdaterImpl? = null + + @Before fun before() { + MockitoAnnotations.initMocks(this) + updater = TripUpdaterImpl(resources!!, api!!, Gson()) + } + + @Test fun shouldReturnEmpty() { + val trip = mock(Trip::class.java) + val subscriber = TestSubscriber() + updater!!.getUpdateAsync(trip).subscribe(subscriber) + subscriber.awaitTerminalEvent() + subscriber.assertNoErrors() + subscriber.assertNoValues() + } + + @Test fun shouldReturnDisplayTrip() { + val group = mock(TripGroup::class.java) + val trip = mock(Trip::class.java) + val updateUrl = "https://goo.gl/f2yv7k" + whenever(trip.updateURL).thenReturn(updateUrl) + val displayTrip = mock(Trip::class.java) + whenever(group.displayTrip).thenReturn(displayTrip) + val response = mock(RoutingResponse::class.java) + whenever(response.tripGroupList) + .thenReturn(ArrayList(listOf(group))) + whenever(api!!.fetchUpdateAsync(updateUrl)) + .thenReturn(Observable.just(response)) + + val subscriber = TestSubscriber() + updater!!.getUpdateAsync(trip).subscribe(subscriber) + subscriber.awaitTerminalEvent() + subscriber.assertNoErrors() + assertThat(subscriber.onNextEvents).containsExactly(displayTrip) + } + + @Test fun shouldReturnEmptyIfNoGroupsAvailable() { + val trip = mock(Trip::class.java) + val updateUrl = "https://goo.gl/f2yv7k" + whenever(trip.updateURL).thenReturn(updateUrl) + val response = mock(RoutingResponse::class.java) + whenever(response.tripGroupList).thenReturn(null) + whenever(api!!.fetchUpdateAsync(updateUrl)) + .thenReturn(Observable.just(response)) + + val subscriber = TestSubscriber() + updater!!.getUpdateAsync(trip).subscribe(subscriber) + subscriber.awaitTerminalEvent() + subscriber.assertNoErrors() + subscriber.assertNoValues() + } + + @Test fun shouldReturnEmptyIfNoTripsAvailable() { + val trip = mock(Trip::class.java) + val updateUrl = "https://goo.gl/f2yv7k" + whenever(trip.updateURL).thenReturn(updateUrl) + val group = mock(TripGroup::class.java) + whenever(group.displayTrip).thenReturn(null) + val response = mock(RoutingResponse::class.java) + whenever(response.tripGroupList) + .thenReturn(ArrayList(listOf(group))) + whenever(api!!.fetchUpdateAsync(updateUrl)) + .thenReturn(Observable.just(response)) + + val subscriber = TestSubscriber() + updater!!.getUpdateAsync(trip).subscribe(subscriber) + subscriber.awaitTerminalEvent() + subscriber.assertNoErrors() + subscriber.assertNoValues() + } +} \ No newline at end of file From 07535dc82afb5011e100d0901d5460b46cb5acdd Mon Sep 17 00:00:00 2001 From: Tran Huu Tin Date: Sat, 7 Jul 2018 00:31:50 +0700 Subject: [PATCH 17/45] Save and load sources (#237) * Save and load sources * Use plain string --- .../com/skedgo/routepersistence/RouteContract.java | 4 +++- .../skedgo/routepersistence/RouteDatabaseHelper.java | 4 +++- .../java/com/skedgo/routepersistence/RouteStore.java | 12 +++++++++++- 3 files changed, 17 insertions(+), 3 deletions(-) diff --git a/route-persistence/src/main/java/com/skedgo/routepersistence/RouteContract.java b/route-persistence/src/main/java/com/skedgo/routepersistence/RouteContract.java index 6b3dee2ec..2ee98f5f6 100644 --- a/route-persistence/src/main/java/com/skedgo/routepersistence/RouteContract.java +++ b/route-persistence/src/main/java/com/skedgo/routepersistence/RouteContract.java @@ -35,6 +35,7 @@ final class RouteContract { static final String SELECT_TRIPS = "select * from " + TABLE_TRIPS + " where " + COL_GROUP_ID + " = ?"; static final String TABLE_TRIP_GROUPS = "tripGroups"; static final String COL_IS_NOTIFIABLE = "isNotifiable"; + static final String COL_SOURCES = "sources"; private RouteContract() {} @@ -63,10 +64,11 @@ static void createTables(SQLiteDatabase database) { final DatabaseField uuid = new DatabaseField(COL_UUID, "text"); final DatabaseField requestId = new DatabaseField(COL_REQUEST_ID, "text"); final DatabaseField isNotifiable = new DatabaseField(COL_IS_NOTIFIABLE, "integer"); + final DatabaseField sources = new DatabaseField(COL_SOURCES, "text"); final DatabaseTable tripGroups = new DatabaseTable( TABLE_TRIP_GROUPS, new DatabaseField[] { - _id, requestId, uuid, frequency, displayTripId, isNotifiable + _id, requestId, uuid, frequency, displayTripId, isNotifiable, sources }, UniqueIndices.of(TABLE_TRIP_GROUPS, requestId, uuid), "CREATE TRIGGER deleteTrips AFTER DELETE ON " + TABLE_TRIP_GROUPS + " BEGIN " + diff --git a/route-persistence/src/main/java/com/skedgo/routepersistence/RouteDatabaseHelper.java b/route-persistence/src/main/java/com/skedgo/routepersistence/RouteDatabaseHelper.java index 407941ae0..7390c1d00 100644 --- a/route-persistence/src/main/java/com/skedgo/routepersistence/RouteDatabaseHelper.java +++ b/route-persistence/src/main/java/com/skedgo/routepersistence/RouteDatabaseHelper.java @@ -5,7 +5,7 @@ import android.database.sqlite.SQLiteOpenHelper; public class RouteDatabaseHelper extends SQLiteOpenHelper { - private static int DATABASE_VERSION = 2; + private static int DATABASE_VERSION = 3; public RouteDatabaseHelper(Context context, String name) { super(context, name, null, DATABASE_VERSION); @@ -20,6 +20,8 @@ public RouteDatabaseHelper(Context context, String name) { switch (oldVersion) { case 1: RoutingStatusContract.INSTANCE.create(db); + case 2: + db.execSQL("ALTER TABLE tripGroups ADD COLUMN sources TEXT"); } } } diff --git a/route-persistence/src/main/java/com/skedgo/routepersistence/RouteStore.java b/route-persistence/src/main/java/com/skedgo/routepersistence/RouteStore.java index 3d5c2a4f5..9aadc8ff6 100644 --- a/route-persistence/src/main/java/com/skedgo/routepersistence/RouteStore.java +++ b/route-persistence/src/main/java/com/skedgo/routepersistence/RouteStore.java @@ -10,6 +10,8 @@ import com.google.gson.Gson; import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collections; import java.util.List; import java.util.concurrent.Callable; @@ -18,6 +20,7 @@ import rx.Observable; import rx.functions.Action0; import rx.functions.Func1; +import skedgo.tripkit.routing.Source; import skedgo.tripkit.routing.Trip; import skedgo.tripkit.routing.TripGroup; import skedgo.tripkit.routing.TripSegment; @@ -40,6 +43,7 @@ import static com.skedgo.routepersistence.RouteContract.COL_QUERY_IS_LEAVE_AFTER; import static com.skedgo.routepersistence.RouteContract.COL_REQUEST_ID; import static com.skedgo.routepersistence.RouteContract.COL_SAVE_URL; +import static com.skedgo.routepersistence.RouteContract.COL_SOURCES; import static com.skedgo.routepersistence.RouteContract.COL_TEMP_URL; import static com.skedgo.routepersistence.RouteContract.COL_TRIP_ID; import static com.skedgo.routepersistence.RouteContract.COL_UPDATE_URL; @@ -302,11 +306,14 @@ private TripGroup asTripGroup(Cursor cursor) { final String uuid = cursor.getString(cursor.getColumnIndex(COL_UUID)); final int frequency = cursor.getInt(cursor.getColumnIndex(COL_FREQUENCY)); final long displayTripId = cursor.getLong(cursor.getColumnIndex(COL_DISPLAY_TRIP_ID)); - + final Source[] sources = gson.fromJson(cursor.getString(cursor.getColumnIndex(COL_SOURCES)), Source[].class); final TripGroup group = new TripGroup(); group.uuid(uuid); group.setFrequency(frequency); group.setDisplayTripId(displayTripId); + if (sources != null) { + group.setSources(Arrays.asList(sources)); + } return group; } @@ -355,6 +362,9 @@ private void saveTripGroupAndTrips( values.put(COL_DISPLAY_TRIP_ID, group.getDisplayTripId()); values.put(COL_REQUEST_ID, requestId); values.put(COL_IS_NOTIFIABLE, isNotifiable ? 1 : 0); + if (group.getSources() != null) { + values.put(COL_SOURCES, gson.toJson(group.getSources().toArray(), Source[].class)); + } database.insertWithOnConflict(TABLE_TRIP_GROUPS, null, values, SQLiteDatabase.CONFLICT_REPLACE); } From 4c999ce953a2ec398641caf7133de194cbbf0553 Mon Sep 17 00:00:00 2001 From: Tran Huu Tin Date: Fri, 13 Jul 2018 23:01:50 +0700 Subject: [PATCH 18/45] Fix racv issues 2 (#299) * Set hint for password * ActionSend on the password EditText * Goes from the password field to submitting the form --- .../ui/viewmodel/BookingFormViewModel.kt | 13 ++++++++++++ .../ui/viewmodel/FieldPasswordViewModel.kt | 11 ++++++++-- .../res/drawable/v4_selector_btn_positive.xml | 20 ------------------- .../v4_selector_btn_positive_text.xml | 5 ----- .../src/main/res/layout/activity_booking.xml | 19 +++++++++--------- .../src/main/res/layout/field_password.xml | 2 ++ 6 files changed, 33 insertions(+), 37 deletions(-) delete mode 100644 trip-kit-booking-ui/src/main/res/drawable/v4_selector_btn_positive.xml delete mode 100644 trip-kit-booking-ui/src/main/res/drawable/v4_selector_btn_positive_text.xml diff --git a/trip-kit-booking-ui/src/main/java/com/skedgo/android/tripkit/booking/ui/viewmodel/BookingFormViewModel.kt b/trip-kit-booking-ui/src/main/java/com/skedgo/android/tripkit/booking/ui/viewmodel/BookingFormViewModel.kt index 7ea27446f..c3ed33c1d 100644 --- a/trip-kit-booking-ui/src/main/java/com/skedgo/android/tripkit/booking/ui/viewmodel/BookingFormViewModel.kt +++ b/trip-kit-booking-ui/src/main/java/com/skedgo/android/tripkit/booking/ui/viewmodel/BookingFormViewModel.kt @@ -6,6 +6,9 @@ import android.databinding.ObservableBoolean import android.databinding.ObservableField import android.databinding.ObservableList import android.os.Bundle +import android.view.KeyEvent +import android.view.inputmethod.EditorInfo +import android.widget.TextView import com.skedgo.android.tripkit.booking.* import com.skedgo.android.tripkit.booking.ui.activity.* import com.skedgo.android.tripkit.booking.ui.usecase.GetBookingFormFromAction @@ -138,5 +141,15 @@ class BookingFormViewModel items.add(it.footer) } } + + items.lastOrNull { it is FieldPasswordViewModel } + ?.let { it as FieldPasswordViewModel } + ?.let { + it.imeOptions = EditorInfo.IME_ACTION_SEND + it.onEditorActionListener = TextView.OnEditorActionListener { _, _, _ -> + onAction() + true + } + } } } \ No newline at end of file diff --git a/trip-kit-booking-ui/src/main/java/com/skedgo/android/tripkit/booking/ui/viewmodel/FieldPasswordViewModel.kt b/trip-kit-booking-ui/src/main/java/com/skedgo/android/tripkit/booking/ui/viewmodel/FieldPasswordViewModel.kt index b97281ba0..74185ecb2 100644 --- a/trip-kit-booking-ui/src/main/java/com/skedgo/android/tripkit/booking/ui/viewmodel/FieldPasswordViewModel.kt +++ b/trip-kit-booking-ui/src/main/java/com/skedgo/android/tripkit/booking/ui/viewmodel/FieldPasswordViewModel.kt @@ -1,5 +1,9 @@ package com.skedgo.android.tripkit.booking.ui.viewmodel +import android.view.inputmethod.EditorInfo +import android.view.inputmethod.EditorInfo.IME_ACTION_NEXT +import android.view.inputmethod.EditorInfo.IME_ACTION_SEND +import android.widget.TextView import com.skedgo.android.tripkit.booking.PasswordFormField class FieldPasswordViewModel(val passwordFormField: PasswordFormField) : DisposableViewModel() { @@ -7,9 +11,12 @@ class FieldPasswordViewModel(val passwordFormField: PasswordFormField) : Disposa val isHidden: Boolean get() = passwordFormField.isHidden val editText: String get() = passwordFormField.value ?: "" + val hint: String = passwordFormField.title.orEmpty() + + var onEditorActionListener: TextView.OnEditorActionListener? = null + var imeOptions: Int = IME_ACTION_NEXT fun onTextChanged(s: CharSequence, start: Int, before: Int, count: Int) { - passwordFormField.setValue(s.toString()) + passwordFormField.value = s.toString() } - } \ No newline at end of file diff --git a/trip-kit-booking-ui/src/main/res/drawable/v4_selector_btn_positive.xml b/trip-kit-booking-ui/src/main/res/drawable/v4_selector_btn_positive.xml deleted file mode 100644 index a9df361f1..000000000 --- a/trip-kit-booking-ui/src/main/res/drawable/v4_selector_btn_positive.xml +++ /dev/null @@ -1,20 +0,0 @@ - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/trip-kit-booking-ui/src/main/res/drawable/v4_selector_btn_positive_text.xml b/trip-kit-booking-ui/src/main/res/drawable/v4_selector_btn_positive_text.xml deleted file mode 100644 index 470157e75..000000000 --- a/trip-kit-booking-ui/src/main/res/drawable/v4_selector_btn_positive_text.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/trip-kit-booking-ui/src/main/res/layout/activity_booking.xml b/trip-kit-booking-ui/src/main/res/layout/activity_booking.xml index cfead6bf4..8f712573c 100644 --- a/trip-kit-booking-ui/src/main/res/layout/activity_booking.xml +++ b/trip-kit-booking-ui/src/main/res/layout/activity_booking.xml @@ -28,23 +28,22 @@ android:layout_height="match_parent" android:layout_above="@+id/actionButton" android:clipToPadding="false" + android:visibility="@{!viewModel.hasError}" app:itemBinding="@{BookingActivity.bookingFormsView()}" app:items="@{viewModel.items}" - app:layoutManager="@{LayoutManagers.linear()}" - android:visibility="@{!viewModel.hasError}"/> + app:layoutManager="@{LayoutManagers.linear()}" />