Skip to content

Commit 26b9ad2

Browse files
adalparidcalhoun
andauthored
CMM 735 enable application password feature when the user accepts to use a feature that must include it (#22195)
* feat: Gate GutenbergKit with app password An application password is necessary for sites without a Jetpack connection, otherwise REST API requests fail, as GutenbergKit does not support cookie authentication. * style: Disable return count warning Postpone larger refactors as technical debt. * Enable feature is necessary * Adding an extra note * Fixing tests --------- Co-authored-by: David Calhoun <[email protected]>
1 parent a1780ff commit 26b9ad2

File tree

4 files changed

+24
-5
lines changed

4 files changed

+24
-5
lines changed

WordPress/src/main/java/org/wordpress/android/ui/accounts/login/applicationpassword/ApplicationPasswordDialogViewModel.kt

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,13 +12,16 @@ import kotlinx.coroutines.flow.asStateFlow
1212
import kotlinx.coroutines.launch
1313
import org.wordpress.android.fluxc.utils.AppLogWrapper
1414
import org.wordpress.android.ui.accounts.login.ApplicationPasswordLoginHelper
15+
import org.wordpress.android.ui.prefs.experimentalfeatures.ExperimentalFeatures
16+
import org.wordpress.android.ui.prefs.experimentalfeatures.ExperimentalFeatures.Feature
1517
import org.wordpress.android.util.AppLog
1618
import javax.inject.Inject
1719

1820
@HiltViewModel
1921
class ApplicationPasswordDialogViewModel @Inject constructor(
2022
private val applicationPasswordLoginHelper: ApplicationPasswordLoginHelper,
2123
private val appLogWrapper: AppLogWrapper,
24+
private val experimentalFeatures: ExperimentalFeatures,
2225
) : ViewModel() {
2326
private val _navigationEvent = MutableSharedFlow<NavigationEvent>()
2427
val navigationEvent: SharedFlow<NavigationEvent> = _navigationEvent.asSharedFlow()
@@ -38,6 +41,8 @@ class ApplicationPasswordDialogViewModel @Inject constructor(
3841
}
3942

4043
try {
44+
// Assume that the Application Password experimental feature can be enabled
45+
enableApplicationPasswordIfNecessary()
4146
val completeAuthUrl = applicationPasswordLoginHelper.getAuthorizationUrlComplete(authenticationUrl)
4247

4348
if (completeAuthUrl.isNotEmpty()) {
@@ -55,6 +60,12 @@ class ApplicationPasswordDialogViewModel @Inject constructor(
5560
}
5661
}
5762

63+
private fun enableApplicationPasswordIfNecessary() {
64+
if (!experimentalFeatures.isEnabled(Feature.EXPERIMENTAL_APPLICATION_PASSWORD_FEATURE)) {
65+
experimentalFeatures.setEnabled(Feature.EXPERIMENTAL_APPLICATION_PASSWORD_FEATURE, true)
66+
}
67+
}
68+
5869
sealed class NavigationEvent {
5970
data class NavigateToLogin(val authenticationUrl: String) : NavigationEvent()
6071
object ShowError : NavigationEvent()

WordPress/src/main/java/org/wordpress/android/ui/accounts/login/applicationpassword/ApplicationPasswordRequiredDialogActivity.kt

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,10 +6,13 @@ import org.wordpress.android.R
66
@AndroidEntryPoint
77
class ApplicationPasswordRequiredDialogActivity : ApplicationPasswordDialogActivity() {
88
override fun getTitleResource(): Int = R.string.application_password_required
9-
override fun getDescriptionString(): String =
10-
intent.getStringExtra(EXTRA_FEATURE_NAME)?.let {
9+
override fun getDescriptionString(): String {
10+
val baseDescription = intent.getStringExtra(EXTRA_FEATURE_NAME)?.let {
1111
resources.getString(R.string.application_password_required_description, it)
12-
} ?: resources.getString(R.string.application_password_required_description_default)
12+
} ?: resources.getString(R.string.application_password_info_description_1)
13+
14+
return baseDescription + resources.getString(R.string.application_password_experimental_feature_note)
15+
}
1316
override fun getButtonTextResource(): Int = R.string.get_started
1417

1518
companion object {

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5062,7 +5062,7 @@ translators: %s: Select control option value e.g: "Auto, 25%". -->
50625062
<string name="application_password_required">Application Password Required</string>
50635063
<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>
50645064
<string name="application_password_required_block_editor">Block Editor</string>
5065-
<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>
5065+
<string name="application_password_experimental_feature_note">\n\nNote: Application Password authentication on Android devices is an Experimental Feature.</string>
50665066
<string name="application_password_disable_feature_title">Disable Application Password?</string>
50675067
<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>
50685068
<string name="application_password_info_title">Application Passwords</string>

WordPress/src/test/java/org/wordpress/android/ui/accounts/login/applicationpassword/ApplicationPasswordDialogViewModelTest.kt

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ import org.mockito.kotlin.whenever
1616
import org.wordpress.android.BaseUnitTest
1717
import org.wordpress.android.fluxc.utils.AppLogWrapper
1818
import org.wordpress.android.ui.accounts.login.ApplicationPasswordLoginHelper
19+
import org.wordpress.android.ui.prefs.experimentalfeatures.ExperimentalFeatures
1920
import kotlin.test.assertEquals
2021
import kotlin.test.assertFalse
2122
import kotlin.test.assertTrue
@@ -28,6 +29,9 @@ class ApplicationPasswordDialogViewModelTest : BaseUnitTest() {
2829
@Mock
2930
lateinit var appLogWrapper: AppLogWrapper
3031

32+
@Mock
33+
lateinit var experimentalFeatures: ExperimentalFeatures
34+
3135
private lateinit var viewModel: ApplicationPasswordDialogViewModel
3236

3337
private val testAuthUrl = "https://example.com/wp-admin/authorize-application.php"
@@ -39,7 +43,8 @@ class ApplicationPasswordDialogViewModelTest : BaseUnitTest() {
3943
MockitoAnnotations.openMocks(this)
4044
viewModel = ApplicationPasswordDialogViewModel(
4145
applicationPasswordLoginHelper,
42-
appLogWrapper
46+
appLogWrapper,
47+
experimentalFeatures
4348
)
4449
}
4550

0 commit comments

Comments
 (0)