diff options
author | Alexander Zatsepin <az@mapswithme.com> | 2018-05-21 20:21:22 +0300 |
---|---|---|
committer | yoksnod <donskdmitry@mail.ru> | 2018-05-21 21:36:44 +0300 |
commit | 254c86de23c16b40ffebcf1068a4b98f808bb612 (patch) | |
tree | b3ceba398bb8b8a823556891c3b178cefb8cd0c7 | |
parent | bb08d1a694cb13e6be2f3f86dfd26ecd29d92407 (diff) |
[android] Fixed crach in SocialAuthDialogFragment regarding incorrect setting result to target fragment due to issue in fragment managerios-store-826android-gr-826
7 files changed, 49 insertions, 36 deletions
diff --git a/android/src/com/mapswithme/maps/auth/Authorizer.java b/android/src/com/mapswithme/maps/auth/Authorizer.java index d3191649bc..fb13f51ddd 100644 --- a/android/src/com/mapswithme/maps/auth/Authorizer.java +++ b/android/src/com/mapswithme/maps/auth/Authorizer.java @@ -63,16 +63,14 @@ public class Authorizer implements AuthorizationListener String name = SocialAuthDialogFragment.class.getName(); DialogFragment fragment = (DialogFragment) Fragment.instantiate(mFragment.getContext(), name); - fragment.setTargetFragment(mFragment, Constants.REQ_CODE_GET_SOCIAL_TOKEN); - fragment.show(mFragment.getActivity().getSupportFragmentManager(), name); + // A communication with the SocialAuthDialogFragment is implemented via getParentFragment method + // because of 'setTargetFragment' paradigm doesn't survive the activity configuration change + // due to this issue https://issuetracker.google.com/issues/36969568 + fragment.show(mFragment.getChildFragmentManager(), name); } - public final void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) + public final void onSocialTokenResult(int resultCode, @Nullable Intent data) { - - if (requestCode != Constants.REQ_CODE_GET_SOCIAL_TOKEN) - return; - if (data == null) return; @@ -139,4 +137,9 @@ public class Authorizer implements AuthorizationListener void onSocialAuthenticationCancel(@Framework.AuthTokenType int type); void onSocialAuthenticationError(@Framework.AuthTokenType int type, @Nullable String error); } + + public interface SocialAuthCallback + { + void onSocialTokenResult(int resultCode, @Nullable Intent data); + } } diff --git a/android/src/com/mapswithme/maps/auth/BaseMwmAuthorizationFragment.java b/android/src/com/mapswithme/maps/auth/BaseMwmAuthorizationFragment.java index 1b07e30e71..028a49485e 100644 --- a/android/src/com/mapswithme/maps/auth/BaseMwmAuthorizationFragment.java +++ b/android/src/com/mapswithme/maps/auth/BaseMwmAuthorizationFragment.java @@ -3,6 +3,7 @@ package com.mapswithme.maps.auth; import android.content.Intent; import android.support.annotation.CallSuper; import android.support.annotation.NonNull; +import android.support.annotation.Nullable; import com.mapswithme.maps.base.BaseMwmToolbarFragment; @@ -12,7 +13,7 @@ import com.mapswithme.maps.base.BaseMwmToolbarFragment; * to get user authorized for the MapsMe server (Passport). */ public abstract class BaseMwmAuthorizationFragment extends BaseMwmToolbarFragment - implements Authorizer.Callback + implements Authorizer.Callback, Authorizer.SocialAuthCallback { @NonNull private final Authorizer mAuthorizer = new Authorizer(this); @@ -39,9 +40,8 @@ public abstract class BaseMwmAuthorizationFragment extends BaseMwmToolbarFragmen } @Override - public void onActivityResult(int requestCode, int resultCode, Intent data) + public void onSocialTokenResult(int resultCode, @Nullable Intent data) { - super.onActivityResult(requestCode, resultCode, data); - mAuthorizer.onActivityResult(requestCode, resultCode, data); + mAuthorizer.onSocialTokenResult(resultCode, data); } } diff --git a/android/src/com/mapswithme/maps/auth/Constants.java b/android/src/com/mapswithme/maps/auth/Constants.java index 3670f3a01e..6c975a3015 100644 --- a/android/src/com/mapswithme/maps/auth/Constants.java +++ b/android/src/com/mapswithme/maps/auth/Constants.java @@ -5,7 +5,6 @@ import java.util.List; 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"; diff --git a/android/src/com/mapswithme/maps/auth/PassportAuthDialogFragment.java b/android/src/com/mapswithme/maps/auth/PassportAuthDialogFragment.java index 82998f9792..49a417a7b6 100644 --- a/android/src/com/mapswithme/maps/auth/PassportAuthDialogFragment.java +++ b/android/src/com/mapswithme/maps/auth/PassportAuthDialogFragment.java @@ -15,6 +15,7 @@ import com.mapswithme.maps.base.BaseMwmDialogFragment; import com.mapswithme.util.statistics.Statistics; public class PassportAuthDialogFragment extends BaseMwmDialogFragment + implements Authorizer.SocialAuthCallback { @NonNull private final Authorizer mAuthorizer = new Authorizer(this); @@ -33,15 +34,6 @@ public class PassportAuthDialogFragment extends BaseMwmDialogFragment } @Override - public void onActivityResult(int requestCode, int resultCode, Intent data) - { - super.onActivityResult(requestCode, resultCode, data); - - mAuthorizer.onActivityResult(requestCode, resultCode, data); - dismiss(); - } - - @Override @CallSuper public void onStart() { @@ -57,6 +49,13 @@ public class PassportAuthDialogFragment extends BaseMwmDialogFragment mAuthorizer.detach(); } + @Override + public void onSocialTokenResult(int resultCode, @Nullable Intent data) + { + mAuthorizer.onSocialTokenResult(resultCode, data); + dismiss(); + } + private class AuthCallback implements Authorizer.Callback { @Override diff --git a/android/src/com/mapswithme/maps/auth/SocialAuthDialogFragment.java b/android/src/com/mapswithme/maps/auth/SocialAuthDialogFragment.java index 65459f5a1e..d4b7a70d93 100644 --- a/android/src/com/mapswithme/maps/auth/SocialAuthDialogFragment.java +++ b/android/src/com/mapswithme/maps/auth/SocialAuthDialogFragment.java @@ -8,7 +8,6 @@ import android.os.Bundle; import android.support.annotation.IdRes; import android.support.annotation.NonNull; import android.support.annotation.Nullable; -import android.support.v4.app.Fragment; import android.text.TextUtils; import android.text.method.LinkMovementMethod; import android.view.LayoutInflater; @@ -83,6 +82,8 @@ public class SocialAuthDialogFragment extends BaseMwmDialogFragment @SuppressWarnings("NullableProblems") @NonNull private CheckBox mPromoCheck; + @Nullable + private Authorizer.SocialAuthCallback mTargetCallback; @NonNull @Override @@ -97,6 +98,7 @@ public class SocialAuthDialogFragment extends BaseMwmDialogFragment public void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); + setTargetCallback(); GoogleSignInOptions gso = new GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN) .requestIdToken(PrivateVariables.googleWebClientId()) .requestEmail() @@ -104,6 +106,18 @@ public class SocialAuthDialogFragment extends BaseMwmDialogFragment mGoogleSignInClient = GoogleSignIn.getClient(getActivity(), gso); } + private void setTargetCallback() + { + try + { + mTargetCallback = (Authorizer.SocialAuthCallback) getParentFragment(); + } + catch (ClassCastException e) + { + throw new ClassCastException("Caller must implement SocialAuthCallback interface!"); + } + } + @Nullable @Override public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @@ -170,8 +184,7 @@ public class SocialAuthDialogFragment extends BaseMwmDialogFragment @Framework.AuthTokenType int type, @Nullable String error, boolean isCancel) { - Fragment caller = getTargetFragment(); - if (caller == null || !caller.isAdded()) + if (mTargetCallback == null) return; Intent data = new Intent(); @@ -182,7 +195,7 @@ public class SocialAuthDialogFragment extends BaseMwmDialogFragment data.putExtra(Constants.EXTRA_PRIVACY_POLICY_ACCEPTED, mPrivacyPolicyCheck.isChecked()); data.putExtra(Constants.EXTRA_TERMS_OF_USE_ACCEPTED, mTermOfUseCheck.isChecked()); data.putExtra(Constants.EXTRA_PROMO_ACCEPTED, mPromoCheck.isChecked()); - caller.onActivityResult(Constants.REQ_CODE_GET_SOCIAL_TOKEN, resultCode, data); + mTargetCallback.onSocialTokenResult(resultCode, data); } @Override diff --git a/android/src/com/mapswithme/maps/bookmarks/BookmarkBackupController.java b/android/src/com/mapswithme/maps/bookmarks/BookmarkBackupController.java index 2de9d15133..a73f422144 100644 --- a/android/src/com/mapswithme/maps/bookmarks/BookmarkBackupController.java +++ b/android/src/com/mapswithme/maps/bookmarks/BookmarkBackupController.java @@ -207,9 +207,9 @@ public class BookmarkBackupController implements Authorizer.Callback, SharedPropertiesUtils.setBackupWidgetExpanded(mBackupView.getExpanded()); } - public void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) + public void onSocialTokenResult(int resultCode, @Nullable Intent data) { - mAuthorizer.onActivityResult(requestCode, resultCode, data); + mAuthorizer.onSocialTokenResult(resultCode, data); } @Override diff --git a/android/src/com/mapswithme/maps/bookmarks/BookmarkCategoriesFragment.java b/android/src/com/mapswithme/maps/bookmarks/BookmarkCategoriesFragment.java index d7a9f3b3e7..6af5f2d0a7 100644 --- a/android/src/com/mapswithme/maps/bookmarks/BookmarkCategoriesFragment.java +++ b/android/src/com/mapswithme/maps/bookmarks/BookmarkCategoriesFragment.java @@ -32,7 +32,7 @@ public class BookmarkCategoriesFragment extends BaseMwmRecyclerFragment BookmarkManager.BookmarksLoadingListener, BookmarkManager.BookmarksSharingListener, BookmarkCategoriesAdapter.CategoryListInterface, - KmlImportController.ImportKmlCallback + KmlImportController.ImportKmlCallback, Authorizer.SocialAuthCallback { private static final int MAX_CATEGORY_NAME_LENGTH = 60; private long mSelectedCatId; @@ -287,14 +287,6 @@ public class BookmarkCategoriesFragment extends BaseMwmRecyclerFragment } @Override - public void onActivityResult(int requestCode, int resultCode, Intent data) - { - super.onActivityResult(requestCode, resultCode, data); - if (mBackupController != null) - mBackupController.onActivityResult(requestCode, resultCode, data); - } - - @Override public void onFinishKmlImport() { if (getAdapter() != null) @@ -321,6 +313,13 @@ public class BookmarkCategoriesFragment extends BaseMwmRecyclerFragment return new CategoryValidator(); } + @Override + public void onSocialTokenResult(int resultCode, @Nullable Intent data) + { + if (mBackupController != null) + mBackupController.onSocialTokenResult(resultCode, data); + } + interface CategoryEditor { void commit(@NonNull String newName); |