From c81219a4930e04b5728ae32c84db8bb52b73f341 Mon Sep 17 00:00:00 2001 From: Alexander Marchuk Date: Wed, 25 Nov 2015 20:12:53 +0300 Subject: [PATCH] [android] fix: Bookmark description is not saved if rotate the device. --- .../src/com/mapswithme/maps/MwmActivity.java | 1 + .../placepage/EditDescriptionFragment.java | 35 ++++++++--- .../maps/widget/placepage/PlacePageView.java | 61 +++++++++++++------ 3 files changed, 68 insertions(+), 29 deletions(-) diff --git a/android/src/com/mapswithme/maps/MwmActivity.java b/android/src/com/mapswithme/maps/MwmActivity.java index b04002df4c..5cd630906a 100644 --- a/android/src/com/mapswithme/maps/MwmActivity.java +++ b/android/src/com/mapswithme/maps/MwmActivity.java @@ -739,6 +739,7 @@ public class MwmActivity extends BaseMwmFragmentActivity { super.onResumeFragments(); RoutingController.get().restore(); + mPlacePage.restore(); } private void adjustZoomButtons() diff --git a/android/src/com/mapswithme/maps/widget/placepage/EditDescriptionFragment.java b/android/src/com/mapswithme/maps/widget/placepage/EditDescriptionFragment.java index 358475cd00..459acc1313 100644 --- a/android/src/com/mapswithme/maps/widget/placepage/EditDescriptionFragment.java +++ b/android/src/com/mapswithme/maps/widget/placepage/EditDescriptionFragment.java @@ -11,24 +11,27 @@ import android.view.ViewGroup; import android.view.WindowManager; import android.widget.EditText; import android.widget.TextView; - import com.mapswithme.maps.R; import com.mapswithme.maps.base.BaseMwmDialogFragment; +import com.mapswithme.maps.bookmarks.data.Bookmark; import com.mapswithme.util.StringUtils; import com.mapswithme.util.UiUtils; +import java.lang.ref.WeakReference; + public class EditDescriptionFragment extends BaseMwmDialogFragment { - public static final String EXTRA_DESCRIPTION = "ExtraDescription"; + public static final String EXTRA_BOOKMARK = "bookmark"; private EditText mEtDescription; + private Bookmark mBookmark; - public interface OnDescriptionSaveListener + public interface OnDescriptionSavedListener { - void onSave(String description); + void onSaved(Bookmark bookmark); } - private OnDescriptionSaveListener mListener; + private WeakReference mListener; public EditDescriptionFragment() {} @@ -51,7 +54,8 @@ public class EditDescriptionFragment extends BaseMwmDialogFragment { super.onViewCreated(view, savedInstanceState); - String description = getArguments().getString(EXTRA_DESCRIPTION); + mBookmark = getArguments().getParcelable(EXTRA_BOOKMARK); + String description = mBookmark.getBookmarkDescription(); if (StringUtils.isHtml(description)) { @@ -68,9 +72,9 @@ public class EditDescriptionFragment extends BaseMwmDialogFragment getDialog().getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_VISIBLE); } - public void setSaveDescriptionListener(OnDescriptionSaveListener listener) + public void setSaveDescriptionListener(OnDescriptionSavedListener listener) { - mListener = listener; + mListener = new WeakReference<>(listener); } private void initToolbar(View view) @@ -99,8 +103,21 @@ public class EditDescriptionFragment extends BaseMwmDialogFragment private void saveDescription() { + mBookmark.setParams(mBookmark.getName(), null, mEtDescription.getText().toString()); + if (mListener != null) - mListener.onSave(mEtDescription.getText().toString()); + { + OnDescriptionSavedListener listener = mListener.get(); + if (listener != null) + listener.onSaved(mBookmark); + } dismiss(); } + + @Override + public void onDetach() + { + super.onDetach(); + mListener = null; + } } diff --git a/android/src/com/mapswithme/maps/widget/placepage/PlacePageView.java b/android/src/com/mapswithme/maps/widget/placepage/PlacePageView.java index 0a1fbb6adc..c1e04a8c16 100644 --- a/android/src/com/mapswithme/maps/widget/placepage/PlacePageView.java +++ b/android/src/com/mapswithme/maps/widget/placepage/PlacePageView.java @@ -11,8 +11,10 @@ import android.net.Uri; import android.os.Build; import android.os.Bundle; import android.support.annotation.NonNull; +import android.support.annotation.Nullable; import android.support.v4.app.Fragment; import android.support.v4.app.FragmentActivity; +import android.support.v4.app.FragmentManager; import android.support.v7.widget.Toolbar; import android.text.TextUtils; import android.util.AttributeSet; @@ -267,6 +269,12 @@ public class PlacePageView extends RelativeLayout implements View.OnClickListene mAnimationController.initialHide(); } + public void restore() + { + if (mMapObject != null) + subscribeBookmarkEditFragment(null); + } + @Override public boolean onTouchEvent(@NonNull MotionEvent event) { @@ -647,6 +655,34 @@ public class PlacePageView extends RelativeLayout implements View.OnClickListene bookmark.setParams(name, null, bookmark.getBookmarkDescription()); } + /** + * Adds listener to {@link EditDescriptionFragment} to catch notification about bookmark description edit is complete. + *
When the user rotates device screen the listener is lost, so we must re-subscribe again. + * @param fragment if specified - explicitely subscribe to this fragment. Otherwise try to find the fragment by hands. + */ + private void subscribeBookmarkEditFragment(@Nullable EditDescriptionFragment fragment) + { + if (fragment == null) + { + FragmentManager fm = ((FragmentActivity)getContext()).getSupportFragmentManager(); + fragment = (EditDescriptionFragment)fm.findFragmentByTag(EditDescriptionFragment.class.getName()); + } + + if (fragment == null) + return; + + fragment.setSaveDescriptionListener(new EditDescriptionFragment.OnDescriptionSavedListener() + { + @Override + public void onSaved(Bookmark bookmark) + { + final Bookmark updatedBookmark = BookmarkManager.INSTANCE.getBookmark(bookmark.getCategoryId(), bookmark.getBookmarkId()); + setMapObject(updatedBookmark); + Statistics.INSTANCE.trackDescriptionChanged(); + } + }); + } + @Override public void onClick(View v) { @@ -717,19 +753,12 @@ public class PlacePageView extends RelativeLayout implements View.OnClickListene case R.id.btn__edit_html_bookmark: saveBookmarkNameIfUpdated(); final Bundle args = new Bundle(); - final Bookmark bookmark = (Bookmark) mMapObject; - args.putString(EditDescriptionFragment.EXTRA_DESCRIPTION, bookmark.getBookmarkDescription()); - final EditDescriptionFragment fragment = (EditDescriptionFragment) Fragment.instantiate(getContext(), EditDescriptionFragment.class.getName(), args); + args.putParcelable(EditDescriptionFragment.EXTRA_BOOKMARK, mMapObject); + String name = EditDescriptionFragment.class.getName(); + final EditDescriptionFragment fragment = (EditDescriptionFragment) Fragment.instantiate(getContext(), name, args); fragment.setArguments(args); - fragment.setSaveDescriptionListener(new EditDescriptionFragment.OnDescriptionSaveListener() - { - @Override - public void onSave(String description) - { - updateDescription(bookmark, description); - } - }); - fragment.show(((FragmentActivity) getContext()).getSupportFragmentManager(), null); + fragment.show(((FragmentActivity) getContext()).getSupportFragmentManager(), name); + subscribeBookmarkEditFragment(fragment); break; case R.id.from: if (RoutingController.get().setStartPoint(mMapObject)) @@ -742,14 +771,6 @@ public class PlacePageView extends RelativeLayout implements View.OnClickListene } } - private void updateDescription(Bookmark bookmark, String description) - { - bookmark.setParams(bookmark.getName(), null, description); - final Bookmark updatedBookmark = BookmarkManager.INSTANCE.getBookmark(bookmark.getCategoryId(), bookmark.getBookmarkId()); - setMapObject(updatedBookmark); - Statistics.INSTANCE.trackDescriptionChanged(); - } - private void followUrl(String url) { final Intent intent = new Intent(Intent.ACTION_VIEW);