Skip to content

Commit 7e72bff

Browse files
authored
Merge pull request #588 from code-payments/feat/fc-room-names
Feat/fc room names
2 parents 16e4d90 + cd244ea commit 7e72bff

62 files changed

Lines changed: 1712 additions & 633 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

app/src/main/java/com/getcode/navigation/screens/ModalContainerMessage.kt

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -15,22 +15,23 @@ import androidx.compose.ui.Alignment
1515
import androidx.compose.ui.Modifier
1616
import androidx.compose.ui.res.painterResource
1717
import cafe.adriel.voyager.core.screen.Screen
18+
import com.getcode.navigation.modal.ModalHeightMetric
1819
import com.getcode.services.manager.ModalManager
1920
import com.getcode.theme.CodeTheme
2021
import com.getcode.ui.theme.ButtonState
2122
import com.getcode.ui.theme.CodeButton
2223
import com.getcode.ui.utils.addIf
2324

2425
fun buildMessageContent(
25-
message: com.getcode.services.manager.ModalManager.Message,
26-
onClose: (com.getcode.services.manager.ModalManager.ActionType?) -> Unit
26+
message: ModalManager.Message,
27+
onClose: (ModalManager.ActionType?) -> Unit
2728
): Screen {
2829
return ModalContainerMessage(message, onClose)
2930
}
3031

3132
private data class ModalContainerMessage(
32-
val message: com.getcode.services.manager.ModalManager.Message,
33-
val onClose: (com.getcode.services.manager.ModalManager.ActionType?) -> Unit,
33+
val message: ModalManager.Message,
34+
val onClose: (ModalManager.ActionType?) -> Unit,
3435
) : Screen, NamedScreen, ModalRoot {
3536

3637
@Composable
@@ -89,7 +90,7 @@ private data class ModalContainerMessage(
8990
text = message.positiveText,
9091
onClick = {
9192
message.onPositive()
92-
onClose(com.getcode.services.manager.ModalManager.ActionType.Positive)
93+
onClose(ModalManager.ActionType.Positive)
9394
}
9495
)
9596

@@ -101,7 +102,7 @@ private data class ModalContainerMessage(
101102
text = negativeText,
102103
onClick = {
103104
message.onNegative()
104-
onClose(com.getcode.services.manager.ModalManager.ActionType.Negative)
105+
onClose(ModalManager.ActionType.Negative)
105106
}
106107
)
107108
}
@@ -115,7 +116,7 @@ private data class ModalContainerMessage(
115116
text = tertiaryText,
116117
onClick = {
117118
message.onTertiary()
118-
onClose(com.getcode.services.manager.ModalManager.ActionType.Tertiary)
119+
onClose(ModalManager.ActionType.Tertiary)
119120
}
120121
)
121122
}

app/src/main/java/com/getcode/navigation/screens/Modals.kt

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -33,13 +33,10 @@ import com.getcode.ui.components.SheetTitleDefaults
3333
import com.getcode.ui.components.SheetTitleText
3434
import com.getcode.ui.components.keyboardAsState
3535
import com.getcode.navigation.extensions.getActivityScopedViewModel
36+
import com.getcode.navigation.modal.ModalHeightMetric
3637
import kotlinx.coroutines.delay
3738
import kotlinx.coroutines.launch
3839

39-
sealed interface ModalHeightMetric {
40-
data class Weight(val weight: Float) : ModalHeightMetric
41-
data object WrapContent : ModalHeightMetric
42-
}
4340

4441
@OptIn(ExperimentalFoundationApi::class)
4542
@Composable

buildSrc/src/main/java/Dependencies.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ sealed class Packaging(
2828
object Flipchat: Packaging(
2929
majorVersion = 1,
3030
minorVersion = 0,
31-
patchVersion = 1
31+
patchVersion = 2
3232
)
3333
}
3434

flipchatApp/src/main/kotlin/xyz/flipchat/app/MainActivity.kt

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -25,8 +25,8 @@ import com.google.firebase.crashlytics.FirebaseCrashlytics
2525
import dagger.hilt.android.AndroidEntryPoint
2626
import dev.bmcreations.tipkit.engines.TipsEngine
2727
import dev.theolm.rinku.compose.ext.Rinku
28-
import xyz.flipchat.app.beta.BetaFlags
29-
import xyz.flipchat.app.ui.LocalBetaFeatures
28+
import xyz.flipchat.app.beta.Labs
29+
import xyz.flipchat.app.ui.LocalLabs
3030
import xyz.flipchat.services.LocalPaymentController
3131
import xyz.flipchat.services.PaymentController
3232
import xyz.flipchat.services.billing.BillingClient
@@ -63,7 +63,7 @@ class MainActivity : FragmentActivity() {
6363
lateinit var paymentController: PaymentController
6464

6565
@Inject
66-
lateinit var betaFeatures: BetaFlags
66+
lateinit var betaFeatures: Labs
6767

6868
@Inject
6969
lateinit var iapController: BillingClient
@@ -82,7 +82,7 @@ class MainActivity : FragmentActivity() {
8282
LocalVibrator provides vibrator,
8383
LocalUserManager provides userManager,
8484
LocalPaymentController provides paymentController,
85-
LocalBetaFeatures provides betaFeatures,
85+
LocalLabs provides betaFeatures,
8686
LocalBillingClient provides iapController
8787
) {
8888
Rinku {

flipchatApp/src/main/kotlin/xyz/flipchat/app/auth/AuthManager.kt

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,6 @@ import com.bugsnag.android.Bugsnag
77
import com.getcode.ed25519.Ed25519
88
import com.getcode.model.ID
99
import xyz.flipchat.app.util.AccountUtils
10-
import xyz.flipchat.app.util.TokenResult
1110
import com.getcode.services.db.Database
1211
import com.getcode.services.utils.token
1312
import com.getcode.utils.ErrorUtils
@@ -23,11 +22,10 @@ import com.ionspin.kotlin.crypto.LibsodiumInitializer
2322
import dagger.hilt.android.qualifiers.ApplicationContext
2423
import kotlinx.coroutines.CoroutineScope
2524
import kotlinx.coroutines.Dispatchers
26-
import kotlinx.coroutines.coroutineScope
2725
import kotlinx.coroutines.launch
2826
import xyz.flipchat.FlipchatServices
2927
import xyz.flipchat.app.BuildConfig
30-
import xyz.flipchat.app.beta.BetaFlags
28+
import xyz.flipchat.app.beta.Labs
3129
import xyz.flipchat.app.util.UserIdResult
3230
import xyz.flipchat.controllers.AuthController
3331
import xyz.flipchat.controllers.ProfileController
@@ -44,7 +42,7 @@ class AuthManager @Inject constructor(
4442
private val profileController: ProfileController,
4543
private val userManager: UserManager,
4644
private val pushController: PushController,
47-
private val betaFlags: BetaFlags,
45+
private val betaFlags: Labs,
4846
private val notificationManager: NotificationManagerCompat,
4947
// private val balanceController: BalanceController,
5048
// private val notificationCollectionHistory: NotificationCollectionHistoryController,

flipchatApp/src/main/kotlin/xyz/flipchat/app/beta/BetaFlags.kt

Lines changed: 0 additions & 28 deletions
This file was deleted.
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
package xyz.flipchat.app.beta
2+
3+
import kotlinx.coroutines.flow.MutableStateFlow
4+
import kotlinx.coroutines.flow.StateFlow
5+
6+
interface Labs {
7+
fun set(flag: Lab, value: Boolean)
8+
suspend fun get(flag: Lab): Boolean
9+
fun observe(flag: Lab): StateFlow<Boolean>
10+
fun observe(): StateFlow<List<BetaFeature>>
11+
fun reset(flag: Lab)
12+
fun reset()
13+
}
14+
15+
object NoOpLabs: Labs {
16+
override fun set(flag: Lab, value: Boolean) = Unit
17+
18+
override suspend fun get(flag: Lab): Boolean = false
19+
20+
override fun observe(flag: Lab): StateFlow<Boolean> = MutableStateFlow(false)
21+
22+
override fun observe(): StateFlow<List<BetaFeature>> =
23+
MutableStateFlow(Lab.entries.map { BetaFeature(it, it.default) })
24+
25+
override fun reset(flag: Lab) = Unit
26+
override fun reset() = Unit
27+
28+
}

flipchatApp/src/main/kotlin/xyz/flipchat/app/beta/BetaFlagController.kt renamed to flipchatApp/src/main/kotlin/xyz/flipchat/app/beta/LabsController.kt

Lines changed: 23 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -20,48 +20,54 @@ import kotlinx.coroutines.flow.stateIn
2020
import kotlinx.coroutines.launch
2121
import javax.inject.Inject
2222

23-
sealed interface BetaFlag {
23+
sealed interface Lab {
2424
val key: String
2525
val default: Boolean
2626
val launched: Boolean
2727

28-
data object ReplyToMessage : BetaFlag {
28+
data object ReplyToMessage : Lab {
2929
override val key = "pref_reply_enabled"
3030
override val default: Boolean = true
3131
override val launched: Boolean = true
3232
}
3333

34-
data object FollowerMode : BetaFlag {
34+
data object FollowerMode : Lab {
3535
override val key: String = "pref_follower_mode_enabled"
3636
override val default: Boolean = true
3737
override val launched: Boolean = true
3838
}
3939

40-
data object StartChatAtUnread : BetaFlag {
40+
data object StartChatAtUnread : Lab {
4141
override val key: String = "pref_start_at_unread_enabled"
4242
override val default: Boolean = true
4343
override val launched: Boolean = true
4444
}
4545

46+
data object RoomNameChanges : Lab {
47+
override val key: String = "pref_room_name_changes_enabled"
48+
override val default: Boolean = false
49+
override val launched: Boolean = false
50+
}
51+
4652
companion object {
47-
val entries = listOf(ReplyToMessage, FollowerMode, StartChatAtUnread)
48-
internal fun byKey(key: Preferences.Key<*>): BetaFlag? {
53+
val entries = listOf(ReplyToMessage, FollowerMode, StartChatAtUnread, RoomNameChanges)
54+
internal fun byKey(key: Preferences.Key<*>): Lab? {
4955
return entries.firstOrNull { it.key == key.name }
5056
}
5157
}
5258
}
5359

5460
data class BetaFeature(
55-
val flag: BetaFlag,
61+
val flag: Lab,
5662
val enabled: Boolean,
5763
)
5864

59-
private val BetaFlag.preferenceKey
65+
private val Lab.preferenceKey
6066
get() = booleanPreferencesKey(key)
6167

62-
class BetaFlagController @Inject constructor(
68+
class LabsController @Inject constructor(
6369
@ApplicationContext context: Context,
64-
) : BetaFlags {
70+
) : Labs {
6571
private val dataScope: CoroutineScope = CoroutineScope(SupervisorJob() + Dispatchers.IO)
6672

6773
private val betaFlags = PreferenceDataStoreFactory.create(
@@ -75,33 +81,33 @@ class BetaFlagController @Inject constructor(
7581

7682
init {
7783
// reset launched flags
78-
BetaFlag.entries
84+
Lab.entries
7985
.filter { it.launched }
8086
.onEach { reset(it) }
8187
}
8288

83-
override fun set(flag: BetaFlag, value: Boolean) {
89+
override fun set(flag: Lab, value: Boolean) {
8490
dataScope.launch(Dispatchers.IO) {
8591
betaFlags.edit { prefs ->
8692
prefs[flag.preferenceKey] = value
8793
}
8894
}
8995
}
9096

91-
override suspend fun get(flag: BetaFlag): Boolean {
97+
override suspend fun get(flag: Lab): Boolean {
9298
return betaFlags.data.map { prefs ->
9399
if (flag.launched) return@map flag.default
94100
prefs[flag.preferenceKey] ?: flag.default
95101
}.firstOrNull() ?: flag.default
96102
}
97103

98-
override fun observe(flag: BetaFlag): StateFlow<Boolean> = betaFlags.data.map { prefs ->
104+
override fun observe(flag: Lab): StateFlow<Boolean> = betaFlags.data.map { prefs ->
99105
if (flag.launched) return@map flag.default
100106
prefs[flag.preferenceKey] ?: flag.default
101107
}.stateIn(dataScope, started = SharingStarted.Eagerly, flag.default)
102108

103109
override fun observe(): StateFlow<List<BetaFeature>> = betaFlags.data.map { prefs ->
104-
BetaFlag.entries.filterNot { it.launched }.map {
110+
Lab.entries.filterNot { it.launched }.map {
105111
val value = if (it.launched) {
106112
it.default
107113
} else {
@@ -113,10 +119,10 @@ class BetaFlagController @Inject constructor(
113119
}.stateIn(
114120
dataScope,
115121
started = SharingStarted.Eagerly,
116-
BetaFlag.entries.map { BetaFeature(it, it.default) }
122+
Lab.entries.map { BetaFeature(it, it.default) }
117123
)
118124

119-
override fun reset(flag: BetaFlag) {
125+
override fun reset(flag: Lab) {
120126
dataScope.launch {
121127
betaFlags.edit { it.remove(flag.preferenceKey) }
122128
}

flipchatApp/src/main/kotlin/xyz/flipchat/app/data/RoomInfo.kt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,8 @@ data class RoomInfo(
1414
val hostName: String? = null,
1515
val coverCharge: Kin = Kin.fromQuarks(0)
1616
) {
17+
val customTitle: String = runCatching { Regex("^#\\d+:\\s*(.*)").find(title)?.groupValues?.get(1).orEmpty() }.getOrDefault("")
18+
1719
companion object {
1820
val DEFAULT_GRADIENT_SAMPLE = Triple(
1921
Color(0xFFFFBB00),

flipchatApp/src/main/kotlin/xyz/flipchat/app/features/beta/BetaFlagsScreen.kt

Lines changed: 13 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -23,8 +23,8 @@ import com.getcode.ui.components.SettingsSwitchRow
2323
import kotlinx.parcelize.IgnoredOnParcel
2424
import kotlinx.parcelize.Parcelize
2525
import xyz.flipchat.app.R
26-
import xyz.flipchat.app.beta.BetaFlag
27-
import xyz.flipchat.app.ui.LocalBetaFeatures
26+
import xyz.flipchat.app.beta.Lab
27+
import xyz.flipchat.app.ui.LocalLabs
2828

2929
@Parcelize
3030
class BetaFlagsScreen : Screen, Parcelable {
@@ -52,7 +52,7 @@ class BetaFlagsScreen : Screen, Parcelable {
5252

5353
@Composable
5454
private fun BetaFlagsScreenContent() {
55-
val betaFlagsController = LocalBetaFeatures.current
55+
val betaFlagsController = LocalLabs.current
5656
val betaFlags by betaFlagsController.observe().collectAsState()
5757

5858
LazyColumn(
@@ -97,16 +97,18 @@ private fun BetaFlagsScreenContent() {
9797
}
9898
}
9999

100-
private val BetaFlag.title: String
100+
private val Lab.title: String
101101
get() = when (this) {
102-
BetaFlag.FollowerMode -> "Follower Mode"
103-
BetaFlag.ReplyToMessage -> "Swipe To Reply"
104-
BetaFlag.StartChatAtUnread -> "Open Conversation @ Last Unread"
102+
Lab.FollowerMode -> "Follower Mode"
103+
Lab.ReplyToMessage -> "Swipe To Reply"
104+
Lab.StartChatAtUnread -> "Open Conversation @ Last Unread"
105+
Lab.RoomNameChanges -> "Room Name Changes For Hosts"
105106
}
106107

107-
private val BetaFlag.message: String
108+
private val Lab.message: String
108109
get() = when (this) {
109-
BetaFlag.FollowerMode -> "When enabled, you will gain the ability to watch rooms without joining first"
110-
BetaFlag.ReplyToMessage -> "When enabled, you will gain the ability to swipe to reply to messages in chat"
111-
BetaFlag.StartChatAtUnread -> "When enabled, conversations will resume at the last message you read"
110+
Lab.FollowerMode -> "When enabled, you will gain the ability to watch rooms without joining first"
111+
Lab.ReplyToMessage -> "When enabled, you will gain the ability to swipe to reply to messages in chat"
112+
Lab.StartChatAtUnread -> "When enabled, conversations will resume at the last message you read"
113+
Lab.RoomNameChanges -> "When enabled, hosts will gain the ability to set a desired name for their room"
112114
}

0 commit comments

Comments
 (0)