From 52479ae75b9edd90466046da460249c2c3c5c292 Mon Sep 17 00:00:00 2001 From: adalpari Date: Mon, 5 May 2025 14:23:02 +0200 Subject: [PATCH 1/8] Adding logic to the LoginViewModel --- .../android/ui/accounts/LoginActivity.java | 38 ++++++++++++------- .../android/ui/accounts/LoginViewModel.kt | 33 ++++++++++++++-- 2 files changed, 53 insertions(+), 18 deletions(-) diff --git a/WordPress/src/main/java/org/wordpress/android/ui/accounts/LoginActivity.java b/WordPress/src/main/java/org/wordpress/android/ui/accounts/LoginActivity.java index bfe074e7841e..1190ddf79cad 100644 --- a/WordPress/src/main/java/org/wordpress/android/ui/accounts/LoginActivity.java +++ b/WordPress/src/main/java/org/wordpress/android/ui/accounts/LoginActivity.java @@ -481,14 +481,7 @@ public void showWPcomLoginScreen(@NonNull Context context) { AnalyticsTracker.track(AnalyticsTracker.Stat.LOGIN_WPCOM_WEBVIEW); mUnifiedLoginTracker.setFlowAndStep(Flow.WORDPRESS_COM_WEB, Step.WPCOM_WEB_START); - CustomTabsIntent intent = new CustomTabsIntent.Builder() - .setShareState(CustomTabsIntent.SHARE_STATE_OFF) - .setStartAnimations(this, R.anim.activity_slide_in_from_right, R.anim.activity_slide_out_to_left) - .setExitAnimations(this, R.anim.activity_slide_in_from_left, R.anim.activity_slide_out_to_right) - .setUrlBarHidingEnabled(true) - .setInstantAppsEnabled(false) - .setShowTitle(false) - .build(); + CustomTabsIntent intent = getCustomTabsIntent(); Uri loginUri = mLoginHelper.getWpcomLoginUri(); try { @@ -499,6 +492,17 @@ public void showWPcomLoginScreen(@NonNull Context context) { } } + @NonNull private CustomTabsIntent getCustomTabsIntent() { + return new CustomTabsIntent.Builder() + .setShareState(CustomTabsIntent.SHARE_STATE_OFF) + .setStartAnimations(this, R.anim.activity_slide_in_from_right, R.anim.activity_slide_out_to_left) + .setExitAnimations(this, R.anim.activity_slide_in_from_left, R.anim.activity_slide_out_to_right) + .setUrlBarHidingEnabled(true) + .setInstantAppsEnabled(false) + .setShowTitle(false) + .build(); + } + @Override public void onTermsOfServiceClicked() { AnalyticsTracker.track(AnalyticsTracker.Stat.SIGNUP_TERMS_OF_SERVICE_TAPPED); @@ -699,13 +703,19 @@ public void gotXmlRpcEndpoint(String inputSiteAddress, String endpointAddress) { slideInFragment(loginUsernamePasswordFragment, true, LoginUsernamePasswordFragment.TAG); // In the background, run the API discovery test to see if we can add this site for the REST API + String authorizationUrl = mViewModel.runApiDiscoveryTest(inputSiteAddress); +// gotRestEndpoint(inputSiteAddress, authorizationUrl); + } + + public void gotRestEndpoint(String inputSiteAddress, String endpointAddress) { + CustomTabsIntent intent = getCustomTabsIntent(); + + Uri loginUri = Uri.parse(endpointAddress); try { - String authorizationUrl = mViewModel.runApiDiscoveryTest(inputSiteAddress); - Log.d("WP_RS", "Found authorization URL: " + authorizationUrl); - AnalyticsTracker.track(Stat.BACKGROUND_REST_AUTODISCOVERY_SUCCESSFUL); - } catch (Exception ex) { - Log.e("WP_RS", "Unable to find authorization URL:" + ex.getMessage()); - AnalyticsTracker.track(Stat.BACKGROUND_REST_AUTODISCOVERY_FAILED); + intent.launchUrl(this, loginUri); + } catch (SecurityException | ActivityNotFoundException e) { + AppLog.e(AppLog.T.UTILS, "Error opening login uri in CustomTabsIntent, attempting external browser", e); + ActivityLauncher.openUrlExternal(this, loginUri.toString()); } } diff --git a/WordPress/src/main/java/org/wordpress/android/ui/accounts/LoginViewModel.kt b/WordPress/src/main/java/org/wordpress/android/ui/accounts/LoginViewModel.kt index 289192c3338b..e5581a118eb4 100644 --- a/WordPress/src/main/java/org/wordpress/android/ui/accounts/LoginViewModel.kt +++ b/WordPress/src/main/java/org/wordpress/android/ui/accounts/LoginViewModel.kt @@ -1,9 +1,11 @@ package org.wordpress.android.ui.accounts +import android.util.Log import androidx.lifecycle.LiveData import androidx.lifecycle.MediatorLiveData import androidx.lifecycle.ViewModel import kotlinx.coroutines.runBlocking +import org.wordpress.android.analytics.AnalyticsTracker import org.wordpress.android.fluxc.store.AccountStore.AuthEmailPayloadScheme import org.wordpress.android.fluxc.store.SiteStore.ConnectSiteInfoPayload import org.wordpress.android.ui.accounts.LoginNavigationEvents.ShowNoJetpackSites @@ -13,8 +15,14 @@ import org.wordpress.android.viewmodel.Event import rs.wordpress.api.kotlin.WpLoginClient import javax.inject.Inject import kotlin.text.RegexOption.IGNORE_CASE +import androidx.core.net.toUri +import org.wordpress.android.fluxc.network.rest.wpcom.auth.AppSecrets -class LoginViewModel @Inject constructor(private val buildConfigWrapper: BuildConfigWrapper) : ViewModel() { +class LoginViewModel @Inject constructor( + private val buildConfigWrapper: BuildConfigWrapper, + private val wpLoginClient: WpLoginClient, + private val appSecrets: AppSecrets +) : ViewModel() { private val _navigationEvents = MediatorLiveData>() val navigationEvents: LiveData> = _navigationEvents @@ -34,8 +42,25 @@ class LoginViewModel @Inject constructor(private val buildConfigWrapper: BuildCo AuthEmailPayloadScheme.WORDPRESS } - fun runApiDiscoveryTest(input: String) = runBlocking { - val urlDiscovery = WpLoginClient().apiDiscovery(input) - urlDiscovery.apiDetails.findApplicationPasswordsAuthenticationUrl() + fun runApiDiscoveryTest(url: String): String = runBlocking { + try { + val urlDiscovery = wpLoginClient.apiDiscovery(url) + val authorizationUrl = urlDiscovery.apiDetails.findApplicationPasswordsAuthenticationUrl() + val authorizationUrlComplete = if (authorizationUrl.isNullOrEmpty()) { + authorizationUrl + } else { + authorizationUrl.toUri().buildUpon().apply { + appendQueryParameter("app_name", "android-jetpack-client") + appendQueryParameter("success_url", appSecrets.redirectUri) + }.build().toString() + } + Log.d("WP_RS", "Found authorization for $url URL: $authorizationUrlComplete") + AnalyticsTracker.track(AnalyticsTracker.Stat.BACKGROUND_REST_AUTODISCOVERY_SUCCESSFUL) + authorizationUrlComplete.orEmpty() + } catch (throwable: Throwable) { + Log.e("WP_RS", "VM: Error during API discovery for $url", throwable) + AnalyticsTracker.track(AnalyticsTracker.Stat.BACKGROUND_REST_AUTODISCOVERY_FAILED) + "" + } } } From af180ede05b195906144732684adabe1ba912518 Mon Sep 17 00:00:00 2001 From: adalpari Date: Mon, 5 May 2025 14:36:22 +0200 Subject: [PATCH 2/8] detekt and style --- .../java/org/wordpress/android/ui/accounts/LoginActivity.java | 2 -- .../java/org/wordpress/android/ui/accounts/LoginViewModel.kt | 1 + 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/WordPress/src/main/java/org/wordpress/android/ui/accounts/LoginActivity.java b/WordPress/src/main/java/org/wordpress/android/ui/accounts/LoginActivity.java index 1190ddf79cad..145346cc1db7 100644 --- a/WordPress/src/main/java/org/wordpress/android/ui/accounts/LoginActivity.java +++ b/WordPress/src/main/java/org/wordpress/android/ui/accounts/LoginActivity.java @@ -6,7 +6,6 @@ import android.content.Intent; import android.net.Uri; import android.os.Bundle; -import android.util.Log; import android.view.MenuItem; import androidx.annotation.NonNull; @@ -24,7 +23,6 @@ import org.wordpress.android.R; import org.wordpress.android.analytics.AnalyticsTracker; -import org.wordpress.android.analytics.AnalyticsTracker.Stat; import org.wordpress.android.fluxc.model.SiteModel; import org.wordpress.android.fluxc.network.MemorizingTrustManager; import org.wordpress.android.fluxc.store.AccountStore.AuthEmailPayloadScheme; diff --git a/WordPress/src/main/java/org/wordpress/android/ui/accounts/LoginViewModel.kt b/WordPress/src/main/java/org/wordpress/android/ui/accounts/LoginViewModel.kt index e5581a118eb4..56e8013990e3 100644 --- a/WordPress/src/main/java/org/wordpress/android/ui/accounts/LoginViewModel.kt +++ b/WordPress/src/main/java/org/wordpress/android/ui/accounts/LoginViewModel.kt @@ -42,6 +42,7 @@ class LoginViewModel @Inject constructor( AuthEmailPayloadScheme.WORDPRESS } + @Suppress("TooGenericExceptionCaught") fun runApiDiscoveryTest(url: String): String = runBlocking { try { val urlDiscovery = wpLoginClient.apiDiscovery(url) From dfb4deb53179e438314b15e03e5120162e8093de Mon Sep 17 00:00:00 2001 From: adalpari Date: Mon, 5 May 2025 14:58:05 +0200 Subject: [PATCH 3/8] Extrractinv the URKl construction into a helper --- .../android/ui/accounts/LoginViewModel.kt | 14 ++++---------- .../android/ui/accounts/login/WPcomLoginHelper.kt | 14 +++++++++++++- 2 files changed, 17 insertions(+), 11 deletions(-) diff --git a/WordPress/src/main/java/org/wordpress/android/ui/accounts/LoginViewModel.kt b/WordPress/src/main/java/org/wordpress/android/ui/accounts/LoginViewModel.kt index 56e8013990e3..46567df92e5c 100644 --- a/WordPress/src/main/java/org/wordpress/android/ui/accounts/LoginViewModel.kt +++ b/WordPress/src/main/java/org/wordpress/android/ui/accounts/LoginViewModel.kt @@ -17,11 +17,12 @@ import javax.inject.Inject import kotlin.text.RegexOption.IGNORE_CASE import androidx.core.net.toUri import org.wordpress.android.fluxc.network.rest.wpcom.auth.AppSecrets +import org.wordpress.android.ui.accounts.login.WPcomLoginHelper class LoginViewModel @Inject constructor( private val buildConfigWrapper: BuildConfigWrapper, private val wpLoginClient: WpLoginClient, - private val appSecrets: AppSecrets + private val wpComLoginHelper: WPcomLoginHelper ) : ViewModel() { private val _navigationEvents = MediatorLiveData>() val navigationEvents: LiveData> = _navigationEvents @@ -47,17 +48,10 @@ class LoginViewModel @Inject constructor( try { val urlDiscovery = wpLoginClient.apiDiscovery(url) val authorizationUrl = urlDiscovery.apiDetails.findApplicationPasswordsAuthenticationUrl() - val authorizationUrlComplete = if (authorizationUrl.isNullOrEmpty()) { - authorizationUrl - } else { - authorizationUrl.toUri().buildUpon().apply { - appendQueryParameter("app_name", "android-jetpack-client") - appendQueryParameter("success_url", appSecrets.redirectUri) - }.build().toString() - } + val authorizationUrlComplete = wpComLoginHelper.appendParamsToRestAuthorizationUrl(authorizationUrl) Log.d("WP_RS", "Found authorization for $url URL: $authorizationUrlComplete") AnalyticsTracker.track(AnalyticsTracker.Stat.BACKGROUND_REST_AUTODISCOVERY_SUCCESSFUL) - authorizationUrlComplete.orEmpty() + authorizationUrlComplete } catch (throwable: Throwable) { Log.e("WP_RS", "VM: Error during API discovery for $url", throwable) AnalyticsTracker.track(AnalyticsTracker.Stat.BACKGROUND_REST_AUTODISCOVERY_FAILED) diff --git a/WordPress/src/main/java/org/wordpress/android/ui/accounts/login/WPcomLoginHelper.kt b/WordPress/src/main/java/org/wordpress/android/ui/accounts/login/WPcomLoginHelper.kt index efbd5c335380..7d38479846f1 100644 --- a/WordPress/src/main/java/org/wordpress/android/ui/accounts/login/WPcomLoginHelper.kt +++ b/WordPress/src/main/java/org/wordpress/android/ui/accounts/login/WPcomLoginHelper.kt @@ -8,6 +8,7 @@ import androidx.browser.customtabs.CustomTabsCallback import androidx.browser.customtabs.CustomTabsClient import androidx.browser.customtabs.CustomTabsServiceConnection import androidx.browser.customtabs.CustomTabsSession +import androidx.core.net.toUri import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.cancel import kotlinx.coroutines.runBlocking @@ -20,7 +21,7 @@ import kotlin.coroutines.CoroutineContext class WPcomLoginHelper @Inject constructor( private val loginClient: WPcomLoginClient, private val accountStore: AccountStore, - appSecrets: AppSecrets + private val appSecrets: AppSecrets ) { private val context: CoroutineContext = Dispatchers.IO @@ -61,6 +62,17 @@ class WPcomLoginHelper @Inject constructor( private fun codeFromAuthorizationUri(string: String): String? { return Uri.parse(string).getQueryParameter("code") } + + fun appendParamsToRestAuthorizationUrl(authorizationUrl: String?): String { + return if (authorizationUrl.isNullOrEmpty()) { + authorizationUrl.orEmpty() + } else { + authorizationUrl.toUri().buildUpon().apply { + appendQueryParameter("app_name", "android-jetpack-client") + appendQueryParameter("success_url", appSecrets.redirectUri) + }.build().toString() + } + } } class ServiceConnection( From 0cab150ed1ddbc03b97c81686a3e65ec19c1ac93 Mon Sep 17 00:00:00 2001 From: adalpari Date: Mon, 5 May 2025 14:58:15 +0200 Subject: [PATCH 4/8] Adding tests --- .../android/ui/accounts/LoginViewModelTest.kt | 60 ++++++++++++++++++- 1 file changed, 59 insertions(+), 1 deletion(-) diff --git a/WordPress/src/test/java/org/wordpress/android/ui/accounts/LoginViewModelTest.kt b/WordPress/src/test/java/org/wordpress/android/ui/accounts/LoginViewModelTest.kt index 179b41207b24..443587e209c1 100644 --- a/WordPress/src/test/java/org/wordpress/android/ui/accounts/LoginViewModelTest.kt +++ b/WordPress/src/test/java/org/wordpress/android/ui/accounts/LoginViewModelTest.kt @@ -1,18 +1,35 @@ package org.wordpress.android.ui.accounts +import com.sun.jna.Pointer import kotlinx.coroutines.ExperimentalCoroutinesApi +import kotlinx.coroutines.test.runTest import org.assertj.core.api.Assertions.assertThat +import org.junit.Assert.assertEquals import org.junit.Before import org.junit.Test import org.mockito.Mock +import org.mockito.MockitoAnnotations +import org.mockito.kotlin.any +import org.mockito.kotlin.doThrow +import org.mockito.kotlin.eq +import org.mockito.kotlin.verify import org.mockito.kotlin.whenever import org.wordpress.android.BaseUnitTest import org.wordpress.android.fluxc.store.AccountStore.AuthEmailPayloadScheme import org.wordpress.android.fluxc.store.SiteStore.ConnectSiteInfoPayload import org.wordpress.android.ui.accounts.LoginNavigationEvents.ShowNoJetpackSites import org.wordpress.android.ui.accounts.LoginNavigationEvents.ShowSiteAddressError +import org.wordpress.android.ui.accounts.login.WPcomLoginHelper import org.wordpress.android.util.BuildConfigWrapper import org.wordpress.android.viewmodel.ResourceProvider +import rs.wordpress.api.kotlin.WpLoginClient +import uniffi.wp_api.AutoDiscoveryAttemptSuccess +import uniffi.wp_api.ParsedUrl +import uniffi.wp_api.WpApiDetails + +private const val TEST_URL = "https://www.test.com" +private const val TEST_URL_AUTH = "https://www.test.com/auth" +private const val TEST_URL_AUTH_SUFFIX = "?app_name=android-jetpack-client&success_url=null" @ExperimentalCoroutinesApi class LoginViewModelTest : BaseUnitTest() { @@ -21,11 +38,24 @@ class LoginViewModelTest : BaseUnitTest() { @Mock lateinit var resourceProvider: ResourceProvider + + @Mock + lateinit var wpLoginClient: WpLoginClient + + @Mock + lateinit var wpComLoginHelper: WPcomLoginHelper + + @Mock + lateinit var wpApiDetails: WpApiDetails + private lateinit var viewModel: LoginViewModel @Before fun setUp() { - viewModel = LoginViewModel(buildConfigWrapper) + MockitoAnnotations.openMocks(this) + whenever(wpComLoginHelper.appendParamsToRestAuthorizationUrl(any())) + .thenReturn("$TEST_URL_AUTH$TEST_URL_AUTH_SUFFIX") + viewModel = LoginViewModel(buildConfigWrapper, wpLoginClient, wpComLoginHelper) } @Test @@ -66,6 +96,34 @@ class LoginViewModelTest : BaseUnitTest() { assertThat(scheme).isEqualTo(AuthEmailPayloadScheme.WORDPRESS) } + @Test + fun `given login scenario, when api discovery is success, then return the authentication url`() = runTest { + whenever(wpLoginClient.apiDiscovery(eq(TEST_URL))) + .thenReturn( + AutoDiscoveryAttemptSuccess( + ParsedUrl(Pointer.createConstant(1)), + ParsedUrl(Pointer.createConstant(1)), + wpApiDetails + ) + ) + whenever(wpApiDetails.findApplicationPasswordsAuthenticationUrl()).thenReturn(TEST_URL_AUTH) + + val result = viewModel.runApiDiscoveryTest(TEST_URL) + + assertEquals("$TEST_URL_AUTH$TEST_URL_AUTH_SUFFIX", result) + verify(wpLoginClient).apiDiscovery(eq(TEST_URL)) + } + + @Test + fun `given login scenario, when api discovery is fails, then return empty authentication url`() = runTest { + whenever(wpLoginClient.apiDiscovery(eq(TEST_URL))).doThrow(RuntimeException("API discovery failed")) + + val result = viewModel.runApiDiscoveryTest(TEST_URL) + + assertEquals("", result) + verify(wpLoginClient).apiDiscovery(eq(TEST_URL)) + } + private fun getConnectSiteInfoPayload(url: String): ConnectSiteInfoPayload = ConnectSiteInfoPayload(url, null) From 9e442799c52d583a7d0f2f2519b50406ac3c8849 Mon Sep 17 00:00:00 2001 From: adalpari Date: Mon, 5 May 2025 14:59:45 +0200 Subject: [PATCH 5/8] clean imports --- .../java/org/wordpress/android/ui/accounts/LoginViewModel.kt | 2 -- 1 file changed, 2 deletions(-) diff --git a/WordPress/src/main/java/org/wordpress/android/ui/accounts/LoginViewModel.kt b/WordPress/src/main/java/org/wordpress/android/ui/accounts/LoginViewModel.kt index 46567df92e5c..7fdf405cd5f9 100644 --- a/WordPress/src/main/java/org/wordpress/android/ui/accounts/LoginViewModel.kt +++ b/WordPress/src/main/java/org/wordpress/android/ui/accounts/LoginViewModel.kt @@ -15,8 +15,6 @@ import org.wordpress.android.viewmodel.Event import rs.wordpress.api.kotlin.WpLoginClient import javax.inject.Inject import kotlin.text.RegexOption.IGNORE_CASE -import androidx.core.net.toUri -import org.wordpress.android.fluxc.network.rest.wpcom.auth.AppSecrets import org.wordpress.android.ui.accounts.login.WPcomLoginHelper class LoginViewModel @Inject constructor( From 1003e3dfd4df9c025f1bfdf164fd87ce5e1bc3d6 Mon Sep 17 00:00:00 2001 From: adalpari Date: Mon, 5 May 2025 15:47:55 +0200 Subject: [PATCH 6/8] Removing previous iteration code --- .../android/modules/ViewModelModule.java | 6 ----- .../LoginSiteAddressViewModelTest.kt | 21 ---------------- libs/login/build.gradle | 4 --- .../android/login/LoginSiteAddressFragment.kt | 11 -------- .../viewmodel/LoginSiteAddressViewModel.kt | 25 ------------------- 5 files changed, 67 deletions(-) delete mode 100644 WordPress/src/test/java/org/wordpress/android/login/viewmodel/LoginSiteAddressViewModelTest.kt delete mode 100644 libs/login/src/main/java/org/wordpress/android/login/viewmodel/LoginSiteAddressViewModel.kt diff --git a/WordPress/src/main/java/org/wordpress/android/modules/ViewModelModule.java b/WordPress/src/main/java/org/wordpress/android/modules/ViewModelModule.java index 1d4b8530b576..9989e37ba302 100644 --- a/WordPress/src/main/java/org/wordpress/android/modules/ViewModelModule.java +++ b/WordPress/src/main/java/org/wordpress/android/modules/ViewModelModule.java @@ -3,7 +3,6 @@ import androidx.lifecycle.ViewModel; import androidx.lifecycle.ViewModelProvider; -import org.wordpress.android.login.viewmodel.LoginSiteAddressViewModel; import org.wordpress.android.ui.accounts.LoginEpilogueViewModel; import org.wordpress.android.ui.accounts.LoginViewModel; import org.wordpress.android.ui.activitylog.list.filter.ActivityLogTypeFilterViewModel; @@ -451,11 +450,6 @@ abstract class ViewModelModule { @ViewModelKey(LoginViewModel.class) abstract ViewModel loginViewModel(LoginViewModel viewModel); - @Binds - @IntoMap - @ViewModelKey(LoginSiteAddressViewModel.class) - abstract ViewModel loginSiteAddressViewModel(LoginSiteAddressViewModel viewModel); - @Binds @IntoMap @ViewModelKey(StorageUtilsViewModel.class) diff --git a/WordPress/src/test/java/org/wordpress/android/login/viewmodel/LoginSiteAddressViewModelTest.kt b/WordPress/src/test/java/org/wordpress/android/login/viewmodel/LoginSiteAddressViewModelTest.kt deleted file mode 100644 index 80d70bd24b60..000000000000 --- a/WordPress/src/test/java/org/wordpress/android/login/viewmodel/LoginSiteAddressViewModelTest.kt +++ /dev/null @@ -1,21 +0,0 @@ -package org.wordpress.android.login.viewmodel - -import kotlinx.coroutines.ExperimentalCoroutinesApi -import org.junit.Before -import org.mockito.Mock -import rs.wordpress.api.kotlin.WpLoginClient - -@ExperimentalCoroutinesApi - class LoginSiteAddressViewModelTest { - @Mock - lateinit var wpLoginClient: WpLoginClient - - private lateinit var viewModel: LoginSiteAddressViewModel - - @Before - fun setUp() { - viewModel = LoginSiteAddressViewModel(wpLoginClient) - } - - // NOTE: there's actually nothing to test yet, since the initial function is just logging the server call - } diff --git a/libs/login/build.gradle b/libs/login/build.gradle index 8de1d5f30c7a..1ff85556db38 100644 --- a/libs/login/build.gradle +++ b/libs/login/build.gradle @@ -56,8 +56,6 @@ dependencies { implementation libs.androidx.appcompat.main implementation libs.androidx.constraintlayout.main - implementation(libs.androidx.lifecycle.viewmodel.main) - implementation(libs.androidx.lifecycle.viewmodel.compose) implementation libs.google.material implementation libs.androidx.core.main @@ -72,8 +70,6 @@ dependencies { implementation libs.androidx.credentials.main implementation libs.androidx.credentials.play.service.auth - implementation(libs.wordpress.rs.android) - // Dagger implementation libs.google.dagger ksp libs.google.dagger.compiler diff --git a/libs/login/src/main/java/org/wordpress/android/login/LoginSiteAddressFragment.kt b/libs/login/src/main/java/org/wordpress/android/login/LoginSiteAddressFragment.kt index 750a22a5082e..9082a650e9dc 100644 --- a/libs/login/src/main/java/org/wordpress/android/login/LoginSiteAddressFragment.kt +++ b/libs/login/src/main/java/org/wordpress/android/login/LoginSiteAddressFragment.kt @@ -38,7 +38,6 @@ import org.wordpress.android.util.UrlUtils import javax.inject.Inject import androidx.core.net.toUri import androidx.lifecycle.ViewModelProvider -import org.wordpress.android.login.viewmodel.LoginSiteAddressViewModel class LoginSiteAddressFragment : LoginBaseDiscoveryFragment(), TextWatcher, OnEditorCommitListener, LoginBaseDiscoveryListener { @@ -52,10 +51,6 @@ class LoginSiteAddressFragment : LoginBaseDiscoveryFragment(), TextWatcher, OnEd private var loginSiteAddressValidator: LoginSiteAddressValidator? = null - @Inject - lateinit var viewModelFactory: ViewModelProvider.Factory - private lateinit var viewModel: LoginSiteAddressViewModel - @JvmField @Inject var accountStore: AccountStore? = null @@ -134,8 +129,6 @@ class LoginSiteAddressFragment : LoginBaseDiscoveryFragment(), TextWatcher, OnEd override fun onActivityCreated(savedInstanceState: Bundle?) { super.onActivityCreated(savedInstanceState) - viewModel = ViewModelProvider(this, viewModelFactory)[LoginSiteAddressViewModel::class.java] - if (savedInstanceState != null) { requestedSiteAddress = savedInstanceState.getString(KEY_REQUESTED_SITE_ADDRESS) connectSiteInfoUrl = savedInstanceState.getString(KEY_SITE_INFO_URL) @@ -198,10 +191,6 @@ class LoginSiteAddressFragment : LoginBaseDiscoveryFragment(), TextWatcher, OnEd val cleanedUrl = stripKnownPaths(requestedSiteAddress.orEmpty()) - // This work is in progress as right now we are just testing the API discovery through the RS library - // No further actions are taken - viewModel.runApiDiscovery(cleanedUrl) - mAnalyticsListener.trackConnectedSiteInfoRequested(cleanedUrl) dispatcher?.dispatch(SiteActionBuilder.newFetchConnectSiteInfoAction(cleanedUrl)) diff --git a/libs/login/src/main/java/org/wordpress/android/login/viewmodel/LoginSiteAddressViewModel.kt b/libs/login/src/main/java/org/wordpress/android/login/viewmodel/LoginSiteAddressViewModel.kt deleted file mode 100644 index dccf87bdf7c4..000000000000 --- a/libs/login/src/main/java/org/wordpress/android/login/viewmodel/LoginSiteAddressViewModel.kt +++ /dev/null @@ -1,25 +0,0 @@ -package org.wordpress.android.login.viewmodel - -import android.util.Log -import androidx.lifecycle.ViewModel -import androidx.lifecycle.viewModelScope -import kotlinx.coroutines.launch -import rs.wordpress.api.kotlin.WpLoginClient -import javax.inject.Inject - -@Suppress("TooGenericExceptionCaught") -class LoginSiteAddressViewModel @Inject constructor( - private val wpLoginClient: WpLoginClient -) : ViewModel() { - fun runApiDiscovery(url: String) { - viewModelScope.launch { - try { - val urlDiscovery = wpLoginClient.apiDiscovery(url) - val authorizationUrl = urlDiscovery.apiDetails.findApplicationPasswordsAuthenticationUrl() - Log.d("WP_RS", "VM: Found authorization URL: $authorizationUrl") - } catch (throwable: Throwable) { - Log.e("WP_RS", "VM: Error during API discovery", throwable) - } - } - } -} From 1250aa95cb2883e27029d478b3d1309e706a4a09 Mon Sep 17 00:00:00 2001 From: adalpari Date: Mon, 5 May 2025 15:50:51 +0200 Subject: [PATCH 7/8] Some refactoring --- .../org/wordpress/android/ui/accounts/LoginActivity.java | 6 +++--- .../org/wordpress/android/ui/accounts/LoginViewModel.kt | 2 +- .../org/wordpress/android/ui/accounts/LoginViewModelTest.kt | 4 ++-- .../org/wordpress/android/login/LoginSiteAddressFragment.kt | 1 - 4 files changed, 6 insertions(+), 7 deletions(-) diff --git a/WordPress/src/main/java/org/wordpress/android/ui/accounts/LoginActivity.java b/WordPress/src/main/java/org/wordpress/android/ui/accounts/LoginActivity.java index 145346cc1db7..cf889ca3acf8 100644 --- a/WordPress/src/main/java/org/wordpress/android/ui/accounts/LoginActivity.java +++ b/WordPress/src/main/java/org/wordpress/android/ui/accounts/LoginActivity.java @@ -701,11 +701,11 @@ public void gotXmlRpcEndpoint(String inputSiteAddress, String endpointAddress) { slideInFragment(loginUsernamePasswordFragment, true, LoginUsernamePasswordFragment.TAG); // In the background, run the API discovery test to see if we can add this site for the REST API - String authorizationUrl = mViewModel.runApiDiscoveryTest(inputSiteAddress); -// gotRestEndpoint(inputSiteAddress, authorizationUrl); + String authorizationUrl = mViewModel.runApiDiscovery(inputSiteAddress); +// launchApplicationPasswordFlow(authorizationUrl); } - public void gotRestEndpoint(String inputSiteAddress, String endpointAddress) { + public void launchApplicationPasswordFlow(String endpointAddress) { CustomTabsIntent intent = getCustomTabsIntent(); Uri loginUri = Uri.parse(endpointAddress); diff --git a/WordPress/src/main/java/org/wordpress/android/ui/accounts/LoginViewModel.kt b/WordPress/src/main/java/org/wordpress/android/ui/accounts/LoginViewModel.kt index 7fdf405cd5f9..8c95c38d916e 100644 --- a/WordPress/src/main/java/org/wordpress/android/ui/accounts/LoginViewModel.kt +++ b/WordPress/src/main/java/org/wordpress/android/ui/accounts/LoginViewModel.kt @@ -42,7 +42,7 @@ class LoginViewModel @Inject constructor( } @Suppress("TooGenericExceptionCaught") - fun runApiDiscoveryTest(url: String): String = runBlocking { + fun runApiDiscovery(url: String): String = runBlocking { try { val urlDiscovery = wpLoginClient.apiDiscovery(url) val authorizationUrl = urlDiscovery.apiDetails.findApplicationPasswordsAuthenticationUrl() diff --git a/WordPress/src/test/java/org/wordpress/android/ui/accounts/LoginViewModelTest.kt b/WordPress/src/test/java/org/wordpress/android/ui/accounts/LoginViewModelTest.kt index 443587e209c1..4ba7c2033c3e 100644 --- a/WordPress/src/test/java/org/wordpress/android/ui/accounts/LoginViewModelTest.kt +++ b/WordPress/src/test/java/org/wordpress/android/ui/accounts/LoginViewModelTest.kt @@ -108,7 +108,7 @@ class LoginViewModelTest : BaseUnitTest() { ) whenever(wpApiDetails.findApplicationPasswordsAuthenticationUrl()).thenReturn(TEST_URL_AUTH) - val result = viewModel.runApiDiscoveryTest(TEST_URL) + val result = viewModel.runApiDiscovery(TEST_URL) assertEquals("$TEST_URL_AUTH$TEST_URL_AUTH_SUFFIX", result) verify(wpLoginClient).apiDiscovery(eq(TEST_URL)) @@ -118,7 +118,7 @@ class LoginViewModelTest : BaseUnitTest() { fun `given login scenario, when api discovery is fails, then return empty authentication url`() = runTest { whenever(wpLoginClient.apiDiscovery(eq(TEST_URL))).doThrow(RuntimeException("API discovery failed")) - val result = viewModel.runApiDiscoveryTest(TEST_URL) + val result = viewModel.runApiDiscovery(TEST_URL) assertEquals("", result) verify(wpLoginClient).apiDiscovery(eq(TEST_URL)) diff --git a/libs/login/src/main/java/org/wordpress/android/login/LoginSiteAddressFragment.kt b/libs/login/src/main/java/org/wordpress/android/login/LoginSiteAddressFragment.kt index 9082a650e9dc..5f594338916d 100644 --- a/libs/login/src/main/java/org/wordpress/android/login/LoginSiteAddressFragment.kt +++ b/libs/login/src/main/java/org/wordpress/android/login/LoginSiteAddressFragment.kt @@ -37,7 +37,6 @@ import org.wordpress.android.util.NetworkUtils import org.wordpress.android.util.UrlUtils import javax.inject.Inject import androidx.core.net.toUri -import androidx.lifecycle.ViewModelProvider class LoginSiteAddressFragment : LoginBaseDiscoveryFragment(), TextWatcher, OnEditorCommitListener, LoginBaseDiscoveryListener { From 8ed1d19506a240b033c9d319412e197b1ea70cc2 Mon Sep 17 00:00:00 2001 From: adalpari Date: Mon, 5 May 2025 16:48:44 +0200 Subject: [PATCH 8/8] Fixing null annotation warning --- .../java/org/wordpress/android/ui/accounts/LoginActivity.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/WordPress/src/main/java/org/wordpress/android/ui/accounts/LoginActivity.java b/WordPress/src/main/java/org/wordpress/android/ui/accounts/LoginActivity.java index cf889ca3acf8..8084553850a8 100644 --- a/WordPress/src/main/java/org/wordpress/android/ui/accounts/LoginActivity.java +++ b/WordPress/src/main/java/org/wordpress/android/ui/accounts/LoginActivity.java @@ -705,7 +705,7 @@ public void gotXmlRpcEndpoint(String inputSiteAddress, String endpointAddress) { // launchApplicationPasswordFlow(authorizationUrl); } - public void launchApplicationPasswordFlow(String endpointAddress) { + public void launchApplicationPasswordFlow(@NonNull String endpointAddress) { CustomTabsIntent intent = getCustomTabsIntent(); Uri loginUri = Uri.parse(endpointAddress);