Explorar el Código

Added dagger di framework

sirekanyan hace 7 años
padre
commit
5fa874ed78

+ 23 - 7
app/build.gradle

@@ -1,6 +1,7 @@
 apply plugin: 'com.android.application'
 apply plugin: 'kotlin-android'
 apply plugin: 'kotlin-android-extensions'
+apply plugin: 'kotlin-kapt'
 
 android {
     compileSdkVersion 27
@@ -21,21 +22,36 @@ android {
 }
 
 dependencies {
+    // kotlin standard library
     implementation "org.jetbrains.kotlin:kotlin-stdlib-jre7:$kotlin_version"
-    implementation "com.android.support:appcompat-v7:$support_version"
-    implementation "com.android.support:design:$support_version"
-    implementation "com.android.support:support-vector-drawable:$support_version"
-    implementation 'com.android.support.constraint:constraint-layout:1.1.0-beta4'
+
+    // support libraries
+    implementation "com.android.support:appcompat-v7:27.0.2"
+    implementation "com.android.support:design:27.0.2"
+    implementation "com.android.support:support-vector-drawable:27.0.2"
+    implementation 'com.android.support.constraint:constraint-layout:1.1.0-beta5'
+
+    // rxjava
     implementation 'io.reactivex.rxjava2:rxjava:2.1.8'
     implementation 'io.reactivex.rxjava2:rxkotlin:2.2.0'
     implementation 'io.reactivex.rxjava2:rxandroid:2.0.1'
     implementation 'com.tbruyelle.rxpermissions2:rxpermissions:0.9.4@aar'
-    implementation "com.squareup.retrofit2:retrofit:$retrofit_version"
-    implementation "com.squareup.retrofit2:adapter-rxjava2:$retrofit_version"
-    implementation "com.squareup.retrofit2:converter-gson:$retrofit_version"
+
+    // retrofit & okhttp
+    implementation "com.squareup.retrofit2:retrofit:2.3.0"
+    implementation "com.squareup.retrofit2:adapter-rxjava2:2.3.0"
+    implementation "com.squareup.retrofit2:converter-gson:2.3.0"
     implementation 'com.squareup.okhttp3:logging-interceptor:3.9.1'
+
+    // dagger
+    implementation "com.google.dagger:dagger:2.14.1"
+    kapt "com.google.dagger:dagger-compiler:2.14.1"
+
+    // etc
     implementation 'com.github.bumptech.glide:glide:4.5.0'
     implementation(name: 'ulogin-sdk-v1.1', ext: 'aar')
+
+    // testing
     testImplementation 'junit:junit:4.12'
 }
 

+ 5 - 53
app/src/main/java/me/vadik/knigopis/App.kt

@@ -1,60 +1,12 @@
 package me.vadik.knigopis
 
 import android.app.Application
-import com.google.gson.GsonBuilder
-import me.vadik.knigopis.api.gson.ImageThumbnailDeserializer
-import me.vadik.knigopis.model.ImageThumbnail
-import okhttp3.OkHttpClient
-import okhttp3.logging.HttpLoggingInterceptor
-import okhttp3.logging.HttpLoggingInterceptor.Level
-import retrofit2.Retrofit
-import retrofit2.adapter.rxjava2.RxJava2CallAdapterFactory
-import retrofit2.converter.gson.GsonConverterFactory
+import android.content.Context
+import me.vadik.knigopis.dependency.AppComponent
+import me.vadik.knigopis.dependency.DaggerAppComponent
 
-private const val MAIN_API_URL = "http://api.knigopis.com"
-private const val IMAGE_API_URL = "https://api.qwant.com/api/"
-private const val DATE_FORMAT = "yyyy-MM-dd HH:mm:ss"
+val Context.app get() = applicationContext as App
 
 class App : Application() {
-
-    val baseApi: Retrofit by lazy {
-        Retrofit.Builder()
-            .baseUrl(MAIN_API_URL)
-            .addCallAdapterFactory(RxJava2CallAdapterFactory.create())
-            .addConverterFactory(
-                GsonConverterFactory.create(
-                    GsonBuilder().setDateFormat(DATE_FORMAT).create()
-                )
-            )
-            .client(
-                OkHttpClient.Builder()
-                    .setDebugEnabled(BuildConfig.DEBUG)
-                    .build()
-            )
-            .build()
-    }
-
-    val imageApi: Retrofit by lazy {
-        Retrofit.Builder()
-            .baseUrl(IMAGE_API_URL)
-            .addCallAdapterFactory(RxJava2CallAdapterFactory.create())
-            .addConverterFactory(
-                GsonConverterFactory.create(
-                    GsonBuilder().registerTypeAdapter(
-                        ImageThumbnail::class.java,
-                        ImageThumbnailDeserializer()
-                    ).create()
-                )
-            )
-            .build()
-    }
-
-    private fun OkHttpClient.Builder.setDebugEnabled(debugEnabled: Boolean): OkHttpClient.Builder {
-        if (debugEnabled) {
-            addNetworkInterceptor(HttpLoggingInterceptor().also {
-                it.level = Level.BODY
-            })
-        }
-        return this
-    }
+    val component: AppComponent = DaggerAppComponent.create()
 }

+ 9 - 2
app/src/main/java/me/vadik/knigopis/BookActivity.kt

@@ -19,6 +19,7 @@ import me.vadik.knigopis.model.FinishedBookToSend
 import me.vadik.knigopis.model.PlannedBook
 import me.vadik.knigopis.model.PlannedBookToSend
 import java.util.*
+import javax.inject.Inject
 
 private const val IMAGE_PRELOAD_COUNT = 3
 private const val EXTRA_BOOK_ID = "me.vadik.knigopis.extra_book_id"
@@ -56,8 +57,13 @@ fun Context.createEditBookIntent(book: FinishedBook): Intent =
 
 class BookActivity : AppCompatActivity() {
 
+    @Inject
+    protected lateinit var api: Endpoint
+
+    @Inject
+    protected lateinit var imageApi: ImageEndpoint
+
     private val config by lazy { ConfigurationImpl(applicationContext) as Configuration }
-    private val api by lazy { app().baseApi.create(Endpoint::class.java) }
     private val repository by lazy {
         val auth = KAuthImpl(applicationContext, api)
         if (config.isDevMode()) {
@@ -68,7 +74,7 @@ class BookActivity : AppCompatActivity() {
     }
     private val imageSearch: BookCoverSearch by lazy {
         BookCoverSearchImpl(
-            app().imageApi.create(ImageEndpoint::class.java),
+            imageApi,
             BookCoverCacheImpl(applicationContext)
         )
     }
@@ -78,6 +84,7 @@ class BookActivity : AppCompatActivity() {
     override fun onCreate(savedInstanceState: Bundle?) {
         super.onCreate(savedInstanceState)
         setContentView(R.layout.book_edit)
+        app.component.inject(this)
         bookId = intent.getStringExtra(EXTRA_BOOK_ID)
         toolbar.inflateMenu(R.menu.book_menu)
         if (bookId == null) titleEditText.requestFocus()

+ 9 - 2
app/src/main/java/me/vadik/knigopis/MainActivity.kt

@@ -33,6 +33,7 @@ import me.vadik.knigopis.model.note.Note
 import me.vadik.knigopis.model.subscription.Subscription
 import me.vadik.knigopis.user.createUserIntent
 import retrofit2.HttpException
+import javax.inject.Inject
 
 private const val ULOGIN_REQUEST_CODE = 0
 private const val BOOK_REQUEST_CODE = 1
@@ -41,8 +42,13 @@ private const val VERSION_CLICK_COUNT_ON = 12
 
 class MainActivity : AppCompatActivity(), Router {
 
+    @Inject
+    protected lateinit var api: Endpoint
+
+    @Inject
+    protected lateinit var imageApi: ImageEndpoint
+
     private val config by lazy { ConfigurationImpl(applicationContext) as Configuration }
-    private val api by lazy { app().baseApi.create(Endpoint::class.java) }
     private val auth by lazy { KAuthImpl(applicationContext, api) as KAuth }
     private val allBooks = mutableListOf<Book>()
     private val allUsers = mutableListOf<Subscription>()
@@ -50,7 +56,7 @@ class MainActivity : AppCompatActivity(), Router {
     private val booksAdapter by lazy {
         BooksAdapter(
             BookCoverSearchImpl(
-                app().imageApi.create(ImageEndpoint::class.java),
+                imageApi,
                 BookCoverCacheImpl(applicationContext)
             ), api, auth, this
         )
@@ -74,6 +80,7 @@ class MainActivity : AppCompatActivity(), Router {
         }
         super.onCreate(savedInstanceState)
         setContentView(R.layout.activity_main)
+        app.component.inject(this)
         initRecyclerView(booksRecyclerView)
         initRecyclerView(usersRecyclerView)
         initRecyclerView(notesRecyclerView)

+ 15 - 0
app/src/main/java/me/vadik/knigopis/dependency/AppComponent.kt

@@ -0,0 +1,15 @@
+package me.vadik.knigopis.dependency
+
+import dagger.Component
+import me.vadik.knigopis.BookActivity
+import me.vadik.knigopis.MainActivity
+import me.vadik.knigopis.user.UserActivity
+import javax.inject.Singleton
+
+@Singleton
+@Component(modules = [AppModule::class])
+interface AppComponent {
+    fun inject(activity: MainActivity)
+    fun inject(activity: BookActivity)
+    fun inject(activity: UserActivity)
+}

+ 69 - 0
app/src/main/java/me/vadik/knigopis/dependency/AppModule.kt

@@ -0,0 +1,69 @@
+package me.vadik.knigopis.dependency
+
+import com.google.gson.GsonBuilder
+import dagger.Module
+import dagger.Provides
+import me.vadik.knigopis.BuildConfig
+import me.vadik.knigopis.api.Endpoint
+import me.vadik.knigopis.api.ImageEndpoint
+import me.vadik.knigopis.api.gson.ImageThumbnailDeserializer
+import me.vadik.knigopis.model.ImageThumbnail
+import okhttp3.OkHttpClient
+import okhttp3.logging.HttpLoggingInterceptor
+import retrofit2.Retrofit
+import retrofit2.adapter.rxjava2.RxJava2CallAdapterFactory
+import retrofit2.converter.gson.GsonConverterFactory
+import javax.inject.Singleton
+
+private const val MAIN_API_URL = "http://api.knigopis.com"
+private const val IMAGE_API_URL = "https://api.qwant.com/api/"
+private const val DATE_FORMAT = "yyyy-MM-dd HH:mm:ss"
+
+@Module
+class AppModule {
+
+    @Provides
+    @Singleton
+    fun provideBaseApi(): Endpoint =
+        Retrofit.Builder()
+            .baseUrl(MAIN_API_URL)
+            .addCallAdapterFactory(RxJava2CallAdapterFactory.create())
+            .addConverterFactory(
+                GsonConverterFactory.create(
+                    GsonBuilder().setDateFormat(DATE_FORMAT).create()
+                )
+            )
+            .client(
+                OkHttpClient.Builder()
+                    .setDebugEnabled(BuildConfig.DEBUG)
+                    .build()
+            )
+            .build()
+            .create(Endpoint::class.java)
+
+    @Provides
+    @Singleton
+    fun provideImageApi(): ImageEndpoint =
+        Retrofit.Builder()
+            .baseUrl(IMAGE_API_URL)
+            .addCallAdapterFactory(RxJava2CallAdapterFactory.create())
+            .addConverterFactory(
+                GsonConverterFactory.create(
+                    GsonBuilder().registerTypeAdapter(
+                        ImageThumbnail::class.java,
+                        ImageThumbnailDeserializer()
+                    ).create()
+                )
+            )
+            .build()
+            .create(ImageEndpoint::class.java)
+}
+
+private fun OkHttpClient.Builder.setDebugEnabled(debugEnabled: Boolean): OkHttpClient.Builder {
+    if (debugEnabled) {
+        addNetworkInterceptor(HttpLoggingInterceptor().also {
+            it.level = HttpLoggingInterceptor.Level.BODY
+        })
+    }
+    return this
+}

+ 9 - 1
app/src/main/java/me/vadik/knigopis/user/UserActivity.kt

@@ -15,10 +15,12 @@ import me.vadik.knigopis.adapters.books.BooksAdapter
 import me.vadik.knigopis.adapters.books.UserBook
 import me.vadik.knigopis.adapters.users.toSocialNetwork
 import me.vadik.knigopis.api.Endpoint
+import me.vadik.knigopis.api.ImageEndpoint
 import me.vadik.knigopis.auth.KAuth
 import me.vadik.knigopis.auth.KAuthImpl
 import me.vadik.knigopis.model.note.Identity
 import me.vadik.knigopis.model.subscription.Subscription
+import javax.inject.Inject
 
 private const val EXTRA_USER_ID = "me.vadik.knigopis.extra_user_id"
 private const val EXTRA_USER_NAME = "me.vadik.knigopis.extra_user_name"
@@ -40,7 +42,12 @@ fun Context.createUserIntent(user: Identity): Intent =
 
 class UserActivity : AppCompatActivity() {
 
-    private val api by lazy { app().baseApi.create(Endpoint::class.java) }
+    @Inject
+    protected lateinit var api: Endpoint
+
+    @Inject
+    protected lateinit var imageApi: ImageEndpoint
+
     private val auth by lazy { KAuthImpl(applicationContext, api) as KAuth }
     private val userId by lazy { intent.getStringExtra(EXTRA_USER_ID) }
     private val books = mutableListOf<UserBook>()
@@ -50,6 +57,7 @@ class UserActivity : AppCompatActivity() {
     override fun onCreate(savedInstanceState: Bundle?) {
         super.onCreate(savedInstanceState)
         setContentView(R.layout.user_activity)
+        app.component.inject(this)
         toolbar.title = intent.getStringExtra(EXTRA_USER_NAME)
         setSupportActionBar(toolbar)
         fab.setOnClickListener { view ->

+ 0 - 2
build.gradle

@@ -1,8 +1,6 @@
 buildscript {
     ext {
         kotlin_version = '1.2.21'
-        support_version = '27.0.2'
-        retrofit_version = '2.3.0'
     }
     repositories {
         jcenter()