Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Issue/8225 fix google sign up #8252

Merged
merged 13 commits into from
Sep 10, 2018
Merged

Issue/8225 fix google sign up #8252

merged 13 commits into from
Sep 10, 2018

Conversation

malinajirka
Copy link
Contributor

@malinajirka malinajirka commented Aug 29, 2018

Fixes #8225 #8223

@planarvoid and I were working on this issue together, so I believe it'd be good for someone else to review this PR.

Issues

  • Infinite progress dialog that couldn't be cancelled
  • No feedback after selecting an account
  • generic error on deleted account
  • 2FA broken when FluxC sends a verification SMS
  • weird state after an unsuccessful sign up/in when all the options were broken

It'd be hard to list all the things that have been broken. Some of them were happening in rare scenarios. We have tried to cover all the use-cases and test them extensively.
It's hard to connect the fixes with the issues, some of them fix more than one thing. Please feel free to ask if you have any doubts.

To test:
Sign up screen

State: New account (non 2fa)

  1. Clear app data
  2. Open the app
  3. Click on "Sign up for WordPress.com"
  4. Click on "Sign up with Google"
  5. Wait until an account chooser appears
  6. Select an account
  7. Allow access to your Google account
  8. Epilogue is shown

State: Existing WordPress account not connected to Google

  1. Clear app data
  2. Open the app
  3. Click on "Sign up for WordPress.com"
  4. Click on "Sign up with Google"
  5. Wait until an account chooser appears
  6. Select an account
  7. Toast "Email already exists" is shown
  8. Login with WordPress password is shown (if you created your account with a magic link, you need to add a password)
  9. Enter your password
  10. Epilogue is shown

State: Existing WordPress account connected to Google

  1. Clear app data
  2. Open the app
  3. Click on "Sign up for WordPress.com"
  4. Click on "Sign up with Google"
  5. Wait until an account chooser appears
  6. Select an account
  7. Epilogue is shown

State: Existing WordPress account with 2fa not connected to Google

  1. Clear app data
  2. Open the app
  3. Click on "Sign up for WordPress.com"
  4. Click on "Sign up with Google"
  5. Wait until an account chooser appears
  6. Select an account
  7. Allow access to your Google account
  8. Toast "Email already exists" is shown
  9. Login with WordPress password is shown (if you created your account with a magic link, you need to add a password)
  10. Enter your password
  11. 2FA verification screen is shown
  12. Enter the code from 2FA
  13. Epilogue is shown

State: Existing WordPress account with 2fa connected to Google

  1. Clear app data
  2. Open the app
  3. Click on "Sign up for WordPress.com"
  4. Click on "Sign up with Google"
  5. Wait until an account chooser appears
  6. Select an account
  7. Toast "Email already exists" is shown
  8. 2FA verification screen is shown
  9. Enter the code from 2FA
  10. Epilogue is shown


Sign in screen

State: Non existing account (non 2fa)

  1. Clear app data
  2. Open the app
  3. Click on "Log in"
  4. Click on "Login with Google"
  5. Wait until an account chooser appears
  6. Select an account
  7. Dialog "The google account xyz@abc...." is shown

State: Existing WordPress account not connected to Google

  1. Clear app data
  2. Open the app
  3. Click on "Log in"
  4. Click on "Login with Google"
  5. Wait until an account chooser appears
  6. Select an account
  7. Login with WordPress password is shown (if you created your account with a magic link, you need to add a password)
  8. Enter your password
  9. Epilogue is shown

State: Existing WordPress account connected to Google

  1. Clear app data
  2. Open the app
  3. Click on "Log in"
  4. Click on "Login with Google"
  5. Wait until an account chooser appears
  6. Select an account
  7. Epilogue is shown

State: Existing WordPress account with 2fa not connected to Google

  1. Clear app data
  2. Open the app
  3. Click on "Log in"
  4. Click on "Login with Google"
  5. Wait until an account chooser appears
  6. Select an account
  7. Login with WordPress password is shown (if you created your account with a magic link, you need to add a password)
  8. Enter your password
  9. 2FA verification screen is shown
  10. Enter the 2FA code
  11. Epilogue is shown

State: Existing WordPress account with 2fa connected to Google
2. Open the app
3. Click on "Log in"
4. Click on "Login with Google"
5. Wait until an account chooser appears
6. Select an account
7. 2FA verification screen is shown
8. Enter the 2FA code
9. Epilogue is shown

@theck13
Copy link
Contributor

theck13 commented Aug 29, 2018

The test steps are the same as those from the original Google login and signup pull requests, which were tested and passed. Can you be more specific about the rare scenarios so I can be sure to test the case(s) in question?

@planarvoid
Copy link
Contributor

planarvoid commented Aug 29, 2018

@theck13 for example 2fa:
There are 2 usecases that might happen when you have an account with 2fa enabled and you try to login. In both usecases you receive the OnSocialChanged. In the usecase that passes the requiresTwoStepAuth is set to true, the app opens the verification screen, the user requests an SMS code and everything is ok. In the previously failing usecase the app requests the verification code by itself and returns an event in which requiresTwoStepAuth is false but the notificationSent field is filled with a text sms. The second usecase is valid in FluxC but it was not handled in WPAndroid. In LoginGoogleFragment#onSocialChanged it fell through to the last else and finished the flow. At the same time the user received an SMS with the verification code (which is confusing because there is no verification screen).
This broke 2fa for me in most attempts. What sometimes worked was going back and trying again.

I'm sure @malinajirka has more usecases he can describe here.

@theck13
Copy link
Contributor

theck13 commented Aug 29, 2018

Are there specific devices and/or Android version(s)?

@planarvoid
Copy link
Contributor

The 2fa bug was happening to me on my Pixel 2 with Android Pie and on my emulator with Android 8. I know Jirka was testing the Google flow also on an old Samsung device.

@malinajirka
Copy link
Contributor Author

I don't remember all the scenarios, but I'll try to list at least some of them. Not all are easily reproducible -> I just kept trying to signing in/up.

One of the infinite dialog cases

  1. Delete your WordPress account
  2. Try the Google sign-up with the same email address
  3. Generic error -> "There was some troubles connecting with the Google account" is shown

Broken flow - happening mostly on low cost devices with limited memory (Samsung Galaxy Lite 2 - Android 4.4).

  1. Click on "Sign Up With Google"
  2. Account chooser is shown
  3. Select an account
    4a. Sometimes an infinite dialog which can't be canceled is shown
    4b. Sometimes the dialog disappears, but nothing else happens (I think the activity's onSaveInstanceState gets called -> the GoogleSignUp fragment is removed)

Broken flow - weird state which I'm not sure how to reproduce, but happens from time to time (happened on both Pixel 2, Android 9 and Samsung Galaxy Lite 2, Android 4.4 phones)

  1. Click on "Sign Up with Google"
  2. Semi-transparent grey overlay is shown
  3. Nothing else happens

Generic error message (2fa code can be generated just once per minute)

  1. Login to a WordPress account with 2fa in a browser
  2. Open the app
  3. Click on "Log in" button
  4. Click on "Log in with Google"
  5. Generic error -> "There was some troubles connecting with the Google account" is shown

@theck13
Copy link
Contributor

theck13 commented Aug 29, 2018

Are all four of those scenarios fixed with these changes? It seems like the first set is due to some backend server confusion and it's not clear where that is fixed with these changes. The second set sounds like I need to use and low-memory device with Android 4.4. Where can I find how that is fixed with these changes? The third set sounds inconsistent and due to another backend issue. Which changes address that? The fourth set seems to be the only one for certain to reproduce. Were there changes to update the error message or was something else changed?

It's hard to follow what changes correspond to each issue.

I'm interested in specific steps for devices and/or Android versions because we tested this previously and they were verified as I mentioned.

getActivity().getSupportFragmentManager().beginTransaction().remove(this).commit();
finishSignUp();
} else {
AppLog.d(T.MAIN, "GOOGLE SIGNUP: onSocialChanged - shouldn't happen - google sign in success");
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Following flow is "fixed" with this else branch -> the user is redirected to "Login with WordPress password is shown" and when they try to log in a valid error message is shown (something like your account seems to be deleted, contact our support if you haven't deleted your account).

One of the infinite dialog cases
1. Delete your WordPress account
2. Try the Google sign-up with the same email address
3. Generic error -> "There was some troubles connecting with the Google account" is shown

@@ -158,14 +164,6 @@ protected void onCreate(Bundle savedInstanceState) {

@Override
public void onSaveInstanceState(Bundle outState) {
SignupGoogleFragment signupGoogleFragment;
Copy link
Contributor Author

@malinajirka malinajirka Aug 29, 2018

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Following flow is fixed here -> this change requires to change a lot of other code - > mainly the finishSignupFlow needs to be invoked in all scenarios when the flow is finished.

Broken flow - happening mostly on low cost devices with limited memory (Samsung Galaxy Lite 2 - Android 4.4).
1. Click on "Sign Up With Google"
2. Account chooser is shown
3. Select an account
4a. Sometimes an infinite dialog which can't be canceled is shown
4b. Sometimes the dialog disappears, but nothing else happens (I think the activity's onSaveInstanceState gets called -> the GoogleSignUp fragment is removed)

Copy link
Contributor Author

@malinajirka malinajirka Aug 29, 2018

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think following flow got fixed as part of this change as well. It sometimes happens in the production version of the app but never happened on this branch. What might have also helped to fix this issue is, that we always disconnect the GoogleApiClient when the activityResult is returned.

Broken flow - weird state which I'm not sure how to reproduce, but happens from time to time (happened on both Pixel 2, Android 9 and Samsung Galaxy Lite 2, Android 4.4 phones)

1. Click on "Sign Up with Google"
2. Semi-transparent grey overlay is shown
3. Nothing else happens

// Response does not return error when two-factor authentication is required.
} else if (event.requiresTwoStepAuth) {
// Response does not return error when two-factor authentication is required.
} else if (event.requiresTwoStepAuth || "sms".equals(event.notificationSent)) {
Copy link
Contributor Author

@malinajirka malinajirka Aug 29, 2018

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Following flow is fixed here and in the same else branch in the SignUpGoogleFragment.

Generic error message (2fa code can be generated just once per minute)

1. Login to a WordPress account with 2fa in a browser
2. Open the app
3. Click on "Log in" button
4. Click on "Log in with Google"
5. Generic error -> "There was some troubles connecting with the Google account" is shown

@malinajirka
Copy link
Contributor Author

I agree you'll need a low cost device to test the second set. However, I've tested it extensively after the changes and afaik it works.

It's hard to follow what changes correspond to each issue.

I've tried to add some in-code comments pointing to specific lines. However, I'd suggest to review and test the code without keeping focus on which line fixes which issue.

I'm interested in specific steps for devices and/or Android versions because we tested this previously and they were verified as I mentioned.

Unfortunately, I don't have more info than what I provided in my previous comment. I agree it's not exactly specific, but both Vojta and I had troubles when we tried to sign-up in the production version of the app and I believe it works pretty well now. I think one of the reasons why it worked during the tests is that most people test it with same type of a phone. Maybe, it's also possible the Google Services got updated since the feature was tested - who knows.

@malinajirka
Copy link
Contributor Author

Last thing I'd like to add. I definitely don't want to give an impression that I think this issue is someones fault (developer's, reviewer's, tester's or anyone's else). We've all experienced releasing a code which worked and was tested, but turned out to have some issues in the future. I'm looking forward to see if these changes will have any impact on percentage of successful sign up/in :-).

@@ -761,6 +749,24 @@ public void onGoogleSignupFinished(String name, String email, String photoUrl, S
finish();
}

@Override public void onGoogleSignupError(String msg) {
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The @Override annotation should be on a separate line from the onGoogleSignupError method for code consistency.

dialog.show(this.getSupportFragmentManager(), GOOGLE_ERROR_DIALOG_TAG);
}

@Override public void onPositiveClicked(@NotNull String instanceTag) {
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The @Override annotation should be on a separate line from the onPositiveClicked method for code consistency.

@@ -76,7 +80,7 @@

public class LoginActivity extends AppCompatActivity implements ConnectionCallbacks, OnConnectionFailedListener,
Callback, LoginListener, GoogleListener, LoginPrologueListener, SignupSheetListener,
HasSupportFragmentInjector {
HasSupportFragmentInjector, BasicDialogPositiveClickInterface {
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Is the BasicDialogPositiveClickInterface implementation necessary since the onPositiveClicked method does nothing (i.e. the dialog is dismissed)?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

BasicDialogFragments verifies in the onAttach method that the parent activity implements the interface and throws an exception if it doesn't.

@@ -2066,6 +2066,7 @@
<string name="login_error_button">Close</string>
<string name="login_error_email_not_found">The Google account \'%s\' doesn\'t match any existing account on WordPress.com.</string>
<string name="login_error_generic">There was some trouble connecting with the Google account.</string>
<string name="login_error_sms_throttled">Too many attempts on sending SMS verification code. Try again in a minute.</string>
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Was this copied from the web or iOS? If not, has it been reviewed by Editorial? If not, let's add the [Status] Needs Copy Review label and check with them.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

👍

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Tweaks for 2 and 4:

  • There's no WordPress.com account matching this Google account.
  • We've made too many attempts to send an SMS verification code -- take a break, and request a new one in a minute.

On the "There was some trouble..." is there something we can tell them about what to do next? Wait a few minutes and try again?

Copy link
Contributor Author

@malinajirka malinajirka Aug 31, 2018

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thank you @michelleweber !

On the "There was some trouble..." is there something we can tell them about what to do next? Wait a few minutes and try again?

Nope, it's an unexpected state and we don't know if there is something wrong with their account/our app/server or it just haven't worked out because of a temporary outage.

@Override
public void onDetach() {
super.onDetach();
@Override public void onDestroy() {
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The @Override annotation should be on a separate line from the onDestroy method for code consistency.

break;
}
// Response does not return error when two-factor authentication is required.
} else if (event.requiresTwoStepAuth) {
} else if (event.requiresTwoStepAuth || "sms".equals(event.notificationSent)) {
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Let's replace the hard-coded "sms" with a constant like Login2FaFragment.TWO_FACTOR_TYPE_SMS.

// Response does not return error when two-factor authentication is required.
} else if (event.requiresTwoStepAuth) {
// Response does not return error when two-factor authentication is required.
} else if (event.requiresTwoStepAuth || "sms".equals(event.notificationSent)) {
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Let's replace the hard-coded "sms" with a constant like Login2FaFragment.TWO_FACTOR_TYPE_SMS.

getActivity().getSupportFragmentManager().beginTransaction().remove(this).commit();
finishSignUp();
} else {
AppLog.d(T.MAIN, "GOOGLE SIGNUP: onSocialChanged - shouldn't happen - google sign in success");
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

For better differentiation between the two, we used Google login or signup rather than signin. Let's update sign in to signup for consistency.

mAnalyticsListener.trackSignupSocialToLogin();
mLoginListener.showSignupToLoginMessage();
// Dispatch social login action to retrieve data required for two-factor authentication.
PushSocialPayload payload = new PushSocialPayload(mIdToken, SERVICE_TYPE_GOOGLE);
AppLog.d(T.MAIN,
"GOOGLE SIGNUP: onSocialChanged - error - two step authentication - dispatching "
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The first part of the string can be on the previous line with the second part can be on the second since it makes the line longer than 120 characters.

mDispatcher.unregister(this);
getActivity().getSupportFragmentManager().beginTransaction().remove(this).commit();
finishSignUp();
} else {
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

We shouldn't make the assumption all scenarios that aren't an error and not two-factor authentication are a deleted WordPress account. It's possible that's not the case and we're directing them to login, which may be incorrect and confusing to the user. If we can ensure it's a deleted account, we should catch that case, show an appropriate message, and track that event specifically. If we can't, let's keep the generic error message and remove the SignupGoogleFragment to fix the indefinite dialog scenario.

Also, we're triggering the trackSignupSocialAccountsNeedConnecting statistic from the handleUserExists method, which should only be called when we're certain the user exists and their WordPress/Google accounts need to be connected. That's not true if they deleted their account.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I don't think we are making the assumption all scenarios that aren't an error and not two-factor authentication are a deleted WordPress account. We are making an assumption that all scenarios that aren't an error or not two-factor authentication are successful. I've renamed the handleUserExists to loginViaSocialAccount to make it more clear. Wdyt?

@theck13 theck13 removed their assignment Aug 30, 2018
@aerych
Copy link
Member

aerych commented Aug 30, 2018

Thanks @malinajirka for wrangling this. :)

Can I ask a favor? Authentication has quite a bit of complicated logic (as I'm sure you've seen by now) and we want to be very cautious about introducing a new regression in the course of fixing another. Testing all the different flows is very time consuming and with the more things a single PR fixes the easier it becomes to start to miss things during testing. Some of the glitches being fixed in this PR sound very tricky to reproduce, making the reviewer's job a bit harder.

With that in mind, I'm wondering if there is a way to break this PR into two or more smaller more targeted PRs where testing could also be more focused and less likely to overlook anything? What do you think?

I understand that some changes resolve multiple issues so not everything can be broken up, but any separation that makes the code more focused would be helpful.

@malinajirka
Copy link
Contributor Author

Thanks @aerych for your comment. I've considered breaking this PR into more smaller PRs, but I decided having everything in one PR makes more sense to me for the following reasons

  • we'd have to test all the scenarios in each of these PRs since the components aren't atomic
  • the changes are very connected and it's quite hard to break them into different PRs (we changed the logic how/when we remove the Login/SignUp fragments -> just this change makes us test everything)
  • I can't test it anymore since I've reached a limit on my phone number so I can't create any more Google accounts
  • It'd take me a lot of time and I wouldn't be able to make it in the Hack week time frame

@malinajirka
Copy link
Contributor Author

Thank you @theck13 !!! I've fixed most of the issues you've pointed out. I have left comments for those I haven't fixed.

I believe it's ready for another round. Thank you!!

@malinajirka malinajirka modified the milestones: 10.8 ❄️, 10.9 Aug 31, 2018
@AmandaRiu
Copy link
Contributor

AmandaRiu commented Sep 5, 2018

Crash:

Android API 24 (7.0) Samsung Galaxy S6

Steps:

  1. Opened WordPress app after fresh install
  2. Click signup
  3. Click to signup with google
  4. Select google account - google chooser closes
  5. Nothing happens

(NOTE - get same result for existing or new google account connection)

Full Log

Notable Log messages:

2018-09-05 17:33:36.972 23077-23077/org.wordpress.android I/WordPress-STATS: 🔵 Tracked: signup_google_button_tapped
2018-09-05 17:33:36.992 23077-23077/org.wordpress.android D/dagger.android.support: An injector for org.wordpress.android.login.SignupGoogleFragment was found in org.wordpress.android.ui.accounts.LoginActivity
2018-09-05 17:33:37.234 23077-23077/org.wordpress.android D/WordPress-MAIN: GOOGLE SIGNUP: startFlow
2018-09-05 17:33:41.987 23077-23077/org.wordpress.android D/WordPress-MAIN: GOOGLE SIGNUP: sign up result returned - canceled
2018-09-05 17:33:41.987 23077-23077/org.wordpress.android W/WordPress-STATS: There is NO match for the event SIGNUP_SOCIAL_BUTTON_FAILUREstat
2018-09-05 17:33:41.987 23077-23077/org.wordpress.android E/WordPress-NUX: Google Signup Failed: result was CANCELED.
2018-09-05 17:33:41.988 23077-23077/org.wordpress.android D/WordPress-MAIN: GOOGLE SIGNUP/LOGIN: finishing signup/login
2018-09-05 17:33:42.038 23077-23077/org.wordpress.android D/WordPress-MAIN: GOOGLE SIGNUP/LOGIN: disconnecting google client

Exception:

2018-09-05 17:28:39.825 23077-23077/org.wordpress.android I/chromium: [INFO:aw_field_trial_creator.cc(52)] First-WebView-Experiment found, group=Control
2018-09-05 17:28:39.877 23077-23077/org.wordpress.android I/art: Rejecting re-init on previously-failed class java.lang.Class<ul>: java.lang.NoClassDefFoundError: Failed resolution of: Landroid/webkit/SafeBrowsingResponse;
2018-09-05 17:28:39.877 23077-23077/org.wordpress.android I/art:     at xf com.android.webview.chromium.WebViewChromiumFactoryProvider.a(android.webkit.WebView, android.content.Context) (SourceFile:209)
2018-09-05 17:28:39.877 23077-23077/org.wordpress.android I/art:     at void com.android.webview.chromium.WebViewChromium.init(java.util.Map, boolean) (SourceFile:63)
2018-09-05 17:28:39.877 23077-23077/org.wordpress.android I/art:     at void android.webkit.WebView.<init>(android.content.Context, android.util.AttributeSet, int, int, java.util.Map, boolean) (WebView.java:636)
2018-09-05 17:28:39.877 23077-23077/org.wordpress.android I/art:     at void android.webkit.WebView.<init>(android.content.Context, android.util.AttributeSet, int, int) (WebView.java:572)
2018-09-05 17:28:39.877 23077-23077/org.wordpress.android I/art:     at void android.webkit.WebView.<init>(android.content.Context, android.util.AttributeSet, int) (WebView.java:555)
2018-09-05 17:28:39.877 23077-23077/org.wordpress.android I/art:     at void android.webkit.WebView.<init>(android.content.Context, android.util.AttributeSet) (WebView.java:542)
2018-09-05 17:28:39.877 23077-23077/org.wordpress.android I/art:     at void android.webkit.WebView.<init>(android.content.Context) (WebView.java:532)
2018-09-05 17:28:39.877 23077-23077/org.wordpress.android I/art:     at void org.wordpress.android.fluxc.network.UserAgent.<init>(android.content.Context, java.lang.String) (UserAgent.java:18)
2018-09-05 17:28:39.877 23077-23077/org.wordpress.android I/art:     at org.wordpress.android.fluxc.network.UserAgent org.wordpress.android.modules.AppConfigModule.provideUserAgent(android.content.Context) (AppConfigModule.java:22)
2018-09-05 17:28:39.877 23077-23077/org.wordpress.android I/art:     at org.wordpress.android.fluxc.network.UserAgent org.wordpress.android.modules.AppConfigModule_ProvideUserAgentFactory.get() (AppConfigModule_ProvideUserAgentFactory.java:30)
2018-09-05 17:28:39.877 23077-23077/org.wordpress.android I/art:     at java.lang.Object org.wordpress.android.modules.AppConfigModule_ProvideUserAgentFactory.get() (AppConfigModule_ProvideUserAgentFactory.java:10)
2018-09-05 17:28:39.877 23077-23077/org.wordpress.android I/art:     at org.wordpress.android.fluxc.network.rest.wpcom.account.AccountRestClient org.wordpress.android.fluxc.module.ReleaseNetworkModule_ProvideAccountRestClientFactory.get() (ReleaseNetworkModule_ProvideAccountRestClientFactory.java:68)
2018-09-05 17:28:39.877 23077-23077/org.wordpress.android I/art:     at java.lang.Object org.wordpress.android.fluxc.module.ReleaseNetworkModule_ProvideAccountRestClientFactory.get() (ReleaseNetworkModule_ProvideAccountRestClientFactory.java:15)
2018-09-05 17:28:39.877 23077-23077/org.wordpress.android I/art:     at java.lang.Object dagger.internal.DoubleCheck.get() (DoubleCheck.java:47)
2018-09-05 17:28:39.877 23077-23077/org.wordpress.android I/art:     at org.wordpress.android.fluxc.store.AccountStore org.wordpress.android.fluxc.store.AccountStore_Factory.get() (AccountStore_Factory.java:58)
2018-09-05 17:28:39.877 23077-23077/org.wordpress.android I/art:     at java.lang.Object org.wordpress.android.fluxc.store.AccountStore_Factory.get() (AccountStore_Factory.java:14)
2018-09-05 17:28:39.877 23077-23077/org.wordpress.android I/art:     at java.lang.Object dagger.internal.DoubleCheck.get() (DoubleCheck.java:47)
2018-09-05 17:28:39.877 23077-23077/org.wordpress.android I/art:     at void org.wordpress.android.WordPress_MembersInjector.injectMembers(org.wordpress.android.WordPress) (WordPress_MembersInjector.java:100)
2018-09-05 17:28:39.877 23077-23077/org.wordpress.android I/art:     at void org.wordpress.android.WordPress_MembersInjector.injectMembers(java.lang.Object) (WordPress_MembersInjector.java:17)
2018-09-05 17:28:39.877 23077-23077/org.wordpress.android I/art:     at void org.wordpress.android.modules.DaggerAppComponentDebug.inject(org.wordpress.android.WordPress) (DaggerAppComponentDebug.java:2220)
2018-09-05 17:28:39.877 23077-23077/org.wordpress.android I/art:     at void org.wordpress.android.WordPress.onCreate() (WordPress.java:225)
2018-09-05 17:28:39.877 23077-23077/org.wordpress.android I/art:     at void org.wordpress.android.WordPressDebug.onCreate() (WordPressDebug.java:14)
2018-09-05 17:28:39.877 23077-23077/org.wordpress.android I/art:     at void android.app.Instrumentation.callApplicationOnCreate(android.app.Application) (Instrumentation.java:1032)
2018-09-05 17:28:39.877 23077-23077/org.wordpress.android I/art:     at void android.app.ActivityThread.handleBindApplication(android.app.ActivityThread$AppBindData) (ActivityThread.java:5876)
2018-09-05 17:28:39.877 23077-23077/org.wordpress.android I/art:     at void android.app.ActivityThread.-wrap3(android.app.ActivityThread, android.app.ActivityThread$AppBindData) (ActivityThread.java:-1)
2018-09-05 17:28:39.877 23077-23077/org.wordpress.android I/art:     at void android.app.ActivityThread$H.handleMessage(android.os.Message) (ActivityThread.java:1699)
2018-09-05 17:28:39.877 23077-23077/org.wordpress.android I/art:     at void android.os.Handler.dispatchMessage(android.os.Message) (Handler.java:102)
2018-09-05 17:28:39.877 23077-23077/org.wordpress.android I/art:     at void android.os.Looper.loop() (Looper.java:154)
2018-09-05 17:28:39.877 23077-23077/org.wordpress.android I/art:     at void android.app.ActivityThread.main(java.lang.String[]) (ActivityThread.java:6682)
2018-09-05 17:28:39.877 23077-23077/org.wordpress.android I/art:     at java.lang.Object java.lang.reflect.Method.invoke!(java.lang.Object, java.lang.Object[]) (Method.java:-2)
2018-09-05 17:28:39.877 23077-23077/org.wordpress.android I/art:     at void com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run() (ZygoteInit.java:1520)
2018-09-05 17:28:39.877 23077-23077/org.wordpress.android I/art:     at void com.android.internal.os.ZygoteInit.main(java.lang.String[]) (ZygoteInit.java:1410)
2018-09-05 17:28:39.877 23077-23077/org.wordpress.android I/art: Caused by: java.lang.ClassNotFoundException: Didn't find class "android.webkit.SafeBrowsingResponse" on path: DexPathList[[zip file "/data/app/com.android.chrome-2/base.apk"],nativeLibraryDirectories=[/data/app/com.android.chrome-2/lib/arm64, /data/app/com.android.chrome-2/base.apk!/lib/arm64-v8a, /system/lib64, /vendor/lib64]]
2018-09-05 17:28:39.877 23077-23077/org.wordpress.android I/art:     at java.lang.Class dalvik.system.BaseDexClassLoader.findClass(java.lang.String) (BaseDexClassLoader.java:56)
2018-09-05 17:28:39.877 23077-23077/org.wordpress.android I/art:     at java.lang.Class java.lang.ClassLoader.loadClass(java.lang.String, boolean) (ClassLoader.java:380)
2018-09-05 17:28:39.877 23077-23077/org.wordpress.android I/art:     at java.lang.Class java.lang.ClassLoader.loadClass(java.lang.String) (ClassLoader.java:312)
2018-09-05 17:28:39.877 23077-23077/org.wordpress.android I/art:     at xf com.android.webview.chromium.WebViewChromiumFactoryProvider.a(android.webkit.WebView, android.content.Context) (SourceFile:209)
2018-09-05 17:28:39.877 23077-23077/org.wordpress.android I/art:     at void com.android.webview.chromium.WebViewChromium.init(java.util.Map, boolean) (SourceFile:63)
2018-09-05 17:28:39.877 23077-23077/org.wordpress.android I/art:     at void android.webkit.WebView.<init>(android.content.Context, android.util.AttributeSet, int, int, java.util.Map, boolean) (WebView.java:636)
2018-09-05 17:28:39.877 23077-23077/org.wordpress.android I/art:     at void android.webkit.WebView.<init>(android.content.Context, android.util.AttributeSet, int, int) (WebView.java:572)
2018-09-05 17:28:39.877 23077-23077/org.wordpress.android I/art:     at void android.webkit.WebView.<init>(android.content.Context, android.util.AttributeSet, int) (WebView.java:555)
2018-09-05 17:28:39.877 23077-23077/org.wordpress.android I/art:     at void android.webkit.WebView.<init>(android.content.Context, android.util.AttributeSet) (WebView.java:542)
2018-09-05 17:28:39.877 23077-23077/org.wordpress.android I/art:     at void android.webkit.WebView.<init>(android.content.Context) (WebView.java:532)
2018-09-05 17:28:39.877 23077-23077/org.wordpress.android I/art:     at void org.wordpress.android.fluxc.network.UserAgent.<init>(android.content.Context, java.lang.String) (UserAgent.java:18)
2018-09-05 17:28:39.877 23077-23077/org.wordpress.android I/art:     at org.wordpress.android.fluxc.network.UserAgent org.wordpress.android.modules.AppConfigModule.provideUserAgent(android.content.Context) (AppConfigModule.java:22)
2018-09-05 17:28:39.877 23077-23077/org.wordpress.android I/art:     at org.wordpress.android.fluxc.network.UserAgent org.wordpress.android.modules.AppConfigModule_ProvideUserAgentFactory.get() (AppConfigModule_ProvideUserAgentFactory.java:30)
2018-09-05 17:28:39.877 23077-23077/org.wordpress.android I/art:     at java.lang.Object org.wordpress.android.modules.AppConfigModule_ProvideUserAgentFactory.get() (AppConfigModule_ProvideUserAgentFactory.java:10)
2018-09-05 17:28:39.877 23077-23077/org.wordpress.android I/art:     at org.wordpress.android.fluxc.network.rest.wpcom.account.AccountRestClient org.wordpress.android.fluxc.module.ReleaseNetworkModule_ProvideAccountRestClientFactory.get() (ReleaseNetworkModule_ProvideAccountRestClientFactory.java:68)
2018-09-05 17:28:39.877 23077-23077/org.wordpress.android I/art:     at java.lang.Object org.wordpress.android.fluxc.module.ReleaseNetworkModule_ProvideAccountRestClientFactory.get() (ReleaseNetworkModule_ProvideAccountRestClientFactory.java:15)
2018-09-05 17:28:39.877 23077-23077/org.wordpress.android I/art:     at java.lang.Object dagger.internal.DoubleCheck.get() (DoubleCheck.java:47)
2018-09-05 17:28:39.877 23077-23077/org.wordpress.android I/art:     at org.wordpress.android.fluxc.store.AccountStore org.wordpress.android.fluxc.store.AccountStore_Factory.get() (AccountStore_Factory.java:58)
2018-09-05 17:28:39.877 23077-23077/org.wordpress.android I/art:     at java.lang.Object org.wordpress.android.fluxc.store.AccountStore_Factory.get() (AccountStore_Factory.java:14)
2018-09-05 17:28:39.877 23077-23077/org.wordpress.android I/art:     at java.lang.Object dagger.internal.DoubleCheck.get() (DoubleCheck.java:47)
2018-09-05 17:28:39.877 23077-23077/org.wordpress.android I/art:     at void org.wordpress.android.WordPress_MembersInjector.injectMembers(org.wordpress.android.WordPress) (WordPress_MembersInjector.java:100)
2018-09-05 17:28:39.877 23077-23077/org.wordpress.android I/art:     at void org.wordpress.android.WordPress_MembersInjector.injectMembers(java.lang.Object) (WordPress_MembersInjector.java:17)
2018-09-05 17:28:39.877 23077-23077/org.wordpress.android I/art:     at void org.wordpress.android.modules.DaggerAppComponentDebug.inject(org.wordpress.android.WordPress) (DaggerAppComponentDebug.java:2220)
2018-09-05 17:28:39.877 23077-23077/org.wordpress.android I/art:     at void org.wordpress.android.WordPress.onCreate() (WordPress.java:225)
2018-09-05 17:28:39.877 23077-23077/org.wordpress.android I/art:     at void org.wordpress.android.WordPressDebug.onCreate() (WordPressDebug.java:14)
2018-09-05 17:28:39.877 23077-23077/org.wordpress.android I/art:     at void android.app.Instrumentation.callApplicationOnCreate(android.app.Application) (Instrumentation.java:1032)
2018-09-05 17:28:39.877 23077-23077/org.wordpress.android I/art:     at void android.app.ActivityThread.handleBindApplication(android.app.ActivityThread$AppBindData) (ActivityThread.java:5876)
2018-09-05 17:28:39.877 23077-23077/org.wordpress.android I/art:     at void android.app.ActivityThread.-wrap3(android.app.ActivityThread, android.app.ActivityThread$AppBindData) (ActivityThread.java:-1)
2018-09-05 17:28:39.877 23077-23077/org.wordpress.android I/art:     at void android.app.ActivityThread$H.handleMessage(android.os.Message) (ActivityThread.java:1699)
2018-09-05 17:28:39.877 23077-23077/org.wordpress.android I/art:     at void android.os.Handler.dispatchMessage(android.os.Message) (Handler.java:102)
2018-09-05 17:28:39.877 23077-23077/org.wordpress.android I/art:     at void android.os.Looper.loop() (Looper.java:154)
2018-09-05 17:28:39.877 23077-23077/org.wordpress.android I/art:     at void android.app.ActivityThread.main(java.lang.String[]) (ActivityThread.java:6682)
2018-09-05 17:28:39.877 23077-23077/org.wordpress.android I/art:     at java.lang.Object java.lang.reflect.Method.invoke!(java.lang.Object, java.lang.Object[]) (Method.java:-2)
2018-09-05 17:28:39.877 23077-23077/org.wordpress.android I/art:     at void com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run() (ZygoteInit.java:1520)
2018-09-05 17:28:39.877 23077-23077/org.wordpress.android I/art:     at void com.android.internal.os.ZygoteInit.main(java.lang.String[]) (ZygoteInit.java:1410)
2018-09-05 17:28:39.882 23077-23077/org.wordpress.android I/art: Rejecting re-init on previously-failed class java.lang.Class<xo>: java.lang.NoClassDefFoundError: Failed resolution of: Landroid/webkit/RenderProcessGoneDetail;
2018-09-05 17:28:39.882 23077-23077/org.wordpress.android I/art:     at xf com.android.webview.chromium.WebViewChromiumFactoryProvider.a(android.webkit.WebView, android.content.Context) (SourceFile:209)
2018-09-05 17:28:39.882 23077-23077/org.wordpress.android I/art:     at void com.android.webview.chromium.WebViewChromium.init(java.util.Map, boolean) (SourceFile:63)
2018-09-05 17:28:39.882 23077-23077/org.wordpress.android I/art:     at void android.webkit.WebView.<init>(android.content.Context, android.util.AttributeSet, int, int, java.util.Map, boolean) (WebView.java:636)
2018-09-05 17:28:39.882 23077-23077/org.wordpress.android I/art:     at void android.webkit.WebView.<init>(android.content.Context, android.util.AttributeSet, int, int) (WebView.java:572)
2018-09-05 17:28:39.882 23077-23077/org.wordpress.android I/art:     at void android.webkit.WebView.<init>(android.content.Context, android.util.AttributeSet, int) (WebView.java:555)
2018-09-05 17:28:39.882 23077-23077/org.wordpress.android I/art:     at void android.webkit.WebView.<init>(android.content.Context, android.util.AttributeSet) (WebView.java:542)
2018-09-05 17:28:39.882 23077-23077/org.wordpress.android I/art:     at void android.webkit.WebView.<init>(android.content.Context) (WebView.java:532)
2018-09-05 17:28:39.882 23077-23077/org.wordpress.android I/art:     at void org.wordpress.android.fluxc.network.UserAgent.<init>(android.content.Context, java.lang.String) (UserAgent.java:18)
2018-09-05 17:28:39.882 23077-23077/org.wordpress.android I/art:     at org.wordpress.android.fluxc.network.UserAgent org.wordpress.android.modules.AppConfigModule.provideUserAgent(android.content.Context) (AppConfigModule.java:22)
2018-09-05 17:28:39.882 23077-23077/org.wordpress.android I/art:     at org.wordpress.android.fluxc.network.UserAgent org.wordpress.android.modules.AppConfigModule_ProvideUserAgentFactory.get() (AppConfigModule_ProvideUserAgentFactory.java:30)
2018-09-05 17:28:39.882 23077-23077/org.wordpress.android I/art:     at java.lang.Object org.wordpress.android.modules.AppConfigModule_ProvideUserAgentFactory.get() (AppConfigModule_ProvideUserAgentFactory.java:10)
2018-09-05 17:28:39.882 23077-23077/org.wordpress.android I/art:     at org.wordpress.android.fluxc.network.rest.wpcom.account.AccountRestClient org.wordpress.android.fluxc.module.ReleaseNetworkModule_ProvideAccountRestClientFactory.get() (ReleaseNetworkModule_ProvideAccountRestClientFactory.java:68)
2018-09-05 17:28:39.882 23077-23077/org.wordpress.android I/art:     at java.lang.Object org.wordpress.android.fluxc.module.ReleaseNetworkModule_ProvideAccountRestClientFactory.get() (ReleaseNetworkModule_ProvideAccountRestClientFactory.java:15)
2018-09-05 17:28:39.882 23077-23077/org.wordpress.android I/art:     at java.lang.Object dagger.internal.DoubleCheck.get() (DoubleCheck.java:47)
2018-09-05 17:28:39.882 23077-23077/org.wordpress.android I/art:     at org.wordpress.android.fluxc.store.AccountStore org.wordpress.android.fluxc.store.AccountStore_Factory.get() (AccountStore_Factory.java:58)
2018-09-05 17:28:39.882 23077-23077/org.wordpress.android I/art:     at java.lang.Object org.wordpress.android.fluxc.store.AccountStore_Factory.get() (AccountStore_Factory.java:14)
2018-09-05 17:28:39.882 23077-23077/org.wordpress.android I/art:     at java.lang.Object dagger.internal.DoubleCheck.get() (DoubleCheck.java:47)
2018-09-05 17:28:39.882 23077-23077/org.wordpress.android I/art:     at void org.wordpress.android.WordPress_MembersInjector.injectMembers(org.wordpress.android.WordPress) (WordPress_MembersInjector.java:100)
2018-09-05 17:28:39.882 23077-23077/org.wordpress.android I/art:     at void org.wordpress.android.WordPress_MembersInjector.injectMembers(java.lang.Object) (WordPress_MembersInjector.java:17)
2018-09-05 17:28:39.882 23077-23077/org.wordpress.android I/art:     at void org.wordpress.android.modules.DaggerAppComponentDebug.inject(org.wordpress.android.WordPress) (DaggerAppComponentDebug.java:2220)
2018-09-05 17:28:39.882 23077-23077/org.wordpress.android I/art:     at void org.wordpress.android.WordPress.onCreate() (WordPress.java:225)
2018-09-05 17:28:39.882 23077-23077/org.wordpress.android I/art:     at void org.wordpress.android.WordPressDebug.onCreate() (WordPressDebug.java:14)
2018-09-05 17:28:39.882 23077-23077/org.wordpress.android I/art:     at void android.app.Instrumentation.callApplicationOnCreate(android.app.Application) (Instrumentation.java:1032)
2018-09-05 17:28:39.882 23077-23077/org.wordpress.android I/art:     at void android.app.ActivityThread.handleBindApplication(android.app.ActivityThread$AppBindData) (ActivityThread.java:5876)
2018-09-05 17:28:39.882 23077-23077/org.wordpress.android I/art:     at void android.app.ActivityThread.-wrap3(android.app.ActivityThread, android.app.ActivityThread$AppBindData) (ActivityThread.java:-1)
2018-09-05 17:28:39.882 23077-23077/org.wordpress.android I/art:     at void android.app.ActivityThread$H.handleMessage(android.os.Message) (ActivityThread.java:1699)
2018-09-05 17:28:39.882 23077-23077/org.wordpress.android I/art:     at void android.os.Handler.dispatchMessage(android.os.Message) (Handler.java:102)
2018-09-05 17:28:39.882 23077-23077/org.wordpress.android I/art:     at void android.os.Looper.loop() (Looper.java:154)
2018-09-05 17:28:39.882 23077-23077/org.wordpress.android I/art:     at void android.app.ActivityThread.main(java.lang.String[]) (ActivityThread.java:6682)
2018-09-05 17:28:39.882 23077-23077/org.wordpress.android I/art:     at java.lang.Object java.lang.reflect.Method.invoke!(java.lang.Object, java.lang.Object[]) (Method.java:-2)
2018-09-05 17:28:39.882 23077-23077/org.wordpress.android I/art:     at void com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run() (ZygoteInit.java:1520)
2018-09-05 17:28:39.882 23077-23077/org.wordpress.android I/art:     at void com.android.internal.os.ZygoteInit.main(java.lang.String[]) (ZygoteInit.java:1410)
2018-09-05 17:28:39.882 23077-23077/org.wordpress.android I/art: Caused by: java.lang.ClassNotFoundException: Didn't find class "android.webkit.RenderProcessGoneDetail" on path: DexPathList[[zip file "/data/app/com.android.chrome-2/base.apk"],nativeLibraryDirectories=[/data/app/com.android.chrome-2/lib/arm64, /data/app/com.android.chrome-2/base.apk!/lib/arm64-v8a, /system/lib64, /vendor/lib64]]
2018-09-05 17:28:39.882 23077-23077/org.wordpress.android I/art:     at java.lang.Class dalvik.system.BaseDexClassLoader.findClass(java.lang.String) (BaseDexClassLoader.java:56)
2018-09-05 17:28:39.882 23077-23077/org.wordpress.android I/art:     at java.lang.Class java.lang.ClassLoader.loadClass(java.lang.String, boolean) (ClassLoader.java:380)
2018-09-05 17:28:39.882 23077-23077/org.wordpress.android I/art:     at java.lang.Class java.lang.ClassLoader.loadClass(java.lang.String) (ClassLoader.java:312)
2018-09-05 17:28:39.882 23077-23077/org.wordpress.android I/art:     at xf com.android.webview.chromium.WebViewChromiumFactoryProvider.a(android.webkit.WebView, android.content.Context) (SourceFile:209)
2018-09-05 17:28:39.882 23077-23077/org.wordpress.android I/art:     at void com.android.webview.chromium.WebViewChromium.init(java.util.Map, boolean) (SourceFile:63)
2018-09-05 17:28:39.882 23077-23077/org.wordpress.android I/art:     at void android.webkit.WebView.<init>(android.content.Context, android.util.AttributeSet, int, int, java.util.Map, boolean) (WebView.java:636)
2018-09-05 17:28:39.882 23077-23077/org.wordpress.android I/art:     at void android.webkit.WebView.<init>(android.content.Context, android.util.AttributeSet, int, int) (WebView.java:572)
2018-09-05 17:28:39.882 23077-23077/org.wordpress.android I/art:     at void android.webkit.WebView.<init>(android.content.Context, android.util.AttributeSet, int) (WebView.java:555)
2018-09-05 17:28:39.882 23077-23077/org.wordpress.android I/art:     at void android.webkit.WebView.<init>(android.content.Context, android.util.AttributeSet) (WebView.java:542)
2018-09-05 17:28:39.882 23077-23077/org.wordpress.android I/art:     at void android.webkit.WebView.<init>(android.content.Context) (WebView.java:532)
2018-09-05 17:28:39.882 23077-23077/org.wordpress.android I/art:     at void org.wordpress.android.fluxc.network.UserAgent.<init>(android.content.Context, java.lang.String) (UserAgent.java:18)
2018-09-05 17:28:39.882 23077-23077/org.wordpress.android I/art:     at org.wordpress.android.fluxc.network.UserAgent org.wordpress.android.modules.AppConfigModule.provideUserAgent(android.content.Context) (AppConfigModule.java:22)
2018-09-05 17:28:39.882 23077-23077/org.wordpress.android I/art:     at org.wordpress.android.fluxc.network.UserAgent org.wordpress.android.modules.AppConfigModule_ProvideUserAgentFactory.get() (AppConfigModule_ProvideUserAgentFactory.java:30)
2018-09-05 17:28:39.882 23077-23077/org.wordpress.android I/art:     at java.lang.Object org.wordpress.android.modules.AppConfigModule_ProvideUserAgentFactory.get() (AppConfigModule_ProvideUserAgentFactory.java:10)
2018-09-05 17:28:39.882 23077-23077/org.wordpress.android I/art:     at org.wordpress.android.fluxc.network.rest.wpcom.account.AccountRestClient org.wordpress.android.fluxc.module.ReleaseNetworkModule_ProvideAccountRestClientFactory.get() (ReleaseNetworkModule_ProvideAccountRestClientFactory.java:68)
2018-09-05 17:28:39.882 23077-23077/org.wordpress.android I/art:     at java.lang.Object org.wordpress.android.fluxc.module.ReleaseNetworkModule_ProvideAccountRestClientFactory.get() (ReleaseNetworkModule_ProvideAccountRestClientFactory.java:15)
2018-09-05 17:28:39.882 23077-23077/org.wordpress.android I/art:     at java.lang.Object dagger.internal.DoubleCheck.get() (DoubleCheck.java:47)
2018-09-05 17:28:39.882 23077-23077/org.wordpress.android I/art:     at org.wordpress.android.fluxc.store.AccountStore org.wordpress.android.fluxc.store.AccountStore_Factory.get() (AccountStore_Factory.java:58)
2018-09-05 17:28:39.882 23077-23077/org.wordpress.android I/art:     at java.lang.Object org.wordpress.android.fluxc.store.AccountStore_Factory.get() (AccountStore_Factory.java:14)
2018-09-05 17:28:39.882 23077-23077/org.wordpress.android I/art:     at java.lang.Object dagger.internal.DoubleCheck.get() (DoubleCheck.java:47)
2018-09-05 17:28:39.882 23077-23077/org.wordpress.android I/art:     at void org.wordpress.android.WordPress_MembersInjector.injectMembers(org.wordpress.android.WordPress) (WordPress_MembersInjector.java:100)
2018-09-05 17:28:39.882 23077-23077/org.wordpress.android I/art:     at void org.wordpress.android.WordPress_MembersInjector.injectMembers(java.lang.Object) (WordPress_MembersInjector.java:17)
2018-09-05 17:28:39.882 23077-23077/org.wordpress.android I/art:     at void org.wordpress.android.modules.DaggerAppComponentDebug.inject(org.wordpress.android.WordPress) (DaggerAppComponentDebug.java:2220)
2018-09-05 17:28:39.882 23077-23077/org.wordpress.android I/art:     at void org.wordpress.android.WordPress.onCreate() (WordPress.java:225)
2018-09-05 17:28:39.882 23077-23077/org.wordpress.android I/art:     at void org.wordpress.android.WordPressDebug.onCreate() (WordPressDebug.java:14)
2018-09-05 17:28:39.882 23077-23077/org.wordpress.android I/art:     at void android.app.Instrumentation.callApplicationOnCreate(android.app.Application) (Instrumentation.java:1032)
2018-09-05 17:28:39.882 23077-23077/org.wordpress.android I/art:     at void android.app.ActivityThread.handleBindApplication(android.app.ActivityThread$AppBindData) (ActivityThread.java:5876)
2018-09-05 17:28:39.882 23077-23077/org.wordpress.android I/art:     at void android.app.ActivityThread.-wrap3(android.app.ActivityThread, android.app.ActivityThread$AppBindData) (ActivityThread.java:-1)
2018-09-05 17:28:39.882 23077-23077/org.wordpress.android I/art:     at void android.app.ActivityThread$H.handleMessage(android.os.Message) (ActivityThread.java:1699)
2018-09-05 17:28:39.882 23077-23077/org.wordpress.android I/art:     at void android.os.Handler.dispatchMessage(android.os.Message) (Handler.java:102)
2018-09-05 17:28:39.882 23077-23077/org.wordpress.android I/art:     at void android.os.Looper.loop() (Looper.java:154)
2018-09-05 17:28:39.882 23077-23077/org.wordpress.android I/art:     at void android.app.ActivityThread.main(java.lang.String[]) (ActivityThread.java:6682)
2018-09-05 17:28:39.882 23077-23077/org.wordpress.android I/art:     at java.lang.Object java.lang.reflect.Method.invoke!(java.lang.Object, java.lang.Object[]) (Method.java:-2)
2018-09-05 17:28:39.882 23077-23077/org.wordpress.android I/art:     at void com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run() (ZygoteInit.java:1520)
2018-09-05 17:28:39.882 23077-23077/org.wordpress.android I/art:     at void com.android.internal.os.ZygoteInit.main(java.lang.String[]) (ZygoteInit.java:1410)

@malinajirka
Copy link
Contributor Author

malinajirka commented Sep 6, 2018

Thanks @AmandaRiu !!!

I tested the app on Samsung Galaxy S6 Edge, Android 7.0 and it works as expected:(. The exception is there as well, so it most probably isn't related.

Are you aware of any settings on your phone which might "cause" the issue -> such as "Don't keep activities" in developer options is on or anything similar?

@rachelmcr
Copy link
Member

rachelmcr commented Sep 7, 2018

I tested the following scenarios:

  1. New Account
  2. Old Account / Social Disconnected / Two-Factor Disabled
  3. Old Account / Social Connected / Two-Factor Disabled
  4. Old Account / Social Disconnected / Two-Factor Enabled
  5. Old Account / Social Connected / Two-Factor Enabled
  6. Jetpack Connect from Stats

Scenarios 1-5 worked exactly as expected. The last scenario connecting Jetpack did not work as expected. Here's what I expected:

  1. Log in with only self-hosted site with Jetpack.
  2. Go to Sites tab.
  3. Tap Stats item.
  4. Tap Set Up Jetpack button.
  5. Tap Don’t have an account? Sign up button.
  6. Tap Sign Up With Google button.
  7. Choose non-WordPress.com email address.
  8. Tap Open Mail button.
  9. Open magic link email.
  10. Tap Sign up to WordPress.com button.
  11. Tap Continue button.
  12. Tap Approve button.

Here's what happened:

  1. Log in with only self-hosted site with Jetpack.
  2. Go to Sites tab.
  3. Tap Stats item.
  4. Unexpected: On the stats screen I saw an Install Jetpack button even though Jetpack was already installed and activated. I tapped this button.
  5. Jetpack connect webview automatically starts the connection.
  6. Tap Don’t have an account? Sign up button.
  7. Tap Sign Up With Google button.
  8. Choose non-WordPress.com email address. (Note: There was no magic link process, but I was logged into this Google account on my device. I think that should be expected in this scenario but it deviates from the testing steps above.)
  9. Tap Continue button. (on Epilogue screen)
  10. Unexpected: I was returned to the My Site screen showing this error: "Check that the site URL entered is valid"
  11. Unexpected: At this point I was logged in to my new WordPress.com account in the app, but when I tapped on the Stats item again I still saw the Install Jetpack button from earlier. I had to go through the Jetpack connect process again to finish connecting my new account.

I tested the same scenario in the latest 10.8 alpha (alpha-126) and the flow worked as expected there (without the magic link flow, but as mentioned I think that's expected), so this issue seems to be specific to this PR.

Tested on Nexus 9, Android 7.1.1

@AmandaRiu
Copy link
Contributor

Turns out my errors were due to google services not being properly configured in my development environment. Once that issue was remedied, signup with google worked like a charm on my Samsung Galaxy s6!

@malinajirka
Copy link
Contributor Author

@planarvoid and I have just tested the Connect Jetpack with Google Sign up/Login flow on Pixel 2 - Android 9.0 and Samsung Galaxy Lite 2 - Android 4.4 and it worked as expected circa 24 times from 25 attempts.

@rachelmcr has confirmed she reproduced the bug on the current Alpha version, so it seems the bug wasn't introduced as part of this PR. She'll submit a new GitHub issue. Thank you Rachel for all your help!!

@theck13 With all the new info, I believe we can finally merge it 🎉 . Thank you for reviewing such a complicated PR;-)!

@theck13 theck13 merged commit 2959e88 into develop Sep 10, 2018
@theck13 theck13 deleted the issue/8225-fix-google-sign-up branch September 10, 2018 11:34
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

Successfully merging this pull request may close these issues.

Google sign-up doesn't work
7 participants