├── .gitignore ├── .idea ├── gradle.xml ├── misc.xml ├── modules.xml └── runConfigurations.xml ├── README.md ├── app ├── .gitignore ├── build.gradle ├── proguard-rules.pro └── src │ ├── androidTest │ └── java │ │ └── com │ │ └── levnovikov │ │ └── postbus │ │ └── ExampleInstrumentedTest.java │ ├── main │ ├── AndroidManifest.xml │ ├── java │ │ └── com │ │ │ └── levnovikov │ │ │ └── postbus │ │ │ ├── Application.kt │ │ │ ├── deeplinks │ │ │ └── DeeplinkParser.kt │ │ │ └── root │ │ │ ├── di │ │ │ ├── AppComponent.kt │ │ │ └── AppModule.java │ │ │ └── home │ │ │ ├── HomeActivity.kt │ │ │ ├── HomeInteractor.kt │ │ │ ├── HomeRouter.kt │ │ │ ├── HomeView.kt │ │ │ ├── allocating │ │ │ ├── AllocatingInteractor.kt │ │ │ ├── AllocatingNodeHolder.kt │ │ │ ├── AllocatingRouter.kt │ │ │ ├── AllocatingView.kt │ │ │ └── di │ │ │ │ ├── AllocatingComponent.kt │ │ │ │ └── AllocatingScope.kt │ │ │ ├── di │ │ │ ├── HomeComponent.kt │ │ │ ├── HomeComponentBuilder.kt │ │ │ ├── HomeModule.kt │ │ │ └── HomeScope.kt │ │ │ └── prebooking │ │ │ ├── PrebookingInteractor.kt │ │ │ ├── PrebookingNodeHolder.kt │ │ │ ├── PrebookingRouter.kt │ │ │ ├── booking_extra_widget │ │ │ ├── BookingExtraInteractor.kt │ │ │ ├── BookingExtraNodeHolder.kt │ │ │ ├── BookingExtraRouter.kt │ │ │ ├── BookingExtraVM.kt │ │ │ ├── BookingExtraView.kt │ │ │ ├── di │ │ │ │ ├── BookingExtraComponent.kt │ │ │ │ └── BookingExtraScope.kt │ │ │ ├── extra │ │ │ │ ├── ExtraInteractor.kt │ │ │ │ ├── ExtraNodeHolder.kt │ │ │ │ ├── ExtraRouter.kt │ │ │ │ ├── ExtraView.kt │ │ │ │ └── di │ │ │ │ │ ├── ExtraComponent.kt │ │ │ │ │ └── ExtraScope.kt │ │ │ └── options │ │ │ │ ├── OptionsInteractor.kt │ │ │ │ ├── OptionsNodeHolder.kt │ │ │ │ ├── OptionsRouter.kt │ │ │ │ ├── OptionsVM.kt │ │ │ │ ├── OptionsView.kt │ │ │ │ ├── di │ │ │ │ └── OptionsComponent.kt │ │ │ │ └── sub_options │ │ │ │ ├── SubOptionsNodeHolder.kt │ │ │ │ ├── SubOptionsRouter.kt │ │ │ │ ├── SubOptionsView.kt │ │ │ │ └── di │ │ │ │ └── SubOptionsComponent.kt │ │ │ ├── car_type_selector │ │ │ ├── CarTypeSelectorInteractor.kt │ │ │ ├── CarTypeSelectorNodeHolder.kt │ │ │ ├── CarTypeSelectorRouter.kt │ │ │ ├── CarTypeSelectorVM.kt │ │ │ ├── car_type_list │ │ │ │ ├── CarTypeListInteractor.kt │ │ │ │ ├── CarTypeListNodeHolder.kt │ │ │ │ ├── CarTypeListRouter.kt │ │ │ │ ├── CarTypeListView.kt │ │ │ │ └── di │ │ │ │ │ ├── CarTypeListComponent.kt │ │ │ │ │ └── CarTypeListScope.kt │ │ │ ├── di │ │ │ │ ├── CarTypeSelectorComponent.kt │ │ │ │ └── CarTypeSelectorScope.kt │ │ │ └── template │ │ │ │ └── TemplateHodeHolder.kt │ │ │ ├── di │ │ │ ├── PrebookingComponent.kt │ │ │ └── PrebookingScope.kt │ │ │ ├── poi_selector │ │ │ ├── PoiSelectorInteractor.kt │ │ │ ├── PoiSelectorNodeHolder.kt │ │ │ ├── PoiSelectorRouter.kt │ │ │ ├── PoiSelectorView.kt │ │ │ └── di │ │ │ │ ├── PoiSelectorComponent.kt │ │ │ │ └── PoiSelectorScope.kt │ │ │ └── poi_widget │ │ │ ├── PoiWidgetInteractor.kt │ │ │ ├── PoiWidgetNodeHolder.kt │ │ │ ├── PoiWidgetRouter.kt │ │ │ ├── PoiWidgetVM.kt │ │ │ ├── PoiWidgetView.kt │ │ │ └── di │ │ │ ├── PoiWidgetComponent.java │ │ │ └── PoiWidgetScope.java │ └── res │ │ ├── drawable-v24 │ │ └── ic_launcher_foreground.xml │ │ ├── drawable │ │ ├── ic_attach_money_black_24dp.xml │ │ ├── ic_directions_car_black_24dp.xml │ │ ├── ic_launcher_background.xml │ │ ├── ic_more_horiz_black_24dp.xml │ │ └── ic_receipt_black_24dp.xml │ │ ├── layout │ │ ├── activity_splash.xml │ │ ├── alloc_view.xml │ │ ├── booking_extra_widget.xml │ │ ├── car_type_list_view.xml │ │ ├── car_type_selector.xml │ │ ├── extra_view.xml │ │ ├── home_view.xml │ │ ├── options_view.xml │ │ ├── poi_selector.xml │ │ ├── poi_selector_item.xml │ │ ├── poi_widget.xml │ │ ├── sub_options_view.xml │ │ ├── template_view.xml │ │ ├── test_layout.xml │ │ └── wtf_view.xml │ │ ├── mipmap-anydpi-v26 │ │ ├── ic_launcher.xml │ │ └── ic_launcher_round.xml │ │ ├── mipmap-hdpi │ │ ├── ic_launcher.png │ │ └── ic_launcher_round.png │ │ ├── mipmap-mdpi │ │ ├── ic_launcher.png │ │ └── ic_launcher_round.png │ │ ├── mipmap-xhdpi │ │ ├── ic_launcher.png │ │ └── ic_launcher_round.png │ │ ├── mipmap-xxhdpi │ │ ├── ic_launcher.png │ │ └── ic_launcher_round.png │ │ ├── mipmap-xxxhdpi │ │ ├── ic_launcher.png │ │ └── ic_launcher_round.png │ │ └── values │ │ ├── colors.xml │ │ ├── strings.xml │ │ └── styles.xml │ └── test │ └── java │ └── com │ └── levnovikov │ └── postbus │ └── ExampleUnitTest.java ├── build.gradle ├── core-auth ├── .gitignore ├── build.gradle ├── proguard-rules.pro └── src │ ├── main │ ├── AndroidManifest.xml │ ├── java │ │ └── com │ │ │ └── example │ │ │ └── core_auth │ │ │ ├── di │ │ │ └── AuthProviderModule.java │ │ │ └── provider │ │ │ ├── AuthProvider.java │ │ │ ├── FacebookAuthProvider.java │ │ │ └── GoogleAuthProvider.java │ └── res │ │ └── values │ │ └── strings.xml │ └── test │ └── java │ └── com │ └── example │ └── core_auth │ └── ExampleUnitTest.java ├── core-booking ├── .gitignore ├── build.gradle ├── proguard-rules.pro └── src │ ├── main │ ├── AndroidManifest.xml │ ├── java │ │ └── com │ │ │ └── example │ │ │ └── core_booking │ │ │ └── PrebookingRepo.java │ └── res │ │ └── values │ │ └── strings.xml │ └── test │ └── java │ └── com │ └── example │ └── core_booking │ └── ExampleUnitTest.java ├── core-geo ├── .gitignore ├── build.gradle ├── proguard-rules.pro └── src │ ├── main │ ├── AndroidManifest.xml │ ├── java │ │ └── com │ │ │ └── example │ │ │ └── core_geo │ │ │ ├── Coordinates.kt │ │ │ └── Point.kt │ └── res │ │ └── values │ │ └── strings.xml │ └── test │ └── java │ └── com │ └── example │ └── core_geo │ └── ExampleUnitTest.java ├── core-location ├── .gitignore ├── build.gradle ├── proguard-rules.pro └── src │ ├── main │ ├── AndroidManifest.xml │ ├── java │ │ └── com │ │ │ └── example │ │ │ └── core_location │ │ │ └── PoiSuggestionProvider.java │ └── res │ │ └── values │ │ └── strings.xml │ └── test │ └── java │ └── com │ └── example │ └── core_location │ └── ExampleUnitTest.java ├── core-profile ├── .gitignore ├── build.gradle ├── proguard-rules.pro └── src │ └── main │ ├── AndroidManifest.xml │ ├── java │ └── com │ │ └── levnovikov │ │ └── core_profile │ │ ├── UserRepository.kt │ │ ├── di │ │ ├── ProfileComponent.kt │ │ ├── ProfileModule.kt │ │ └── stubs │ │ │ └── UserRepoStub.kt │ │ └── model │ │ └── UserProfile.kt │ └── res │ └── values │ └── strings.xml ├── dependency.gradle ├── feature-auth ├── .gitignore ├── build.gradle ├── proguard-rules.pro └── src │ └── main │ ├── AndroidManifest.xml │ ├── java │ └── com │ │ └── levnovikov │ │ └── feature_auth │ │ ├── AuthInteractor.kt │ │ ├── AuthNodeHolder.kt │ │ ├── AuthRouter.kt │ │ ├── AuthView.kt │ │ ├── dependency │ │ └── AuthDependency.kt │ │ ├── di │ │ ├── AuthComponent.kt │ │ └── AuthScope.kt │ │ └── view_model │ │ ├── AuthActions.kt │ │ ├── AuthViewModel.kt │ │ └── AuthViewModelImpl.kt │ └── res │ ├── layout │ └── auth_view.xml │ └── values │ └── strings.xml ├── feature-map ├── .gitignore ├── build.gradle ├── proguard-rules.pro └── src │ └── main │ ├── AndroidManifest.xml │ ├── java │ └── com │ │ └── levnovikov │ │ └── feature_map │ │ ├── MapInteractor.kt │ │ ├── MapNodeHolder.kt │ │ ├── MapRouter.kt │ │ ├── MapView.kt │ │ ├── dependency │ │ ├── MapDependency.kt │ │ ├── MapProvider.kt │ │ └── MapSetter.kt │ │ ├── di │ │ ├── MapComponent.kt │ │ └── MapScope.java │ │ ├── lifecycle │ │ ├── MapLifecycleEvent.kt │ │ └── MapLifecycleListener.kt │ │ └── map_wrapper │ │ ├── MapInterface.java │ │ └── MapWrapper.kt │ └── res │ ├── drawable │ └── ic_vehicle_taxi.xml │ ├── layout │ └── map_view.xml │ └── values │ └── strings.xml ├── feature-promo ├── .gitignore ├── build.gradle ├── proguard-rules.pro └── src │ └── main │ ├── AndroidManifest.xml │ ├── java │ └── com │ │ └── levnovikov │ │ └── feature_promo │ │ ├── domain │ │ └── Promo.kt │ │ └── promo_list │ │ ├── PromoListInteractor.kt │ │ ├── PromoListNodeHolder.kt │ │ ├── PromoListPresenter.kt │ │ ├── PromoListRouter.kt │ │ ├── PromoListView.kt │ │ ├── dependency │ │ ├── OnPromoSelectedListener.kt │ │ └── PromoListDependency.kt │ │ └── di │ │ ├── PromoListComponent.kt │ │ └── PromoListScope.kt │ └── res │ ├── layout │ ├── promo_list_item.xml │ └── promo_list_view.xml │ └── values │ └── strings.xml ├── feature-ride ├── .gitignore ├── build.gradle ├── proguard-rules.pro └── src │ ├── main │ ├── AndroidManifest.xml │ ├── java │ │ └── com │ │ │ └── levnovikov │ │ │ └── feature_ride │ │ │ └── ride │ │ │ ├── BehaviorField.kt │ │ │ ├── RidePrebookingData.kt │ │ │ └── RidePrebookingRepo.kt │ └── res │ │ └── values │ │ └── strings.xml │ └── test │ └── java │ └── com │ └── levnovikov │ └── feature_ride │ └── ExampleUnitTest.java ├── gradle.properties ├── gradle └── wrapper │ ├── gradle-wrapper.jar │ └── gradle-wrapper.properties ├── gradlew ├── gradlew.bat ├── settings.gradle ├── stream-state ├── .gitignore ├── build.gradle ├── proguard-rules.pro └── src │ └── main │ ├── AndroidManifest.xml │ ├── java │ └── com │ │ └── levnovikov │ │ └── stream_state │ │ ├── AppState.kt │ │ ├── AppStateStreamProvider.kt │ │ └── PrebookingState.kt │ └── res │ └── values │ └── strings.xml ├── system-base ├── .gitignore ├── build.gradle ├── proguard-rules.pro ├── readme-structure │ ├── Node architecture - communiacation.png │ ├── Node architecture - node structure.png │ └── Node architecture overview.png └── src │ ├── main │ ├── AndroidManifest.xml │ ├── java │ │ └── com │ │ │ └── levnovikov │ │ │ └── system_base │ │ │ ├── BackStateInteractor.kt │ │ │ ├── BindingNodeHolder.kt │ │ │ ├── Interactor.kt │ │ │ ├── NodeHolder.kt │ │ │ ├── Router.kt │ │ │ ├── StateDataProvider.kt │ │ │ ├── StateInteractor.kt │ │ │ ├── ViewNodeHolder.kt │ │ │ ├── back_handling │ │ │ └── BackHandler.kt │ │ │ ├── base_di │ │ │ ├── ActivityComponent.kt │ │ │ ├── ComponentBuilder.kt │ │ │ ├── ComponentKey.kt │ │ │ └── SubComponentProvider.kt │ │ │ ├── exceptions │ │ │ ├── RouterAlreadyAttachedException.kt │ │ │ └── ViewIsAlreadyAttachedException.kt │ │ │ ├── lifecycle │ │ │ ├── Lifecycle.kt │ │ │ ├── LifecycleActivity.kt │ │ │ └── LifecycleEvent.kt │ │ │ └── node_state │ │ │ ├── ActivityState.kt │ │ │ └── NodeState.kt │ └── res │ │ └── values │ │ └── strings.xml │ └── test │ └── java │ └── com │ ├── example │ └── system_base │ │ └── ExampleUnitTest.java │ └── levnovikov │ └── system_base │ └── RouterTest.kt └── template ├── NewNode_MVP ├── globals.xml.ftl ├── recipe.xml.ftl ├── root │ ├── res │ │ └── layout │ │ │ └── fragment_blank.xml.ftl │ └── src │ │ └── app_package │ │ └── NodeHolder.kt.ftl └── template.xml ├── NewNode_MVVM ├── globals.xml.ftl ├── recipe.xml.ftl ├── root │ ├── res │ │ └── layout │ │ │ └── fragment_blank.xml.ftl │ └── src │ │ └── app_package │ │ └── NodeHolder.kt.ftl └── template.xml ├── NewNode_MVVM_custom_view ├── globals.xml.ftl ├── recipe.xml.ftl ├── root │ ├── res │ │ └── layout │ │ │ └── fragment_blank.xml.ftl │ └── src │ │ └── app_package │ │ └── NodeHolder.kt.ftl └── template.xml ├── README.MD └── sync_templates.sh /.gitignore: -------------------------------------------------------------------------------- 1 | *.iml 2 | .gradle 3 | /local.properties 4 | .idea 5 | .DS_Store 6 | /build 7 | /captures 8 | .externalNativeBuild 9 | -------------------------------------------------------------------------------- /.idea/gradle.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 27 | 28 | -------------------------------------------------------------------------------- /.idea/misc.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 16 | 26 | 27 | 28 | 29 | 30 | 31 | 33 | 34 | 39 | 40 | 41 | 42 | 43 | 44 | 1.8 45 | 46 | 51 | 52 | 53 | 54 | 55 | 56 | -------------------------------------------------------------------------------- /.idea/modules.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | -------------------------------------------------------------------------------- /.idea/runConfigurations.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 11 | 12 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # PostBusApp # 2 | Transportation app architecture example 3 | 4 | ## Overview ## 5 | 6 | ![overview](https://raw.githubusercontent.com/LevNovikov92/Node-architecture-prototype/grab-proto/system-base/readme-structure/Node%20architecture%20overview.png) 7 | 8 | ## Node structure ## 9 | ![node structure](https://raw.githubusercontent.com/LevNovikov92/Node-architecture-prototype/grab-proto/system-base/readme-structure/Node%20architecture%20-%20node%20structure.png) 10 | 11 | ## Communication ## 12 | ![communication](https://raw.githubusercontent.com/LevNovikov92/Node-architecture-prototype/grab-proto/system-base/readme-structure/Node%20architecture%20-%20communiacation.png) 13 | -------------------------------------------------------------------------------- /app/.gitignore: -------------------------------------------------------------------------------- 1 | /build 2 | -------------------------------------------------------------------------------- /app/build.gradle: -------------------------------------------------------------------------------- 1 | apply plugin: 'com.android.application' 2 | apply plugin: 'kotlin-android' 3 | apply plugin: 'kotlin-android-extensions' 4 | apply plugin: 'kotlin-kapt' 5 | 6 | android androidConfiguration 7 | 8 | androidExtensions { 9 | experimental = true 10 | } 11 | 12 | android { 13 | dataBinding { 14 | enabled = true 15 | } 16 | } 17 | 18 | dependencies { 19 | implementation libs.appcompatV7 20 | implementation libs.constraintLayout 21 | implementation libs.recyclerView 22 | implementation libs.appcompatV7 23 | implementation libs.rxJava 24 | implementation libs.rxAndroid 25 | implementation libs.kotlin 26 | implementation libs.supportMultidex 27 | 28 | implementation libs.dagger 29 | } 30 | 31 | dependencies { 32 | kapt aptLibs.databinding 33 | kapt libs.daggerCompiler 34 | } 35 | 36 | dependencies { 37 | implementation fileTree(dir: 'libs', include: ['*.jar']) 38 | implementation 'com.google.android.gms:play-services-maps:11.8.0' 39 | } 40 | 41 | dependencies { 42 | implementation project(path: ':system-base') 43 | implementation project(path: ':core-profile') 44 | implementation project(path: ':stream-state') 45 | implementation project(path: ':feature-ride') 46 | implementation project(path: ':core-geo') 47 | implementation project(path: ':core-location') 48 | implementation project(path: ':core-booking') 49 | implementation project(path: ':feature-promo') 50 | implementation project(path: ':feature-map') 51 | } 52 | 53 | dependencies { 54 | testImplementation testLibs.jUnit 55 | testImplementation testLibs.mockito 56 | testImplementation testLibs.mockito_inline 57 | testImplementation testLibs.mockitoKotlin 58 | } 59 | -------------------------------------------------------------------------------- /app/proguard-rules.pro: -------------------------------------------------------------------------------- 1 | # Add project specific ProGuard rules here. 2 | # You can control the set of applied configuration files using the 3 | # proguardFiles setting in build.gradle. 4 | # 5 | # For more details, see 6 | # http://developer.android.com/guide/developing/tools/proguard.html 7 | 8 | # If your project uses WebView with JS, uncomment the following 9 | # and specify the fully qualified class name to the JavaScript interface 10 | # class: 11 | #-keepclassmembers class fqcn.of.javascript.interface.for.webview { 12 | # public *; 13 | #} 14 | 15 | # Uncomment this to preserve the line number information for 16 | # debugging stack traces. 17 | #-keepattributes SourceFile,LineNumberTable 18 | 19 | # If you keep the line number information, uncomment this to 20 | # hide the original source file name. 21 | #-renamesourcefileattribute SourceFile 22 | -------------------------------------------------------------------------------- /app/src/androidTest/java/com/levnovikov/postbus/ExampleInstrumentedTest.java: -------------------------------------------------------------------------------- 1 | package com.levnovikov.postbus; 2 | 3 | import android.content.Context; 4 | import android.support.test.InstrumentationRegistry; 5 | import android.support.test.runner.AndroidJUnit4; 6 | 7 | import org.junit.Test; 8 | import org.junit.runner.RunWith; 9 | 10 | import static org.junit.Assert.*; 11 | 12 | /** 13 | * Instrumented test, which will execute on an Android device. 14 | * 15 | * @see Testing documentation 16 | */ 17 | @RunWith(AndroidJUnit4.class) 18 | public class ExampleInstrumentedTest { 19 | @Test 20 | public void useAppContext() throws Exception { 21 | // Context of the app under test. 22 | Context appContext = InstrumentationRegistry.getTargetContext(); 23 | 24 | assertEquals("com.levnovikov.postbus", appContext.getPackageName()); 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /app/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 8 | 9 | 12 | 13 | 14 | 15 | 16 | 24 | 25 | 28 | 29 | 32 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | -------------------------------------------------------------------------------- /app/src/main/java/com/levnovikov/postbus/Application.kt: -------------------------------------------------------------------------------- 1 | package com.levnovikov.postbus 2 | 3 | import android.content.Context 4 | import android.support.multidex.MultiDex 5 | import com.levnovikov.postbus.root.di.AppComponent 6 | import com.levnovikov.postbus.root.di.AppModule 7 | import com.levnovikov.postbus.root.di.DaggerAppComponent 8 | import com.levnovikov.system_base.base_di.ComponentBuilder 9 | import com.levnovikov.system_base.base_di.SubComponentProvider 10 | 11 | /** 12 | * Author: lev.novikov 13 | * Date: 20/11/17. 14 | */ 15 | 16 | class Application : android.app.Application(), SubComponentProvider { 17 | 18 | lateinit var appComponent: AppComponent 19 | 20 | override fun onCreate() { 21 | super.onCreate() 22 | injectDependencies() 23 | } 24 | 25 | private fun injectDependencies() { 26 | appComponent = DaggerAppComponent.builder() 27 | .appModule(AppModule(this)) 28 | .build() 29 | } 30 | 31 | @Suppress("UNCHECKED_CAST") 32 | override fun provide(key: Class): C = 33 | appComponent.subComponentBuilders()[key] as C 34 | 35 | override fun attachBaseContext(base: Context) { 36 | super.attachBaseContext(base) 37 | MultiDex.install(this) 38 | } 39 | } 40 | -------------------------------------------------------------------------------- /app/src/main/java/com/levnovikov/postbus/deeplinks/DeeplinkParser.kt: -------------------------------------------------------------------------------- 1 | package com.levnovikov.postbus.deeplinks 2 | 3 | import com.levnovikov.postbus.root.home.HomeInteractor 4 | import com.levnovikov.postbus.root.home.HomeRouter 5 | import com.levnovikov.postbus.root.home.prebooking.PrebookingNodeHolder 6 | import com.levnovikov.postbus.root.home.prebooking.PrebookingRouter 7 | import com.levnovikov.postbus.root.home.prebooking.booking_extra_widget.BookingExtraNodeHolder 8 | import com.levnovikov.postbus.root.home.prebooking.booking_extra_widget.BookingExtraRouter 9 | import com.levnovikov.postbus.root.home.prebooking.booking_extra_widget.options.OptionsNodeHolder 10 | import com.levnovikov.postbus.root.home.prebooking.car_type_selector.CarTypeSelectorNodeHolder 11 | import com.levnovikov.postbus.root.home.prebooking.car_type_selector.CarTypeSelectorRouter 12 | import com.levnovikov.postbus.root.home.prebooking.car_type_selector.car_type_list.CarTypeListNodeHolder 13 | import com.levnovikov.stream_state.AppState 14 | import com.levnovikov.system_base.node_state.ActivityState 15 | import com.levnovikov.system_base.node_state.NodeState 16 | import java.net.URI 17 | import javax.inject.Inject 18 | 19 | /** 20 | * Created by lev.novikov 21 | * Date: 1/3/18. 22 | */ 23 | 24 | interface DeeplinkParser { 25 | fun parseDeeplink(deeplink: URI): ActivityState? 26 | } 27 | 28 | class DeeplinkParserImpl @Inject constructor() : DeeplinkParser { 29 | 30 | private val deeplinkCases = setOf(PromoDeeplink()) 31 | 32 | override fun parseDeeplink(deeplink: URI): ActivityState? = 33 | deeplinkCases.firstOrNull { it.validateLink(deeplink) }?.parseState() 34 | } 35 | 36 | interface DeeplinkCase { 37 | fun validateLink(deeplink: URI): Boolean 38 | fun parseState(): ActivityState 39 | } 40 | 41 | class PromoDeeplink : DeeplinkCase { 42 | override fun validateLink(deeplink: URI) = 43 | deeplink.path == "/prebooking/extra/options" 44 | 45 | override fun parseState(): ActivityState = 46 | ActivityState(stateMap = mapOf( 47 | className() to NodeState(HomeInteractor.HomeData(AppState.PREBOOKING), setOf(className())), 48 | className() to NodeState(null, setOf( 49 | className(), className())), 50 | className() to NodeState(null, setOf( 51 | className())), 52 | className() to NodeState(null, setOf(className())))) 53 | 54 | 55 | inline fun className() = T::class.java.simpleName 56 | } -------------------------------------------------------------------------------- /app/src/main/java/com/levnovikov/postbus/root/di/AppComponent.kt: -------------------------------------------------------------------------------- 1 | package com.levnovikov.postbus.root.di 2 | 3 | import com.levnovikov.core_profile.di.ProfileModule 4 | import com.levnovikov.postbus.root.home.di.HomeComponentBuilder 5 | import com.levnovikov.system_base.base_di.ComponentBuilder 6 | import dagger.Component 7 | import javax.inject.Singleton 8 | 9 | /** 10 | * Author: lev.novikov 11 | * Date: 20/11/17. 12 | */ 13 | 14 | @Singleton 15 | @Component(modules = [(AppModule::class), (ProfileModule::class), (HomeComponentBuilder::class)]) 16 | interface AppComponent { 17 | 18 | fun subComponentBuilders(): Map, ComponentBuilder> 19 | } 20 | -------------------------------------------------------------------------------- /app/src/main/java/com/levnovikov/postbus/root/di/AppModule.java: -------------------------------------------------------------------------------- 1 | package com.levnovikov.postbus.root.di; 2 | 3 | import android.content.Context; 4 | 5 | import javax.inject.Named; 6 | import javax.inject.Singleton; 7 | 8 | import dagger.Module; 9 | import dagger.Provides; 10 | 11 | /** 12 | * Created by lev.novikov 13 | * Date: 21/11/17. 14 | */ 15 | 16 | @Module 17 | public class AppModule { 18 | 19 | private final Context appContext; 20 | 21 | public AppModule(Context appContext) { 22 | this.appContext = appContext; 23 | } 24 | 25 | @Provides 26 | @Singleton 27 | @Named("AppContext") 28 | Context provideContext() { 29 | return appContext; 30 | } 31 | } 32 | -------------------------------------------------------------------------------- /app/src/main/java/com/levnovikov/postbus/root/home/HomeRouter.kt: -------------------------------------------------------------------------------- 1 | package com.levnovikov.postbus.root.home 2 | 3 | import com.levnovikov.feature_map.MapNodeHolder 4 | import com.levnovikov.postbus.root.home.allocating.AllocatingNodeHolder 5 | import com.levnovikov.postbus.root.home.di.HomeScope 6 | import com.levnovikov.postbus.root.home.prebooking.PrebookingNodeHolder 7 | import com.levnovikov.system_base.NodeHolder 8 | import com.levnovikov.system_base.Router 9 | import javax.inject.Inject 10 | 11 | /** 12 | * Author: lev.novikov 13 | * Date: 14/12/17. 14 | */ 15 | 16 | @HomeScope 17 | class HomeRouter @Inject 18 | constructor( 19 | private val prebookingHolder: PrebookingNodeHolder, 20 | private val allocatingHolder: AllocatingNodeHolder, 21 | private val mapHolder: MapNodeHolder) : Router() { 22 | 23 | fun startPrebooking() { 24 | detachNode(allocatingHolder) 25 | attachNode(prebookingHolder) 26 | } 27 | 28 | fun startAllocating() { 29 | detachNode(prebookingHolder) 30 | attachNode(allocatingHolder) 31 | } 32 | 33 | fun loadMap() { 34 | attachNode(mapHolder) 35 | } 36 | 37 | fun startTracking() { 38 | detachNode(allocatingHolder) 39 | detachNode(prebookingHolder) 40 | } 41 | 42 | override val holders: Set> = setOf(mapHolder, prebookingHolder, allocatingHolder) 43 | 44 | } 45 | -------------------------------------------------------------------------------- /app/src/main/java/com/levnovikov/postbus/root/home/HomeView.kt: -------------------------------------------------------------------------------- 1 | package com.levnovikov.postbus.root.home 2 | 3 | import android.content.Context 4 | import android.util.AttributeSet 5 | import android.widget.FrameLayout 6 | 7 | /** 8 | * Author: lev.novikov 9 | * Date: 14/12/17. 10 | */ 11 | 12 | class HomeView : FrameLayout { 13 | 14 | constructor(context: Context) : super(context) {} 15 | 16 | constructor(context: Context, attrs: AttributeSet?) : super(context, attrs) {} 17 | 18 | constructor(context: Context, attrs: AttributeSet?, defStyleAttr: Int) : super(context, attrs, defStyleAttr) {} 19 | } 20 | -------------------------------------------------------------------------------- /app/src/main/java/com/levnovikov/postbus/root/home/allocating/AllocatingInteractor.kt: -------------------------------------------------------------------------------- 1 | package com.levnovikov.postbus.root.home.allocating 2 | 3 | import com.levnovikov.postbus.root.home.allocating.di.AllocatingScope 4 | 5 | import javax.inject.Inject 6 | 7 | /** 8 | * Created by lev.novikov 9 | * Date: 23/12/17. 10 | */ 11 | 12 | @AllocatingScope 13 | class AllocatingInteractor @Inject 14 | internal constructor() 15 | -------------------------------------------------------------------------------- /app/src/main/java/com/levnovikov/postbus/root/home/allocating/AllocatingNodeHolder.kt: -------------------------------------------------------------------------------- 1 | package com.levnovikov.postbus.root.home.allocating 2 | 3 | import android.view.LayoutInflater 4 | import android.view.ViewGroup 5 | 6 | import com.levnovikov.postbus.R 7 | import com.levnovikov.postbus.root.home.allocating.di.AllocatingComponent 8 | import com.levnovikov.postbus.root.home.allocating.di.DaggerAllocatingComponent 9 | import com.levnovikov.postbus.root.home.di.HomeComponent 10 | import com.levnovikov.system_base.ViewNodeHolder 11 | 12 | /** 13 | * Created by lev.novikov 14 | * Date: 23/12/17. 15 | */ 16 | 17 | class AllocatingNodeHolder(inflater: LayoutInflater, parent: ViewGroup, private val parentComponent: HomeComponent) : ViewNodeHolder(inflater, parent) { 18 | 19 | override val layout: Int 20 | get() = R.layout.alloc_view 21 | 22 | override fun build(): AllocatingRouter { 23 | val view = buildView() 24 | val component = DaggerAllocatingComponent.builder() 25 | .homeComponent(parentComponent) 26 | .allocatingModule(AllocatingComponent.AllocatingModule(view)) 27 | .build() 28 | component.inject(view) 29 | component.inject(this) 30 | attachView() 31 | return component.router() 32 | } 33 | } 34 | -------------------------------------------------------------------------------- /app/src/main/java/com/levnovikov/postbus/root/home/allocating/AllocatingRouter.kt: -------------------------------------------------------------------------------- 1 | package com.levnovikov.postbus.root.home.allocating 2 | 3 | import com.levnovikov.postbus.root.home.allocating.di.AllocatingScope 4 | import com.levnovikov.system_base.NodeHolder 5 | import com.levnovikov.system_base.Router 6 | import com.levnovikov.system_base.node_state.NodeState 7 | 8 | import javax.inject.Inject 9 | 10 | /** 11 | * Created by lev.novikov 12 | * Date: 23/12/17. 13 | */ 14 | 15 | @AllocatingScope 16 | class AllocatingRouter @Inject 17 | internal constructor() : Router() { 18 | override val holders: Set> 19 | get() = emptySet() 20 | 21 | } 22 | -------------------------------------------------------------------------------- /app/src/main/java/com/levnovikov/postbus/root/home/allocating/AllocatingView.kt: -------------------------------------------------------------------------------- 1 | package com.levnovikov.postbus.root.home.allocating 2 | 3 | import android.content.Context 4 | import android.util.AttributeSet 5 | import android.widget.LinearLayout 6 | 7 | /** 8 | * Created by lev.novikov 9 | * Date: 23/12/17. 10 | */ 11 | 12 | class AllocatingView : LinearLayout { 13 | constructor(context: Context) : super(context) {} 14 | 15 | constructor(context: Context, attrs: AttributeSet?) : super(context, attrs) {} 16 | 17 | constructor(context: Context, attrs: AttributeSet?, defStyleAttr: Int) : super(context, attrs, defStyleAttr) {} 18 | } 19 | -------------------------------------------------------------------------------- /app/src/main/java/com/levnovikov/postbus/root/home/allocating/di/AllocatingComponent.kt: -------------------------------------------------------------------------------- 1 | package com.levnovikov.postbus.root.home.allocating.di 2 | 3 | import com.levnovikov.postbus.root.home.allocating.AllocatingNodeHolder 4 | import com.levnovikov.postbus.root.home.allocating.AllocatingRouter 5 | import com.levnovikov.postbus.root.home.allocating.AllocatingView 6 | import com.levnovikov.postbus.root.home.di.HomeComponent 7 | 8 | import dagger.Component 9 | import dagger.Module 10 | import dagger.Provides 11 | 12 | /** 13 | * Created by lev.novikov 14 | * Date: 23/12/17. 15 | */ 16 | 17 | @AllocatingScope 18 | @Component(dependencies = [(HomeComponent::class)], modules = [(AllocatingComponent.AllocatingModule::class)]) 19 | interface AllocatingComponent { 20 | 21 | fun inject(view: AllocatingView) 22 | 23 | fun router(): AllocatingRouter 24 | 25 | fun inject(allocatingBuilder: AllocatingNodeHolder) 26 | 27 | @Module 28 | class AllocatingModule(private val view: AllocatingView) { 29 | 30 | @AllocatingScope 31 | @Provides 32 | internal fun provideView(): AllocatingView { 33 | return view 34 | } 35 | } 36 | } 37 | -------------------------------------------------------------------------------- /app/src/main/java/com/levnovikov/postbus/root/home/allocating/di/AllocatingScope.kt: -------------------------------------------------------------------------------- 1 | package com.levnovikov.postbus.root.home.allocating.di 2 | 3 | import javax.inject.Scope 4 | 5 | /** 6 | * Created by lev.novikov 7 | * Date: 23/12/17. 8 | */ 9 | 10 | @Scope 11 | @Retention(AnnotationRetention.RUNTIME) 12 | annotation class AllocatingScope 13 | -------------------------------------------------------------------------------- /app/src/main/java/com/levnovikov/postbus/root/home/di/HomeComponent.kt: -------------------------------------------------------------------------------- 1 | package com.levnovikov.postbus.root.home.di 2 | 3 | import android.view.LayoutInflater 4 | 5 | import com.levnovikov.feature_map.dependency.MapDependency 6 | import com.levnovikov.feature_map.dependency.MapProvider 7 | import com.levnovikov.feature_map.dependency.MapSetter 8 | import com.levnovikov.postbus.root.home.HomeActivity 9 | import com.levnovikov.postbus.root.home.HomeView 10 | import com.levnovikov.postbus.root.home.prebooking.booking_extra_widget.BookingExtraInteractor 11 | import com.levnovikov.system_base.base_di.ActivityComponent 12 | import com.levnovikov.system_base.base_di.ComponentBuilder 13 | 14 | import dagger.Subcomponent 15 | 16 | /** 17 | * Author: lev.novikov 18 | * Date: 14/12/17. 19 | */ 20 | 21 | @HomeScope 22 | @Subcomponent(modules = [(HomeModule::class)]) 23 | interface HomeComponent : ActivityComponent, MapDependency { 24 | 25 | fun inject(homeActivity: HomeActivity) 26 | 27 | @Subcomponent.Builder 28 | interface Builder : ComponentBuilder { 29 | fun homeModule(module: HomeModule): HomeComponent.Builder 30 | fun build(): HomeComponent 31 | } 32 | 33 | fun inflater(): LayoutInflater 34 | fun homeView(): HomeView 35 | fun bookingListener(): BookingExtraInteractor.Listener 36 | override fun mapSetter(): MapSetter 37 | fun mapProvider(): MapProvider 38 | } 39 | -------------------------------------------------------------------------------- /app/src/main/java/com/levnovikov/postbus/root/home/di/HomeComponentBuilder.kt: -------------------------------------------------------------------------------- 1 | package com.levnovikov.postbus.root.home.di 2 | 3 | import com.levnovikov.system_base.base_di.ComponentBuilder 4 | import com.levnovikov.system_base.base_di.ComponentKey 5 | 6 | import dagger.Binds 7 | import dagger.Module 8 | import dagger.multibindings.IntoMap 9 | 10 | /** 11 | * Created by lev.novikov 12 | * Date: 2/12/17. 13 | */ 14 | 15 | @Module(subcomponents = [(HomeComponent::class)]) 16 | interface HomeComponentBuilder { 17 | 18 | @Binds 19 | @IntoMap 20 | @ComponentKey(HomeComponent.Builder::class) 21 | fun mainActivityComponentBuilder(impl: HomeComponent.Builder): ComponentBuilder 22 | 23 | } 24 | -------------------------------------------------------------------------------- /app/src/main/java/com/levnovikov/postbus/root/home/di/HomeScope.kt: -------------------------------------------------------------------------------- 1 | package com.levnovikov.postbus.root.home.di 2 | 3 | import javax.inject.Scope 4 | 5 | /** 6 | * Author: lev.novikov 7 | * Date: 14/12/17. 8 | */ 9 | 10 | @Scope 11 | @Retention(AnnotationRetention.RUNTIME) 12 | annotation class HomeScope 13 | -------------------------------------------------------------------------------- /app/src/main/java/com/levnovikov/postbus/root/home/prebooking/PrebookingNodeHolder.kt: -------------------------------------------------------------------------------- 1 | package com.levnovikov.postbus.root.home.prebooking 2 | 3 | import com.levnovikov.postbus.root.home.di.HomeComponent 4 | import com.levnovikov.postbus.root.home.prebooking.di.DaggerPrebookingComponent 5 | import com.levnovikov.system_base.NodeHolder 6 | 7 | /** 8 | * Author: lev.novikov 9 | * Date: 17/12/17. 10 | */ 11 | 12 | class PrebookingNodeHolder(private val component: HomeComponent) : NodeHolder() { 13 | 14 | override fun build(): PrebookingRouter { 15 | val cmp = DaggerPrebookingComponent.builder() 16 | .homeComponent(component) 17 | .build() 18 | cmp.inject(this) //TODO add lint checking 19 | cmp.interactor().restoreState() 20 | return cmp.getRouter() 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /app/src/main/java/com/levnovikov/postbus/root/home/prebooking/PrebookingRouter.kt: -------------------------------------------------------------------------------- 1 | package com.levnovikov.postbus.root.home.prebooking 2 | 3 | import com.levnovikov.postbus.root.home.prebooking.booking_extra_widget.BookingExtraNodeHolder 4 | import com.levnovikov.postbus.root.home.prebooking.car_type_selector.CarTypeSelectorNodeHolder 5 | import com.levnovikov.postbus.root.home.prebooking.di.PrebookingScope 6 | import com.levnovikov.postbus.root.home.prebooking.poi_selector.PoiSelectorNodeHolder 7 | import com.levnovikov.postbus.root.home.prebooking.poi_widget.PoiWidgetNodeHolder 8 | import com.levnovikov.system_base.NodeHolder 9 | import com.levnovikov.system_base.Router 10 | import com.levnovikov.system_base.node_state.NodeState 11 | 12 | import javax.inject.Inject 13 | 14 | /** 15 | * Author: lev.novikov 16 | * Date: 17/12/17. 17 | */ 18 | 19 | @PrebookingScope 20 | class PrebookingRouter @Inject 21 | internal constructor( 22 | private val poiWidgetHolder: PoiWidgetNodeHolder, 23 | private val poiSelectorHolder: PoiSelectorNodeHolder, 24 | private val carTypeSelectorHolder: CarTypeSelectorNodeHolder, 25 | private val bookingExtraHolder: BookingExtraNodeHolder) : Router() { 26 | 27 | override val holders: Set> = setOf(poiWidgetHolder, poiSelectorHolder, carTypeSelectorHolder, bookingExtraHolder) 28 | 29 | fun showPoiWidget() { 30 | attachNode(poiWidgetHolder) 31 | } 32 | 33 | fun startServiceType() { 34 | detachNode(poiSelectorHolder) 35 | detachNode(poiWidgetHolder) 36 | 37 | attachNode(carTypeSelectorHolder) 38 | } 39 | 40 | fun startBookingExtra() { 41 | attachNode(bookingExtraHolder) 42 | } 43 | 44 | fun startPoiChoice() { 45 | attachNode(poiSelectorHolder) 46 | } 47 | 48 | fun hidePoiChoice() { 49 | detachNode(poiSelectorHolder) 50 | } 51 | } 52 | -------------------------------------------------------------------------------- /app/src/main/java/com/levnovikov/postbus/root/home/prebooking/booking_extra_widget/BookingExtraInteractor.kt: -------------------------------------------------------------------------------- 1 | package com.levnovikov.postbus.root.home.prebooking.booking_extra_widget 2 | 3 | import com.levnovikov.feature_promo.domain.Promo 4 | import com.levnovikov.feature_promo.promo_list.dependency.OnPromoSelectedListener 5 | import com.levnovikov.postbus.root.home.prebooking.booking_extra_widget.di.BookingExtraScope 6 | import com.levnovikov.system_base.Interactor 7 | import com.levnovikov.system_base.node_state.ActivityState 8 | import javax.inject.Inject 9 | 10 | /** 11 | * Created by lev.novikov 12 | * Date: 23/12/17. 13 | */ 14 | 15 | @BookingExtraScope 16 | class BookingExtraInteractor @Inject 17 | constructor( 18 | private val listener: Listener, 19 | router: BookingExtraRouter, 20 | activityState: ActivityState) : Interactor(router, activityState), OnPromoSelectedListener { 21 | 22 | override fun onPromoSelected(promo: Promo) { 23 | router.detachPromoList() 24 | router.getState() 25 | } 26 | 27 | override fun onCancel() { 28 | router.detachPromoList() 29 | } 30 | 31 | fun onBookClick() { 32 | listener.onBookClick() 33 | } 34 | 35 | fun showPromo() { 36 | router.showOptions() 37 | } 38 | 39 | interface Listener { 40 | fun onBookClick() 41 | } 42 | } 43 | -------------------------------------------------------------------------------- /app/src/main/java/com/levnovikov/postbus/root/home/prebooking/booking_extra_widget/BookingExtraNodeHolder.kt: -------------------------------------------------------------------------------- 1 | package com.levnovikov.postbus.root.home.prebooking.booking_extra_widget 2 | 3 | import android.view.Gravity 4 | import android.view.LayoutInflater 5 | import android.view.ViewGroup 6 | import android.widget.FrameLayout 7 | 8 | import com.levnovikov.postbus.R 9 | import com.levnovikov.postbus.root.home.prebooking.booking_extra_widget.di.BookingExtraComponent 10 | import com.levnovikov.postbus.root.home.prebooking.booking_extra_widget.di.DaggerBookingExtraComponent 11 | import com.levnovikov.postbus.root.home.prebooking.di.PrebookingComponent 12 | import com.levnovikov.system_base.ViewNodeHolder 13 | 14 | /** 15 | * Created by lev.novikov 16 | * Date: 23/12/17. 17 | */ 18 | 19 | class BookingExtraNodeHolder(inflater: LayoutInflater, parent: ViewGroup, private val parentComponent: PrebookingComponent) : ViewNodeHolder(inflater, parent) { 20 | 21 | override val layout: Int 22 | get() = R.layout.booking_extra_widget 23 | 24 | override fun build(): BookingExtraRouter { 25 | val view = buildView() 26 | val params = view.layoutParams as FrameLayout.LayoutParams 27 | params.gravity = Gravity.BOTTOM 28 | view.layoutParams = params 29 | 30 | val component = DaggerBookingExtraComponent 31 | .builder() 32 | .prebookingComponent(parentComponent) 33 | .bookingExtraModule(BookingExtraComponent.BookingExtraModule(view)) 34 | .build() 35 | component.inject(view) 36 | component.inject(this) 37 | attachView() 38 | return component.router() 39 | } 40 | } 41 | -------------------------------------------------------------------------------- /app/src/main/java/com/levnovikov/postbus/root/home/prebooking/booking_extra_widget/BookingExtraRouter.kt: -------------------------------------------------------------------------------- 1 | package com.levnovikov.postbus.root.home.prebooking.booking_extra_widget 2 | 3 | import com.levnovikov.feature_promo.promo_list.PromoListNodeHolder 4 | import com.levnovikov.postbus.root.home.prebooking.booking_extra_widget.di.BookingExtraScope 5 | import com.levnovikov.postbus.root.home.prebooking.booking_extra_widget.extra.ExtraNodeHolder 6 | import com.levnovikov.postbus.root.home.prebooking.booking_extra_widget.options.OptionsNodeHolder 7 | import com.levnovikov.system_base.NodeHolder 8 | import com.levnovikov.system_base.Router 9 | import com.levnovikov.system_base.node_state.NodeState 10 | 11 | import javax.inject.Inject 12 | 13 | /** 14 | * Created by lev.novikov 15 | * Date: 23/12/17. 16 | */ 17 | 18 | @BookingExtraScope 19 | class BookingExtraRouter @Inject 20 | constructor( 21 | private val promoListBuilder: PromoListNodeHolder, 22 | private val extraNodeHolder: ExtraNodeHolder, 23 | private val optionsNodeHolder: OptionsNodeHolder) : Router() { 24 | 25 | override val holders: Set> = setOf(promoListBuilder, extraNodeHolder, optionsNodeHolder) 26 | 27 | fun detachPromoList() { 28 | detachNode(promoListBuilder) 29 | } 30 | 31 | fun attachPromoList() { 32 | attachNode(promoListBuilder) 33 | } 34 | 35 | fun attachExtra() { 36 | attachNode(extraNodeHolder) 37 | } 38 | 39 | fun detachExtra() { 40 | detachNode(extraNodeHolder) 41 | } 42 | 43 | fun showOptions() { 44 | attachNode(optionsNodeHolder) 45 | } 46 | 47 | fun hideOptions() { 48 | detachNode(optionsNodeHolder) 49 | } 50 | } 51 | -------------------------------------------------------------------------------- /app/src/main/java/com/levnovikov/postbus/root/home/prebooking/booking_extra_widget/BookingExtraVM.kt: -------------------------------------------------------------------------------- 1 | package com.levnovikov.postbus.root.home.prebooking.booking_extra_widget 2 | 3 | import javax.inject.Inject 4 | 5 | /** 6 | * Author: lev.novikov 7 | * Date: 3/3/18. 8 | */ 9 | class BookingExtraVM @Inject constructor( 10 | private val interactor: BookingExtraInteractor 11 | ) { 12 | 13 | init { 14 | if (interactor.hasSavedState()) interactor.restoreState() 15 | } 16 | 17 | fun onPaymentClick() { 18 | 19 | } 20 | 21 | fun onPromoClick() { 22 | interactor.showPromo() 23 | } 24 | 25 | fun onOptionsClick() { 26 | 27 | } 28 | 29 | fun onBookClick() { 30 | interactor.onBookClick() 31 | } 32 | } -------------------------------------------------------------------------------- /app/src/main/java/com/levnovikov/postbus/root/home/prebooking/booking_extra_widget/BookingExtraView.kt: -------------------------------------------------------------------------------- 1 | package com.levnovikov.postbus.root.home.prebooking.booking_extra_widget 2 | 3 | import android.content.Context 4 | import android.databinding.DataBindingUtil 5 | import android.util.AttributeSet 6 | import android.widget.LinearLayout 7 | import com.levnovikov.postbus.databinding.BookingExtraWidgetBinding 8 | import javax.inject.Inject 9 | 10 | /** 11 | * Created by lev.novikov 12 | * Date: 23/12/17. 13 | */ 14 | 15 | class BookingExtraView @JvmOverloads constructor( 16 | context: Context, attrs: AttributeSet? = null, defStyleAttr: Int = 0 17 | ) : LinearLayout(context, attrs, defStyleAttr) { 18 | 19 | @Inject 20 | lateinit var vm: BookingExtraVM 21 | 22 | override fun onAttachedToWindow() { 23 | super.onAttachedToWindow() 24 | setupBinding() 25 | } 26 | 27 | 28 | private fun setupBinding() { 29 | DataBindingUtil.bind(this).vm = vm 30 | } 31 | } 32 | -------------------------------------------------------------------------------- /app/src/main/java/com/levnovikov/postbus/root/home/prebooking/booking_extra_widget/di/BookingExtraScope.kt: -------------------------------------------------------------------------------- 1 | package com.levnovikov.postbus.root.home.prebooking.booking_extra_widget.di 2 | 3 | import javax.inject.Scope 4 | 5 | /** 6 | * Created by lev.novikov 7 | * Date: 23/12/17. 8 | */ 9 | 10 | @Scope 11 | @Retention(AnnotationRetention.RUNTIME) 12 | annotation class BookingExtraScope 13 | -------------------------------------------------------------------------------- /app/src/main/java/com/levnovikov/postbus/root/home/prebooking/booking_extra_widget/extra/ExtraInteractor.kt: -------------------------------------------------------------------------------- 1 | package com.levnovikov.postbus.root.home.prebooking.booking_extra_widget.extra 2 | 3 | import com.levnovikov.postbus.root.home.prebooking.booking_extra_widget.extra.di.ExtraScope 4 | import com.levnovikov.system_base.Interactor 5 | import com.levnovikov.system_base.node_state.ActivityState 6 | import javax.inject.Inject 7 | 8 | /** 9 | * Created by lev.novikov 10 | * Date: 3/2/18. 11 | */ 12 | 13 | @ExtraScope 14 | class ExtraInteractor @Inject constructor( 15 | router: ExtraRouter, 16 | activityState: ActivityState) : Interactor(router, activityState) { 17 | 18 | init { 19 | restoreState() 20 | } 21 | } -------------------------------------------------------------------------------- /app/src/main/java/com/levnovikov/postbus/root/home/prebooking/booking_extra_widget/extra/ExtraNodeHolder.kt: -------------------------------------------------------------------------------- 1 | package com.levnovikov.postbus.root.home.prebooking.booking_extra_widget.extra 2 | 3 | import android.view.LayoutInflater 4 | import android.view.ViewGroup 5 | import com.levnovikov.postbus.R 6 | import com.levnovikov.postbus.root.home.prebooking.booking_extra_widget.di.BookingExtraComponent 7 | import com.levnovikov.postbus.root.home.prebooking.booking_extra_widget.extra.di.DaggerExtraComponent 8 | import com.levnovikov.postbus.root.home.prebooking.booking_extra_widget.extra.di.ExtraComponent 9 | import com.levnovikov.system_base.ViewNodeHolder 10 | 11 | /** 12 | * Created by lev.novikov 13 | * Date: 3/2/18. 14 | */ 15 | class ExtraNodeHolder(layoutInflater: LayoutInflater, parent: ViewGroup, private val dependency: BookingExtraComponent) 16 | : ViewNodeHolder(layoutInflater, parent) { 17 | 18 | override fun build(): ExtraRouter { 19 | val view = buildView() 20 | val component = DaggerExtraComponent.builder() 21 | .bookingExtraComponent(dependency) 22 | .extraModule(ExtraComponent.ExtraModule(view)) 23 | .build() 24 | component.inject(view) 25 | component.inject(this) 26 | attachView() 27 | return component.router() 28 | } 29 | 30 | override val layout: Int = R.layout.extra_view 31 | } -------------------------------------------------------------------------------- /app/src/main/java/com/levnovikov/postbus/root/home/prebooking/booking_extra_widget/extra/ExtraRouter.kt: -------------------------------------------------------------------------------- 1 | package com.levnovikov.postbus.root.home.prebooking.booking_extra_widget.extra 2 | 3 | import com.levnovikov.postbus.root.home.prebooking.booking_extra_widget.extra.di.ExtraScope 4 | import com.levnovikov.system_base.NodeHolder 5 | import com.levnovikov.system_base.Router 6 | import javax.inject.Inject 7 | 8 | /** 9 | * Created by lev.novikov 10 | * Date: 3/2/18. 11 | */ 12 | 13 | @ExtraScope 14 | class ExtraRouter @Inject constructor() : Router() { 15 | override val holders: Set> 16 | get() = emptySet() 17 | } -------------------------------------------------------------------------------- /app/src/main/java/com/levnovikov/postbus/root/home/prebooking/booking_extra_widget/extra/ExtraView.kt: -------------------------------------------------------------------------------- 1 | package com.levnovikov.postbus.root.home.prebooking.booking_extra_widget.extra 2 | 3 | import android.content.Context 4 | import android.util.AttributeSet 5 | import android.widget.FrameLayout 6 | import javax.inject.Inject 7 | 8 | /** 9 | * Created by lev.novikov 10 | * Date: 3/2/18. 11 | */ 12 | class ExtraView : FrameLayout { 13 | constructor(context: Context?) : super(context) 14 | constructor(context: Context?, attrs: AttributeSet?) : super(context, attrs) 15 | constructor(context: Context?, attrs: AttributeSet?, defStyleAttr: Int) : super(context, attrs, defStyleAttr) 16 | 17 | @Inject 18 | lateinit var interactor: ExtraInteractor 19 | 20 | override fun onAttachedToWindow() { 21 | super.onAttachedToWindow() 22 | interactor.restoreState() 23 | } 24 | } -------------------------------------------------------------------------------- /app/src/main/java/com/levnovikov/postbus/root/home/prebooking/booking_extra_widget/extra/di/ExtraComponent.kt: -------------------------------------------------------------------------------- 1 | package com.levnovikov.postbus.root.home.prebooking.booking_extra_widget.extra.di 2 | 3 | import com.levnovikov.postbus.root.home.prebooking.booking_extra_widget.di.BookingExtraComponent 4 | import com.levnovikov.postbus.root.home.prebooking.booking_extra_widget.extra.ExtraNodeHolder 5 | import com.levnovikov.postbus.root.home.prebooking.booking_extra_widget.extra.ExtraRouter 6 | import com.levnovikov.postbus.root.home.prebooking.booking_extra_widget.extra.ExtraView 7 | import com.levnovikov.system_base.base_di.ActivityComponent 8 | import dagger.Component 9 | import dagger.Module 10 | import dagger.Provides 11 | 12 | /** 13 | * Created by lev.novikov 14 | * Date: 3/2/18. 15 | */ 16 | 17 | @ExtraScope 18 | @Component(dependencies = [BookingExtraComponent::class], modules = [ExtraComponent.ExtraModule::class]) 19 | interface ExtraComponent : ActivityComponent { 20 | 21 | @Module 22 | class ExtraModule(private val view: ExtraView) { 23 | @Provides 24 | fun provideView() = view 25 | } 26 | 27 | fun router(): ExtraRouter 28 | fun inject(view: ExtraView) 29 | fun inject(view: ExtraNodeHolder) 30 | } -------------------------------------------------------------------------------- /app/src/main/java/com/levnovikov/postbus/root/home/prebooking/booking_extra_widget/extra/di/ExtraScope.kt: -------------------------------------------------------------------------------- 1 | package com.levnovikov.postbus.root.home.prebooking.booking_extra_widget.extra.di 2 | 3 | import javax.inject.Scope 4 | 5 | /** 6 | * Created by lev.novikov 7 | * Date: 3/2/18. 8 | */ 9 | @Scope 10 | @Retention(AnnotationRetention.RUNTIME) 11 | annotation class ExtraScope -------------------------------------------------------------------------------- /app/src/main/java/com/levnovikov/postbus/root/home/prebooking/booking_extra_widget/options/OptionsInteractor.kt: -------------------------------------------------------------------------------- 1 | package com.levnovikov.postbus.root.home.prebooking.booking_extra_widget.options 2 | 3 | import com.levnovikov.postbus.root.home.prebooking.booking_extra_widget.options.di.OptionsScope 4 | import com.levnovikov.system_base.Interactor 5 | import com.levnovikov.system_base.node_state.ActivityState 6 | import javax.inject.Inject 7 | 8 | /** 9 | * Created by lev.novikov 10 | * Date: 1/3/18. 11 | */ 12 | 13 | @OptionsScope 14 | class OptionsInteractor @Inject constructor(router: OptionsRouter, activityState: ActivityState) : Interactor(router, activityState) { 15 | 16 | fun showSubOptions() { 17 | router.showSubOptions() 18 | } 19 | } -------------------------------------------------------------------------------- /app/src/main/java/com/levnovikov/postbus/root/home/prebooking/booking_extra_widget/options/OptionsNodeHolder.kt: -------------------------------------------------------------------------------- 1 | package com.levnovikov.postbus.root.home.prebooking.booking_extra_widget.options 2 | 3 | import android.view.LayoutInflater 4 | import com.levnovikov.postbus.R 5 | import com.levnovikov.postbus.root.home.HomeView 6 | import com.levnovikov.postbus.root.home.prebooking.booking_extra_widget.options.di.DaggerOptionsComponent 7 | import com.levnovikov.postbus.root.home.prebooking.booking_extra_widget.options.di.OptionsDependencies 8 | import com.levnovikov.system_base.ViewNodeHolder 9 | import javax.inject.Inject 10 | 11 | /** 12 | * Created by lev.novikov 13 | * Date: 1/3/18. 14 | */ 15 | 16 | class OptionsNodeHolder @Inject constructor( 17 | inflater: LayoutInflater, 18 | parent: HomeView, 19 | private val dependencies: OptionsDependencies) : ViewNodeHolder(inflater, parent) { 20 | 21 | override val layout: Int 22 | get() = R.layout.options_view 23 | 24 | override fun build(): OptionsRouter { 25 | val view = buildView() 26 | val component = DaggerOptionsComponent.builder() 27 | .dependencies(dependencies) 28 | .view(view) 29 | .build() 30 | component.inject(this) 31 | component.inject(view) 32 | attachView() 33 | return component.router() 34 | } 35 | 36 | } -------------------------------------------------------------------------------- /app/src/main/java/com/levnovikov/postbus/root/home/prebooking/booking_extra_widget/options/OptionsRouter.kt: -------------------------------------------------------------------------------- 1 | package com.levnovikov.postbus.root.home.prebooking.booking_extra_widget.options 2 | 3 | import com.levnovikov.postbus.root.home.prebooking.booking_extra_widget.options.di.OptionsScope 4 | import com.levnovikov.postbus.root.home.prebooking.booking_extra_widget.options.sub_options.SubOptionsNodeHolder 5 | import com.levnovikov.system_base.NodeHolder 6 | import com.levnovikov.system_base.Router 7 | import javax.inject.Inject 8 | 9 | /** 10 | * Created by lev.novikov 11 | * Date: 1/3/18. 12 | */ 13 | 14 | @OptionsScope 15 | class OptionsRouter @Inject constructor(private val subOptionsNodeHolder: SubOptionsNodeHolder) : Router() { 16 | override val holders: Set> = setOf(subOptionsNodeHolder) 17 | 18 | fun showSubOptions() { 19 | attachNode(subOptionsNodeHolder) 20 | } 21 | } -------------------------------------------------------------------------------- /app/src/main/java/com/levnovikov/postbus/root/home/prebooking/booking_extra_widget/options/OptionsVM.kt: -------------------------------------------------------------------------------- 1 | package com.levnovikov.postbus.root.home.prebooking.booking_extra_widget.options 2 | 3 | import javax.inject.Inject 4 | 5 | /** 6 | * Author: lev.novikov 7 | * Date: 4/3/18. 8 | */ 9 | class OptionsVM @Inject constructor( 10 | interactor: OptionsInteractor 11 | ) { 12 | 13 | init { 14 | if (interactor.hasSavedState()) { 15 | interactor.restoreState() 16 | } else { 17 | interactor.showSubOptions() 18 | } 19 | } 20 | 21 | 22 | } -------------------------------------------------------------------------------- /app/src/main/java/com/levnovikov/postbus/root/home/prebooking/booking_extra_widget/options/OptionsView.kt: -------------------------------------------------------------------------------- 1 | package com.levnovikov.postbus.root.home.prebooking.booking_extra_widget.options 2 | 3 | import android.content.Context 4 | import android.databinding.DataBindingUtil 5 | import android.util.AttributeSet 6 | import android.widget.FrameLayout 7 | import com.levnovikov.postbus.databinding.OptionsViewBinding 8 | import dagger.Lazy 9 | import javax.inject.Inject 10 | 11 | /** 12 | * Created by lev.novikov 13 | * Date: 1/3/18. 14 | */ 15 | class OptionsView @JvmOverloads constructor( 16 | context: Context, attrs: AttributeSet? = null, defStyleAttr: Int = 0 17 | ) : FrameLayout(context, attrs, defStyleAttr) { 18 | 19 | @Inject 20 | lateinit var vm: Lazy 21 | 22 | override fun onAttachedToWindow() { 23 | super.onAttachedToWindow() 24 | setupBinding() 25 | } 26 | 27 | private fun setupBinding() { 28 | DataBindingUtil.bind(this).vm = vm.get() 29 | } 30 | } -------------------------------------------------------------------------------- /app/src/main/java/com/levnovikov/postbus/root/home/prebooking/booking_extra_widget/options/di/OptionsComponent.kt: -------------------------------------------------------------------------------- 1 | package com.levnovikov.postbus.root.home.prebooking.booking_extra_widget.options.di 2 | 3 | import android.view.LayoutInflater 4 | import com.levnovikov.postbus.root.home.prebooking.booking_extra_widget.options.OptionsNodeHolder 5 | import com.levnovikov.postbus.root.home.prebooking.booking_extra_widget.options.OptionsRouter 6 | import com.levnovikov.postbus.root.home.prebooking.booking_extra_widget.options.OptionsView 7 | import com.levnovikov.postbus.root.home.prebooking.booking_extra_widget.options.sub_options.SubOptionsNodeHolder 8 | import com.levnovikov.postbus.root.home.prebooking.booking_extra_widget.options.sub_options.di.SubOptionsDependencies 9 | import com.levnovikov.system_base.base_di.ActivityComponent 10 | import dagger.BindsInstance 11 | import dagger.Component 12 | import dagger.Module 13 | import dagger.Provides 14 | import javax.inject.Scope 15 | 16 | /** 17 | * Created by lev.novikov 18 | * Date: 1/3/18. 19 | */ 20 | 21 | @Scope 22 | @Retention(AnnotationRetention.RUNTIME) 23 | annotation class OptionsScope 24 | 25 | interface OptionsDependencies : ActivityComponent { 26 | fun inflater(): LayoutInflater 27 | } 28 | 29 | @OptionsScope 30 | @Component(dependencies = [OptionsDependencies::class], modules = [OptionsComponent.OptionsModule::class]) 31 | interface OptionsComponent : SubOptionsDependencies, ActivityComponent { 32 | 33 | @Module 34 | class OptionsModule { 35 | @Provides 36 | fun subOptionsNodeHolder(view: OptionsView, layoutInflater: LayoutInflater, component: OptionsComponent): SubOptionsNodeHolder = 37 | SubOptionsNodeHolder(view, layoutInflater, component) 38 | } 39 | 40 | @Component.Builder 41 | interface Builder { 42 | fun build(): OptionsComponent 43 | fun dependencies(dependencies: OptionsDependencies): Builder 44 | @BindsInstance 45 | fun view(view: OptionsView): Builder 46 | } 47 | 48 | fun inject(view: OptionsView) 49 | fun inject(view: OptionsNodeHolder) 50 | fun router(): OptionsRouter 51 | fun dependencies(): OptionsDependencies 52 | } -------------------------------------------------------------------------------- /app/src/main/java/com/levnovikov/postbus/root/home/prebooking/booking_extra_widget/options/sub_options/SubOptionsNodeHolder.kt: -------------------------------------------------------------------------------- 1 | package com.levnovikov.postbus.root.home.prebooking.booking_extra_widget.options.sub_options 2 | 3 | import android.view.LayoutInflater 4 | import android.view.ViewGroup 5 | import com.levnovikov.postbus.R 6 | import com.levnovikov.postbus.root.home.prebooking.booking_extra_widget.options.sub_options.di.DaggerSubOptionsComponent 7 | import com.levnovikov.postbus.root.home.prebooking.booking_extra_widget.options.sub_options.di.SubOptionsDependencies 8 | import com.levnovikov.system_base.ViewNodeHolder 9 | 10 | 11 | /** 12 | * Created by stepan.goncharov on 1/3/18. 13 | */ 14 | class SubOptionsNodeHolder constructor(parent: ViewGroup, inflater: LayoutInflater, val dependencies: SubOptionsDependencies) : 15 | ViewNodeHolder(inflater, parent) { 17 | 18 | override val layout: Int = R.layout.sub_options_view 19 | 20 | override fun build(): SubOptionsRouter { 21 | val view = buildView() 22 | val component = DaggerSubOptionsComponent.builder() 23 | .dependencies(dependencies) 24 | .view(view) 25 | .build() 26 | component.inject(this) 27 | component.inject(view) 28 | attachView() 29 | return component.router() 30 | } 31 | 32 | } -------------------------------------------------------------------------------- /app/src/main/java/com/levnovikov/postbus/root/home/prebooking/booking_extra_widget/options/sub_options/SubOptionsRouter.kt: -------------------------------------------------------------------------------- 1 | package com.levnovikov.postbus.root.home.prebooking.booking_extra_widget.options.sub_options 2 | 3 | import com.levnovikov.system_base.NodeHolder 4 | import com.levnovikov.system_base.Router 5 | import com.levnovikov.system_base.node_state.NodeState 6 | import javax.inject.Inject 7 | 8 | /** 9 | * Created by stepan.goncharov on 1/3/18. 10 | */ 11 | class SubOptionsRouter @Inject constructor(): Router() { 12 | override val holders: Set> = emptySet() 13 | 14 | } -------------------------------------------------------------------------------- /app/src/main/java/com/levnovikov/postbus/root/home/prebooking/booking_extra_widget/options/sub_options/SubOptionsView.kt: -------------------------------------------------------------------------------- 1 | package com.levnovikov.postbus.root.home.prebooking.booking_extra_widget.options.sub_options 2 | 3 | import android.content.Context 4 | import android.util.AttributeSet 5 | import android.widget.FrameLayout 6 | 7 | /** 8 | * Created by stepan.goncharov on 1/3/18. 9 | */ 10 | class SubOptionsView @JvmOverloads constructor( 11 | context: Context, attrs: AttributeSet? = null, defStyleAttr: Int = 0 12 | ) : FrameLayout(context, attrs, defStyleAttr){ 13 | 14 | } -------------------------------------------------------------------------------- /app/src/main/java/com/levnovikov/postbus/root/home/prebooking/booking_extra_widget/options/sub_options/di/SubOptionsComponent.kt: -------------------------------------------------------------------------------- 1 | package com.levnovikov.postbus.root.home.prebooking.booking_extra_widget.options.sub_options.di 2 | 3 | import android.view.LayoutInflater 4 | import com.levnovikov.postbus.root.home.prebooking.booking_extra_widget.options.sub_options.SubOptionsNodeHolder 5 | import com.levnovikov.postbus.root.home.prebooking.booking_extra_widget.options.sub_options.SubOptionsRouter 6 | import com.levnovikov.postbus.root.home.prebooking.booking_extra_widget.options.sub_options.SubOptionsView 7 | import dagger.BindsInstance 8 | import dagger.Component 9 | import dagger.Module 10 | import javax.inject.Scope 11 | 12 | /** 13 | * Created by stepan.goncharov on 1/3/18. 14 | */ 15 | 16 | @Scope 17 | @Retention(AnnotationRetention.RUNTIME) 18 | annotation class SubOptionsScope 19 | 20 | interface SubOptionsDependencies { 21 | 22 | } 23 | 24 | @SubOptionsScope 25 | @Component(dependencies = [SubOptionsDependencies::class], modules = [SubOptionsComponent.OptionsModule::class]) 26 | interface SubOptionsComponent { 27 | 28 | @Module 29 | class OptionsModule { 30 | 31 | } 32 | 33 | @Component.Builder 34 | interface Builder { 35 | fun build(): SubOptionsComponent 36 | fun dependencies(dependencies: SubOptionsDependencies): Builder 37 | @BindsInstance 38 | fun view(view: SubOptionsView): Builder 39 | } 40 | 41 | fun inject(view: SubOptionsView) 42 | fun inject(view: SubOptionsNodeHolder) 43 | fun router(): SubOptionsRouter 44 | } -------------------------------------------------------------------------------- /app/src/main/java/com/levnovikov/postbus/root/home/prebooking/car_type_selector/CarTypeSelectorInteractor.kt: -------------------------------------------------------------------------------- 1 | package com.levnovikov.postbus.root.home.prebooking.car_type_selector 2 | 3 | import com.levnovikov.postbus.root.home.prebooking.car_type_selector.car_type_list.TypeListListener 4 | import com.levnovikov.postbus.root.home.prebooking.car_type_selector.di.CarTypeSelectorScope 5 | import com.levnovikov.system_base.Interactor 6 | import com.levnovikov.system_base.node_state.ActivityState 7 | import javax.inject.Inject 8 | 9 | 10 | /** 11 | * Created by lev.novikov 12 | * Date: 23/12/17. 13 | */ 14 | 15 | @CarTypeSelectorScope 16 | class CarTypeSelectorInteractor @Inject constructor( 17 | private val listener: Listener, 18 | router: CarTypeSelectorRouter, 19 | activityState: ActivityState) : Interactor(router, activityState), TypeListListener { 20 | 21 | override fun onCancel() { 22 | router.detachTypeList() 23 | } 24 | 25 | interface Listener { 26 | fun onServiceSelected() 27 | } 28 | 29 | fun onServiceSelected() { 30 | router.attachTypeList() 31 | listener.onServiceSelected() 32 | } 33 | } 34 | -------------------------------------------------------------------------------- /app/src/main/java/com/levnovikov/postbus/root/home/prebooking/car_type_selector/CarTypeSelectorNodeHolder.kt: -------------------------------------------------------------------------------- 1 | package com.levnovikov.postbus.root.home.prebooking.car_type_selector 2 | 3 | import android.content.Context 4 | import android.view.LayoutInflater 5 | import android.view.ViewGroup 6 | import com.levnovikov.postbus.BR 7 | import com.levnovikov.postbus.R 8 | import com.levnovikov.postbus.databinding.CarTypeSelectorBinding 9 | import com.levnovikov.postbus.root.home.prebooking.car_type_selector.di.DaggerCarTypeSelectorComponent 10 | import com.levnovikov.postbus.root.home.prebooking.di.PrebookingComponent 11 | import com.levnovikov.system_base.BindingNodeHolder 12 | import javax.inject.Inject 13 | 14 | /** 15 | * Created by lev.novikov 16 | * Date: 23/12/17. 17 | */ 18 | 19 | class CarTypeSelectorNodeHolder( 20 | inflater: LayoutInflater, 21 | parent: ViewGroup, 22 | private val parentComponent: PrebookingComponent 23 | ) : BindingNodeHolder(inflater, parent) { 24 | 25 | @Inject 26 | lateinit var vm: CarTypeSelectorVM 27 | 28 | override val layout: Int 29 | get() = R.layout.car_type_selector 30 | 31 | override fun build(): CarTypeSelectorRouter { 32 | // val view = buildView() 33 | // val params = view.layoutParams as FrameLayout.LayoutParams 34 | // params.gravity = Gravity.BOTTOM 35 | // params.setMargins(0, 0, 0, getDp(view.context, 180)) 36 | // view.layoutParams = params 37 | 38 | val component = DaggerCarTypeSelectorComponent.builder() 39 | .prebookingComponent(parentComponent) 40 | .build() 41 | component.inject(this) 42 | buildAndAttachView(vm, BR.vm) 43 | return component.router() 44 | } 45 | 46 | //TODO move to utils 47 | private fun getDp(context: Context, dps: Int): Int { 48 | val scale = context.resources.displayMetrics.density 49 | return (dps * scale + 0.5f).toInt() 50 | } 51 | } 52 | -------------------------------------------------------------------------------- /app/src/main/java/com/levnovikov/postbus/root/home/prebooking/car_type_selector/CarTypeSelectorRouter.kt: -------------------------------------------------------------------------------- 1 | package com.levnovikov.postbus.root.home.prebooking.car_type_selector 2 | 3 | import com.levnovikov.postbus.root.home.prebooking.car_type_selector.car_type_list.CarTypeListNodeHolder 4 | import com.levnovikov.postbus.root.home.prebooking.car_type_selector.di.CarTypeSelectorScope 5 | import com.levnovikov.system_base.NodeHolder 6 | import com.levnovikov.system_base.Router 7 | import com.levnovikov.system_base.node_state.NodeState 8 | 9 | import javax.inject.Inject 10 | 11 | /** 12 | * Created by lev.novikov 13 | * Date: 23/12/17. 14 | */ 15 | 16 | @CarTypeSelectorScope 17 | class CarTypeSelectorRouter @Inject 18 | internal constructor(private val carTypeListBuilder: CarTypeListNodeHolder) : Router() { 19 | override val holders: Set> = setOf(carTypeListBuilder) 20 | 21 | internal fun attachTypeList() { 22 | attachNode(carTypeListBuilder) 23 | } 24 | 25 | internal fun detachTypeList() { 26 | detachNode(carTypeListBuilder) 27 | } 28 | 29 | } 30 | -------------------------------------------------------------------------------- /app/src/main/java/com/levnovikov/postbus/root/home/prebooking/car_type_selector/CarTypeSelectorVM.kt: -------------------------------------------------------------------------------- 1 | package com.levnovikov.postbus.root.home.prebooking.car_type_selector 2 | 3 | import com.levnovikov.postbus.root.home.prebooking.car_type_selector.di.CarTypeSelectorScope 4 | import javax.inject.Inject 5 | 6 | /** 7 | * Author: lev.novikov 8 | * Date: 2/3/18. 9 | */ 10 | 11 | @CarTypeSelectorScope 12 | class CarTypeSelectorVM @Inject constructor( 13 | private val interactor: CarTypeSelectorInteractor 14 | ) { 15 | 16 | init { 17 | if (interactor.hasSavedState()) interactor.restoreState() 18 | } 19 | 20 | fun onClick() { 21 | interactor.onServiceSelected() 22 | } 23 | } -------------------------------------------------------------------------------- /app/src/main/java/com/levnovikov/postbus/root/home/prebooking/car_type_selector/car_type_list/CarTypeListInteractor.kt: -------------------------------------------------------------------------------- 1 | package com.levnovikov.postbus.root.home.prebooking.car_type_selector.car_type_list 2 | 3 | import android.os.Parcelable 4 | 5 | import com.levnovikov.postbus.root.home.prebooking.car_type_selector.car_type_list.di.CarTypeListScope 6 | import com.levnovikov.system_base.BackStateInteractor 7 | import com.levnovikov.system_base.node_state.ActivityState 8 | 9 | import javax.inject.Inject 10 | 11 | /** 12 | * Created by lev.novikov 13 | * Date: 25/12/17. 14 | */ 15 | 16 | @CarTypeListScope 17 | class CarTypeListInteractor @Inject 18 | constructor(router: CarTypeListRouter, activityState: ActivityState, private val listener: TypeListListener) : BackStateInteractor(router, activityState) { 19 | 20 | override fun onSaveData(): Parcelable? = null 21 | 22 | override fun onBackPressed(): Boolean { 23 | listener.onCancel() 24 | return true 25 | } 26 | } 27 | 28 | interface TypeListListener { 29 | fun onCancel() 30 | } 31 | -------------------------------------------------------------------------------- /app/src/main/java/com/levnovikov/postbus/root/home/prebooking/car_type_selector/car_type_list/CarTypeListNodeHolder.kt: -------------------------------------------------------------------------------- 1 | package com.levnovikov.postbus.root.home.prebooking.car_type_selector.car_type_list 2 | 3 | import android.content.Context 4 | import android.view.LayoutInflater 5 | import android.view.ViewGroup 6 | import android.widget.FrameLayout 7 | 8 | import com.levnovikov.postbus.R 9 | import com.levnovikov.postbus.root.home.prebooking.car_type_selector.car_type_list.di.CarTypeListComponent 10 | import com.levnovikov.postbus.root.home.prebooking.car_type_selector.car_type_list.di.DaggerCarTypeListComponent 11 | import com.levnovikov.postbus.root.home.prebooking.car_type_selector.di.CarTypeSelectorComponent 12 | import com.levnovikov.system_base.ViewNodeHolder 13 | 14 | /** 15 | * Created by lev.novikov 16 | * Date: 25/12/17. 17 | */ 18 | 19 | class CarTypeListNodeHolder(inflater: LayoutInflater, parent: ViewGroup, private val parentComponent: CarTypeSelectorComponent) : ViewNodeHolder(inflater, parent) { 20 | 21 | override val layout: Int 22 | get() = R.layout.car_type_list_view 23 | 24 | override fun build(): CarTypeListRouter { 25 | val view = buildView() 26 | val params = view.layoutParams as FrameLayout.LayoutParams 27 | params.bottomMargin = getDp(view.context, 280) 28 | view.layoutParams = params 29 | 30 | val component = DaggerCarTypeListComponent.builder() 31 | .carTypeSelectorComponent(parentComponent) 32 | .carTypeListModule(CarTypeListComponent.CarTypeListModule(view)) 33 | .build() 34 | component.inject(view) 35 | component.inject(this) 36 | attachView() 37 | return component.router() 38 | } 39 | 40 | //TODO move to utils 41 | private fun getDp(context: Context, dps: Int): Int { 42 | val scale = context.resources.displayMetrics.density 43 | return (dps * scale + 0.5f).toInt() 44 | } 45 | } 46 | -------------------------------------------------------------------------------- /app/src/main/java/com/levnovikov/postbus/root/home/prebooking/car_type_selector/car_type_list/CarTypeListRouter.kt: -------------------------------------------------------------------------------- 1 | package com.levnovikov.postbus.root.home.prebooking.car_type_selector.car_type_list 2 | 3 | import com.levnovikov.postbus.root.home.prebooking.car_type_selector.car_type_list.di.CarTypeListScope 4 | import com.levnovikov.system_base.NodeHolder 5 | import com.levnovikov.system_base.Router 6 | import com.levnovikov.system_base.node_state.NodeState 7 | 8 | import javax.inject.Inject 9 | 10 | /** 11 | * Created by lev.novikov 12 | * Date: 25/12/17. 13 | */ 14 | 15 | @CarTypeListScope 16 | class CarTypeListRouter @Inject 17 | internal constructor() : Router() { 18 | 19 | override val holders: Set> = setOf() 20 | 21 | } 22 | -------------------------------------------------------------------------------- /app/src/main/java/com/levnovikov/postbus/root/home/prebooking/car_type_selector/car_type_list/CarTypeListView.kt: -------------------------------------------------------------------------------- 1 | package com.levnovikov.postbus.root.home.prebooking.car_type_selector.car_type_list 2 | 3 | import android.content.Context 4 | import android.support.constraint.ConstraintLayout 5 | import android.util.AttributeSet 6 | import javax.inject.Inject 7 | 8 | /** 9 | * Created by lev.novikov 10 | * Date: 25/12/17. 11 | */ 12 | 13 | class CarTypeListView @JvmOverloads constructor( 14 | context: Context, attrs: AttributeSet? = null, defStyleAttr: Int = 0 15 | ) : ConstraintLayout(context, attrs, defStyleAttr) { 16 | 17 | @Inject 18 | lateinit var interactor: CarTypeListInteractor 19 | 20 | } 21 | -------------------------------------------------------------------------------- /app/src/main/java/com/levnovikov/postbus/root/home/prebooking/car_type_selector/car_type_list/di/CarTypeListComponent.kt: -------------------------------------------------------------------------------- 1 | package com.levnovikov.postbus.root.home.prebooking.car_type_selector.car_type_list.di 2 | 3 | import com.levnovikov.postbus.root.home.prebooking.car_type_selector.car_type_list.CarTypeListNodeHolder 4 | import com.levnovikov.postbus.root.home.prebooking.car_type_selector.car_type_list.CarTypeListRouter 5 | import com.levnovikov.postbus.root.home.prebooking.car_type_selector.car_type_list.CarTypeListView 6 | import com.levnovikov.postbus.root.home.prebooking.car_type_selector.di.CarTypeSelectorComponent 7 | import com.levnovikov.system_base.base_di.ActivityComponent 8 | 9 | import dagger.Component 10 | import dagger.Module 11 | import dagger.Provides 12 | 13 | /** 14 | * Created by lev.novikov 15 | * Date: 25/12/17. 16 | */ 17 | 18 | @CarTypeListScope 19 | @Component(dependencies = [(CarTypeSelectorComponent::class)], modules = [(CarTypeListComponent.CarTypeListModule::class)]) 20 | interface CarTypeListComponent : ActivityComponent { 21 | 22 | fun inject(view: CarTypeListView) 23 | 24 | fun inject(carTypeListBuilder: CarTypeListNodeHolder) 25 | 26 | fun router(): CarTypeListRouter 27 | 28 | @Module 29 | class CarTypeListModule(private val view: CarTypeListView) { 30 | 31 | @CarTypeListScope 32 | @Provides 33 | internal fun provideView(): CarTypeListView { 34 | return view 35 | } 36 | } 37 | } 38 | -------------------------------------------------------------------------------- /app/src/main/java/com/levnovikov/postbus/root/home/prebooking/car_type_selector/car_type_list/di/CarTypeListScope.kt: -------------------------------------------------------------------------------- 1 | package com.levnovikov.postbus.root.home.prebooking.car_type_selector.car_type_list.di 2 | 3 | import javax.inject.Scope 4 | 5 | /** 6 | * Created by lev.novikov 7 | * Date: 25/12/17. 8 | */ 9 | 10 | @Scope 11 | @Retention(AnnotationRetention.RUNTIME) 12 | annotation class CarTypeListScope 13 | -------------------------------------------------------------------------------- /app/src/main/java/com/levnovikov/postbus/root/home/prebooking/car_type_selector/di/CarTypeSelectorComponent.kt: -------------------------------------------------------------------------------- 1 | package com.levnovikov.postbus.root.home.prebooking.car_type_selector.di 2 | 3 | import android.view.LayoutInflater 4 | import com.levnovikov.postbus.root.home.HomeView 5 | import com.levnovikov.postbus.root.home.prebooking.car_type_selector.CarTypeSelectorInteractor 6 | import com.levnovikov.postbus.root.home.prebooking.car_type_selector.CarTypeSelectorNodeHolder 7 | import com.levnovikov.postbus.root.home.prebooking.car_type_selector.CarTypeSelectorRouter 8 | import com.levnovikov.postbus.root.home.prebooking.car_type_selector.car_type_list.CarTypeListNodeHolder 9 | import com.levnovikov.postbus.root.home.prebooking.car_type_selector.car_type_list.TypeListListener 10 | import com.levnovikov.postbus.root.home.prebooking.di.PrebookingComponent 11 | import com.levnovikov.system_base.base_di.ActivityComponent 12 | import dagger.Component 13 | import dagger.Module 14 | import dagger.Provides 15 | 16 | /** 17 | * Created by lev.novikov 18 | * Date: 23/12/17. 19 | */ 20 | 21 | @CarTypeSelectorScope 22 | @Component(dependencies = [(PrebookingComponent::class)], modules = [(CarTypeSelectorComponent.CarTypeModule::class)]) 23 | interface CarTypeSelectorComponent : ActivityComponent { 24 | 25 | fun router(): CarTypeSelectorRouter 26 | 27 | fun typeListListener(): TypeListListener 28 | 29 | fun inject(carTypeSelectorBuilder: CarTypeSelectorNodeHolder) 30 | 31 | @Module 32 | class CarTypeModule { 33 | 34 | @CarTypeSelectorScope 35 | @Provides 36 | internal fun provideTypeListListener(interactor: CarTypeSelectorInteractor): TypeListListener { 37 | return interactor 38 | } 39 | 40 | @CarTypeSelectorScope 41 | @Provides 42 | internal fun provideListBuilder( 43 | inflater: LayoutInflater, 44 | homeScreen: HomeView, 45 | parentComponent: CarTypeSelectorComponent): CarTypeListNodeHolder { 46 | return CarTypeListNodeHolder(inflater, homeScreen, parentComponent) 47 | } 48 | } 49 | } 50 | -------------------------------------------------------------------------------- /app/src/main/java/com/levnovikov/postbus/root/home/prebooking/car_type_selector/di/CarTypeSelectorScope.kt: -------------------------------------------------------------------------------- 1 | package com.levnovikov.postbus.root.home.prebooking.car_type_selector.di 2 | 3 | import javax.inject.Scope 4 | 5 | /** 6 | * Created by lev.novikov 7 | * Date: 23/12/17. 8 | */ 9 | 10 | @Scope 11 | @kotlin.annotation.Retention(AnnotationRetention.RUNTIME) 12 | annotation class CarTypeSelectorScope 13 | -------------------------------------------------------------------------------- /app/src/main/java/com/levnovikov/postbus/root/home/prebooking/di/PrebookingScope.kt: -------------------------------------------------------------------------------- 1 | package com.levnovikov.postbus.root.home.prebooking.di 2 | 3 | import javax.inject.Scope 4 | 5 | 6 | /** 7 | * Author: lev.novikov 8 | * Date: 17/12/17. 9 | */ 10 | 11 | @Scope 12 | @Retention(AnnotationRetention.RUNTIME) 13 | annotation class PrebookingScope 14 | -------------------------------------------------------------------------------- /app/src/main/java/com/levnovikov/postbus/root/home/prebooking/poi_selector/PoiSelectorInteractor.kt: -------------------------------------------------------------------------------- 1 | package com.levnovikov.postbus.root.home.prebooking.poi_selector 2 | 3 | import android.os.Parcelable 4 | import com.example.core_geo.Point 5 | import com.example.core_location.PoiSuggestionProvider 6 | import com.levnovikov.postbus.root.home.prebooking.poi_selector.di.PoiSelectorScope 7 | import com.levnovikov.system_base.BackStateInteractor 8 | import com.levnovikov.system_base.lifecycle.Lifecycle 9 | import com.levnovikov.system_base.node_state.ActivityState 10 | import io.reactivex.Observable 11 | import javax.inject.Inject 12 | 13 | /** 14 | * Created by lev.novikov 15 | * Date: 20/12/17. 16 | */ 17 | 18 | @PoiSelectorScope 19 | class PoiSelectorInteractor @Inject 20 | constructor( 21 | private val poiProvider: PoiSuggestionProvider, 22 | private val presenter: Presenter, 23 | router: PoiSelectorRouter, 24 | activityState: ActivityState, 25 | private val listener: PoiSelectionListener, 26 | private val lifecycle: Lifecycle) : BackStateInteractor(router, activityState) { 27 | override fun onSaveData(): Parcelable? = null 28 | 29 | interface PoiSelectionListener { 30 | fun onPoiSelected(point: Point) 31 | fun onPoiSelectionCanceled() 32 | } 33 | 34 | override fun restoreState() { 35 | super.restoreState() 36 | lifecycle.subscribeUntilDestroy(presenter.placeTitleStream() 37 | .subscribe({ title -> poiProvider.updatePlace(title) } 38 | ) { /*handle error*/ error -> }) 39 | 40 | lifecycle.subscribeUntilDestroy(poiProvider.poiStream 41 | .subscribe({ poiList -> presenter.updateSuggestions(poiList) } 42 | ) { /*handle error*/ error -> }) 43 | 44 | lifecycle.subscribeUntilDestroy(presenter.selectedPoi() 45 | .subscribe({ point -> listener.onPoiSelected(point) }) { error -> }) 46 | } 47 | 48 | override fun onBackPressed(): Boolean { 49 | listener.onPoiSelectionCanceled() 50 | return true 51 | } 52 | 53 | interface Presenter { 54 | fun selectedPoi(): Observable 55 | fun placeTitleStream(): Observable 56 | fun updateSuggestions(poiList: List) 57 | } 58 | } 59 | -------------------------------------------------------------------------------- /app/src/main/java/com/levnovikov/postbus/root/home/prebooking/poi_selector/PoiSelectorNodeHolder.kt: -------------------------------------------------------------------------------- 1 | package com.levnovikov.postbus.root.home.prebooking.poi_selector 2 | 3 | import android.view.LayoutInflater 4 | import android.view.ViewGroup 5 | 6 | import com.levnovikov.postbus.R 7 | import com.levnovikov.postbus.root.home.prebooking.di.PrebookingComponent 8 | import com.levnovikov.postbus.root.home.prebooking.poi_selector.di.DaggerPoiSelectorComponent 9 | import com.levnovikov.postbus.root.home.prebooking.poi_selector.di.PoiSelectorComponent 10 | import com.levnovikov.system_base.ViewNodeHolder 11 | 12 | /** 13 | * Created by lev.novikov 14 | * Date: 20/12/17. 15 | */ 16 | 17 | class PoiSelectorNodeHolder(inflater: LayoutInflater, parent: ViewGroup, private val parentComponent: PrebookingComponent) : ViewNodeHolder(inflater, parent) { 18 | 19 | override val layout: Int 20 | get() = R.layout.poi_selector 21 | 22 | override fun build(): PoiSelectorRouter { 23 | val view = buildView() 24 | val component = DaggerPoiSelectorComponent.builder() 25 | .prebookingComponent(parentComponent) 26 | .poiSelectorModule(PoiSelectorComponent.PoiSelectorModule(view)) 27 | .build() 28 | component.inject(view) 29 | component.inject(this) 30 | attachView() 31 | return component.router() 32 | } 33 | } 34 | -------------------------------------------------------------------------------- /app/src/main/java/com/levnovikov/postbus/root/home/prebooking/poi_selector/PoiSelectorRouter.kt: -------------------------------------------------------------------------------- 1 | package com.levnovikov.postbus.root.home.prebooking.poi_selector 2 | 3 | import com.levnovikov.postbus.root.home.prebooking.poi_selector.di.PoiSelectorScope 4 | import com.levnovikov.system_base.NodeHolder 5 | import com.levnovikov.system_base.Router 6 | import com.levnovikov.system_base.node_state.NodeState 7 | 8 | import javax.inject.Inject 9 | 10 | /** 11 | * Created by lev.novikov 12 | * Date: 20/12/17. 13 | */ 14 | 15 | @PoiSelectorScope 16 | class PoiSelectorRouter @Inject 17 | constructor() : Router() { 18 | 19 | override val holders: Set> = setOf() 20 | 21 | } 22 | -------------------------------------------------------------------------------- /app/src/main/java/com/levnovikov/postbus/root/home/prebooking/poi_selector/di/PoiSelectorScope.kt: -------------------------------------------------------------------------------- 1 | package com.levnovikov.postbus.root.home.prebooking.poi_selector.di 2 | 3 | import javax.inject.Scope 4 | 5 | /** 6 | * Created by lev.novikov 7 | * Date: 20/12/17. 8 | */ 9 | 10 | @Scope 11 | @Retention(AnnotationRetention.RUNTIME) 12 | annotation class PoiSelectorScope 13 | -------------------------------------------------------------------------------- /app/src/main/java/com/levnovikov/postbus/root/home/prebooking/poi_widget/PoiWidgetInteractor.kt: -------------------------------------------------------------------------------- 1 | package com.levnovikov.postbus.root.home.prebooking.poi_widget 2 | 3 | import com.example.core_geo.Point 4 | import com.levnovikov.feature_ride.ride.RidePrebookingRepo 5 | import com.levnovikov.postbus.root.home.prebooking.poi_widget.di.PoiWidgetScope 6 | import com.levnovikov.system_base.Interactor 7 | import com.levnovikov.system_base.node_state.ActivityState 8 | import io.reactivex.Observable 9 | import javax.inject.Inject 10 | 11 | /** 12 | * Author: lev.novikov 13 | * Date: 19/12/17. 14 | */ 15 | 16 | @PoiWidgetScope 17 | class PoiWidgetInteractor @Inject 18 | constructor( 19 | private val poiSelectionListener: PoiClickListener, 20 | router: PoiWidgetRouter, 21 | activityState: ActivityState, 22 | private val prebookingRepo: RidePrebookingRepo) : Interactor(router, activityState) { 23 | 24 | interface PoiClickListener { 25 | fun onPickUpSelected() 26 | fun onDropOffSelected() 27 | } 28 | 29 | fun getPickupPointStream(): Observable { 30 | return prebookingRepo.pickupPoint.stream() 31 | } 32 | 33 | fun getDropOffPointStream(): Observable { 34 | return prebookingRepo.dropOffPoint.stream() 35 | } 36 | 37 | fun selectPickUp() { 38 | poiSelectionListener.onPickUpSelected() 39 | } 40 | 41 | fun selectDropOff() { 42 | poiSelectionListener.onDropOffSelected() 43 | } 44 | } 45 | -------------------------------------------------------------------------------- /app/src/main/java/com/levnovikov/postbus/root/home/prebooking/poi_widget/PoiWidgetNodeHolder.kt: -------------------------------------------------------------------------------- 1 | package com.levnovikov.postbus.root.home.prebooking.poi_widget 2 | 3 | import android.view.Gravity 4 | import android.view.LayoutInflater 5 | import android.view.ViewGroup 6 | import android.widget.FrameLayout 7 | 8 | import com.levnovikov.postbus.R 9 | import com.levnovikov.postbus.root.home.prebooking.di.PrebookingComponent 10 | import com.levnovikov.postbus.root.home.prebooking.poi_widget.di.DaggerPoiWidgetComponent 11 | import com.levnovikov.postbus.root.home.prebooking.poi_widget.di.PoiWidgetComponent 12 | import com.levnovikov.system_base.ViewNodeHolder 13 | 14 | /** 15 | * Author: lev.novikov 16 | * Date: 19/12/17. 17 | */ 18 | 19 | class PoiWidgetNodeHolder(inflater: LayoutInflater, parent: ViewGroup, private val parentComponent: PrebookingComponent) : ViewNodeHolder(inflater, parent) { 20 | 21 | override val layout: Int 22 | get() = R.layout.poi_widget 23 | 24 | override fun build(): PoiWidgetRouter { 25 | val view = buildView() 26 | val params = view.layoutParams as FrameLayout.LayoutParams 27 | params.gravity = Gravity.BOTTOM 28 | view.layoutParams = params 29 | 30 | val component = DaggerPoiWidgetComponent.builder() 31 | .prebookingComponent(parentComponent) 32 | .poiWidgetModule(PoiWidgetComponent.PoiWidgetModule(view)) 33 | .build() 34 | component.inject(this) 35 | component.inject(view) 36 | attachView() 37 | return component.router() 38 | } 39 | } 40 | -------------------------------------------------------------------------------- /app/src/main/java/com/levnovikov/postbus/root/home/prebooking/poi_widget/PoiWidgetRouter.kt: -------------------------------------------------------------------------------- 1 | package com.levnovikov.postbus.root.home.prebooking.poi_widget 2 | 3 | import com.levnovikov.postbus.root.home.prebooking.poi_widget.di.PoiWidgetScope 4 | import com.levnovikov.system_base.NodeHolder 5 | import com.levnovikov.system_base.Router 6 | import com.levnovikov.system_base.node_state.NodeState 7 | 8 | import javax.inject.Inject 9 | 10 | /** 11 | * Author: lev.novikov 12 | * Date: 19/12/17. 13 | */ 14 | 15 | @PoiWidgetScope 16 | class PoiWidgetRouter @Inject 17 | constructor() : Router() { 18 | 19 | override val holders: Set> = setOf() 20 | 21 | } 22 | -------------------------------------------------------------------------------- /app/src/main/java/com/levnovikov/postbus/root/home/prebooking/poi_widget/PoiWidgetVM.kt: -------------------------------------------------------------------------------- 1 | package com.levnovikov.postbus.root.home.prebooking.poi_widget 2 | 3 | import android.databinding.ObservableField 4 | import javax.inject.Inject 5 | 6 | /** 7 | * Author: lev.novikov 8 | * Date: 3/3/18. 9 | */ 10 | class PoiWidgetVM @Inject constructor( 11 | private val interactor: PoiWidgetInteractor 12 | ) { 13 | 14 | val pickUpPoint = ObservableField("Select pick-up") 15 | val dropOffPoint = ObservableField("Select drop-off") 16 | 17 | init { 18 | interactor.getPickupPointStream() 19 | .subscribe({ (_, title) -> pickUpPoint.set(title) }) { /*handle*/ e -> } 20 | 21 | interactor.getDropOffPointStream() 22 | .subscribe({ (_, title) -> dropOffPoint.set(title) }) { /*handle*/ e -> } 23 | 24 | if (interactor.hasSavedState()) interactor.restoreState() 25 | } 26 | 27 | fun onPickupSelected() { 28 | interactor.selectPickUp() 29 | } 30 | 31 | fun onDropOffSelected() { 32 | interactor.selectDropOff() 33 | } 34 | } -------------------------------------------------------------------------------- /app/src/main/java/com/levnovikov/postbus/root/home/prebooking/poi_widget/PoiWidgetView.kt: -------------------------------------------------------------------------------- 1 | package com.levnovikov.postbus.root.home.prebooking.poi_widget 2 | 3 | import android.content.Context 4 | import android.databinding.DataBindingUtil 5 | import android.util.AttributeSet 6 | import android.widget.LinearLayout 7 | import com.levnovikov.postbus.databinding.PoiWidgetBinding 8 | import javax.inject.Inject 9 | 10 | /** 11 | * Author: lev.novikov 12 | * Date: 19/12/17. 13 | */ 14 | 15 | class PoiWidgetView @JvmOverloads constructor( 16 | context: Context, attrs: AttributeSet? = null, defStyleAttr: Int = 0 17 | ) : LinearLayout(context, attrs, defStyleAttr) { 18 | 19 | @Inject 20 | lateinit var vm: PoiWidgetVM 21 | 22 | override fun onAttachedToWindow() { 23 | super.onAttachedToWindow() 24 | setupBinding() 25 | } 26 | 27 | private fun setupBinding() { 28 | DataBindingUtil.bind(this).vm = vm 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /app/src/main/java/com/levnovikov/postbus/root/home/prebooking/poi_widget/di/PoiWidgetComponent.java: -------------------------------------------------------------------------------- 1 | package com.levnovikov.postbus.root.home.prebooking.poi_widget.di; 2 | 3 | import com.levnovikov.postbus.root.home.prebooking.di.PrebookingComponent; 4 | import com.levnovikov.postbus.root.home.prebooking.poi_widget.PoiWidgetNodeHolder; 5 | import com.levnovikov.postbus.root.home.prebooking.poi_widget.PoiWidgetRouter; 6 | import com.levnovikov.postbus.root.home.prebooking.poi_widget.PoiWidgetView; 7 | import com.levnovikov.system_base.base_di.ActivityComponent; 8 | 9 | import dagger.Component; 10 | import dagger.Module; 11 | import dagger.Provides; 12 | 13 | /** 14 | * Author: lev.novikov 15 | * Date: 19/12/17. 16 | */ 17 | 18 | @PoiWidgetScope 19 | @Component(dependencies = PrebookingComponent.class, modules = PoiWidgetComponent.PoiWidgetModule.class) 20 | public interface PoiWidgetComponent extends ActivityComponent { 21 | 22 | void inject(PoiWidgetNodeHolder poiWidgetBuilder); 23 | 24 | PoiWidgetRouter router(); 25 | 26 | void inject(PoiWidgetView view); 27 | 28 | @Module 29 | class PoiWidgetModule { 30 | 31 | private PoiWidgetView view; 32 | 33 | public PoiWidgetModule(PoiWidgetView view) { 34 | this.view = view; 35 | } 36 | 37 | @PoiWidgetScope 38 | @Provides 39 | PoiWidgetView provideView() { 40 | return view; 41 | } 42 | 43 | } 44 | 45 | } 46 | -------------------------------------------------------------------------------- /app/src/main/java/com/levnovikov/postbus/root/home/prebooking/poi_widget/di/PoiWidgetScope.java: -------------------------------------------------------------------------------- 1 | package com.levnovikov.postbus.root.home.prebooking.poi_widget.di; 2 | 3 | import java.lang.annotation.Retention; 4 | import java.lang.annotation.RetentionPolicy; 5 | 6 | import javax.inject.Scope; 7 | 8 | /** 9 | * Author: lev.novikov 10 | * Date: 19/12/17. 11 | */ 12 | 13 | @Scope 14 | @Retention(RetentionPolicy.RUNTIME) 15 | public @interface PoiWidgetScope { 16 | } 17 | -------------------------------------------------------------------------------- /app/src/main/res/drawable-v24/ic_launcher_foreground.xml: -------------------------------------------------------------------------------- 1 | 7 | 12 | 13 | 19 | 22 | 25 | 26 | 27 | 28 | 34 | 35 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_attach_money_black_24dp.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_directions_car_black_24dp.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_more_horiz_black_24dp.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_receipt_black_24dp.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/layout/activity_splash.xml: -------------------------------------------------------------------------------- 1 | 2 | 8 | 9 | 17 | 18 | 19 | -------------------------------------------------------------------------------- /app/src/main/res/layout/alloc_view.xml: -------------------------------------------------------------------------------- 1 | 2 | 6 | 7 | 14 | 15 | 20 | 21 | -------------------------------------------------------------------------------- /app/src/main/res/layout/booking_extra_widget.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 6 | 9 | 10 | 11 | 12 | 18 | 19 | 23 | 24 | 31 | 32 | 39 | 40 | 47 | 48 | 49 | 58 | 59 |