Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
73 commits
Select commit Hold shift + click to select a range
6a0ffc0
Remove LoginEmailPasswordFragment
jkmassel Feb 4, 2026
1fbab6c
Remove Login Magic Link Fragments
jkmassel Feb 4, 2026
96efab7
Remove username/password WP.com flow
jkmassel Feb 4, 2026
ec46c76
Remove Google Login
jkmassel Feb 4, 2026
2758c9e
Remove LoginEmailFragment
jkmassel Feb 4, 2026
35f43d1
Remove Login 2FA fragment
jkmassel Feb 4, 2026
edaffca
Remove SignupMagicLinkFragment
jkmassel Feb 4, 2026
3c255cd
Remove orphaned files
jkmassel Feb 4, 2026
1e3546c
Remove the “Find your site address” button
jkmassel Feb 4, 2026
1c99bec
Remove SignupEpilogueFragment
jkmassel Feb 4, 2026
9160e50
Remove native account signup code
jkmassel Feb 4, 2026
ce0073f
Remove `PostSignupInterstitialActivity`
jkmassel Feb 4, 2026
8e986ec
Remove SmartLock
jkmassel Feb 4, 2026
66d9dcc
Remove `WOO_LOGIN_MODE`
jkmassel Feb 4, 2026
7bfbad9
Don’t show the username/password fields for Application Password sites
jkmassel Feb 4, 2026
cf3c087
In the Me tab, start WP.com login directly
jkmassel Feb 4, 2026
f44cb62
Fix strings
jkmassel Feb 4, 2026
6ba3d56
Fix WP.com login UI
jkmassel Feb 4, 2026
6df3ebf
Improve the WP.org login device name
jkmassel Feb 4, 2026
1d1a3b3
Add self-hosted site reauthentication
jkmassel Feb 4, 2026
410c5e3
Display more detailed error messages
jkmassel Feb 4, 2026
af69339
Fix WP.com sharing login flow
jkmassel Feb 4, 2026
c7ddba3
Fix share flow login
jkmassel Feb 4, 2026
95378d4
Remove `LoginMode.JETPACK_SELFHOSTED`
jkmassel Feb 4, 2026
69d6cfd
Move resources out of login module into app
jkmassel Feb 5, 2026
2c12390
Flatten theme heirarchies
jkmassel Feb 5, 2026
c027f73
Modernize login prologue
jkmassel Feb 5, 2026
899ce4c
Fix edge-to-edge for login
jkmassel Feb 5, 2026
a714deb
Automatically load notifications when switching to that tab
jkmassel Feb 5, 2026
d2a2e6c
Fix Application Password login focus
jkmassel Feb 5, 2026
fd483b1
Remove login module from CI
jkmassel Feb 5, 2026
bde0180
Remove unused styles
jkmassel Feb 5, 2026
d919d1b
Add nullable annotation
jkmassel Feb 5, 2026
4a088dd
Remove deprecated Smart Lock Credentials API and play-services-auth
jkmassel Feb 5, 2026
3447b3a
Remove trailing comma in localization.rb array
jkmassel Feb 5, 2026
780ab55
Fix trailing backslash in run-unit-tests.sh
jkmassel Feb 5, 2026
cf6474d
Remove unused imports left over from login lib removal
jkmassel Feb 5, 2026
4fee85a
Suppress detekt LongMethod for application password error handling
jkmassel Feb 5, 2026
3fb5955
Delete unused bg_oval_translucent_stroke_3dp drawable
jkmassel Feb 6, 2026
5e68818
Remove references to deleted signup epilogue analytics constants
jkmassel Feb 6, 2026
0862026
Fix constructor mismatches in application password test files
jkmassel Feb 6, 2026
5937e18
Remove unused login prologue resources
jkmassel Feb 6, 2026
96f1a0d
Restore login_prologue_revamped colors used by wordpress source set
jkmassel Feb 6, 2026
4089f49
Remove remaining unused resources from login lib removal
jkmassel Feb 6, 2026
d862acc
Move login prologue revamped colors to wordpress source set
jkmassel Feb 6, 2026
b4d04c4
Fix dark/light mode switching issues
jkmassel Feb 6, 2026
38f5d2d
Add a release note
jkmassel Feb 6, 2026
a127c22
Remove unused View import in LoginActivity
jkmassel Feb 6, 2026
4c0fa02
Remove stale Google Login warnings from build scripts
jkmassel Feb 26, 2026
b31a705
Use bodyLarge text style for site address label
jkmassel Feb 26, 2026
61edbf9
Make login form scrollable for landscape support
jkmassel Feb 26, 2026
348f53c
Fix ANR risk and error handling in WP.com OAuth login
jkmassel Feb 26, 2026
d75fd06
Handle null and unknown values in LoginFlow.fromIntent()
jkmassel Feb 26, 2026
204e4c5
Connect site comparison logic after OAuth login
jkmassel Feb 26, 2026
904ae22
Persist login flow state in SharedPreferences instead of static fields
jkmassel Feb 26, 2026
2b283f2
Add system bar transparency to login night theme
jkmassel Feb 26, 2026
1502f06
Add @Singleton to LoginAnalyticsTracker provider method
jkmassel Feb 26, 2026
894f6de
Call startPostLoginServices and remove dead stub methods
jkmassel Feb 26, 2026
0af09f6
Remove leftover debug Log.e in WPMainActivity
jkmassel Feb 26, 2026
ca7d909
Remove plaintext username from debug logs
jkmassel Feb 26, 2026
92e6293
Replace deprecated onActivityCreated with onViewCreated
jkmassel Feb 26, 2026
f876598
Align ARG_LOGIN_FLOW constant name with its string value
jkmassel Feb 26, 2026
98aec39
Unbind CustomTabsServiceConnection on dispose
jkmassel Feb 26, 2026
6f45cb8
Use Channel instead of SharedFlow for discovery URL event
jkmassel Feb 26, 2026
452046a
Suppress overdraw lint warning on login loading layout
jkmassel Feb 26, 2026
48167b3
Add tools:keep for flavor-specific login prologue colors
jkmassel Feb 26, 2026
a066f1a
Redirect WP.com site addresses to OAuth login flow
jkmassel Feb 26, 2026
3fdaa65
Remove old login lib references from e2e tests
jkmassel Feb 26, 2026
c9a5cf3
Call onFailure when OAuth callback is missing code parameter
jkmassel Feb 26, 2026
adec5f2
Fix detekt violations and CI unit test task name
jkmassel Mar 17, 2026
8198d40
Merge remote-tracking branch 'origin/trunk' into remove/login-lib
jkmassel Mar 17, 2026
4a2f39d
Persist post-OAuth loading state across configuration changes
nbradbury Mar 17, 2026
6d75d09
Fix share flow race condition in LoginActivity onResume
nbradbury Mar 17, 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 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 @@ -168,7 +168,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 @@ -221,7 +220,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 @@ -373,7 +371,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 @@ -415,7 +412,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 @@ -587,10 +583,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