@@ -42,14 +42,18 @@ import com.example.gutenbergkit.ui.dialogs.AddConfigurationDialog
4242import com.example.gutenbergkit.ui.dialogs.DeleteConfigurationDialog
4343import com.example.gutenbergkit.ui.dialogs.DiscoveringSiteDialog
4444import com.example.gutenbergkit.ui.theme.AppTheme
45+ import androidx.lifecycle.lifecycleScope
46+ import kotlinx.coroutines.launch
4547import org.wordpress.gutenberg.BuildConfig
4648import org.wordpress.gutenberg.EditorConfiguration
4749
4850class MainActivity : ComponentActivity (), AuthenticationManager.AuthenticationCallback {
4951 private val configurations = mutableStateListOf<ConfigurationItem >()
5052 private val isDiscoveringSite = mutableStateOf(false )
53+ private val isLoadingCapabilities = mutableStateOf(false )
5154 private lateinit var configurationStorage: ConfigurationStorage
5255 private lateinit var authenticationManager: AuthenticationManager
56+ private val siteCapabilitiesDiscovery = SiteCapabilitiesDiscovery ()
5357
5458 companion object {
5559 const val EXTRA_CONFIGURATION = " configuration"
@@ -75,7 +79,7 @@ class MainActivity : ComponentActivity(), AuthenticationManager.AuthenticationCa
7579 onConfigurationClick = { config ->
7680 when (config) {
7781 is ConfigurationItem .BundledEditor -> launchEditor(createBundledConfiguration())
78- is ConfigurationItem .RemoteEditor -> launchEditor(createRemoteConfiguration( config) )
82+ is ConfigurationItem .RemoteEditor -> loadRemoteEditor( config)
7983 }
8084 },
8185 onConfigurationLongClick = { config ->
@@ -93,7 +97,8 @@ class MainActivity : ComponentActivity(), AuthenticationManager.AuthenticationCa
9397 configurationStorage.saveConfigurations(configurations)
9498 },
9599 isDiscoveringSite = isDiscoveringSite.value,
96- onDismissDiscovering = { isDiscoveringSite.value = false }
100+ onDismissDiscovering = { isDiscoveringSite.value = false },
101+ isLoadingCapabilities = isLoadingCapabilities.value
97102 )
98103 }
99104 }
@@ -110,14 +115,42 @@ class MainActivity : ComponentActivity(), AuthenticationManager.AuthenticationCa
110115 .setCookies(emptyMap())
111116 .build()
112117
113- private fun createRemoteConfiguration (config : ConfigurationItem .RemoteEditor ): EditorConfiguration =
114- createCommonConfigurationBuilder()
115- .setPlugins(true )
116- .setSiteURL(config.siteUrl)
117- .setSiteApiRoot(config.siteApiRoot)
118- .setNamespaceExcludedPaths(arrayOf())
119- .setAuthHeader(config.authHeader)
120- .build()
118+ private fun loadRemoteEditor (config : ConfigurationItem .RemoteEditor ) {
119+ isLoadingCapabilities.value = true
120+
121+ lifecycleScope.launch {
122+ try {
123+ val capabilities = siteCapabilitiesDiscovery.discoverCapabilities(
124+ siteApiRoot = config.siteApiRoot
125+ )
126+
127+ val editorConfiguration = createCommonConfigurationBuilder()
128+ .setPlugins(capabilities.supportsPlugins)
129+ .setThemeStyles(capabilities.supportsThemeStyles)
130+ .setSiteURL(config.siteUrl)
131+ .setSiteApiRoot(config.siteApiRoot)
132+ .setNamespaceExcludedPaths(arrayOf())
133+ .setAuthHeader(config.authHeader)
134+ .build()
135+
136+ isLoadingCapabilities.value = false
137+ launchEditor(editorConfiguration)
138+ } catch (e: Exception ) {
139+ isLoadingCapabilities.value = false
140+ // If capability discovery fails, use default configuration
141+ val defaultConfiguration = createCommonConfigurationBuilder()
142+ .setPlugins(false )
143+ .setThemeStyles(false )
144+ .setSiteURL(config.siteUrl)
145+ .setSiteApiRoot(config.siteApiRoot)
146+ .setNamespaceExcludedPaths(arrayOf())
147+ .setAuthHeader(config.authHeader)
148+ .build()
149+
150+ launchEditor(defaultConfiguration)
151+ }
152+ }
153+ }
121154
122155 private fun createCommonConfigurationBuilder (): EditorConfiguration .Builder =
123156 EditorConfiguration .builder()
@@ -171,7 +204,8 @@ fun MainScreen(
171204 onAddConfiguration : (String ) -> Unit ,
172205 onDeleteConfiguration : (ConfigurationItem ) -> Unit ,
173206 isDiscoveringSite : Boolean = false,
174- onDismissDiscovering : () -> Unit = {}
207+ onDismissDiscovering : () -> Unit = {},
208+ isLoadingCapabilities : Boolean = false
175209) {
176210 var showAddDialog = remember { mutableStateOf(false ) }
177211 var showDeleteDialog = remember { mutableStateOf<ConfigurationItem .RemoteEditor ?>(null ) }
@@ -295,6 +329,12 @@ fun MainScreen(
295329 onDismiss = onDismissDiscovering
296330 )
297331 }
332+
333+ if (isLoadingCapabilities) {
334+ DiscoveringSiteDialog (
335+ onDismiss = { /* Cannot dismiss while loading */ }
336+ )
337+ }
298338}
299339
300340@OptIn(androidx.compose.foundation.ExperimentalFoundationApi ::class )
0 commit comments