Skip to content

Commit 1042a27

Browse files
committed
Squashed 'libs/login/' changes from d3c0fa7ae4..4896a91c7c
4896a91c7c Merge pull request #6 from wordpress-mobile/merge-wca 16a871bcf1 Set base button color to white d6e2bf4184 Update login library default FluxC hash 7b3ba9e906 Merge commit 'e500cd63388ba77e7ea13df2fbb199c64e7107c2' into feature/import-latest-login-lib 0fe4cc1bf0 Merge commit '554b41f85535e113b1357e1c708fe304d50e0bd0' into develop 4495659338 Fix text of email not found error ab65b7ea6e Fix text of sms throttled error 9f2e660eeb Checkstyle fix 61d3e7020e Refactoring dd3989bbfa Refactoring 5cac71b526 Fix log msgs 42eb5f7300 Set image content description or mark it as not important for accessibility bb0e745946 Fix checkstyle 0904ff17a5 Add a meaningful error message when the 2fa loggin is stopped because of sms throttling 606eb6fbe6 Trigger 2fa when the authentication SMS has been already sent during the flow 0f27a678d5 Fix google sign in flow c98a1d473a Fix signup/in flows 30bf1accd1 Fix google sign-up 916621c9d7 Support setting the scheme in LoginMagicLinkRequestFragment 88e73ab293 Login integration 81fa3c9812 Add WP.com login as a step after Jetpack install e3dd86f22b Localize the error message for invalid 2fa codes 08af882ab2 Merges release/10.2 into develop 7f9fca95f7 Update gradle plugin to 3.1.3 2520aa3844 Update google repository config and list it first a88a7195ad Merge pull request #7880 from /issues/7856-refresh-meta-data f2a12f0e4c fixed merge conflict b218f90a2d Clean up from previous approach. 6ce03885e1 Remove errant space from login string df7ae86a4d Update login library string to reflect core app string update 078c9c86f8 Remove unused strings from login library 51b07d7776 Tweak logic to allow a single method to bump acct created 17ede53ffc Overload method to have a shorter name. 33326b183b Refresh metadata for the google signup flow. 65c96baefa Call new method when bumping account created stat. afedb2008a bumped google play services version to 15.0.1 853823cd9a Merge pull request #217 from woocommerce/feature/113-login-notification 848294dc29 Use more generic naming for the login notification channel id fa437d344f Merge commit '09a0852581dd9a3a6b15109f3a8e9a80e644fbbb' into feature/update-login-library 6b07a925db Enable Google login 066beded26 Update gradle plugin to 3.1.2 3e1abf1cf0 Fix FluxC build error in login library 37707a744c Merge pull request #188 from woocommerce/feature/gradle-3.1.1 1a933195f0 Update gradle plugin and support libraries to latest 9af7502466 Update inner import checkstyle violations in login library d07401c892 Update IDEA style config files ad4fc3b429 Revert unintentional color change in the WordPressLoginFlow module. c1b56716a1 Merge branch 'feature/order-details-screen' into feature/order-detail-views 6c93c92dc5 Exclude utils library from FluxC imports 372719093e Merge branch 'develop' into feature/order-detail-views eec28986b5 Restore login notification styling changes 103dd8f6a1 Merge commit '6bd01d64a2d01176f5b26ae36836d4f5ff0fcdc9' into feature/update-login-lib 97462cca8e Merge branch 'develop' into feature/order-detail-views 20e9f3b9e3 Move login icon colors to variables b15f6632fa Merge branch 'develop' into feature/114-login-style-refactor 26d1088134 Fix style violations in login library 17326beace Order Details - Customer Info View - Action Icons and listeners, updated icon assets * Add the ability to click to dial customer phone * Add the ability to click to email customer * Add the ability to click to sms customer ebfa842faf Make login notification styling overridable 5494d0e742 Make login toolbar styling overridable 8cbdb5b313 Use overridable color names in login flow styles e9137fe9f7 Replace WordPress buttons with LoginTheme bf34dabb71 Expose play-services-auth dependency from login library 19203891d7 Merge commit '9751124a62caad5f7c9af772f8b872b604cd02b9' into feature/gradle-3.0 f5b58af6b4 Add WPCOM_LOGIN_ONLY LoginMode, disallowing self-hosted login git-subtree-dir: libs/login git-subtree-split: 4896a91c7cb62100a663fd879915eff73f39a27e
1 parent 554b41f commit 1042a27

34 files changed

+334
-202
lines changed

WordPressLoginFlow/build.gradle

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ buildscript {
44
google()
55
}
66
dependencies {
7-
classpath 'com.android.tools.build:gradle:3.1.2'
7+
classpath 'com.android.tools.build:gradle:3.1.3'
88
}
99
}
1010

@@ -38,13 +38,19 @@ dependencies {
3838
implementation 'com.android.support:appcompat-v7:27.1.1'
3939
implementation 'com.android.support:design:27.1.1'
4040

41-
implementation 'com.google.android.gms:play-services-auth:12.0.1'
41+
api 'com.google.android.gms:play-services-auth:15.0.1'
4242

4343
// Share FluxC version from host project if defined, otherwise fallback to default
4444
if (project.hasProperty("fluxCVersion")) {
45-
implementation "com.github.wordpress-mobile.WordPress-FluxC-Android:fluxc:$fluxCVersion"
45+
implementation("com.github.wordpress-mobile.WordPress-FluxC-Android:fluxc:$fluxCVersion") {
46+
exclude group: "com.android.support"
47+
exclude group: "org.wordpress", module: "utils"
48+
}
4649
} else {
47-
implementation 'com.github.wordpress-mobile.WordPress-FluxC-Android:fluxc:d4e583f21840111065f12e743cbf31de4307266b'
50+
implementation("com.github.wordpress-mobile.WordPress-FluxC-Android:fluxc:7c4fa0333cef380aa80b92adbb5e4803b90dd7e5") {
51+
exclude group: "com.android.support"
52+
exclude group: "org.wordpress", module: "utils"
53+
}
4854
}
4955

5056
implementation 'com.github.bumptech.glide:glide:4.6.1'

WordPressLoginFlow/src/main/java/org/wordpress/android/login/GoogleFragment.java

Lines changed: 63 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -6,9 +6,7 @@
66
import android.os.Bundle;
77
import android.support.annotation.NonNull;
88
import android.support.v4.app.Fragment;
9-
import android.support.v7.app.AlertDialog;
109
import android.util.Log;
11-
import android.view.ContextThemeWrapper;
1210

1311
import com.google.android.gms.auth.api.Auth;
1412
import com.google.android.gms.auth.api.signin.GoogleSignInOptions;
@@ -21,14 +19,26 @@
2119
import org.wordpress.android.fluxc.Dispatcher;
2220
import org.wordpress.android.fluxc.store.SiteStore;
2321
import org.wordpress.android.util.AppLog;
22+
import org.wordpress.android.util.AppLog.T;
2423

2524
import javax.inject.Inject;
2625

2726
import static android.app.Activity.RESULT_OK;
2827

2928
public class GoogleFragment extends Fragment implements ConnectionCallbacks, OnConnectionFailedListener {
29+
private static final String STATE_SHOULD_RESOLVE_ERROR = "STATE_SHOULD_RESOLVE_ERROR";
30+
private static final String STATE_FINISHED = "STATE_FINISHED";
31+
private static final String STATE_DISPLAY_NAME = "STATE_DISPLAY_NAME";
32+
private static final String STATE_GOOGLE_EMAIL = "STATE_GOOGLE_EMAIL";
33+
private static final String STATE_GOOGLE_TOKEN_ID = "STATE_GOOGLE_TOKEN_ID";
34+
private static final String STATE_GOOGLE_PHOTO_URL = "STATE_GOOGLE_PHOTO_URL";
3035
private boolean mIsResolvingError;
3136
private boolean mShouldResolveError;
37+
/**
38+
* This flag is used to store the information the finishFlow was called when the fragment wasn't attached to an
39+
* activity (for example an EventBus event was received during ongoing configuration change).
40+
*/
41+
private boolean mFinished;
3242

3343
private static final String STATE_RESOLVING_ERROR = "STATE_RESOLVING_ERROR";
3444
private static final int REQUEST_CONNECT = 1000;
@@ -52,14 +62,22 @@ public interface GoogleListener {
5262
void onGoogleEmailSelected(String email);
5363
void onGoogleLoginFinished();
5464
void onGoogleSignupFinished(String name, String email, String photoUrl, String username);
65+
void onGoogleSignupError(String msg);
5566
}
5667

5768
@Override
5869
public void onCreate(Bundle savedInstanceState) {
5970
super.onCreate(savedInstanceState);
60-
61-
// Restore state of error resolving.
62-
mIsResolvingError = savedInstanceState != null && savedInstanceState.getBoolean(STATE_RESOLVING_ERROR, false);
71+
mDispatcher.register(this);
72+
if (savedInstanceState != null) {
73+
mIsResolvingError = savedInstanceState.getBoolean(STATE_RESOLVING_ERROR, false);
74+
mShouldResolveError = savedInstanceState.getBoolean(STATE_SHOULD_RESOLVE_ERROR, false);
75+
mFinished = savedInstanceState.getBoolean(STATE_FINISHED, false);
76+
mDisplayName = savedInstanceState.getString(STATE_DISPLAY_NAME);
77+
mGoogleEmail = savedInstanceState.getString(STATE_GOOGLE_EMAIL);
78+
mIdToken = savedInstanceState.getString(STATE_GOOGLE_TOKEN_ID);
79+
mPhotoUrl = savedInstanceState.getString(STATE_GOOGLE_PHOTO_URL);
80+
}
6381

6482
// Configure sign-in to request user's ID, basic profile, email address, and ID token.
6583
// ID and basic profile are included in DEFAULT_SIGN_IN.
@@ -71,7 +89,7 @@ public void onCreate(Bundle savedInstanceState) {
7189
.build();
7290

7391
// Build Google API client with access to sign-in API and options specified above.
74-
mGoogleApiClient = new GoogleApiClient.Builder(getActivity())
92+
mGoogleApiClient = new GoogleApiClient.Builder(getActivity().getApplicationContext())
7593
.addApi(Auth.GOOGLE_SIGN_IN_API, googleSignInOptions)
7694
.addConnectionCallbacks(this)
7795
.addOnConnectionFailedListener(this)
@@ -83,9 +101,15 @@ public void onCreate(Bundle savedInstanceState) {
83101
}
84102

85103
@Override
86-
public void onSaveInstanceState(Bundle outState) {
104+
public void onSaveInstanceState(@NonNull Bundle outState) {
87105
super.onSaveInstanceState(outState);
88106
outState.putBoolean(STATE_RESOLVING_ERROR, mIsResolvingError);
107+
outState.putBoolean(STATE_SHOULD_RESOLVE_ERROR, mShouldResolveError);
108+
outState.putBoolean(STATE_FINISHED, mFinished);
109+
outState.putString(STATE_DISPLAY_NAME, mDisplayName);
110+
outState.putString(STATE_GOOGLE_EMAIL, mGoogleEmail);
111+
outState.putString(STATE_GOOGLE_TOKEN_ID, mIdToken);
112+
outState.putString(STATE_GOOGLE_PHOTO_URL, mPhotoUrl);
89113
}
90114

91115
@Override
@@ -98,29 +122,26 @@ public void onAttach(Context context) {
98122
} catch (ClassCastException exception) {
99123
throw new ClassCastException(context.toString() + " must implement GoogleListener");
100124
}
101-
102-
// Show account dialog when Google API onConnected callback returns before fragment is attached.
103-
if (mGoogleApiClient != null && mGoogleApiClient.isConnected() && !mIsResolvingError && !mShouldResolveError) {
104-
showAccountDialog();
125+
if (mFinished) {
126+
finishFlow();
105127
}
106128
}
107129

108130
@Override
109-
public void onDetach() {
110-
super.onDetach();
131+
public void onDestroy() {
111132
disconnectGoogleClient();
133+
AppLog.d(T.MAIN, "GOOGLE SIGNUP/LOGIN: disconnecting google client");
134+
mDispatcher.unregister(this);
135+
super.onDestroy();
112136
}
113137

114138
@Override
115-
public void onStart() {
116-
super.onStart();
117-
mDispatcher.register(this);
118-
}
119-
120-
@Override
121-
public void onStop() {
122-
super.onStop();
123-
mDispatcher.unregister(this);
139+
public void onResume() {
140+
super.onResume();
141+
// Show account dialog when Google API onConnected callback returns before fragment is attached.
142+
if (mGoogleApiClient != null && mGoogleApiClient.isConnected() && !mIsResolvingError && !mShouldResolveError) {
143+
startFlow();
144+
}
124145
}
125146

126147
@Override
@@ -130,8 +151,9 @@ public void onConnected(Bundle bundle) {
130151
if (mShouldResolveError) {
131152
mShouldResolveError = false;
132153

154+
// if the fragment is not attached to an activity, the process is started in the onResume
133155
if (isAdded()) {
134-
showAccountDialog();
156+
startFlow();
135157
}
136158
}
137159
}
@@ -154,7 +176,7 @@ public void onConnectionFailed(@NonNull ConnectionResult connectionResult) {
154176
mIsResolvingError = false;
155177
AppLog.e(AppLog.T.NUX, GoogleApiAvailability.getInstance().getErrorString(
156178
connectionResult.getErrorCode()));
157-
showErrorDialog(getString(R.string.login_error_generic));
179+
showError(getString(R.string.login_error_generic));
158180
}
159181
}
160182
}
@@ -172,7 +194,7 @@ public void connectGoogleClient() {
172194
mShouldResolveError = true;
173195
mGoogleApiClient.connect();
174196
} else {
175-
showAccountDialog();
197+
startFlow();
176198
}
177199
}
178200

@@ -183,16 +205,24 @@ protected void disconnectGoogleClient() {
183205
}
184206
}
185207

186-
protected void showAccountDialog() {
208+
protected void startFlow() {
187209
// Do nothing here. This should be overridden by inheriting class.
188210
}
189211

190-
protected void showErrorDialog(String message) {
191-
AlertDialog dialog = new AlertDialog.Builder(new ContextThemeWrapper(getActivity(), R.style.LoginTheme))
192-
.setMessage(message)
193-
.setPositiveButton(R.string.login_error_button, null)
194-
.create();
195-
dialog.show();
212+
protected void finishFlow() {
213+
/* This flag might get lost when the finishFlow is called after the fragment's
214+
onSaveInstanceState was called - however it's a very rare case, since the fragment is retained across
215+
config changes. */
216+
mFinished = true;
217+
if (getActivity() != null) {
218+
AppLog.d(T.MAIN, "GOOGLE SIGNUP/LOGIN: finishing signup/login");
219+
getActivity().getSupportFragmentManager().beginTransaction().remove(this).commitAllowingStateLoss();
220+
}
221+
}
222+
223+
protected void showError(String message) {
224+
finishFlow();
225+
mGoogleListener.onGoogleSignupError(message);
196226
}
197227

198228
@Override
@@ -208,7 +238,7 @@ public void onActivityResult(int request, int result, Intent data) {
208238
if (!mGoogleApiClient.isConnecting() && !mGoogleApiClient.isConnected()) {
209239
mGoogleApiClient.connect();
210240
} else {
211-
showAccountDialog();
241+
startFlow();
212242
}
213243

214244
mIsResolvingError = false;

WordPressLoginFlow/src/main/java/org/wordpress/android/login/Login2FaFragment.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -74,8 +74,8 @@ public class Login2FaFragment extends LoginBaseFormFragment<LoginListener> imple
7474

7575
private static final String TWO_FACTOR_TYPE_AUTHENTICATOR = "authenticator";
7676
private static final String TWO_FACTOR_TYPE_BACKUP = "backup";
77-
private static final String TWO_FACTOR_TYPE_SMS = "sms";
7877

78+
public static final String TWO_FACTOR_TYPE_SMS = "sms";
7979
public static final String TAG = "login_2fa_fragment_tag";
8080

8181
private static final Pattern TWO_STEP_AUTH_CODE = Pattern.compile("^[0-9]{6}");
@@ -376,7 +376,7 @@ protected void endProgress() {
376376
private void handleAuthError(AuthenticationErrorType error, String errorMessage) {
377377
switch (error) {
378378
case INVALID_OTP:
379-
show2FaError(errorMessage);
379+
show2FaError(getString(R.string.invalid_verification_code));
380380
break;
381381
case NEEDS_2FA:
382382
// we get this error when requesting a verification code sent via SMS so, just ignore it.

WordPressLoginFlow/src/main/java/org/wordpress/android/login/LoginAnalyticsListener.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77

88
public interface LoginAnalyticsListener {
99
void trackAnalyticsSignIn(AccountStore accountStore, SiteStore siteStore, boolean isWpcomLogin);
10-
void trackCreatedAccount();
10+
void trackCreatedAccount(String username, String email);
1111
void trackEmailFormViewed();
1212
void trackInsertedInvalidUrl();
1313
void trackLoginAccessed();

WordPressLoginFlow/src/main/java/org/wordpress/android/login/LoginEmailFragment.java

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -98,10 +98,11 @@ protected void setupLabel(@NonNull TextView label) {
9898
label.setText(R.string.login_log_in_for_share_intent);
9999
break;
100100
case FULL:
101+
case WPCOM_LOGIN_ONLY:
101102
label.setText(R.string.enter_email_wordpress_com);
102103
break;
103104
case JETPACK_STATS:
104-
label.setText(R.string.stats_sign_in_jetpack_different_com_account);
105+
label.setText(R.string.login_to_to_connect_jetpack);
105106
break;
106107
case WPCOM_REAUTHENTICATE:
107108
label.setText(R.string.auth_required);
@@ -149,7 +150,7 @@ public void onClick(View view) {
149150
if (isAdded()) {
150151
mOldSitesIDs = SiteUtils.getCurrentSiteIds(mSiteStore, false);
151152
mIsSocialLogin = true;
152-
mLoginListener.addGoogleLoginFragment(LoginEmailFragment.this);
153+
mLoginListener.addGoogleLoginFragment();
153154
} else {
154155
AppLog.e(T.NUX, "Google login could not be started. LoginEmailFragment was not attached.");
155156
showErrorDialog(getString(R.string.login_error_generic_start));
@@ -177,6 +178,7 @@ public void onClick(View view) {
177178

178179
switch (mLoginListener.getLoginMode()) {
179180
case FULL:
181+
case WPCOM_LOGIN_ONLY:
180182
case SHARE_INTENT:
181183
siteLoginButtonIcon.setImageResource(R.drawable.ic_domains_grey_24dp);
182184
siteLoginButtonText.setText(R.string.enter_site_address_instead);

0 commit comments

Comments
 (0)