diff options
author | Sergey Magidovich <mgsergio@mapswithme.com> | 2016-06-27 16:11:43 +0300 |
---|---|---|
committer | Sergey Magidovich <mgsergio@mapswithme.com> | 2016-07-01 15:27:59 +0300 |
commit | 9f1e419f825cab84b140ec70ce08744cc6d76c07 (patch) | |
tree | 9a9334809f2e1c3ed328c553124e142c755d09db /android | |
parent | 57f6d206925fe777796d72c81ea975ecedbd6eff (diff) |
Add localized names.
Diffstat (limited to 'android')
-rw-r--r-- | android/3rd_party/BottomSheet/build.gradle | 2 | ||||
-rw-r--r-- | android/UnitTests/build.gradle | 2 | ||||
-rw-r--r-- | android/build.gradle | 2 | ||||
-rw-r--r-- | android/src/com/mapswithme/maps/editor/EditorFragment.java | 82 | ||||
-rw-r--r-- | android/src/com/mapswithme/maps/editor/EditorHostFragment.java | 63 | ||||
-rw-r--r-- | android/src/com/mapswithme/maps/editor/LanguagesFragment.java | 32 | ||||
-rw-r--r-- | android/src/com/mapswithme/maps/editor/MultilanguageAdapter.java | 60 |
7 files changed, 179 insertions, 64 deletions
diff --git a/android/3rd_party/BottomSheet/build.gradle b/android/3rd_party/BottomSheet/build.gradle index f93a7a5d96..70f45ba9ad 100644 --- a/android/3rd_party/BottomSheet/build.gradle +++ b/android/3rd_party/BottomSheet/build.gradle @@ -4,7 +4,7 @@ buildscript { } dependencies { - classpath 'com.android.tools.build:gradle:2.1.0' + classpath 'com.android.tools.build:gradle:2.1.2' } } diff --git a/android/UnitTests/build.gradle b/android/UnitTests/build.gradle index e30a3877d5..cbd1b88ad0 100644 --- a/android/UnitTests/build.gradle +++ b/android/UnitTests/build.gradle @@ -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 diff --git a/android/build.gradle b/android/build.gradle index e5ca7b798e..6e87bac5fe 100644 --- a/android/build.gradle +++ b/android/build.gradle @@ -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.+' } } diff --git a/android/src/com/mapswithme/maps/editor/EditorFragment.java b/android/src/com/mapswithme/maps/editor/EditorFragment.java index fcd3d5a837..7791b4a7f4 100644 --- a/android/src/com/mapswithme/maps/editor/EditorFragment.java +++ b/android/src/com/mapswithme/maps/editor/EditorFragment.java @@ -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) diff --git a/android/src/com/mapswithme/maps/editor/EditorHostFragment.java b/android/src/com/mapswithme/maps/editor/EditorHostFragment.java index f253b55c25..d8c8fd815b 100644 --- a/android/src/com/mapswithme/maps/editor/EditorHostFragment.java +++ b/android/src/com/mapswithme/maps/editor/EditorHostFragment.java @@ -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(); } @@ -105,10 +142,18 @@ 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 */); + } } diff --git a/android/src/com/mapswithme/maps/editor/LanguagesFragment.java b/android/src/com/mapswithme/maps/editor/LanguagesFragment.java index 6a981f908b..c7b77ed663 100644 --- a/android/src/com/mapswithme/maps/editor/LanguagesFragment.java +++ b/android/src/com/mapswithme/maps/editor/LanguagesFragment.java @@ -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); } } diff --git a/android/src/com/mapswithme/maps/editor/MultilanguageAdapter.java b/android/src/com/mapswithme/maps/editor/MultilanguageAdapter.java index 72f5c692d4..46815455e8 100644 --- a/android/src/com/mapswithme/maps/editor/MultilanguageAdapter.java +++ b/android/src/com/mapswithme/maps/editor/MultilanguageAdapter.java @@ -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); - } - - @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); + mHostFragment = hostFragment; + mNames = new ArrayList<>(); + ArrayList<LocalizedName> names = mHostFragment.getLocalizedNames(); - // 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); } }); } |