Optimize SubscribeDialog

This commit is contained in:
Ash 2022-04-02 22:28:16 +08:00
parent 4c95f89b07
commit c42d92fcc8
7 changed files with 47 additions and 72 deletions

View File

@ -1,6 +1,5 @@
package me.ash.reader.ui.page.home.drawer.feed
import android.util.Log
import androidx.compose.foundation.BorderStroke
import androidx.compose.foundation.layout.*
import androidx.compose.material.ExperimentalMaterialApi
@ -9,7 +8,6 @@ import androidx.compose.material.icons.rounded.DeleteOutline
import androidx.compose.material.icons.rounded.RssFeed
import androidx.compose.material3.*
import androidx.compose.runtime.Composable
import androidx.compose.runtime.DisposableEffect
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.Color
@ -82,7 +80,7 @@ fun FeedOptionDrawer(
parseFullContentPresetOnClick = {
viewModel.dispatch(FeedOptionViewAction.ChangeParseFullContentPreset)
},
groupOnClick = {
onGroupClick = {
viewModel.dispatch(FeedOptionViewAction.SelectedGroup(it))
},
onKeyboardAction = { },

View File

@ -133,11 +133,7 @@ fun FeedsPage(
)
},
content = {
SubscribeDialog(
openInputStreamCallback = {
feedsViewModel.dispatch(FeedsViewAction.ImportFromInputStream(it))
},
)
SubscribeDialog()
LazyColumn {
item {
Text(

View File

@ -15,7 +15,6 @@ import me.ash.reader.data.repository.AccountRepository
import me.ash.reader.data.repository.OpmlRepository
import me.ash.reader.data.repository.RssRepository
import me.ash.reader.ui.page.home.FilterState
import java.io.InputStream
import javax.inject.Inject
@HiltViewModel
@ -31,7 +30,6 @@ class FeedsViewModel @Inject constructor(
when (action) {
is FeedsViewAction.FetchAccount -> fetchAccount()
is FeedsViewAction.FetchData -> fetchData(action.filterState)
is FeedsViewAction.ImportFromInputStream -> importFromInputStream(action.inputStream)
is FeedsViewAction.ExportAsString -> exportAsOpml(action.callback)
is FeedsViewAction.ScrollToItem -> scrollToItem(action.index)
}
@ -47,17 +45,6 @@ class FeedsViewModel @Inject constructor(
}
}
private fun importFromInputStream(inputStream: InputStream) {
viewModelScope.launch(Dispatchers.IO) {
try {
opmlRepository.saveToDatabase(inputStream)
rssRepository.get().doSync()
} catch (e: Exception) {
Log.e("FeedsViewModel", "importFromInputStream: ", e)
}
}
}
private fun exportAsOpml(callback: (String) -> Unit = {}) {
viewModelScope.launch(Dispatchers.Default) {
try {
@ -157,10 +144,6 @@ sealed class FeedsViewAction {
object FetchAccount : FeedsViewAction()
data class ImportFromInputStream(
val inputStream: InputStream
) : FeedsViewAction()
data class ExportAsString(
val callback: (String) -> Unit = {}
) : FeedsViewAction()

View File

@ -42,7 +42,7 @@ fun ResultViewPage(
changeNewGroupSelected: (Boolean) -> Unit = {},
allowNotificationPresetOnClick: () -> Unit = {},
parseFullContentPresetOnClick: () -> Unit = {},
groupOnClick: (groupId: String) -> Unit = {},
onGroupClick: (groupId: String) -> Unit = {},
onKeyboardAction: () -> Unit = {},
) {
Column(
@ -68,7 +68,7 @@ fun ResultViewPage(
newGroupSelected = newGroupSelected,
onNewGroupValueChange = onNewGroupValueChange,
changeNewGroupSelected = changeNewGroupSelected,
groupOnClick = groupOnClick,
onGroupClick = onGroupClick,
onKeyboardAction = onKeyboardAction,
)
Spacer(modifier = Modifier.height(6.dp))
@ -158,7 +158,7 @@ private fun AddToGroup(
newGroupSelected: Boolean,
onNewGroupValueChange: (String) -> Unit = {},
changeNewGroupSelected: (Boolean) -> Unit = {},
groupOnClick: (groupId: String) -> Unit = {},
onGroupClick: (groupId: String) -> Unit = {},
onKeyboardAction: () -> Unit = {},
) {
Subtitle(text = stringResource(R.string.add_to_group))
@ -175,7 +175,7 @@ private fun AddToGroup(
selected = !newGroupSelected && it.id == selectedGroupId,
) {
changeNewGroupSelected(false)
groupOnClick(it.id)
onGroupClick(it.id)
}
}

View File

@ -21,31 +21,27 @@ import androidx.compose.ui.unit.dp
import androidx.compose.ui.window.DialogProperties
import androidx.hilt.navigation.compose.hiltViewModel
import com.google.accompanist.pager.ExperimentalPagerApi
import kotlinx.coroutines.Dispatchers
import me.ash.reader.*
import me.ash.reader.R
import me.ash.reader.ui.extension.collectAsStateValue
import me.ash.reader.ui.widget.Dialog
import java.io.InputStream
@OptIn(ExperimentalPagerApi::class, androidx.compose.ui.ExperimentalComposeUiApi::class)
@Composable
fun SubscribeDialog(
modifier: Modifier = Modifier,
subscribeViewModel: SubscribeViewModel = hiltViewModel(),
openInputStreamCallback: (InputStream) -> Unit,
) {
val context = LocalContext.current
val focusManager = LocalFocusManager.current
val scope = rememberCoroutineScope()
val viewState = subscribeViewModel.viewState.collectAsStateValue()
val groupsState =
viewState.groups.collectAsState(initial = emptyList(), context = Dispatchers.IO)
val groupsState = viewState.groups.collectAsState(initial = emptyList())
var dialogHeight by remember { mutableStateOf(300.dp) }
val launcher = rememberLauncherForActivityResult(ActivityResultContracts.GetContent()) {
it?.let { uri ->
context.contentResolver.openInputStream(uri)?.let { inputStream ->
openInputStreamCallback(inputStream)
subscribeViewModel.dispatch(SubscribeViewAction.ImportFromInputStream(inputStream))
}
}
}
@ -99,48 +95,40 @@ fun SubscribeDialog(
},
text = {
SubscribeViewPager(
readOnly = viewState.lockLinkInput,
inputLink = viewState.linkContent,
errorMessage = viewState.errorMessage,
viewState = viewState,
onLinkValueChange = {
subscribeViewModel.dispatch(SubscribeViewAction.InputLink(it))
},
onSearchKeyboardAction = {
subscribeViewModel.dispatch(SubscribeViewAction.Search(scope))
},
link = viewState.linkContent,
groups = groupsState.value,
selectedAllowNotificationPreset = viewState.allowNotificationPreset,
selectedParseFullContentPreset = viewState.parseFullContentPreset,
selectedGroupId = viewState.selectedGroupId,
newGroupContent = viewState.newGroupContent,
onNewGroupValueChange = {
subscribeViewModel.dispatch(SubscribeViewAction.InputNewGroup(it))
},
newGroupSelected = viewState.newGroupSelected,
changeNewGroupSelected = {
subscribeViewModel.dispatch(SubscribeViewAction.SelectedNewGroup(it))
},
pagerState = viewState.pagerState,
allowNotificationPresetOnClick = {
subscribeViewModel.dispatch(SubscribeViewAction.ChangeAllowNotificationPreset)
},
parseFullContentPresetOnClick = {
subscribeViewModel.dispatch(SubscribeViewAction.ChangeParseFullContentPreset)
},
groupOnClick = {
onGroupClick = {
subscribeViewModel.dispatch(SubscribeViewAction.SelectedGroup(it))
},
onResultKeyboardAction = {
subscribeViewModel.dispatch(SubscribeViewAction.Subscribe)
}
},
)
},
confirmButton = {
when (viewState.pagerState.currentPage) {
0 -> {
TextButton(
enabled = viewState.linkContent.isNotEmpty(),
enabled = viewState.linkContent.isNotEmpty()
&& viewState.title != stringResource(R.string.searching),
onClick = {
focusManager.clearFocus()
subscribeViewModel.dispatch(SubscribeViewAction.Search(scope))

View File

@ -1,5 +1,6 @@
package me.ash.reader.ui.page.home.feeds.subscribe
import android.util.Log
import androidx.lifecycle.ViewModel
import androidx.lifecycle.viewModelScope
import com.google.accompanist.pager.ExperimentalPagerApi
@ -11,16 +12,19 @@ import me.ash.reader.R
import me.ash.reader.data.article.Article
import me.ash.reader.data.feed.Feed
import me.ash.reader.data.group.Group
import me.ash.reader.data.repository.OpmlRepository
import me.ash.reader.data.repository.RssHelper
import me.ash.reader.data.repository.RssRepository
import me.ash.reader.data.repository.StringsRepository
import me.ash.reader.formatUrl
import me.ash.reader.ui.extension.animateScrollToPage
import java.io.InputStream
import javax.inject.Inject
@OptIn(ExperimentalPagerApi::class)
@HiltViewModel
class SubscribeViewModel @Inject constructor(
private val opmlRepository: OpmlRepository,
private val rssRepository: RssRepository,
private val rssHelper: RssHelper,
private val stringsRepository: StringsRepository,
@ -35,6 +39,7 @@ class SubscribeViewModel @Inject constructor(
is SubscribeViewAction.Reset -> reset()
is SubscribeViewAction.Show -> changeVisible(true)
is SubscribeViewAction.Hide -> changeVisible(false)
is SubscribeViewAction.ImportFromInputStream -> importFromInputStream(action.inputStream)
is SubscribeViewAction.InputLink -> inputLink(action.content)
is SubscribeViewAction.Search -> search(action.scope)
is SubscribeViewAction.ChangeAllowNotificationPreset ->
@ -67,6 +72,17 @@ class SubscribeViewModel @Inject constructor(
}
}
private fun importFromInputStream(inputStream: InputStream) {
viewModelScope.launch(Dispatchers.IO) {
try {
opmlRepository.saveToDatabase(inputStream)
rssRepository.get().doSync()
} catch (e: Exception) {
Log.e("FeedsViewModel", "importFromInputStream: ", e)
}
}
}
private fun subscribe() {
val feed = _viewState.value.feed ?: return
val articles = _viewState.value.articles
@ -232,6 +248,10 @@ sealed class SubscribeViewAction {
object Show : SubscribeViewAction()
object Hide : SubscribeViewAction()
data class ImportFromInputStream(
val inputStream: InputStream
) : SubscribeViewAction()
data class InputLink(
val content: String
) : SubscribeViewAction()

View File

@ -6,32 +6,22 @@ import androidx.compose.ui.Modifier
import androidx.compose.ui.input.pointer.pointerInput
import androidx.compose.ui.platform.LocalFocusManager
import com.google.accompanist.pager.ExperimentalPagerApi
import com.google.accompanist.pager.PagerState
import me.ash.reader.data.group.Group
import me.ash.reader.ui.widget.ViewPager
@OptIn(ExperimentalPagerApi::class)
@Composable
fun SubscribeViewPager(
viewState: SubscribeViewState,
modifier: Modifier = Modifier,
readOnly: Boolean = false,
inputLink: String = "",
errorMessage: String = "",
onLinkValueChange: (String) -> Unit = {},
onSearchKeyboardAction: () -> Unit = {},
link: String = "",
groups: List<Group> = emptyList(),
selectedAllowNotificationPreset: Boolean = false,
selectedParseFullContentPreset: Boolean = false,
selectedGroupId: String = "",
newGroupContent: String = "",
onNewGroupValueChange: (String) -> Unit = {},
newGroupSelected: Boolean,
changeNewGroupSelected: (Boolean) -> Unit = {},
pagerState: PagerState = com.google.accompanist.pager.rememberPagerState(),
allowNotificationPresetOnClick: () -> Unit = {},
parseFullContentPresetOnClick: () -> Unit = {},
groupOnClick: (groupId: String) -> Unit = {},
onGroupClick: (groupId: String) -> Unit = {},
onResultKeyboardAction: () -> Unit = {},
) {
val focusManager = LocalFocusManager.current
@ -44,33 +34,33 @@ fun SubscribeViewPager(
}
)
},
state = pagerState,
state = viewState.pagerState,
userScrollEnabled = false,
composableList = listOf(
{
SearchViewPage(
pagerState = pagerState,
readOnly = readOnly,
inputLink = inputLink,
errorMessage = errorMessage,
pagerState = viewState.pagerState,
readOnly = viewState.lockLinkInput,
inputLink = viewState.linkContent,
errorMessage = viewState.errorMessage,
onLinkValueChange = onLinkValueChange,
onKeyboardAction = onSearchKeyboardAction,
)
},
{
ResultViewPage(
link = link,
link = viewState.linkContent,
groups = groups,
selectedAllowNotificationPreset = selectedAllowNotificationPreset,
selectedParseFullContentPreset = selectedParseFullContentPreset,
selectedGroupId = selectedGroupId,
newGroupContent = newGroupContent,
selectedAllowNotificationPreset = viewState.allowNotificationPreset,
selectedParseFullContentPreset = viewState.parseFullContentPreset,
selectedGroupId = viewState.selectedGroupId,
newGroupContent = viewState.newGroupContent,
onNewGroupValueChange = onNewGroupValueChange,
newGroupSelected = newGroupSelected,
newGroupSelected = viewState.newGroupSelected,
changeNewGroupSelected = changeNewGroupSelected,
allowNotificationPresetOnClick = allowNotificationPresetOnClick,
parseFullContentPresetOnClick = parseFullContentPresetOnClick,
groupOnClick = groupOnClick,
onGroupClick = onGroupClick,
onKeyboardAction = onResultKeyboardAction,
)
}