dependency.kt 7.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180
  1. package com.sirekanyan.knigopis
  2. import android.app.Activity
  3. import android.content.Context
  4. import android.view.View
  5. import com.google.gson.Gson
  6. import com.google.gson.GsonBuilder
  7. import com.sirekanyan.knigopis.common.android.*
  8. import com.sirekanyan.knigopis.common.android.dialog.BottomSheetDialogFactory
  9. import com.sirekanyan.knigopis.common.android.dialog.DialogFactory
  10. import com.sirekanyan.knigopis.common.extensions.getRootView
  11. import com.sirekanyan.knigopis.feature.MainPresenter
  12. import com.sirekanyan.knigopis.feature.MainPresenterImpl
  13. import com.sirekanyan.knigopis.feature.MainViewImpl
  14. import com.sirekanyan.knigopis.feature.ProgressViewImpl
  15. import com.sirekanyan.knigopis.feature.books.BooksPresenterImpl
  16. import com.sirekanyan.knigopis.feature.books.BooksViewImpl
  17. import com.sirekanyan.knigopis.feature.login.LoginPresenterImpl
  18. import com.sirekanyan.knigopis.feature.login.LoginViewImpl
  19. import com.sirekanyan.knigopis.feature.notes.NotesPresenterImpl
  20. import com.sirekanyan.knigopis.feature.notes.NotesViewImpl
  21. import com.sirekanyan.knigopis.feature.user.UserInteractor
  22. import com.sirekanyan.knigopis.feature.user.UserInteractorImpl
  23. import com.sirekanyan.knigopis.feature.users.UsersPresenterImpl
  24. import com.sirekanyan.knigopis.feature.users.UsersViewImpl
  25. import com.sirekanyan.knigopis.model.BookDataModel
  26. import com.sirekanyan.knigopis.model.BookHeaderModel
  27. import com.sirekanyan.knigopis.model.BookModel
  28. import com.sirekanyan.knigopis.model.CurrentTab.*
  29. import com.sirekanyan.knigopis.model.dto.FinishedBook
  30. import com.sirekanyan.knigopis.model.dto.PlannedBook
  31. import com.sirekanyan.knigopis.repository.*
  32. import com.sirekanyan.knigopis.repository.cache.CommonCache
  33. import com.sirekanyan.knigopis.repository.cache.CommonCacheImpl
  34. import com.sirekanyan.knigopis.repository.cache.HeadedModelDeserializer
  35. import kotlinx.android.synthetic.main.activity_main.view.*
  36. import kotlinx.android.synthetic.main.books_page.view.*
  37. import kotlinx.android.synthetic.main.notes_page.view.*
  38. import kotlinx.android.synthetic.main.users_page.view.*
  39. import okhttp3.OkHttpClient
  40. import okhttp3.logging.HttpLoggingInterceptor
  41. import org.koin.core.parameter.Parameters
  42. import org.koin.dsl.context.ParameterProvider
  43. import org.koin.dsl.module.applicationContext
  44. import retrofit2.Retrofit
  45. import retrofit2.adapter.rxjava2.RxJava2CallAdapterFactory
  46. import retrofit2.converter.gson.GsonConverterFactory
  47. import org.koin.dsl.context.Context as KoinContext
  48. private const val MAIN_API_URL = "http://api.knigopis.com"
  49. private const val DATE_FORMAT = "yyyy-MM-dd HH:mm:ss"
  50. private const val CONTEXT_KEY = "context_key"
  51. private const val ROOT_VIEW_KEY = "root_view_key"
  52. private const val ROUTER_KEY = "router_key"
  53. val appModule = applicationContext {
  54. bean {
  55. BookRepositoryImpl(
  56. get(),
  57. get(),
  58. get(),
  59. get("planned"),
  60. get("finished"),
  61. get()
  62. ) as BookRepository
  63. }
  64. bean { UserRepositoryImpl(get(), get(), get(), get()) as UserRepository }
  65. bean { NoteRepositoryImpl(get(), get(), get()) as NoteRepository }
  66. bean { AuthRepositoryImpl(get(), get()) as AuthRepository }
  67. bean { createMainEndpoint(get()) }
  68. bean("planned") { PlannedBookOrganizerImpl(get(), get()) as BookOrganizer<PlannedBook> }
  69. bean("finished") { FinishedBookPrepareImpl(get()) as BookOrganizer<FinishedBook> }
  70. bean { ConfigurationImpl(get()) as Configuration }
  71. bean { ResourceProviderImpl(get()) as ResourceProvider }
  72. bean { NetworkCheckerImpl(get()) as NetworkChecker }
  73. bean { CommonCacheImpl(get(), get()) as CommonCache }
  74. bean {
  75. GsonBuilder().registerTypeAdapter(
  76. BookModel::class.java,
  77. HeadedModelDeserializer<BookModel>(
  78. BookHeaderModel::class.java,
  79. BookDataModel::class.java
  80. )
  81. )
  82. .setDateFormat(DATE_FORMAT)
  83. .create()
  84. }
  85. factory { BottomSheetDialogFactory(it.getContext()) as DialogFactory }
  86. factory { PermissionsImpl(it.getContext() as Activity) as Permissions }
  87. mainModule()
  88. userModule()
  89. }
  90. private fun KoinContext.mainModule() {
  91. factory {
  92. val params = it.getContext().createParameters()
  93. val loginPresenter = LoginPresenterImpl(it.getRouter(), get(params))
  94. val booksPresenter = BooksPresenterImpl(it.getRouter(), get())
  95. val usersPresenter = UsersPresenterImpl(it.getRouter(), get(), get())
  96. val notesPresenter = NotesPresenterImpl(it.getRouter(), get())
  97. MainPresenterImpl(
  98. loginPresenter,
  99. mapOf(
  100. BOOKS_TAB to booksPresenter,
  101. USERS_TAB to usersPresenter,
  102. NOTES_TAB to notesPresenter
  103. ),
  104. it.getRouter(),
  105. get(),
  106. get()
  107. ).also { mainPresenter ->
  108. val rootView = it.getRootView()
  109. val progressView = ProgressViewImpl(rootView.swipeRefresh, mainPresenter)
  110. val dialogs: DialogFactory = get(params)
  111. loginPresenter.view = LoginViewImpl(rootView, loginPresenter)
  112. booksPresenter.also { p ->
  113. p.view = BooksViewImpl(rootView.booksPage, booksPresenter, progressView, dialogs)
  114. p.parent = mainPresenter
  115. }
  116. usersPresenter.also { p ->
  117. p.view = UsersViewImpl(rootView.usersPage, usersPresenter, progressView, dialogs)
  118. p.parent = mainPresenter
  119. }
  120. notesPresenter.also { p ->
  121. p.view = NotesViewImpl(rootView.notesPage, notesPresenter, progressView)
  122. p.parent = mainPresenter
  123. }
  124. mainPresenter.view = MainViewImpl(rootView, mainPresenter)
  125. } as MainPresenter
  126. }
  127. }
  128. private fun KoinContext.userModule() {
  129. bean { UserInteractorImpl(get(), get(), get()) as UserInteractor }
  130. }
  131. fun Context.createParameters(): Parameters =
  132. { mapOf(CONTEXT_KEY to this) }
  133. fun Activity.createParameters(router: MainPresenter.Router): Parameters =
  134. {
  135. mapOf(
  136. CONTEXT_KEY to this,
  137. ROOT_VIEW_KEY to getRootView(),
  138. ROUTER_KEY to router
  139. )
  140. }
  141. private fun ParameterProvider.getContext(): Context =
  142. this[CONTEXT_KEY]
  143. private fun ParameterProvider.getRootView(): View =
  144. this[ROOT_VIEW_KEY]
  145. private fun <T> ParameterProvider.getRouter(): T =
  146. this[ROUTER_KEY]
  147. private fun createMainEndpoint(gson: Gson) =
  148. Retrofit.Builder()
  149. .baseUrl(MAIN_API_URL)
  150. .addCallAdapterFactory(RxJava2CallAdapterFactory.create())
  151. .addConverterFactory(
  152. GsonConverterFactory.create(gson)
  153. )
  154. .client(
  155. OkHttpClient.Builder()
  156. .setDebugEnabled(BuildConfig.DEBUG)
  157. .build()
  158. )
  159. .build()
  160. .create(Endpoint::class.java)
  161. private fun OkHttpClient.Builder.setDebugEnabled(debugEnabled: Boolean) =
  162. apply {
  163. if (debugEnabled) {
  164. addNetworkInterceptor(HttpLoggingInterceptor().also {
  165. it.level = HttpLoggingInterceptor.Level.BODY
  166. })
  167. }
  168. }