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"?> <?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" /> <uses-sdk android:minSdkVersion="19" android:targetSdkVersion="33" />
<!-- Google Maps related permissions --> <!-- Google Maps related permissions -->
<!-- Permission to receive remote notifications from Google Play Services --> <!-- 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 public partial class Resource
{ {

View file

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

View file

@ -270,9 +270,6 @@
<HintPath>..\..\..\..\.nuget\packages\xamarin.google.ios.maps\2.5.0\lib\Xamarin.iOS10\Google.Maps.dll</HintPath> <HintPath>..\..\..\..\.nuget\packages\xamarin.google.ios.maps\2.5.0\lib\Xamarin.iOS10\Google.Maps.dll</HintPath>
</Reference> </Reference>
</ItemGroup> </ItemGroup>
<ItemGroup>
<BundleResource Include="Resources\tink2.png" />
</ItemGroup>
<ItemGroup> <ItemGroup>
<ProjectReference Include="..\..\LockItBLE\LockItBLE.csproj"> <ProjectReference Include="..\..\LockItBLE\LockItBLE.csproj">
<Project>{bde9ce26-15cf-47da-a4f6-b6956d02d0fc}</Project> <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"> <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> <dependencies>
<plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="6238"/> <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="6238"/>
@ -42,6 +42,5 @@
<image name="Icon-76.png" width="76" height="76"/> <image name="Icon-76.png" width="76" height="76"/>
<image name="Icon-Small-40.png" width="40" height="40"/> <image name="Icon-Small-40.png" width="40" height="40"/>
<image name="Icon-Small.png" width="29" height="29"/> <image name="Icon-Small.png" width="29" height="29"/>
<image name="tink2.png" width="208" height="208"/>
</resources> </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 Text="{Binding LoggedInInfo}" />
<Label IsVisible="{Binding IsBookingStateInfoVisible}" <Label IsVisible="{Binding IsBookingStateInfoVisible}"
Text="{Binding BookingStateInfo}" /> Text="{Binding BookingStateInfo}" />
<Button Text="{x:Static resources:AppResources.MessageAccountPageManagePersonalData}" <Button Text="{x:Static resources:AppResources.MarkingAccountPageManagePersonalData}"
Command="{Binding OnManageAccount}" Command="{Binding OnManageAccount}"
IsEnabled="{Binding IsLogoutPossible}"/> IsEnabled="{Binding IsLogoutPossible}"/>
<Button <Button
Text="{x:Static resources:AppResources.MessageAccountPageManageLogout}" Text="{x:Static resources:AppResources.MarkingAccountPageManageLogout}"
Command="{Binding OnLogoutRequest}" Command="{Binding OnLogoutRequest}"
IsEnabled="{Binding IsLogoutPossible}"/> IsEnabled="{Binding IsLogoutPossible}"/>
</StackLayout> </StackLayout>

View file

@ -24,6 +24,7 @@ namespace TINK.View.BikesAtStation
using TINK.ViewModel.Bikes; using TINK.ViewModel.Bikes;
using Xamarin.CommunityToolkit.Extensions; using Xamarin.CommunityToolkit.Extensions;
using TINK.Model.Bikes.BikeInfoNS.DriveNS.BatteryNS; using TINK.Model.Bikes.BikeInfoNS.DriveNS.BatteryNS;
using TINK.MultilingualResources;
[XamlCompilation(XamlCompilationOptions.Compile)] [XamlCompilation(XamlCompilationOptions.Compile)]
#if USEFLYOUT #if USEFLYOUT
@ -110,7 +111,12 @@ namespace TINK.View.BikesAtStation
catch (Exception exception) catch (Exception exception)
{ {
Log.ForContext<BikesAtStationPage>().Error("Displaying bikes at station page failed. {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; isInitializationStarted = false;
return; return;
} }

View file

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

View file

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

View file

@ -5,6 +5,7 @@ using Serilog;
using TINK.Model; using TINK.Model;
using TINK.Model.Bikes.BikeInfoNS.DriveNS.BatteryNS; using TINK.Model.Bikes.BikeInfoNS.DriveNS.BatteryNS;
using TINK.Model.Device; using TINK.Model.Device;
using TINK.MultilingualResources;
using TINK.ViewModel.FindBike; using TINK.ViewModel.FindBike;
using Xamarin.CommunityToolkit.Extensions; using Xamarin.CommunityToolkit.Extensions;
using Xamarin.Forms; using Xamarin.Forms;
@ -65,7 +66,10 @@ namespace TINK.View.FindBike
catch (Exception exception) catch (Exception exception)
{ {
Log.ForContext<FindBikePage>().Error("Displaying bikes at station page failed. {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; return;
} }

View file

@ -14,6 +14,7 @@ namespace TINK.View.MyBikes
using TINK.Model; using TINK.Model;
using TINK.Model.Bikes.BikeInfoNS.DriveNS.BatteryNS; using TINK.Model.Bikes.BikeInfoNS.DriveNS.BatteryNS;
using TINK.Model.Device; using TINK.Model.Device;
using TINK.MultilingualResources;
using TINK.ViewModel.MyBikes; using TINK.ViewModel.MyBikes;
using Xamarin.CommunityToolkit.Extensions; using Xamarin.CommunityToolkit.Extensions;
@ -78,7 +79,10 @@ namespace TINK.View.MyBikes
catch (Exception exception) catch (Exception exception)
{ {
Log.ForContext<MyBikesPage>().Error("Displaying bikes at station page failed. {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; isInitializationStarted = false;
return; return;
} }

View file

@ -20,7 +20,7 @@ namespace TINK.Services.BluetoothLock.BLE
/// <summary> Manages a single lock.</summary> /// <summary> Manages a single lock.</summary>
public abstract class LockItBase : ILockService public abstract class LockItBase : ILockService
{ {
/// <summary> Lenght of seed in bytes.</summary> /// <summary> Length of seed in bytes.</summary>
private const int SEEDLENGTH = 16; private const int SEEDLENGTH = 16;
/// <summary> Timeout for open/ close operations.</summary> /// <summary> Timeout for open/ close operations.</summary>
@ -160,7 +160,7 @@ namespace TINK.Services.BluetoothLock.BLE
} }
catch (System.Exception exception) 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); 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) 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); 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) 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); 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) 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); 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) 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); 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) 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); 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) 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); 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) 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); 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; return;
} }
/// <summary> Full idvertisement name.</summary> /// <summary> Full advertisement name.</summary>
public string Name { get; private set; } = string.Empty; 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; } public int Id { get; private set; }
/// <summary> Query GUID of lock.</summary> /// <summary> Query GUID of lock.</summary>
@ -603,12 +603,12 @@ namespace TINK.Services.BluetoothLock.BLE
LockInfoAuthTdo lockInfo, LockInfoAuthTdo lockInfo,
ICipher cipher) 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(); var authCharacteristic = await lockIt.GetAuthCharacteristicAsync();
if (authCharacteristic == null) 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."); 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> /// <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> /// <param name="doWaitRetry">True if to wait and retry in case of failures. </param>
/// <remarks> /// <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 /// Values are as follows
/// Open = 0x00, /// Open = 0x00,
/// Closed = 0x01, /// Closed = 0x01,
/// Unknown = 0x02, /// Unknown = 0x02,
/// CouldntCloseMoving = 0x03, /// CouldntCloseMoving = 0x03,
/// CouldntOpenBoldBlocked = 0x04, /// CouldntOpenBoltBlocked = 0x04,
/// CouldntCloseBoldBlocked = 0x05 /// CouldntCloseBoltBlocked = 0x05
/// TINK.Services.BluetoothLock.Tdo.LockitLockingState. /// TINK.Services.BluetoothLock.Tdo.LockitLockingState.
/// </remarks> /// </remarks>
/// <returns> Lock state.</returns> /// <returns> Lock state.</returns>
@ -750,6 +750,8 @@ namespace TINK.Services.BluetoothLock.BLE
} }
byte[] state; byte[] state;
// Reads the lock state from characteristic
async Task<byte[]> readAsyncDelegate() async Task<byte[]> readAsyncDelegate()
{ {
var cts = new CancellationTokenSource(); 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"); throw new System.Exception("Can not get lock state. No data read");
} }
int lockingState = state[0];
var lockInfoTdo = new LockInfoTdo.Builder var lockInfoTdo = new LockInfoTdo.Builder
{ {
Id = Id, Id = Id,
Guid = Guid, Guid = Guid,
State = (LockitLockingState?)state[0] State = Enum.IsDefined(typeof(LockitLockingState), lockingState) ? (LockitLockingState?) lockingState : null
}.Build(); }.Build();
Log.ForContext<LockItBase>().Debug("Retrieving lock state (ReadAsync-call) succeeded. {@LockInfoTdo}{StateCharacteristic}{Reading}", 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(); => charcteristic.Id.ToString();
private static string ToSerilogString(byte[] byteArray) 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."); Log.ForContext<LockItEventBased>().Information($"Lock was opened successfully.");
return lockingState.Value; return lockingState.Value;
case LockitLockingState.CouldntOpenBoldBlocked: case LockitLockingState.CouldntOpenBoltBlocked:
// Expected error. ILockIt count not be opened (Spoke blocks lock, ....) // Expected error. ILockIt count not be opened (Spoke blocks lock, ....)
Log.ForContext<LockItEventBased>().Debug($"Opening lock failed. Bold is blocked."); Log.ForContext<LockItEventBased>().Debug($"Opening lock failed. Bold is blocked.");
throw new CouldntOpenBoldIsBlockedException(); throw new CouldntOpenBoldIsBlockedException();
@ -161,7 +161,7 @@ namespace TINK.Services.BluetoothLock.BLE
// Comprises values // Comprises values
// - LockitLockingState.Closed // - LockitLockingState.Closed
// - LockitLockingState.Unknown // - LockitLockingState.Unknown
// - LockitLockingState.CouldntOpenBoldBlocked // - LockitLockingState.CouldntOpenBoltBlocked
// Internal error which should never occur. Lock refuses to open but connection is ok. // 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."); Log.ForContext<LockItEventBased>().Debug($"Opening lock failed. Unexpected lock state {lockingState.Value.GetLockingState()} detected.");
throw new CouldntOpenInconsistentStateExecption(lockingState.Value.GetLockingState()); throw new CouldntOpenInconsistentStateExecption(lockingState.Value.GetLockingState());
@ -256,10 +256,10 @@ namespace TINK.Services.BluetoothLock.BLE
switch (lockingState.Value) switch (lockingState.Value)
{ {
case LockitLockingState.CouldntCloseBoldBlocked: case LockitLockingState.CouldntCloseBoltBlocked:
// Expected error. ILockIt could not be closed (Spoke blocks lock, ....) // Expected error. ILockIt could not be closed (Spoke blocks lock, ....)
Log.ForContext<LockItEventBased>().Debug($"Closing lock failed. Bold is blocked."); Log.ForContext<LockItEventBased>().Debug($"Closing lock failed. Bold is blocked.");
throw new CouldntCloseBoldBlockedException(); throw new CouldntCloseBoltBlockedException();
case LockitLockingState.CouldntCloseMoving: case LockitLockingState.CouldntCloseMoving:
// Expected error. ILockIt could not be closed (bike is moving) // Expected error. ILockIt could not be closed (bike is moving)
@ -273,13 +273,13 @@ namespace TINK.Services.BluetoothLock.BLE
case LockitLockingState.Open: case LockitLockingState.Open:
// Expected error. ILockIt could not be closed. Bolt was blocked but was opened again. // 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."); 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: default:
// Comprises values // Comprises values
// - LockitLockingState.Open // - LockitLockingState.Open
// - LockitLockingState.Unknown // - LockitLockingState.Unknown
// - LockitLockingState.CouldntOpenBoldBlocked // - LockitLockingState.CouldntOpenBoltBlocked
// Internal error which should never occur. Lock refuses to close but connection is ok. // 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."); Log.ForContext<LockItEventBased>().Debug($"Opening lock failed. Unexpected lock state {lockingState.Value.GetLockingState()} detected.");
throw new CouldntCloseInconsistentStateExecption(lockingState.Value.GetLockingState()); throw new CouldntCloseInconsistentStateExecption(lockingState.Value.GetLockingState());

View file

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

View file

@ -6,54 +6,57 @@
</header> </header>
<body> <body>
<group id="LOCKITSHARED/MULTILINGUALRESOURCES/RESOURCES.RESX" datatype="resx"> <group id="LOCKITSHARED/MULTILINGUALRESOURCES/RESOURCES.RESX" datatype="resx">
<trans-unit id="ErrorCloseLockUnexpectedState" translate="yes" xml:space="preserve"> <trans-unit id="LockItExceptionCloseLockUnknownPosition" translate="yes" xml:space="preserve">
<source>Unexpected locking state "{0}" detected after sending close command.</source> <source>Lock reports unknown bold position. Lock could be closed or open. Please try again or contact customer support.</source>
<target state="translated">Unerwarteter Schlosszustand "{0}" gemeldet nach Ausführung des Abschließen-Befehls.</target> <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>
<trans-unit id="ErrorCloseLockUnknownPosition" translate="yes" xml:space="preserve"> <trans-unit id="LockItExceptionOpenLockUnexpectedState" translate="yes" xml:space="preserve">
<source>Lock reports unknown bold position.</source> <source>Unexpected locking state "{0}" detected after sending open command. Please try again or contact customer support.</source>
<target state="translated">Schloss meldet unbekannten Schließzustand.</target> <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>
<trans-unit id="ErrorOpenLockUnexpectedState" translate="yes" xml:space="preserve"> <trans-unit id="LockItExceptionBluetoothDisconnected" translate="yes" xml:space="preserve">
<source>Unexpected locking state "{0}" detected after sending open command.</source> <source>Bluetooth connection to the lock could not be established. Activate Bluetooth and try again.</source>
<target state="translated">Unerwarteter Schlosszustand "{0}" gemeldet nach Ausführen des Öffnen-Befehls.</target> <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>
<trans-unit id="ErrorBluetoothDisconnectedException" translate="yes" xml:space="preserve"> <trans-unit id="LockItExceptionCloseLockMoving" translate="yes" xml:space="preserve">
<source>No bluetooth connection.</source> <source>The process is motion sensitive. Step close to the lock, do not move, and try again.</source>
<target state="translated">Keine Bluetooth-Verbindung.</target> <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>
<trans-unit id="ErrorCloseLockBikeMoving" translate="yes" xml:space="preserve"> <trans-unit id="LockItExceptionOpenLockBoldWasBlocked" translate="yes" xml:space="preserve">
<source>Bike is moving.</source> <source>Bolt was blocked. Make sure that no spoke presses against the lock bolt and try again.</source>
<target state="translated">Rad ist in Bewegung.</target> <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>
<trans-unit id="ErrorCloseLockBoldBlocked" translate="yes" xml:space="preserve"> <trans-unit id="LockItExceptionConnectLockBluetoothNotOnException" translate="yes" xml:space="preserve">
<source>Bold is blocked.</source> <source>Bluetooth connection to the lock could not be established. Current Blutooth status is {0}. Activate Bluetooth and try again.</source>
<target state="translated">Schloss ist blockiert.</target> <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>
<trans-unit id="ErrorOpenLockBoldBlocked" translate="yes" xml:space="preserve"> <trans-unit id="LockItExceptionConnectLockBluetoothOffException" translate="yes" xml:space="preserve">
<source>Bold is blocked.</source> <source>Bluetooth connection to the lock could not be established. Activate Bluetooth and try again.</source>
<target state="translated">Schloss ist blockiert.</target> <target state="translated">Es kann keine Bluetooth-Verbindung hergestellt werden. Aktivieren Sie Bluetooth und versuchen Sie es erneut.</target>
</trans-unit> </trans-unit>
<trans-unit id="ErrorOpenLockBoldWasBlocked" translate="yes" xml:space="preserve"> <trans-unit id="LockItExceptionConnectLockLocationOffException" translate="yes" xml:space="preserve">
<source>Bold was or is blocked.</source> <source>Connection to the lock could not be established. Activate Location services and try again.</source>
<target state="needs-review-translation">Schloss war oder ist blockiert.</target> <target state="translated">Es konnte keine Verbindung zum Schloss hergestellt werden. Aktivieren Sie die Standortdienste und versuchen Sie es erneut.</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> </trans-unit>
<trans-unit id="ErrorConnectLockBluetoothNotOnException" translate="yes" xml:space="preserve"> <trans-unit id="LockItExceptionConnectLockLocationPermissingMissingException" translate="yes" xml:space="preserve">
<source>Can not connect to lock. Unexpected bluetooth state {0} detected.</source> <source>Connection to the lock could not be established. Grant Location permission, activate Location services and try again.</source>
<target state="translated">Kann keine Verbindung zum Schloss herstellen. Unerwarteter Bluetooth-Status {0} erkannt.</target> <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>
<trans-unit id="ErrorConnectLockBluetoothOffException" translate="yes" xml:space="preserve"> <trans-unit id="LockItExceptionOpenLockBoldStatusIsUnknown" translate="yes" xml:space="preserve">
<source>Can not connect to lock. Bluetooth is off but has to be turned on.</source> <source>Position of lock bolt is unknown. Lock could be closed or open. Please try again or contact customer support.</source>
<target state="translated">Kann keine Verbindung zum Schloss herstellen. Bluetooth ist aus und sollte aber angeschalten sein.</target> <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>
<trans-unit id="ErrorConnectLockLocationOffException" translate="yes" xml:space="preserve"> <trans-unit id="LockItExceptionCloseLockBoltBlocked" translate="yes" xml:space="preserve">
<source>Can not connect to lock. Location is off but has to be turned on.</source> <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">Kann keine Verbindung zum Schloss herstellen. Standortbestimmung ist deaktiviert, sollte aber aktiviert sein.</target> <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>
<trans-unit id="ErrorConnectLockLocationPermissingMissingException" translate="yes" xml:space="preserve"> <trans-unit id="LockItExceptionOpenLockBoltBlocked" translate="yes" xml:space="preserve">
<source>Can not connect to lock. Location permission is required but not granted. </source> <source>Lock bolt is blocked. Make sure that no spoke presses against the lock bolt and try again.</source>
<target state="translated">Kann keine Verbindung zum Schloss herstellen. Standort-Zugriffserlaubnis muss erteilt sein wurde aber nicht erteilt. </target> <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> </trans-unit>
</group> </group>
</body> </body>

View file

@ -19,7 +19,7 @@ namespace TINK.MultilingualResources {
// class via a tool like ResGen or Visual Studio. // class via a tool like ResGen or Visual Studio.
// To add or remove a member, edit your .ResX file then rerun ResGen // To add or remove a member, edit your .ResX file then rerun ResGen
// with the /str option, or rebuild your VS project. // 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.Diagnostics.DebuggerNonUserCodeAttribute()]
[global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
internal class Resources { internal class Resources {
@ -61,110 +61,119 @@ namespace TINK.MultilingualResources {
} }
/// <summary> /// <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> /// </summary>
internal static string ErrorBluetoothDisconnectedException { internal static string LockItExceptionBluetoothDisconnected {
get { get {
return ResourceManager.GetString("ErrorBluetoothDisconnectedException", resourceCulture); return ResourceManager.GetString("LockItExceptionBluetoothDisconnected", resourceCulture);
} }
} }
/// <summary> /// <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> /// </summary>
internal static string ErrorCloseLockBikeMoving { internal static string LockItExceptionCloseLockBoltBlocked {
get { get {
return ResourceManager.GetString("ErrorCloseLockBikeMoving", resourceCulture); return ResourceManager.GetString("LockItExceptionCloseLockBoltBlocked", resourceCulture);
} }
} }
/// <summary> /// <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> /// </summary>
internal static string ErrorCloseLockBoldBlocked { internal static string LockItExceptionCloseLockMoving {
get { get {
return ResourceManager.GetString("ErrorCloseLockBoldBlocked", resourceCulture); return ResourceManager.GetString("LockItExceptionCloseLockMoving", resourceCulture);
} }
} }
/// <summary> /// <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> /// </summary>
internal static string ErrorCloseLockUnexpectedState { internal static string LockItExceptionCloseLockUnexpectedLockState {
get { get {
return ResourceManager.GetString("ErrorCloseLockUnexpectedState", resourceCulture); return ResourceManager.GetString("LockItExceptionCloseLockUnexpectedLockState", resourceCulture);
} }
} }
/// <summary> /// <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> /// </summary>
internal static string ErrorCloseLockUnknownPosition { internal static string LockItExceptionCloseLockUnknownPosition {
get { get {
return ResourceManager.GetString("ErrorCloseLockUnknownPosition", resourceCulture); return ResourceManager.GetString("LockItExceptionCloseLockUnknownPosition", resourceCulture);
} }
} }
/// <summary> /// <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> /// </summary>
internal static string ErrorConnectLockBluetoothNotOnException { internal static string LockItExceptionConnectLockBluetoothNotOnException {
get { get {
return ResourceManager.GetString("ErrorConnectLockBluetoothNotOnException", resourceCulture); return ResourceManager.GetString("LockItExceptionConnectLockBluetoothNotOnException", resourceCulture);
} }
} }
/// <summary> /// <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> /// </summary>
internal static string ErrorConnectLockBluetoothOffException { internal static string LockItExceptionConnectLockBluetoothOffException {
get { get {
return ResourceManager.GetString("ErrorConnectLockBluetoothOffException", resourceCulture); return ResourceManager.GetString("LockItExceptionConnectLockBluetoothOffException", resourceCulture);
} }
} }
/// <summary> /// <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> /// </summary>
internal static string ErrorConnectLockLocationOffException { internal static string LockItExceptionConnectLockLocationOffException {
get { get {
return ResourceManager.GetString("ErrorConnectLockLocationOffException", resourceCulture); return ResourceManager.GetString("LockItExceptionConnectLockLocationOffException", resourceCulture);
} }
} }
/// <summary> /// <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> /// </summary>
internal static string ErrorConnectLockLocationPermissingMissingException { internal static string LockItExceptionConnectLockLocationPermissingMissingException {
get { get {
return ResourceManager.GetString("ErrorConnectLockLocationPermissingMissingException", resourceCulture); return ResourceManager.GetString("LockItExceptionConnectLockLocationPermissingMissingException", resourceCulture);
} }
} }
/// <summary> /// <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> /// </summary>
internal static string ErrorOpenLockBoldIsBlocked { internal static string LockItExceptionOpenLockBoldStatusIsUnknown {
get { get {
return ResourceManager.GetString("ErrorOpenLockBoldIsBlocked", resourceCulture); return ResourceManager.GetString("LockItExceptionOpenLockBoldStatusIsUnknown", resourceCulture);
} }
} }
/// <summary> /// <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> /// </summary>
internal static string ErrorOpenLockBoldStatusIsUnknown { internal static string LockItExceptionOpenLockBoldWasBlocked {
get { get {
return ResourceManager.GetString("ErrorOpenLockBoldStatusIsUnknown", resourceCulture); return ResourceManager.GetString("LockItExceptionOpenLockBoldWasBlocked", resourceCulture);
} }
} }
/// <summary> /// <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> /// </summary>
internal static string ErrorOpenLockUnexpectedState { internal static string LockItExceptionOpenLockBoltBlocked {
get { 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"> <resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value> <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader> </resheader>
<data name="ErrorCloseLockUnexpectedState" xml:space="preserve"> <data name="LockItExceptionCloseLockUnknownPosition" xml:space="preserve">
<value>Unerwarteter Schlosszustand "{0}" gemeldet nach Ausführung des Abschließen-Befehls.</value> <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>
<data name="ErrorCloseLockUnknownPosition" xml:space="preserve"> <data name="LockItExceptionOpenLockUnexpectedState" xml:space="preserve">
<value>Schloss meldet unbekannten Schließzustand.</value> <value>Unerwarteter Schlosszustand "{0}" nach Ausführen des Öffnen-Befehls erkannt. Bitte versuchen Sie es erneut oder kontaktieren Sie den Kundensupport.</value>
</data> </data>
<data name="ErrorOpenLockUnexpectedState" xml:space="preserve"> <data name="LockItExceptionBluetoothDisconnected" xml:space="preserve">
<value>Unerwarteter Schlosszustand "{0}" gemeldet nach Ausführen des Öffnen-Befehls.</value> <value>Es konnte keine Bluetooth-Verbindung zum Schloss hergestellt werden. Aktivieren Sie Bluetooth und versuchen Sie es erneut.</value>
</data> </data>
<data name="ErrorBluetoothDisconnectedException" xml:space="preserve"> <data name="LockItExceptionCloseLockMoving" xml:space="preserve">
<value>Keine Bluetooth-Verbindung.</value> <value>Der Vorgang ist bewegungssensibel. Treten Sie nah an das Schloss heran, bewegen Sie sich nicht und versuchen Sie es erneut.</value>
</data> </data>
<data name="ErrorCloseLockBikeMoving" xml:space="preserve"> <data name="LockItExceptionOpenLockBoldWasBlocked" xml:space="preserve">
<value>Rad ist in Bewegung.</value> <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>
<data name="ErrorCloseLockBoldBlocked" xml:space="preserve"> <data name="LockItExceptionConnectLockBluetoothNotOnException" xml:space="preserve">
<value>Schloss ist blockiert.</value> <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>
<data name="ErrorOpenLockBoldBlocked" xml:space="preserve"> <data name="LockItExceptionConnectLockBluetoothOffException" xml:space="preserve">
<value>Schloss ist blockiert.</value> <value>Es kann keine Bluetooth-Verbindung hergestellt werden. Aktivieren Sie Bluetooth und versuchen Sie es erneut.</value>
</data> </data>
<data name="ErrorOpenLockBoldWasBlocked" xml:space="preserve"> <data name="LockItExceptionConnectLockLocationOffException" xml:space="preserve">
<value>Schloss war oder ist blockiert.</value> <value>Es konnte keine Verbindung zum Schloss hergestellt werden. Aktivieren Sie die Standortdienste und versuchen Sie es erneut.</value>
</data> </data>
<data name="ErrorConnectLockBluetoothNotOnException" xml:space="preserve"> <data name="LockItExceptionConnectLockLocationPermissingMissingException" xml:space="preserve">
<value>Kann keine Verbindung zum Schloss herstellen. Unerwarteter Bluetooth-Status {0} erkannt.</value> <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>
<data name="ErrorConnectLockBluetoothOffException" xml:space="preserve"> <data name="LockItExceptionOpenLockBoldStatusIsUnknown" xml:space="preserve">
<value>Kann keine Verbindung zum Schloss herstellen. Bluetooth ist aus und sollte aber angeschalten sein.</value> <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>
<data name="ErrorConnectLockLocationOffException" xml:space="preserve"> <data name="LockItExceptionCloseLockBoltBlocked" xml:space="preserve">
<value>Kann keine Verbindung zum Schloss herstellen. Standortbestimmung ist deaktiviert, sollte aber aktiviert sein.</value> <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>
<data name="ErrorConnectLockLocationPermissingMissingException" xml:space="preserve"> <data name="LockItExceptionOpenLockBoltBlocked" xml:space="preserve">
<value>Kann keine Verbindung zum Schloss herstellen. Standort-Zugriffserlaubnis muss erteilt sein wurde aber nicht erteilt. </value> <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> </data>
</root> </root>

View file

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

View file

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

View file

@ -10,8 +10,8 @@ namespace TINK.Services.BluetoothLock.Exception
/// </remarks> /// </remarks>
public class ConnectBluetoothNotOnException : System.Exception 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 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 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 namespace TINK.Services.BluetoothLock.Exception
{ {
public class CouldntCloseBoldBlockedException : StateAwareException public class CouldntCloseBoltBlockedException : StateAwareException
{ {
/// <summary> /// <summary>
/// Constructs a bold blocked exception. /// 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> /// <param name="state">State of the lock while/ after bold blocked event.</param>
/// <remarks> /// <remarks>
/// </remarks> /// </remarks>
public CouldntCloseBoldBlockedException(LockingState state = LockingState.UnknownFromHardwareError) : base( public CouldntCloseBoltBlockedException(LockingState state = LockingState.UnknownFromHardwareError) : base(
state, state,
MultilingualResources.Resources.ErrorCloseLockBoldBlocked) MultilingualResources.Resources.LockItExceptionCloseLockBoltBlocked)
{ {
} }
} }

View file

@ -1,4 +1,4 @@

using TINK.Model.Bikes.BikeInfoNS.BluetoothLock; using TINK.Model.Bikes.BikeInfoNS.BluetoothLock;
using TINK.MultilingualResources; using TINK.MultilingualResources;
@ -10,8 +10,8 @@ namespace TINK.Services.BluetoothLock.Exception
base( base(
state, state,
state != LockingState.UnknownFromHardwareError state != LockingState.UnknownFromHardwareError
? string.Format(Resources.ErrorCloseLockUnexpectedState, state) ? string.Format(Resources.LockItExceptionCloseLockUnexpectedLockState, state)
: Resources.ErrorCloseLockUnknownPosition) : 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 namespace TINK.Services.BluetoothLock.Exception
{ {
@ -6,7 +6,7 @@ namespace TINK.Services.BluetoothLock.Exception
{ {
public CouldntCloseMovingException() : base( public CouldntCloseMovingException() : base(
LockingState.Open, // Locking bold is probable (according to haveltec) still open. 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( public CouldntOpenBoldIsBlockedException() : base(
LockingState.UnknownFromHardwareError, LockingState.UnknownFromHardwareError,
MultilingualResources.Resources.ErrorOpenLockBoldIsBlocked) MultilingualResources.Resources.LockItExceptionOpenLockBoltBlocked)
{ {
} }
} }

View file

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

View file

@ -1,4 +1,4 @@

using TINK.Model.Bikes.BikeInfoNS.BluetoothLock; using TINK.Model.Bikes.BikeInfoNS.BluetoothLock;
using TINK.MultilingualResources; using TINK.MultilingualResources;
@ -9,7 +9,7 @@ namespace TINK.Services.BluetoothLock.Exception
public CouldntOpenInconsistentStateExecption(LockingState state) : public CouldntOpenInconsistentStateExecption(LockingState state) :
base( base(
state, 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> /// <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 public class OutOfReachException : System.Exception
{ {
} }

View file

@ -1,4 +1,4 @@
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Linq; using System.Linq;
using TINK.Services.BluetoothLock.Tdo; using TINK.Services.BluetoothLock.Tdo;
@ -42,12 +42,12 @@ namespace TINK.Model.Bikes.BikeInfoNS.BluetoothLock
switch (lockingState) switch (lockingState)
{ {
case LockitLockingState.Unknown: 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; return LockingState.UnknownFromHardwareError;
case LockitLockingState.Open: case LockitLockingState.Open:
case LockitLockingState.CouldntCloseMoving: case LockitLockingState.CouldntCloseMoving:
case LockitLockingState.CouldntCloseBoldBlocked: case LockitLockingState.CouldntCloseBoltBlocked:
return LockingState.Open; return LockingState.Open;
case LockitLockingState.Closed: case LockitLockingState.Closed:

View file

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

View file

@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8"?> <?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" /> <uses-sdk android:minSdkVersion="19" android:targetSdkVersion="33" />
<!-- Google Maps related permissions --> <!-- Google Maps related permissions -->
<!-- Permission to receive remote notifications from Google Play Services --> <!-- 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 public partial class Resource
{ {

View file

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

View file

@ -269,9 +269,6 @@
<HintPath>..\..\..\..\.nuget\packages\xamarin.google.ios.maps\2.5.0\lib\Xamarin.iOS10\Google.Maps.dll</HintPath> <HintPath>..\..\..\..\.nuget\packages\xamarin.google.ios.maps\2.5.0\lib\Xamarin.iOS10\Google.Maps.dll</HintPath>
</Reference> </Reference>
</ItemGroup> </ItemGroup>
<ItemGroup>
<BundleResource Include="Resources\tink2.png" />
</ItemGroup>
<ItemGroup> <ItemGroup>
<ProjectReference Include="..\..\LockItBLE\LockItBLE.csproj"> <ProjectReference Include="..\..\LockItBLE\LockItBLE.csproj">
<Project>{bde9ce26-15cf-47da-a4f6-b6956d02d0fc}</Project> <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"> <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> <dependencies>
<plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="6238"/> <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="6238"/>
@ -42,6 +42,5 @@
<image name="Icon-76.png" width="76" height="76"/> <image name="Icon-76.png" width="76" height="76"/>
<image name="Icon-Small-40.png" width="40" height="40"/> <image name="Icon-Small-40.png" width="40" height="40"/>
<image name="Icon-Small.png" width="29" height="29"/> <image name="Icon-Small.png" width="29" height="29"/>
<image name="tink2.png" width="208" height="208"/>
</resources> </resources>
</document> </document>

View file

@ -31,6 +31,8 @@ using Arendi.BleLibrary.Local;
// Add ExportFont attribute // Add ExportFont attribute
[assembly: ExportFont("Font Awesome 5 Free-Solid-900.otf", Alias = "FA-S")] [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 namespace TINK
{ {

View file

@ -181,7 +181,6 @@
</EmbeddedResource> </EmbeddedResource>
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<Folder Include="$(MSBuildThisFileDirectory)Resources\Fonts\" />
<Folder Include="$(MSBuildThisFileDirectory)View\BikesAtStation\" /> <Folder Include="$(MSBuildThisFileDirectory)View\BikesAtStation\" />
<Folder Include="$(MSBuildThisFileDirectory)View\FeesAndBikes\" /> <Folder Include="$(MSBuildThisFileDirectory)View\FeesAndBikes\" />
<Folder Include="$(MSBuildThisFileDirectory)View\Login\" /> <Folder Include="$(MSBuildThisFileDirectory)View\Login\" />
@ -323,4 +322,12 @@
<Generator>MSBuild:Compile</Generator> <Generator>MSBuild:Compile</Generator>
</EmbeddedResource> </EmbeddedResource>
</ItemGroup> </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> </Project>

View file

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

View file

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

View file

@ -24,6 +24,7 @@ namespace TINK.View.BikesAtStation
using TINK.ViewModel.Bikes; using TINK.ViewModel.Bikes;
using Xamarin.CommunityToolkit.Extensions; using Xamarin.CommunityToolkit.Extensions;
using TINK.Model.Bikes.BikeInfoNS.DriveNS.BatteryNS; using TINK.Model.Bikes.BikeInfoNS.DriveNS.BatteryNS;
using TINK.MultilingualResources;
[XamlCompilation(XamlCompilationOptions.Compile)] [XamlCompilation(XamlCompilationOptions.Compile)]
#if USEFLYOUT #if USEFLYOUT
@ -111,7 +112,10 @@ namespace TINK.View.BikesAtStation
catch (Exception exception) catch (Exception exception)
{ {
Log.ForContext<BikesAtStationPage>().Error("Displaying bikes at station page failed. {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; isInitializationStarted = false;
return; return;
} }

View file

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

View file

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

View file

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

View file

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

View file

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

View file

@ -1,11 +1,15 @@
<?xml version="1.0" encoding="utf-8" ?> <?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:x="http://schemas.microsoft.com/winfx/2009/xaml"
xmlns:xct="http://xamarin.com/schemas/2020/toolkit"
x:Class="TINK.View.FindBike.FindBikePage" x:Class="TINK.View.FindBike.FindBikePage"
xmlns:conv="clr-namespace:TINK.View" xmlns:conv="clr-namespace:TINK.View"
xmlns:resources="clr-namespace:TINK.MultilingualResources;assembly=TINKLib" xmlns:resources="clr-namespace:TINK.MultilingualResources;assembly=TINKLib"
xmlns:local_bike="clr-namespace:TINK.View.Bike" xmlns:local_bike="clr-namespace:TINK.View.Bike"
xmlns:sharedGui="clr-namespace:ShareeSharedGuiLib.View" 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}"> BackgroundColor="{DynamicResource background-color}">
<Shell.TitleView> <Shell.TitleView>
@ -19,6 +23,15 @@
<ResourceDictionary> <ResourceDictionary>
<local_bike:BikeViewCellTemplateSelector x:Key="bikeTemplateSelector"/> <local_bike:BikeViewCellTemplateSelector x:Key="bikeTemplateSelector"/>
<conv:StringNotNullOrEmptyToVisibleConverter x:Key="Label_Converter"/> <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> </ResourceDictionary>
</ContentPage.Resources> </ContentPage.Resources>
@ -29,9 +42,10 @@
<!-- Grid for Content --> <!-- Grid for Content -->
<Grid <Grid
RowDefinitions="1*,Auto" IsVisible="{Binding RentalProcess.State, Converter={StaticResource RentalProcessToVisibleConverter}}"
Grid.Row="0"
RowSpacing="0" RowSpacing="0"
Grid.Row="0"> RowDefinitions="1*,Auto">
<StackLayout <StackLayout
Grid.Row="0" Grid.Row="0"
@ -40,37 +54,7 @@
<StackLayout <StackLayout
BackgroundColor="White" BackgroundColor="White"
Padding="20,5,20,0"> Padding="20,0,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>
<Grid <Grid
RowDefinitions="Auto,Auto" RowDefinitions="Auto,Auto"
@ -171,6 +155,14 @@
Grid.Row="0" Grid.Row="0"
IsVisible="{Binding IsProcessWithRunningProcessView}"/> IsVisible="{Binding IsProcessWithRunningProcessView}"/>
<!--CloseLock View-->
<bikeRentalProcess:RentalProcessBookedOpenCloseLock
Grid.Row="0"/>
<!--EndRental View-->
<bikeRentalProcess:RentalProcessBookedClosedEndRental
Grid.Row="0"/>
</Grid> </Grid>
</ContentPage.Content> </ContentPage.Content>

View file

@ -4,6 +4,7 @@ using System.Threading.Tasks;
using Serilog; using Serilog;
using TINK.Model.Bikes.BikeInfoNS.DriveNS.BatteryNS; using TINK.Model.Bikes.BikeInfoNS.DriveNS.BatteryNS;
using TINK.Model.Device; using TINK.Model.Device;
using TINK.MultilingualResources;
using TINK.ViewModel.FindBike; using TINK.ViewModel.FindBike;
using Xamarin.CommunityToolkit.Extensions; using Xamarin.CommunityToolkit.Extensions;
using Xamarin.Forms; using Xamarin.Forms;
@ -64,7 +65,10 @@ namespace TINK.View.FindBike
catch (Exception exception) catch (Exception exception)
{ {
Log.ForContext<FindBikePage>().Error("Displaying bikes at station page failed. {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; return;
} }

View file

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

View file

@ -14,6 +14,7 @@ namespace TINK.View.MyBikes
using TINK.Model; using TINK.Model;
using TINK.Model.Bikes.BikeInfoNS.DriveNS.BatteryNS; using TINK.Model.Bikes.BikeInfoNS.DriveNS.BatteryNS;
using TINK.Model.Device; using TINK.Model.Device;
using TINK.MultilingualResources;
using TINK.ViewModel.MyBikes; using TINK.ViewModel.MyBikes;
using Xamarin.CommunityToolkit.Extensions; using Xamarin.CommunityToolkit.Extensions;
@ -78,7 +79,10 @@ namespace TINK.View.MyBikes
catch (Exception exception) catch (Exception exception)
{ {
Log.ForContext<MyBikesPage>().Error("Displaying bikes at station page failed. {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; isInitializationStarted = false;
return; return;
} }

View file

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

View file

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

View file

@ -7,8 +7,8 @@
<!-- Nice battery images symbolizing filling level for batteries with 5 bars --> <!-- Nice battery images symbolizing filling level for batteries with 5 bars -->
<Image <Image
x:Name="BarLevelImage" x:Name="BarLevelImage"
WidthRequest="50" WidthRequest="60"
HeightRequest="30" HeightRequest="36"
Aspect="AspectFit" Aspect="AspectFit"
HorizontalOptions="CenterAndExpand" HorizontalOptions="CenterAndExpand"
IsVisible="{Binding IsBatteryChargeLevelImageVisible}" 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> </DataTrigger>
</StackLayout.Triggers> </StackLayout.Triggers>
<Label Text="{x:Static resources:AppResources.MarkingNoNetworkConnection}" <Label Text="{x:Static resources:AppResources.MarkingNoWeb}"
TextColor="White" TextColor="White"
FontSize="Small" FontSize="Small"
Padding="5" Padding="5"

View file

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

View file

@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8"?> <?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" /> <uses-sdk android:minSdkVersion="19" android:targetSdkVersion="33" />
<!-- Google Maps related permissions --> <!-- Google Maps related permissions -->
<!-- Permission to receive remote notifications from Google Play Services --> <!-- 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 public partial class Resource
{ {
@ -24011,208 +24011,211 @@ namespace TINK.Droid
public const int ic_vol_unmute = 2131165510; public const int ic_vol_unmute = 2131165510;
// aapt resource value: 0x7F070147 // aapt resource value: 0x7F070147
public const int material_cursor_drawable = 2131165511; public const int Location_Button = 2131165511;
// aapt resource value: 0x7F070148 // aapt resource value: 0x7F070148
public const int material_ic_calendar_black_24dp = 2131165512; public const int material_cursor_drawable = 2131165512;
// aapt resource value: 0x7F070149 // 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 // 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 // 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 // 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 // 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 // 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 // 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 // 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 // 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 // aapt resource value: 0x7F070152
public const int mr_button_connected_light = 2131165522; public const int mr_button_connected_dark = 2131165522;
// aapt resource value: 0x7F070153 // aapt resource value: 0x7F070153
public const int mr_button_connecting_dark = 2131165523; public const int mr_button_connected_light = 2131165523;
// aapt resource value: 0x7F070154 // aapt resource value: 0x7F070154
public const int mr_button_connecting_light = 2131165524; public const int mr_button_connecting_dark = 2131165524;
// aapt resource value: 0x7F070155 // aapt resource value: 0x7F070155
public const int mr_button_dark = 2131165525; public const int mr_button_connecting_light = 2131165525;
// aapt resource value: 0x7F070156 // aapt resource value: 0x7F070156
public const int mr_button_dark_static = 2131165526; public const int mr_button_dark = 2131165526;
// aapt resource value: 0x7F070157 // aapt resource value: 0x7F070157
public const int mr_button_light = 2131165527; public const int mr_button_dark_static = 2131165527;
// aapt resource value: 0x7F070158 // aapt resource value: 0x7F070158
public const int mr_button_light_static = 2131165528; public const int mr_button_light = 2131165528;
// aapt resource value: 0x7F070159 // aapt resource value: 0x7F070159
public const int mr_cast_checkbox = 2131165529; public const int mr_button_light_static = 2131165529;
// aapt resource value: 0x7F07015A // aapt resource value: 0x7F07015A
public const int mr_cast_group_seekbar_track = 2131165530; public const int mr_cast_checkbox = 2131165530;
// aapt resource value: 0x7F07015B // 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 // 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 // aapt resource value: 0x7F07015D
public const int mr_cast_stop = 2131165533; public const int mr_cast_route_seekbar_track = 2131165533;
// aapt resource value: 0x7F07015E // aapt resource value: 0x7F07015E
public const int mr_cast_thumb = 2131165534; public const int mr_cast_stop = 2131165534;
// aapt resource value: 0x7F07015F // aapt resource value: 0x7F07015F
public const int mr_dialog_close_dark = 2131165535; public const int mr_cast_thumb = 2131165535;
// aapt resource value: 0x7F070160 // aapt resource value: 0x7F070160
public const int mr_dialog_close_light = 2131165536; public const int mr_dialog_close_dark = 2131165536;
// aapt resource value: 0x7F070161 // 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 // 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 // aapt resource value: 0x7F070163
public const int mr_group_collapse = 2131165539; public const int mr_dialog_material_background_light = 2131165539;
// aapt resource value: 0x7F070164 // aapt resource value: 0x7F070164
public const int mr_group_expand = 2131165540; public const int mr_group_collapse = 2131165540;
// aapt resource value: 0x7F070165 // aapt resource value: 0x7F070165
public const int mr_media_pause_dark = 2131165541; public const int mr_group_expand = 2131165541;
// aapt resource value: 0x7F070166 // aapt resource value: 0x7F070166
public const int mr_media_pause_light = 2131165542; public const int mr_media_pause_dark = 2131165542;
// aapt resource value: 0x7F070167 // aapt resource value: 0x7F070167
public const int mr_media_play_dark = 2131165543; public const int mr_media_pause_light = 2131165543;
// aapt resource value: 0x7F070168 // aapt resource value: 0x7F070168
public const int mr_media_play_light = 2131165544; public const int mr_media_play_dark = 2131165544;
// aapt resource value: 0x7F070169 // aapt resource value: 0x7F070169
public const int mr_media_stop_dark = 2131165545; public const int mr_media_play_light = 2131165545;
// aapt resource value: 0x7F07016A // aapt resource value: 0x7F07016A
public const int mr_media_stop_light = 2131165546; public const int mr_media_stop_dark = 2131165546;
// aapt resource value: 0x7F07016B // 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 // 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 // aapt resource value: 0x7F07016D
public const int mtrl_dialog_background = 2131165549; public const int mr_vol_type_audiotrack_light = 2131165549;
// aapt resource value: 0x7F07016E // aapt resource value: 0x7F07016E
public const int mtrl_dropdown_arrow = 2131165550; public const int mtrl_dialog_background = 2131165550;
// aapt resource value: 0x7F07016F // aapt resource value: 0x7F07016F
public const int mtrl_ic_arrow_drop_down = 2131165551; public const int mtrl_dropdown_arrow = 2131165551;
// aapt resource value: 0x7F070170 // 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 // aapt resource value: 0x7F070171
public const int mtrl_ic_cancel = 2131165553; public const int mtrl_ic_arrow_drop_up = 2131165553;
// aapt resource value: 0x7F070172 // aapt resource value: 0x7F070172
public const int mtrl_ic_error = 2131165554; public const int mtrl_ic_cancel = 2131165554;
// aapt resource value: 0x7F070173 // aapt resource value: 0x7F070173
public const int mtrl_navigation_bar_item_background = 2131165555; public const int mtrl_ic_error = 2131165555;
// aapt resource value: 0x7F070174 // aapt resource value: 0x7F070174
public const int mtrl_popupmenu_background = 2131165556; public const int mtrl_navigation_bar_item_background = 2131165556;
// aapt resource value: 0x7F070175 // aapt resource value: 0x7F070175
public const int mtrl_popupmenu_background_dark = 2131165557; public const int mtrl_popupmenu_background = 2131165557;
// aapt resource value: 0x7F070176 // aapt resource value: 0x7F070176
public const int mtrl_tabs_default_indicator = 2131165558; public const int mtrl_popupmenu_background_dark = 2131165558;
// aapt resource value: 0x7F070177 // aapt resource value: 0x7F070177
public const int navigation_empty_icon = 2131165559; public const int mtrl_tabs_default_indicator = 2131165559;
// aapt resource value: 0x7F070178 // aapt resource value: 0x7F070178
public const int notification_action_background = 2131165560; public const int navigation_empty_icon = 2131165560;
// aapt resource value: 0x7F070179 // aapt resource value: 0x7F070179
public const int notification_bg = 2131165561; public const int notification_action_background = 2131165561;
// aapt resource value: 0x7F07017A // aapt resource value: 0x7F07017A
public const int notification_bg_low = 2131165562; public const int notification_bg = 2131165562;
// aapt resource value: 0x7F07017B // aapt resource value: 0x7F07017B
public const int notification_bg_low_normal = 2131165563; public const int notification_bg_low = 2131165563;
// aapt resource value: 0x7F07017C // aapt resource value: 0x7F07017C
public const int notification_bg_low_pressed = 2131165564; public const int notification_bg_low_normal = 2131165564;
// aapt resource value: 0x7F07017D // aapt resource value: 0x7F07017D
public const int notification_bg_normal = 2131165565; public const int notification_bg_low_pressed = 2131165565;
// aapt resource value: 0x7F07017E // aapt resource value: 0x7F07017E
public const int notification_bg_normal_pressed = 2131165566; public const int notification_bg_normal = 2131165566;
// aapt resource value: 0x7F07017F // aapt resource value: 0x7F07017F
public const int notification_icon_background = 2131165567; public const int notification_bg_normal_pressed = 2131165567;
// aapt resource value: 0x7F070180 // aapt resource value: 0x7F070180
public const int notification_template_icon_bg = 2131165568; public const int notification_icon_background = 2131165568;
// aapt resource value: 0x7F070181 // 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 // aapt resource value: 0x7F070182
public const int notification_tile_bg = 2131165570; public const int notification_template_icon_low_bg = 2131165570;
// aapt resource value: 0x7F070183 // aapt resource value: 0x7F070183
public const int notify_panel_notification_icon_bg = 2131165571; public const int notification_tile_bg = 2131165571;
// aapt resource value: 0x7F070184 // 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 // aapt resource value: 0x7F070185
public const int sharee = 2131165573; public const int preference_list_divider_material = 2131165573;
// aapt resource value: 0x7F070186 // aapt resource value: 0x7F070186
public const int sharee_no_background = 2131165574; public const int sharee = 2131165574;
// aapt resource value: 0x7F070187 // aapt resource value: 0x7F070187
public const int test_custom_background = 2131165575; public const int sharee_no_background = 2131165575;
// aapt resource value: 0x7F070188 // aapt resource value: 0x7F070188
public const int test_level_drawable = 2131165576; public const int test_custom_background = 2131165576;
// aapt resource value: 0x7F070189 // aapt resource value: 0x7F070189
public const int tooltip_frame_dark = 2131165577; public const int test_level_drawable = 2131165577;
// aapt resource value: 0x7F07018A // 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() static Drawable()
{ {

View file

@ -56,8 +56,8 @@
<key>CFBundleDisplayName</key> <key>CFBundleDisplayName</key>
<string>sharee.bike</string> <string>sharee.bike</string>
<key>CFBundleVersion</key> <key>CFBundleVersion</key>
<string>369</string> <string>370</string>
<key>CFBundleShortVersionString</key> <key>CFBundleShortVersionString</key>
<string>3.0.369</string> <string>3.0.370</string>
</dict> </dict>
</plist> </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"> <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> <dependencies>
<plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="6238"/> <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="6238"/>
@ -41,6 +41,5 @@
<image name="Icon-76.png" width="76" height="76"/> <image name="Icon-76.png" width="76" height="76"/>
<image name="Icon-Small-40.png" width="40" height="40"/> <image name="Icon-Small-40.png" width="40" height="40"/>
<image name="Icon-Small.png" width="29" height="29"/> <image name="Icon-Small.png" width="29" height="29"/>
<image name="tink2.png" width="208" height="208"/>
</resources> </resources>
</document> </document>

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