Merge pull request #10337 from osmandapp/buttom-sheet-fix
Buttom sheet fix
This commit is contained in:
commit
8e83e898d5
9 changed files with 283 additions and 315 deletions
|
@ -59,31 +59,4 @@
|
|||
android:padding="@dimen/content_padding" />
|
||||
|
||||
</LinearLayout>
|
||||
|
||||
<LinearLayout
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:orientation="horizontal"
|
||||
android:paddingLeft="@dimen/content_padding"
|
||||
android:paddingTop="@dimen/content_padding_small"
|
||||
android:paddingRight="@dimen/content_padding"
|
||||
android:paddingBottom="@dimen/content_padding_small"
|
||||
android:paddingEnd="@dimen/content_padding"
|
||||
android:paddingStart="@dimen/content_padding">
|
||||
|
||||
<include
|
||||
android:id="@+id/open_track_button"
|
||||
layout="@layout/bottom_sheet_dialog_button" />
|
||||
|
||||
<View
|
||||
android:id="@+id/buttons_divider"
|
||||
android:layout_width="@dimen/content_padding"
|
||||
android:layout_height="match_parent" />
|
||||
|
||||
<include
|
||||
android:id="@+id/close_button"
|
||||
layout="@layout/bottom_sheet_dialog_button" />
|
||||
|
||||
</LinearLayout>
|
||||
|
||||
</LinearLayout>
|
|
@ -16,6 +16,7 @@ import android.view.ViewTreeObserver.OnScrollChangedListener;
|
|||
import android.view.Window;
|
||||
import android.view.WindowManager;
|
||||
import android.widget.LinearLayout;
|
||||
import android.widget.ScrollView;
|
||||
|
||||
import androidx.annotation.ColorInt;
|
||||
import androidx.annotation.ColorRes;
|
||||
|
@ -192,6 +193,15 @@ public abstract class MenuBottomSheetDialogFragment extends BottomSheetDialogFra
|
|||
});
|
||||
}
|
||||
|
||||
protected ViewTreeObserver.OnGlobalLayoutListener getShadowLayoutListener(){
|
||||
return new ViewTreeObserver.OnGlobalLayoutListener() {
|
||||
@Override
|
||||
public void onGlobalLayout() {
|
||||
setShadowOnScrollableView();
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
protected void drawTopShadow(boolean showTopShadow) {
|
||||
final Activity activity = getActivity();
|
||||
View mainView = getView();
|
||||
|
@ -478,4 +488,15 @@ public abstract class MenuBottomSheetDialogFragment extends BottomSheetDialogFra
|
|||
}
|
||||
});
|
||||
}
|
||||
|
||||
protected void setShadowOnScrollableView() {
|
||||
ScrollView scrollView = getView().findViewById(R.id.scroll_view);
|
||||
boolean isScrollable = scrollView.getChildAt(0).getHeight() >= scrollView.getHeight();;
|
||||
if (isScrollable) {
|
||||
drawTopShadow(false);
|
||||
scrollView.getChildAt(0).setPadding(0,8,0,0);
|
||||
} else {
|
||||
drawTopShadow(true);
|
||||
}
|
||||
}
|
||||
}
|
|
@ -461,7 +461,7 @@ public class OsmandMonitoringPlugin extends OsmandPlugin {
|
|||
if (activityRef != null && !Algorithms.isEmpty(result.getFilenames())) {
|
||||
final Activity a = activityRef.get();
|
||||
if (a instanceof FragmentActivity && !a.isFinishing()) {
|
||||
OnSaveCurrentTrackFragment.showInstance(((FragmentActivity) a).getSupportFragmentManager(), result.getFilenames());
|
||||
SaveGPXBottomSheetFragment.showInstance(((FragmentActivity) a).getSupportFragmentManager(), result.getFilenames());
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -6,18 +6,13 @@ import android.os.Bundle;
|
|||
import android.text.Editable;
|
||||
import android.text.TextWatcher;
|
||||
import android.view.KeyEvent;
|
||||
import android.view.LayoutInflater;
|
||||
import android.view.View;
|
||||
import android.view.View.OnClickListener;
|
||||
import android.view.ViewGroup;
|
||||
import android.view.inputmethod.EditorInfo;
|
||||
import android.widget.CompoundButton;
|
||||
import android.widget.EditText;
|
||||
import android.widget.TextView;
|
||||
import android.widget.Toast;
|
||||
|
||||
import androidx.annotation.NonNull;
|
||||
import androidx.annotation.Nullable;
|
||||
import androidx.appcompat.widget.SwitchCompat;
|
||||
import androidx.core.content.ContextCompat;
|
||||
import androidx.fragment.app.FragmentActivity;
|
||||
|
@ -25,17 +20,15 @@ import androidx.fragment.app.FragmentManager;
|
|||
|
||||
import net.osmand.FileUtils;
|
||||
import net.osmand.GPXUtilities;
|
||||
import net.osmand.GPXUtilities.WptPt;
|
||||
import net.osmand.IndexConstants;
|
||||
import net.osmand.PlatformUtil;
|
||||
import net.osmand.plus.OsmandApplication;
|
||||
import net.osmand.plus.R;
|
||||
import net.osmand.plus.UiUtilities;
|
||||
import net.osmand.plus.UiUtilities.DialogButtonType;
|
||||
import net.osmand.plus.activities.MapActivity;
|
||||
import net.osmand.plus.base.BottomSheetDialogFragment;
|
||||
import net.osmand.plus.base.MenuBottomSheetDialogFragment;
|
||||
import net.osmand.plus.base.bottomsheetmenu.SimpleBottomSheetItem;
|
||||
import net.osmand.plus.myplaces.AvailableGPXFragment;
|
||||
import net.osmand.plus.myplaces.AvailableGPXFragment.GpxInfo;
|
||||
import net.osmand.plus.views.OsmandMapTileView;
|
||||
import net.osmand.plus.widgets.OsmandTextFieldBoxes;
|
||||
import net.osmand.util.Algorithms;
|
||||
|
@ -48,11 +41,10 @@ import java.util.List;
|
|||
|
||||
import static net.osmand.FileUtils.ILLEGAL_FILE_NAME_CHARACTERS;
|
||||
|
||||
public class OnSaveCurrentTrackFragment extends BottomSheetDialogFragment {
|
||||
|
||||
public static final String TAG = "OnSaveCurrentTrackBottomSheetFragment";
|
||||
public class SaveGPXBottomSheetFragment extends MenuBottomSheetDialogFragment {
|
||||
public static final String TAG = "SaveGPXBottomSheetFragment";
|
||||
public static final String SAVED_TRACKS_KEY = "saved_track_filename";
|
||||
private static final Log LOG = PlatformUtil.getLog(OnSaveCurrentTrackFragment.class);
|
||||
private static final Log LOG = PlatformUtil.getLog(SaveGPXBottomSheetFragment.class);
|
||||
|
||||
private boolean openTrack = false;
|
||||
private File file;
|
||||
|
@ -60,9 +52,8 @@ public class OnSaveCurrentTrackFragment extends BottomSheetDialogFragment {
|
|||
private String savedGpxName = "";
|
||||
private String newGpxName = "";
|
||||
|
||||
@Nullable
|
||||
@Override
|
||||
public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
|
||||
public void createMenuItems(Bundle savedInstanceState) {
|
||||
final OsmandApplication app = requiredMyApplication();
|
||||
Bundle args = getArguments();
|
||||
if (args != null && args.containsKey(SAVED_TRACKS_KEY)) {
|
||||
|
@ -81,7 +72,7 @@ public class OnSaveCurrentTrackFragment extends BottomSheetDialogFragment {
|
|||
file = new File(app.getAppCustomization().getTracksDir(), savedGpxName + IndexConstants.GPX_FILE_EXT);
|
||||
final boolean nightMode = app.getDaynightHelper().isNightModeForMapControls();
|
||||
final int textPrimaryColor = nightMode ? R.color.text_color_primary_dark : R.color.text_color_primary_light;
|
||||
View mainView = UiUtilities.getInflater(ctx, nightMode).inflate(R.layout.fragment_on_save_current_track, container);
|
||||
View mainView = UiUtilities.getInflater(ctx, nightMode).inflate(R.layout.save_gpx_fragment, null);
|
||||
|
||||
OsmandTextFieldBoxes textBox = (OsmandTextFieldBoxes) mainView.findViewById(R.id.name_text_box);
|
||||
if (nightMode) {
|
||||
|
@ -131,25 +122,11 @@ public class OnSaveCurrentTrackFragment extends BottomSheetDialogFragment {
|
|||
app.getSettings().SHOW_SAVED_TRACK_REMEMBER.set(isChecked);
|
||||
}
|
||||
});
|
||||
View openTrackBtn = mainView.findViewById(R.id.open_track_button);
|
||||
UiUtilities.setupDialogButton(nightMode, openTrackBtn, DialogButtonType.SECONDARY, R.string.shared_string_open_track);
|
||||
final View showOnMapBtn = mainView.findViewById(R.id.close_button);
|
||||
UiUtilities.setupDialogButton(nightMode, showOnMapBtn, DialogButtonType.SECONDARY, R.string.shared_string_close);
|
||||
|
||||
openTrackBtn.setOnClickListener(new OnClickListener() {
|
||||
@Override
|
||||
public void onClick(View v) {
|
||||
doRename(true);
|
||||
}
|
||||
});
|
||||
|
||||
showOnMapBtn.setOnClickListener(new OnClickListener() {
|
||||
@Override
|
||||
public void onClick(View v) {
|
||||
doRename(false);
|
||||
}
|
||||
});
|
||||
return mainView;
|
||||
SimpleBottomSheetItem titleItem = (SimpleBottomSheetItem) new SimpleBottomSheetItem.Builder()
|
||||
.setCustomView(mainView)
|
||||
.create();
|
||||
items.add(titleItem);
|
||||
}
|
||||
|
||||
private void doRename(boolean openTrack) {
|
||||
|
@ -160,6 +137,26 @@ public class OnSaveCurrentTrackFragment extends BottomSheetDialogFragment {
|
|||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
protected UiUtilities.DialogButtonType getRightBottomButtonType() {
|
||||
return UiUtilities.DialogButtonType.SECONDARY;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected int getRightBottomButtonTextId() {
|
||||
return R.string.shared_string_open_track;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void onRightBottomButtonClick() {
|
||||
doRename(true);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void onDismissButtonClickAction() {
|
||||
doRename(false);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onDismiss(DialogInterface dialog) {
|
||||
super.onDismiss(dialog);
|
||||
|
@ -199,10 +196,10 @@ public class OnSaveCurrentTrackFragment extends BottomSheetDialogFragment {
|
|||
}
|
||||
OsmandApplication app = (OsmandApplication) activity.getApplication();
|
||||
|
||||
GpxInfo gpxInfo = new GpxInfo();
|
||||
AvailableGPXFragment.GpxInfo gpxInfo = new AvailableGPXFragment.GpxInfo();
|
||||
gpxInfo.setGpx(GPXUtilities.loadGPXFile(f));
|
||||
if (gpxInfo.gpx != null) {
|
||||
WptPt loc = gpxInfo.gpx.findPointToShow();
|
||||
GPXUtilities.WptPt loc = gpxInfo.gpx.findPointToShow();
|
||||
if (loc != null) {
|
||||
app.getSelectedGpxHelper().setGpxFileToDisplay(gpxInfo.gpx);
|
||||
if (activity instanceof MapActivity) {
|
||||
|
@ -223,7 +220,7 @@ public class OnSaveCurrentTrackFragment extends BottomSheetDialogFragment {
|
|||
if (fragmentManager.isStateSaved()) {
|
||||
return;
|
||||
}
|
||||
OnSaveCurrentTrackFragment f = new OnSaveCurrentTrackFragment();
|
||||
SaveGPXBottomSheetFragment f = new SaveGPXBottomSheetFragment();
|
||||
Bundle b = new Bundle();
|
||||
b.putStringArrayList(SAVED_TRACKS_KEY, new ArrayList<>(filenames));
|
||||
f.setArguments(b);
|
||||
|
@ -234,3 +231,4 @@ public class OnSaveCurrentTrackFragment extends BottomSheetDialogFragment {
|
|||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -56,6 +56,7 @@ public class BugBottomSheetDialog extends MenuBottomSheetDialogFragment {
|
|||
|
||||
View osmNoteView = View.inflate(UiUtilities.getThemedContext(app, nightMode),
|
||||
R.layout.open_osm_note_text, null);
|
||||
osmNoteView.getViewTreeObserver().addOnGlobalLayoutListener(getShadowLayoutListener());
|
||||
TextInputLayout textBox = osmNoteView.findViewById(R.id.name_text_box);
|
||||
textBox.setHint(AndroidUtils.addColon(app, R.string.osn_bug_name));
|
||||
ColorStateList colorStateList = ColorStateList.valueOf(ContextCompat
|
||||
|
@ -85,9 +86,9 @@ public class BugBottomSheetDialog extends MenuBottomSheetDialogFragment {
|
|||
}
|
||||
|
||||
public static void showInstance(@NonNull FragmentManager fm, OsmBugsUtil osmBugsUtil, OsmBugsUtil local,
|
||||
String text, int titleTextId, int posButtonTextId, final OsmPoint.Action action,
|
||||
final OsmBugsLayer.OpenStreetNote bug, final OsmNotesPoint point,
|
||||
HandleOsmNoteAsyncTask.HandleBugListener handleBugListener) {
|
||||
String text, int titleTextId, int posButtonTextId, final OsmPoint.Action action,
|
||||
final OsmBugsLayer.OpenStreetNote bug, final OsmNotesPoint point,
|
||||
HandleOsmNoteAsyncTask.HandleBugListener handleBugListener) {
|
||||
try {
|
||||
if (!fm.isStateSaved()) {
|
||||
BugBottomSheetDialog fragment = new BugBottomSheetDialog();
|
||||
|
|
|
@ -1,14 +1,11 @@
|
|||
package net.osmand.plus.osmedit.dialogs;
|
||||
|
||||
import android.graphics.Rect;
|
||||
import android.os.AsyncTask;
|
||||
import android.os.Bundle;
|
||||
import android.text.Editable;
|
||||
import android.view.LayoutInflater;
|
||||
import android.view.View;
|
||||
import android.view.ViewTreeObserver;
|
||||
import android.widget.LinearLayout;
|
||||
import android.widget.ScrollView;
|
||||
import android.widget.TextView;
|
||||
|
||||
import androidx.annotation.NonNull;
|
||||
|
@ -54,10 +51,6 @@ public class SendGpxBottomSheetFragment extends MenuBottomSheetDialogFragment {
|
|||
|
||||
private TextInputEditText tagsField;
|
||||
private TextInputEditText messageField;
|
||||
private int contentHeightPrevious = 0;
|
||||
private int buttonsHeight;
|
||||
private int shadowHeight;
|
||||
private ScrollView scrollView;
|
||||
|
||||
public void setGpxInfos(GpxInfo[] gpxInfos) {
|
||||
this.gpxInfos = gpxInfos;
|
||||
|
@ -69,13 +62,13 @@ public class SendGpxBottomSheetFragment extends MenuBottomSheetDialogFragment {
|
|||
OsmandSettings settings = app.getSettings();
|
||||
|
||||
LayoutInflater themedInflater = UiUtilities.getInflater(app, nightMode);
|
||||
View sendOsmPoiView = themedInflater.inflate(R.layout.send_gpx_fragment, null);
|
||||
sendOsmPoiView.getViewTreeObserver().addOnGlobalLayoutListener(getOnGlobalLayoutListener());
|
||||
View sendGpxView = themedInflater.inflate(R.layout.send_gpx_fragment, null);
|
||||
sendGpxView.getViewTreeObserver().addOnGlobalLayoutListener(getShadowLayoutListener());
|
||||
|
||||
tagsField = sendOsmPoiView.findViewById(R.id.tags_field);
|
||||
messageField = sendOsmPoiView.findViewById(R.id.message_field);
|
||||
tagsField = sendGpxView.findViewById(R.id.tags_field);
|
||||
messageField = sendGpxView.findViewById(R.id.message_field);
|
||||
|
||||
TextView accountName = sendOsmPoiView.findViewById(R.id.user_name);
|
||||
TextView accountName = sendGpxView.findViewById(R.id.user_name);
|
||||
if (!Algorithms.isEmpty(settings.USER_DISPLAY_NAME.get())) {
|
||||
accountName.setText(settings.USER_DISPLAY_NAME.get());
|
||||
} else {
|
||||
|
@ -86,8 +79,8 @@ public class SendGpxBottomSheetFragment extends MenuBottomSheetDialogFragment {
|
|||
messageField.setText(Algorithms.getFileNameWithoutExtension(fileName));
|
||||
messageField.setSelection(messageField.getText().length());
|
||||
|
||||
final TextView visibilityName = sendOsmPoiView.findViewById(R.id.visibility_name);
|
||||
final TextView visibilityDescription = sendOsmPoiView.findViewById(R.id.visibility_description);
|
||||
final TextView visibilityName = sendGpxView.findViewById(R.id.visibility_name);
|
||||
final TextView visibilityDescription = sendGpxView.findViewById(R.id.visibility_description);
|
||||
visibilityName.setText(selectedUploadVisibility.getTitleId());
|
||||
visibilityDescription.setText(selectedUploadVisibility.getDescriptionId());
|
||||
|
||||
|
@ -110,7 +103,7 @@ public class SendGpxBottomSheetFragment extends MenuBottomSheetDialogFragment {
|
|||
horizontalSelectionAdapter.notifyDataSetChanged();
|
||||
}
|
||||
});
|
||||
LinearLayout account = sendOsmPoiView.findViewById(R.id.account_container);
|
||||
LinearLayout account = sendGpxView.findViewById(R.id.account_container);
|
||||
account.setOnClickListener(new View.OnClickListener() {
|
||||
@Override
|
||||
public void onClick(View v) {
|
||||
|
@ -121,39 +114,17 @@ public class SendGpxBottomSheetFragment extends MenuBottomSheetDialogFragment {
|
|||
dismiss();
|
||||
}
|
||||
});
|
||||
RecyclerView iconCategoriesRecyclerView = sendOsmPoiView.findViewById(R.id.description_view);
|
||||
RecyclerView iconCategoriesRecyclerView = sendGpxView.findViewById(R.id.description_view);
|
||||
iconCategoriesRecyclerView.setAdapter(horizontalSelectionAdapter);
|
||||
iconCategoriesRecyclerView.setLayoutManager(new LinearLayoutManager(app, RecyclerView.HORIZONTAL, false));
|
||||
horizontalSelectionAdapter.notifyDataSetChanged();
|
||||
|
||||
SimpleBottomSheetItem titleItem = (SimpleBottomSheetItem) new SimpleBottomSheetItem.Builder()
|
||||
.setCustomView(sendOsmPoiView)
|
||||
.setCustomView(sendGpxView)
|
||||
.create();
|
||||
items.add(titleItem);
|
||||
}
|
||||
|
||||
private ViewTreeObserver.OnGlobalLayoutListener getOnGlobalLayoutListener() {
|
||||
return new ViewTreeObserver.OnGlobalLayoutListener() {
|
||||
@Override
|
||||
public void onGlobalLayout() {
|
||||
Rect visibleDisplayFrame = new Rect();
|
||||
buttonsHeight = getResources().getDimensionPixelSize(R.dimen.dialog_button_ex_max_width);
|
||||
shadowHeight = getResources().getDimensionPixelSize(R.dimen.bottom_sheet_top_shadow_height);
|
||||
scrollView = getView().findViewById(R.id.scroll_view);
|
||||
scrollView.getWindowVisibleDisplayFrame(visibleDisplayFrame);
|
||||
int viewHeight = scrollView.getHeight();
|
||||
int contentHeight = visibleDisplayFrame.bottom - visibleDisplayFrame.top - buttonsHeight;
|
||||
if (contentHeightPrevious != contentHeight) {
|
||||
boolean showTopShadow;
|
||||
showTopShadow = viewHeight + shadowHeight < contentHeight;
|
||||
scrollView.requestLayout();
|
||||
contentHeightPrevious = contentHeight;
|
||||
drawTopShadow(showTopShadow);
|
||||
}
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
protected static void showOpenStreetMapScreen(@NonNull FragmentActivity activity) {
|
||||
if (activity instanceof MapActivity) {
|
||||
BaseSettingsFragment.showInstance(activity, OPEN_STREET_MAP_EDITING);
|
||||
|
|
|
@ -77,6 +77,7 @@ public class SendOsmNoteBottomSheetFragment extends MenuBottomSheetDialogFragmen
|
|||
|
||||
final View sendOsmNoteView = View.inflate(new ContextThemeWrapper(getContext(), themeRes),
|
||||
R.layout.send_osm_note_fragment, null);
|
||||
sendOsmNoteView.getViewTreeObserver().addOnGlobalLayoutListener(getShadowLayoutListener());
|
||||
|
||||
noteText = sendOsmNoteView.findViewById(R.id.note_text);
|
||||
noteText.setText(((OsmNotesPoint) poi[0]).getText());
|
||||
|
|
|
@ -37,221 +37,222 @@ import static net.osmand.plus.osmedit.dialogs.SendGpxBottomSheetFragment.showOpe
|
|||
|
||||
public class SendPoiBottomSheetFragment extends MenuBottomSheetDialogFragment {
|
||||
|
||||
public static final String TAG = SendPoiBottomSheetFragment.class.getSimpleName();
|
||||
private static final Log LOG = PlatformUtil.getLog(SendPoiBottomSheetFragment.class);
|
||||
public static final String OPENSTREETMAP_POINT = "openstreetmap_point";
|
||||
private OsmPoint[] poi;
|
||||
public static final String TAG = SendPoiBottomSheetFragment.class.getSimpleName();
|
||||
private static final Log LOG = PlatformUtil.getLog(SendPoiBottomSheetFragment.class);
|
||||
public static final String OPENSTREETMAP_POINT = "openstreetmap_point";
|
||||
private OsmPoint[] poi;
|
||||
|
||||
private SwitchCompat closeChangeSet;
|
||||
private EditText messageEditText;
|
||||
private SwitchCompat closeChangeSet;
|
||||
private EditText messageEditText;
|
||||
|
||||
|
||||
private boolean isLoginOAuth(OsmandSettings settings) {
|
||||
return !Algorithms.isEmpty(settings.USER_DISPLAY_NAME.get());
|
||||
}
|
||||
private boolean isLoginOAuth(OsmandSettings settings) {
|
||||
return !Algorithms.isEmpty(settings.USER_DISPLAY_NAME.get());
|
||||
}
|
||||
|
||||
@Override
|
||||
public void createMenuItems(Bundle savedInstanceState) {
|
||||
OsmandApplication app = getMyApplication();
|
||||
if (app == null) {
|
||||
return;
|
||||
}
|
||||
poi = (OsmPoint[]) getArguments().getSerializable(OPENSTREETMAP_POINT);
|
||||
final boolean isNightMode = app.getDaynightHelper().isNightModeForMapControls();
|
||||
final View sendOsmPoiView = View.inflate(new ContextThemeWrapper(getContext(), themeRes),
|
||||
R.layout.send_poi_fragment, null);
|
||||
closeChangeSet = sendOsmPoiView.findViewById(R.id.close_change_set_checkbox);
|
||||
messageEditText = sendOsmPoiView.findViewById(R.id.message_field);
|
||||
String defaultChangeSet = createDefaultChangeSet(app);
|
||||
messageEditText.setText(defaultChangeSet);
|
||||
messageEditText.setSelection(messageEditText.getText().length());
|
||||
final TextView accountName = sendOsmPoiView.findViewById(R.id.user_name);
|
||||
OsmandSettings settings = app.getSettings();
|
||||
String userNameOAuth = settings.USER_DISPLAY_NAME.get();
|
||||
String userNameOpenID = settings.USER_NAME.get();
|
||||
String userName = isLoginOAuth(settings) ? userNameOAuth : userNameOpenID;
|
||||
accountName.setText(userName);
|
||||
closeChangeSet.setBackgroundResource(isNightMode ? R.drawable.layout_bg_dark : R.drawable.layout_bg);
|
||||
final int paddingSmall = app.getResources().getDimensionPixelSize(R.dimen.content_padding_small);
|
||||
closeChangeSet.setPadding(paddingSmall, 0, paddingSmall, 0);
|
||||
closeChangeSet.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
|
||||
@Override
|
||||
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
|
||||
if (isNightMode) {
|
||||
closeChangeSet.setBackgroundResource(
|
||||
isChecked ? R.drawable.layout_bg_dark_solid : R.drawable.layout_bg_dark);
|
||||
} else {
|
||||
closeChangeSet.setBackgroundResource(
|
||||
isChecked ? R.drawable.layout_bg_solid : R.drawable.layout_bg);
|
||||
}
|
||||
closeChangeSet.setPadding(paddingSmall, 0, paddingSmall, 0);
|
||||
}
|
||||
});
|
||||
LinearLayout account = sendOsmPoiView.findViewById(R.id.account_container);
|
||||
account.setOnClickListener(new View.OnClickListener() {
|
||||
@Override
|
||||
public void onClick(View v) {
|
||||
FragmentActivity activity = getActivity();
|
||||
if (activity != null) {
|
||||
showOpenStreetMapScreen(activity);
|
||||
}
|
||||
dismiss();
|
||||
}
|
||||
});
|
||||
final SimpleBottomSheetItem titleItem = (SimpleBottomSheetItem) new SimpleBottomSheetItem.Builder()
|
||||
.setCustomView(sendOsmPoiView)
|
||||
.create();
|
||||
items.add(titleItem);
|
||||
}
|
||||
@Override
|
||||
public void createMenuItems(Bundle savedInstanceState) {
|
||||
OsmandApplication app = getMyApplication();
|
||||
if (app == null) {
|
||||
return;
|
||||
}
|
||||
poi = (OsmPoint[]) getArguments().getSerializable(OPENSTREETMAP_POINT);
|
||||
final boolean isNightMode = app.getDaynightHelper().isNightModeForMapControls();
|
||||
final View sendOsmPoiView = View.inflate(new ContextThemeWrapper(getContext(), themeRes),
|
||||
R.layout.send_poi_fragment, null);
|
||||
sendOsmPoiView.getViewTreeObserver().addOnGlobalLayoutListener(getShadowLayoutListener());
|
||||
closeChangeSet = sendOsmPoiView.findViewById(R.id.close_change_set_checkbox);
|
||||
messageEditText = sendOsmPoiView.findViewById(R.id.message_field);
|
||||
String defaultChangeSet = createDefaultChangeSet(app);
|
||||
messageEditText.setText(defaultChangeSet);
|
||||
messageEditText.setSelection(messageEditText.getText().length());
|
||||
final TextView accountName = sendOsmPoiView.findViewById(R.id.user_name);
|
||||
OsmandSettings settings = app.getSettings();
|
||||
String userNameOAuth = settings.USER_DISPLAY_NAME.get();
|
||||
String userNameOpenID = settings.USER_NAME.get();
|
||||
String userName = isLoginOAuth(settings) ? userNameOAuth : userNameOpenID;
|
||||
accountName.setText(userName);
|
||||
closeChangeSet.setBackgroundResource(isNightMode ? R.drawable.layout_bg_dark : R.drawable.layout_bg);
|
||||
final int paddingSmall = app.getResources().getDimensionPixelSize(R.dimen.content_padding_small);
|
||||
closeChangeSet.setPadding(paddingSmall, 0, paddingSmall, 0);
|
||||
closeChangeSet.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
|
||||
@Override
|
||||
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
|
||||
if (isNightMode) {
|
||||
closeChangeSet.setBackgroundResource(
|
||||
isChecked ? R.drawable.layout_bg_dark_solid : R.drawable.layout_bg_dark);
|
||||
} else {
|
||||
closeChangeSet.setBackgroundResource(
|
||||
isChecked ? R.drawable.layout_bg_solid : R.drawable.layout_bg);
|
||||
}
|
||||
closeChangeSet.setPadding(paddingSmall, 0, paddingSmall, 0);
|
||||
}
|
||||
});
|
||||
LinearLayout account = sendOsmPoiView.findViewById(R.id.account_container);
|
||||
account.setOnClickListener(new View.OnClickListener() {
|
||||
@Override
|
||||
public void onClick(View v) {
|
||||
FragmentActivity activity = getActivity();
|
||||
if (activity != null) {
|
||||
showOpenStreetMapScreen(activity);
|
||||
}
|
||||
dismiss();
|
||||
}
|
||||
});
|
||||
final SimpleBottomSheetItem titleItem = (SimpleBottomSheetItem) new SimpleBottomSheetItem.Builder()
|
||||
.setCustomView(sendOsmPoiView)
|
||||
.create();
|
||||
items.add(titleItem);
|
||||
}
|
||||
|
||||
public static void showInstance(@NonNull FragmentManager fm, @NonNull OsmPoint[] points) {
|
||||
try {
|
||||
if (!fm.isStateSaved()) {
|
||||
SendPoiBottomSheetFragment fragment = new SendPoiBottomSheetFragment();
|
||||
Bundle bundle = new Bundle();
|
||||
bundle.putSerializable(OPENSTREETMAP_POINT, points);
|
||||
fragment.setArguments(bundle);
|
||||
fragment.show(fm, TAG);
|
||||
}
|
||||
} catch (RuntimeException e) {
|
||||
LOG.error("showInstance", e);
|
||||
}
|
||||
}
|
||||
public static void showInstance(@NonNull FragmentManager fm, @NonNull OsmPoint[] points) {
|
||||
try {
|
||||
if (!fm.isStateSaved()) {
|
||||
SendPoiBottomSheetFragment fragment = new SendPoiBottomSheetFragment();
|
||||
Bundle bundle = new Bundle();
|
||||
bundle.putSerializable(OPENSTREETMAP_POINT, points);
|
||||
fragment.setArguments(bundle);
|
||||
fragment.show(fm, TAG);
|
||||
}
|
||||
} catch (RuntimeException e) {
|
||||
LOG.error("showInstance", e);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
protected UiUtilities.DialogButtonType getRightBottomButtonType() {
|
||||
return (UiUtilities.DialogButtonType.PRIMARY);
|
||||
}
|
||||
@Override
|
||||
protected UiUtilities.DialogButtonType getRightBottomButtonType() {
|
||||
return (UiUtilities.DialogButtonType.PRIMARY);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void onRightBottomButtonClick() {
|
||||
ProgressDialogPoiUploader progressDialogPoiUploader = null;
|
||||
Activity activity = getActivity();
|
||||
if (activity instanceof MapActivity) {
|
||||
progressDialogPoiUploader = new SimpleProgressDialogPoiUploader((MapActivity) activity);
|
||||
} else if (getParentFragment() instanceof ProgressDialogPoiUploader) {
|
||||
progressDialogPoiUploader = (ProgressDialogPoiUploader) getParentFragment();
|
||||
}
|
||||
if (progressDialogPoiUploader != null) {
|
||||
String comment = messageEditText.getText().toString();
|
||||
if (comment.length() > 0) {
|
||||
for (OsmPoint osmPoint : poi) {
|
||||
if (osmPoint.getGroup() == OsmPoint.Group.POI) {
|
||||
((OpenstreetmapPoint) osmPoint).setComment(comment);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
progressDialogPoiUploader.showProgressDialog(poi, closeChangeSet.isChecked(), false);
|
||||
}
|
||||
dismiss();
|
||||
}
|
||||
@Override
|
||||
protected void onRightBottomButtonClick() {
|
||||
ProgressDialogPoiUploader progressDialogPoiUploader = null;
|
||||
Activity activity = getActivity();
|
||||
if (activity instanceof MapActivity) {
|
||||
progressDialogPoiUploader = new SimpleProgressDialogPoiUploader((MapActivity) activity);
|
||||
} else if (getParentFragment() instanceof ProgressDialogPoiUploader) {
|
||||
progressDialogPoiUploader = (ProgressDialogPoiUploader) getParentFragment();
|
||||
}
|
||||
if (progressDialogPoiUploader != null) {
|
||||
String comment = messageEditText.getText().toString();
|
||||
if (comment.length() > 0) {
|
||||
for (OsmPoint osmPoint : poi) {
|
||||
if (osmPoint.getGroup() == OsmPoint.Group.POI) {
|
||||
((OpenstreetmapPoint) osmPoint).setComment(comment);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
progressDialogPoiUploader.showProgressDialog(poi, closeChangeSet.isChecked(), false);
|
||||
}
|
||||
dismiss();
|
||||
}
|
||||
|
||||
@Override
|
||||
protected int getRightBottomButtonTextId() {
|
||||
return R.string.shared_string_upload;
|
||||
}
|
||||
@Override
|
||||
protected int getRightBottomButtonTextId() {
|
||||
return R.string.shared_string_upload;
|
||||
}
|
||||
|
||||
private String createDefaultChangeSet(OsmandApplication app) {
|
||||
Map<String, PoiType> allTranslatedSubTypes = app.getPoiTypes().getAllTranslatedNames(true);
|
||||
if (allTranslatedSubTypes == null) {
|
||||
return "";
|
||||
}
|
||||
Map<String, Integer> addGroup = new HashMap<>();
|
||||
Map<String, Integer> editGroup = new HashMap<>();
|
||||
Map<String, Integer> deleteGroup = new HashMap<>();
|
||||
Map<String, Integer> reopenGroup = new HashMap<>();
|
||||
String comment = "";
|
||||
for (OsmPoint p : poi) {
|
||||
if (p.getGroup() == OsmPoint.Group.POI) {
|
||||
OsmPoint.Action action = p.getAction();
|
||||
String type = ((OpenstreetmapPoint) p).getEntity().getTag(Entity.POI_TYPE_TAG);
|
||||
if (type == null) {
|
||||
continue;
|
||||
}
|
||||
PoiType localizedPoiType = allTranslatedSubTypes.get(type.toLowerCase().trim());
|
||||
if (localizedPoiType != null) {
|
||||
type = Algorithms.capitalizeFirstLetter(localizedPoiType.getKeyName().replace('_', ' '));
|
||||
}
|
||||
if (action == OsmPoint.Action.CREATE) {
|
||||
if (!addGroup.containsKey(type)) {
|
||||
addGroup.put(type, 1);
|
||||
} else {
|
||||
addGroup.put(type, addGroup.get(type) + 1);
|
||||
}
|
||||
} else if (action == OsmPoint.Action.MODIFY) {
|
||||
if (!editGroup.containsKey(type)) {
|
||||
editGroup.put(type, 1);
|
||||
} else {
|
||||
editGroup.put(type, editGroup.get(type) + 1);
|
||||
}
|
||||
} else if (action == OsmPoint.Action.DELETE) {
|
||||
if (!deleteGroup.containsKey(type)) {
|
||||
deleteGroup.put(type, 1);
|
||||
} else {
|
||||
deleteGroup.put(type, deleteGroup.get(type) + 1);
|
||||
}
|
||||
} else if (action == OsmPoint.Action.REOPEN) {
|
||||
if (!reopenGroup.containsKey(type)) {
|
||||
reopenGroup.put(type, 1);
|
||||
} else {
|
||||
reopenGroup.put(type, reopenGroup.get(type) + 1);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
int modifiedItemsOutOfLimit = 0;
|
||||
for (int i = 0; i < 4; i++) {
|
||||
String action;
|
||||
Map<String, Integer> group;
|
||||
switch (i) {
|
||||
case 0:
|
||||
action = getString(R.string.default_changeset_add);
|
||||
group = addGroup;
|
||||
break;
|
||||
case 1:
|
||||
action = getString(R.string.default_changeset_edit);
|
||||
group = editGroup;
|
||||
break;
|
||||
case 2:
|
||||
action = getString(R.string.default_changeset_delete);
|
||||
group = deleteGroup;
|
||||
break;
|
||||
case 3:
|
||||
action = getString(R.string.default_changeset_reopen);
|
||||
group = reopenGroup;
|
||||
break;
|
||||
default:
|
||||
action = "";
|
||||
group = new HashMap<>();
|
||||
}
|
||||
private String createDefaultChangeSet(OsmandApplication app) {
|
||||
Map<String, PoiType> allTranslatedSubTypes = app.getPoiTypes().getAllTranslatedNames(true);
|
||||
if (allTranslatedSubTypes == null) {
|
||||
return "";
|
||||
}
|
||||
Map<String, Integer> addGroup = new HashMap<>();
|
||||
Map<String, Integer> editGroup = new HashMap<>();
|
||||
Map<String, Integer> deleteGroup = new HashMap<>();
|
||||
Map<String, Integer> reopenGroup = new HashMap<>();
|
||||
String comment = "";
|
||||
for (OsmPoint p : poi) {
|
||||
if (p.getGroup() == OsmPoint.Group.POI) {
|
||||
OsmPoint.Action action = p.getAction();
|
||||
String type = ((OpenstreetmapPoint) p).getEntity().getTag(Entity.POI_TYPE_TAG);
|
||||
if (type == null) {
|
||||
continue;
|
||||
}
|
||||
PoiType localizedPoiType = allTranslatedSubTypes.get(type.toLowerCase().trim());
|
||||
if (localizedPoiType != null) {
|
||||
type = Algorithms.capitalizeFirstLetter(localizedPoiType.getKeyName().replace('_', ' '));
|
||||
}
|
||||
if (action == OsmPoint.Action.CREATE) {
|
||||
if (!addGroup.containsKey(type)) {
|
||||
addGroup.put(type, 1);
|
||||
} else {
|
||||
addGroup.put(type, addGroup.get(type) + 1);
|
||||
}
|
||||
} else if (action == OsmPoint.Action.MODIFY) {
|
||||
if (!editGroup.containsKey(type)) {
|
||||
editGroup.put(type, 1);
|
||||
} else {
|
||||
editGroup.put(type, editGroup.get(type) + 1);
|
||||
}
|
||||
} else if (action == OsmPoint.Action.DELETE) {
|
||||
if (!deleteGroup.containsKey(type)) {
|
||||
deleteGroup.put(type, 1);
|
||||
} else {
|
||||
deleteGroup.put(type, deleteGroup.get(type) + 1);
|
||||
}
|
||||
} else if (action == OsmPoint.Action.REOPEN) {
|
||||
if (!reopenGroup.containsKey(type)) {
|
||||
reopenGroup.put(type, 1);
|
||||
} else {
|
||||
reopenGroup.put(type, reopenGroup.get(type) + 1);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
int modifiedItemsOutOfLimit = 0;
|
||||
for (int i = 0; i < 4; i++) {
|
||||
String action;
|
||||
Map<String, Integer> group;
|
||||
switch (i) {
|
||||
case 0:
|
||||
action = getString(R.string.default_changeset_add);
|
||||
group = addGroup;
|
||||
break;
|
||||
case 1:
|
||||
action = getString(R.string.default_changeset_edit);
|
||||
group = editGroup;
|
||||
break;
|
||||
case 2:
|
||||
action = getString(R.string.default_changeset_delete);
|
||||
group = deleteGroup;
|
||||
break;
|
||||
case 3:
|
||||
action = getString(R.string.default_changeset_reopen);
|
||||
group = reopenGroup;
|
||||
break;
|
||||
default:
|
||||
action = "";
|
||||
group = new HashMap<>();
|
||||
}
|
||||
|
||||
if (!group.isEmpty()) {
|
||||
int pos = 0;
|
||||
for (Map.Entry<String, Integer> entry : group.entrySet()) {
|
||||
String type = entry.getKey();
|
||||
int quantity = entry.getValue();
|
||||
if (comment.length() > 200) {
|
||||
modifiedItemsOutOfLimit += quantity;
|
||||
} else {
|
||||
if (pos == 0) {
|
||||
comment = comment.concat(comment.length() == 0 ? "" : "; ").concat(action).concat(" ")
|
||||
.concat(quantity == 1 ? "" : quantity + " ").concat(type);
|
||||
} else {
|
||||
comment = comment.concat(", ").concat(quantity == 1 ? "" : quantity + " ").concat(type);
|
||||
}
|
||||
}
|
||||
pos++;
|
||||
}
|
||||
}
|
||||
}
|
||||
if (modifiedItemsOutOfLimit != 0) {
|
||||
comment = comment.concat("; ").concat(modifiedItemsOutOfLimit + " ")
|
||||
.concat(getString(R.string.items_modified)).concat(".");
|
||||
} else if (!comment.isEmpty()) {
|
||||
comment = comment.concat(".");
|
||||
}
|
||||
return comment;
|
||||
}
|
||||
if (!group.isEmpty()) {
|
||||
int pos = 0;
|
||||
for (Map.Entry<String, Integer> entry : group.entrySet()) {
|
||||
String type = entry.getKey();
|
||||
int quantity = entry.getValue();
|
||||
if (comment.length() > 200) {
|
||||
modifiedItemsOutOfLimit += quantity;
|
||||
} else {
|
||||
if (pos == 0) {
|
||||
comment = comment.concat(comment.length() == 0 ? "" : "; ").concat(action).concat(" ")
|
||||
.concat(quantity == 1 ? "" : quantity + " ").concat(type);
|
||||
} else {
|
||||
comment = comment.concat(", ").concat(quantity == 1 ? "" : quantity + " ").concat(type);
|
||||
}
|
||||
}
|
||||
pos++;
|
||||
}
|
||||
}
|
||||
}
|
||||
if (modifiedItemsOutOfLimit != 0) {
|
||||
comment = comment.concat("; ").concat(modifiedItemsOutOfLimit + " ")
|
||||
.concat(getString(R.string.items_modified)).concat(".");
|
||||
} else if (!comment.isEmpty()) {
|
||||
comment = comment.concat(".");
|
||||
}
|
||||
return comment;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -6,10 +6,10 @@ import android.os.Bundle;
|
|||
import android.view.LayoutInflater;
|
||||
import android.view.View;
|
||||
import android.widget.EditText;
|
||||
import android.widget.ScrollView;
|
||||
|
||||
import androidx.annotation.NonNull;
|
||||
import androidx.annotation.Nullable;
|
||||
import androidx.appcompat.content.res.AppCompatResources;
|
||||
import androidx.fragment.app.Fragment;
|
||||
import androidx.fragment.app.FragmentManager;
|
||||
|
||||
|
@ -44,6 +44,7 @@ public class OsmLoginDataBottomSheet extends BasePreferenceBottomSheet {
|
|||
|
||||
LayoutInflater themedInflater = UiUtilities.getInflater(requireContext(), nightMode);
|
||||
View view = themedInflater.inflate(R.layout.osm_login_data, null);
|
||||
view.getViewTreeObserver().addOnGlobalLayoutListener(getShadowLayoutListener());
|
||||
|
||||
userNameEditText = view.findViewById(R.id.name_edit_text);
|
||||
passwordEditText = view.findViewById(R.id.password_edit_text);
|
||||
|
@ -73,6 +74,7 @@ public class OsmLoginDataBottomSheet extends BasePreferenceBottomSheet {
|
|||
items.add(titleItem);
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public void onSaveInstanceState(@NonNull Bundle outState) {
|
||||
super.onSaveInstanceState(outState);
|
||||
|
@ -107,7 +109,7 @@ public class OsmLoginDataBottomSheet extends BasePreferenceBottomSheet {
|
|||
}
|
||||
|
||||
public static boolean showInstance(@NonNull FragmentManager fragmentManager, String key, Fragment target,
|
||||
boolean usedOnMap, @Nullable ApplicationMode appMode) {
|
||||
boolean usedOnMap, @Nullable ApplicationMode appMode) {
|
||||
try {
|
||||
Bundle args = new Bundle();
|
||||
args.putString(PREFERENCE_ID, key);
|
||||
|
|
Loading…
Reference in a new issue