Merge branch 'sasha_pasha_branch' of ssh://github.com/osmandapp/Osmand into sasha_pasha_branch
This commit is contained in:
commit
78085e71e2
12 changed files with 477 additions and 131 deletions
|
@ -68,33 +68,41 @@
|
|||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content">
|
||||
|
||||
<studio.carbonylgroup.textfieldboxes.TextFieldBoxes
|
||||
<net.osmand.plus.OsmandTextFieldBoxes
|
||||
android:id="@+id/latitude_box"
|
||||
android:layout_width="0dp"
|
||||
android:layout_weight="1"
|
||||
android:layout_height="wrap_content">
|
||||
android:layout_height="wrap_content"
|
||||
app:labelText="@string/navigate_point_latitude">
|
||||
|
||||
<studio.carbonylgroup.textfieldboxes.ExtendedEditText
|
||||
android:hint="50:00.0000"
|
||||
android:maxLength="10"
|
||||
android:id="@+id/latitude_edit_text"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"/>
|
||||
|
||||
</studio.carbonylgroup.textfieldboxes.TextFieldBoxes>
|
||||
</net.osmand.plus.OsmandTextFieldBoxes>
|
||||
|
||||
<View
|
||||
android:layout_width="16dp"
|
||||
android:layout_height="match_parent"/>
|
||||
|
||||
<studio.carbonylgroup.textfieldboxes.TextFieldBoxes
|
||||
<net.osmand.plus.OsmandTextFieldBoxes
|
||||
android:id="@+id/longitude_box"
|
||||
android:layout_width="0dp"
|
||||
android:layout_weight="1"
|
||||
android:layout_height="wrap_content">
|
||||
android:layout_height="wrap_content"
|
||||
app:labelText="@string/navigate_point_longitude">
|
||||
|
||||
<studio.carbonylgroup.textfieldboxes.ExtendedEditText
|
||||
android:hint="50:00.0000"
|
||||
android:maxLength="10"
|
||||
android:id="@+id/longitude_edit_text"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"/>
|
||||
|
||||
</studio.carbonylgroup.textfieldboxes.TextFieldBoxes>
|
||||
</net.osmand.plus.OsmandTextFieldBoxes>
|
||||
|
||||
</LinearLayout>
|
||||
|
||||
|
@ -104,17 +112,24 @@
|
|||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content">
|
||||
|
||||
<studio.carbonylgroup.textfieldboxes.TextFieldBoxes
|
||||
<net.osmand.plus.OsmandTextFieldBoxes
|
||||
android:id="@+id/name_box"
|
||||
android:layout_width="0dp"
|
||||
android:layout_weight="1"
|
||||
android:layout_height="wrap_content">
|
||||
android:layout_height="wrap_content"
|
||||
app:labelText="@string/shared_string_name">
|
||||
|
||||
<studio.carbonylgroup.textfieldboxes.ExtendedEditText
|
||||
android:hint="@string/access_hint_enter_name"
|
||||
android:id="@+id/name_edit_text"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"/>
|
||||
|
||||
</studio.carbonylgroup.textfieldboxes.TextFieldBoxes>
|
||||
</net.osmand.plus.OsmandTextFieldBoxes>
|
||||
|
||||
<View
|
||||
android:layout_width="16dp"
|
||||
android:layout_height="match_parent"/>
|
||||
|
||||
<View
|
||||
android:layout_width="0dp"
|
||||
|
|
|
@ -1,16 +1,20 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
xmlns:tools="http://schemas.android.com/tools"
|
||||
xmlns:osmand="http://schemas.android.com/apk/res-auto"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="56dp"
|
||||
android:background="?attr/bg_color"
|
||||
android:orientation="vertical">
|
||||
|
||||
<TextView
|
||||
<net.osmand.plus.widgets.TextViewEx
|
||||
android:id="@+id/keyboard_item"
|
||||
android:textAllCaps="true"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent"
|
||||
android:gravity="center"
|
||||
android:textColor="@color/keyboard_color"
|
||||
osmand:typeface="@string/font_roboto_regular"
|
||||
tools:text="3"/>
|
||||
|
||||
</LinearLayout>
|
|
@ -7,11 +7,21 @@
|
|||
android:descendantFocusability="blocksDescendants"
|
||||
android:orientation="vertical">
|
||||
|
||||
<include
|
||||
<LinearLayout
|
||||
android:id="@+id/top_divider"
|
||||
layout="@layout/list_item_divider"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:orientation="vertical"
|
||||
android:visibility="gone"
|
||||
tools:visibility="visible"/>
|
||||
tools:visibility="visible">
|
||||
|
||||
<View
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="4dp"/>
|
||||
|
||||
<include layout="@layout/card_top_divider"/>
|
||||
|
||||
</LinearLayout>
|
||||
|
||||
<LinearLayout
|
||||
android:id="@+id/main_layout"
|
||||
|
|
|
@ -3,10 +3,21 @@
|
|||
xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
xmlns:osmand="http://schemas.android.com/apk/res-auto"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:orientation="vertical">
|
||||
|
||||
<include layout="@layout/list_item_divider"/>
|
||||
<LinearLayout
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:orientation="vertical">
|
||||
|
||||
<View
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="4dp"/>
|
||||
|
||||
<include layout="@layout/card_top_divider"/>
|
||||
|
||||
</LinearLayout>
|
||||
|
||||
<LinearLayout
|
||||
android:id="@+id/background_view"
|
||||
|
@ -58,8 +69,8 @@
|
|||
<LinearLayout
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="48dp"
|
||||
android:layout_marginLeft="56dp"
|
||||
android:layout_marginStart="56dp">
|
||||
android:layout_marginLeft="44dp"
|
||||
android:layout_marginStart="44dp">
|
||||
|
||||
<net.osmand.plus.widgets.TextViewEx
|
||||
android:id="@+id/use_location_button"
|
||||
|
@ -69,8 +80,8 @@
|
|||
android:ellipsize="end"
|
||||
android:gravity="center_vertical"
|
||||
android:maxLines="1"
|
||||
android:paddingEnd="@dimen/measurement_tool_text_button_padding_small"
|
||||
android:paddingRight="@dimen/measurement_tool_text_button_padding_small"
|
||||
android:paddingLeft="12dp"
|
||||
android:paddingRight="12dp"
|
||||
android:text="@string/use_location"
|
||||
android:textColor="?attr/color_dialog_buttons"
|
||||
osmand:textAllCapsCompat="true"
|
||||
|
@ -84,8 +95,8 @@
|
|||
android:ellipsize="end"
|
||||
android:gravity="center_vertical"
|
||||
android:maxLines="1"
|
||||
android:paddingLeft="@dimen/measurement_tool_text_button_padding_small"
|
||||
android:paddingStart="@dimen/measurement_tool_text_button_padding_small"
|
||||
android:paddingLeft="12dp"
|
||||
android:paddingRight="12dp"
|
||||
android:text="@string/shared_string_do_not_use"
|
||||
android:textColor="?attr/color_dialog_buttons"
|
||||
osmand:textAllCapsCompat="true"
|
||||
|
@ -94,4 +105,6 @@
|
|||
|
||||
</LinearLayout>
|
||||
|
||||
<include layout="@layout/card_bottom_divider"/>
|
||||
|
||||
</LinearLayout>
|
||||
|
|
|
@ -264,4 +264,6 @@
|
|||
|
||||
<color name="marker_circle_button_color_dark">#525e66</color>
|
||||
|
||||
<color name="keyboard_color">#545454</color>
|
||||
|
||||
</resources>
|
88
OsmAnd/src/net/osmand/plus/OsmandTextFieldBoxes.java
Normal file
88
OsmAnd/src/net/osmand/plus/OsmandTextFieldBoxes.java
Normal file
|
@ -0,0 +1,88 @@
|
|||
package net.osmand.plus;
|
||||
|
||||
import android.content.Context;
|
||||
import android.support.v4.view.ViewCompat;
|
||||
import android.util.AttributeSet;
|
||||
import android.view.View;
|
||||
import android.view.inputmethod.InputMethodManager;
|
||||
|
||||
import studio.carbonylgroup.textfieldboxes.TextFieldBoxes;
|
||||
|
||||
public class OsmandTextFieldBoxes extends TextFieldBoxes {
|
||||
|
||||
private boolean useOsmandKeyboard;
|
||||
|
||||
public void setUseOsmandKeyboard(boolean useOsmandKeyboard) {
|
||||
this.useOsmandKeyboard = useOsmandKeyboard;
|
||||
}
|
||||
|
||||
public OsmandTextFieldBoxes(Context context) {
|
||||
super(context);
|
||||
}
|
||||
|
||||
public OsmandTextFieldBoxes(Context context, AttributeSet attrs) {
|
||||
super(context, attrs);
|
||||
}
|
||||
|
||||
public OsmandTextFieldBoxes(Context context, AttributeSet attrs, int defStyleAttr) {
|
||||
super(context, attrs, defStyleAttr);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void onFinishInflate() {
|
||||
super.onFinishInflate();
|
||||
if (editText != null) {
|
||||
this.panel.setOnClickListener(new OnClickListener() {
|
||||
@Override
|
||||
public void onClick(View view) {
|
||||
if(!OsmandTextFieldBoxes.this.isActivated()) {
|
||||
OsmandTextFieldBoxes.this.activate(true);
|
||||
}
|
||||
|
||||
OsmandTextFieldBoxes.this.setHasFocus(true);
|
||||
if (!useOsmandKeyboard) {
|
||||
OsmandTextFieldBoxes.this.inputMethodManager.showSoftInput(OsmandTextFieldBoxes.this.editText, InputMethodManager.SHOW_IMPLICIT);
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
this.iconImageButton.setOnClickListener(new OnClickListener() {
|
||||
public void onClick(View v) {
|
||||
select();
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
public void select() {
|
||||
if(!OsmandTextFieldBoxes.this.isActivated()) {
|
||||
OsmandTextFieldBoxes.this.activate(true);
|
||||
}
|
||||
|
||||
OsmandTextFieldBoxes.this.setHasFocus(true);
|
||||
if (!useOsmandKeyboard) {
|
||||
OsmandTextFieldBoxes.this.inputMethodManager.showSoftInput(OsmandTextFieldBoxes.this.editText, InputMethodManager.SHOW_IMPLICIT);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void activate(boolean animated) {
|
||||
super.activate(animated);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void deactivate() {
|
||||
if(this.editText.getText().toString().isEmpty()) {
|
||||
ViewCompat.animate(this.floatingLabel).alpha(1.0F).scaleX(1.0F).scaleY(1.0F).translationY(0.0F).setDuration((long)this.ANIMATION_DURATION);
|
||||
this.editTextLayout.setVisibility(View.INVISIBLE);
|
||||
if(this.editText.hasFocus()) {
|
||||
if (!useOsmandKeyboard) {
|
||||
this.inputMethodManager.hideSoftInputFromWindow(this.editText.getWindowToken(), InputMethodManager.RESULT_UNCHANGED_SHOWN);
|
||||
}
|
||||
this.editText.clearFocus();
|
||||
}
|
||||
}
|
||||
|
||||
this.activated = false;
|
||||
}
|
||||
}
|
|
@ -2,17 +2,22 @@ package net.osmand.plus.mapmarkers;
|
|||
|
||||
import android.content.Context;
|
||||
import android.os.Bundle;
|
||||
import android.support.annotation.LayoutRes;
|
||||
import android.support.annotation.NonNull;
|
||||
import android.support.annotation.Nullable;
|
||||
import android.support.v4.app.DialogFragment;
|
||||
import android.support.v4.content.ContextCompat;
|
||||
import android.support.v7.widget.Toolbar;
|
||||
import android.text.Editable;
|
||||
import android.text.InputType;
|
||||
import android.text.TextWatcher;
|
||||
import android.view.Gravity;
|
||||
import android.view.LayoutInflater;
|
||||
import android.view.MotionEvent;
|
||||
import android.view.View;
|
||||
import android.view.ViewGroup;
|
||||
import android.view.WindowManager;
|
||||
import android.view.inputmethod.InputMethodManager;
|
||||
import android.widget.AdapterView;
|
||||
import android.widget.ArrayAdapter;
|
||||
import android.widget.EditText;
|
||||
import android.widget.GridView;
|
||||
|
@ -20,14 +25,29 @@ import android.widget.TextView;
|
|||
|
||||
import net.osmand.plus.OsmandApplication;
|
||||
import net.osmand.plus.OsmandSettings;
|
||||
import net.osmand.plus.OsmandTextFieldBoxes;
|
||||
import net.osmand.plus.R;
|
||||
import net.osmand.plus.activities.MapActivity;
|
||||
import net.osmand.plus.helpers.FontCache;
|
||||
import net.osmand.plus.widgets.TextViewEx;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
import studio.carbonylgroup.textfieldboxes.ExtendedEditText;
|
||||
|
||||
public class CoordinateInputDialogFragment extends DialogFragment {
|
||||
|
||||
private static final int DELETE_BUTTON_POSITION = 9;
|
||||
private static final int CLEAR_BUTTON_POSITION = 11;
|
||||
|
||||
public static final String TAG = "CoordinateInputDialogFragment";
|
||||
|
||||
private boolean lightTheme;
|
||||
private EditText focusedEditText;
|
||||
private boolean useOsmandKeyboard = true;
|
||||
private List<OsmandTextFieldBoxes> textFieldBoxes = new ArrayList<>();
|
||||
private List<ExtendedEditText> extendedEditTexts = new ArrayList<>();
|
||||
|
||||
@Override
|
||||
public void onCreate(Bundle savedInstanceState) {
|
||||
|
@ -45,9 +65,6 @@ public class CoordinateInputDialogFragment extends DialogFragment {
|
|||
final MapActivity mapActivity = getMapActivity();
|
||||
|
||||
Toolbar toolbar = (Toolbar) mainView.findViewById(R.id.coordinate_input_toolbar);
|
||||
if (!lightTheme) {
|
||||
toolbar.setBackgroundColor(ContextCompat.getColor(getContext(), R.color.actionbar_dark_color));
|
||||
}
|
||||
|
||||
toolbar.setNavigationIcon(getMyApplication().getIconsCache().getIcon(R.drawable.ic_arrow_back));
|
||||
toolbar.setNavigationOnClickListener(new View.OnClickListener() {
|
||||
|
@ -64,47 +81,141 @@ public class CoordinateInputDialogFragment extends DialogFragment {
|
|||
}
|
||||
});
|
||||
|
||||
final EditText latitudeEditText = (EditText) mainView.findViewById(R.id.latitude_edit_text);
|
||||
final EditText longitudeEditText = (EditText) mainView.findViewById(R.id.longitude_edit_text);
|
||||
final EditText nameEditText = (EditText) mainView.findViewById(R.id.name_edit_text);
|
||||
final OsmandTextFieldBoxes latitudeBox = (OsmandTextFieldBoxes) mainView.findViewById(R.id.latitude_box);
|
||||
textFieldBoxes.add(latitudeBox);
|
||||
final OsmandTextFieldBoxes longitudeBox = (OsmandTextFieldBoxes) mainView.findViewById(R.id.longitude_box);
|
||||
textFieldBoxes.add(longitudeBox);
|
||||
final OsmandTextFieldBoxes nameBox = (OsmandTextFieldBoxes) mainView.findViewById(R.id.name_box);
|
||||
textFieldBoxes.add(nameBox);
|
||||
|
||||
View.OnTouchListener editTextOnTouchListener = new View.OnTouchListener() {
|
||||
final ExtendedEditText latitudeEditText = (ExtendedEditText) mainView.findViewById(R.id.latitude_edit_text);
|
||||
extendedEditTexts.add(latitudeEditText);
|
||||
final ExtendedEditText longitudeEditText = (ExtendedEditText) mainView.findViewById(R.id.longitude_edit_text);
|
||||
extendedEditTexts.add(longitudeEditText);
|
||||
final ExtendedEditText nameEditText = (ExtendedEditText) mainView.findViewById(R.id.name_edit_text);
|
||||
extendedEditTexts.add(nameEditText);
|
||||
|
||||
final View.OnFocusChangeListener focusChangeListener = new View.OnFocusChangeListener() {
|
||||
@Override
|
||||
public boolean onTouch(View view, MotionEvent motionEvent) {
|
||||
EditText editText = null;
|
||||
public void onFocusChange(View view, boolean b) {
|
||||
ExtendedEditText editText = null;
|
||||
OsmandTextFieldBoxes fieldBox = null;
|
||||
switch (view.getId()) {
|
||||
case R.id.latitude_edit_text:
|
||||
editText = latitudeEditText;
|
||||
fieldBox = latitudeBox;
|
||||
break;
|
||||
case R.id.longitude_edit_text:
|
||||
editText = longitudeEditText;
|
||||
fieldBox = longitudeBox;
|
||||
break;
|
||||
case R.id.name_edit_text:
|
||||
editText = nameEditText;
|
||||
fieldBox = nameBox;
|
||||
break;
|
||||
}
|
||||
if (editText != null) {
|
||||
editText.requestFocus();
|
||||
if (fieldBox != null) {
|
||||
if (b) {
|
||||
fieldBox.setHasFocus(true);
|
||||
focusedEditText = editText;
|
||||
} else {
|
||||
fieldBox.setHasFocus(false);
|
||||
focusedEditText = null;
|
||||
}
|
||||
}
|
||||
return true;
|
||||
}
|
||||
};
|
||||
|
||||
latitudeEditText.setOnTouchListener(editTextOnTouchListener);
|
||||
longitudeEditText.setOnTouchListener(editTextOnTouchListener);
|
||||
nameEditText.setOnTouchListener(editTextOnTouchListener);
|
||||
TextWatcher textWatcher = new TextWatcher() {
|
||||
int len = 0;
|
||||
|
||||
@Override
|
||||
public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) {
|
||||
if (focusedEditText != null) {
|
||||
String str = focusedEditText.getText().toString();
|
||||
len = str.length();
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) {
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public void afterTextChanged(Editable editable) {
|
||||
if (focusedEditText != null) {
|
||||
String str = focusedEditText.getText().toString();
|
||||
if(str.length() == 2 && len < str.length()){
|
||||
focusedEditText.append(":");
|
||||
} else if (str.length() == 5 && len < str.length()) {
|
||||
focusedEditText.append(".");
|
||||
} else if (str.length() == 10) {
|
||||
if (focusedEditText == latitudeEditText) {
|
||||
longitudeBox.select();
|
||||
} else if (focusedEditText == longitudeEditText) {
|
||||
nameBox.select();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
latitudeEditText.setOnFocusChangeListener(focusChangeListener);
|
||||
longitudeEditText.setOnFocusChangeListener(focusChangeListener);
|
||||
nameEditText.setOnFocusChangeListener(focusChangeListener);
|
||||
|
||||
latitudeEditText.addTextChangedListener(textWatcher);
|
||||
longitudeEditText.addTextChangedListener(textWatcher);
|
||||
nameEditText.addTextChangedListener(textWatcher);
|
||||
|
||||
changeKeyboardInBoxes(useOsmandKeyboard);
|
||||
changeKeyboardInEditTexts(useOsmandKeyboard);
|
||||
|
||||
String[] keyboardItems = new String[] { "1", "2", "3",
|
||||
"4", "5", "6",
|
||||
"7", "8", "9",
|
||||
getString(R.string.shared_string_delete), "0", getString(R.string.shared_string_clear) };
|
||||
GridView keyboardGrid = (GridView) mainView.findViewById(R.id.keyboard_grid_view);
|
||||
KeyboardAdapter keyboardAdapter = new KeyboardAdapter(mapActivity, keyboardItems);
|
||||
final GridView keyboardGrid = (GridView) mainView.findViewById(R.id.keyboard_grid_view);
|
||||
final KeyboardAdapter keyboardAdapter = new KeyboardAdapter(mapActivity, keyboardItems);
|
||||
keyboardGrid.setAdapter(keyboardAdapter);
|
||||
keyboardGrid.setOnItemClickListener(new AdapterView.OnItemClickListener() {
|
||||
@Override
|
||||
public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {
|
||||
if (focusedEditText != null) {
|
||||
switch (i) {
|
||||
case DELETE_BUTTON_POSITION:
|
||||
String str = focusedEditText.getText().toString();
|
||||
if (str.length() > 0) {
|
||||
str = str.substring(0, str.length() - 1);
|
||||
focusedEditText.setText(str);
|
||||
}
|
||||
break;
|
||||
case CLEAR_BUTTON_POSITION:
|
||||
focusedEditText.setText("");
|
||||
break;
|
||||
default:
|
||||
focusedEditText.append(keyboardAdapter.getItem(i));
|
||||
}
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
return mainView;
|
||||
}
|
||||
|
||||
public void changeKeyboardInBoxes(boolean useOsmandKeyboard) {
|
||||
for (OsmandTextFieldBoxes textFieldBox : textFieldBoxes) {
|
||||
textFieldBox.setUseOsmandKeyboard(useOsmandKeyboard);
|
||||
}
|
||||
}
|
||||
|
||||
public void changeKeyboardInEditTexts(boolean useOsmandKeyboard) {
|
||||
for (ExtendedEditText extendedEditText : extendedEditTexts) {
|
||||
extendedEditText.setInputType(useOsmandKeyboard ? InputType.TYPE_NULL : InputType.TYPE_CLASS_TEXT);
|
||||
}
|
||||
}
|
||||
|
||||
private MapActivity getMapActivity() {
|
||||
return (MapActivity) getActivity();
|
||||
}
|
||||
|
@ -128,8 +239,8 @@ public class CoordinateInputDialogFragment extends DialogFragment {
|
|||
|
||||
private class KeyboardAdapter extends ArrayAdapter<String> {
|
||||
|
||||
KeyboardAdapter(@NonNull Context context, String[] items) {
|
||||
super(context, 0, items);
|
||||
KeyboardAdapter(@NonNull Context context, @NonNull String[] objects) {
|
||||
super(context, 0, objects);
|
||||
}
|
||||
|
||||
@NonNull
|
||||
|
@ -139,7 +250,14 @@ public class CoordinateInputDialogFragment extends DialogFragment {
|
|||
convertView = LayoutInflater.from(getContext()).inflate(R.layout.input_coordinate_keyboard_item, parent, false);
|
||||
}
|
||||
|
||||
((TextView) convertView.findViewById(R.id.keyboard_item)).setText(getItem(position));
|
||||
TextViewEx keyboardItem = (TextViewEx) convertView.findViewById(R.id.keyboard_item);
|
||||
if (position == DELETE_BUTTON_POSITION || position == CLEAR_BUTTON_POSITION) {
|
||||
keyboardItem.setTextSize(getResources().getDimension(R.dimen.default_list_text_size));
|
||||
} else {
|
||||
keyboardItem.setTextSize(getResources().getDimension(R.dimen.map_button_text_size));
|
||||
}
|
||||
|
||||
keyboardItem.setText(getItem(position));
|
||||
|
||||
return convertView;
|
||||
}
|
||||
|
|
|
@ -1,6 +1,7 @@
|
|||
package net.osmand.plus.mapmarkers;
|
||||
|
||||
import android.graphics.drawable.Drawable;
|
||||
import android.os.Build;
|
||||
import android.os.Bundle;
|
||||
import android.support.annotation.DrawableRes;
|
||||
import android.support.annotation.Nullable;
|
||||
|
@ -14,6 +15,7 @@ import android.view.ContextThemeWrapper;
|
|||
import android.view.LayoutInflater;
|
||||
import android.view.View;
|
||||
import android.view.ViewGroup;
|
||||
import android.view.ViewTreeObserver;
|
||||
import android.widget.ImageButton;
|
||||
import android.widget.ImageView;
|
||||
import android.widget.TextView;
|
||||
|
@ -27,6 +29,7 @@ import net.osmand.plus.IconsCache;
|
|||
import net.osmand.plus.MapMarkersHelper;
|
||||
import net.osmand.plus.MapMarkersHelper.MapMarker;
|
||||
import net.osmand.plus.OsmAndLocationProvider.OsmAndLocationListener;
|
||||
import net.osmand.plus.OsmandSettings;
|
||||
import net.osmand.plus.R;
|
||||
import net.osmand.plus.activities.MapActivity;
|
||||
import net.osmand.plus.base.MapViewTrackingUtilities;
|
||||
|
@ -161,7 +164,9 @@ public class PlanRouteFragment extends Fragment implements OsmAndLocationListene
|
|||
toolbarController.setOnBackButtonClickListener(new View.OnClickListener() {
|
||||
@Override
|
||||
public void onClick(View view) {
|
||||
quit(false);
|
||||
if (quit(false)) {
|
||||
MapMarkersDialogFragment.showInstance(mapActivity);
|
||||
}
|
||||
}
|
||||
});
|
||||
mapActivity.showTopToolbar(toolbarController);
|
||||
|
@ -201,9 +206,26 @@ public class PlanRouteFragment extends Fragment implements OsmAndLocationListene
|
|||
toPosition = holder.getAdapterPosition();
|
||||
if (toPosition >= 0 && fromPosition >= 0 && toPosition != fromPosition) {
|
||||
mapActivity.getMyApplication().getMapMarkersHelper().checkAndFixActiveMarkersOrderIfNeeded();
|
||||
adapter.notifyDataSetChanged();
|
||||
mapActivity.getMyApplication().getSettings().MAP_MARKERS_ORDER_BY_MODE.set(OsmandSettings.MapMarkersOrderByMode.CUSTOM);
|
||||
mapActivity.refreshMap();
|
||||
try {
|
||||
adapter.notifyDataSetChanged();
|
||||
} catch (Exception e) {
|
||||
// to avoid crash because of:
|
||||
// java.lang.IllegalStateException: Cannot call this method while RecyclerView is computing a layout or scrolling
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onUseLocationClick() {
|
||||
Toast.makeText(mapActivity, "use location", Toast.LENGTH_SHORT).show();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onDoNotUseLocationClick() {
|
||||
Toast.makeText(mapActivity, "do not use location", Toast.LENGTH_SHORT).show();
|
||||
}
|
||||
});
|
||||
boolean isSmartphone = getResources().getConfiguration().smallestScreenWidthDp < 600;
|
||||
markersRv.setPadding(0, 0, 0, AndroidUtils.dpToPx(mapActivity, isSmartphone ? 72 : 108));
|
||||
|
@ -211,6 +233,24 @@ public class PlanRouteFragment extends Fragment implements OsmAndLocationListene
|
|||
markersRv.setLayoutManager(new LinearLayoutManager(getContext()));
|
||||
markersRv.setAdapter(adapter);
|
||||
|
||||
if (portrait) {
|
||||
showMarkersList();
|
||||
} else {
|
||||
mainView.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
|
||||
@Override
|
||||
public void onGlobalLayout() {
|
||||
showMarkersList();
|
||||
|
||||
ViewTreeObserver obs = mainView.getViewTreeObserver();
|
||||
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) {
|
||||
obs.removeOnGlobalLayoutListener(this);
|
||||
} else {
|
||||
obs.removeGlobalOnLayoutListener(this);
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
return view;
|
||||
}
|
||||
|
||||
|
|
|
@ -281,7 +281,7 @@ public class MapMarkersGroupsAdapter extends RecyclerView.Adapter<RecyclerView.V
|
|||
}
|
||||
} else {
|
||||
boolean firstItemInDisplayGroup = position - 1 != -1 && getItem(position - 1) instanceof Integer;
|
||||
boolean lastItemInDisplayGroup = !(getItem(position) instanceof MapMarker);
|
||||
boolean lastItemInDisplayGroup = position == getItemCount() || !(getItem(position) instanceof MapMarker);
|
||||
if (firstItemInDisplayGroup && lastItemInDisplayGroup) {
|
||||
items.remove(position - 1);
|
||||
}
|
||||
|
|
|
@ -132,8 +132,10 @@ public class MapMarkersItemTouchHelperCallback extends ItemTouchHelper.Callback
|
|||
@Override
|
||||
public void clearView(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder) {
|
||||
super.clearView(recyclerView, viewHolder);
|
||||
((MapMarkerItemViewHolder) viewHolder).optionsBtn.setVisibility(View.VISIBLE);
|
||||
iconHidden = false;
|
||||
if (iconHidden) {
|
||||
((MapMarkerItemViewHolder) viewHolder).optionsBtn.setVisibility(View.VISIBLE);
|
||||
iconHidden = false;
|
||||
}
|
||||
adapter.onItemDismiss(viewHolder);
|
||||
}
|
||||
|
||||
|
|
|
@ -22,11 +22,15 @@ import java.util.Date;
|
|||
import java.util.List;
|
||||
import java.util.Locale;
|
||||
|
||||
public class MapMarkersListAdapter extends RecyclerView.Adapter<MapMarkerItemViewHolder>
|
||||
public class MapMarkersListAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder>
|
||||
implements MapMarkersItemTouchHelperCallback.ItemTouchHelperAdapter {
|
||||
|
||||
private static final int USE_LOCATION_CARD_TYPE = 1;
|
||||
private static final int MARKER_ITEM_TYPE = 2;
|
||||
|
||||
private MapActivity mapActivity;
|
||||
private List<MapMarker> markers;
|
||||
private boolean locationCardDisplayed = true;
|
||||
private MapMarkersListAdapterListener listener;
|
||||
|
||||
private LatLon location;
|
||||
|
@ -50,107 +54,135 @@ public class MapMarkersListAdapter extends RecyclerView.Adapter<MapMarkerItemVie
|
|||
}
|
||||
|
||||
@Override
|
||||
public MapMarkerItemViewHolder onCreateViewHolder(ViewGroup viewGroup, int viewType) {
|
||||
View view = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.map_marker_item_new, viewGroup, false);
|
||||
view.setOnClickListener(new View.OnClickListener() {
|
||||
@Override
|
||||
public void onClick(View view) {
|
||||
listener.onItemClick(view);
|
||||
}
|
||||
});
|
||||
return new MapMarkerItemViewHolder(view);
|
||||
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup viewGroup, int viewType) {
|
||||
if (viewType == USE_LOCATION_CARD_TYPE) {
|
||||
View view = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.use_location_card, viewGroup, false);
|
||||
return new UseLocationCardViewHolder(view);
|
||||
} else if (viewType == MARKER_ITEM_TYPE) {
|
||||
View view = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.map_marker_item_new, viewGroup, false);
|
||||
view.setOnClickListener(new View.OnClickListener() {
|
||||
@Override
|
||||
public void onClick(View view) {
|
||||
listener.onItemClick(view);
|
||||
}
|
||||
});
|
||||
return new MapMarkerItemViewHolder(view);
|
||||
} else {
|
||||
throw new IllegalArgumentException("Unsupported view type");
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onBindViewHolder(final MapMarkerItemViewHolder holder, int pos) {
|
||||
public int getItemViewType(int position) {
|
||||
if (locationCardDisplayed && position == 0) {
|
||||
return USE_LOCATION_CARD_TYPE;
|
||||
}
|
||||
return MARKER_ITEM_TYPE;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onBindViewHolder(RecyclerView.ViewHolder holder, int pos) {
|
||||
boolean night = !mapActivity.getMyApplication().getSettings().isLightContent();
|
||||
IconsCache iconsCache = mapActivity.getMyApplication().getIconsCache();
|
||||
MapMarker marker = markers.get(pos);
|
||||
|
||||
holder.icon.setImageDrawable(iconsCache.getIcon(R.drawable.ic_action_flag_dark, MapMarker.getColorId(marker.colorIndex)));
|
||||
holder.iconReorder.setImageDrawable(iconsCache.getThemedIcon(R.drawable.ic_action_reorder));
|
||||
holder.iconDirection.setVisibility(View.GONE);
|
||||
holder.mainLayout.setBackgroundColor(ContextCompat.getColor(mapActivity, night ? R.color.bg_color_dark : R.color.bg_color_light));
|
||||
holder.title.setTextColor(ContextCompat.getColor(mapActivity, night ? R.color.color_white : R.color.color_black));
|
||||
holder.divider.setBackgroundColor(ContextCompat.getColor(mapActivity, night ? R.color.actionbar_dark_color : R.color.dashboard_divider_light));
|
||||
holder.optionsBtn.setVisibility(View.GONE);
|
||||
holder.description.setTextColor(ContextCompat.getColor(mapActivity, night ? R.color.dash_search_icon_dark : R.color.icon_color));
|
||||
holder.checkBox.setVisibility(View.VISIBLE);
|
||||
holder.checkBox.setOnClickListener(new View.OnClickListener() {
|
||||
@Override
|
||||
public void onClick(View view) {
|
||||
listener.onItemClick(holder.itemView);
|
||||
}
|
||||
});
|
||||
holder.checkBox.setChecked(marker.selected);
|
||||
if (holder instanceof UseLocationCardViewHolder) {
|
||||
final UseLocationCardViewHolder locationCardHolder = (UseLocationCardViewHolder) holder;
|
||||
|
||||
if (pos == 0 || pos == getItemCount() - 1) {
|
||||
holder.firstDescription.setVisibility(View.VISIBLE);
|
||||
if (pos == 0) {
|
||||
holder.topDivider.setVisibility(View.VISIBLE);
|
||||
holder.firstDescription.setText(mapActivity.getString(R.string.shared_string_control_start) + " • ");
|
||||
} else {
|
||||
holder.firstDescription.setText(mapActivity.getString(R.string.shared_string_finish) + " • ");
|
||||
}
|
||||
} else {
|
||||
holder.firstDescription.setVisibility(View.GONE);
|
||||
holder.topDivider.setVisibility(View.GONE);
|
||||
}
|
||||
|
||||
if (pos == getItemCount() - 1) {
|
||||
holder.bottomShadow.setVisibility(View.VISIBLE);
|
||||
holder.divider.setVisibility(View.GONE);
|
||||
} else {
|
||||
holder.bottomShadow.setVisibility(View.GONE);
|
||||
holder.divider.setVisibility(View.VISIBLE);
|
||||
}
|
||||
|
||||
holder.point.setVisibility(View.VISIBLE);
|
||||
|
||||
holder.iconReorder.setOnTouchListener(new View.OnTouchListener() {
|
||||
@Override
|
||||
public boolean onTouch(View view, MotionEvent event) {
|
||||
if (MotionEventCompat.getActionMasked(event) == MotionEvent.ACTION_DOWN) {
|
||||
listener.onDragStarted(holder);
|
||||
locationCardHolder.useLocationBtn.setOnClickListener(new View.OnClickListener() {
|
||||
@Override
|
||||
public void onClick(View view) {
|
||||
listener.onUseLocationClick();
|
||||
}
|
||||
return false;
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
holder.title.setText(marker.getName(mapActivity));
|
||||
locationCardHolder.doNotUseLocationBtn.setOnClickListener(new View.OnClickListener() {
|
||||
@Override
|
||||
public void onClick(View view) {
|
||||
listener.onDoNotUseLocationClick();
|
||||
}
|
||||
});
|
||||
} else if (holder instanceof MapMarkerItemViewHolder) {
|
||||
MapMarker marker = getItem(pos);
|
||||
final MapMarkerItemViewHolder itemHolder = (MapMarkerItemViewHolder) holder;
|
||||
|
||||
String descr;
|
||||
if ((descr = marker.groupName) != null) {
|
||||
if (descr.equals("")) {
|
||||
descr = mapActivity.getString(R.string.shared_string_favorites);
|
||||
}
|
||||
} else {
|
||||
Date date = new Date(marker.creationDate);
|
||||
String month = new SimpleDateFormat("MMM", Locale.getDefault()).format(date);
|
||||
if (month.length() > 1) {
|
||||
month = Character.toUpperCase(month.charAt(0)) + month.substring(1);
|
||||
}
|
||||
String day = new SimpleDateFormat("dd", Locale.getDefault()).format(date);
|
||||
descr = month + " " + day;
|
||||
}
|
||||
holder.description.setText(descr);
|
||||
itemHolder.icon.setImageDrawable(iconsCache.getIcon(R.drawable.ic_action_flag_dark, MapMarker.getColorId(marker.colorIndex)));
|
||||
itemHolder.iconReorder.setImageDrawable(iconsCache.getThemedIcon(R.drawable.ic_action_reorder));
|
||||
itemHolder.iconDirection.setVisibility(View.GONE);
|
||||
itemHolder.mainLayout.setBackgroundColor(ContextCompat.getColor(mapActivity, night ? R.color.bg_color_dark : R.color.bg_color_light));
|
||||
itemHolder.title.setTextColor(ContextCompat.getColor(mapActivity, night ? R.color.color_white : R.color.color_black));
|
||||
itemHolder.divider.setBackgroundColor(ContextCompat.getColor(mapActivity, night ? R.color.actionbar_dark_color : R.color.dashboard_divider_light));
|
||||
itemHolder.optionsBtn.setVisibility(View.GONE);
|
||||
itemHolder.description.setTextColor(ContextCompat.getColor(mapActivity, night ? R.color.dash_search_icon_dark : R.color.icon_color));
|
||||
itemHolder.checkBox.setVisibility(View.VISIBLE);
|
||||
itemHolder.checkBox.setOnClickListener(new View.OnClickListener() {
|
||||
@Override
|
||||
public void onClick(View view) {
|
||||
listener.onItemClick(itemHolder.itemView);
|
||||
}
|
||||
});
|
||||
itemHolder.checkBox.setChecked(marker.selected);
|
||||
|
||||
if (location != null) {
|
||||
holder.distance.setTextColor(ContextCompat.getColor(mapActivity, useCenter
|
||||
? R.color.color_distance : R.color.color_myloc_distance));
|
||||
float dist = (float) MapUtils.getDistance(location.getLatitude(), location.getLongitude(),
|
||||
marker.getLatitude(), marker.getLongitude());
|
||||
holder.distance.setText(OsmAndFormatter.getFormattedDistance(dist, mapActivity.getMyApplication()));
|
||||
int firstMarkerPos = locationCardDisplayed ? 1 : 0;
|
||||
int lastMarkerPos = getItemCount() - 1;
|
||||
|
||||
itemHolder.topDivider.setVisibility(pos == firstMarkerPos ? View.VISIBLE : View.GONE);
|
||||
itemHolder.firstDescription.setVisibility((pos == firstMarkerPos || pos == lastMarkerPos) ? View.VISIBLE : View.GONE);
|
||||
itemHolder.bottomShadow.setVisibility(pos == lastMarkerPos ? View.VISIBLE : View.GONE);
|
||||
itemHolder.divider.setVisibility(pos == lastMarkerPos ? View.GONE : View.VISIBLE);
|
||||
|
||||
if (pos == firstMarkerPos) {
|
||||
itemHolder.firstDescription.setText(mapActivity.getString(R.string.shared_string_control_start) + " • ");
|
||||
} else if (pos == lastMarkerPos) {
|
||||
itemHolder.firstDescription.setText(mapActivity.getString(R.string.shared_string_finish) + " • ");
|
||||
}
|
||||
|
||||
itemHolder.point.setVisibility(View.VISIBLE);
|
||||
|
||||
itemHolder.iconReorder.setOnTouchListener(new View.OnTouchListener() {
|
||||
@Override
|
||||
public boolean onTouch(View view, MotionEvent event) {
|
||||
if (MotionEventCompat.getActionMasked(event) == MotionEvent.ACTION_DOWN) {
|
||||
listener.onDragStarted(itemHolder);
|
||||
}
|
||||
return false;
|
||||
}
|
||||
});
|
||||
|
||||
itemHolder.title.setText(marker.getName(mapActivity));
|
||||
|
||||
String descr;
|
||||
if ((descr = marker.groupName) != null) {
|
||||
if (descr.equals("")) {
|
||||
descr = mapActivity.getString(R.string.shared_string_favorites);
|
||||
}
|
||||
} else {
|
||||
Date date = new Date(marker.creationDate);
|
||||
String month = new SimpleDateFormat("MMM", Locale.getDefault()).format(date);
|
||||
if (month.length() > 1) {
|
||||
month = Character.toUpperCase(month.charAt(0)) + month.substring(1);
|
||||
}
|
||||
String day = new SimpleDateFormat("dd", Locale.getDefault()).format(date);
|
||||
descr = month + " " + day;
|
||||
}
|
||||
itemHolder.description.setText(descr);
|
||||
|
||||
if (location != null) {
|
||||
itemHolder.distance.setTextColor(ContextCompat.getColor(mapActivity, useCenter
|
||||
? R.color.color_distance : R.color.color_myloc_distance));
|
||||
float dist = (float) MapUtils.getDistance(location.getLatitude(), location.getLongitude(),
|
||||
marker.getLatitude(), marker.getLongitude());
|
||||
itemHolder.distance.setText(OsmAndFormatter.getFormattedDistance(dist, mapActivity.getMyApplication()));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getItemCount() {
|
||||
return markers.size();
|
||||
return locationCardDisplayed ? markers.size() + 1 : markers.size();
|
||||
}
|
||||
|
||||
public MapMarker getItem(int position) {
|
||||
return markers.get(position);
|
||||
return markers.get(locationCardDisplayed ? position - 1 : position);
|
||||
}
|
||||
|
||||
@Override
|
||||
|
@ -160,7 +192,10 @@ public class MapMarkersListAdapter extends RecyclerView.Adapter<MapMarkerItemVie
|
|||
|
||||
@Override
|
||||
public boolean onItemMove(int from, int to) {
|
||||
Collections.swap(markers, from, to);
|
||||
if (locationCardDisplayed && to == 0) {
|
||||
return false;
|
||||
}
|
||||
Collections.swap(markers, locationCardDisplayed ? from - 1 : from, locationCardDisplayed ? to - 1 : to);
|
||||
notifyItemMoved(from, to);
|
||||
return true;
|
||||
}
|
||||
|
@ -182,5 +217,21 @@ public class MapMarkersListAdapter extends RecyclerView.Adapter<MapMarkerItemVie
|
|||
void onDragStarted(RecyclerView.ViewHolder holder);
|
||||
|
||||
void onDragEnded(RecyclerView.ViewHolder holder);
|
||||
|
||||
void onUseLocationClick();
|
||||
|
||||
void onDoNotUseLocationClick();
|
||||
}
|
||||
|
||||
private class UseLocationCardViewHolder extends RecyclerView.ViewHolder {
|
||||
|
||||
final View useLocationBtn;
|
||||
final View doNotUseLocationBtn;
|
||||
|
||||
UseLocationCardViewHolder(View view) {
|
||||
super(view);
|
||||
useLocationBtn = view.findViewById(R.id.use_location_button);
|
||||
doNotUseLocationBtn = view.findViewById(R.id.do_not_use_location_button);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -41,6 +41,7 @@ public class MapQuickActionLayer extends OsmandMapLayer implements QuickActionRe
|
|||
|
||||
private final ContextMenuLayer contextMenuLayer;
|
||||
private final MeasurementToolLayer measurementToolLayer;
|
||||
private final MapMarkersLayer mapMarkersLayer;
|
||||
private ImageView contextMarker;
|
||||
private final MapActivity mapActivity;
|
||||
private final OsmandApplication app;
|
||||
|
@ -66,6 +67,7 @@ public class MapQuickActionLayer extends OsmandMapLayer implements QuickActionRe
|
|||
settings = activity.getMyApplication().getSettings();
|
||||
quickActionRegistry = activity.getMapLayers().getQuickActionRegistry();
|
||||
measurementToolLayer = mapActivity.getMapLayers().getMeasurementToolLayer();
|
||||
mapMarkersLayer = mapActivity.getMapLayers().getMapMarkersLayer();
|
||||
}
|
||||
|
||||
|
||||
|
@ -323,6 +325,7 @@ public class MapQuickActionLayer extends OsmandMapLayer implements QuickActionRe
|
|||
contextMenuLayer.isInChangeMarkerPositionMode() ||
|
||||
contextMenuLayer.isInGpxDetailsMode() ||
|
||||
measurementToolLayer.isInMeasurementMode() ||
|
||||
mapMarkersLayer.isInPlanRouteMode() ||
|
||||
mapActivity.getContextMenu().isVisible() && !mapActivity.getContextMenu().findMenuFragment().get().isRemoving() ||
|
||||
mapActivity.getContextMenu().isVisible() && mapActivity.getContextMenu().findMenuFragment().get().isAdded() ||
|
||||
mapActivity.getContextMenu().getMultiSelectionMenu().isVisible() && mapActivity.getContextMenu().getMultiSelectionMenu().getFragmentByTag().isAdded() ||
|
||||
|
|
Loading…
Reference in a new issue