mirror of
https://dev.azure.com/TeilRad/sharee.bike%20App/_git/Code
synced 2025-04-16 18:36:26 +02:00
168 lines
7.4 KiB
C#
168 lines
7.4 KiB
C#
using System;
|
|
using TINK.Model.Connector;
|
|
using TINK.Services.Geolocation;
|
|
using TINK.View;
|
|
using TINK.ViewModel.Bikes.Bike.CopriLock.RequestHandler;
|
|
using TINK.Model.User;
|
|
using Serilog;
|
|
using TINK.Model.Device;
|
|
using TINK.Model.Bike.CopriLock;
|
|
using TINK.Model.Bikes.Bike.CopriLock;
|
|
|
|
namespace TINK.ViewModel.Bikes.Bike.CopriLock
|
|
{
|
|
public static class RequestHandlerFactory
|
|
{
|
|
/// <summary> Creates a request handler.</summary>
|
|
/// <param name="selectedBike"></param>
|
|
/// <param name="isConnectedDelegate"></param>
|
|
/// <param name="connectorFactory"></param>
|
|
/// <param name="bikeRemoveDelegate"></param>
|
|
/// <param name="viewUpdateManager"></param>
|
|
/// <param name="smartDevice">Provides info about the smart device (phone, tablet, ...)</param>
|
|
/// <param name="viewService"></param>
|
|
/// <param name="bikesViewModel">View model to be used for progress report and unlocking/ locking view.</param>
|
|
/// <returns>Request handler.</returns>
|
|
public static BluetoothLock.IRequestHandler Create(
|
|
Model.Bikes.Bike.BC.IBikeInfoMutable selectedBike,
|
|
Func<bool> isConnectedDelegate,
|
|
Func<bool, IConnector> connectorFactory,
|
|
IGeolocation geolocation,
|
|
Func<IPollingUpdateTaskManager> viewUpdateManager,
|
|
ISmartDevice smartDevice,
|
|
IViewService viewService,
|
|
IBikesViewModel bikesViewModel,
|
|
IUser activeUser)
|
|
{
|
|
if (!(selectedBike is BikeInfoMutable selectedBluetoothLockBike))
|
|
return null;
|
|
|
|
switch (selectedBluetoothLockBike.State.Value)
|
|
{
|
|
case Model.State.InUseStateEnum.Disposable:
|
|
|
|
// Bike is reserved, selecte action depending on lock state.
|
|
switch (selectedBluetoothLockBike.LockInfo.State)
|
|
{
|
|
case LockingState.Closed:
|
|
// Unexepected state detected.
|
|
// This state is unexpected because connection is closed
|
|
// - when reservation is canceled or
|
|
// - when bike is returned.
|
|
Log.Error("Unexpected state {BookingState}/ {LockingState} detected.", selectedBluetoothLockBike.State.Value, selectedBluetoothLockBike.LockInfo.State);
|
|
return new DisposableClosed(
|
|
selectedBluetoothLockBike,
|
|
isConnectedDelegate,
|
|
connectorFactory,
|
|
geolocation,
|
|
viewUpdateManager,
|
|
smartDevice,
|
|
viewService,
|
|
bikesViewModel,
|
|
activeUser);
|
|
|
|
default:
|
|
return new DisposabledAway(
|
|
selectedBluetoothLockBike,
|
|
isConnectedDelegate,
|
|
connectorFactory,
|
|
geolocation,
|
|
viewUpdateManager,
|
|
smartDevice,
|
|
viewService,
|
|
bikesViewModel,
|
|
activeUser);
|
|
}
|
|
|
|
case Model.State.InUseStateEnum.Reserved:
|
|
|
|
// Bike is reserved, selecte action depending on lock state.
|
|
switch (selectedBluetoothLockBike.LockInfo.State)
|
|
{
|
|
case LockingState.Closed:
|
|
// Lock could not be opened after reserving bike.
|
|
return new ReservedClosed(
|
|
selectedBluetoothLockBike,
|
|
isConnectedDelegate,
|
|
connectorFactory,
|
|
geolocation,
|
|
viewUpdateManager,
|
|
smartDevice,
|
|
viewService,
|
|
bikesViewModel,
|
|
activeUser);
|
|
|
|
default:
|
|
return new ReservedClosed(
|
|
selectedBluetoothLockBike,
|
|
isConnectedDelegate,
|
|
connectorFactory,
|
|
geolocation,
|
|
viewUpdateManager,
|
|
smartDevice,
|
|
viewService,
|
|
bikesViewModel,
|
|
activeUser);
|
|
}
|
|
|
|
case Model.State.InUseStateEnum.Booked:
|
|
|
|
// Bike is booked, selecte action depending on lock state.
|
|
switch (selectedBluetoothLockBike.LockInfo.State)
|
|
{
|
|
case LockingState.Closed:
|
|
// Ride was paused.
|
|
return new BookedClosed(
|
|
selectedBluetoothLockBike,
|
|
isConnectedDelegate,
|
|
connectorFactory,
|
|
geolocation,
|
|
viewUpdateManager,
|
|
smartDevice,
|
|
viewService,
|
|
bikesViewModel,
|
|
activeUser);
|
|
|
|
case LockingState.Open:
|
|
// User wants to return bike/ pause ride.
|
|
return new BookedOpen(
|
|
selectedBluetoothLockBike,
|
|
isConnectedDelegate,
|
|
connectorFactory,
|
|
geolocation,
|
|
viewUpdateManager,
|
|
smartDevice,
|
|
viewService,
|
|
bikesViewModel,
|
|
activeUser);
|
|
|
|
default:
|
|
return new BookedDefault(
|
|
selectedBluetoothLockBike,
|
|
isConnectedDelegate,
|
|
connectorFactory,
|
|
geolocation,
|
|
viewUpdateManager,
|
|
smartDevice,
|
|
viewService,
|
|
bikesViewModel,
|
|
activeUser);
|
|
}
|
|
|
|
default:
|
|
// Unexpected copri state detected.
|
|
Log.Error("Unexpected locking {BookingState}/ {LockingState} detected.", selectedBluetoothLockBike.State.Value, selectedBluetoothLockBike.LockInfo.State);
|
|
return new DisposabledAway(
|
|
selectedBluetoothLockBike,
|
|
isConnectedDelegate,
|
|
connectorFactory,
|
|
geolocation,
|
|
viewUpdateManager,
|
|
smartDevice,
|
|
viewService,
|
|
bikesViewModel,
|
|
activeUser);
|
|
}
|
|
}
|
|
}
|
|
}
|