Add New feed intent filter

This commit is contained in:
Shinokuni 2024-08-06 18:05:06 +02:00
parent 22913aa129
commit 6af2f62b32
8 changed files with 71 additions and 29 deletions

View File

@ -38,6 +38,12 @@
<category android:name="android.intent.category.LAUNCHER" /> <category android:name="android.intent.category.LAUNCHER" />
</intent-filter> </intent-filter>
<intent-filter android:label="@string/add_feed">
<action android:name="android.intent.action.SEND" />
<category android:name="android.intent.category.DEFAULT" />
<data android:mimeType="text/plain" />
</intent-filter>
</activity> </activity>
<activity <activity

View File

@ -101,7 +101,8 @@ class MainActivity : ComponentActivity(), KoinComponent {
} }
private suspend fun handleIntent(intent: Intent) { private suspend fun handleIntent(intent: Intent) {
if (intent.hasExtra(SyncWorker.ACCOUNT_ID_KEY)) { when {
intent.hasExtra(SyncWorker.ACCOUNT_ID_KEY) -> {
val accountId = intent.getIntExtra(SyncWorker.ACCOUNT_ID_KEY, -1) val accountId = intent.getIntExtra(SyncWorker.ACCOUNT_ID_KEY, -1)
get<Database>().accountDao() get<Database>().accountDao()
.updateCurrentAccount(accountId) .updateCurrentAccount(accountId)
@ -113,6 +114,10 @@ class MainActivity : ComponentActivity(), KoinComponent {
HomeScreen.openItemScreen(itemId) HomeScreen.openItemScreen(itemId)
} }
} }
intent.action != null && intent.action == Intent.ACTION_SEND -> {
HomeScreen.openAddFeedDialog(intent.getStringExtra(Intent.EXTRA_TEXT).orEmpty())
}
}
} }
private fun useDarkTheme(mode: String, darkFlag: Int): Boolean { private fun useDarkTheme(mode: String, darkFlag: Int): Boolean {

View File

@ -167,7 +167,8 @@ class FeedScreenModel(
} }
fun openDialog(state: DialogState) { fun openDialog(state: DialogState) {
if (state is DialogState.UpdateFeed) { when (state) {
is DialogState.UpdateFeed -> {
_updateFeedDialogState.update { _updateFeedDialogState.update {
it.copy( it.copy(
feedId = state.feed.id, feedId = state.feed.id,
@ -178,14 +179,20 @@ class FeedScreenModel(
) )
} }
} }
is DialogState.UpdateFolder -> {
if (state is DialogState.UpdateFolder) {
_folderState.update { _folderState.update {
it.copy( it.copy(
value = state.folder.name.orEmpty() value = state.folder.name.orEmpty()
) )
} }
} }
is DialogState.AddFeed -> {
_addFeedDialogState.update {
it.copy(url = state.url.orEmpty())
}
}
else -> {}
}
_feedState.update { it.copy(dialog = state) } _feedState.update { it.copy(dialog = state) }
} }
@ -308,7 +315,7 @@ class FeedScreenModel(
) )
if (errors.isEmpty()) { if (errors.isEmpty()) {
closeDialog(DialogState.AddFeed) closeDialog(_feedState.value.dialog)
} else { } else {
_addFeedDialogState.update { _addFeedDialogState.update {
it.copy( it.copy(

View File

@ -14,7 +14,7 @@ data class FeedState(
) )
sealed interface DialogState { sealed interface DialogState {
data object AddFeed : DialogState data class AddFeed(val url: String? = null) : DialogState
data object AddFolder : DialogState data object AddFolder : DialogState
class DeleteFeed(val feed: Feed) : DialogState class DeleteFeed(val feed: Feed) : DialogState
class DeleteFolder(val folder: Folder) : DialogState class DeleteFolder(val folder: Folder) : DialogState

View File

@ -1,5 +1,6 @@
package com.readrops.app.feeds package com.readrops.app.feeds
import android.util.Patterns
import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.Box
import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.fillMaxSize
@ -53,9 +54,13 @@ import com.readrops.app.util.components.dialog.TextFieldDialog
import com.readrops.app.util.components.dialog.TwoChoicesDialog import com.readrops.app.util.components.dialog.TwoChoicesDialog
import com.readrops.app.util.theme.spacing import com.readrops.app.util.theme.spacing
import com.readrops.db.entities.Feed import com.readrops.db.entities.Feed
import kotlinx.coroutines.channels.Channel
import kotlinx.coroutines.flow.receiveAsFlow
object FeedTab : Tab { object FeedTab : Tab {
private val addFeedDialogChannel = Channel<String>()
override val options: TabOptions override val options: TabOptions
@Composable @Composable
get() = TabOptions( get() = TabOptions(
@ -84,6 +89,15 @@ object FeedTab : Tab {
} }
} }
LaunchedEffect(Unit) {
addFeedDialogChannel.receiveAsFlow()
.collect { url ->
if (Patterns.WEB_URL.matcher(url).matches()) {
screenModel.openDialog(DialogState.AddFeed(url))
}
}
}
FeedDialogs( FeedDialogs(
state = state, state = state,
screenModel = screenModel screenModel = screenModel
@ -131,7 +145,7 @@ object FeedTab : Tab {
} }
FloatingActionButton( FloatingActionButton(
onClick = { screenModel.openDialog(DialogState.AddFeed) } onClick = { screenModel.openDialog(DialogState.AddFeed()) }
) { ) {
Icon( Icon(
imageVector = Icons.Default.Add, imageVector = Icons.Default.Add,
@ -242,7 +256,7 @@ object FeedTab : Tab {
onExpandChange = { screenModel.setAccountDropDownExpanded(it) }, onExpandChange = { screenModel.setAccountDropDownExpanded(it) },
onAccountClick = { screenModel.setAddFeedDialogSelectedAccount(it) }, onAccountClick = { screenModel.setAddFeedDialogSelectedAccount(it) },
onValidate = { screenModel.addFeedDialogValidate() }, onValidate = { screenModel.addFeedDialogValidate() },
onDismiss = { screenModel.closeDialog(DialogState.AddFeed) }, onDismiss = { screenModel.closeDialog(DialogState.AddFeed()) },
) )
} }
@ -325,6 +339,9 @@ object FeedTab : Tab {
null -> {} null -> {}
} }
}
suspend fun openAddFeedDialog(url: String) {
addFeedDialogChannel.send(url)
} }
} }

View File

@ -145,4 +145,9 @@ object HomeScreen : AndroidScreen() {
suspend fun openTab(tab: Tab) { suspend fun openTab(tab: Tab) {
tabChannel.send(tab) tabChannel.send(tab)
} }
suspend fun openAddFeedDialog(url: String) {
tabChannel.send(FeedTab)
FeedTab.openAddFeedDialog(url)
}
} }

View File

@ -216,4 +216,5 @@
<string name="bitcoin_copy_address">Bitcoin (copier l\'adresse)</string> <string name="bitcoin_copy_address">Bitcoin (copier l\'adresse)</string>
<string name="litecoin_copy_address">Litecoin (copier l\'adresse)</string> <string name="litecoin_copy_address">Litecoin (copier l\'adresse)</string>
<string name="donation_text">"Si vous considérez que mon travail vous est utile et si vous souhaitez me soutenir, vous pouvez me faire une donation. "</string> <string name="donation_text">"Si vous considérez que mon travail vous est utile et si vous souhaitez me soutenir, vous pouvez me faire une donation. "</string>
<string name="add_feed">Ajouter un flux</string>
</resources> </resources>

View File

@ -229,4 +229,5 @@
<string name="bitcoin_copy_address">Bitcoin (copy address)</string> <string name="bitcoin_copy_address">Bitcoin (copy address)</string>
<string name="litecoin_copy_address">Litecoin (copy address)</string> <string name="litecoin_copy_address">Litecoin (copy address)</string>
<string name="donation_text">I you find my work useful and you would like to support me, you can consider making me a donation.</string> <string name="donation_text">I you find my work useful and you would like to support me, you can consider making me a donation.</string>
<string name="add_feed">Add feed</string>
</resources> </resources>