From 7984be229ff97845ae2148797b66c870729721bc Mon Sep 17 00:00:00 2001 From: Dmitry Donskoy Date: Thu, 25 Oct 2018 13:19:30 +0300 Subject: [PATCH] [android] Added screen edit category settings, added notification mechanism when upload completed --- android/AndroidManifest.xml | 1 + .../res/drawable-hdpi/ic_clear_rounded.png | Bin 0 -> 767 bytes .../res/drawable-mdpi/ic_clear_rounded.png | Bin 0 -> 475 bytes .../res/drawable-xhdpi/ic_clear_rounded.png | Bin 0 -> 1013 bytes .../res/drawable-xxhdpi/ic_clear_rounded.png | Bin 0 -> 1496 bytes .../res/drawable-xxxhdpi/ic_clear_rounded.png | Bin 0 -> 2135 bytes .../res/layout/fragment_ugc_route_edit.xml | 121 +++++++++++ .../ugc_route_edit_settings_activity.xml | 7 + .../mapswithme/maps/base/DataObservable.java | 13 ++ .../mapswithme/maps/base/ObservableHost.java | 11 + .../data/AbstractCategoriesSnapshot.java | 22 +- .../maps/bookmarks/data/BookmarkCategory.java | 54 ++++- .../maps/bookmarks/data/BookmarkManager.java | 34 ++-- .../routes/UgcRouteEditSettingsActivity.java | 57 ++++++ .../routes/UgcRouteEditSettingsFragment.java | 190 ++++++++++++++++++ .../ugc/routes/UgcSharingOptionsFragment.java | 43 +++- android/src/com/mapswithme/util/Utils.java | 1 + 17 files changed, 525 insertions(+), 29 deletions(-) create mode 100644 android/res/drawable-hdpi/ic_clear_rounded.png create mode 100644 android/res/drawable-mdpi/ic_clear_rounded.png create mode 100644 android/res/drawable-xhdpi/ic_clear_rounded.png create mode 100644 android/res/drawable-xxhdpi/ic_clear_rounded.png create mode 100644 android/res/drawable-xxxhdpi/ic_clear_rounded.png create mode 100644 android/res/layout/fragment_ugc_route_edit.xml create mode 100644 android/res/layout/ugc_route_edit_settings_activity.xml create mode 100644 android/src/com/mapswithme/maps/base/DataObservable.java create mode 100644 android/src/com/mapswithme/maps/base/ObservableHost.java create mode 100644 android/src/com/mapswithme/maps/ugc/routes/UgcRouteEditSettingsActivity.java create mode 100644 android/src/com/mapswithme/maps/ugc/routes/UgcRouteEditSettingsFragment.java diff --git a/android/AndroidManifest.xml b/android/AndroidManifest.xml index e1eb9c3975..57b4b43316 100644 --- a/android/AndroidManifest.xml +++ b/android/AndroidManifest.xml @@ -447,6 +447,7 @@ android:label="@string/ugc_route_tags_screen_label"> + Px%xk*GpR9FeknCouSKoEr!iYQP(Ttvl9$j`z%z%%e}JPs1#r+*;CMO;K7w9pW~ z&&o#jvbNW5OnRgfXT3At=O17s^GO zDAOO(RPx=(3=xC*Y-MLQ1w#bsDB@^%u7D*RBL=tGsS)ytuCSqqBV{is;aD-QKR3+h z3P$J}93w1FnJ-@jbPJ@akJG(aD(CRQ@p3f zMC!x{nXa71h*_%`=fqh>9Vy5zYIE#^!hJRsu!L>ZloDk+8*he;Q~2y63i200AKYt? zU!e(tZb%1Gb{J*2*4@X&{F31zdP(ec*rM_d}dY|f!u^{LCNn%yh)9Lwb z!;HL#jdqX{q=B!TQ%1_jD8`=EKuVAXidsOUwCz3Relbmr$S|%@FZ*yVKKiWlUFWRA xEN!dF=(Hk7P;j<+o{K-Mf}n6T&6EA5_ZR$Tm>(Gt*1-S(002ovPDHLkV1hi0Z4Uqd literal 0 HcmV?d00001 diff --git a/android/res/drawable-mdpi/ic_clear_rounded.png b/android/res/drawable-mdpi/ic_clear_rounded.png new file mode 100644 index 0000000000000000000000000000000000000000..27a0df8b6b8d8051045b3ebe37a4d83b7b70762e GIT binary patch literal 475 zcmV<10VMv3P)Px$l}SWFR7efAmd#GXFc5?rnhPxgBzOSs+<6I}m#5&&i3|7gD=HA81?ID|k?ZcZ zri78Ean|;Xv;J!{+Kg7!6LDXpJQl%HT!`=DTUXX&9nE?uMG!j@4}$tKJXhdF#B>Fo z0V6&Yy}Fgo#ml$e??t|-hkddI4plf2e=AOZ`b0Z!3sxm4Xb4Fga|8xLr5FpQ*98x=M{##7Pl{oQDequf=@i z*3L}M6u7lu@qD!7fkQ6Z%|)N;SMG=hTSZ(J9J50KEj0T*@TD?G?3CaD;NnSlLcYl` zz&V=mTHhx%Bs~ea0Rdbw;sCVyQLzdPj*<7`^om5-7yowYV{E{Pui5!;%MSuVQ1ePJ RmPY^p002ovPDHLkV1i{a&PMPx&uSrBfRA>d&n#+#VFc3v)-p%_VU;`^Q%%8AFf^THUk}u#7Sg{;dAP@|rX=s>f z?y*u);>p96cGBsRuJUNRe6L+)J4r7t(mZeiz{WR<_up z_9fL_3O5AEdwp$G2O%fIN;nnV=53S)=+!#~hSbMLY=}83;2ISV0m|MI?h5q&7{)04 z6pjT%^;)U`V)~JAwbx^w0&BVXDv&dsmeP~g03q{Ou-QbX zlNoK&J^~n#M(Ywl<%f;6roG85*D9h-0AWMV&&3eIlzT3mnnJ@8b}r4unI2&6vj^|3)A&S?NCt zsYW8REnnLRc*)by2OJ3W9z;ANVdSZc4}5toaApJ$@j$3ePYK@WaeAH+fJo{{#N^+q z?q|VktO>smuoMWPA?6j4i#%NE@HGN%3v3;RTB?YgsZxC?h0m z&lg-5IeR{nexDmlV(%Kz)k>VOJcM}Gi7wyqZy|)3MstlsOrEe|i*O)}A>xz~U`gI~ z8kLK%m1vr6;+#Otp}_rZEi7a#V%scakZ9`p>h@qP5i3T3_#e8JNFh%dYzz@c2q4K= zY=$IqU(d^J&2oz1)#G;ra6$-q-@JLrtBGK_MDUvB7y%f)?|mkCsX9E23|XWQL5{o- zn4Ne~_dL+3cnHam#9Rh|HS z1R{9_|AUk20!EK`dV%`8FgU_BSXBUDMo>0)gJby>rz!yAd>OGVFxPW4xWTbBn}y07 zI$?TZVT;98%k1Ku(D@>iy$^{d0TkfNNbMaYg?DU_=Uq_Engmb)wZOYJPAOT5iN1mtUR4>_|g0hB=mIk6O`&Iyb8#-10SV0{88grgIIukk76Rcvdc;~HZ= z_FP?w2 j3*nkkK?Ioe?>7Gd#c1H!#fWv$00000NkvXXu0mjfHl59M literal 0 HcmV?d00001 diff --git a/android/res/drawable-xxhdpi/ic_clear_rounded.png b/android/res/drawable-xxhdpi/ic_clear_rounded.png new file mode 100644 index 0000000000000000000000000000000000000000..dba951bf935437d1362bad0d02a994d584fb69ee GIT binary patch literal 1496 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 N002ovPDHLkV1i8B(v|=K literal 0 HcmV?d00001 diff --git a/android/res/layout/fragment_ugc_route_edit.xml b/android/res/layout/fragment_ugc_route_edit.xml new file mode 100644 index 0000000000..8374f80846 --- /dev/null +++ b/android/res/layout/fragment_ugc_route_edit.xml @@ -0,0 +1,121 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/android/res/layout/ugc_route_edit_settings_activity.xml b/android/res/layout/ugc_route_edit_settings_activity.xml new file mode 100644 index 0000000000..2717be4ebd --- /dev/null +++ b/android/res/layout/ugc_route_edit_settings_activity.xml @@ -0,0 +1,7 @@ + + + diff --git a/android/src/com/mapswithme/maps/base/DataObservable.java b/android/src/com/mapswithme/maps/base/DataObservable.java new file mode 100644 index 0000000000..231126732a --- /dev/null +++ b/android/src/com/mapswithme/maps/base/DataObservable.java @@ -0,0 +1,13 @@ +package com.mapswithme.maps.base; + +import android.database.Observable; +import android.support.v7.widget.RecyclerView; + +public class DataObservable extends Observable +{ + public void notifyChanged() { + for (int i = mObservers.size() - 1; i >= 0; i--) { + mObservers.get(i).onChanged(); + } + } +} diff --git a/android/src/com/mapswithme/maps/base/ObservableHost.java b/android/src/com/mapswithme/maps/base/ObservableHost.java new file mode 100644 index 0000000000..1fec5942e4 --- /dev/null +++ b/android/src/com/mapswithme/maps/base/ObservableHost.java @@ -0,0 +1,11 @@ +package com.mapswithme.maps.base; + +import android.database.Observable; +import android.support.annotation.NonNull; +import android.support.v7.widget.RecyclerView; + +public interface ObservableHost> +{ + @NonNull + T getObservable(); +} diff --git a/android/src/com/mapswithme/maps/bookmarks/data/AbstractCategoriesSnapshot.java b/android/src/com/mapswithme/maps/bookmarks/data/AbstractCategoriesSnapshot.java index faa4654cf0..4707b4d8e4 100644 --- a/android/src/com/mapswithme/maps/bookmarks/data/AbstractCategoriesSnapshot.java +++ b/android/src/com/mapswithme/maps/bookmarks/data/AbstractCategoriesSnapshot.java @@ -42,17 +42,31 @@ public abstract class AbstractCategoriesSnapshot public int indexOfOrThrow(@NonNull BookmarkCategory category) { - List items = getItems(); - int indexOf = items.indexOf(category); + return indexOfThrowInternal(getItems(), category); + } + + private static int indexOfThrowInternal(@NonNull List categories, + @NonNull BookmarkCategory category) + { + int indexOf = categories.indexOf(category); if (indexOf < 0) { - throw new UnsupportedOperationException(new StringBuilder("This category absent in current snapshot ") + throw new UnsupportedOperationException(new StringBuilder("This category absent in " + + "current snapshot ") .append(category) .append("all items : ") - .append(Arrays.toString(items.toArray())) + .append(Arrays.toString(categories.toArray())) .toString()); } return indexOf; } + + @NonNull + public BookmarkCategory refresh(@NonNull BookmarkCategory category) + { + List items = getItems(); + int index = indexOfThrowInternal(items, category); + return items.get(index); + } } } diff --git a/android/src/com/mapswithme/maps/bookmarks/data/BookmarkCategory.java b/android/src/com/mapswithme/maps/bookmarks/data/BookmarkCategory.java index be131a9db9..5eb0d2c324 100644 --- a/android/src/com/mapswithme/maps/bookmarks/data/BookmarkCategory.java +++ b/android/src/com/mapswithme/maps/bookmarks/data/BookmarkCategory.java @@ -7,11 +7,13 @@ import android.os.Parcelable; import android.support.annotation.NonNull; import android.support.annotation.Nullable; import android.support.annotation.PluralsRes; +import android.support.annotation.StringRes; import android.text.TextUtils; import com.mapswithme.maps.R; import com.mapswithme.maps.bookmarks.BookmarksPageFactory; import com.mapswithme.util.TypeConverter; +import com.mapswithme.util.UiUtils; public class BookmarkCategory implements Parcelable { @@ -27,13 +29,16 @@ public class BookmarkCategory implements Parcelable private final int mTracksCount; private final int mBookmarksCount; private final int mTypeIndex; + private final int mAccessRulesIndex; private final boolean mIsMyCategory; private final boolean mIsVisible; + public BookmarkCategory(long id, @NonNull String name, @NonNull String authorId, @NonNull String authorName, @NonNull String annotation, @NonNull String description, int tracksCount, int bookmarksCount, - boolean fromCatalog, boolean isMyCategory, boolean isVisible) + boolean fromCatalog, boolean isMyCategory, boolean isVisible, + int accessRulesIndex) { mId = id; mName = name; @@ -47,6 +52,7 @@ public class BookmarkCategory implements Parcelable mAuthor = TextUtils.isEmpty(authorId) || TextUtils.isEmpty(authorName) ? null : new Author(authorId, authorName); + mAccessRulesIndex = accessRulesIndex; } @Override @@ -91,11 +97,18 @@ public class BookmarkCategory implements Parcelable return mBookmarksCount; } + @NonNull public Type getType() { return Type.values()[mTypeIndex]; } + @NonNull + public AccessRules getAccessRules() + { + return AccessRules.values()[mAccessRulesIndex]; + } + public boolean isFromCatalog() { return Type.values()[mTypeIndex] == Type.CATALOG; @@ -270,6 +283,7 @@ public class BookmarkCategory implements Parcelable sb.append(", mType=").append(Type.values()[mTypeIndex]); sb.append(", mIsMyCategory=").append(mIsMyCategory); sb.append(", mIsVisible=").append(mIsVisible); + sb.append(", mAccessRules=").append(getAccessRules()); sb.append('}'); return sb.toString(); } @@ -331,6 +345,7 @@ public class BookmarkCategory implements Parcelable dest.writeInt(this.mTypeIndex); dest.writeByte(this.mIsMyCategory ? (byte) 1 : (byte) 0); dest.writeByte(this.mIsVisible ? (byte) 1 : (byte) 0); + dest.writeInt(this.mAccessRulesIndex); } protected BookmarkCategory(Parcel in) @@ -345,6 +360,7 @@ public class BookmarkCategory implements Parcelable this.mTypeIndex = in.readInt(); this.mIsMyCategory = in.readByte() != 0; this.mIsVisible = in.readByte() != 0; + this.mAccessRulesIndex = in.readInt(); } public static final Creator CREATOR = new Creator() @@ -361,4 +377,40 @@ public class BookmarkCategory implements Parcelable return new BookmarkCategory[size]; } }; + + public enum AccessRules + { + ACCESS_RULES_LOCAL(R.string.not_shared), + ACCESS_RULES_PUBLIC(R.string.public_access), + ACCESS_RULES_DIRECT_LINK(R.string.limited_access), + ACCESS_RULES_P2P(UiUtils.NO_ID) + { + @Override + public int getResId() + { + throw new IllegalStateException("Unsupported here"); + } + }, + ACCESS_RULES_PAID(UiUtils.NO_ID) + { + @Override + public int getResId() + { + throw new IllegalStateException("Unsupported here"); + } + }; + + private final int mResId; + + AccessRules(int resId) + { + mResId = resId; + } + + @StringRes + public int getResId() + { + return mResId; + } + } } diff --git a/android/src/com/mapswithme/maps/bookmarks/data/BookmarkManager.java b/android/src/com/mapswithme/maps/bookmarks/data/BookmarkManager.java index 16afe5830c..e994c57c8a 100644 --- a/android/src/com/mapswithme/maps/bookmarks/data/BookmarkManager.java +++ b/android/src/com/mapswithme/maps/bookmarks/data/BookmarkManager.java @@ -49,16 +49,6 @@ public enum BookmarkManager public static final List ICONS = new ArrayList<>(); - @Retention(RetentionPolicy.SOURCE) - @IntDef({ ACCESS_RULES_LOCAL, ACCESS_RULES_PUBLIC, ACCESS_RULES_DIRECT_LINK, - ACCESS_RULES_P2P, ACCESS_RULES_PAID }) - public @interface AccessRules {} - public static final int ACCESS_RULES_LOCAL = 0; - public static final int ACCESS_RULES_PUBLIC = 1; - public static final int ACCESS_RULES_DIRECT_LINK = 2; - public static final int ACCESS_RULES_P2P = 3; - public static final int ACCESS_RULES_PAID = 4; - @Retention(RetentionPolicy.SOURCE) @IntDef({ UPLOAD_RESULT_SUCCESS, UPLOAD_RESULT_NETWORK_ERROR, UPLOAD_RESULT_SERVER_ERROR, UPLOAD_RESULT_AUTH_ERROR, UPLOAD_RESULT_MALFORMED_DATA_ERROR, @@ -348,6 +338,21 @@ public enum BookmarkManager nativeSetCategoryName(catId, name); } + public void setCategoryDesc(long id, @NonNull String categoryDesc) + { + nativeSetCategoryDesc(id, categoryDesc); + } + + public void setAccessRules(long id, @NonNull BookmarkCategory.AccessRules rules) + { + nativeSetCategoryAccessRules(id, rules.ordinal()); + } + + public void uploadToCatalog(@NonNull BookmarkCategory.AccessRules rules, long id) + { + nativeUploadToCatalog(rules.ordinal(), id); + } + /** * @return total count - tracks + bookmarks * @param category @@ -653,18 +658,17 @@ public enum BookmarkManager private native void nativeSetCategoryName(long catId, @NonNull String n); + private native void nativeSetCategoryDesc(long catId, @NonNull String n); + private native void nativeSetCategoryTags(long catId, @NonNull String[] tagsIds); - private native void nativeSetCategoryAccessRules(long catId, @AccessRules int accessRules); + private native void nativeSetCategoryAccessRules(long catId, int accessRules); private native void nativeSetCategoryCustomProperty(long catId, String key, String value); @NonNull private native String nativeGetCategoryAuthor(long catId); - @AccessRules - private native int nativeGetCategoryAccessRules(long catId); - private static native void nativeLoadBookmarks(); private native boolean nativeDeleteCategory(long catId); @@ -733,7 +737,7 @@ public enum BookmarkManager private static native void nativeImportFromCatalog(@NonNull String serverId, @NonNull String filePath); - private static native void nativeUploadToCatalog(@AccessRules int accessRules, + private static native void nativeUploadToCatalog(int accessRules, long catId); @NonNull diff --git a/android/src/com/mapswithme/maps/ugc/routes/UgcRouteEditSettingsActivity.java b/android/src/com/mapswithme/maps/ugc/routes/UgcRouteEditSettingsActivity.java new file mode 100644 index 0000000000..18f5a2a54e --- /dev/null +++ b/android/src/com/mapswithme/maps/ugc/routes/UgcRouteEditSettingsActivity.java @@ -0,0 +1,57 @@ +package com.mapswithme.maps.ugc.routes; + +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.FragmentManager; + +import com.mapswithme.maps.R; +import com.mapswithme.maps.base.BaseMwmFragmentActivity; +import com.mapswithme.maps.base.DataObservable; +import com.mapswithme.maps.base.ObservableHost; + +public class UgcRouteEditSettingsActivity extends BaseMwmFragmentActivity implements ObservableHost +{ + public static final String EXTRA_BOOKMARK_CATEGORY = "bookmark_category"; + + private static final String FRAGMENT_TAG = "edit_settings_fragment_tag"; + + @SuppressWarnings("NullableProblems") + @NonNull + private DataObservable mObservable; + + @Override + protected void safeOnCreate(@Nullable Bundle savedInstanceState) + { + super.safeOnCreate(savedInstanceState); + setContentView(R.layout.ugc_route_edit_settings_activity); + mObservable = new DataObservable(); + addSettingsFragmentIfAbsent(); + } + + private void addSettingsFragmentIfAbsent() + { + FragmentManager fm = getSupportFragmentManager(); + UgcRouteEditSettingsFragment fragment = (UgcRouteEditSettingsFragment) fm.findFragmentByTag(FRAGMENT_TAG); + + if (fragment == null) + { + fragment = UgcRouteEditSettingsFragment.makeInstance(getIntent().getExtras()); + fm.beginTransaction().add(R.id.fragment_container, fragment, FRAGMENT_TAG).commit(); + } + } + + @Override + protected Class getFragmentClass() + { + return null; + } + + @NonNull + @Override + public DataObservable getObservable() + { + return mObservable; + } +} diff --git a/android/src/com/mapswithme/maps/ugc/routes/UgcRouteEditSettingsFragment.java b/android/src/com/mapswithme/maps/ugc/routes/UgcRouteEditSettingsFragment.java new file mode 100644 index 0000000000..42e0b7b2d3 --- /dev/null +++ b/android/src/com/mapswithme/maps/ugc/routes/UgcRouteEditSettingsFragment.java @@ -0,0 +1,190 @@ +package com.mapswithme.maps.ugc.routes; + +import android.content.Context; +import android.os.Bundle; +import android.support.annotation.NonNull; +import android.support.annotation.Nullable; +import android.support.v4.app.Fragment; +import android.support.v7.widget.RecyclerView; +import android.text.TextUtils; +import android.view.LayoutInflater; +import android.view.MenuItem; +import android.view.View; +import android.view.ViewGroup; +import android.widget.EditText; +import android.widget.TextView; + +import com.mapswithme.maps.R; +import com.mapswithme.maps.base.BaseMwmToolbarFragment; +import com.mapswithme.maps.base.DataObservable; +import com.mapswithme.maps.base.ObservableHost; +import com.mapswithme.maps.bookmarks.data.BookmarkCategory; +import com.mapswithme.maps.bookmarks.data.BookmarkManager; +import com.mapswithme.maps.widget.ToolbarController; + +import java.util.Objects; + +public class UgcRouteEditSettingsFragment extends BaseMwmToolbarFragment +{ + private static final String SHARING_OPTIONS_FRAGMENT_TAG = "sharing_options_fragment"; + + @SuppressWarnings("NullableProblems") + @NonNull + private BookmarkCategory mCategory; + + @SuppressWarnings("NullableProblems") + @NonNull + private RecyclerView.AdapterDataObserver mObserver; + + @SuppressWarnings("NullableProblems") + @NonNull + private TextView mAccessRulesView; + + @SuppressWarnings("NullableProblems") + @NonNull + private ObservableHost mObserverHost; + + @SuppressWarnings("NullableProblems") + @NonNull + private EditText mEditDescView; + + @SuppressWarnings("NullableProblems") + @NonNull + private EditText mEditCategoryNameView; + + @Override + public void onAttach(Context context) + { + super.onAttach(context); + mObserverHost = (ObservableHost) context; + } + + @Override + public void onCreate(@Nullable Bundle savedInstanceState) + { + super.onCreate(savedInstanceState); + Bundle args = getArguments(); + if (args == null) + throw new IllegalArgumentException("Args must be not null"); + mCategory = Objects.requireNonNull(args.getParcelable(UgcRouteEditSettingsActivity.EXTRA_BOOKMARK_CATEGORY)); + } + + @Nullable + @Override + public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, + @Nullable Bundle savedInstanceState) + { + View root = inflater.inflate(R.layout.fragment_ugc_route_edit, container, false); + initViews(root); + mObserver = new CategoryObserver(); + mObserverHost.getObservable().registerObserver(mObserver); + return root; + } + + private void initViews(@NonNull View root) + { + View sharingOptionsBtn = root.findViewById(R.id.open_sharing_options_screen_btn_container); + mEditCategoryNameView = root.findViewById(R.id.edit_category_name_view); + mEditCategoryNameView.setText(mCategory.getName()); + mEditCategoryNameView.requestFocus(); + mAccessRulesView = root.findViewById(R.id.sharing_options_desc); + mAccessRulesView.setText(mCategory.getAccessRules().getResId()); + mEditDescView = root.findViewById(R.id.edit_description); + mEditDescView.setText(mCategory.getDescription()); + View clearNameBtn = root.findViewById(R.id.edit_text_clear_btn); + clearNameBtn.setOnClickListener(v -> mEditCategoryNameView.getEditableText().clear()); + sharingOptionsBtn.setOnClickListener(v -> onSharingOptionsClicked()); + } + + @Override + public void onDestroyView() + { + super.onDestroyView(); + mObserverHost.getObservable().unregisterObserver(mObserver); + } + + private void onSharingOptionsClicked() + { + openSharingOptionsScreen(); + } + + private void openSharingOptionsScreen() + { + Fragment fragment = UgcSharingOptionsFragment.makeInstance(mCategory); + getFragmentManager() + .beginTransaction() + .replace(R.id.fragment_container, fragment, SHARING_OPTIONS_FRAGMENT_TAG) + .addToBackStack(null) + .commit(); + } + + @Override + public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) + { + super.onViewCreated(view, savedInstanceState); + getToolbarController().setTitle(R.string.edit_list); + } + + @NonNull + @Override + protected ToolbarController onCreateToolbarController(@NonNull View root) + { + return new EditSettingsController(root); + } + + @Override + public boolean onOptionsItemSelected(MenuItem item) + { + if (item.getItemId() == R.id.done) + { + onEditDoneClicked(); + return true; + } + return super.onOptionsItemSelected(item); + } + + private void onEditDoneClicked() + { + String categoryName = mEditCategoryNameView.getEditableText().toString().trim(); + + if (!TextUtils.equals(categoryName, mCategory.getName())) + BookmarkManager.INSTANCE.setCategoryName(mCategory.getId(), categoryName); + + String categoryDesc = mEditDescView.getEditableText().toString().trim(); + if (!TextUtils.equals(mCategory.getDescription(), categoryDesc)) + BookmarkManager.INSTANCE.setCategoryDesc(mCategory.getId(), categoryDesc); + + } + + @NonNull + public static UgcRouteEditSettingsFragment makeInstance(@Nullable Bundle extras) + { + UgcRouteEditSettingsFragment fragment = new UgcRouteEditSettingsFragment(); + fragment.setArguments(extras); + return fragment; + } + + public class CategoryObserver extends RecyclerView.AdapterDataObserver + { + @Override + public void onChanged() + { + mCategory = BookmarkManager.INSTANCE.getAllCategoriesSnapshot().refresh(mCategory); + mAccessRulesView.setText(mCategory.getAccessRules().getResId()); + } + } + + private class EditSettingsController extends ToolbarController + { + EditSettingsController(@NonNull View root) + { + super(root, getActivity()); + } + + @Override + public void onUpClick() + { + getActivity().finish(); + } + } +} diff --git a/android/src/com/mapswithme/maps/ugc/routes/UgcSharingOptionsFragment.java b/android/src/com/mapswithme/maps/ugc/routes/UgcSharingOptionsFragment.java index eb60e78e68..308206f379 100644 --- a/android/src/com/mapswithme/maps/ugc/routes/UgcSharingOptionsFragment.java +++ b/android/src/com/mapswithme/maps/ugc/routes/UgcSharingOptionsFragment.java @@ -22,6 +22,7 @@ import com.mapswithme.maps.auth.BaseMwmAuthorizationFragment; import com.mapswithme.maps.bookmarks.data.BookmarkManager; import com.mapswithme.maps.bookmarks.data.CatalogCustomProperty; import com.mapswithme.maps.bookmarks.data.CatalogTagsGroup; +import com.mapswithme.maps.bookmarks.data.BookmarkCategory; import com.mapswithme.maps.dialog.AlertDialog; import com.mapswithme.maps.dialog.ProgressDialogFragment; import com.mapswithme.maps.widget.ToolbarController; @@ -29,9 +30,11 @@ import com.mapswithme.util.ConnectionState; import com.mapswithme.util.UiUtils; import java.util.List; +import java.util.Objects; public class UgcSharingOptionsFragment extends BaseMwmAuthorizationFragment implements BookmarkManager.BookmarksCatalogListener { + public static final String EXTRA_BOOKMARK_CATEGORY = "bookmark_category"; private static final String NO_NETWORK_CONNECTION_DIALOG_TAG = "no_network_connection_dialog"; private static final String UPLOADING_PROGRESS_DIALOG_TAG = "uploading_progress_dialog"; @@ -39,18 +42,16 @@ public class UgcSharingOptionsFragment extends BaseMwmAuthorizationFragment impl @NonNull private View mGetDirectLinkContainer; + @SuppressWarnings("NullableProblems") @NonNull + private BookmarkCategory mCategory; + @Override - protected ToolbarController onCreateToolbarController(@NonNull View root) + public void onCreate(@Nullable Bundle savedInstanceState) { - return new ToolbarController(root, getActivity()) - { - @Override - public void onUpClick() - { - getActivity().finish(); - } - }; + super.onCreate(savedInstanceState); + Bundle args = Objects.requireNonNull(getArguments()); + mCategory = Objects.requireNonNull(args.getParcelable(EXTRA_BOOKMARK_CATEGORY)); } @Nullable @@ -78,6 +79,13 @@ public class UgcSharingOptionsFragment extends BaseMwmAuthorizationFragment impl getToolbarController().setTitle(R.string.sharing_options); } + @NonNull + @Override + protected ToolbarController onCreateToolbarController(@NonNull View root) + { + return new SharingOptionsController(root); + } + private void initClickListeners(@NonNull View root) { View getDirectLinkView = root.findViewById(R.id.get_direct_link_text); @@ -287,4 +295,21 @@ public class UgcSharingOptionsFragment extends BaseMwmAuthorizationFragment impl { return true; } + + private class SharingOptionsController extends ToolbarController + { + SharingOptionsController(@NonNull View root) + { + super(root, getActivity()); + } + + @Override + public void onUpClick() + { + if (getFragmentManager().getBackStackEntryCount() == 0) + getActivity().finish(); + else + getFragmentManager().popBackStackImmediate(); + } + } } diff --git a/android/src/com/mapswithme/util/Utils.java b/android/src/com/mapswithme/util/Utils.java index 20b93461ad..b53e5ac20d 100644 --- a/android/src/com/mapswithme/util/Utils.java +++ b/android/src/com/mapswithme/util/Utils.java @@ -13,6 +13,7 @@ import android.net.Uri; import android.net.wifi.WifiInfo; import android.net.wifi.WifiManager; import android.os.Build; +import android.os.Bundle; import android.provider.Settings; import android.support.annotation.DimenRes; import android.support.annotation.NonNull;