From 53e64c30c207c7c4e4b7a94120f61c61caf98ba3 Mon Sep 17 00:00:00 2001 From: Arty Bishop Date: Tue, 29 Oct 2019 22:51:28 +0000 Subject: [PATCH] Added LocalDataSource, Repository and ViewModel to Injector. Code move and cleanup. --- app/src/main/AndroidManifest.xml | 2 +- .../java/com/rtbishop/lookingsat/Injector.kt | 21 +++++++++++ .../com/rtbishop/lookingsat/MainViewModel.kt | 6 ---- .../lookingsat/api/RemoteDataSource.kt | 1 + .../rtbishop/lookingsat/repo/Repository.kt | 8 ++++- .../rtbishop/lookingsat/ui/CreditsFragment.kt | 3 +- .../lookingsat/{ => ui}/MainActivity.kt | 35 +++++++++++++++---- .../rtbishop/lookingsat/ui/RadarFragment.kt | 5 --- .../com/rtbishop/lookingsat/ui/SkyFragment.kt | 5 --- .../lookingsat/ui/WorldMapFragment.kt | 5 --- .../rtbishop/lookingsat/vm/MainViewModel.kt | 6 ++++ .../lookingsat/vm/ViewModelFactory.kt | 15 ++++++++ app/src/main/res/layout/app_bar_main.xml | 2 +- 13 files changed, 83 insertions(+), 31 deletions(-) delete mode 100644 app/src/main/java/com/rtbishop/lookingsat/MainViewModel.kt rename app/src/main/java/com/rtbishop/lookingsat/{ => ui}/MainActivity.kt (91%) create mode 100644 app/src/main/java/com/rtbishop/lookingsat/vm/MainViewModel.kt create mode 100644 app/src/main/java/com/rtbishop/lookingsat/vm/ViewModelFactory.kt diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index b43e8818..2fcca2e3 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -14,7 +14,7 @@ android:theme="@style/AppTheme" tools:ignore="GoogleAppIndexingWarning"> diff --git a/app/src/main/java/com/rtbishop/lookingsat/Injector.kt b/app/src/main/java/com/rtbishop/lookingsat/Injector.kt index 550bae44..0295f4ec 100644 --- a/app/src/main/java/com/rtbishop/lookingsat/Injector.kt +++ b/app/src/main/java/com/rtbishop/lookingsat/Injector.kt @@ -1,12 +1,19 @@ package com.rtbishop.lookingsat +import android.content.Context +import androidx.lifecycle.ViewModelProvider import com.rtbishop.lookingsat.api.RemoteDataSource import com.rtbishop.lookingsat.api.TransmittersApi +import com.rtbishop.lookingsat.db.LocalDataSource +import com.rtbishop.lookingsat.db.TransmittersDatabase +import com.rtbishop.lookingsat.repo.Repository +import com.rtbishop.lookingsat.vm.ViewModelFactory 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/") @@ -18,4 +25,18 @@ object Injector { return RemoteDataSource(api, client) } + + private fun provideLocalDataSource(context: Context): LocalDataSource { + val dao = TransmittersDatabase.getInstance(context).transmittersDao() + + return LocalDataSource(dao) + } + + private fun provideRepository(context: Context): Repository { + return Repository(provideLocalDataSource(context), provideRemoteDataSource()) + } + + private fun provideViewModelFactory(context: Context): ViewModelProvider.Factory { + return ViewModelFactory(provideRepository(context)) + } } \ No newline at end of file diff --git a/app/src/main/java/com/rtbishop/lookingsat/MainViewModel.kt b/app/src/main/java/com/rtbishop/lookingsat/MainViewModel.kt deleted file mode 100644 index e6f3f841..00000000 --- a/app/src/main/java/com/rtbishop/lookingsat/MainViewModel.kt +++ /dev/null @@ -1,6 +0,0 @@ -package com.rtbishop.lookingsat - -import android.app.Application -import androidx.lifecycle.AndroidViewModel - -class MainViewModel(application: Application) : AndroidViewModel(application) \ No newline at end of file diff --git a/app/src/main/java/com/rtbishop/lookingsat/api/RemoteDataSource.kt b/app/src/main/java/com/rtbishop/lookingsat/api/RemoteDataSource.kt index 1352584b..dd9373e2 100644 --- a/app/src/main/java/com/rtbishop/lookingsat/api/RemoteDataSource.kt +++ b/app/src/main/java/com/rtbishop/lookingsat/api/RemoteDataSource.kt @@ -10,6 +10,7 @@ private const val TLE_AMATEUR = "https://celestrak.com/NORAD/elements/amateur.tx private const val TLE_WEATHER = "https://celestrak.com/NORAD/elements/weather.txt" class RemoteDataSource(private val api: TransmittersApi, private val client: OkHttpClient) { + private val requestAmateur = Request.Builder().url(TLE_AMATEUR).build() private val requestWeather = Request.Builder().url(TLE_WEATHER).build() 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 feba74f3..daa67bd8 100644 --- a/app/src/main/java/com/rtbishop/lookingsat/repo/Repository.kt +++ b/app/src/main/java/com/rtbishop/lookingsat/repo/Repository.kt @@ -1,3 +1,9 @@ package com.rtbishop.lookingsat.repo -class Repository \ No newline at end of file +import com.rtbishop.lookingsat.api.RemoteDataSource +import com.rtbishop.lookingsat.db.LocalDataSource + +class Repository( + private val localSource: LocalDataSource, + private val remoteSource: RemoteDataSource +) \ No newline at end of file diff --git a/app/src/main/java/com/rtbishop/lookingsat/ui/CreditsFragment.kt b/app/src/main/java/com/rtbishop/lookingsat/ui/CreditsFragment.kt index d15f1a10..847c6a12 100644 --- a/app/src/main/java/com/rtbishop/lookingsat/ui/CreditsFragment.kt +++ b/app/src/main/java/com/rtbishop/lookingsat/ui/CreditsFragment.kt @@ -10,7 +10,8 @@ import com.rtbishop.lookingsat.R class CreditsFragment : Fragment() { override fun onCreateView( - inflater: LayoutInflater, container: ViewGroup?, + inflater: LayoutInflater, + container: ViewGroup?, savedInstanceState: Bundle? ): View? { return inflater.inflate(R.layout.fragment_credits, container, false) diff --git a/app/src/main/java/com/rtbishop/lookingsat/MainActivity.kt b/app/src/main/java/com/rtbishop/lookingsat/ui/MainActivity.kt similarity index 91% rename from app/src/main/java/com/rtbishop/lookingsat/MainActivity.kt rename to app/src/main/java/com/rtbishop/lookingsat/ui/MainActivity.kt index 9f23368c..e604c188 100644 --- a/app/src/main/java/com/rtbishop/lookingsat/MainActivity.kt +++ b/app/src/main/java/com/rtbishop/lookingsat/ui/MainActivity.kt @@ -1,4 +1,4 @@ -package com.rtbishop.lookingsat +package com.rtbishop.lookingsat.ui import android.Manifest import android.content.Intent @@ -33,6 +33,8 @@ import androidx.preference.PreferenceManager import com.google.android.gms.location.FusedLocationProviderClient import com.google.android.gms.location.LocationServices import com.google.android.material.navigation.NavigationView +import com.rtbishop.lookingsat.R +import com.rtbishop.lookingsat.vm.MainViewModel import java.util.* import java.util.concurrent.TimeUnit @@ -86,7 +88,12 @@ class MainActivity : AppCompatActivity() { drawerGetLocation = header.findViewById(R.id.drawer_get_location) val navController = findNavController(R.id.nav_host) - appBarConfig = AppBarConfiguration(setOf(R.id.nav_sky, R.id.nav_single_sat), drawerLayout) + appBarConfig = AppBarConfiguration( + setOf( + R.id.nav_sky, + R.id.nav_single_sat + ), drawerLayout + ) setupActionBarWithNavController(navController, appBarConfig) navView.setupWithNavController(navController) @@ -111,7 +118,12 @@ class MainActivity : AppCompatActivity() { openGitHub() } - drawerGetLocation.startAnimation(AnimationUtils.loadAnimation(this, R.anim.pulse)) + drawerGetLocation.startAnimation( + AnimationUtils.loadAnimation( + this, + R.anim.pulse + ) + ) drawerGetLocation.setOnClickListener { it.isEnabled = false updateLocation() @@ -146,11 +158,22 @@ class MainActivity : AppCompatActivity() { } private fun updateLocation() { - if (ContextCompat.checkSelfPermission(this, LOCATION_PERM) != GRANTED) { - if (ActivityCompat.shouldShowRequestPermissionRationale(this, LOCATION_PERM)) { + if (ContextCompat.checkSelfPermission( + this, + LOCATION_PERM + ) != GRANTED + ) { + if (ActivityCompat.shouldShowRequestPermissionRationale( + this, + LOCATION_PERM + ) + ) { Toast.makeText(this, "Missing permissions", Toast.LENGTH_LONG).show() } else { - ActivityCompat.requestPermissions(this, arrayOf(LOCATION_PERM), LOCATION_REQ) + ActivityCompat.requestPermissions( + this, arrayOf(LOCATION_PERM), + LOCATION_REQ + ) } } else { getPreciseLocation() diff --git a/app/src/main/java/com/rtbishop/lookingsat/ui/RadarFragment.kt b/app/src/main/java/com/rtbishop/lookingsat/ui/RadarFragment.kt index e7cd843f..371823d9 100644 --- a/app/src/main/java/com/rtbishop/lookingsat/ui/RadarFragment.kt +++ b/app/src/main/java/com/rtbishop/lookingsat/ui/RadarFragment.kt @@ -5,20 +5,15 @@ import android.view.LayoutInflater import android.view.View import android.view.ViewGroup import androidx.fragment.app.Fragment -import androidx.lifecycle.ViewModelProviders -import com.rtbishop.lookingsat.MainViewModel import com.rtbishop.lookingsat.R class RadarFragment : Fragment() { - private lateinit var viewModel: MainViewModel - override fun onCreateView( inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle? ): View? { - viewModel = ViewModelProviders.of(this).get(MainViewModel::class.java) return inflater.inflate(R.layout.fragment_radar, container, false) } } \ No newline at end of file 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 62d18b14..63b7f005 100644 --- a/app/src/main/java/com/rtbishop/lookingsat/ui/SkyFragment.kt +++ b/app/src/main/java/com/rtbishop/lookingsat/ui/SkyFragment.kt @@ -5,20 +5,15 @@ import android.view.LayoutInflater import android.view.View import android.view.ViewGroup import androidx.fragment.app.Fragment -import androidx.lifecycle.ViewModelProviders -import com.rtbishop.lookingsat.MainViewModel import com.rtbishop.lookingsat.R class SkyFragment : Fragment() { - private lateinit var viewModel: MainViewModel - override fun onCreateView( inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle? ): View? { - viewModel = ViewModelProviders.of(this).get(MainViewModel::class.java) return inflater.inflate(R.layout.fragment_sky, container, false) } } \ No newline at end of file diff --git a/app/src/main/java/com/rtbishop/lookingsat/ui/WorldMapFragment.kt b/app/src/main/java/com/rtbishop/lookingsat/ui/WorldMapFragment.kt index 26ce5b55..65be6786 100644 --- a/app/src/main/java/com/rtbishop/lookingsat/ui/WorldMapFragment.kt +++ b/app/src/main/java/com/rtbishop/lookingsat/ui/WorldMapFragment.kt @@ -5,20 +5,15 @@ import android.view.LayoutInflater import android.view.View import android.view.ViewGroup import androidx.fragment.app.Fragment -import androidx.lifecycle.ViewModelProviders -import com.rtbishop.lookingsat.MainViewModel import com.rtbishop.lookingsat.R class WorldMapFragment : Fragment() { - private lateinit var viewModel: MainViewModel - override fun onCreateView( inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle? ): View? { - viewModel = ViewModelProviders.of(this).get(MainViewModel::class.java) return inflater.inflate(R.layout.fragment_worldmap, container, false) } } \ 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/vm/MainViewModel.kt new file mode 100644 index 00000000..5fa1d2be --- /dev/null +++ b/app/src/main/java/com/rtbishop/lookingsat/vm/MainViewModel.kt @@ -0,0 +1,6 @@ +package com.rtbishop.lookingsat.vm + +import androidx.lifecycle.ViewModel +import com.rtbishop.lookingsat.repo.Repository + +class MainViewModel(private val repository: Repository) : ViewModel() \ No newline at end of file diff --git a/app/src/main/java/com/rtbishop/lookingsat/vm/ViewModelFactory.kt b/app/src/main/java/com/rtbishop/lookingsat/vm/ViewModelFactory.kt new file mode 100644 index 00000000..c4b26a26 --- /dev/null +++ b/app/src/main/java/com/rtbishop/lookingsat/vm/ViewModelFactory.kt @@ -0,0 +1,15 @@ +package com.rtbishop.lookingsat.vm + +import androidx.lifecycle.ViewModel +import androidx.lifecycle.ViewModelProvider +import com.rtbishop.lookingsat.repo.Repository + +class ViewModelFactory(private val repository: Repository) : ViewModelProvider.Factory { + override fun create(modelClass: Class): T { + if (modelClass.isAssignableFrom(MainViewModel::class.java)) { + @Suppress("UNCHECKED_CAST") + return MainViewModel(repository) as T + } + throw IllegalArgumentException("Unknown ViewModel") + } +} \ No newline at end of file diff --git a/app/src/main/res/layout/app_bar_main.xml b/app/src/main/res/layout/app_bar_main.xml index 7ef133f7..8ab9f3c2 100644 --- a/app/src/main/res/layout/app_bar_main.xml +++ b/app/src/main/res/layout/app_bar_main.xml @@ -4,7 +4,7 @@ xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" - tools:context=".MainActivity"> + tools:context=".ui.MainActivity">