[android] Fixes for multiple TODOs after userkmark refactoring.

This commit is contained in:
Dmitry Yunitsky 2016-03-02 16:03:44 +03:00 committed by Sergey Yershov
parent da41c662ba
commit 13f404a2fe
8 changed files with 77 additions and 79 deletions

View file

@ -39,12 +39,12 @@ using platform::LocalCountryFile;
namespace
{
::Framework * frm()
{
return g_framework->NativeFramework();
}
jobject g_mapObjectListener;
} // namespace
namespace android
@ -479,29 +479,25 @@ extern "C"
}
JNIEXPORT void JNICALL
Java_com_mapswithme_maps_Framework_nativeSetMapObjectListener(JNIEnv * env, jclass clazz, jobject l)
Java_com_mapswithme_maps_Framework_nativeSetMapObjectListener(JNIEnv * env, jclass clazz, jobject jListener)
{
// TODO: We never clean up this global ref.
jobject const listener = env->NewGlobalRef(l);
frm()->SetMapSelectionListeners([listener](place_page::Info const & info)
g_mapObjectListener = env->NewGlobalRef(jListener);
// void onMapObjectActivated(MapObject object);
jmethodID const activatedId = jni::GetMethodID(env, g_mapObjectListener, "onMapObjectActivated",
"(Lcom/mapswithme/maps/bookmarks/data/MapObject;)V");
// void onDismiss(boolean switchFullScreenMode);
jmethodID const dismissId = jni::GetMethodID(env, g_mapObjectListener, "onDismiss", "(Z)V");
frm()->SetMapSelectionListeners([activatedId](place_page::Info const & info)
{
// 1st listener: User has selected an object on a map.
JNIEnv * env = jni::GetEnv();
g_framework->SetPlacePageInfo(info);
jni::TScopedLocalRef mapObject(env, usermark_helper::CreateMapObject(env, info));
jmethodID const methodId = jni::GetMethodID(env, listener, "onMapObjectActivated",
"(Lcom/mapswithme/maps/bookmarks/data/MapObject;)V");
//public MapObject(@MapObjectType int mapObjectType, String name, double lat, double lon, String typeName)
env->CallVoidMethod(listener, methodId, mapObject.get());
}, [listener](bool /*enterFullScreenMode*/)
env->CallVoidMethod(g_mapObjectListener, activatedId, mapObject.get());
}, [dismissId](bool switchFullScreenMode)
{
// 2nd listener: User has deselected object on a map, or tapped on an empty space (iOS toggles full screen mode in this case).
JNIEnv * env = jni::GetEnv();
// TODO(yunikkk): Do we really need the next line? UI should always know when this info is valid, right?
g_framework->SetPlacePageInfo({});
jmethodID const methodId = jni::GetMethodID(env, listener, "onDismiss", "()V");
ASSERT(methodId, ());
env->CallVoidMethod(listener, methodId);
env->CallVoidMethod(g_mapObjectListener, dismissId, switchFullScreenMode);
});
}
@ -509,6 +505,7 @@ extern "C"
Java_com_mapswithme_maps_Framework_nativeRemoveMapObjectListener(JNIEnv * env, jobject thiz)
{
frm()->SetMapSelectionListeners({}, {});
env->DeleteGlobalRef(g_mapObjectListener);
}
JNIEXPORT jstring JNICALL
@ -961,12 +958,6 @@ extern "C"
env->SetBooleanField(result, buildingsField, buildings);
}
JNIEXPORT jobject JNICALL
Java_com_mapswithme_maps_Framework_nativeGetActiveMapObject(JNIEnv * env, jclass thiz)
{
return usermark_helper::CreateMapObject(env, g_framework->GetPlacePageInfo());
}
extern JNIEXPORT void JNICALL
Java_com_mapswithme_maps_bookmarks_data_BookmarkManager_nativeDeleteBookmark(JNIEnv *, jobject, jint, jint);

View file

@ -199,8 +199,6 @@ extern "C"
{
lock_guard<mutex> guard(g_resultsMutex);
Result const & result = g_results.GetResult(index);
// TODO(yunikkk): why do we need to do it?
g_framework->SetPlacePageInfo({});
g_framework->PostDrapeTask([result]()
{
g_framework->NativeFramework()->ShowSearchResult(result);

View file

@ -48,10 +48,8 @@ Java_com_mapswithme_maps_bookmarks_data_Bookmark_nativeSetBookmarkParams(
// initialize new bookmark
BookmarkData bm(jni::ToNativeString(env, name), jni::ToNativeString(env, type));
if (descr)
bm.SetDescription(jni::ToNativeString(env, descr));
else
bm.SetDescription(p->GetDescription());
bm.SetDescription(descr ? jni::ToNativeString(env, descr)
: p->GetDescription());
g_framework->ReplaceBookmark(BookmarkAndCategory(cat, bmk), bm);
}

View file

@ -15,7 +15,7 @@
namespace
{
osm::EditableMapObject gEditableMapObject;
osm::EditableMapObject g_editableMapObject;
} // namespace
extern "C"
@ -26,7 +26,7 @@ JNIEXPORT jstring JNICALL
Java_com_mapswithme_maps_editor_Editor_nativeGetMetadata(JNIEnv * env, jclass, jint type)
{
// TODO(yunikkk): Switch to osm::Props enum instead of metadata, and use separate getters instead a generic one.
return jni::ToJavaString(env, gEditableMapObject.GetMetadata().Get(static_cast<feature::Metadata::EType>(type)));
return jni::ToJavaString(env, g_editableMapObject.GetMetadata().Get(static_cast<feature::Metadata::EType>(type)));
}
JNIEXPORT void JNICALL
@ -38,21 +38,21 @@ Java_com_mapswithme_maps_editor_Editor_nativeSetMetadata(JNIEnv * env, jclass cl
switch (type)
{
// TODO(yunikkk): Pass cuisines in a separate setter via vector of osm untranslated keys (SetCuisines()).
case Metadata::FMD_CUISINE: gEditableMapObject.SetRawOSMCuisines(v); break;
case Metadata::FMD_OPEN_HOURS: gEditableMapObject.SetOpeningHours(v); break;
case Metadata::FMD_PHONE_NUMBER: gEditableMapObject.SetPhone(v); break;
case Metadata::FMD_FAX_NUMBER: gEditableMapObject.SetFax(v); break;
case Metadata::FMD_CUISINE: g_editableMapObject.SetRawOSMCuisines(v); break;
case Metadata::FMD_OPEN_HOURS: g_editableMapObject.SetOpeningHours(v); break;
case Metadata::FMD_PHONE_NUMBER: g_editableMapObject.SetPhone(v); break;
case Metadata::FMD_FAX_NUMBER: g_editableMapObject.SetFax(v); break;
case Metadata::FMD_STARS:
{
// TODO(yunikkk): Pass stars in a separate integer setter.
int stars;
if (strings::to_int(v, stars))
gEditableMapObject.SetStars(stars);
g_editableMapObject.SetStars(stars);
break;
}
case Metadata::FMD_OPERATOR: gEditableMapObject.SetOperator(v); break;
case Metadata::FMD_OPERATOR: g_editableMapObject.SetOperator(v); break;
case Metadata::FMD_URL: // We don't allow url in UI. Website should be used instead.
case Metadata::FMD_WEBSITE: gEditableMapObject.SetWebsite(v); break;
case Metadata::FMD_WEBSITE: g_editableMapObject.SetWebsite(v); break;
case Metadata::FMD_INTERNET: // TODO(yunikkk): use separate setter for Internet.
{
osm::Internet inet = osm::Internet::Unknown;
@ -64,21 +64,21 @@ Java_com_mapswithme_maps_editor_Editor_nativeSetMetadata(JNIEnv * env, jclass cl
inet = osm::Internet::No;
if (v == DebugPrint(osm::Internet::Yes))
inet = osm::Internet::Yes;
gEditableMapObject.SetInternet(inet);
g_editableMapObject.SetInternet(inet);
}
break;
case Metadata::FMD_ELE:
{
double ele;
if (strings::to_double(v, ele))
gEditableMapObject.SetElevation(ele);
g_editableMapObject.SetElevation(ele);
break;
}
case Metadata::FMD_EMAIL: gEditableMapObject.SetEmail(v); break;
case Metadata::FMD_POSTCODE: gEditableMapObject.SetPostcode(v); break;
case Metadata::FMD_WIKIPEDIA: gEditableMapObject.SetWikipedia(v); break;
case Metadata::FMD_FLATS: gEditableMapObject.SetFlats(v); break;
case Metadata::FMD_BUILDING_LEVELS: gEditableMapObject.SetBuildingLevels(v); break;
case Metadata::FMD_EMAIL: g_editableMapObject.SetEmail(v); break;
case Metadata::FMD_POSTCODE: g_editableMapObject.SetPostcode(v); break;
case Metadata::FMD_WIKIPEDIA: g_editableMapObject.SetWikipedia(v); break;
case Metadata::FMD_FLATS: g_editableMapObject.SetFlats(v); break;
case Metadata::FMD_BUILDING_LEVELS: g_editableMapObject.SetBuildingLevels(v); break;
case Metadata::FMD_TURN_LANES:
case Metadata::FMD_TURN_LANES_FORWARD:
case Metadata::FMD_TURN_LANES_BACKWARD:
@ -95,7 +95,7 @@ Java_com_mapswithme_maps_editor_Editor_nativeSetMetadata(JNIEnv * env, jclass cl
JNIEXPORT jboolean JNICALL
Java_com_mapswithme_maps_editor_Editor_nativeSaveEditedFeature(JNIEnv *, jclass)
{
switch (g_framework->NativeFramework()->SaveEditedMapObject(gEditableMapObject))
switch (g_framework->NativeFramework()->SaveEditedMapObject(g_editableMapObject))
{
case osm::Editor::NothingWasChanged:
case osm::Editor::SavedSuccessfully:
@ -114,7 +114,7 @@ Java_com_mapswithme_maps_editor_Editor_nativeIsFeatureEditable(JNIEnv *, jclass)
JNIEXPORT jintArray JNICALL
Java_com_mapswithme_maps_editor_Editor_nativeGetEditableFields(JNIEnv * env, jclass clazz)
{
auto const & editable = gEditableMapObject.GetEditableFields();
auto const & editable = g_editableMapObject.GetEditableFields();
int const size = editable.size();
jintArray jEditableFields = env->NewIntArray(size);
jint * arr = env->GetIntArrayElements(jEditableFields, 0);
@ -128,59 +128,59 @@ Java_com_mapswithme_maps_editor_Editor_nativeGetEditableFields(JNIEnv * env, jcl
JNIEXPORT jboolean JNICALL
Java_com_mapswithme_maps_editor_Editor_nativeIsAddressEditable(JNIEnv * env, jclass clazz)
{
return gEditableMapObject.IsAddressEditable();
return g_editableMapObject.IsAddressEditable();
}
JNIEXPORT jboolean JNICALL
Java_com_mapswithme_maps_editor_Editor_nativeIsNameEditable(JNIEnv * env, jclass clazz)
{
return gEditableMapObject.IsNameEditable();
return g_editableMapObject.IsNameEditable();
}
JNIEXPORT jstring JNICALL
Java_com_mapswithme_maps_editor_Editor_nativeGetDefaultName(JNIEnv * env, jclass)
{
// TODO(yunikkk): add multilanguage names support via EditableMapObject::GetLocalizedName().
return jni::ToJavaString(env, gEditableMapObject.GetDefaultName());
return jni::ToJavaString(env, g_editableMapObject.GetDefaultName());
}
JNIEXPORT void JNICALL
Java_com_mapswithme_maps_editor_Editor_nativeSetDefaultName(JNIEnv * env, jclass, jstring name)
{
StringUtf8Multilang names = gEditableMapObject.GetName();
StringUtf8Multilang names = g_editableMapObject.GetName();
// TODO(yunikkk): add multilanguage names support.
names.AddString(StringUtf8Multilang::kDefaultCode, jni::ToNativeString(env, name));
gEditableMapObject.SetName(names);
g_editableMapObject.SetName(names);
}
JNIEXPORT jstring JNICALL
Java_com_mapswithme_maps_editor_Editor_nativeGetStreet(JNIEnv * env, jclass)
{
return jni::ToJavaString(env, gEditableMapObject.GetStreet());
return jni::ToJavaString(env, g_editableMapObject.GetStreet());
}
JNIEXPORT void JNICALL
Java_com_mapswithme_maps_editor_Editor_nativeSetStreet(JNIEnv * env, jclass, jstring street)
{
gEditableMapObject.SetStreet(jni::ToNativeString(env, street));
g_editableMapObject.SetStreet(jni::ToNativeString(env, street));
}
JNIEXPORT jstring JNICALL
Java_com_mapswithme_maps_editor_Editor_nativeGetHouseNumber(JNIEnv * env, jclass)
{
return jni::ToJavaString(env, gEditableMapObject.GetHouseNumber());
return jni::ToJavaString(env, g_editableMapObject.GetHouseNumber());
}
JNIEXPORT void JNICALL
Java_com_mapswithme_maps_editor_Editor_nativeSetHouseNumber(JNIEnv * env, jclass, jstring houseNumber)
{
gEditableMapObject.SetHouseNumber(jni::ToNativeString(env, houseNumber));
g_editableMapObject.SetHouseNumber(jni::ToNativeString(env, houseNumber));
}
JNIEXPORT jobjectArray JNICALL
Java_com_mapswithme_maps_editor_Editor_nativeGetNearbyStreets(JNIEnv * env, jclass clazz)
{
auto const & streets = gEditableMapObject.GetNearbyStreets();
auto const & streets = g_editableMapObject.GetNearbyStreets();
int const size = streets.size();
jobjectArray jStreets = env->NewObjectArray(size, jni::GetStringClass(env), 0);
for (int i = 0; i < size; ++i)
@ -192,7 +192,7 @@ JNIEXPORT jboolean JNICALL
Java_com_mapswithme_maps_editor_Editor_nativeHasWifi(JNIEnv *, jclass)
{
// TODO(AlexZ): Support 3-state: yes, no, unknown.
return gEditableMapObject.GetMetadata().Get(feature::Metadata::FMD_INTERNET) == "wlan";
return g_editableMapObject.GetMetadata().Get(feature::Metadata::FMD_INTERNET) == "wlan";
}
@ -231,6 +231,6 @@ Java_com_mapswithme_maps_editor_Editor_nativeStartEdit(JNIEnv *, jclass)
{
::Framework * frm = g_framework->NativeFramework();
place_page::Info const & info = g_framework->GetPlacePageInfo();
CHECK(frm->GetEditableMapObject(info.GetID(), gEditableMapObject), ("Invalid feature in the place page."));
CHECK(frm->GetEditableMapObject(info.GetID(), g_editableMapObject), ("Invalid feature in the place page."));
}
} // extern "C"

View file

@ -26,7 +26,7 @@ public class Framework
{
void onMapObjectActivated(MapObject object);
void onDismiss();
void onDismiss(boolean switchFullScreenMode);
}
@SuppressWarnings("unused")

View file

@ -256,17 +256,12 @@ public class MwmActivity extends BaseMwmFragmentActivity
public void showEditor()
{
// TODO(yunikkk) think about refactoring. It probably should be called in editor.
Editor.nativeStartEdit();
if (mIsFragmentContainer)
{
final Bundle args = new Bundle();
replaceFragment(EditorHostFragment.class, args, null);
}
replaceFragment(EditorHostFragment.class, null, null);
else
{
// Initializes editable feature from currently active place page.
Editor.nativeStartEdit();
EditorActivity.start(this);
}
}
private void shareMyLocation()
@ -1013,7 +1008,6 @@ public class MwmActivity extends BaseMwmFragmentActivity
request.setPointData(object.getLat(), object.getLon(), object.getTitle(), object.getSearchId());
object.setTypeName(request.getCallerName(MwmApplication.get()).toString());
}
else if (MapObject.isOfType(MapObject.MY_POSITION, object) &&
Framework.nativeIsRoutingActive())
@ -1031,9 +1025,9 @@ public class MwmActivity extends BaseMwmFragmentActivity
}
@Override
public void onDismiss()
public void onDismiss(boolean switchFullScreenMode)
{
if (mPlacePage.getMapObject() == null)
if (switchFullScreenMode)
{
if ((mPanelAnimator != null && mPanelAnimator.isVisible()) ||
UiUtils.isVisible(mSearchController.getToolbar()))

View file

@ -68,20 +68,27 @@ public final class Editor
public static native String nativeGetStreet();
public static native void nativeSetStreet(String street);
public static native String nativeGetHouseNumber();
public static native void nativeSetHouseNumber(String houseNumber);
// TODO(AlexZ): Support 3-state: Yes, No, Unknown.
public static native boolean nativeHasWifi();
// Generic methods.
public static native boolean nativeHasSomethingToUpload();
@WorkerThread
private static native void nativeUploadChanges(String token, String secret);
/**
* @return array [total edits count, uploaded edits count, last upload timestamp]
*/
public static native long[] nativeGetStats();
public static native void nativeClearLocalEdits();
// That method should be called, when user opens editor from place page, so that information in editor
// could refresh.
public static native void nativeStartEdit();
/**
* @return true if feature was saved. False if some error occurred (eg. no space)
*/
public static native boolean nativeSaveEditedFeature();
}

View file

@ -7,17 +7,20 @@ import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import com.mapswithme.maps.MwmApplication;
import com.mapswithme.maps.R;
import com.mapswithme.maps.base.BaseMwmToolbarFragment;
import com.mapswithme.maps.base.OnBackPressListener;
// TODO(yunikkk): why is feature metadata in bookmarks? How are they related to each other?
import com.mapswithme.maps.bookmarks.data.Metadata;
import com.mapswithme.util.ConnectionState;
import com.mapswithme.util.UiUtils;
import com.mapswithme.util.Utils;
public class EditorHostFragment extends BaseMwmToolbarFragment
implements OnBackPressListener, View.OnClickListener
{
private static final String PREF_LAST_AUTH_DISPLAY_TIMESTAMP = "LastAuth";
enum Mode
{
MAP_OBJECT,
@ -25,6 +28,7 @@ public class EditorHostFragment extends BaseMwmToolbarFragment
STREET,
CUISINE
}
private Mode mMode;
@Nullable
@ -40,7 +44,8 @@ public class EditorHostFragment extends BaseMwmToolbarFragment
super.onViewCreated(view, savedInstanceState);
editMapObject();
mToolbarController.findViewById(R.id.save).setOnClickListener(this);
mToolbarController.getToolbar().setNavigationOnClickListener(new View.OnClickListener() {
mToolbarController.getToolbar().setNavigationOnClickListener(new View.OnClickListener()
{
@Override
public void onClick(View v)
{
@ -168,16 +173,15 @@ public class EditorHostFragment extends BaseMwmToolbarFragment
Editor.nativeSetHouseNumber(editorFragment.getHouseNumber());
if (Editor.nativeSaveEditedFeature())
{
if (OsmOAuth.isAuthorized())
if (OsmOAuth.isAuthorized() || !ConnectionState.isConnected())
Utils.navigateToParent(getActivity());
else
// TODO(yunikkk): auth should be displayed only once, we should remember the time it was displayed.
// And if there is no connection, no auth should be displayed at all.
showAuthorization();
}
else
{
// TODO(yunikkk): Show error dialog that changes can't be saved (for example, there is no free space).
// TODO(yunikkk) set correct error text.
UiUtils.showAlertDialog(getActivity(), R.string.not_enough_disk_space);
}
break;
}
@ -186,6 +190,12 @@ public class EditorHostFragment extends BaseMwmToolbarFragment
private void showAuthorization()
{
getMwmActivity().replaceFragment(AuthFragment.class, null, null);
if (!MwmApplication.prefs().contains(PREF_LAST_AUTH_DISPLAY_TIMESTAMP))
{
MwmApplication.prefs().edit().putLong(PREF_LAST_AUTH_DISPLAY_TIMESTAMP, System.currentTimeMillis()).apply();
getMwmActivity().replaceFragment(AuthFragment.class, null, null);
}
else
mToolbarController.onUpClick();
}
}