diff --git a/app/build.gradle b/app/build.gradle index 94fa726f..7941dc20 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -8,20 +8,17 @@ plugins { android { compileSdkVersion 31 - buildToolsVersion "31.0.0" + buildToolsVersion '31.0.0' defaultConfig { applicationId "com.rtbishop.look4sat" minSdk 21 targetSdk 31 - versionCode 303 - versionName "3.0.3" - resConfigs "en,ru" + versionCode 310 + versionName '3.1.0' + resConfigs 'en,ru,zh_CN' testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" - vectorDrawables { - useSupportLibrary true - } kapt { arguments { @@ -42,7 +39,7 @@ android { } } buildFeatures { - compose true +// compose true viewBinding true } composeOptions { @@ -85,16 +82,16 @@ dependencies { kapt "com.google.dagger:hilt-compiler:$hilt_version" implementation "org.osmdroid:osmdroid-android:$osmdroid_version" - implementation "androidx.compose.ui:ui:$compose_version" - implementation "androidx.compose.ui:ui-tooling:$compose_version" - implementation "androidx.compose.animation:animation:$compose_version" - implementation "androidx.compose.foundation:foundation:$compose_version" - implementation "androidx.activity:activity-compose:$activity_compose_version" - implementation "androidx.compose.runtime:runtime-livedata:$compose_version" - implementation "androidx.lifecycle:lifecycle-viewmodel-compose:$lifecycle_version" - implementation "androidx.compose.material:material:$compose_version" - implementation "androidx.compose.material:material-icons-extended:$compose_version" - implementation "com.google.android.material:compose-theme-adapter:$material_adapter_version" +// implementation "androidx.compose.ui:ui:$compose_version" +// implementation "androidx.compose.ui:ui-tooling:$compose_version" +// implementation "androidx.compose.animation:animation:$compose_version" +// implementation "androidx.compose.foundation:foundation:$compose_version" +// implementation "androidx.activity:activity-compose:$activity_compose_version" +// implementation "androidx.compose.runtime:runtime-livedata:$compose_version" +// implementation "androidx.lifecycle:lifecycle-viewmodel-compose:$lifecycle_version" +// implementation "androidx.compose.material:material:$compose_version" +// implementation "androidx.compose.material:material-icons-extended:$compose_version" +// implementation "com.google.android.material:compose-theme-adapter:$material_adapter_version" debugImplementation "androidx.compose.ui:ui-tooling:$compose_version" debugImplementation "androidx.fragment:fragment-testing:$fragment_test_version" diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 36643fee..eddd5224 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -4,8 +4,9 @@ - - + diff --git a/app/src/main/java/com/rtbishop/look4sat/framework/LocationManager.kt b/app/src/main/java/com/rtbishop/look4sat/framework/LocationManager.kt index 3658d3e6..6165edcd 100644 --- a/app/src/main/java/com/rtbishop/look4sat/framework/LocationManager.kt +++ b/app/src/main/java/com/rtbishop/look4sat/framework/LocationManager.kt @@ -134,5 +134,6 @@ class LocationManager @Inject constructor( override fun onProviderDisabled(provider: String) {} + @Deprecated("Deprecated in Java") override fun onStatusChanged(provider: String?, status: Int, extras: Bundle?) {} } diff --git a/app/src/main/java/com/rtbishop/look4sat/framework/SettingsManager.kt b/app/src/main/java/com/rtbishop/look4sat/framework/SettingsManager.kt index 7e396f0c..ef79e7a5 100644 --- a/app/src/main/java/com/rtbishop/look4sat/framework/SettingsManager.kt +++ b/app/src/main/java/com/rtbishop/look4sat/framework/SettingsManager.kt @@ -28,6 +28,7 @@ import javax.inject.Singleton class SettingsManager @Inject constructor(private val prefs: SharedPreferences) : ISettingsManager { companion object { + const val keyFirstEverLaunch = "isFirstEverLaunch" const val keyDataSources = "dataSources" const val keyModes = "satModes" const val keyCompass = "compass" @@ -48,6 +49,14 @@ class SettingsManager @Inject constructor(private val prefs: SharedPreferences) const val keySelection = "selection" } + override fun isFirstEverLaunchDone(): Boolean { + return prefs.getBoolean(keyFirstEverLaunch, false) + } + + override fun setFirstEverLaunchDone() { + prefs.edit { putBoolean(keyFirstEverLaunch, true) } + } + override fun loadStationLocator(): String { return prefs.getString(keyLocator, null) ?: "null" } @@ -177,6 +186,7 @@ class SettingsManager @Inject constructor(private val prefs: SharedPreferences) override fun setBTDeviceAddr(value: String) { prefs.edit { putString(keyBTDeviceAddr, value) } } + override fun getBTDeviceName(): String { return prefs.getString(keyBTDeviceName, null) ?: "Default" } diff --git a/app/src/main/java/com/rtbishop/look4sat/presentation/entriesScreen/EntriesFragment.kt b/app/src/main/java/com/rtbishop/look4sat/presentation/entriesScreen/EntriesFragment.kt index 52f4cb87..c6a0cc31 100644 --- a/app/src/main/java/com/rtbishop/look4sat/presentation/entriesScreen/EntriesFragment.kt +++ b/app/src/main/java/com/rtbishop/look4sat/presentation/entriesScreen/EntriesFragment.kt @@ -19,8 +19,7 @@ package com.rtbishop.look4sat.presentation.entriesScreen import android.os.Bundle import android.view.View -import android.widget.AdapterView -import android.widget.ArrayAdapter +import androidx.appcompat.app.AlertDialog import androidx.core.widget.doOnTextChanged import androidx.fragment.app.Fragment import androidx.fragment.app.viewModels @@ -69,29 +68,10 @@ class EntriesFragment : Fragment(R.layout.fragment_entries) { } entriesBtnSelect.clickWithDebounce { viewModel.selectCurrentItems(true) } entriesBtnClear.clickWithDebounce { viewModel.selectCurrentItems(false) } - - val spinnerListener = object : AdapterView.OnItemSelectedListener { - override fun onItemSelected( - parent: AdapterView<*>, view: View?, - position: Int, id: Long - ) { - viewModel.setSatType(parent.getItemAtPosition(position).toString()) - } - - override fun onNothingSelected(parent: AdapterView<*>) { - viewModel.setSatType(String()) - } - } - ArrayAdapter( - requireContext(), - android.R.layout.simple_spinner_item, - viewModel.satTypes - ).also { adapter -> - adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item) - entriesSpinner.onItemSelectedListener = spinnerListener - entriesSpinner.adapter = adapter - } - + val typeMessageFormat = requireContext().getString(R.string.types_message) + val type = if (viewModel.getSatType().isNullOrBlank()) "All" else viewModel.getSatType() + entriesTypeMessage.text = String.format(typeMessageFormat, type) + entriesTypeCard.setOnClickListener { showSelectTypeDialog() } } viewModel.satData.observe(viewLifecycleOwner) { satData -> handleSatData(satData, entriesAdapter) @@ -117,4 +97,21 @@ class EntriesFragment : Fragment(R.layout.fragment_entries) { else -> {} } } + + private fun showSelectTypeDialog() { + val satelliteTypes = viewModel.satTypes.toTypedArray() + val selectedValue = satelliteTypes.indexOf(viewModel.getSatType()) + val typeFormat = requireContext().getString(R.string.types_message) + AlertDialog.Builder(requireContext()).apply { + setTitle(R.string.types_title) + setSingleChoiceItems(satelliteTypes, selectedValue) { dialog, index -> + val selectedItem = satelliteTypes[index] + binding.entriesTypeMessage.text = String.format(typeFormat, selectedItem) + viewModel.setSatType(selectedItem) + dialog.dismiss() + } + create() + show() + } + } } diff --git a/app/src/main/java/com/rtbishop/look4sat/presentation/entriesScreen/EntriesViewModel.kt b/app/src/main/java/com/rtbishop/look4sat/presentation/entriesScreen/EntriesViewModel.kt index 93533878..658fcae1 100644 --- a/app/src/main/java/com/rtbishop/look4sat/presentation/entriesScreen/EntriesViewModel.kt +++ b/app/src/main/java/com/rtbishop/look4sat/presentation/entriesScreen/EntriesViewModel.kt @@ -52,6 +52,8 @@ class EntriesViewModel @Inject constructor( val satData = itemsWithQuery.map { items -> DataState.Success(items) } val satTypes: List = settings.sourcesMap.keys.sorted() + fun getSatType(): String? = satType.value + fun setSatType(type: String) { satType.value = type } @@ -93,6 +95,7 @@ class EntriesViewModel @Inject constructor( } private fun filterByType(items: List, type: String): List { + if (type == "All") return items val catnums = settings.loadSatType(type) if (catnums.isEmpty()) return items return items.filter { item -> item.catnum in catnums } diff --git a/app/src/main/java/com/rtbishop/look4sat/presentation/passesScreen/PassesFragment.kt b/app/src/main/java/com/rtbishop/look4sat/presentation/passesScreen/PassesFragment.kt index b69cf989..41e99363 100644 --- a/app/src/main/java/com/rtbishop/look4sat/presentation/passesScreen/PassesFragment.kt +++ b/app/src/main/java/com/rtbishop/look4sat/presentation/passesScreen/PassesFragment.kt @@ -42,7 +42,6 @@ class PassesFragment : Fragment(R.layout.fragment_passes), PassesAdapter.PassesC private val viewModel: PassesViewModel by viewModels() private val passesAdapter = PassesAdapter(this) private var binding: FragmentPassesBinding? = null -// private var refreshAnimator: ValueAnimator? = null override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) @@ -74,7 +73,6 @@ class PassesFragment : Fragment(R.layout.fragment_passes), PassesAdapter.PassesC val dir = PassesFragmentDirections.globalToSettings() findNavController().navigate(dir) } -// setupAnimator() setupObservers() } } @@ -92,15 +90,6 @@ class PassesFragment : Fragment(R.layout.fragment_passes), PassesAdapter.PassesC super.onDestroyView() } -// private fun setupAnimator() { -// refreshAnimator = ValueAnimator.ofFloat(0f, -360f).apply { -// duration = 875 -// interpolator = LinearInterpolator() -// repeatCount = ValueAnimator.INFINITE -// addUpdateListener { binding?.passesBtnRefresh?.rotation = animatedValue as Float } -// } -// } - private fun setupObservers() { viewModel.entriesTotal.observe(viewLifecycleOwner) { number -> handleEntriesTotal(number) @@ -147,8 +136,6 @@ class PassesFragment : Fragment(R.layout.fragment_passes), PassesAdapter.PassesC } } is DataState.Loading -> { -// refreshAnimator?.start() -// passesBtnRefresh.isEnabled = false passesEmpty.visibility = View.INVISIBLE passesProgress.visibility = View.VISIBLE passesTimer.text = 0L.toTimerString() @@ -175,7 +162,6 @@ class PassesFragment : Fragment(R.layout.fragment_passes), PassesAdapter.PassesC passesTimer.text = 0L.toTimerString() } passesBtnRefresh.isEnabled = true -// refreshAnimator?.cancel() } } } diff --git a/app/src/main/java/com/rtbishop/look4sat/presentation/passesScreen/PassesViewModel.kt b/app/src/main/java/com/rtbishop/look4sat/presentation/passesScreen/PassesViewModel.kt index 2c3570d3..449358cc 100644 --- a/app/src/main/java/com/rtbishop/look4sat/presentation/passesScreen/PassesViewModel.kt +++ b/app/src/main/java/com/rtbishop/look4sat/presentation/passesScreen/PassesViewModel.kt @@ -40,6 +40,12 @@ class PassesViewModel @Inject constructor( val entriesTotal: LiveData = repository.getEntriesTotal().asLiveData() init { + viewModelScope.launch { + if (!settings.isFirstEverLaunchDone()) { + repository.updateFromWebNew() + settings.setFirstEverLaunchDone() + } + } viewModelScope.launch { satelliteManager.calculatedPasses.collect { passes -> passesProcessing?.cancelAndJoin() diff --git a/app/src/main/res/layout/fragment_entries.xml b/app/src/main/res/layout/fragment_entries.xml index 240eb9dd..c033bf66 100644 --- a/app/src/main/res/layout/fragment_entries.xml +++ b/app/src/main/res/layout/fragment_entries.xml @@ -38,20 +38,47 @@ - + android:layout_marginEnd="@dimen/view_default_margin"> + + + + + + diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml index 4643906b..2e504518 100644 --- a/app/src/main/res/values-ru/strings.xml +++ b/app/src/main/res/values-ru/strings.xml @@ -55,6 +55,9 @@ Источники данных Протокол HTTPS + Выберите тип спутника + Выбран тип: %s + Поиск по Имени / Id diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 14851d68..0403f1d1 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -56,6 +56,9 @@ Manage data sources HTTPS Source + Select satellite type + Selected type: %s + Search by Name / Id diff --git a/base/src/main/java/com/rtbishop/look4sat/domain/ISettingsManager.kt b/base/src/main/java/com/rtbishop/look4sat/domain/ISettingsManager.kt index 9265e0f1..b555acc1 100644 --- a/base/src/main/java/com/rtbishop/look4sat/domain/ISettingsManager.kt +++ b/base/src/main/java/com/rtbishop/look4sat/domain/ISettingsManager.kt @@ -57,6 +57,10 @@ interface ISettingsManager { "X-Comm" to "https://celestrak.com/NORAD/elements/gp.php?GROUP=x-comm&FORMAT=csv" ) + fun isFirstEverLaunchDone(): Boolean + + fun setFirstEverLaunchDone() + fun loadStationLocator(): String fun saveStationLocator(locator: String) diff --git a/build.gradle b/build.gradle index 013f560e..e9321431 100644 --- a/build.gradle +++ b/build.gradle @@ -1,28 +1,28 @@ buildscript { ext { - hilt_version = '2.41' + hilt_version = '2.42' safe_args_version = '2.4.1' - application_version = '7.1.3' + application_version = '7.2.1' library_version = '7.1.2' kotlin_android_version = '1.6.10' - core_ktx_version = '1.7.0' - core_splashscreen_version = '1.0.0-beta02' - constraint_version = '2.1.3' + core_ktx_version = '1.8.0' + core_splashscreen_version = '1.0.0-rc01' + constraint_version = '2.1.4' lifecycle_version = '2.4.1' navigation_version = '2.4.2' room_version = '2.4.2' - material_version = '1.5.0' - osmdroid_version = '6.1.11' + material_version = '1.6.1' + osmdroid_version = '6.1.13' json_version = '20220320' compose_version = '1.1.1' activity_compose_version = '1.4.0' - material_adapter_version = '1.1.7' + material_adapter_version = '1.1.10' fragment_test_version = '1.4.1' leakcanary_version = '2.9.1' junit_version = '4.13.2' - mockito_version = '4.5.1' - robolectric_version = '4.8' - coroutines_test_version = '1.6.1-native-mt' + mockito_version = '4.6.0' + robolectric_version = '4.8.1' + coroutines_test_version = '1.6.2' androidx_test_version = '1.4.0' androidx_junit_version = '1.1.3' espresso_version = '3.4.0' diff --git a/fastlane/metadata/android/en-US/changelogs/310.txt b/fastlane/metadata/android/en-US/changelogs/310.txt new file mode 100644 index 00000000..2113a92d --- /dev/null +++ b/fastlane/metadata/android/en-US/changelogs/310.txt @@ -0,0 +1,6 @@ +Integrated AJohns bluetooth reporting function +Ref - https://github.com/rt-bishop/Look4Sat/pull/87 +Integrated BA7LWN Simplified Chinese translation +Ref - https://github.com/rt-bishop/Look4Sat/pull/92 +Added satellites sorting by their reported categories +Removed custom sources dialog, use file import instead \ No newline at end of file diff --git a/fastlane/metadata/android/en-US/whatsnew/whatsnew-en-US b/fastlane/metadata/android/en-US/whatsnew/whatsnew-en-US index 00f4b9e1..2113a92d 100644 --- a/fastlane/metadata/android/en-US/whatsnew/whatsnew-en-US +++ b/fastlane/metadata/android/en-US/whatsnew/whatsnew-en-US @@ -1,2 +1,6 @@ -Minor correcting release -Fixed a crash in the map fragment \ No newline at end of file +Integrated AJohns bluetooth reporting function +Ref - https://github.com/rt-bishop/Look4Sat/pull/87 +Integrated BA7LWN Simplified Chinese translation +Ref - https://github.com/rt-bishop/Look4Sat/pull/92 +Added satellites sorting by their reported categories +Removed custom sources dialog, use file import instead \ No newline at end of file