Skip to content

Commit 74656ab

Browse files
authored
Feature: CMM-732 create application password required activity (#22191)
* Rename the current reuthentication activity * Renaming tests * Overrifding dialog values * Navigation and typo * string resource fix * Test code * Using a dynamic feature name in the dialog
1 parent 45bcdf8 commit 74656ab

File tree

8 files changed

+74
-25
lines changed

8 files changed

+74
-25
lines changed

WordPress/src/main/AndroidManifest.xml

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -144,7 +144,11 @@
144144
</activity>
145145

146146
<activity
147-
android:name=".ui.accounts.login.applicationpassword.ApplicationPasswordReauthenticateActivity"
147+
android:name=".ui.accounts.login.applicationpassword.ApplicationPasswordReauthenticateDialogActivity"
148+
android:theme="@style/WordPress.TransparentDialog"
149+
android:exported="false" />
150+
<activity
151+
android:name=".ui.accounts.login.applicationpassword.ApplicationPasswordRequiredDialogActivity"
148152
android:theme="@style/WordPress.TransparentDialog"
149153
android:exported="false" />
150154

WordPress/src/main/java/org/wordpress/android/ui/ActivityNavigator.kt

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,9 @@ import org.wordpress.android.R
1111
import org.wordpress.android.WordPress
1212
import org.wordpress.android.analytics.AnalyticsTracker
1313
import org.wordpress.android.fluxc.model.SiteModel
14-
import org.wordpress.android.ui.accounts.login.applicationpassword.ApplicationPasswordReauthenticateActivity
14+
import org.wordpress.android.ui.accounts.login.applicationpassword.ApplicationPasswordDialogActivity
15+
import org.wordpress.android.ui.accounts.login.applicationpassword.ApplicationPasswordReauthenticateDialogActivity
16+
import org.wordpress.android.ui.accounts.login.applicationpassword.ApplicationPasswordRequiredDialogActivity
1517
import org.wordpress.android.ui.blaze.BlazeFlowSource
1618
import org.wordpress.android.ui.blaze.blazecampaigns.ARG_EXTRA_BLAZE_CAMPAIGN_PAGE
1719
import org.wordpress.android.ui.blaze.blazecampaigns.BlazeCampaignPage
@@ -260,8 +262,15 @@ class ActivityNavigator @Inject constructor() {
260262
}
261263

262264
fun navigateToApplicationPasswordReauthentication(activity: Activity, authenticationUrl: String) {
263-
val intent = Intent(activity, ApplicationPasswordReauthenticateActivity::class.java)
264-
intent.putExtra(ApplicationPasswordReauthenticateActivity.EXTRA_SITE_URL, authenticationUrl)
265+
val intent = Intent(activity, ApplicationPasswordReauthenticateDialogActivity::class.java)
266+
intent.putExtra(ApplicationPasswordDialogActivity.EXTRA_SITE_URL, authenticationUrl)
267+
activity.startActivity(intent)
268+
}
269+
270+
fun navigateToApplicationPasswordRequired(activity: Activity, authenticationUrl: String, featureName: String) {
271+
val intent = Intent(activity, ApplicationPasswordRequiredDialogActivity::class.java)
272+
intent.putExtra(ApplicationPasswordDialogActivity.EXTRA_SITE_URL, authenticationUrl)
273+
intent.putExtra(ApplicationPasswordRequiredDialogActivity.EXTRA_FEATURE_NAME, featureName)
265274
activity.startActivity(intent)
266275
}
267276
}
Lines changed: 16 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -33,11 +33,11 @@ import org.wordpress.android.ui.compose.theme.AppThemeM3
3333
import javax.inject.Inject
3434

3535
@AndroidEntryPoint
36-
class ApplicationPasswordReauthenticateActivity : ComponentActivity() {
36+
abstract class ApplicationPasswordDialogActivity : ComponentActivity() {
3737
@Inject
3838
lateinit var activityNavigator: ActivityNavigator
3939

40-
private val viewModel: ApplicationPasswordReauthenticateViewModel by viewModels()
40+
private val viewModel: ApplicationPasswordDialogViewModel by viewModels()
4141

4242
override fun onCreate(savedInstanceState: Bundle?) {
4343
super.onCreate(savedInstanceState)
@@ -49,16 +49,16 @@ class ApplicationPasswordReauthenticateActivity : ComponentActivity() {
4949
lifecycleScope.launch {
5050
viewModel.navigationEvent.collect { event ->
5151
when (event) {
52-
is ApplicationPasswordReauthenticateViewModel.NavigationEvent.NavigateToLogin -> {
52+
is ApplicationPasswordDialogViewModel.NavigationEvent.NavigateToLogin -> {
5353
activityNavigator.openApplicationPasswordLogin(
54-
this@ApplicationPasswordReauthenticateActivity,
54+
this@ApplicationPasswordDialogActivity,
5555
event.authenticationUrl
5656
)
5757
finish()
5858
}
59-
is ApplicationPasswordReauthenticateViewModel.NavigationEvent.ShowError -> {
59+
is ApplicationPasswordDialogViewModel.NavigationEvent.ShowError -> {
6060
ToastUtils.showToast(
61-
this@ApplicationPasswordReauthenticateActivity,
61+
this@ApplicationPasswordDialogActivity,
6262
getString(R.string.error_generic)
6363
)
6464
finish()
@@ -82,9 +82,13 @@ class ApplicationPasswordReauthenticateActivity : ComponentActivity() {
8282
}
8383
}
8484

85+
protected abstract fun getTitleResource(): Int
86+
protected abstract fun getDescriptionString(): String
87+
protected abstract fun getButtonTextResource(): Int
88+
8589
@Composable
8690
fun ApplicationPasswordReauthenticateDialog(
87-
viewModel: ApplicationPasswordReauthenticateViewModel,
91+
viewModel: ApplicationPasswordDialogViewModel,
8892
onDismiss: () -> Unit,
8993
onConfirm: () -> Unit,
9094
) {
@@ -97,12 +101,12 @@ class ApplicationPasswordReauthenticateActivity : ComponentActivity() {
97101
contentDescription = null
98102
)
99103
},
100-
title = { Text(text = stringResource(R.string.application_password_invalid)) },
104+
title = { Text(text = stringResource(getTitleResource())) },
101105
text = {
102106
Column(
103107
modifier = androidx.compose.ui.Modifier.verticalScroll(rememberScrollState())
104108
) {
105-
Text(text = stringResource(R.string.application_password_invalid_description))
109+
Text(text = getDescriptionString())
106110
}
107111
},
108112
confirmButton = {
@@ -118,7 +122,7 @@ class ApplicationPasswordReauthenticateActivity : ComponentActivity() {
118122
strokeWidth = 2.dp
119123
)
120124
} else {
121-
Text(text = stringResource(R.string.log_in))
125+
Text(text = stringResource(getButtonTextResource()))
122126
}
123127
}
124128
}
@@ -133,11 +137,11 @@ class ApplicationPasswordReauthenticateActivity : ComponentActivity() {
133137
ApplicationPasswordReauthenticateDialogPreviewContent()
134138
}
135139
}
136-
140+
137141
@Composable
138142
private fun ApplicationPasswordReauthenticateDialogPreviewContent() {
139143
val isLoading = remember { mutableStateOf(false) }
140-
144+
141145
AlertDialog(
142146
onDismissRequest = {},
143147
icon = {
Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ import org.wordpress.android.util.AppLog
1616
import javax.inject.Inject
1717

1818
@HiltViewModel
19-
class ApplicationPasswordReauthenticateViewModel @Inject constructor(
19+
class ApplicationPasswordDialogViewModel @Inject constructor(
2020
private val applicationPasswordLoginHelper: ApplicationPasswordLoginHelper,
2121
private val appLogWrapper: AppLogWrapper,
2222
) : ViewModel() {
@@ -32,7 +32,7 @@ class ApplicationPasswordReauthenticateViewModel @Inject constructor(
3232
_isLoading.value = true
3333

3434
if (authenticationUrl.isEmpty()) {
35-
appLogWrapper.w(AppLog.T.MAIN, "Authentication URL is empty, cannot proceed with reauthentication")
35+
appLogWrapper.w(AppLog.T.MAIN, "Authentication URL is empty, cannot proceed with authentication")
3636
_navigationEvent.emit(NavigationEvent.ShowError)
3737
return@launch
3838
}
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
package org.wordpress.android.ui.accounts.login.applicationpassword
2+
3+
import dagger.hilt.android.AndroidEntryPoint
4+
import org.wordpress.android.R
5+
6+
@AndroidEntryPoint
7+
class ApplicationPasswordReauthenticateDialogActivity : ApplicationPasswordDialogActivity() {
8+
override fun getTitleResource(): Int = R.string.application_password_invalid
9+
override fun getDescriptionString(): String = resources.getString(R.string.application_password_invalid_description)
10+
override fun getButtonTextResource(): Int = R.string.log_in
11+
}
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
package org.wordpress.android.ui.accounts.login.applicationpassword
2+
3+
import dagger.hilt.android.AndroidEntryPoint
4+
import org.wordpress.android.R
5+
6+
@AndroidEntryPoint
7+
class ApplicationPasswordRequiredDialogActivity : ApplicationPasswordDialogActivity() {
8+
override fun getTitleResource(): Int = R.string.application_password_required
9+
override fun getDescriptionString(): String =
10+
intent.getStringExtra(EXTRA_FEATURE_NAME)?.let {
11+
resources.getString(R.string.application_password_required_description, it)
12+
} ?: resources.getString(R.string.application_password_required_description_default)
13+
override fun getButtonTextResource(): Int = R.string.get_started
14+
15+
companion object {
16+
const val EXTRA_FEATURE_NAME = "feature_name_arg"
17+
}
18+
}

WordPress/src/main/res/values/strings.xml

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5059,6 +5059,9 @@ translators: %s: Select control option value e.g: "Auto, 25%". -->
50595059
<string name="application_password_not_supported_error" a8c-src-lib="module:login">The provided site does not support Application Password authentication.</string>
50605060
<string name="application_password_invalid">Invalid Application Password</string>
50615061
<string name="application_password_invalid_description">Your application password no longer exists. Please sign in again to create a new application password </string>
5062+
<string name="application_password_required">Application Password Required</string>
5063+
<string name="application_password_required_description">Application passwords are a more secure way to connect to your self-hosted site, and enable support for features like %1$s.</string>
5064+
<string name="application_password_required_description_default">Application passwords are a more secure way to connect to your self-hosted site, and enable new features support.</string>
50625065
<string name="application_password_disable_feature_title">Disable Application Password?</string>
50635066
<string name="application_password_disable_feature_description">Disabling Application Password will remove the login for %1$s of your sites. You may need to re-add affected sites to login again.</string>
50645067
<string name="application_password_info_title">Application Passwords</string>
Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -21,14 +21,14 @@ import kotlin.test.assertFalse
2121
import kotlin.test.assertTrue
2222

2323
@ExperimentalCoroutinesApi
24-
class ApplicationPasswordReauthenticateViewModelTest : BaseUnitTest() {
24+
class ApplicationPasswordDialogViewModelTest : BaseUnitTest() {
2525
@Mock
2626
lateinit var applicationPasswordLoginHelper: ApplicationPasswordLoginHelper
2727

2828
@Mock
2929
lateinit var appLogWrapper: AppLogWrapper
3030

31-
private lateinit var viewModel: ApplicationPasswordReauthenticateViewModel
31+
private lateinit var viewModel: ApplicationPasswordDialogViewModel
3232

3333
private val testAuthUrl = "https://example.com/wp-admin/authorize-application.php"
3434
private val testCompleteAuthUrl = "https://example.com/wp-admin/authorize-application.php?" +
@@ -37,7 +37,7 @@ class ApplicationPasswordReauthenticateViewModelTest : BaseUnitTest() {
3737
@Before
3838
fun setUp() {
3939
MockitoAnnotations.openMocks(this)
40-
viewModel = ApplicationPasswordReauthenticateViewModel(
40+
viewModel = ApplicationPasswordDialogViewModel(
4141
applicationPasswordLoginHelper,
4242
appLogWrapper
4343
)
@@ -69,7 +69,7 @@ class ApplicationPasswordReauthenticateViewModelTest : BaseUnitTest() {
6969
// Should emit navigation event
7070
val navigationEvent = awaitItem()
7171
assertEquals(
72-
ApplicationPasswordReauthenticateViewModel.NavigationEvent.NavigateToLogin(testCompleteAuthUrl),
72+
ApplicationPasswordDialogViewModel.NavigationEvent.NavigateToLogin(testCompleteAuthUrl),
7373
navigationEvent
7474
)
7575

@@ -87,7 +87,7 @@ class ApplicationPasswordReauthenticateViewModelTest : BaseUnitTest() {
8787
// Should emit error event
8888
val navigationEvent = awaitItem()
8989
assertEquals(
90-
ApplicationPasswordReauthenticateViewModel.NavigationEvent.ShowError,
90+
ApplicationPasswordDialogViewModel.NavigationEvent.ShowError,
9191
navigationEvent
9292
)
9393

@@ -125,7 +125,7 @@ class ApplicationPasswordReauthenticateViewModelTest : BaseUnitTest() {
125125
// Should emit error event
126126
val navigationEvent = awaitItem()
127127
assertEquals(
128-
ApplicationPasswordReauthenticateViewModel.NavigationEvent.ShowError,
128+
ApplicationPasswordDialogViewModel.NavigationEvent.ShowError,
129129
navigationEvent
130130
)
131131

@@ -162,7 +162,7 @@ class ApplicationPasswordReauthenticateViewModelTest : BaseUnitTest() {
162162
// Should emit error event
163163
val navigationEvent = awaitItem()
164164
assertEquals(
165-
ApplicationPasswordReauthenticateViewModel.NavigationEvent.ShowError,
165+
ApplicationPasswordDialogViewModel.NavigationEvent.ShowError,
166166
navigationEvent
167167
)
168168

0 commit comments

Comments
 (0)