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 {
id 'kotlin-kapt'
id 'com.google.dagger.hilt.android'
id 'com.google.devtools.ksp' version "$kspVersion"
id 'com.google.devtools.ksp'
id 'app.cash.molecule'
}
@ -206,9 +206,9 @@ android {
dependencies {
implementation("com.google.dagger:hilt-android:2.46.1")
kapt("com.google.dagger:hilt-android-compiler:2.46")
implementation("androidx.hilt:hilt-navigation-compose:1.0.0")
implementation("com.google.dagger:hilt-android:$daggerVersion")
kapt("com.google.dagger:hilt-android-compiler:$daggerVersion")
implementation("androidx.hilt:hilt-navigation-compose:1.1.0")
implementation "io.github.raamcosta.compose-destinations:core:$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.database.LokiThreadDatabase
import org.thoughtcrime.securesms.database.ThreadDatabase
import org.thoughtcrime.securesms.groups.EditClosedGroupActivity
import org.thoughtcrime.securesms.groups.EditLegacyClosedGroupActivity
import org.thoughtcrime.securesms.showSessionDialog
import javax.inject.Inject
@ -162,10 +163,19 @@ class ConversationSettingsActivity: PassphraseRequiredActionBarActivity(), View.
}
v === binding.editGroup -> {
val recipient = viewModel.recipient ?: return
if (!recipient.isClosedGroupRecipient || !recipient.isLegacyClosedGroupRecipient) return
val intent = Intent(this, EditLegacyClosedGroupActivity::class.java)
val groupID: String = recipient.address.toGroupString()
intent.putExtra(EditLegacyClosedGroupActivity.groupIDKey, groupID)
val intent = when {
recipient.isLegacyClosedGroupRecipient -> Intent(this, EditLegacyClosedGroupActivity::class.java).apply {
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)
}
}

View File

@ -32,10 +32,18 @@ class ConversationSettingsViewModel(
}
fun isUserGroupAdmin(): Boolean = recipient?.let { recipient ->
if (!recipient.isLegacyClosedGroupRecipient || !recipient.isClosedGroupRecipient) return@let false
val localUserAddress = prefs.getLocalNumber() ?: return@let false
val group = storage.getGroup(recipient.address.toGroupString())
group?.admins?.contains(Address.fromSerialized(localUserAddress)) ?: false // this will have to be replaced for new closed groups
when {
recipient.isLegacyClosedGroupRecipient -> {
val localUserAddress = prefs.getLocalNumber() ?: return@let false
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
fun clearMessages(forAll: Boolean) {

View File

@ -2,17 +2,23 @@ package org.thoughtcrime.securesms.groups
import android.os.Bundle
import androidx.activity.compose.setContent
import androidx.lifecycle.viewmodel.viewModelFactory
import com.ramcosta.composedestinations.DestinationsNavHost
import com.ramcosta.composedestinations.navigation.dependency
import dagger.hilt.android.AndroidEntryPoint
import org.thoughtcrime.securesms.PassphraseRequiredActionBarActivity
import org.thoughtcrime.securesms.groups.compose.EditGroupViewModel
import org.thoughtcrime.securesms.ui.AppTheme
import javax.inject.Inject
@AndroidEntryPoint
class EditClosedGroupActivity: PassphraseRequiredActionBarActivity() {
companion object {
const val groupIDKey = "EditClosedGroupActivity_groupID"
}
@Inject lateinit var factory: EditGroupViewModel.Factory
override fun onCreate(savedInstanceState: Bundle?, ready: Boolean) {
setContent {
AppTheme {
@ -20,7 +26,7 @@ class EditClosedGroupActivity: PassphraseRequiredActionBarActivity() {
navGraph = NavGraphs.editGroup,
dependenciesContainerBuilder = {
dependency(NavGraphs.editGroup) {
EditGroupViewModel.Factory()
factory.create(intent.getStringExtra(groupIDKey)!!)
}
}
)

View File

@ -1,23 +1,25 @@
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.collectAsState
import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableStateOf
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.viewModelScope
import app.cash.molecule.RecompositionMode
import app.cash.molecule.RecompositionMode.Immediate
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.navigation.DestinationsNavigator
import dagger.hilt.android.lifecycle.HiltViewModel
import kotlinx.coroutines.channels.Channel
import kotlinx.coroutines.flow.consumeAsFlow
import dagger.assisted.Assisted
import dagger.assisted.AssistedFactory
import dagger.assisted.AssistedInject
import org.session.libsession.database.StorageProtocol
import javax.inject.Inject
@EditGroupNavGraph(start = true)
@Composable
@ -27,20 +29,53 @@ fun EditClosedGroupScreen(
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 @Inject constructor(private val groupSessionId: String,
private val storage: StorageProtocol): ViewModel() {
class EditGroupViewModel @AssistedInject constructor(
@Assisted private val groupSessionId: String,
private val storage: StorageProtocol): ViewModel() {
val viewState = viewModelScope.launchMolecule(Immediate) {
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 {
data object NoOp: EditGroupViewState()
data class Display(val text: String) : EditGroupViewState()
}

View File

@ -23,7 +23,8 @@ buildscript {
}
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 {

View File

@ -26,7 +26,7 @@ appcompatVersion=1.6.1
coreVersion=1.8.0
coroutinesVersion=1.6.4
curve25519Version=0.6.0
daggerVersion=2.46.1
daggerVersion=2.48.1
glideVersion=4.16.0
jacksonDatabindVersion=2.9.8
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
distributionUrl=https\://services.gradle.org/distributions/gradle-7.4-bin.zip
distributionPath=wrapper/dists
zipStorePath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-7.6-bin.zip
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists