瀏覽代碼

Added providing all dependencies using custom extension functions

Vadik Sirekanyan 7 年之前
父節點
當前提交
4a0735748a

+ 11 - 5
app/src/main/java/com/sirekanyan/knigopis/App.kt

@@ -1,11 +1,17 @@
 package com.sirekanyan.knigopis
 
 import android.app.Application
-import org.koin.android.ext.android.startKoin
+import com.sirekanyan.knigopis.dependency.*
 
 class App : Application() {
-    override fun onCreate() {
-        super.onCreate()
-        startKoin(this, listOf(appModule))
-    }
+    val config by lazy(::provideConfig)
+    val resourceProvider by lazy(::provideResources)
+    val authRepository by lazy(::provideAuthRepository)
+    val bookRepository by lazy(::provideBookRepository)
+    val userRepository by lazy(::provideUserRepository)
+    val noteRepository by lazy(::provideNoteRepository)
+    val networkChecker by lazy(::provideNetworkChecker)
+    val endpoint by lazy(::provideEndpoint)
+    val cache by lazy(::provideCache)
+    val gson by lazy(::provideGson)
 }

+ 13 - 0
app/src/main/java/com/sirekanyan/knigopis/dependency/activity.kt

@@ -0,0 +1,13 @@
+package com.sirekanyan.knigopis.dependency
+
+import android.app.Activity
+import com.sirekanyan.knigopis.common.android.Permissions
+import com.sirekanyan.knigopis.common.android.PermissionsImpl
+import com.sirekanyan.knigopis.common.android.dialog.BottomSheetDialogFactory
+import com.sirekanyan.knigopis.common.android.dialog.DialogFactory
+
+fun Activity.provideDialogs(): DialogFactory =
+    BottomSheetDialogFactory(this)
+
+fun Activity.providePermissions(): Permissions =
+    PermissionsImpl(this)

+ 84 - 0
app/src/main/java/com/sirekanyan/knigopis/dependency/app.kt

@@ -0,0 +1,84 @@
+package com.sirekanyan.knigopis.dependency
+
+import com.google.gson.Gson
+import com.google.gson.GsonBuilder
+import com.sirekanyan.knigopis.App
+import com.sirekanyan.knigopis.BuildConfig
+import com.sirekanyan.knigopis.DATE_FORMAT
+import com.sirekanyan.knigopis.MAIN_API
+import com.sirekanyan.knigopis.common.android.NetworkChecker
+import com.sirekanyan.knigopis.common.android.NetworkCheckerImpl
+import com.sirekanyan.knigopis.common.android.ResourceProvider
+import com.sirekanyan.knigopis.common.android.ResourceProviderImpl
+import com.sirekanyan.knigopis.model.BookDataModel
+import com.sirekanyan.knigopis.model.BookHeaderModel
+import com.sirekanyan.knigopis.model.BookModel
+import com.sirekanyan.knigopis.repository.*
+import com.sirekanyan.knigopis.repository.cache.CommonCache
+import com.sirekanyan.knigopis.repository.cache.CommonCacheImpl
+import com.sirekanyan.knigopis.repository.cache.HeadedModelDeserializer
+import okhttp3.OkHttpClient
+import okhttp3.logging.HttpLoggingInterceptor
+import retrofit2.Retrofit
+import retrofit2.adapter.rxjava2.RxJava2CallAdapterFactory
+import retrofit2.converter.gson.GsonConverterFactory
+
+fun App.provideConfig(): Configuration =
+    ConfigurationImpl(this)
+
+fun App.provideResources(): ResourceProvider =
+    ResourceProviderImpl(this)
+
+fun App.provideAuthRepository(): AuthRepository =
+    AuthRepositoryImpl(this, endpoint)
+
+fun App.provideBookRepository(): BookRepository {
+    val planned = PlannedBookOrganizerImpl(resourceProvider, config)
+    val finished = FinishedBookOrganizerImpl(resourceProvider)
+    return BookRepositoryImpl(endpoint, cache, authRepository, planned, finished, networkChecker)
+}
+
+fun App.provideUserRepository(): UserRepository =
+    UserRepositoryImpl(endpoint, cache, authRepository, networkChecker)
+
+fun App.provideNoteRepository(): NoteRepository =
+    NoteRepositoryImpl(endpoint, cache, networkChecker)
+
+fun App.provideNetworkChecker(): NetworkChecker =
+    NetworkCheckerImpl(this)
+
+fun App.provideEndpoint(): Endpoint =
+    Retrofit.Builder()
+        .baseUrl(MAIN_API)
+        .addCallAdapterFactory(RxJava2CallAdapterFactory.create())
+        .addConverterFactory(GsonConverterFactory.create(gson))
+        .client(
+            OkHttpClient.Builder()
+                .setDebugEnabled(BuildConfig.DEBUG)
+                .build()
+        )
+        .build()
+        .create(Endpoint::class.java)
+
+fun App.provideCache(): CommonCache =
+    CommonCacheImpl(this, gson)
+
+fun provideGson(): Gson =
+    GsonBuilder().registerTypeAdapter(
+        BookModel::class.java,
+        HeadedModelDeserializer<BookModel>(
+            BookHeaderModel::class.java,
+            BookDataModel::class.java
+        )
+    )
+        .setDateFormat(DATE_FORMAT)
+        .create()
+
+private fun OkHttpClient.Builder.setDebugEnabled(debugEnabled: Boolean) =
+    apply {
+        if (debugEnabled) {
+            addNetworkInterceptor(HttpLoggingInterceptor().also {
+                it.level = HttpLoggingInterceptor.Level.BODY
+            })
+        }
+    }

+ 55 - 0
app/src/main/java/com/sirekanyan/knigopis/dependency/main.kt

@@ -0,0 +1,55 @@
+package com.sirekanyan.knigopis.dependency
+
+import com.sirekanyan.knigopis.common.android.dialog.DialogFactory
+import com.sirekanyan.knigopis.common.extensions.app
+import com.sirekanyan.knigopis.common.extensions.getRootView
+import com.sirekanyan.knigopis.feature.*
+import com.sirekanyan.knigopis.feature.books.BooksPresenterImpl
+import com.sirekanyan.knigopis.feature.books.BooksViewImpl
+import com.sirekanyan.knigopis.feature.login.LoginPresenterImpl
+import com.sirekanyan.knigopis.feature.login.LoginViewImpl
+import com.sirekanyan.knigopis.feature.notes.NotesPresenterImpl
+import com.sirekanyan.knigopis.feature.notes.NotesViewImpl
+import com.sirekanyan.knigopis.feature.users.UsersPresenterImpl
+import com.sirekanyan.knigopis.feature.users.UsersViewImpl
+import com.sirekanyan.knigopis.model.CurrentTab.*
+import kotlinx.android.synthetic.main.activity_main.view.*
+import kotlinx.android.synthetic.main.books_page.view.*
+import kotlinx.android.synthetic.main.notes_page.view.*
+import kotlinx.android.synthetic.main.users_page.view.*
+
+fun MainActivity.providePresenter(): MainPresenter {
+    val loginPresenter = LoginPresenterImpl(this, providePermissions())
+    val booksPresenter = BooksPresenterImpl(this, app.bookRepository)
+    val usersPresenter = UsersPresenterImpl(this, app.userRepository, app.resourceProvider)
+    val notesPresenter = NotesPresenterImpl(this, app.noteRepository)
+    return MainPresenterImpl(
+        loginPresenter,
+        mapOf(
+            BOOKS_TAB to booksPresenter,
+            USERS_TAB to usersPresenter,
+            NOTES_TAB to notesPresenter
+        ),
+        this,
+        app.config,
+        app.authRepository
+    ).also { mainPresenter ->
+        val rootView = getRootView()
+        val progressView = ProgressViewImpl(rootView.swipeRefresh, mainPresenter)
+        val dialogs: DialogFactory = provideDialogs()
+        loginPresenter.view = LoginViewImpl(rootView, loginPresenter)
+        booksPresenter.also { p ->
+            p.view = BooksViewImpl(rootView.booksPage, booksPresenter, progressView, dialogs)
+            p.parent = mainPresenter
+        }
+        usersPresenter.also { p ->
+            p.view = UsersViewImpl(rootView.usersPage, usersPresenter, progressView, dialogs)
+            p.parent = mainPresenter
+        }
+        notesPresenter.also { p ->
+            p.view = NotesViewImpl(rootView.notesPage, notesPresenter, progressView)
+            p.parent = mainPresenter
+        }
+        mainPresenter.view = MainViewImpl(rootView, mainPresenter)
+    }
+}

+ 9 - 0
app/src/main/java/com/sirekanyan/knigopis/dependency/user.kt

@@ -0,0 +1,9 @@
+package com.sirekanyan.knigopis.dependency
+
+import com.sirekanyan.knigopis.common.extensions.app
+import com.sirekanyan.knigopis.feature.user.UserActivity
+import com.sirekanyan.knigopis.feature.user.UserInteractor
+import com.sirekanyan.knigopis.feature.user.UserInteractorImpl
+
+fun UserActivity.provideInteractor(): UserInteractor =
+    UserInteractorImpl(app.authRepository, app.endpoint, app.resourceProvider)

+ 5 - 12
app/src/main/java/com/sirekanyan/knigopis/feature/MainActivity.kt

@@ -6,15 +6,12 @@ import android.net.Uri
 import android.os.Bundle
 import com.sirekanyan.knigopis.R
 import com.sirekanyan.knigopis.common.BaseActivity
-import com.sirekanyan.knigopis.common.extensions.io2main
-import com.sirekanyan.knigopis.common.extensions.setDarkTheme
-import com.sirekanyan.knigopis.common.extensions.startActivityOrNull
-import com.sirekanyan.knigopis.common.extensions.toast
+import com.sirekanyan.knigopis.common.extensions.*
 import com.sirekanyan.knigopis.common.functions.createAppSettingsIntent
 import com.sirekanyan.knigopis.common.functions.createLoginIntent
 import com.sirekanyan.knigopis.common.functions.extra
 import com.sirekanyan.knigopis.common.functions.logError
-import com.sirekanyan.knigopis.createParameters
+import com.sirekanyan.knigopis.dependency.providePresenter
 import com.sirekanyan.knigopis.feature.book.createEditBookIntent
 import com.sirekanyan.knigopis.feature.book.createNewBookIntent
 import com.sirekanyan.knigopis.feature.books.BooksPresenter
@@ -29,9 +26,6 @@ import com.sirekanyan.knigopis.model.BookDataModel
 import com.sirekanyan.knigopis.model.CurrentTab
 import com.sirekanyan.knigopis.model.NoteModel
 import com.sirekanyan.knigopis.model.UserModel
-import com.sirekanyan.knigopis.repository.Configuration
-import com.sirekanyan.knigopis.repository.Endpoint
-import org.koin.android.ext.android.inject
 import ru.ulogin.sdk.UloginAuthActivity
 
 private const val LOGIN_REQUEST_CODE = 0
@@ -45,12 +39,11 @@ class MainActivity : BaseActivity(),
     UsersPresenter.Router,
     NotesPresenter.Router {
 
-    private val presenter by inject<MainPresenter>(parameters = createParameters(this))
-    private val api by inject<Endpoint>()
-    private val config by inject<Configuration>()
+    private val presenter by lazy { providePresenter() }
+    private val api by lazy { app.endpoint }
 
     override fun onCreate(savedInstanceState: Bundle?) {
-        setDarkTheme(config.isDarkTheme)
+        setDarkTheme(app.config.isDarkTheme)
         super.onCreate(savedInstanceState)
         setContentView(R.layout.activity_main)
         val restoredCurrentTab = savedInstanceState?.getMainState()?.currentTab

+ 2 - 6
app/src/main/java/com/sirekanyan/knigopis/feature/book/BookActivity.kt

@@ -16,10 +16,7 @@ import com.sirekanyan.knigopis.common.functions.logError
 import com.sirekanyan.knigopis.model.BookDataModel
 import com.sirekanyan.knigopis.model.dto.FinishedBookToSend
 import com.sirekanyan.knigopis.model.dto.PlannedBookToSend
-import com.sirekanyan.knigopis.repository.BookRepository
-import com.sirekanyan.knigopis.repository.Configuration
 import kotlinx.android.synthetic.main.book_edit.*
-import org.koin.android.ext.android.inject
 import java.util.*
 
 private val EXTRA_BOOK_ID = extra("book_id")
@@ -66,12 +63,11 @@ fun Context.createEditBookIntent(book: BookDataModel): Intent =
 
 class BookActivity : BaseActivity() {
 
-    private val config by inject<Configuration>()
-    private val repository by inject<BookRepository>()
+    private val repository by lazy { app.bookRepository }
     private val today = Calendar.getInstance()
 
     override fun onCreate(savedInstanceState: Bundle?) {
-        setDarkTheme(config.isDarkTheme)
+        setDarkTheme(app.config.isDarkTheme)
         super.onCreate(savedInstanceState)
         setContentView(R.layout.book_edit)
         val bookId = intent.getStringExtra(EXTRA_BOOK_ID)

+ 3 - 7
app/src/main/java/com/sirekanyan/knigopis/feature/profile/ProfileActivity.kt

@@ -15,13 +15,9 @@ import com.sirekanyan.knigopis.common.functions.logError
 import com.sirekanyan.knigopis.model.BookDataModel
 import com.sirekanyan.knigopis.model.dto.Profile
 import com.sirekanyan.knigopis.model.dto.User
-import com.sirekanyan.knigopis.repository.AuthRepository
-import com.sirekanyan.knigopis.repository.BookRepository
-import com.sirekanyan.knigopis.repository.Endpoint
 import io.reactivex.Observable
 import io.reactivex.rxkotlin.Observables
 import kotlinx.android.synthetic.main.profile_activity.*
-import org.koin.android.ext.android.inject
 import java.util.*
 import java.util.concurrent.TimeUnit
 
@@ -29,9 +25,9 @@ fun Context.createProfileIntent() = Intent(this, ProfileActivity::class.java)
 
 class ProfileActivity : BaseActivity() {
 
-    private val api by inject<Endpoint>()
-    private val bookRepository by inject<BookRepository>()
-    private val auth by inject<AuthRepository>()
+    private val api by lazy { app.endpoint }
+    private val bookRepository by lazy { app.bookRepository }
+    private val auth by lazy { app.authRepository }
     private val todoList = Stack<BookDataModel>()
     private val doingList = Stack<BookDataModel>()
     private val doneList = Stack<BookDataModel>()

+ 5 - 8
app/src/main/java/com/sirekanyan/knigopis/feature/user/UserActivity.kt

@@ -9,20 +9,18 @@ import android.view.Menu
 import android.view.MenuItem
 import com.sirekanyan.knigopis.R
 import com.sirekanyan.knigopis.common.BaseActivity
-import com.sirekanyan.knigopis.common.android.dialog.DialogFactory
 import com.sirekanyan.knigopis.common.android.dialog.createDialogItem
 import com.sirekanyan.knigopis.common.android.header.HeaderItemDecoration
 import com.sirekanyan.knigopis.common.android.header.StickyHeaderImpl
 import com.sirekanyan.knigopis.common.extensions.*
 import com.sirekanyan.knigopis.common.functions.extra
 import com.sirekanyan.knigopis.common.functions.logError
-import com.sirekanyan.knigopis.createParameters
+import com.sirekanyan.knigopis.dependency.provideDialogs
+import com.sirekanyan.knigopis.dependency.provideInteractor
 import com.sirekanyan.knigopis.feature.book.createDoneBookIntent
 import com.sirekanyan.knigopis.feature.book.createTodoBookIntent
 import com.sirekanyan.knigopis.model.BookDataModel
-import com.sirekanyan.knigopis.repository.Configuration
 import kotlinx.android.synthetic.main.user_activity.*
-import org.koin.android.ext.android.inject
 
 private val EXTRA_USER_ID = extra("user_id")
 private val EXTRA_USER_NAME = extra("user_name")
@@ -36,9 +34,8 @@ fun Context.createUserIntent(id: String, name: String, avatar: String?): Intent
 
 class UserActivity : BaseActivity() {
 
-    private val config by inject<Configuration>()
-    private val interactor by inject<UserInteractor>()
-    private val dialogs by inject<DialogFactory>(parameters = createParameters())
+    private val interactor by lazy { provideInteractor() }
+    private val dialogs by lazy { provideDialogs() }
     private val userId by lazy { intent.getStringExtra(EXTRA_USER_ID) }
     private val userName by lazy { intent.getStringExtra(EXTRA_USER_NAME) }
     private val userPhoto by lazy { intent.getStringExtra(EXTRA_USER_PHOTO) }
@@ -46,7 +43,7 @@ class UserActivity : BaseActivity() {
     private lateinit var unsubscribeOption: MenuItem
 
     override fun onCreate(savedInstanceState: Bundle?) {
-        setDarkTheme(config.isDarkTheme)
+        setDarkTheme(app.config.isDarkTheme)
         super.onCreate(savedInstanceState)
         setContentView(R.layout.user_activity)
         toolbar.title = userName