diff --git a/WordPress/build.gradle b/WordPress/build.gradle index bb75f28e5ff4..b3724df76361 100644 --- a/WordPress/build.gradle +++ b/WordPress/build.gradle @@ -145,6 +145,7 @@ android { buildConfigField "boolean", "BLOGANUARY_DASHBOARD_NUDGE", "false" buildConfigField "boolean", "IN_APP_REVIEWS", "false" buildConfigField "boolean", "DYNAMIC_DASHBOARD_CARDS", "false" + buildConfigField "boolean", "STATS_TRAFFIC_TAB", "false" // Override these constants in jetpack product flavor to enable/ disable features buildConfigField "boolean", "ENABLE_SITE_CREATION", "true" diff --git a/WordPress/jetpack_metadata/release_notes.txt b/WordPress/jetpack_metadata/release_notes.txt index f80ecfc08a7d..e2c9297fb6cb 100644 --- a/WordPress/jetpack_metadata/release_notes.txt +++ b/WordPress/jetpack_metadata/release_notes.txt @@ -1,4 +1,9 @@ -No updates this week! Enjoy these reindeer facts: -- Male reindeer shed their antlers in fall and females in spring, so Santa’s reindeer are female. -- Reindeer don’t actually have red noses. -- Santa hasn’t eaten milk and cookies since 2003 because Blitzen always gets there first. +* [*] Filter media types when sharing files to the editor [https://github.com/wordpress-mobile/WordPress-Android/pull/19754] +* [***] [Jetpack-only] Plans: Upgrade to a Plan from domains dashboard in Jetpack app [https://github.com/wordpress-mobile/WordPress-Android/pull/19818] +* [**] [internal] Removes unused resources and code [https://github.com/wordpress-mobile/WordPress-Android/pull/19788] +* [*] Block Editor: Add support for unselecting blocks with the hardware back button [https://github.com/wordpress-mobile/WordPress-Android/pull/19828] +* [**] [internal] Removes unused code using android tool [https://github.com/wordpress-mobile/WordPress-Android/pull/19850] +* [**] [internal] [Jetpack-only] Adds support for dynamic dashboard cards driven by the backend [https://github.com/wordpress-mobile/WordPress-Android/pull/19801] +* [***] Block Editor: Avoid keyboard dismiss when interacting with text blocks [https://github.com/WordPress/gutenberg/pull/57070] +* [**] Block Editor: Auto-scroll upon block insertion [https://github.com/WordPress/gutenberg/pull/57273] + diff --git a/WordPress/metadata/release_notes.txt b/WordPress/metadata/release_notes.txt index f80ecfc08a7d..8ba136d8403a 100644 --- a/WordPress/metadata/release_notes.txt +++ b/WordPress/metadata/release_notes.txt @@ -1,4 +1,8 @@ -No updates this week! Enjoy these reindeer facts: -- Male reindeer shed their antlers in fall and females in spring, so Santa’s reindeer are female. -- Reindeer don’t actually have red noses. -- Santa hasn’t eaten milk and cookies since 2003 because Blitzen always gets there first. +* [*] Filter media types when sharing files to the editor [https://github.com/wordpress-mobile/WordPress-Android/pull/19754] +* [**] [internal] Removes unused resources and code [https://github.com/wordpress-mobile/WordPress-Android/pull/19788] +* [*] Block Editor: Add support for unselecting blocks with the hardware back button [https://github.com/wordpress-mobile/WordPress-Android/pull/19828] +* [**] [internal] Removes unused code using android tool [https://github.com/wordpress-mobile/WordPress-Android/pull/19850] +* [**] [internal] [Jetpack-only] Adds support for dynamic dashboard cards driven by the backend [https://github.com/wordpress-mobile/WordPress-Android/pull/19801] +* [***] Block Editor: Avoid keyboard dismiss when interacting with text blocks [https://github.com/WordPress/gutenberg/pull/57070] +* [**] Block Editor: Auto-scroll upon block insertion [https://github.com/WordPress/gutenberg/pull/57273] + diff --git a/WordPress/src/debug/AndroidManifest.xml b/WordPress/src/debug/AndroidManifest.xml index a68f9e14c56f..e961d134552f 100644 --- a/WordPress/src/debug/AndroidManifest.xml +++ b/WordPress/src/debug/AndroidManifest.xml @@ -34,6 +34,9 @@ + - diff --git a/WordPress/src/main/java/org/wordpress/android/ui/ActivityLauncher.java b/WordPress/src/main/java/org/wordpress/android/ui/ActivityLauncher.java index f9d3048c03d6..ab51fe1aad2e 100644 --- a/WordPress/src/main/java/org/wordpress/android/ui/ActivityLauncher.java +++ b/WordPress/src/main/java/org/wordpress/android/ui/ActivityLauncher.java @@ -54,6 +54,7 @@ import org.wordpress.android.ui.comments.unified.UnifiedCommentsActivity; import org.wordpress.android.ui.comments.unified.UnifiedCommentsDetailsActivity; import org.wordpress.android.ui.debug.cookies.DebugCookiesActivity; +import org.wordpress.android.ui.debug.preferences.DebugSharedPreferenceFlagsActivity; import org.wordpress.android.ui.domains.DomainRegistrationActivity; import org.wordpress.android.ui.domains.DomainRegistrationActivity.DomainRegistrationPurpose; import org.wordpress.android.ui.domains.DomainsDashboardActivity; @@ -1803,6 +1804,9 @@ public static void viewDebugCookies(@NonNull Context context) { context.startActivity(new Intent(context, DebugCookiesActivity.class)); } + public static void viewDebugSharedPreferenceFlags(@NonNull Context context) { + context.startActivity(new Intent(context, DebugSharedPreferenceFlagsActivity.class)); + } public static void startQRCodeAuthFlow(@NonNull Context context) { QRCodeAuthActivity.start(context); } diff --git a/WordPress/src/main/java/org/wordpress/android/ui/debug/DebugSettingsActivity.kt b/WordPress/src/main/java/org/wordpress/android/ui/debug/DebugSettingsActivity.kt index 11320aa5fb45..bd2ed4d6c75d 100644 --- a/WordPress/src/main/java/org/wordpress/android/ui/debug/DebugSettingsActivity.kt +++ b/WordPress/src/main/java/org/wordpress/android/ui/debug/DebugSettingsActivity.kt @@ -45,6 +45,8 @@ class DebugSettingsActivity : LocaleAwareActivity() { is DebugSettingsViewModel.NavigationAction.PreviewFragment -> { previewFragmentInActivity(it.name) } + is DebugSettingsViewModel.NavigationAction.DebugFlags -> + ActivityLauncher.viewDebugSharedPreferenceFlags(this@DebugSettingsActivity) } } } @@ -68,6 +70,7 @@ class DebugSettingsActivity : LocaleAwareActivity() { R.id.menu_debug_cookies -> viewModel.onDebugCookiesClick() R.id.menu_restart_app -> viewModel.onRestartAppClick() R.id.menu_show_weekly_notifications -> viewModel.onForceShowWeeklyRoundupClick() + R.id.menu_debug_flags -> viewModel.onDebugFlagsClick() } return true } diff --git a/WordPress/src/main/java/org/wordpress/android/ui/debug/DebugSettingsViewModel.kt b/WordPress/src/main/java/org/wordpress/android/ui/debug/DebugSettingsViewModel.kt index 86c0d2055977..754d291afd70 100644 --- a/WordPress/src/main/java/org/wordpress/android/ui/debug/DebugSettingsViewModel.kt +++ b/WordPress/src/main/java/org/wordpress/android/ui/debug/DebugSettingsViewModel.kt @@ -87,6 +87,10 @@ class DebugSettingsViewModel } } + fun onDebugFlagsClick() { + _onNavigation.value = Event(NavigationAction.DebugFlags) + } + private fun buildDevelopedFeatures(): List { return FeaturesInDevelopment.featuresInDevelopment.map { name -> val value = if (manualFeatureConfig.hasManualSetup(name)) { @@ -156,6 +160,7 @@ class DebugSettingsViewModel sealed class NavigationAction { object DebugCookies : NavigationAction() + object DebugFlags : NavigationAction() data class PreviewFragment(val name: String) : NavigationAction() } } diff --git a/WordPress/src/main/java/org/wordpress/android/ui/debug/preferences/DebugSharedPreferenceFlagsActivity.kt b/WordPress/src/main/java/org/wordpress/android/ui/debug/preferences/DebugSharedPreferenceFlagsActivity.kt new file mode 100644 index 000000000000..bffe6787bee3 --- /dev/null +++ b/WordPress/src/main/java/org/wordpress/android/ui/debug/preferences/DebugSharedPreferenceFlagsActivity.kt @@ -0,0 +1,29 @@ +package org.wordpress.android.ui.debug.preferences + +import android.os.Bundle +import androidx.activity.viewModels +import androidx.appcompat.app.AppCompatActivity +import androidx.compose.runtime.collectAsState +import androidx.compose.runtime.getValue +import dagger.hilt.android.AndroidEntryPoint +import org.wordpress.android.ui.domains.management.M3Theme +import org.wordpress.android.util.extensions.setContent + +@AndroidEntryPoint +class DebugSharedPreferenceFlagsActivity : AppCompatActivity() { + private val viewModel: DebugSharedPreferenceFlagsViewModel by viewModels() + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + setContent { + M3Theme { + val uiState by viewModel.uiStateFlow.collectAsState() + DebugSharedPreferenceFlagsScreen( + flags = uiState, + onFlagChanged = viewModel::setFlag, + onBackTapped = { onBackPressedDispatcher.onBackPressed() }, + ) + } + } + } +} diff --git a/WordPress/src/main/java/org/wordpress/android/ui/debug/preferences/DebugSharedPreferenceFlagsScreen.kt b/WordPress/src/main/java/org/wordpress/android/ui/debug/preferences/DebugSharedPreferenceFlagsScreen.kt new file mode 100644 index 000000000000..0ce6fde1c676 --- /dev/null +++ b/WordPress/src/main/java/org/wordpress/android/ui/debug/preferences/DebugSharedPreferenceFlagsScreen.kt @@ -0,0 +1,95 @@ +package org.wordpress.android.ui.debug.preferences + +import androidx.compose.foundation.clickable +import androidx.compose.foundation.layout.Row +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.lazy.LazyColumn +import androidx.compose.foundation.lazy.items +import androidx.compose.material3.Checkbox +import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.Scaffold +import androidx.compose.material3.Text +import androidx.compose.runtime.Composable +import androidx.compose.ui.Alignment.Companion.CenterVertically +import androidx.compose.ui.Modifier +import androidx.compose.ui.res.stringResource +import androidx.compose.ui.tooling.preview.Preview +import androidx.compose.ui.unit.dp +import org.wordpress.android.R +import org.wordpress.android.ui.compose.components.MainTopAppBar +import org.wordpress.android.ui.compose.components.NavigationIcons +import org.wordpress.android.ui.domains.management.M3Theme + +@Composable +fun DebugSharedPreferenceFlagsScreen( + flags: Map, + onBackTapped: () -> Unit, + onFlagChanged: (String, Boolean) -> Unit, +) { + Scaffold( + topBar = { + MainTopAppBar( + title = stringResource(R.string.debug_settings_debug_flags_screen), + navigationIcon = NavigationIcons.BackIcon, + onNavigationIconClick = onBackTapped, + backgroundColor = MaterialTheme.colorScheme.surface, + contentColor = MaterialTheme.colorScheme.onSurface, + ) + }, + ) { paddingValues -> + LazyColumn(modifier = Modifier.padding(paddingValues)) { + items(flags.toList()) { (key, value) -> + DebugFlagRow( + key = key, + value = value, + onFlagChanged = onFlagChanged, + ) + } + } + } +} + +@Composable +fun DebugFlagRow( + key: String, + value: Boolean, + onFlagChanged: (String, Boolean) -> Unit, + modifier: Modifier = Modifier, +) { + Row( + modifier = modifier + .padding(vertical = 4.dp) + .clickable { onFlagChanged(key, !value) } + ) { + Text( + text = key, + modifier = Modifier + .weight(1f) + .align(CenterVertically) + .padding(start = 16.dp) + ) + Checkbox( + checked = value, + modifier = Modifier.align(CenterVertically).padding(end = 8.dp), + onCheckedChange = { onFlagChanged(key, it) } + ) + } +} + +@Preview +@Composable +fun DebugFlagsScreenPreview() { + M3Theme { + DebugSharedPreferenceFlagsScreen( + flags = mapOf( + "EXAMPLE_FEATURE_FLAG" to true, + "RANDOM_FLAG" to false, + "ANOTHER_FLAG" to true, + "YET_ANOTHER_FLAG" to false, + + ), + onBackTapped = {}, + onFlagChanged = { _, _ -> }, + ) + } +} diff --git a/WordPress/src/main/java/org/wordpress/android/ui/debug/preferences/DebugSharedPreferenceFlagsViewModel.kt b/WordPress/src/main/java/org/wordpress/android/ui/debug/preferences/DebugSharedPreferenceFlagsViewModel.kt new file mode 100644 index 000000000000..b7c99e4487e6 --- /dev/null +++ b/WordPress/src/main/java/org/wordpress/android/ui/debug/preferences/DebugSharedPreferenceFlagsViewModel.kt @@ -0,0 +1,28 @@ +package org.wordpress.android.ui.debug.preferences + +import androidx.lifecycle.ViewModel +import dagger.hilt.android.lifecycle.HiltViewModel +import kotlinx.coroutines.flow.MutableStateFlow +import kotlinx.coroutines.flow.asStateFlow +import org.wordpress.android.ui.prefs.AppPrefsWrapper +import javax.inject.Inject + +@HiltViewModel +class DebugSharedPreferenceFlagsViewModel @Inject constructor( + private val prefsWrapper: AppPrefsWrapper +) : ViewModel() { + private val _uiStateFlow = MutableStateFlow>(emptyMap()) + val uiStateFlow = _uiStateFlow.asStateFlow() + + init { + val flags = prefsWrapper.getAllPrefs().mapNotNull { (key, value) -> + if (value is Boolean) key to value else null + }.toMap() + _uiStateFlow.value = flags + } + + fun setFlag(key: String, value: Boolean) { + prefsWrapper.putBoolean({ key }, value) + _uiStateFlow.value = _uiStateFlow.value.toMutableMap().apply { this[key] = value } + } +} diff --git a/WordPress/src/main/java/org/wordpress/android/ui/deeplinks/DeepLinkTrackingUtils.kt b/WordPress/src/main/java/org/wordpress/android/ui/deeplinks/DeepLinkTrackingUtils.kt index 4c2aefe46248..482f4f483c4d 100644 --- a/WordPress/src/main/java/org/wordpress/android/ui/deeplinks/DeepLinkTrackingUtils.kt +++ b/WordPress/src/main/java/org/wordpress/android/ui/deeplinks/DeepLinkTrackingUtils.kt @@ -6,11 +6,7 @@ import org.wordpress.android.ui.deeplinks.DeepLinkNavigator.NavigateAction.OpenI import org.wordpress.android.ui.deeplinks.DeepLinkTrackingUtils.DeepLinkSource.BANNER import org.wordpress.android.ui.deeplinks.DeepLinkTrackingUtils.DeepLinkSource.EMAIL import org.wordpress.android.ui.deeplinks.DeepLinkTrackingUtils.DeepLinkSource.LINK -import org.wordpress.android.ui.deeplinks.DeepLinkTrackingUtils.DeepLinkSource.QRCODE_AUTH -import org.wordpress.android.ui.deeplinks.DeepLinkTrackingUtils.DeepLinkSource.QRCODE_MEDIA import org.wordpress.android.ui.deeplinks.handlers.DeepLinkHandlers -import org.wordpress.android.ui.deeplinks.handlers.QRCodeAuthLinkHandler -import org.wordpress.android.ui.deeplinks.handlers.QRCodeMediaLinkHandler import org.wordpress.android.util.UriWrapper import org.wordpress.android.util.analytics.AnalyticsUtilsWrapper import javax.inject.Inject @@ -58,9 +54,10 @@ class DeepLinkTrackingUtils val trackingSource = source ?: if (uri.host == DeepLinkingIntentReceiverViewModel.HOST_WORDPRESS_COM) { LINK } else { - applyBannerOrQrCodeSourceFromUri(uri) + BANNER } - return TrackingData(trackingSource, url ?: "", sourceInfo) + val trackingSourceInfo = sourceInfo ?: applyBannerSourceInfoIfNeeded(uri) + return TrackingData(trackingSource, url ?: "", trackingSourceInfo) } private fun extractTargetUri(uri: UriWrapper): UriWrapper { @@ -73,12 +70,10 @@ class DeepLinkTrackingUtils } ?: uri } - private fun applyBannerOrQrCodeSourceFromUri(uri: UriWrapper): DeepLinkSource { - return when (uri.getQueryParameter("campaign")) { - null -> BANNER - QRCodeMediaLinkHandler.CAMPAIGN_TYPE -> QRCODE_MEDIA - QRCodeAuthLinkHandler.CAMPAIGN_TYPE -> QRCODE_AUTH - else -> LINK + private fun applyBannerSourceInfoIfNeeded(uri: UriWrapper): String? { + return when (val campaign = uri.getQueryParameter("campaign")) { + null -> null + else -> campaign } } @@ -88,7 +83,5 @@ class DeepLinkTrackingUtils EMAIL("email"), BANNER("banner"), LINK("link"), - QRCODE_AUTH("qr-code-auth"), - QRCODE_MEDIA("qr-code-media") } } diff --git a/WordPress/src/main/java/org/wordpress/android/ui/deeplinks/handlers/QRCodeMediaLinkHandler.kt b/WordPress/src/main/java/org/wordpress/android/ui/deeplinks/handlers/QRCodeMediaLinkHandler.kt index 5278611ef8e6..16f8ce2d2c7d 100644 --- a/WordPress/src/main/java/org/wordpress/android/ui/deeplinks/handlers/QRCodeMediaLinkHandler.kt +++ b/WordPress/src/main/java/org/wordpress/android/ui/deeplinks/handlers/QRCodeMediaLinkHandler.kt @@ -1,18 +1,21 @@ package org.wordpress.android.ui.deeplinks.handlers +import org.wordpress.android.analytics.AnalyticsTracker import org.wordpress.android.ui.deeplinks.DeepLinkNavigator.NavigateAction import org.wordpress.android.ui.deeplinks.DeepLinkUriUtils import org.wordpress.android.util.UriWrapper +import org.wordpress.android.util.analytics.AnalyticsTrackerWrapper import javax.inject.Inject class QRCodeMediaLinkHandler @Inject constructor( - private val deepLinkUriUtils: DeepLinkUriUtils + private val deepLinkUriUtils: DeepLinkUriUtils, + private val analyticsTrackerWrapper: AnalyticsTrackerWrapper ) : DeepLinkHandler { /** * Returns true if the URI looks like `apps.wordpress.com/get` */ override fun shouldHandleUrl(uri: UriWrapper): Boolean { - // https://apps.wordpress.com/get/?campaign=qr-code-media&data=post_id:6,site_id:227148183 + // https://apps.wordpress.com/get/?campaign=qr-code-media#/media/{blog_id} return uri.host == HOST_APPS_WORDPRESS_COM && uri.pathSegments.firstOrNull() == GET_PATH && uri.getQueryParameter(CAMPAIGN) == CAMPAIGN_TYPE @@ -22,6 +25,9 @@ class QRCodeMediaLinkHandler @Inject constructor( val extractedSiteId = extractSiteIdFromUrl(uri) return when (val siteModel = extractedSiteId?.let { siteId -> deepLinkUriUtils.blogIdToSite(siteId) }) { null -> { + analyticsTrackerWrapper.track(AnalyticsTracker.Stat.DEEP_LINK_FAILED, + mapOf(ERROR to INVALID_SITE_ID, + CAMPAIGN to uri.getQueryParameter(CAMPAIGN)?.replace("-", "_"))) NavigateAction.OpenMySite } else -> { @@ -37,9 +43,12 @@ class QRCodeMediaLinkHandler @Inject constructor( } private fun extractSiteIdFromUrl(uri: UriWrapper): String? { - uri.getQueryParameter("data")?.let { data -> - val siteIdPair = data.split(",").find { it.startsWith("site_id:") } - return siteIdPair?.substringAfter(":") + uri.fragment?.let { fragment -> + val pathSegments = fragment.split("/") + + if (pathSegments.isNotEmpty()) { + return pathSegments.last() + } } return null } @@ -48,6 +57,8 @@ class QRCodeMediaLinkHandler @Inject constructor( private const val GET_PATH = "get" private const val HOST_APPS_WORDPRESS_COM = "apps.wordpress.com" private const val CAMPAIGN = "campaign" + private const val ERROR = "error" + private const val INVALID_SITE_ID = "invalid_site_id" const val CAMPAIGN_TYPE = "qr-code-media" } } diff --git a/WordPress/src/main/java/org/wordpress/android/ui/main/WPMainNavigationView.kt b/WordPress/src/main/java/org/wordpress/android/ui/main/WPMainNavigationView.kt index beca76c4484c..57138416e919 100644 --- a/WordPress/src/main/java/org/wordpress/android/ui/main/WPMainNavigationView.kt +++ b/WordPress/src/main/java/org/wordpress/android/ui/main/WPMainNavigationView.kt @@ -1,18 +1,22 @@ package org.wordpress.android.ui.main import android.content.Context +import android.graphics.ColorMatrix +import android.graphics.ColorMatrixColorFilter import android.graphics.drawable.BitmapDrawable import android.util.AttributeSet import android.view.HapticFeedbackConstants import android.view.LayoutInflater import android.view.MenuItem import android.view.View +import android.view.animation.AnimationUtils import android.widget.ImageView import android.widget.TextView import androidx.annotation.DrawableRes import androidx.annotation.IdRes import androidx.annotation.StringRes import androidx.core.content.res.ResourcesCompat +import androidx.core.view.setPadding import androidx.core.widget.ImageViewCompat import androidx.fragment.app.Fragment import androidx.fragment.app.FragmentManager @@ -72,6 +76,9 @@ class WPMainNavigationView @JvmOverloads constructor( MaterialR.dimen.material_emphasis_disabled ) + val disabledColorFilter = ColorMatrixColorFilter(ColorMatrix().apply { setSaturation(0f) }) + val enabledColorFilter = ColorMatrixColorFilter(ColorMatrix().apply { setSaturation(1f) }) + @Inject lateinit var meGravatarLoader: MeGravatarLoader @@ -130,6 +137,10 @@ class WPMainNavigationView @JvmOverloads constructor( itemView.addView(customView) } + if(getMainPageIndex() != getPosition(ME)) { + setImageViewSelected(getPosition(ME), false) + } + currentPosition = getMainPageIndex() } @@ -138,6 +149,7 @@ class WPMainNavigationView @JvmOverloads constructor( AppLog.d(AppLog.T.MAIN, "Attempted to load an empty Gravatar URL!") return } + imgIcon.setPadding(resources.getDimensionPixelSize(R.dimen.navbar_me_icon_padding)) AppLog.d(AppLog.T.MAIN, meGravatarLoader.constructGravatarUrl(avatarUrl)) imgIcon.let { meGravatarLoader.load( @@ -282,8 +294,19 @@ class WPMainNavigationView @JvmOverloads constructor( private fun setImageViewSelected(position: Int, isSelected: Boolean) { getImageViewForPosition(position)?.let { + if(position == getPosition(ME)) { + if(!isSelected){ + it.colorFilter = disabledColorFilter + } else + it.colorFilter = enabledColorFilter + } + it.isSelected = isSelected it.alpha = if (isSelected) 1f else unselectedButtonAlpha + if(it.isSelected) { + val pop = AnimationUtils.loadAnimation(it.context, R.anim.bottom_nav_icon_pop) + it.startAnimation(pop) + } } } @@ -298,10 +321,10 @@ class WPMainNavigationView @JvmOverloads constructor( @DrawableRes private fun getDrawableResForPosition(position: Int): Int { return when (getPageTypeOrNull(position)) { - MY_SITE -> R.drawable.ic_my_sites_white_24dp - READER -> R.drawable.ic_reader_white_24dp - NOTIFS -> R.drawable.ic_bell_white_24dp - else -> R.drawable.ic_user_primary_white_24 + MY_SITE -> R.drawable.ic_home_selected + READER -> R.drawable.ic_reader_selected + NOTIFS -> R.drawable.ic_notifications_selected + else -> R.drawable.ic_me_bottom_nav } } diff --git a/WordPress/src/main/java/org/wordpress/android/ui/mysite/cards/dashboard/CardsSource.kt b/WordPress/src/main/java/org/wordpress/android/ui/mysite/cards/dashboard/CardsSource.kt index 33b3aa292daa..fc3c14db5bbc 100644 --- a/WordPress/src/main/java/org/wordpress/android/ui/mysite/cards/dashboard/CardsSource.kt +++ b/WordPress/src/main/java/org/wordpress/android/ui/mysite/cards/dashboard/CardsSource.kt @@ -10,7 +10,11 @@ import kotlinx.coroutines.flow.map import kotlinx.coroutines.launch import org.wordpress.android.fluxc.model.SiteModel import org.wordpress.android.fluxc.model.dashboard.CardModel.Type +import org.wordpress.android.fluxc.network.rest.wpcom.dashboard.CardsRestClient +import org.wordpress.android.fluxc.store.NotificationStore import org.wordpress.android.fluxc.store.dashboard.CardsStore +import org.wordpress.android.fluxc.utils.PreferenceUtils.PreferenceUtilsWrapper +import org.wordpress.android.util.BuildConfigWrapper import org.wordpress.android.modules.BG_THREAD import org.wordpress.android.ui.mysite.MySiteSource.MySiteRefreshSource import org.wordpress.android.ui.mysite.MySiteUiState.PartialState.CardsUpdate @@ -18,6 +22,8 @@ import org.wordpress.android.ui.mysite.SelectedSiteRepository import org.wordpress.android.ui.mysite.cards.dashboard.activity.DashboardActivityLogCardFeatureUtils import org.wordpress.android.ui.prefs.AppPrefsWrapper import org.wordpress.android.util.config.DynamicDashboardCardsFeatureConfig +import org.wordpress.android.util.config.FEATURE_FLAG_PLATFORM_PARAMETER +import java.util.UUID import javax.inject.Inject import javax.inject.Named @@ -30,6 +36,8 @@ class CardsSource @Inject constructor( @param:Named(BG_THREAD) private val bgDispatcher: CoroutineDispatcher, private val appPrefsWrapper: AppPrefsWrapper, private val dynamicDashboardCardsFeatureConfig: DynamicDashboardCardsFeatureConfig, + private val preferences: PreferenceUtilsWrapper, + private val buildConfigWrapper: BuildConfigWrapper, ) : MySiteRefreshSource { override val refresh = MutableLiveData(false) @@ -89,7 +97,17 @@ class CardsSource @Inject constructor( ) { coroutineScope.launch(bgDispatcher) { delay(REFRESH_DELAY) - val result = cardsStore.fetchCards(selectedSite, getCardTypes(selectedSite)) + val payload = CardsRestClient.FetchCardsPayload( + selectedSite, + getCardTypes(selectedSite), + buildNumber = buildConfigWrapper.getAppVersionCode().toString(), + deviceId = preferences.getFluxCPreferences().getString(NotificationStore.WPCOM_PUSH_DEVICE_UUID, null) + ?: generateAndStoreUUID(), + identifier = buildConfigWrapper.getApplicationId(), + marketingVersion = buildConfigWrapper.getAppVersionName(), + platform = FEATURE_FLAG_PLATFORM_PARAMETER, + ) + val result = cardsStore.fetchCards(payload) val model = result.model val error = result.error when { @@ -100,6 +118,12 @@ class CardsSource @Inject constructor( } } + private fun generateAndStoreUUID(): String { + return UUID.randomUUID().toString().also { + preferences.getFluxCPreferences().edit().putString(NotificationStore.WPCOM_PUSH_DEVICE_UUID, it).apply() + } + } + private fun getCardTypes(selectedSite: SiteModel) = mutableListOf().apply { if (shouldRequestStatsCard(selectedSite)) add(Type.TODAYS_STATS) if (shouldRequestPagesCard(selectedSite)) add(Type.PAGES) diff --git a/WordPress/src/main/java/org/wordpress/android/ui/mysite/cards/dynamiccard/DynamicCardsBuilder.kt b/WordPress/src/main/java/org/wordpress/android/ui/mysite/cards/dynamiccard/DynamicCardsBuilder.kt index 646052113207..ed3d12687732 100644 --- a/WordPress/src/main/java/org/wordpress/android/ui/mysite/cards/dynamiccard/DynamicCardsBuilder.kt +++ b/WordPress/src/main/java/org/wordpress/android/ui/mysite/cards/dynamiccard/DynamicCardsBuilder.kt @@ -8,14 +8,12 @@ import org.wordpress.android.ui.mysite.MySiteCardAndItemBuilderParams.DynamicCar import org.wordpress.android.ui.utils.ListItemInteraction import org.wordpress.android.util.UrlUtilsWrapper import org.wordpress.android.util.config.DynamicDashboardCardsFeatureConfig -import org.wordpress.android.util.config.FeatureFlagConfig import javax.inject.Inject class DynamicCardsBuilder @Inject constructor( private val urlUtils: UrlUtilsWrapper, private val deepLinkHandlers: DeepLinkHandlers, private val dynamicDashboardCardsFeatureConfig: DynamicDashboardCardsFeatureConfig, - private val featureFlagConfig: FeatureFlagConfig, ) { fun build(params: DynamicCardsBuilderParams, order: CardOrder): List? { if (!dynamicDashboardCardsFeatureConfig.isEnabled() || !shouldBuildCard(params, order)) { @@ -29,7 +27,7 @@ class DynamicCardsBuilder @Inject constructor( } private fun convertToDynamicCards(params: DynamicCardsBuilderParams, order: CardOrder): List { - val cards = params.dynamicCards?.dynamicCards?.filter { it.order == order && it.isEnabled() }.orEmpty() + val cards = params.dynamicCards?.dynamicCards?.filter { it.order == order }.orEmpty() return cards.map { card -> Dynamic( id = card.id, @@ -48,14 +46,6 @@ class DynamicCardsBuilder @Inject constructor( } } - fun DynamicCardModel.isEnabled(): Boolean { - // If there is no feature flag or there is no such remote feature flag, then the card is enabled - if (remoteFeatureFlag.isNullOrEmpty() || - featureFlagConfig.getString(requireNotNull(remoteFeatureFlag)).isEmpty() - ) return true - return featureFlagConfig.isEnabled(requireNotNull(remoteFeatureFlag)) - } - private fun getActionSource( params: DynamicCardsBuilderParams, card: DynamicCardModel diff --git a/WordPress/src/main/java/org/wordpress/android/ui/prefs/WPStartOverPreference.java b/WordPress/src/main/java/org/wordpress/android/ui/prefs/WPStartOverPreference.java new file mode 100644 index 000000000000..786d8c20b3b2 --- /dev/null +++ b/WordPress/src/main/java/org/wordpress/android/ui/prefs/WPStartOverPreference.java @@ -0,0 +1,76 @@ +package org.wordpress.android.ui.prefs; + +import android.content.Context; +import android.content.res.TypedArray; +import android.graphics.drawable.Drawable; +import android.util.AttributeSet; +import android.view.View; +import android.widget.Button; +import android.widget.ImageView; + +import androidx.annotation.NonNull; +import androidx.core.content.ContextCompat; +import androidx.vectordrawable.graphics.drawable.VectorDrawableCompat; + +import org.wordpress.android.R; + +/** + * Calypso-style Preference that has an icon and a widget in the correct place. If there is a button + * with id R.id.button, an onPreferenceClick listener is added. + */ + +public class WPStartOverPreference extends WPPreference { + private String mButtonText; + private int mButtonTextColor; + private boolean mButtonTextAllCaps; + private Drawable mPrefIcon; + + public WPStartOverPreference(Context context, AttributeSet attrs) { + super(context, attrs); + + TypedArray array = context.obtainStyledAttributes(attrs, R.styleable.WPStartOverPreference); + + for (int i = 0; i < array.getIndexCount(); ++i) { + int index = array.getIndex(i); + if (index == R.styleable.WPStartOverPreference_buttonText) { + mButtonText = array.getString(index); + } else if (index == R.styleable.WPStartOverPreference_buttonTextColor) { + mButtonTextColor = array.getColor(index, ContextCompat.getColor(context, 0)); + } else if (index == R.styleable.WPStartOverPreference_buttonTextAllCaps) { + mButtonTextAllCaps = array.getBoolean(index, false); + } else if (index == R.styleable.WPStartOverPreference_preficon) { + mPrefIcon = VectorDrawableCompat.create(context.getResources(), array.getResourceId(index, 0), null); + } + } + + array.recycle(); + } + + @Override + protected void onBindView(@NonNull View view) { + super.onBindView(view); + + if (view.findViewById(R.id.pref_icon) != null) { + ImageView imageView = view.findViewById(R.id.pref_icon); + imageView.setImageDrawable(mPrefIcon); + } + + if (view.findViewById(R.id.button) != null) { + final WPStartOverPreference wpStartOverPreference = this; + + Button button = view.findViewById(R.id.button); + button.setText(mButtonText); + if (mButtonTextColor > 0) { + button.setTextColor(mButtonTextColor); + } + button.setAllCaps(mButtonTextAllCaps); + button.setOnClickListener(v -> getOnPreferenceClickListener().onPreferenceClick(wpStartOverPreference)); + } + + // TODO: FluxC: We might want to get the selected site here and update the view + // if (view.findViewById(R.id.domain) != null) { + // TextView textView = (TextView) view.findViewById(R.id.domain); + // textView.setText(UrlUtils.getHost(blog.getHomeURL())); + // } + } +} diff --git a/WordPress/src/main/java/org/wordpress/android/util/config/StatsTrafficTabFeatureConfig.kt b/WordPress/src/main/java/org/wordpress/android/util/config/StatsTrafficTabFeatureConfig.kt new file mode 100644 index 000000000000..7b55f34878ed --- /dev/null +++ b/WordPress/src/main/java/org/wordpress/android/util/config/StatsTrafficTabFeatureConfig.kt @@ -0,0 +1,16 @@ +package org.wordpress.android.util.config + +import org.wordpress.android.BuildConfig +import org.wordpress.android.annotation.Feature +import javax.inject.Inject + +private const val STATS_TRAFFIC_TAB_REMOTE_FIELD = "stats_traffic_tab" + +@Feature(STATS_TRAFFIC_TAB_REMOTE_FIELD, false) +class StatsTrafficTabFeatureConfig @Inject constructor( + appConfig: AppConfig +) : FeatureConfig( + appConfig, + BuildConfig.STATS_TRAFFIC_TAB, + STATS_TRAFFIC_TAB_REMOTE_FIELD +) diff --git a/WordPress/src/main/res/anim/bottom_nav_icon_pop.xml b/WordPress/src/main/res/anim/bottom_nav_icon_pop.xml new file mode 100644 index 000000000000..27815dc4c318 --- /dev/null +++ b/WordPress/src/main/res/anim/bottom_nav_icon_pop.xml @@ -0,0 +1,11 @@ + + diff --git a/WordPress/src/main/res/drawable/ic_home_selected.xml b/WordPress/src/main/res/drawable/ic_home_selected.xml new file mode 100644 index 000000000000..12fd0afa8638 --- /dev/null +++ b/WordPress/src/main/res/drawable/ic_home_selected.xml @@ -0,0 +1,12 @@ + + + + + + diff --git a/WordPress/src/main/res/drawable/ic_me_bottom_nav.xml b/WordPress/src/main/res/drawable/ic_me_bottom_nav.xml new file mode 100644 index 000000000000..8393c3ffa1e3 --- /dev/null +++ b/WordPress/src/main/res/drawable/ic_me_bottom_nav.xml @@ -0,0 +1,16 @@ + + + + diff --git a/WordPress/src/main/res/drawable/ic_notifications_selected.xml b/WordPress/src/main/res/drawable/ic_notifications_selected.xml new file mode 100644 index 000000000000..19103ae2fdd6 --- /dev/null +++ b/WordPress/src/main/res/drawable/ic_notifications_selected.xml @@ -0,0 +1,14 @@ + + + + diff --git a/WordPress/src/main/res/drawable/ic_reader_selected.xml b/WordPress/src/main/res/drawable/ic_reader_selected.xml new file mode 100644 index 000000000000..d3d5e70339f8 --- /dev/null +++ b/WordPress/src/main/res/drawable/ic_reader_selected.xml @@ -0,0 +1,24 @@ + + + + + + + diff --git a/WordPress/src/main/res/drawable/nav_bar_button_selector.xml b/WordPress/src/main/res/drawable/nav_bar_button_selector.xml index 003c854c0051..505046fbd95a 100644 --- a/WordPress/src/main/res/drawable/nav_bar_button_selector.xml +++ b/WordPress/src/main/res/drawable/nav_bar_button_selector.xml @@ -3,6 +3,6 @@ xmlns:android="http://schemas.android.com/apk/res/android"> - + diff --git a/WordPress/src/main/res/layout/navbar_item.xml b/WordPress/src/main/res/layout/navbar_item.xml index 0f2ea08363d4..a41da5929983 100644 --- a/WordPress/src/main/res/layout/navbar_item.xml +++ b/WordPress/src/main/res/layout/navbar_item.xml @@ -18,6 +18,8 @@ android:layout_width="@dimen/bottom_nav_bar_icon_size" android:layout_height="@dimen/bottom_nav_bar_icon_size" android:layout_gravity="center" + android:layout_marginEnd="4dp" + android:layout_marginStart="4dp" android:importantForAccessibility="no" app:tint="@drawable/nav_bar_button_selector" tools:src="@drawable/ic_create_white_24dp" /> diff --git a/WordPress/src/main/res/menu/debug_settings_menu.xml b/WordPress/src/main/res/menu/debug_settings_menu.xml index dafffbf6bd99..648e234a0a23 100644 --- a/WordPress/src/main/res/menu/debug_settings_menu.xml +++ b/WordPress/src/main/res/menu/debug_settings_menu.xml @@ -13,4 +13,8 @@ android:id="@+id/menu_show_weekly_notifications" android:title="@string/debug_settings_force_show_weekly_roundup" app:showAsAction="never" /> + diff --git a/WordPress/src/main/res/values-ar/strings.xml b/WordPress/src/main/res/values-ar/strings.xml index f17ca95273a3..446cafe7aada 100644 --- a/WordPress/src/main/res/values-ar/strings.xml +++ b/WordPress/src/main/res/values-ar/strings.xml @@ -1,18 +1,18 @@ + أصبحت Bloganuary هنا! هيا بنا! تشغيل موجّهات التدوين ستستخدم Bloganuary موجّهات التدوين اليومية لإرسال الموضوعات الخاصة بشهر يناير إليك. اقرأ ردود المدونين الأخرى للحصول على الإلهام وإقامة اتصالات جديدة. انشر ردك. استقبل موجّهًا جديدًا لإلهامك في كل يوم. - Bloganuary قادمة! في شهر يناير، ستأتي موجّهات التدوين من Bloganuary - تحدٍّ مجتمعي لدينا لإنشاء عادة التدوين الخاصة بالعام الجديد. لا، توقف عن الاستخدام نعم، واصل الاستخدام diff --git a/WordPress/src/main/res/values-de/strings.xml b/WordPress/src/main/res/values-de/strings.xml index d423e187ec5d..93ec5e0c9986 100644 --- a/WordPress/src/main/res/values-de/strings.xml +++ b/WordPress/src/main/res/values-de/strings.xml @@ -1,11 +1,12 @@ + Der Bloganuary ist da! Los geht\'s Blog-Schreibanregungen aktivieren Im Rahmen des Bloganuary werden dir über die täglichen Blog-Schreibanregungen Themen für den Januar geschickt. @@ -16,7 +17,7 @@ Language: de Unsere Schreib-Challenge dauert einen Monat – sei dabei Bloganuary Im Januar erhältst du Blog-Schreibanregungen vom Bloganuary, unserer Community-Challenge. Diese soll dir helfen, Bloggen im neuen Jahr zur Gewohnheit zu machen. - Bloganuary steht vor der Tür! + Der Bloganuary kommt! Nein, deaktivieren Ja, aktiviert lassen Aus diesem Grund empfehlen wir, den Block in deinem Webbrowser zu bearbeiten. diff --git a/WordPress/src/main/res/values-en-rGB/strings.xml b/WordPress/src/main/res/values-en-rGB/strings.xml index f173d8480d2f..ddf122339c11 100644 --- a/WordPress/src/main/res/values-en-rGB/strings.xml +++ b/WordPress/src/main/res/values-en-rGB/strings.xml @@ -1,11 +1,12 @@ + Bloganuary is here! Let’s go! Turn on blogging prompts Bloganuary will use Daily Blogging Prompts to send you topics for the month of January. @@ -16,7 +17,7 @@ Language: en_GB Join our month-long writing challenge Bloganuary For the month of January, blogging prompts will come from Bloganuary – our community challenge to build a blogging habit for the new year. - Bloganuary is coming! + Bloganuary is coming! No, turn off Yes, leave on For this reason, we recommend editing the block using your web browser. diff --git a/WordPress/src/main/res/values-es/strings.xml b/WordPress/src/main/res/values-es/strings.xml index 936888a8b1fe..e80a2a7efa03 100644 --- a/WordPress/src/main/res/values-es/strings.xml +++ b/WordPress/src/main/res/values-es/strings.xml @@ -1,11 +1,12 @@ + ¡Bloganuary ya está aquí! ¡Vamos allá! Activa las sugerencias de publicación Bloganuary utilizará las sugerencias de publicación diarias para enviarte temas durante el mes de enero. @@ -16,7 +17,7 @@ Language: es Únete a nuestro reto de escritura de un mes Bloganuary Durante el mes de enero, las sugerencias para escribir en el blog provendrán de Bloganuary, nuestro reto comunitario para crear un hábito de blogueo para el nuevo año. - ¡Bloganuary está a la vuelta de la esquina! + ¡Bloganuary está a la vuelta de la esquina! No, apágala Sí, déjala encendida Por esta razón, te recomendamos que edites el bloque utilizando tu navegador web. diff --git a/WordPress/src/main/res/values-fr-rCA/strings.xml b/WordPress/src/main/res/values-fr-rCA/strings.xml index 46cf5ecc4094..5ef8e5e692c7 100644 --- a/WordPress/src/main/res/values-fr-rCA/strings.xml +++ b/WordPress/src/main/res/values-fr-rCA/strings.xml @@ -1,11 +1,12 @@ + Bloganuary, c’est parti ! C’est parti ! Activer les invites à bloguer Bloganuary utilisera des invites quotidiennes à bloguer pour vous envoyer des thèmes de publications tout au long du mois de janvier. @@ -15,7 +16,6 @@ Language: fr Recevez chaque jour une invite pour vous inspirer. Participer à notre défi d’écriture d’un mois De Bloganuary - C’est bientôt Bloganuary ! Non, désactiver Oui, laisser activé Pour cette raison, nous vous recommandons de modifier le bloc à l’aide de votre navigateur web. diff --git a/WordPress/src/main/res/values-fr/strings.xml b/WordPress/src/main/res/values-fr/strings.xml index 46cf5ecc4094..5ef8e5e692c7 100644 --- a/WordPress/src/main/res/values-fr/strings.xml +++ b/WordPress/src/main/res/values-fr/strings.xml @@ -1,11 +1,12 @@ + Bloganuary, c’est parti ! C’est parti ! Activer les invites à bloguer Bloganuary utilisera des invites quotidiennes à bloguer pour vous envoyer des thèmes de publications tout au long du mois de janvier. @@ -15,7 +16,6 @@ Language: fr Recevez chaque jour une invite pour vous inspirer. Participer à notre défi d’écriture d’un mois De Bloganuary - C’est bientôt Bloganuary ! Non, désactiver Oui, laisser activé Pour cette raison, nous vous recommandons de modifier le bloc à l’aide de votre navigateur web. diff --git a/WordPress/src/main/res/values-gl/strings.xml b/WordPress/src/main/res/values-gl/strings.xml index 28c94934c554..75c25576dbe9 100644 --- a/WordPress/src/main/res/values-gl/strings.xml +++ b/WordPress/src/main/res/values-gl/strings.xml @@ -1,11 +1,12 @@ + Bloganuary xa está aquí! Imos aló! Activa as suxestións de publicación Bloganuary utilizará as suxerencias de publicación diarias para enviarche temas durante o mes de xaneiro. @@ -16,7 +17,7 @@ Language: gl_ES Únete ao noso reto de escritura dun mes Bloganuary Durante o mes de xaneiro, as suxerencias para escribir no blog provirán de Bloganuary, o noso reto comunitario para crear un hábito de blogueo para o novo ano. - Bloganuary está á volta da esquina! + Bloganuary está á volta da esquina! Non, apágaa Si, déixaa acendida Por esta razón, recomendámosche que edites o bloque utilizando o teu navegador web. diff --git a/WordPress/src/main/res/values-he/strings.xml b/WordPress/src/main/res/values-he/strings.xml index 2f93267ae55d..966f6271de63 100644 --- a/WordPress/src/main/res/values-he/strings.xml +++ b/WordPress/src/main/res/values-he/strings.xml @@ -1,11 +1,12 @@ + Bloganuary כבר כאן! קדימה! להפעיל הצעות כתיבה בבלוג במסגרת Bloganuary נזכיר לך בעזרת \'הצעות כתיבה יומיות בבלוג\' לשלוח לנו את הנושאים שלך לחודש ינואר. @@ -15,7 +16,6 @@ Language: he_IL כך תגיע אליך מדי יום הצעת כתיבה חדשה שתיתן לך השראה. אנו מזמינים אותך להצטרף לאתגר הכתיבה שלנו שיימשך חודש שלם לאורך כל חודש ינואר יתקבלו מ-Bloganuary הצעות כתיבה יומיות בבלוג. זהו האתגר הקהילתי שלנו לביסוס הרגלי פרסום בבלוג לשנה החדשה. - Bloganuary מתקרב! לא, נא לכבות כן, להמשיך מסיבה זו מומלץ \'לשטח\' את התוכן על ידי ביטול הקבצת הבלוק או לערוך את הבלוק בעזרת דפדפן האינטרנט. @@ -111,6 +111,7 @@ Language: he_IL טיוטות פוסטים צפיות, מבקרים ולייקים התוכן שיוצג בכרטיסים תלוי במה שיקרה באתר שלך + להתאים אישית את הלשונית \'בית\' יש להקיש כדי להתאים אישית את הלשונית \'בית\' באתר שלך להתאים אישית את הלשונית \'בית\' באתר שלך לשנות ההגדרות diff --git a/WordPress/src/main/res/values-id/strings.xml b/WordPress/src/main/res/values-id/strings.xml index c7d16be87158..9acceab34439 100644 --- a/WordPress/src/main/res/values-id/strings.xml +++ b/WordPress/src/main/res/values-id/strings.xml @@ -1,11 +1,12 @@ + Bloganuary telah hadir! Ayo mulai! Nyalakan prompt blogging Bloganuary akan menggunakan Prompt Blogging Harian untuk mengirimkan topik bulan Januari kepada Anda. @@ -14,7 +15,6 @@ Language: id Poskan tanggapan Anda. Dapatkan prompt baru untuk menginspirasi Anda setiap hari. Ikuti tantangan menulis sebulan penuh dari kami - Bloganuary segera hadir! Tidak, matikan Ya, biarkan Karenanya, kami menyarankan Anda untuk mengedit blok melalui browser web. diff --git a/WordPress/src/main/res/values-it/strings.xml b/WordPress/src/main/res/values-it/strings.xml index dbb885ab68da..b4bed7fd19a6 100644 --- a/WordPress/src/main/res/values-it/strings.xml +++ b/WordPress/src/main/res/values-it/strings.xml @@ -1,11 +1,12 @@ + È arrivato Bloganuary! Iniziamo! Attiva le richieste di blogging Bloganuary utilizzerà le richieste di blogging giornaliere per inviarti argomenti per il mese di gennaio. @@ -14,7 +15,7 @@ Language: it Pubblica la tua risposta. Ricevi un nuovo suggerimento per ottenere ispirazione ogni giorno. Prendi parte alla nostra sfida di scrittura: dura un mese. - Bloganuary è in arrivo. + Bloganuary sta arrivando! No, disattiva Si, continua Per questo motivo consigliamo di modificare il blocco tramite il browser web. diff --git a/WordPress/src/main/res/values-ja/strings.xml b/WordPress/src/main/res/values-ja/strings.xml index 3fb6bff87df5..a79e2a5c1252 100644 --- a/WordPress/src/main/res/values-ja/strings.xml +++ b/WordPress/src/main/res/values-ja/strings.xml @@ -1,11 +1,12 @@ + Bloganuary が登場 ! スタート ブログ作成のプロンプトをオンにする Bloganuary は毎日のブログ作成のプロンプトから1月のトピックを送信します。 @@ -14,7 +15,7 @@ Language: ja_JP 回答を公開します。 毎日インスピレーションを与える新しいプロンプトを受け取ることができます。 1か月間のライティングチャレンジにご参加ください - まもなく Bloganuary です ! + まもなく Bloganuary が登場します ! オフにする そのままにする このため、Web ブラウザーでブロックを編集することをお勧めします。 diff --git a/WordPress/src/main/res/values-ko/strings.xml b/WordPress/src/main/res/values-ko/strings.xml index 1a04f248a98e..cbeb9fabefe7 100644 --- a/WordPress/src/main/res/values-ko/strings.xml +++ b/WordPress/src/main/res/values-ko/strings.xml @@ -1,11 +1,12 @@ + Bloganuary가 여기에 있습니다! 지금 시작하세요! 블로깅 프롬프트 켜기 Bloganuary에서 일일 블로깅 프롬프트를 사용하여 1월 한 달 동안의 게시글을 보내드립니다. @@ -15,7 +16,6 @@ Language: ko_KR 영감을 주는 새로운 프롬프트를 매일 받아보세요. 한 달 동안 진행되는 글쓰기 챌린지 참여 새해에 블로깅 습관을 들이는 커뮤니티 챌린지인 Bloganuary에서 1월 한 달 동안 블로깅 프롬프트가 제공됩니다. - Bloganuary가 다가오고 있습니다! 아니요. 끄기 예. 그대로 두기 따라서 웹 브라우저를 사용하여 블록을 편집하는 것이 좋습니다. diff --git a/WordPress/src/main/res/values-nl/strings.xml b/WordPress/src/main/res/values-nl/strings.xml index ec6b3c163a1e..afce56d340f2 100644 --- a/WordPress/src/main/res/values-nl/strings.xml +++ b/WordPress/src/main/res/values-nl/strings.xml @@ -1,11 +1,12 @@ + Bloganuary is aangebroken! Aan de slag. Blogmeldingen inschakelen Bloganuary gebruikt Dagelijkse blogmeldingen om je in de maand januari onderwerpen toe te sturen. diff --git a/WordPress/src/main/res/values-pt-rBR/strings.xml b/WordPress/src/main/res/values-pt-rBR/strings.xml index dfad10dcf393..c4ae1c2a2c9a 100644 --- a/WordPress/src/main/res/values-pt-rBR/strings.xml +++ b/WordPress/src/main/res/values-pt-rBR/strings.xml @@ -1,11 +1,12 @@ + O Bloganuary está aqui! Vamos lá! Ativar sugestões de publicação O Bloganuary usará sugestões de publicação diárias para enviar tópicos do mês de janeiro para você. @@ -15,7 +16,6 @@ Language: pt_BR Receba uma nova sugestão por dia para se inspirar. Participe do nosso desafio de escrita do mês Bloganuary - O Bloganuary está chegando! Não, desativar Sim, manter ativa Por isso, recomendamos editar o bloco usando seu navegador. diff --git a/WordPress/src/main/res/values-ro/strings.xml b/WordPress/src/main/res/values-ro/strings.xml index 42765cdbe4b1..f522bf9b3a0b 100644 --- a/WordPress/src/main/res/values-ro/strings.xml +++ b/WordPress/src/main/res/values-ro/strings.xml @@ -1,11 +1,12 @@ + Bloganuary este aici! Să începem! Activează îndemnurile de a scrie Bloganuary va folosi îndemnuri zilnice de a scrie ca să-ți trimită subiecte în luna ianuarie. @@ -16,7 +17,7 @@ Language: ro Alătură-te provocării noastre de a scrie timp de o lună Bloganuary În luna ianuarie, îndemnurile de a scrie vor veni de la Bloganuary - provocarea comunității noastre de a crea un obicei de a scrie pe bloguri în noul an. - Bloganuary vine în curând! + Bloganuary vine în curând! Nu, oprește Da, lasă în continuare Din acest motiv, recomandăm să editezi blocul folosind navigatorul web. diff --git a/WordPress/src/main/res/values-ru/strings.xml b/WordPress/src/main/res/values-ru/strings.xml index f6c588533e40..c1984a4e4d1f 100644 --- a/WordPress/src/main/res/values-ru/strings.xml +++ b/WordPress/src/main/res/values-ru/strings.xml @@ -1,11 +1,12 @@ + Bloganuary уже идёт! Поехали! Включить подсказки по ведению блога С помощью опции ежедневных подсказок по ведению блога Bloganuary будет рассылать темы январских публикаций. @@ -16,7 +17,7 @@ Language: ru Присоединяйтесь к нашему писательскому челленджу, который продлится месяц Bloganuary В январе подсказки по ведению блога будут рассылаться через Bloganuary — челлендж сообщества, призванный выработать привычку ежедневно вести блог в новом году. - Bloganuary уже на пороге! + Bloganuary уже на пороге! Нет, отключить Да, оставить По этой причине мы рекомендуем редактировать блок с помощью веб-браузера. diff --git a/WordPress/src/main/res/values-sk/strings.xml b/WordPress/src/main/res/values-sk/strings.xml index 418b680c77b2..46ac29c7e93f 100644 --- a/WordPress/src/main/res/values-sk/strings.xml +++ b/WordPress/src/main/res/values-sk/strings.xml @@ -1,6 +1,6 @@ + Bloganuary erdhi! Shkojmë! Aktivizoni cytje blogimi + Bloganuary do të përdorë Cytje të Përditshme Blogimi për t’ju dërguar tema për muajin janar. Bloganuary do të përdorë Cytje të Përditshme Blogimi për t’ju dërguar subjekte për muajin janar. Cytjet Për Blogim i keni aktualisht të çaktivizuara. Lexoni përgjigje të bloguesve të tjerë, për t’u frymëzuar dhe bërë lidhje të reja. Botoni përgjigjen tuaj. Merrni një cytje të re, për t’ju frymëzuar çdo ditë. Merrni pjesë te sfida jonë, e gjatë një muaj, për shkrim - Bloganuary po vjen! + Bloganuary + Për muajin janar, cytjet për blogim do të vijnë nga Bloganuary — sfida e bashkësisë tonë për të krijuar një zakon blogimi për vitin e ri. + Bloganuary po vjen! Jo, çaktivizoje Po, lëre të aktivizuar Për këtë arsye, rekomandojmë përpunimin e bllokut duke përdorur shfletuesin tuaj. diff --git a/WordPress/src/main/res/values-sv/strings.xml b/WordPress/src/main/res/values-sv/strings.xml index a4de90bb3791..a7843040388c 100644 --- a/WordPress/src/main/res/values-sv/strings.xml +++ b/WordPress/src/main/res/values-sv/strings.xml @@ -1,11 +1,12 @@ + Bloganuary är här! Nu kör vi! Aktivera bloggningsförslag Bloganuary använder dagliga bloggningsförslag för att skicka dig ämnena för januari månad. @@ -16,7 +17,7 @@ Language: sv_SE Gå med i vår månadslånga skrivutmaning Bloganuary För januari månad kommer bloggningsförslagen från Bloganuary – vår community-utmaning att bygga en bloggvana för det nya året. - Bloganuary är på väg! + Bloganuary är på väg! Nej, stäng av Ja, lämna på Av den här anledningen rekommenderar vi att du redigerar blocket i din webbläsare. diff --git a/WordPress/src/main/res/values-tr/strings.xml b/WordPress/src/main/res/values-tr/strings.xml index cfbb6bb30375..71c9ea083261 100644 --- a/WordPress/src/main/res/values-tr/strings.xml +++ b/WordPress/src/main/res/values-tr/strings.xml @@ -1,11 +1,12 @@ + Bloganuary burada! Başlayalım! Blog istemlerini aç Bloganuary Ocak ayı boyunca size konular göndermek için Günlük Blog İstemlerini kullanacak. @@ -16,7 +17,6 @@ Language: tr Bir ay sürecek yazma etkinliğimize katılın Blog yılı Yeni yılda blog yazma alışkanlığı oluşturmayı hedefleyen topluluk etkinliğimiz Bloganuary\'den Ocak ayı boyunca blog istemleri alacaksınız. - Bloganuary yaklaşıyor! Hayır, kapat Evet, açık kalsın Bu nedenle, bloku web tarayıcınızı kullanarak düzenlemenizi öneririz. diff --git a/WordPress/src/main/res/values-zh-rCN/strings.xml b/WordPress/src/main/res/values-zh-rCN/strings.xml index 2f9f52f35187..cceb620282d8 100644 --- a/WordPress/src/main/res/values-zh-rCN/strings.xml +++ b/WordPress/src/main/res/values-zh-rCN/strings.xml @@ -1,11 +1,12 @@ + Bloganuary 上线了! 开始吧! 打开博客提示 Bloganuary 将通过“每日博客提示”向您发送一月份的主题。 @@ -14,7 +15,6 @@ Language: zh_CN 发表您的回复。 每天接收新的提示,以获取灵感。 加入我们为期一个月的写作挑战 - Bloganuary 即将上线! 不,停止优化 是,继续优化 因此,我们建议使用 Web 浏览器编辑该区块。 diff --git a/WordPress/src/main/res/values-zh-rHK/strings.xml b/WordPress/src/main/res/values-zh-rHK/strings.xml index ed47535f2502..44eb919427d0 100644 --- a/WordPress/src/main/res/values-zh-rHK/strings.xml +++ b/WordPress/src/main/res/values-zh-rHK/strings.xml @@ -1,11 +1,12 @@ + Bloganuary 正式開跑! 開始行動! 開啟網誌提示 Bloganuary 會透過「每日網誌提示」傳送 1 月的主題。 @@ -15,7 +16,6 @@ Language: zh_TW 每天接收新提示,激發靈感。 參加為期一個月的寫作挑戰 Bloganuary 會在 1 月送上網誌提示:這個社群挑戰的目的,是為了協助你在新的一年養成寫網誌的習慣。 - Bloganuary 挑戰即將來臨! 否,關閉 是,保持開啟 因此,我們建議使用網頁瀏覽器來編輯區塊。 diff --git a/WordPress/src/main/res/values-zh-rTW/strings.xml b/WordPress/src/main/res/values-zh-rTW/strings.xml index ed47535f2502..44eb919427d0 100644 --- a/WordPress/src/main/res/values-zh-rTW/strings.xml +++ b/WordPress/src/main/res/values-zh-rTW/strings.xml @@ -1,11 +1,12 @@ + Bloganuary 正式開跑! 開始行動! 開啟網誌提示 Bloganuary 會透過「每日網誌提示」傳送 1 月的主題。 @@ -15,7 +16,6 @@ Language: zh_TW 每天接收新提示,激發靈感。 參加為期一個月的寫作挑戰 Bloganuary 會在 1 月送上網誌提示:這個社群挑戰的目的,是為了協助你在新的一年養成寫網誌的習慣。 - Bloganuary 挑戰即將來臨! 否,關閉 是,保持開啟 因此,我們建議使用網頁瀏覽器來編輯區塊。 diff --git a/WordPress/src/main/res/values/dimens.xml b/WordPress/src/main/res/values/dimens.xml index d8eddfb45f11..1c8b3a76f5cc 100644 --- a/WordPress/src/main/res/values/dimens.xml +++ b/WordPress/src/main/res/values/dimens.xml @@ -64,7 +64,7 @@ 0dp - 24dp + 32dp 12dp @@ -767,4 +767,5 @@ 7dp 4dp 24dp + 4dp diff --git a/WordPress/src/main/res/values/strings.xml b/WordPress/src/main/res/values/strings.xml index 762b7492ce81..3e591eeda435 100644 --- a/WordPress/src/main/res/values/strings.xml +++ b/WordPress/src/main/res/values/strings.xml @@ -945,6 +945,7 @@ Don\'t see a feature you\'re working on? Check that your feature config file is annotated with the FeatureInDevelopment annotation. Tools Force show Weekly Roundup notification + All shared preference flags Debug cookies @@ -4835,5 +4836,10 @@ translators: %s: Select control option value e.g: "Auto, 25%". --> State of the Word 2023 Check out WordPress co-founder Matt Mullenweg’s annual keynote to stay on top of what’s coming in 2024 and beyond. Watch now + File type not supported as a media file. + Font Size, %1$s + Network connection lost, working offline + Network connection re-established + Working Offline diff --git a/WordPress/src/test/java/org/wordpress/android/ui/debug/preferences/DebugSharedPreferenceFlagsViewModelTest.kt b/WordPress/src/test/java/org/wordpress/android/ui/debug/preferences/DebugSharedPreferenceFlagsViewModelTest.kt new file mode 100644 index 000000000000..7e0d136c874b --- /dev/null +++ b/WordPress/src/test/java/org/wordpress/android/ui/debug/preferences/DebugSharedPreferenceFlagsViewModelTest.kt @@ -0,0 +1,42 @@ +package org.wordpress.android.ui.debug.preferences + +import junit.framework.TestCase.assertTrue +import org.junit.Test +import org.junit.runner.RunWith +import org.mockito.ArgumentMatchers.eq +import org.mockito.Mock +import org.mockito.junit.MockitoJUnitRunner +import org.mockito.kotlin.argThat +import org.mockito.kotlin.verify +import org.mockito.kotlin.whenever +import org.wordpress.android.ui.prefs.AppPrefsWrapper + +@RunWith(MockitoJUnitRunner::class) +class DebugSharedPreferenceFlagsViewModelTest { + @Mock + private lateinit var prefsWrapper: AppPrefsWrapper + private lateinit var viewModel: DebugSharedPreferenceFlagsViewModel + + @Test + fun `WHEN init THEN should load the flags from the prefs`() { + whenever(prefsWrapper.getAllPrefs()).thenReturn(mapOf("key" to true)) + + initViewModel() + + assertTrue(viewModel.uiStateFlow.value["key"]!!) + } + + @Test + fun `WHEN setFlag THEN should update the prefs and the ui state`() { + initViewModel() + + viewModel.setFlag("key", true) + + verify(prefsWrapper).putBoolean(argThat { key -> key.name() == "key" }, eq(true)) + assertTrue(viewModel.uiStateFlow.value["key"]!!) + } + + private fun initViewModel() { + viewModel = DebugSharedPreferenceFlagsViewModel(prefsWrapper) + } +} diff --git a/WordPress/src/test/java/org/wordpress/android/ui/deeplinks/DeepLinkTrackingUtilsTest.kt b/WordPress/src/test/java/org/wordpress/android/ui/deeplinks/DeepLinkTrackingUtilsTest.kt index e9cd9616ba4b..592b75796a63 100644 --- a/WordPress/src/test/java/org/wordpress/android/ui/deeplinks/DeepLinkTrackingUtilsTest.kt +++ b/WordPress/src/test/java/org/wordpress/android/ui/deeplinks/DeepLinkTrackingUtilsTest.kt @@ -106,7 +106,7 @@ class DeepLinkTrackingUtilsTest { deepLinkTrackingUtils.track(action, OpenMediaPickerForSite(mock()), mediaUri) - assertTrackingData("apps.wordpress.com", DeepLinkSource.QRCODE_MEDIA, expectedUrl) + assertTrackingData("apps.wordpress.com", DeepLinkSource.BANNER, expectedUrl, "qr-code-media") } @Test @@ -124,7 +124,7 @@ class DeepLinkTrackingUtilsTest { authUri ) - assertTrackingData("apps.wordpress.com", DeepLinkSource.QRCODE_AUTH, expectedUrl) + assertTrackingData("apps.wordpress.com", DeepLinkSource.BANNER, expectedUrl, "login-qr-code") } private fun assertTrackingData( diff --git a/WordPress/src/test/java/org/wordpress/android/ui/deeplinks/handlers/QRCodeMediaLinkHandlerTest.kt b/WordPress/src/test/java/org/wordpress/android/ui/deeplinks/handlers/QRCodeMediaLinkHandlerTest.kt index a95ead5ddd20..009f82b60a07 100644 --- a/WordPress/src/test/java/org/wordpress/android/ui/deeplinks/handlers/QRCodeMediaLinkHandlerTest.kt +++ b/WordPress/src/test/java/org/wordpress/android/ui/deeplinks/handlers/QRCodeMediaLinkHandlerTest.kt @@ -6,32 +6,38 @@ import org.junit.Test import org.junit.runner.RunWith import org.mockito.Mock import org.mockito.junit.MockitoJUnitRunner +import org.mockito.kotlin.verify import org.mockito.kotlin.whenever +import org.wordpress.android.analytics.AnalyticsTracker import org.wordpress.android.fluxc.model.SiteModel import org.wordpress.android.ui.deeplinks.DeepLinkNavigator.NavigateAction import org.wordpress.android.ui.deeplinks.DeepLinkUriUtils import org.wordpress.android.ui.deeplinks.buildUri +import org.wordpress.android.util.analytics.AnalyticsTrackerWrapper @RunWith(MockitoJUnitRunner::class) class QRCodeMediaLinkHandlerTest { @Mock lateinit var deepLinkUriUtils: DeepLinkUriUtils + @Mock + lateinit var analyticsTrackerWrapper: AnalyticsTrackerWrapper + @Mock lateinit var site: SiteModel private lateinit var qrCodeMediaLinkHandler: QRCodeMediaLinkHandler @Before fun setUp() { - qrCodeMediaLinkHandler = QRCodeMediaLinkHandler(deepLinkUriUtils) + qrCodeMediaLinkHandler = QRCodeMediaLinkHandler(deepLinkUriUtils, analyticsTrackerWrapper) } - // https://apps.wordpress.com/get/?campaign=qr-code-media&data=post_id:6,site_id:227148183 + // https://apps.wordpress.com/get/?campaign=qr-code-media#/media/225903215 @Test fun `given proper media url, when deep linked, then handles URI`() { val mediaUri = buildUri( host = "apps.wordpress.com", - queryParams = mapOf("campaign" to "qr-code-media", "data" to "post_id:6,site_id:227148183"), + queryParams = mapOf("campaign" to "qr-code-media"), path = arrayOf("get") ) @@ -52,7 +58,7 @@ class QRCodeMediaLinkHandlerTest { @Test fun `given improper media query params, when deep linked, then handles URI`() { val mediaUri = buildUri(host = "apps.wordpress.com", - queryParams = mapOf("campaign" to "qr-code-no-good", "data" to "post_id:6,site_id:227148183"), + queryParams = mapOf("campaign" to "qr-code-no-good"), path = arrayOf("get"), ) val isMediaQrCodeUri = qrCodeMediaLinkHandler.shouldHandleUrl(mediaUri) @@ -72,10 +78,10 @@ class QRCodeMediaLinkHandlerTest { @Test fun `given unrecognized siteId, when deep linked, then opens my site view`() { val mediaUri = buildUri(host = "apps.wordpress.com", - queryParams = mapOf("campaign" to "qr-code-media", "data" to "post_id:6,site_id:227148183"), + queryParams = mapOf("campaign" to "qr-code-media"), path = arrayOf("get"), ) - whenever(mediaUri.getQueryParameter("data")).thenReturn(null) + whenever(mediaUri.fragment).thenReturn(null) val navigateAction = qrCodeMediaLinkHandler.buildNavigateAction(mediaUri) @@ -85,16 +91,29 @@ class QRCodeMediaLinkHandlerTest { @Test fun `given recognized siteId, when deep linked, then opens media launcher view`() { val siteId = "227148183" - val data = "post_id:6,site_id:227148183" - val mediaUri = buildUri(host = "apps.wordpress.com", - queryParams = mapOf("campaign" to "qr-code-media", "data" to "post_id:6,site_id:227148183"), - path = arrayOf("get"), ) + val mediaUri = buildUri() + whenever(mediaUri.fragment).thenReturn("/media/$siteId") - whenever(mediaUri.getQueryParameter("data")).thenReturn(data) whenever(deepLinkUriUtils.blogIdToSite(siteId)).thenReturn(site) val navigateAction = qrCodeMediaLinkHandler.buildNavigateAction(mediaUri) assertThat(navigateAction).isEqualTo(NavigateAction.OpenMediaPickerForSite(site)) } + + @Test + fun `given unrecognized siteId, when deep linked, then event is tracked`() { + val mediaUri = buildUri(host = "apps.wordpress.com", + queryParams = mapOf("campaign" to "qr-code-media"), + path = arrayOf("get"), ) + + whenever(mediaUri.fragment).thenReturn(null) + + qrCodeMediaLinkHandler.buildNavigateAction(mediaUri) + + verify(analyticsTrackerWrapper).track( + AnalyticsTracker.Stat.DEEP_LINK_FAILED, + mapOf("error" to "invalid_site_id", + "campaign" to "qr_code_media")) + } } diff --git a/WordPress/src/test/java/org/wordpress/android/ui/mysite/cards/dashboard/CardsSourceTest.kt b/WordPress/src/test/java/org/wordpress/android/ui/mysite/cards/dashboard/CardsSourceTest.kt index 7ba4cfe6f193..910c62c16069 100644 --- a/WordPress/src/test/java/org/wordpress/android/ui/mysite/cards/dashboard/CardsSourceTest.kt +++ b/WordPress/src/test/java/org/wordpress/android/ui/mysite/cards/dashboard/CardsSourceTest.kt @@ -1,5 +1,6 @@ package org.wordpress.android.ui.mysite.cards.dashboard +import android.content.SharedPreferences import kotlinx.coroutines.ExperimentalCoroutinesApi import kotlinx.coroutines.flow.flowOf import kotlinx.coroutines.flow.single @@ -8,6 +9,7 @@ import org.junit.Before import org.junit.Test import org.mockito.Mock import org.mockito.kotlin.any +import org.mockito.kotlin.anyOrNull import org.mockito.kotlin.verify import org.mockito.kotlin.whenever import org.wordpress.android.BaseUnitTest @@ -23,16 +25,19 @@ import org.wordpress.android.fluxc.model.dashboard.CardModel.DynamicCardsModel import org.wordpress.android.fluxc.model.dashboard.CardModel.DynamicCardsModel.CardOrder import org.wordpress.android.fluxc.model.dashboard.CardModel.DynamicCardsModel.DynamicCardModel import org.wordpress.android.fluxc.model.dashboard.CardModel.DynamicCardsModel.DynamicCardRowModel +import org.wordpress.android.fluxc.network.rest.wpcom.dashboard.CardsRestClient.FetchCardsPayload import org.wordpress.android.fluxc.network.rest.wpcom.dashboard.CardsUtils import org.wordpress.android.fluxc.store.dashboard.CardsStore import org.wordpress.android.fluxc.store.dashboard.CardsStore.CardsError import org.wordpress.android.fluxc.store.dashboard.CardsStore.CardsErrorType import org.wordpress.android.fluxc.store.dashboard.CardsStore.CardsResult import org.wordpress.android.fluxc.tools.FormattableContent +import org.wordpress.android.fluxc.utils.PreferenceUtils.PreferenceUtilsWrapper import org.wordpress.android.ui.mysite.MySiteUiState.PartialState.CardsUpdate import org.wordpress.android.ui.mysite.SelectedSiteRepository import org.wordpress.android.ui.mysite.cards.dashboard.activity.DashboardActivityLogCardFeatureUtils import org.wordpress.android.ui.prefs.AppPrefsWrapper +import org.wordpress.android.util.BuildConfigWrapper import org.wordpress.android.util.config.DynamicDashboardCardsFeatureConfig /* SITE */ @@ -65,7 +70,6 @@ const val PAGE_DATE = "2023-03-02 10:30:53" /* DYNAMIC CARDS */ const val DYNAMIC_CARD_ID = "year_in_review_2023" const val DYNAMIC_CARD_TITLE = "News" -const val DYNAMIC_CARD_REMOTE_FEATURE_FLAG = "dynamic_dashboard_cards" const val DYNAMIC_CARD_FEATURED_IMAGE = "https://path/to/image" const val DYNAMIC_CARD_URL = "https://wordpress.com" const val DYNAMIC_CARD_ACTION = "Call to action" @@ -91,6 +95,12 @@ const val ACTIVITY_ACTOR_ICON_URL = "dog.jpg" const val ACTIVITY_PUBLISHED_DATE = "2021-12-27 11:33:55" const val ACTIVITY_CONTENT = "content" +private const val BUILD_NUMBER_PARAM = "12345" +private const val DEVICE_ID_PARAM = "device_id_param" +private const val IDENTIFIER_PARAM = "identifier_param" +private const val MARKETING_VERSION_PARAM = "marketing_version_param" +private const val PLATFORM_PARAM = "android" + /* MODEL */ private val TODAYS_STATS_CARDS_MODEL = TodaysStatsCardModel( @@ -136,7 +146,6 @@ private val DYNAMIC_CARD_ROW_MODEL = DynamicCardRowModel( private val DYNAMIC_CARD_MODEL = DynamicCardModel( id = DYNAMIC_CARD_ID, title = DYNAMIC_CARD_TITLE, - remoteFeatureFlag = DYNAMIC_CARD_REMOTE_FEATURE_FLAG, featuredImage = DYNAMIC_CARD_FEATURED_IMAGE, url = DYNAMIC_CARD_URL, action = DYNAMIC_CARD_ACTION, @@ -208,6 +217,16 @@ class CardsSourceTest : BaseUnitTest() { @Mock private lateinit var dynamicDashboardCardsFeatureConfig: DynamicDashboardCardsFeatureConfig + @Mock + lateinit var buildConfigWrapper: BuildConfigWrapper + + @Mock + lateinit var preferenceUtilsWrapper: PreferenceUtilsWrapper + + @Mock + lateinit var sharedPreferences: SharedPreferences + + private lateinit var defaultFetchCardsPayload: FetchCardsPayload private lateinit var cardSource: CardsSource private val data = CardsResult( @@ -226,7 +245,18 @@ class CardsSourceTest : BaseUnitTest() { dashboardActivityLogCardFeatureUtils, testDispatcher(), appPrefsWrapper, - dynamicDashboardCardsFeatureConfig + dynamicDashboardCardsFeatureConfig, + preferenceUtilsWrapper, + buildConfigWrapper, + ) + defaultFetchCardsPayload = FetchCardsPayload( + siteModel, + DEFAULT_CARD_TYPE, + BUILD_NUMBER_PARAM, + DEVICE_ID_PARAM, + IDENTIFIER_PARAM, + MARKETING_VERSION_PARAM, + PLATFORM_PARAM ) } @@ -248,6 +278,11 @@ class CardsSourceTest : BaseUnitTest() { .thenReturn(isTodaysStatsCardHidden) whenever(dynamicDashboardCardsFeatureConfig.isEnabled()) .thenReturn(isDynamicCardsEnabled) + whenever(buildConfigWrapper.getAppVersionCode()).thenReturn(BUILD_NUMBER_PARAM.toInt()) + whenever(buildConfigWrapper.getApplicationId()).thenReturn(IDENTIFIER_PARAM) + whenever(buildConfigWrapper.getAppVersionName()).thenReturn(MARKETING_VERSION_PARAM) + whenever(preferenceUtilsWrapper.getFluxCPreferences()).thenReturn(sharedPreferences) + whenever(sharedPreferences.getString(any(), anyOrNull())).thenReturn(DEVICE_ID_PARAM) } /* GET DATA */ @@ -306,7 +341,7 @@ class CardsSourceTest : BaseUnitTest() { cardSource.build(testScope(), SITE_LOCAL_ID).observeForever { } advanceUntilIdle() - verify(cardsStore).fetchCards(siteModel, DEFAULT_CARD_TYPE) + verify(cardsStore).fetchCards(defaultFetchCardsPayload) } @Test @@ -334,7 +369,7 @@ class CardsSourceTest : BaseUnitTest() { setUpMocks() val result = mutableListOf() whenever(cardsStore.getCards(siteModel)).thenReturn(flowOf(data)) - whenever(cardsStore.fetchCards(siteModel, DEFAULT_CARD_TYPE)).thenReturn(success) + whenever(cardsStore.fetchCards(defaultFetchCardsPayload)).thenReturn(success) cardSource.refresh.observeForever { } cardSource.build(testScope(), SITE_LOCAL_ID).observeForever { @@ -342,7 +377,7 @@ class CardsSourceTest : BaseUnitTest() { } advanceUntilIdle() - verify(cardsStore).fetchCards(siteModel, DEFAULT_CARD_TYPE) + verify(cardsStore).fetchCards(defaultFetchCardsPayload) } @Test @@ -351,7 +386,7 @@ class CardsSourceTest : BaseUnitTest() { val result = mutableListOf() val testData = CardsResult(model = listOf(TODAYS_STATS_CARDS_MODEL, POSTS_MODEL)) whenever(cardsStore.getCards(siteModel)).thenReturn(flowOf(CardsResult(model = testData.model))) - whenever(cardsStore.fetchCards(siteModel, DEFAULT_CARD_TYPE)).thenReturn(apiError) + whenever(cardsStore.fetchCards(defaultFetchCardsPayload)).thenReturn(apiError) cardSource.refresh.observeForever { } cardSource.build(testScope(), SITE_LOCAL_ID).observeForever { @@ -382,7 +417,7 @@ class CardsSourceTest : BaseUnitTest() { val filteredData = CardsResult(model = data.model?.filterIsInstance()?.toList()) val result = mutableListOf() whenever(cardsStore.getCards(siteModel)).thenReturn(flowOf(CardsResult(model = filteredData.model))) - whenever(cardsStore.fetchCards(siteModel, DEFAULT_CARD_TYPE)).thenReturn(success).thenReturn(success) + whenever(cardsStore.fetchCards(defaultFetchCardsPayload)).thenReturn(success).thenReturn(success) cardSource.refresh.observeForever { } cardSource.build(testScope(), SITE_LOCAL_ID).observeForever { it?.let { result.add(it) } @@ -400,7 +435,7 @@ class CardsSourceTest : BaseUnitTest() { val testData = CardsResult(model = listOf(TODAYS_STATS_CARDS_MODEL, POSTS_MODEL)) val result = mutableListOf() whenever(cardsStore.getCards(siteModel)).thenReturn(flowOf(CardsResult(model = testData.model))) - whenever(cardsStore.fetchCards(siteModel, DEFAULT_CARD_TYPE)).thenReturn(success).thenReturn(apiError) + whenever(cardsStore.fetchCards(defaultFetchCardsPayload)).thenReturn(success).thenReturn(apiError) cardSource.refresh.observeForever { } cardSource.build(testScope(), SITE_LOCAL_ID).observeForever { it?.let { result.add(it) } @@ -441,8 +476,7 @@ class CardsSourceTest : BaseUnitTest() { val testData = CardsResult(model = listOf(TODAYS_STATS_CARDS_MODEL, POSTS_MODEL)) val result = mutableListOf() whenever(cardsStore.getCards(siteModel)).thenReturn(flowOf(CardsResult(model = testData.model))) - whenever(cardsStore.fetchCards(siteModel, DEFAULT_CARD_TYPE)) - .thenReturn(success) + whenever(cardsStore.fetchCards(defaultFetchCardsPayload)).thenReturn(success) cardSource.refresh.observeForever { result.add(it) } cardSource.build(testScope(), SITE_LOCAL_ID).observeForever { } @@ -463,7 +497,7 @@ class CardsSourceTest : BaseUnitTest() { val testData = CardsResult(model = listOf(TODAYS_STATS_CARDS_MODEL, POSTS_MODEL)) val result = mutableListOf() whenever(cardsStore.getCards(siteModel)).thenReturn(flowOf(CardsResult(model = testData.model))) - whenever(cardsStore.fetchCards(siteModel, DEFAULT_CARD_TYPE)).thenReturn(success) + whenever(cardsStore.fetchCards(defaultFetchCardsPayload)).thenReturn(success) cardSource.refresh.observeForever { result.add(it) } cardSource.build(testScope(), SITE_LOCAL_ID).observeForever { } @@ -484,7 +518,7 @@ class CardsSourceTest : BaseUnitTest() { val testData = CardsResult(model = listOf(TODAYS_STATS_CARDS_MODEL, POSTS_MODEL)) val result = mutableListOf() whenever(cardsStore.getCards(siteModel)).thenReturn(flowOf(CardsResult(model = testData.model))) - whenever(cardsStore.fetchCards(siteModel, DEFAULT_CARD_TYPE)).thenReturn(apiError) + whenever(cardsStore.fetchCards(defaultFetchCardsPayload)).thenReturn(apiError) cardSource.refresh.observeForever { result.add(it) } cardSource.build(testScope(), SITE_LOCAL_ID).observeForever { } @@ -535,9 +569,18 @@ class CardsSourceTest : BaseUnitTest() { fun `given pages feature enabled + card not hidden, when refresh is invoked, then pages requested from network`() = test { setUpMocks(isRequestPages = true) + val fetchCardsPayload = FetchCardsPayload( + siteModel, + PAGES_FEATURED_ENABLED_CARD_TYPE, + BUILD_NUMBER_PARAM, + DEVICE_ID_PARAM, + IDENTIFIER_PARAM, + MARKETING_VERSION_PARAM, + PLATFORM_PARAM + ) val result = mutableListOf() whenever(cardsStore.getCards(siteModel)).thenReturn(flowOf(data)) - whenever(cardsStore.fetchCards(siteModel, PAGES_FEATURED_ENABLED_CARD_TYPE)).thenReturn(success) + whenever(cardsStore.fetchCards(fetchCardsPayload)).thenReturn(success) cardSource.refresh.observeForever { } cardSource.build(testScope(), SITE_LOCAL_ID).observeForever { @@ -545,7 +588,7 @@ class CardsSourceTest : BaseUnitTest() { } advanceUntilIdle() - verify(cardsStore).fetchCards(siteModel, PAGES_FEATURED_ENABLED_CARD_TYPE) + verify(cardsStore).fetchCards(fetchCardsPayload) } @Test @@ -561,16 +604,25 @@ class CardsSourceTest : BaseUnitTest() { } advanceUntilIdle() - verify(cardsStore).fetchCards(siteModel, DEFAULT_CARD_TYPE) + verify(cardsStore).fetchCards(defaultFetchCardsPayload) } @Test fun `given activity feature enabled, when refresh is invoked, then activity are requested from network`() = test { setUpMocks(isDashboardCardActivityLogEnabled = true) + val fetchCardsPayload = FetchCardsPayload( + siteModel, + ACTIVITY_FEATURED_ENABLED_CARD_TYPE, + BUILD_NUMBER_PARAM, + DEVICE_ID_PARAM, + IDENTIFIER_PARAM, + MARKETING_VERSION_PARAM, + PLATFORM_PARAM + ) val result = mutableListOf() whenever(cardsStore.getCards(siteModel)).thenReturn(flowOf(data)) - whenever(cardsStore.fetchCards(siteModel, ACTIVITY_FEATURED_ENABLED_CARD_TYPE)).thenReturn(success) + whenever(cardsStore.fetchCards(fetchCardsPayload)).thenReturn(success) cardSource.refresh.observeForever { } cardSource.build(testScope(), SITE_LOCAL_ID).observeForever { @@ -578,16 +630,25 @@ class CardsSourceTest : BaseUnitTest() { } advanceUntilIdle() - verify(cardsStore).fetchCards(siteModel, ACTIVITY_FEATURED_ENABLED_CARD_TYPE) + verify(cardsStore).fetchCards(fetchCardsPayload) } @Test fun `given dynamic cards are enabled, when refresh is invoked, then dynamic cards are requested from network`() = test { setUpMocks(isDynamicCardsEnabled = true) + val fetchCardsPayload = FetchCardsPayload( + siteModel, + DYNAMIC_CARDS_ENABLED_CARD_TYPE, + BUILD_NUMBER_PARAM, + DEVICE_ID_PARAM, + IDENTIFIER_PARAM, + MARKETING_VERSION_PARAM, + PLATFORM_PARAM + ) val result = mutableListOf() whenever(cardsStore.getCards(siteModel)).thenReturn(flowOf(data)) - whenever(cardsStore.fetchCards(siteModel, DYNAMIC_CARDS_ENABLED_CARD_TYPE)).thenReturn(success) + whenever(cardsStore.fetchCards(fetchCardsPayload)).thenReturn(success) cardSource.refresh.observeForever { } cardSource.build(testScope(), SITE_LOCAL_ID).observeForever { @@ -595,7 +656,7 @@ class CardsSourceTest : BaseUnitTest() { } advanceUntilIdle() - verify(cardsStore).fetchCards(siteModel, DYNAMIC_CARDS_ENABLED_CARD_TYPE) + verify(cardsStore).fetchCards(fetchCardsPayload) } @Test @@ -604,7 +665,7 @@ class CardsSourceTest : BaseUnitTest() { setUpMocks(isDashboardCardActivityLogEnabled = false) val result = mutableListOf() whenever(cardsStore.getCards(siteModel)).thenReturn(flowOf(data)) - whenever(cardsStore.fetchCards(siteModel, DEFAULT_CARD_TYPE)).thenReturn(success).thenReturn(success) + whenever(cardsStore.fetchCards(defaultFetchCardsPayload)).thenReturn(success).thenReturn(success) cardSource.refresh.observeForever { } cardSource.build(testScope(), SITE_LOCAL_ID).observeForever { @@ -612,7 +673,7 @@ class CardsSourceTest : BaseUnitTest() { } advanceUntilIdle() - verify(cardsStore).fetchCards(siteModel, DEFAULT_CARD_TYPE) + verify(cardsStore).fetchCards(defaultFetchCardsPayload) } @Test @@ -621,7 +682,7 @@ class CardsSourceTest : BaseUnitTest() { setUpMocks(isTodaysStatsCardHidden = false) val result = mutableListOf() whenever(cardsStore.getCards(siteModel)).thenReturn(flowOf(data)) - whenever(cardsStore.fetchCards(siteModel, DEFAULT_CARD_TYPE)).thenReturn(success) + whenever(cardsStore.fetchCards(defaultFetchCardsPayload)).thenReturn(success) cardSource.refresh.observeForever { } cardSource.build(testScope(), SITE_LOCAL_ID).observeForever { @@ -629,7 +690,7 @@ class CardsSourceTest : BaseUnitTest() { } advanceUntilIdle() - verify(cardsStore).fetchCards(siteModel, DEFAULT_CARD_TYPE) + verify(cardsStore).fetchCards(defaultFetchCardsPayload) } @Test @@ -645,6 +706,16 @@ class CardsSourceTest : BaseUnitTest() { } advanceUntilIdle() - verify(cardsStore).fetchCards(siteModel, listOf(CardModel.Type.POSTS)) + verify(cardsStore).fetchCards( + FetchCardsPayload( + siteModel, + listOf(CardModel.Type.POSTS), + BUILD_NUMBER_PARAM, + DEVICE_ID_PARAM, + IDENTIFIER_PARAM, + MARKETING_VERSION_PARAM, + PLATFORM_PARAM + ) + ) } } diff --git a/WordPress/src/test/java/org/wordpress/android/ui/mysite/cards/dynamiccard/DynamicCardsBuilderTest.kt b/WordPress/src/test/java/org/wordpress/android/ui/mysite/cards/dynamiccard/DynamicCardsBuilderTest.kt index 23f7dc822998..04e46e9bb138 100644 --- a/WordPress/src/test/java/org/wordpress/android/ui/mysite/cards/dynamiccard/DynamicCardsBuilderTest.kt +++ b/WordPress/src/test/java/org/wordpress/android/ui/mysite/cards/dynamiccard/DynamicCardsBuilderTest.kt @@ -14,7 +14,6 @@ import org.wordpress.android.ui.mysite.MySiteCardAndItem import org.wordpress.android.ui.mysite.MySiteCardAndItemBuilderParams import org.wordpress.android.util.UrlUtilsWrapper import org.wordpress.android.util.config.DynamicDashboardCardsFeatureConfig -import org.wordpress.android.util.config.FeatureFlagConfig import kotlin.test.assertEquals /* DYNAMIC CARDS */ @@ -28,10 +27,6 @@ private const val DYNAMIC_CARD_ROW_ICON = "https://path/to/image" private const val DYNAMIC_CARD_ROW_TITLE = "Row title" private const val DYNAMIC_CARD_ROW_DESCRIPTION = "Row description" -private const val ENABLED_REMOTE_FEATURE_FLAG = "enabled_remote_feature_flag" -private const val DISABLED_REMOTE_FEATURE_FLAG = "disabled_remote_feature_flag" -private const val UNKNOWN_REMOTE_FEATURE_FLAG = "unknown_remote_feature_flag" - private val DYNAMIC_CARD_ROW_MODEL = CardModel.DynamicCardsModel.DynamicCardRowModel( icon = DYNAMIC_CARD_ROW_ICON, title = DYNAMIC_CARD_ROW_TITLE, @@ -41,7 +36,6 @@ private val DYNAMIC_CARD_ROW_MODEL = CardModel.DynamicCardsModel.DynamicCardRowM private val DYNAMIC_CARD_MODEL = CardModel.DynamicCardsModel.DynamicCardModel( id = DYNAMIC_CARD_ID, title = DYNAMIC_CARD_TITLE, - remoteFeatureFlag = ENABLED_REMOTE_FEATURE_FLAG, featuredImage = DYNAMIC_CARD_FEATURED_IMAGE, url = DYNAMIC_CARD_URL, action = DYNAMIC_CARD_ACTION, @@ -52,7 +46,6 @@ private val DYNAMIC_CARD_MODEL = CardModel.DynamicCardsModel.DynamicCardModel( private val DYNAMIC_CARD_MODEL_INVALID_ACTION_TITLE = CardModel.DynamicCardsModel.DynamicCardModel( id = DYNAMIC_CARD_ID, title = DYNAMIC_CARD_TITLE, - remoteFeatureFlag = ENABLED_REMOTE_FEATURE_FLAG, featuredImage = DYNAMIC_CARD_FEATURED_IMAGE, url = DYNAMIC_CARD_URL, action = null, @@ -63,7 +56,6 @@ private val DYNAMIC_CARD_MODEL_INVALID_ACTION_TITLE = CardModel.DynamicCardsMode private val DYNAMIC_CARD_MODEL_INVALID_ACTION_TITLE_AND_URL = CardModel.DynamicCardsModel.DynamicCardModel( id = DYNAMIC_CARD_ID, title = DYNAMIC_CARD_TITLE, - remoteFeatureFlag = ENABLED_REMOTE_FEATURE_FLAG, featuredImage = DYNAMIC_CARD_FEATURED_IMAGE, url = "", action = null, @@ -74,7 +66,6 @@ private val DYNAMIC_CARD_MODEL_INVALID_ACTION_TITLE_AND_URL = CardModel.DynamicC private val DYNAMIC_CARD_MODEL_INVALID_URL = CardModel.DynamicCardsModel.DynamicCardModel( id = DYNAMIC_CARD_ID, title = DYNAMIC_CARD_TITLE, - remoteFeatureFlag = ENABLED_REMOTE_FEATURE_FLAG, featuredImage = DYNAMIC_CARD_FEATURED_IMAGE, url = null, action = DYNAMIC_CARD_ACTION, @@ -82,39 +73,6 @@ private val DYNAMIC_CARD_MODEL_INVALID_URL = CardModel.DynamicCardsModel.Dynamic rows = listOf(DYNAMIC_CARD_ROW_MODEL) ) -private val DYNAMIC_CARD_MODEL_DISABLED_REMOTELY = CardModel.DynamicCardsModel.DynamicCardModel( - id = DYNAMIC_CARD_ID, - title = DYNAMIC_CARD_TITLE, - remoteFeatureFlag = DISABLED_REMOTE_FEATURE_FLAG, - featuredImage = DYNAMIC_CARD_FEATURED_IMAGE, - url = DYNAMIC_CARD_URL, - action = DYNAMIC_CARD_ACTION, - order = CardModel.DynamicCardsModel.CardOrder.fromString(DYNAMIC_CARD_ORDER), - rows = listOf(DYNAMIC_CARD_ROW_MODEL) -) - -private val DYNAMIC_CARD_MODEL_WITH_EMPTY_REMOTE_FLAG = CardModel.DynamicCardsModel.DynamicCardModel( - id = DYNAMIC_CARD_ID, - title = DYNAMIC_CARD_TITLE, - remoteFeatureFlag = "", - featuredImage = DYNAMIC_CARD_FEATURED_IMAGE, - url = DYNAMIC_CARD_URL, - action = DYNAMIC_CARD_ACTION, - order = CardModel.DynamicCardsModel.CardOrder.fromString(DYNAMIC_CARD_ORDER), - rows = listOf(DYNAMIC_CARD_ROW_MODEL) -) - -private val DYNAMIC_CARD_MODEL_WITH_UNKNOWN_REMOTE_FLAG = CardModel.DynamicCardsModel.DynamicCardModel( - id = DYNAMIC_CARD_ID, - title = DYNAMIC_CARD_TITLE, - remoteFeatureFlag = UNKNOWN_REMOTE_FEATURE_FLAG, - featuredImage = DYNAMIC_CARD_FEATURED_IMAGE, - url = DYNAMIC_CARD_URL, - action = DYNAMIC_CARD_ACTION, - order = CardModel.DynamicCardsModel.CardOrder.fromString(DYNAMIC_CARD_ORDER), - rows = listOf(DYNAMIC_CARD_ROW_MODEL) -) - @ExperimentalCoroutinesApi class DynamicCardsBuilderTest : BaseUnitTest() { private lateinit var dynamicCardsBuilder: DynamicCardsBuilder @@ -128,20 +86,12 @@ class DynamicCardsBuilderTest : BaseUnitTest() { @Mock private lateinit var dynamicDashboardCardsFeatureConfig: DynamicDashboardCardsFeatureConfig - @Mock - private lateinit var featureFlagConfig: FeatureFlagConfig - @Before fun setUp() { dynamicCardsBuilder = - DynamicCardsBuilder(urlUtils, deepLinkHandlers, dynamicDashboardCardsFeatureConfig, featureFlagConfig) + DynamicCardsBuilder(urlUtils, deepLinkHandlers, dynamicDashboardCardsFeatureConfig) whenever(urlUtils.isValidUrlAndHostNotNull(DYNAMIC_CARD_URL)).thenReturn(true) whenever(dynamicDashboardCardsFeatureConfig.isEnabled()).thenReturn(true) - whenever(featureFlagConfig.isEnabled(ENABLED_REMOTE_FEATURE_FLAG)).thenReturn(true) - whenever(featureFlagConfig.getString(ENABLED_REMOTE_FEATURE_FLAG)).thenReturn(ENABLED_REMOTE_FEATURE_FLAG) - whenever(featureFlagConfig.isEnabled(DISABLED_REMOTE_FEATURE_FLAG)).thenReturn(false) - whenever(featureFlagConfig.getString(DISABLED_REMOTE_FEATURE_FLAG)).thenReturn(DISABLED_REMOTE_FEATURE_FLAG) - whenever(featureFlagConfig.getString(UNKNOWN_REMOTE_FEATURE_FLAG)).thenReturn("") } @Test @@ -262,46 +212,4 @@ class DynamicCardsBuilderTest : BaseUnitTest() { val dynamicCards = dynamicCardsBuilder.build(builderParams, CardModel.DynamicCardsModel.CardOrder.TOP) assertThat(dynamicCards).isNull() } - - @Test - fun `WHEN the card remote feature flag is disabled THEN the card is not visible`() { - val builderParams = MySiteCardAndItemBuilderParams.DynamicCardsBuilderParams( - dynamicCards = CardModel.DynamicCardsModel( - dynamicCards = listOf(DYNAMIC_CARD_MODEL_DISABLED_REMOTELY) - ), - onCardClick = mock(), - onCtaClick = mock(), - onHideMenuItemClick = mock(), - ) - val dynamicCards = dynamicCardsBuilder.build(builderParams, CardModel.DynamicCardsModel.CardOrder.TOP) - assertThat(requireNotNull(dynamicCards)).isEmpty() - } - - @Test - fun `WHEN the card remote feature flag is empty THEN the card is visible`() { - val builderParams = MySiteCardAndItemBuilderParams.DynamicCardsBuilderParams( - dynamicCards = CardModel.DynamicCardsModel( - dynamicCards = listOf(DYNAMIC_CARD_MODEL_WITH_EMPTY_REMOTE_FLAG) - ), - onCardClick = mock(), - onCtaClick = mock(), - onHideMenuItemClick = mock(), - ) - val dynamicCards = dynamicCardsBuilder.build(builderParams, CardModel.DynamicCardsModel.CardOrder.TOP) - assertEquals(requireNotNull(dynamicCards).size, 1) - } - - @Test - fun `WHEN the card remote feature flag does not exist THEN the card is visible`() { - val builderParams = MySiteCardAndItemBuilderParams.DynamicCardsBuilderParams( - dynamicCards = CardModel.DynamicCardsModel( - dynamicCards = listOf(DYNAMIC_CARD_MODEL_WITH_UNKNOWN_REMOTE_FLAG) - ), - onCardClick = mock(), - onCtaClick = mock(), - onHideMenuItemClick = mock(), - ) - val dynamicCards = dynamicCardsBuilder.build(builderParams, CardModel.DynamicCardsModel.CardOrder.TOP) - assertEquals(requireNotNull(dynamicCards).size, 1) - } } diff --git a/WordPress/src/test/java/org/wordpress/android/ui/mysite/cards/dynamiccard/DynamicCardsViewModelSliceTest.kt b/WordPress/src/test/java/org/wordpress/android/ui/mysite/cards/dynamiccard/DynamicCardsViewModelSliceTest.kt index 6177a61bfdf8..a0c4ebbf0f39 100644 --- a/WordPress/src/test/java/org/wordpress/android/ui/mysite/cards/dynamiccard/DynamicCardsViewModelSliceTest.kt +++ b/WordPress/src/test/java/org/wordpress/android/ui/mysite/cards/dynamiccard/DynamicCardsViewModelSliceTest.kt @@ -21,7 +21,6 @@ import org.wordpress.android.ui.prefs.AppPrefsWrapper private const val DYNAMIC_CARD_ID_FIRST = "year_in_review_2023" private const val DYNAMIC_CARD_ID_SECOND = "domain_management" private const val DYNAMIC_CARD_TITLE = "News" -private const val DYNAMIC_CARD_REMOTE_FEATURE_FLAG = "dynamic_dashboard_cards" private const val DYNAMIC_CARD_FEATURED_IMAGE = "https://path/to/image" private const val DYNAMIC_CARD_URL = "https://wordpress.com" private const val SOME_DEEP_LINK = "some_deep_link" @@ -40,7 +39,6 @@ private val dynamicCardRowModel = DynamicCardRowModel( private val firstDynamicCardModel = DynamicCardModel( id = DYNAMIC_CARD_ID_FIRST, title = DYNAMIC_CARD_TITLE, - remoteFeatureFlag = DYNAMIC_CARD_REMOTE_FEATURE_FLAG, featuredImage = DYNAMIC_CARD_FEATURED_IMAGE, url = DYNAMIC_CARD_URL, action = DYNAMIC_CARD_ACTION, @@ -51,7 +49,6 @@ private val firstDynamicCardModel = DynamicCardModel( private val secondDynamicCardModel = DynamicCardModel( id = DYNAMIC_CARD_ID_SECOND, title = null, - remoteFeatureFlag = DYNAMIC_CARD_REMOTE_FEATURE_FLAG, featuredImage = null, url = null, action = null, diff --git a/build.gradle b/build.gradle index 723a7fe87439..157ec9effa0e 100644 --- a/build.gradle +++ b/build.gradle @@ -24,7 +24,7 @@ ext { automatticTracksVersion = '3.3.0' gutenbergMobileVersion = '6491-31ff640dc82d1c7224f6791e23a4456ca034d04e' wordPressAztecVersion = 'v1.9.0' - wordPressFluxCVersion = 'trunk-67afc3a620b4ad56b981d21637db6b3509b07ab6' + wordPressFluxCVersion = '2.61.0' wordPressLoginVersion = '1.10.0' wordPressPersistentEditTextVersion = '1.0.2' wordPressUtilsVersion = '3.11.0' diff --git a/fastlane/Fastfile b/fastlane/Fastfile index 970e1c739417..c82dda75653b 100644 --- a/fastlane/Fastfile +++ b/fastlane/Fastfile @@ -115,9 +115,9 @@ def code_freeze_beta_version # Read the current release version from the .xcconfig file and parse it into an AppVersion object current_version = VERSION_FORMATTER.parse(VERSION_FILE.read_version_name) # Calculate the next major version number - next_minor_version = VERSION_CALCULATOR.next_minor_version(version: current_version) + next_version = VERSION_CALCULATOR.next_release_version(version: current_version) # Calculate the next build number - code_freeze_beta_version = VERSION_CALCULATOR.next_build_number(version: next_minor_version) + code_freeze_beta_version = VERSION_CALCULATOR.next_build_number(version: next_version) # Return the formatted release version VERSION_FORMATTER.beta_version(code_freeze_beta_version) end diff --git a/fastlane/jetpack_metadata/android/ar/changelogs/1392.txt b/fastlane/jetpack_metadata/android/ar/changelogs/1392.txt deleted file mode 100644 index 966a87f15696..000000000000 --- a/fastlane/jetpack_metadata/android/ar/changelogs/1392.txt +++ /dev/null @@ -1,4 +0,0 @@ -23.8: -- يعرض محرر المكوّن خيار "إلغاء التجميع" فقط للمكوّنات المتداخلة التي تدعمه. -- يستخدم إعداد تحسين الصور الحجم والجودة المثاليين افتراضيًا. -- يتم تثبيت القوالب بشكل صحيح في المواقع المسجَّلة على خطتي الأعمال والتجارة. diff --git a/fastlane/jetpack_metadata/android/ar/changelogs/1397.txt b/fastlane/jetpack_metadata/android/ar/changelogs/1397.txt new file mode 100644 index 000000000000..dfa3a2278246 --- /dev/null +++ b/fastlane/jetpack_metadata/android/ar/changelogs/1397.txt @@ -0,0 +1,5 @@ +23.9: +لا توجد تحديثات في هذا الأسبوع! استمتع بهذه الحقائق عن غزال الرنة: +- يتخلص ذكور غزال الرنة من قرونهم في الخريف والإناث في الربيع، لذا فإن غزال الرنة الخاص بسانتا هي أنثى. +- لا يمتلك غزال الرنة في الواقع أنوفًا حمراء. +- لا يتناول سانتا الحليب والبسكويت منذ عام 2003 لأن بليتزن تصل دائمًا إلى هناك أولاً. diff --git a/fastlane/jetpack_metadata/android/de-DE/changelogs/1392.txt b/fastlane/jetpack_metadata/android/de-DE/changelogs/1392.txt deleted file mode 100644 index 3eba72dd8702..000000000000 --- a/fastlane/jetpack_metadata/android/de-DE/changelogs/1392.txt +++ /dev/null @@ -1,4 +0,0 @@ -23.8: -- Der Block-Editor zeigt die Option „Gruppierung aufheben“ nur für verschachtelte Blöcke, die diese Option unterstützen. -- Die Einstellung „Bilder optimieren“ nutzt standardmäßig die optimale Größe und Qualität. -- Themes werden für Websites, die Business- und Commerce-Tarife verwenden, ordnungsgemäß installiert. diff --git a/fastlane/jetpack_metadata/android/de-DE/changelogs/1397.txt b/fastlane/jetpack_metadata/android/de-DE/changelogs/1397.txt new file mode 100644 index 000000000000..8f103db3c7f4 --- /dev/null +++ b/fastlane/jetpack_metadata/android/de-DE/changelogs/1397.txt @@ -0,0 +1,5 @@ +23.9: +Diese Woche gibt es keine Updates! Dafür aber ein paar Fakten über Rentiere: +- Männliche Rentiere werfen ihr Geweih im Herbst ab, weibliche hingegen im Frühling. Die Rentiere des Weihnachtsmannes sind also weiblich. +- Rentiere haben eigentlich gar keine roten Nasen. +- Der Weihnachtsmann hat seit 2003 keine Kekse mit Milch gegessen, weil Blitzen ihm immer zuvorkommt. diff --git a/fastlane/jetpack_metadata/android/en-US/changelogs/1392.txt b/fastlane/jetpack_metadata/android/en-US/changelogs/1392.txt deleted file mode 100644 index c1beb73308d2..000000000000 --- a/fastlane/jetpack_metadata/android/en-US/changelogs/1392.txt +++ /dev/null @@ -1,3 +0,0 @@ -- Block editor only shows the “ungroup” option for nested blocks that support it. -- Optimize Images setting uses optimal size and quality by default. -- Themes install properly for sites on Business and Commerce plans. diff --git a/fastlane/jetpack_metadata/android/en-US/changelogs/1397.txt b/fastlane/jetpack_metadata/android/en-US/changelogs/1397.txt new file mode 100644 index 000000000000..f80ecfc08a7d --- /dev/null +++ b/fastlane/jetpack_metadata/android/en-US/changelogs/1397.txt @@ -0,0 +1,4 @@ +No updates this week! Enjoy these reindeer facts: +- Male reindeer shed their antlers in fall and females in spring, so Santa’s reindeer are female. +- Reindeer don’t actually have red noses. +- Santa hasn’t eaten milk and cookies since 2003 because Blitzen always gets there first. diff --git a/fastlane/jetpack_metadata/android/es-ES/changelogs/1392.txt b/fastlane/jetpack_metadata/android/es-ES/changelogs/1392.txt deleted file mode 100644 index e744aab56775..000000000000 --- a/fastlane/jetpack_metadata/android/es-ES/changelogs/1392.txt +++ /dev/null @@ -1,4 +0,0 @@ -23.8: --El Editor de bloques solo muestra la opción "desagrupar" para los bloques anidados que le dan soporte. -- El ajuste Optimizar imágenes usa el tamaño y la calidad óptimos por defecto. -- Los temas se instalan correctamente en los sitios con planes Business y Commerce. diff --git a/fastlane/jetpack_metadata/android/es-ES/changelogs/1397.txt b/fastlane/jetpack_metadata/android/es-ES/changelogs/1397.txt new file mode 100644 index 000000000000..e057fbaeee54 --- /dev/null +++ b/fastlane/jetpack_metadata/android/es-ES/changelogs/1397.txt @@ -0,0 +1,5 @@ +23,9: +Esta semana no hay actualizaciones. Disfruta de estos datos sobre los renos: +- Los renos machos mudan la cornamenta en otoño y las hembras en primavera, por lo que los renos de Papá Noel son hembras. +- En realidad, los renos no tienen la nariz roja. +- Papá Noel no come leche con galletas desde 2003 porque Blitzen siempre llega antes. diff --git a/fastlane/jetpack_metadata/android/fr-FR/changelogs/1392.txt b/fastlane/jetpack_metadata/android/fr-FR/changelogs/1392.txt deleted file mode 100644 index 840279f12fa9..000000000000 --- a/fastlane/jetpack_metadata/android/fr-FR/changelogs/1392.txt +++ /dev/null @@ -1,4 +0,0 @@ -23.8 : -- L’éditeur de blocs affiche l’option « Dégrouper » uniquement pour les blocs imbriqués qui la prennent en charge. -- Le réglage Optimiser les images utilise la taille et la qualité optimales par défaut. -- Les thèmes s’installent correctement pour les sites disposant de plans Business et Commerce. diff --git a/fastlane/jetpack_metadata/android/fr-FR/changelogs/1397.txt b/fastlane/jetpack_metadata/android/fr-FR/changelogs/1397.txt new file mode 100644 index 000000000000..a63be7b0a910 --- /dev/null +++ b/fastlane/jetpack_metadata/android/fr-FR/changelogs/1397.txt @@ -0,0 +1,5 @@ +23.9 : +Pas de mise à jour cette semaine ! À la place, quelques fun facts sur les rennes : +- Chez les rennes, les mâles perdent leurs bois à l’automne et les femelles au printemps, donc les rennes du père Noël sont des femelles. +- En réalité, les rennes n’ont pas le nez rouge. +- Le père Noël n’a pas bu de lait ni mangé de biscuits depuis 2003 parce que Tornade arrive toujours la première. diff --git a/fastlane/jetpack_metadata/android/id/changelogs/1392.txt b/fastlane/jetpack_metadata/android/id/changelogs/1392.txt deleted file mode 100644 index fb6a341d1604..000000000000 --- a/fastlane/jetpack_metadata/android/id/changelogs/1392.txt +++ /dev/null @@ -1,4 +0,0 @@ -23.8: -- Editor blok hanya menampilkan pilihan “batalkan pengelompokan” untuk blok bertingkat yang mendukung pilihan tersebut. -- Pengaturan Optimalkan Gambar menerapkan ukuran dan kualitas optimal secara default. -- Tema terinstal dengan benar untuk situs pada paket Bisnis dan Commerce. diff --git a/fastlane/jetpack_metadata/android/id/changelogs/1397.txt b/fastlane/jetpack_metadata/android/id/changelogs/1397.txt new file mode 100644 index 000000000000..74628499086b --- /dev/null +++ b/fastlane/jetpack_metadata/android/id/changelogs/1397.txt @@ -0,0 +1,5 @@ +23.9: +Tidak ada pembaruan minggu ini. Simak fakta-fakta tentang rusa kutub berikut: +- Rusa kutub jantan melepaskan tanduknya pada musim gugur, sedangkan rusa kutub betina melepaskan tanduknya pada musim semi sehingga Sinterklas menggunakan rusa kutub betina. +- Rusa kutub sebenarnya tidak berhidung merah. +- Sinterklas tidak mengonsumsi susu dan kue sejak 2003 karena kalah cepat dengan Blitzen. diff --git a/fastlane/jetpack_metadata/android/it-IT/changelogs/1392.txt b/fastlane/jetpack_metadata/android/it-IT/changelogs/1392.txt deleted file mode 100644 index ed362e0d27a8..000000000000 --- a/fastlane/jetpack_metadata/android/it-IT/changelogs/1392.txt +++ /dev/null @@ -1,4 +0,0 @@ -23.8: -- L'editor a blocchi mostra l'opzione "Non raggruppare" solo per i blocchi nidificati che supportano tale opzione. -- L'impostazione Ottimizza le immagini utilizza dimensioni e qualità ottimali per impostazione predefinita. -- I temi si installano correttamente sui siti con i piani Business e Commerce. diff --git a/fastlane/jetpack_metadata/android/it-IT/changelogs/1397.txt b/fastlane/jetpack_metadata/android/it-IT/changelogs/1397.txt new file mode 100644 index 000000000000..ba1ff53c50b7 --- /dev/null +++ b/fastlane/jetpack_metadata/android/it-IT/changelogs/1397.txt @@ -0,0 +1,5 @@ +23,9: +Nessun aggiornamento questa settimana! Scopri queste curiosità sulle renne: +- Le renne maschio perdono le loro corna in autunno e le femmine in primavera, quindi le renne di Babbo Natale sono femmine. +- Le renne non hanno davvero il naso rosso. +- Babbo Natale non mangia latte e biscotti dal 2003, perché Lampo arriva sempre prima. diff --git a/fastlane/jetpack_metadata/android/iw-IL/changelogs/1392.txt b/fastlane/jetpack_metadata/android/iw-IL/changelogs/1392.txt deleted file mode 100644 index a0defa14eb0d..000000000000 --- a/fastlane/jetpack_metadata/android/iw-IL/changelogs/1392.txt +++ /dev/null @@ -1,4 +0,0 @@ -23.8: -– בעורך הבלוקים האפשרות 'לבטל הקבצה', תוצג עבור בלוקים מקוננים רק אם הם אכן תומכים בכך. -– ההגדרה 'מיטוב תמונות' , ממטבת גודל ואיכות של תמונות כברירת מחדל. -– התקנה של ערכות עיצוב באתרים המנויים על תוכניות לעסקים ולמסחר נעשית באופן תקין. diff --git a/fastlane/jetpack_metadata/android/iw-IL/changelogs/1397.txt b/fastlane/jetpack_metadata/android/iw-IL/changelogs/1397.txt new file mode 100644 index 000000000000..d8dc62b2fc42 --- /dev/null +++ b/fastlane/jetpack_metadata/android/iw-IL/changelogs/1397.txt @@ -0,0 +1,5 @@ +23.9: +השבוע אין עדכונים! הנה כמה עובדות משעשעות על איל הצפון: +– איל הצפון הזכר משיר את קרניו בסתיו והנקבות באביב, כך שכל האילים שמושכים את המזחלת של סנטה הם נקבות. +– לאיל הצפון לא באמת יש אף אדום. +– סנטה לא טעם עוגיות וחלב מאז 2003 כי האיל בליקסן תמיד מקדים אותו. diff --git a/fastlane/jetpack_metadata/android/ja-JP/changelogs/1392.txt b/fastlane/jetpack_metadata/android/ja-JP/changelogs/1392.txt deleted file mode 100644 index 7cc463d7cba6..000000000000 --- a/fastlane/jetpack_metadata/android/ja-JP/changelogs/1392.txt +++ /dev/null @@ -1,4 +0,0 @@ -23.8: -- ブロックエディターには、エディターをサポートするネストされたブロックの「グループ解除」オプションのみが表示されます。 -- 「画像を最適化」設定ではデフォルトで最適なサイズと品質が使用されます。 -- テーマはビジネスプランとコマースプランのサイトに適切にインストールされます。 diff --git a/fastlane/jetpack_metadata/android/ja-JP/changelogs/1397.txt b/fastlane/jetpack_metadata/android/ja-JP/changelogs/1397.txt new file mode 100644 index 000000000000..da82b3604cd2 --- /dev/null +++ b/fastlane/jetpack_metadata/android/ja-JP/changelogs/1397.txt @@ -0,0 +1,5 @@ +23.9: +今週は更新がありません ! トナカイに関する事実は以下をご覧ください。 +- オスのトナカイは秋に、メスは春に角を落とします。つまり、サンタのトナカイはメスです。 +- 実際にトナカイは赤い鼻をしていません。 +- 2003年以来、サンタは牛乳とクッキーを口にしていません。ブリッツェンがいつも始めに到着するからです。 diff --git a/fastlane/jetpack_metadata/android/ko-KR/changelogs/1392.txt b/fastlane/jetpack_metadata/android/ko-KR/changelogs/1392.txt deleted file mode 100644 index 6a06ae119237..000000000000 --- a/fastlane/jetpack_metadata/android/ko-KR/changelogs/1392.txt +++ /dev/null @@ -1,4 +0,0 @@ -23.8: -- 중첩된 블록에서 "그룹 해제" 옵션을 지원하는 경우 해당 옵션만 블록 편집기에 표시됩니다. -- 이미지 최적화 설정에서 기본적으로 최적 크기와 품질을 사용합니다. -- 비즈니스 및 상거래 요금제의 사이트에 테마가 제대로 설치됩니다. diff --git a/fastlane/jetpack_metadata/android/ko-KR/changelogs/1397.txt b/fastlane/jetpack_metadata/android/ko-KR/changelogs/1397.txt new file mode 100644 index 000000000000..540bdd39b9f6 --- /dev/null +++ b/fastlane/jetpack_metadata/android/ko-KR/changelogs/1397.txt @@ -0,0 +1,5 @@ +23.9: +이번 주에는 업데이트가 없습니다! 순록에 대한 재미있는 사실: +- 순록 수컷은 뿔이 가을에 빠지고 순록 암컷은 봄에 빠지므로 산타의 순록은 암컷입니다. +- 순록은 실제로는 빨간 코가 없습니다. +- 순록이 항상 먼저 그곳에 도착하기 때문에 산타는 2003년 이후에 우유와 쿠키를 먹은 적이 없습니다. diff --git a/fastlane/jetpack_metadata/android/nl-NL/changelogs/1392.txt b/fastlane/jetpack_metadata/android/nl-NL/changelogs/1392.txt deleted file mode 100644 index a4e199fe9886..000000000000 --- a/fastlane/jetpack_metadata/android/nl-NL/changelogs/1392.txt +++ /dev/null @@ -1,4 +0,0 @@ -23.8: -- Blokeditor toont alleen de optie 'Groepering opheffen' voor genestelde blokken die dat ondersteunen. -- De instelling voor Afbeeldingen optimaliseren gebruikt standaard de optimale afmetingen en kwaliteit. -- Thema's worden correct geïnstalleerd voor sites met Business- en Commerce-abonnementen. diff --git a/fastlane/jetpack_metadata/android/nl-NL/changelogs/1397.txt b/fastlane/jetpack_metadata/android/nl-NL/changelogs/1397.txt new file mode 100644 index 000000000000..cee305463074 --- /dev/null +++ b/fastlane/jetpack_metadata/android/nl-NL/changelogs/1397.txt @@ -0,0 +1,5 @@ +23.9: +Er zijn geen updates deze week! Wat leuke rendierfeitjes: +-Mannetjes rendieren werpen hun gewei in de herfst af en vrouwtjes in de lente, dus de rendieren van de Kerstman zijn vrouwtjes. +- Rendieren hebben niet echt een rode neus. +- De Kerstman heeft sinds 2003 geen melk en koekjes meer gehad omdat Blitzen hem altijd voor is. diff --git a/fastlane/jetpack_metadata/android/pt-BR/changelogs/1392.txt b/fastlane/jetpack_metadata/android/pt-BR/changelogs/1392.txt deleted file mode 100644 index 47cc1c84bf66..000000000000 --- a/fastlane/jetpack_metadata/android/pt-BR/changelogs/1392.txt +++ /dev/null @@ -1,4 +0,0 @@ -23.8: -- O editor de blocos só mostra a opção "Desagrupar" para blocos aninhados compatíveis com essa função. -- A configuração "Otimizar imagens" usa tamanho e qualidade otimizados por padrão. -- Os temas são instalados de forma adequada para sites nos planos Negócios e Commerce. diff --git a/fastlane/jetpack_metadata/android/pt-BR/changelogs/1397.txt b/fastlane/jetpack_metadata/android/pt-BR/changelogs/1397.txt new file mode 100644 index 000000000000..f56e0ea55801 --- /dev/null +++ b/fastlane/jetpack_metadata/android/pt-BR/changelogs/1397.txt @@ -0,0 +1,5 @@ +23.9: +Sem atualizações nesta semana. Fique com estes fatos natalinos: +- Os machos perdem as galhadas no outono e as fêmeas na primavera, então as renas do Papai Noel são fêmeas. +- Renas não têm o focinho vermelho. +- O Papai Noel não come mais leite com biscoitos porque já enjoou da mesmice. diff --git a/fastlane/jetpack_metadata/android/ru-RU/changelogs/1392.txt b/fastlane/jetpack_metadata/android/ru-RU/changelogs/1392.txt deleted file mode 100644 index 9bb1b0e7f020..000000000000 --- a/fastlane/jetpack_metadata/android/ru-RU/changelogs/1392.txt +++ /dev/null @@ -1,4 +0,0 @@ -23.8: -- Опция «Разгруппировать» отображается в редакторе блоков только для тех вложенных блоков, которые её поддерживают. -- Настройка «Оптимизировать изображение» по умолчанию устанавливает для изображения оптимальные размер и качество. -- На сайтах, работающих по тарифным планам Business и Commerce, темы устанавливаются правильно. diff --git a/fastlane/jetpack_metadata/android/ru-RU/changelogs/1397.txt b/fastlane/jetpack_metadata/android/ru-RU/changelogs/1397.txt new file mode 100644 index 000000000000..73ad23aa16b5 --- /dev/null +++ b/fastlane/jetpack_metadata/android/ru-RU/changelogs/1397.txt @@ -0,0 +1,5 @@ +23.9: +На этой неделе нет обновлений. Вместо этого интересные факты об оленях. +- Олени-самцы сбрасывают рога осенью, а самки — весной, значит, олени Санты — самки. +- Нос у оленя не красного цвета. +- Санта не пробовал молока с печеньем с 2003 года, потому что олень Блитцен успевает сожрать всё первым. diff --git a/fastlane/jetpack_metadata/android/sv-SE/changelogs/1392.txt b/fastlane/jetpack_metadata/android/sv-SE/changelogs/1392.txt deleted file mode 100644 index 6950684baf9d..000000000000 --- a/fastlane/jetpack_metadata/android/sv-SE/changelogs/1392.txt +++ /dev/null @@ -1,4 +0,0 @@ -23.8: -- Blockredigeraren visar endast alternativet "avgruppera" för inbäddade block som stöder detta. -- Inställningen Optimera bilder använder optimal storlek och kvalitet som standard. -- Teman installeras korrekt för webbplatser med Business- och Commerce-paket. diff --git a/fastlane/jetpack_metadata/android/sv-SE/changelogs/1397.txt b/fastlane/jetpack_metadata/android/sv-SE/changelogs/1397.txt new file mode 100644 index 000000000000..0e5216c4b438 --- /dev/null +++ b/fastlane/jetpack_metadata/android/sv-SE/changelogs/1397.txt @@ -0,0 +1,5 @@ +23.9: +Inga uppdateringar den här veckan. Här kommer lite fakta om renar: +- Hanrenar fäller sina horn på hösten och honor på våren, så tomtens renar är honor. +- Renar har egentligen inte röda nosar. +- Tomten har inte ätit mjölk och kakor sedan 2003 eftersom Blitzen alltid kommer fram först. diff --git a/fastlane/jetpack_metadata/android/tr-TR/changelogs/1392.txt b/fastlane/jetpack_metadata/android/tr-TR/changelogs/1392.txt deleted file mode 100644 index fa0bc7812374..000000000000 --- a/fastlane/jetpack_metadata/android/tr-TR/changelogs/1392.txt +++ /dev/null @@ -1,4 +0,0 @@ -23.8: -- Blok düzenleyici "grubu ayır" seçeneğini yalnızca bu seçeneği destekleyen iç içe geçmiş bloklar için gösterir. -- Görselleri İyileştirme ayarı varsayılan olarak ideal boyut ve kaliteyi kullanır. -- Kurumsal pakette ve Ticaret paketinde temalar sitelerde düzgün yüklenir. diff --git a/fastlane/jetpack_metadata/android/tr-TR/changelogs/1397.txt b/fastlane/jetpack_metadata/android/tr-TR/changelogs/1397.txt new file mode 100644 index 000000000000..2bbe3b36dda6 --- /dev/null +++ b/fastlane/jetpack_metadata/android/tr-TR/changelogs/1397.txt @@ -0,0 +1,5 @@ +23.9: +Bu hafta bir güncelleme yok! Biz de ren geyikleri hakkında birkaç ilginç bilgi paylaşalım dedik: +- Erkek ren geyiklerinin boynuzları sonbaharda, dişi ren geyiklerinin boynuzları ise ilkbaharda düşer. Yani Noel Baba'nın ren geyikleri dişidir. +- Ren geyiklerinin burunları aslında kırmızı değildir. +- Noel Baba 2003'ten beri süt içip kurabiye yememiştir, çünkü Noel Baba'nın ren geyiği Blitzen her zaman ondan önce varıp kurabiyeleri bitirir. diff --git a/fastlane/jetpack_metadata/android/zh-CN/changelogs/1392.txt b/fastlane/jetpack_metadata/android/zh-CN/changelogs/1392.txt deleted file mode 100644 index fc7127fbc6a0..000000000000 --- a/fastlane/jetpack_metadata/android/zh-CN/changelogs/1392.txt +++ /dev/null @@ -1,4 +0,0 @@ -23.8: -- 在区块编辑器中,仅支持“取消分组”选项的嵌套区块会显示该选项。 -- 优化图像设置为默认使用最佳尺寸和质量。 -- 采用商务版和电子商务版套餐的站点可正常安装主题。 diff --git a/fastlane/jetpack_metadata/android/zh-CN/changelogs/1397.txt b/fastlane/jetpack_metadata/android/zh-CN/changelogs/1397.txt new file mode 100644 index 000000000000..69a9666e750b --- /dev/null +++ b/fastlane/jetpack_metadata/android/zh-CN/changelogs/1397.txt @@ -0,0 +1,5 @@ +23.9: +本周无更新! 我们将与您分享一些关于驯鹿的冷知识: +- 雄性驯鹿在秋天脱角,雌性驯鹿在春天脱角,所以圣诞老人驾驶的驯鹿都是雌性的。 +- 驯鹿的鼻子并不是红色的。 +- 自 2003 年以来,圣诞老人就再也没吃过牛奶和饼干了,因为他的驯鹿闪电总是抢先一步。 diff --git a/fastlane/jetpack_metadata/android/zh-TW/changelogs/1392.txt b/fastlane/jetpack_metadata/android/zh-TW/changelogs/1392.txt deleted file mode 100644 index 51ef47bab3da..000000000000 --- a/fastlane/jetpack_metadata/android/zh-TW/changelogs/1392.txt +++ /dev/null @@ -1,4 +0,0 @@ -23.8: -- 只有區塊編輯器中支援「取消群組」功能的內嵌區塊,才會顯示對應選項。 -- 「最佳化圖片」設定預設為最佳大小和畫質。 -- 商用版和電子商務版方案網站可正常安裝佈景主題。 diff --git a/fastlane/jetpack_metadata/android/zh-TW/changelogs/1397.txt b/fastlane/jetpack_metadata/android/zh-TW/changelogs/1397.txt new file mode 100644 index 000000000000..1565a62b1dda --- /dev/null +++ b/fastlane/jetpack_metadata/android/zh-TW/changelogs/1397.txt @@ -0,0 +1,5 @@ +23.9: +本週沒有更新! 但讓我們分享一些關於麋鹿的小知識: +- 公麋鹿會在秋天脫角,而母麋鹿則是在春天脫角,所以聖誕老人的麋鹿是母的。 +- 麋鹿實際上沒有紅鼻子。 +- 聖誕老人自 2003 年就沒享用過牛奶和餅乾了,因為麋鹿「閃電」總是搶先一步。 diff --git a/fastlane/jetpack_resources/values/strings.xml b/fastlane/jetpack_resources/values/strings.xml index 616900674fef..0d3260586334 100644 --- a/fastlane/jetpack_resources/values/strings.xml +++ b/fastlane/jetpack_resources/values/strings.xml @@ -21,10 +21,14 @@ Respond to comments Restore a backup Search for plugins - Share on Facebook + Share on social Fix a security issue Post a photo - Add an author + Read other blogs + Build an audience + Post a photo + Write from anywhere + Manage your domains Check your email on this device and tap the link in the email you received from Jetpack.com. diff --git a/fastlane/metadata/android/ar/changelogs/1392.txt b/fastlane/metadata/android/ar/changelogs/1392.txt deleted file mode 100644 index 966a87f15696..000000000000 --- a/fastlane/metadata/android/ar/changelogs/1392.txt +++ /dev/null @@ -1,4 +0,0 @@ -23.8: -- يعرض محرر المكوّن خيار "إلغاء التجميع" فقط للمكوّنات المتداخلة التي تدعمه. -- يستخدم إعداد تحسين الصور الحجم والجودة المثاليين افتراضيًا. -- يتم تثبيت القوالب بشكل صحيح في المواقع المسجَّلة على خطتي الأعمال والتجارة. diff --git a/fastlane/metadata/android/ar/changelogs/1397.txt b/fastlane/metadata/android/ar/changelogs/1397.txt new file mode 100644 index 000000000000..a9bb27425f2e --- /dev/null +++ b/fastlane/metadata/android/ar/changelogs/1397.txt @@ -0,0 +1,5 @@ +23.9: +لا توجد تحديثات في هذا الأسبوع! استمتع بهذه الحقائق عن غزال الرنة: +- يتخلص ذكور غزال الرنة من قرونهم في الخريف والإناث في الربيع، لذا فإن غزال الرنة الخاص بسانتا هي أنثى. +- لا يمتلك غزال الرنة في الواقع أنوفًا حمراء. +- لا يتناول سانتا الحليب والبسكويت منذ عام 2003 لأن بليتزن يصل دائمًا إلى هناك أولاً. diff --git a/fastlane/metadata/android/de-DE/changelogs/1392.txt b/fastlane/metadata/android/de-DE/changelogs/1392.txt deleted file mode 100644 index 3eba72dd8702..000000000000 --- a/fastlane/metadata/android/de-DE/changelogs/1392.txt +++ /dev/null @@ -1,4 +0,0 @@ -23.8: -- Der Block-Editor zeigt die Option „Gruppierung aufheben“ nur für verschachtelte Blöcke, die diese Option unterstützen. -- Die Einstellung „Bilder optimieren“ nutzt standardmäßig die optimale Größe und Qualität. -- Themes werden für Websites, die Business- und Commerce-Tarife verwenden, ordnungsgemäß installiert. diff --git a/fastlane/metadata/android/de-DE/changelogs/1397.txt b/fastlane/metadata/android/de-DE/changelogs/1397.txt new file mode 100644 index 000000000000..8f103db3c7f4 --- /dev/null +++ b/fastlane/metadata/android/de-DE/changelogs/1397.txt @@ -0,0 +1,5 @@ +23.9: +Diese Woche gibt es keine Updates! Dafür aber ein paar Fakten über Rentiere: +- Männliche Rentiere werfen ihr Geweih im Herbst ab, weibliche hingegen im Frühling. Die Rentiere des Weihnachtsmannes sind also weiblich. +- Rentiere haben eigentlich gar keine roten Nasen. +- Der Weihnachtsmann hat seit 2003 keine Kekse mit Milch gegessen, weil Blitzen ihm immer zuvorkommt. diff --git a/fastlane/metadata/android/en-US/changelogs/1392.txt b/fastlane/metadata/android/en-US/changelogs/1392.txt deleted file mode 100644 index c1beb73308d2..000000000000 --- a/fastlane/metadata/android/en-US/changelogs/1392.txt +++ /dev/null @@ -1,3 +0,0 @@ -- Block editor only shows the “ungroup” option for nested blocks that support it. -- Optimize Images setting uses optimal size and quality by default. -- Themes install properly for sites on Business and Commerce plans. diff --git a/fastlane/metadata/android/en-US/changelogs/1397.txt b/fastlane/metadata/android/en-US/changelogs/1397.txt new file mode 100644 index 000000000000..f80ecfc08a7d --- /dev/null +++ b/fastlane/metadata/android/en-US/changelogs/1397.txt @@ -0,0 +1,4 @@ +No updates this week! Enjoy these reindeer facts: +- Male reindeer shed their antlers in fall and females in spring, so Santa’s reindeer are female. +- Reindeer don’t actually have red noses. +- Santa hasn’t eaten milk and cookies since 2003 because Blitzen always gets there first. diff --git a/fastlane/metadata/android/es-ES/changelogs/1392.txt b/fastlane/metadata/android/es-ES/changelogs/1392.txt deleted file mode 100644 index e744aab56775..000000000000 --- a/fastlane/metadata/android/es-ES/changelogs/1392.txt +++ /dev/null @@ -1,4 +0,0 @@ -23.8: --El Editor de bloques solo muestra la opción "desagrupar" para los bloques anidados que le dan soporte. -- El ajuste Optimizar imágenes usa el tamaño y la calidad óptimos por defecto. -- Los temas se instalan correctamente en los sitios con planes Business y Commerce. diff --git a/fastlane/metadata/android/es-ES/changelogs/1397.txt b/fastlane/metadata/android/es-ES/changelogs/1397.txt new file mode 100644 index 000000000000..ab66da756831 --- /dev/null +++ b/fastlane/metadata/android/es-ES/changelogs/1397.txt @@ -0,0 +1,5 @@ +23.9: +¡No hay actualizaciones esta semana! Disfruta con estos datos sobre los renos: +- Los renos machos mudan la cornamenta en otoño y las hembras en primavera, por lo que los renos de Papá Noel son hembras. +- En realidad, los renos no tienen la nariz roja. +- Papá Noel no come leche con galletas desde 2003 porque Blitzen siempre llega antes. diff --git a/fastlane/metadata/android/fr-CA/changelogs/1392.txt b/fastlane/metadata/android/fr-CA/changelogs/1392.txt deleted file mode 100644 index 840279f12fa9..000000000000 --- a/fastlane/metadata/android/fr-CA/changelogs/1392.txt +++ /dev/null @@ -1,4 +0,0 @@ -23.8 : -- L’éditeur de blocs affiche l’option « Dégrouper » uniquement pour les blocs imbriqués qui la prennent en charge. -- Le réglage Optimiser les images utilise la taille et la qualité optimales par défaut. -- Les thèmes s’installent correctement pour les sites disposant de plans Business et Commerce. diff --git a/fastlane/metadata/android/fr-CA/changelogs/1397.txt b/fastlane/metadata/android/fr-CA/changelogs/1397.txt new file mode 100644 index 000000000000..a63be7b0a910 --- /dev/null +++ b/fastlane/metadata/android/fr-CA/changelogs/1397.txt @@ -0,0 +1,5 @@ +23.9 : +Pas de mise à jour cette semaine ! À la place, quelques fun facts sur les rennes : +- Chez les rennes, les mâles perdent leurs bois à l’automne et les femelles au printemps, donc les rennes du père Noël sont des femelles. +- En réalité, les rennes n’ont pas le nez rouge. +- Le père Noël n’a pas bu de lait ni mangé de biscuits depuis 2003 parce que Tornade arrive toujours la première. diff --git a/fastlane/metadata/android/fr-FR/changelogs/1392.txt b/fastlane/metadata/android/fr-FR/changelogs/1392.txt deleted file mode 100644 index 840279f12fa9..000000000000 --- a/fastlane/metadata/android/fr-FR/changelogs/1392.txt +++ /dev/null @@ -1,4 +0,0 @@ -23.8 : -- L’éditeur de blocs affiche l’option « Dégrouper » uniquement pour les blocs imbriqués qui la prennent en charge. -- Le réglage Optimiser les images utilise la taille et la qualité optimales par défaut. -- Les thèmes s’installent correctement pour les sites disposant de plans Business et Commerce. diff --git a/fastlane/metadata/android/fr-FR/changelogs/1397.txt b/fastlane/metadata/android/fr-FR/changelogs/1397.txt new file mode 100644 index 000000000000..a63be7b0a910 --- /dev/null +++ b/fastlane/metadata/android/fr-FR/changelogs/1397.txt @@ -0,0 +1,5 @@ +23.9 : +Pas de mise à jour cette semaine ! À la place, quelques fun facts sur les rennes : +- Chez les rennes, les mâles perdent leurs bois à l’automne et les femelles au printemps, donc les rennes du père Noël sont des femelles. +- En réalité, les rennes n’ont pas le nez rouge. +- Le père Noël n’a pas bu de lait ni mangé de biscuits depuis 2003 parce que Tornade arrive toujours la première. diff --git a/fastlane/metadata/android/id/changelogs/1392.txt b/fastlane/metadata/android/id/changelogs/1392.txt deleted file mode 100644 index fb6a341d1604..000000000000 --- a/fastlane/metadata/android/id/changelogs/1392.txt +++ /dev/null @@ -1,4 +0,0 @@ -23.8: -- Editor blok hanya menampilkan pilihan “batalkan pengelompokan” untuk blok bertingkat yang mendukung pilihan tersebut. -- Pengaturan Optimalkan Gambar menerapkan ukuran dan kualitas optimal secara default. -- Tema terinstal dengan benar untuk situs pada paket Bisnis dan Commerce. diff --git a/fastlane/metadata/android/id/changelogs/1397.txt b/fastlane/metadata/android/id/changelogs/1397.txt new file mode 100644 index 000000000000..74628499086b --- /dev/null +++ b/fastlane/metadata/android/id/changelogs/1397.txt @@ -0,0 +1,5 @@ +23.9: +Tidak ada pembaruan minggu ini. Simak fakta-fakta tentang rusa kutub berikut: +- Rusa kutub jantan melepaskan tanduknya pada musim gugur, sedangkan rusa kutub betina melepaskan tanduknya pada musim semi sehingga Sinterklas menggunakan rusa kutub betina. +- Rusa kutub sebenarnya tidak berhidung merah. +- Sinterklas tidak mengonsumsi susu dan kue sejak 2003 karena kalah cepat dengan Blitzen. diff --git a/fastlane/metadata/android/it-IT/changelogs/1392.txt b/fastlane/metadata/android/it-IT/changelogs/1392.txt deleted file mode 100644 index ed362e0d27a8..000000000000 --- a/fastlane/metadata/android/it-IT/changelogs/1392.txt +++ /dev/null @@ -1,4 +0,0 @@ -23.8: -- L'editor a blocchi mostra l'opzione "Non raggruppare" solo per i blocchi nidificati che supportano tale opzione. -- L'impostazione Ottimizza le immagini utilizza dimensioni e qualità ottimali per impostazione predefinita. -- I temi si installano correttamente sui siti con i piani Business e Commerce. diff --git a/fastlane/metadata/android/it-IT/changelogs/1397.txt b/fastlane/metadata/android/it-IT/changelogs/1397.txt new file mode 100644 index 000000000000..ba1ff53c50b7 --- /dev/null +++ b/fastlane/metadata/android/it-IT/changelogs/1397.txt @@ -0,0 +1,5 @@ +23,9: +Nessun aggiornamento questa settimana! Scopri queste curiosità sulle renne: +- Le renne maschio perdono le loro corna in autunno e le femmine in primavera, quindi le renne di Babbo Natale sono femmine. +- Le renne non hanno davvero il naso rosso. +- Babbo Natale non mangia latte e biscotti dal 2003, perché Lampo arriva sempre prima. diff --git a/fastlane/metadata/android/iw-IL/changelogs/1392.txt b/fastlane/metadata/android/iw-IL/changelogs/1392.txt deleted file mode 100644 index a0defa14eb0d..000000000000 --- a/fastlane/metadata/android/iw-IL/changelogs/1392.txt +++ /dev/null @@ -1,4 +0,0 @@ -23.8: -– בעורך הבלוקים האפשרות 'לבטל הקבצה', תוצג עבור בלוקים מקוננים רק אם הם אכן תומכים בכך. -– ההגדרה 'מיטוב תמונות' , ממטבת גודל ואיכות של תמונות כברירת מחדל. -– התקנה של ערכות עיצוב באתרים המנויים על תוכניות לעסקים ולמסחר נעשית באופן תקין. diff --git a/fastlane/metadata/android/iw-IL/changelogs/1397.txt b/fastlane/metadata/android/iw-IL/changelogs/1397.txt new file mode 100644 index 000000000000..d8dc62b2fc42 --- /dev/null +++ b/fastlane/metadata/android/iw-IL/changelogs/1397.txt @@ -0,0 +1,5 @@ +23.9: +השבוע אין עדכונים! הנה כמה עובדות משעשעות על איל הצפון: +– איל הצפון הזכר משיר את קרניו בסתיו והנקבות באביב, כך שכל האילים שמושכים את המזחלת של סנטה הם נקבות. +– לאיל הצפון לא באמת יש אף אדום. +– סנטה לא טעם עוגיות וחלב מאז 2003 כי האיל בליקסן תמיד מקדים אותו. diff --git a/fastlane/metadata/android/ja-JP/changelogs/1392.txt b/fastlane/metadata/android/ja-JP/changelogs/1392.txt deleted file mode 100644 index 7cc463d7cba6..000000000000 --- a/fastlane/metadata/android/ja-JP/changelogs/1392.txt +++ /dev/null @@ -1,4 +0,0 @@ -23.8: -- ブロックエディターには、エディターをサポートするネストされたブロックの「グループ解除」オプションのみが表示されます。 -- 「画像を最適化」設定ではデフォルトで最適なサイズと品質が使用されます。 -- テーマはビジネスプランとコマースプランのサイトに適切にインストールされます。 diff --git a/fastlane/metadata/android/ja-JP/changelogs/1397.txt b/fastlane/metadata/android/ja-JP/changelogs/1397.txt new file mode 100644 index 000000000000..da82b3604cd2 --- /dev/null +++ b/fastlane/metadata/android/ja-JP/changelogs/1397.txt @@ -0,0 +1,5 @@ +23.9: +今週は更新がありません ! トナカイに関する事実は以下をご覧ください。 +- オスのトナカイは秋に、メスは春に角を落とします。つまり、サンタのトナカイはメスです。 +- 実際にトナカイは赤い鼻をしていません。 +- 2003年以来、サンタは牛乳とクッキーを口にしていません。ブリッツェンがいつも始めに到着するからです。 diff --git a/fastlane/metadata/android/ko-KR/changelogs/1392.txt b/fastlane/metadata/android/ko-KR/changelogs/1392.txt deleted file mode 100644 index 6a06ae119237..000000000000 --- a/fastlane/metadata/android/ko-KR/changelogs/1392.txt +++ /dev/null @@ -1,4 +0,0 @@ -23.8: -- 중첩된 블록에서 "그룹 해제" 옵션을 지원하는 경우 해당 옵션만 블록 편집기에 표시됩니다. -- 이미지 최적화 설정에서 기본적으로 최적 크기와 품질을 사용합니다. -- 비즈니스 및 상거래 요금제의 사이트에 테마가 제대로 설치됩니다. diff --git a/fastlane/metadata/android/ko-KR/changelogs/1397.txt b/fastlane/metadata/android/ko-KR/changelogs/1397.txt new file mode 100644 index 000000000000..540bdd39b9f6 --- /dev/null +++ b/fastlane/metadata/android/ko-KR/changelogs/1397.txt @@ -0,0 +1,5 @@ +23.9: +이번 주에는 업데이트가 없습니다! 순록에 대한 재미있는 사실: +- 순록 수컷은 뿔이 가을에 빠지고 순록 암컷은 봄에 빠지므로 산타의 순록은 암컷입니다. +- 순록은 실제로는 빨간 코가 없습니다. +- 순록이 항상 먼저 그곳에 도착하기 때문에 산타는 2003년 이후에 우유와 쿠키를 먹은 적이 없습니다. diff --git a/fastlane/metadata/android/nl-NL/changelogs/1392.txt b/fastlane/metadata/android/nl-NL/changelogs/1392.txt deleted file mode 100644 index a4e199fe9886..000000000000 --- a/fastlane/metadata/android/nl-NL/changelogs/1392.txt +++ /dev/null @@ -1,4 +0,0 @@ -23.8: -- Blokeditor toont alleen de optie 'Groepering opheffen' voor genestelde blokken die dat ondersteunen. -- De instelling voor Afbeeldingen optimaliseren gebruikt standaard de optimale afmetingen en kwaliteit. -- Thema's worden correct geïnstalleerd voor sites met Business- en Commerce-abonnementen. diff --git a/fastlane/metadata/android/nl-NL/changelogs/1397.txt b/fastlane/metadata/android/nl-NL/changelogs/1397.txt new file mode 100644 index 000000000000..586fa9c1d868 --- /dev/null +++ b/fastlane/metadata/android/nl-NL/changelogs/1397.txt @@ -0,0 +1,5 @@ +23.9: +Er zijn geen updates deze week. Wat leuke rendierfeitjes: +-Mannetjes rendieren werpen hun gewei in de herfst af en vrouwtjes in de lente, dus de rendieren van de Kerstman zijn vrouwtjes. +- Rendieren hebben niet echt een rode neus. +- De Kerstman heeft sinds 2003 geen melk en koekjes meer gehad omdat Blitzen hem altijd voor is. diff --git a/fastlane/metadata/android/ru-RU/changelogs/1392.txt b/fastlane/metadata/android/ru-RU/changelogs/1392.txt deleted file mode 100644 index 9bb1b0e7f020..000000000000 --- a/fastlane/metadata/android/ru-RU/changelogs/1392.txt +++ /dev/null @@ -1,4 +0,0 @@ -23.8: -- Опция «Разгруппировать» отображается в редакторе блоков только для тех вложенных блоков, которые её поддерживают. -- Настройка «Оптимизировать изображение» по умолчанию устанавливает для изображения оптимальные размер и качество. -- На сайтах, работающих по тарифным планам Business и Commerce, темы устанавливаются правильно. diff --git a/fastlane/metadata/android/ru-RU/changelogs/1397.txt b/fastlane/metadata/android/ru-RU/changelogs/1397.txt new file mode 100644 index 000000000000..73ad23aa16b5 --- /dev/null +++ b/fastlane/metadata/android/ru-RU/changelogs/1397.txt @@ -0,0 +1,5 @@ +23.9: +На этой неделе нет обновлений. Вместо этого интересные факты об оленях. +- Олени-самцы сбрасывают рога осенью, а самки — весной, значит, олени Санты — самки. +- Нос у оленя не красного цвета. +- Санта не пробовал молока с печеньем с 2003 года, потому что олень Блитцен успевает сожрать всё первым. diff --git a/fastlane/metadata/android/sv-SE/changelogs/1392.txt b/fastlane/metadata/android/sv-SE/changelogs/1392.txt deleted file mode 100644 index 6950684baf9d..000000000000 --- a/fastlane/metadata/android/sv-SE/changelogs/1392.txt +++ /dev/null @@ -1,4 +0,0 @@ -23.8: -- Blockredigeraren visar endast alternativet "avgruppera" för inbäddade block som stöder detta. -- Inställningen Optimera bilder använder optimal storlek och kvalitet som standard. -- Teman installeras korrekt för webbplatser med Business- och Commerce-paket. diff --git a/fastlane/metadata/android/sv-SE/changelogs/1397.txt b/fastlane/metadata/android/sv-SE/changelogs/1397.txt new file mode 100644 index 000000000000..0e5216c4b438 --- /dev/null +++ b/fastlane/metadata/android/sv-SE/changelogs/1397.txt @@ -0,0 +1,5 @@ +23.9: +Inga uppdateringar den här veckan. Här kommer lite fakta om renar: +- Hanrenar fäller sina horn på hösten och honor på våren, så tomtens renar är honor. +- Renar har egentligen inte röda nosar. +- Tomten har inte ätit mjölk och kakor sedan 2003 eftersom Blitzen alltid kommer fram först. diff --git a/fastlane/metadata/android/tr-TR/changelogs/1392.txt b/fastlane/metadata/android/tr-TR/changelogs/1392.txt deleted file mode 100644 index fa0bc7812374..000000000000 --- a/fastlane/metadata/android/tr-TR/changelogs/1392.txt +++ /dev/null @@ -1,4 +0,0 @@ -23.8: -- Blok düzenleyici "grubu ayır" seçeneğini yalnızca bu seçeneği destekleyen iç içe geçmiş bloklar için gösterir. -- Görselleri İyileştirme ayarı varsayılan olarak ideal boyut ve kaliteyi kullanır. -- Kurumsal pakette ve Ticaret paketinde temalar sitelerde düzgün yüklenir. diff --git a/fastlane/metadata/android/tr-TR/changelogs/1397.txt b/fastlane/metadata/android/tr-TR/changelogs/1397.txt new file mode 100644 index 000000000000..bc882af3c36b --- /dev/null +++ b/fastlane/metadata/android/tr-TR/changelogs/1397.txt @@ -0,0 +1,5 @@ +23.9: +Bu hafta güncelleme yok! Bu ren geyiği gerçeklerinin tadını çıkarın: +-Erkek ren geyiği boynuzlarını sonbaharda, dişiler ise ilkbaharda döker; dolayısıyla Noel Baba'nın ren geyiği dişidir. +- Ren geyiklerinin aslında kırmızı burunları yoktur. +- Noel Baba 2003'ten beri süt ve kurabiye yemiyor çünkü Blitzen oraya her zaman önce varıyor. diff --git a/fastlane/metadata/android/zh-CN/changelogs/1392.txt b/fastlane/metadata/android/zh-CN/changelogs/1392.txt deleted file mode 100644 index fc7127fbc6a0..000000000000 --- a/fastlane/metadata/android/zh-CN/changelogs/1392.txt +++ /dev/null @@ -1,4 +0,0 @@ -23.8: -- 在区块编辑器中,仅支持“取消分组”选项的嵌套区块会显示该选项。 -- 优化图像设置为默认使用最佳尺寸和质量。 -- 采用商务版和电子商务版套餐的站点可正常安装主题。 diff --git a/fastlane/metadata/android/zh-CN/changelogs/1397.txt b/fastlane/metadata/android/zh-CN/changelogs/1397.txt new file mode 100644 index 000000000000..69a9666e750b --- /dev/null +++ b/fastlane/metadata/android/zh-CN/changelogs/1397.txt @@ -0,0 +1,5 @@ +23.9: +本周无更新! 我们将与您分享一些关于驯鹿的冷知识: +- 雄性驯鹿在秋天脱角,雌性驯鹿在春天脱角,所以圣诞老人驾驶的驯鹿都是雌性的。 +- 驯鹿的鼻子并不是红色的。 +- 自 2003 年以来,圣诞老人就再也没吃过牛奶和饼干了,因为他的驯鹿闪电总是抢先一步。 diff --git a/fastlane/metadata/android/zh-TW/changelogs/1392.txt b/fastlane/metadata/android/zh-TW/changelogs/1392.txt deleted file mode 100644 index 51ef47bab3da..000000000000 --- a/fastlane/metadata/android/zh-TW/changelogs/1392.txt +++ /dev/null @@ -1,4 +0,0 @@ -23.8: -- 只有區塊編輯器中支援「取消群組」功能的內嵌區塊,才會顯示對應選項。 -- 「最佳化圖片」設定預設為最佳大小和畫質。 -- 商用版和電子商務版方案網站可正常安裝佈景主題。 diff --git a/fastlane/metadata/android/zh-TW/changelogs/1397.txt b/fastlane/metadata/android/zh-TW/changelogs/1397.txt new file mode 100644 index 000000000000..1565a62b1dda --- /dev/null +++ b/fastlane/metadata/android/zh-TW/changelogs/1397.txt @@ -0,0 +1,5 @@ +23.9: +本週沒有更新! 但讓我們分享一些關於麋鹿的小知識: +- 公麋鹿會在秋天脫角,而母麋鹿則是在春天脫角,所以聖誕老人的麋鹿是母的。 +- 麋鹿實際上沒有紅鼻子。 +- 聖誕老人自 2003 年就沒享用過牛奶和餅乾了,因為麋鹿「閃電」總是搶先一步。 diff --git a/fastlane/resources/values/strings.xml b/fastlane/resources/values/strings.xml index c5abc53d61f1..ad913439331d 100644 --- a/fastlane/resources/values/strings.xml +++ b/fastlane/resources/values/strings.xml @@ -2328,7 +2328,7 @@ Create a new site for your business, magazine, or personal blog; or connect an existing WordPress installation. You don\'t have any sites Add new site - All WordPress.com plans include a custom domain name. Register your free premium domain now. + All WordPress.com annual plans include a custom domain name. Register your free domain now. Verify your email address - instructions sent to %s Verify your email address - instructions sent to your email Site Icon @@ -2660,7 +2660,7 @@ Register Domain Select domain No suggestions found - Choose a premium domain name + Choose a custom domain name This is where people will find you on the internet. Type a keyword for more ideas %s<span style="color:#50575e;"> /year</span> @@ -2692,16 +2692,14 @@ Select State Registering domain name… - Your free WordPress.com address is - Change site address - %s - Primary site address - Your site domains + %s + Primary domain + Other domains for %s + Your free WordPress.com domain Expires on %s + Never expires <span style="color:#d63638;">Expires on %s</span> Add a domain - Your domains will redirect to your site at %s - Manage Domains Claim your free domain You have a free one-year domain registration included with your plan Add your domain @@ -2709,6 +2707,9 @@ Get your domain Domains purchased on this site will redirect visitors to <b>%s</b> Search for a domain + Get a free one-year domain registration or transfer with any annual paid plan. + Upgrade to a plan + Just search for a domain Expires %1$s @@ -4576,13 +4577,6 @@ translators: %s: Select control option value e.g: "Auto, 25%". --> Contact support Close - - News - Reclaim Your Google Domains - As you may know, Google Domains has been sold to Squarespace. Transfer your domains to WordPress.com now, and we\'ll pay all transfer fees plus an extra year of your domain registration. - Transfer your domains - @string/my_site_dashboard_card_more_menu_hide_card - Free domain with annual plan Get a free domain for the first year, remove ads on your site, and increase your storage. @@ -4820,6 +4814,8 @@ translators: %s: Select control option value e.g: "Auto, 25%". --> For this reason, we recommend editing the block using the web editor. For this reason, we recommend editing the block using your web browser. + We cannot open media at the moment. Please try again later + Bloganuary is coming! Bloganuary is here! @@ -4835,9 +4831,14 @@ translators: %s: Select control option value e.g: "Auto, 25%". --> Turn on blogging prompts Let’s go! - State of the Word 2023 Check out WordPress co-founder Matt Mullenweg’s annual keynote to stay on top of what’s coming in 2024 and beyond. Watch now + File type not supported as a media file. + Font Size, %1$s + Network connection lost, working offline + Network connection re-established + Working Offline + diff --git a/libs/analytics/src/main/java/org/wordpress/android/analytics/AnalyticsTracker.java b/libs/analytics/src/main/java/org/wordpress/android/analytics/AnalyticsTracker.java index 6ac803c4199a..28c466bd1e75 100644 --- a/libs/analytics/src/main/java/org/wordpress/android/analytics/AnalyticsTracker.java +++ b/libs/analytics/src/main/java/org/wordpress/android/analytics/AnalyticsTracker.java @@ -1098,7 +1098,8 @@ public enum Stat { DYNAMIC_DASHBOARD_CARD_SHOWN, DYNAMIC_DASHBOARD_CARD_TAPPED, DYNAMIC_DASHBOARD_CARD_CTA_TAPPED, - DYNAMIC_DASHBOARD_CARD_HIDE_TAPPED + DYNAMIC_DASHBOARD_CARD_HIDE_TAPPED, + DEEP_LINK_FAILED } private static final List TRACKERS = new ArrayList<>(); diff --git a/libs/analytics/src/main/java/org/wordpress/android/analytics/AnalyticsTrackerNosara.java b/libs/analytics/src/main/java/org/wordpress/android/analytics/AnalyticsTrackerNosara.java index 76e1853782a9..8d863c39dfd6 100644 --- a/libs/analytics/src/main/java/org/wordpress/android/analytics/AnalyticsTrackerNosara.java +++ b/libs/analytics/src/main/java/org/wordpress/android/analytics/AnalyticsTrackerNosara.java @@ -2691,6 +2691,8 @@ public static String getEventNameForStat(AnalyticsTracker.Stat stat) { return "dynamic_dashboard_card_cta_tapped"; case DYNAMIC_DASHBOARD_CARD_HIDE_TAPPED: return "dynamic_dashboard_card_hide_tapped"; + case DEEP_LINK_FAILED: + return "deep_link_failed"; } return null; } diff --git a/version.properties b/version.properties index eeed2f19ece5..0a755af12895 100644 --- a/version.properties +++ b/version.properties @@ -1,2 +1,2 @@ -versionName=23.9-rc-3 -versionCode=1396 \ No newline at end of file +versionName=24.0-rc-1 +versionCode=1399 \ No newline at end of file