[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:
alexzatsepin 2020-08-18 14:57:25 +03:00 committed by Tatiana Yan
parent 207979d9f7
commit 0919cbb920
8 changed files with 212 additions and 22 deletions

View file

@ -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));
}
}

View file

@ -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();
}
}

View file

@ -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();

View file

@ -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

View file

@ -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

View file

@ -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.
}
}

View file

@ -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);
}
}

View file

@ -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);
}