Added LocalDataSource, Repository and ViewModel to Injector. Code move and cleanup.

This commit is contained in:
Arty Bishop committed 2019-10-29 22:52:51 +00:00
1 parent ace042d0b2
commit 53e64c30c2
13 files changed
+83 -31

No files matched your search

+1 -1
View File
@@ -14,7 +14,7 @@
android:theme="@style/AppTheme" android:theme="@style/AppTheme"
tools:ignore="GoogleAppIndexingWarning"> tools:ignore="GoogleAppIndexingWarning">
<activity <activity
android:name=".MainActivity" android:name=".ui.MainActivity"
android:label="@string/app_name" android:label="@string/app_name"
android:theme="@style/AppTheme.NoActionBar"> android:theme="@style/AppTheme.NoActionBar">
<intent-filter> <intent-filter>
@@ -1,12 +1,19 @@
package com.rtbishop.lookingsat package com.rtbishop.lookingsat
import android.content.Context
import androidx.lifecycle.ViewModelProvider
import com.rtbishop.lookingsat.api.RemoteDataSource import com.rtbishop.lookingsat.api.RemoteDataSource
import com.rtbishop.lookingsat.api.TransmittersApi 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 okhttp3.OkHttpClient
import retrofit2.Retrofit import retrofit2.Retrofit
import retrofit2.converter.gson.GsonConverterFactory import retrofit2.converter.gson.GsonConverterFactory
object Injector { object Injector {
private fun provideRemoteDataSource(): RemoteDataSource { private fun provideRemoteDataSource(): RemoteDataSource {
val api = Retrofit.Builder() val api = Retrofit.Builder()
.baseUrl("https://db.satnogs.org/api/") .baseUrl("https://db.satnogs.org/api/")
@@ -18,4 +25,18 @@ object Injector {
return RemoteDataSource(api, client) 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))
}
} }
@@ -1,6 +0,0 @@
package com.rtbishop.lookingsat
import android.app.Application
import androidx.lifecycle.AndroidViewModel
class MainViewModel(application: Application) : AndroidViewModel(application)
@@ -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" private const val TLE_WEATHER = "https://celestrak.com/NORAD/elements/weather.txt"
class RemoteDataSource(private val api: TransmittersApi, private val client: OkHttpClient) { class RemoteDataSource(private val api: TransmittersApi, private val client: OkHttpClient) {
private val requestAmateur = Request.Builder().url(TLE_AMATEUR).build() private val requestAmateur = Request.Builder().url(TLE_AMATEUR).build()
private val requestWeather = Request.Builder().url(TLE_WEATHER).build() private val requestWeather = Request.Builder().url(TLE_WEATHER).build()
@@ -1,3 +1,9 @@
package com.rtbishop.lookingsat.repo package com.rtbishop.lookingsat.repo
class Repository import com.rtbishop.lookingsat.api.RemoteDataSource
import com.rtbishop.lookingsat.db.LocalDataSource
class Repository(
private val localSource: LocalDataSource,
private val remoteSource: RemoteDataSource
)
@@ -10,7 +10,8 @@ import com.rtbishop.lookingsat.R
class CreditsFragment : Fragment() { class CreditsFragment : Fragment() {
override fun onCreateView( override fun onCreateView(
inflater: LayoutInflater, container: ViewGroup?, inflater: LayoutInflater,
container: ViewGroup?,
savedInstanceState: Bundle? savedInstanceState: Bundle?
): View? { ): View? {
return inflater.inflate(R.layout.fragment_credits, container, false) return inflater.inflate(R.layout.fragment_credits, container, false)
@@ -1,4 +1,4 @@
package com.rtbishop.lookingsat package com.rtbishop.lookingsat.ui
import android.Manifest import android.Manifest
import android.content.Intent 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.FusedLocationProviderClient
import com.google.android.gms.location.LocationServices import com.google.android.gms.location.LocationServices
import com.google.android.material.navigation.NavigationView import com.google.android.material.navigation.NavigationView
import com.rtbishop.lookingsat.R
import com.rtbishop.lookingsat.vm.MainViewModel
import java.util.* import java.util.*
import java.util.concurrent.TimeUnit import java.util.concurrent.TimeUnit
@@ -86,7 +88,12 @@ class MainActivity : AppCompatActivity() {
drawerGetLocation = header.findViewById(R.id.drawer_get_location) drawerGetLocation = header.findViewById(R.id.drawer_get_location)
val navController = findNavController(R.id.nav_host) 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) setupActionBarWithNavController(navController, appBarConfig)
navView.setupWithNavController(navController) navView.setupWithNavController(navController)
@@ -111,7 +118,12 @@ class MainActivity : AppCompatActivity() {
openGitHub() openGitHub()
} }
drawerGetLocation.startAnimation(AnimationUtils.loadAnimation(this, R.anim.pulse)) drawerGetLocation.startAnimation(
AnimationUtils.loadAnimation(
this,
R.anim.pulse
)
)
drawerGetLocation.setOnClickListener { drawerGetLocation.setOnClickListener {
it.isEnabled = false it.isEnabled = false
updateLocation() updateLocation()
@@ -146,11 +158,22 @@ class MainActivity : AppCompatActivity() {
} }
private fun updateLocation() { private fun updateLocation() {
if (ContextCompat.checkSelfPermission(this, LOCATION_PERM) != GRANTED) { if (ContextCompat.checkSelfPermission(
if (ActivityCompat.shouldShowRequestPermissionRationale(this, LOCATION_PERM)) { this,
LOCATION_PERM
) != GRANTED
) {
if (ActivityCompat.shouldShowRequestPermissionRationale(
this,
LOCATION_PERM
)
) {
Toast.makeText(this, "Missing permissions", Toast.LENGTH_LONG).show() Toast.makeText(this, "Missing permissions", Toast.LENGTH_LONG).show()
} else { } else {
ActivityCompat.requestPermissions(this, arrayOf(LOCATION_PERM), LOCATION_REQ) ActivityCompat.requestPermissions(
this, arrayOf(LOCATION_PERM),
LOCATION_REQ
)
} }
} else { } else {
getPreciseLocation() getPreciseLocation()
@@ -5,20 +5,15 @@ import android.view.LayoutInflater
import android.view.View import android.view.View
import android.view.ViewGroup import android.view.ViewGroup
import androidx.fragment.app.Fragment import androidx.fragment.app.Fragment
import androidx.lifecycle.ViewModelProviders
import com.rtbishop.lookingsat.MainViewModel
import com.rtbishop.lookingsat.R import com.rtbishop.lookingsat.R
class RadarFragment : Fragment() { class RadarFragment : Fragment() {
private lateinit var viewModel: MainViewModel
override fun onCreateView( override fun onCreateView(
inflater: LayoutInflater, inflater: LayoutInflater,
container: ViewGroup?, container: ViewGroup?,
savedInstanceState: Bundle? savedInstanceState: Bundle?
): View? { ): View? {
viewModel = ViewModelProviders.of(this).get(MainViewModel::class.java)
return inflater.inflate(R.layout.fragment_radar, container, false) return inflater.inflate(R.layout.fragment_radar, container, false)
} }
} }
@@ -5,20 +5,15 @@ import android.view.LayoutInflater
import android.view.View import android.view.View
import android.view.ViewGroup import android.view.ViewGroup
import androidx.fragment.app.Fragment import androidx.fragment.app.Fragment
import androidx.lifecycle.ViewModelProviders
import com.rtbishop.lookingsat.MainViewModel
import com.rtbishop.lookingsat.R import com.rtbishop.lookingsat.R
class SkyFragment : Fragment() { class SkyFragment : Fragment() {
private lateinit var viewModel: MainViewModel
override fun onCreateView( override fun onCreateView(
inflater: LayoutInflater, inflater: LayoutInflater,
container: ViewGroup?, container: ViewGroup?,
savedInstanceState: Bundle? savedInstanceState: Bundle?
): View? { ): View? {
viewModel = ViewModelProviders.of(this).get(MainViewModel::class.java)
return inflater.inflate(R.layout.fragment_sky, container, false) return inflater.inflate(R.layout.fragment_sky, container, false)
} }
} }
@@ -5,20 +5,15 @@ import android.view.LayoutInflater
import android.view.View import android.view.View
import android.view.ViewGroup import android.view.ViewGroup
import androidx.fragment.app.Fragment import androidx.fragment.app.Fragment
import androidx.lifecycle.ViewModelProviders
import com.rtbishop.lookingsat.MainViewModel
import com.rtbishop.lookingsat.R import com.rtbishop.lookingsat.R
class WorldMapFragment : Fragment() { class WorldMapFragment : Fragment() {
private lateinit var viewModel: MainViewModel
override fun onCreateView( override fun onCreateView(
inflater: LayoutInflater, inflater: LayoutInflater,
container: ViewGroup?, container: ViewGroup?,
savedInstanceState: Bundle? savedInstanceState: Bundle?
): View? { ): View? {
viewModel = ViewModelProviders.of(this).get(MainViewModel::class.java)
return inflater.inflate(R.layout.fragment_worldmap, container, false) return inflater.inflate(R.layout.fragment_worldmap, container, false)
} }
} }
@@ -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()
@@ -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 <T : ViewModel?> create(modelClass: Class<T>): T {
if (modelClass.isAssignableFrom(MainViewModel::class.java)) {
@Suppress("UNCHECKED_CAST")
return MainViewModel(repository) as T
}
throw IllegalArgumentException("Unknown ViewModel")
}
}
+1 -1
View File
@@ -4,7 +4,7 @@
xmlns:tools="http://schemas.android.com/tools" xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent" android:layout_height="match_parent"
tools:context=".MainActivity"> tools:context=".ui.MainActivity">
<com.google.android.material.appbar.AppBarLayout <com.google.android.material.appbar.AppBarLayout
android:layout_width="match_parent" android:layout_width="match_parent"