Slightly changed classes structure for readability

pull/122/head
Arty Bishop 2023-08-19 20:04:13 +01:00
rodzic 744d162a7d
commit 3e90dafcd2
Nie znaleziono w bazie danych klucza dla tego podpisu
ID klucza GPG: 5C71CFDC37AD73CC
17 zmienionych plików z 149 dodań i 192 usunięć

Wyświetl plik

@ -1,4 +1,4 @@
package com.rtbishop.look4sat.presentation
package com.rtbishop.look4sat.presentation.components
import android.content.Context
import android.content.Intent

Wyświetl plik

@ -14,7 +14,7 @@
* limitations under the License.
*/
package com.rtbishop.look4sat.presentation.pullRefresh
package com.rtbishop.look4sat.presentation.components
import androidx.compose.animation.Crossfade
import androidx.compose.animation.core.tween

Wyświetl plik

@ -14,7 +14,7 @@
* limitations under the License.
*/
package com.rtbishop.look4sat.presentation.pullRefresh
package com.rtbishop.look4sat.presentation.components
import androidx.compose.animation.core.LinearOutSlowInEasing
import androidx.compose.runtime.getValue

Wyświetl plik

@ -14,7 +14,7 @@
* limitations under the License.
*/
package com.rtbishop.look4sat.presentation.pullRefresh
package com.rtbishop.look4sat.presentation.components
import androidx.compose.animation.core.animate
import androidx.compose.runtime.Composable

Wyświetl plik

@ -1,57 +0,0 @@
package com.rtbishop.look4sat.presentation.dialogs
import androidx.compose.foundation.layout.Arrangement
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.Row
import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.padding
import androidx.compose.material3.ElevatedCard
import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.OutlinedTextField
import androidx.compose.material3.Text
import androidx.compose.runtime.Composable
import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.saveable.rememberSaveable
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.res.stringResource
import androidx.compose.ui.tooling.preview.Preview
import androidx.compose.ui.unit.dp
import androidx.compose.ui.window.Dialog
import com.rtbishop.look4sat.R
import com.rtbishop.look4sat.presentation.CardButton
import com.rtbishop.look4sat.presentation.MainTheme
@Preview(showBackground = true)
@Composable
private fun LocatorDialogPreview() {
MainTheme { LocatorDialog("IO91vl", {}) { } }
}
@Composable
fun LocatorDialog(qthLocator: String, dismiss: () -> Unit, save: (String) -> Unit) {
val locator = rememberSaveable { mutableStateOf(qthLocator) }
val maxWidthModifier = Modifier.fillMaxWidth(1f)
Dialog(onDismissRequest = { dismiss() }) {
ElevatedCard {
Column(
horizontalAlignment = Alignment.CenterHorizontally,
verticalArrangement = Arrangement.spacedBy(12.dp),
modifier = maxWidthModifier.padding(12.dp)
) {
Text(text = stringResource(id = R.string.locator_title), color = MaterialTheme.colorScheme.primary)
Text(text = stringResource(id = R.string.locator_text))
OutlinedTextField(value = locator.value, onValueChange = { locator.value = it })
Row(horizontalArrangement = Arrangement.SpaceBetween, modifier = Modifier.fillMaxWidth()) {
CardButton(onClick = { dismiss() }, text = stringResource(id = R.string.btn_cancel))
CardButton(
onClick = {
save(locator.value)
dismiss()
}, text = stringResource(id = R.string.btn_accept)
)
}
}
}
}
}

Wyświetl plik

@ -1,76 +0,0 @@
package com.rtbishop.look4sat.presentation.dialogs
import androidx.compose.foundation.background
import androidx.compose.foundation.clickable
import androidx.compose.foundation.layout.Arrangement
import androidx.compose.foundation.layout.Row
import androidx.compose.foundation.layout.fillMaxHeight
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.lazy.grid.GridCells
import androidx.compose.foundation.lazy.grid.LazyVerticalGrid
import androidx.compose.foundation.lazy.grid.itemsIndexed
import androidx.compose.material3.Checkbox
import androidx.compose.material3.ElevatedCard
import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.Surface
import androidx.compose.material3.Text
import androidx.compose.runtime.Composable
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.text.font.FontWeight
import androidx.compose.ui.text.style.TextOverflow
import androidx.compose.ui.tooling.preview.Preview
import androidx.compose.ui.unit.dp
import androidx.compose.ui.window.Dialog
import com.rtbishop.look4sat.presentation.MainTheme
@Preview(showBackground = true)
@Composable
private fun ModesDialogPreview() {
val allModes = listOf(
"AFSK", "AFSK S-Net", "AFSK SALSAT", "AHRPT", "AM", "APT", "BPSK", "BPSK PMT-A3",
"CERTO", "CW", "DQPSK", "DSTAR", "DUV", "FFSK", "FM", "FMN", "FSK", "FSK AX.100 Mode 5",
"FSK AX.100 Mode 6", "FSK AX.25 G3RUH", "GFSK", "GFSK Rktr", "GMSK", "HRPT", "LoRa",
"LRPT", "LSB", "MFSK", "MSK", "MSK AX.100 Mode 5", "MSK AX.100 Mode 6", "OFDM", "OQPSK",
"PSK", "PSK31", "PSK63", "QPSK", "QPSK31", "QPSK63", "SSTV", "USB", "WSJT"
)
MainTheme { ModesDialog(allModes, listOf("AFSK", "AFSK S-Net"), {}) {} }
}
@Composable
fun ModesDialog(items: List<String>, selected: List<String>, dismiss: () -> Unit, select: (String) -> Unit) {
Dialog(onDismissRequest = { dismiss() }) {
ElevatedCard(modifier = Modifier.fillMaxHeight(0.75f)) {
LazyVerticalGrid(
columns = GridCells.Adaptive(160.dp),
modifier = Modifier.background(MaterialTheme.colorScheme.background),
horizontalArrangement = Arrangement.spacedBy(1.dp),
verticalArrangement = Arrangement.spacedBy(1.dp)
) {
itemsIndexed(items) { index, item ->
Surface {
Row(verticalAlignment = Alignment.CenterVertically,
modifier = Modifier
.background(MaterialTheme.colorScheme.surface)
.clickable { select(item) }) {
Text(
text = "$index).",
modifier = Modifier.padding(start = 12.dp, end = 6.dp),
fontWeight = FontWeight.Normal,
color = MaterialTheme.colorScheme.secondary
)
Text(
text = item,
modifier = Modifier.weight(1f),
fontWeight = FontWeight.Medium,
maxLines = 1,
overflow = TextOverflow.Ellipsis
)
Checkbox(checked = selected.contains(item), onCheckedChange = { select(item) })
}
}
}
}
}
}
}

Wyświetl plik

@ -1,4 +1,4 @@
package com.rtbishop.look4sat.presentation.dialogs
package com.rtbishop.look4sat.presentation.entries
import androidx.compose.foundation.background
import androidx.compose.foundation.clickable

Wyświetl plik

@ -40,27 +40,26 @@ import androidx.compose.ui.unit.dp
import androidx.compose.ui.unit.sp
import com.rtbishop.look4sat.R
import com.rtbishop.look4sat.domain.model.SatItem
import com.rtbishop.look4sat.presentation.CardIcon
import com.rtbishop.look4sat.presentation.CardLoadingIndicator
import com.rtbishop.look4sat.presentation.MainTheme
import com.rtbishop.look4sat.presentation.dialogs.TypesDialog
import com.rtbishop.look4sat.presentation.components.CardIcon
import com.rtbishop.look4sat.presentation.components.CardLoadingIndicator
@Composable
fun EntriesScreen(uiState: EntriesUiState, navToPasses: () -> Unit) {
fun EntriesScreen(uiState: EntriesState, navToPasses: () -> Unit) {
val showDialog = rememberSaveable { mutableStateOf(false) }
val toggleDialog = { showDialog.value = showDialog.value.not() }
if (showDialog.value) {
TypesDialog(items = uiState.typesList, selected = uiState.currentType, toggleDialog) {
uiState.takeAction(EntriesUiAction.SelectType(it))
uiState.takeAction(EntriesAction.SelectType(it))
}
}
val unselectAll = { uiState.takeAction(EntriesUiAction.UnselectAll) }
val selectAll = { uiState.takeAction(EntriesUiAction.SelectAll) }
val unselectAll = { uiState.takeAction(EntriesAction.UnselectAll) }
val selectAll = { uiState.takeAction(EntriesAction.SelectAll) }
Column(modifier = Modifier.padding(6.dp), verticalArrangement = Arrangement.spacedBy(6.dp)) {
TopBar(setQuery = { newQuery: String -> uiState.takeAction(EntriesUiAction.SearchFor(newQuery)) },
TopBar(setQuery = { newQuery: String -> uiState.takeAction(EntriesAction.SearchFor(newQuery)) },
saveSelection = {
uiState.takeAction(EntriesUiAction.SaveSelection)
uiState.takeAction(EntriesAction.SaveSelection)
navToPasses()
})
MiddleBar(uiState.currentType, { toggleDialog() }, { unselectAll() }, { selectAll() })
@ -69,7 +68,7 @@ fun EntriesScreen(uiState: EntriesUiState, navToPasses: () -> Unit) {
CardLoadingIndicator()
} else {
EntriesCard(uiState.itemsList) { id, isTicked ->
uiState.takeAction(EntriesUiAction.SelectSingle(id, isTicked))
uiState.takeAction(EntriesAction.SelectSingle(id, isTicked))
}
}
}

Wyświetl plik

@ -0,0 +1,20 @@
package com.rtbishop.look4sat.presentation.entries
import com.rtbishop.look4sat.domain.model.SatItem
data class EntriesState(
val isLoading: Boolean,
val itemsList: List<SatItem>,
val currentType: String,
val typesList: List<String>,
val takeAction: (EntriesAction) -> Unit
)
sealed class EntriesAction {
data object SaveSelection : EntriesAction()
data class SearchFor(val query: String) : EntriesAction()
data object SelectAll : EntriesAction()
data class SelectSingle(val id: Int, val isTicked: Boolean) : EntriesAction()
data class SelectType(val type: String) : EntriesAction()
data object UnselectAll : EntriesAction()
}

Wyświetl plik

@ -1,20 +0,0 @@
package com.rtbishop.look4sat.presentation.entries
import com.rtbishop.look4sat.domain.model.SatItem
data class EntriesUiState(
val isLoading: Boolean,
val itemsList: List<SatItem>,
val currentType: String,
val typesList: List<String>,
val takeAction: (EntriesUiAction) -> Unit
)
sealed class EntriesUiAction {
data object SaveSelection : EntriesUiAction()
data class SearchFor(val query: String) : EntriesUiAction()
data object SelectAll : EntriesUiAction()
data class SelectSingle(val id: Int, val isTicked: Boolean) : EntriesUiAction()
data class SelectType(val type: String) : EntriesUiAction()
data object UnselectAll : EntriesUiAction()
}

Wyświetl plik

@ -30,7 +30,7 @@ import kotlinx.coroutines.launch
class EntriesViewModel(private val selectionRepo: ISelectionRepo) : ViewModel() {
private val defaultUiState = EntriesUiState(
private val defaultUiState = EntriesState(
isLoading = true,
itemsList = emptyList(),
currentType = selectionRepo.getCurrentType(),
@ -48,14 +48,14 @@ class EntriesViewModel(private val selectionRepo: ISelectionRepo) : ViewModel()
}
}
private fun handleAction(action: EntriesUiAction) {
private fun handleAction(action: EntriesAction) {
when (action) {
EntriesUiAction.SaveSelection -> saveSelection()
is EntriesUiAction.SearchFor -> searchFor(action.query)
EntriesUiAction.SelectAll -> selectAll(true)
is EntriesUiAction.SelectSingle -> selectSingle(action.id, action.isTicked)
is EntriesUiAction.SelectType -> selectType(action.type)
EntriesUiAction.UnselectAll -> selectAll(false)
EntriesAction.SaveSelection -> saveSelection()
is EntriesAction.SearchFor -> searchFor(action.query)
EntriesAction.SelectAll -> selectAll(true)
is EntriesAction.SelectSingle -> selectSingle(action.id, action.isTicked)
is EntriesAction.SelectType -> selectType(action.type)
EntriesAction.UnselectAll -> selectAll(false)
}
}

Wyświetl plik

@ -22,9 +22,9 @@ import androidx.compose.ui.tooling.preview.Preview
import androidx.compose.ui.unit.dp
import androidx.compose.ui.unit.sp
import com.rtbishop.look4sat.R
import com.rtbishop.look4sat.presentation.CardButton
import com.rtbishop.look4sat.presentation.MainTheme
import com.rtbishop.look4sat.presentation.gotoUrl
import com.rtbishop.look4sat.presentation.components.CardButton
import com.rtbishop.look4sat.presentation.components.gotoUrl
private const val POLICY_URL = "https://sites.google.com/view/look4sat-privacy-policy/home"
private const val LICENSE_URL = "https://www.gnu.org/licenses/gpl-3.0.html"

Wyświetl plik

@ -15,19 +15,27 @@
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
package com.rtbishop.look4sat.presentation.dialogs
package com.rtbishop.look4sat.presentation.passes
import androidx.compose.foundation.background
import androidx.compose.foundation.clickable
import androidx.compose.foundation.layout.Arrangement
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.Row
import androidx.compose.foundation.layout.fillMaxHeight
import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.layout.size
import androidx.compose.foundation.lazy.grid.GridCells
import androidx.compose.foundation.lazy.grid.LazyVerticalGrid
import androidx.compose.foundation.lazy.grid.itemsIndexed
import androidx.compose.material3.Checkbox
import androidx.compose.material3.ElevatedCard
import androidx.compose.material3.Icon
import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.Slider
import androidx.compose.material3.SliderDefaults
import androidx.compose.material3.Surface
import androidx.compose.material3.Text
import androidx.compose.runtime.Composable
import androidx.compose.runtime.mutableIntStateOf
@ -37,13 +45,14 @@ import androidx.compose.ui.Modifier
import androidx.compose.ui.res.painterResource
import androidx.compose.ui.res.stringResource
import androidx.compose.ui.text.font.FontWeight
import androidx.compose.ui.text.style.TextOverflow
import androidx.compose.ui.tooling.preview.Preview
import androidx.compose.ui.unit.dp
import androidx.compose.ui.unit.sp
import androidx.compose.ui.window.Dialog
import com.rtbishop.look4sat.R
import com.rtbishop.look4sat.presentation.CardButton
import com.rtbishop.look4sat.presentation.MainTheme
import com.rtbishop.look4sat.presentation.components.CardButton
@Preview(showBackground = true)
@Composable
@ -123,3 +132,54 @@ fun FilterDialog(hours: Int, elevation: Double, dismiss: () -> Unit, save: (Int,
}
}
}
@Preview(showBackground = true)
@Composable
private fun ModesDialogPreview() {
val allModes = listOf(
"AFSK", "AFSK S-Net", "AFSK SALSAT", "AHRPT", "AM", "APT", "BPSK", "BPSK PMT-A3",
"CERTO", "CW", "DQPSK", "DSTAR", "DUV", "FFSK", "FM", "FMN", "FSK", "FSK AX.100 Mode 5",
"FSK AX.100 Mode 6", "FSK AX.25 G3RUH", "GFSK", "GFSK Rktr", "GMSK", "HRPT", "LoRa",
"LRPT", "LSB", "MFSK", "MSK", "MSK AX.100 Mode 5", "MSK AX.100 Mode 6", "OFDM", "OQPSK",
"PSK", "PSK31", "PSK63", "QPSK", "QPSK31", "QPSK63", "SSTV", "USB", "WSJT"
)
MainTheme { ModesDialog(allModes, listOf("AFSK", "AFSK S-Net"), {}) {} }
}
@Composable
fun ModesDialog(items: List<String>, selected: List<String>, dismiss: () -> Unit, select: (String) -> Unit) {
Dialog(onDismissRequest = { dismiss() }) {
ElevatedCard(modifier = Modifier.fillMaxHeight(0.75f)) {
LazyVerticalGrid(
columns = GridCells.Adaptive(160.dp),
modifier = Modifier.background(MaterialTheme.colorScheme.background),
horizontalArrangement = Arrangement.spacedBy(1.dp),
verticalArrangement = Arrangement.spacedBy(1.dp)
) {
itemsIndexed(items) { index, item ->
Surface {
Row(verticalAlignment = Alignment.CenterVertically,
modifier = Modifier
.background(MaterialTheme.colorScheme.surface)
.clickable { select(item) }) {
Text(
text = "$index).",
modifier = Modifier.padding(start = 12.dp, end = 6.dp),
fontWeight = FontWeight.Normal,
color = MaterialTheme.colorScheme.secondary
)
Text(
text = item,
modifier = Modifier.weight(1f),
fontWeight = FontWeight.Medium,
maxLines = 1,
overflow = TextOverflow.Ellipsis
)
Checkbox(checked = selected.contains(item), onCheckedChange = { select(item) })
}
}
}
}
}
}
}

Wyświetl plik

@ -43,11 +43,10 @@ import com.rtbishop.look4sat.domain.predict.NearEarthSatellite
import com.rtbishop.look4sat.domain.predict.OrbitalData
import com.rtbishop.look4sat.domain.predict.SatPass
import com.rtbishop.look4sat.presentation.MainTheme
import com.rtbishop.look4sat.presentation.dialogs.FilterDialog
import com.rtbishop.look4sat.presentation.pullRefresh.PullRefreshIndicator
import com.rtbishop.look4sat.presentation.pullRefresh.PullRefreshState
import com.rtbishop.look4sat.presentation.pullRefresh.pullRefresh
import com.rtbishop.look4sat.presentation.pullRefresh.rememberPullRefreshState
import com.rtbishop.look4sat.presentation.components.PullRefreshIndicator
import com.rtbishop.look4sat.presentation.components.PullRefreshState
import com.rtbishop.look4sat.presentation.components.pullRefresh
import com.rtbishop.look4sat.presentation.components.rememberPullRefreshState
import java.text.SimpleDateFormat
import java.util.*

Wyświetl plik

@ -1,4 +1,4 @@
package com.rtbishop.look4sat.presentation.dialogs
package com.rtbishop.look4sat.presentation.settings
import androidx.compose.foundation.layout.Arrangement
import androidx.compose.foundation.layout.Column
@ -19,8 +19,8 @@ import androidx.compose.ui.tooling.preview.Preview
import androidx.compose.ui.unit.dp
import androidx.compose.ui.window.Dialog
import com.rtbishop.look4sat.R
import com.rtbishop.look4sat.presentation.CardButton
import com.rtbishop.look4sat.presentation.MainTheme
import com.rtbishop.look4sat.presentation.components.CardButton
@Preview(showBackground = true)
@Composable
@ -67,3 +67,37 @@ private fun saveValues(latValue: String, lonValue: String, dismiss: () -> Unit,
save(newLatitude, newLongitude)
dismiss()
}
@Preview(showBackground = true)
@Composable
private fun LocatorDialogPreview() {
MainTheme { LocatorDialog("IO91vl", {}) { } }
}
@Composable
fun LocatorDialog(qthLocator: String, dismiss: () -> Unit, save: (String) -> Unit) {
val locator = rememberSaveable { mutableStateOf(qthLocator) }
val maxWidthModifier = Modifier.fillMaxWidth(1f)
Dialog(onDismissRequest = { dismiss() }) {
ElevatedCard {
Column(
horizontalAlignment = Alignment.CenterHorizontally,
verticalArrangement = Arrangement.spacedBy(12.dp),
modifier = maxWidthModifier.padding(12.dp)
) {
Text(text = stringResource(id = R.string.locator_title), color = MaterialTheme.colorScheme.primary)
Text(text = stringResource(id = R.string.locator_text))
OutlinedTextField(value = locator.value, onValueChange = { locator.value = it })
Row(horizontalArrangement = Arrangement.SpaceBetween, modifier = Modifier.fillMaxWidth()) {
CardButton(onClick = { dismiss() }, text = stringResource(id = R.string.btn_cancel))
CardButton(
onClick = {
save(locator.value)
dismiss()
}, text = stringResource(id = R.string.btn_accept)
)
}
}
}
}
}

Wyświetl plik

@ -37,12 +37,10 @@ import com.rtbishop.look4sat.BuildConfig
import com.rtbishop.look4sat.R
import com.rtbishop.look4sat.domain.model.OtherSettings
import com.rtbishop.look4sat.domain.predict.GeoPos
import com.rtbishop.look4sat.presentation.CardButton
import com.rtbishop.look4sat.presentation.MainTheme
import com.rtbishop.look4sat.presentation.dialogs.LocatorDialog
import com.rtbishop.look4sat.presentation.dialogs.PositionDialog
import com.rtbishop.look4sat.presentation.gotoUrl
import com.rtbishop.look4sat.presentation.showToast
import com.rtbishop.look4sat.presentation.components.CardButton
import com.rtbishop.look4sat.presentation.components.gotoUrl
import com.rtbishop.look4sat.presentation.components.showToast
import java.text.SimpleDateFormat
import java.util.Date
import java.util.Locale