diff --git a/app/build.gradle b/app/build.gradle index e42dc8ce..205ab162 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -64,7 +64,6 @@ dependencies { implementation fileTree(dir: 'libs', include: ['*.jar']) implementation "com.google.android.material:material:$material_version" implementation "androidx.appcompat:appcompat:$app_compat_version" - implementation "androidx.legacy:legacy-support-v4:$support_lib_version" implementation "androidx.constraintlayout:constraintlayout:$constraint_layout_version" implementation "androidx.core:core-ktx:$ktx_version" implementation "androidx.preference:preference:$preference_version" diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 7b35f156..35da8305 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -32,19 +32,9 @@ android:icon="@mipmap/ic_launcher" android:label="@string/app_name" android:theme="@style/AppTheme"> - - - - - - - diff --git a/app/src/main/java/com/rtbishop/look4sat/dagger/AppComponent.kt b/app/src/main/java/com/rtbishop/look4sat/dagger/AppComponent.kt index 815359e9..07928430 100644 --- a/app/src/main/java/com/rtbishop/look4sat/dagger/AppComponent.kt +++ b/app/src/main/java/com/rtbishop/look4sat/dagger/AppComponent.kt @@ -23,7 +23,6 @@ import android.content.Context import com.rtbishop.look4sat.dagger.modules.* import com.rtbishop.look4sat.ui.MainActivity import com.rtbishop.look4sat.ui.fragments.MapOsmFragment -import com.rtbishop.look4sat.ui.fragments.MapViewFragment import com.rtbishop.look4sat.ui.fragments.PassListFragment import com.rtbishop.look4sat.ui.fragments.PolarViewFragment import dagger.BindsInstance @@ -43,7 +42,6 @@ interface AppComponent { } fun inject(mainActivity: MainActivity) - fun inject(mapViewFragment: MapViewFragment) fun inject(passListFragment: PassListFragment) fun inject(polarViewFragment: PolarViewFragment) fun inject(mapOsmFragment: MapOsmFragment) diff --git a/app/src/main/java/com/rtbishop/look4sat/dagger/modules/NetworkModule.kt b/app/src/main/java/com/rtbishop/look4sat/dagger/modules/NetworkModule.kt index 06052ea0..ddc62ec9 100644 --- a/app/src/main/java/com/rtbishop/look4sat/dagger/modules/NetworkModule.kt +++ b/app/src/main/java/com/rtbishop/look4sat/dagger/modules/NetworkModule.kt @@ -19,9 +19,7 @@ package com.rtbishop.look4sat.dagger.modules -import com.rtbishop.look4sat.network.RemoteDataSource -import com.rtbishop.look4sat.network.RemoteSource -import com.rtbishop.look4sat.network.TransmittersApi +import com.rtbishop.look4sat.repo.api.TransmittersApi import dagger.Module import dagger.Provides import okhttp3.OkHttpClient @@ -38,12 +36,6 @@ class NetworkModule { return OkHttpClient() } - @Singleton - @Provides - fun provideRemoteDataSource(api: TransmittersApi, client: OkHttpClient): RemoteSource { - return RemoteDataSource(api, client) - } - @Singleton @Provides fun provideTransmittersApi(): TransmittersApi { diff --git a/app/src/main/java/com/rtbishop/look4sat/dagger/modules/PersistenceModule.kt b/app/src/main/java/com/rtbishop/look4sat/dagger/modules/PersistenceModule.kt index a92943a8..c74f2098 100644 --- a/app/src/main/java/com/rtbishop/look4sat/dagger/modules/PersistenceModule.kt +++ b/app/src/main/java/com/rtbishop/look4sat/dagger/modules/PersistenceModule.kt @@ -21,12 +21,10 @@ package com.rtbishop.look4sat.dagger.modules import android.content.Context import androidx.room.Room -import com.rtbishop.look4sat.persistence.LocalDataSource -import com.rtbishop.look4sat.persistence.LocalSource -import com.rtbishop.look4sat.persistence.SatelliteDb -import com.rtbishop.look4sat.persistence.dao.EntriesDao -import com.rtbishop.look4sat.persistence.dao.SourcesDao -import com.rtbishop.look4sat.persistence.dao.TransmittersDao +import com.rtbishop.look4sat.repo.SatelliteDb +import com.rtbishop.look4sat.repo.dao.EntriesDao +import com.rtbishop.look4sat.repo.dao.SourcesDao +import com.rtbishop.look4sat.repo.dao.TransmittersDao import dagger.Module import dagger.Provides import javax.inject.Singleton @@ -52,16 +50,6 @@ class PersistenceModule { return db.sourcesDao() } - @Singleton - @Provides - fun provideLocalDataSource( - entriesDao: EntriesDao, - transmittersDao: TransmittersDao, - sourcesDao: SourcesDao - ): LocalSource { - return LocalDataSource(entriesDao, transmittersDao, sourcesDao) - } - @Singleton @Provides fun provideSatelliteDb(context: Context): SatelliteDb { diff --git a/app/src/main/java/com/rtbishop/look4sat/dagger/modules/RepoModule.kt b/app/src/main/java/com/rtbishop/look4sat/dagger/modules/RepoModule.kt index 8cbe6b73..51e97c82 100644 --- a/app/src/main/java/com/rtbishop/look4sat/dagger/modules/RepoModule.kt +++ b/app/src/main/java/com/rtbishop/look4sat/dagger/modules/RepoModule.kt @@ -2,12 +2,15 @@ package com.rtbishop.look4sat.dagger.modules import android.content.ContentResolver import android.content.Context -import com.rtbishop.look4sat.network.RemoteSource -import com.rtbishop.look4sat.persistence.LocalSource import com.rtbishop.look4sat.repo.DefaultRepository import com.rtbishop.look4sat.repo.Repository +import com.rtbishop.look4sat.repo.api.TransmittersApi +import com.rtbishop.look4sat.repo.dao.EntriesDao +import com.rtbishop.look4sat.repo.dao.SourcesDao +import com.rtbishop.look4sat.repo.dao.TransmittersDao import dagger.Module import dagger.Provides +import okhttp3.OkHttpClient import javax.inject.Singleton @Module @@ -23,9 +26,19 @@ class RepoModule { @Provides fun provideDefaultRepository( resolver: ContentResolver, - localSource: LocalSource, - remoteSource: RemoteSource + transmittersApi: TransmittersApi, + client: OkHttpClient, + entriesDao: EntriesDao, + transmittersDao: TransmittersDao, + sourcesDao: SourcesDao ): Repository { - return DefaultRepository(resolver, localSource, remoteSource) + return DefaultRepository( + resolver, + client, + transmittersApi, + entriesDao, + sourcesDao, + transmittersDao + ) } } diff --git a/app/src/main/java/com/rtbishop/look4sat/network/RemoteDataSource.kt b/app/src/main/java/com/rtbishop/look4sat/network/RemoteDataSource.kt deleted file mode 100644 index bec3cab6..00000000 --- a/app/src/main/java/com/rtbishop/look4sat/network/RemoteDataSource.kt +++ /dev/null @@ -1,53 +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.network - -import android.util.Log -import com.rtbishop.look4sat.data.TleSource -import com.rtbishop.look4sat.data.Transmitter -import kotlinx.coroutines.Dispatchers -import kotlinx.coroutines.withContext -import okhttp3.OkHttpClient -import okhttp3.Request -import java.io.InputStream -import javax.inject.Inject - -class RemoteDataSource @Inject constructor( - private val api: TransmittersApi, - private val client: OkHttpClient -) : RemoteSource { - - override suspend fun fetchTleStreams(urlList: List): List { - val streams = mutableListOf() - withContext(Dispatchers.IO) { - urlList.withIndex().forEach { - val request = Request.Builder().url(it.value.url).build() - val stream = client.newCall(request).execute().body?.byteStream() - stream?.let { inputStream -> streams.add(inputStream) } - } - } - Log.d("myTag", urlList.toString()) - return streams - } - - override suspend fun fetchTransmitters(): List { - return api.fetchTransmitters() - } -} diff --git a/app/src/main/java/com/rtbishop/look4sat/network/RemoteSource.kt b/app/src/main/java/com/rtbishop/look4sat/network/RemoteSource.kt deleted file mode 100644 index 840d6eeb..00000000 --- a/app/src/main/java/com/rtbishop/look4sat/network/RemoteSource.kt +++ /dev/null @@ -1,12 +0,0 @@ -package com.rtbishop.look4sat.network - -import com.rtbishop.look4sat.data.TleSource -import com.rtbishop.look4sat.data.Transmitter -import java.io.InputStream - -interface RemoteSource { - - suspend fun fetchTleStreams(urlList: List): List - - suspend fun fetchTransmitters(): List -} diff --git a/app/src/main/java/com/rtbishop/look4sat/persistence/LocalDataSource.kt b/app/src/main/java/com/rtbishop/look4sat/persistence/LocalDataSource.kt deleted file mode 100644 index ec92e7e0..00000000 --- a/app/src/main/java/com/rtbishop/look4sat/persistence/LocalDataSource.kt +++ /dev/null @@ -1,84 +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.persistence - -import com.rtbishop.look4sat.data.SatEntry -import com.rtbishop.look4sat.data.TleSource -import com.rtbishop.look4sat.data.Transmitter -import com.rtbishop.look4sat.persistence.dao.EntriesDao -import com.rtbishop.look4sat.persistence.dao.SourcesDao -import com.rtbishop.look4sat.persistence.dao.TransmittersDao -import javax.inject.Inject - -class LocalDataSource @Inject constructor( - private val entriesDao: EntriesDao, - private val transmittersDao: TransmittersDao, - private val sourcesDao: SourcesDao -) : LocalSource { - - override suspend fun insertEntries(entries: List) { - entriesDao.insertEntries(entries) - } - - override suspend fun getAllEntries(): List { - return entriesDao.getAllEntries() - } - - override suspend fun getSelectedEntries(): List { - return entriesDao.getSelectedEntries() - } - - override suspend fun updateEntriesSelection(catNumList: List) { - entriesDao.clearEntriesSelection() - catNumList.forEach { entriesDao.updateEntrySelection(it) } - } - - override suspend fun clearEntries() { - entriesDao.clearEntries() - } - - //////////////////////////////////////////////////////////////////////////////////////////////// - - override suspend fun insertTransmitters(transmitters: List) { - transmittersDao.insertTransmitters(transmitters) - } - - override suspend fun getTransmittersByCatNum(catNum: Int): List { - return transmittersDao.getTransmittersByCatNum(catNum) - } - - override suspend fun clearTransmitters() { - transmittersDao.clearTransmitters() - } - - //////////////////////////////////////////////////////////////////////////////////////////////// - - override suspend fun insertSources(sources: List) { - sourcesDao.insertSources(sources) - } - - override suspend fun getSources(): List { - return sourcesDao.getSources() - } - - override suspend fun clearSources() { - sourcesDao.clearSources() - } -} diff --git a/app/src/main/java/com/rtbishop/look4sat/persistence/LocalSource.kt b/app/src/main/java/com/rtbishop/look4sat/persistence/LocalSource.kt deleted file mode 100644 index f10d8876..00000000 --- a/app/src/main/java/com/rtbishop/look4sat/persistence/LocalSource.kt +++ /dev/null @@ -1,34 +0,0 @@ -package com.rtbishop.look4sat.persistence - -import com.rtbishop.look4sat.data.SatEntry -import com.rtbishop.look4sat.data.TleSource -import com.rtbishop.look4sat.data.Transmitter - -interface LocalSource { - - suspend fun insertEntries(entries: List) - - suspend fun getAllEntries(): List - - suspend fun getSelectedEntries(): List - - suspend fun updateEntriesSelection(catNumList: List) - - suspend fun clearEntries() - - //////////////////////////////////////////////////////////////////////////////////////////////// - - suspend fun insertTransmitters(transmitters: List) - - suspend fun getTransmittersByCatNum(catNum: Int): List - - suspend fun clearTransmitters() - - //////////////////////////////////////////////////////////////////////////////////////////////// - - suspend fun insertSources(sources: List) - - suspend fun getSources(): List - - suspend fun clearSources() -} diff --git a/app/src/main/java/com/rtbishop/look4sat/repo/DefaultRepository.kt b/app/src/main/java/com/rtbishop/look4sat/repo/DefaultRepository.kt index ed91fae7..6065999c 100644 --- a/app/src/main/java/com/rtbishop/look4sat/repo/DefaultRepository.kt +++ b/app/src/main/java/com/rtbishop/look4sat/repo/DefaultRepository.kt @@ -25,16 +25,24 @@ import com.github.amsacode.predict4java.TLE import com.rtbishop.look4sat.data.SatEntry import com.rtbishop.look4sat.data.TleSource import com.rtbishop.look4sat.data.Transmitter -import com.rtbishop.look4sat.network.RemoteSource -import com.rtbishop.look4sat.persistence.LocalSource +import com.rtbishop.look4sat.repo.api.TransmittersApi +import com.rtbishop.look4sat.repo.dao.EntriesDao +import com.rtbishop.look4sat.repo.dao.SourcesDao +import com.rtbishop.look4sat.repo.dao.TransmittersDao import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.withContext +import okhttp3.OkHttpClient +import okhttp3.Request +import java.io.InputStream import javax.inject.Inject class DefaultRepository @Inject constructor( private val resolver: ContentResolver, - private val localSource: LocalSource, - private val remoteSource: RemoteSource + private val client: OkHttpClient, + private val api: TransmittersApi, + private val entriesDao: EntriesDao, + private val sourcesDao: SourcesDao, + private val transmittersDao: TransmittersDao ) : Repository { override suspend fun updateEntriesFromFile(tleUri: Uri) { @@ -42,56 +50,88 @@ class DefaultRepository @Inject constructor( resolver.openInputStream(tleUri)?.use { stream -> val tleList = TLE.importSat(stream) val entries = tleList.map { SatEntry(it) } - localSource.clearEntries() - localSource.insertEntries(entries) + clearEntries() + insertEntries(entries) } } } override suspend fun updateEntriesFromUrl(urlList: List) { withContext(Dispatchers.IO) { - val streams = remoteSource.fetchTleStreams(urlList) + val streams = fetchTleStreams(urlList) val entries = mutableListOf() streams.forEach { val list = TLE.importSat(it).map { tle -> SatEntry(tle) } entries.addAll(list) } - localSource.clearEntries() - localSource.insertEntries(entries) + clearEntries() + insertEntries(entries) } } + //////////////////////////////////////////////////////////////////////////////////////////////// + + override suspend fun fetchTleStreams(urlList: List): List = + withContext(Dispatchers.IO) { + val streams = mutableListOf() + urlList.withIndex().forEach { + val request = Request.Builder().url(it.value.url).build() + val stream = client.newCall(request).execute().body?.byteStream() + stream?.let { inputStream -> streams.add(inputStream) } + } + return@withContext streams + } + + override suspend fun fetchTransmitters(): List { + return api.fetchTransmitters() + } + + override suspend fun insertEntries(entries: List) { + entriesDao.insertEntries(entries) + } + override suspend fun getAllEntries(): List { - return localSource.getAllEntries() + return entriesDao.getAllEntries() } override suspend fun getSelectedEntries(): List { - return localSource.getSelectedEntries() + return entriesDao.getSelectedEntries() } override suspend fun updateEntriesSelection(catNumList: List) { - localSource.updateEntriesSelection(catNumList) + entriesDao.clearEntriesSelection() + catNumList.forEach { entriesDao.updateEntrySelection(it) } + } + + override suspend fun clearEntries() { + entriesDao.clearEntries() } //////////////////////////////////////////////////////////////////////////////////////////////// override suspend fun updateTransmitters() { - localSource.clearTransmitters() - localSource.insertTransmitters(remoteSource.fetchTransmitters()) } override suspend fun getTransmittersByCatNum(catNum: Int): List { - return localSource.getTransmittersByCatNum(catNum) + return transmittersDao.getTransmittersByCatNum(catNum) + } + + override suspend fun clearTransmitters() { + transmittersDao.clearTransmitters() } //////////////////////////////////////////////////////////////////////////////////////////////// override suspend fun updateSources(sources: List) { - localSource.clearSources() - localSource.insertSources(sources) + clearSources() + sourcesDao.insertSources(sources) } override suspend fun getSources(): List { - return localSource.getSources() + return sourcesDao.getSources() + } + + override suspend fun clearSources() { + sourcesDao.clearSources() } } diff --git a/app/src/main/java/com/rtbishop/look4sat/repo/Repository.kt b/app/src/main/java/com/rtbishop/look4sat/repo/Repository.kt index b92fe4e2..13d04ad8 100644 --- a/app/src/main/java/com/rtbishop/look4sat/repo/Repository.kt +++ b/app/src/main/java/com/rtbishop/look4sat/repo/Repository.kt @@ -4,6 +4,7 @@ import android.net.Uri import com.rtbishop.look4sat.data.SatEntry import com.rtbishop.look4sat.data.TleSource import com.rtbishop.look4sat.data.Transmitter +import java.io.InputStream interface Repository { @@ -11,21 +12,35 @@ interface Repository { suspend fun updateEntriesFromUrl(urlList: List) + //////////////////////////////////////////////////////////////////////////////////////////////// + + suspend fun fetchTleStreams(urlList: List): List + + suspend fun fetchTransmitters(): List + + suspend fun insertEntries(entries: List) + suspend fun getAllEntries(): List suspend fun getSelectedEntries(): List suspend fun updateEntriesSelection(catNumList: List) + suspend fun clearEntries() + //////////////////////////////////////////////////////////////////////////////////////////////// suspend fun updateTransmitters() suspend fun getTransmittersByCatNum(catNum: Int): List + suspend fun clearTransmitters() + //////////////////////////////////////////////////////////////////////////////////////////////// suspend fun updateSources(sources: List) suspend fun getSources(): List + + suspend fun clearSources() } diff --git a/app/src/main/java/com/rtbishop/look4sat/persistence/SatelliteDb.kt b/app/src/main/java/com/rtbishop/look4sat/repo/SatelliteDb.kt similarity index 87% rename from app/src/main/java/com/rtbishop/look4sat/persistence/SatelliteDb.kt rename to app/src/main/java/com/rtbishop/look4sat/repo/SatelliteDb.kt index 76250183..d54e0038 100644 --- a/app/src/main/java/com/rtbishop/look4sat/persistence/SatelliteDb.kt +++ b/app/src/main/java/com/rtbishop/look4sat/repo/SatelliteDb.kt @@ -17,7 +17,7 @@ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ -package com.rtbishop.look4sat.persistence +package com.rtbishop.look4sat.repo import androidx.room.Database import androidx.room.RoomDatabase @@ -25,9 +25,9 @@ import androidx.room.TypeConverters import com.rtbishop.look4sat.data.SatEntry import com.rtbishop.look4sat.data.TleSource import com.rtbishop.look4sat.data.Transmitter -import com.rtbishop.look4sat.persistence.dao.EntriesDao -import com.rtbishop.look4sat.persistence.dao.SourcesDao -import com.rtbishop.look4sat.persistence.dao.TransmittersDao +import com.rtbishop.look4sat.repo.dao.EntriesDao +import com.rtbishop.look4sat.repo.dao.SourcesDao +import com.rtbishop.look4sat.repo.dao.TransmittersDao import com.rtbishop.look4sat.utility.Converters @Database( diff --git a/app/src/main/java/com/rtbishop/look4sat/network/TransmittersApi.kt b/app/src/main/java/com/rtbishop/look4sat/repo/api/TransmittersApi.kt similarity index 96% rename from app/src/main/java/com/rtbishop/look4sat/network/TransmittersApi.kt rename to app/src/main/java/com/rtbishop/look4sat/repo/api/TransmittersApi.kt index a0abc5b6..f98f87c9 100644 --- a/app/src/main/java/com/rtbishop/look4sat/network/TransmittersApi.kt +++ b/app/src/main/java/com/rtbishop/look4sat/repo/api/TransmittersApi.kt @@ -17,7 +17,7 @@ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ -package com.rtbishop.look4sat.network +package com.rtbishop.look4sat.repo.api import com.rtbishop.look4sat.data.Transmitter import retrofit2.http.GET diff --git a/app/src/main/java/com/rtbishop/look4sat/persistence/dao/EntriesDao.kt b/app/src/main/java/com/rtbishop/look4sat/repo/dao/EntriesDao.kt similarity index 97% rename from app/src/main/java/com/rtbishop/look4sat/persistence/dao/EntriesDao.kt rename to app/src/main/java/com/rtbishop/look4sat/repo/dao/EntriesDao.kt index 98f12c2b..54b72914 100644 --- a/app/src/main/java/com/rtbishop/look4sat/persistence/dao/EntriesDao.kt +++ b/app/src/main/java/com/rtbishop/look4sat/repo/dao/EntriesDao.kt @@ -17,7 +17,7 @@ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ -package com.rtbishop.look4sat.persistence.dao +package com.rtbishop.look4sat.repo.dao import androidx.room.Dao import androidx.room.Insert diff --git a/app/src/main/java/com/rtbishop/look4sat/persistence/dao/SourcesDao.kt b/app/src/main/java/com/rtbishop/look4sat/repo/dao/SourcesDao.kt similarity index 90% rename from app/src/main/java/com/rtbishop/look4sat/persistence/dao/SourcesDao.kt rename to app/src/main/java/com/rtbishop/look4sat/repo/dao/SourcesDao.kt index 7a3a9777..c0b8d099 100644 --- a/app/src/main/java/com/rtbishop/look4sat/persistence/dao/SourcesDao.kt +++ b/app/src/main/java/com/rtbishop/look4sat/repo/dao/SourcesDao.kt @@ -1,4 +1,4 @@ -package com.rtbishop.look4sat.persistence.dao +package com.rtbishop.look4sat.repo.dao import androidx.room.Dao import androidx.room.Insert diff --git a/app/src/main/java/com/rtbishop/look4sat/persistence/dao/TransmittersDao.kt b/app/src/main/java/com/rtbishop/look4sat/repo/dao/TransmittersDao.kt similarity index 92% rename from app/src/main/java/com/rtbishop/look4sat/persistence/dao/TransmittersDao.kt rename to app/src/main/java/com/rtbishop/look4sat/repo/dao/TransmittersDao.kt index eb64d883..913ec579 100644 --- a/app/src/main/java/com/rtbishop/look4sat/persistence/dao/TransmittersDao.kt +++ b/app/src/main/java/com/rtbishop/look4sat/repo/dao/TransmittersDao.kt @@ -1,4 +1,4 @@ -package com.rtbishop.look4sat.persistence.dao +package com.rtbishop.look4sat.repo.dao import androidx.room.Dao import androidx.room.Insert diff --git a/app/src/main/java/com/rtbishop/look4sat/ui/MainActivity.kt b/app/src/main/java/com/rtbishop/look4sat/ui/MainActivity.kt index 2cd1a7c2..d97f3e98 100644 --- a/app/src/main/java/com/rtbishop/look4sat/ui/MainActivity.kt +++ b/app/src/main/java/com/rtbishop/look4sat/ui/MainActivity.kt @@ -1,221 +1,84 @@ -/* - * 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.ui -import android.Manifest -import android.annotation.SuppressLint -import android.content.Context -import android.content.Intent -import android.content.pm.ActivityInfo -import android.content.pm.PackageManager -import android.net.Uri import android.os.Bundle -import android.view.View import android.view.WindowManager import androidx.appcompat.app.AppCompatActivity -import androidx.core.app.ActivityCompat -import androidx.lifecycle.ViewModelProvider -import androidx.lifecycle.lifecycleScope -import androidx.navigation.findNavController -import androidx.navigation.ui.AppBarConfiguration -import androidx.navigation.ui.navigateUp -import androidx.navigation.ui.setupActionBarWithNavController +import androidx.navigation.fragment.NavHostFragment import androidx.navigation.ui.setupWithNavController -import com.rtbishop.look4sat.Look4SatApp import com.rtbishop.look4sat.R -import com.rtbishop.look4sat.dagger.ViewModelFactory -import com.rtbishop.look4sat.data.Result -import com.rtbishop.look4sat.data.TleSource import com.rtbishop.look4sat.databinding.ActivityMainBinding -import com.rtbishop.look4sat.databinding.DrawerHeaderBinding -import com.rtbishop.look4sat.ui.fragments.TleSourcesDialogFragment -import com.rtbishop.look4sat.utility.Extensions.toast -import kotlinx.coroutines.delay -import kotlinx.coroutines.launch -import javax.inject.Inject -class MainActivity : AppCompatActivity(), TleSourcesDialogFragment.SourcesSubmitListener { +class MainActivity : AppCompatActivity() { - private val pickFileReqCode = 1001 - private val permissionsReqCode = 1000 - private val permissions = arrayOf( - Manifest.permission.ACCESS_FINE_LOCATION, - Manifest.permission.READ_EXTERNAL_STORAGE, - Manifest.permission.WRITE_EXTERNAL_STORAGE - ) - - @Inject - lateinit var viewModelFactory: ViewModelFactory - private lateinit var viewModel: SharedViewModel - private lateinit var mainBinding: ActivityMainBinding - private lateinit var drawerBinding: DrawerHeaderBinding - private lateinit var appBarConfig: AppBarConfiguration +// private val pickFileReqCode = 1001 +// private val permissionsReqCode = 1000 +// private val permissions = arrayOf( +// Manifest.permission.ACCESS_FINE_LOCATION, +// Manifest.permission.READ_EXTERNAL_STORAGE, +// Manifest.permission.WRITE_EXTERNAL_STORAGE +// ) override fun onCreate(savedInstanceState: Bundle?) { setTheme(R.style.AppTheme) super.onCreate(savedInstanceState) - - mainBinding = ActivityMainBinding.inflate(layoutInflater) - drawerBinding = DrawerHeaderBinding.inflate(layoutInflater, mainBinding.navView, true) - setContentView(mainBinding.root) + val binding = ActivityMainBinding.inflate(layoutInflater) + setContentView(binding.root) + val navHost = supportFragmentManager.findFragmentById(R.id.nav_frag) as NavHostFragment + binding.navBottom.setupWithNavController(navHost.navController) window.addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON) - (application as Look4SatApp).appComponent.inject(this) - viewModel = ViewModelProvider(this, viewModelFactory).get(SharedViewModel::class.java) +// viewModel.setDefaultTleSources() - setupComponents() - setupObservers() - setupDrawer() - - viewModel.setDefaultTleSources() - - if (!hasPermissions(this, permissions)) { - ActivityCompat.requestPermissions(this, permissions, permissionsReqCode) - } +// if (!hasPermissions(this, permissions)) { +// ActivityCompat.requestPermissions(this, permissions, permissionsReqCode) +// } } - @SuppressLint("SourceLockedOrientationActivity") - private fun setupComponents() { - val navController = findNavController(R.id.nav_host) - val toolbar = mainBinding.includeAppBar.toolbar - setSupportActionBar(toolbar) +// private fun hasPermissions(context: Context, permissions: Array): Boolean = +// permissions.all { +// ActivityCompat.checkSelfPermission(context, it) == PackageManager.PERMISSION_GRANTED +// } +// +// private fun openFile() { +// val openFileIntent = Intent(Intent.ACTION_OPEN_DOCUMENT).apply { +// addCategory(Intent.CATEGORY_OPENABLE) +// type = "*/*" +// } +// startActivityForResult(openFileIntent, pickFileReqCode) +// } - appBarConfig = AppBarConfiguration( - setOf(R.id.nav_pass_list, R.id.nav_map_view), - mainBinding.drawerLayout - ) +// private fun openSourcesDialog() { +// TleSourcesDialogFragment(viewModel.getTleSources()).apply { +// setSourcesListener(this@MainActivity) +// show(supportFragmentManager, "TleSourcesDialog") +// } +// } - setupActionBarWithNavController(navController, appBarConfig) - mainBinding.navView.setupWithNavController(navController) +// override fun onSourcesSubmit(list: List) { +// viewModel.updateSatData(list) +// } - navController.addOnDestinationChangedListener { _, destination, _ -> - when (destination.id) { - R.id.nav_pass_list -> { - this.requestedOrientation = ActivityInfo.SCREEN_ORIENTATION_PORTRAIT - toolbar.visibility = View.VISIBLE - mainBinding.includeAppBar.toolbarLayout.visibility = View.VISIBLE - } - R.id.nav_map_view -> { - this.requestedOrientation = ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE - toolbar.visibility = View.GONE - mainBinding.includeAppBar.toolbarLayout.visibility = View.GONE - } - R.id.nav_map_osm -> { - this.requestedOrientation = ActivityInfo.SCREEN_ORIENTATION_PORTRAIT - toolbar.visibility = View.GONE - mainBinding.includeAppBar.toolbarLayout.visibility = View.GONE - } - else -> { - this.requestedOrientation = ActivityInfo.SCREEN_ORIENTATION_PORTRAIT - toolbar.visibility = View.VISIBLE - mainBinding.includeAppBar.toolbarLayout.visibility = View.GONE - } - } - } - } +// override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { +// if (requestCode == pickFileReqCode && resultCode == RESULT_OK) { +// data?.data?.also { uri -> +// viewModel.updateEntriesFromFile(uri) +// } +// } else { +// super.onActivityResult(requestCode, resultCode, data) +// } +// } - private fun setupObservers() { - viewModel.getGSP().observe(this, { result -> - when (result) { - is Result.Success -> { - drawerBinding.drawerLatValue.text = - String.format(getString(R.string.pat_location), result.data.latitude) - drawerBinding.drawerLonValue.text = - String.format(getString(R.string.pat_location), result.data.longitude) - } - is Result.Error -> { - when (result.exception) { - is SecurityException -> - getString(R.string.err_no_permissions).toast(this) - is IllegalArgumentException -> - getString(R.string.update_loc_failure).toast(this) - } - } - } - }) - viewModel.getUpdateStatus().observe(this, { result -> - when (result) { - is Result.Success -> getString(R.string.import_data_success).toast(this) - is Result.Error -> getString(R.string.import_data_failure).toast(this) - } - }) - } - - private fun setupDrawer() { - drawerBinding.drawerBtnLoc.setOnClickListener { - viewModel.updatePosition() - it.lockButton() - } - drawerBinding.drawerBtnTleFile.setOnClickListener { - val openFileIntent = Intent(Intent.ACTION_OPEN_DOCUMENT).apply { - addCategory(Intent.CATEGORY_OPENABLE) - type = "*/*" - } - startActivityForResult(openFileIntent, pickFileReqCode) - mainBinding.drawerLayout.closeDrawers() - it.lockButton() - } - drawerBinding.drawerBtnTleUrl.setOnClickListener { - TleSourcesDialogFragment(viewModel.getTleSources()).apply { - setSourcesListener(this@MainActivity) - show(supportFragmentManager, "TleSourcesDialog") - } - mainBinding.drawerLayout.closeDrawers() - it.lockButton() - } - drawerBinding.drawerBtnGithub.setOnClickListener { - val gitHubUrl = "https://github.com/rt-bishop/LookingSat" - val githubIntent = Intent(Intent.ACTION_VIEW, Uri.parse(gitHubUrl)) - startActivity(githubIntent) - } - } - - override fun onSourcesSubmit(list: List) { - viewModel.updateSatData(list) - } - - private fun View.lockButton() { - lifecycleScope.launch { - this@lockButton.isEnabled = false - delay(3000) - this@lockButton.isEnabled = true - } - } - - private fun hasPermissions(context: Context, permissions: Array): Boolean = - permissions.all { - ActivityCompat.checkSelfPermission(context, it) == PackageManager.PERMISSION_GRANTED - } - - override fun onSupportNavigateUp(): Boolean { - val navController = findNavController(R.id.nav_host) - return navController.navigateUp(appBarConfig) || super.onSupportNavigateUp() - } - - override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { - if (requestCode == pickFileReqCode && resultCode == RESULT_OK) { - data?.data?.also { uri -> - viewModel.updateEntriesFromFile(uri) - } - } else { - super.onActivityResult(requestCode, resultCode, data) - } - } -} +// private fun gotoGitHub() { +// val gitHubUrl = "https://github.com/rt-bishop/LookingSat" +// val githubIntent = Intent(Intent.ACTION_VIEW, Uri.parse(gitHubUrl)) +// startActivity(githubIntent) +// } +// +// private fun View.lockButton() { +// lifecycleScope.launch { +// this@lockButton.isEnabled = false +// delay(3000) +// this@lockButton.isEnabled = true +// } +// } +} \ No newline at end of file diff --git a/app/src/main/java/com/rtbishop/look4sat/ui/NavActivity.kt b/app/src/main/java/com/rtbishop/look4sat/ui/NavActivity.kt deleted file mode 100644 index 11368458..00000000 --- a/app/src/main/java/com/rtbishop/look4sat/ui/NavActivity.kt +++ /dev/null @@ -1,19 +0,0 @@ -package com.rtbishop.look4sat.ui - -import android.os.Bundle -import androidx.appcompat.app.AppCompatActivity -import androidx.navigation.fragment.NavHostFragment -import androidx.navigation.ui.setupWithNavController -import com.rtbishop.look4sat.R -import com.rtbishop.look4sat.databinding.ActivityNavBinding - -class NavActivity : AppCompatActivity() { - - override fun onCreate(savedInstanceState: Bundle?) { - super.onCreate(savedInstanceState) - val binding = ActivityNavBinding.inflate(layoutInflater) - setContentView(binding.root) - val navHost = supportFragmentManager.findFragmentById(R.id.nav_frag) as NavHostFragment - binding.navBottom.setupWithNavController(navHost.navController) - } -} \ No newline at end of file diff --git a/app/src/main/java/com/rtbishop/look4sat/ui/SharedViewModel.kt b/app/src/main/java/com/rtbishop/look4sat/ui/SharedViewModel.kt index 3aae806e..ad2bad1f 100644 --- a/app/src/main/java/com/rtbishop/look4sat/ui/SharedViewModel.kt +++ b/app/src/main/java/com/rtbishop/look4sat/ui/SharedViewModel.kt @@ -52,14 +52,12 @@ class SharedViewModel @Inject constructor( fun getTransmittersForSat(id: Int) = liveData { emit(repository.getTransmittersByCatNum(id)) } fun getPassList(): LiveData>> = _satPassList - fun getUpdateStatus(): LiveData> = _updateStatus fun getGSP(): LiveData> = _gsp fun getCompass() = prefsManager.getCompass() fun getRefreshRate() = prefsManager.getRefreshRate() fun getHoursAhead() = prefsManager.getHoursAhead() fun getMinElevation() = prefsManager.getMinElevation() - fun setPositionFromPref() = _gsp.postValue(Result.Success(prefsManager.getPosition())) suspend fun getAllEntries() = repository.getAllEntries() fun setPassPrefs(hoursAhead: Int, minEl: Double) { diff --git a/app/src/main/java/com/rtbishop/look4sat/ui/fragments/MapViewFragment.kt b/app/src/main/java/com/rtbishop/look4sat/ui/fragments/MapViewFragment.kt deleted file mode 100644 index 106dd362..00000000 --- a/app/src/main/java/com/rtbishop/look4sat/ui/fragments/MapViewFragment.kt +++ /dev/null @@ -1,149 +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.ui.fragments - -import android.os.Bundle -import android.view.View -import androidx.appcompat.app.AlertDialog -import androidx.fragment.app.Fragment -import androidx.fragment.app.FragmentActivity -import androidx.lifecycle.ViewModelProvider -import androidx.lifecycle.lifecycleScope -import com.github.amsacode.predict4java.GroundStationPosition -import com.github.amsacode.predict4java.TLE -import com.rtbishop.look4sat.Look4SatApp -import com.rtbishop.look4sat.R -import com.rtbishop.look4sat.dagger.ViewModelFactory -import com.rtbishop.look4sat.data.Result -import com.rtbishop.look4sat.data.SatPass -import com.rtbishop.look4sat.databinding.FragmentMapViewBinding -import com.rtbishop.look4sat.ui.SharedViewModel -import com.rtbishop.look4sat.ui.views.MapView -import com.rtbishop.look4sat.utility.Extensions.toast -import com.rtbishop.look4sat.utility.PassPredictor -import kotlinx.coroutines.delay -import kotlinx.coroutines.launch -import java.util.* -import javax.inject.Inject - -class MapViewFragment : Fragment(R.layout.fragment_map_view) { - - @Inject - lateinit var modelFactory: ViewModelFactory - private lateinit var mainActivity: FragmentActivity - private lateinit var viewModel: SharedViewModel - private lateinit var mapView: MapView - private lateinit var predictor: PassPredictor - private lateinit var selectedSat: TLE - private lateinit var binding: FragmentMapViewBinding - private var gsp = GroundStationPosition(0.0, 0.0, 0.0) - private var satPassList = emptyList() - private var checkedItem = 0 - - override fun onViewCreated(view: View, savedInstanceState: Bundle?) { - super.onViewCreated(view, savedInstanceState) - binding = FragmentMapViewBinding.bind(view) - mainActivity = requireActivity() - (mainActivity.application as Look4SatApp).appComponent.inject(this) - viewModel = ViewModelProvider(mainActivity, modelFactory).get(SharedViewModel::class.java) - setupObservers(binding) - } - - private fun setupObservers(binding: FragmentMapViewBinding) { - viewModel.getGSP().observe(viewLifecycleOwner, { result -> - when (result) { - is Result.Success -> gsp = result.data - } - }) - - viewModel.getPassList().observe(viewLifecycleOwner, { result -> - when (result) { - is Result.Success -> { - satPassList = result.data - setupMapView(binding) - } - } - }) - } - - private fun setupMapView(binding: FragmentMapViewBinding) { - if (satPassList.isNotEmpty()) { - satPassList = satPassList.distinctBy { it.tle } - satPassList = satPassList.sortedBy { it.tle.name } - binding.fabMap.setOnClickListener { showSelectSatDialog(satPassList) } - selectedSat = satPassList.first().tle - predictor = satPassList.first().predictor - mapView = MapView(mainActivity, gsp) - mapView.setList(satPassList) - mapView.setChecked(checkedItem) - binding.frameMap.addView(mapView) - refreshView() - } else { - binding.fabMap.setOnClickListener { - getString(R.string.err_no_sat_selected).toast(mainActivity) - } - } - } - - private fun refreshView() { - lifecycleScope.launch { - while (true) { - mapView.invalidate() - setDataToTextViews() - delay(viewModel.getRefreshRate()) - } - } - } - - private fun showSelectSatDialog(list: List) { - val tleArray = arrayOfNulls(list.size).apply { - list.withIndex().forEach { - this[it.index] = it.value.tle.name - } - } - - val builder = AlertDialog.Builder(mainActivity) - builder.setTitle(getString(R.string.dialog_show_track)) - .setSingleChoiceItems(tleArray, checkedItem) { dialog, which -> - checkedItem = which - selectedSat = list[which].tle - predictor = list[which].predictor - mapView.setChecked(checkedItem) - mapView.invalidate() - dialog.dismiss() - } - .create() - .show() - } - - private fun setDataToTextViews() { - val currentTime = Date(System.currentTimeMillis()) - val position = predictor.getSatPos(currentTime) - var lon = Math.toDegrees(position.longitude).toFloat() - val lat = Math.toDegrees(position.latitude).toFloat() - val rng = position.range - - if (lon > 180f) lon -= 360f - - binding.tvMapLat.text = String.format(mainActivity.getString(R.string.pat_latitude), lat) - binding.tvMapLon.text = String.format(mainActivity.getString(R.string.pat_longitude), lon) - binding.tvMapRng.text = String.format(mainActivity.getString(R.string.pat_distance), rng) - } -} diff --git a/app/src/main/java/com/rtbishop/look4sat/ui/fragments/PassListFragment.kt b/app/src/main/java/com/rtbishop/look4sat/ui/fragments/PassListFragment.kt index b359e199..53173f32 100644 --- a/app/src/main/java/com/rtbishop/look4sat/ui/fragments/PassListFragment.kt +++ b/app/src/main/java/com/rtbishop/look4sat/ui/fragments/PassListFragment.kt @@ -21,13 +21,8 @@ package com.rtbishop.look4sat.ui.fragments import android.os.Bundle import android.os.CountDownTimer -import android.view.LayoutInflater import android.view.View -import android.view.ViewGroup import android.widget.EditText -import android.widget.ImageButton -import android.widget.TextView -import android.widget.Toast import androidx.appcompat.app.AlertDialog import androidx.fragment.app.Fragment import androidx.fragment.app.FragmentActivity @@ -44,7 +39,7 @@ import com.rtbishop.look4sat.data.SatPass import com.rtbishop.look4sat.databinding.FragmentPassListBinding import com.rtbishop.look4sat.ui.SharedViewModel import com.rtbishop.look4sat.ui.adapters.SatPassAdapter -import com.rtbishop.look4sat.utility.Extensions.toast +import com.rtbishop.look4sat.utility.Extensions.snack import com.rtbishop.look4sat.utility.PrefsManager import kotlinx.coroutines.launch import java.util.* @@ -61,36 +56,23 @@ class PassListFragment : Fragment(R.layout.fragment_pass_list) { private lateinit var viewModel: SharedViewModel private lateinit var satPassAdapter: SatPassAdapter - private lateinit var btnPassPrefs: ImageButton private lateinit var aosTimer: CountDownTimer - private lateinit var aosTimerText: TextView private lateinit var mainActivity: FragmentActivity + private lateinit var binding: FragmentPassListBinding private var isTimerSet: Boolean = false private var satPassList: MutableList = mutableListOf() - private var _binding: FragmentPassListBinding? = null - private val binding get() = _binding!! - - override fun onCreateView( - inflater: LayoutInflater, - container: ViewGroup?, - savedInstanceState: Bundle? - ): View? { - _binding = FragmentPassListBinding.inflate(inflater, container, false) - return binding.root - } override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) mainActivity = requireActivity() + binding = FragmentPassListBinding.bind(view) (mainActivity.application as Look4SatApp).appComponent.inject(this) viewModel = ViewModelProvider(mainActivity, modelFactory).get(SharedViewModel::class.java) satPassAdapter = SatPassAdapter(satPassList, prefsManager) - aosTimerText = mainActivity.findViewById(R.id.toolbar_timer) - btnPassPrefs = mainActivity.findViewById(R.id.toolbar_filter) - setupObservers(binding) - setupComponents(binding) + setupObservers() + setupComponents() } override fun onStart() { @@ -100,7 +82,7 @@ class PassListFragment : Fragment(R.layout.fragment_pass_list) { } } - private fun setupObservers(binding: FragmentPassListBinding) { + private fun setupObservers() { viewModel.getPassList().observe(viewLifecycleOwner, { result -> when (result) { is Result.Success -> { @@ -114,16 +96,16 @@ class PassListFragment : Fragment(R.layout.fragment_pass_list) { binding.recPassList.visibility = View.INVISIBLE } setTimer() - binding.refLayoutPassList.isRefreshing = false +// binding.refLayoutPassList.isRefreshing = false } is Result.InProgress -> { - binding.refLayoutPassList.isRefreshing = true +// binding.refLayoutPassList.isRefreshing = true } } }) } - private fun setupComponents(binding: FragmentPassListBinding) { + private fun setupComponents() { binding.recPassList.apply { layoutManager = LinearLayoutManager(mainActivity) adapter = satPassAdapter @@ -133,17 +115,17 @@ class PassListFragment : Fragment(R.layout.fragment_pass_list) { satPassAdapter.setList(satPassList) setTimer() - binding.refLayoutPassList.setProgressBackgroundColorSchemeResource(R.color.themeAccent) - binding.refLayoutPassList.setColorSchemeResources(R.color.backgroundDark) - binding.refLayoutPassList.setOnRefreshListener { viewModel.calculatePasses() } - btnPassPrefs.setOnClickListener { +// binding.refLayoutPassList.setProgressBackgroundColorSchemeResource(R.color.themeAccent) +// binding.refLayoutPassList.setColorSchemeResources(R.color.backgroundDark) +// binding.refLayoutPassList.setOnRefreshListener { viewModel.calculatePasses() } + binding.toolbarFilter.setOnClickListener { showSatPassPrefsDialog(viewModel.getHoursAhead(), viewModel.getMinElevation()) } binding.fabSatSelect.setOnClickListener { lifecycleScope.launch { val list = viewModel.getAllEntries() as MutableList if (list.isEmpty()) { - getString(R.string.err_update_data).toast(mainActivity, Toast.LENGTH_SHORT) + getString(R.string.err_update_data).snack(requireView()) } else { showSelectSatDialog(list) } @@ -167,23 +149,17 @@ class PassListFragment : Fragment(R.layout.fragment_pass_list) { val elevation = elevationStr.toDouble() when { hours < 1 || hours > 168 -> { - getString(R.string.pref_hours_ahead_input_error).toast( - mainActivity, - Toast.LENGTH_SHORT - ) + getString(R.string.pref_hours_ahead_input_error).snack(requireView()) } elevation < 0 || elevation > 90 -> { - getString(R.string.pref_min_el_input_error).toast( - mainActivity, - Toast.LENGTH_SHORT - ) + getString(R.string.pref_min_el_input_error).snack(requireView()) } else -> { viewModel.setPassPrefs(hours, elevation) viewModel.calculatePasses() } } - } else getString(R.string.err_enter_value).toast(mainActivity, Toast.LENGTH_SHORT) + } else getString(R.string.err_enter_value).snack(requireView()) } setNegativeButton(getString(android.R.string.cancel)) { dialog, _ -> @@ -234,7 +210,7 @@ class PassListFragment : Fragment(R.layout.fragment_pass_list) { } override fun onTick(millisUntilFinished: Long) { - aosTimerText.text = String.format( + binding.toolbarTimer.text = String.format( mainActivity.getString(R.string.pat_timer), TimeUnit.MILLISECONDS.toHours(millisUntilFinished) % 60, TimeUnit.MILLISECONDS.toMinutes(millisUntilFinished) % 60, @@ -254,7 +230,7 @@ class PassListFragment : Fragment(R.layout.fragment_pass_list) { } override fun onTick(millisUntilFinished: Long) { - aosTimerText.text = String.format( + binding.toolbarTimer.text = String.format( mainActivity.getString(R.string.pat_timer), TimeUnit.MILLISECONDS.toHours(millisUntilFinished) % 60, TimeUnit.MILLISECONDS.toMinutes(millisUntilFinished) % 60, @@ -270,12 +246,7 @@ class PassListFragment : Fragment(R.layout.fragment_pass_list) { aosTimer.cancel() isTimerSet = false } - if (resetToNull) aosTimerText.text = + if (resetToNull) binding.toolbarTimer.text = String.format(getString(R.string.pat_timer), 0, 0, 0) } - - override fun onDestroyView() { - super.onDestroyView() - _binding = null - } } diff --git a/app/src/main/java/com/rtbishop/look4sat/ui/fragments/PreferencesFragment.kt b/app/src/main/java/com/rtbishop/look4sat/ui/fragments/PreferencesFragment.kt index 1a755a95..c40ff994 100644 --- a/app/src/main/java/com/rtbishop/look4sat/ui/fragments/PreferencesFragment.kt +++ b/app/src/main/java/com/rtbishop/look4sat/ui/fragments/PreferencesFragment.kt @@ -22,19 +22,14 @@ package com.rtbishop.look4sat.ui.fragments import android.content.SharedPreferences import android.os.Bundle import android.text.InputType -import androidx.fragment.app.FragmentActivity -import androidx.lifecycle.ViewModelProvider import androidx.preference.EditTextPreference import androidx.preference.PreferenceFragmentCompat import com.rtbishop.look4sat.R -import com.rtbishop.look4sat.ui.SharedViewModel -import com.rtbishop.look4sat.utility.Extensions.toast +import com.rtbishop.look4sat.utility.Extensions.snack class PreferencesFragment : PreferenceFragmentCompat(), SharedPreferences.OnSharedPreferenceChangeListener { - private lateinit var mainActivity: FragmentActivity - private lateinit var viewModel: SharedViewModel private lateinit var keyLat: String private lateinit var keyLon: String private lateinit var keyAlt: String @@ -43,14 +38,10 @@ class PreferencesFragment : PreferenceFragmentCompat(), override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) { setPreferencesFromResource(R.xml.preference, rootKey) val provider = EditTextPreference.SimpleSummaryProvider.getInstance() - - mainActivity = requireActivity() - viewModel = ViewModelProvider(mainActivity).get(SharedViewModel::class.java) - - keyLat = mainActivity.getString(R.string.pref_lat_key) - keyLon = mainActivity.getString(R.string.pref_lon_key) - keyAlt = mainActivity.getString(R.string.pref_alt_key) - keyDelay = mainActivity.getString(R.string.pref_refresh_rate_key) + keyLat = preferenceManager.context.getString(R.string.pref_lat_key) + keyLon = preferenceManager.context.getString(R.string.pref_lon_key) + keyAlt = preferenceManager.context.getString(R.string.pref_alt_key) + keyDelay = preferenceManager.context.getString(R.string.pref_refresh_rate_key) findPreference(keyLat)?.apply { summaryProvider = provider @@ -62,7 +53,7 @@ class PreferencesFragment : PreferenceFragmentCompat(), setOnPreferenceChangeListener { _, newValue -> val valueStr = newValue.toString() if (valueStr.isEmpty() || valueStr == "-" || valueStr.toDouble() < -90.0 || valueStr.toDouble() > 90.0) { - getString(R.string.pref_lat_input_error).toast(mainActivity) + getString(R.string.pref_lat_input_error).snack(requireView()) return@setOnPreferenceChangeListener false } return@setOnPreferenceChangeListener true @@ -79,7 +70,7 @@ class PreferencesFragment : PreferenceFragmentCompat(), setOnPreferenceChangeListener { _, newValue -> val valueStr = newValue.toString() if (valueStr.isEmpty() || valueStr == "-" || valueStr.toDouble() < -180.0 || valueStr.toDouble() > 180.0) { - getString(R.string.pref_lon_input_error).toast(mainActivity) + getString(R.string.pref_lon_input_error).snack(requireView()) return@setOnPreferenceChangeListener false } return@setOnPreferenceChangeListener true @@ -96,7 +87,7 @@ class PreferencesFragment : PreferenceFragmentCompat(), setOnPreferenceChangeListener { _, newValue -> val valueStr = newValue.toString() if (valueStr.isEmpty() || valueStr == "-" || valueStr.toDouble() < -413.0 || valueStr.toDouble() > 8850.0) { - getString(R.string.pref_alt_input_error).toast(mainActivity) + getString(R.string.pref_alt_input_error).snack(requireView()) return@setOnPreferenceChangeListener false } return@setOnPreferenceChangeListener true @@ -109,7 +100,7 @@ class PreferencesFragment : PreferenceFragmentCompat(), setOnPreferenceChangeListener { _, newValue -> val valueStr = newValue.toString() if (valueStr.isEmpty() || valueStr.toLong() < 250 || valueStr.toLong() > 10000) { - getString(R.string.pref_refresh_rate_input_error).toast(mainActivity) + getString(R.string.pref_refresh_rate_input_error).snack(requireView()) return@setOnPreferenceChangeListener false } return@setOnPreferenceChangeListener true @@ -117,9 +108,7 @@ class PreferencesFragment : PreferenceFragmentCompat(), } } - override fun onSharedPreferenceChanged(sharedPreferences: SharedPreferences?, key: String?) { - if (key == keyLat || key == keyLon || key == keyAlt) viewModel.setPositionFromPref() - } + override fun onSharedPreferenceChanged(sharedPreferences: SharedPreferences?, key: String?) {} override fun onResume() { super.onResume() diff --git a/app/src/main/java/com/rtbishop/look4sat/utility/Extensions.kt b/app/src/main/java/com/rtbishop/look4sat/utility/Extensions.kt index fe32e8be..8e129401 100644 --- a/app/src/main/java/com/rtbishop/look4sat/utility/Extensions.kt +++ b/app/src/main/java/com/rtbishop/look4sat/utility/Extensions.kt @@ -1,11 +1,11 @@ package com.rtbishop.look4sat.utility -import android.content.Context -import android.widget.Toast +import android.view.View +import com.google.android.material.snackbar.Snackbar object Extensions { - fun String.toast(context: Context, duration: Int = Toast.LENGTH_SHORT): Toast { - return Toast.makeText(context, this, duration).apply { show() } + fun String.snack(view: View) { + Snackbar.make(view, this, Snackbar.LENGTH_SHORT).show() } } \ No newline at end of file diff --git a/app/src/main/res/drawable-nodpi/worldmap_bg_dark.webp b/app/src/main/res/drawable-nodpi/worldmap_bg_dark.webp deleted file mode 100644 index 9f19b71b..00000000 Binary files a/app/src/main/res/drawable-nodpi/worldmap_bg_dark.webp and /dev/null differ diff --git a/app/src/main/res/drawable/ic_about.xml b/app/src/main/res/drawable/ic_about.xml deleted file mode 100644 index f6a43e79..00000000 --- a/app/src/main/res/drawable/ic_about.xml +++ /dev/null @@ -1,28 +0,0 @@ - - - - - diff --git a/app/src/main/res/drawable/ic_sat_asc_right.xml b/app/src/main/res/drawable/ic_sat_asc_right.xml deleted file mode 100644 index 72d3d41e..00000000 --- a/app/src/main/res/drawable/ic_sat_asc_right.xml +++ /dev/null @@ -1,57 +0,0 @@ - - - - - - - - - diff --git a/app/src/main/res/drawable/ic_sat_desc_left.xml b/app/src/main/res/drawable/ic_sat_desc_left.xml deleted file mode 100644 index 8dc1f5c7..00000000 --- a/app/src/main/res/drawable/ic_sat_desc_left.xml +++ /dev/null @@ -1,57 +0,0 @@ - - - - - - - - - diff --git a/app/src/main/res/drawable/ic_update_loc.xml b/app/src/main/res/drawable/ic_update_loc.xml deleted file mode 100644 index a18d30c0..00000000 --- a/app/src/main/res/drawable/ic_update_loc.xml +++ /dev/null @@ -1,28 +0,0 @@ - - - - - diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml index 81a29d70..386dec1d 100644 --- a/app/src/main/res/layout/activity_main.xml +++ b/app/src/main/res/layout/activity_main.xml @@ -1,44 +1,38 @@ - - - + + android:layout_height="match_parent"> - + + + + + + + android:layout_height="48dp" + app:itemIconSize="24dp" + app:itemIconTint="@color/nav_item_selector" + app:itemTextColor="@color/nav_item_selector" + app:labelVisibilityMode="selected" + app:layout_constraintBottom_toBottomOf="parent" + app:layout_constraintEnd_toEndOf="parent" + app:layout_constraintStart_toStartOf="parent" + app:menu="@menu/nav_menu" /> - - - + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_nav.xml b/app/src/main/res/layout/activity_nav.xml deleted file mode 100644 index 0793a628..00000000 --- a/app/src/main/res/layout/activity_nav.xml +++ /dev/null @@ -1,38 +0,0 @@ - - - - - - - - - - - - \ 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 deleted file mode 100644 index 084d2b76..00000000 --- a/app/src/main/res/layout/app_bar_main.xml +++ /dev/null @@ -1,71 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - diff --git a/app/src/main/res/layout/content_main.xml b/app/src/main/res/layout/content_main.xml deleted file mode 100644 index 7c17bae1..00000000 --- a/app/src/main/res/layout/content_main.xml +++ /dev/null @@ -1,40 +0,0 @@ - - - - - - diff --git a/app/src/main/res/layout/drawer_header.xml b/app/src/main/res/layout/drawer_header.xml deleted file mode 100644 index 6334e909..00000000 --- a/app/src/main/res/layout/drawer_header.xml +++ /dev/null @@ -1,176 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/app/src/main/res/layout/fragment_map_view.xml b/app/src/main/res/layout/fragment_map_view.xml deleted file mode 100644 index b741447c..00000000 --- a/app/src/main/res/layout/fragment_map_view.xml +++ /dev/null @@ -1,75 +0,0 @@ - - - - - - - - - - - - - - - diff --git a/app/src/main/res/layout/fragment_pass_list.xml b/app/src/main/res/layout/fragment_pass_list.xml index f6f8e8a1..6b4cc68d 100644 --- a/app/src/main/res/layout/fragment_pass_list.xml +++ b/app/src/main/res/layout/fragment_pass_list.xml @@ -17,151 +17,189 @@ ~ 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. --> - - + android:layout_height="wrap_content" + app:layout_constraintEnd_toEndOf="parent" + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintTop_toTopOf="parent"> - + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - + android:contentDescription="@string/placeholder" + app:layout_constraintBottom_toTopOf="@+id/tvInfoMain" + app:layout_constraintDimensionRatio="1:1" + app:layout_constraintEnd_toStartOf="@+id/guideRight" + app:layout_constraintStart_toStartOf="@+id/guideLeft" + app:layout_constraintTop_toBottomOf="@+id/tvInfoSwipe" + app:layout_constraintVertical_chainStyle="packed" + app:srcCompat="@drawable/ic_sputnik" /> + + + + + + + + + + + + + + - + + + diff --git a/app/src/main/res/menu/drawer_menu.xml b/app/src/main/res/menu/drawer_menu.xml deleted file mode 100644 index 0755c453..00000000 --- a/app/src/main/res/menu/drawer_menu.xml +++ /dev/null @@ -1,47 +0,0 @@ - - - - - - - - - - - - - diff --git a/app/src/main/res/menu/nav_menu.xml b/app/src/main/res/menu/nav_menu.xml index c19440bb..ccc1e428 100644 --- a/app/src/main/res/menu/nav_menu.xml +++ b/app/src/main/res/menu/nav_menu.xml @@ -19,7 +19,7 @@ + app:startDestination="@id/nav_passes"> + + @@ -48,13 +52,7 @@ - - diff --git a/app/src/main/res/navigation/temp_graph.xml b/app/src/main/res/navigation/temp_graph.xml deleted file mode 100644 index 3dd676a7..00000000 --- a/app/src/main/res/navigation/temp_graph.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - \ No newline at end of file diff --git a/build.gradle b/build.gradle index 04c24f1c..546e4d54 100644 --- a/build.gradle +++ b/build.gradle @@ -23,7 +23,6 @@ buildscript { gradle_plugin_version = '1.4.10' material_version = '1.2.1' app_compat_version = '1.2.0' - support_lib_version = '1.0.0' constraint_layout_version = '2.0.1' ktx_version = '1.3.1' preference_version = '1.1.1'