Skip to content

Commit d0493a9

Browse files
authored
Discover the login url for self-hosted sites and log it (#21851)
* Adding WordPress RS library to the login lib * Injecting LoginSiteAddressViewModel * Discovering the url * Injecting WpLoginClient * style and detekt * Adding test class * Explanatory comment about the inclusion of the APi discovery * Fixing a warning
1 parent f3eb2b2 commit d0493a9

File tree

6 files changed

+76
-0
lines changed

6 files changed

+76
-0
lines changed

WordPress/src/main/java/org/wordpress/android/modules/ApplicationModule.java

+8
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@
4040
import org.wordpress.android.viewmodel.helpers.ConnectionStatusLiveData;
4141

4242
import javax.inject.Named;
43+
import javax.inject.Singleton;
4344

4445
import dagger.Binds;
4546
import dagger.Module;
@@ -49,6 +50,7 @@
4950
import dagger.hilt.android.qualifiers.ApplicationContext;
5051
import dagger.hilt.components.SingletonComponent;
5152
import kotlinx.coroutines.CoroutineScope;
53+
import rs.wordpress.api.kotlin.WpLoginClient;
5254

5355
import static org.wordpress.android.modules.ThreadModuleKt.APPLICATION_SCOPE;
5456

@@ -148,4 +150,10 @@ public static IAudioRecorder provideAudioRecorder(
148150
public static RecordingStrategy provideVoiceToContentRecordingStrategy() {
149151
return new VoiceToContentRecordingStrategy();
150152
}
153+
154+
@Provides
155+
@Singleton
156+
public static WpLoginClient provideWpLoginClient() {
157+
return new WpLoginClient();
158+
}
151159
}

WordPress/src/main/java/org/wordpress/android/modules/ViewModelModule.java

+6
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
import androidx.lifecycle.ViewModel;
44
import androidx.lifecycle.ViewModelProvider;
55

6+
import org.wordpress.android.login.viewmodel.LoginSiteAddressViewModel;
67
import org.wordpress.android.ui.accounts.LoginEpilogueViewModel;
78
import org.wordpress.android.ui.accounts.LoginViewModel;
89
import org.wordpress.android.ui.activitylog.list.filter.ActivityLogTypeFilterViewModel;
@@ -450,6 +451,11 @@ abstract class ViewModelModule {
450451
@ViewModelKey(LoginViewModel.class)
451452
abstract ViewModel loginViewModel(LoginViewModel viewModel);
452453

454+
@Binds
455+
@IntoMap
456+
@ViewModelKey(LoginSiteAddressViewModel.class)
457+
abstract ViewModel loginSiteAddressViewModel(LoginSiteAddressViewModel viewModel);
458+
453459
@Binds
454460
@IntoMap
455461
@ViewModelKey(StorageUtilsViewModel.class)
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
package org.wordpress.android.login.viewmodel
2+
3+
import kotlinx.coroutines.ExperimentalCoroutinesApi
4+
import org.junit.Before
5+
import org.mockito.Mock
6+
import rs.wordpress.api.kotlin.WpLoginClient
7+
8+
@ExperimentalCoroutinesApi
9+
class LoginSiteAddressViewModelTest {
10+
@Mock
11+
lateinit var wpLoginClient: WpLoginClient
12+
13+
private lateinit var viewModel: LoginSiteAddressViewModel
14+
15+
@Before
16+
fun setUp() {
17+
viewModel = LoginSiteAddressViewModel(wpLoginClient)
18+
}
19+
20+
// NOTE: there's actually nothing to test yet, since the initial function is just logging the server call
21+
}

libs/login/build.gradle

+4
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,8 @@ dependencies {
5656
implementation libs.androidx.appcompat.main
5757

5858
implementation libs.androidx.constraintlayout.main
59+
implementation(libs.androidx.lifecycle.viewmodel.main)
60+
implementation(libs.androidx.lifecycle.viewmodel.compose)
5961
implementation libs.google.material
6062

6163
implementation libs.androidx.core.main
@@ -70,6 +72,8 @@ dependencies {
7072
implementation libs.androidx.credentials.main
7173
implementation libs.androidx.credentials.play.service.auth
7274

75+
implementation(libs.wordpress.rs.android)
76+
7377
// Dagger
7478
implementation libs.google.dagger
7579
ksp libs.google.dagger.compiler

libs/login/src/main/java/org/wordpress/android/login/LoginSiteAddressFragment.kt

+12
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,8 @@ import org.wordpress.android.util.NetworkUtils
3737
import org.wordpress.android.util.UrlUtils
3838
import javax.inject.Inject
3939
import androidx.core.net.toUri
40+
import androidx.lifecycle.ViewModelProvider
41+
import org.wordpress.android.login.viewmodel.LoginSiteAddressViewModel
4042

4143
class LoginSiteAddressFragment : LoginBaseDiscoveryFragment(), TextWatcher, OnEditorCommitListener,
4244
LoginBaseDiscoveryListener {
@@ -50,6 +52,10 @@ class LoginSiteAddressFragment : LoginBaseDiscoveryFragment(), TextWatcher, OnEd
5052

5153
private var loginSiteAddressValidator: LoginSiteAddressValidator? = null
5254

55+
@Inject
56+
lateinit var viewModelFactory: ViewModelProvider.Factory
57+
private lateinit var viewModel: LoginSiteAddressViewModel
58+
5359
@JvmField
5460
@Inject
5561
var accountStore: AccountStore? = null
@@ -128,6 +134,8 @@ class LoginSiteAddressFragment : LoginBaseDiscoveryFragment(), TextWatcher, OnEd
128134
override fun onActivityCreated(savedInstanceState: Bundle?) {
129135
super.onActivityCreated(savedInstanceState)
130136

137+
viewModel = ViewModelProvider(this, viewModelFactory)[LoginSiteAddressViewModel::class.java]
138+
131139
if (savedInstanceState != null) {
132140
requestedSiteAddress = savedInstanceState.getString(KEY_REQUESTED_SITE_ADDRESS)
133141
connectSiteInfoUrl = savedInstanceState.getString(KEY_SITE_INFO_URL)
@@ -190,6 +198,10 @@ class LoginSiteAddressFragment : LoginBaseDiscoveryFragment(), TextWatcher, OnEd
190198

191199
val cleanedUrl = stripKnownPaths(requestedSiteAddress.orEmpty())
192200

201+
// This work is in progress as right now we are just testing the API discovery through the RS library
202+
// No further actions are taken
203+
viewModel.runApiDiscovery(cleanedUrl)
204+
193205
mAnalyticsListener.trackConnectedSiteInfoRequested(cleanedUrl)
194206
dispatcher?.dispatch(SiteActionBuilder.newFetchConnectSiteInfoAction(cleanedUrl))
195207

Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
package org.wordpress.android.login.viewmodel
2+
3+
import android.util.Log
4+
import androidx.lifecycle.ViewModel
5+
import androidx.lifecycle.viewModelScope
6+
import kotlinx.coroutines.launch
7+
import rs.wordpress.api.kotlin.WpLoginClient
8+
import javax.inject.Inject
9+
10+
@Suppress("TooGenericExceptionCaught")
11+
class LoginSiteAddressViewModel @Inject constructor(
12+
private val wpLoginClient: WpLoginClient
13+
) : ViewModel() {
14+
fun runApiDiscovery(url: String) {
15+
viewModelScope.launch {
16+
try {
17+
val urlDiscovery = wpLoginClient.apiDiscovery(url)
18+
val authorizationUrl = urlDiscovery.apiDetails.findApplicationPasswordsAuthenticationUrl()
19+
Log.d("WP_RS", "VM: Found authorization URL: $authorizationUrl")
20+
} catch (throwable: Throwable) {
21+
Log.e("WP_RS", "VM: Error during API discovery", throwable)
22+
}
23+
}
24+
}
25+
}

0 commit comments

Comments
 (0)