Version 3.0.370

This commit is contained in:
Anja 2023-08-31 12:20:06 +02:00
parent f5cf9bb22f
commit bdb2dec1c1
233 changed files with 10252 additions and 6779 deletions

View file

@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android" android:installLocation="internalOnly" package="com.TeilRad.LastenradBayern" android:versionName="3.0.369" android:versionCode="369">
<manifest xmlns:android="http://schemas.android.com/apk/res/android" android:installLocation="internalOnly" package="com.TeilRad.LastenradBayern" android:versionName="3.0.370" android:versionCode="370">
<uses-sdk android:minSdkVersion="19" android:targetSdkVersion="33" />
<!-- Google Maps related permissions -->
<!-- Permission to receive remote notifications from Google Play Services -->

View file

@ -14,7 +14,7 @@ namespace TINK.Droid
{
[global::System.CodeDom.Compiler.GeneratedCodeAttribute("Xamarin.Android.Build.Tasks", "13.2.0.93")]
[global::System.CodeDom.Compiler.GeneratedCodeAttribute("Xamarin.Android.Build.Tasks", "13.2.1.111")]
public partial class Resource
{

View file

@ -56,8 +56,8 @@
<key>CFBundleDisplayName</key>
<string>LastenradBayern</string>
<key>CFBundleVersion</key>
<string>369</string>
<string>370</string>
<key>CFBundleShortVersionString</key>
<string>3.0.369</string>
<string>3.0.370</string>
</dict>
</plist>

View file

@ -270,9 +270,6 @@
<HintPath>..\..\..\..\.nuget\packages\xamarin.google.ios.maps\2.5.0\lib\Xamarin.iOS10\Google.Maps.dll</HintPath>
</Reference>
</ItemGroup>
<ItemGroup>
<BundleResource Include="Resources\tink2.png" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\..\LockItBLE\LockItBLE.csproj">
<Project>{bde9ce26-15cf-47da-a4f6-b6956d02d0fc}</Project>

View file

@ -1,4 +1,4 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="6245" systemVersion="13F34" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" initialViewController="X5k-f2-b5h">
<dependencies>
<plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="6238"/>
@ -42,6 +42,5 @@
<image name="Icon-76.png" width="76" height="76"/>
<image name="Icon-Small-40.png" width="40" height="40"/>
<image name="Icon-Small.png" width="29" height="29"/>
<image name="tink2.png" width="208" height="208"/>
</resources>
</document>
</document>

Binary file not shown.

Before

Width:  |  Height:  |  Size: 18 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 582 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 344 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 451 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1,004 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 356 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 804 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 283 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 399 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 500 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 886 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 322 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.2 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 457 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 396 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.1 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 388 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 997 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 352 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 488 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 622 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.6 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 600 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 965 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 338 KiB

View file

@ -20,11 +20,11 @@
<Label Text="{Binding LoggedInInfo}" />
<Label IsVisible="{Binding IsBookingStateInfoVisible}"
Text="{Binding BookingStateInfo}" />
<Button Text="{x:Static resources:AppResources.MessageAccountPageManagePersonalData}"
<Button Text="{x:Static resources:AppResources.MarkingAccountPageManagePersonalData}"
Command="{Binding OnManageAccount}"
IsEnabled="{Binding IsLogoutPossible}"/>
<Button
Text="{x:Static resources:AppResources.MessageAccountPageManageLogout}"
Text="{x:Static resources:AppResources.MarkingAccountPageManageLogout}"
Command="{Binding OnLogoutRequest}"
IsEnabled="{Binding IsLogoutPossible}"/>
</StackLayout>

View file

@ -24,6 +24,7 @@ namespace TINK.View.BikesAtStation
using TINK.ViewModel.Bikes;
using Xamarin.CommunityToolkit.Extensions;
using TINK.Model.Bikes.BikeInfoNS.DriveNS.BatteryNS;
using TINK.MultilingualResources;
[XamlCompilation(XamlCompilationOptions.Compile)]
#if USEFLYOUT
@ -110,7 +111,12 @@ namespace TINK.View.BikesAtStation
catch (Exception exception)
{
Log.ForContext<BikesAtStationPage>().Error("Displaying bikes at station page failed. {Exception}", exception);
await DisplayAlert("Fehler", $"Seite Räder an Station kann nicht angezeigt werden. ${exception.Message}", "OK");
await DisplayAlert(
AppResources.ErrorPageNotLoadedTitle,
$"{AppResources.ErrorPageNotLoaded}\r\n{exception.Message}",
AppResources.MessageAnswerOk);
isInitializationStarted = false;
return;
}

View file

@ -58,7 +58,7 @@
</StackLayout>
<!--Contact operator of selected station-->
<!--contact customer support of selected station-->
<StackLayout
IsVisible="{Binding IsOperatorInfoAvaliable}">

View file

@ -6,7 +6,7 @@
<Shell.TitleView>
<Grid ColumnDefinitions="Auto, 1*">
<Label Style="{StaticResource Label-Navbar}"
Text="{x:Static resources:AppResources.MessageAccountPageManagePersonalData}"/>
Text="{x:Static resources:AppResources.MarkingAccountPageManagePersonalData}"/>
</Grid>
</Shell.TitleView>
<ContentPage.Content>

View file

@ -5,6 +5,7 @@ using Serilog;
using TINK.Model;
using TINK.Model.Bikes.BikeInfoNS.DriveNS.BatteryNS;
using TINK.Model.Device;
using TINK.MultilingualResources;
using TINK.ViewModel.FindBike;
using Xamarin.CommunityToolkit.Extensions;
using Xamarin.Forms;
@ -65,7 +66,10 @@ namespace TINK.View.FindBike
catch (Exception exception)
{
Log.ForContext<FindBikePage>().Error("Displaying bikes at station page failed. {Exception}", exception);
await DisplayAlert("Fehler", $"Seite Fahrrad Wählen kann nicht angezeigt werden. ${exception.Message}", "OK");
await DisplayAlert(
AppResources.ErrorPageNotLoadedTitle,
$"{AppResources.ErrorPageNotLoaded}\r\n{exception.Message}",
AppResources.MessageAnswerOk);
return;
}

View file

@ -14,6 +14,7 @@ namespace TINK.View.MyBikes
using TINK.Model;
using TINK.Model.Bikes.BikeInfoNS.DriveNS.BatteryNS;
using TINK.Model.Device;
using TINK.MultilingualResources;
using TINK.ViewModel.MyBikes;
using Xamarin.CommunityToolkit.Extensions;
@ -78,7 +79,10 @@ namespace TINK.View.MyBikes
catch (Exception exception)
{
Log.ForContext<MyBikesPage>().Error("Displaying bikes at station page failed. {Exception}", exception);
await DisplayAlert("Fehler", $"Seite Räder an Station kann nicht angezeigt werden. ${exception.Message}", "OK");
await DisplayAlert(
AppResources.ErrorPageNotLoadedTitle,
$"{AppResources.ErrorPageNotLoaded}\r\n{exception.Message}",
AppResources.MessageAnswerOk);
isInitializationStarted = false;
return;
}

View file

@ -20,7 +20,7 @@ namespace TINK.Services.BluetoothLock.BLE
/// <summary> Manages a single lock.</summary>
public abstract class LockItBase : ILockService
{
/// <summary> Lenght of seed in bytes.</summary>
/// <summary> Length of seed in bytes.</summary>
private const int SEEDLENGTH = 16;
/// <summary> Timeout for open/ close operations.</summary>
@ -160,7 +160,7 @@ namespace TINK.Services.BluetoothLock.BLE
}
catch (System.Exception exception)
{
Log.ForContext<LockItBase>().Error("Getting activate lock charcteristic failed. {Exception}", exception);
Log.ForContext<LockItBase>().Error("Getting activate lock characteristic failed. {Exception}", exception);
throw new System.Exception($"Can not get activate characteristic. {exception.Message}", exception);
}
@ -184,7 +184,7 @@ namespace TINK.Services.BluetoothLock.BLE
}
catch (System.Exception exception)
{
Log.ForContext<LockItBase>().Error("Getting alarm-charcteristic failed. {Exception}", exception);
Log.ForContext<LockItBase>().Error("Getting alarm-characteristic failed. {Exception}", exception);
throw new System.Exception($"Can not get alarm characteristic. {exception.Message}", exception);
}
@ -207,7 +207,7 @@ namespace TINK.Services.BluetoothLock.BLE
}
catch (System.Exception exception)
{
Log.ForContext<LockItBase>().Error("Getting alarm settings charcteristic failed. {Exception}", exception);
Log.ForContext<LockItBase>().Error("Getting alarm settings characteristic failed. {Exception}", exception);
throw new System.Exception($"Can not get alarm settings characteristic. {exception.Message}", exception);
}
@ -229,7 +229,7 @@ namespace TINK.Services.BluetoothLock.BLE
}
catch (System.Exception exception)
{
Log.ForContext<LockItBase>().Error("Getting auth-charcteristic failed. {Exception}", exception);
Log.ForContext<LockItBase>().Error("Getting auth-characteristic failed. {Exception}", exception);
throw new System.Exception(string.Format("Can not get auth characteristic. {0}", exception.Message), exception);
}
@ -251,7 +251,7 @@ namespace TINK.Services.BluetoothLock.BLE
}
catch (System.Exception exception)
{
Log.ForContext<LockItBase>().Error("Getting state charcteristic failed. {Exception}", exception);
Log.ForContext<LockItBase>().Error("Getting state characteristic failed. {Exception}", exception);
throw new System.Exception(string.Format("Can not get state characteristic. {0}", exception.Message), exception);
}
@ -273,7 +273,7 @@ namespace TINK.Services.BluetoothLock.BLE
}
catch (System.Exception exception)
{
Log.ForContext<LockItBase>().Error("Getting sound charcteristic failed. {Exception}", exception);
Log.ForContext<LockItBase>().Error("Getting sound characteristic failed. {Exception}", exception);
throw new System.Exception($"Can not get sound characteristic. {exception.Message}", exception);
}
@ -295,7 +295,7 @@ namespace TINK.Services.BluetoothLock.BLE
}
catch (System.Exception exception)
{
Log.ForContext<LockItBase>().Error("Getting battery charcteristic failed. {Exception}", exception);
Log.ForContext<LockItBase>().Error("Getting battery characteristic failed. {Exception}", exception);
throw new System.Exception($"Can not get battery characteristic. {exception.Message}", exception);
}
@ -317,7 +317,7 @@ namespace TINK.Services.BluetoothLock.BLE
}
catch (System.Exception exception)
{
Log.ForContext<LockItBase>().Error("Getting versions info charcteristic failed. {Exception}", exception);
Log.ForContext<LockItBase>().Error("Getting versions info characteristic failed. {Exception}", exception);
throw new System.Exception(string.Format("Can not get versions info characteristic. {0}", exception.Message), exception);
}
@ -349,10 +349,10 @@ namespace TINK.Services.BluetoothLock.BLE
return;
}
/// <summary> Full idvertisement name.</summary>
/// <summary> Full advertisement name.</summary>
public string Name { get; private set; } = string.Empty;
/// <summary> Id part of idvertisement name.</summary>
/// <summary> Id part of advertisement name.</summary>
public int Id { get; private set; }
/// <summary> Query GUID of lock.</summary>
@ -603,12 +603,12 @@ namespace TINK.Services.BluetoothLock.BLE
LockInfoAuthTdo lockInfo,
ICipher cipher)
{
Log.ForContext<LockItBase>().Debug($"Request to autenticate for {lockIt.Name}.");
Log.ForContext<LockItBase>().Debug($"Request to authenticate for {lockIt.Name}.");
var authCharacteristic = await lockIt.GetAuthCharacteristicAsync();
if (authCharacteristic == null)
{
Log.ForContext<LockItBase>().Debug("Getting auth-charcteristic failed.");
Log.ForContext<LockItBase>().Debug("Getting auth-characteristic failed.");
throw new CoundntGetCharacteristicException("Authentication failed. Auth characteristic must not be null.");
}
@ -687,14 +687,14 @@ namespace TINK.Services.BluetoothLock.BLE
/// <summary> Gets the lock state like locking state (open/ close). </summary>
/// <param name="doWaitRetry">True if to wait and retry in case of failures. </param>
/// <remarks>
/// Lock state is first byte of of value read from state characteristic ("0000baaa-1212-efde-1523-785fef13d123").
/// Lock state is first byte of value read from state characteristic ("0000baaa-1212-efde-1523-785fef13d123").
/// Values are as follows
/// Open = 0x00,
/// Closed = 0x01,
/// Unknown = 0x02,
/// CouldntCloseMoving = 0x03,
/// CouldntOpenBoldBlocked = 0x04,
/// CouldntCloseBoldBlocked = 0x05
/// CouldntOpenBoltBlocked = 0x04,
/// CouldntCloseBoltBlocked = 0x05
/// TINK.Services.BluetoothLock.Tdo.LockitLockingState.
/// </remarks>
/// <returns> Lock state.</returns>
@ -750,6 +750,8 @@ namespace TINK.Services.BluetoothLock.BLE
}
byte[] state;
// Reads the lock state from characteristic
async Task<byte[]> readAsyncDelegate()
{
var cts = new CancellationTokenSource();
@ -786,11 +788,12 @@ namespace TINK.Services.BluetoothLock.BLE
throw new System.Exception("Can not get lock state. No data read");
}
int lockingState = state[0];
var lockInfoTdo = new LockInfoTdo.Builder
{
Id = Id,
Guid = Guid,
State = (LockitLockingState?)state[0]
State = Enum.IsDefined(typeof(LockitLockingState), lockingState) ? (LockitLockingState?) lockingState : null
}.Build();
Log.ForContext<LockItBase>().Debug("Retrieving lock state (ReadAsync-call) succeeded. {@LockInfoTdo}{StateCharacteristic}{Reading}",
@ -1251,6 +1254,6 @@ namespace TINK.Services.BluetoothLock.BLE
=> charcteristic.Id.ToString();
private static string ToSerilogString(byte[] byteArray)
=> "***"; // For debugging purposes it might be required to return string.Join(",", byteArray); Do not log any confidental value in production context.
=> "***"; // For debugging purposes it might be required to return string.Join(",", byteArray); Do not log any confidential value in production context.
}
}

View file

@ -147,7 +147,7 @@ namespace TINK.Services.BluetoothLock.BLE
Log.ForContext<LockItEventBased>().Information($"Lock was opened successfully.");
return lockingState.Value;
case LockitLockingState.CouldntOpenBoldBlocked:
case LockitLockingState.CouldntOpenBoltBlocked:
// Expected error. ILockIt count not be opened (Spoke blocks lock, ....)
Log.ForContext<LockItEventBased>().Debug($"Opening lock failed. Bold is blocked.");
throw new CouldntOpenBoldIsBlockedException();
@ -161,7 +161,7 @@ namespace TINK.Services.BluetoothLock.BLE
// Comprises values
// - LockitLockingState.Closed
// - LockitLockingState.Unknown
// - LockitLockingState.CouldntOpenBoldBlocked
// - LockitLockingState.CouldntOpenBoltBlocked
// Internal error which should never occur. Lock refuses to open but connection is ok.
Log.ForContext<LockItEventBased>().Debug($"Opening lock failed. Unexpected lock state {lockingState.Value.GetLockingState()} detected.");
throw new CouldntOpenInconsistentStateExecption(lockingState.Value.GetLockingState());
@ -256,10 +256,10 @@ namespace TINK.Services.BluetoothLock.BLE
switch (lockingState.Value)
{
case LockitLockingState.CouldntCloseBoldBlocked:
case LockitLockingState.CouldntCloseBoltBlocked:
// Expected error. ILockIt could not be closed (Spoke blocks lock, ....)
Log.ForContext<LockItEventBased>().Debug($"Closing lock failed. Bold is blocked.");
throw new CouldntCloseBoldBlockedException();
throw new CouldntCloseBoltBlockedException();
case LockitLockingState.CouldntCloseMoving:
// Expected error. ILockIt could not be closed (bike is moving)
@ -273,13 +273,13 @@ namespace TINK.Services.BluetoothLock.BLE
case LockitLockingState.Open:
// Expected error. ILockIt could not be closed. Bolt was blocked but was opened again.
Log.ForContext<LockItPolling>().Debug($"Closing lock failed. Bold is blocked but was reopened again.");
throw new CouldntCloseBoldBlockedException(LockingState.Open);
throw new CouldntCloseBoltBlockedException(LockingState.Open);
default:
// Comprises values
// - LockitLockingState.Open
// - LockitLockingState.Unknown
// - LockitLockingState.CouldntOpenBoldBlocked
// - LockitLockingState.CouldntOpenBoltBlocked
// Internal error which should never occur. Lock refuses to close but connection is ok.
Log.ForContext<LockItEventBased>().Debug($"Opening lock failed. Unexpected lock state {lockingState.Value.GetLockingState()} detected.");
throw new CouldntCloseInconsistentStateExecption(lockingState.Value.GetLockingState());

View file

@ -55,34 +55,35 @@ namespace TINK.Services.BluetoothLock.BLE
}
var info = await GetLockStateAsync();
if (info?.State == null)
if (!(info?.State is LockitLockingState initialLockingState))
{
// Device not reachable.
Log.ForContext<LockItPolling>().Information("Can not open lock. Device is not reachable (get state).");
return await Task.FromResult((LockitLockingState?)null);
}
if (info.State.Value.GetLockingState() == LockingState.Open)
if (initialLockingState.GetLockingState() == LockingState.Open)
{
// Lock is already open.
Log.ForContext<LockItPolling>().Information("No need to open lock. Lock is already open.");
return await Task.FromResult((LockitLockingState?)null);
}
Log.ForContext<LockItPolling>().Debug($"Request to open lock. Current locking state is {info}, counter value {ActivateLockWriteCounter}.");
// Send command to open to lock.
var result = await OpenCloseLockAsync(
true); // Close lock);
true /* Close lock*/ );
if (!result)
{
// State did not change. Return previous state.
Log.ForContext<LockItPolling>().Information($"Opening lock failed.");
return await Task.FromResult(info.State.Value);
return await Task.FromResult(initialLockingState);
}
info = await GetLockStateAsync();
if (info?.State == null)
var subsequentLockingStateNullable = (await GetLockStateAsync()).State;
if (subsequentLockingStateNullable == null)
{
// Device not reachable.
Log.ForContext<LockItPolling>().Information($"State after open command unknown. Device is not reachable (get state).");
@ -92,28 +93,28 @@ namespace TINK.Services.BluetoothLock.BLE
var watch = new Stopwatch();
watch.Start();
while (info?.State != null
&& info.State.Value != LockitLockingState.CouldntOpenBoldBlocked
&& info.State.Value != LockitLockingState.Open
while (subsequentLockingStateNullable != null
&& subsequentLockingStateNullable != LockitLockingState.CouldntOpenBoltBlocked
&& subsequentLockingStateNullable != LockitLockingState.Open
&& watch.Elapsed < TimeSpan.FromMilliseconds(OPEN_CLOSE_TIMEOUT_MS))
{
info = await GetLockStateAsync(true); // While opening lock seems not always respond to reading operations.
Log.ForContext<LockItPolling>().Debug($"Waiting for lock to open. Current lock state is {info?.State.Value}.");
subsequentLockingStateNullable = (await GetLockStateAsync(true)).State; // While opening lock seems not always respond to reading operations.
Log.ForContext<LockItPolling>().Debug($"Waiting for lock to open. Current lock state is {subsequentLockingStateNullable}.");
}
if (info == null)
if (!(subsequentLockingStateNullable is LockitLockingState subsequentLockingState))
{
Log.ForContext<LockItPolling>().Fatal($"Opening lock failed. State object is null.");
return null;
}
switch (info.State.Value)
switch (subsequentLockingState)
{
case LockitLockingState.Open:
Log.ForContext<LockItPolling>().Information($"Lock was opened successfully.");
return info.State.Value;
return subsequentLockingState;
case LockitLockingState.CouldntOpenBoldBlocked:
case LockitLockingState.CouldntOpenBoltBlocked:
// Expected error. ILockIt count not be opened (Spoke blocks lock, ....)
Log.ForContext<LockItPolling>().Debug($"Opening lock failed. Bold is blocked.");
throw new CouldntOpenBoldIsBlockedException();
@ -127,10 +128,10 @@ namespace TINK.Services.BluetoothLock.BLE
// Comprises values
// - LockitLockingState.Closed
// - LockitLockingState.CouldntCloseMoving (should never happen because command open was send)
// - LockitLockingState.CouldntCloseBoldBlocked (should never happen because command open was send)
// - LockitLockingState.CouldntCloseBoltBlocked (should never happen because command open was send)
// Internal error which should never occur. Lock refuses to open but connection is ok.
Log.ForContext<LockItPolling>().Debug($"Opening lock failed. Unexpected lock state {info.State.Value.GetLockingState()} detected.");
throw new CouldntOpenInconsistentStateExecption(info.State.Value.GetLockingState());
Log.ForContext<LockItPolling>().Debug($"Opening lock failed. Unexpected lock state {subsequentLockingState.GetLockingState()} detected.");
throw new CouldntOpenInconsistentStateExecption(subsequentLockingState.GetLockingState());
}
}
@ -145,33 +146,35 @@ namespace TINK.Services.BluetoothLock.BLE
// Get current state
var info = await GetLockStateAsync();
if (info?.State == null)
if (!(info?.State is LockitLockingState initialLockingState))
{
// Device not reachable.
Log.ForContext<LockItPolling>().Error("Can not close lock. Device is not reachable (get state).");
return await Task.FromResult((LockitLockingState?)null);
}
if (info.State.Value.GetLockingState() == LockingState.Closed)
if (initialLockingState.GetLockingState() == LockingState.Closed)
{
// Lock is already closed.
Log.ForContext<LockItPolling>().Error("No need to close lock. Lock is already closed.");
return await Task.FromResult(info.State.Value);
return await Task.FromResult(initialLockingState);
}
Log.ForContext<LockItPolling>().Debug($"Request to close lock. Current locking state is {info}, counter value {ActivateLockWriteCounter}.");
var result = await OpenCloseLockAsync(false); // Close lock
// Send command to close to lock.
var result = await OpenCloseLockAsync(
false /*Close lock*/);
if (!result)
{
// State did not change. Return previous state.
Log.ForContext<LockItPolling>().Information($"Closing lock failed.");
return await Task.FromResult(info.State.Value);
return await Task.FromResult(initialLockingState);
}
// Get lock state until either lock state chaneges or until log gets unreachable.
info = await GetLockStateAsync();
if (info?.State == null)
// Get lock state until either lock state changes or until log gets unreachable.
var subsequentLockingStateNullable = (await GetLockStateAsync()).State;
if (subsequentLockingStateNullable == null)
{
// Device not reachable.
Log.ForContext<LockItPolling>().Information($"Lock state after close command unknown.");
@ -182,14 +185,14 @@ namespace TINK.Services.BluetoothLock.BLE
watch.Start();
var hasBeenLocked = false;
while (info.State != null
&& info.State.Value != LockitLockingState.CouldntCloseMoving
&& info.State.Value != LockitLockingState.Closed
while (subsequentLockingStateNullable != null
&& subsequentLockingStateNullable != LockitLockingState.CouldntCloseMoving
&& subsequentLockingStateNullable != LockitLockingState.Closed
&& watch.Elapsed < TimeSpan.FromMilliseconds(OPEN_CLOSE_TIMEOUT_MS))
{
info = await GetLockStateAsync(true); ; // While closing lock seems not always respond to reading operations.
subsequentLockingStateNullable = (await GetLockStateAsync(true)).State; ; // While closing lock seems not always respond to reading operations.
if (info.State.Value == LockitLockingState.CouldntCloseBoldBlocked)
if (subsequentLockingStateNullable == LockitLockingState.CouldntCloseBoltBlocked)
{
// Lock reported a blocked bold.
hasBeenLocked = true;
@ -197,14 +200,14 @@ namespace TINK.Services.BluetoothLock.BLE
continue;
}
if (hasBeenLocked && info.State.Value == LockitLockingState.Open)
if (hasBeenLocked && subsequentLockingStateNullable == LockitLockingState.Open)
{
// ILockIt could not be closed. Bolt was blocked but was opened again.
Log.ForContext<LockItPolling>().Debug($"Closing lock failed. Bold was blocked and lock was reopened.");
throw new CouldntCloseBoldBlockedException(LockingState.Open);
throw new CouldntCloseBoltBlockedException(LockingState.Open);
}
Log.ForContext<LockItPolling>().Debug($"Waiting for lock to close. Current lock state is {info?.State.Value}.");
Log.ForContext<LockItPolling>().Debug($"Waiting for lock to close. Current lock state is {subsequentLockingStateNullable}.");
}
if (info == null)
@ -213,12 +216,19 @@ namespace TINK.Services.BluetoothLock.BLE
return null;
}
switch (info.State.Value)
if (!(subsequentLockingStateNullable is LockitLockingState subsequentLockingState))
{
case LockitLockingState.CouldntCloseBoldBlocked:
// Device not reachable.
Log.ForContext<LockItPolling>().Information($"Lock state after close command unknown.");
return await Task.FromResult((LockitLockingState?)null);
}
switch (subsequentLockingState)
{
case LockitLockingState.CouldntCloseBoltBlocked:
// Expected error. ILockIt could not be closed (Spoke blocks lock, ....)
Log.ForContext<LockItPolling>().Debug($"Closing lock failed. Bold is blocked.");
throw new CouldntCloseBoldBlockedException();
throw new CouldntCloseBoltBlockedException();
case LockitLockingState.CouldntCloseMoving:
// Expected error. ILockIt could not be closed (bike is moving)
@ -228,16 +238,16 @@ namespace TINK.Services.BluetoothLock.BLE
case LockitLockingState.Closed:
// Everything is ok.
Log.ForContext<LockItPolling>().Information($"Lock was closed successfully.");
return info.State.Value;
return subsequentLockingState;
default:
// Comprises values
// - LockitLockingState.Open
// - LockitLockingState.Unknown
// - LockitLockingState.CouldntOpenBoldBlocked
// - LockitLockingState.CouldntOpenBoltBlocked
// Internal error which should never occur. Lock refuses to close but connection is ok.
Log.ForContext<LockItPolling>().Debug($"Closing lock failed. Unexpected lock state {info.State.Value.GetLockingState()} detected.");
throw new CouldntCloseInconsistentStateExecption(info.State.Value.GetLockingState());
Log.ForContext<LockItPolling>().Debug($"Closing lock failed. Unexpected lock state {subsequentLockingState.GetLockingState()} detected.");
throw new CouldntCloseInconsistentStateExecption(subsequentLockingState.GetLockingState());
}
}
}

View file

@ -6,54 +6,57 @@
</header>
<body>
<group id="LOCKITSHARED/MULTILINGUALRESOURCES/RESOURCES.RESX" datatype="resx">
<trans-unit id="ErrorCloseLockUnexpectedState" translate="yes" xml:space="preserve">
<source>Unexpected locking state "{0}" detected after sending close command.</source>
<target state="translated">Unerwarteter Schlosszustand "{0}" gemeldet nach Ausführung des Abschließen-Befehls.</target>
<trans-unit id="LockItExceptionCloseLockUnknownPosition" translate="yes" xml:space="preserve">
<source>Lock reports unknown bold position. Lock could be closed or open. Please try again or contact customer support.</source>
<target state="translated">Das Schloss meldet unbekannte Position des Schlossbügels. Das Schloss könnte geschlossen oder offen sein. Bitte versuchen Sie es erneut oder melden Sie das Fahrrad dem Betreiber!</target>
</trans-unit>
<trans-unit id="ErrorCloseLockUnknownPosition" translate="yes" xml:space="preserve">
<source>Lock reports unknown bold position.</source>
<target state="translated">Schloss meldet unbekannten Schließzustand.</target>
<trans-unit id="LockItExceptionOpenLockUnexpectedState" translate="yes" xml:space="preserve">
<source>Unexpected locking state "{0}" detected after sending open command. Please try again or contact customer support.</source>
<target state="translated">Unerwarteter Schlosszustand "{0}" nach Ausführen des Öffnen-Befehls erkannt. Bitte versuchen Sie es erneut oder kontaktieren Sie den Kundensupport.</target>
</trans-unit>
<trans-unit id="ErrorOpenLockUnexpectedState" translate="yes" xml:space="preserve">
<source>Unexpected locking state "{0}" detected after sending open command.</source>
<target state="translated">Unerwarteter Schlosszustand "{0}" gemeldet nach Ausführen des Öffnen-Befehls.</target>
<trans-unit id="LockItExceptionBluetoothDisconnected" translate="yes" xml:space="preserve">
<source>Bluetooth connection to the lock could not be established. Activate Bluetooth and try again.</source>
<target state="translated">Es konnte keine Bluetooth-Verbindung zum Schloss hergestellt werden. Aktivieren Sie Bluetooth und versuchen Sie es erneut.</target>
</trans-unit>
<trans-unit id="ErrorBluetoothDisconnectedException" translate="yes" xml:space="preserve">
<source>No bluetooth connection.</source>
<target state="translated">Keine Bluetooth-Verbindung.</target>
<trans-unit id="LockItExceptionCloseLockMoving" translate="yes" xml:space="preserve">
<source>The process is motion sensitive. Step close to the lock, do not move, and try again.</source>
<target state="translated">Der Vorgang ist bewegungssensibel. Treten Sie nah an das Schloss heran, bewegen Sie sich nicht und versuchen Sie es erneut.</target>
</trans-unit>
<trans-unit id="ErrorCloseLockBikeMoving" translate="yes" xml:space="preserve">
<source>Bike is moving.</source>
<target state="translated">Rad ist in Bewegung.</target>
<trans-unit id="LockItExceptionOpenLockBoldWasBlocked" translate="yes" xml:space="preserve">
<source>Bolt was blocked. Make sure that no spoke presses against the lock bolt and try again.</source>
<target state="translated">Der Schlossbügel war blockiert. Stellen Sie sicher, dass keine Speiche oder anderer Gegenstand das Schloss blockiert und wiederholen Sie den Vorgang.</target>
</trans-unit>
<trans-unit id="ErrorCloseLockBoldBlocked" translate="yes" xml:space="preserve">
<source>Bold is blocked.</source>
<target state="translated">Schloss ist blockiert.</target>
<trans-unit id="LockItExceptionConnectLockBluetoothNotOnException" translate="yes" xml:space="preserve">
<source>Bluetooth connection to the lock could not be established. Current Blutooth status is {0}. Activate Bluetooth and try again.</source>
<target state="translated">Es kann keine Bluetooth-Verbindung hergestellt werden. Der aktuelle Blutooth-Status ist {0}. Aktivieren Sie Bluetooth und versuchen Sie es erneut.</target>
</trans-unit>
<trans-unit id="ErrorOpenLockBoldBlocked" translate="yes" xml:space="preserve">
<source>Bold is blocked.</source>
<target state="translated">Schloss ist blockiert.</target>
<trans-unit id="LockItExceptionConnectLockBluetoothOffException" translate="yes" xml:space="preserve">
<source>Bluetooth connection to the lock could not be established. Activate Bluetooth and try again.</source>
<target state="translated">Es kann keine Bluetooth-Verbindung hergestellt werden. Aktivieren Sie Bluetooth und versuchen Sie es erneut.</target>
</trans-unit>
<trans-unit id="ErrorOpenLockBoldWasBlocked" translate="yes" xml:space="preserve">
<source>Bold was or is blocked.</source>
<target state="needs-review-translation">Schloss war oder ist blockiert.</target>
<note from="MultilingualUpdate" annotates="source" priority="2">Please verify the translations accuracy as the source string was updated after it was translated.</note>
<trans-unit id="LockItExceptionConnectLockLocationOffException" translate="yes" xml:space="preserve">
<source>Connection to the lock could not be established. Activate Location services and try again.</source>
<target state="translated">Es konnte keine Verbindung zum Schloss hergestellt werden. Aktivieren Sie die Standortdienste und versuchen Sie es erneut.</target>
</trans-unit>
<trans-unit id="ErrorConnectLockBluetoothNotOnException" translate="yes" xml:space="preserve">
<source>Can not connect to lock. Unexpected bluetooth state {0} detected.</source>
<target state="translated">Kann keine Verbindung zum Schloss herstellen. Unerwarteter Bluetooth-Status {0} erkannt.</target>
<trans-unit id="LockItExceptionConnectLockLocationPermissingMissingException" translate="yes" xml:space="preserve">
<source>Connection to the lock could not be established. Grant Location permission, activate Location services and try again.</source>
<target state="translated">Es konnte keine Verbindung zum Schloss hergestellt werden. Erlauben Sie den Standort-Zugriff, aktivieren Sie die Standortdienste und versuchen Sie es erneut.</target>
</trans-unit>
<trans-unit id="ErrorConnectLockBluetoothOffException" translate="yes" xml:space="preserve">
<source>Can not connect to lock. Bluetooth is off but has to be turned on.</source>
<target state="translated">Kann keine Verbindung zum Schloss herstellen. Bluetooth ist aus und sollte aber angeschalten sein.</target>
<trans-unit id="LockItExceptionOpenLockBoldStatusIsUnknown" translate="yes" xml:space="preserve">
<source>Position of lock bolt is unknown. Lock could be closed or open. Please try again or contact customer support.</source>
<target state="translated">Position des Schlossbügels ist unbekannt. Schloss könnte geschlossen oder offen sein. Bitte versuchen Sie es erneut oder kontaktieren Sie den Kundensupport.</target>
</trans-unit>
<trans-unit id="ErrorConnectLockLocationOffException" translate="yes" xml:space="preserve">
<source>Can not connect to lock. Location is off but has to be turned on.</source>
<target state="translated">Kann keine Verbindung zum Schloss herstellen. Standortbestimmung ist deaktiviert, sollte aber aktiviert sein.</target>
<trans-unit id="LockItExceptionCloseLockBoltBlocked" translate="yes" xml:space="preserve">
<source>Lock bolt is blocked. Make sure that no spoke or any other obstacle prevents the lock from closing and try again.</source>
<target state="translated">Der Schlossbügel ist blockiert. Stellen Sie sicher, dass keine Speiche oder ein anderes Hindernis das Schließen des Schlosses verhindert, und versuchen Sie es erneut.</target>
</trans-unit>
<trans-unit id="ErrorConnectLockLocationPermissingMissingException" translate="yes" xml:space="preserve">
<source>Can not connect to lock. Location permission is required but not granted. </source>
<target state="translated">Kann keine Verbindung zum Schloss herstellen. Standort-Zugriffserlaubnis muss erteilt sein wurde aber nicht erteilt. </target>
<trans-unit id="LockItExceptionOpenLockBoltBlocked" translate="yes" xml:space="preserve">
<source>Lock bolt is blocked. Make sure that no spoke presses against the lock bolt and try again.</source>
<target state="translated">Der Schlossbügel ist blockiert. Stellen Sie sicher, dass keine Speiche gegen den Bügel drückt und versuchen Sie es erneut.</target>
</trans-unit>
<trans-unit id="LockItExceptionCloseLockUnexpectedLockState" translate="yes" xml:space="preserve">
<source>Unexpected locking state "{0}" detected after sending close command. Please try again or contact customer support.</source>
<target state="translated">Unerwarteter Schlosszustand "{0}" nach Senden des Schließbefehls festgestellt. Bitte versuchen Sie es erneut oder kontaktieren Sie den Kundensupport.</target>
</trans-unit>
</group>
</body>

View file

@ -19,7 +19,7 @@ namespace TINK.MultilingualResources {
// class via a tool like ResGen or Visual Studio.
// To add or remove a member, edit your .ResX file then rerun ResGen
// with the /str option, or rebuild your VS project.
[global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "16.0.0.0")]
[global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "17.0.0.0")]
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
[global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
internal class Resources {
@ -61,110 +61,119 @@ namespace TINK.MultilingualResources {
}
/// <summary>
/// Looks up a localized string similar to No bluetooth connection..
/// Looks up a localized string similar to Bluetooth connection to the lock could not be established. Activate Bluetooth and try again..
/// </summary>
internal static string ErrorBluetoothDisconnectedException {
internal static string LockItExceptionBluetoothDisconnected {
get {
return ResourceManager.GetString("ErrorBluetoothDisconnectedException", resourceCulture);
return ResourceManager.GetString("LockItExceptionBluetoothDisconnected", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Bike is moving..
/// Looks up a localized string similar to Lock bolt is blocked. Make sure that no spoke or any other obstacle prevents the lock from closing and try again..
/// </summary>
internal static string ErrorCloseLockBikeMoving {
internal static string LockItExceptionCloseLockBoltBlocked {
get {
return ResourceManager.GetString("ErrorCloseLockBikeMoving", resourceCulture);
return ResourceManager.GetString("LockItExceptionCloseLockBoltBlocked", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Bold is blocked..
/// Looks up a localized string similar to The process is motion sensitive. Step close to the lock, do not move, and try again..
/// </summary>
internal static string ErrorCloseLockBoldBlocked {
internal static string LockItExceptionCloseLockMoving {
get {
return ResourceManager.GetString("ErrorCloseLockBoldBlocked", resourceCulture);
return ResourceManager.GetString("LockItExceptionCloseLockMoving", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Unexpected locking state &quot;{0}&quot; detected after sending close command..
/// Looks up a localized string similar to Unexpected locking state &quot;{0}&quot; detected after sending close command. Please try again or contact customer support..
/// </summary>
internal static string ErrorCloseLockUnexpectedState {
internal static string LockItExceptionCloseLockUnexpectedLockState {
get {
return ResourceManager.GetString("ErrorCloseLockUnexpectedState", resourceCulture);
return ResourceManager.GetString("LockItExceptionCloseLockUnexpectedLockState", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Lock reports unknown bold position..
/// Looks up a localized string similar to Lock reports unknown bold position. Lock could be closed or open. Please try again or contact customer support..
/// </summary>
internal static string ErrorCloseLockUnknownPosition {
internal static string LockItExceptionCloseLockUnknownPosition {
get {
return ResourceManager.GetString("ErrorCloseLockUnknownPosition", resourceCulture);
return ResourceManager.GetString("LockItExceptionCloseLockUnknownPosition", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Can not connect to lock. Unexpected bluetooth state {0} detected..
/// Looks up a localized string similar to Bluetooth connection to the lock could not be established. Current Blutooth status is {0}. Activate Bluetooth and try again..
/// </summary>
internal static string ErrorConnectLockBluetoothNotOnException {
internal static string LockItExceptionConnectLockBluetoothNotOnException {
get {
return ResourceManager.GetString("ErrorConnectLockBluetoothNotOnException", resourceCulture);
return ResourceManager.GetString("LockItExceptionConnectLockBluetoothNotOnException", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Can not connect to lock. Bluetooth is off but has to be turned on..
/// Looks up a localized string similar to Bluetooth connection to the lock could not be established. Activate Bluetooth and try again..
/// </summary>
internal static string ErrorConnectLockBluetoothOffException {
internal static string LockItExceptionConnectLockBluetoothOffException {
get {
return ResourceManager.GetString("ErrorConnectLockBluetoothOffException", resourceCulture);
return ResourceManager.GetString("LockItExceptionConnectLockBluetoothOffException", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Can not connect to lock. Location is off but has to be turned on..
/// Looks up a localized string similar to Connection to the lock could not be established. Activate Location services and try again..
/// </summary>
internal static string ErrorConnectLockLocationOffException {
internal static string LockItExceptionConnectLockLocationOffException {
get {
return ResourceManager.GetString("ErrorConnectLockLocationOffException", resourceCulture);
return ResourceManager.GetString("LockItExceptionConnectLockLocationOffException", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Can not connect to lock. Location permission is required but not granted. .
/// Looks up a localized string similar to Connection to the lock could not be established. Grant Location permission, activate Location services and try again..
/// </summary>
internal static string ErrorConnectLockLocationPermissingMissingException {
internal static string LockItExceptionConnectLockLocationPermissingMissingException {
get {
return ResourceManager.GetString("ErrorConnectLockLocationPermissingMissingException", resourceCulture);
return ResourceManager.GetString("LockItExceptionConnectLockLocationPermissingMissingException", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Bold is blocked..
/// Looks up a localized string similar to Position of lock bolt is unknown. Lock could be closed or open. Please try again or contact customer support..
/// </summary>
internal static string ErrorOpenLockBoldIsBlocked {
internal static string LockItExceptionOpenLockBoldStatusIsUnknown {
get {
return ResourceManager.GetString("ErrorOpenLockBoldIsBlocked", resourceCulture);
return ResourceManager.GetString("LockItExceptionOpenLockBoldStatusIsUnknown", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Bold status is unknown..
/// Looks up a localized string similar to Bolt was blocked. Make sure that no spoke presses against the lock bolt and try again..
/// </summary>
internal static string ErrorOpenLockBoldStatusIsUnknown {
internal static string LockItExceptionOpenLockBoldWasBlocked {
get {
return ResourceManager.GetString("ErrorOpenLockBoldStatusIsUnknown", resourceCulture);
return ResourceManager.GetString("LockItExceptionOpenLockBoldWasBlocked", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Unexpected locking state &quot;{0}&quot; detected after sending open command..
/// Looks up a localized string similar to Lock bolt is blocked. Make sure that no spoke presses against the lock bolt and try again..
/// </summary>
internal static string ErrorOpenLockUnexpectedState {
internal static string LockItExceptionOpenLockBoltBlocked {
get {
return ResourceManager.GetString("ErrorOpenLockUnexpectedState", resourceCulture);
return ResourceManager.GetString("LockItExceptionOpenLockBoltBlocked", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Unexpected locking state &quot;{0}&quot; detected after sending open command. Please try again or contact customer support..
/// </summary>
internal static string LockItExceptionOpenLockUnexpectedState {
get {
return ResourceManager.GetString("LockItExceptionOpenLockUnexpectedState", resourceCulture);
}
}
}

View file

@ -12,40 +12,43 @@
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<data name="ErrorCloseLockUnexpectedState" xml:space="preserve">
<value>Unerwarteter Schlosszustand "{0}" gemeldet nach Ausführung des Abschließen-Befehls.</value>
<data name="LockItExceptionCloseLockUnknownPosition" xml:space="preserve">
<value>Das Schloss meldet unbekannte Position des Schlossbügels. Das Schloss könnte geschlossen oder offen sein. Bitte versuchen Sie es erneut oder melden Sie das Fahrrad dem Betreiber!</value>
</data>
<data name="ErrorCloseLockUnknownPosition" xml:space="preserve">
<value>Schloss meldet unbekannten Schließzustand.</value>
<data name="LockItExceptionOpenLockUnexpectedState" xml:space="preserve">
<value>Unerwarteter Schlosszustand "{0}" nach Ausführen des Öffnen-Befehls erkannt. Bitte versuchen Sie es erneut oder kontaktieren Sie den Kundensupport.</value>
</data>
<data name="ErrorOpenLockUnexpectedState" xml:space="preserve">
<value>Unerwarteter Schlosszustand "{0}" gemeldet nach Ausführen des Öffnen-Befehls.</value>
<data name="LockItExceptionBluetoothDisconnected" xml:space="preserve">
<value>Es konnte keine Bluetooth-Verbindung zum Schloss hergestellt werden. Aktivieren Sie Bluetooth und versuchen Sie es erneut.</value>
</data>
<data name="ErrorBluetoothDisconnectedException" xml:space="preserve">
<value>Keine Bluetooth-Verbindung.</value>
<data name="LockItExceptionCloseLockMoving" xml:space="preserve">
<value>Der Vorgang ist bewegungssensibel. Treten Sie nah an das Schloss heran, bewegen Sie sich nicht und versuchen Sie es erneut.</value>
</data>
<data name="ErrorCloseLockBikeMoving" xml:space="preserve">
<value>Rad ist in Bewegung.</value>
<data name="LockItExceptionOpenLockBoldWasBlocked" xml:space="preserve">
<value>Der Schlossbügel war blockiert. Stellen Sie sicher, dass keine Speiche oder anderer Gegenstand das Schloss blockiert und wiederholen Sie den Vorgang.</value>
</data>
<data name="ErrorCloseLockBoldBlocked" xml:space="preserve">
<value>Schloss ist blockiert.</value>
<data name="LockItExceptionConnectLockBluetoothNotOnException" xml:space="preserve">
<value>Es kann keine Bluetooth-Verbindung hergestellt werden. Der aktuelle Blutooth-Status ist {0}. Aktivieren Sie Bluetooth und versuchen Sie es erneut.</value>
</data>
<data name="ErrorOpenLockBoldBlocked" xml:space="preserve">
<value>Schloss ist blockiert.</value>
<data name="LockItExceptionConnectLockBluetoothOffException" xml:space="preserve">
<value>Es kann keine Bluetooth-Verbindung hergestellt werden. Aktivieren Sie Bluetooth und versuchen Sie es erneut.</value>
</data>
<data name="ErrorOpenLockBoldWasBlocked" xml:space="preserve">
<value>Schloss war oder ist blockiert.</value>
<data name="LockItExceptionConnectLockLocationOffException" xml:space="preserve">
<value>Es konnte keine Verbindung zum Schloss hergestellt werden. Aktivieren Sie die Standortdienste und versuchen Sie es erneut.</value>
</data>
<data name="ErrorConnectLockBluetoothNotOnException" xml:space="preserve">
<value>Kann keine Verbindung zum Schloss herstellen. Unerwarteter Bluetooth-Status {0} erkannt.</value>
<data name="LockItExceptionConnectLockLocationPermissingMissingException" xml:space="preserve">
<value>Es konnte keine Verbindung zum Schloss hergestellt werden. Erlauben Sie den Standort-Zugriff, aktivieren Sie die Standortdienste und versuchen Sie es erneut.</value>
</data>
<data name="ErrorConnectLockBluetoothOffException" xml:space="preserve">
<value>Kann keine Verbindung zum Schloss herstellen. Bluetooth ist aus und sollte aber angeschalten sein.</value>
<data name="LockItExceptionOpenLockBoldStatusIsUnknown" xml:space="preserve">
<value>Position des Schlossbügels ist unbekannt. Schloss könnte geschlossen oder offen sein. Bitte versuchen Sie es erneut oder kontaktieren Sie den Kundensupport.</value>
</data>
<data name="ErrorConnectLockLocationOffException" xml:space="preserve">
<value>Kann keine Verbindung zum Schloss herstellen. Standortbestimmung ist deaktiviert, sollte aber aktiviert sein.</value>
<data name="LockItExceptionCloseLockBoltBlocked" xml:space="preserve">
<value>Der Schlossbügel ist blockiert. Stellen Sie sicher, dass keine Speiche oder ein anderes Hindernis das Schließen des Schlosses verhindert, und versuchen Sie es erneut.</value>
</data>
<data name="ErrorConnectLockLocationPermissingMissingException" xml:space="preserve">
<value>Kann keine Verbindung zum Schloss herstellen. Standort-Zugriffserlaubnis muss erteilt sein wurde aber nicht erteilt. </value>
<data name="LockItExceptionOpenLockBoltBlocked" xml:space="preserve">
<value>Der Schlossbügel ist blockiert. Stellen Sie sicher, dass keine Speiche gegen den Bügel drückt und versuchen Sie es erneut.</value>
</data>
<data name="LockItExceptionCloseLockUnexpectedLockState" xml:space="preserve">
<value>Unerwarteter Schlosszustand "{0}" nach Senden des Schließbefehls festgestellt. Bitte versuchen Sie es erneut oder kontaktieren Sie den Kundensupport.</value>
</data>
</root>

View file

@ -117,40 +117,43 @@
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<data name="ErrorBluetoothDisconnectedException" xml:space="preserve">
<value>No bluetooth connection.</value>
<data name="LockItExceptionBluetoothDisconnected" xml:space="preserve">
<value>Bluetooth connection to the lock could not be established. Activate Bluetooth and try again.</value>
</data>
<data name="ErrorCloseLockBikeMoving" xml:space="preserve">
<value>Bike is moving.</value>
<data name="LockItExceptionCloseLockMoving" xml:space="preserve">
<value>The process is motion sensitive. Step close to the lock, do not move, and try again.</value>
</data>
<data name="ErrorCloseLockBoldBlocked" xml:space="preserve">
<value>Bold is blocked.</value>
<data name="LockItExceptionCloseLockBoltBlocked" xml:space="preserve">
<value>Lock bolt is blocked. Make sure that no spoke or any other obstacle prevents the lock from closing and try again.</value>
</data>
<data name="ErrorCloseLockUnexpectedState" xml:space="preserve">
<value>Unexpected locking state "{0}" detected after sending close command.</value>
<data name="LockItExceptionCloseLockUnexpectedLockState" xml:space="preserve">
<value>Unexpected locking state "{0}" detected after sending close command. Please try again or contact customer support.</value>
</data>
<data name="ErrorCloseLockUnknownPosition" xml:space="preserve">
<value>Lock reports unknown bold position.</value>
<data name="LockItExceptionCloseLockUnknownPosition" xml:space="preserve">
<value>Lock reports unknown bold position. Lock could be closed or open. Please try again or contact customer support.</value>
</data>
<data name="ErrorConnectLockBluetoothNotOnException" xml:space="preserve">
<value>Can not connect to lock. Unexpected bluetooth state {0} detected.</value>
<data name="LockItExceptionConnectLockBluetoothNotOnException" xml:space="preserve">
<value>Bluetooth connection to the lock could not be established. Current Blutooth status is {0}. Activate Bluetooth and try again.</value>
</data>
<data name="ErrorConnectLockBluetoothOffException" xml:space="preserve">
<value>Can not connect to lock. Bluetooth is off but has to be turned on.</value>
<data name="LockItExceptionConnectLockBluetoothOffException" xml:space="preserve">
<value>Bluetooth connection to the lock could not be established. Activate Bluetooth and try again.</value>
</data>
<data name="ErrorConnectLockLocationOffException" xml:space="preserve">
<value>Can not connect to lock. Location is off but has to be turned on.</value>
<data name="LockItExceptionConnectLockLocationOffException" xml:space="preserve">
<value>Connection to the lock could not be established. Activate Location services and try again.</value>
</data>
<data name="ErrorConnectLockLocationPermissingMissingException" xml:space="preserve">
<value>Can not connect to lock. Location permission is required but not granted. </value>
<data name="LockItExceptionConnectLockLocationPermissingMissingException" xml:space="preserve">
<value>Connection to the lock could not be established. Grant Location permission, activate Location services and try again.</value>
</data>
<data name="ErrorOpenLockBoldBlocked" xml:space="preserve">
<value>Bold is blocked.</value>
<data name="LockItExceptionOpenLockBoltBlocked" xml:space="preserve">
<value>Lock bolt is blocked. Make sure that no spoke presses against the lock bolt and try again.</value>
</data>
<data name="ErrorOpenLockBoldWasBlocked" xml:space="preserve">
<value>Bold was or is blocked.</value>
<data name="LockItExceptionOpenLockBoldStatusIsUnknown" xml:space="preserve">
<value>Position of lock bolt is unknown. Lock could be closed or open. Please try again or contact customer support.</value>
</data>
<data name="ErrorOpenLockUnexpectedState" xml:space="preserve">
<value>Unexpected locking state "{0}" detected after sending open command.</value>
<data name="LockItExceptionOpenLockBoldWasBlocked" xml:space="preserve">
<value>Bolt was blocked. Make sure that no spoke presses against the lock bolt and try again.</value>
</data>
<data name="LockItExceptionOpenLockUnexpectedState" xml:space="preserve">
<value>Unexpected locking state "{0}" detected after sending open command. Please try again or contact customer support.</value>
</data>
</root>

View file

@ -13,7 +13,7 @@ namespace TINK.Services.BluetoothLock.Exception
{
public BluetoothDisconnectedException() : base(
LockingState.UnknownDisconnected,
MultilingualResources.Resources.ErrorBluetoothDisconnectedException)
MultilingualResources.Resources.LockItExceptionBluetoothDisconnected)
{
}
}

View file

@ -10,8 +10,8 @@ namespace TINK.Services.BluetoothLock.Exception
/// </remarks>
public class ConnectBluetoothNotOnException : System.Exception
{
public ConnectBluetoothNotOnException() : base(Resources.ErrorConnectLockBluetoothOffException) { }
public ConnectBluetoothNotOnException() : base(Resources.LockItExceptionConnectLockBluetoothOffException) { }
public ConnectBluetoothNotOnException(object state) : base(string.Format(Resources.ErrorConnectLockBluetoothNotOnException, state.ToString())) { }
public ConnectBluetoothNotOnException(object state) : base(string.Format(Resources.LockItExceptionConnectLockBluetoothNotOnException, state.ToString())) { }
}
}

View file

@ -4,6 +4,6 @@ namespace TINK.Services.BluetoothLock.Exception
{
public class ConnectLocationOffException : System.Exception
{
public ConnectLocationOffException() : base(Resources.ErrorConnectLockLocationOffException) { }
public ConnectLocationOffException() : base(Resources.LockItExceptionConnectLockLocationOffException) { }
}
}

View file

@ -4,6 +4,6 @@ namespace TINK.Services.BluetoothLock.Exception
{
public class ConnectLocationPermissionMissingException : System.Exception
{
public ConnectLocationPermissionMissingException() : base(Resources.ErrorConnectLockLocationPermissingMissingException) { }
public ConnectLocationPermissionMissingException() : base(Resources.LockItExceptionConnectLockLocationPermissingMissingException) { }
}
}

View file

@ -2,7 +2,7 @@ using TINK.Model.Bikes.BikeInfoNS.BluetoothLock;
namespace TINK.Services.BluetoothLock.Exception
{
public class CouldntCloseBoldBlockedException : StateAwareException
public class CouldntCloseBoltBlockedException : StateAwareException
{
/// <summary>
/// Constructs a bold blocked exception.
@ -13,9 +13,9 @@ namespace TINK.Services.BluetoothLock.Exception
/// <param name="state">State of the lock while/ after bold blocked event.</param>
/// <remarks>
/// </remarks>
public CouldntCloseBoldBlockedException(LockingState state = LockingState.UnknownFromHardwareError) : base(
public CouldntCloseBoltBlockedException(LockingState state = LockingState.UnknownFromHardwareError) : base(
state,
MultilingualResources.Resources.ErrorCloseLockBoldBlocked)
MultilingualResources.Resources.LockItExceptionCloseLockBoltBlocked)
{
}
}

View file

@ -1,4 +1,4 @@

using TINK.Model.Bikes.BikeInfoNS.BluetoothLock;
using TINK.MultilingualResources;
@ -10,8 +10,8 @@ namespace TINK.Services.BluetoothLock.Exception
base(
state,
state != LockingState.UnknownFromHardwareError
? string.Format(Resources.ErrorCloseLockUnexpectedState, state)
: Resources.ErrorCloseLockUnknownPosition)
? string.Format(Resources.LockItExceptionCloseLockUnexpectedLockState, state)
: Resources.LockItExceptionCloseLockUnknownPosition)
{
}
}

View file

@ -1,4 +1,4 @@
using TINK.Model.Bikes.BikeInfoNS.BluetoothLock;
using TINK.Model.Bikes.BikeInfoNS.BluetoothLock;
namespace TINK.Services.BluetoothLock.Exception
{
@ -6,7 +6,7 @@ namespace TINK.Services.BluetoothLock.Exception
{
public CouldntCloseMovingException() : base(
LockingState.Open, // Locking bold is probable (according to haveltec) still open.
MultilingualResources.Resources.ErrorCloseLockBikeMoving)
MultilingualResources.Resources.LockItExceptionCloseLockMoving)
{
}
}

View file

@ -9,7 +9,7 @@ namespace TINK.Services.BluetoothLock.Exception
{
public CouldntOpenBoldIsBlockedException() : base(
LockingState.UnknownFromHardwareError,
MultilingualResources.Resources.ErrorOpenLockBoldIsBlocked)
MultilingualResources.Resources.LockItExceptionOpenLockBoltBlocked)
{
}
}

View file

@ -9,7 +9,7 @@ namespace TINK.Services.BluetoothLock.Exception
{
public CouldntOpenBoldStatusIsUnknownException() : base(
LockingState.UnknownFromHardwareError,
MultilingualResources.Resources.ErrorOpenLockBoldStatusIsUnknown)
MultilingualResources.Resources.LockItExceptionOpenLockBoldStatusIsUnknown)
{
}
}

View file

@ -1,4 +1,4 @@

using TINK.Model.Bikes.BikeInfoNS.BluetoothLock;
using TINK.MultilingualResources;
@ -9,7 +9,7 @@ namespace TINK.Services.BluetoothLock.Exception
public CouldntOpenInconsistentStateExecption(LockingState state) :
base(
state,
string.Format(Resources.ErrorOpenLockUnexpectedState, state))
string.Format(Resources.LockItExceptionOpenLockUnexpectedState, state))
{
}
}

View file

@ -1,7 +1,7 @@
namespace TINK.Services.BluetoothLock.Exception
namespace TINK.Services.BluetoothLock.Exception
{
/// <summary> Thrown whenever lock is out of reach.</summary>
/// <remarks> If fired when scan for devices does not result in lock beeing found.</remarks>
/// <remarks> If fired when scan for devices does not result in lock being found.</remarks>
public class OutOfReachException : System.Exception
{
}

View file

@ -1,4 +1,4 @@
using System;
using System;
using System.Collections.Generic;
using System.Linq;
using TINK.Services.BluetoothLock.Tdo;
@ -42,12 +42,12 @@ namespace TINK.Model.Bikes.BikeInfoNS.BluetoothLock
switch (lockingState)
{
case LockitLockingState.Unknown:
case LockitLockingState.CouldntOpenBoldBlocked: // Lock is closed in most cases, but this is not guarnteed according to haveltec.
case LockitLockingState.CouldntOpenBoltBlocked: // Lock is closed in most cases, but this is not guaranteed according to haveltec.
return LockingState.UnknownFromHardwareError;
case LockitLockingState.Open:
case LockitLockingState.CouldntCloseMoving:
case LockitLockingState.CouldntCloseBoldBlocked:
case LockitLockingState.CouldntCloseBoltBlocked:
return LockingState.Open;
case LockitLockingState.Closed:

View file

@ -13,9 +13,9 @@ namespace TINK.Services.BluetoothLock.Tdo
CouldntCloseMoving = 0x03,
CouldntOpenBoldBlocked = 0x04,
CouldntOpenBoltBlocked = 0x04,
CouldntCloseBoldBlocked = 0x05
CouldntCloseBoltBlocked = 0x05
}
/// <summary> Object holding info about bluetooth lock. </summary>

View file

@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android" android:installLocation="internalOnly" package="com.TeilRad.Meinkonrad" android:versionName="3.0.369" android:versionCode="369">
<manifest xmlns:android="http://schemas.android.com/apk/res/android" android:installLocation="internalOnly" package="com.TeilRad.Meinkonrad" android:versionName="3.0.370" android:versionCode="370">
<uses-sdk android:minSdkVersion="19" android:targetSdkVersion="33" />
<!-- Google Maps related permissions -->
<!-- Permission to receive remote notifications from Google Play Services -->

View file

@ -14,7 +14,7 @@ namespace TINK.Droid
{
[global::System.CodeDom.Compiler.GeneratedCodeAttribute("Xamarin.Android.Build.Tasks", "13.2.0.93")]
[global::System.CodeDom.Compiler.GeneratedCodeAttribute("Xamarin.Android.Build.Tasks", "13.2.1.111")]
public partial class Resource
{

View file

@ -56,8 +56,8 @@
<key>CFBundleDisplayName</key>
<string>Mein konrad</string>
<key>CFBundleVersion</key>
<string>369</string>
<string>370</string>
<key>CFBundleShortVersionString</key>
<string>3.0.369</string>
<string>3.0.370</string>
</dict>
</plist>

View file

@ -269,9 +269,6 @@
<HintPath>..\..\..\..\.nuget\packages\xamarin.google.ios.maps\2.5.0\lib\Xamarin.iOS10\Google.Maps.dll</HintPath>
</Reference>
</ItemGroup>
<ItemGroup>
<BundleResource Include="Resources\tink2.png" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\..\LockItBLE\LockItBLE.csproj">
<Project>{bde9ce26-15cf-47da-a4f6-b6956d02d0fc}</Project>

View file

@ -1,4 +1,4 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="6245" systemVersion="13F34" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" initialViewController="X5k-f2-b5h">
<dependencies>
<plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="6238"/>
@ -42,6 +42,5 @@
<image name="Icon-76.png" width="76" height="76"/>
<image name="Icon-Small-40.png" width="40" height="40"/>
<image name="Icon-Small.png" width="29" height="29"/>
<image name="tink2.png" width="208" height="208"/>
</resources>
</document>
</document>

View file

@ -31,6 +31,8 @@ using Arendi.BleLibrary.Local;
// Add ExportFont attribute
[assembly: ExportFont("Font Awesome 5 Free-Solid-900.otf", Alias = "FA-S")]
[assembly: ExportFont("Font Awesome 5 Brands-Regular-400.otf", Alias = "FA-B")]
[assembly: ExportFont("Font Awesome 5 Free-Regular-400.otf", Alias = "FA-R")]
namespace TINK
{

View file

@ -181,7 +181,6 @@
</EmbeddedResource>
</ItemGroup>
<ItemGroup>
<Folder Include="$(MSBuildThisFileDirectory)Resources\Fonts\" />
<Folder Include="$(MSBuildThisFileDirectory)View\BikesAtStation\" />
<Folder Include="$(MSBuildThisFileDirectory)View\FeesAndBikes\" />
<Folder Include="$(MSBuildThisFileDirectory)View\Login\" />
@ -323,4 +322,12 @@
<Generator>MSBuild:Compile</Generator>
</EmbeddedResource>
</ItemGroup>
<ItemGroup>
<EmbeddedResource Include="$(MSBuildThisFileDirectory)Resources\Fonts\Font Awesome 5 Brands-Regular-400.otf">
<Generator>MSBuild:Compile</Generator>
</EmbeddedResource>
<EmbeddedResource Include="$(MSBuildThisFileDirectory)Resources\Fonts\Font Awesome 5 Free-Regular-400.otf">
<Generator>MSBuild:Compile</Generator>
</EmbeddedResource>
</ItemGroup>
</Project>

View file

@ -49,13 +49,13 @@
Text="{Binding BookingStateInfo}" />
<Button
Text="{x:Static resources:AppResources.MessageAccountPageManagePersonalData}"
Text="{x:Static resources:AppResources.MarkingAccountPageManagePersonalData}"
Command="{Binding OnManageAccount}"
IsEnabled="{Binding IsLogoutPossible}"/>
<Button
Style="{StaticResource SecondaryButton}"
Text="{x:Static resources:AppResources.MessageAccountPageManageLogout}"
Text="{x:Static resources:AppResources.MarkingAccountPageManageLogout}"
Command="{Binding OnLogoutRequest}"
IsEnabled="{Binding IsLogoutPossible}"/>

View file

@ -1,12 +1,14 @@
<?xml version="1.0" encoding="utf-8" ?>
<ContentPage xmlns="http://xamarin.com/schemas/2014/forms"
<ContentPage
xmlns="http://xamarin.com/schemas/2014/forms"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
xmlns:xct="http://xamarin.com/schemas/2020/toolkit"
x:Class="TINK.View.BikesAtStation.BikesAtStationPage"
xmlns:rental_process="clr-namespace:TINK.ViewModel.Bikes;assembly=TINKLib"
xmlns:local_bike="clr-namespace:TINK.View.Bike"
xmlns:resources="clr-namespace:TINK.MultilingualResources;assembly=TINKLib"
xmlns:sharedGui="clr-namespace:ShareeSharedGuiLib.View"
xmlns:bikeRentalProcess="clr-namespace:ShareeSharedGuiLib.View.Bike.RentalProcess"
BackgroundColor="{DynamicResource background-color}"
Shell.FlyoutBehavior="Disabled"
Shell.NavBarIsVisible="{Binding IsIdle}">
<Shell.TitleView>
@ -21,6 +23,15 @@
<ContentPage.Resources>
<ResourceDictionary>
<local_bike:BikeViewCellTemplateSelector x:Key="bikeTemplateSelector"/>
<xct:MultiConverter x:Key="RentalProcessToVisibleConverter">
<xct:EnumToBoolConverter>
<xct:EnumToBoolConverter.TrueValues>
<rental_process:CurrentRentalProcess>CloseLock</rental_process:CurrentRentalProcess>
<rental_process:CurrentRentalProcess>EndRental</rental_process:CurrentRentalProcess>
</xct:EnumToBoolConverter.TrueValues>
</xct:EnumToBoolConverter>
<xct:InvertedBoolConverter />
</xct:MultiConverter>
</ResourceDictionary>
</ContentPage.Resources>
@ -28,8 +39,10 @@
<!--Grid for Bike(s) view and Running process in same row-->
<Grid>
<!-- Grid for Content -->
<!--BikesAtStationPage Content-->
<Grid
IsVisible="{Binding RentalProcess.State, Converter={StaticResource RentalProcessToVisibleConverter}}"
Grid.Row="0"
RowSpacing="0"
RowDefinitions="1*,Auto">
@ -41,7 +54,7 @@
<!--Station-->
<StackLayout
BackgroundColor="{DynamicResource secondary-back-title-color}"
BackgroundColor="{DynamicResource primary-back-title-color}"
IsVisible="{Binding IsIdle}"
Padding="20,0,20,0">
@ -189,6 +202,14 @@
IsVisible="{Binding IsProcessWithRunningProcessView}"
Grid.Row="0"/>
<!--CloseLock View-->
<bikeRentalProcess:RentalProcessBookedOpenCloseLock
Grid.Row="0"/>
<!--EndRental View-->
<bikeRentalProcess:RentalProcessBookedClosedEndRental
Grid.Row="0"/>
</Grid>
</ContentPage.Content>

View file

@ -24,6 +24,7 @@ namespace TINK.View.BikesAtStation
using TINK.ViewModel.Bikes;
using Xamarin.CommunityToolkit.Extensions;
using TINK.Model.Bikes.BikeInfoNS.DriveNS.BatteryNS;
using TINK.MultilingualResources;
[XamlCompilation(XamlCompilationOptions.Compile)]
#if USEFLYOUT
@ -111,7 +112,10 @@ namespace TINK.View.BikesAtStation
catch (Exception exception)
{
Log.ForContext<BikesAtStationPage>().Error("Displaying bikes at station page failed. {Exception}", exception);
await DisplayAlert("Fehler", $"Seite Räder an Station kann nicht angezeigt werden. ${exception.Message}", "OK");
await DisplayAlert(
AppResources.ErrorPageNotLoadedTitle,
$"{AppResources.ErrorPageNotLoaded}\r\n{exception.Message}",
AppResources.MessageAnswerOk);
isInitializationStarted = false;
return;
}

View file

@ -60,7 +60,7 @@
</StackLayout>
<!--Contact operator of selected station-->
<!--contact customer support of selected station-->
<StackLayout
IsVisible="{Binding IsOperatorInfoAvaliable}">

View file

@ -20,8 +20,9 @@
<!--Grid for Map with Buttons and Running process-->
<Grid
RowDefinitions="3,46,1*,32"
RowDefinitions="3,46,1*,Auto"
ColumnDefinitions="1*,Auto,1*"
RowSpacing="0"
IsEnabled="{Binding IsMapPageEnabled}"
VerticalOptions="FillAndExpand">
@ -119,10 +120,23 @@
Grid.ColumnSpan="3"
Text="{Binding StatusInfoText}"
IsVisible="{Binding Path=IsProcessWithRunningProcessView, Converter={StaticResource InvertedBoolConverter}}"
TextColor="White"
FontSize="Small"
HorizontalOptions="CenterAndExpand"
VerticalOptions="CenterAndExpand"/>
Padding="5"
TextColor="DimGray"
HorizontalOptions="CenterAndExpand">
<Label.Triggers>
<DataTrigger
TargetType="Label"
Binding="{Binding Path=StatusInfoText.Length}" Value="0">
<Setter Property="HeightRequest" Value="0" />
</DataTrigger>
<DataTrigger
TargetType="Label"
Binding="{Binding Path=StatusInfoText}" Value="Offline.">
<Setter Property="HeightRequest" Value="0" />
</DataTrigger>
</Label.Triggers>
</Label>
<!--While process is running-->
<sharedGui:RunningProcessView

View file

@ -7,7 +7,7 @@
<Grid ColumnDefinitions="Auto, 1*">
<Image Style="{StaticResource Image-Navbar}"/>
<Label Style="{StaticResource Label-Navbar}"
Text="{x:Static resources:AppResources.MessageAccountPageManagePersonalData}"/>
Text="{x:Static resources:AppResources.MarkingAccountPageManagePersonalData}"/>
</Grid>
</Shell.TitleView>
<Shell.BackButtonBehavior>

View file

@ -6,10 +6,12 @@
x:TypeArguments="local:FeedbackPopup+Result"
xmlns:sharedGui="clr-namespace:ShareeSharedGuiLib.View"
xmlns:resources="clr-namespace:TINK.MultilingualResources;assembly=TINKLib"
IsLightDismissEnabled="false"
x:Class="TINK.View.FeedbackPopup">
<xct:Popup.Resources>
<x:String x:Key="check_circle">&#xf058;</x:String>
<x:String x:Key="WriteFeedback">&#xf044;</x:String>
</xct:Popup.Resources>
<ScrollView
@ -20,95 +22,124 @@
<StackLayout
HorizontalOptions="FillAndExpand"
VerticalOptions="FillAndExpand"
Padding="0,0,0,300">
Padding="0,0,0,400">
<!-- Head and title -->
<StackLayout
Padding="20"
BackgroundColor="{DynamicResource primary-back-title-color}">
<Label
HorizontalTextAlignment="Center"
FontSize="Large"
TextColor="White"
Text="{x:Static resources:AppResources.MarkingReturnBikeMainMessage}"/>
<Image>
<!-- Head -->
<Grid
Padding="0,30,0,10"
ColumnDefinitions="10,Auto,1*,10"
ColumnSpacing="10"
HorizontalOptions="CenterAndExpand">
<!--icon-->
<Image
Grid.Column="1"
HorizontalOptions="End">
<Image.Source>
<FontImageSource Size="60" Glyph="{StaticResource check_circle}" FontFamily="FA-S" Color="White"/>
<FontImageSource
Glyph="{StaticResource WriteFeedback}"
FontFamily="FA-S"
Size="40"
Color="Black"/>
</Image.Source>
</Image>
</StackLayout>
<!--text-->
<Label
Grid.Column="2"
TextType="Html"
Text="{x:Static resources:AppResources.ActionGiveFeedback}"
FontSize="Large"
HorizontalOptions="StartAndExpand"
VerticalOptions="Center"
TextColor="Black"
Padding="0">
</Label>
</Grid>
<BoxView
Margin="20,0,20,10"
HeightRequest="1"
WidthRequest="400"
HorizontalOptions="Center"
Color="{DynamicResource primary-back-title-color}"/>
<!-- Content -->
<StackLayout
Margin="10"
Spacing="10">
<!-- Co2saving -->
<Frame
x:Name="Co2SavingFrame">
<Label
x:Name="Co2SavingLabel"
Text=""/>
</Frame>
<!-- Battery level -->
<sharedGui:BarLevelInputView
x:Name="BarLevelInputView"
HorizontalOptions="Center"/>
x:Name="BarLevelInputView"
HorizontalOptions="Center"/>
<!-- Is bike okay? -->
<Grid
ColumnDefinitions="*,Auto,Auto,Auto,*"
ColumnDefinitions="*,Auto,*"
RowDefinitions="Auto,Auto"
Margin="0,20,0,0">
<Label
<Grid
Grid.Column="1"
Grid.Row="0"
FontSize="Medium"
FontAttributes="Bold"
Text= "{x:Static resources:AppResources.MarkingReturnBikeBikeIsStateOkQuestion}">
</Label>
<Switch
Grid.Column="2"
Grid.Row="0"
ColumnDefinitions="1*,Auto,Auto">
<Label
Grid.Column="0"
FontAttributes="Bold"
HorizontalTextAlignment="End"
Text= "{x:Static resources:AppResources.MarkingReturnBikeBikeIsStateOkQuestion}">
</Label>
<Switch
Grid.Column="1"
VerticalOptions="Center"
HorizontalOptions="End"
x:Name="bikeIsOkSwitch"
IsToggled="True"/>
<Label
Grid.Column="3"
Grid.Row="0"
<Label
Grid.Column="2"
FontSize="Small"
VerticalOptions="Center"
HorizontalOptions="Start">
<Label.Triggers>
<DataTrigger TargetType="Label" Binding="{Binding Source={x:Reference bikeIsOkSwitch}, Path=IsToggled}" Value="False">
<Setter Property="Text" Value="{x:Static resources:AppResources.QuestionAnswerNo}"/>
</DataTrigger>
<DataTrigger TargetType="Label" Binding="{Binding Source={x:Reference bikeIsOkSwitch}, Path=IsToggled}" Value="True">
<Setter Property="Text" Value="{x:Static resources:AppResources.QuestionAnswerYes}"/>
</DataTrigger>
</Label.Triggers>
</Label>
<Label.Triggers>
<DataTrigger TargetType="Label" Binding="{Binding Source={x:Reference bikeIsOkSwitch}, Path=IsToggled}" Value="False">
<Setter Property="Text" Value="{x:Static resources:AppResources.MessageAnswerNo}"/>
</DataTrigger>
<DataTrigger TargetType="Label" Binding="{Binding Source={x:Reference bikeIsOkSwitch}, Path=IsToggled}" Value="True">
<Setter Property="Text" Value="{x:Static resources:AppResources.MessageAnswerYes}"/>
</DataTrigger>
</Label.Triggers>
</Label>
</Grid>
<!-- Text input bike is not OK -->
<Editor
<StackLayout Grid.Row="1"
Grid.Column="0"
Grid.ColumnSpan="5"
Grid.Row="1"
x:Name="feedbackMessage"
AutoSize="TextChanges"
Placeholder="{x:Static resources:AppResources.MarkingReturnBikeErrorDescriptionInputPlaceholder}"
Text=""
IsVisible="False">
<Editor.Triggers>
<DataTrigger TargetType="Editor"
Binding="{Binding Source={x:Reference bikeIsOkSwitch}, Path=IsToggled}"
Value="False">
Grid.ColumnSpan="3"
Padding="1"
BackgroundColor="{DynamicResource primary-back-title-color}">
<StackLayout.Triggers>
<DataTrigger TargetType="StackLayout"
Binding="{Binding Source={x:Reference bikeIsOkSwitch}, Path=IsToggled}"
Value="False">
<Setter Property="IsVisible" Value="True"/>
<Setter Property="Text" Value=""/>
<Setter Property="HeightRequest" Value="100"/>
</DataTrigger>
</Editor.Triggers>
</Editor>
<DataTrigger TargetType="StackLayout"
Binding="{Binding Source={x:Reference bikeIsOkSwitch}, Path=IsToggled}"
Value="True">
<Setter Property="IsVisible" Value="False"/>
<Setter Property="HeightRequest" Value="0"/>
</DataTrigger>
</StackLayout.Triggers>
<Editor
x:Name="feedbackMessage"
HeightRequest="100"
Placeholder="{x:Static resources:AppResources.MarkingReturnBikeErrorDescriptionInputPlaceholder}"
Text=""
BackgroundColor="White">
</Editor>
</StackLayout>
</Grid>

View file

@ -17,11 +17,6 @@ namespace TINK.View
{
InitializeComponent();
if (string.IsNullOrEmpty(co2Saving))
Co2SavingFrame.IsVisible = false;
else
Co2SavingLabel.Text = co2Saving;
if (battery == null
|| (battery.IsBackendAccessible.HasValue && battery.IsBackendAccessible.Value))
{

View file

@ -1,11 +1,15 @@
<?xml version="1.0" encoding="utf-8" ?>
<ContentPage xmlns="http://xamarin.com/schemas/2014/forms"
<ContentPage
xmlns="http://xamarin.com/schemas/2014/forms"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
xmlns:xct="http://xamarin.com/schemas/2020/toolkit"
x:Class="TINK.View.FindBike.FindBikePage"
xmlns:conv="clr-namespace:TINK.View"
xmlns:resources="clr-namespace:TINK.MultilingualResources;assembly=TINKLib"
xmlns:local_bike="clr-namespace:TINK.View.Bike"
xmlns:sharedGui="clr-namespace:ShareeSharedGuiLib.View"
xmlns:rental_process="clr-namespace:TINK.ViewModel.Bikes;assembly=TINKLib"
xmlns:bikeRentalProcess="clr-namespace:ShareeSharedGuiLib.View.Bike.RentalProcess"
BackgroundColor="{DynamicResource background-color}">
<Shell.TitleView>
@ -19,6 +23,15 @@
<ResourceDictionary>
<local_bike:BikeViewCellTemplateSelector x:Key="bikeTemplateSelector"/>
<conv:StringNotNullOrEmptyToVisibleConverter x:Key="Label_Converter"/>
<xct:MultiConverter x:Key="RentalProcessToVisibleConverter">
<xct:EnumToBoolConverter>
<xct:EnumToBoolConverter.TrueValues>
<rental_process:CurrentRentalProcess>CloseLock</rental_process:CurrentRentalProcess>
<rental_process:CurrentRentalProcess>EndRental</rental_process:CurrentRentalProcess>
</xct:EnumToBoolConverter.TrueValues>
</xct:EnumToBoolConverter>
<xct:InvertedBoolConverter />
</xct:MultiConverter>
</ResourceDictionary>
</ContentPage.Resources>
@ -29,9 +42,10 @@
<!-- Grid for Content -->
<Grid
RowDefinitions="1*,Auto"
IsVisible="{Binding RentalProcess.State, Converter={StaticResource RentalProcessToVisibleConverter}}"
Grid.Row="0"
RowSpacing="0"
Grid.Row="0">
RowDefinitions="1*,Auto">
<StackLayout
Grid.Row="0"
@ -40,37 +54,7 @@
<StackLayout
BackgroundColor="White"
Padding="20,5,20,0">
<!--Bike type-->
<StackLayout Orientation="Horizontal"
HorizontalOptions="Center"
IsVisible="{Binding ActiveFilteredBikeType, Converter={StaticResource Label_Converter}}"
Spacing="0">
<Label
TextColor="DimGray"
Text="{x:Static resources:AppResources.MarkingFindBikeTypeOfBikeText}"/>
<Label
TextColor="{DynamicResource primary-back-title-color}"
FontAttributes="Bold"
Text="{Binding ActiveFilteredBikeType}"/>
<Button
Command="{Binding ShowFilterBikeTypeInfoCommand}"
WidthRequest="24"
HeightRequest="24"
BackgroundColor="Transparent"
BorderWidth="0"
Padding="0"
Margin="5,0,0,0">
<Button.ImageSource>
<FontImageSource
Glyph="{StaticResource InfoCircle}"
Color="DimGray"
FontFamily="FA-S"
Size="20"/>
</Button.ImageSource>
</Button>
</StackLayout>
Padding="20,0,20,0">
<Grid
RowDefinitions="Auto,Auto"
@ -171,6 +155,14 @@
Grid.Row="0"
IsVisible="{Binding IsProcessWithRunningProcessView}"/>
<!--CloseLock View-->
<bikeRentalProcess:RentalProcessBookedOpenCloseLock
Grid.Row="0"/>
<!--EndRental View-->
<bikeRentalProcess:RentalProcessBookedClosedEndRental
Grid.Row="0"/>
</Grid>
</ContentPage.Content>

View file

@ -4,6 +4,7 @@ using System.Threading.Tasks;
using Serilog;
using TINK.Model.Bikes.BikeInfoNS.DriveNS.BatteryNS;
using TINK.Model.Device;
using TINK.MultilingualResources;
using TINK.ViewModel.FindBike;
using Xamarin.CommunityToolkit.Extensions;
using Xamarin.Forms;
@ -64,7 +65,10 @@ namespace TINK.View.FindBike
catch (Exception exception)
{
Log.ForContext<FindBikePage>().Error("Displaying bikes at station page failed. {Exception}", exception);
await DisplayAlert("Fehler", $"Seite Fahrrad Wählen kann nicht angezeigt werden. ${exception.Message}", "OK");
await DisplayAlert(
AppResources.ErrorPageNotLoadedTitle,
$"{AppResources.ErrorPageNotLoaded}\r\n{exception.Message}",
AppResources.MessageAnswerOk);
return;
}

View file

@ -2,13 +2,16 @@
<ContentPage
xmlns="http://xamarin.com/schemas/2014/forms"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
xmlns:xct="http://xamarin.com/schemas/2020/toolkit"
x:Class="TINK.View.MyBikes.MyBikesPage"
xmlns:resources="clr-namespace:TINK.MultilingualResources;assembly=TINKLib"
xmlns:sharedGui="clr-namespace:ShareeSharedGuiLib.View"
xmlns:rental_process="clr-namespace:TINK.ViewModel.Bikes;assembly=TINKLib"
xmlns:bikeRentalProcess="clr-namespace:ShareeSharedGuiLib.View.Bike.RentalProcess"
xmlns:local_bike="clr-namespace:TINK.View.Bike"
BackgroundColor="{DynamicResource background-color}"
Shell.FlyoutBehavior="{Binding FlyoutBehavior}"
>
Shell.NavBarIsVisible="{Binding IsIdle}">
<Shell.TitleView>
<Grid ColumnDefinitions="Auto, 1*">
@ -22,6 +25,15 @@
<ContentPage.Resources>
<ResourceDictionary>
<local_bike:BikeViewCellTemplateSelector x:Key="bikeTemplateSelector"/>
<xct:MultiConverter x:Key="RentalProcessToVisibleConverter">
<xct:EnumToBoolConverter>
<xct:EnumToBoolConverter.TrueValues>
<rental_process:CurrentRentalProcess>CloseLock</rental_process:CurrentRentalProcess>
<rental_process:CurrentRentalProcess>EndRental</rental_process:CurrentRentalProcess>
</xct:EnumToBoolConverter.TrueValues>
</xct:EnumToBoolConverter>
<xct:InvertedBoolConverter />
</xct:MultiConverter>
</ResourceDictionary>
</ContentPage.Resources>
@ -32,9 +44,10 @@
<!--Bike(s) view-->
<Grid
RowDefinitions="1*,Auto"
IsVisible="{Binding RentalProcess.State, Converter={StaticResource RentalProcessToVisibleConverter}}"
Grid.Row="0"
RowSpacing="0"
Grid.Row="0">
RowDefinitions="1*,Auto">
<StackLayout
Grid.Row="0"
@ -107,6 +120,14 @@
Grid.Row="0"
IsVisible="{Binding IsProcessWithRunningProcessView}"/>
<!--CloseLock View-->
<bikeRentalProcess:RentalProcessBookedOpenCloseLock
Grid.Row="0"/>
<!--EndRental View-->
<bikeRentalProcess:RentalProcessBookedClosedEndRental
Grid.Row="0"/>
</Grid>
</ContentPage.Content>

View file

@ -14,6 +14,7 @@ namespace TINK.View.MyBikes
using TINK.Model;
using TINK.Model.Bikes.BikeInfoNS.DriveNS.BatteryNS;
using TINK.Model.Device;
using TINK.MultilingualResources;
using TINK.ViewModel.MyBikes;
using Xamarin.CommunityToolkit.Extensions;
@ -78,7 +79,10 @@ namespace TINK.View.MyBikes
catch (Exception exception)
{
Log.ForContext<MyBikesPage>().Error("Displaying bikes at station page failed. {Exception}", exception);
await DisplayAlert("Fehler", $"Seite Räder an Station kann nicht angezeigt werden. ${exception.Message}", "OK");
await DisplayAlert(
AppResources.ErrorPageNotLoadedTitle,
$"{AppResources.ErrorPageNotLoaded}\r\n{exception.Message}",
AppResources.MessageAnswerOk);
isInitializationStarted = false;
return;
}

View file

@ -12,6 +12,10 @@
<EmbeddedResource Include="$(MSBuildThisFileDirectory)View\BarLevelView.xaml">
<Generator>MSBuild:UpdateDesignTimeXaml</Generator>
</EmbeddedResource>
<EmbeddedResource Include="$(MSBuildThisFileDirectory)View\Bike\RentalProcess\RentalProcessBookedOpenCloseLock.xaml">
<SubType>Designer</SubType>
<Generator>MSBuild:Compile</Generator>
</EmbeddedResource>
<EmbeddedResource Include="$(MSBuildThisFileDirectory)View\VersionNumberView.xaml">
<SubType>Designer</SubType>
<Generator>MSBuild:UpdateDesignTimeXaml</Generator>
@ -30,9 +34,32 @@
<DependentUpon>BarLevelView.xaml</DependentUpon>
<SubType>Code</SubType>
</Compile>
<Compile Include="$(MSBuildThisFileDirectory)View\Bike\RentalProcess\RentalProcess2StepsBar.xaml.cs">
<DependentUpon>RentalProcess2StepsBar.xaml</DependentUpon>
<SubType>Code</SubType>
</Compile>
<Compile Include="$(MSBuildThisFileDirectory)View\Bike\RentalProcess\RentalProcess3StepsBar.xaml.cs">
<DependentUpon>RentalProcess3StepsBar.xaml</DependentUpon>
<SubType>Code</SubType>
</Compile>
<Compile Include="$(MSBuildThisFileDirectory)View\Bike\RentalProcess\RentalProcessBikeInfo.xaml.cs">
<DependentUpon>RentalProcessBikeInfo.xaml</DependentUpon>
<SubType>Code</SubType>
</Compile>
<Compile Include="$(MSBuildThisFileDirectory)View\Bike\RentalProcess\RentalProcessStepBarFinished.xaml.cs">
<DependentUpon>RentalProcessStepBarFinished.xaml</DependentUpon>
<SubType>Code</SubType>
</Compile>
<Compile Include="$(MSBuildThisFileDirectory)View\HintForRefreshingPageView.xaml.cs">
<DependentUpon>HintForRefreshingPageView.xaml</DependentUpon>
</Compile>
<Compile Include="$(MSBuildThisFileDirectory)View\Bike\RentalProcess\RentalProcessBookedClosedEndRental.xaml.cs">
<DependentUpon>RentalProcessBookedClosedEndRental.xaml</DependentUpon>
<SubType>Code</SubType>
</Compile>
<Compile Include="$(MSBuildThisFileDirectory)View\Bike\RentalProcess\RentalProcessBookedOpenCloseLock.xaml.cs">
<DependentUpon>RentalProcessBookedOpenCloseLock.xaml</DependentUpon>
</Compile>
<Compile Include="$(MSBuildThisFileDirectory)View\NotConnectedToNetView.xaml.cs">
<DependentUpon>NotConnectedToNetView.xaml</DependentUpon>
</Compile>
@ -86,4 +113,34 @@
<Generator>MSBuild:Compile</Generator>
</EmbeddedResource>
</ItemGroup>
<ItemGroup>
<EmbeddedResource Include="$(MSBuildThisFileDirectory)View\Bike\RentalProcess\RentalProcessBookedClosedEndRental.xaml">
<SubType>Designer</SubType>
<Generator>MSBuild:Compile</Generator>
</EmbeddedResource>
</ItemGroup>
<ItemGroup>
<EmbeddedResource Include="$(MSBuildThisFileDirectory)View\Bike\RentalProcess\RentalProcess2StepsBar.xaml">
<SubType>Designer</SubType>
<Generator>MSBuild:UpdateDesignTimeXaml</Generator>
</EmbeddedResource>
</ItemGroup>
<ItemGroup>
<EmbeddedResource Include="$(MSBuildThisFileDirectory)View\Bike\RentalProcess\RentalProcess3StepsBar.xaml">
<SubType>Designer</SubType>
<Generator>MSBuild:UpdateDesignTimeXaml</Generator>
</EmbeddedResource>
</ItemGroup>
<ItemGroup>
<EmbeddedResource Include="$(MSBuildThisFileDirectory)View\Bike\RentalProcess\RentalProcessBikeInfo.xaml">
<SubType>Designer</SubType>
<Generator>MSBuild:UpdateDesignTimeXaml</Generator>
</EmbeddedResource>
</ItemGroup>
<ItemGroup>
<EmbeddedResource Include="$(MSBuildThisFileDirectory)View\Bike\RentalProcess\RentalProcessStepBarFinished.xaml">
<SubType>Designer</SubType>
<Generator>MSBuild:UpdateDesignTimeXaml</Generator>
</EmbeddedResource>
</ItemGroup>
</Project>

View file

@ -7,7 +7,9 @@
<ContentView.Content>
<StackLayout>
<Label
Text="{x:Static resources:AppResources.MarkingDriveBatteryTitel}"/>
Text="{x:Static resources:AppResources.MarkingDriveBatteryTitel}"
TextType="Html"
HorizontalOptions="CenterAndExpand"/>
<sharedGui:BarLevelView
x:Name="BarLevelElement"
HorizontalOptions="CenterAndExpand"

View file

@ -7,8 +7,8 @@
<!-- Nice battery images symbolizing filling level for batteries with 5 bars -->
<Image
x:Name="BarLevelImage"
WidthRequest="50"
HeightRequest="30"
WidthRequest="60"
HeightRequest="36"
Aspect="AspectFit"
HorizontalOptions="CenterAndExpand"
IsVisible="{Binding IsBatteryChargeLevelImageVisible}"

View file

@ -0,0 +1,313 @@
<?xml version="1.0" encoding="UTF-8"?>
<ContentView xmlns="http://xamarin.com/schemas/2014/forms"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
xmlns:conv="clr-namespace:TINK.View"
xmlns:sharedGui="clr-namespace:ShareeSharedGuiLib.View.Bike.RentalProcess"
xmlns:rental_process="clr-namespace:TINK.ViewModel.Bikes;assembly=TINKLib"
x:Class="ShareeSharedGuiLib.View.Bike.RentalProcess.RentalProcess2StepsBar">
<ContentView.Resources>
<conv:StringNotNullOrEmptyToVisibleConverter x:Key="StringNotNullOrEmpty_Converter"/>
<x:String x:Key="check">&#xf00c;</x:String>
<x:String x:Key="xmark">&#xf00d;</x:String>
</ContentView.Resources>
<ContentView.Content>
<Grid>
<!-- Progress bar finished-->
<Grid
Grid.Row="0"
IsVisible="False">
<Grid.Triggers>
<MultiTrigger TargetType="Grid">
<MultiTrigger.Conditions>
<BindingCondition Binding="{Binding RentalProcess.StepIndex}" Value="2" />
<BindingCondition Binding="{Binding RentalProcess.Result}" Value="{x:Static rental_process:CurrentStepStatus.Succeeded}" />
</MultiTrigger.Conditions>
<Setter Property="IsVisible" Value="True" />
</MultiTrigger>
</Grid.Triggers>
<sharedGui:RentalProcessStepBarFinished/>
</Grid>
<!-- 2 Steps Progress bar -->
<Grid
Grid.Row="0"
IsVisible="True"
ColumnDefinitions="*,*">
<Grid.Triggers>
<MultiTrigger TargetType="Grid">
<MultiTrigger.Conditions>
<BindingCondition Binding="{Binding RentalProcess.StepIndex}" Value="2" />
<BindingCondition Binding="{Binding RentalProcess.Result}" Value="{x:Static rental_process:CurrentStepStatus.Succeeded}" />
</MultiTrigger.Conditions>
<Setter Property="IsVisible" Value="False" />
</MultiTrigger>
</Grid.Triggers>
<!--1st step-->
<Grid
Grid.Column="0"
RowDefinitions="40,10"
RowSpacing="0">
<Frame
Grid.Row="0"
BackgroundColor="{DynamicResource process-step-upcoming}"
Padding="0">
<Frame.Triggers>
<MultiTrigger TargetType="Frame">
<MultiTrigger.Conditions>
<BindingCondition Binding="{Binding RentalProcess.StepIndex}" Value="1" />
</MultiTrigger.Conditions>
<Setter Property="BackgroundColor" Value="{DynamicResource process-step-active}" />
</MultiTrigger>
<MultiTrigger TargetType="Frame">
<MultiTrigger.Conditions>
<BindingCondition Binding="{Binding RentalProcess.StepIndex}" Value="1" />
<BindingCondition Binding="{Binding RentalProcess.Result}" Value="{x:Static rental_process:CurrentStepStatus.Succeeded}" />
</MultiTrigger.Conditions>
<Setter Property="BackgroundColor" Value="{DynamicResource process-step-succeeded}" />
</MultiTrigger>
<MultiTrigger TargetType="Frame">
<MultiTrigger.Conditions>
<BindingCondition Binding="{Binding RentalProcess.StepIndex}" Value="2" />
</MultiTrigger.Conditions>
<Setter Property="BackgroundColor" Value="{DynamicResource process-step-succeeded}" />
</MultiTrigger>
<MultiTrigger TargetType="Frame">
<MultiTrigger.Conditions>
<BindingCondition Binding="{Binding RentalProcess.StepIndex}" Value="1" />
<BindingCondition Binding="{Binding RentalProcess.Result}" Value="{x:Static rental_process:CurrentStepStatus.Failed}" />
</MultiTrigger.Conditions>
<Setter Property="BackgroundColor" Value="{DynamicResource process-step-failed}" />
</MultiTrigger>
</Frame.Triggers>
<StackLayout
Orientation="Horizontal"
HorizontalOptions="Center"
VerticalOptions="Center">
<Label
Text="1"
TextColor="White"
FontAttributes="Bold"/>
<Image
IsVisible="False">
<Image.Triggers>
<DataTrigger TargetType="Image" Binding="{Binding RentalProcess.StepIndex}" Value="1">
<Setter Property="IsVisible" Value="True" />
</DataTrigger>
<DataTrigger TargetType="Image" Binding="{Binding RentalProcess.StepIndex}" Value="2">
<Setter Property="IsVisible" Value="True" />
</DataTrigger>
<MultiTrigger TargetType="Image">
<MultiTrigger.Conditions>
<BindingCondition Binding="{Binding RentalProcess.StepIndex}" Value="1" />
<BindingCondition Binding="{Binding RentalProcess.Result}" Value="{x:Static rental_process:CurrentStepStatus.Succeeded}" />
</MultiTrigger.Conditions>
<Setter Property="Source">
<Setter.Value>
<FontImageSource
Glyph="{StaticResource check}"
FontFamily="FA-S"
Size="Small"
Color="White"/>
</Setter.Value>
</Setter>
</MultiTrigger>
<MultiTrigger TargetType="Image">
<MultiTrigger.Conditions>
<BindingCondition Binding="{Binding RentalProcess.StepIndex}" Value="2" />
</MultiTrigger.Conditions>
<Setter Property="Source">
<Setter.Value>
<FontImageSource
Glyph="{StaticResource check}"
FontFamily="FA-S"
Size="Small"
Color="White"/>
</Setter.Value>
</Setter>
</MultiTrigger>
<MultiTrigger TargetType="Image">
<MultiTrigger.Conditions>
<BindingCondition Binding="{Binding RentalProcess.StepIndex}" Value="1" />
<BindingCondition Binding="{Binding RentalProcess.Result}" Value="{x:Static rental_process:CurrentStepStatus.Failed}" />
</MultiTrigger.Conditions>
<Setter Property="Source">
<Setter.Value>
<FontImageSource
Glyph="{StaticResource xmark}"
FontFamily="FA-S"
Size="Small"
Color="White"/>
</Setter.Value>
</Setter>
</MultiTrigger>
</Image.Triggers>
</Image>
</StackLayout>
</Frame>
<Polygon
Grid.Row="1"
Points="0,0 20,0 10,10"
IsVisible="False"
HorizontalOptions="Center">
<Polygon.Triggers>
<MultiTrigger TargetType="Polygon">
<MultiTrigger.Conditions>
<BindingCondition Binding="{Binding RentalProcess.StepIndex}" Value="1" />
<BindingCondition Binding="{Binding RentalProcess.Result}" Value="{x:Static rental_process:CurrentStepStatus.None}"/>
</MultiTrigger.Conditions>
<Setter Property="IsVisible" Value="True" />
<Setter Property="Fill" Value="{DynamicResource process-step-active}" />
</MultiTrigger>
<MultiTrigger TargetType="Polygon">
<MultiTrigger.Conditions>
<BindingCondition Binding="{Binding RentalProcess.StepIndex}" Value="1" />
<BindingCondition Binding="{Binding RentalProcess.Result}" Value="{x:Static rental_process:CurrentStepStatus.Failed}"/>
</MultiTrigger.Conditions>
<Setter Property="IsVisible" Value="True" />
<Setter Property="Fill" Value="{DynamicResource process-step-failed}" />
</MultiTrigger>
<MultiTrigger TargetType="Polygon">
<MultiTrigger.Conditions>
<BindingCondition Binding="{Binding RentalProcess.StepIndex}" Value="1" />
<BindingCondition Binding="{Binding RentalProcess.Result}" Value="{x:Static rental_process:CurrentStepStatus.Succeeded}"/>
</MultiTrigger.Conditions>
<Setter Property="IsVisible" Value="False" />
</MultiTrigger>
</Polygon.Triggers>
</Polygon>
</Grid>
<!--2nd step-->
<Grid
Grid.Column="1"
RowDefinitions="40,10"
RowSpacing="0">
<Frame
Grid.Row="0"
BackgroundColor="{DynamicResource process-step-upcoming}"
Padding="0">
<Frame.Triggers>
<MultiTrigger TargetType="Frame">
<MultiTrigger.Conditions>
<BindingCondition Binding="{Binding RentalProcess.StepIndex}" Value="1" />
</MultiTrigger.Conditions>
<Setter Property="BackgroundColor" Value="{DynamicResource process-step-upcoming}" />
</MultiTrigger>
<MultiTrigger TargetType="Frame">
<MultiTrigger.Conditions>
<BindingCondition Binding="{Binding RentalProcess.StepIndex}" Value="2" />
</MultiTrigger.Conditions>
<Setter Property="BackgroundColor" Value="{DynamicResource process-step-active}" />
</MultiTrigger>
<MultiTrigger TargetType="Frame">
<MultiTrigger.Conditions>
<BindingCondition Binding="{Binding RentalProcess.StepIndex}" Value="2" />
<BindingCondition Binding="{Binding RentalProcess.Result}" Value="{x:Static rental_process:CurrentStepStatus.Succeeded}" />
</MultiTrigger.Conditions>
<Setter Property="BackgroundColor" Value="{DynamicResource process-step-succeeded}" />
</MultiTrigger>
<MultiTrigger TargetType="Frame">
<MultiTrigger.Conditions>
<BindingCondition Binding="{Binding RentalProcess.StepIndex}" Value="2" />
<BindingCondition Binding="{Binding RentalProcess.Result}" Value="{x:Static rental_process:CurrentStepStatus.Failed}" />
</MultiTrigger.Conditions>
<Setter Property="BackgroundColor" Value="{DynamicResource process-step-failed}" />
</MultiTrigger>
</Frame.Triggers>
<StackLayout
Orientation="Horizontal"
HorizontalOptions="Center"
VerticalOptions="Center">
<Label
Text="2"
TextColor="White"
FontAttributes="Bold"/>
<Image
IsVisible="False">
<Image.Triggers>
<DataTrigger TargetType="Image" Binding="{Binding RentalProcess.StepIndex}" Value="2">
<Setter Property="IsVisible" Value="True" />
</DataTrigger>
<MultiTrigger TargetType="Image">
<MultiTrigger.Conditions>
<BindingCondition Binding="{Binding RentalProcess.StepIndex}" Value="2" />
<BindingCondition Binding="{Binding RentalProcess.Result}" Value="{x:Static rental_process:CurrentStepStatus.Succeeded}" />
</MultiTrigger.Conditions>
<Setter Property="Source">
<Setter.Value>
<FontImageSource
Glyph="{StaticResource check}"
FontFamily="FA-S"
Size="Small"
Color="White"/>
</Setter.Value>
</Setter>
</MultiTrigger>
<MultiTrigger TargetType="Image">
<MultiTrigger.Conditions>
<BindingCondition Binding="{Binding RentalProcess.StepIndex}" Value="2" />
<BindingCondition Binding="{Binding RentalProcess.Result}" Value="{x:Static rental_process:CurrentStepStatus.Failed}" />
</MultiTrigger.Conditions>
<Setter Property="Source">
<Setter.Value>
<FontImageSource
Glyph="{StaticResource xmark}"
FontFamily="FA-S"
Size="Small"
Color="White"/>
</Setter.Value>
</Setter>
</MultiTrigger>
</Image.Triggers>
</Image>
</StackLayout>
</Frame>
<Polygon
Grid.Row="1"
Points="0,0 20,0 10,10"
IsVisible="False"
HorizontalOptions="Center">
<Polygon.Triggers>
<MultiTrigger TargetType="Polygon">
<MultiTrigger.Conditions>
<BindingCondition Binding="{Binding RentalProcess.StepIndex}" Value="2" />
<BindingCondition Binding="{Binding RentalProcess.Result}" Value="{x:Static rental_process:CurrentStepStatus.None}"/>
</MultiTrigger.Conditions>
<Setter Property="IsVisible" Value="True" />
<Setter Property="Fill" Value="{DynamicResource process-step-active}" />
</MultiTrigger>
<MultiTrigger TargetType="Polygon">
<MultiTrigger.Conditions>
<BindingCondition Binding="{Binding RentalProcess.StepIndex}" Value="2" />
<BindingCondition Binding="{Binding RentalProcess.Result}" Value="{x:Static rental_process:CurrentStepStatus.Failed}"/>
</MultiTrigger.Conditions>
<Setter Property="IsVisible" Value="True" />
<Setter Property="Fill" Value="{DynamicResource process-step-failed}" />
</MultiTrigger>
<MultiTrigger TargetType="Polygon">
<MultiTrigger.Conditions>
<BindingCondition Binding="{Binding RentalProcess.StepIndex}" Value="2" />
<BindingCondition Binding="{Binding RentalProcess.Result}" Value="{x:Static rental_process:CurrentStepStatus.Succeeded}"/>
</MultiTrigger.Conditions>
<Setter Property="IsVisible" Value="False" />
</MultiTrigger>
</Polygon.Triggers>
</Polygon>
</Grid>
</Grid>
</Grid>
</ContentView.Content>
</ContentView>

View file

@ -0,0 +1,20 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Xamarin.Forms;
using Xamarin.Forms.Xaml;
namespace ShareeSharedGuiLib.View.Bike.RentalProcess
{
[XamlCompilation(XamlCompilationOptions.Compile)]
public partial class RentalProcess2StepsBar : ContentView
{
public RentalProcess2StepsBar ()
{
InitializeComponent ();
}
}
}

View file

@ -0,0 +1,483 @@
<?xml version="1.0" encoding="UTF-8"?>
<ContentView xmlns="http://xamarin.com/schemas/2014/forms"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
xmlns:conv="clr-namespace:TINK.View"
xmlns:sharedGui="clr-namespace:ShareeSharedGuiLib.View.Bike.RentalProcess"
xmlns:rental_process="clr-namespace:TINK.ViewModel.Bikes;assembly=TINKLib"
x:Class="ShareeSharedGuiLib.View.Bike.RentalProcess.RentalProcess3StepsBar">
<ContentView.Resources>
<conv:StringNotNullOrEmptyToVisibleConverter x:Key="StringNotNullOrEmpty_Converter"/>
<x:String x:Key="check">&#xf00c;</x:String>
<x:String x:Key="xmark">&#xf00d;</x:String>
</ContentView.Resources>
<ContentView.Content>
<Grid>
<!-- Progress bar finished-->
<Grid
Grid.Row="0"
IsVisible="False">
<Grid.Triggers>
<MultiTrigger TargetType="Grid">
<MultiTrigger.Conditions>
<BindingCondition Binding="{Binding RentalProcess.StepIndex}" Value="3" />
<BindingCondition Binding="{Binding RentalProcess.Result}" Value="{x:Static rental_process:CurrentStepStatus.Succeeded}" />
</MultiTrigger.Conditions>
<Setter Property="IsVisible" Value="True" />
</MultiTrigger>
</Grid.Triggers>
<sharedGui:RentalProcessStepBarFinished/>
</Grid>
<!-- 3 Steps Progress bar -->
<Grid
Grid.Row="0"
IsVisible="True"
ColumnDefinitions="*,*,*">
<Grid.Triggers>
<MultiTrigger TargetType="Grid">
<MultiTrigger.Conditions>
<BindingCondition Binding="{Binding RentalProcess.StepIndex}" Value="3" />
<BindingCondition Binding="{Binding RentalProcess.Result}" Value="{x:Static rental_process:CurrentStepStatus.Succeeded}" />
</MultiTrigger.Conditions>
<Setter Property="IsVisible" Value="False" />
</MultiTrigger>
</Grid.Triggers>
<!--1st step-->
<Grid
Grid.Column="0"
RowDefinitions="40,10"
RowSpacing="0">
<Frame
Grid.Row="0"
BackgroundColor="{DynamicResource process-step-upcoming}"
Padding="0">
<Frame.Triggers>
<MultiTrigger TargetType="Frame">
<MultiTrigger.Conditions>
<BindingCondition Binding="{Binding RentalProcess.StepIndex}" Value="1" />
</MultiTrigger.Conditions>
<Setter Property="BackgroundColor" Value="{DynamicResource process-step-active}" />
</MultiTrigger>
<MultiTrigger TargetType="Frame">
<MultiTrigger.Conditions>
<BindingCondition Binding="{Binding RentalProcess.StepIndex}" Value="1" />
<BindingCondition Binding="{Binding RentalProcess.Result}" Value="{x:Static rental_process:CurrentStepStatus.Succeeded}" />
</MultiTrigger.Conditions>
<Setter Property="BackgroundColor" Value="{DynamicResource process-step-succeeded}" />
</MultiTrigger>
<MultiTrigger TargetType="Frame">
<MultiTrigger.Conditions>
<BindingCondition Binding="{Binding RentalProcess.StepIndex}" Value="2" />
</MultiTrigger.Conditions>
<Setter Property="BackgroundColor" Value="{DynamicResource process-step-succeeded}" />
</MultiTrigger>
<MultiTrigger TargetType="Frame">
<MultiTrigger.Conditions>
<BindingCondition Binding="{Binding RentalProcess.StepIndex}" Value="3" />
</MultiTrigger.Conditions>
<Setter Property="BackgroundColor" Value="{DynamicResource process-step-succeeded}" />
</MultiTrigger>
<MultiTrigger TargetType="Frame">
<MultiTrigger.Conditions>
<BindingCondition Binding="{Binding RentalProcess.StepIndex}" Value="1" />
<BindingCondition Binding="{Binding RentalProcess.Result}" Value="{x:Static rental_process:CurrentStepStatus.Failed}" />
</MultiTrigger.Conditions>
<Setter Property="BackgroundColor" Value="{DynamicResource process-step-failed}" />
</MultiTrigger>
</Frame.Triggers>
<StackLayout
Orientation="Horizontal"
HorizontalOptions="Center"
VerticalOptions="Center">
<Label
Text="1"
TextColor="White"
FontAttributes="Bold"/>
<Image
IsVisible="False">
<Image.Triggers>
<DataTrigger TargetType="Image" Binding="{Binding RentalProcess.StepIndex}" Value="1">
<Setter Property="IsVisible" Value="True" />
</DataTrigger>
<DataTrigger TargetType="Image" Binding="{Binding RentalProcess.StepIndex}" Value="2">
<Setter Property="IsVisible" Value="True" />
</DataTrigger>
<DataTrigger TargetType="Image" Binding="{Binding RentalProcess.StepIndex}" Value="3">
<Setter Property="IsVisible" Value="True" />
</DataTrigger>
<MultiTrigger TargetType="Image">
<MultiTrigger.Conditions>
<BindingCondition Binding="{Binding RentalProcess.StepIndex}" Value="1" />
<BindingCondition Binding="{Binding RentalProcess.Result}" Value="{x:Static rental_process:CurrentStepStatus.Succeeded}" />
</MultiTrigger.Conditions>
<Setter Property="Source">
<Setter.Value>
<FontImageSource
Glyph="{StaticResource check}"
FontFamily="FA-S"
Size="Small"
Color="White"/>
</Setter.Value>
</Setter>
</MultiTrigger>
<MultiTrigger TargetType="Image">
<MultiTrigger.Conditions>
<BindingCondition Binding="{Binding RentalProcess.StepIndex}" Value="2" />
</MultiTrigger.Conditions>
<Setter Property="Source">
<Setter.Value>
<FontImageSource
Glyph="{StaticResource check}"
FontFamily="FA-S"
Size="Small"
Color="White"/>
</Setter.Value>
</Setter>
</MultiTrigger>
<MultiTrigger TargetType="Image">
<MultiTrigger.Conditions>
<BindingCondition Binding="{Binding RentalProcess.StepIndex}" Value="3" />
</MultiTrigger.Conditions>
<Setter Property="Source">
<Setter.Value>
<FontImageSource
Glyph="{StaticResource check}"
FontFamily="FA-S"
Size="Small"
Color="White"/>
</Setter.Value>
</Setter>
</MultiTrigger>
<MultiTrigger TargetType="Image">
<MultiTrigger.Conditions>
<BindingCondition Binding="{Binding RentalProcess.StepIndex}" Value="1" />
<BindingCondition Binding="{Binding RentalProcess.Result}" Value="{x:Static rental_process:CurrentStepStatus.Failed}" />
</MultiTrigger.Conditions>
<Setter Property="Source">
<Setter.Value>
<FontImageSource
Glyph="{StaticResource xmark}"
FontFamily="FA-S"
Size="Small"
Color="White"/>
</Setter.Value>
</Setter>
</MultiTrigger>
</Image.Triggers>
</Image>
</StackLayout>
</Frame>
<Polygon
Grid.Row="1"
Points="0,0 20,0 10,10"
IsVisible="False"
HorizontalOptions="Center">
<Polygon.Triggers>
<MultiTrigger TargetType="Polygon">
<MultiTrigger.Conditions>
<BindingCondition Binding="{Binding RentalProcess.StepIndex}" Value="1" />
<BindingCondition Binding="{Binding RentalProcess.Result}" Value="{x:Static rental_process:CurrentStepStatus.None}"/>
</MultiTrigger.Conditions>
<Setter Property="IsVisible" Value="True" />
<Setter Property="Fill" Value="{DynamicResource process-step-active}" />
</MultiTrigger>
<MultiTrigger TargetType="Polygon">
<MultiTrigger.Conditions>
<BindingCondition Binding="{Binding RentalProcess.StepIndex}" Value="1" />
<BindingCondition Binding="{Binding RentalProcess.Result}" Value="{x:Static rental_process:CurrentStepStatus.Failed}"/>
</MultiTrigger.Conditions>
<Setter Property="IsVisible" Value="True" />
<Setter Property="Fill" Value="{DynamicResource process-step-failed}" />
</MultiTrigger>
<MultiTrigger TargetType="Polygon">
<MultiTrigger.Conditions>
<BindingCondition Binding="{Binding RentalProcess.StepIndex}" Value="1" />
<BindingCondition Binding="{Binding RentalProcess.Result}" Value="{x:Static rental_process:CurrentStepStatus.Succeeded}"/>
</MultiTrigger.Conditions>
<Setter Property="IsVisible" Value="False" />
</MultiTrigger>
</Polygon.Triggers>
</Polygon>
</Grid>
<!--2nd step-->
<Grid
Grid.Column="1"
RowDefinitions="40,10"
RowSpacing="0">
<Frame
Grid.Row="0"
BackgroundColor="{DynamicResource process-step-upcoming}"
Padding="0">
<Frame.Triggers>
<MultiTrigger TargetType="Frame">
<MultiTrigger.Conditions>
<BindingCondition Binding="{Binding RentalProcess.StepIndex}" Value="1" />
</MultiTrigger.Conditions>
<Setter Property="BackgroundColor" Value="{DynamicResource process-step-upcoming}" />
</MultiTrigger>
<MultiTrigger TargetType="Frame">
<MultiTrigger.Conditions>
<BindingCondition Binding="{Binding RentalProcess.StepIndex}" Value="2" />
</MultiTrigger.Conditions>
<Setter Property="BackgroundColor" Value="{DynamicResource process-step-active}" />
</MultiTrigger>
<MultiTrigger TargetType="Frame">
<MultiTrigger.Conditions>
<BindingCondition Binding="{Binding RentalProcess.StepIndex}" Value="2" />
<BindingCondition Binding="{Binding RentalProcess.Result}" Value="{x:Static rental_process:CurrentStepStatus.Succeeded}" />
</MultiTrigger.Conditions>
<Setter Property="BackgroundColor" Value="{DynamicResource process-step-succeeded}" />
</MultiTrigger>
<MultiTrigger TargetType="Frame">
<MultiTrigger.Conditions>
<BindingCondition Binding="{Binding RentalProcess.StepIndex}" Value="3" />
</MultiTrigger.Conditions>
<Setter Property="BackgroundColor" Value="{DynamicResource process-step-succeeded}" />
</MultiTrigger>
<MultiTrigger TargetType="Frame">
<MultiTrigger.Conditions>
<BindingCondition Binding="{Binding RentalProcess.StepIndex}" Value="2" />
<BindingCondition Binding="{Binding RentalProcess.Result}" Value="{x:Static rental_process:CurrentStepStatus.Failed}" />
</MultiTrigger.Conditions>
<Setter Property="BackgroundColor" Value="{DynamicResource process-step-failed}" />
</MultiTrigger>
</Frame.Triggers>
<StackLayout
Orientation="Horizontal"
HorizontalOptions="Center"
VerticalOptions="Center">
<Label
Text="2"
TextColor="White"
FontAttributes="Bold"/>
<Image
IsVisible="False">
<Image.Triggers>
<DataTrigger TargetType="Image" Binding="{Binding RentalProcess.StepIndex}" Value="2">
<Setter Property="IsVisible" Value="True" />
</DataTrigger>
<DataTrigger TargetType="Image" Binding="{Binding RentalProcess.StepIndex}" Value="3">
<Setter Property="IsVisible" Value="True" />
</DataTrigger>
<MultiTrigger TargetType="Image">
<MultiTrigger.Conditions>
<BindingCondition Binding="{Binding RentalProcess.StepIndex}" Value="2" />
<BindingCondition Binding="{Binding RentalProcess.Result}" Value="{x:Static rental_process:CurrentStepStatus.Succeeded}" />
</MultiTrigger.Conditions>
<Setter Property="Source">
<Setter.Value>
<FontImageSource
Glyph="{StaticResource check}"
FontFamily="FA-S"
Size="Small"
Color="White"/>
</Setter.Value>
</Setter>
</MultiTrigger>
<MultiTrigger TargetType="Image">
<MultiTrigger.Conditions>
<BindingCondition Binding="{Binding RentalProcess.StepIndex}" Value="3" />
</MultiTrigger.Conditions>
<Setter Property="Source">
<Setter.Value>
<FontImageSource
Glyph="{StaticResource check}"
FontFamily="FA-S"
Size="Small"
Color="White"/>
</Setter.Value>
</Setter>
</MultiTrigger>
<MultiTrigger TargetType="Image">
<MultiTrigger.Conditions>
<BindingCondition Binding="{Binding RentalProcess.StepIndex}" Value="2" />
<BindingCondition Binding="{Binding RentalProcess.Result}" Value="{x:Static rental_process:CurrentStepStatus.Failed}" />
</MultiTrigger.Conditions>
<Setter Property="Source">
<Setter.Value>
<FontImageSource
Glyph="{StaticResource xmark}"
FontFamily="FA-S"
Size="Small"
Color="White"/>
</Setter.Value>
</Setter>
</MultiTrigger>
</Image.Triggers>
</Image>
</StackLayout>
</Frame>
<Polygon
Grid.Row="1"
Points="0,0 20,0 10,10"
IsVisible="False"
HorizontalOptions="Center">
<Polygon.Triggers>
<MultiTrigger TargetType="Polygon">
<MultiTrigger.Conditions>
<BindingCondition Binding="{Binding RentalProcess.StepIndex}" Value="2" />
<BindingCondition Binding="{Binding RentalProcess.Result}" Value="{x:Static rental_process:CurrentStepStatus.None}"/>
</MultiTrigger.Conditions>
<Setter Property="IsVisible" Value="True" />
<Setter Property="Fill" Value="{DynamicResource process-step-active}" />
</MultiTrigger>
<MultiTrigger TargetType="Polygon">
<MultiTrigger.Conditions>
<BindingCondition Binding="{Binding RentalProcess.StepIndex}" Value="2" />
<BindingCondition Binding="{Binding RentalProcess.Result}" Value="{x:Static rental_process:CurrentStepStatus.Failed}"/>
</MultiTrigger.Conditions>
<Setter Property="IsVisible" Value="True" />
<Setter Property="Fill" Value="{DynamicResource process-step-failed}" />
</MultiTrigger>
<MultiTrigger TargetType="Polygon">
<MultiTrigger.Conditions>
<BindingCondition Binding="{Binding RentalProcess.StepIndex}" Value="2" />
<BindingCondition Binding="{Binding RentalProcess.Result}" Value="{x:Static rental_process:CurrentStepStatus.Succeeded}"/>
</MultiTrigger.Conditions>
<Setter Property="IsVisible" Value="False" />
</MultiTrigger>
</Polygon.Triggers>
</Polygon>
</Grid>
<!--3rd step-->
<Grid
Grid.Column="2"
RowDefinitions="40,10"
RowSpacing="0">
<Frame
Grid.Row="0"
BackgroundColor="{DynamicResource process-step-upcoming}"
Padding="0">
<Frame.Triggers>
<MultiTrigger TargetType="Frame">
<MultiTrigger.Conditions>
<BindingCondition Binding="{Binding RentalProcess.StepIndex}" Value="1" />
</MultiTrigger.Conditions>
<Setter Property="BackgroundColor" Value="{DynamicResource process-step-upcoming}" />
</MultiTrigger>
<MultiTrigger TargetType="Frame">
<MultiTrigger.Conditions>
<BindingCondition Binding="{Binding RentalProcess.StepIndex}" Value="2" />
</MultiTrigger.Conditions>
<Setter Property="BackgroundColor" Value="{DynamicResource process-step-upcoming}" />
</MultiTrigger>
<MultiTrigger TargetType="Frame">
<MultiTrigger.Conditions>
<BindingCondition Binding="{Binding RentalProcess.StepIndex}" Value="3" />
</MultiTrigger.Conditions>
<Setter Property="BackgroundColor" Value="{DynamicResource process-step-active}" />
</MultiTrigger>
<MultiTrigger TargetType="Frame">
<MultiTrigger.Conditions>
<BindingCondition Binding="{Binding RentalProcess.StepIndex}" Value="3" />
<BindingCondition Binding="{Binding RentalProcess.Result}" Value="{x:Static rental_process:CurrentStepStatus.Succeeded}" />
</MultiTrigger.Conditions>
<Setter Property="BackgroundColor" Value="{DynamicResource process-step-succeeded}" />
</MultiTrigger>
<MultiTrigger TargetType="Frame">
<MultiTrigger.Conditions>
<BindingCondition Binding="{Binding RentalProcess.StepIndex}" Value="3" />
<BindingCondition Binding="{Binding RentalProcess.Result}" Value="{x:Static rental_process:CurrentStepStatus.Failed}" />
</MultiTrigger.Conditions>
<Setter Property="BackgroundColor" Value="{DynamicResource process-step-failed}" />
</MultiTrigger>
</Frame.Triggers>
<StackLayout
Orientation="Horizontal"
HorizontalOptions="Center"
VerticalOptions="Center">
<Label
Text="3"
TextColor="White"
FontAttributes="Bold"/>
<Image
IsVisible="False">
<Image.Triggers>
<DataTrigger TargetType="Image" Binding="{Binding RentalProcess.StepIndex}" Value="3">
<Setter Property="IsVisible" Value="True" />
</DataTrigger>
<MultiTrigger TargetType="Image">
<MultiTrigger.Conditions>
<BindingCondition Binding="{Binding RentalProcess.StepIndex}" Value="3" />
<BindingCondition Binding="{Binding RentalProcess.Result}" Value="{x:Static rental_process:CurrentStepStatus.Succeeded}" />
</MultiTrigger.Conditions>
<Setter Property="Source">
<Setter.Value>
<FontImageSource
Glyph="{StaticResource check}"
FontFamily="FA-S"
Size="Small"
Color="White"/>
</Setter.Value>
</Setter>
</MultiTrigger>
<MultiTrigger TargetType="Image">
<MultiTrigger.Conditions>
<BindingCondition Binding="{Binding RentalProcess.StepIndex}" Value="3" />
<BindingCondition Binding="{Binding RentalProcess.Result}" Value="{x:Static rental_process:CurrentStepStatus.Failed}" />
</MultiTrigger.Conditions>
<Setter Property="Source">
<Setter.Value>
<FontImageSource
Glyph="{StaticResource xmark}"
FontFamily="FA-S"
Size="Small"
Color="White"/>
</Setter.Value>
</Setter>
</MultiTrigger>
</Image.Triggers>
</Image>
</StackLayout>
</Frame>
<Polygon
Grid.Row="1"
Points="0,0 20,0 10,10"
IsVisible="False"
HorizontalOptions="Center">
<Polygon.Triggers>
<MultiTrigger TargetType="Polygon">
<MultiTrigger.Conditions>
<BindingCondition Binding="{Binding RentalProcess.StepIndex}" Value="3" />
<BindingCondition Binding="{Binding RentalProcess.Result}" Value="{x:Static rental_process:CurrentStepStatus.None}"/>
</MultiTrigger.Conditions>
<Setter Property="IsVisible" Value="True" />
<Setter Property="Fill" Value="{DynamicResource process-step-active}" />
</MultiTrigger>
<MultiTrigger TargetType="Polygon">
<MultiTrigger.Conditions>
<BindingCondition Binding="{Binding RentalProcess.StepIndex}" Value="3" />
<BindingCondition Binding="{Binding RentalProcess.Result}" Value="{x:Static rental_process:CurrentStepStatus.Failed}"/>
</MultiTrigger.Conditions>
<Setter Property="IsVisible" Value="True" />
<Setter Property="Fill" Value="{DynamicResource process-step-failed}" />
</MultiTrigger>
<MultiTrigger TargetType="Polygon">
<MultiTrigger.Conditions>
<BindingCondition Binding="{Binding RentalProcess.StepIndex}" Value="3" />
<BindingCondition Binding="{Binding RentalProcess.Result}" Value="{x:Static rental_process:CurrentStepStatus.Succeeded}"/>
</MultiTrigger.Conditions>
<Setter Property="IsVisible" Value="False" />
</MultiTrigger>
</Polygon.Triggers>
</Polygon>
</Grid>
</Grid>
</Grid>
</ContentView.Content>
</ContentView>

View file

@ -0,0 +1,20 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Xamarin.Forms;
using Xamarin.Forms.Xaml;
namespace ShareeSharedGuiLib.View.Bike.RentalProcess
{
[XamlCompilation(XamlCompilationOptions.Compile)]
public partial class RentalProcess3StepsBar : ContentView
{
public RentalProcess3StepsBar ()
{
InitializeComponent ();
}
}
}

View file

@ -0,0 +1,62 @@
<?xml version="1.0" encoding="UTF-8"?>
<ContentView xmlns="http://xamarin.com/schemas/2014/forms"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
xmlns:conv="clr-namespace:TINK.View"
x:Class="ShareeSharedGuiLib.View.Bike.RentalProcess.RentalProcessBikeInfo">
<ContentView.Resources>
<conv:StringNotNullOrEmptyToVisibleConverter x:Key="StringNotNullOrEmpty_Converter"/>
</ContentView.Resources>
<ContentView.Content>
<!--Bike info-->
<Frame
Padding="20,30,20,30"
Margin="0,5,0,5"
HorizontalOptions="FillAndExpand"
BackgroundColor="White">
<Grid
ColumnDefinitions="Auto,*"
RowDefinitions="Auto,Auto"
RowSpacing="0">
<!-- Icon of the bike -->
<Image
Grid.Column="0"
Grid.Row="0"
Grid.RowSpan="2"
Source="{Binding BikeInRentalProcess.DisplayedBikeImageSourceString}"
HeightRequest="60"
Aspect="AspectFit"
HorizontalOptions="Start"
VerticalOptions="End"/>
<!-- Name of the bike -->
<Label
Grid.Column="1"
Grid.Row="0"
FontAttributes="Bold"
FontSize="Large"
HorizontalTextAlignment="Right"
IsVisible="{Binding BikeInRentalProcess.DisplayName, Converter={StaticResource StringNotNullOrEmpty_Converter}}"
Text="{Binding BikeInRentalProcess.DisplayName}"/>
<!-- Id of the bike -->
<Label
Grid.Column="1"
Grid.Row="1"
FontAttributes="Bold"
HorizontalTextAlignment="Right"
VerticalTextAlignment="Start"
IsVisible="{Binding BikeInRentalProcess.DisplayId, Converter={StaticResource StringNotNullOrEmpty_Converter}}"
Text="{Binding BikeInRentalProcess.DisplayId}"/>
</Grid>
</Frame>
</ContentView.Content>
</ContentView>

View file

@ -0,0 +1,20 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Xamarin.Forms;
using Xamarin.Forms.Xaml;
namespace ShareeSharedGuiLib.View.Bike.RentalProcess
{
[XamlCompilation(XamlCompilationOptions.Compile)]
public partial class RentalProcessBikeInfo : ContentView
{
public RentalProcessBikeInfo ()
{
InitializeComponent ();
}
}
}

View file

@ -0,0 +1,219 @@
<?xml version="1.0" encoding="UTF-8"?>
<ContentView xmlns="http://xamarin.com/schemas/2014/forms"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
xmlns:conv="clr-namespace:TINK.View"
xmlns:rental_process="clr-namespace:TINK.ViewModel.Bikes;assembly=TINKLib"
xmlns:resources="clr-namespace:TINK.MultilingualResources;assembly=TINKLib"
xmlns:sharedGui="clr-namespace:ShareeSharedGuiLib.View.Bike.RentalProcess"
x:Class="ShareeSharedGuiLib.View.Bike.RentalProcess.RentalProcessBookedClosedEndRental"
IsVisible="False">
<ContentView.Triggers>
<DataTrigger TargetType="ContentView"
Binding="{Binding RentalProcess.State}"
Value="{x:Static rental_process:CurrentRentalProcess.EndRental}">
<Setter Property="IsVisible" Value="True" />
</DataTrigger>
<DataTrigger TargetType="ContentView"
Binding="{Binding RentalProcess.State}"
Value="{x:Static rental_process:CurrentRentalProcess.CloseLock}">
<Setter Property="IsVisible" Value="False" />
<Setter Property="HeightRequest" Value="0"/>
</DataTrigger>
</ContentView.Triggers>
<ContentView.Resources>
<conv:StringNotNullOrEmptyToVisibleConverter x:Key="StringNotNullOrEmpty_Converter"/>
<x:String x:Key="Triangle">&#xf071;</x:String>
<x:String x:Key="LocationServiceSymbol">&#xf3c5;</x:String>
<x:String x:Key="Upload">&#xf382;</x:String>
<x:String x:Key="WriteFeedback">&#xf044;</x:String>
</ContentView.Resources>
<ContentView.Content>
<Frame
Grid.Row="0"
HorizontalOptions="FillAndExpand"
VerticalOptions="FillAndExpand"
BackgroundColor="White"
Padding="0"
Margin="0">
<Grid RowDefinitions="60,Auto,Auto,1*"
RowSpacing="0">
<!-- Title of rental process-->
<Frame Grid.Row="0"
HorizontalOptions="FillAndExpand"
VerticalOptions="FillAndExpand"
BackgroundColor="{DynamicResource primary-back-title-color}"
Padding="0"
Margin="0">
<Label
Text="{x:Static resources:AppResources.ActionReturn}"
FontSize="Large"
TextColor="White"
HorizontalOptions="Center"
VerticalOptions="Center"/>
</Frame>
<!--Bike info-->
<sharedGui:RentalProcessBikeInfo Grid.Row="1"/>
<!-- Progress bar -->
<sharedGui:RentalProcess3StepsBar Grid.Row="2"/>
<!--EndRental Content-->
<Grid Grid.Row="3"
RowSpacing="10"
RowDefinitions="Auto,1*,Auto"
Margin="0,40,0,20">
<Grid.Triggers>
<MultiTrigger TargetType="Grid">
<MultiTrigger.Conditions>
<BindingCondition Binding="{Binding RentalProcess.StepIndex}" Value="2" />
</MultiTrigger.Conditions>
<Setter Property="IsVisible" Value="False"/>
<Setter Property="HeightRequest" Value="0"/>
</MultiTrigger>
<MultiTrigger TargetType="Grid">
<MultiTrigger.Conditions>
<BindingCondition Binding="{Binding RentalProcess.StepIndex}" Value="3" />
<BindingCondition Binding="{Binding RentalProcess.Result}" Value="{x:Static rental_process:CurrentStepStatus.Succeeded}" />
</MultiTrigger.Conditions>
<Setter Property="IsVisible" Value="False"/>
<Setter Property="HeightRequest" Value="0"/>
</MultiTrigger>
</Grid.Triggers>
<!--Step icon and Step text-->
<Grid Grid.Row="0"
Padding="30,0,0,0"
ColumnDefinitions="20,Auto,1*,20"
ColumnSpacing="10"
HorizontalOptions="CenterAndExpand">
<!--Step icon-->
<Image
Grid.Column="1"
HorizontalOptions="End">
<Image.Triggers>
<MultiTrigger TargetType="Image">
<MultiTrigger.Conditions>
<BindingCondition Binding="{Binding RentalProcess.StepIndex}" Value="1" />
</MultiTrigger.Conditions>
<Setter Property="Source">
<Setter.Value>
<FontImageSource
Glyph="{StaticResource LocationServiceSymbol}"
FontFamily="FA-S"
Size="40"
Color="Black"/>
</Setter.Value>
</Setter>
</MultiTrigger>
<MultiTrigger TargetType="Image">
<MultiTrigger.Conditions>
<BindingCondition Binding="{Binding RentalProcess.StepIndex}" Value="3" />
</MultiTrigger.Conditions>
<Setter Property="Source">
<Setter.Value>
<FontImageSource
Glyph="{StaticResource Upload}"
FontFamily="FA-S"
Size="40"
Color="Black"/>
</Setter.Value>
</Setter>
</MultiTrigger>
</Image.Triggers>
</Image>
<!--Step text-->
<Label
Grid.Column="2"
TextType="Html"
Text="{Binding RentalProcess.StepInfoText}"
FontSize="Large"
HorizontalOptions="StartAndExpand"
VerticalOptions="Center"
TextColor="Black"
Padding="0">
</Label>
</Grid>
<!--Spinner & Info text-->
<StackLayout Grid.Row="1"
Margin="30,30,30,0"
Spacing="30"
IsVisible="True">
<!--Spinner-->
<ActivityIndicator
IsRunning="{Binding IsProcessWithRunningProcessView}"
Scale="2"
HorizontalOptions="Center"
Color="{x:DynamicResource primary-back-title-color}"/>
<!--Info text-->
<Label
TextType="Html"
Text="{Binding StatusInfoText}"
FontSize="Medium"
TextColor="DimGray"
HorizontalOptions="CenterAndExpand"
HorizontalTextAlignment="Center"/>
</StackLayout>
<!--Attention: Important info-->
<Frame Grid.Row="2"
Margin="0,20,0,60"
Padding="10"
HorizontalOptions="FillAndExpand"
HasShadow="False"
IsVisible="{Binding RentalProcess.ImportantStepInfoText, Converter={StaticResource StringNotNullOrEmpty_Converter}}"
BackgroundColor="{DynamicResource important-text-color}">
<Grid
ColumnDefinitions="20,*,Auto,20"
RowDefinitions="Auto">
<Label
Grid.Column="1"
HorizontalOptions="End"
IsVisible="True"
TextColor="White"
FontSize="Large"
Text="{Binding RentalProcess.ImportantStepInfoText}"
FontAttributes="Bold">
</Label>
<Image
Grid.Column="2"
HorizontalOptions="Start">
<Image.Source>
<FontImageSource
Glyph="{StaticResource Triangle}"
FontFamily="FA-S"
Size="40"
Color="White"/>
</Image.Source>
</Image>
</Grid>
</Frame>
</Grid>
</Grid>
</Frame>
</ContentView.Content>
</ContentView>

View file

@ -0,0 +1,21 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Xamarin.Forms;
using Xamarin.Forms.Xaml;
#if !NOXCT
namespace ShareeSharedGuiLib.View.Bike.RentalProcess
{
[XamlCompilation(XamlCompilationOptions.Compile)]
public partial class RentalProcessBookedClosedEndRental : ContentView
{
public RentalProcessBookedClosedEndRental()
{
InitializeComponent ();
}
}
}
# endif

View file

@ -0,0 +1,209 @@
<?xml version="1.0" encoding="UTF-8"?>
<ContentView xmlns="http://xamarin.com/schemas/2014/forms"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
xmlns:conv="clr-namespace:TINK.View"
xmlns:rental_process="clr-namespace:TINK.ViewModel.Bikes;assembly=TINKLib"
xmlns:resources="clr-namespace:TINK.MultilingualResources;assembly=TINKLib"
xmlns:sharedGui="clr-namespace:ShareeSharedGuiLib.View.Bike.RentalProcess"
x:Class="ShareeSharedGuiLib.View.Bike.RentalProcess.RentalProcessBookedOpenCloseLock"
IsVisible="False">
<ContentView.Triggers>
<DataTrigger TargetType="ContentView"
Binding="{Binding RentalProcess.State}"
Value="{x:Static rental_process:CurrentRentalProcess.CloseLock}">
<Setter Property="IsVisible" Value="True" />
</DataTrigger>
<DataTrigger TargetType="ContentView"
Binding="{Binding RentalProcess.State}"
Value="{x:Static rental_process:CurrentRentalProcess.EndRental}">
<Setter Property="IsVisible" Value="False" />
<Setter Property="HeightRequest" Value="0"/>
</DataTrigger>
</ContentView.Triggers>
<ContentView.Resources>
<conv:StringNotNullOrEmptyToVisibleConverter x:Key="StringNotNullOrEmpty_Converter"/>
<x:String x:Key="Glasses">&#xf530;</x:String>
<x:String x:Key="Bluetooth">&#xf293;</x:String>
<x:String x:Key="Upload">&#xf382;</x:String>
</ContentView.Resources>
<ContentView.Content>
<Frame
Grid.Row="0"
HorizontalOptions="FillAndExpand"
VerticalOptions="FillAndExpand"
BackgroundColor="White"
Padding="0"
Margin="0">
<Grid RowDefinitions="60,Auto,Auto,1*"
RowSpacing="0">
<!-- Title of rental process -->
<Frame Grid.Row="0"
HorizontalOptions="FillAndExpand"
VerticalOptions="FillAndExpand"
BackgroundColor="{DynamicResource primary-back-title-color}"
Padding="0"
Margin="0">
<Label
Text="{x:Static resources:AppResources.ActionClose}"
FontSize="Large"
TextColor="White"
HorizontalOptions="Center"
VerticalOptions="Center"/>
</Frame>
<!--Bike info-->
<sharedGui:RentalProcessBikeInfo Grid.Row="1"/>
<!-- Progress bar -->
<sharedGui:RentalProcess2StepsBar Grid.Row="2"/>
<!--CloseLock Content-->
<Grid Grid.Row="3"
RowSpacing="10"
RowDefinitions="Auto,1*,Auto"
Margin="0,40,0,20">
<Grid.Triggers>
<MultiTrigger TargetType="Grid">
<MultiTrigger.Conditions>
<BindingCondition Binding="{Binding RentalProcess.StepIndex}" Value="2" />
</MultiTrigger.Conditions>
<Setter Property="IsVisible" Value="False"/>
<Setter Property="HeightRequest" Value="0"/>
</MultiTrigger>
</Grid.Triggers>
<!--Step-->
<Grid Grid.Row="0"
Padding="30,0,0,0"
ColumnDefinitions="20,Auto,1*,20"
ColumnSpacing="10"
HorizontalOptions="CenterAndExpand">
<!--Step icon-->
<Image
Grid.Column="1"
HorizontalOptions="End">
<Image.Triggers>
<MultiTrigger TargetType="Image">
<MultiTrigger.Conditions>
<BindingCondition Binding="{Binding RentalProcess.StepInfoText}" Value="{x:Static resources:AppResources.MarkingRentalProcessCloseLockStepCloseLock}"/>
</MultiTrigger.Conditions>
<Setter Property="Source">
<Setter.Value>
<FontImageSource
Glyph="{StaticResource Bluetooth}"
FontFamily="FA-B"
Size="40"
Color="Black"/>
</Setter.Value>
</Setter>
</MultiTrigger>
<MultiTrigger TargetType="Image">
<MultiTrigger.Conditions>
<BindingCondition Binding="{Binding RentalProcess.StepInfoText}" Value="{x:Static resources:AppResources.MarkingRentalProcessCloseLockStepUpload}"/>
</MultiTrigger.Conditions>
<Setter Property="Source">
<Setter.Value>
<FontImageSource
Glyph="{StaticResource Upload}"
FontFamily="FA-S"
Size="40"
Color="Black"/>
</Setter.Value>
</Setter>
</MultiTrigger>
</Image.Triggers>
</Image>
<!--Step text-->
<Label
Grid.Column="2"
TextType="Html"
Text="{Binding RentalProcess.StepInfoText}"
FontSize="Large"
HorizontalOptions="Start"
VerticalOptions="Center"
TextColor="Black"
Padding="0">
</Label>
</Grid>
<!--Spinner-->
<StackLayout Grid.Row="1"
Margin="30,30,30,0"
Spacing="30">
<!--Spinner-->
<ActivityIndicator
IsRunning="{Binding IsProcessWithRunningProcessView}"
Scale="2"
HorizontalOptions="Center"
Color="{x:DynamicResource primary-back-title-color}"/>
<!--Info text-->
<Label
TextType="Html"
Text="{Binding StatusInfoText}"
FontSize="Medium"
TextColor="DimGray"
HorizontalOptions="CenterAndExpand"
HorizontalTextAlignment="Center"/>
</StackLayout>
<!--Attention: Important info-->
<Frame Grid.Row="2"
Margin="0,20,0,60"
Padding="10"
HorizontalOptions="FillAndExpand"
HasShadow="False"
IsVisible="{Binding RentalProcess.ImportantStepInfoText, Converter={StaticResource StringNotNullOrEmpty_Converter}}"
BackgroundColor="{DynamicResource important-text-color}">
<Grid
ColumnDefinitions="20,*,Auto,20"
RowDefinitions="Auto">
<Label
Grid.Column="1"
HorizontalOptions="End"
IsVisible="True"
TextColor="White"
FontSize="Large"
Text="{Binding RentalProcess.ImportantStepInfoText}"
FontAttributes="Bold">
</Label>
<Image
Grid.Column="2"
HorizontalOptions="Start">
<Image.Source>
<FontImageSource
Glyph="{StaticResource Glasses}"
FontFamily="FA-S"
Size="40"
Color="White"/>
</Image.Source>
</Image>
</Grid>
</Frame>
</Grid>
</Grid>
</Frame>
</ContentView.Content>
</ContentView>

View file

@ -0,0 +1,23 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using TINK.Model.Bikes.BikeInfoNS.BluetoothLock;
using Xamarin.Forms;
using Xamarin.Forms.Xaml;
namespace ShareeSharedGuiLib.View.Bike.RentalProcess
{
#if !NOXCT
[XamlCompilation(XamlCompilationOptions.Compile)]
public partial class RentalProcessBookedOpenCloseLock : ContentView
{
public RentalProcessBookedOpenCloseLock()
{
InitializeComponent();
}
}
#endif
}

View file

@ -0,0 +1,76 @@
<?xml version="1.0" encoding="UTF-8"?>
<ContentView xmlns="http://xamarin.com/schemas/2014/forms"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
xmlns:conv="clr-namespace:TINK.View"
xmlns:rental_process="clr-namespace:TINK.ViewModel.Bikes;assembly=TINKLib"
xmlns:resources="clr-namespace:TINK.MultilingualResources;assembly=TINKLib"
x:Class="ShareeSharedGuiLib.View.Bike.RentalProcess.RentalProcessStepBarFinished">
<ContentView.Resources>
<conv:StringNotNullOrEmptyToVisibleConverter x:Key="StringNotNullOrEmpty_Converter"/>
<x:String x:Key="check">&#xf00c;</x:String>
<x:String x:Key="xmark">&#xf00d;</x:String>
</ContentView.Resources>
<ContentView.Content>
<!-- Progress bar -->
<Grid
ColumnDefinitions="1*,80,40"
RowDefinitions="15,50,15"
RowSpacing="0">
<Frame
Grid.Column="0"
Grid.ColumnSpan="3"
Grid.Row="1"
BackgroundColor="{DynamicResource process-step-succeeded}"
Padding="0">
<Label
Padding="40,0,0,0"
VerticalOptions="Center"
TextColor="White"
FontAttributes="Bold"
Text="">
<Label.Triggers>
<MultiTrigger TargetType="Label">
<MultiTrigger.Conditions>
<BindingCondition Binding="{Binding RentalProcess.State}" Value="{x:Static rental_process:CurrentRentalProcess.CloseLock}" />
</MultiTrigger.Conditions>
<Setter Property="Text" Value="{x:Static resources:AppResources.StatusTextLockClosed}" />
</MultiTrigger>
<MultiTrigger TargetType="Label">
<MultiTrigger.Conditions>
<BindingCondition Binding="{Binding RentalProcess.State}" Value="{x:Static rental_process:CurrentRentalProcess.EndRental}" />
</MultiTrigger.Conditions>
<Setter Property="Text" Value="{x:Static resources:AppResources.StatusTextRentalEnded}" />
</MultiTrigger>
</Label.Triggers>
</Label>
</Frame>
<Frame
Grid.Column="1"
Grid.Row="0"
Grid.RowSpan="3"
BackgroundColor="{DynamicResource process-step-succeeded}"
BorderColor="White"
CornerRadius="40">
<Image>
<Image.Source>
<FontImageSource
Glyph="{StaticResource check}"
FontFamily="FA-S"
Size="Large"
Color="White"/>
</Image.Source>
</Image>
</Frame>
</Grid>
</ContentView.Content>
</ContentView>

View file

@ -0,0 +1,20 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Xamarin.Forms;
using Xamarin.Forms.Xaml;
namespace ShareeSharedGuiLib.View.Bike.RentalProcess
{
[XamlCompilation(XamlCompilationOptions.Compile)]
public partial class RentalProcessStepBarFinished : ContentView
{
public RentalProcessStepBarFinished ()
{
InitializeComponent ();
}
}
}

View file

@ -19,7 +19,7 @@
</DataTrigger>
</StackLayout.Triggers>
<Label Text="{x:Static resources:AppResources.MarkingNoNetworkConnection}"
<Label Text="{x:Static resources:AppResources.MarkingNoWeb}"
TextColor="White"
FontSize="Small"
Padding="5"

View file

@ -14,6 +14,7 @@ using Xamarin.Forms.Platform.Android.AppLinks;
using static Xamarin.Essentials.Permissions;
using Xamarin.Essentials;
using Android.Runtime;
using Xamarin.Forms;
namespace TINK.Droid
{

View file

@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android" android:installLocation="internalOnly" package="com.hauffware.sharee" android:versionName="3.0.369" android:versionCode="369">
<manifest xmlns:android="http://schemas.android.com/apk/res/android" android:installLocation="internalOnly" package="com.hauffware.sharee" android:versionName="3.0.370" android:versionCode="370">
<uses-sdk android:minSdkVersion="19" android:targetSdkVersion="33" />
<!-- Google Maps related permissions -->
<!-- Permission to receive remote notifications from Google Play Services -->

View file

@ -14,7 +14,7 @@ namespace TINK.Droid
{
[global::System.CodeDom.Compiler.GeneratedCodeAttribute("Xamarin.Android.Build.Tasks", "13.2.0.93")]
[global::System.CodeDom.Compiler.GeneratedCodeAttribute("Xamarin.Android.Build.Tasks", "13.2.1.111")]
public partial class Resource
{
@ -24011,208 +24011,211 @@ namespace TINK.Droid
public const int ic_vol_unmute = 2131165510;
// aapt resource value: 0x7F070147
public const int material_cursor_drawable = 2131165511;
public const int Location_Button = 2131165511;
// aapt resource value: 0x7F070148
public const int material_ic_calendar_black_24dp = 2131165512;
public const int material_cursor_drawable = 2131165512;
// aapt resource value: 0x7F070149
public const int material_ic_clear_black_24dp = 2131165513;
public const int material_ic_calendar_black_24dp = 2131165513;
// aapt resource value: 0x7F07014A
public const int material_ic_edit_black_24dp = 2131165514;
public const int material_ic_clear_black_24dp = 2131165514;
// aapt resource value: 0x7F07014B
public const int material_ic_keyboard_arrow_left_black_24dp = 2131165515;
public const int material_ic_edit_black_24dp = 2131165515;
// aapt resource value: 0x7F07014C
public const int material_ic_keyboard_arrow_next_black_24dp = 2131165516;
public const int material_ic_keyboard_arrow_left_black_24dp = 2131165516;
// aapt resource value: 0x7F07014D
public const int material_ic_keyboard_arrow_previous_black_24dp = 2131165517;
public const int material_ic_keyboard_arrow_next_black_24dp = 2131165517;
// aapt resource value: 0x7F07014E
public const int material_ic_keyboard_arrow_right_black_24dp = 2131165518;
public const int material_ic_keyboard_arrow_previous_black_24dp = 2131165518;
// aapt resource value: 0x7F07014F
public const int material_ic_menu_arrow_down_black_24dp = 2131165519;
public const int material_ic_keyboard_arrow_right_black_24dp = 2131165519;
// aapt resource value: 0x7F070150
public const int material_ic_menu_arrow_up_black_24dp = 2131165520;
public const int material_ic_menu_arrow_down_black_24dp = 2131165520;
// aapt resource value: 0x7F070151
public const int mr_button_connected_dark = 2131165521;
public const int material_ic_menu_arrow_up_black_24dp = 2131165521;
// aapt resource value: 0x7F070152
public const int mr_button_connected_light = 2131165522;
public const int mr_button_connected_dark = 2131165522;
// aapt resource value: 0x7F070153
public const int mr_button_connecting_dark = 2131165523;
public const int mr_button_connected_light = 2131165523;
// aapt resource value: 0x7F070154
public const int mr_button_connecting_light = 2131165524;
public const int mr_button_connecting_dark = 2131165524;
// aapt resource value: 0x7F070155
public const int mr_button_dark = 2131165525;
public const int mr_button_connecting_light = 2131165525;
// aapt resource value: 0x7F070156
public const int mr_button_dark_static = 2131165526;
public const int mr_button_dark = 2131165526;
// aapt resource value: 0x7F070157
public const int mr_button_light = 2131165527;
public const int mr_button_dark_static = 2131165527;
// aapt resource value: 0x7F070158
public const int mr_button_light_static = 2131165528;
public const int mr_button_light = 2131165528;
// aapt resource value: 0x7F070159
public const int mr_cast_checkbox = 2131165529;
public const int mr_button_light_static = 2131165529;
// aapt resource value: 0x7F07015A
public const int mr_cast_group_seekbar_track = 2131165530;
public const int mr_cast_checkbox = 2131165530;
// aapt resource value: 0x7F07015B
public const int mr_cast_mute_button = 2131165531;
public const int mr_cast_group_seekbar_track = 2131165531;
// aapt resource value: 0x7F07015C
public const int mr_cast_route_seekbar_track = 2131165532;
public const int mr_cast_mute_button = 2131165532;
// aapt resource value: 0x7F07015D
public const int mr_cast_stop = 2131165533;
public const int mr_cast_route_seekbar_track = 2131165533;
// aapt resource value: 0x7F07015E
public const int mr_cast_thumb = 2131165534;
public const int mr_cast_stop = 2131165534;
// aapt resource value: 0x7F07015F
public const int mr_dialog_close_dark = 2131165535;
public const int mr_cast_thumb = 2131165535;
// aapt resource value: 0x7F070160
public const int mr_dialog_close_light = 2131165536;
public const int mr_dialog_close_dark = 2131165536;
// aapt resource value: 0x7F070161
public const int mr_dialog_material_background_dark = 2131165537;
public const int mr_dialog_close_light = 2131165537;
// aapt resource value: 0x7F070162
public const int mr_dialog_material_background_light = 2131165538;
public const int mr_dialog_material_background_dark = 2131165538;
// aapt resource value: 0x7F070163
public const int mr_group_collapse = 2131165539;
public const int mr_dialog_material_background_light = 2131165539;
// aapt resource value: 0x7F070164
public const int mr_group_expand = 2131165540;
public const int mr_group_collapse = 2131165540;
// aapt resource value: 0x7F070165
public const int mr_media_pause_dark = 2131165541;
public const int mr_group_expand = 2131165541;
// aapt resource value: 0x7F070166
public const int mr_media_pause_light = 2131165542;
public const int mr_media_pause_dark = 2131165542;
// aapt resource value: 0x7F070167
public const int mr_media_play_dark = 2131165543;
public const int mr_media_pause_light = 2131165543;
// aapt resource value: 0x7F070168
public const int mr_media_play_light = 2131165544;
public const int mr_media_play_dark = 2131165544;
// aapt resource value: 0x7F070169
public const int mr_media_stop_dark = 2131165545;
public const int mr_media_play_light = 2131165545;
// aapt resource value: 0x7F07016A
public const int mr_media_stop_light = 2131165546;
public const int mr_media_stop_dark = 2131165546;
// aapt resource value: 0x7F07016B
public const int mr_vol_type_audiotrack_dark = 2131165547;
public const int mr_media_stop_light = 2131165547;
// aapt resource value: 0x7F07016C
public const int mr_vol_type_audiotrack_light = 2131165548;
public const int mr_vol_type_audiotrack_dark = 2131165548;
// aapt resource value: 0x7F07016D
public const int mtrl_dialog_background = 2131165549;
public const int mr_vol_type_audiotrack_light = 2131165549;
// aapt resource value: 0x7F07016E
public const int mtrl_dropdown_arrow = 2131165550;
public const int mtrl_dialog_background = 2131165550;
// aapt resource value: 0x7F07016F
public const int mtrl_ic_arrow_drop_down = 2131165551;
public const int mtrl_dropdown_arrow = 2131165551;
// aapt resource value: 0x7F070170
public const int mtrl_ic_arrow_drop_up = 2131165552;
public const int mtrl_ic_arrow_drop_down = 2131165552;
// aapt resource value: 0x7F070171
public const int mtrl_ic_cancel = 2131165553;
public const int mtrl_ic_arrow_drop_up = 2131165553;
// aapt resource value: 0x7F070172
public const int mtrl_ic_error = 2131165554;
public const int mtrl_ic_cancel = 2131165554;
// aapt resource value: 0x7F070173
public const int mtrl_navigation_bar_item_background = 2131165555;
public const int mtrl_ic_error = 2131165555;
// aapt resource value: 0x7F070174
public const int mtrl_popupmenu_background = 2131165556;
public const int mtrl_navigation_bar_item_background = 2131165556;
// aapt resource value: 0x7F070175
public const int mtrl_popupmenu_background_dark = 2131165557;
public const int mtrl_popupmenu_background = 2131165557;
// aapt resource value: 0x7F070176
public const int mtrl_tabs_default_indicator = 2131165558;
public const int mtrl_popupmenu_background_dark = 2131165558;
// aapt resource value: 0x7F070177
public const int navigation_empty_icon = 2131165559;
public const int mtrl_tabs_default_indicator = 2131165559;
// aapt resource value: 0x7F070178
public const int notification_action_background = 2131165560;
public const int navigation_empty_icon = 2131165560;
// aapt resource value: 0x7F070179
public const int notification_bg = 2131165561;
public const int notification_action_background = 2131165561;
// aapt resource value: 0x7F07017A
public const int notification_bg_low = 2131165562;
public const int notification_bg = 2131165562;
// aapt resource value: 0x7F07017B
public const int notification_bg_low_normal = 2131165563;
public const int notification_bg_low = 2131165563;
// aapt resource value: 0x7F07017C
public const int notification_bg_low_pressed = 2131165564;
public const int notification_bg_low_normal = 2131165564;
// aapt resource value: 0x7F07017D
public const int notification_bg_normal = 2131165565;
public const int notification_bg_low_pressed = 2131165565;
// aapt resource value: 0x7F07017E
public const int notification_bg_normal_pressed = 2131165566;
public const int notification_bg_normal = 2131165566;
// aapt resource value: 0x7F07017F
public const int notification_icon_background = 2131165567;
public const int notification_bg_normal_pressed = 2131165567;
// aapt resource value: 0x7F070180
public const int notification_template_icon_bg = 2131165568;
public const int notification_icon_background = 2131165568;
// aapt resource value: 0x7F070181
public const int notification_template_icon_low_bg = 2131165569;
public const int notification_template_icon_bg = 2131165569;
// aapt resource value: 0x7F070182
public const int notification_tile_bg = 2131165570;
public const int notification_template_icon_low_bg = 2131165570;
// aapt resource value: 0x7F070183
public const int notify_panel_notification_icon_bg = 2131165571;
public const int notification_tile_bg = 2131165571;
// aapt resource value: 0x7F070184
public const int preference_list_divider_material = 2131165572;
public const int notify_panel_notification_icon_bg = 2131165572;
// aapt resource value: 0x7F070185
public const int sharee = 2131165573;
public const int preference_list_divider_material = 2131165573;
// aapt resource value: 0x7F070186
public const int sharee_no_background = 2131165574;
public const int sharee = 2131165574;
// aapt resource value: 0x7F070187
public const int test_custom_background = 2131165575;
public const int sharee_no_background = 2131165575;
// aapt resource value: 0x7F070188
public const int test_level_drawable = 2131165576;
public const int test_custom_background = 2131165576;
// aapt resource value: 0x7F070189
public const int tooltip_frame_dark = 2131165577;
public const int test_level_drawable = 2131165577;
// aapt resource value: 0x7F07018A
public const int tooltip_frame_light = 2131165578;
public const int tooltip_frame_dark = 2131165578;
// aapt resource value: 0x7F07018B
public const int tooltip_frame_light = 2131165579;
static Drawable()
{

View file

@ -56,8 +56,8 @@
<key>CFBundleDisplayName</key>
<string>sharee.bike</string>
<key>CFBundleVersion</key>
<string>369</string>
<string>370</string>
<key>CFBundleShortVersionString</key>
<string>3.0.369</string>
<string>3.0.370</string>
</dict>
</plist>

View file

@ -1,4 +1,4 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="6245" systemVersion="13F34" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" initialViewController="X5k-f2-b5h">
<dependencies>
<plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="6238"/>
@ -41,6 +41,5 @@
<image name="Icon-76.png" width="76" height="76"/>
<image name="Icon-Small-40.png" width="40" height="40"/>
<image name="Icon-Small.png" width="29" height="29"/>
<image name="tink2.png" width="208" height="208"/>
</resources>
</document>
</document>

Some files were not shown because too many files have changed in this diff Show more