Switched from Dagger to android Hilt DI

This commit is contained in:
Arty Bishop committed 2020-10-10 16:54:40 +01:00
1 parent 4e0aa1481b
commit 1c7ce3f726
22 files changed
+145 -232

No files matched your search

+9 -6
View File
@@ -17,10 +17,11 @@
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
*/ */
apply plugin: 'com.android.application' apply plugin: "com.android.application"
apply plugin: 'kotlin-android' apply plugin: "kotlin-android"
apply plugin: 'kotlin-android-extensions' apply plugin: "kotlin-kapt"
apply plugin: 'kotlin-kapt' apply plugin: "kotlin-android-extensions"
apply plugin: "dagger.hilt.android.plugin"
apply plugin: "androidx.navigation.safeargs.kotlin" apply plugin: "androidx.navigation.safeargs.kotlin"
android { android {
@@ -77,8 +78,10 @@ dependencies {
implementation "androidx.room:room-ktx:$room_version" implementation "androidx.room:room-ktx:$room_version"
kapt "androidx.room:room-compiler:$room_version" kapt "androidx.room:room-compiler:$room_version"
implementation "com.google.dagger:dagger:$dagger_version" implementation "androidx.hilt:hilt-lifecycle-viewmodel:$hilt_viewmodel_version"
kapt "com.google.dagger:dagger-compiler:$dagger_version" implementation "com.google.dagger:hilt-android:$hilt_version"
kapt "com.google.dagger:hilt-android-compiler:$hilt_version"
kapt "androidx.hilt:hilt-compiler:$hilt_viewmodel_version"
implementation "com.squareup.retrofit2:retrofit:$retrofit_version" implementation "com.squareup.retrofit2:retrofit:$retrofit_version"
implementation "com.squareup.retrofit2:converter-moshi:$retrofit_version" implementation "com.squareup.retrofit2:converter-moshi:$retrofit_version"
+1 -1
View File
@@ -33,7 +33,7 @@
android:label="@string/app_name" android:label="@string/app_name"
android:theme="@style/AppTheme"> android:theme="@style/AppTheme">
<activity <activity
android:name=".ui.MainActivity" android:name=".ui.activities.MainActivity"
android:screenOrientation="portrait"> android:screenOrientation="portrait">
<intent-filter> <intent-filter>
<action android:name="android.intent.action.MAIN" /> <action android:name="android.intent.action.MAIN" />
@@ -20,12 +20,7 @@
package com.rtbishop.look4sat package com.rtbishop.look4sat
import android.app.Application import android.app.Application
import com.rtbishop.look4sat.dagger.AppComponent import dagger.hilt.android.HiltAndroidApp
import com.rtbishop.look4sat.dagger.DaggerAppComponent
class Look4SatApp : Application() { @HiltAndroidApp
class Look4SatApp : Application()
val appComponent: AppComponent by lazy {
DaggerAppComponent.factory().create(applicationContext)
}
}
@@ -17,13 +17,12 @@
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
*/ */
package com.rtbishop.look4sat.ui package com.rtbishop.look4sat
import android.net.Uri import android.net.Uri
import androidx.lifecycle.LiveData import androidx.hilt.Assisted
import androidx.lifecycle.MutableLiveData import androidx.hilt.lifecycle.ViewModelInject
import androidx.lifecycle.ViewModel import androidx.lifecycle.*
import androidx.lifecycle.viewModelScope
import com.github.amsacode.predict4java.GroundStationPosition import com.github.amsacode.predict4java.GroundStationPosition
import com.rtbishop.look4sat.data.Result import com.rtbishop.look4sat.data.Result
import com.rtbishop.look4sat.data.SatEntry import com.rtbishop.look4sat.data.SatEntry
@@ -35,13 +34,13 @@ import com.rtbishop.look4sat.utility.PrefsManager
import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.launch import kotlinx.coroutines.launch
import java.util.* import java.util.*
import javax.inject.Inject
import javax.inject.Singleton import javax.inject.Singleton
@Singleton @Singleton
class SharedViewModel @Inject constructor( class SharedViewModel @ViewModelInject constructor(
private val prefsManager: PrefsManager, private val prefsManager: PrefsManager,
private val repository: Repository private val repository: Repository,
@Assisted private val savedStateHandle: SavedStateHandle
) : ViewModel() { ) : ViewModel() {
private val _passes = MutableLiveData<Result<MutableList<SatPass>>>() private val _passes = MutableLiveData<Result<MutableList<SatPass>>>()
@@ -1,50 +0,0 @@
/*
* Look4Sat. Amateur radio and weather satellite tracker and passes predictor for Android.
* Copyright (C) 2019, 2020 Arty Bishop (bishop.arty@gmail.com)
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License along
* with this program; if not, write to the Free Software Foundation, Inc.,
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
*/
package com.rtbishop.look4sat.dagger
import android.content.Context
import com.rtbishop.look4sat.dagger.modules.*
import com.rtbishop.look4sat.ui.MainActivity
import com.rtbishop.look4sat.ui.fragments.EntriesFragment
import com.rtbishop.look4sat.ui.fragments.MapFragment
import com.rtbishop.look4sat.ui.fragments.PassesFragment
import com.rtbishop.look4sat.ui.fragments.PolarFragment
import dagger.BindsInstance
import dagger.Component
import javax.inject.Singleton
@Singleton
@Component(
modules = [NetworkModule::class, PersistenceModule::class,
RepoModule::class, UtilityModule::class, ViewModelModule::class]
)
interface AppComponent {
@Component.Factory
interface Factory {
fun create(@BindsInstance context: Context): AppComponent
}
fun inject(mainActivity: MainActivity)
fun inject(entriesFragment: EntriesFragment)
fun inject(passesFragment: PassesFragment)
fun inject(polarFragment: PolarFragment)
fun inject(mapFragment: MapFragment)
}
@@ -1,25 +0,0 @@
package com.rtbishop.look4sat.dagger
import androidx.lifecycle.ViewModel
import androidx.lifecycle.ViewModelProvider
import javax.inject.Inject
import javax.inject.Provider
import javax.inject.Singleton
@Singleton
class ViewModelFactory @Inject constructor(
private val creators: Map<Class<out ViewModel>,
@JvmSuppressWildcards Provider<ViewModel>>
) : ViewModelProvider.Factory {
override fun <T : ViewModel?> create(modelClass: Class<T>): T {
val creator = creators[modelClass] ?: creators.entries.firstOrNull {
modelClass.isAssignableFrom(it.key)
}?.value ?: throw IllegalArgumentException("Unsupported ViewModel class: $modelClass")
try {
@Suppress("UNCHECKED_CAST")
return creator.get() as T
} catch (e: Exception) {
throw RuntimeException(e)
}
}
}
@@ -1,14 +0,0 @@
package com.rtbishop.look4sat.dagger
import androidx.lifecycle.ViewModel
import dagger.MapKey
import kotlin.reflect.KClass
@Target(
AnnotationTarget.FUNCTION,
AnnotationTarget.PROPERTY_GETTER,
AnnotationTarget.PROPERTY_SETTER
)
@Retention(AnnotationRetention.RUNTIME)
@MapKey
annotation class ViewModelKey(val value: KClass<out ViewModel>)
@@ -1,44 +0,0 @@
package com.rtbishop.look4sat.dagger.modules
import android.content.ContentResolver
import android.content.Context
import com.rtbishop.look4sat.repo.DefaultRepository
import com.rtbishop.look4sat.repo.Repository
import com.rtbishop.look4sat.repo.local.EntriesDao
import com.rtbishop.look4sat.repo.local.SourcesDao
import com.rtbishop.look4sat.repo.local.TransmittersDao
import com.rtbishop.look4sat.repo.remote.TransmittersApi
import dagger.Module
import dagger.Provides
import okhttp3.OkHttpClient
import javax.inject.Singleton
@Module
class RepoModule {
@Singleton
@Provides
fun provideContentResolver(context: Context): ContentResolver {
return context.applicationContext.contentResolver
}
@Singleton
@Provides
fun provideDefaultRepository(
resolver: ContentResolver,
client: OkHttpClient,
transmittersApi: TransmittersApi,
entriesDao: EntriesDao,
transmittersDao: TransmittersDao,
sourcesDao: SourcesDao
): Repository {
return DefaultRepository(
resolver,
client,
transmittersApi,
entriesDao,
sourcesDao,
transmittersDao
)
}
}
@@ -1,22 +0,0 @@
package com.rtbishop.look4sat.dagger.modules
import androidx.lifecycle.ViewModel
import androidx.lifecycle.ViewModelProvider
import com.rtbishop.look4sat.dagger.ViewModelFactory
import com.rtbishop.look4sat.dagger.ViewModelKey
import com.rtbishop.look4sat.ui.SharedViewModel
import dagger.Binds
import dagger.Module
import dagger.multibindings.IntoMap
@Module
abstract class ViewModelModule {
@Binds
@IntoMap
@ViewModelKey(SharedViewModel::class)
abstract fun bindSharedViewModel(viewModel: SharedViewModel): ViewModel
@Binds
abstract fun bindViewModelFactory(factory: ViewModelFactory): ViewModelProvider.Factory
}
@@ -17,26 +17,29 @@
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
*/ */
package com.rtbishop.look4sat.dagger.modules package com.rtbishop.look4sat.di
import com.rtbishop.look4sat.repo.remote.TransmittersApi import com.rtbishop.look4sat.repo.remote.TransmittersApi
import dagger.Module import dagger.Module
import dagger.Provides import dagger.Provides
import dagger.hilt.InstallIn
import dagger.hilt.android.components.ActivityComponent
import dagger.hilt.android.scopes.ActivityScoped
import okhttp3.OkHttpClient import okhttp3.OkHttpClient
import retrofit2.Retrofit import retrofit2.Retrofit
import retrofit2.converter.moshi.MoshiConverterFactory import retrofit2.converter.moshi.MoshiConverterFactory
import javax.inject.Singleton
@Module @Module
@InstallIn(ActivityComponent::class)
class NetworkModule { class NetworkModule {
@Singleton @ActivityScoped
@Provides @Provides
fun provideWebClient(): OkHttpClient { fun provideWebClient(): OkHttpClient {
return OkHttpClient() return OkHttpClient()
} }
@Singleton @ActivityScoped
@Provides @Provides
fun provideTransApi(): TransmittersApi { fun provideTransApi(): TransmittersApi {
return Retrofit.Builder() return Retrofit.Builder()
@@ -17,7 +17,7 @@
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
*/ */
package com.rtbishop.look4sat.dagger.modules package com.rtbishop.look4sat.di
import android.content.Context import android.content.Context
import androidx.room.Room import androidx.room.Room
@@ -27,32 +27,36 @@ import com.rtbishop.look4sat.repo.local.SourcesDao
import com.rtbishop.look4sat.repo.local.TransmittersDao import com.rtbishop.look4sat.repo.local.TransmittersDao
import dagger.Module import dagger.Module
import dagger.Provides import dagger.Provides
import javax.inject.Singleton import dagger.hilt.InstallIn
import dagger.hilt.android.components.ActivityComponent
import dagger.hilt.android.qualifiers.ActivityContext
import dagger.hilt.android.scopes.ActivityScoped
@Module @Module
@InstallIn(ActivityComponent::class)
class PersistenceModule { class PersistenceModule {
@Singleton @ActivityScoped
@Provides @Provides
fun provideEntriesDao(db: SatelliteDb): EntriesDao { fun provideEntriesDao(db: SatelliteDb): EntriesDao {
return db.entriesDao() return db.entriesDao()
} }
@Singleton @ActivityScoped
@Provides @Provides
fun provideTransDao(db: SatelliteDb): TransmittersDao { fun provideTransDao(db: SatelliteDb): TransmittersDao {
return db.transmittersDao() return db.transmittersDao()
} }
@Singleton @ActivityScoped
@Provides @Provides
fun providesSourcesDao(db: SatelliteDb): SourcesDao { fun providesSourcesDao(db: SatelliteDb): SourcesDao {
return db.sourcesDao() return db.sourcesDao()
} }
@Singleton @ActivityScoped
@Provides @Provides
fun provideSatDb(context: Context): SatelliteDb { fun provideSatDb(@ActivityContext context: Context): SatelliteDb {
return Room.databaseBuilder(context, SatelliteDb::class.java, "satDb").build() return Room.databaseBuilder(context, SatelliteDb::class.java, "satDb").build()
} }
} }
@@ -0,0 +1,67 @@
/*
* Look4Sat. Amateur radio and weather satellite tracker and passes predictor for Android.
* Copyright (C) 2019, 2020 Arty Bishop (bishop.arty@gmail.com)
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License along
* with this program; if not, write to the Free Software Foundation, Inc.,
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
*/
package com.rtbishop.look4sat.di
import android.content.ContentResolver
import android.content.Context
import com.rtbishop.look4sat.repo.DefaultRepository
import com.rtbishop.look4sat.repo.Repository
import com.rtbishop.look4sat.repo.local.EntriesDao
import com.rtbishop.look4sat.repo.local.SourcesDao
import com.rtbishop.look4sat.repo.local.TransmittersDao
import com.rtbishop.look4sat.repo.remote.TransmittersApi
import dagger.Module
import dagger.Provides
import dagger.hilt.InstallIn
import dagger.hilt.android.components.ActivityComponent
import dagger.hilt.android.qualifiers.ActivityContext
import dagger.hilt.android.scopes.ActivityScoped
import okhttp3.OkHttpClient
@Module
@InstallIn(ActivityComponent::class)
class RepoModule {
@ActivityScoped
@Provides
fun provideContentResolver(@ActivityContext context: Context): ContentResolver {
return context.applicationContext.contentResolver
}
@ActivityScoped
@Provides
fun provideDefaultRepository(
resolver: ContentResolver,
client: OkHttpClient,
transmittersApi: TransmittersApi,
entriesDao: EntriesDao,
transmittersDao: TransmittersDao,
sourcesDao: SourcesDao
): Repository {
return DefaultRepository(
resolver,
client,
transmittersApi,
entriesDao,
sourcesDao,
transmittersDao
)
}
}
@@ -17,7 +17,7 @@
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
*/ */
package com.rtbishop.look4sat.dagger.modules package com.rtbishop.look4sat.di
import android.content.Context import android.content.Context
import android.content.SharedPreferences import android.content.SharedPreferences
@@ -26,24 +26,28 @@ import androidx.preference.PreferenceManager
import com.rtbishop.look4sat.utility.PrefsManager import com.rtbishop.look4sat.utility.PrefsManager
import dagger.Module import dagger.Module
import dagger.Provides import dagger.Provides
import javax.inject.Singleton import dagger.hilt.InstallIn
import dagger.hilt.android.components.ActivityComponent
import dagger.hilt.android.qualifiers.ActivityContext
import dagger.hilt.android.scopes.ActivityScoped
@Module @Module
@InstallIn(ActivityComponent::class)
class UtilityModule { class UtilityModule {
@Singleton @ActivityScoped
@Provides @Provides
fun provideSharedPreferences(context: Context): SharedPreferences { fun provideSharedPreferences(@ActivityContext context: Context): SharedPreferences {
return PreferenceManager.getDefaultSharedPreferences(context) return PreferenceManager.getDefaultSharedPreferences(context)
} }
@Singleton @ActivityScoped
@Provides @Provides
fun provideLocationManager(context: Context): LocationManager { fun provideLocationManager(@ActivityContext context: Context): LocationManager {
return context.getSystemService(Context.LOCATION_SERVICE) as LocationManager return context.getSystemService(Context.LOCATION_SERVICE) as LocationManager
} }
@Singleton @ActivityScoped
@Provides @Provides
fun providePrefsManager( fun providePrefsManager(
sharedPreferences: SharedPreferences, sharedPreferences: SharedPreferences,
@@ -1,4 +1,4 @@
package com.rtbishop.look4sat.ui package com.rtbishop.look4sat.ui.activities
import android.os.Bundle import android.os.Bundle
import androidx.appcompat.app.AppCompatActivity import androidx.appcompat.app.AppCompatActivity
@@ -6,7 +6,9 @@ import androidx.navigation.fragment.NavHostFragment
import androidx.navigation.ui.setupWithNavController import androidx.navigation.ui.setupWithNavController
import com.rtbishop.look4sat.R import com.rtbishop.look4sat.R
import com.rtbishop.look4sat.databinding.ActivityMainBinding import com.rtbishop.look4sat.databinding.ActivityMainBinding
import dagger.hilt.android.AndroidEntryPoint
@AndroidEntryPoint
class MainActivity : AppCompatActivity() { class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) { override fun onCreate(savedInstanceState: Bundle?) {
@@ -10,23 +10,19 @@ import androidx.fragment.app.activityViewModels
import androidx.navigation.findNavController import androidx.navigation.findNavController
import androidx.recyclerview.widget.DividerItemDecoration import androidx.recyclerview.widget.DividerItemDecoration
import androidx.recyclerview.widget.LinearLayoutManager import androidx.recyclerview.widget.LinearLayoutManager
import com.rtbishop.look4sat.Look4SatApp
import com.rtbishop.look4sat.R import com.rtbishop.look4sat.R
import com.rtbishop.look4sat.dagger.ViewModelFactory import com.rtbishop.look4sat.SharedViewModel
import com.rtbishop.look4sat.data.SatEntry import com.rtbishop.look4sat.data.SatEntry
import com.rtbishop.look4sat.data.TleSource import com.rtbishop.look4sat.data.TleSource
import com.rtbishop.look4sat.databinding.FragmentEntriesBinding import com.rtbishop.look4sat.databinding.FragmentEntriesBinding
import com.rtbishop.look4sat.ui.SharedViewModel
import com.rtbishop.look4sat.ui.adapters.EntriesAdapter import com.rtbishop.look4sat.ui.adapters.EntriesAdapter
import javax.inject.Inject import dagger.hilt.android.AndroidEntryPoint
@AndroidEntryPoint
class EntriesFragment : Fragment(R.layout.fragment_entries) { class EntriesFragment : Fragment(R.layout.fragment_entries) {
@Inject
lateinit var factory: ViewModelFactory
private lateinit var binding: FragmentEntriesBinding private lateinit var binding: FragmentEntriesBinding
private val viewModel: SharedViewModel by activityViewModels { factory } private val viewModel: SharedViewModel by activityViewModels()
private val pickFileReqCode = 100 private val pickFileReqCode = 100
private val entriesAdapter = EntriesAdapter() private val entriesAdapter = EntriesAdapter()
private var tleSources = listOf<TleSource>() private var tleSources = listOf<TleSource>()
@@ -34,7 +30,6 @@ class EntriesFragment : Fragment(R.layout.fragment_entries) {
override fun onViewCreated(view: View, savedInstanceState: Bundle?) { override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState) super.onViewCreated(view, savedInstanceState)
binding = FragmentEntriesBinding.bind(view) binding = FragmentEntriesBinding.bind(view)
(requireActivity().application as Look4SatApp).appComponent.inject(this)
setupComponents() setupComponents()
setupObservers() setupObservers()
} }
@@ -28,7 +28,9 @@ import androidx.fragment.app.Fragment
import com.rtbishop.look4sat.BuildConfig import com.rtbishop.look4sat.BuildConfig
import com.rtbishop.look4sat.R import com.rtbishop.look4sat.R
import com.rtbishop.look4sat.databinding.FragmentInfoBinding import com.rtbishop.look4sat.databinding.FragmentInfoBinding
import dagger.hilt.android.AndroidEntryPoint
@AndroidEntryPoint
class InfoFragment : Fragment(R.layout.fragment_info) { class InfoFragment : Fragment(R.layout.fragment_info) {
override fun onViewCreated(view: View, savedInstanceState: Bundle?) { override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
@@ -14,15 +14,14 @@ import androidx.fragment.app.activityViewModels
import androidx.lifecycle.lifecycleScope import androidx.lifecycle.lifecycleScope
import androidx.preference.PreferenceManager import androidx.preference.PreferenceManager
import com.github.amsacode.predict4java.GroundStationPosition import com.github.amsacode.predict4java.GroundStationPosition
import com.rtbishop.look4sat.Look4SatApp
import com.rtbishop.look4sat.R import com.rtbishop.look4sat.R
import com.rtbishop.look4sat.dagger.ViewModelFactory import com.rtbishop.look4sat.SharedViewModel
import com.rtbishop.look4sat.data.Result import com.rtbishop.look4sat.data.Result
import com.rtbishop.look4sat.data.SatItem import com.rtbishop.look4sat.data.SatItem
import com.rtbishop.look4sat.data.SatPass import com.rtbishop.look4sat.data.SatPass
import com.rtbishop.look4sat.databinding.FragmentMapBinding import com.rtbishop.look4sat.databinding.FragmentMapBinding
import com.rtbishop.look4sat.ui.SharedViewModel
import com.rtbishop.look4sat.utility.PrefsManager import com.rtbishop.look4sat.utility.PrefsManager
import dagger.hilt.android.AndroidEntryPoint
import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.delay import kotlinx.coroutines.delay
import kotlinx.coroutines.launch import kotlinx.coroutines.launch
@@ -40,11 +39,9 @@ import javax.inject.Inject
import kotlin.math.pow import kotlin.math.pow
import kotlin.math.sqrt import kotlin.math.sqrt
@AndroidEntryPoint
class MapFragment : Fragment(R.layout.fragment_map) { class MapFragment : Fragment(R.layout.fragment_map) {
@Inject
lateinit var factory: ViewModelFactory
@Inject @Inject
lateinit var prefsManager: PrefsManager lateinit var prefsManager: PrefsManager
@@ -54,13 +51,12 @@ class MapFragment : Fragment(R.layout.fragment_map) {
private lateinit var footprintPaint: Paint private lateinit var footprintPaint: Paint
private lateinit var selectedPass: SatPass private lateinit var selectedPass: SatPass
private val dateNow = Date(System.currentTimeMillis()) private val dateNow = Date(System.currentTimeMillis())
private val viewModel: SharedViewModel by activityViewModels { factory } private val viewModel: SharedViewModel by activityViewModels()
override fun onViewCreated(view: View, savedInstanceState: Bundle?) { override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState) super.onViewCreated(view, savedInstanceState)
binding = FragmentMapBinding.bind(view) binding = FragmentMapBinding.bind(view)
mainActivity = requireActivity() mainActivity = requireActivity()
(mainActivity.application as Look4SatApp).appComponent.inject(this)
val prefs = PreferenceManager.getDefaultSharedPreferences(mainActivity.applicationContext) val prefs = PreferenceManager.getDefaultSharedPreferences(mainActivity.applicationContext)
Configuration.getInstance().load(mainActivity.applicationContext, prefs) Configuration.getInstance().load(mainActivity.applicationContext, prefs)
@@ -29,26 +29,23 @@ import androidx.fragment.app.Fragment
import androidx.fragment.app.activityViewModels import androidx.fragment.app.activityViewModels
import androidx.recyclerview.widget.LinearLayoutManager import androidx.recyclerview.widget.LinearLayoutManager
import androidx.recyclerview.widget.SimpleItemAnimator import androidx.recyclerview.widget.SimpleItemAnimator
import com.rtbishop.look4sat.Look4SatApp
import com.rtbishop.look4sat.R import com.rtbishop.look4sat.R
import com.rtbishop.look4sat.dagger.ViewModelFactory import com.rtbishop.look4sat.SharedViewModel
import com.rtbishop.look4sat.data.Result import com.rtbishop.look4sat.data.Result
import com.rtbishop.look4sat.data.SatPass import com.rtbishop.look4sat.data.SatPass
import com.rtbishop.look4sat.databinding.FragmentPassesBinding import com.rtbishop.look4sat.databinding.FragmentPassesBinding
import com.rtbishop.look4sat.ui.SharedViewModel
import com.rtbishop.look4sat.ui.adapters.PassesAdapter import com.rtbishop.look4sat.ui.adapters.PassesAdapter
import com.rtbishop.look4sat.utility.PrefsManager import com.rtbishop.look4sat.utility.PrefsManager
import com.rtbishop.look4sat.utility.Utilities import com.rtbishop.look4sat.utility.Utilities
import com.rtbishop.look4sat.utility.Utilities.getRotationAnimator import com.rtbishop.look4sat.utility.Utilities.getRotationAnimator
import com.rtbishop.look4sat.utility.Utilities.snack import com.rtbishop.look4sat.utility.Utilities.snack
import dagger.hilt.android.AndroidEntryPoint
import java.util.* import java.util.*
import javax.inject.Inject import javax.inject.Inject
@AndroidEntryPoint
class PassesFragment : Fragment(R.layout.fragment_passes) { class PassesFragment : Fragment(R.layout.fragment_passes) {
@Inject
lateinit var factory: ViewModelFactory
@Inject @Inject
lateinit var prefsManager: PrefsManager lateinit var prefsManager: PrefsManager
@@ -56,14 +53,13 @@ class PassesFragment : Fragment(R.layout.fragment_passes) {
private lateinit var binding: FragmentPassesBinding private lateinit var binding: FragmentPassesBinding
private lateinit var animator: ObjectAnimator private lateinit var animator: ObjectAnimator
private lateinit var passesAdapter: PassesAdapter private lateinit var passesAdapter: PassesAdapter
private val viewModel: SharedViewModel by activityViewModels { factory } private val viewModel: SharedViewModel by activityViewModels()
private var isTimerSet: Boolean = false private var isTimerSet: Boolean = false
private var passes = mutableListOf<SatPass>() private var passes = mutableListOf<SatPass>()
override fun onViewCreated(view: View, savedInstanceState: Bundle?) { override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState) super.onViewCreated(view, savedInstanceState)
binding = FragmentPassesBinding.bind(view) binding = FragmentPassesBinding.bind(view)
(requireActivity().application as Look4SatApp).appComponent.inject(this)
setupComponents() setupComponents()
setupObservers() setupObservers()
} }
@@ -29,27 +29,24 @@ import androidx.fragment.app.activityViewModels
import androidx.lifecycle.lifecycleScope import androidx.lifecycle.lifecycleScope
import androidx.navigation.fragment.navArgs import androidx.navigation.fragment.navArgs
import androidx.recyclerview.widget.LinearLayoutManager import androidx.recyclerview.widget.LinearLayoutManager
import com.rtbishop.look4sat.Look4SatApp
import com.rtbishop.look4sat.R import com.rtbishop.look4sat.R
import com.rtbishop.look4sat.dagger.ViewModelFactory import com.rtbishop.look4sat.SharedViewModel
import com.rtbishop.look4sat.data.Result import com.rtbishop.look4sat.data.Result
import com.rtbishop.look4sat.data.SatPass import com.rtbishop.look4sat.data.SatPass
import com.rtbishop.look4sat.databinding.FragmentPolarBinding import com.rtbishop.look4sat.databinding.FragmentPolarBinding
import com.rtbishop.look4sat.ui.SharedViewModel
import com.rtbishop.look4sat.ui.adapters.TransAdapter import com.rtbishop.look4sat.ui.adapters.TransAdapter
import com.rtbishop.look4sat.ui.views.PolarView import com.rtbishop.look4sat.ui.views.PolarView
import com.rtbishop.look4sat.utility.PrefsManager import com.rtbishop.look4sat.utility.PrefsManager
import dagger.hilt.android.AndroidEntryPoint
import kotlinx.coroutines.delay import kotlinx.coroutines.delay
import kotlinx.coroutines.launch import kotlinx.coroutines.launch
import java.util.* import java.util.*
import javax.inject.Inject import javax.inject.Inject
import kotlin.math.round import kotlin.math.round
@AndroidEntryPoint
class PolarFragment : Fragment(R.layout.fragment_polar), SensorEventListener { class PolarFragment : Fragment(R.layout.fragment_polar), SensorEventListener {
@Inject
lateinit var factory: ViewModelFactory
@Inject @Inject
lateinit var prefsManager: PrefsManager lateinit var prefsManager: PrefsManager
@@ -57,7 +54,7 @@ class PolarFragment : Fragment(R.layout.fragment_polar), SensorEventListener {
private lateinit var binding: FragmentPolarBinding private lateinit var binding: FragmentPolarBinding
private lateinit var satPass: SatPass private lateinit var satPass: SatPass
private lateinit var sensorManager: SensorManager private lateinit var sensorManager: SensorManager
private val viewModel: SharedViewModel by activityViewModels { factory } private val viewModel: SharedViewModel by activityViewModels()
private val args: PolarFragmentArgs by navArgs() private val args: PolarFragmentArgs by navArgs()
private val transmitterAdapter = TransAdapter() private val transmitterAdapter = TransAdapter()
private var magneticDeclination = 0f private var magneticDeclination = 0f
@@ -67,7 +64,6 @@ class PolarFragment : Fragment(R.layout.fragment_polar), SensorEventListener {
super.onViewCreated(view, savedInstanceState) super.onViewCreated(view, savedInstanceState)
mainActivity = requireActivity() mainActivity = requireActivity()
binding = FragmentPolarBinding.bind(view) binding = FragmentPolarBinding.bind(view)
(mainActivity.application as Look4SatApp).appComponent.inject(this)
sensorManager = mainActivity.getSystemService(Context.SENSOR_SERVICE) as SensorManager sensorManager = mainActivity.getSystemService(Context.SENSOR_SERVICE) as SensorManager
binding.recycler.apply { binding.recycler.apply {
layoutManager = LinearLayoutManager(mainActivity) layoutManager = LinearLayoutManager(mainActivity)
@@ -27,7 +27,9 @@ import androidx.preference.PreferenceFragmentCompat
import com.rtbishop.look4sat.R import com.rtbishop.look4sat.R
import com.rtbishop.look4sat.utility.PrefsManager import com.rtbishop.look4sat.utility.PrefsManager
import com.rtbishop.look4sat.utility.Utilities.snack import com.rtbishop.look4sat.utility.Utilities.snack
import dagger.hilt.android.AndroidEntryPoint
@AndroidEntryPoint
class PrefsFragment : PreferenceFragmentCompat(), class PrefsFragment : PreferenceFragmentCompat(),
SharedPreferences.OnSharedPreferenceChangeListener { SharedPreferences.OnSharedPreferenceChangeListener {
@@ -24,11 +24,13 @@ import android.os.Bundle
import android.view.ViewGroup import android.view.ViewGroup
import androidx.appcompat.app.AppCompatDialogFragment import androidx.appcompat.app.AppCompatDialogFragment
import androidx.recyclerview.widget.LinearLayoutManager import androidx.recyclerview.widget.LinearLayoutManager
import com.rtbishop.look4sat.SharedViewModel
import com.rtbishop.look4sat.data.TleSource import com.rtbishop.look4sat.data.TleSource
import com.rtbishop.look4sat.databinding.DialogSourcesBinding import com.rtbishop.look4sat.databinding.DialogSourcesBinding
import com.rtbishop.look4sat.ui.SharedViewModel
import com.rtbishop.look4sat.ui.adapters.SourcesAdapter import com.rtbishop.look4sat.ui.adapters.SourcesAdapter
import dagger.hilt.android.AndroidEntryPoint
@AndroidEntryPoint
class SourcesDialog(sources: List<TleSource>, private val viewModel: SharedViewModel) : class SourcesDialog(sources: List<TleSource>, private val viewModel: SharedViewModel) :
AppCompatDialogFragment() { AppCompatDialogFragment() {
+3 -1
View File
@@ -28,7 +28,8 @@ buildscript {
navigation_version = '2.3.0' navigation_version = '2.3.0'
lifecycle_version = '2.2.0' lifecycle_version = '2.2.0'
room_version = '2.2.5' room_version = '2.2.5'
dagger_version = '2.29.1' hilt_version = '2.29.1-alpha'
hilt_viewmodel_version = '1.0.0-alpha02'
retrofit_version = '2.9.0' retrofit_version = '2.9.0'
openStreetMap_version = '6.1.8' openStreetMap_version = '6.1.8'
predict4java_version = '1.3.1' predict4java_version = '1.3.1'
@@ -39,6 +40,7 @@ buildscript {
} }
dependencies { dependencies {
classpath "com.android.tools.build:gradle:$gradle_version" classpath "com.android.tools.build:gradle:$gradle_version"
classpath "com.google.dagger:hilt-android-gradle-plugin:$hilt_version"
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$gradle_plugin_version" classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$gradle_plugin_version"
classpath "androidx.navigation:navigation-safe-args-gradle-plugin:$navigation_version" classpath "androidx.navigation:navigation-safe-args-gradle-plugin:$navigation_version"
} }