Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
23 commits
Select commit Hold shift + click to select a range
029df77
Upgrade Gradle 9.1.0 + AGP 9.0.1
nbradbury Mar 17, 2026
0a8f644
RS Post Settings: Survive dialog selection across rotation (#22699)
nbradbury Mar 17, 2026
cc26b8d
Remove Login Module (#22564)
jkmassel Mar 17, 2026
ff650b9
Remove AGP 9 opt-out flags and adopt built-in Kotlin
nbradbury Mar 18, 2026
a9700f9
Remove obsolete AGP 9 gradle.properties flags
nbradbury Mar 18, 2026
49d8dcd
Fix issues introduced by login lib removal (#22703)
nbradbury Mar 18, 2026
d934700
Keep R8 full mode disabled to reduce migration risk
nbradbury Mar 18, 2026
d0c5c52
Add diagnostic error handling for application password login (#22702)
jkmassel Mar 19, 2026
2bd4f59
Bump io.sentry.android.gradle from 6.1.0 to 6.2.0 (#22708)
dependabot[bot] Mar 19, 2026
f354840
Activity Log: Show MCP agent metadata (#22706)
jkmassel Mar 19, 2026
fff0986
Merge feature/agp9-feature-branch into feature/agp9-phase-4-5
nbradbury Mar 19, 2026
c8ee1cb
Bump json from 2.18.1 to 2.19.2 (#22715)
dependabot[bot] Mar 19, 2026
52170cd
RS Post Settings: Add search to author dialog (#22689)
nbradbury Mar 19, 2026
fd280c8
Merge release/26.7 into trunk (#22716)
wpmobilebot Mar 20, 2026
f22f2d3
Bump org.mockito.kotlin:mockito-kotlin from 6.2.3 to 6.3.0 (#22718)
dependabot[bot] Mar 20, 2026
11d5a0f
RS Post Settings: Use device timezone for date picker (#22704)
nbradbury Mar 20, 2026
f05dc6b
CMM-1936: Add Insights tab to new stats screen (#22711)
adalpari Mar 20, 2026
0187959
Merge trunk into feature/agp9-phase-final
nbradbury Mar 20, 2026
cb9a3e7
Show Insights and Subscribers stats tabs for all users (#22722)
adalpari Mar 20, 2026
be4185f
Bump com.google.firebase:firebase-bom from 34.10.0 to 34.11.0 (#22719)
dependabot[bot] Mar 20, 2026
46f2a65
Bump the kotlin-ksp group with 9 updates (#22717)
dependabot[bot] Mar 20, 2026
0c9a9a3
Remove Application Password experimental feature flag (#22721)
adalpari Mar 20, 2026
cacabee
Merge trunk into feature/agp9-phase-4-5
nbradbury Mar 20, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
5 changes: 1 addition & 4 deletions .buildkite/commands/run-unit-tests.sh
Original file line number Diff line number Diff line change
Expand Up @@ -14,12 +14,10 @@ set +e
:libs:processors:test \
:libs:image-editor:testDebugUnitTest \
:libs:fluxc:testDebugUnitTest \
:libs:login:testDebugUnitTest \
koverXmlReportWordpressDebug \
:libs:processors:koverXmlReportJvm \
:libs:image-editor:koverXmlReportDebug \
:libs:fluxc:koverXmlReportDebug \
:libs:login:koverXmlReportDebug
:libs:fluxc:koverXmlReportDebug
TESTS_EXIT_STATUS=$?
set -e
echo ""
Expand Down Expand Up @@ -49,7 +47,6 @@ declare -A TEST_RESULT_DIRS=(
["processors"]="libs/processors/build/test-results/test"
["image-editor"]="libs/image-editor/build/test-results/testDebugUnitTest"
["fluxc"]="libs/fluxc/build/test-results/testDebugUnitTest"
["login"]="libs/login/build/test-results/testDebugUnitTest"
)

# Create temporary directory for collecting all test results
Expand Down
2 changes: 1 addition & 1 deletion Gemfile.lock
Original file line number Diff line number Diff line change
Expand Up @@ -263,7 +263,7 @@ GEM
concurrent-ruby (~> 1.0)
java-properties (0.3.0)
jmespath (1.6.2)
json (2.18.1)
json (2.19.2)
jwt (2.10.2)
base64
kramdown (2.5.1)
Expand Down
2 changes: 1 addition & 1 deletion RELEASE-NOTES.txt
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@

26.6
-----

* [**] Improved the login experience – it now works edge-to-edge and should be easier to read.

26.5
-----
Expand Down
8 changes: 0 additions & 8 deletions WordPress/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -171,7 +171,6 @@ android {
// Override these constants in jetpack product flavor to enable/ disable features
buildConfigField "boolean", "ENABLE_SITE_CREATION", "true"
buildConfigField "boolean", "ENABLE_ADD_SELF_HOSTED_SITE", "true"
buildConfigField "boolean", "ENABLE_SIGNUP", "true"
buildConfigField "boolean", "ENABLE_READER", "true"
buildConfigField "boolean", "ENABLE_CREATE_FAB", "true"
buildConfigField "boolean", "ENABLE_FOLLOWED_SITES_SETTINGS", "true"
Expand Down Expand Up @@ -224,7 +223,6 @@ android {
buildConfigField "boolean", "IS_JETPACK_APP", "true"
buildConfigField "boolean", "ENABLE_SITE_CREATION", "true"
buildConfigField "boolean", "ENABLE_ADD_SELF_HOSTED_SITE", "true"
buildConfigField "boolean", "ENABLE_SIGNUP", "true"
buildConfigField "boolean", "ENABLE_READER", "true"
buildConfigField "boolean", "ENABLE_CREATE_FAB", "true"
buildConfigField "boolean", "ENABLE_FOLLOWED_SITES_SETTINGS", "true"
Expand Down Expand Up @@ -376,7 +374,6 @@ dependencies {
strictly libs.wordpress.utils.get().version
}
}
implementation project(":libs:login")
implementation project(":libs:posttypes")
implementation("$gradle.ext.aboutAutomatticBinaryPath:${libs.versions.automattic.about.get()}")

Expand Down Expand Up @@ -418,7 +415,6 @@ dependencies {
implementation(libs.androidx.lifecycle.process)
implementation(libs.android.volley)
implementation(libs.google.play.review)
implementation(libs.google.play.services.auth)
implementation(libs.google.mlkit.barcode.scanning.common)
implementation(libs.google.mlkit.text.recognition)
implementation(libs.google.mlkit.barcode.scanning.main)
Expand Down Expand Up @@ -590,10 +586,6 @@ if (!file("google-services.json").exists()) {
}
}

// Print warning message if example Google services file is used.
if ((file('google-services.json').text) == (file('google-services.json-example').text)) {
println("WARNING: You're using the example google-services.json file. Google login will fail.")
}

tasks.register("printVersionName") {
def versionName = android.defaultConfig.versionName
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,6 @@ import org.junit.Test
import org.wordpress.android.e2e.flows.LoginFlow
import org.wordpress.android.support.BaseTest
import org.wordpress.android.support.ComposeEspressoLink
import org.wordpress.android.support.E2ECredentials

@HiltAndroidTest
class LoginTests : BaseTest() {
Expand All @@ -16,61 +15,11 @@ class LoginTests : BaseTest() {
logoutIfNecessary()
}

@Test
fun e2eLoginWithEmailPassword() {
LoginFlow().chooseContinueWithWpCom(super.mComposeTestRule)
.enterEmailAddress(E2ECredentials.WP_COM_USER_EMAIL)
.enterPassword(E2ECredentials.WP_COM_USER_PASSWORD)
.confirmLogin()

ComposeEspressoLink().unregister()
}

@Test
fun e2eLoginWithPasswordlessAccount() {
LoginFlow().chooseContinueWithWpCom(super.mComposeTestRule)
.enterEmailAddress(E2ECredentials.WP_COM_PASSWORDLESS_USER_EMAIL)
.openMagicLink()
.confirmLogin()

ComposeEspressoLink().unregister()
}

@Test
fun e2eLoginWithSiteAddress() {
// Self-hosted login now uses application passwords via Custom Tabs,
// so this test only verifies navigation to the site address screen
LoginFlow().chooseEnterYourSiteAddress(super.mComposeTestRule)
.enterSiteAddress(E2ECredentials.WP_COM_USER_SITE_ADDRESS)
.enterEmailAddress(E2ECredentials.WP_COM_USER_EMAIL)
.enterPassword(E2ECredentials.WP_COM_USER_PASSWORD)
.confirmLogin()

ComposeEspressoLink().unregister()
}

@Test
fun e2eLoginWithMagicLink() {
try {
LoginFlow().chooseContinueWithWpCom(super.mComposeTestRule)
.enterEmailAddress(E2ECredentials.WP_COM_USER_EMAIL)
.chooseMagicLink()
.openMagicLink()
.confirmLogin()

ComposeEspressoLink().unregister()
} finally {
logoutIfNecessary()
}
}

@Test
fun e2eLoginWithSelfHostedAccount() {
LoginFlow().chooseEnterYourSiteAddress(super.mComposeTestRule)
.enterSiteAddress(E2ECredentials.SELF_HOSTED_USER_SITE_ADDRESS)
.enterUsernameAndPassword(
E2ECredentials.SELF_HOSTED_USER_USERNAME,
E2ECredentials.SELF_HOSTED_USER_PASSWORD
)
.confirmLogin()

ComposeEspressoLink().unregister()
}
Expand Down

This file was deleted.

Original file line number Diff line number Diff line change
@@ -1,113 +1,28 @@
package org.wordpress.android.e2e.flows

import android.app.Activity
import android.content.Context
import android.content.Intent
import android.net.Uri
import android.widget.EditText
import androidx.compose.ui.test.junit4.ComposeTestRule
import androidx.test.core.app.ActivityScenario
import androidx.test.core.app.ApplicationProvider
import androidx.test.espresso.Espresso
import androidx.test.espresso.matcher.ViewMatchers
import org.hamcrest.CoreMatchers
import org.hamcrest.Matchers
import org.wordpress.android.BuildConfig
import org.wordpress.android.R
import org.wordpress.android.e2e.pages.HelpScreen
import org.wordpress.android.e2e.pages.LandingPage.tapContinueWithWpCom
import org.wordpress.android.e2e.pages.LandingPage.tapEnterYourSiteAddress
import org.wordpress.android.support.WPSupportUtils
import org.wordpress.android.login.R as LoginR

class LoginFlow {
fun chooseContinueWithWpCom(composeTestRule: ComposeTestRule?): LoginFlow {
// Login Prologue – We want to Continue with WordPress.com, not a site address
// Note: WP.com login now uses web-based OAuth flow via Custom Tabs
tapContinueWithWpCom(composeTestRule!!)
return this
}

fun enterEmailAddress(emailAddress: String?): LoginFlow {
// Email Address Screen – Fill it in and click "Continue"
// See LoginEmailFragment
WPSupportUtils.populateTextField(R.id.input, emailAddress)
WPSupportUtils.clickOn(LoginR.id.login_continue_button)
return this
}

fun enterPassword(password: String?): LoginFlow {
// Password Screen – Fill it in and click "Continue"
// See LoginEmailPasswordFragment
WPSupportUtils.populateTextField(R.id.input, password)
WPSupportUtils.clickOn(R.id.bottom_button)
return this
}

fun chooseMagicLink(): LoginFlow {
// Password Screen – Choose "Get a login link by email"
// See LoginEmailPasswordFragment
WPSupportUtils.clickOn(LoginR.id.login_get_email_link)
return this
}

fun openMagicLink(): LoginFlow {
// Magic Link Sent Screen – Should see "Check email" button
// See LoginMagicLinkSentFragment
WPSupportUtils.waitForElementToBeDisplayed(LoginR.id.login_open_email_client)

// Follow the magic link to continue login
// Intent is invoked directly rather than through a browser as WireMock is unavailable once in the background
val appVariant = BuildConfig.FLAVOR
val intent =
Intent(Intent.ACTION_VIEW, Uri.parse("$appVariant://magic-login?token=valid_token"))
.setPackage(ApplicationProvider.getApplicationContext<Context>().packageName)
ActivityScenario.launch<Activity>(intent)
return this
}

fun enterUsernameAndPassword(username: String, password: String): LoginFlow {
val usernameElement = Espresso.onView(
CoreMatchers.allOf(
ViewMatchers.isDescendantOfA(ViewMatchers.withId(LoginR.id.login_username_row)),
Matchers.instanceOf(EditText::class.java)
)
)
val passwordElement = Espresso.onView(
CoreMatchers.allOf(
ViewMatchers.isDescendantOfA(ViewMatchers.withId(LoginR.id.login_password_row)),
Matchers.instanceOf(EditText::class.java)
)
)
WPSupportUtils.populateTextField(
usernameElement, """
$username

""".trimIndent()
)
WPSupportUtils.populateTextField(
passwordElement, """
$password

""".trimIndent()
)
WPSupportUtils.clickOn(R.id.bottom_button)
return this
}

fun chooseEnterYourSiteAddress(composeTestRule: ComposeTestRule?): LoginFlow {
// Login Prologue – We want to continue with a site address not a WordPress.com account
tapEnterYourSiteAddress(composeTestRule!!)
return this
}

fun enterSiteAddress(siteAddress: String?): LoginFlow {
// Site Address Screen – Fill it in and click "Continue"
// See LoginSiteApplicationPasswordFragment
WPSupportUtils.populateTextField(R.id.input, siteAddress)
WPSupportUtils.clickOn(R.id.bottom_button)
return this
}

fun tapHelp(): HelpScreen {
WPSupportUtils.clickOn(Espresso.onView(ViewMatchers.withId(R.id.help)))
return HelpScreen()
Expand Down
Loading
Loading