feat: add edit group view model arch

This commit is contained in:
0x330a 2023-11-09 12:15:55 +11:00
parent d8bc838754
commit 8e1e228946
No known key found for this signature in database
GPG Key ID: 267811D6E6A2698C
8 changed files with 91 additions and 30 deletions

View File

@ -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"

View File

@ -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)
} }
} }

View File

@ -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) {

View File

@ -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)!!)
} }
} }
) )

View File

@ -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()
} }

View File

@ -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 {

View File

@ -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

View File

@ -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