diff --git a/android/src/com/mapswithme/maps/auth/Constants.java b/android/src/com/mapswithme/maps/auth/Constants.java index 583637b4c7..5a7f974df5 100644 --- a/android/src/com/mapswithme/maps/auth/Constants.java +++ b/android/src/com/mapswithme/maps/auth/Constants.java @@ -7,6 +7,7 @@ class Constants { static final int REQ_CODE_GET_SOCIAL_TOKEN = 101; static final int REQ_CODE_PHONE_AUTH_RESULT = 102; + static final int REQ_CODE_GOOGLE_SIGN_IN = 103; static final String EXTRA_SOCIAL_TOKEN = "extra_social_token"; static final String EXTRA_PHONE_AUTH_TOKEN = "extra_phone_auth_token"; static final String EXTRA_TOKEN_TYPE = "extra_token_type"; diff --git a/android/src/com/mapswithme/maps/auth/FacebookTokenHandler.java b/android/src/com/mapswithme/maps/auth/FacebookTokenHandler.java index aa9dce2467..7e3640a8dd 100644 --- a/android/src/com/mapswithme/maps/auth/FacebookTokenHandler.java +++ b/android/src/com/mapswithme/maps/auth/FacebookTokenHandler.java @@ -1,5 +1,7 @@ package com.mapswithme.maps.auth; +import android.content.Intent; +import android.support.annotation.NonNull; import android.support.annotation.Nullable; import android.text.TextUtils; @@ -9,7 +11,7 @@ import com.mapswithme.maps.Framework; class FacebookTokenHandler implements TokenHandler { @Override - public boolean checkToken() + public boolean checkToken(int requestCode, @NonNull Intent data) { AccessToken facebookToken = AccessToken.getCurrentAccessToken(); return facebookToken != null && !TextUtils.isEmpty(facebookToken.getToken()); diff --git a/android/src/com/mapswithme/maps/auth/GoogleTokenHandler.java b/android/src/com/mapswithme/maps/auth/GoogleTokenHandler.java index 80a75318c0..c7b391c06b 100644 --- a/android/src/com/mapswithme/maps/auth/GoogleTokenHandler.java +++ b/android/src/com/mapswithme/maps/auth/GoogleTokenHandler.java @@ -1,28 +1,53 @@ package com.mapswithme.maps.auth; +import android.content.Intent; +import android.support.annotation.NonNull; import android.support.annotation.Nullable; import android.text.TextUtils; import com.google.android.gms.auth.api.signin.GoogleSignIn; import com.google.android.gms.auth.api.signin.GoogleSignInAccount; +import com.google.android.gms.common.api.ApiException; +import com.google.android.gms.tasks.Task; import com.mapswithme.maps.Framework; -import com.mapswithme.maps.MwmApplication; +import com.mapswithme.util.log.Logger; +import com.mapswithme.util.log.LoggerFactory; class GoogleTokenHandler implements TokenHandler { + @Nullable + private String mToken; + @Override - public boolean checkToken() + public boolean checkToken(int requestCode, @NonNull Intent data) { - GoogleSignInAccount googleAccount = GoogleSignIn.getLastSignedInAccount(MwmApplication.get()); - return googleAccount != null && !TextUtils.isEmpty(googleAccount.getIdToken()); + if (requestCode != Constants.REQ_CODE_GOOGLE_SIGN_IN) + return false; + + Task task = GoogleSignIn.getSignedInAccountFromIntent(data); + try + { + GoogleSignInAccount account = task.getResult(ApiException.class); + if (account != null) + mToken = account.getIdToken(); + return !TextUtils.isEmpty(mToken); + } + catch (ApiException e) + { + // The ApiException status code indicates the detailed failure reason. + // Please refer to the GoogleSignInStatusCodes class reference for more information. + Logger logger = LoggerFactory.INSTANCE.getLogger(LoggerFactory.Type.MISC); + logger.w(GoogleTokenHandler.class.getSimpleName(), + "signInResult:failed code=" + e.getStatusCode()); + } + return false; } @Nullable @Override public String getToken() { - GoogleSignInAccount googleAccount = GoogleSignIn.getLastSignedInAccount(MwmApplication.get()); - return googleAccount != null ? googleAccount.getIdToken() : null; + return mToken; } @Override diff --git a/android/src/com/mapswithme/maps/auth/PhoneTokenHandler.java b/android/src/com/mapswithme/maps/auth/PhoneTokenHandler.java new file mode 100644 index 0000000000..67b03d5203 --- /dev/null +++ b/android/src/com/mapswithme/maps/auth/PhoneTokenHandler.java @@ -0,0 +1,37 @@ +package com.mapswithme.maps.auth; + +import android.content.Intent; +import android.support.annotation.NonNull; +import android.support.annotation.Nullable; +import android.text.TextUtils; + +import com.mapswithme.maps.Framework; + +public class PhoneTokenHandler implements TokenHandler +{ + @Nullable + private String mToken; + + @Override + public boolean checkToken(int requestCode, @NonNull Intent data) + { + if (requestCode != Constants.REQ_CODE_PHONE_AUTH_RESULT) + return false; + + mToken = data.getStringExtra(Constants.EXTRA_PHONE_AUTH_TOKEN); + return !TextUtils.isEmpty(mToken); + } + + @Nullable + @Override + public String getToken() + { + return mToken; + } + + @Override + public int getType() + { + return Framework.SOCIAL_TOKEN_PHONE; + } +} diff --git a/android/src/com/mapswithme/maps/auth/SocialAuthDialogFragment.java b/android/src/com/mapswithme/maps/auth/SocialAuthDialogFragment.java index 17ee8945d7..8114be5611 100644 --- a/android/src/com/mapswithme/maps/auth/SocialAuthDialogFragment.java +++ b/android/src/com/mapswithme/maps/auth/SocialAuthDialogFragment.java @@ -48,32 +48,9 @@ public class SocialAuthDialogFragment extends BaseMwmDialogFragment private GoogleSignInClient mGoogleSignInClient; @NonNull private final CallbackManager mFacebookCallbackManager = CallbackManager.Factory.create(); - @Nullable - private String mPhoneAuthToken; @NonNull private final List mTokenHandlers = Arrays.asList( - new FacebookTokenHandler(), new GoogleTokenHandler(), - new TokenHandler() - { - @Override - public boolean checkToken() - { - return !TextUtils.isEmpty(mPhoneAuthToken); - } - - @Nullable - @Override - public String getToken() - { - return mPhoneAuthToken; - } - - @Override - public int getType() - { - return Framework.SOCIAL_TOKEN_PHONE; - } - }); + new FacebookTokenHandler(), new GoogleTokenHandler(), new PhoneTokenHandler()); @Nullable private TokenHandler mCurrentTokenHandler; @NonNull @@ -88,7 +65,7 @@ public class SocialAuthDialogFragment extends BaseMwmDialogFragment public void onClick(View v) { Intent intent = mGoogleSignInClient.getSignInIntent(); - startActivity(intent); + startActivityForResult(intent, Constants.REQ_CODE_GOOGLE_SIGN_IN); } }; @SuppressWarnings("NullableProblems") @@ -176,18 +153,6 @@ public class SocialAuthDialogFragment extends BaseMwmDialogFragment public void onResume() { super.onResume(); - - for (TokenHandler handler : mTokenHandlers) - { - if (handler.checkToken()) - { - mCurrentTokenHandler = handler; - LOGGER.i(TAG, "Social token is already obtained"); - dismiss(); - return; - } - } - Statistics.INSTANCE.trackEvent(Statistics.EventName.UGC_AUTH_SHOWN); } @@ -211,14 +176,21 @@ public class SocialAuthDialogFragment extends BaseMwmDialogFragment public void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); + mFacebookCallbackManager.onActivityResult(requestCode, resultCode, data); - if (data != null && requestCode == Constants.REQ_CODE_PHONE_AUTH_RESULT) - { - mPhoneAuthToken = data.getStringExtra(Constants.EXTRA_PHONE_AUTH_TOKEN); + if (resultCode != Activity.RESULT_OK || data == null) return; + + for (TokenHandler handler : mTokenHandlers) + { + if (handler.checkToken(requestCode, data)) + mCurrentTokenHandler = handler; } - mFacebookCallbackManager.onActivityResult(requestCode, resultCode, data); + if (mCurrentTokenHandler == null) + return; + + dismiss(); } @Override diff --git a/android/src/com/mapswithme/maps/auth/TokenHandler.java b/android/src/com/mapswithme/maps/auth/TokenHandler.java index d1649c071d..2f09c019c2 100644 --- a/android/src/com/mapswithme/maps/auth/TokenHandler.java +++ b/android/src/com/mapswithme/maps/auth/TokenHandler.java @@ -1,12 +1,14 @@ package com.mapswithme.maps.auth; +import android.content.Intent; +import android.support.annotation.NonNull; import android.support.annotation.Nullable; import com.mapswithme.maps.Framework; interface TokenHandler { - boolean checkToken(); + boolean checkToken(int requestCode, @NonNull Intent data); @Nullable String getToken(); diff --git a/android/src/com/mapswithme/maps/bookmarks/BookmarkBackupController.java b/android/src/com/mapswithme/maps/bookmarks/BookmarkBackupController.java index b566fce23a..2de9d15133 100644 --- a/android/src/com/mapswithme/maps/bookmarks/BookmarkBackupController.java +++ b/android/src/com/mapswithme/maps/bookmarks/BookmarkBackupController.java @@ -8,6 +8,7 @@ import android.support.annotation.Nullable; import android.support.v4.app.FragmentActivity; import android.view.View; import android.widget.Button; +import android.widget.Toast; import com.mapswithme.maps.Framework; import com.mapswithme.maps.R; @@ -230,6 +231,7 @@ public class BookmarkBackupController implements Authorizer.Callback, } else { + Toast.makeText(mContext, R.string.profile_authorization_error, Toast.LENGTH_LONG).show(); Statistics.INSTANCE.trackBmSyncProposalError(Framework.TOKEN_MAPSME, "Unknown error"); } updateWidget();