From cc6e48657485cdaeb92f5c562381e906b878d6b5 Mon Sep 17 00:00:00 2001 From: Arty Bishop Date: Fri, 22 Nov 2019 10:42:34 +0000 Subject: [PATCH] Successfully moved to Dagger DI framework --- .../java/com/rtbishop/lookingsat/Injector.kt | 32 ------------------- .../lookingsat/{vm => }/MainViewModel.kt | 12 +++++-- .../rtbishop/lookingsat/di/AppComponent.kt | 4 +-- .../rtbishop/lookingsat/di/NetworkModule.kt | 25 ++++++++++++++- .../rtbishop/lookingsat/di/StorageModule.kt | 22 ++++++++++++- .../lookingsat/network/RemoteDataSource.kt | 6 +++- .../rtbishop/lookingsat/repo/Repository.kt | 3 +- .../lookingsat/storage/LocalDataSource.kt | 3 +- ...nsmittersDatabase.kt => TransmittersDb.kt} | 8 ++--- .../rtbishop/lookingsat/ui/MainActivity.kt | 2 +- .../com/rtbishop/lookingsat/ui/SkyFragment.kt | 2 +- 11 files changed, 71 insertions(+), 48 deletions(-) delete mode 100644 app/src/main/java/com/rtbishop/lookingsat/Injector.kt rename app/src/main/java/com/rtbishop/lookingsat/{vm => }/MainViewModel.kt (95%) rename app/src/main/java/com/rtbishop/lookingsat/storage/{TransmittersDatabase.kt => TransmittersDb.kt} (71%) diff --git a/app/src/main/java/com/rtbishop/lookingsat/Injector.kt b/app/src/main/java/com/rtbishop/lookingsat/Injector.kt deleted file mode 100644 index e9fef9fc..00000000 --- a/app/src/main/java/com/rtbishop/lookingsat/Injector.kt +++ /dev/null @@ -1,32 +0,0 @@ -package com.rtbishop.lookingsat - -import android.content.Context -import com.rtbishop.lookingsat.network.RemoteDataSource -import com.rtbishop.lookingsat.network.TransmittersApi -import com.rtbishop.lookingsat.repo.Repository -import com.rtbishop.lookingsat.storage.LocalDataSource -import com.rtbishop.lookingsat.storage.TransmittersDatabase -import okhttp3.OkHttpClient -import retrofit2.Retrofit -import retrofit2.converter.gson.GsonConverterFactory - -object Injector { - - private fun provideRemoteDataSource(): RemoteDataSource { - val api = Retrofit.Builder() - .baseUrl("https://db.satnogs.org/api/") - .addConverterFactory(GsonConverterFactory.create()) - .build() - .create(TransmittersApi::class.java) - val client = OkHttpClient() - return RemoteDataSource(api, client) - } - - private fun provideLocalDataSource(context: Context): LocalDataSource { - return LocalDataSource(TransmittersDatabase.getInstance(context).transmittersDao()) - } - - fun provideRepository(context: Context): Repository { - return Repository(provideLocalDataSource(context), provideRemoteDataSource()) - } -} \ No newline at end of file diff --git a/app/src/main/java/com/rtbishop/lookingsat/vm/MainViewModel.kt b/app/src/main/java/com/rtbishop/lookingsat/MainViewModel.kt similarity index 95% rename from app/src/main/java/com/rtbishop/lookingsat/vm/MainViewModel.kt rename to app/src/main/java/com/rtbishop/lookingsat/MainViewModel.kt index 8d9ae206..696e206f 100644 --- a/app/src/main/java/com/rtbishop/lookingsat/vm/MainViewModel.kt +++ b/app/src/main/java/com/rtbishop/lookingsat/MainViewModel.kt @@ -1,4 +1,4 @@ -package com.rtbishop.lookingsat.vm +package com.rtbishop.lookingsat import android.app.Application import android.content.Context @@ -16,7 +16,6 @@ import com.github.amsacode.predict4java.PassPredictor import com.github.amsacode.predict4java.SatNotFoundException import com.github.amsacode.predict4java.TLE import com.google.android.gms.location.LocationServices -import com.rtbishop.lookingsat.Injector import com.rtbishop.lookingsat.repo.Repository import com.rtbishop.lookingsat.repo.SatPass import kotlinx.coroutines.Dispatchers @@ -25,6 +24,7 @@ import kotlinx.coroutines.withContext import java.io.FileNotFoundException import java.io.IOException import java.util.* +import javax.inject.Inject class MainViewModel(application: Application) : AndroidViewModel(application) { @@ -34,7 +34,9 @@ class MainViewModel(application: Application) : AndroidViewModel(application) { private val tleFile = "tles.txt" private val tag = "myTag" - private val repository: Repository = Injector.provideRepository(application) + @Inject + lateinit var repository: Repository + private val preferences = PreferenceManager.getDefaultSharedPreferences(application) private val fusedLocationClient = LocationServices.getFusedLocationProviderClient(application) @@ -53,6 +55,10 @@ class MainViewModel(application: Application) : AndroidViewModel(application) { var tleMainList = loadTwoLineElementFile().sortedWith(compareBy { it.name }) var tleSelectedMap = mutableMapOf() + init { + (application as LookingSatApp).appComponent.inject(this) + } + private fun loadTwoLineElementFile(): List { return try { TLE.importSat(getApplication().openFileInput(tleFile)) diff --git a/app/src/main/java/com/rtbishop/lookingsat/di/AppComponent.kt b/app/src/main/java/com/rtbishop/lookingsat/di/AppComponent.kt index be36844e..588ae504 100644 --- a/app/src/main/java/com/rtbishop/lookingsat/di/AppComponent.kt +++ b/app/src/main/java/com/rtbishop/lookingsat/di/AppComponent.kt @@ -1,7 +1,7 @@ package com.rtbishop.lookingsat.di import android.content.Context -import com.rtbishop.lookingsat.ui.MainActivity +import com.rtbishop.lookingsat.MainViewModel import dagger.BindsInstance import dagger.Component import javax.inject.Singleton @@ -15,5 +15,5 @@ interface AppComponent { fun create(@BindsInstance context: Context): AppComponent } - fun inject(activity: MainActivity) + fun inject(viewModel: MainViewModel) } \ No newline at end of file diff --git a/app/src/main/java/com/rtbishop/lookingsat/di/NetworkModule.kt b/app/src/main/java/com/rtbishop/lookingsat/di/NetworkModule.kt index c60f1c92..8e1ad62d 100644 --- a/app/src/main/java/com/rtbishop/lookingsat/di/NetworkModule.kt +++ b/app/src/main/java/com/rtbishop/lookingsat/di/NetworkModule.kt @@ -1,6 +1,29 @@ package com.rtbishop.lookingsat.di +import com.rtbishop.lookingsat.network.TransmittersApi import dagger.Module +import dagger.Provides +import okhttp3.OkHttpClient +import retrofit2.Retrofit +import retrofit2.converter.gson.GsonConverterFactory +import javax.inject.Singleton @Module -class NetworkModule \ No newline at end of file +class NetworkModule { + + @Singleton + @Provides + fun provideTransmittersApi(): TransmittersApi { + return Retrofit.Builder() + .baseUrl("https://db.satnogs.org/api/") + .addConverterFactory(GsonConverterFactory.create()) + .build() + .create(TransmittersApi::class.java) + } + + @Singleton + @Provides + fun provideOkHttpClient(): OkHttpClient { + return OkHttpClient() + } +} \ No newline at end of file diff --git a/app/src/main/java/com/rtbishop/lookingsat/di/StorageModule.kt b/app/src/main/java/com/rtbishop/lookingsat/di/StorageModule.kt index 897c0052..20b02c67 100644 --- a/app/src/main/java/com/rtbishop/lookingsat/di/StorageModule.kt +++ b/app/src/main/java/com/rtbishop/lookingsat/di/StorageModule.kt @@ -1,6 +1,26 @@ package com.rtbishop.lookingsat.di +import android.content.Context +import androidx.room.Room +import com.rtbishop.lookingsat.storage.TransmittersDao +import com.rtbishop.lookingsat.storage.TransmittersDb import dagger.Module +import dagger.Provides +import javax.inject.Singleton @Module -class StorageModule \ No newline at end of file +class StorageModule { + + @Singleton + @Provides + fun provideTransmittersDb(context: Context): TransmittersDb { + return Room.databaseBuilder(context, TransmittersDb::class.java, "transmitters") + .build() + } + + @Singleton + @Provides + fun provideTransmittersDao(db: TransmittersDb): TransmittersDao { + return db.transmittersDao() + } +} \ No newline at end of file diff --git a/app/src/main/java/com/rtbishop/lookingsat/network/RemoteDataSource.kt b/app/src/main/java/com/rtbishop/lookingsat/network/RemoteDataSource.kt index f28e0bc5..cd04ce3d 100644 --- a/app/src/main/java/com/rtbishop/lookingsat/network/RemoteDataSource.kt +++ b/app/src/main/java/com/rtbishop/lookingsat/network/RemoteDataSource.kt @@ -5,8 +5,12 @@ import okhttp3.OkHttpClient import okhttp3.Request import java.io.InputStream import java.io.SequenceInputStream +import javax.inject.Inject -class RemoteDataSource(private val api: TransmittersApi, private val client: OkHttpClient) { +class RemoteDataSource @Inject constructor( + private val api: TransmittersApi, + private val client: OkHttpClient +) { fun fetchTleStream(): InputStream { val requestAmateur = diff --git a/app/src/main/java/com/rtbishop/lookingsat/repo/Repository.kt b/app/src/main/java/com/rtbishop/lookingsat/repo/Repository.kt index 1fc56649..d5cb6023 100644 --- a/app/src/main/java/com/rtbishop/lookingsat/repo/Repository.kt +++ b/app/src/main/java/com/rtbishop/lookingsat/repo/Repository.kt @@ -3,8 +3,9 @@ package com.rtbishop.lookingsat.repo import com.rtbishop.lookingsat.network.RemoteDataSource import com.rtbishop.lookingsat.storage.LocalDataSource import java.io.InputStream +import javax.inject.Inject -class Repository( +class Repository @Inject constructor( private val localSource: LocalDataSource, private val remoteSource: RemoteDataSource ) { diff --git a/app/src/main/java/com/rtbishop/lookingsat/storage/LocalDataSource.kt b/app/src/main/java/com/rtbishop/lookingsat/storage/LocalDataSource.kt index 87148a97..ca959198 100644 --- a/app/src/main/java/com/rtbishop/lookingsat/storage/LocalDataSource.kt +++ b/app/src/main/java/com/rtbishop/lookingsat/storage/LocalDataSource.kt @@ -1,8 +1,9 @@ package com.rtbishop.lookingsat.storage import com.rtbishop.lookingsat.repo.Transmitter +import javax.inject.Inject -class LocalDataSource(private val transmittersDao: TransmittersDao) { +class LocalDataSource @Inject constructor(private val transmittersDao: TransmittersDao) { suspend fun insertTransmitters(transmitters: List) { transmittersDao.insertTransmitters(transmitters) diff --git a/app/src/main/java/com/rtbishop/lookingsat/storage/TransmittersDatabase.kt b/app/src/main/java/com/rtbishop/lookingsat/storage/TransmittersDb.kt similarity index 71% rename from app/src/main/java/com/rtbishop/lookingsat/storage/TransmittersDatabase.kt rename to app/src/main/java/com/rtbishop/lookingsat/storage/TransmittersDb.kt index 2b8755b0..20e48f50 100644 --- a/app/src/main/java/com/rtbishop/lookingsat/storage/TransmittersDatabase.kt +++ b/app/src/main/java/com/rtbishop/lookingsat/storage/TransmittersDb.kt @@ -7,20 +7,20 @@ import androidx.room.RoomDatabase import com.rtbishop.lookingsat.repo.Transmitter @Database(entities = [Transmitter::class], version = 1, exportSchema = false) -abstract class TransmittersDatabase : RoomDatabase() { +abstract class TransmittersDb : RoomDatabase() { abstract fun transmittersDao(): TransmittersDao companion object { @Volatile - private var INSTANCE: TransmittersDatabase? = null + private var INSTANCE: TransmittersDb? = null - fun getInstance(context: Context): TransmittersDatabase = + fun getInstance(context: Context): TransmittersDb = INSTANCE ?: synchronized(this) { INSTANCE ?: Room.databaseBuilder( context, - TransmittersDatabase::class.java, + TransmittersDb::class.java, "transmitters" ).build() } diff --git a/app/src/main/java/com/rtbishop/lookingsat/ui/MainActivity.kt b/app/src/main/java/com/rtbishop/lookingsat/ui/MainActivity.kt index 5fa0a5b0..17cfb894 100644 --- a/app/src/main/java/com/rtbishop/lookingsat/ui/MainActivity.kt +++ b/app/src/main/java/com/rtbishop/lookingsat/ui/MainActivity.kt @@ -25,8 +25,8 @@ import androidx.navigation.ui.navigateUp import androidx.navigation.ui.setupActionBarWithNavController import androidx.navigation.ui.setupWithNavController import com.google.android.material.navigation.NavigationView +import com.rtbishop.lookingsat.MainViewModel import com.rtbishop.lookingsat.R -import com.rtbishop.lookingsat.vm.MainViewModel import java.util.* import java.util.concurrent.TimeUnit diff --git a/app/src/main/java/com/rtbishop/lookingsat/ui/SkyFragment.kt b/app/src/main/java/com/rtbishop/lookingsat/ui/SkyFragment.kt index 2ede8948..5ed26693 100644 --- a/app/src/main/java/com/rtbishop/lookingsat/ui/SkyFragment.kt +++ b/app/src/main/java/com/rtbishop/lookingsat/ui/SkyFragment.kt @@ -14,9 +14,9 @@ import androidx.recyclerview.widget.LinearLayoutManager import androidx.recyclerview.widget.RecyclerView import com.github.amsacode.predict4java.TLE import com.google.android.material.floatingactionbutton.FloatingActionButton +import com.rtbishop.lookingsat.MainViewModel import com.rtbishop.lookingsat.R import com.rtbishop.lookingsat.repo.SatPass -import com.rtbishop.lookingsat.vm.MainViewModel import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.launch