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