feat: add edit group view model arch
This commit is contained in:
parent
d8bc838754
commit
8e1e228946
|
@ -17,7 +17,7 @@ buildscript {
|
||||||
plugins {
|
plugins {
|
||||||
id 'kotlin-kapt'
|
id 'kotlin-kapt'
|
||||||
id 'com.google.dagger.hilt.android'
|
id 'com.google.dagger.hilt.android'
|
||||||
id 'com.google.devtools.ksp' version "$kspVersion"
|
id 'com.google.devtools.ksp'
|
||||||
id 'app.cash.molecule'
|
id 'app.cash.molecule'
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -206,9 +206,9 @@ android {
|
||||||
|
|
||||||
dependencies {
|
dependencies {
|
||||||
|
|
||||||
implementation("com.google.dagger:hilt-android:2.46.1")
|
implementation("com.google.dagger:hilt-android:$daggerVersion")
|
||||||
kapt("com.google.dagger:hilt-android-compiler:2.46")
|
kapt("com.google.dagger:hilt-android-compiler:$daggerVersion")
|
||||||
implementation("androidx.hilt:hilt-navigation-compose:1.0.0")
|
implementation("androidx.hilt:hilt-navigation-compose:1.1.0")
|
||||||
|
|
||||||
implementation "io.github.raamcosta.compose-destinations:core:$composeDestinationsVersion"
|
implementation "io.github.raamcosta.compose-destinations:core:$composeDestinationsVersion"
|
||||||
ksp "io.github.raamcosta.compose-destinations:ksp:$composeDestinationsVersion"
|
ksp "io.github.raamcosta.compose-destinations:ksp:$composeDestinationsVersion"
|
||||||
|
|
|
@ -14,6 +14,7 @@ import org.thoughtcrime.securesms.PassphraseRequiredActionBarActivity
|
||||||
import org.thoughtcrime.securesms.conversation.v2.ConversationActivityV2
|
import org.thoughtcrime.securesms.conversation.v2.ConversationActivityV2
|
||||||
import org.thoughtcrime.securesms.database.LokiThreadDatabase
|
import org.thoughtcrime.securesms.database.LokiThreadDatabase
|
||||||
import org.thoughtcrime.securesms.database.ThreadDatabase
|
import org.thoughtcrime.securesms.database.ThreadDatabase
|
||||||
|
import org.thoughtcrime.securesms.groups.EditClosedGroupActivity
|
||||||
import org.thoughtcrime.securesms.groups.EditLegacyClosedGroupActivity
|
import org.thoughtcrime.securesms.groups.EditLegacyClosedGroupActivity
|
||||||
import org.thoughtcrime.securesms.showSessionDialog
|
import org.thoughtcrime.securesms.showSessionDialog
|
||||||
import javax.inject.Inject
|
import javax.inject.Inject
|
||||||
|
@ -162,10 +163,19 @@ class ConversationSettingsActivity: PassphraseRequiredActionBarActivity(), View.
|
||||||
}
|
}
|
||||||
v === binding.editGroup -> {
|
v === binding.editGroup -> {
|
||||||
val recipient = viewModel.recipient ?: return
|
val recipient = viewModel.recipient ?: return
|
||||||
if (!recipient.isClosedGroupRecipient || !recipient.isLegacyClosedGroupRecipient) return
|
|
||||||
val intent = Intent(this, EditLegacyClosedGroupActivity::class.java)
|
val intent = when {
|
||||||
val groupID: String = recipient.address.toGroupString()
|
recipient.isLegacyClosedGroupRecipient -> Intent(this, EditLegacyClosedGroupActivity::class.java).apply {
|
||||||
intent.putExtra(EditLegacyClosedGroupActivity.groupIDKey, groupID)
|
val groupID: String = recipient.address.toGroupString()
|
||||||
|
putExtra(EditLegacyClosedGroupActivity.groupIDKey, groupID)
|
||||||
|
}
|
||||||
|
recipient.isClosedGroupRecipient -> Intent(this, EditClosedGroupActivity::class.java).apply {
|
||||||
|
val groupID = recipient.address.serialize()
|
||||||
|
putExtra(EditClosedGroupActivity.groupIDKey, groupID)
|
||||||
|
}
|
||||||
|
|
||||||
|
else -> return
|
||||||
|
}
|
||||||
startActivity(intent)
|
startActivity(intent)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -32,10 +32,18 @@ class ConversationSettingsViewModel(
|
||||||
}
|
}
|
||||||
|
|
||||||
fun isUserGroupAdmin(): Boolean = recipient?.let { recipient ->
|
fun isUserGroupAdmin(): Boolean = recipient?.let { recipient ->
|
||||||
if (!recipient.isLegacyClosedGroupRecipient || !recipient.isClosedGroupRecipient) return@let false
|
when {
|
||||||
val localUserAddress = prefs.getLocalNumber() ?: return@let false
|
recipient.isLegacyClosedGroupRecipient -> {
|
||||||
val group = storage.getGroup(recipient.address.toGroupString())
|
val localUserAddress = prefs.getLocalNumber() ?: return@let false
|
||||||
group?.admins?.contains(Address.fromSerialized(localUserAddress)) ?: false // this will have to be replaced for new closed groups
|
val group = storage.getGroup(recipient.address.toGroupString())
|
||||||
|
group?.admins?.contains(Address.fromSerialized(localUserAddress)) ?: false // this will have to be replaced for new closed groups
|
||||||
|
}
|
||||||
|
recipient.isClosedGroupRecipient -> {
|
||||||
|
val group = storage.getLibSessionClosedGroup(recipient.address.serialize()) ?: return@let false
|
||||||
|
group.hasAdminKey()
|
||||||
|
}
|
||||||
|
else -> false
|
||||||
|
}
|
||||||
} ?: false
|
} ?: false
|
||||||
|
|
||||||
fun clearMessages(forAll: Boolean) {
|
fun clearMessages(forAll: Boolean) {
|
||||||
|
|
|
@ -2,17 +2,23 @@ package org.thoughtcrime.securesms.groups
|
||||||
|
|
||||||
import android.os.Bundle
|
import android.os.Bundle
|
||||||
import androidx.activity.compose.setContent
|
import androidx.activity.compose.setContent
|
||||||
import androidx.lifecycle.viewmodel.viewModelFactory
|
|
||||||
import com.ramcosta.composedestinations.DestinationsNavHost
|
import com.ramcosta.composedestinations.DestinationsNavHost
|
||||||
import com.ramcosta.composedestinations.navigation.dependency
|
import com.ramcosta.composedestinations.navigation.dependency
|
||||||
import dagger.hilt.android.AndroidEntryPoint
|
import dagger.hilt.android.AndroidEntryPoint
|
||||||
import org.thoughtcrime.securesms.PassphraseRequiredActionBarActivity
|
import org.thoughtcrime.securesms.PassphraseRequiredActionBarActivity
|
||||||
import org.thoughtcrime.securesms.groups.compose.EditGroupViewModel
|
import org.thoughtcrime.securesms.groups.compose.EditGroupViewModel
|
||||||
import org.thoughtcrime.securesms.ui.AppTheme
|
import org.thoughtcrime.securesms.ui.AppTheme
|
||||||
|
import javax.inject.Inject
|
||||||
|
|
||||||
@AndroidEntryPoint
|
@AndroidEntryPoint
|
||||||
class EditClosedGroupActivity: PassphraseRequiredActionBarActivity() {
|
class EditClosedGroupActivity: PassphraseRequiredActionBarActivity() {
|
||||||
|
|
||||||
|
companion object {
|
||||||
|
const val groupIDKey = "EditClosedGroupActivity_groupID"
|
||||||
|
}
|
||||||
|
|
||||||
|
@Inject lateinit var factory: EditGroupViewModel.Factory
|
||||||
|
|
||||||
override fun onCreate(savedInstanceState: Bundle?, ready: Boolean) {
|
override fun onCreate(savedInstanceState: Bundle?, ready: Boolean) {
|
||||||
setContent {
|
setContent {
|
||||||
AppTheme {
|
AppTheme {
|
||||||
|
@ -20,7 +26,7 @@ class EditClosedGroupActivity: PassphraseRequiredActionBarActivity() {
|
||||||
navGraph = NavGraphs.editGroup,
|
navGraph = NavGraphs.editGroup,
|
||||||
dependenciesContainerBuilder = {
|
dependenciesContainerBuilder = {
|
||||||
dependency(NavGraphs.editGroup) {
|
dependency(NavGraphs.editGroup) {
|
||||||
EditGroupViewModel.Factory()
|
factory.create(intent.getStringExtra(groupIDKey)!!)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
|
|
|
@ -1,23 +1,25 @@
|
||||||
package org.thoughtcrime.securesms.groups.compose
|
package org.thoughtcrime.securesms.groups.compose
|
||||||
|
|
||||||
|
import androidx.compose.foundation.clickable
|
||||||
|
import androidx.compose.foundation.layout.fillMaxSize
|
||||||
|
import androidx.compose.material.Text
|
||||||
import androidx.compose.runtime.Composable
|
import androidx.compose.runtime.Composable
|
||||||
import androidx.compose.runtime.collectAsState
|
import androidx.compose.runtime.collectAsState
|
||||||
import androidx.compose.runtime.getValue
|
import androidx.compose.runtime.getValue
|
||||||
|
import androidx.compose.runtime.mutableStateOf
|
||||||
import androidx.compose.runtime.remember
|
import androidx.compose.runtime.remember
|
||||||
import androidx.hilt.navigation.compose.hiltViewModel
|
import androidx.compose.runtime.setValue
|
||||||
|
import androidx.compose.ui.Modifier
|
||||||
import androidx.lifecycle.ViewModel
|
import androidx.lifecycle.ViewModel
|
||||||
import androidx.lifecycle.viewModelScope
|
import androidx.lifecycle.viewModelScope
|
||||||
import app.cash.molecule.RecompositionMode
|
|
||||||
import app.cash.molecule.RecompositionMode.Immediate
|
import app.cash.molecule.RecompositionMode.Immediate
|
||||||
import app.cash.molecule.launchMolecule
|
import app.cash.molecule.launchMolecule
|
||||||
import com.google.android.gms.auth.api.signin.internal.Storage
|
|
||||||
import com.ramcosta.composedestinations.annotation.Destination
|
import com.ramcosta.composedestinations.annotation.Destination
|
||||||
import com.ramcosta.composedestinations.navigation.DestinationsNavigator
|
import com.ramcosta.composedestinations.navigation.DestinationsNavigator
|
||||||
import dagger.hilt.android.lifecycle.HiltViewModel
|
import dagger.assisted.Assisted
|
||||||
import kotlinx.coroutines.channels.Channel
|
import dagger.assisted.AssistedFactory
|
||||||
import kotlinx.coroutines.flow.consumeAsFlow
|
import dagger.assisted.AssistedInject
|
||||||
import org.session.libsession.database.StorageProtocol
|
import org.session.libsession.database.StorageProtocol
|
||||||
import javax.inject.Inject
|
|
||||||
|
|
||||||
@EditGroupNavGraph(start = true)
|
@EditGroupNavGraph(start = true)
|
||||||
@Composable
|
@Composable
|
||||||
|
@ -27,20 +29,53 @@ fun EditClosedGroupScreen(
|
||||||
viewModel: EditGroupViewModel
|
viewModel: EditGroupViewModel
|
||||||
) {
|
) {
|
||||||
|
|
||||||
|
val group by viewModel.viewState.collectAsState()
|
||||||
|
val viewState = group.viewState
|
||||||
|
val eventSink = group.eventSink
|
||||||
|
|
||||||
|
when (viewState) {
|
||||||
|
is EditGroupViewState.Display -> {
|
||||||
|
Text(
|
||||||
|
text = viewState.text,
|
||||||
|
modifier = Modifier.fillMaxSize()
|
||||||
|
.clickable {
|
||||||
|
eventSink(Unit)
|
||||||
|
}
|
||||||
|
)
|
||||||
|
}
|
||||||
|
else -> {
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@HiltViewModel
|
class EditGroupViewModel @AssistedInject constructor(
|
||||||
class EditGroupViewModel @Inject constructor(private val groupSessionId: String,
|
@Assisted private val groupSessionId: String,
|
||||||
private val storage: StorageProtocol): ViewModel() {
|
private val storage: StorageProtocol): ViewModel() {
|
||||||
|
|
||||||
val viewState = viewModelScope.launchMolecule(Immediate) {
|
val viewState = viewModelScope.launchMolecule(Immediate) {
|
||||||
|
|
||||||
val closedGroup = remember {
|
val closedGroup = remember {
|
||||||
// storage.getLibSessionClosedGroup()
|
storage.getLibSessionClosedGroup(groupSessionId)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
var displayText by remember {
|
||||||
|
mutableStateOf(closedGroup!!.groupSessionId.hexString())
|
||||||
|
}
|
||||||
|
|
||||||
|
EditGroupState(EditGroupViewState.Display(displayText)) { event ->
|
||||||
|
when (event) {
|
||||||
|
Unit -> displayText = "different"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@AssistedFactory
|
||||||
|
interface Factory {
|
||||||
|
fun create(groupSessionId: String): EditGroupViewModel
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -52,4 +87,5 @@ data class EditGroupState(
|
||||||
|
|
||||||
sealed class EditGroupViewState {
|
sealed class EditGroupViewState {
|
||||||
data object NoOp: EditGroupViewState()
|
data object NoOp: EditGroupViewState()
|
||||||
|
data class Display(val text: String) : EditGroupViewState()
|
||||||
}
|
}
|
|
@ -23,7 +23,8 @@ buildscript {
|
||||||
}
|
}
|
||||||
|
|
||||||
plugins{
|
plugins{
|
||||||
id("com.google.dagger.hilt.android") version "2.44" apply false
|
id("com.google.dagger.hilt.android") version "2.48.1" apply false
|
||||||
|
id 'com.google.devtools.ksp' version "$kspVersion" apply false
|
||||||
}
|
}
|
||||||
|
|
||||||
allprojects {
|
allprojects {
|
||||||
|
|
|
@ -26,7 +26,7 @@ appcompatVersion=1.6.1
|
||||||
coreVersion=1.8.0
|
coreVersion=1.8.0
|
||||||
coroutinesVersion=1.6.4
|
coroutinesVersion=1.6.4
|
||||||
curve25519Version=0.6.0
|
curve25519Version=0.6.0
|
||||||
daggerVersion=2.46.1
|
daggerVersion=2.48.1
|
||||||
glideVersion=4.16.0
|
glideVersion=4.16.0
|
||||||
jacksonDatabindVersion=2.9.8
|
jacksonDatabindVersion=2.9.8
|
||||||
junitVersion=4.13.2
|
junitVersion=4.13.2
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
#Thu Dec 30 07:09:53 SAST 2021
|
#Thu Nov 09 11:27:58 AEDT 2023
|
||||||
distributionBase=GRADLE_USER_HOME
|
distributionBase=GRADLE_USER_HOME
|
||||||
distributionUrl=https\://services.gradle.org/distributions/gradle-7.4-bin.zip
|
|
||||||
distributionPath=wrapper/dists
|
distributionPath=wrapper/dists
|
||||||
zipStorePath=wrapper/dists
|
distributionUrl=https\://services.gradle.org/distributions/gradle-7.6-bin.zip
|
||||||
zipStoreBase=GRADLE_USER_HOME
|
zipStoreBase=GRADLE_USER_HOME
|
||||||
|
zipStorePath=wrapper/dists
|
||||||
|
|
Loading…
Reference in New Issue