Skip to content
2 changes: 1 addition & 1 deletion app/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@ configurations.configureEach {
exclude(module = "commons-logging")
}

val canonicalVersionCode = 430
val canonicalVersionCode = 432
val canonicalVersionName = "1.30.0"

val postFixSize = 10
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -93,7 +93,7 @@ abstract class InputbarViewModel(

fun showSessionProCTA(){
_inputBarStateDialogsState.update {
it.copy(sessionProCharLimitCTA = CharLimitCTAData(proStatusManager.subscriptionState.value.type))
it.copy(sessionProCharLimitCTA = CharLimitCTAData(proStatusManager.proDataState.value.type))
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -280,7 +280,7 @@ class MessageDetailsViewModel @AssistedInject constructor(
is Commands.ShowProBadgeCTA -> {
val features = state.value.proFeatures
_dialogState.update {
val proSubscription = proStatusManager.subscriptionState.value.type
val proSubscription = proStatusManager.proDataState.value.type
it.copy(
proBadgeCTA = when{
features.size > 1 -> ProBadgeCTA.Generic(proSubscription) // always show the generic cta when there are more than 1 feature
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -719,7 +719,7 @@ class ConversationSettingsViewModel @AssistedInject constructor(
_dialogState.update {
it.copy(pinCTA = PinProCTA(
overTheLimit = totalPins > maxPins,
proSubscription = proStatusManager.subscriptionState.value.type
proSubscription = proStatusManager.proDataState.value.type
))
}
} else {
Expand Down Expand Up @@ -1237,8 +1237,8 @@ class ConversationSettingsViewModel @AssistedInject constructor(
is Commands.ShowProBadgeCTA -> {
_dialogState.update {
it.copy(
proBadgeCTA = if(recipient?.isGroupV2Recipient == true) ProBadgeCTA.Group(proStatusManager.subscriptionState.value.type)
else ProBadgeCTA.Generic(proStatusManager.subscriptionState.value.type)
proBadgeCTA = if(recipient?.isGroupV2Recipient == true) ProBadgeCTA.Group(proStatusManager.proDataState.value.type)
else ProBadgeCTA.Generic(proStatusManager.proDataState.value.type)
)
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@ import kotlinx.coroutines.launch
import org.session.libsession.utilities.TextSecurePreferences
import org.session.libsignal.utilities.Log
import org.thoughtcrime.securesms.dependencies.ManagerScope
import org.thoughtcrime.securesms.ui.theme.primaryBlue
import org.thoughtcrime.securesms.ui.theme.primaryGreen
import org.thoughtcrime.securesms.ui.theme.primaryOrange
import org.thoughtcrime.securesms.util.DateUtils
Expand Down Expand Up @@ -127,5 +128,7 @@ data class DebugLogData(
)

enum class DebugLogGroup(val label: String, val color: Color){
AVATAR("Avatar", primaryOrange), PRO_SUBSCRIPTION("Pro Subscription", primaryGreen)
AVATAR("Avatar", primaryOrange),
PRO_SUBSCRIPTION("Pro Subscription", primaryGreen),
PRO_DATA("Pro Data", primaryBlue)
}
Original file line number Diff line number Diff line change
Expand Up @@ -504,6 +504,14 @@ fun DebugMenu(
sendCommand(Copy07PrefixedBlindedPublicKey)
}
)

SlimFillButtonRect (
text = "Copy Pro Master Key",
modifier = Modifier.fillMaxWidth(),
onClick = {
sendCommand(DebugMenuViewModel.Commands.CopyProMasterKey)
}
)
}

Spacer(modifier = Modifier.height(LocalDimensions.current.xsSpacing))
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -202,6 +202,21 @@ class DebugMenuViewModel @AssistedInject constructor(
}
}

is Commands.CopyProMasterKey -> {
val proKey = loginStateRepository.loggedInState.value?.seeded?.proMasterPrivateKey?.toHexString()
val clip = ClipData.newPlainText("Pro Master Key", proKey)
clipboardManager.setPrimaryClip(ClipData(clip))

// Show a toast if the version is below Android 13
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.TIRAMISU) {
Toast.makeText(
context,
"Copied Pro Master Key to clipboard",
Toast.LENGTH_SHORT
).show()
}
}

is Commands.HideMessageRequest -> {
textSecurePreferences.setHasHiddenMessageRequests(command.hide)
_uiState.value = _uiState.value.copy(hideMessageRequests = command.hide)
Expand Down Expand Up @@ -590,6 +605,7 @@ class DebugMenuViewModel @AssistedInject constructor(
object ScheduleTokenNotification : Commands()
object Copy07PrefixedBlindedPublicKey : Commands()
object CopyAccountId : Commands()
object CopyProMasterKey : Commands()
data class HideMessageRequest(val hide: Boolean) : Commands()
data class HideNoteToSelf(val hide: Boolean) : Commands()
data class ForceCurrentUserAsPro(val set: Boolean) : Commands()
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -159,7 +159,7 @@ class HomeViewModel @Inject constructor(
init {
// observe subscription status
viewModelScope.launch {
proStatusManager.subscriptionState.collect { subscription ->
proStatusManager.proDataState.collect { subscription ->
// show a CTA (only once per install) when
// - subscription is expiring in less than 7 days
// - subscription expired less than 30 days ago
Expand Down Expand Up @@ -262,7 +262,7 @@ class HomeViewModel @Inject constructor(
it.copy(
pinCTA = PinProCTA(
overTheLimit = totalPins > maxPins,
proSubscription = proStatusManager.subscriptionState.value.type
proSubscription = proStatusManager.proDataState.value.type
)
)
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -75,13 +75,29 @@ import org.thoughtcrime.securesms.home.PathActivity
import org.thoughtcrime.securesms.messagerequests.MessageRequestsActivity
import org.thoughtcrime.securesms.preferences.SettingsViewModel.AvatarDialogState.TempAvatar
import org.thoughtcrime.securesms.preferences.SettingsViewModel.AvatarDialogState.UserAvatar
import org.thoughtcrime.securesms.preferences.SettingsViewModel.Commands.*
import org.thoughtcrime.securesms.preferences.SettingsViewModel.Commands.ClearData
import org.thoughtcrime.securesms.preferences.SettingsViewModel.Commands.HideAnimatedProCTA
import org.thoughtcrime.securesms.preferences.SettingsViewModel.Commands.HideAvatarPickerOptions
import org.thoughtcrime.securesms.preferences.SettingsViewModel.Commands.HideClearDataDialog
import org.thoughtcrime.securesms.preferences.SettingsViewModel.Commands.HideSimpleDialog
import org.thoughtcrime.securesms.preferences.SettingsViewModel.Commands.HideUrlDialog
import org.thoughtcrime.securesms.preferences.SettingsViewModel.Commands.HideUsernameDialog
import org.thoughtcrime.securesms.preferences.SettingsViewModel.Commands.OnAvatarDialogDismissed
import org.thoughtcrime.securesms.preferences.SettingsViewModel.Commands.OnDonateClicked
import org.thoughtcrime.securesms.preferences.SettingsViewModel.Commands.RemoveAvatar
import org.thoughtcrime.securesms.preferences.SettingsViewModel.Commands.SaveAvatar
import org.thoughtcrime.securesms.preferences.SettingsViewModel.Commands.SetUsername
import org.thoughtcrime.securesms.preferences.SettingsViewModel.Commands.ShowAnimatedProCTA
import org.thoughtcrime.securesms.preferences.SettingsViewModel.Commands.ShowAvatarDialog
import org.thoughtcrime.securesms.preferences.SettingsViewModel.Commands.ShowClearDataDialog
import org.thoughtcrime.securesms.preferences.SettingsViewModel.Commands.ShowUrlDialog
import org.thoughtcrime.securesms.preferences.SettingsViewModel.Commands.ShowUsernameDialog
import org.thoughtcrime.securesms.preferences.SettingsViewModel.Commands.UpdateUsername
import org.thoughtcrime.securesms.preferences.appearance.AppearanceSettingsActivity
import org.thoughtcrime.securesms.preferences.prosettings.ProSettingsActivity
import org.thoughtcrime.securesms.pro.SubscriptionDetails
import org.thoughtcrime.securesms.pro.SubscriptionState
import org.thoughtcrime.securesms.pro.ProDataState
import org.thoughtcrime.securesms.pro.ProStatus
import org.thoughtcrime.securesms.pro.subscription.ProSubscriptionDuration
import org.thoughtcrime.securesms.pro.previewAutoRenewingApple
import org.thoughtcrime.securesms.recoverypassword.RecoveryPasswordActivity
import org.thoughtcrime.securesms.tokenpage.TokenPageActivity
import org.thoughtcrime.securesms.ui.AccountIdHeader
Expand Down Expand Up @@ -131,8 +147,6 @@ import org.thoughtcrime.securesms.util.AvatarUIData
import org.thoughtcrime.securesms.util.AvatarUIElement
import org.thoughtcrime.securesms.util.State
import org.thoughtcrime.securesms.util.push
import java.time.Duration
import java.time.Instant

@OptIn(ExperimentalSharedTransitionApi::class)
@Composable
Expand Down Expand Up @@ -266,11 +280,11 @@ fun Settings(
},
text = uiState.username,
iconSize = 53.sp to 24.sp,
content = if(uiState.subscriptionState.type !is ProStatus.NeverSubscribed){{ // if we are pro or expired
content = if(uiState.proDataState.type !is ProStatus.NeverSubscribed){{ // if we are pro or expired
ProBadge(
modifier = Modifier.padding(start = 4.dp)
.qaTag(stringResource(R.string.qa_pro_badge_icon)),
colors = if(uiState.subscriptionState.type is ProStatus.Active)
colors = if(uiState.proDataState.type is ProStatus.Active)
proBadgeColorStandard()
else proBadgeColorDisabled()
)
Expand Down Expand Up @@ -302,7 +316,7 @@ fun Settings(
recoveryHidden = uiState.recoveryHidden,
hasPaths = uiState.hasPath,
postPro = uiState.isPostPro,
subscriptionState = uiState.subscriptionState,
proDataState = uiState.proDataState,
sendCommand = sendCommand
)

Expand Down Expand Up @@ -384,7 +398,7 @@ fun Settings(
if(uiState.showAvatarDialog) {
AvatarDialog(
state = uiState.avatarDialogState,
isPro = uiState.subscriptionState.type is ProStatus.Active,
isPro = uiState.proDataState.type is ProStatus.Active,
isPostPro = uiState.isPostPro,
sendCommand = sendCommand,
startAvatarSelection = startAvatarSelection
Expand All @@ -394,7 +408,7 @@ fun Settings(
// Animated avatar CTA
if(uiState.showAnimatedProCTA){
AnimatedProCTA(
proSubscription = uiState.subscriptionState.type,
proSubscription = uiState.proDataState.type,
sendCommand = sendCommand
)
}
Expand Down Expand Up @@ -481,7 +495,7 @@ fun Buttons(
recoveryHidden: Boolean,
hasPaths: Boolean,
postPro: Boolean,
subscriptionState: SubscriptionState,
proDataState: ProDataState,
sendCommand: (SettingsViewModel.Commands) -> Unit,
) {
Column(
Expand Down Expand Up @@ -526,7 +540,7 @@ fun Buttons(
if(postPro){
ItemButton(
text = annotatedStringResource(
when (subscriptionState.type) {
when (proDataState.type) {
is ProStatus.Active -> Phrase.from(
LocalContext.current,
R.string.sessionProBeta
Expand Down Expand Up @@ -1062,19 +1076,8 @@ private fun SettingsScreenPreview() {
)
),
isPostPro = true,
subscriptionState = SubscriptionState(
type = ProStatus.Active.AutoRenewing(
validUntil = Instant.now() + Duration.ofDays(14),
duration = ProSubscriptionDuration.THREE_MONTHS,
subscriptionDetails = SubscriptionDetails(
device = "iOS",
store = "Apple App Store",
platform = "Apple",
platformAccount = "Apple Account",
subscriptionUrl = "https://www.apple.com/account/subscriptions",
refundUrl = "https://www.apple.com/account/subscriptions",
)
),
proDataState = ProDataState(
type = previewAutoRenewingApple,
refreshState = State.Success(Unit),
showProBadge = true
),
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -52,7 +52,7 @@ import org.thoughtcrime.securesms.database.RecipientRepository
import org.thoughtcrime.securesms.dependencies.ConfigFactory
import org.thoughtcrime.securesms.mms.MediaConstraints
import org.thoughtcrime.securesms.pro.ProStatusManager
import org.thoughtcrime.securesms.pro.SubscriptionState
import org.thoughtcrime.securesms.pro.ProDataState
import org.thoughtcrime.securesms.pro.getDefaultSubscriptionStateData
import org.thoughtcrime.securesms.reviews.InAppReviewManager
import org.thoughtcrime.securesms.ui.SimpleDialogData
Expand Down Expand Up @@ -96,7 +96,7 @@ class SettingsViewModel @Inject constructor(
version = getVersionNumber(),
recoveryHidden = prefs.getHidePassword(),
isPostPro = proStatusManager.isPostPro(),
subscriptionState = getDefaultSubscriptionStateData(),
proDataState = getDefaultSubscriptionStateData(),
))
val uiState: StateFlow<UIState>
get() = _uiState
Expand All @@ -116,8 +116,8 @@ class SettingsViewModel @Inject constructor(

// observe subscription status
viewModelScope.launch {
proStatusManager.subscriptionState.collect { state ->
_uiState.update { it.copy(subscriptionState = state) }
proStatusManager.proDataState.collect { state ->
_uiState.update { it.copy(proDataState = state) }
}
}

Expand Down Expand Up @@ -651,7 +651,7 @@ class SettingsViewModel @Inject constructor(
val usernameDialog: UsernameDialogData? = null,
val showSimpleDialog: SimpleDialogData? = null,
val isPostPro: Boolean,
val subscriptionState: SubscriptionState,
val proDataState: ProDataState,
)

sealed interface Commands {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ import androidx.compose.ui.tooling.preview.Preview
import androidx.compose.ui.tooling.preview.PreviewParameter
import com.squareup.phrase.Phrase
import network.loki.messenger.R
import network.loki.messenger.libsession_util.protocol.PaymentProviderMetadata
import org.session.libsession.utilities.NonTranslatableStringConstants
import org.session.libsession.utilities.StringSubstitutionConstants.APP_NAME_KEY
import org.session.libsession.utilities.StringSubstitutionConstants.APP_PRO_KEY
Expand All @@ -17,15 +18,16 @@ import org.session.libsession.utilities.StringSubstitutionConstants.PLATFORM_ACC
import org.session.libsession.utilities.StringSubstitutionConstants.PLATFORM_KEY
import org.session.libsession.utilities.StringSubstitutionConstants.PRO_KEY
import org.thoughtcrime.securesms.preferences.prosettings.ProSettingsViewModel.Commands.ShowOpenUrlDialog
import org.thoughtcrime.securesms.pro.SubscriptionDetails
import org.thoughtcrime.securesms.pro.getPlatformDisplayName
import org.thoughtcrime.securesms.pro.previewAppleMetaData
import org.thoughtcrime.securesms.ui.theme.PreviewTheme
import org.thoughtcrime.securesms.ui.theme.SessionColorsParameterProvider
import org.thoughtcrime.securesms.ui.theme.ThemeColors

@OptIn(ExperimentalMaterial3Api::class, ExperimentalSharedTransitionApi::class)
@Composable
fun CancelPlanNonOriginating(
subscriptionDetails: SubscriptionDetails,
providerData: PaymentProviderMetadata,
sendCommand: (ProSettingsViewModel.Commands) -> Unit,
onBack: () -> Unit,
){
Expand All @@ -38,40 +40,40 @@ fun CancelPlanNonOriginating(
.put(PRO_KEY, NonTranslatableStringConstants.PRO)
.format().toString(),
buttonText = Phrase.from(context.getText(R.string.openPlatformWebsite))
.put(PLATFORM_KEY, subscriptionDetails.getPlatformDisplayName())
.put(PLATFORM_KEY, providerData.getPlatformDisplayName())
.format().toString(),
dangerButton = true,
onButtonClick = {
sendCommand(ShowOpenUrlDialog(subscriptionDetails.subscriptionUrl))
sendCommand(ShowOpenUrlDialog(providerData.cancelSubscriptionUrl))
},
contentTitle = stringResource(R.string.proCancellation),
contentDescription = Phrase.from(context.getText(R.string.proCancellationDescription))
.put(PRO_KEY, NonTranslatableStringConstants.PRO)
.put(APP_PRO_KEY, NonTranslatableStringConstants.APP_PRO)
.put(PLATFORM_ACCOUNT_KEY, subscriptionDetails.platformAccount)
.put(PLATFORM_ACCOUNT_KEY, providerData.platformAccount)
.format(),
linkCellsInfo = stringResource(R.string.proCancellationOptions),
linkCells = listOf(
NonOriginatingLinkCellData(
title = Phrase.from(context.getText(R.string.onDevice))
.put(DEVICE_TYPE_KEY, subscriptionDetails.device)
.put(DEVICE_TYPE_KEY, providerData.device)
.format(),
info = Phrase.from(context.getText(R.string.onDeviceCancelDescription))
.put(APP_NAME_KEY, NonTranslatableStringConstants.APP_NAME)
.put(DEVICE_TYPE_KEY, subscriptionDetails.device)
.put(PLATFORM_ACCOUNT_KEY, subscriptionDetails.platformAccount)
.put(DEVICE_TYPE_KEY, providerData.device)
.put(PLATFORM_ACCOUNT_KEY, providerData.platformAccount)
.put(APP_PRO_KEY, NonTranslatableStringConstants.APP_PRO)
.put(PRO_KEY, NonTranslatableStringConstants.PRO)
.format(),
iconRes = R.drawable.ic_smartphone
),
NonOriginatingLinkCellData(
title = Phrase.from(context.getText(R.string.onPlatformWebsite))
.put(PLATFORM_KEY, subscriptionDetails.getPlatformDisplayName())
.put(PLATFORM_KEY, providerData.getPlatformDisplayName())
.format(),
info = Phrase.from(context.getText(R.string.requestRefundPlatformWebsite))
.put(PLATFORM_KEY, subscriptionDetails.getPlatformDisplayName())
.put(PLATFORM_ACCOUNT_KEY, subscriptionDetails.platformAccount)
.put(PLATFORM_KEY, providerData.getPlatformDisplayName())
.put(PLATFORM_ACCOUNT_KEY, providerData.platformAccount)
.put(PRO_KEY, NonTranslatableStringConstants.PRO)
.format(),
iconRes = R.drawable.ic_globe
Expand All @@ -88,14 +90,7 @@ private fun PreviewUpdatePlan(
PreviewTheme(colors) {
val context = LocalContext.current
CancelPlanNonOriginating (
subscriptionDetails = SubscriptionDetails(
device = "iOS",
store = "Apple App Store",
platform = "Apple",
platformAccount = "Apple Account",
subscriptionUrl = "https://www.apple.com/account/subscriptions",
refundUrl = "https://www.apple.com/account/subscriptions",
),
providerData = previewAppleMetaData,
sendCommand = {},
onBack = {},
)
Expand Down
Loading