From df4667ad59606a0ba6622dac4a4936906c487a00 Mon Sep 17 00:00:00 2001 From: Sergey Magidovich Date: Wed, 8 Jun 2016 16:52:36 +0300 Subject: [PATCH] Add validation to android. --- .../jni/com/mapswithme/maps/editor/Editor.cpp | 35 ++++++++ .../com/mapswithme/maps/editor/Editor.java | 6 ++ .../maps/editor/EditorFragment.java | 87 +++++++++++++++++-- indexer/editable_map_object.cpp | 2 + .../editable_map_object_test.cpp | 3 + 5 files changed, 127 insertions(+), 6 deletions(-) diff --git a/android/jni/com/mapswithme/maps/editor/Editor.cpp b/android/jni/com/mapswithme/maps/editor/Editor.cpp index bb5091bb1c..eafd002a42 100644 --- a/android/jni/com/mapswithme/maps/editor/Editor.cpp +++ b/android/jni/com/mapswithme/maps/editor/Editor.cpp @@ -517,6 +517,41 @@ Java_com_mapswithme_maps_editor_Editor_nativeIsLevelValid(JNIEnv * env, jclass c return osm::EditableMapObject::ValidateBuildingLevels(jni::ToNativeString(env, level)); } +// static boolean nativeIsFlatValid(String flats) +JNIEXPORT jboolean JNICALL +Java_com_mapswithme_maps_editor_Editor_nativeIsFlatValid(JNIEnv * env, jclass clazz, jstring flats) +{ + return osm::EditableMapObject::ValidateFlats(jni::ToNativeString(env, flats)); +} + +// static boolean nativeIsPostCodeValid(String zipCode) +JNIEXPORT jboolean JNICALL +Java_com_mapswithme_maps_editor_Editor_nativeIsZipcodeValid(JNIEnv * env, jclass clazz, jstring zipCode) +{ + return osm::EditableMapObject::ValidatePostCode(jni::ToNativeString(env, zipCode)); +} + +// static boolean nativeIsPhoneValid(String phone) +JNIEXPORT jboolean JNICALL +Java_com_mapswithme_maps_editor_Editor_nativeIsPhoneValid(JNIEnv * env, jclass clazz, jstring phone) +{ + return osm::EditableMapObject::ValidatePhone(jni::ToNativeString(env, phone)); +} + +// static boolean nativeIsWebsiteValid(String website) +JNIEXPORT jboolean JNICALL +Java_com_mapswithme_maps_editor_Editor_nativeIsWebsiteValid(JNIEnv * env, jclass clazz, jstring website) +{ + return osm::EditableMapObject::ValidateWebsite(jni::ToNativeString(env, website)); +} + +// static boolean nativeIsEmailValid(String email) +JNIEXPORT jboolean JNICALL +Java_com_mapswithme_maps_editor_Editor_nativeIsEmailValid(JNIEnv * env, jclass clazz, jstring email) +{ + return osm::EditableMapObject::ValidateEmail(jni::ToNativeString(env, email)); +} + JNIEXPORT jstring JNICALL Java_com_mapswithme_maps_editor_Editor_nativeGetCategory(JNIEnv * env, jclass clazz) { diff --git a/android/src/com/mapswithme/maps/editor/Editor.java b/android/src/com/mapswithme/maps/editor/Editor.java index d724312227..6ea15cc2ae 100644 --- a/android/src/com/mapswithme/maps/editor/Editor.java +++ b/android/src/com/mapswithme/maps/editor/Editor.java @@ -114,6 +114,12 @@ public final class Editor public static native void nativeSetHouseNumber(String houseNumber); public static native boolean nativeIsHouseValid(String houseNumber); public static native boolean nativeIsLevelValid(String level); + public static native boolean nativeIsFlatValid(String flat); + public static native boolean nativeIsZipcodeValid(String zipCode); + public static native boolean nativeIsPhoneValid(String phone); + public static native boolean nativeIsWebsiteValid(String site); + public static native boolean nativeIsEmailValid(String email); + public static native boolean nativeHasSomethingToUpload(); @WorkerThread diff --git a/android/src/com/mapswithme/maps/editor/EditorFragment.java b/android/src/com/mapswithme/maps/editor/EditorFragment.java index 19d94ee29b..ab58113ef5 100644 --- a/android/src/com/mapswithme/maps/editor/EditorFragment.java +++ b/android/src/com/mapswithme/maps/editor/EditorFragment.java @@ -84,14 +84,20 @@ public class EditorFragment extends BaseMwmFragment implements View.OnClickListe private EditText mZipcode; private View mBlockLevels; private EditText mBuildingLevels; - private TextInputLayout mInputHouseNumber; - private TextInputLayout mInputBuildingLevels; private EditText mPhone; private EditText mWebsite; private EditText mEmail; private TextView mCuisine; private EditText mOperator; private SwitchCompat mWifi; + + private TextInputLayout mInputHouseNumber; + private TextInputLayout mInputBuildingLevels; + private TextInputLayout mInputZipcode; + private TextInputLayout mInputPhone; + private TextInputLayout mInputWebsite; + private TextInputLayout mInputEmail; + private View mEmptyOpeningHours; private TextView mOpeningHours; private View mEditOpeningHours; @@ -133,6 +139,15 @@ public class EditorFragment extends BaseMwmFragment implements View.OnClickListe }); mZipcode.setText(Editor.nativeGetZipCode()); + mZipcode.addTextChangedListener(new StringUtils.SimpleTextWatcher() + { + @Override + public void onTextChanged(CharSequence s, int start, int before, int count) + { + UiUtils.setInputError(mInputZipcode, Editor.nativeIsZipcodeValid(s.toString()) ? 0 : R.string.error_enter_correct_zip_code); + } + }); + mBuildingLevels.setText(Editor.nativeGetBuildingLevels()); mBuildingLevels.addTextChangedListener(new StringUtils.SimpleTextWatcher() { @@ -144,8 +159,35 @@ public class EditorFragment extends BaseMwmFragment implements View.OnClickListe }); mPhone.setText(Editor.nativeGetPhone()); + mPhone.addTextChangedListener(new StringUtils.SimpleTextWatcher() + { + @Override + public void onTextChanged(CharSequence s, int start, int before, int count) + { + UiUtils.setInputError(mInputPhone, Editor.nativeIsPhoneValid(s.toString()) ? 0 : R.string.error_enter_correct_phone); + } + }); + mWebsite.setText(Editor.nativeGetWebsite()); + mWebsite.addTextChangedListener(new StringUtils.SimpleTextWatcher() + { + @Override + public void onTextChanged(CharSequence s, int start, int before, int count) + { + UiUtils.setInputError(mInputWebsite, Editor.nativeIsWebsiteValid(s.toString()) ? 0 : R.string.error_enter_correct_web); + } + }); + mEmail.setText(Editor.nativeGetEmail()); + mEmail.addTextChangedListener(new StringUtils.SimpleTextWatcher() + { + @Override + public void onTextChanged(CharSequence s, int start, int before, int count) + { + UiUtils.setInputError(mInputEmail, Editor.nativeIsEmailValid(s.toString()) ? 0 : R.string.error_enter_correct_email); + } + }); + mCuisine.setText(Editor.nativeGetFormattedCuisine()); mOperator.setText(Editor.nativeGetOperator()); mWifi.setChecked(Editor.nativeHasWifi()); @@ -202,6 +244,34 @@ public class EditorFragment extends BaseMwmFragment implements View.OnClickListe return false; } + if (!Editor.nativeIsZipcodeValid(mZipcode.getText().toString())) + { + mZipcode.requestFocus(); + InputUtils.showKeyboard(mZipcode); + return false; + } + + if (!Editor.nativeIsPhoneValid(mPhone.getText().toString())) + { + mPhone.requestFocus(); + InputUtils.showKeyboard(mPhone); + return false; + } + + if (!Editor.nativeIsWebsiteValid(mWebsite.getText().toString())) + { + mWebsite.requestFocus(); + InputUtils.showKeyboard(mWebsite); + return false; + } + + if (!Editor.nativeIsEmailValid(mEmail.getText().toString())) + { + mEmail.requestFocus(); + InputUtils.showKeyboard(mEmail); + return false; + } + return true; } @@ -273,6 +343,7 @@ public class EditorFragment extends BaseMwmFragment implements View.OnClickListe mLocalizedNamesAdapter.registerAdapterDataObserver(mLocalizedNamesObserver); refreshLocalizedNames(); showLocalizedNames(false); + // Address view.findViewById(R.id.block_street).setOnClickListener(this); mStreet = (TextView) view.findViewById(R.id.street); @@ -281,17 +352,21 @@ public class EditorFragment extends BaseMwmFragment implements View.OnClickListe mInputHouseNumber = (TextInputLayout) blockHouseNumber.findViewById(R.id.custom_input); View blockZipcode = view.findViewById(R.id.block_zipcode); mZipcode = findInputAndInitBlock(blockZipcode, 0, R.string.editor_zip_code); - mBlockLevels = view.findViewById(R.id.block_levels); - mInputBuildingLevels = (TextInputLayout) mBlockLevels.findViewById(R.id.custom_input); - // TODO set level limits from core - mBuildingLevels = findInputAndInitBlock(mBlockLevels, 0, getString(R.string.editor_storey_number, 25)); + mInputZipcode = (TextInputLayout) blockZipcode.findViewById(R.id.custom_input); + // Details + mBlockLevels = view.findViewById(R.id.block_levels); + mBuildingLevels = findInputAndInitBlock(mBlockLevels, 0, getString(R.string.editor_storey_number, 25)); + mInputBuildingLevels = (TextInputLayout) mBlockLevels.findViewById(R.id.custom_input); View blockPhone = view.findViewById(R.id.block_phone); mPhone = findInputAndInitBlock(blockPhone, R.drawable.ic_phone, R.string.phone); + mInputPhone = (TextInputLayout) blockPhone.findViewById(R.id.custom_input); View blockWeb = view.findViewById(R.id.block_website); mWebsite = findInputAndInitBlock(blockWeb, R.drawable.ic_website, R.string.website); + mInputWebsite = (TextInputLayout) blockWeb.findViewById(R.id.custom_input); View blockEmail = view.findViewById(R.id.block_email); mEmail = findInputAndInitBlock(blockEmail, R.drawable.ic_email, R.string.email); + mInputEmail = (TextInputLayout) blockEmail.findViewById(R.id.custom_input); View blockCuisine = view.findViewById(R.id.block_cuisine); blockCuisine.setOnClickListener(this); mCuisine = (TextView) view.findViewById(R.id.cuisine); diff --git a/indexer/editable_map_object.cpp b/indexer/editable_map_object.cpp index e69836c95c..f4bed945f6 100644 --- a/indexer/editable_map_object.cpp +++ b/indexer/editable_map_object.cpp @@ -255,6 +255,8 @@ bool EditableMapObject::ValidateFlats(string const & flats) // static bool EditableMapObject::ValidatePostCode(string const & postCode) { + if (postCode.empty()) + return true; return search::LooksLikePostcode(postCode, false /* IsPrefix */); } diff --git a/indexer/indexer_tests/editable_map_object_test.cpp b/indexer/indexer_tests/editable_map_object_test.cpp index 41897c9dc9..332c0f2858 100644 --- a/indexer/indexer_tests/editable_map_object_test.cpp +++ b/indexer/indexer_tests/editable_map_object_test.cpp @@ -30,6 +30,9 @@ UNIT_TEST(EditableMapObject_ValidateBuildingLevels) TEST(EditableMapObject::ValidateBuildingLevels("25"), ()); TEST(!EditableMapObject::ValidateBuildingLevels("0"), ()); TEST(!EditableMapObject::ValidateBuildingLevels("26"), ()); + TEST(!EditableMapObject::ValidateBuildingLevels("22a"), ()); + TEST(!EditableMapObject::ValidateBuildingLevels("a22"), ()); + TEST(!EditableMapObject::ValidateBuildingLevels("2a22"), ()); TEST(!EditableMapObject::ValidateBuildingLevels("ab"), ()); TEST(!EditableMapObject::ValidateBuildingLevels( "2345534564564453645534545345534564564453645"), ());