forked from organicmaps/organicmaps
[android] Implemented rooms guests menu renderer
Added settings the default dates if only rooms were selected Added interfaces to convert the rooms into counts and back Imlemented user actions applying in rooms guests picker
This commit is contained in:
parent
207979d9f7
commit
0919cbb920
8 changed files with 212 additions and 22 deletions
|
@ -121,9 +121,12 @@ public class BookingFilterParams implements Parcelable
|
|||
return mRooms;
|
||||
}
|
||||
|
||||
public static BookingFilterParams createParams(long checkIn, long checkOut)
|
||||
public static BookingFilterParams createParams(
|
||||
long checkIn, long checkOut, @Nullable FilterUtils.RoomGuestCounts roomGuestCounts)
|
||||
{
|
||||
return ConnectionState.isConnected() ? new BookingFilterParams(checkIn, checkOut, Room.DEFAULT)
|
||||
: null;
|
||||
if (!ConnectionState.isConnected())
|
||||
return null;
|
||||
|
||||
return new BookingFilterParams(checkIn, checkOut, FilterUtils.toRooms(roomGuestCounts));
|
||||
}
|
||||
}
|
||||
|
|
|
@ -26,6 +26,7 @@ import java.util.Date;
|
|||
import java.util.Iterator;
|
||||
import java.util.List;
|
||||
import java.util.Locale;
|
||||
import java.util.Objects;
|
||||
import java.util.concurrent.TimeUnit;
|
||||
|
||||
public class FilterUtils
|
||||
|
@ -283,4 +284,80 @@ public class FilterUtils
|
|||
.build();
|
||||
dialog.show(activity, NO_NETWORK_CONNECTION_DIALOG_TAG);
|
||||
}
|
||||
|
||||
@NonNull
|
||||
public static BookingFilterParams.Room[] toRooms(@Nullable RoomGuestCounts counts)
|
||||
{
|
||||
// TODO: coming soon.
|
||||
BookingFilterParams.Room[] rooms = new BookingFilterParams.Room[1];
|
||||
rooms[0] = BookingFilterParams.Room.DEFAULT;
|
||||
return rooms;
|
||||
}
|
||||
|
||||
@NonNull
|
||||
public static RoomGuestCounts toCounts(@NonNull BookingFilterParams.Room... roms)
|
||||
{
|
||||
// TODO: coming soon.
|
||||
return new RoomGuestCounts(5, 5, 5,5);
|
||||
}
|
||||
|
||||
public static class RoomGuestCounts
|
||||
{
|
||||
private final int mRooms;
|
||||
private final int mAdults;
|
||||
private final int mChildren;
|
||||
private final int mInfants;
|
||||
|
||||
public RoomGuestCounts(int rooms, int adults, int children, int infants)
|
||||
{
|
||||
mRooms = rooms;
|
||||
mAdults = adults;
|
||||
mChildren = children;
|
||||
mInfants = infants;
|
||||
}
|
||||
|
||||
public int getRooms()
|
||||
{
|
||||
return mRooms;
|
||||
}
|
||||
|
||||
public int getAdults()
|
||||
{
|
||||
return mAdults;
|
||||
}
|
||||
|
||||
public int getChildren()
|
||||
{
|
||||
return mChildren;
|
||||
}
|
||||
|
||||
public int getInfants()
|
||||
{
|
||||
return mInfants;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean equals(Object o)
|
||||
{
|
||||
if (this == o) return true;
|
||||
if (o == null || getClass() != o.getClass()) return false;
|
||||
RoomGuestCounts that = (RoomGuestCounts) o;
|
||||
return getRooms() == that.getRooms() &&
|
||||
getAdults() == that.getAdults() &&
|
||||
getChildren() == that.getChildren() &&
|
||||
getInfants() == that.getInfants();
|
||||
}
|
||||
|
||||
@Override
|
||||
public int hashCode()
|
||||
{
|
||||
return Objects.hash(getRooms(), getAdults(), getChildren(), getInfants());
|
||||
}
|
||||
}
|
||||
|
||||
public interface RoomsGuestsCountProvider
|
||||
{
|
||||
@Nullable
|
||||
RoomGuestCounts getRoomGuestCount();
|
||||
}
|
||||
}
|
||||
|
|
|
@ -133,6 +133,11 @@ public class InteractiveCounterView extends RelativeLayout
|
|||
return Integer.parseInt(mCounterView.getText().toString());
|
||||
}
|
||||
|
||||
public void setCurrentValue(int value)
|
||||
{
|
||||
mCounterView.setText(String.valueOf(value));
|
||||
}
|
||||
|
||||
private void updateConstraints()
|
||||
{
|
||||
int value = getCurrentValue();
|
||||
|
|
|
@ -25,6 +25,7 @@ import com.mapswithme.maps.search.BookingFilterParams;
|
|||
import com.mapswithme.maps.search.FilterUtils;
|
||||
import com.mapswithme.maps.widget.menu.MenuController;
|
||||
import com.mapswithme.maps.widget.menu.MenuControllerFactory;
|
||||
import com.mapswithme.maps.widget.menu.MenuRoomsGuestsListener;
|
||||
import com.mapswithme.util.ConnectionState;
|
||||
import com.mapswithme.util.InputUtils;
|
||||
import com.mapswithme.util.StringUtils;
|
||||
|
@ -36,7 +37,8 @@ import java.util.List;
|
|||
import java.util.Objects;
|
||||
|
||||
public class SearchToolbarController extends ToolbarController
|
||||
implements View.OnClickListener
|
||||
implements View.OnClickListener, MenuRoomsGuestsListener,
|
||||
FilterUtils.RoomsGuestsCountProvider
|
||||
{
|
||||
private static final int REQUEST_VOICE_RECOGNITION = 0xCA11;
|
||||
@NonNull
|
||||
|
@ -54,7 +56,7 @@ public class SearchToolbarController extends ToolbarController
|
|||
@Nullable
|
||||
private Chip mChooseDatesChip;
|
||||
@Nullable
|
||||
private Chip mRooms;
|
||||
private Chip mRoomsChip;
|
||||
private final boolean mVoiceInputSupported = InputUtils.isVoiceInputSupported(getActivity());
|
||||
@NonNull
|
||||
private final TextWatcher mTextWatcher = new StringUtils.SimpleTextWatcher()
|
||||
|
@ -68,6 +70,8 @@ public class SearchToolbarController extends ToolbarController
|
|||
};
|
||||
@Nullable
|
||||
private Pair<Long, Long> mChosenDates;
|
||||
@Nullable
|
||||
private FilterUtils.RoomGuestCounts mRoomGuestCounts;
|
||||
@NonNull
|
||||
private final View.OnClickListener mChooseDatesClickListener = v -> {
|
||||
if (!ConnectionState.isConnected())
|
||||
|
@ -104,6 +108,33 @@ public class SearchToolbarController extends ToolbarController
|
|||
mGuiestsRoomsMenuController.open();
|
||||
};
|
||||
|
||||
@Override
|
||||
public void onRoomsGuestsApplied(@NonNull FilterUtils.RoomGuestCounts counts)
|
||||
{
|
||||
if (mRoomsChip == null)
|
||||
return;
|
||||
|
||||
if (counts.equals(mRoomGuestCounts))
|
||||
return;
|
||||
|
||||
formatAndSetRoomGuestsCounts(counts);
|
||||
if (mChosenDates == null)
|
||||
{
|
||||
long checkinMillis = MaterialDatePicker.todayInUtcMilliseconds();
|
||||
long checkoutMillis = FilterUtils.getDayAfter(checkinMillis);
|
||||
formatAndSetChosenDates(checkinMillis, checkoutMillis);
|
||||
}
|
||||
for (FilterParamsChangedListener listener : mFilterParamsChangedListeners)
|
||||
listener.onBookingParamsChanged();
|
||||
}
|
||||
|
||||
@Nullable
|
||||
@Override
|
||||
public FilterUtils.RoomGuestCounts getRoomGuestCount()
|
||||
{
|
||||
return mRoomGuestCounts;
|
||||
}
|
||||
|
||||
public interface Container
|
||||
{
|
||||
SearchToolbarController getController();
|
||||
|
@ -137,23 +168,26 @@ public class SearchToolbarController extends ToolbarController
|
|||
if (mFilterContainer != null)
|
||||
{
|
||||
mChooseDatesChip = mFilterContainer.findViewById(R.id.choose_dates);
|
||||
mRooms = mFilterContainer.findViewById(R.id.rooms);
|
||||
mRoomsChip = mFilterContainer.findViewById(R.id.rooms);
|
||||
//noinspection ConstantConditions
|
||||
mChooseDatesChip.setOnClickListener(mChooseDatesClickListener);
|
||||
mChooseDatesChip.setOnCloseIconClickListener(mChooseDatesClickListener);
|
||||
mRooms.setOnClickListener(mRoomsClickListener);
|
||||
mRooms.setOnCloseIconClickListener(mRoomsClickListener);
|
||||
//noinspection ConstantConditions
|
||||
mRoomsChip.setOnClickListener(mRoomsClickListener);
|
||||
mRoomsChip.setOnCloseIconClickListener(mRoomsClickListener);
|
||||
}
|
||||
|
||||
showProgress(false);
|
||||
updateButtons(true);
|
||||
mGuiestsRoomsMenuController = MenuControllerFactory.createGuestsRoomsMenuController();
|
||||
mGuiestsRoomsMenuController
|
||||
= MenuControllerFactory.createGuestsRoomsMenuController(this, this);
|
||||
mGuiestsRoomsMenuController.initialize(getActivity().findViewById(R.id.coordinator));
|
||||
}
|
||||
|
||||
public void setFilterParams(@NonNull BookingFilterParams params)
|
||||
{
|
||||
formatAndSetChosenDates(params.getCheckinMillisec(), params.getCheckoutMillisec());
|
||||
formatAndSetRoomGuestsCounts(FilterUtils.toCounts(params.getRooms()));
|
||||
}
|
||||
|
||||
private void formatAndSetChosenDates(long checkinMillis, long checkoutMillis)
|
||||
|
@ -166,13 +200,26 @@ public class SearchToolbarController extends ToolbarController
|
|||
mChosenDates = new Pair<>(checkinMillis, checkoutMillis);
|
||||
}
|
||||
|
||||
private void formatAndSetRoomGuestsCounts(@NonNull FilterUtils.RoomGuestCounts counts)
|
||||
{
|
||||
if (mRoomsChip == null)
|
||||
return;
|
||||
|
||||
int people = counts.getAdults() + counts.getChildren() + counts.getInfants();
|
||||
mRoomsChip.setText(String.valueOf(people));
|
||||
mRoomGuestCounts = counts;
|
||||
}
|
||||
|
||||
public void resetFilterParams()
|
||||
{
|
||||
if (mChooseDatesChip == null)
|
||||
if (mChooseDatesChip == null || mRoomsChip == null)
|
||||
return;
|
||||
|
||||
mChooseDatesChip.setText(R.string.date_picker_сhoose_dates_cta);
|
||||
mChosenDates = null;
|
||||
|
||||
mRoomsChip.setText(R.string.guests_picker_rooms);
|
||||
mRoomGuestCounts = null;
|
||||
}
|
||||
|
||||
private void updateButtons(boolean queryEmpty)
|
||||
|
@ -331,7 +378,8 @@ public class SearchToolbarController extends ToolbarController
|
|||
if (mChosenDates == null)
|
||||
return null;
|
||||
|
||||
return BookingFilterParams.createParams(mChosenDates.first, mChosenDates.second);
|
||||
return BookingFilterParams.createParams(mChosenDates.first, mChosenDates.second,
|
||||
mRoomGuestCounts);
|
||||
}
|
||||
|
||||
public interface FilterParamsChangedListener
|
||||
|
|
|
@ -36,17 +36,16 @@ public class BottomSheetMenuController implements MenuController
|
|||
if (BottomSheetMenuUtils.isSettlingState(state) || BottomSheetMenuUtils.isDraggingState(state))
|
||||
return;
|
||||
|
||||
if (mStateObserver == null)
|
||||
return;
|
||||
|
||||
if (BottomSheetMenuUtils.isHiddenState(state))
|
||||
{
|
||||
mMenuRenderer.onHide();
|
||||
mStateObserver.onMenuClosed();
|
||||
if (mStateObserver != null)
|
||||
mStateObserver.onMenuClosed();
|
||||
return;
|
||||
}
|
||||
|
||||
mStateObserver.onMenuOpen();
|
||||
if (mStateObserver != null)
|
||||
mStateObserver.onMenuOpen();
|
||||
}
|
||||
|
||||
@Override
|
||||
|
|
|
@ -2,31 +2,77 @@ package com.mapswithme.maps.widget.menu;
|
|||
|
||||
import android.view.View;
|
||||
|
||||
import androidx.annotation.NonNull;
|
||||
import androidx.annotation.Nullable;
|
||||
import com.mapswithme.maps.R;
|
||||
import com.mapswithme.maps.search.FilterUtils;
|
||||
import com.mapswithme.maps.widget.InteractiveCounterView;
|
||||
|
||||
import java.util.Objects;
|
||||
|
||||
public class GuestsRoomsMenuRenderer implements MenuRenderer
|
||||
{
|
||||
@NonNull
|
||||
private final MenuRoomsGuestsListener mListener;
|
||||
@NonNull
|
||||
private final FilterUtils.RoomsGuestsCountProvider mProvider;
|
||||
@SuppressWarnings("NotNullFieldNotInitialized")
|
||||
@NonNull
|
||||
private InteractiveCounterView mRoomsView;
|
||||
@SuppressWarnings("NotNullFieldNotInitialized")
|
||||
@NonNull
|
||||
private InteractiveCounterView mAdultsView;
|
||||
@SuppressWarnings("NotNullFieldNotInitialized")
|
||||
@NonNull
|
||||
private InteractiveCounterView mChildrenView;
|
||||
@SuppressWarnings("NotNullFieldNotInitialized")
|
||||
@NonNull
|
||||
private InteractiveCounterView mInfantsView;
|
||||
|
||||
public GuestsRoomsMenuRenderer(@NonNull MenuRoomsGuestsListener listener,
|
||||
@NonNull FilterUtils.RoomsGuestsCountProvider provider)
|
||||
{
|
||||
mListener = listener;
|
||||
mProvider = provider;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void render()
|
||||
{
|
||||
// TODO: coming soon.
|
||||
FilterUtils.RoomGuestCounts counts = mProvider.getRoomGuestCount();
|
||||
if (counts == null)
|
||||
return;
|
||||
|
||||
mRoomsView.setCurrentValue(counts.getRooms());
|
||||
mAdultsView.setCurrentValue(counts.getAdults());
|
||||
mChildrenView.setCurrentValue(counts.getChildren());
|
||||
mInfantsView.setCurrentValue(counts.getInfants());
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onHide()
|
||||
{
|
||||
// TODO: coming soon.
|
||||
FilterUtils.RoomGuestCounts counts
|
||||
= new FilterUtils.RoomGuestCounts(mRoomsView.getCurrentValue(),
|
||||
mAdultsView.getCurrentValue(),
|
||||
mChildrenView.getCurrentValue(),
|
||||
mInfantsView.getCurrentValue());
|
||||
mListener.onRoomsGuestsApplied(counts);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void initialize(@Nullable View view)
|
||||
{
|
||||
// TODO: coming soon.
|
||||
Objects.requireNonNull(view);
|
||||
mRoomsView = view.findViewById(R.id.rooms);
|
||||
mAdultsView = view.findViewById(R.id.adults);
|
||||
mChildrenView = view.findViewById(R.id.children);
|
||||
mInfantsView = view.findViewById(R.id.infants);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void destroy()
|
||||
{
|
||||
// TODO: coming soon.
|
||||
// No op.
|
||||
}
|
||||
}
|
||||
|
|
|
@ -4,6 +4,7 @@ import androidx.annotation.NonNull;
|
|||
import androidx.annotation.Nullable;
|
||||
import com.mapswithme.maps.R;
|
||||
import com.mapswithme.maps.base.NoConnectionListener;
|
||||
import com.mapswithme.maps.search.FilterUtils;
|
||||
|
||||
public class MenuControllerFactory
|
||||
{
|
||||
|
@ -18,9 +19,11 @@ public class MenuControllerFactory
|
|||
}
|
||||
|
||||
@NonNull
|
||||
public static MenuController createGuestsRoomsMenuController()
|
||||
public static MenuController createGuestsRoomsMenuController(
|
||||
@NonNull MenuRoomsGuestsListener listener,
|
||||
@NonNull FilterUtils.RoomsGuestsCountProvider provider)
|
||||
{
|
||||
return new BottomSheetMenuController(R.id.guests_and_rooms_menu_sheet,
|
||||
new GuestsRoomsMenuRenderer(), null);
|
||||
new GuestsRoomsMenuRenderer(listener, provider), null);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -0,0 +1,9 @@
|
|||
package com.mapswithme.maps.widget.menu;
|
||||
|
||||
import androidx.annotation.NonNull;
|
||||
import com.mapswithme.maps.search.FilterUtils;
|
||||
|
||||
public interface MenuRoomsGuestsListener
|
||||
{
|
||||
void onRoomsGuestsApplied(@NonNull FilterUtils.RoomGuestCounts counts);
|
||||
}
|
Loading…
Add table
Reference in a new issue