diff --git a/app/src/main/java/org/thoughtcrime/securesms/preferences/prosettings/BaseProSettingsScreens.kt b/app/src/main/java/org/thoughtcrime/securesms/preferences/prosettings/BaseProSettingsScreens.kt index 2e50075736..069ff767c5 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/preferences/prosettings/BaseProSettingsScreens.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/preferences/prosettings/BaseProSettingsScreens.kt @@ -35,6 +35,7 @@ import androidx.compose.runtime.remember import androidx.compose.ui.Alignment.Companion.Center import androidx.compose.ui.Alignment.Companion.CenterHorizontally import androidx.compose.ui.Modifier +import androidx.compose.ui.draw.clip import androidx.compose.ui.platform.LocalDensity import androidx.compose.ui.res.painterResource import androidx.compose.ui.text.style.TextAlign @@ -50,6 +51,7 @@ import org.thoughtcrime.securesms.ui.components.BackAppBar import org.thoughtcrime.securesms.ui.components.DangerFillButtonRect import org.thoughtcrime.securesms.ui.components.annotatedStringResource import org.thoughtcrime.securesms.ui.components.inlineContentMap +import org.thoughtcrime.securesms.ui.sessionDropShadow import org.thoughtcrime.securesms.ui.theme.LocalColors import org.thoughtcrime.securesms.ui.theme.LocalDimensions import org.thoughtcrime.securesms.ui.theme.LocalType @@ -309,9 +311,15 @@ fun NonOriginatingLinkCell( ) { // icon Box(modifier = Modifier + .then( + if (LocalColors.current.isLight) + Modifier.sessionDropShadow() + else Modifier + ) + .clip(MaterialTheme.shapes.small) + .background(color = LocalColors.current.backgroundSecondary) .background( color = LocalColors.current.accent.copy(alpha = 0.2f), - shape = MaterialTheme.shapes.small ) .padding(10.dp) ){ diff --git a/app/src/main/java/org/thoughtcrime/securesms/preferences/prosettings/CancelPlanNonOriginating.kt b/app/src/main/java/org/thoughtcrime/securesms/preferences/prosettings/CancelPlanNonOriginating.kt index 0cee7d8c4d..9bcdf61581 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/preferences/prosettings/CancelPlanNonOriginating.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/preferences/prosettings/CancelPlanNonOriginating.kt @@ -52,7 +52,10 @@ fun CancelPlanNonOriginating( .put(APP_PRO_KEY, NonTranslatableStringConstants.APP_PRO) .put(PLATFORM_ACCOUNT_KEY, providerData.platformAccount) .format(), - linkCellsInfo = stringResource(R.string.proCancellationOptions), + linkCellsInfo = + Phrase.from(context.getText(R.string.proCancellationOptions)) + .put(PRO_KEY, NonTranslatableStringConstants.PRO) + .format().toString(), linkCells = listOf( NonOriginatingLinkCellData( title = Phrase.from(context.getText(R.string.onDevice)) diff --git a/app/src/main/java/org/thoughtcrime/securesms/preferences/prosettings/CancelPlanScreen.kt b/app/src/main/java/org/thoughtcrime/securesms/preferences/prosettings/CancelPlanScreen.kt index 924c9059e9..30ce6e5056 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/preferences/prosettings/CancelPlanScreen.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/preferences/prosettings/CancelPlanScreen.kt @@ -102,7 +102,7 @@ fun CancelPlan( BaseCellButtonProSettingsScreen( disabled = true, onBack = onBack, - buttonText = Phrase.from(context.getText(R.string.cancelProPlan)) + buttonText = Phrase.from(context.getText(R.string.cancelAccess)) .put(PRO_KEY, NonTranslatableStringConstants.PRO) .format().toString(), dangerButton = true, diff --git a/app/src/main/java/org/thoughtcrime/securesms/preferences/prosettings/PlanConfirmationScreen.kt b/app/src/main/java/org/thoughtcrime/securesms/preferences/prosettings/PlanConfirmationScreen.kt index c8d596e956..b96bf97e43 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/preferences/prosettings/PlanConfirmationScreen.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/preferences/prosettings/PlanConfirmationScreen.kt @@ -61,9 +61,12 @@ fun PlanConfirmationScreen( onBack: () -> Unit, ) { val proData by viewModel.proSettingsUIState.collectAsState() + val previousState by viewModel.choosePlanState.collectAsState() PlanConfirmation( proData = proData, + previousProState = (previousState as? State.Success) + ?.value?.proStatus ?: ProStatus.NeverSubscribed, sendCommand = viewModel::onCommand, onBack = onBack, ) @@ -73,6 +76,7 @@ fun PlanConfirmationScreen( @Composable fun PlanConfirmation( proData: ProSettingsViewModel.ProSettingsState, + previousProState: ProStatus, sendCommand: (ProSettingsViewModel.Commands) -> Unit, onBack: () -> Unit, ) { @@ -113,7 +117,7 @@ fun PlanConfirmation( Spacer(Modifier.height(LocalDimensions.current.xsSpacing)) - val description = when (proData.proDataState.type) { + val description = when (previousProState) { is ProStatus.Active -> { Phrase.from(context.getText(R.string.proAllSetDescription)) .put(APP_PRO_KEY, NonTranslatableStringConstants.APP_PRO) @@ -148,7 +152,7 @@ fun PlanConfirmation( Spacer(Modifier.height(LocalDimensions.current.spacing)) - val buttonLabel = when (proData.proDataState.type) { + val buttonLabel = when (previousProState) { is ProStatus.Active -> stringResource(R.string.theReturn) else -> { @@ -189,6 +193,7 @@ private fun PreviewPlanConfirmationActive( showProBadge = false, ), ), + previousProState = previewAutoRenewingApple, sendCommand = {}, onBack = {}, ) @@ -209,6 +214,7 @@ private fun PreviewPlanConfirmationExpired( showProBadge = true, ), ), + previousProState = previewExpiredApple, sendCommand = {}, onBack = {}, ) @@ -229,6 +235,7 @@ private fun PreviewPlanConfirmationNeverSub( showProBadge = true, ), ), + previousProState = ProStatus.NeverSubscribed, sendCommand = {}, onBack = {}, ) diff --git a/app/src/main/java/org/thoughtcrime/securesms/preferences/prosettings/ProSettingsHomeScreen.kt b/app/src/main/java/org/thoughtcrime/securesms/preferences/prosettings/ProSettingsHomeScreen.kt index bdea2b9621..67ac6699e3 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/preferences/prosettings/ProSettingsHomeScreen.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/preferences/prosettings/ProSettingsHomeScreen.kt @@ -804,6 +804,7 @@ fun ProManage( title = Phrase.from(LocalContext.current, R.string.managePro) .put(PRO_KEY, NonTranslatableStringConstants.PRO) .format().toString(), + dropShadow = LocalColors.current.isLight && data is ProStatus.Expired ) { // Cell content Column( @@ -896,7 +897,7 @@ fun ProManage( is State.Success<*> -> Triple Unit>( null, - LocalColors.current.text, renewIcon(LocalColors.current.accent) + LocalColors.current.text, renewIcon(LocalColors.current.accentText) ) } @@ -906,7 +907,7 @@ fun ProManage( .put(PRO_KEY, NonTranslatableStringConstants.PRO) .format().toString() ), - titleColor = if(subscriptionRefreshState is State.Success ) LocalColors.current.accent + titleColor = if(subscriptionRefreshState is State.Success ) LocalColors.current.accentText else LocalColors.current.text, subtitle = if(subtitle == null) null else annotatedStringResource(subtitle), subtitleColor = subColor, diff --git a/app/src/main/java/org/thoughtcrime/securesms/pro/ProDetailsRepository.kt b/app/src/main/java/org/thoughtcrime/securesms/pro/ProDetailsRepository.kt index d2fa3d76ed..626c500e66 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/pro/ProDetailsRepository.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/pro/ProDetailsRepository.kt @@ -19,6 +19,7 @@ import org.thoughtcrime.securesms.debugmenu.DebugLogGroup import org.thoughtcrime.securesms.dependencies.ManagerScope import org.thoughtcrime.securesms.pro.api.ProDetails import org.thoughtcrime.securesms.pro.db.ProDatabase +import org.thoughtcrime.securesms.util.NetworkConnectivity import java.time.Instant import javax.inject.Inject import javax.inject.Singleton @@ -31,6 +32,7 @@ class ProDetailsRepository @Inject constructor( @ManagerScope scope: CoroutineScope, loginStateRepository: LoginStateRepository, private val prefs: TextSecurePreferences, + private val networkConnectivity: NetworkConnectivity, ) { sealed interface LoadState { val lastUpdated: Pair? @@ -56,12 +58,14 @@ class ProDetailsRepository @Inject constructor( .map { it.state } .distinctUntilChanged(), + networkConnectivity.networkAvailable, + db.proDetailsChangeNotification .onStart { emit(Unit) } .map { db.getProDetailsAndLastUpdated() } - ) { state, last -> + ) { state, isOnline, last -> when (state) { - WorkInfo.State.ENQUEUED, WorkInfo.State.BLOCKED -> LoadState.Loading(last, waitingForNetwork = true) + WorkInfo.State.ENQUEUED, WorkInfo.State.BLOCKED -> LoadState.Loading(last, waitingForNetwork = !isOnline) WorkInfo.State.RUNNING -> LoadState.Loading(last, waitingForNetwork = false) WorkInfo.State.SUCCEEDED -> { if (last != null) { diff --git a/app/src/main/java/org/thoughtcrime/securesms/pro/ProStatusManager.kt b/app/src/main/java/org/thoughtcrime/securesms/pro/ProStatusManager.kt index 01e0184b40..ab26708a68 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/pro/ProStatusManager.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/pro/ProStatusManager.kt @@ -102,14 +102,18 @@ class ProStatusManager @Inject constructor( (TextSecurePreferences.events.filter { it == TextSecurePreferences.SET_FORCE_CURRENT_USER_PRO } as Flow<*>) .onStart { emit(Unit) } .map { prefs.forceCurrentUserAsPro() }, - ){ shouldShowProBadge, proDetailsState, debugSubscription, debugProPlanStatus, forceCurrentUserAsPro -> + ){ shouldShowProBadge, proDetailsState, + debugSubscription, debugProPlanStatus, forceCurrentUserAsPro -> val proDataRefreshState = when(debugProPlanStatus){ DebugMenuViewModel.DebugProPlanStatus.LOADING -> State.Loading DebugMenuViewModel.DebugProPlanStatus.ERROR -> State.Error(Exception()) else -> { // calculate the real refresh state here when(proDetailsState){ - is ProDetailsRepository.LoadState.Loading -> State.Loading + is ProDetailsRepository.LoadState.Loading -> { + if(proDetailsState.waitingForNetwork) State.Error(Exception()) + else State.Loading + } is ProDetailsRepository.LoadState.Error -> State.Error(Exception()) else -> State.Success(Unit) } diff --git a/app/src/main/java/org/thoughtcrime/securesms/tokenpage/TokenPage.kt b/app/src/main/java/org/thoughtcrime/securesms/tokenpage/TokenPage.kt index 0c1ba1b02f..c2805accac 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/tokenpage/TokenPage.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/tokenpage/TokenPage.kt @@ -237,7 +237,6 @@ fun SessionNetworkInfoSection(modifier: Modifier = Modifier) { // 2.) Session network description val sessionNetworkDetailsAnnotatedString = annotatedStringResource( - highlightColor = LocalColors.current.accentText, text = Phrase.from(context.getText(R.string.sessionNetworkDescription)) .put(NETWORK_NAME_KEY, NETWORK_NAME) .put(TOKEN_NAME_LONG_KEY, TOKEN_NAME_LONG) @@ -342,14 +341,12 @@ fun NodeDetailsBox( val appName = context.getString(R.string.app_name) val nodesInSwarmAS = annotatedStringResource( - highlightColor = LocalColors.current.accentText, text = Phrase.from(context, R.string.sessionNetworkNodesSwarm) .put(APP_NAME_KEY, appName) .format() ) val nodesSecuringMessagesAS = annotatedStringResource( - highlightColor = LocalColors.current.accentText, text = Phrase.from(context, R.string.sessionNetworkNodesSecuring) .put(APP_NAME_KEY, appName) .format() diff --git a/app/src/main/java/org/thoughtcrime/securesms/ui/components/AnnotatedString.kt b/app/src/main/java/org/thoughtcrime/securesms/ui/components/AnnotatedString.kt index af93a5ef4f..08f19c8fe5 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/ui/components/AnnotatedString.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/ui/components/AnnotatedString.kt @@ -61,7 +61,7 @@ private fun resources(): Resources { @Composable fun annotatedStringResource( @StringRes id: Int, - highlightColor: Color = LocalColors.current.accent + highlightColor: Color = LocalColors.current.accentText ): AnnotatedString { val resources = resources() val density = LocalDensity.current @@ -74,7 +74,7 @@ fun annotatedStringResource( @Composable fun annotatedStringResource( text: CharSequence, - highlightColor: Color = LocalColors.current.accent + highlightColor: Color = LocalColors.current.accentText ): AnnotatedString { val density = LocalDensity.current return remember(text.hashCode()) {