diff --git a/WordPress/src/main/AndroidManifest.xml b/WordPress/src/main/AndroidManifest.xml
index ae6d2bbd5899..ecd7635c5fe4 100644
--- a/WordPress/src/main/AndroidManifest.xml
+++ b/WordPress/src/main/AndroidManifest.xml
@@ -849,6 +849,11 @@
android:name=".ui.jetpackplugininstall.fullplugin.install.JetpackFullPluginInstallActivity"
android:theme="@style/WordPress.NoActionBar" />
+
+
+
Unit),
+ onCloseClick: () -> Unit,
+ modifier: Modifier = Modifier
+) {
+ AppThemeM3 {
+ Scaffold(
+ topBar = {
+ TopAppBar(
+ title = { Text(stringResource(id = titleRes)) },
+ navigationIcon = {
+ IconButton(onClick = onCloseClick) {
+ Icon(Icons.Filled.Close, stringResource(R.string.close))
+ }
+ },
+ )
+ },
+ modifier = modifier,
+ ) { contentPadding ->
+ Column(
+ modifier = Modifier
+ .fillMaxSize()
+ .imePadding()
+ .padding(contentPadding)
+ ) {
+ content()
+ }
+ }
+ }
+}
diff --git a/WordPress/src/main/java/org/wordpress/android/ui/jetpackconnection/JetpackConnectionActivity.kt b/WordPress/src/main/java/org/wordpress/android/ui/jetpackconnection/JetpackConnectionActivity.kt
new file mode 100644
index 000000000000..2e74f5da8066
--- /dev/null
+++ b/WordPress/src/main/java/org/wordpress/android/ui/jetpackconnection/JetpackConnectionActivity.kt
@@ -0,0 +1,58 @@
+package org.wordpress.android.ui.jetpackconnection
+
+import android.content.Context
+import android.content.Intent
+import android.os.Bundle
+import androidx.activity.viewModels
+import androidx.compose.runtime.collectAsState
+import androidx.lifecycle.lifecycleScope
+import com.google.android.material.dialog.MaterialAlertDialogBuilder
+import dagger.hilt.android.AndroidEntryPoint
+import kotlinx.coroutines.flow.filterNotNull
+import kotlinx.coroutines.launch
+import org.wordpress.android.R
+import org.wordpress.android.ui.main.BaseAppCompatActivity
+import org.wordpress.android.util.extensions.setContent
+
+@AndroidEntryPoint
+class JetpackConnectionActivity : BaseAppCompatActivity() {
+ private val viewModel: JetpackConnectionViewModel by viewModels()
+
+ override fun onCreate(savedInstanceState: Bundle?) {
+ super.onCreate(savedInstanceState)
+ setContent {
+ JetpackConnectionScreen(
+ currentStep = viewModel.currentStep.collectAsState(),
+ stepStates = viewModel.stepStates.collectAsState(),
+ buttonType = viewModel.buttonType.collectAsState(),
+ onCloseClick = viewModel::onCloseClick,
+ onRetryClick = viewModel::onRetryClick
+ )
+ }
+
+ lifecycleScope.launch {
+ viewModel.uiEvent.filterNotNull().collect { event ->
+ when (event) {
+ JetpackConnectionViewModel.UiEvent.Close -> finish()
+ JetpackConnectionViewModel.UiEvent.ShowCancelConfirmation -> showCancelConfirmationDialog()
+ }
+ }
+ }
+ }
+
+ private fun showCancelConfirmationDialog() {
+ MaterialAlertDialogBuilder(this)
+ .setTitle(R.string.jetpack_connection_cancel_title)
+ .setMessage(R.string.jetpack_connection_cancel_message)
+ .setPositiveButton(R.string.yes) { _, _ -> viewModel.onCancelConfirmed() }
+ .setNegativeButton(R.string.no) { _, _ -> viewModel.onCancelDismissed() }
+ .setCancelable(false)
+ .show()
+ }
+
+ companion object {
+ @JvmStatic
+ fun createIntent(context: Context) =
+ Intent(context, JetpackConnectionActivity::class.java)
+ }
+}
diff --git a/WordPress/src/main/java/org/wordpress/android/ui/jetpackconnection/JetpackConnectionScreen.kt b/WordPress/src/main/java/org/wordpress/android/ui/jetpackconnection/JetpackConnectionScreen.kt
new file mode 100644
index 000000000000..8216d14b1e1b
--- /dev/null
+++ b/WordPress/src/main/java/org/wordpress/android/ui/jetpackconnection/JetpackConnectionScreen.kt
@@ -0,0 +1,419 @@
+package org.wordpress.android.ui.jetpackconnection
+
+import android.content.Context
+import android.content.res.Configuration
+import androidx.annotation.ColorRes
+import androidx.annotation.StringRes
+import androidx.compose.animation.AnimatedVisibility
+import androidx.compose.animation.animateColorAsState
+import androidx.compose.animation.core.animateFloatAsState
+import androidx.compose.animation.fadeIn
+import androidx.compose.foundation.background
+import androidx.compose.foundation.layout.Arrangement
+import androidx.compose.foundation.layout.Column
+import androidx.compose.foundation.layout.Row
+import androidx.compose.foundation.layout.Spacer
+import androidx.compose.foundation.layout.fillMaxWidth
+import androidx.compose.foundation.layout.height
+import androidx.compose.foundation.layout.padding
+import androidx.compose.foundation.layout.size
+import androidx.compose.foundation.layout.width
+import androidx.compose.foundation.rememberScrollState
+import androidx.compose.foundation.verticalScroll
+import androidx.compose.material.icons.Icons
+import androidx.compose.material.icons.filled.AccountCircle
+import androidx.compose.material.icons.filled.Build
+import androidx.compose.material.icons.filled.Check
+import androidx.compose.material.icons.filled.CheckCircle
+import androidx.compose.material.icons.filled.Home
+import androidx.compose.material.icons.filled.Settings
+import androidx.compose.material.icons.filled.Warning
+import androidx.compose.material3.CircularProgressIndicator
+import androidx.compose.material3.Icon
+import androidx.compose.material3.MaterialTheme
+import androidx.compose.material3.Text
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.State
+import androidx.compose.runtime.getValue
+import androidx.compose.runtime.mutableStateOf
+import androidx.compose.runtime.remember
+import androidx.compose.ui.Alignment
+import androidx.compose.ui.Modifier
+import androidx.compose.ui.draw.alpha
+import androidx.compose.ui.draw.clip
+import androidx.compose.ui.draw.shadow
+import androidx.compose.ui.graphics.Color
+import androidx.compose.ui.graphics.vector.ImageVector
+import androidx.compose.ui.platform.LocalContext
+import androidx.compose.ui.res.colorResource
+import androidx.compose.ui.res.stringResource
+import androidx.compose.ui.text.font.FontWeight
+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.ScreenWithTopAppBarM3
+import org.wordpress.android.ui.compose.components.buttons.PrimaryButtonM3
+import org.wordpress.android.ui.jetpackconnection.JetpackConnectionViewModel.ButtonType
+import org.wordpress.android.ui.jetpackconnection.JetpackConnectionViewModel.ConnectionStatus
+import org.wordpress.android.ui.jetpackconnection.JetpackConnectionViewModel.ConnectionStep
+import org.wordpress.android.ui.jetpackconnection.JetpackConnectionViewModel.ErrorType
+import org.wordpress.android.ui.jetpackconnection.JetpackConnectionViewModel.StepState
+
+@Composable
+fun JetpackConnectionScreen(
+ currentStep: State,
+ stepStates: State