Add localized names.

This commit is contained in:
Sergey Magidovich 2016-06-27 16:11:43 +03:00
parent 57f6d20692
commit 9f1e419f82
7 changed files with 179 additions and 64 deletions

View file

@ -4,7 +4,7 @@ buildscript {
}
dependencies {
classpath 'com.android.tools.build:gradle:2.1.0'
classpath 'com.android.tools.build:gradle:2.1.2'
}
}

View file

@ -5,7 +5,7 @@ buildscript {
jcenter()
}
dependencies {
classpath 'com.android.tools.build:gradle:2.1.0'
classpath 'com.android.tools.build:gradle:2.1.2'
// NOTE: Do not place your application dependencies here; they belong
// in the individual module build.gradle files

View file

@ -7,7 +7,7 @@ buildscript {
}
dependencies {
classpath 'com.android.tools.build:gradle:2.1.0'
classpath 'com.android.tools.build:gradle:2.1.2'
classpath 'io.fabric.tools:gradle:1.+'
}
}

View file

@ -17,6 +17,7 @@ import android.util.SparseArray;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.view.ViewTreeObserver;
import android.widget.EditText;
import android.widget.ImageView;
import android.widget.TextView;
@ -44,8 +45,8 @@ public class EditorFragment extends BaseMwmFragment implements View.OnClickListe
private EditText mName;
private RecyclerView mLocalizedNames;
private final RecyclerView.AdapterDataObserver mLocalizedNamesObserver = new RecyclerView.AdapterDataObserver()
{
private final RecyclerView.AdapterDataObserver mLocalizedNamesObserver = new RecyclerView.AdapterDataObserver() {
@Override
public void onChanged()
{
@ -76,6 +77,7 @@ public class EditorFragment extends BaseMwmFragment implements View.OnClickListe
refreshLocalizedNames();
}
};
private MultilanguageAdapter mLocalizedNamesAdapter;
private TextView mLocalizedShow;
private boolean mIsLocalizedShown;
@ -195,6 +197,7 @@ public class EditorFragment extends BaseMwmFragment implements View.OnClickListe
refreshOpeningTime();
refreshEditableFields();
refreshResetButton();
refreshLocalizedNames();
}
@Override
@ -204,6 +207,17 @@ public class EditorFragment extends BaseMwmFragment implements View.OnClickListe
setEdits();
}
private void writeNames()
{
LinearLayoutManager lm = (LinearLayoutManager) mLocalizedNames.getLayoutManager();
for (int i = 0; i < mLocalizedNamesAdapter.getItemCount(); ++i)
{
View nameItem = lm.findViewByPosition(i);
EditText name = (EditText) nameItem.findViewById(R.id.input);
mParent.setLocalizedNameTo(name.getText().toString(), i + 1); // +1 Skip default name.
}
}
boolean setEdits()
{
if (!validateFields())
@ -218,7 +232,9 @@ public class EditorFragment extends BaseMwmFragment implements View.OnClickListe
Editor.nativeSetEmail(mEmail.getText().toString());
Editor.nativeSetHasWifi(mWifi.isChecked());
Editor.nativeSetOperator(mOperator.getText().toString());
// TODO set localizated names
writeNames();
Editor.nativeSetLocalizedNames(mParent.getLocalizedNamesAsArray());
return true;
}
@ -324,29 +340,63 @@ public class EditorFragment extends BaseMwmFragment implements View.OnClickListe
}
}
private void initLocalizedNameView(final View view)
{
mLocalizedNames = (RecyclerView) view.findViewById(R.id.recycler);
mLocalizedNames.setLayoutManager(new LinearLayoutManager(getActivity()));
mLocalizedNamesAdapter = new MultilanguageAdapter(mParent);
mLocalizedNames.setAdapter(mLocalizedNamesAdapter);
mLocalizedNamesAdapter.registerAdapterDataObserver(mLocalizedNamesObserver);
refreshLocalizedNames();
final Bundle args = getArguments();
if (args.containsKey(EditorHostFragment.kLastLocalizedNameIndex))
{
showLocalizedNames(true);
UiUtils.waitLayout(mLocalizedNames, new ViewTreeObserver.OnGlobalLayoutListener()
{
@Override
public void onGlobalLayout()
{
LinearLayoutManager lm = (LinearLayoutManager) mLocalizedNames.getLayoutManager();
int position = args.getInt(EditorHostFragment.kLastLocalizedNameIndex);
View nameItem = mLocalizedNames.getLayoutManager().findViewByPosition(position);
int cvNameTop = view.findViewById(R.id.cv__name).getTop();
int nameItemTop = nameItem.getTop();
view.scrollTo(0, cvNameTop + nameItemTop);
// TODO(mgsergio): Uncomment if focus and keyboard are required.
// TODO(mgsergio): Keyboard doesn't want to hide. Only pressing back button works.
// View nameItemInput = nameItem.findViewById(R.id.input);
// nameItemInput.requestFocus();
// InputUtils.showKeyboard(nameItemInput);
}
});
}
else
{
showLocalizedNames(false);
}
}
private void initViews(View view)
{
final View categoryBlock = view.findViewById(R.id.category);
categoryBlock.setOnClickListener(this);
// TODO show icon and fill it when core will implement that
UiUtils.hide(categoryBlock.findViewById(R.id.icon));
// UiUtils.hide(categoryBlock.findViewById(R.id.icon));
mCategory = (TextView) categoryBlock.findViewById(R.id.name);
mCardName = view.findViewById(R.id.cv__name);
mCardAddress = view.findViewById(R.id.cv__address);
mCardMetadata = view.findViewById(R.id.cv__metadata);
mName = findInput(mCardName);
// TODO uncomment and finish localized name
// view.findViewById(R.id.add_langs).setOnClickListener(this);
UiUtils.hide(view.findViewById(R.id.add_langs));
view.findViewById(R.id.add_langs).setOnClickListener(this);
mLocalizedShow = (TextView) view.findViewById(R.id.show_langs);
mLocalizedShow.setOnClickListener(this);
mLocalizedNames = (RecyclerView) view.findViewById(R.id.recycler);
mLocalizedNames.setLayoutManager(new LinearLayoutManager(getActivity()));
mLocalizedNamesAdapter = new MultilanguageAdapter(Editor.nativeGetLocalizedNames());
mLocalizedNames.setAdapter(mLocalizedNamesAdapter);
mLocalizedNamesAdapter.registerAdapterDataObserver(mLocalizedNamesObserver);
refreshLocalizedNames();
showLocalizedNames(false);
initLocalizedNameView(view);
// Address
view.findViewById(R.id.block_street).setOnClickListener(this);
@ -462,9 +512,7 @@ public class EditorFragment extends BaseMwmFragment implements View.OnClickListe
private void refreshLocalizedNames()
{
// TODO uncomment and finish localized names
// UiUtils.showIf(mLocalizedNamesAdapter.getItemCount() > 0, mLocalizedShow);
UiUtils.hide(mLocalizedNames, mLocalizedShow);
UiUtils.showIf(mLocalizedNamesAdapter.getItemCount() > 0, mLocalizedShow);
}
private void showLocalizedNames(boolean show)

View file

@ -16,6 +16,8 @@ import com.mapswithme.maps.MwmActivity;
import com.mapswithme.maps.R;
import com.mapswithme.maps.base.BaseMwmToolbarFragment;
import com.mapswithme.maps.base.OnBackPressListener;
import com.mapswithme.maps.editor.data.Language;
import com.mapswithme.maps.editor.data.LocalizedName;
import com.mapswithme.maps.editor.data.LocalizedStreet;
import com.mapswithme.maps.widget.SearchToolbarController;
import com.mapswithme.maps.widget.ToolbarController;
@ -24,10 +26,15 @@ import com.mapswithme.util.UiUtils;
import com.mapswithme.util.Utils;
import com.mapswithme.util.statistics.Statistics;
import java.util.ArrayList;
import java.util.Arrays;
public class EditorHostFragment extends BaseMwmToolbarFragment
implements OnBackPressListener, View.OnClickListener
implements OnBackPressListener, View.OnClickListener, LanguagesFragment.Listener
{
private boolean mIsNewObject;
final static String kExistingLocalizedNames = "ExistingLocalizedNames";
final static String kLastLocalizedNameIndex = "LastLocalizedNameIndex";
enum Mode
{
@ -40,6 +47,35 @@ public class EditorHostFragment extends BaseMwmToolbarFragment
private Mode mMode;
/// A list of localized names added by a user and those that were in metadata.
private ArrayList<LocalizedName> mLocalizedNames;
/// Used in MultilanguageAdapter to show, select and remove items.
ArrayList<LocalizedName> getLocalizedNames()
{
return mLocalizedNames;
}
public LocalizedName[] getLocalizedNamesAsArray()
{
return mLocalizedNames.toArray(new LocalizedName[mLocalizedNames.size()]);
}
void setLocalizedNames(LocalizedName[] names)
{
mLocalizedNames = new ArrayList(Arrays.asList(names));
}
void setLocalizedNameTo(String name, int index)
{
mLocalizedNames.get(index).name = name;
}
void addLocalizedName(LocalizedName name)
{
mLocalizedNames.add(name);
}
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState)
@ -65,6 +101,7 @@ public class EditorHostFragment extends BaseMwmToolbarFragment
mIsNewObject = getArguments().getBoolean(EditorActivity.EXTRA_NEW_OBJECT, false);
mToolbarController.setTitle(getTitle());
setLocalizedNames(Editor.nativeGetLocalizedNames());
editMapObject();
}
@ -104,11 +141,19 @@ public class EditorHostFragment extends BaseMwmToolbarFragment
}
protected void editMapObject()
{
editMapObject(false /* focusToLastLocalizedName */);
}
protected void editMapObject(boolean focusToLastLocalizedName)
{
mMode = Mode.MAP_OBJECT;
((SearchToolbarController) mToolbarController).showControls(false);
mToolbarController.setTitle(getTitle());
final Fragment editorFragment = Fragment.instantiate(getActivity(), EditorFragment.class.getName());
Bundle args = new Bundle();
if (focusToLastLocalizedName)
args.putInt(kLastLocalizedNameIndex, mLocalizedNames.size() - 2); // -1 for zero-based and one more -1 for ignoring default name.
final Fragment editorFragment = Fragment.instantiate(getActivity(), EditorFragment.class.getName(), args);
getChildFragmentManager().beginTransaction()
.replace(R.id.fragment_container, editorFragment, EditorFragment.class.getName())
.commit();
@ -133,7 +178,12 @@ public class EditorHostFragment extends BaseMwmToolbarFragment
protected void addLocalizedLanguage()
{
editWithFragment(Mode.LANGUAGE, R.string.choose_language, null, LanguagesFragment.class, false);
Bundle args = new Bundle();
String[] languages = new String[mLocalizedNames.size()];
for (int i = 0; i < mLocalizedNames.size(); ++i)
languages[i] = mLocalizedNames.get(i).lang;
args.putStringArray(kExistingLocalizedNames, languages);
editWithFragment(Mode.LANGUAGE, R.string.choose_language, args, LanguagesFragment.class, false);
}
private void editWithFragment(Mode newMode, @StringRes int toolbarTitle, @Nullable Bundle args, Class<? extends Fragment> fragmentClass, boolean showSearch)
@ -249,4 +299,11 @@ public class EditorHostFragment extends BaseMwmToolbarFragment
{
return mIsNewObject;
}
@Override
public void onLanguageSelected(Language lang)
{
addLocalizedName(Editor.nativeMakeLocalizedName(lang.code, ""));
editMapObject(true /* focusToLastLocalizedName */);
}
}

View file

@ -1,10 +1,18 @@
package com.mapswithme.maps.editor;
import android.os.Bundle;
import android.support.v7.widget.RecyclerView;
import com.mapswithme.maps.base.BaseMwmRecyclerFragment;
import com.mapswithme.maps.editor.data.Language;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Comparator;
import java.util.HashSet;
import static java.util.Collections.sort;
public class LanguagesFragment extends BaseMwmRecyclerFragment
{
public interface Listener
@ -15,14 +23,30 @@ public class LanguagesFragment extends BaseMwmRecyclerFragment
@Override
protected RecyclerView.Adapter createAdapter()
{
return new LanguagesAdapter(this, Editor.nativeGetSupportedLanguages());
Bundle args = getArguments();
HashSet<String> existingLanguages = new HashSet<>(Arrays.asList(args.getStringArray(EditorHostFragment.kExistingLocalizedNames)));
ArrayList<Language> languages = new ArrayList<>();
for (Language lang : Editor.nativeGetSupportedLanguages())
{
if (existingLanguages.contains(lang.code))
continue;
languages.add(lang);
}
sort(languages, new Comparator<Language>() {
@Override
public int compare(Language lhs, Language rhs) {
return lhs.name.compareTo(rhs.name);
}
});
return new LanguagesAdapter(this, languages.toArray(new Language[languages.size()]));
}
protected void onLanguageSelected(Language language)
{
if (getActivity() instanceof Listener)
((Listener) getActivity()).onLanguageSelected(language);
else if (getParentFragment() instanceof Listener)
if (getParentFragment() instanceof Listener)
((Listener) getParentFragment()).onLanguageSelected(language);
}
}

View file

@ -1,9 +1,6 @@
package com.mapswithme.maps.editor;
import android.support.v7.util.SortedList;
import android.support.v7.widget.RecyclerView;
import android.support.v7.widget.util.SortedListAdapterCallback;
import android.text.TextUtils;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
@ -11,47 +8,33 @@ import android.widget.EditText;
import com.mapswithme.maps.R;
import com.mapswithme.maps.editor.data.LocalizedName;
import com.mapswithme.util.UiUtils;
import java.util.ArrayList;
public class MultilanguageAdapter extends RecyclerView.Adapter<MultilanguageAdapter.Holder>
{
private SortedList<LocalizedName> mNames;
private ArrayList<LocalizedName> mNames;
private EditorHostFragment mHostFragment;
MultilanguageAdapter(LocalizedName[] names)
// TODO(mgsergio): Refactor: don't pass the whole EditorHostFragment.
MultilanguageAdapter(EditorHostFragment hostFragment)
{
mNames = new SortedList<>(LocalizedName.class,
new SortedListAdapterCallback<LocalizedName>(this)
{
@Override
public int compare(LocalizedName o1, LocalizedName o2)
{
return o1.lang.compareTo(o2.lang);
}
mHostFragment = hostFragment;
mNames = new ArrayList<>();
ArrayList<LocalizedName> names = mHostFragment.getLocalizedNames();
@Override
public boolean areContentsTheSame(LocalizedName oldItem, LocalizedName newItem)
{
return TextUtils.equals(oldItem.name, newItem.name);
}
@Override
public boolean areItemsTheSame(LocalizedName item1, LocalizedName item2)
{
return item1.code == item2.code;
}
},
names.length);
// skip default name
for (int i = 1; i < names.length; i++)
mNames.add(names[i]);
// Skip default name.
for (int i = 1; i < names.size(); i++)
mNames.add(names.get(i));
}
public void setNames(SortedList<LocalizedName> names)
public void setNames(ArrayList<LocalizedName> names)
{
mNames = names;
}
public SortedList<LocalizedName> getNames()
public ArrayList<LocalizedName> getNames()
{
return mNames;
}
@ -60,6 +43,8 @@ public class MultilanguageAdapter extends RecyclerView.Adapter<MultilanguageAdap
public Holder onCreateViewHolder(ViewGroup parent, int viewType)
{
final View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_localized_name, parent, false);
// TODO(mgsergio): Deletion is not implemented.
UiUtils.hide(view.findViewById(R.id.delete));
return new Holder(view);
}
@ -72,10 +57,7 @@ public class MultilanguageAdapter extends RecyclerView.Adapter<MultilanguageAdap
}
@Override
public int getItemCount()
{
return mNames.size();
}
public int getItemCount() { return mNames.size(); }
public class Holder extends RecyclerView.ViewHolder
{
@ -90,7 +72,11 @@ public class MultilanguageAdapter extends RecyclerView.Adapter<MultilanguageAdap
@Override
public void onClick(View v)
{
mNames.removeItemAt(getAdapterPosition());
// TODO(mgsergio): Implement item deletion.
// int position = getAdapterPosition();
// mHostFragment.removeLocalizedName(position + 1);
// mNames.remove(position);
// notifyItemRemoved(position);
}
});
}