diff --git a/app/src/main/java/com/rtbishop/look4sat/presentation/appSettingsScreen/AppSettingsFragment.kt b/app/src/main/java/com/rtbishop/look4sat/presentation/appSettingsScreen/AppSettingsFragment.kt index 1145687d..2f3ce3cf 100644 --- a/app/src/main/java/com/rtbishop/look4sat/presentation/appSettingsScreen/AppSettingsFragment.kt +++ b/app/src/main/java/com/rtbishop/look4sat/presentation/appSettingsScreen/AppSettingsFragment.kt @@ -28,10 +28,10 @@ import androidx.core.content.ContextCompat import androidx.preference.EditTextPreference import androidx.preference.Preference import androidx.preference.PreferenceFragmentCompat -import com.google.android.material.snackbar.Snackbar import com.rtbishop.look4sat.R import com.rtbishop.look4sat.data.PreferencesSource import com.rtbishop.look4sat.framework.PreferencesProvider +import com.rtbishop.look4sat.utility.showSnack import dagger.hilt.android.AndroidEntryPoint import javax.inject.Inject @@ -46,7 +46,7 @@ class AppSettingsFragment : PreferenceFragmentCompat() { if (isGranted) { updatePositionFromGPS() } else { - showSnack(getString(R.string.pref_pos_gps_error)) + requireView().showSnack(getString(R.string.pref_pos_gps_error)) } } @@ -75,7 +75,7 @@ class AppSettingsFragment : PreferenceFragmentCompat() { if (Patterns.IP_ADDRESS.matcher(newValue.toString()).matches()) { return@setOnPreferenceChangeListener true } else { - showSnack(getString(R.string.tracking_rotator_address_invalid)) + requireView().showSnack(getString(R.string.tracking_rotator_address_invalid)) return@setOnPreferenceChangeListener false } } @@ -88,7 +88,7 @@ class AppSettingsFragment : PreferenceFragmentCompat() { if (portValue.isNotEmpty() && portValue.toInt() in 1024..65535) { return@setOnPreferenceChangeListener true } else { - showSnack(getString(R.string.tracking_rotator_port_invalid)) + requireView().showSnack(getString(R.string.tracking_rotator_port_invalid)) return@setOnPreferenceChangeListener false } } @@ -97,10 +97,10 @@ class AppSettingsFragment : PreferenceFragmentCompat() { private fun updatePositionFromQth(qthString: String): Boolean { return if (preferencesSource.updatePositionFromQTH(qthString)) { - showSnack(getString(R.string.pref_pos_success)) + requireView().showSnack(getString(R.string.pref_pos_success)) true } else { - showSnack(getString(R.string.pref_pos_qth_error)) + requireView().showSnack(getString(R.string.pref_pos_qth_error)) false } } @@ -110,14 +110,10 @@ class AppSettingsFragment : PreferenceFragmentCompat() { val locPermResult = ContextCompat.checkSelfPermission(requireContext(), locPermString) if (locPermResult == PackageManager.PERMISSION_GRANTED) { if (preferencesSource.updatePositionFromGPS()) { - showSnack(getString(R.string.pref_pos_success)) - } else showSnack(getString(R.string.pref_pos_gps_null)) + requireView().showSnack(getString(R.string.pref_pos_success)) + } else { + requireView().showSnack(getString(R.string.pref_pos_gps_null)) + } } else requestPermissionLauncher.launch(locPermString) } - - private fun showSnack(message: String) { - Snackbar.make(requireView(), message, Snackbar.LENGTH_SHORT).apply { - setAnchorView(R.id.nav_bottom) - }.show() - } } diff --git a/app/src/main/java/com/rtbishop/look4sat/presentation/appSplashDialog/AppSplashDialog.kt b/app/src/main/java/com/rtbishop/look4sat/presentation/appSplashDialog/AppSplashDialog.kt deleted file mode 100644 index c67bba1b..00000000 --- a/app/src/main/java/com/rtbishop/look4sat/presentation/appSplashDialog/AppSplashDialog.kt +++ /dev/null @@ -1,45 +0,0 @@ -/* - * Look4Sat. Amateur radio satellite tracker and pass predictor. - * Copyright (C) 2019-2021 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 3 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, see . - */ -package com.rtbishop.look4sat.presentation.appSplashDialog - -import android.os.Bundle -import android.view.LayoutInflater -import android.view.View -import android.view.ViewGroup -import android.view.WindowManager -import androidx.appcompat.app.AppCompatDialogFragment -import com.rtbishop.look4sat.R -import com.rtbishop.look4sat.databinding.DialogSplashBinding - -class AppSplashDialog : AppCompatDialogFragment() { - - override fun onCreateView(inflater: LayoutInflater, group: ViewGroup?, state: Bundle?): View? { - return inflater.inflate(R.layout.dialog_splash, group, false) - } - - override fun onViewCreated(view: View, savedInstanceState: Bundle?) { - super.onViewCreated(view, savedInstanceState) - DialogSplashBinding.bind(view).apply { - dialog?.window?.setLayout( - WindowManager.LayoutParams.MATCH_PARENT, - WindowManager.LayoutParams.WRAP_CONTENT - ) - splashOkButton.setOnClickListener { dismiss() } - } - } -} diff --git a/app/src/main/java/com/rtbishop/look4sat/presentation/satItemScreen/SatItemFragment.kt b/app/src/main/java/com/rtbishop/look4sat/presentation/satItemScreen/SatItemFragment.kt index 44e6a58a..615385a0 100644 --- a/app/src/main/java/com/rtbishop/look4sat/presentation/satItemScreen/SatItemFragment.kt +++ b/app/src/main/java/com/rtbishop/look4sat/presentation/satItemScreen/SatItemFragment.kt @@ -18,18 +18,21 @@ package com.rtbishop.look4sat.presentation.satItemScreen import android.os.Bundle +import android.util.Patterns import android.view.View import androidx.activity.result.contract.ActivityResultContracts +import androidx.appcompat.app.AlertDialog import androidx.fragment.app.Fragment import androidx.fragment.app.viewModels import androidx.recyclerview.widget.LinearLayoutManager import androidx.recyclerview.widget.SimpleItemAnimator -import com.google.android.material.snackbar.Snackbar import com.rtbishop.look4sat.R +import com.rtbishop.look4sat.databinding.DialogSourceBinding import com.rtbishop.look4sat.databinding.FragmentEntriesBinding import com.rtbishop.look4sat.domain.model.SatItem import com.rtbishop.look4sat.framework.model.Result import com.rtbishop.look4sat.utility.RecyclerDivider +import com.rtbishop.look4sat.utility.showSnack import dagger.hilt.android.AndroidEntryPoint @AndroidEntryPoint @@ -59,6 +62,7 @@ class SatItemFragment : Fragment(R.layout.fragment_entries) { addItemDecoration(RecyclerDivider(R.drawable.rec_divider_light)) } importWeb.setOnClickListener { viewModel.updateEntriesFromWeb(null) } + importSource.setOnClickListener { showSourceDialog() } importFile.setOnClickListener { filePicker.launch("*/*") } selectMode.setOnClickListener { viewModel.createModesDialog(requireContext()).show() } selectAll.setOnClickListener { viewModel.selectCurrentItems() } @@ -88,11 +92,26 @@ class SatItemFragment : Fragment(R.layout.fragment_entries) { is Result.Error -> { binding.entriesProgress.visibility = View.INVISIBLE binding.entriesRecycler.visibility = View.VISIBLE - val errorMsg = getString(R.string.entries_update_error) - Snackbar.make(requireView(), errorMsg, Snackbar.LENGTH_SHORT).apply { - setAnchorView(R.id.nav_bottom) - }.show() + requireView().showSnack(getString(R.string.entries_update_error)) } } } + + private fun showSourceDialog() { + val dialogBinding = DialogSourceBinding.inflate(requireActivity().layoutInflater) + val dialogBuilder = AlertDialog.Builder(requireContext()).apply { + setMessage(getString(R.string.sources_title)) + setView(dialogBinding.root) + setPositiveButton(android.R.string.ok) { _, _ -> + val editTextInput = dialogBinding.sourceUrl.text.toString() + if (Patterns.WEB_URL.matcher(editTextInput).matches()) { + viewModel.updateEntriesFromWeb(listOf(editTextInput)) + } else { + requireView().showSnack(getString(R.string.sources_error)) + } + } + setNeutralButton(android.R.string.cancel, null) + } + dialogBuilder.create().show() + } } diff --git a/app/src/main/java/com/rtbishop/look4sat/presentation/satPassInfoScreen/SatTransAdapter.kt b/app/src/main/java/com/rtbishop/look4sat/presentation/satPassInfoScreen/SatTransAdapter.kt index db51dbc6..506e5ec7 100644 --- a/app/src/main/java/com/rtbishop/look4sat/presentation/satPassInfoScreen/SatTransAdapter.kt +++ b/app/src/main/java/com/rtbishop/look4sat/presentation/satPassInfoScreen/SatTransAdapter.kt @@ -58,8 +58,8 @@ class SatTransAdapter : RecyclerView.Adapter() { RecyclerView.ViewHolder(binding.root) { private val divider = 1000000f - private val strNo = itemView.context.getString(R.string.btn_no) - private val strYes = itemView.context.getString(R.string.btn_yes) + private val strNo = itemView.context.getString(R.string.no) + private val strYes = itemView.context.getString(R.string.yes) private val mode = itemView.context.getString(R.string.trans_mode) private val formatLink = itemView.context.getString(R.string.trans_link_low) private val formatLinkNull = itemView.context.getString(R.string.trans_no_link) 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 799ab76c..e66e67c8 100644 --- a/app/src/main/java/com/rtbishop/look4sat/utility/Extensions.kt +++ b/app/src/main/java/com/rtbishop/look4sat/utility/Extensions.kt @@ -18,10 +18,13 @@ package com.rtbishop.look4sat.utility import android.os.Bundle +import android.view.View import androidx.annotation.IdRes import androidx.navigation.NavController import androidx.navigation.NavOptions import androidx.navigation.Navigator +import com.google.android.material.snackbar.Snackbar +import com.rtbishop.look4sat.R import java.util.concurrent.TimeUnit fun Long.toTimerString(): String { @@ -38,6 +41,12 @@ fun Double.round(decimals: Int): Double { return kotlin.math.round(this * multiplier) / multiplier } +fun View.showSnack(message: String, isAnchored: Boolean = true) { + Snackbar.make(this, message, Snackbar.LENGTH_SHORT).apply { + if (isAnchored) setAnchorView(R.id.nav_bottom) + }.show() +} + fun NavController.navigateSafe( @IdRes resId: Int, args: Bundle? = null, diff --git a/app/src/main/res/drawable/ic_baseline_cached_24.xml b/app/src/main/res/drawable/ic_baseline_cached_24.xml new file mode 100644 index 00000000..a96341a9 --- /dev/null +++ b/app/src/main/res/drawable/ic_baseline_cached_24.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_baseline_link_24.xml b/app/src/main/res/drawable/ic_baseline_link_24.xml new file mode 100644 index 00000000..1b02e601 --- /dev/null +++ b/app/src/main/res/drawable/ic_baseline_link_24.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_baseline_sync_24.xml b/app/src/main/res/drawable/ic_baseline_sync_24.xml new file mode 100644 index 00000000..07125691 --- /dev/null +++ b/app/src/main/res/drawable/ic_baseline_sync_24.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/layout/dialog_source.xml b/app/src/main/res/layout/dialog_source.xml new file mode 100644 index 00000000..0e9067f8 --- /dev/null +++ b/app/src/main/res/layout/dialog_source.xml @@ -0,0 +1,16 @@ + + + + + + diff --git a/app/src/main/res/layout/dialog_sources.xml b/app/src/main/res/layout/dialog_sources.xml deleted file mode 100644 index 71d3e729..00000000 --- a/app/src/main/res/layout/dialog_sources.xml +++ /dev/null @@ -1,83 +0,0 @@ - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/app/src/main/res/layout/dialog_splash.xml b/app/src/main/res/layout/dialog_splash.xml deleted file mode 100644 index 8b189ddf..00000000 --- a/app/src/main/res/layout/dialog_splash.xml +++ /dev/null @@ -1,85 +0,0 @@ - - - - - - - - - - - - - - \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_entries.xml b/app/src/main/res/layout/fragment_entries.xml index a3abb5d6..90883910 100644 --- a/app/src/main/res/layout/fragment_entries.xml +++ b/app/src/main/res/layout/fragment_entries.xml @@ -30,7 +30,19 @@ android:backgroundTint="@color/greyDark" android:contentDescription="@string/placeholder" android:elevation="4dp" - android:src="@drawable/ic_update_web" + android:src="@drawable/ic_baseline_cached_24" + app:layout_constraintBottom_toBottomOf="@+id/import_file" + app:layout_constraintEnd_toStartOf="@+id/import_source" + app:layout_constraintTop_toTopOf="@+id/import_file" /> + + diff --git a/app/src/main/res/layout/item_tle_source.xml b/app/src/main/res/layout/item_tle_source.xml deleted file mode 100644 index 5193c99e..00000000 --- a/app/src/main/res/layout/item_tle_source.xml +++ /dev/null @@ -1,31 +0,0 @@ - - - - - - - - - \ No newline at end of file diff --git a/app/src/main/res/navigation/nav_graph.xml b/app/src/main/res/navigation/nav_graph.xml index 4dd3f5ea..296e46b8 100644 --- a/app/src/main/res/navigation/nav_graph.xml +++ b/app/src/main/res/navigation/nav_graph.xml @@ -59,9 +59,5 @@ android:id="@+id/nav_info" android:name="com.rtbishop.look4sat.presentation.appInfoScreen.AppInfoFragment" tools:layout="@layout/fragment_info" /> - diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml index 82411fd1..ea8b3061 100644 --- a/app/src/main/res/values-ru/strings.xml +++ b/app/src/main/res/values-ru/strings.xml @@ -1,9 +1,7 @@ - Да - Нет - Отмена - Обновить + Да + Нет Спутники Пролеты @@ -11,9 +9,9 @@ Настройки Инфо - Управление TLE - Источник TLE - Только протокол HTTPS + Введите HTTPS адрес источника + URL источника + Пожалуйста, проверьте URL Обновить спутники: Имя / Номер @@ -60,11 +58,6 @@ Использовать компас Показывать время пролета по UTC - Данные спутников теряют точность со временем, поэтому - их рекомендуется обновлять примерно раз в неделю - Чтобы корректно рассчитывать орбиты спутников, - установите позицию наземной станции через меню Настройки - Настройки слежения Управление поворотным устройством IP адрес поворотного устройства @@ -74,7 +67,7 @@ Версия: %s Трекер спутников для Android - Угостить кофе + Поддержать Огромное спасибо: \n— Вам за использование этого приложения! \nЖелаю всегда чистого неба над головой! \n— David A. B. Johnson и diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 195b1c95..11bb37fd 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -3,10 +3,8 @@ Look4Sat Placeholder - No - Yes - Cancel - Update + No + Yes Satellites Passes @@ -14,9 +12,9 @@ Settings Info - Manage TLE sources - TLE source - Protocol HTTPS only + Enter HTTPS source address + Source URL + Please check the entered URL TLE data update: Name / Id @@ -76,11 +74,6 @@ Show pass time in UTC Use sensors to rotate PolarView - TLE satellite data looses precision over time, so it is - recommended to update it every week or so - To get the accurate predictions please set - the ground station position via the Settings menu - Tracking preferences Antenna rotator control Rotator IP address diff --git a/core/build.gradle b/core/build.gradle index 833913ef..b0b0327f 100644 --- a/core/build.gradle +++ b/core/build.gradle @@ -10,7 +10,7 @@ java { dependencies { implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk8:$kotlin_version" - implementation "org.jetbrains.kotlinx:kotlinx-coroutines-android:$coroutines_version" + implementation "org.jetbrains.kotlinx:kotlinx-coroutines-core:$coroutines_version" testImplementation "junit:junit:$junit_version" testImplementation "org.mockito:mockito-core:$mockito_version"