Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -15,22 +15,23 @@ import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.res.painterResource
import cafe.adriel.voyager.core.screen.Screen
import com.getcode.navigation.modal.ModalHeightMetric
import com.getcode.services.manager.ModalManager
import com.getcode.theme.CodeTheme
import com.getcode.ui.theme.ButtonState
import com.getcode.ui.theme.CodeButton
import com.getcode.ui.utils.addIf

fun buildMessageContent(
message: com.getcode.services.manager.ModalManager.Message,
onClose: (com.getcode.services.manager.ModalManager.ActionType?) -> Unit
message: ModalManager.Message,
onClose: (ModalManager.ActionType?) -> Unit
): Screen {
return ModalContainerMessage(message, onClose)
}

private data class ModalContainerMessage(
val message: com.getcode.services.manager.ModalManager.Message,
val onClose: (com.getcode.services.manager.ModalManager.ActionType?) -> Unit,
val message: ModalManager.Message,
val onClose: (ModalManager.ActionType?) -> Unit,
) : Screen, NamedScreen, ModalRoot {

@Composable
Expand Down Expand Up @@ -89,7 +90,7 @@ private data class ModalContainerMessage(
text = message.positiveText,
onClick = {
message.onPositive()
onClose(com.getcode.services.manager.ModalManager.ActionType.Positive)
onClose(ModalManager.ActionType.Positive)
}
)

Expand All @@ -101,7 +102,7 @@ private data class ModalContainerMessage(
text = negativeText,
onClick = {
message.onNegative()
onClose(com.getcode.services.manager.ModalManager.ActionType.Negative)
onClose(ModalManager.ActionType.Negative)
}
)
}
Expand All @@ -115,7 +116,7 @@ private data class ModalContainerMessage(
text = tertiaryText,
onClick = {
message.onTertiary()
onClose(com.getcode.services.manager.ModalManager.ActionType.Tertiary)
onClose(ModalManager.ActionType.Tertiary)
}
)
}
Expand Down
5 changes: 1 addition & 4 deletions app/src/main/java/com/getcode/navigation/screens/Modals.kt
Original file line number Diff line number Diff line change
Expand Up @@ -33,13 +33,10 @@ import com.getcode.ui.components.SheetTitleDefaults
import com.getcode.ui.components.SheetTitleText
import com.getcode.ui.components.keyboardAsState
import com.getcode.navigation.extensions.getActivityScopedViewModel
import com.getcode.navigation.modal.ModalHeightMetric
import kotlinx.coroutines.delay
import kotlinx.coroutines.launch

sealed interface ModalHeightMetric {
data class Weight(val weight: Float) : ModalHeightMetric
data object WrapContent : ModalHeightMetric
}

@OptIn(ExperimentalFoundationApi::class)
@Composable
Expand Down
2 changes: 1 addition & 1 deletion buildSrc/src/main/java/Dependencies.kt
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,7 @@ sealed class Packaging(
object Flipchat: Packaging(
majorVersion = 1,
minorVersion = 0,
patchVersion = 1
patchVersion = 2
)
}

Expand Down
8 changes: 4 additions & 4 deletions flipchatApp/src/main/kotlin/xyz/flipchat/app/MainActivity.kt
Original file line number Diff line number Diff line change
Expand Up @@ -25,8 +25,8 @@ import com.google.firebase.crashlytics.FirebaseCrashlytics
import dagger.hilt.android.AndroidEntryPoint
import dev.bmcreations.tipkit.engines.TipsEngine
import dev.theolm.rinku.compose.ext.Rinku
import xyz.flipchat.app.beta.BetaFlags
import xyz.flipchat.app.ui.LocalBetaFeatures
import xyz.flipchat.app.beta.Labs
import xyz.flipchat.app.ui.LocalLabs
import xyz.flipchat.services.LocalPaymentController
import xyz.flipchat.services.PaymentController
import xyz.flipchat.services.billing.BillingClient
Expand Down Expand Up @@ -63,7 +63,7 @@ class MainActivity : FragmentActivity() {
lateinit var paymentController: PaymentController

@Inject
lateinit var betaFeatures: BetaFlags
lateinit var betaFeatures: Labs

@Inject
lateinit var iapController: BillingClient
Expand All @@ -82,7 +82,7 @@ class MainActivity : FragmentActivity() {
LocalVibrator provides vibrator,
LocalUserManager provides userManager,
LocalPaymentController provides paymentController,
LocalBetaFeatures provides betaFeatures,
LocalLabs provides betaFeatures,
LocalBillingClient provides iapController
) {
Rinku {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,6 @@ import com.bugsnag.android.Bugsnag
import com.getcode.ed25519.Ed25519
import com.getcode.model.ID
import xyz.flipchat.app.util.AccountUtils
import xyz.flipchat.app.util.TokenResult
import com.getcode.services.db.Database
import com.getcode.services.utils.token
import com.getcode.utils.ErrorUtils
Expand All @@ -23,11 +22,10 @@ import com.ionspin.kotlin.crypto.LibsodiumInitializer
import dagger.hilt.android.qualifiers.ApplicationContext
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.coroutineScope
import kotlinx.coroutines.launch
import xyz.flipchat.FlipchatServices
import xyz.flipchat.app.BuildConfig
import xyz.flipchat.app.beta.BetaFlags
import xyz.flipchat.app.beta.Labs
import xyz.flipchat.app.util.UserIdResult
import xyz.flipchat.controllers.AuthController
import xyz.flipchat.controllers.ProfileController
Expand All @@ -44,7 +42,7 @@ class AuthManager @Inject constructor(
private val profileController: ProfileController,
private val userManager: UserManager,
private val pushController: PushController,
private val betaFlags: BetaFlags,
private val betaFlags: Labs,
private val notificationManager: NotificationManagerCompat,
// private val balanceController: BalanceController,
// private val notificationCollectionHistory: NotificationCollectionHistoryController,
Expand Down
28 changes: 0 additions & 28 deletions flipchatApp/src/main/kotlin/xyz/flipchat/app/beta/BetaFlags.kt

This file was deleted.

28 changes: 28 additions & 0 deletions flipchatApp/src/main/kotlin/xyz/flipchat/app/beta/Labs.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
package xyz.flipchat.app.beta

import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.coroutines.flow.StateFlow

interface Labs {
fun set(flag: Lab, value: Boolean)
suspend fun get(flag: Lab): Boolean
fun observe(flag: Lab): StateFlow<Boolean>
fun observe(): StateFlow<List<BetaFeature>>
fun reset(flag: Lab)
fun reset()
}

object NoOpLabs: Labs {
override fun set(flag: Lab, value: Boolean) = Unit

override suspend fun get(flag: Lab): Boolean = false

override fun observe(flag: Lab): StateFlow<Boolean> = MutableStateFlow(false)

override fun observe(): StateFlow<List<BetaFeature>> =
MutableStateFlow(Lab.entries.map { BetaFeature(it, it.default) })

override fun reset(flag: Lab) = Unit
override fun reset() = Unit

}
Original file line number Diff line number Diff line change
Expand Up @@ -20,48 +20,54 @@ import kotlinx.coroutines.flow.stateIn
import kotlinx.coroutines.launch
import javax.inject.Inject

sealed interface BetaFlag {
sealed interface Lab {
val key: String
val default: Boolean
val launched: Boolean

data object ReplyToMessage : BetaFlag {
data object ReplyToMessage : Lab {
override val key = "pref_reply_enabled"
override val default: Boolean = true
override val launched: Boolean = true
}

data object FollowerMode : BetaFlag {
data object FollowerMode : Lab {
override val key: String = "pref_follower_mode_enabled"
override val default: Boolean = true
override val launched: Boolean = true
}

data object StartChatAtUnread : BetaFlag {
data object StartChatAtUnread : Lab {
override val key: String = "pref_start_at_unread_enabled"
override val default: Boolean = true
override val launched: Boolean = true
}

data object RoomNameChanges : Lab {
override val key: String = "pref_room_name_changes_enabled"
override val default: Boolean = false
override val launched: Boolean = false
}

companion object {
val entries = listOf(ReplyToMessage, FollowerMode, StartChatAtUnread)
internal fun byKey(key: Preferences.Key<*>): BetaFlag? {
val entries = listOf(ReplyToMessage, FollowerMode, StartChatAtUnread, RoomNameChanges)
internal fun byKey(key: Preferences.Key<*>): Lab? {
return entries.firstOrNull { it.key == key.name }
}
}
}

data class BetaFeature(
val flag: BetaFlag,
val flag: Lab,
val enabled: Boolean,
)

private val BetaFlag.preferenceKey
private val Lab.preferenceKey
get() = booleanPreferencesKey(key)

class BetaFlagController @Inject constructor(
class LabsController @Inject constructor(
@ApplicationContext context: Context,
) : BetaFlags {
) : Labs {
private val dataScope: CoroutineScope = CoroutineScope(SupervisorJob() + Dispatchers.IO)

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

init {
// reset launched flags
BetaFlag.entries
Lab.entries
.filter { it.launched }
.onEach { reset(it) }
}

override fun set(flag: BetaFlag, value: Boolean) {
override fun set(flag: Lab, value: Boolean) {
dataScope.launch(Dispatchers.IO) {
betaFlags.edit { prefs ->
prefs[flag.preferenceKey] = value
}
}
}

override suspend fun get(flag: BetaFlag): Boolean {
override suspend fun get(flag: Lab): Boolean {
return betaFlags.data.map { prefs ->
if (flag.launched) return@map flag.default
prefs[flag.preferenceKey] ?: flag.default
}.firstOrNull() ?: flag.default
}

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

override fun observe(): StateFlow<List<BetaFeature>> = betaFlags.data.map { prefs ->
BetaFlag.entries.filterNot { it.launched }.map {
Lab.entries.filterNot { it.launched }.map {
val value = if (it.launched) {
it.default
} else {
Expand All @@ -113,10 +119,10 @@ class BetaFlagController @Inject constructor(
}.stateIn(
dataScope,
started = SharingStarted.Eagerly,
BetaFlag.entries.map { BetaFeature(it, it.default) }
Lab.entries.map { BetaFeature(it, it.default) }
)

override fun reset(flag: BetaFlag) {
override fun reset(flag: Lab) {
dataScope.launch {
betaFlags.edit { it.remove(flag.preferenceKey) }
}
Expand Down
2 changes: 2 additions & 0 deletions flipchatApp/src/main/kotlin/xyz/flipchat/app/data/RoomInfo.kt
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,8 @@ data class RoomInfo(
val hostName: String? = null,
val coverCharge: Kin = Kin.fromQuarks(0)
) {
val customTitle: String = runCatching { Regex("^#\\d+:\\s*(.*)").find(title)?.groupValues?.get(1).orEmpty() }.getOrDefault("")

companion object {
val DEFAULT_GRADIENT_SAMPLE = Triple(
Color(0xFFFFBB00),
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -23,8 +23,8 @@ import com.getcode.ui.components.SettingsSwitchRow
import kotlinx.parcelize.IgnoredOnParcel
import kotlinx.parcelize.Parcelize
import xyz.flipchat.app.R
import xyz.flipchat.app.beta.BetaFlag
import xyz.flipchat.app.ui.LocalBetaFeatures
import xyz.flipchat.app.beta.Lab
import xyz.flipchat.app.ui.LocalLabs

@Parcelize
class BetaFlagsScreen : Screen, Parcelable {
Expand Down Expand Up @@ -52,7 +52,7 @@ class BetaFlagsScreen : Screen, Parcelable {

@Composable
private fun BetaFlagsScreenContent() {
val betaFlagsController = LocalBetaFeatures.current
val betaFlagsController = LocalLabs.current
val betaFlags by betaFlagsController.observe().collectAsState()

LazyColumn(
Expand Down Expand Up @@ -97,16 +97,18 @@ private fun BetaFlagsScreenContent() {
}
}

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

private val BetaFlag.message: String
private val Lab.message: String
get() = when (this) {
BetaFlag.FollowerMode -> "When enabled, you will gain the ability to watch rooms without joining first"
BetaFlag.ReplyToMessage -> "When enabled, you will gain the ability to swipe to reply to messages in chat"
BetaFlag.StartChatAtUnread -> "When enabled, conversations will resume at the last message you read"
Lab.FollowerMode -> "When enabled, you will gain the ability to watch rooms without joining first"
Lab.ReplyToMessage -> "When enabled, you will gain the ability to swipe to reply to messages in chat"
Lab.StartChatAtUnread -> "When enabled, conversations will resume at the last message you read"
Lab.RoomNameChanges -> "When enabled, hosts will gain the ability to set a desired name for their room"
}
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@ fun openChatDirectiveBottomModal(
negativeStyle = BottomBarManager.BottomBarButtonStyle.Filled,
tertiaryText = context.getString(R.string.action_cancel),
onPositive = {
navigator.push(ScreenRegistry.get(NavScreenProvider.Chat.Lookup.Entry))
navigator.push(ScreenRegistry.get(NavScreenProvider.Room.Lookup.Entry))
},
onNegative = {
viewModel.dispatchEvent(ChatListViewModel.Event.CreateRoomSelected)
Expand Down
Loading