Version 3.0.373

This commit is contained in:
Anja 2023-09-22 11:38:42 +02:00
parent f1cbab1d0a
commit 06428d96d9
87 changed files with 1796 additions and 1208 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.372" android:versionCode="372"> <manifest xmlns:android="http://schemas.android.com/apk/res/android" android:installLocation="internalOnly" package="com.TeilRad.LastenradBayern" android:versionName="3.0.373" android:versionCode="373">
<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

@ -56,9 +56,9 @@
<key>CFBundleDisplayName</key> <key>CFBundleDisplayName</key>
<string>LastenradBayern</string> <string>LastenradBayern</string>
<key>CFBundleVersion</key> <key>CFBundleVersion</key>
<string>372</string> <string>373</string>
<key>CFBundleShortVersionString</key> <key>CFBundleShortVersionString</key>
<string>3.0.372</string> <string>3.0.373</string>
<key>ITSAppUsesNonExemptEncryption</key> <key>ITSAppUsesNonExemptEncryption</key>
<false/> <false/>
</dict> </dict>

View file

@ -150,7 +150,7 @@ namespace TINK.View.Account
#if USCSHARP9 #if USCSHARP9
public Task<IViewService.IUserFeedback> DisplayUserFeedbackPopup() => throw new NotSupportedException(); public Task<IViewService.IUserFeedback> DisplayUserFeedbackPopup() => throw new NotSupportedException();
#else #else
public async Task<IUserFeedback> DisplayUserFeedbackPopup(IBatteryMutable battery = null, string co2Saving = null) => throw new NotSupportedException(); public async Task<IUserFeedback> DisplayUserFeedbackPopup(IBatteryMutable battery = null) => throw new NotSupportedException();
#endif #endif
} }
} }

View file

@ -249,9 +249,8 @@ namespace TINK.View.BikesAtStation
public async Task<IViewService.IUserFeedback> DisplayUserFeedbackPopup() => await Navigation.ShowPopupAsync<FeedbackPopup.Result>(new FeedbackPopup()); public async Task<IViewService.IUserFeedback> DisplayUserFeedbackPopup() => await Navigation.ShowPopupAsync<FeedbackPopup.Result>(new FeedbackPopup());
#else #else
/// <summary> Displays user feedback popup.</summary> /// <summary> Displays user feedback popup.</summary>
/// <param name="co2Saving"> Co2 saving information.</param>
/// <returns>User feedback.</returns> /// <returns>User feedback.</returns>
public async Task<IUserFeedback> DisplayUserFeedbackPopup(IBatteryMutable battery = null, string co2Saving = null) => await Navigation.ShowPopupAsync<FeedbackPopup.Result>(new FeedbackPopup(battery, co2Saving)); public async Task<IUserFeedback> DisplayUserFeedbackPopup(IBatteryMutable battery = null) => await Navigation.ShowPopupAsync<FeedbackPopup.Result>(new FeedbackPopup(battery));
#endif #endif
} }
} }

View file

@ -123,7 +123,7 @@ namespace TINK.View.Contact
#if USCSHARP9 #if USCSHARP9
public Task<IViewService.IUserFeedback> DisplayUserFeedbackPopup() => throw new NotSupportedException(); public Task<IViewService.IUserFeedback> DisplayUserFeedbackPopup() => throw new NotSupportedException();
#else #else
public async Task<IUserFeedback> DisplayUserFeedbackPopup(IBatteryMutable battery = null, string co2Saving = null) => throw new NotSupportedException(); public async Task<IUserFeedback> DisplayUserFeedbackPopup(IBatteryMutable battery = null) => throw new NotSupportedException();
#endif #endif
#if USEFLYOUT #if USEFLYOUT

View file

@ -116,7 +116,7 @@ namespace TINK.View.Contact
#if USCSHARP9 #if USCSHARP9
public Task<IViewService.IUserFeedback> DisplayUserFeedbackPopup() => throw new NotSupportedException(); public Task<IViewService.IUserFeedback> DisplayUserFeedbackPopup() => throw new NotSupportedException();
#else #else
public async Task<IUserFeedback> DisplayUserFeedbackPopup(IBatteryMutable battery = null, string co2Saving = null) => throw new NotSupportedException(); public async Task<IUserFeedback> DisplayUserFeedbackPopup(IBatteryMutable battery = null) => throw new NotSupportedException();
#endif #endif
#if USEFLYOUT #if USEFLYOUT

View file

@ -46,6 +46,7 @@ namespace TINK.View.FindBike
m_oViewModel = new FindBikePageViewModel( m_oViewModel = new FindBikePageViewModel(
model.ActiveUser, model.ActiveUser,
model,
App.PermissionsService, App.PermissionsService,
App.BluetoothService, App.BluetoothService,
Device.RuntimePlatform, Device.RuntimePlatform,
@ -181,7 +182,7 @@ namespace TINK.View.FindBike
/// <summary> Displays user feedback popup.</summary> /// <summary> Displays user feedback popup.</summary>
/// <param name="co2Saving"> Co2 saving information.</param> /// <param name="co2Saving"> Co2 saving information.</param>
/// <returns>User feedback.</returns> /// <returns>User feedback.</returns>
public async Task<IUserFeedback> DisplayUserFeedbackPopup(IBatteryMutable battery = null, string co2Saving = null) => await Navigation.ShowPopupAsync<FeedbackPopup.Result>(new FeedbackPopup(battery, co2Saving)); public async Task<IUserFeedback> DisplayUserFeedbackPopup(IBatteryMutable battery = null) => await Navigation.ShowPopupAsync<FeedbackPopup.Result>(new FeedbackPopup(battery));
#endif #endif
} }
} }

View file

@ -123,7 +123,7 @@ namespace TINK.View.Info.BikeInfo
#if USCSHARP9 #if USCSHARP9
public Task<IViewService.IUserFeedback> DisplayUserFeedbackPopup() => throw new NotSupportedException(); public Task<IViewService.IUserFeedback> DisplayUserFeedbackPopup() => throw new NotSupportedException();
#else #else
public async Task<IUserFeedback> DisplayUserFeedbackPopup(IBatteryMutable battery = null, string co2Saving = null) => throw new NotSupportedException(); public async Task<IUserFeedback> DisplayUserFeedbackPopup(IBatteryMutable battery = null) => throw new NotSupportedException();
#endif #endif
} }
} }

View file

@ -117,7 +117,7 @@ namespace TINK.View.Login
#if USCSHARP9 #if USCSHARP9
public Task<IViewService.IUserFeedback> DisplayUserFeedbackPopup() => throw new NotSupportedException(); public Task<IViewService.IUserFeedback> DisplayUserFeedbackPopup() => throw new NotSupportedException();
#else #else
public async Task<IUserFeedback> DisplayUserFeedbackPopup(IBatteryMutable battery = null, string co2Saving = null) => throw new NotSupportedException(); public async Task<IUserFeedback> DisplayUserFeedbackPopup(IBatteryMutable battery = null) => throw new NotSupportedException();
#endif #endif
} }
} }

View file

@ -121,7 +121,7 @@ namespace TINK.View.Map
#if USCSHARP9 #if USCSHARP9
public Task<IViewService.IUserFeedback> DisplayUserFeedbackPopup() => throw new NotSupportedException(); public Task<IViewService.IUserFeedback> DisplayUserFeedbackPopup() => throw new NotSupportedException();
#else #else
public async Task<IUserFeedback> DisplayUserFeedbackPopup(IBatteryMutable battery = null, string co2Saving = null) => throw new NotSupportedException(); public async Task<IUserFeedback> DisplayUserFeedbackPopup(IBatteryMutable battery = null) => throw new NotSupportedException();
#endif #endif
#if USEFLYOUT #if USEFLYOUT

View file

@ -94,7 +94,7 @@ namespace TINK.View.MiniSurvey
/// <summary> Displays user feedback popup.</summary> /// <summary> Displays user feedback popup.</summary>
/// <param name="co2Saving"> Co2 saving information.</param> /// <param name="co2Saving"> Co2 saving information.</param>
/// <returns>User feedback.</returns> /// <returns>User feedback.</returns>
public async Task<IUserFeedback> DisplayUserFeedbackPopup(IBatteryMutable battery = null, string co2Saving = null) => await Navigation.ShowPopupAsync<FeedbackPopup.Result>(new FeedbackPopup(battery, co2Saving)); public async Task<IUserFeedback> DisplayUserFeedbackPopup(IBatteryMutable battery = null) => await Navigation.ShowPopupAsync<FeedbackPopup.Result>(new FeedbackPopup(battery));
#endif #endif
} }
} }

View file

@ -181,7 +181,7 @@ namespace TINK.View.MyBikes
/// <summary> Displays user feedback popup.</summary> /// <summary> Displays user feedback popup.</summary>
/// <param name="co2Saving"> Co2 saving information.</param> /// <param name="co2Saving"> Co2 saving information.</param>
/// <returns>User feedback.</returns> /// <returns>User feedback.</returns>
public async Task<IUserFeedback> DisplayUserFeedbackPopup(IBatteryMutable battery = null, string co2Saving = null) => await Navigation.ShowPopupAsync<FeedbackPopup.Result>(new FeedbackPopup(battery, co2Saving)); public async Task<IUserFeedback> DisplayUserFeedbackPopup(IBatteryMutable battery = null) => await Navigation.ShowPopupAsync<FeedbackPopup.Result>(new FeedbackPopup(battery));
#endif #endif
} }
} }

View file

@ -150,7 +150,7 @@ namespace TINK.View.Settings
/// <summary> Displays user feedback popup.</summary> /// <summary> Displays user feedback popup.</summary>
/// <param name="co2Saving"> Co2 saving information.</param> /// <param name="co2Saving"> Co2 saving information.</param>
/// <returns>User feedback.</returns> /// <returns>User feedback.</returns>
public async Task<IUserFeedback> DisplayUserFeedbackPopup(IBatteryMutable battery = null, string co2Saving = null) => await Navigation.ShowPopupAsync<FeedbackPopup.Result>(new FeedbackPopup(battery, co2Saving)); public async Task<IUserFeedback> DisplayUserFeedbackPopup(IBatteryMutable battery = null) => await Navigation.ShowPopupAsync<FeedbackPopup.Result>(new FeedbackPopup(battery));
#endif #endif
#if USERFEEDBACKDLG_TRYOUT #if USERFEEDBACKDLG_TRYOUT

View file

@ -77,7 +77,7 @@ namespace TINK.View.WhatsNew.Agb
#if USCSHARP9 #if USCSHARP9
public Task<IViewService.IUserFeedback> DisplayUserFeedbackPopup() => throw new NotSupportedException(); public Task<IViewService.IUserFeedback> DisplayUserFeedbackPopup() => throw new NotSupportedException();
#else #else
public async Task<IUserFeedback> DisplayUserFeedbackPopup(IBatteryMutable battery = null, string co2Saving = null) => throw new NotSupportedException(); public async Task<IUserFeedback> DisplayUserFeedbackPopup(IBatteryMutable battery = null) => throw new NotSupportedException();
#endif #endif
} }
} }

View file

@ -80,7 +80,7 @@ namespace TINK.View.WhatsNew
#if USCSHARP9 #if USCSHARP9
public Task<IViewService.IUserFeedback> DisplayUserFeedbackPopup() => throw new NotSupportedException(); public Task<IViewService.IUserFeedback> DisplayUserFeedbackPopup() => throw new NotSupportedException();
#else #else
public async Task<IUserFeedback> DisplayUserFeedbackPopup(IBatteryMutable battery = null, string co2Saving = null) => throw new NotSupportedException(); public async Task<IUserFeedback> DisplayUserFeedbackPopup(IBatteryMutable battery = null) => throw new NotSupportedException();
#endif #endif
/// <summary> /// <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.372" android:versionCode="372"> <manifest xmlns:android="http://schemas.android.com/apk/res/android" android:installLocation="internalOnly" package="com.TeilRad.Meinkonrad" android:versionName="3.0.373" android:versionCode="373">
<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

@ -56,9 +56,9 @@
<key>CFBundleDisplayName</key> <key>CFBundleDisplayName</key>
<string>Mein konrad</string> <string>Mein konrad</string>
<key>CFBundleVersion</key> <key>CFBundleVersion</key>
<string>372</string> <string>373</string>
<key>CFBundleShortVersionString</key> <key>CFBundleShortVersionString</key>
<string>3.0.372</string> <string>3.0.373</string>
<key>ITSAppUsesNonExemptEncryption</key> <key>ITSAppUsesNonExemptEncryption</key>
<false/> <false/>
</dict> </dict>

View file

@ -150,7 +150,7 @@ namespace TINK.View.Account
#if USCSHARP9 #if USCSHARP9
public Task<IViewService.IUserFeedback> DisplayUserFeedbackPopup() => throw new NotSupportedException(); public Task<IViewService.IUserFeedback> DisplayUserFeedbackPopup() => throw new NotSupportedException();
#else #else
public async Task<IUserFeedback> DisplayUserFeedbackPopup(IBatteryMutable battery = null, string co2Saving = null) => throw new NotSupportedException(); public async Task<IUserFeedback> DisplayUserFeedbackPopup(IBatteryMutable battery = null) => throw new NotSupportedException();
#endif #endif
} }
} }

View file

@ -22,6 +22,7 @@
<Frame <Frame
Padding="10" Padding="10"
Margin="0,10,0,5" Margin="0,10,0,5"
HasShadow="False"
HorizontalOptions="FillAndExpand" HorizontalOptions="FillAndExpand"
VerticalOptions="FillAndExpand" VerticalOptions="FillAndExpand"
BackgroundColor="White"> BackgroundColor="White">

View file

@ -109,17 +109,11 @@
<sharedGui:HintForRefreshingPageView <sharedGui:HintForRefreshingPageView
Grid.Row="0"/> Grid.Row="0"/>
<!--No Bikes-->
<Label
Grid.Row="1"
Margin="20"
IsVisible="{Binding IsNoBikesAtStationVisible}"
Text="{Binding NoBikesAtStationText}"/>
<!--Bike(s)--> <!--Bike(s)-->
<ListView <ListView
Grid.Row="1" Grid.Row="1"
x:Name="BikesAtStationListView" x:Name="BikesAtStationListView"
BackgroundColor="{DynamicResource background-color}"
SelectionMode="None" SelectionMode="None"
SelectedItem="{Binding SelectedBike}" SelectedItem="{Binding SelectedBike}"
IsEnabled="{Binding IsIdle}" IsEnabled="{Binding IsIdle}"
@ -129,6 +123,14 @@
IsPullToRefreshEnabled="True" IsPullToRefreshEnabled="True"
RefreshCommand="{Binding RefreshCommand}" RefreshCommand="{Binding RefreshCommand}"
IsRefreshing="{Binding IsRefreshing}"/> IsRefreshing="{Binding IsRefreshing}"/>
<!--No Bikes-->
<Label
Grid.Row="1"
Margin="20"
IsVisible="{Binding IsNoBikesAtStationVisible}"
Text="{Binding NoBikesAtStationText}"/>
</Grid> </Grid>
</StackLayout> </StackLayout>

View file

@ -248,9 +248,8 @@ namespace TINK.View.BikesAtStation
public async Task<IViewService.IUserFeedback> DisplayUserFeedbackPopup() => await Navigation.ShowPopupAsync<FeedbackPopup.Result>(new FeedbackPopup()); public async Task<IViewService.IUserFeedback> DisplayUserFeedbackPopup() => await Navigation.ShowPopupAsync<FeedbackPopup.Result>(new FeedbackPopup());
#else #else
/// <summary> Displays user feedback popup.</summary> /// <summary> Displays user feedback popup.</summary>
/// <param name="co2Saving"> Co2 saving information.</param>
/// <returns>User feedback.</returns> /// <returns>User feedback.</returns>
public async Task<IUserFeedback> DisplayUserFeedbackPopup(IBatteryMutable battery = null, string co2Saving = null) => await Navigation.ShowPopupAsync<FeedbackPopup.Result>(new FeedbackPopup(battery, co2Saving)); public async Task<IUserFeedback> DisplayUserFeedbackPopup(IBatteryMutable battery = null) => await Navigation.ShowPopupAsync<FeedbackPopup.Result>(new FeedbackPopup(battery));
#endif #endif
} }
} }

View file

@ -115,8 +115,15 @@
x:Name="PhoneNumberButton" x:Name="PhoneNumberButton"
IsVisible="{Binding PhoneNumberText, Converter={StaticResource StringNotNullOrEmpty_Converter}}" IsVisible="{Binding PhoneNumberText, Converter={StaticResource StringNotNullOrEmpty_Converter}}"
Text="{Binding PhoneNumberText}" Text="{Binding PhoneNumberText}"
IsEnabled="{Binding IsDoPhoncallAvailable}" Command="{Binding OnPhoneRequest}">
Command="{Binding OnPhoneRequest}"/> <Button.Triggers>
<DataTrigger TargetType="Button" Binding="{Binding IsDoPhoncallAvailable}" Value="False">
<Setter Property="BorderColor" Value="DimGray" />
<Setter Property="BackgroundColor" Value="DimGray" />
<Setter Property="TextColor" Value="LightGray" />
</DataTrigger>
</Button.Triggers>
</Button>
<!--- Mail to operator --> <!--- Mail to operator -->
<Button <Button
@ -124,12 +131,19 @@
x:Name="MailAddressButton" x:Name="MailAddressButton"
IsVisible="{Binding MailAddressText, Converter={StaticResource StringNotNullOrEmpty_Converter}}" IsVisible="{Binding MailAddressText, Converter={StaticResource StringNotNullOrEmpty_Converter}}"
Text="{Binding MailAddressText}" Text="{Binding MailAddressText}"
IsEnabled="{Binding IsSendMailAvailable}" Command="{Binding OnMailToOperatorRequest}">
Command="{Binding OnMailToOperatorRequest}"/> <Button.Triggers>
<DataTrigger TargetType="Button" Binding="{Binding IsSendMailAvailable}" Value="False">
<Setter Property="BorderColor" Value="DimGray" />
<Setter Property="BackgroundColor" Value="LightGray" />
<Setter Property="TextColor" Value="DimGray" />
</DataTrigger>
</Button.Triggers>
</Button>
<!-- Change selected Station--> <!-- Change selected Station-->
<Button <Button
Style="{StaticResource NoOutlineButton}" Style="{StaticResource NoOutlineButtonWhite}"
Text="{x:Static resources:AppResources.ActionSelectAnotherStation}" Text="{x:Static resources:AppResources.ActionSelectAnotherStation}"
Command="{Binding OnSelectStationRequest}"/> Command="{Binding OnSelectStationRequest}"/>
@ -149,10 +163,6 @@
Margin="0,0,0,10" Margin="0,0,0,10"
VerticalOptions="End" VerticalOptions="End"
Spacing="0"> Spacing="0">
<StackLayout.GestureRecognizers>
<TapGestureRecognizer
Command="{Binding OnMailAppRelatedRequest}"/>
</StackLayout.GestureRecognizers>
<BoxView <BoxView
Margin="0,0,0,10" Margin="0,0,0,10"
@ -161,13 +171,17 @@
HorizontalOptions="Center" HorizontalOptions="Center"
Color="DimGray"/> Color="DimGray"/>
<Label <Button
TextType="Html" x:Name="DiagnosticsButton"
HorizontalOptions="Center" Style="{StaticResource NoOutlineButtonBackgroundColor}"
TextColor="{DynamicResource primary-back-title-color}"
Text="{x:Static resources:AppResources.ActionSendDiagnosis}" Text="{x:Static resources:AppResources.ActionSendDiagnosis}"
IsEnabled="{Binding IsSendMailAvailable}"> Command="{Binding OnMailToOperatorRequest}">
</Label> <Button.Triggers>
<DataTrigger TargetType="Button" Binding="{Binding IsSendMailAvailable}" Value="False">
<Setter Property="TextColor" Value="DimGray" />
</DataTrigger>
</Button.Triggers>
</Button>
</StackLayout> </StackLayout>

View file

@ -124,7 +124,7 @@ namespace TINK.View.Contact
#if USCSHARP9 #if USCSHARP9
public Task<IViewService.IUserFeedback> DisplayUserFeedbackPopup() => throw new NotSupportedException(); public Task<IViewService.IUserFeedback> DisplayUserFeedbackPopup() => throw new NotSupportedException();
#else #else
public async Task<IUserFeedback> DisplayUserFeedbackPopup(IBatteryMutable battery = null, string co2Saving = null) => throw new NotSupportedException(); public async Task<IUserFeedback> DisplayUserFeedbackPopup(IBatteryMutable battery = null) => throw new NotSupportedException();
#endif #endif
#if USEFLYOUT #if USEFLYOUT

View file

@ -118,7 +118,7 @@ namespace TINK.View.Contact
#if USCSHARP9 #if USCSHARP9
public Task<IViewService.IUserFeedback> DisplayUserFeedbackPopup() => throw new NotSupportedException(); public Task<IViewService.IUserFeedback> DisplayUserFeedbackPopup() => throw new NotSupportedException();
#else #else
public async Task<IUserFeedback> DisplayUserFeedbackPopup(IBatteryMutable battery = null, string co2Saving = null) => throw new NotSupportedException(); public async Task<IUserFeedback> DisplayUserFeedbackPopup(IBatteryMutable battery = null) => throw new NotSupportedException();
#endif #endif
#if USEFLYOUT #if USEFLYOUT

View file

@ -8,7 +8,7 @@
<TabbedPage.Resources> <TabbedPage.Resources>
<x:String x:Key="IconSmartphone">&#xf3cd;</x:String> <x:String x:Key="IconSmartphone">&#xf3cd;</x:String>
<x:String x:Key="IconTariff">&#xf4c0;</x:String> <x:String x:Key="IconTariff">&#xf153;</x:String>
<x:String x:Key="IconFaq">&#xf059;</x:String> <x:String x:Key="IconFaq">&#xf059;</x:String>
</TabbedPage.Resources> </TabbedPage.Resources>

View file

@ -10,7 +10,8 @@
xmlns:sharedGui="clr-namespace:ShareeSharedGuiLib.View" xmlns:sharedGui="clr-namespace:ShareeSharedGuiLib.View"
xmlns:rental_process="clr-namespace:TINK.ViewModel.Bikes;assembly=TINKLib" xmlns:rental_process="clr-namespace:TINK.ViewModel.Bikes;assembly=TINKLib"
xmlns:bikeRentalProcess="clr-namespace:ShareeSharedGuiLib.View.Bike.RentalProcess" xmlns:bikeRentalProcess="clr-namespace:ShareeSharedGuiLib.View.Bike.RentalProcess"
BackgroundColor="{DynamicResource background-color}"> BackgroundColor="{DynamicResource background-color}"
Shell.NavBarIsVisible="{Binding IsIdle}">
<Shell.TitleView> <Shell.TitleView>
<Grid ColumnDefinitions="Auto, 1*"> <Grid ColumnDefinitions="Auto, 1*">
@ -112,8 +113,15 @@
Grid.Row="1" Grid.Row="1"
WidthRequest="100" WidthRequest="100"
Text="{x:Static resources:AppResources.MarkingFindBikeButton}" Text="{x:Static resources:AppResources.MarkingFindBikeButton}"
IsEnabled="{Binding IsSelectBikeEnabled}" Command="{Binding OnSelectBikeRequest}">
Command="{Binding OnSelectBikeRequest}"/> <Button.Triggers>
<DataTrigger TargetType="Button" Binding="{Binding IsSelectBikeEnabled}" Value="False">
<Setter Property="BorderColor" Value="DimGray" />
<Setter Property="BackgroundColor" Value="DimGray" />
<Setter Property="TextColor" Value="LightGray" />
</DataTrigger>
</Button.Triggers>
</Button>
</Grid> </Grid>
@ -142,6 +150,7 @@
<ListView <ListView
Grid.Row="1" Grid.Row="1"
x:Name="FindBikeListView" x:Name="FindBikeListView"
BackgroundColor="{DynamicResource background-color}"
SelectionMode="None" SelectionMode="None"
SelectedItem="{Binding SelectedBike}" SelectedItem="{Binding SelectedBike}"
IsEnabled="{Binding IsIdle}" IsEnabled="{Binding IsIdle}"

View file

@ -45,6 +45,7 @@ namespace TINK.View.FindBike
m_oViewModel = new FindBikePageViewModel( m_oViewModel = new FindBikePageViewModel(
model.ActiveUser, model.ActiveUser,
model,
App.PermissionsService, App.PermissionsService,
App.BluetoothService, App.BluetoothService,
Device.RuntimePlatform, Device.RuntimePlatform,
@ -177,7 +178,7 @@ namespace TINK.View.FindBike
#if USCSHARP9 #if USCSHARP9
public async Task<IViewService.IUserFeedback> DisplayUserFeedbackPopup() => await Navigation.ShowPopupAsync<FeedbackPopup.Result>(new FeedbackPopup()); public async Task<IViewService.IUserFeedback> DisplayUserFeedbackPopup() => await Navigation.ShowPopupAsync<FeedbackPopup.Result>(new FeedbackPopup());
#else #else
public async Task<IUserFeedback> DisplayUserFeedbackPopup(IBatteryMutable battery = null, string co2Saving = null) => await Navigation.ShowPopupAsync<FeedbackPopup.Result>(new FeedbackPopup(battery, co2Saving)); public async Task<IUserFeedback> DisplayUserFeedbackPopup(IBatteryMutable battery = null) => await Navigation.ShowPopupAsync<FeedbackPopup.Result>(new FeedbackPopup(battery));
#endif #endif
} }
} }

View file

@ -123,7 +123,7 @@ namespace TINK.View.Info.BikeInfo
#if USCSHARP9 #if USCSHARP9
public Task<IViewService.IUserFeedback> DisplayUserFeedbackPopup() => throw new NotSupportedException(); public Task<IViewService.IUserFeedback> DisplayUserFeedbackPopup() => throw new NotSupportedException();
#else #else
public async Task<IUserFeedback> DisplayUserFeedbackPopup(IBatteryMutable battery = null, string co2Saving = null) => throw new NotSupportedException(); public async Task<IUserFeedback> DisplayUserFeedbackPopup(IBatteryMutable battery = null) => throw new NotSupportedException();
#endif #endif
} }
} }

View file

@ -103,8 +103,14 @@
<Button <Button
Text="{x:Static resources:AppResources.ActionLoginLogin}" Text="{x:Static resources:AppResources.ActionLoginLogin}"
AutomationId="login_button" AutomationId="login_button"
Command="{Binding OnLoginRequest}" Command="{Binding OnLoginRequest}">
IsEnabled="{Binding IsLoginRequestAllowed}"> <Button.Triggers>
<DataTrigger TargetType="Button" Binding="{Binding IsLoginRequestAllowed}" Value="False">
<Setter Property="BorderColor" Value="DimGray" />
<Setter Property="BackgroundColor" Value="DimGray" />
<Setter Property="TextColor" Value="LightGray" />
</DataTrigger>
</Button.Triggers>
</Button> </Button>
<Button <Button
@ -120,18 +126,11 @@
FormattedText="{Binding RegisterTargetsInfo}"> FormattedText="{Binding RegisterTargetsInfo}">
</Label> </Label>
<Label <Button
Margin="0,10,0,0"
TextType="Html"
AutomationId="password_forgotten_button" AutomationId="password_forgotten_button"
HorizontalOptions="Center" Style="{StaticResource NoOutlineButtonWhite}"
TextColor="{DynamicResource primary-back-title-color}" Text="{x:Static resources:AppResources.ActionLoginPasswordForgotten}"
Text="{x:Static resources:AppResources.ActionLoginPasswordForgotten}">
<Label.GestureRecognizers>
<TapGestureRecognizer
Command="{Binding OnPasswordForgottonRequest}"/> Command="{Binding OnPasswordForgottonRequest}"/>
</Label.GestureRecognizers>
</Label>
</StackLayout> </StackLayout>

View file

@ -121,7 +121,7 @@ namespace TINK.View.Login
#if USCSHARP9 #if USCSHARP9
public Task<IViewService.IUserFeedback> DisplayUserFeedbackPopup() => throw new NotSupportedException(); public Task<IViewService.IUserFeedback> DisplayUserFeedbackPopup() => throw new NotSupportedException();
#else #else
public async Task<IUserFeedback> DisplayUserFeedbackPopup(IBatteryMutable battery = null, string co2Saving = null) => throw new NotSupportedException(); public async Task<IUserFeedback> DisplayUserFeedbackPopup(IBatteryMutable battery = null) => throw new NotSupportedException();
#endif #endif
} }
} }

View file

@ -121,7 +121,7 @@ namespace TINK.View.Map
#if USCSHARP9 #if USCSHARP9
public Task<IViewService.IUserFeedback> DisplayUserFeedbackPopup() => throw new NotSupportedException(); public Task<IViewService.IUserFeedback> DisplayUserFeedbackPopup() => throw new NotSupportedException();
#else #else
public async Task<IUserFeedback> DisplayUserFeedbackPopup(IBatteryMutable battery = null, string co2Saving = null) => throw new NotSupportedException(); public async Task<IUserFeedback> DisplayUserFeedbackPopup(IBatteryMutable battery = null) => throw new NotSupportedException();
#endif #endif
#if USEFLYOUT #if USEFLYOUT

View file

@ -93,7 +93,7 @@ namespace TINK.View.MiniSurvey
/// <summary> Displays user feedback popup.</summary> /// <summary> Displays user feedback popup.</summary>
/// <param name="co2Saving"> Co2 saving information.</param> /// <param name="co2Saving"> Co2 saving information.</param>
/// <returns>User feedback.</returns> /// <returns>User feedback.</returns>
public async Task<IUserFeedback> DisplayUserFeedbackPopup(IBatteryMutable battery = null, string co2Saving = null) => await Navigation.ShowPopupAsync<FeedbackPopup.Result>(new FeedbackPopup(battery, co2Saving)); public async Task<IUserFeedback> DisplayUserFeedbackPopup(IBatteryMutable battery = null) => await Navigation.ShowPopupAsync<FeedbackPopup.Result>(new FeedbackPopup(battery));
#endif #endif
} }
} }

View file

@ -66,17 +66,11 @@
<sharedGui:HintForRefreshingPageView <sharedGui:HintForRefreshingPageView
Grid.Row="0"/> Grid.Row="0"/>
<!--No Bikes-->
<Label
Grid.Row="1"
Margin="20"
IsVisible="{Binding IsNoBikesOccupiedVisible}"
Text="{Binding NoBikesOccupiedText}"/>
<!--Bike(s)--> <!--Bike(s)-->
<ListView <ListView
Grid.Row="1" Grid.Row="1"
x:Name="MyBikesListView" x:Name="MyBikesListView"
BackgroundColor="{DynamicResource background-color}"
SelectionMode="None" SelectionMode="None"
SelectedItem="{Binding SelectedBike}" SelectedItem="{Binding SelectedBike}"
IsEnabled="{Binding IsIdle}" IsEnabled="{Binding IsIdle}"
@ -86,6 +80,14 @@
IsPullToRefreshEnabled="True" IsPullToRefreshEnabled="True"
RefreshCommand="{Binding RefreshCommand}" RefreshCommand="{Binding RefreshCommand}"
IsRefreshing="{Binding IsRefreshing}"/> IsRefreshing="{Binding IsRefreshing}"/>
<!--No Bikes-->
<Label
Grid.Row="1"
Margin="20"
IsVisible="{Binding IsNoBikesOccupiedVisible}"
Text="{Binding NoBikesOccupiedText}"/>
</Grid> </Grid>
</StackLayout> </StackLayout>

View file

@ -181,7 +181,7 @@ namespace TINK.View.MyBikes
/// <summary> Displays user feedback popup.</summary> /// <summary> Displays user feedback popup.</summary>
/// <param name="co2Saving"> Co2 saving information.</param> /// <param name="co2Saving"> Co2 saving information.</param>
/// <returns>User feedback.</returns> /// <returns>User feedback.</returns>
public async Task<IUserFeedback> DisplayUserFeedbackPopup(IBatteryMutable battery = null, string co2Saving = null) => await Navigation.ShowPopupAsync<FeedbackPopup.Result>(new FeedbackPopup(battery, co2Saving)); public async Task<IUserFeedback> DisplayUserFeedbackPopup(IBatteryMutable battery = null) => await Navigation.ShowPopupAsync<FeedbackPopup.Result>(new FeedbackPopup(battery));
#endif #endif
} }
} }

View file

@ -150,7 +150,7 @@ namespace TINK.View.Settings
/// <summary> Displays user feedback popup.</summary> /// <summary> Displays user feedback popup.</summary>
/// <param name="co2Saving"> Co2 saving information.</param> /// <param name="co2Saving"> Co2 saving information.</param>
/// <returns>User feedback.</returns> /// <returns>User feedback.</returns>
public async Task<IUserFeedback> DisplayUserFeedbackPopup(IBatteryMutable battery = null, string co2Saving = null) => await Navigation.ShowPopupAsync<FeedbackPopup.Result>(new FeedbackPopup(battery, co2Saving)); public async Task<IUserFeedback> DisplayUserFeedbackPopup(IBatteryMutable battery = null) => await Navigation.ShowPopupAsync<FeedbackPopup.Result>(new FeedbackPopup(battery));
#endif #endif
#if USERFEEDBACKDLG_TRYOUT #if USERFEEDBACKDLG_TRYOUT

View file

@ -77,7 +77,7 @@ namespace TINK.View.WhatsNew.Agb
#if USCSHARP9 #if USCSHARP9
public Task<IViewService.IUserFeedback> DisplayUserFeedbackPopup() => throw new NotSupportedException(); public Task<IViewService.IUserFeedback> DisplayUserFeedbackPopup() => throw new NotSupportedException();
#else #else
public async Task<IUserFeedback> DisplayUserFeedbackPopup(IBatteryMutable battery = null, string co2Saving = null) => throw new NotSupportedException(); public async Task<IUserFeedback> DisplayUserFeedbackPopup(IBatteryMutable battery = null) => throw new NotSupportedException();
#endif #endif
} }
} }

View file

@ -80,7 +80,7 @@ namespace TINK.View.WhatsNew
#if USCSHARP9 #if USCSHARP9
public Task<IViewService.IUserFeedback> DisplayUserFeedbackPopup() => throw new NotSupportedException(); public Task<IViewService.IUserFeedback> DisplayUserFeedbackPopup() => throw new NotSupportedException();
#else #else
public async Task<IUserFeedback> DisplayUserFeedbackPopup(IBatteryMutable battery = null, string co2Saving = null) => throw new NotSupportedException(); public async Task<IUserFeedback> DisplayUserFeedbackPopup(IBatteryMutable battery = null) => throw new NotSupportedException();
#endif #endif
/// <summary> /// <summary>

View file

@ -3,6 +3,7 @@
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml" xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
xmlns:conv="clr-namespace:TINK.View" xmlns:conv="clr-namespace:TINK.View"
xmlns:sharedGui="clr-namespace:ShareeSharedGuiLib.View.Bike.RentalProcess" xmlns:sharedGui="clr-namespace:ShareeSharedGuiLib.View.Bike.RentalProcess"
xmlns:resources="clr-namespace:TINK.MultilingualResources;assembly=TINKLib"
xmlns:rental_process="clr-namespace:TINK.ViewModel.Bikes;assembly=TINKLib" xmlns:rental_process="clr-namespace:TINK.ViewModel.Bikes;assembly=TINKLib"
x:Class="ShareeSharedGuiLib.View.Bike.RentalProcess.RentalProcess2StepsBar"> x:Class="ShareeSharedGuiLib.View.Bike.RentalProcess.RentalProcess2StepsBar">
@ -93,9 +94,24 @@
HorizontalOptions="Center" HorizontalOptions="Center"
VerticalOptions="Center"> VerticalOptions="Center">
<Label <Label
Text="1" Text="{x:Static resources:AppResources.MarkingRentalProcessCloseLockFirstStep}"
TextColor="White" TextColor="White">
FontAttributes="Bold"/> <Label.Triggers>
<MultiTrigger TargetType="Label">
<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="Text" Value="{x:Static resources:AppResources.MarkingRentalProcessCloseLockFirstStepFinished}"/>
</MultiTrigger>
<MultiTrigger TargetType="Label">
<MultiTrigger.Conditions>
<BindingCondition Binding="{Binding RentalProcess.StepIndex}" Value="2" />
</MultiTrigger.Conditions>
<Setter Property="Text" Value="{x:Static resources:AppResources.MarkingRentalProcessCloseLockFirstStepFinished}"/>
</MultiTrigger>
</Label.Triggers>
</Label>
<Image <Image
IsVisible="False"> IsVisible="False">
<Image.Triggers> <Image.Triggers>
@ -228,9 +244,8 @@
HorizontalOptions="Center" HorizontalOptions="Center"
VerticalOptions="Center"> VerticalOptions="Center">
<Label <Label
Text="2" Text="{x:Static resources:AppResources.MarkingRentalProcessCloseLockSecondStep}"
TextColor="White" TextColor="White"/>
FontAttributes="Bold"/>
<Image <Image
IsVisible="False"> IsVisible="False">
<Image.Triggers> <Image.Triggers>

View file

@ -3,6 +3,7 @@
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml" xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
xmlns:conv="clr-namespace:TINK.View" xmlns:conv="clr-namespace:TINK.View"
xmlns:sharedGui="clr-namespace:ShareeSharedGuiLib.View.Bike.RentalProcess" xmlns:sharedGui="clr-namespace:ShareeSharedGuiLib.View.Bike.RentalProcess"
xmlns:resources="clr-namespace:TINK.MultilingualResources;assembly=TINKLib"
xmlns:rental_process="clr-namespace:TINK.ViewModel.Bikes;assembly=TINKLib" xmlns:rental_process="clr-namespace:TINK.ViewModel.Bikes;assembly=TINKLib"
x:Class="ShareeSharedGuiLib.View.Bike.RentalProcess.RentalProcess3StepsBar"> x:Class="ShareeSharedGuiLib.View.Bike.RentalProcess.RentalProcess3StepsBar">
@ -99,9 +100,30 @@
HorizontalOptions="Center" HorizontalOptions="Center"
VerticalOptions="Center"> VerticalOptions="Center">
<Label <Label
Text="1" Text="{x:Static resources:AppResources.MarkingRentalProcessEndRentalFirstStep}"
TextColor="White" TextColor="White">
FontAttributes="Bold"/> <Label.Triggers>
<MultiTrigger TargetType="Label">
<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="Text" Value="{x:Static resources:AppResources.MarkingRentalProcessEndRentalFirstStepFinished}"/>
</MultiTrigger>
<MultiTrigger TargetType="Label">
<MultiTrigger.Conditions>
<BindingCondition Binding="{Binding RentalProcess.StepIndex}" Value="2" />
</MultiTrigger.Conditions>
<Setter Property="Text" Value="{x:Static resources:AppResources.MarkingRentalProcessEndRentalFirstStepFinished}"/>
</MultiTrigger>
<MultiTrigger TargetType="Label">
<MultiTrigger.Conditions>
<BindingCondition Binding="{Binding RentalProcess.StepIndex}" Value="3" />
</MultiTrigger.Conditions>
<Setter Property="Text" Value="{x:Static resources:AppResources.MarkingRentalProcessEndRentalFirstStepFinished}"/>
</MultiTrigger>
</Label.Triggers>
</Label>
<Image <Image
IsVisible="False"> IsVisible="False">
<Image.Triggers> <Image.Triggers>
@ -257,9 +279,24 @@
HorizontalOptions="Center" HorizontalOptions="Center"
VerticalOptions="Center"> VerticalOptions="Center">
<Label <Label
Text="2" Text="{x:Static resources:AppResources.MarkingRentalProcessEndRentalSecondStep}"
TextColor="White" TextColor="White">
FontAttributes="Bold"/> <Label.Triggers>
<MultiTrigger TargetType="Label">
<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="Text" Value="{x:Static resources:AppResources.MarkingRentalProcessEndRentalSecondStepFinished}"/>
</MultiTrigger>
<MultiTrigger TargetType="Label">
<MultiTrigger.Conditions>
<BindingCondition Binding="{Binding RentalProcess.StepIndex}" Value="3" />
</MultiTrigger.Conditions>
<Setter Property="Text" Value="{x:Static resources:AppResources.MarkingRentalProcessEndRentalSecondStepFinished}"/>
</MultiTrigger>
</Label.Triggers>
</Label>
<Image <Image
IsVisible="False"> IsVisible="False">
<Image.Triggers> <Image.Triggers>
@ -398,9 +435,8 @@
HorizontalOptions="Center" HorizontalOptions="Center"
VerticalOptions="Center"> VerticalOptions="Center">
<Label <Label
Text="3" Text="{x:Static resources:AppResources.MarkingRentalProcessEndRentalThirdStep}"
TextColor="White" TextColor="White"/>
FontAttributes="Bold"/>
<Image <Image
IsVisible="False"> IsVisible="False">
<Image.Triggers> <Image.Triggers>

View file

@ -12,7 +12,7 @@
<!--Bike info--> <!--Bike info-->
<Frame <Frame
Padding="20,30,20,30" Padding="20"
Margin="0,5,0,5" Margin="0,5,0,5"
HorizontalOptions="FillAndExpand" HorizontalOptions="FillAndExpand"
BackgroundColor="White"> BackgroundColor="White">

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.372" android:versionCode="372"> <manifest xmlns:android="http://schemas.android.com/apk/res/android" android:installLocation="internalOnly" package="com.hauffware.sharee" android:versionName="3.0.373" android:versionCode="373">
<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

@ -56,9 +56,9 @@
<key>CFBundleDisplayName</key> <key>CFBundleDisplayName</key>
<string>sharee.bike</string> <string>sharee.bike</string>
<key>CFBundleVersion</key> <key>CFBundleVersion</key>
<string>372</string> <string>373</string>
<key>CFBundleShortVersionString</key> <key>CFBundleShortVersionString</key>
<string>3.0.372</string> <string>3.0.373</string>
<key>ITSAppUsesNonExemptEncryption</key> <key>ITSAppUsesNonExemptEncryption</key>
<false/> <false/>
</dict> </dict>

View file

@ -150,7 +150,7 @@ namespace TINK.View.Account
#if USCSHARP9 #if USCSHARP9
public Task<IViewService.IUserFeedback> DisplayUserFeedbackPopup() => throw new NotSupportedException(); public Task<IViewService.IUserFeedback> DisplayUserFeedbackPopup() => throw new NotSupportedException();
#else #else
public async Task<IUserFeedback> DisplayUserFeedbackPopup(IBatteryMutable battery = null, string co2Saving = null) => throw new NotSupportedException(); public async Task<IUserFeedback> DisplayUserFeedbackPopup(IBatteryMutable battery = null) => throw new NotSupportedException();
#endif #endif
} }
} }

View file

@ -17,6 +17,7 @@
<Frame <Frame
Padding="10" Padding="10"
Margin="0,10,0,0" Margin="0,10,0,0"
HasShadow="False"
HorizontalOptions="FillAndExpand" HorizontalOptions="FillAndExpand"
VerticalOptions="FillAndExpand" VerticalOptions="FillAndExpand"
BackgroundColor="White"> BackgroundColor="White">

View file

@ -107,17 +107,11 @@
<sharedGui:HintForRefreshingPageView <sharedGui:HintForRefreshingPageView
Grid.Row="0"/> Grid.Row="0"/>
<!--No Bikes-->
<Label
Grid.Row="1"
Margin="20"
IsVisible="{Binding IsNoBikesAtStationVisible}"
Text="{Binding NoBikesAtStationText}"/>
<!--Bike(s)--> <!--Bike(s)-->
<ListView <ListView
Grid.Row="1" Grid.Row="1"
x:Name="BikesAtStationListView" x:Name="BikesAtStationListView"
BackgroundColor="{DynamicResource background-color}"
SelectionMode="None" SelectionMode="None"
SelectedItem="{Binding SelectedBike}" SelectedItem="{Binding SelectedBike}"
IsEnabled="{Binding IsIdle}" IsEnabled="{Binding IsIdle}"
@ -127,6 +121,14 @@
IsPullToRefreshEnabled="True" IsPullToRefreshEnabled="True"
RefreshCommand="{Binding RefreshCommand}" RefreshCommand="{Binding RefreshCommand}"
IsRefreshing="{Binding IsRefreshing}"/> IsRefreshing="{Binding IsRefreshing}"/>
<!--No Bikes-->
<Label
Grid.Row="1"
Margin="20"
IsVisible="{Binding IsNoBikesAtStationVisible}"
Text="{Binding NoBikesAtStationText}"/>
</Grid> </Grid>
</StackLayout> </StackLayout>

View file

@ -248,9 +248,8 @@ namespace TINK.View.BikesAtStation
public async Task<IViewService.IUserFeedback> DisplayUserFeedbackPopup() => await Navigation.ShowPopupAsync<FeedbackPopup.Result>(new FeedbackPopup()); public async Task<IViewService.IUserFeedback> DisplayUserFeedbackPopup() => await Navigation.ShowPopupAsync<FeedbackPopup.Result>(new FeedbackPopup());
#else #else
/// <summary> Displays user feedback popup.</summary> /// <summary> Displays user feedback popup.</summary>
/// <param name="co2Saving"> Co2 saving information.</param>
/// <returns>User feedback.</returns> /// <returns>User feedback.</returns>
public async Task<IUserFeedback> DisplayUserFeedbackPopup(IBatteryMutable battery = null, string co2Saving = null) => await Navigation.ShowPopupAsync<FeedbackPopup.Result>(new FeedbackPopup(battery, co2Saving)); public async Task<IUserFeedback> DisplayUserFeedbackPopup(IBatteryMutable battery = null) => await Navigation.ShowPopupAsync<FeedbackPopup.Result>(new FeedbackPopup(battery));
#endif #endif
} }
} }

View file

@ -114,8 +114,15 @@
x:Name="PhoneNumberButton" x:Name="PhoneNumberButton"
IsVisible="{Binding PhoneNumberText, Converter={StaticResource StringNotNullOrEmpty_Converter}}" IsVisible="{Binding PhoneNumberText, Converter={StaticResource StringNotNullOrEmpty_Converter}}"
Text="{Binding PhoneNumberText}" Text="{Binding PhoneNumberText}"
IsEnabled="{Binding IsDoPhoncallAvailable}" Command="{Binding OnPhoneRequest}">
Command="{Binding OnPhoneRequest}"/> <Button.Triggers>
<DataTrigger TargetType="Button" Binding="{Binding IsDoPhoncallAvailable}" Value="False">
<Setter Property="BorderColor" Value="DimGray" />
<Setter Property="BackgroundColor" Value="DimGray" />
<Setter Property="TextColor" Value="LightGray" />
</DataTrigger>
</Button.Triggers>
</Button>
<!--- Mail to operator --> <!--- Mail to operator -->
<Button <Button
@ -123,12 +130,19 @@
x:Name="MailAddressButton" x:Name="MailAddressButton"
IsVisible="{Binding MailAddressText, Converter={StaticResource StringNotNullOrEmpty_Converter}}" IsVisible="{Binding MailAddressText, Converter={StaticResource StringNotNullOrEmpty_Converter}}"
Text="{Binding MailAddressText}" Text="{Binding MailAddressText}"
IsEnabled="{Binding IsSendMailAvailable}" Command="{Binding OnMailToOperatorRequest}">
Command="{Binding OnMailToOperatorRequest}"/> <Button.Triggers>
<DataTrigger TargetType="Button" Binding="{Binding IsSendMailAvailable}" Value="False">
<Setter Property="BorderColor" Value="DimGray" />
<Setter Property="BackgroundColor" Value="LightGray" />
<Setter Property="TextColor" Value="DimGray" />
</DataTrigger>
</Button.Triggers>
</Button>
<!-- Change selected Station--> <!-- Change selected Station-->
<Button <Button
Style="{StaticResource NoOutlineButton}" Style="{StaticResource NoOutlineButtonWhite}"
Text="{x:Static resources:AppResources.ActionSelectAnotherStation}" Text="{x:Static resources:AppResources.ActionSelectAnotherStation}"
Command="{Binding OnSelectStationRequest}"/> Command="{Binding OnSelectStationRequest}"/>
@ -148,10 +162,6 @@
Margin="0,0,0,10" Margin="0,0,0,10"
VerticalOptions="End" VerticalOptions="End"
Spacing="0"> Spacing="0">
<StackLayout.GestureRecognizers>
<TapGestureRecognizer
Command="{Binding OnMailAppRelatedRequest}"/>
</StackLayout.GestureRecognizers>
<BoxView <BoxView
Margin="0,0,0,10" Margin="0,0,0,10"
@ -160,13 +170,17 @@
HorizontalOptions="Center" HorizontalOptions="Center"
Color="DimGray"/> Color="DimGray"/>
<Label <Button
TextType="Html" x:Name="DiagnosticsButton"
HorizontalOptions="Center" Style="{StaticResource NoOutlineButtonBackgroundColor}"
TextColor="{DynamicResource primary-back-title-color}"
Text="{x:Static resources:AppResources.ActionSendDiagnosis}" Text="{x:Static resources:AppResources.ActionSendDiagnosis}"
IsEnabled="{Binding IsSendMailAvailable}"> Command="{Binding OnMailToOperatorRequest}">
</Label> <Button.Triggers>
<DataTrigger TargetType="Button" Binding="{Binding IsSendMailAvailable}" Value="False">
<Setter Property="TextColor" Value="DimGray" />
</DataTrigger>
</Button.Triggers>
</Button>
</StackLayout> </StackLayout>

View file

@ -125,7 +125,7 @@ namespace TINK.View.Contact
#if USCSHARP9 #if USCSHARP9
public Task<IViewService.IUserFeedback> DisplayUserFeedbackPopup() => throw new NotSupportedException(); public Task<IViewService.IUserFeedback> DisplayUserFeedbackPopup() => throw new NotSupportedException();
#else #else
public async Task<IUserFeedback> DisplayUserFeedbackPopup(IBatteryMutable battery = null, string co2Saving = null) => throw new NotSupportedException(); public async Task<IUserFeedback> DisplayUserFeedbackPopup(IBatteryMutable battery = null) => throw new NotSupportedException();
#endif #endif
#if USEFLYOUT #if USEFLYOUT

View file

@ -117,7 +117,7 @@ namespace TINK.View.Contact
#if USCSHARP9 #if USCSHARP9
public Task<IViewService.IUserFeedback> DisplayUserFeedbackPopup() => throw new NotSupportedException(); public Task<IViewService.IUserFeedback> DisplayUserFeedbackPopup() => throw new NotSupportedException();
#else #else
public async Task<IUserFeedback> DisplayUserFeedbackPopup(IBatteryMutable battery = null, string co2Saving = null) => throw new NotSupportedException(); public async Task<IUserFeedback> DisplayUserFeedbackPopup(IBatteryMutable battery = null) => throw new NotSupportedException();
#endif #endif
#if USEFLYOUT #if USEFLYOUT

View file

@ -8,7 +8,7 @@
<TabbedPage.Resources> <TabbedPage.Resources>
<x:String x:Key="IconSmartphone">&#xf3cd;</x:String> <x:String x:Key="IconSmartphone">&#xf3cd;</x:String>
<x:String x:Key="IconTariff">&#xf4c0;</x:String> <x:String x:Key="IconTariff">&#xf153;</x:String>
<x:String x:Key="IconFaq">&#xf059;</x:String> <x:String x:Key="IconFaq">&#xf059;</x:String>
</TabbedPage.Resources> </TabbedPage.Resources>

View file

@ -83,8 +83,15 @@
Grid.Row="1" Grid.Row="1"
WidthRequest="100" WidthRequest="100"
Text="{x:Static resources:AppResources.MarkingFindBikeButton}" Text="{x:Static resources:AppResources.MarkingFindBikeButton}"
IsEnabled="{Binding IsSelectBikeEnabled}" Command="{Binding OnSelectBikeRequest}">
Command="{Binding OnSelectBikeRequest}"/> <Button.Triggers>
<DataTrigger TargetType="Button" Binding="{Binding IsSelectBikeEnabled}" Value="False">
<Setter Property="BorderColor" Value="DimGray" />
<Setter Property="BackgroundColor" Value="DimGray" />
<Setter Property="TextColor" Value="LightGray" />
</DataTrigger>
</Button.Triggers>
</Button>
</Grid> </Grid>
@ -113,6 +120,7 @@
<ListView <ListView
Grid.Row="1" Grid.Row="1"
x:Name="FindBikeListView" x:Name="FindBikeListView"
BackgroundColor="{DynamicResource background-color}"
SelectionMode="None" SelectionMode="None"
SelectedItem="{Binding SelectedBike}" SelectedItem="{Binding SelectedBike}"
IsEnabled="{Binding IsIdle}" IsEnabled="{Binding IsIdle}"

View file

@ -45,6 +45,7 @@ namespace TINK.View.FindBike
m_oViewModel = new FindBikePageViewModel( m_oViewModel = new FindBikePageViewModel(
model.ActiveUser, model.ActiveUser,
model,
App.PermissionsService, App.PermissionsService,
App.BluetoothService, App.BluetoothService,
Device.RuntimePlatform, Device.RuntimePlatform,
@ -182,7 +183,7 @@ namespace TINK.View.FindBike
/// <summary> Displays user feedback popup.</summary> /// <summary> Displays user feedback popup.</summary>
/// <param name="co2Saving"> Co2 saving information.</param> /// <param name="co2Saving"> Co2 saving information.</param>
/// <returns>User feedback.</returns> /// <returns>User feedback.</returns>
public async Task<IUserFeedback> DisplayUserFeedbackPopup(IBatteryMutable battery = null, string co2Saving = null) => await Navigation.ShowPopupAsync<FeedbackPopup.Result>(new FeedbackPopup(battery, co2Saving)); public async Task<IUserFeedback> DisplayUserFeedbackPopup(IBatteryMutable battery = null) => await Navigation.ShowPopupAsync<FeedbackPopup.Result>(new FeedbackPopup(battery));
#endif #endif
} }
} }

View file

@ -123,7 +123,7 @@ namespace TINK.View.Info.BikeInfo
#if USCSHARP9 #if USCSHARP9
public Task<IViewService.IUserFeedback> DisplayUserFeedbackPopup() => throw new NotSupportedException(); public Task<IViewService.IUserFeedback> DisplayUserFeedbackPopup() => throw new NotSupportedException();
#else #else
public async Task<IUserFeedback> DisplayUserFeedbackPopup(IBatteryMutable battery = null, string co2Saving = null) => throw new NotSupportedException(); public async Task<IUserFeedback> DisplayUserFeedbackPopup(IBatteryMutable battery = null) => throw new NotSupportedException();
#endif #endif
} }
} }

View file

@ -102,8 +102,14 @@
<Button <Button
Text="{x:Static resources:AppResources.ActionLoginLogin}" Text="{x:Static resources:AppResources.ActionLoginLogin}"
AutomationId="login_button" AutomationId="login_button"
Command="{Binding OnLoginRequest}" Command="{Binding OnLoginRequest}">
IsEnabled="{Binding IsLoginRequestAllowed}"> <Button.Triggers>
<DataTrigger TargetType="Button" Binding="{Binding IsLoginRequestAllowed}" Value="False">
<Setter Property="BorderColor" Value="DimGray" />
<Setter Property="BackgroundColor" Value="DimGray" />
<Setter Property="TextColor" Value="LightGray" />
</DataTrigger>
</Button.Triggers>
</Button> </Button>
<Button <Button
@ -119,18 +125,12 @@
FormattedText="{Binding RegisterTargetsInfo}"> FormattedText="{Binding RegisterTargetsInfo}">
</Label> </Label>
<Label <Button
Margin="0,10,0,0"
TextType="Html"
AutomationId="password_forgotten_button" AutomationId="password_forgotten_button"
HorizontalOptions="Center" Style="{StaticResource NoOutlineButtonWhite}"
TextColor="{DynamicResource primary-back-title-color}" Text="{x:Static resources:AppResources.ActionLoginPasswordForgotten}"
Text="{x:Static resources:AppResources.ActionLoginPasswordForgotten}"> Command="{Binding OnPasswordForgottonRequest}">
<Label.GestureRecognizers> </Button>
<TapGestureRecognizer
Command="{Binding OnPasswordForgottonRequest}"/>
</Label.GestureRecognizers>
</Label>
</StackLayout> </StackLayout>

View file

@ -121,7 +121,7 @@ namespace TINK.View.Login
#if USCSHARP9 #if USCSHARP9
public Task<IViewService.IUserFeedback> DisplayUserFeedbackPopup() => throw new NotSupportedException(); public Task<IViewService.IUserFeedback> DisplayUserFeedbackPopup() => throw new NotSupportedException();
#else #else
public async Task<IUserFeedback> DisplayUserFeedbackPopup(IBatteryMutable battery = null, string co2Saving = null) => throw new NotSupportedException(); public async Task<IUserFeedback> DisplayUserFeedbackPopup(IBatteryMutable battery = null) => throw new NotSupportedException();
#endif #endif
} }
} }

View file

@ -121,7 +121,7 @@ namespace TINK.View.Map
#if USCSHARP9 #if USCSHARP9
public Task<IViewService.IUserFeedback> DisplayUserFeedbackPopup() => throw new NotSupportedException(); public Task<IViewService.IUserFeedback> DisplayUserFeedbackPopup() => throw new NotSupportedException();
#else #else
public async Task<IUserFeedback> DisplayUserFeedbackPopup(IBatteryMutable battery = null, string co2Saving = null) => throw new NotSupportedException(); public async Task<IUserFeedback> DisplayUserFeedbackPopup(IBatteryMutable battery = null) => throw new NotSupportedException();
#endif #endif
#if USEFLYOUT #if USEFLYOUT

View file

@ -93,7 +93,7 @@ namespace TINK.View.MiniSurvey
/// <summary> Displays user feedback popup.</summary> /// <summary> Displays user feedback popup.</summary>
/// <param name="co2Saving"> Co2 saving information.</param> /// <param name="co2Saving"> Co2 saving information.</param>
/// <returns>User feedback.</returns> /// <returns>User feedback.</returns>
public async Task<IUserFeedback> DisplayUserFeedbackPopup(IBatteryMutable battery = null, string co2Saving = null) => await Navigation.ShowPopupAsync<FeedbackPopup.Result>(new FeedbackPopup(battery, co2Saving)); public async Task<IUserFeedback> DisplayUserFeedbackPopup(IBatteryMutable battery = null) => await Navigation.ShowPopupAsync<FeedbackPopup.Result>(new FeedbackPopup(battery));
#endif #endif
} }
} }

View file

@ -64,17 +64,11 @@
<sharedGui:HintForRefreshingPageView <sharedGui:HintForRefreshingPageView
Grid.Row="0"/> Grid.Row="0"/>
<!--No Bikes-->
<Label
Grid.Row="1"
Margin="20"
IsVisible="{Binding IsNoBikesOccupiedVisible}"
Text="{Binding NoBikesOccupiedText}"/>
<!--Bike(s)--> <!--Bike(s)-->
<ListView <ListView
Grid.Row="1" Grid.Row="1"
x:Name="MyBikesListView" x:Name="MyBikesListView"
BackgroundColor="{DynamicResource background-color}"
SelectionMode="None" SelectionMode="None"
SelectedItem="{Binding SelectedBike}" SelectedItem="{Binding SelectedBike}"
IsEnabled="{Binding IsIdle}" IsEnabled="{Binding IsIdle}"
@ -84,6 +78,14 @@
IsPullToRefreshEnabled="True" IsPullToRefreshEnabled="True"
RefreshCommand="{Binding RefreshCommand}" RefreshCommand="{Binding RefreshCommand}"
IsRefreshing="{Binding IsRefreshing}"/> IsRefreshing="{Binding IsRefreshing}"/>
<!--No Bikes-->
<Label
Grid.Row="1"
Margin="20"
IsVisible="{Binding IsNoBikesOccupiedVisible}"
Text="{Binding NoBikesOccupiedText}"/>
</Grid> </Grid>
</StackLayout> </StackLayout>

View file

@ -181,7 +181,7 @@ namespace TINK.View.MyBikes
/// <summary> Displays user feedback popup.</summary> /// <summary> Displays user feedback popup.</summary>
/// <param name="co2Saving"> Co2 saving information.</param> /// <param name="co2Saving"> Co2 saving information.</param>
/// <returns>User feedback.</returns> /// <returns>User feedback.</returns>
public async Task<IUserFeedback> DisplayUserFeedbackPopup(IBatteryMutable battery = null, string co2Saving = null) => await Navigation.ShowPopupAsync<FeedbackPopup.Result>(new FeedbackPopup(battery, co2Saving)); public async Task<IUserFeedback> DisplayUserFeedbackPopup(IBatteryMutable battery = null) => await Navigation.ShowPopupAsync<FeedbackPopup.Result>(new FeedbackPopup(battery));
#endif #endif
} }
} }

View file

@ -150,7 +150,7 @@ namespace TINK.View.Settings
/// <summary> Displays user feedback popup.</summary> /// <summary> Displays user feedback popup.</summary>
/// <param name="co2Saving"> Co2 saving information.</param> /// <param name="co2Saving"> Co2 saving information.</param>
/// <returns>User feedback.</returns> /// <returns>User feedback.</returns>
public async Task<IUserFeedback> DisplayUserFeedbackPopup(IBatteryMutable battery = null, string co2Saving = null) => await Navigation.ShowPopupAsync<FeedbackPopup.Result>(new FeedbackPopup(battery, co2Saving)); public async Task<IUserFeedback> DisplayUserFeedbackPopup(IBatteryMutable battery = null) => await Navigation.ShowPopupAsync<FeedbackPopup.Result>(new FeedbackPopup(battery));
#endif #endif
#if USERFEEDBACKDLG_TRYOUT #if USERFEEDBACKDLG_TRYOUT

View file

@ -77,7 +77,7 @@ namespace TINK.View.WhatsNew.Agb
#if USCSHARP9 #if USCSHARP9
public Task<IViewService.IUserFeedback> DisplayUserFeedbackPopup() => throw new NotSupportedException(); public Task<IViewService.IUserFeedback> DisplayUserFeedbackPopup() => throw new NotSupportedException();
#else #else
public async Task<IUserFeedback> DisplayUserFeedbackPopup(IBatteryMutable battery = null, string co2Saving = null) => throw new NotSupportedException(); public async Task<IUserFeedback> DisplayUserFeedbackPopup(IBatteryMutable battery = null) => throw new NotSupportedException();
#endif #endif
} }
} }

View file

@ -80,7 +80,7 @@ namespace TINK.View.WhatsNew
#if USCSHARP9 #if USCSHARP9
public Task<IViewService.IUserFeedback> DisplayUserFeedbackPopup() => throw new NotSupportedException(); public Task<IViewService.IUserFeedback> DisplayUserFeedbackPopup() => throw new NotSupportedException();
#else #else
public async Task<IUserFeedback> DisplayUserFeedbackPopup(IBatteryMutable battery = null, string co2Saving = null) => throw new NotSupportedException(); public async Task<IUserFeedback> DisplayUserFeedbackPopup(IBatteryMutable battery = null) => throw new NotSupportedException();
#endif #endif
/// <summary> /// <summary>

View file

@ -13,6 +13,12 @@ namespace TINK.Model
/// <summary> Holds info about co2 saving accomplished by using cargo bike. </summary> /// <summary> Holds info about co2 saving accomplished by using cargo bike. </summary>
public string Co2Saving { get; set; } public string Co2Saving { get; set; }
/// <summary> Holds info about driven distance. </summary>
public string Distance { get; set; }
/// <summary> Holds info about rental duration. </summary>
public string Duration { get; set; }
/// <summary> Holds info about accruing rental costs. </summary> /// <summary> Holds info about accruing rental costs. </summary>
public string RentalCosts { get; set; } public string RentalCosts { get; set; }

View file

@ -13,8 +13,10 @@ namespace TINK.Model.Connector.Updater
{ {
var bookingFinished = new BookingFinishedModel var bookingFinished = new BookingFinishedModel
{ {
Co2Saving = response?.co2saving, Co2Saving = response?.bike_returned.co2saving,
RentalCosts = "0 €", RentalCosts = response?.bike_returned.total_price,
Duration = response?.bike_returned.real_clock,
Distance = response?.bike_returned.distance,
}; };
if (response?.user_miniquery == null) if (response?.user_miniquery == null)

View file

@ -10,6 +10,12 @@ namespace TINK.Model
/// <summary> Holds info about co2 saving accomplished by using cargo bike. </summary> /// <summary> Holds info about co2 saving accomplished by using cargo bike. </summary>
string Co2Saving { get; set; } string Co2Saving { get; set; }
/// <summary> Holds info about driven distance. </summary>
string Distance { get; set; }
/// <summary> Holds info about rental duration. </summary>
string Duration { get; set; }
/// <summary> Holds info about accruing rental costs. </summary> /// <summary> Holds info about accruing rental costs. </summary>
string RentalCosts { get; set; } string RentalCosts { get; set; }
} }

View file

@ -727,6 +727,11 @@ namespace TINK.Model
string.Format("{0} <br /> {1}", AppResources.ChangeLog_PackageUpdates, AppResources.ChangeLog_MinorBugFixes), string.Format("{0} <br /> {1}", AppResources.ChangeLog_PackageUpdates, AppResources.ChangeLog_MinorBugFixes),
new List<AppFlavor> { AppFlavor.MeinKonrad, AppFlavor.ShareeBike } new List<AppFlavor> { AppFlavor.MeinKonrad, AppFlavor.ShareeBike }
}, },
{
new Version(3, 0, 373),
AppResources.ChangeLog_3_0_373_MK_SB,
new List<AppFlavor> { AppFlavor.MeinKonrad, AppFlavor.ShareeBike }
},
}; };
/// <summary> Manges the whats new information.</summary> /// <summary> Manges the whats new information.</summary>

View file

@ -214,7 +214,7 @@ namespace TINK.MultilingualResources {
} }
/// <summary> /// <summary>
/// Looks up a localized string similar to &lt;u&gt;Transfer diagnostic file&lt;/u&gt;. /// Looks up a localized string similar to Transfer diagnostic file.
/// </summary> /// </summary>
public static string ActionSendDiagnosis { public static string ActionSendDiagnosis {
get { get {
@ -268,7 +268,7 @@ namespace TINK.MultilingualResources {
} }
/// <summary> /// <summary>
/// Looks up a localized string similar to Stay with the bike until the lock is closed.. /// Looks up a localized string similar to The lock bolt moves through the spokes of the rear wheel..
/// </summary> /// </summary>
public static string ActivityTextClosingLock { public static string ActivityTextClosingLock {
get { get {
@ -645,228 +645,6 @@ namespace TINK.MultilingualResources {
} }
} }
/// <summary>
/// Looks up a localized string similar to A few small things have been changed in the design and some bugs were fixed. Enjoy the ride!.
/// </summary>
public static string ChangeLog_3_0_343_LB_MK {
get {
return ResourceManager.GetString("ChangeLog_3_0_343_LB_MK", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Minor improvements:
///- Map is centered on Bavaria.
///- Settings are available even if no user is logged in.
///- Order of tabs on instructions page were switched..
/// </summary>
public static string ChangeLog_3_0_345_LB {
get {
return ResourceManager.GetString("ChangeLog_3_0_345_LB", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Minor improvements:
///- Settings are available even if no user is logged in.
///- Order of tabs on instructions page were switched..
/// </summary>
public static string ChangeLog_3_0_345_SB_MK {
get {
return ResourceManager.GetString("ChangeLog_3_0_345_SB_MK", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to &lt;i&gt;Select Bike&lt;/i&gt; page revised.&lt;br/&gt;
///Minor improvements.&lt;br/&gt;.
/// </summary>
public static string ChangeLog_3_0_347_LB_MK {
get {
return ResourceManager.GetString("ChangeLog_3_0_347_LB_MK", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to &lt;i&gt;Select Bike&lt;/i&gt;- page revised.&lt;br/&gt;
///Setting added to select whether the app starts up showing either
///&lt;ul&gt;
///&lt;li/&gt;&lt;i&gt;Bike Locations&lt;/i&gt; or
///&lt;li/&gt;&lt;i&gt;Select Bike&lt;/i&gt;
///&lt;/ul&gt;
///page.&lt;br/&gt;
///Minor improvements.&lt;br/&gt;.
/// </summary>
public static string ChangeLog_3_0_347_SB {
get {
return ResourceManager.GetString("ChangeLog_3_0_347_SB", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to App ugraded to target api level 31 (Android 12)..
/// </summary>
public static string ChangeLog_3_0_348 {
get {
return ResourceManager.GetString("ChangeLog_3_0_348", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to The permission query for Location and Detect Nearby Devices has been adapted to Android 12. Please allow both to rent our bikes without any problems..
/// </summary>
public static string ChangeLog_3_0_349 {
get {
return ResourceManager.GetString("ChangeLog_3_0_349", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Your current position will now be displayed on the map as a blue dot, provided you turn on your location service. &lt;br/&gt;
///&lt;br/&gt;
///When logging in, you can now view the password you entered. &lt;br/&gt;
///&lt;br/&gt;
///Try it out!.
/// </summary>
public static string ChangeLog_3_0_350_SB_MK {
get {
return ResourceManager.GetString("ChangeLog_3_0_350_SB_MK", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Improvements in
///&lt;ul&gt;
///&lt;li/&gt;- Management of location services
///&lt;li/&gt;- Design of processes
///&lt;/ul&gt;.
/// </summary>
public static string ChangeLog_3_0_353_MK_SB {
get {
return ResourceManager.GetString("ChangeLog_3_0_353_MK_SB", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Bluetooth communication improved..
/// </summary>
public static string ChangeLog_3_0_355_MK_SB_iOS {
get {
return ResourceManager.GetString("ChangeLog_3_0_355_MK_SB_iOS", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to New functions:&lt;ul&gt;&lt;li&gt;If your device is not connected to the Internet, this is now displayed at the top.&lt;/li&gt;&lt;li&gt;You can now update your bike view by dragging from top to bottom. Especially useful after you reconnect to the Internet.&lt;/li&gt;&lt;/ul&gt;
///&lt;br/&gt;In addition:&lt;ul&gt;&lt;li&gt;Software packages were updated.&lt;/li&gt;&lt;li&gt;Minor bug fixes.&lt;/li&gt;&lt;/ul&gt;.
/// </summary>
public static string ChangeLog_3_0_358_MK_SB {
get {
return ResourceManager.GetString("ChangeLog_3_0_358_MK_SB", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to If you have reserved or rented a bike, this will now be shown to you as an icon on the map page. Clicking on it will take you directly to the &apos;My bikes&apos; page. We have also made small design changes..
/// </summary>
public static string ChangeLog_3_0_361_MK_SB {
get {
return ResourceManager.GetString("ChangeLog_3_0_361_MK_SB", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Some terms have been standardized, e.g:&lt;br/&gt;
///- what used to be called &apos;return bike&apos; is now always called &apos;end rental&apos;.&lt;br/&gt;
///- The &apos;operator&apos; is the group of people responsible for the bike fleet, who will be contacted if necessary.&lt;br/&gt;
///&lt;br/&gt;
///Also:&lt;br/&gt;
///- Minor bug fixes&lt;br/&gt;
///- Package updates.
/// </summary>
public static string ChangeLog_3_0_362_MK_SB {
get {
return ResourceManager.GetString("ChangeLog_3_0_362_MK_SB", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to - Bikes that must be returned to the starting station are marked as such with an icon and the station id.&lt;br/&gt;
///- What used to be called &apos;return bike&apos; is now called &apos;end rental&apos;. Always make sure to end your chargeable rental!&lt;br/&gt;
///- Bug fixes&lt;br/&gt;
///- Package updates.
/// </summary>
public static string ChangeLog_3_0_363_MK_SB {
get {
return ResourceManager.GetString("ChangeLog_3_0_363_MK_SB", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Minor design and performance improvements..
/// </summary>
public static string ChangeLog_3_0_365_MK_SB {
get {
return ResourceManager.GetString("ChangeLog_3_0_365_MK_SB", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to On the &quot;Select bike&quot; page you can now search and rent several bikes one after the other. Afterwards you will find them under &quot;My bikes&quot;..
/// </summary>
public static string ChangeLog_3_0_366_MK_SB {
get {
return ResourceManager.GetString("ChangeLog_3_0_366_MK_SB", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to We have re-designed the contact page:
/// &lt;ul&gt;&lt;li&gt;Please contact the customer support immediately in case of problems with the bike rental!
///&lt;/li&gt;&lt;li&gt;To diagnose a problem, you can send us your app usage data via &quot;Transfer diagnostic file&quot;. Without your active sending we do not record any of your data!&lt;/li&gt;&lt;/ul&gt;.
/// </summary>
public static string ChangeLog_3_0_369_MK_SB {
get {
return ResourceManager.GetString("ChangeLog_3_0_369_MK_SB", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to - We have fixed a few minor bugs. Enjoy the ride!.
/// </summary>
public static string ChangeLog_MinorBugFixes {
get {
return ResourceManager.GetString("ChangeLog_MinorBugFixes", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to - A few small things have been changed in the design..
/// </summary>
public static string ChangeLog_MinorDesignImprovements {
get {
return ResourceManager.GetString("ChangeLog_MinorDesignImprovements", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to - Minor improvements..
/// </summary>
public static string ChangeLog_MinorImprovements {
get {
return ResourceManager.GetString("ChangeLog_MinorImprovements", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to - Software packages were updated..
/// </summary>
public static string ChangeLog_PackageUpdates {
get {
return ResourceManager.GetString("ChangeLog_PackageUpdates", resourceCulture);
}
}
/// <summary> /// <summary>
/// Looks up a localized string similar to Updated to latest lock firmware.. /// Looks up a localized string similar to Updated to latest lock firmware..
/// </summary> /// </summary>
@ -1452,6 +1230,181 @@ namespace TINK.MultilingualResources {
} }
} }
/// <summary>
/// Looks up a localized string similar to A few small things have been changed in the design and some bugs were fixed. Enjoy the ride!.
/// </summary>
public static string ChangeLog_3_0_343_LB_MK {
get {
return ResourceManager.GetString("ChangeLog_3_0_343_LB_MK", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Minor improvements:
///- Map is centered on Bavaria.
///- Settings are available even if no user is logged in.
///- Order of tabs on instructions page were switched..
/// </summary>
public static string ChangeLog_3_0_345_LB {
get {
return ResourceManager.GetString("ChangeLog_3_0_345_LB", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Minor improvements:
///- Settings are available even if no user is logged in.
///- Order of tabs on instructions page were switched..
/// </summary>
public static string ChangeLog_3_0_345_SB_MK {
get {
return ResourceManager.GetString("ChangeLog_3_0_345_SB_MK", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to &lt;i&gt;Select Bike&lt;/i&gt; page revised.&lt;br/&gt;
///Minor improvements.&lt;br/&gt;.
/// </summary>
public static string ChangeLog_3_0_347_LB_MK {
get {
return ResourceManager.GetString("ChangeLog_3_0_347_LB_MK", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to &lt;i&gt;Select Bike&lt;/i&gt;- page revised.&lt;br/&gt;
///Setting added to select whether the app starts up showing either
///&lt;ul&gt;
///&lt;li/&gt;&lt;i&gt;Bike Locations&lt;/i&gt; or
///&lt;li/&gt;&lt;i&gt;Select Bike&lt;/i&gt;
///&lt;/ul&gt;
///page.&lt;br/&gt;
///Minor improvements.&lt;br/&gt;.
/// </summary>
public static string ChangeLog_3_0_347_SB {
get {
return ResourceManager.GetString("ChangeLog_3_0_347_SB", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to App ugraded to target api level 31 (Android 12)..
/// </summary>
public static string ChangeLog_3_0_348 {
get {
return ResourceManager.GetString("ChangeLog_3_0_348", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to The permission query for Location and Detect Nearby Devices has been adapted to Android 12. Please allow both to rent our bikes without any problems..
/// </summary>
public static string ChangeLog_3_0_349 {
get {
return ResourceManager.GetString("ChangeLog_3_0_349", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Your current position will now be displayed on the map as a blue dot, provided you turn on your location service. &lt;br/&gt;
///&lt;br/&gt;
///When logging in, you can now view the password you entered. &lt;br/&gt;
///&lt;br/&gt;
///Try it out!.
/// </summary>
public static string ChangeLog_3_0_350_SB_MK {
get {
return ResourceManager.GetString("ChangeLog_3_0_350_SB_MK", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Improvements in
///&lt;ul&gt;
///&lt;li/&gt;- Management of location services
///&lt;li/&gt;- Design of processes
///&lt;/ul&gt;.
/// </summary>
public static string ChangeLog_3_0_353_MK_SB {
get {
return ResourceManager.GetString("ChangeLog_3_0_353_MK_SB", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Bluetooth communication improved..
/// </summary>
public static string ChangeLog_3_0_355_MK_SB_iOS {
get {
return ResourceManager.GetString("ChangeLog_3_0_355_MK_SB_iOS", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to New functions:&lt;ul&gt;&lt;li&gt;If your device is not connected to the Internet, this is now displayed at the top.&lt;/li&gt;&lt;li&gt;You can now update your bike view by dragging from top to bottom. Especially useful after you reconnect to the Internet.&lt;/li&gt;&lt;/ul&gt;
///&lt;br/&gt;In addition:&lt;ul&gt;&lt;li&gt;Software packages were updated.&lt;/li&gt;&lt;li&gt;Minor bug fixes.&lt;/li&gt;&lt;/ul&gt;.
/// </summary>
public static string ChangeLog_3_0_358_MK_SB {
get {
return ResourceManager.GetString("ChangeLog_3_0_358_MK_SB", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to If you have reserved or rented a bike, this will now be shown to you as an icon on the map page. Clicking on it will take you directly to the &apos;My bikes&apos; page. We have also made small design changes..
/// </summary>
public static string ChangeLog_3_0_361_MK_SB {
get {
return ResourceManager.GetString("ChangeLog_3_0_361_MK_SB", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Some terms have been standardized, e.g:&lt;br/&gt;
///- what used to be called &apos;return bike&apos; is now always called &apos;end rental&apos;.&lt;br/&gt;
///- The &apos;operator&apos; is the group of people responsible for the bike fleet, who will be contacted if necessary.&lt;br/&gt;
///&lt;br/&gt;
///Also:&lt;br/&gt;
///- Minor bug fixes&lt;br/&gt;
///- Package updates.
/// </summary>
public static string ChangeLog_3_0_362_MK_SB {
get {
return ResourceManager.GetString("ChangeLog_3_0_362_MK_SB", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to - Bikes that must be returned to the starting station are marked as such with an icon and the station id.&lt;br/&gt;
///- What used to be called &apos;return bike&apos; is now called &apos;end rental&apos;. Always make sure to end your chargeable rental!&lt;br/&gt;
///- Bug fixes&lt;br/&gt;
///- Package updates.
/// </summary>
public static string ChangeLog_3_0_363_MK_SB {
get {
return ResourceManager.GetString("ChangeLog_3_0_363_MK_SB", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Minor design and performance improvements..
/// </summary>
public static string ChangeLog_3_0_365_MK_SB {
get {
return ResourceManager.GetString("ChangeLog_3_0_365_MK_SB", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to On the &quot;Select bike&quot; page you can now search and rent several bikes one after the other. Afterwards you will find them under &quot;My bikes&quot;..
/// </summary>
public static string ChangeLog_3_0_366_MK_SB {
get {
return ResourceManager.GetString("ChangeLog_3_0_366_MK_SB", resourceCulture);
}
}
/// <summary> /// <summary>
/// Looks up a localized string similar to Changes in the return process: FIRST you must always complete the &quot;Close lock&quot; process. Only THEN you can finish the rental! If your rental was successfully ended, you will see a confirmation dialog.. /// Looks up a localized string similar to Changes in the return process: FIRST you must always complete the &quot;Close lock&quot; process. Only THEN you can finish the rental! If your rental was successfully ended, you will see a confirmation dialog..
/// </summary> /// </summary>
@ -1461,6 +1414,17 @@ namespace TINK.MultilingualResources {
} }
} }
/// <summary>
/// Looks up a localized string similar to We have re-designed the contact page:
/// &lt;ul&gt;&lt;li&gt;Please contact the customer support immediately in case of problems with the bike rental!
///&lt;/li&gt;&lt;li&gt;To diagnose a problem, you can send us your app usage data via &quot;Transfer diagnostic file&quot;. Without your active sending we do not record any of your data!&lt;/li&gt;&lt;/ul&gt;.
/// </summary>
public static string ChangeLog_3_0_369_MK_SB {
get {
return ResourceManager.GetString("ChangeLog_3_0_369_MK_SB", resourceCulture);
}
}
/// <summary> /// <summary>
/// Looks up a localized string similar to Attention! We have changed the process of how the rental is terminated:&lt;br/&gt; /// Looks up a localized string similar to Attention! We have changed the process of how the rental is terminated:&lt;br/&gt;
///1. &lt;b&gt;Close lock&lt;/b&gt; first and follow the process to the end.&lt;br/&gt; ///1. &lt;b&gt;Close lock&lt;/b&gt; first and follow the process to the end.&lt;br/&gt;
@ -1494,6 +1458,51 @@ namespace TINK.MultilingualResources {
} }
} }
/// <summary>
/// Looks up a localized string similar to In your end-of-rental confirmation, you will now see the amount of rental costs that will be automatically debited from your deposited means of payment. Furthermore, you can view your past rentals and the costs incurred for them at any time under &quot;Account&quot;..
/// </summary>
public static string ChangeLog_3_0_373_MK_SB {
get {
return ResourceManager.GetString("ChangeLog_3_0_373_MK_SB", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to - We have fixed a few minor bugs. Enjoy the ride!.
/// </summary>
public static string ChangeLog_MinorBugFixes {
get {
return ResourceManager.GetString("ChangeLog_MinorBugFixes", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to - A few small things have been changed in the design..
/// </summary>
public static string ChangeLog_MinorDesignImprovements {
get {
return ResourceManager.GetString("ChangeLog_MinorDesignImprovements", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to - Minor improvements..
/// </summary>
public static string ChangeLog_MinorImprovements {
get {
return ResourceManager.GetString("ChangeLog_MinorImprovements", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to - Software packages were updated..
/// </summary>
public static string ChangeLog_PackageUpdates {
get {
return ResourceManager.GetString("ChangeLog_PackageUpdates", resourceCulture);
}
}
/// <summary> /// <summary>
/// Looks up a localized string similar to Your session has expired. Please login new and try again.. /// Looks up a localized string similar to Your session has expired. Please login new and try again..
/// </summary> /// </summary>
@ -1717,7 +1726,16 @@ namespace TINK.MultilingualResources {
} }
/// <summary> /// <summary>
/// Looks up a localized string similar to Can not login user {0}. Mail address unknown or password invalid.. /// Looks up a localized string similar to User {0} already logged in..
/// </summary>
public static string ErrorLoginAlreadyLoggedIn {
get {
return ResourceManager.GetString("ErrorLoginAlreadyLoggedIn", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Incorrect email address or password. Correct your input and try again..
/// </summary> /// </summary>
public static string ErrorLoginInvalidAuthorization { public static string ErrorLoginInvalidAuthorization {
get { get {
@ -1725,6 +1743,15 @@ namespace TINK.MultilingualResources {
} }
} }
/// <summary>
/// Looks up a localized string similar to You must enter a valid email address and a password of at least 8 characters..
/// </summary>
public static string ErrorLoginInvalidMailOrPasswortInput {
get {
return ResourceManager.GetString("ErrorLoginInvalidMailOrPasswortInput", resourceCulture);
}
}
/// <summary> /// <summary>
/// Looks up a localized string similar to Login cookie must not be empty. {0}. /// Looks up a localized string similar to Login cookie must not be empty. {0}.
/// </summary> /// </summary>
@ -1974,7 +2001,17 @@ namespace TINK.MultilingualResources {
} }
/// <summary> /// <summary>
/// Looks up a localized string similar to Bike with id {0} may already be reserved by another user or it may be defective.. /// Looks up a localized string similar to Enter the bike id. It consists of prefix and number, e.g. TR15..
/// </summary>
public static string ErrorSelectBikeInputNotSufficent {
get {
return ResourceManager.GetString("ErrorSelectBikeInputNotSufficent", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Bike with id {0} may already be reserved by another user or it may be defective.
///Or has a typo crept in?.
/// </summary> /// </summary>
public static string ErrorSelectBikeNoBikeFound { public static string ErrorSelectBikeNoBikeFound {
get { get {
@ -1982,6 +2019,15 @@ namespace TINK.MultilingualResources {
} }
} }
/// <summary>
/// Looks up a localized string similar to Hint: Your are currently searching filtered for a &quot;{0}&quot;. Change your selection at &quot;Bike locations&quot;..
/// </summary>
public static string ErrorSelectBikeNoBikeFoundBikeTypeHint {
get {
return ResourceManager.GetString("ErrorSelectBikeNoBikeFoundBikeTypeHint", resourceCulture);
}
}
/// <summary> /// <summary>
/// Looks up a localized string similar to The requested bike was not found.. /// Looks up a localized string similar to The requested bike was not found..
/// </summary> /// </summary>
@ -2535,7 +2581,9 @@ namespace TINK.MultilingualResources {
} }
/// <summary> /// <summary>
/// Looks up a localized string similar to Check if the lock is really closed!. /// Looks up a localized string similar to Check if the lock is really closed.
///
///Wait for confirmation!.
/// </summary> /// </summary>
public static string MarkingRentalProcessCloseLockCheckLock { public static string MarkingRentalProcessCloseLockCheckLock {
get { get {
@ -2544,7 +2592,27 @@ namespace TINK.MultilingualResources {
} }
/// <summary> /// <summary>
/// Looks up a localized string similar to Watch the lock as it is closing!. /// Looks up a localized string similar to Close lock.
/// </summary>
public static string MarkingRentalProcessCloseLockFirstStep {
get {
return ResourceManager.GetString("MarkingRentalProcessCloseLockFirstStep", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Lock is closed.
/// </summary>
public static string MarkingRentalProcessCloseLockFirstStepFinished {
get {
return ResourceManager.GetString("MarkingRentalProcessCloseLockFirstStepFinished", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Watch the lock as it is closing.
///
///Wait for confirmation!.
/// </summary> /// </summary>
public static string MarkingRentalProcessCloseLockObserve { public static string MarkingRentalProcessCloseLockObserve {
get { get {
@ -2552,6 +2620,15 @@ namespace TINK.MultilingualResources {
} }
} }
/// <summary>
/// Looks up a localized string similar to End rental?.
/// </summary>
public static string MarkingRentalProcessCloseLockSecondStep {
get {
return ResourceManager.GetString("MarkingRentalProcessCloseLockSecondStep", resourceCulture);
}
}
/// <summary> /// <summary>
/// Looks up a localized string similar to Lock closes.. /// Looks up a localized string similar to Lock closes..
/// </summary> /// </summary>
@ -2579,6 +2656,42 @@ namespace TINK.MultilingualResources {
} }
} }
/// <summary>
/// Looks up a localized string similar to Check station.
/// </summary>
public static string MarkingRentalProcessEndRentalFirstStep {
get {
return ResourceManager.GetString("MarkingRentalProcessEndRentalFirstStep", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to At station.
/// </summary>
public static string MarkingRentalProcessEndRentalFirstStepFinished {
get {
return ResourceManager.GetString("MarkingRentalProcessEndRentalFirstStepFinished", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Give feedback.
/// </summary>
public static string MarkingRentalProcessEndRentalSecondStep {
get {
return ResourceManager.GetString("MarkingRentalProcessEndRentalSecondStep", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Feedback.
/// </summary>
public static string MarkingRentalProcessEndRentalSecondStepFinished {
get {
return ResourceManager.GetString("MarkingRentalProcessEndRentalSecondStepFinished", resourceCulture);
}
}
/// <summary> /// <summary>
/// Looks up a localized string similar to Give feedback on the bike.. /// Looks up a localized string similar to Give feedback on the bike..
/// </summary> /// </summary>
@ -2606,6 +2719,15 @@ namespace TINK.MultilingualResources {
} }
} }
/// <summary>
/// Looks up a localized string similar to End rental.
/// </summary>
public static string MarkingRentalProcessEndRentalThirdStep {
get {
return ResourceManager.GetString("MarkingRentalProcessEndRentalThirdStep", resourceCulture);
}
}
/// <summary> /// <summary>
/// Looks up a localized string similar to Wait for the end of rental confirmation!. /// Looks up a localized string similar to Wait for the end of rental confirmation!.
/// </summary> /// </summary>
@ -2787,7 +2909,7 @@ namespace TINK.MultilingualResources {
} }
/// <summary> /// <summary>
/// Looks up a localized string similar to Circular drives only!. /// Looks up a localized string similar to Circular rides only!.
/// </summary> /// </summary>
public static string MessageAaRideTypeInfoTitle { public static string MessageAaRideTypeInfoTitle {
get { get {
@ -3024,7 +3146,7 @@ namespace TINK.MultilingualResources {
} }
/// <summary> /// <summary>
/// Looks up a localized string similar to You can search only the bikes of the selected bike type. Change your selection on the &quot;Bike locations&quot; page.. /// Looks up a localized string similar to You can search only the bikes of the selected bike type. Change your selection at &quot;Bike locations&quot;..
/// </summary> /// </summary>
public static string MessageBikeTypeInfoText { public static string MessageBikeTypeInfoText {
get { get {
@ -3106,7 +3228,7 @@ namespace TINK.MultilingualResources {
} }
/// <summary> /// <summary>
/// Looks up a localized string similar to User {0} successfully logged in.. /// Looks up a localized string similar to User {0} successfully logged out..
/// </summary> /// </summary>
public static string MessageLogoutGoodbye { public static string MessageLogoutGoodbye {
get { get {
@ -3169,7 +3291,54 @@ namespace TINK.MultilingualResources {
} }
/// <summary> /// <summary>
/// Looks up a localized string similar to Rental costs will be automatically debited within the next days. Ensure sufficient account coverage. You can view your rental history under Account. /// Looks up a localized string similar to CO2 savings: {0}.
/// </summary>
public static string MessageRentalProcessEndRentalFinishedCO2SavingText {
get {
return ResourceManager.GetString("MessageRentalProcessEndRentalFinishedCO2SavingText", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Distance cycled: {0}.
/// </summary>
public static string MessageRentalProcessEndRentalFinishedDistanceText {
get {
return ResourceManager.GetString("MessageRentalProcessEndRentalFinishedDistanceText", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Rental duration: {0}.
/// </summary>
public static string MessageRentalProcessEndRentalFinishedDurationText {
get {
return ResourceManager.GetString("MessageRentalProcessEndRentalFinishedDurationText", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Rental costs: 0.00 €.
/// </summary>
public static string MessageRentalProcessEndRentalFinishedNoRentalCostsText {
get {
return ResourceManager.GetString("MessageRentalProcessEndRentalFinishedNoRentalCostsText", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Rental costs: {0}
///
///The costs will be debited automatically within the next days. Ensure sufficient account coverage..
/// </summary>
public static string MessageRentalProcessEndRentalFinishedRentalCostsText {
get {
return ResourceManager.GetString("MessageRentalProcessEndRentalFinishedRentalCostsText", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to View your rental history under &quot;Account&quot;.
/// ///
///Thank you for your ride!. ///Thank you for your ride!.
/// </summary> /// </summary>

View file

@ -289,7 +289,7 @@ Freigabedialog öffen?</value>
<value>Um den Schlossstatus zu aktualisieren, wird Internet benötigt. Bitte stellen Sie eine Internetverbindung her!</value> <value>Um den Schlossstatus zu aktualisieren, wird Internet benötigt. Bitte stellen Sie eine Internetverbindung her!</value>
</data> </data>
<data name="ActivityTextClosingLock" xml:space="preserve"> <data name="ActivityTextClosingLock" xml:space="preserve">
<value>Bleiben Sie am Fahrrad stehen, bis das Schloss geschlossen ist.</value> <value>Der Schlossbügel bewegt sich durch die Speichen des Hinterrads.</value>
</data> </data>
<data name="ChangeLog_3_0_203" xml:space="preserve"> <data name="ChangeLog_3_0_203" xml:space="preserve">
<value>Aktualisierrt auf aktuelle Schloss-Firmware.</value> <value>Aktualisierrt auf aktuelle Schloss-Firmware.</value>
@ -653,7 +653,8 @@ Fehlerbehebung: Supportmails können wieder verschickt werden.</value>
{0}</value> {0}</value>
</data> </data>
<data name="ErrorSelectBikeNoBikeFound" xml:space="preserve"> <data name="ErrorSelectBikeNoBikeFound" xml:space="preserve">
<value>Das Fahrrad mit ID {0} ist möglicherweise bereits durch einen anderen Nutzer / eine andere Nutzerin reserviert oder defekt.</value> <value>Das Fahrrad mit ID {0} ist möglicherweise bereits durch einen anderen Nutzer / eine andere Nutzerin reserviert oder defekt.
Oder hat sich ein Tippfehler eingeschlichen?</value>
</data> </data>
<data name="ErrorSelectBikeTitle" xml:space="preserve"> <data name="ErrorSelectBikeTitle" xml:space="preserve">
<value>Das angefragte Fahrrad wurde nicht gefunden.</value> <value>Das angefragte Fahrrad wurde nicht gefunden.</value>
@ -789,7 +790,7 @@ Kleinere Fehlerbehebungen.
<value>Reservierung konnte nicht aufgehoben werden!</value> <value>Reservierung konnte nicht aufgehoben werden!</value>
</data> </data>
<data name="ErrorLoginInvalidAuthorization" xml:space="preserve"> <data name="ErrorLoginInvalidAuthorization" xml:space="preserve">
<value>Kann Benutzenden {0} nicht anmelden. Mailadresse unbekannt oder Passwort ungültig.</value> <value>E-Mailadresse oder Passwort falsch. Korrigieren Sie Ihre Eingabe und versuchen Sie es erneut.</value>
</data> </data>
<data name="ActivityTextSubmittingFeedback" xml:space="preserve"> <data name="ActivityTextSubmittingFeedback" xml:space="preserve">
<value>Sende Rückmeldung...</value> <value>Sende Rückmeldung...</value>
@ -1029,7 +1030,7 @@ Außerdem:&lt;br/&gt;
<value>Sie suchen ein </value> <value>Sie suchen ein </value>
</data> </data>
<data name="MessageBikeTypeInfoText" xml:space="preserve"> <data name="MessageBikeTypeInfoText" xml:space="preserve">
<value>Sie können nur die Fahrräder des ausgewählten Fahrradtyps suchen. Ändern Sie Ihre Auswahl auf der Seite "Radstandorte".</value> <value>Sie können nur die Fahrräder des ausgewählten Fahrradtyps suchen. Ändern Sie Ihre Auswahl unter "Radstandorte".</value>
</data> </data>
<data name="MessageBikeTypeInfoTitle" xml:space="preserve"> <data name="MessageBikeTypeInfoTitle" xml:space="preserve">
<value>Ausgewählter Fahrradtyp</value> <value>Ausgewählter Fahrradtyp</value>
@ -1041,7 +1042,7 @@ Außerdem:&lt;br/&gt;
<value>Auf der Seite "Rad auswählen" können Sie nun nacheinander mehrere Räder suchen und mieten. Im Anschluss finden Sie diese unter "Meine Räder".</value> <value>Auf der Seite "Rad auswählen" können Sie nun nacheinander mehrere Räder suchen und mieten. Im Anschluss finden Sie diese unter "Meine Räder".</value>
</data> </data>
<data name="MessageRentalProcessEndRentalFinishedText" xml:space="preserve"> <data name="MessageRentalProcessEndRentalFinishedText" xml:space="preserve">
<value>Die Mietkosten werden in den nächsten Tagen automatisch abgebucht. Sorgen Sie für ausreichende Kontodeckung. Ihre Miethistorie können Sie unter Konto einsehen. <value>Sehen Sie Ihre Miethistorie unter "Konto" ein.
Vielen Dank für Ihre Fahrt!</value> Vielen Dank für Ihre Fahrt!</value>
</data> </data>
@ -1082,7 +1083,7 @@ Vielen Dank für Ihre Fahrt!</value>
<value>Andere Station auswählen</value> <value>Andere Station auswählen</value>
</data> </data>
<data name="ActionSendDiagnosis" xml:space="preserve"> <data name="ActionSendDiagnosis" xml:space="preserve">
<value>&lt;u&gt;Diagnosedatei übermitteln&lt;/u&gt;</value> <value>Diagnosedatei übermitteln</value>
</data> </data>
<data name="MarkingLastSelectedStation" xml:space="preserve"> <data name="MarkingLastSelectedStation" xml:space="preserve">
<value>Zuletzt ausgewählte Station</value> <value>Zuletzt ausgewählte Station</value>
@ -1105,7 +1106,9 @@ Vielen Dank für Ihre Fahrt!</value>
<value>Miete ist beendet</value> <value>Miete ist beendet</value>
</data> </data>
<data name="MarkingRentalProcessCloseLockObserve" xml:space="preserve"> <data name="MarkingRentalProcessCloseLockObserve" xml:space="preserve">
<value>Beobachten Sie das Schloss beim Schließen!</value> <value>Beobachten Sie das Schloss beim Schließen.
Warten Sie auf die Bestätigung!</value>
</data> </data>
<data name="MarkingRentalProcessEndRentalWait" xml:space="preserve"> <data name="MarkingRentalProcessEndRentalWait" xml:space="preserve">
<value>Warten Sie auf die Mietende-Bestätigung!</value> <value>Warten Sie auf die Mietende-Bestätigung!</value>
@ -1138,7 +1141,9 @@ Vielen Dank für Ihre Fahrt!</value>
<value>Miete beenden</value> <value>Miete beenden</value>
</data> </data>
<data name="MarkingRentalProcessCloseLockCheckLock" xml:space="preserve"> <data name="MarkingRentalProcessCloseLockCheckLock" xml:space="preserve">
<value>Schauen Sie, ob das Schloss wirklich zu ist!</value> <value>Schauen Sie, ob das Schloss wirklich zu ist.
Warten Sie auf die Bestätigung!</value>
</data> </data>
<data name="SupportmailSubjectAppmailWithStation" xml:space="preserve"> <data name="SupportmailSubjectAppmailWithStation" xml:space="preserve">
<value>{0}-App Anfrage: Station {1}</value> <value>{0}-App Anfrage: Station {1}</value>
@ -1265,4 +1270,60 @@ Wichtig: Senden Sie eine E-Mail an den Kundensupport (sonst wird Ihre bezahlte M
<data name="ChangeLog_3_0_371_SB" xml:space="preserve"> <data name="ChangeLog_3_0_371_SB" xml:space="preserve">
<value>Einfacher Zugriff auf die FAQ: Im Menü unter Hilfe können Sie bei Fragen und Problemen nun ganz einfach selber nach einer Lösung suchen.</value> <value>Einfacher Zugriff auf die FAQ: Im Menü unter Hilfe können Sie bei Fragen und Problemen nun ganz einfach selber nach einer Lösung suchen.</value>
</data> </data>
<data name="MessageRentalProcessEndRentalFinishedCO2SavingText" xml:space="preserve">
<value>CO2-Einsparung: {0}</value>
</data>
<data name="MessageRentalProcessEndRentalFinishedDistanceText" xml:space="preserve">
<value>Geradelte Strecke: {0}</value>
</data>
<data name="MessageRentalProcessEndRentalFinishedDurationText" xml:space="preserve">
<value>Mietdauer: {0}</value>
</data>
<data name="MessageRentalProcessEndRentalFinishedRentalCostsText" xml:space="preserve">
<value>Mietkosten: {0}
Die Kosten werden in den nächsten Tagen automatisch abgebucht. Sorgen Sie für ausreichende Kontodeckung.</value>
</data>
<data name="MessageRentalProcessEndRentalFinishedNoRentalCostsText" xml:space="preserve">
<value>Mietkosten: 0,00 €</value>
</data>
<data name="MarkingRentalProcessCloseLockFirstStep" xml:space="preserve">
<value>Schloss schließen</value>
</data>
<data name="MarkingRentalProcessCloseLockFirstStepFinished" xml:space="preserve">
<value>Schloss geschlossen</value>
</data>
<data name="MarkingRentalProcessCloseLockSecondStep" xml:space="preserve">
<value>Miete beenden?</value>
</data>
<data name="MarkingRentalProcessEndRentalFirstStep" xml:space="preserve">
<value>Station prüfen</value>
</data>
<data name="MarkingRentalProcessEndRentalFirstStepFinished" xml:space="preserve">
<value>an Station</value>
</data>
<data name="MarkingRentalProcessEndRentalSecondStep" xml:space="preserve">
<value>Rückmeldung geben</value>
</data>
<data name="MarkingRentalProcessEndRentalSecondStepFinished" xml:space="preserve">
<value>Rückmeldung</value>
</data>
<data name="MarkingRentalProcessEndRentalThirdStep" xml:space="preserve">
<value>Miete beenden</value>
</data>
<data name="ErrorSelectBikeNoBikeFoundBikeTypeHint" xml:space="preserve">
<value>Hinweis: Sie suchen gerade gefiltert nach einem "{0}". Ändern Sie Ihre Auswahl unter "Radstandorte".</value>
</data>
<data name="ErrorLoginAlreadyLoggedIn" xml:space="preserve">
<value>NutzerIn {0} bereits angemeldet.</value>
</data>
<data name="ErrorLoginInvalidMailOrPasswortInput" xml:space="preserve">
<value>Sie müssen eine gültige E-Mailadresse und ein mindestens 8 Zeichen langes Passwort eingeben.</value>
</data>
<data name="ErrorSelectBikeInputNotSufficent" xml:space="preserve">
<value>Geben Sie die Fahrrad ID ein. Sie besteht aus Präfix und Nummer, z.B. TR15.</value>
</data>
<data name="ChangeLog_3_0_373_MK_SB" xml:space="preserve">
<value>In Ihrer Mietende-Bestätigung steht nun welcher Betrag an Mietkosten automatisch von Ihrem hinterlegten Zahlungsmittel abgebucht werden. Weiterhin können Sie Ihre vergangenen Mieten und dafür anfallenden Kosten jederzeit unter "Konto" einsehen.</value>
</data>
</root> </root>

View file

@ -416,7 +416,7 @@ Open sharing dialog?</value>
<value>Internet must be available for updating lock status. Please establish an Internet connection!</value> <value>Internet must be available for updating lock status. Please establish an Internet connection!</value>
</data> </data>
<data name="ActivityTextClosingLock" xml:space="preserve"> <data name="ActivityTextClosingLock" xml:space="preserve">
<value>Stay with the bike until the lock is closed.</value> <value>The lock bolt moves through the spokes of the rear wheel.</value>
</data> </data>
<data name="ChangeLog_3_0_203" xml:space="preserve"> <data name="ChangeLog_3_0_203" xml:space="preserve">
<value>Updated to latest lock firmware.</value> <value>Updated to latest lock firmware.</value>
@ -776,7 +776,8 @@ Bugfix: Sending support mails works again. </value>
{0}</value> {0}</value>
</data> </data>
<data name="ErrorSelectBikeNoBikeFound" xml:space="preserve"> <data name="ErrorSelectBikeNoBikeFound" xml:space="preserve">
<value>Bike with id {0} may already be reserved by another user or it may be defective.</value> <value>Bike with id {0} may already be reserved by another user or it may be defective.
Or has a typo crept in?</value>
</data> </data>
<data name="ErrorSelectBikeTitle" xml:space="preserve"> <data name="ErrorSelectBikeTitle" xml:space="preserve">
<value>The requested bike was not found.</value> <value>The requested bike was not found.</value>
@ -923,7 +924,7 @@ Minor bugfixes.</value>
<value>Bike could not be reserved!</value> <value>Bike could not be reserved!</value>
</data> </data>
<data name="ErrorLoginInvalidAuthorization" xml:space="preserve"> <data name="ErrorLoginInvalidAuthorization" xml:space="preserve">
<value>Can not login user {0}. Mail address unknown or password invalid.</value> <value>Incorrect email address or password. Correct your input and try again.</value>
</data> </data>
<data name="ActivityTextSubmittingFeedback" xml:space="preserve"> <data name="ActivityTextSubmittingFeedback" xml:space="preserve">
<value>Submitting feedback...</value> <value>Submitting feedback...</value>
@ -1125,7 +1126,7 @@ Also:&lt;br/&gt;
- Package updates</value> - Package updates</value>
</data> </data>
<data name="MessageAaRideTypeInfoTitle" xml:space="preserve"> <data name="MessageAaRideTypeInfoTitle" xml:space="preserve">
<value>Circular drives only!</value> <value>Circular rides only!</value>
</data> </data>
<data name="ChangeLog_3_0_363_MK_SB" xml:space="preserve"> <data name="ChangeLog_3_0_363_MK_SB" xml:space="preserve">
<value>- Bikes that must be returned to the starting station are marked as such with an icon and the station id.&lt;br/&gt; <value>- Bikes that must be returned to the starting station are marked as such with an icon and the station id.&lt;br/&gt;
@ -1158,7 +1159,7 @@ Also:&lt;br/&gt;
<value>You search a </value> <value>You search a </value>
</data> </data>
<data name="MessageBikeTypeInfoText" xml:space="preserve"> <data name="MessageBikeTypeInfoText" xml:space="preserve">
<value>You can search only the bikes of the selected bike type. Change your selection on the "Bike locations" page.</value> <value>You can search only the bikes of the selected bike type. Change your selection at "Bike locations".</value>
</data> </data>
<data name="MessageBikeTypeInfoTitle" xml:space="preserve"> <data name="MessageBikeTypeInfoTitle" xml:space="preserve">
<value>Selected bike type</value> <value>Selected bike type</value>
@ -1176,7 +1177,9 @@ Also:&lt;br/&gt;
<value>Lock closes.</value> <value>Lock closes.</value>
</data> </data>
<data name="MarkingRentalProcessCloseLockObserve" xml:space="preserve"> <data name="MarkingRentalProcessCloseLockObserve" xml:space="preserve">
<value>Watch the lock as it is closing!</value> <value>Watch the lock as it is closing.
Wait for confirmation!</value>
</data> </data>
<data name="MarkingRentalProcessCloseLockStepUpload" xml:space="preserve"> <data name="MarkingRentalProcessCloseLockStepUpload" xml:space="preserve">
<value>Status is being synchronized.</value> <value>Status is being synchronized.</value>
@ -1203,7 +1206,7 @@ Also:&lt;br/&gt;
<value>Finished</value> <value>Finished</value>
</data> </data>
<data name="MessageRentalProcessEndRentalFinishedText" xml:space="preserve"> <data name="MessageRentalProcessEndRentalFinishedText" xml:space="preserve">
<value>Rental costs will be automatically debited within the next days. Ensure sufficient account coverage. You can view your rental history under Account. <value>View your rental history under "Account".
Thank you for your ride!</value> Thank you for your ride!</value>
</data> </data>
@ -1226,7 +1229,7 @@ Thank you for your ride!</value>
<value>Operator</value> <value>Operator</value>
</data> </data>
<data name="ActionSendDiagnosis" xml:space="preserve"> <data name="ActionSendDiagnosis" xml:space="preserve">
<value>&lt;u&gt;Transfer diagnostic file&lt;/u&gt;</value> <value>Transfer diagnostic file</value>
</data> </data>
<data name="ChangeLog_3_0_369_MK_SB" xml:space="preserve"> <data name="ChangeLog_3_0_369_MK_SB" xml:space="preserve">
<value>We have re-designed the contact page: <value>We have re-designed the contact page:
@ -1264,7 +1267,9 @@ Thank you for your ride!</value>
<value>End rental</value> <value>End rental</value>
</data> </data>
<data name="MarkingRentalProcessCloseLockCheckLock" xml:space="preserve"> <data name="MarkingRentalProcessCloseLockCheckLock" xml:space="preserve">
<value>Check if the lock is really closed!</value> <value>Check if the lock is really closed.
Wait for confirmation!</value>
</data> </data>
<data name="SupportmailSubjectAppmail" xml:space="preserve"> <data name="SupportmailSubjectAppmail" xml:space="preserve">
<value>{0}-app request</value> <value>{0}-app request</value>
@ -1322,7 +1327,7 @@ Important: Send an email to customer support (otherwise your paid rental will co
<value>Currently {0} bikes reserved/ booked.</value> <value>Currently {0} bikes reserved/ booked.</value>
</data> </data>
<data name="MessageLogoutGoodbye" xml:space="preserve"> <data name="MessageLogoutGoodbye" xml:space="preserve">
<value>User {0} successfully logged in.</value> <value>User {0} successfully logged out.</value>
</data> </data>
<data name="MessageLogoutGoodbyeTitle" xml:space="preserve"> <data name="MessageLogoutGoodbyeTitle" xml:space="preserve">
<value>Goodbye!</value> <value>Goodbye!</value>
@ -1357,4 +1362,60 @@ Important: Send an email to customer support (otherwise your paid rental will co
<data name="ChangeLog_3_0_371_SB" xml:space="preserve"> <data name="ChangeLog_3_0_371_SB" xml:space="preserve">
<value>Easy access to FAQ: In the menu under Help, you can now easily search for a solution yourself for questions and problems.</value> <value>Easy access to FAQ: In the menu under Help, you can now easily search for a solution yourself for questions and problems.</value>
</data> </data>
<data name="MessageRentalProcessEndRentalFinishedCO2SavingText" xml:space="preserve">
<value>CO2 savings: {0}</value>
</data>
<data name="MessageRentalProcessEndRentalFinishedDistanceText" xml:space="preserve">
<value>Distance cycled: {0}</value>
</data>
<data name="MessageRentalProcessEndRentalFinishedDurationText" xml:space="preserve">
<value>Rental duration: {0}</value>
</data>
<data name="MessageRentalProcessEndRentalFinishedNoRentalCostsText" xml:space="preserve">
<value>Rental costs: 0.00 €</value>
</data>
<data name="MessageRentalProcessEndRentalFinishedRentalCostsText" xml:space="preserve">
<value>Rental costs: {0}
The costs will be debited automatically within the next days. Ensure sufficient account coverage.</value>
</data>
<data name="MarkingRentalProcessCloseLockFirstStep" xml:space="preserve">
<value>Close lock</value>
</data>
<data name="MarkingRentalProcessCloseLockFirstStepFinished" xml:space="preserve">
<value>Lock is closed</value>
</data>
<data name="MarkingRentalProcessCloseLockSecondStep" xml:space="preserve">
<value>End rental?</value>
</data>
<data name="MarkingRentalProcessEndRentalFirstStep" xml:space="preserve">
<value>Check station</value>
</data>
<data name="MarkingRentalProcessEndRentalFirstStepFinished" xml:space="preserve">
<value>At station</value>
</data>
<data name="MarkingRentalProcessEndRentalSecondStep" xml:space="preserve">
<value>Give feedback</value>
</data>
<data name="MarkingRentalProcessEndRentalSecondStepFinished" xml:space="preserve">
<value>Feedback</value>
</data>
<data name="MarkingRentalProcessEndRentalThirdStep" xml:space="preserve">
<value>End rental</value>
</data>
<data name="ErrorSelectBikeNoBikeFoundBikeTypeHint" xml:space="preserve">
<value>Hint: Your are currently searching filtered for a "{0}". Change your selection at "Bike locations".</value>
</data>
<data name="ErrorLoginAlreadyLoggedIn" xml:space="preserve">
<value>User {0} already logged in.</value>
</data>
<data name="ErrorLoginInvalidMailOrPasswortInput" xml:space="preserve">
<value>You must enter a valid email address and a password of at least 8 characters.</value>
</data>
<data name="ErrorSelectBikeInputNotSufficent" xml:space="preserve">
<value>Enter the bike id. It consists of prefix and number, e.g. TR15.</value>
</data>
<data name="ChangeLog_3_0_373_MK_SB" xml:space="preserve">
<value>In your end-of-rental confirmation, you will now see the amount of rental costs that will be automatically debited from your deposited means of payment. Furthermore, you can view your past rentals and the costs incurred for them at any time under "Account".</value>
</data>
</root> </root>

View file

@ -379,8 +379,8 @@ Freigabedialog öffen?</target>
<target state="translated">Um den Schlossstatus zu aktualisieren, wird Internet benötigt. Bitte stellen Sie eine Internetverbindung her!</target> <target state="translated">Um den Schlossstatus zu aktualisieren, wird Internet benötigt. Bitte stellen Sie eine Internetverbindung her!</target>
</trans-unit> </trans-unit>
<trans-unit id="ActivityTextClosingLock" translate="yes" xml:space="preserve"> <trans-unit id="ActivityTextClosingLock" translate="yes" xml:space="preserve">
<source>Stay with the bike until the lock is closed.</source> <source>The lock bolt moves through the spokes of the rear wheel.</source>
<target state="translated">Bleiben Sie am Fahrrad stehen, bis das Schloss geschlossen ist.</target> <target state="translated">Der Schlossbügel bewegt sich durch die Speichen des Hinterrads.</target>
</trans-unit> </trans-unit>
<trans-unit id="ChangeLog_3_0_203" translate="yes" xml:space="preserve"> <trans-unit id="ChangeLog_3_0_203" translate="yes" xml:space="preserve">
<source>Updated to latest lock firmware.</source> <source>Updated to latest lock firmware.</source>
@ -881,8 +881,10 @@ Fehlerbehebung: Supportmails können wieder verschickt werden.</target>
{0}</target> {0}</target>
</trans-unit> </trans-unit>
<trans-unit id="ErrorSelectBikeNoBikeFound" translate="yes" xml:space="preserve"> <trans-unit id="ErrorSelectBikeNoBikeFound" translate="yes" xml:space="preserve">
<source>Bike with id {0} may already be reserved by another user or it may be defective.</source> <source>Bike with id {0} may already be reserved by another user or it may be defective.
<target state="translated">Das Fahrrad mit ID {0} ist möglicherweise bereits durch einen anderen Nutzer / eine andere Nutzerin reserviert oder defekt.</target> Or has a typo crept in?</source>
<target state="translated">Das Fahrrad mit ID {0} ist möglicherweise bereits durch einen anderen Nutzer / eine andere Nutzerin reserviert oder defekt.
Oder hat sich ein Tippfehler eingeschlichen?</target>
</trans-unit> </trans-unit>
<trans-unit id="ErrorSelectBikeTitle" translate="yes" xml:space="preserve"> <trans-unit id="ErrorSelectBikeTitle" translate="yes" xml:space="preserve">
<source>The requested bike was not found.</source> <source>The requested bike was not found.</source>
@ -1070,8 +1072,8 @@ Kleinere Fehlerbehebungen.
<target state="translated">Reservierung konnte nicht aufgehoben werden!</target> <target state="translated">Reservierung konnte nicht aufgehoben werden!</target>
</trans-unit> </trans-unit>
<trans-unit id="ErrorLoginInvalidAuthorization" translate="yes" xml:space="preserve"> <trans-unit id="ErrorLoginInvalidAuthorization" translate="yes" xml:space="preserve">
<source>Can not login user {0}. Mail address unknown or password invalid.</source> <source>Incorrect email address or password. Correct your input and try again.</source>
<target state="translated">Kann Benutzenden {0} nicht anmelden. Mailadresse unbekannt oder Passwort ungültig.</target> <target state="translated">E-Mailadresse oder Passwort falsch. Korrigieren Sie Ihre Eingabe und versuchen Sie es erneut.</target>
</trans-unit> </trans-unit>
<trans-unit id="ActivityTextSubmittingFeedback" translate="yes" xml:space="preserve"> <trans-unit id="ActivityTextSubmittingFeedback" translate="yes" xml:space="preserve">
<source>Submitting feedback...</source> <source>Submitting feedback...</source>
@ -1376,9 +1378,8 @@ Außerdem:&lt;br/&gt;
- Paketaktualisierungen</target> - Paketaktualisierungen</target>
</trans-unit> </trans-unit>
<trans-unit id="MessageAaRideTypeInfoTitle" translate="yes" xml:space="preserve"> <trans-unit id="MessageAaRideTypeInfoTitle" translate="yes" xml:space="preserve">
<source>Circular drives only!</source> <source>Circular rides only!</source>
<target state="translated">Nur Kreisfahrten!</target> <target state="translated">Nur Kreisfahrten!</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="ChangeLog_3_0_363_MK_SB" translate="yes" xml:space="preserve"> <trans-unit id="ChangeLog_3_0_363_MK_SB" translate="yes" xml:space="preserve">
<source>- Bikes that must be returned to the starting station are marked as such with an icon and the station id.&lt;br/&gt; <source>- Bikes that must be returned to the starting station are marked as such with an icon and the station id.&lt;br/&gt;
@ -1419,8 +1420,8 @@ Außerdem:&lt;br/&gt;
<target state="translated">Sie suchen ein </target> <target state="translated">Sie suchen ein </target>
</trans-unit> </trans-unit>
<trans-unit id="MessageBikeTypeInfoText" translate="yes" xml:space="preserve"> <trans-unit id="MessageBikeTypeInfoText" translate="yes" xml:space="preserve">
<source>You can search only the bikes of the selected bike type. Change your selection on the "Bike locations" page.</source> <source>You can search only the bikes of the selected bike type. Change your selection at "Bike locations".</source>
<target state="translated">Sie können nur die Fahrräder des ausgewählten Fahrradtyps suchen. Ändern Sie Ihre Auswahl auf der Seite "Radstandorte".</target> <target state="translated">Sie können nur die Fahrräder des ausgewählten Fahrradtyps suchen. Ändern Sie Ihre Auswahl unter "Radstandorte".</target>
</trans-unit> </trans-unit>
<trans-unit id="MessageBikeTypeInfoTitle" translate="yes" xml:space="preserve"> <trans-unit id="MessageBikeTypeInfoTitle" translate="yes" xml:space="preserve">
<source>Selected bike type</source> <source>Selected bike type</source>
@ -1435,10 +1436,10 @@ Außerdem:&lt;br/&gt;
<target state="translated">Auf der Seite "Rad auswählen" können Sie nun nacheinander mehrere Räder suchen und mieten. Im Anschluss finden Sie diese unter "Meine Räder".</target> <target state="translated">Auf der Seite "Rad auswählen" können Sie nun nacheinander mehrere Räder suchen und mieten. Im Anschluss finden Sie diese unter "Meine Räder".</target>
</trans-unit> </trans-unit>
<trans-unit id="MessageRentalProcessEndRentalFinishedText" translate="yes" xml:space="preserve"> <trans-unit id="MessageRentalProcessEndRentalFinishedText" translate="yes" xml:space="preserve">
<source>Rental costs will be automatically debited within the next days. Ensure sufficient account coverage. You can view your rental history under Account. <source>View your rental history under "Account".
Thank you for your ride!</source> Thank you for your ride!</source>
<target state="translated">Die Mietkosten werden in den nächsten Tagen automatisch abgebucht. Sorgen Sie für ausreichende Kontodeckung. Ihre Miethistorie können Sie unter Konto einsehen. <target state="translated">Sehen Sie Ihre Miethistorie unter "Konto" ein.
Vielen Dank für Ihre Fahrt!</target> Vielen Dank für Ihre Fahrt!</target>
</trans-unit> </trans-unit>
@ -1491,8 +1492,8 @@ Vielen Dank für Ihre Fahrt!</target>
<target state="translated">Andere Station auswählen</target> <target state="translated">Andere Station auswählen</target>
</trans-unit> </trans-unit>
<trans-unit id="ActionSendDiagnosis" translate="yes" xml:space="preserve"> <trans-unit id="ActionSendDiagnosis" translate="yes" xml:space="preserve">
<source><bpt id="1">&lt;u&gt;</bpt>Transfer diagnostic file<ept id="1">&lt;/u&gt;</ept></source> <source>Transfer diagnostic file</source>
<target state="translated"><bpt id="1">&lt;u&gt;</bpt>Diagnosedatei übermitteln<ept id="1">&lt;/u&gt;</ept></target> <target state="translated">Diagnosedatei übermitteln</target>
</trans-unit> </trans-unit>
<trans-unit id="MarkingLastSelectedStation" translate="yes" xml:space="preserve"> <trans-unit id="MarkingLastSelectedStation" translate="yes" xml:space="preserve">
<source>Last selected station</source> <source>Last selected station</source>
@ -1523,8 +1524,12 @@ Vielen Dank für Ihre Fahrt!</target>
<target state="translated">Miete ist beendet</target> <target state="translated">Miete ist beendet</target>
</trans-unit> </trans-unit>
<trans-unit id="MarkingRentalProcessCloseLockObserve" translate="yes" xml:space="preserve"> <trans-unit id="MarkingRentalProcessCloseLockObserve" translate="yes" xml:space="preserve">
<source>Watch the lock as it is closing!</source> <source>Watch the lock as it is closing.
<target state="translated">Beobachten Sie das Schloss beim Schließen!</target>
Wait for confirmation!</source>
<target state="translated">Beobachten Sie das Schloss beim Schließen.
Warten Sie auf die Bestätigung!</target>
</trans-unit> </trans-unit>
<trans-unit id="MarkingRentalProcessEndRentalWait" translate="yes" xml:space="preserve"> <trans-unit id="MarkingRentalProcessEndRentalWait" translate="yes" xml:space="preserve">
<source>Wait for the end of rental confirmation!</source> <source>Wait for the end of rental confirmation!</source>
@ -1567,8 +1572,12 @@ Vielen Dank für Ihre Fahrt!</target>
<target state="translated">Miete beenden</target> <target state="translated">Miete beenden</target>
</trans-unit> </trans-unit>
<trans-unit id="MarkingRentalProcessCloseLockCheckLock" translate="yes" xml:space="preserve"> <trans-unit id="MarkingRentalProcessCloseLockCheckLock" translate="yes" xml:space="preserve">
<source>Check if the lock is really closed!</source> <source>Check if the lock is really closed.
<target state="translated">Schauen Sie, ob das Schloss wirklich zu ist!</target>
Wait for confirmation!</source>
<target state="translated">Schauen Sie, ob das Schloss wirklich zu ist.
Warten Sie auf die Bestätigung!</target>
</trans-unit> </trans-unit>
<trans-unit id="SupportmailSubjectAppmailWithStation" translate="yes" xml:space="preserve"> <trans-unit id="SupportmailSubjectAppmailWithStation" translate="yes" xml:space="preserve">
<source>{0}-app request: station {1}</source> <source>{0}-app request: station {1}</source>
@ -1689,7 +1698,7 @@ Wichtig: Senden Sie eine E-Mail an den Kundensupport (sonst wird Ihre bezahlte M
<target state="translated">Aktuell {0} Fahrräder reserviert/ gebucht.</target> <target state="translated">Aktuell {0} Fahrräder reserviert/ gebucht.</target>
</trans-unit> </trans-unit>
<trans-unit id="MessageLogoutGoodbye" translate="yes" xml:space="preserve"> <trans-unit id="MessageLogoutGoodbye" translate="yes" xml:space="preserve">
<source>User {0} successfully logged in.</source> <source>User {0} successfully logged out.</source>
<target state="translated">NutzerIn {0} erfolgreich abgemeldet.</target> <target state="translated">NutzerIn {0} erfolgreich abgemeldet.</target>
</trans-unit> </trans-unit>
<trans-unit id="MessageLogoutGoodbyeTitle" translate="yes" xml:space="preserve"> <trans-unit id="MessageLogoutGoodbyeTitle" translate="yes" xml:space="preserve">
@ -1748,6 +1757,82 @@ Wichtig: Senden Sie eine E-Mail an den Kundensupport (sonst wird Ihre bezahlte M
<source>Easy access to FAQ: In the menu under Help, you can now easily search for a solution yourself for questions and problems.</source> <source>Easy access to FAQ: In the menu under Help, you can now easily search for a solution yourself for questions and problems.</source>
<target state="translated">Einfacher Zugriff auf die FAQ: Im Menü unter Hilfe können Sie bei Fragen und Problemen nun ganz einfach selber nach einer Lösung suchen.</target> <target state="translated">Einfacher Zugriff auf die FAQ: Im Menü unter Hilfe können Sie bei Fragen und Problemen nun ganz einfach selber nach einer Lösung suchen.</target>
</trans-unit> </trans-unit>
<trans-unit id="MessageRentalProcessEndRentalFinishedCO2SavingText" translate="yes" xml:space="preserve">
<source>CO2 savings: {0}</source>
<target state="translated">CO2-Einsparung: {0}</target>
</trans-unit>
<trans-unit id="MessageRentalProcessEndRentalFinishedDistanceText" translate="yes" xml:space="preserve">
<source>Distance cycled: {0}</source>
<target state="translated">Geradelte Strecke: {0}</target>
</trans-unit>
<trans-unit id="MessageRentalProcessEndRentalFinishedDurationText" translate="yes" xml:space="preserve">
<source>Rental duration: {0}</source>
<target state="translated">Mietdauer: {0}</target>
</trans-unit>
<trans-unit id="MessageRentalProcessEndRentalFinishedRentalCostsText" translate="yes" xml:space="preserve">
<source>Rental costs: {0}
The costs will be debited automatically within the next days. Ensure sufficient account coverage.</source>
<target state="translated">Mietkosten: {0}
Die Kosten werden in den nächsten Tagen automatisch abgebucht. Sorgen Sie für ausreichende Kontodeckung.</target>
</trans-unit>
<trans-unit id="MessageRentalProcessEndRentalFinishedNoRentalCostsText" translate="yes" xml:space="preserve">
<source>Rental costs: 0.00 €</source>
<target state="translated">Mietkosten: 0,00 €</target>
</trans-unit>
<trans-unit id="MarkingRentalProcessCloseLockFirstStep" translate="yes" xml:space="preserve">
<source>Close lock</source>
<target state="translated">Schloss schließen</target>
</trans-unit>
<trans-unit id="MarkingRentalProcessCloseLockFirstStepFinished" translate="yes" xml:space="preserve">
<source>Lock is closed</source>
<target state="translated">Schloss geschlossen</target>
</trans-unit>
<trans-unit id="MarkingRentalProcessCloseLockSecondStep" translate="yes" xml:space="preserve">
<source>End rental?</source>
<target state="translated">Miete beenden?</target>
</trans-unit>
<trans-unit id="MarkingRentalProcessEndRentalFirstStep" translate="yes" xml:space="preserve">
<source>Check station</source>
<target state="translated">Station prüfen</target>
</trans-unit>
<trans-unit id="MarkingRentalProcessEndRentalFirstStepFinished" translate="yes" xml:space="preserve">
<source>At station</source>
<target state="translated">an Station</target>
</trans-unit>
<trans-unit id="MarkingRentalProcessEndRentalSecondStep" translate="yes" xml:space="preserve">
<source>Give feedback</source>
<target state="translated">Rückmeldung geben</target>
</trans-unit>
<trans-unit id="MarkingRentalProcessEndRentalSecondStepFinished" translate="yes" xml:space="preserve">
<source>Feedback</source>
<target state="translated">Rückmeldung</target>
</trans-unit>
<trans-unit id="MarkingRentalProcessEndRentalThirdStep" translate="yes" xml:space="preserve">
<source>End rental</source>
<target state="translated">Miete beenden</target>
</trans-unit>
<trans-unit id="ErrorSelectBikeNoBikeFoundBikeTypeHint" translate="yes" xml:space="preserve">
<source>Hint: Your are currently searching filtered for a "{0}". Change your selection at "Bike locations".</source>
<target state="translated">Hinweis: Sie suchen gerade gefiltert nach einem "{0}". Ändern Sie Ihre Auswahl unter "Radstandorte".</target>
</trans-unit>
<trans-unit id="ErrorLoginAlreadyLoggedIn" translate="yes" xml:space="preserve">
<source>User {0} already logged in.</source>
<target state="translated">NutzerIn {0} bereits angemeldet.</target>
</trans-unit>
<trans-unit id="ErrorLoginInvalidMailOrPasswortInput" translate="yes" xml:space="preserve">
<source>You must enter a valid email address and a password of at least 8 characters.</source>
<target state="translated">Sie müssen eine gültige E-Mailadresse und ein mindestens 8 Zeichen langes Passwort eingeben.</target>
</trans-unit>
<trans-unit id="ErrorSelectBikeInputNotSufficent" translate="yes" xml:space="preserve">
<source>Enter the bike id. It consists of prefix and number, e.g. TR15.</source>
<target state="translated">Geben Sie die Fahrrad ID ein. Sie besteht aus Präfix und Nummer, z.B. TR15.</target>
</trans-unit>
<trans-unit id="ChangeLog_3_0_373_MK_SB" translate="yes" xml:space="preserve">
<source>In your end-of-rental confirmation, you will now see the amount of rental costs that will be automatically debited from your deposited means of payment. Furthermore, you can view your past rentals and the costs incurred for them at any time under "Account".</source>
<target state="translated">In Ihrer Mietende-Bestätigung steht nun welcher Betrag an Mietkosten automatisch von Ihrem hinterlegten Zahlungsmittel abgebucht werden. Weiterhin können Sie Ihre vergangenen Mieten und dafür anfallenden Kosten jederzeit unter "Konto" einsehen.</target>
</trans-unit>
</group> </group>
</body> </body>
</file> </file>

View file

@ -31,6 +31,31 @@ namespace TINK.Repository.Response
/// </summary> /// </summary>
[DataMember] [DataMember]
public string station { get; private set; } public string station { get; private set; }
/// <summary>
/// Amount of Co2Saving.
/// </summary>
[DataMember]
public string co2saving { get; private set; }
/// <summary>
/// Driven Distance.
/// </summary>
[DataMember]
public string distance { get; private set; }
/// <summary>
/// Duration of finished rental.
/// </summary>
[DataMember]
public string real_clock { get; private set; }
/// <summary>
/// Accruing costs for rental.
/// </summary>
[DataMember]
public string total_price { get; private set; }
} }
/// <summary> Mini survey.</summary> /// <summary> Mini survey.</summary>

View file

@ -79,11 +79,9 @@ namespace TINK.View
/// <summary> Displays user feedback popup.</summary> /// <summary> Displays user feedback popup.</summary>
/// <param name="battery">Object holding info about battery. For some batteries charging level might need to be updated by user.</param> /// <param name="battery">Object holding info about battery. For some batteries charging level might need to be updated by user.</param>
/// <param name="co2Saving"> Co2 saving information.</param>
/// <returns>User feedback.</returns> /// <returns>User feedback.</returns>
Task<IUserFeedback> DisplayUserFeedbackPopup( Task<IUserFeedback> DisplayUserFeedbackPopup(
IBatteryMutable battery = null, IBatteryMutable battery = null);
string co2Saving = null);
#if USCSHARP9 #if USCSHARP9
/// <summary> /// <summary>

View file

@ -7,6 +7,7 @@
<!--Main color--> <!--Main color-->
<Color x:Key="primary-back-title-color">#D21113</Color> <Color x:Key="primary-back-title-color">#D21113</Color>
<Color x:Key="bright-primary-back-title-color">#D16D6E</Color>
<!--Secondary color--> <!--Secondary color-->
<Color x:Key="secondary-back-title-color">#FF0020</Color> <Color x:Key="secondary-back-title-color">#FF0020</Color>
@ -33,21 +34,10 @@
<Setter Property="BorderWidth" Value="1"/> <Setter Property="BorderWidth" Value="1"/>
<Setter Property="CornerRadius" Value="10" /> <Setter Property="CornerRadius" Value="10" />
<Setter Property="FontSize" Value="Medium"/> <Setter Property="FontSize" Value="Medium"/>
<Setter Property="TextColor" Value="White"/> <Setter Property="FontFamily" Value="RobotoRegular"/>
<Style.Triggers>
<Trigger TargetType="Button"
Property="IsEnabled"
Value="True">
<Setter Property="BorderColor" Value="{DynamicResource Key=primary-back-title-color}"/> <Setter Property="BorderColor" Value="{DynamicResource Key=primary-back-title-color}"/>
<Setter Property="BackgroundColor" Value="{DynamicResource Key=primary-back-title-color}"/> <Setter Property="BackgroundColor" Value="{DynamicResource Key=primary-back-title-color}"/>
</Trigger> <Setter Property="TextColor" Value="White"/>
<Trigger TargetType="Button"
Property="IsEnabled"
Value="False">
<Setter Property="BorderColor" Value="LightGray"/>
<Setter Property="BackgroundColor" Value="LightGray"/>
</Trigger>
</Style.Triggers>
</Style> </Style>
<!--Secondary Button--> <!--Secondary Button-->
@ -57,46 +47,35 @@
<Setter Property="BorderWidth" Value="1"/> <Setter Property="BorderWidth" Value="1"/>
<Setter Property="CornerRadius" Value="10" /> <Setter Property="CornerRadius" Value="10" />
<Setter Property="FontSize" Value="Medium"/> <Setter Property="FontSize" Value="Medium"/>
<Setter Property="TextColor" Value="{DynamicResource Key=primary-back-title-color}"/> <Setter Property="FontFamily" Value="RobotoRegular"/>
<Style.Triggers>
<Trigger TargetType="Button"
Property="IsEnabled"
Value="True">
<Setter Property="BorderColor" Value="{DynamicResource Key=primary-back-title-color}"/> <Setter Property="BorderColor" Value="{DynamicResource Key=primary-back-title-color}"/>
<Setter Property="BackgroundColor" Value="White"/> <Setter Property="BackgroundColor" Value="White"/>
</Trigger> <Setter Property="TextColor" Value="{DynamicResource Key=primary-back-title-color}"/>
<Trigger TargetType="Button"
Property="IsEnabled"
Value="False">
<Setter Property="BorderColor" Value="LightGray"/>
<Setter Property="BackgroundColor" Value="DimGray"/>
</Trigger>
</Style.Triggers>
</Style> </Style>
<!--Button without outline--> <!--Button without outline-->
<Style x:Key="NoOutlineButton" TargetType="Button"> <Style x:Key="NoOutlineButtonWhite" TargetType="Button">
<Setter Property="WidthRequest" Value="400" /> <Setter Property="WidthRequest" Value="400" />
<Setter Property="HorizontalOptions" Value="Center" /> <Setter Property="HorizontalOptions" Value="Center" />
<Setter Property="BorderWidth" Value="1"/> <Setter Property="BorderWidth" Value="1"/>
<Setter Property="CornerRadius" Value="10" /> <Setter Property="CornerRadius" Value="10" />
<Setter Property="FontSize" Value="Medium"/> <Setter Property="FontSize" Value="Medium"/>
<Setter Property="FontFamily" Value="RobotoRegular"/> <Setter Property="FontFamily" Value="RobotoRegular"/>
<Setter Property="TextColor" Value="{DynamicResource Key=primary-back-title-color}"/>
<Style.Triggers>
<Trigger TargetType="Button"
Property="IsEnabled"
Value="True">
<Setter Property="BorderColor" Value="White"/> <Setter Property="BorderColor" Value="White"/>
<Setter Property="BackgroundColor" Value="White"/> <Setter Property="BackgroundColor" Value="White"/>
</Trigger> <Setter Property="TextColor" Value="{DynamicResource Key=primary-back-title-color}"/>
<Trigger TargetType="Button" </Style>
Property="IsEnabled"
Value="False"> <Style x:Key="NoOutlineButtonBackgroundColor" TargetType="Button">
<Setter Property="BorderColor" Value="LightGray"/> <Setter Property="WidthRequest" Value="400" />
<Setter Property="BackgroundColor" Value="DimGray"/> <Setter Property="HorizontalOptions" Value="Center" />
</Trigger> <Setter Property="BorderWidth" Value="1"/>
</Style.Triggers> <Setter Property="CornerRadius" Value="10" />
<Setter Property="FontSize" Value="Medium"/>
<Setter Property="FontFamily" Value="RobotoRegular"/>
<Setter Property="BorderColor" Value="{DynamicResource Key=background-color}"/>
<Setter Property="BackgroundColor" Value="{DynamicResource Key=background-color}"/>
<Setter Property="TextColor" Value="{DynamicResource Key=primary-back-title-color}"/>
</Style> </Style>
<!--Switch--> <!--Switch-->
@ -106,6 +85,7 @@
Property="IsToggled" Property="IsToggled"
Value="True"> Value="True">
<Setter Property="ThumbColor" Value="{DynamicResource Key=primary-back-title-color}"/> <Setter Property="ThumbColor" Value="{DynamicResource Key=primary-back-title-color}"/>
<Setter Property="OnColor" Value="{DynamicResource Key=bright-primary-back-title-color}"/>
</Trigger> </Trigger>
<Trigger TargetType="Switch" <Trigger TargetType="Switch"
Property="IsToggled" Property="IsToggled"
@ -118,7 +98,6 @@
<!--Slider--> <!--Slider-->
<Style TargetType="Slider"> <Style TargetType="Slider">
<Setter Property="ThumbColor" Value="{DynamicResource Key=primary-back-title-color}"/> <Setter Property="ThumbColor" Value="{DynamicResource Key=primary-back-title-color}"/>
<Setter Property="Background" Value="LightGray"/>
</Style> </Style>
<!--Label--> <!--Label-->
@ -138,7 +117,7 @@
<Setter Property="TextColor" Value="White"/> <Setter Property="TextColor" Value="White"/>
<Setter Property="VerticalOptions" Value="Start"/> <Setter Property="VerticalOptions" Value="Start"/>
<Setter Property="HorizontalOptions" Value="Start"/> <Setter Property="HorizontalOptions" Value="Start"/>
<Setter Property="Padding" Value="0,12,0,12"/> <Setter Property="Padding" Value="0,14,0,12"/>
</Style> </Style>
<Style x:Key="Image-Navbar" TargetType="Image"> <Style x:Key="Image-Navbar" TargetType="Image">
<Setter Property="Source" Value="navbar_theme.png"/> <Setter Property="Source" Value="navbar_theme.png"/>

View file

@ -7,6 +7,7 @@
<!--Main color--> <!--Main color-->
<Color x:Key="primary-back-title-color">#009899</Color> <Color x:Key="primary-back-title-color">#009899</Color>
<Color x:Key="bright-primary-back-title-color">#B5E6E6</Color>
<!--Background color--> <!--Background color-->
<Color x:Key="background-color">#BEBEBE</Color> <Color x:Key="background-color">#BEBEBE</Color>
@ -31,19 +32,16 @@
<Setter Property="CornerRadius" Value="10" /> <Setter Property="CornerRadius" Value="10" />
<Setter Property="FontSize" Value="Medium"/> <Setter Property="FontSize" Value="Medium"/>
<Setter Property="FontFamily" Value="RobotoRegular"/> <Setter Property="FontFamily" Value="RobotoRegular"/>
<Setter Property="BorderColor" Value="{DynamicResource Key=primary-back-title-color}"/>
<Setter Property="BackgroundColor" Value="{DynamicResource Key=primary-back-title-color}"/>
<Setter Property="TextColor" Value="White"/> <Setter Property="TextColor" Value="White"/>
<Style.Triggers> <Style.Triggers>
<Trigger TargetType="Button"
Property="IsEnabled"
Value="True">
<Setter Property="BorderColor" Value="{DynamicResource Key=primary-back-title-color}"/>
<Setter Property="BackgroundColor" Value="{DynamicResource Key=primary-back-title-color}"/>
</Trigger>
<Trigger TargetType="Button" <Trigger TargetType="Button"
Property="IsEnabled" Property="IsEnabled"
Value="False"> Value="False">
<Setter Property="BorderColor" Value="LightGray"/> <Setter Property="BorderColor" Value="DimGray"/>
<Setter Property="BackgroundColor" Value="LightGray"/> <Setter Property="BackgroundColor" Value="DimGray"/>
<Setter Property="TextColor" Value="LightGray"/>
</Trigger> </Trigger>
</Style.Triggers> </Style.Triggers>
</Style> </Style>
@ -56,44 +54,55 @@
<Setter Property="CornerRadius" Value="10" /> <Setter Property="CornerRadius" Value="10" />
<Setter Property="FontSize" Value="Medium"/> <Setter Property="FontSize" Value="Medium"/>
<Setter Property="FontFamily" Value="RobotoRegular"/> <Setter Property="FontFamily" Value="RobotoRegular"/>
<Setter Property="BorderColor" Value="{DynamicResource Key=primary-back-title-color}"/>
<Setter Property="BackgroundColor" Value="White"/>
<Setter Property="TextColor" Value="{DynamicResource Key=primary-back-title-color}"/> <Setter Property="TextColor" Value="{DynamicResource Key=primary-back-title-color}"/>
<Style.Triggers> <Style.Triggers>
<Trigger TargetType="Button"
Property="IsEnabled"
Value="True">
<Setter Property="BorderColor" Value="{DynamicResource Key=primary-back-title-color}"/>
<Setter Property="BackgroundColor" Value="White"/>
</Trigger>
<Trigger TargetType="Button" <Trigger TargetType="Button"
Property="IsEnabled" Property="IsEnabled"
Value="False"> Value="False">
<Setter Property="BorderColor" Value="LightGray"/> <Setter Property="BorderColor" Value="DimGray"/>
<Setter Property="BackgroundColor" Value="DimGray"/> <Setter Property="BackgroundColor" Value="LightGray"/>
<Setter Property="TextColor" Value="DimGray"/>
</Trigger> </Trigger>
</Style.Triggers> </Style.Triggers>
</Style> </Style>
<!--Button without outline--> <!--Button without outline-->
<Style x:Key="NoOutlineButton" TargetType="Button"> <Style x:Key="NoOutlineButtonWhite" TargetType="Button">
<Setter Property="WidthRequest" Value="400" /> <Setter Property="WidthRequest" Value="400" />
<Setter Property="HorizontalOptions" Value="Center" /> <Setter Property="HorizontalOptions" Value="Center" />
<Setter Property="BorderWidth" Value="1"/> <Setter Property="BorderWidth" Value="1"/>
<Setter Property="CornerRadius" Value="10" /> <Setter Property="CornerRadius" Value="10" />
<Setter Property="FontSize" Value="Medium"/> <Setter Property="FontSize" Value="Medium"/>
<Setter Property="FontFamily" Value="RobotoRegular"/> <Setter Property="FontFamily" Value="RobotoRegular"/>
<Setter Property="BorderColor" Value="White"/>
<Setter Property="BackgroundColor" Value="White"/>
<Setter Property="TextColor" Value="{DynamicResource Key=primary-back-title-color}"/> <Setter Property="TextColor" Value="{DynamicResource Key=primary-back-title-color}"/>
<Style.Triggers> <Style.Triggers>
<Trigger TargetType="Button" <Trigger TargetType="Button"
Property="IsEnabled" Property="IsEnabled"
Value="True"> Value="False">
<Setter Property="BorderColor" Value="White"/> <Setter Property="TextColor" Value="DimGray"/>
<Setter Property="BackgroundColor" Value="White"/>
</Trigger> </Trigger>
</Style.Triggers>
</Style>
<Style x:Key="NoOutlineButtonBackgroundColor" TargetType="Button">
<Setter Property="WidthRequest" Value="400" />
<Setter Property="HorizontalOptions" Value="Center" />
<Setter Property="BorderWidth" Value="1"/>
<Setter Property="CornerRadius" Value="10" />
<Setter Property="FontSize" Value="Medium"/>
<Setter Property="FontFamily" Value="RobotoRegular"/>
<Setter Property="BorderColor" Value="{DynamicResource Key=background-color}"/>
<Setter Property="BackgroundColor" Value="{DynamicResource Key=background-color}"/>
<Setter Property="TextColor" Value="{DynamicResource Key=primary-back-title-color}"/>
<Style.Triggers>
<Trigger TargetType="Button" <Trigger TargetType="Button"
Property="IsEnabled" Property="IsEnabled"
Value="False"> Value="False">
<Setter Property="BorderColor" Value="LightGray"/> <Setter Property="TextColor" Value="DimGray"/>
<Setter Property="BackgroundColor" Value="DimGray"/>
</Trigger> </Trigger>
</Style.Triggers> </Style.Triggers>
</Style> </Style>
@ -105,6 +114,7 @@
Property="IsToggled" Property="IsToggled"
Value="True"> Value="True">
<Setter Property="ThumbColor" Value="{DynamicResource Key=primary-back-title-color}"/> <Setter Property="ThumbColor" Value="{DynamicResource Key=primary-back-title-color}"/>
<Setter Property="OnColor" Value="{DynamicResource Key=bright-primary-back-title-color}"/>
</Trigger> </Trigger>
<Trigger TargetType="Switch" <Trigger TargetType="Switch"
Property="IsToggled" Property="IsToggled"
@ -117,7 +127,6 @@
<!--Slider--> <!--Slider-->
<Style TargetType="Slider"> <Style TargetType="Slider">
<Setter Property="ThumbColor" Value="{DynamicResource Key=primary-back-title-color}"/> <Setter Property="ThumbColor" Value="{DynamicResource Key=primary-back-title-color}"/>
<Setter Property="Background" Value="LightGray"/>
</Style> </Style>
<!--Label--> <!--Label-->
@ -152,11 +161,11 @@
<!--Navbar--> <!--Navbar-->
<Style x:Key="Label-Navbar" TargetType="Label"> <Style x:Key="Label-Navbar" TargetType="Label">
<Setter Property="FontSize" Value="20"/> <Setter Property="FontSize" Value="20"/>
<Setter Property="TextColor" Value="White"/>
<Setter Property="FontFamily" Value="RobotoRegular"/> <Setter Property="FontFamily" Value="RobotoRegular"/>
<Setter Property="TextColor" Value="White"/>
<Setter Property="VerticalOptions" Value="Start"/> <Setter Property="VerticalOptions" Value="Start"/>
<Setter Property="HorizontalOptions" Value="Start"/> <Setter Property="HorizontalOptions" Value="Start"/>
<Setter Property="Padding" Value="0,12,0,12"/> <Setter Property="Padding" Value="0,14,0,12"/>
</Style> </Style>
<Style x:Key="Image-Navbar" TargetType="Image"> <Style x:Key="Image-Navbar" TargetType="Image">
<Setter Property="Source" Value="navbar_theme.png"/> <Setter Property="Source" Value="navbar_theme.png"/>

View file

@ -273,8 +273,7 @@ namespace TINK.ViewModel.Bikes.Bike.BluetoothLock
var feedBackUri = SelectedBike?.OperatorUri; var feedBackUri = SelectedBike?.OperatorUri;
var battery = SelectedBike.Drive?.Battery; var battery = SelectedBike.Drive?.Battery;
var feedback = await ViewService.DisplayUserFeedbackPopup( var feedback = await ViewService.DisplayUserFeedbackPopup(
battery, battery);
bookingFinished?.Co2Saving);
if (battery != null if (battery != null
&& feedback.CurrentChargeBars != null) && feedback.CurrentChargeBars != null)
@ -350,11 +349,20 @@ namespace TINK.ViewModel.Bikes.Bike.BluetoothLock
await ViewService.DisplayAlert( await ViewService.DisplayAlert(
String.Format(AppResources.MessageRentalProcessEndRentalFinishedTitle, SelectedBike.Id), String.Format(AppResources.MessageRentalProcessEndRentalFinishedTitle, SelectedBike.Id),
String.Format( String.Format(
"{0}{1}", "{0}{1}{2}{3}{4}",
!string.IsNullOrWhiteSpace(bookingFinished?.Co2Saving) ? !string.IsNullOrWhiteSpace(bookingFinished?.Distance) ?
$"{bookingFinished?.Co2Saving}\r\n\r\n" $"{String.Format(AppResources.MessageRentalProcessEndRentalFinishedDistanceText, bookingFinished?.Distance)}\r\n"
: string.Empty, : string.Empty,
String.Format(AppResources.MessageRentalProcessEndRentalFinishedText) !string.IsNullOrWhiteSpace(bookingFinished?.Co2Saving) ?
$"{String.Format(AppResources.MessageRentalProcessEndRentalFinishedCO2SavingText, bookingFinished?.Co2Saving)}\r\n"
: string.Empty,
!string.IsNullOrWhiteSpace(bookingFinished?.Duration) ?
$"{String.Format(AppResources.MessageRentalProcessEndRentalFinishedDurationText, bookingFinished?.Duration)}\r\n"
: $"{string.Empty}",
!string.IsNullOrWhiteSpace(bookingFinished?.RentalCosts) ?
$"{String.Format(AppResources.MessageRentalProcessEndRentalFinishedRentalCostsText,bookingFinished?.RentalCosts)}\r\n"
: $"{AppResources.MessageRentalProcessEndRentalFinishedNoRentalCostsText}\r\n",
AppResources.MessageRentalProcessEndRentalFinishedText
), ),
AppResources.MessageAnswerOk AppResources.MessageAnswerOk
); );

View file

@ -64,8 +64,7 @@ namespace TINK.ViewModel.Bikes.Bike.CopriLock.RequestHandler
// Do get Feedback // Do get Feedback
var battery = SelectedBike.Drive?.Battery; var battery = SelectedBike.Drive?.Battery;
var feedback = await ViewService.DisplayUserFeedbackPopup( var feedback = await ViewService.DisplayUserFeedbackPopup(
battery, battery);
SelectedBike?.BookingFinishedModel?.Co2Saving);
if (battery != null if (battery != null
&& feedback.CurrentChargeBars != null) && feedback.CurrentChargeBars != null)

View file

@ -6,7 +6,6 @@ using System.Windows.Input;
using Plugin.Messaging; using Plugin.Messaging;
using Serilog; using Serilog;
using TINK.Model; using TINK.Model;
using TINK.Model.Stations;
using TINK.Model.Stations.StationNS; using TINK.Model.Stations.StationNS;
using TINK.MultilingualResources; using TINK.MultilingualResources;
using TINK.View; using TINK.View;
@ -90,25 +89,23 @@ namespace TINK.ViewModel.Info
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(nameof(PhoneNumberText))); PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(nameof(PhoneNumberText)));
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(nameof(ProviderNameText))); PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(nameof(ProviderNameText)));
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(nameof(IsOperatorInfoAvaliable))); PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(nameof(IsOperatorInfoAvaliable)));
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(nameof(IsDoPhoncallAvailable)));
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(nameof(IsSendMailAvailable)));
await Task.CompletedTask; await Task.CompletedTask;
} }
/// <summary> Command object to bind mail button to view model. </summary> /// <summary> Command object to bind mail button to view model. </summary>
public ICommand OnMailToOperatorRequest public ICommand OnMailToOperatorRequest
=> new Command( => new Command(async () => await DoSendMailToOperator());
async () => await DoSendMailToOperator(),
() => IsSendMailAvailable);
/// <summary> Command object to bind mail app related button to model. </summary> /// <summary> Command object to bind mail app related button to model. </summary>
public ICommand OnMailAppRelatedRequest public ICommand OnMailAppRelatedRequest
=> new Command( => new Command(async () => await DoSendMailAppRelated());
async () => await DoSendMailAppRelated(),
() => IsSendMailAvailable);
/// <summary>True if sending mail is possible.</summary> /// <summary>True if sending mail is possible.</summary>
public bool IsSendMailAvailable => public bool IsSendMailAvailable
CrossMessaging.Current.EmailMessenger.CanSendEmail; => CrossMessaging.Current.EmailMessenger.CanSendEmail;
/// <summary>cTrue if doing a phone call is possible.</summary> /// <summary>cTrue if doing a phone call is possible.</summary>
@ -133,15 +130,19 @@ namespace TINK.ViewModel.Info
/// <returns> Returns true if either mail was sent or if no mailer available.</returns> /// <returns> Returns true if either mail was sent or if no mailer available.</returns>
public async Task DoSendMailToOperator() public async Task DoSendMailToOperator()
{
try
{ {
if (!IsSendMailAvailable) if (!IsSendMailAvailable)
{ {
// Nothing to do because email can not be sent. await ViewService.DisplayAlert(
String.Empty,
AppResources.ErrorSupportmailMailingFailed,
AppResources.MessageAnswerOk);
return; return;
} }
else
{
try
{
// Send operator related support mail to operator. // Send operator related support mail to operator.
await Email.ComposeAsync(new EmailMessage await Email.ComposeAsync(new EmailMessage
{ {
@ -166,9 +167,20 @@ namespace TINK.ViewModel.Info
return; return;
} }
} }
}
/// <summary> Request to send a app related mail. </summary> /// <summary> Request to send a app related mail. </summary>
public async Task DoSendMailAppRelated() public async Task DoSendMailAppRelated()
{
if (!IsSendMailAvailable)
{
await ViewService.DisplayAlert(
String.Empty,
AppResources.ErrorSupportmailMailingFailed,
AppResources.MessageAnswerOk);
return;
}
else
{ {
try try
{ {
@ -221,6 +233,7 @@ namespace TINK.ViewModel.Info
return; return;
} }
} }
}
/// <summary> Command object to bind login button to view model. </summary> /// <summary> Command object to bind login button to view model. </summary>
public ICommand OnSelectStationRequest public ICommand OnSelectStationRequest
@ -257,21 +270,26 @@ namespace TINK.ViewModel.Info
/// <summary> Command object to bind phone call button. </summary> /// <summary> Command object to bind phone call button. </summary>
public ICommand OnPhoneRequest public ICommand OnPhoneRequest
=> new Command( => new Command(async () => await DoPhoneCall());
async () => await DoPhoneCall(),
() => IsDoPhoncallAvailable);
/// <summary> Request to do a phone call. </summary> /// <summary> Request to do a phone call. </summary>
public async Task DoPhoneCall() public async Task DoPhoneCall()
{
if (!IsDoPhoncallAvailable)
{
await ViewService.DisplayAlert(
String.Empty,
AppResources.ErrorSupportmailPhoningFailed,
AppResources.MessageAnswerOk);
return;
}
else
{ {
try try
{ {
// Make Phone Call // Make Phone Call
if (IsDoPhoncallAvailable)
{
CrossMessaging.Current.PhoneDialer.MakePhoneCall(PhoneNumberText); CrossMessaging.Current.PhoneDialer.MakePhoneCall(PhoneNumberText);
} }
}
catch (Exception exception) catch (Exception exception)
{ {
Log.Error("An unexpected error occurred doing a phone call. {@Exception}", exception); Log.Error("An unexpected error occurred doing a phone call. {@Exception}", exception);
@ -283,6 +301,7 @@ namespace TINK.ViewModel.Info
return; return;
} }
} }
}
/// <summary> Text providing the id of the selected station.</summary> /// <summary> Text providing the id of the selected station.</summary>
public string SelectedStationId public string SelectedStationId

View file

@ -13,10 +13,8 @@ using TINK.Model.Bikes;
using TINK.Model.Bikes.BikeInfoNS.BikeNS; using TINK.Model.Bikes.BikeInfoNS.BikeNS;
using TINK.Model.Bikes.BikeInfoNS.BluetoothLock; using TINK.Model.Bikes.BikeInfoNS.BluetoothLock;
using TINK.Model.Connector; using TINK.Model.Connector;
using TINK.Model.Connector.Filter;
using TINK.Model.Device; using TINK.Model.Device;
using TINK.Model.Services.CopriApi; using TINK.Model.Services.CopriApi;
using TINK.Model.State;
using TINK.Model.Stations.StationNS; using TINK.Model.Stations.StationNS;
using TINK.Model.User; using TINK.Model.User;
using TINK.MultilingualResources; using TINK.MultilingualResources;
@ -29,7 +27,6 @@ using TINK.Settings;
using TINK.View; using TINK.View;
using TINK.ViewModel.Bikes; using TINK.ViewModel.Bikes;
using TINK.ViewModel.Map; using TINK.ViewModel.Map;
using Xamarin.Essentials;
using Xamarin.Forms; using Xamarin.Forms;
using Command = Xamarin.Forms.Command; using Command = Xamarin.Forms.Command;
@ -77,7 +74,7 @@ namespace TINK.ViewModel.FindBike
public BikeCollection Bikes { get; set; } public BikeCollection Bikes { get; set; }
/// <summary> Do not allow to select bike if id is not set.</summary> /// <summary> Do not allow to select bike if id is not set.</summary>
public bool IsSelectBikeEnabled => IsIdle && BikeIdUserInput != null && BikeIdUserInput.Length > 0; public bool IsSelectBikeEnabled => IsIdle && BikeIdUserInput != null && BikeIdUserInput.Length > 1 && BikeIdUserInput.Any(x => char.IsLetter(x)) && BikeIdUserInput.Any(x => char.IsDigit(x));
/// <summary> Hide id input fields as soon as bike is found.</summary> /// <summary> Hide id input fields as soon as bike is found.</summary>
public bool IsSelectBikeVisible => BikeCollection != null && BikeCollection.Count == 0; public bool IsSelectBikeVisible => BikeCollection != null && BikeCollection.Count == 0;
@ -85,6 +82,9 @@ namespace TINK.ViewModel.FindBike
/// <summary> Holds the stations to get station names form station ids. </summary> /// <summary> Holds the stations to get station names form station ids. </summary>
private IEnumerable<IStation> Stations { get; } private IEnumerable<IStation> Stations { get; }
/// <summary> Reference on the tink app instance. </summary>
private ITinkApp TinkApp { get; }
/// <summary> /// <summary>
/// True if ListView of Bikes is refreshing after user pulled; /// True if ListView of Bikes is refreshing after user pulled;
/// </summary> /// </summary>
@ -124,6 +124,7 @@ namespace TINK.ViewModel.FindBike
/// <param name="openUrlInBrowser">Delegate to open browser.</param> /// <param name="openUrlInBrowser">Delegate to open browser.</param>
public FindBikePageViewModel( public FindBikePageViewModel(
User user, User user,
ITinkApp tinkApp,
ILocationPermission permissions, ILocationPermission permissions,
IBluetoothLE bluetoothLE, IBluetoothLE bluetoothLE,
string runtimPlatform, string runtimPlatform,
@ -145,6 +146,9 @@ namespace TINK.ViewModel.FindBike
Stations = stations ?? throw new ArgumentException(nameof(stations)); Stations = stations ?? throw new ArgumentException(nameof(stations));
TinkApp = tinkApp
?? throw new ArgumentException("Can not instantiate settings page view model- object. No tink app object available.");
RefreshCommand = new Command(async () => { RefreshCommand = new Command(async () => {
IsRefreshing = false; IsRefreshing = false;
@ -215,11 +219,22 @@ namespace TINK.ViewModel.FindBike
} }
/// <summary> Command object to bind select bike button to view model. </summary> /// <summary> Command object to bind select bike button to view model. </summary>
public System.Windows.Input.ICommand OnSelectBikeRequest => new Xamarin.Forms.Command(async () => await SelectBike(), () => IsSelectBikeEnabled); public System.Windows.Input.ICommand OnSelectBikeRequest => new Xamarin.Forms.Command(async () => await SelectBike());
/// <summary> Select a bike by ID</summary> /// <summary> Select a bike by ID</summary>
public async Task SelectBike() public async Task SelectBike()
{ {
if (!IsSelectBikeEnabled)
{
await ViewService.DisplayAlert(
String.Empty,
AppResources.ErrorSelectBikeInputNotSufficent,
AppResources.MessageAnswerOk);
return;
}
else
{
// Get List of bike to be able to connect to. // Get List of bike to be able to connect to.
ActionText = AppResources.ActivityTextFindBikeLoadingBikes; ActionText = AppResources.ActivityTextFindBikeLoadingBikes;
IsIdle = false; IsIdle = false;
@ -270,8 +285,10 @@ namespace TINK.ViewModel.FindBike
if (selectedBike == null) if (selectedBike == null)
{ {
await ViewService.DisplayAlert( await ViewService.DisplayAlert(
AppResources.MessageHintTitle, AppResources.ErrorSelectBikeTitle,
string.Format(AppResources.ErrorSelectBikeNoBikeFound, BikeIdUserInput), TinkApp.Flavor == AppFlavor.MeinKonrad
? $"{string.Format(AppResources.ErrorSelectBikeNoBikeFound, BikeIdUserInput)}\r\n\r\n{string.Format(AppResources.ErrorSelectBikeNoBikeFoundBikeTypeHint, ActiveFilteredBikeType)}"
: string.Format(AppResources.ErrorSelectBikeNoBikeFound, BikeIdUserInput),
AppResources.MessageAnswerOk); AppResources.MessageAnswerOk);
ActionText = string.Empty; ActionText = string.Empty;
@ -428,6 +445,7 @@ namespace TINK.ViewModel.FindBike
IsIdle = true; IsIdle = true;
return; return;
} }
}
} }

View file

@ -253,6 +253,26 @@ namespace TINK.ViewModel
#else #else
public async Task Login() public async Task Login()
#endif #endif
{
if (!IsLoginRequestAllowed)
{
if(TinkApp.ActiveUser.IsLoggedIn)
{
await m_oViewService.DisplayAlert(
AppResources.ErrorLoginTitle,
string.Format(AppResources.ErrorLoginAlreadyLoggedIn,TinkApp.ActiveUser.Mail),
AppResources.MessageAnswerOk);
}
else if (!m_bMailAndPasswordCandidatesOk)
{
await m_oViewService.DisplayAlert(
AppResources.ErrorLoginTitle,
AppResources.ErrorLoginInvalidMailOrPasswortInput,
AppResources.MessageAnswerOk);
}
return;
}
else
{ {
IsIdle = false; IsIdle = false;
StatusInfoText = AppResources.ActivityTextOneMomentPlease; StatusInfoText = AppResources.ActivityTextOneMomentPlease;
@ -291,7 +311,7 @@ namespace TINK.ViewModel
await m_oViewService.DisplayAlert( await m_oViewService.DisplayAlert(
AppResources.ErrorLoginTitle, AppResources.ErrorLoginTitle,
l_oException.Message, AppResources.ErrorLoginInvalidAuthorization,
AppResources.MessageAnswerOk); AppResources.MessageAnswerOk);
IsIdle = true; IsIdle = true;
@ -330,7 +350,7 @@ namespace TINK.ViewModel
await m_oViewService.DisplayAlert( await m_oViewService.DisplayAlert(
AppResources.ErrorLoginTitle, AppResources.ErrorLoginTitle,
string.Format(AppResources.ErrorLoginNoCookie, l_oException.Message), string.Format(AppResources.ErrorLoginNoCookie, l_oException.Message),
"OK"); AppResources.MessageAnswerOk);
} }
else else
{ {
@ -406,6 +426,7 @@ namespace TINK.ViewModel
IsIdle = true; IsIdle = true;
StatusInfoText = string.Empty; StatusInfoText = string.Empty;
} }
}
/// <summary> Holds whether TINK/ Copri info is shown.</summary> /// <summary> Holds whether TINK/ Copri info is shown.</summary>
public bool IsRegisterTargetsInfoVisible { get; private set; } public bool IsRegisterTargetsInfoVisible { get; private set; }

View file

@ -1,4 +1,4 @@
using Newtonsoft.Json; using Newtonsoft.Json;
using NUnit.Framework; using NUnit.Framework;
using TINK.Model.Connector.Updater; using TINK.Model.Connector.Updater;
using TINK.Repository.Response; using TINK.Repository.Response;
@ -18,7 +18,9 @@ namespace TestShareeLib.Model.Connector.Updater
var response = JsonConvert.DeserializeObject<ResponseContainer<DoReturnResponse>>(@" var response = JsonConvert.DeserializeObject<ResponseContainer<DoReturnResponse>>(@"
{ {
""shareejson"" : { ""shareejson"" : {
""co2saving"" : ""Einsparung: 1,95 kg CO2 und 3,00 EUR bei einer Strecke von 10 KM"" ""bike_returned"" : {
""co2saving"" : ""1,95 kg CO2""
}
} }
}"); }");
@ -26,7 +28,7 @@ namespace TestShareeLib.Model.Connector.Updater
Assert.That( Assert.That(
bookingFinshed.Co2Saving, bookingFinshed.Co2Saving,
Is.EqualTo("Einsparung: 1,95 kg CO2 und 3,00 EUR bei einer Strecke von 10 KM")); Is.EqualTo("1,95 kg CO2"));
} }
/// <summary> /// <summary>
@ -38,6 +40,8 @@ namespace TestShareeLib.Model.Connector.Updater
var response = JsonConvert.DeserializeObject<ResponseContainer<DoReturnResponse>>(@" var response = JsonConvert.DeserializeObject<ResponseContainer<DoReturnResponse>>(@"
{ {
""shareejson"" : { ""shareejson"" : {
""bike_returned"" : {
},
""user_miniquery"" : { ""user_miniquery"" : {
""title"" : ""Bitte unterstützen Sie unsere Begleitforschung"", ""title"" : ""Bitte unterstützen Sie unsere Begleitforschung"",
""footer"" : ""Herzlichen Dank und viel Spaß bei der nächsten Fahrt!"", ""footer"" : ""Herzlichen Dank und viel Spaß bei der nächsten Fahrt!"",
@ -114,6 +118,8 @@ namespace TestShareeLib.Model.Connector.Updater
var response = JsonConvert.DeserializeObject<ResponseContainer<DoReturnResponse>>(@" var response = JsonConvert.DeserializeObject<ResponseContainer<DoReturnResponse>>(@"
{ {
""shareejson"" : { ""shareejson"" : {
""bike_returned"" : {
},
} }
} }
@ -153,6 +159,8 @@ namespace TestShareeLib.Model.Connector.Updater
""shareejson"" : { ""shareejson"" : {
""user_miniquery"" : { ""user_miniquery"" : {
}, },
""bike_returned"" : {
},
} }
} }
@ -186,6 +194,8 @@ namespace TestShareeLib.Model.Connector.Updater
var response = JsonConvert.DeserializeObject<ResponseContainer<DoReturnResponse>>(@" var response = JsonConvert.DeserializeObject<ResponseContainer<DoReturnResponse>>(@"
{ {
""shareejson"" : { ""shareejson"" : {
""bike_returned"" : {
},
""user_miniquery"" : { ""user_miniquery"" : {
""title"" : ""Bitte unterstützen Sie unsere Begleitforschung"", ""title"" : ""Bitte unterstützen Sie unsere Begleitforschung"",
""footer"" : ""Herzlichen Dank und viel Spaß bei der nächsten Fahrt!"", ""footer"" : ""Herzlichen Dank und viel Spaß bei der nächsten Fahrt!"",
@ -230,6 +240,8 @@ namespace TestShareeLib.Model.Connector.Updater
var response = JsonConvert.DeserializeObject<ResponseContainer<DoReturnResponse>>(@" var response = JsonConvert.DeserializeObject<ResponseContainer<DoReturnResponse>>(@"
{ {
""shareejson"" : { ""shareejson"" : {
""bike_returned"" : {
},
""user_miniquery"" : { ""user_miniquery"" : {
""title"" : ""Bitte unterstützen Sie unsere Begleitforschung"", ""title"" : ""Bitte unterstützen Sie unsere Begleitforschung"",
""footer"" : ""Herzlichen Dank und viel Spaß bei der nächsten Fahrt!"", ""footer"" : ""Herzlichen Dank und viel Spaß bei der nächsten Fahrt!"",

View file

@ -104,7 +104,7 @@ namespace TestTINKLib.Fixtures.ObjectTests.ViewModel.Bikes.Bike.BluetoothLock.Re
{ {
bikesViewModel.Received(1).IsIdle = false; // GUI must be locked bikesViewModel.Received(1).IsIdle = false; // GUI must be locked
bikesViewModel.ActionText = "One moment please..."; bikesViewModel.ActionText = "One moment please...";
bikesViewModel.ActionText = "Stay with the bike until the lock is closed."; bikesViewModel.ActionText = "The lock bolt moves through the spokes of the rear wheel.";
bikesViewModel.ActionText = "One moment please..."; bikesViewModel.ActionText = "One moment please...";
pollingManager.StartAsync(); // polling must be restarted again pollingManager.StartAsync(); // polling must be restarted again
bikesViewModel.ActionText = string.Empty; bikesViewModel.ActionText = string.Empty;
@ -167,7 +167,7 @@ namespace TestTINKLib.Fixtures.ObjectTests.ViewModel.Bikes.Bike.BluetoothLock.Re
bikesViewModel.Received(1).IsIdle = false; // GUI must be locked bikesViewModel.Received(1).IsIdle = false; // GUI must be locked
bikesViewModel.ActionText = "One moment please..."; bikesViewModel.ActionText = "One moment please...";
pollingManager.StopAsync(); // Polling must be stopped before any COPR and lock service action pollingManager.StopAsync(); // Polling must be stopped before any COPR and lock service action
bikesViewModel.ActionText = "Stay with the bike until the lock is closed."; bikesViewModel.ActionText = "The lock bolt moves through the spokes of the rear wheel.";
bikesViewModel.ActionText = string.Empty; bikesViewModel.ActionText = string.Empty;
viewService.DisplayAlert("Lock could not be closed!", "Make sure you have granted Bluetooth permission to the app. Step as close as possible to the bike lock and try again.", "OK"); viewService.DisplayAlert("Lock could not be closed!", "Make sure you have granted Bluetooth permission to the app. Step as close as possible to the bike lock and try again.", "OK");
bikesViewModel.ActionText = "Updating..."; bikesViewModel.ActionText = "Updating...";
@ -230,7 +230,7 @@ namespace TestTINKLib.Fixtures.ObjectTests.ViewModel.Bikes.Bike.BluetoothLock.Re
bikesViewModel.Received(1).IsIdle = false; // GUI must be locked bikesViewModel.Received(1).IsIdle = false; // GUI must be locked
bikesViewModel.ActionText = "One moment please..."; bikesViewModel.ActionText = "One moment please...";
pollingManager.StopAsync(); // Polling must be stopped before any COPR and lock service action pollingManager.StopAsync(); // Polling must be stopped before any COPR and lock service action
bikesViewModel.ActionText = "Stay with the bike until the lock is closed."; bikesViewModel.ActionText = "The lock bolt moves through the spokes of the rear wheel.";
bikesViewModel.ActionText = string.Empty; bikesViewModel.ActionText = string.Empty;
viewService.DisplayAlert("Lock could not be closed!", "The process is motion sensitive. Step close to the lock, do not move, and try again.", "OK"); viewService.DisplayAlert("Lock could not be closed!", "The process is motion sensitive. Step close to the lock, do not move, and try again.", "OK");
bikesViewModel.ActionText = "Updating..."; bikesViewModel.ActionText = "Updating...";
@ -294,7 +294,7 @@ namespace TestTINKLib.Fixtures.ObjectTests.ViewModel.Bikes.Bike.BluetoothLock.Re
bikesViewModel.Received(1).IsIdle = false; // GUI must be locked bikesViewModel.Received(1).IsIdle = false; // GUI must be locked
bikesViewModel.ActionText = "One moment please..."; bikesViewModel.ActionText = "One moment please...";
pollingManager.StopAsync(); // Polling must be stopped before any COPR and lock service action pollingManager.StopAsync(); // Polling must be stopped before any COPR and lock service action
bikesViewModel.ActionText = "Stay with the bike until the lock is closed."; bikesViewModel.ActionText = "The lock bolt moves through the spokes of the rear wheel.";
bikesViewModel.ActionText = string.Empty; bikesViewModel.ActionText = string.Empty;
viewService.DisplayAlert("Lock could not be closed!", "Lock bolt is blocked. Make sure that no spoke or any other obstacle prevents the lock from closing and try again.", "OK"); viewService.DisplayAlert("Lock could not be closed!", "Lock bolt is blocked. Make sure that no spoke or any other obstacle prevents the lock from closing and try again.", "OK");
bikesViewModel.ActionText = "Updating..."; bikesViewModel.ActionText = "Updating...";
@ -365,7 +365,7 @@ namespace TestTINKLib.Fixtures.ObjectTests.ViewModel.Bikes.Bike.BluetoothLock.Re
bikesViewModel.Received(1).IsIdle = false; // GUI must be locked bikesViewModel.Received(1).IsIdle = false; // GUI must be locked
bikesViewModel.ActionText = "One moment please..."; bikesViewModel.ActionText = "One moment please...";
pollingManager.StopAsync(); // Polling must be stopped before any COPR and lock service action pollingManager.StopAsync(); // Polling must be stopped before any COPR and lock service action
bikesViewModel.ActionText = "Stay with the bike until the lock is closed."; bikesViewModel.ActionText = "The lock bolt moves through the spokes of the rear wheel.";
#if USELOCALINSTANCE #if USELOCALINSTANCE
locks.Received()[0].CloseAsync(); // Lock must be closed locks.Received()[0].CloseAsync(); // Lock must be closed
#endif #endif
@ -444,7 +444,7 @@ namespace TestTINKLib.Fixtures.ObjectTests.ViewModel.Bikes.Bike.BluetoothLock.Re
bikesViewModel.Received(1).IsIdle = false; // GUI must be locked bikesViewModel.Received(1).IsIdle = false; // GUI must be locked
bikesViewModel.ActionText = "One moment please..."; bikesViewModel.ActionText = "One moment please...";
pollingManager.StopAsync(); // Polling must be stopped before any COPR and lock service action pollingManager.StopAsync(); // Polling must be stopped before any COPR and lock service action
bikesViewModel.ActionText = "Stay with the bike until the lock is closed."; bikesViewModel.ActionText = "The lock bolt moves through the spokes of the rear wheel.";
#if USELOCALINSTANCE #if USELOCALINSTANCE
locks.Received()[0].CloseAsync(); // Lock must be closed locks.Received()[0].CloseAsync(); // Lock must be closed
connector.Command.UpdateLockingStateAsync(bike, Arg.Any<LocationDto>()); connector.Command.UpdateLockingStateAsync(bike, Arg.Any<LocationDto>());
@ -520,7 +520,7 @@ namespace TestTINKLib.Fixtures.ObjectTests.ViewModel.Bikes.Bike.BluetoothLock.Re
bikesViewModel.Received(1).IsIdle = false; // GUI must be locked bikesViewModel.Received(1).IsIdle = false; // GUI must be locked
bikesViewModel.ActionText = "One moment please..."; bikesViewModel.ActionText = "One moment please...";
pollingManager.StopAsync(); // Polling must be stopped before any COPR and lock service action pollingManager.StopAsync(); // Polling must be stopped before any COPR and lock service action
bikesViewModel.ActionText = "Stay with the bike until the lock is closed."; bikesViewModel.ActionText = "The lock bolt moves through the spokes of the rear wheel.";
#if USELOCALINSTANCE #if USELOCALINSTANCE
locks.Received()[0].CloseAsync(); // Lock must be closed locks.Received()[0].CloseAsync(); // Lock must be closed
connector.Command.UpdateLockingStateAsync(bike, Arg.Any<LocationDto>()); connector.Command.UpdateLockingStateAsync(bike, Arg.Any<LocationDto>());
@ -597,7 +597,7 @@ namespace TestTINKLib.Fixtures.ObjectTests.ViewModel.Bikes.Bike.BluetoothLock.Re
bikesViewModel.Received(1).IsIdle = false; // GUI must be locked bikesViewModel.Received(1).IsIdle = false; // GUI must be locked
bikesViewModel.ActionText = "One moment please..."; bikesViewModel.ActionText = "One moment please...";
pollingManager.StopAsync(); // Polling must be stopped before any COPR and lock service action pollingManager.StopAsync(); // Polling must be stopped before any COPR and lock service action
bikesViewModel.ActionText = "Stay with the bike until the lock is closed."; bikesViewModel.ActionText = "The lock bolt moves through the spokes of the rear wheel.";
#if USELOCALINSTANCE #if USELOCALINSTANCE
locks.Received()[0].CloseAsync(); // Lock must be closed locks.Received()[0].CloseAsync(); // Lock must be closed
connector.Command.UpdateLockingStateAsync(bike, Arg.Any<LocationDto>()); connector.Command.UpdateLockingStateAsync(bike, Arg.Any<LocationDto>());

View file

@ -792,7 +792,7 @@ namespace TestShareeLib.ViewModel.Bikes.Bike.BluetoothLock.RequestHandler
bikesViewModel.Received(1).IsIdle = false; // GUI must be locked bikesViewModel.Received(1).IsIdle = false; // GUI must be locked
bikesViewModel.ActionText = "One moment please..."; bikesViewModel.ActionText = "One moment please...";
pollingManager.StopAsync(); // Polling must be stopped before any COPR and lock service action pollingManager.StopAsync(); // Polling must be stopped before any COPR and lock service action
bikesViewModel.ActionText = "Stay with the bike until the lock is closed."; bikesViewModel.ActionText = "The lock bolt moves through the spokes of the rear wheel.";
bikesViewModel.ActionText = "Updating lock state..."; bikesViewModel.ActionText = "Updating lock state...";
bikesViewModel.ActionText = "One moment please..."; bikesViewModel.ActionText = "One moment please...";
pollingManager.StartAsync(); // polling must be restarted again pollingManager.StartAsync(); // polling must be restarted again
@ -857,7 +857,7 @@ namespace TestShareeLib.ViewModel.Bikes.Bike.BluetoothLock.RequestHandler
bikesViewModel.Received(1).IsIdle = false; // GUI must be locked bikesViewModel.Received(1).IsIdle = false; // GUI must be locked
bikesViewModel.ActionText = "One moment please..."; bikesViewModel.ActionText = "One moment please...";
pollingManager.StopAsync(); // Polling must be stopped before any COPR and lock service action pollingManager.StopAsync(); // Polling must be stopped before any COPR and lock service action
bikesViewModel.ActionText = "Stay with the bike until the lock is closed."; bikesViewModel.ActionText = "The lock bolt moves through the spokes of the rear wheel.";
bikesViewModel.ActionText = string.Empty; bikesViewModel.ActionText = string.Empty;
viewService.DisplayAlert("Lock could not be closed!", "Make sure you have granted Bluetooth permission to the app. Step as close as possible to the bike lock and try again.", "OK"); viewService.DisplayAlert("Lock could not be closed!", "Make sure you have granted Bluetooth permission to the app. Step as close as possible to the bike lock and try again.", "OK");
bikesViewModel.ActionText = "Updating..."; bikesViewModel.ActionText = "Updating...";
@ -922,7 +922,7 @@ namespace TestShareeLib.ViewModel.Bikes.Bike.BluetoothLock.RequestHandler
bikesViewModel.Received(1).IsIdle = false; // GUI must be locked bikesViewModel.Received(1).IsIdle = false; // GUI must be locked
bikesViewModel.ActionText = "One moment please..."; bikesViewModel.ActionText = "One moment please...";
pollingManager.StopAsync(); // Polling must be stopped before any COPR and lock service action pollingManager.StopAsync(); // Polling must be stopped before any COPR and lock service action
bikesViewModel.ActionText = "Stay with the bike until the lock is closed."; bikesViewModel.ActionText = "The lock bolt moves through the spokes of the rear wheel.";
bikesViewModel.ActionText = string.Empty; bikesViewModel.ActionText = string.Empty;
viewService.DisplayAlert( viewService.DisplayAlert(
"Lock could not be closed!", "Lock could not be closed!",
@ -991,7 +991,7 @@ namespace TestShareeLib.ViewModel.Bikes.Bike.BluetoothLock.RequestHandler
bikesViewModel.Received(1).IsIdle = false; // GUI must be locked bikesViewModel.Received(1).IsIdle = false; // GUI must be locked
bikesViewModel.ActionText = "One moment please..."; bikesViewModel.ActionText = "One moment please...";
pollingManager.StopAsync(); // Polling must be stopped before any COPR and lock service action pollingManager.StopAsync(); // Polling must be stopped before any COPR and lock service action
bikesViewModel.ActionText = "Stay with the bike until the lock is closed."; bikesViewModel.ActionText = "The lock bolt moves through the spokes of the rear wheel.";
bikesViewModel.ActionText = "Updating lock state..."; bikesViewModel.ActionText = "Updating lock state...";
bikesViewModel.ActionText = "Internet must be available for updating lock status. Please establish an Internet connection!"; bikesViewModel.ActionText = "Internet must be available for updating lock status. Please establish an Internet connection!";
bikesViewModel.ActionText = "One moment please..."; bikesViewModel.ActionText = "One moment please...";
@ -1057,7 +1057,7 @@ namespace TestShareeLib.ViewModel.Bikes.Bike.BluetoothLock.RequestHandler
bikesViewModel.Received(1).IsIdle = false; // GUI must be locked bikesViewModel.Received(1).IsIdle = false; // GUI must be locked
bikesViewModel.ActionText = "One moment please..."; bikesViewModel.ActionText = "One moment please...";
pollingManager.StopAsync(); // Polling must be stopped before any COPR and lock service action pollingManager.StopAsync(); // Polling must be stopped before any COPR and lock service action
bikesViewModel.ActionText = "Stay with the bike until the lock is closed."; bikesViewModel.ActionText = "The lock bolt moves through the spokes of the rear wheel.";
bikesViewModel.ActionText = "Updating lock state..."; bikesViewModel.ActionText = "Updating lock state...";
bikesViewModel.ActionText = "Connection error on updating locking status."; bikesViewModel.ActionText = "Connection error on updating locking status.";
bikesViewModel.ActionText = "One moment please..."; bikesViewModel.ActionText = "One moment please...";
@ -1123,7 +1123,7 @@ namespace TestShareeLib.ViewModel.Bikes.Bike.BluetoothLock.RequestHandler
bikesViewModel.Received(1).IsIdle = false; // GUI must be locked bikesViewModel.Received(1).IsIdle = false; // GUI must be locked
bikesViewModel.ActionText = "One moment please..."; bikesViewModel.ActionText = "One moment please...";
pollingManager.StopAsync(); // Polling must be stopped before any COPR and lock service action pollingManager.StopAsync(); // Polling must be stopped before any COPR and lock service action
bikesViewModel.ActionText = "Stay with the bike until the lock is closed."; bikesViewModel.ActionText = "The lock bolt moves through the spokes of the rear wheel.";
bikesViewModel.ActionText = "Updating lock state..."; bikesViewModel.ActionText = "Updating lock state...";
bikesViewModel.ActionText = "Status error on updating lock state."; bikesViewModel.ActionText = "Status error on updating lock state.";
bikesViewModel.ActionText = "One moment please..."; bikesViewModel.ActionText = "One moment please...";

View file

@ -93,7 +93,7 @@ namespace TestTINKLib.Fixtures.ObjectTests.ViewModel.Bikes.Bike.BluetoothLock.Re
bikesViewModel.Received(1).IsIdle = false; // GUI must be locked bikesViewModel.Received(1).IsIdle = false; // GUI must be locked
bikesViewModel.ActionText = "One moment please..."; bikesViewModel.ActionText = "One moment please...";
pollingManager.StopAsync(); // Polling must be stopped before any COPR and lock service action pollingManager.StopAsync(); // Polling must be stopped before any COPR and lock service action
bikesViewModel.ActionText = "Stay with the bike until the lock is closed."; bikesViewModel.ActionText = "The lock bolt moves through the spokes of the rear wheel.";
locks[0].CloseAsync(); locks[0].CloseAsync();
bikesViewModel.ActionText = "Disconnecting lock..."; bikesViewModel.ActionText = "Disconnecting lock...";
locks.DisconnectAsync(Arg.Any<int>(), Arg.Any<Guid>()); locks.DisconnectAsync(Arg.Any<int>(), Arg.Any<Guid>());
@ -158,7 +158,7 @@ namespace TestTINKLib.Fixtures.ObjectTests.ViewModel.Bikes.Bike.BluetoothLock.Re
bikesViewModel.Received(1).IsIdle = false; // GUI must be locked bikesViewModel.Received(1).IsIdle = false; // GUI must be locked
bikesViewModel.ActionText = "One moment please..."; bikesViewModel.ActionText = "One moment please...";
pollingManager.StopAsync(); // Polling must be stopped before any COPR and lock service action pollingManager.StopAsync(); // Polling must be stopped before any COPR and lock service action
bikesViewModel.ActionText = "Stay with the bike until the lock is closed."; bikesViewModel.ActionText = "The lock bolt moves through the spokes of the rear wheel.";
locks[0].CloseAsync(); locks[0].CloseAsync();
bikesViewModel.ActionText = string.Empty; bikesViewModel.ActionText = string.Empty;
viewService.DisplayAlert("Lock could not be closed!", "Make sure you have granted Bluetooth permission to the app. Step as close as possible to the bike lock and try again.", "OK"); viewService.DisplayAlert("Lock could not be closed!", "Make sure you have granted Bluetooth permission to the app. Step as close as possible to the bike lock and try again.", "OK");
@ -223,7 +223,7 @@ namespace TestTINKLib.Fixtures.ObjectTests.ViewModel.Bikes.Bike.BluetoothLock.Re
bikesViewModel.Received(1).IsIdle = false; // GUI must be locked bikesViewModel.Received(1).IsIdle = false; // GUI must be locked
bikesViewModel.ActionText = "One moment please..."; bikesViewModel.ActionText = "One moment please...";
pollingManager.StopAsync(); // Polling must be stopped before any COPR and lock service action pollingManager.StopAsync(); // Polling must be stopped before any COPR and lock service action
bikesViewModel.ActionText = "Stay with the bike until the lock is closed."; bikesViewModel.ActionText = "The lock bolt moves through the spokes of the rear wheel.";
locks[0].CloseAsync(); locks[0].CloseAsync();
bikesViewModel.ActionText = string.Empty; bikesViewModel.ActionText = string.Empty;
viewService.DisplayAdvancedAlert( viewService.DisplayAdvancedAlert(
@ -362,7 +362,7 @@ namespace TestTINKLib.Fixtures.ObjectTests.ViewModel.Bikes.Bike.BluetoothLock.Re
"Bike could not be rented!", "Bike could not be rented!",
"A stable Internet connection is required. Connect to WIFI or to mobile network and activate mobile data. Try again.", "A stable Internet connection is required. Connect to WIFI or to mobile network and activate mobile data. Try again.",
"OK"); "OK");
bikesViewModel.ActionText = "Stay with the bike until the lock is closed."; bikesViewModel.ActionText = "The lock bolt moves through the spokes of the rear wheel.";
locks[0].CloseAsync(); locks[0].CloseAsync();
bikesViewModel.ActionText = "Disconnecting lock..."; bikesViewModel.ActionText = "Disconnecting lock...";
locks.DisconnectAsync(Arg.Any<int>(), Arg.Any<Guid>()); locks.DisconnectAsync(Arg.Any<int>(), Arg.Any<Guid>());
@ -432,7 +432,7 @@ namespace TestTINKLib.Fixtures.ObjectTests.ViewModel.Bikes.Bike.BluetoothLock.Re
connector.Command.DoBookAsync(bike); connector.Command.DoBookAsync(bike);
bikesViewModel.ActionText = string.Empty; bikesViewModel.ActionText = string.Empty;
viewService.DisplayAlert("Bike could not be rented!", "Exception message.", "OK"); viewService.DisplayAlert("Bike could not be rented!", "Exception message.", "OK");
bikesViewModel.ActionText = "Stay with the bike until the lock is closed."; bikesViewModel.ActionText = "The lock bolt moves through the spokes of the rear wheel.";
locks[0].CloseAsync(); locks[0].CloseAsync();
bikesViewModel.ActionText = "Disconnecting lock..."; bikesViewModel.ActionText = "Disconnecting lock...";
locks.DisconnectAsync(Arg.Any<int>(), Arg.Any<Guid>()); locks.DisconnectAsync(Arg.Any<int>(), Arg.Any<Guid>());

View file

@ -162,7 +162,7 @@ namespace TestTINKLib.Fixtures.ObjectTests.ViewModel.Bikes.Bike.BluetoothLock.Re
"Bike could not be rented!", "Bike could not be rented!",
"A stable Internet connection is required. Connect to WIFI or to mobile network and activate mobile data. Try again.", "A stable Internet connection is required. Connect to WIFI or to mobile network and activate mobile data. Try again.",
"OK"); "OK");
bikesViewModel.ActionText = "Stay with the bike until the lock is closed."; bikesViewModel.ActionText = "The lock bolt moves through the spokes of the rear wheel.";
locks[0].CloseAsync(); locks[0].CloseAsync();
bikesViewModel.ActionText = "Updating..."; bikesViewModel.ActionText = "Updating...";
pollingManager.StartAsync(); // polling must be restarted again pollingManager.StartAsync(); // polling must be restarted again
@ -232,7 +232,7 @@ namespace TestTINKLib.Fixtures.ObjectTests.ViewModel.Bikes.Bike.BluetoothLock.Re
"Exception message.", "Exception message.",
"Please try again.", "Please try again.",
"OK"); "OK");
bikesViewModel.ActionText = "Stay with the bike until the lock is closed."; bikesViewModel.ActionText = "The lock bolt moves through the spokes of the rear wheel.";
locks[0].CloseAsync(); locks[0].CloseAsync();
bikesViewModel.ActionText = "Updating..."; bikesViewModel.ActionText = "Updating...";
pollingManager.StartAsync(); // polling must be restarted again pollingManager.StartAsync(); // polling must be restarted again
@ -292,7 +292,7 @@ namespace TestTINKLib.Fixtures.ObjectTests.ViewModel.Bikes.Bike.BluetoothLock.Re
bikesViewModel.Received(1).IsIdle = false; // GUI must be locked bikesViewModel.Received(1).IsIdle = false; // GUI must be locked
bikesViewModel.ActionText = "One moment please..."; bikesViewModel.ActionText = "One moment please...";
pollingManager.StopAsync(); // Polling must be stopped before any COPR and lock service action pollingManager.StopAsync(); // Polling must be stopped before any COPR and lock service action
bikesViewModel.ActionText = "Stay with the bike until the lock is closed."; bikesViewModel.ActionText = "The lock bolt moves through the spokes of the rear wheel.";
locks[0].CloseAsync(); locks[0].CloseAsync();
bikesViewModel.ActionText = "Canceling reservation..."; bikesViewModel.ActionText = "Canceling reservation...";
connector.Command.DoCancelReservation(bike); connector.Command.DoCancelReservation(bike);
@ -361,7 +361,7 @@ namespace TestTINKLib.Fixtures.ObjectTests.ViewModel.Bikes.Bike.BluetoothLock.Re
bikesViewModel.Received(1).IsIdle = false; // GUI must be locked bikesViewModel.Received(1).IsIdle = false; // GUI must be locked
bikesViewModel.ActionText = "One moment please..."; bikesViewModel.ActionText = "One moment please...";
pollingManager.StopAsync(); // Polling must be stopped before any COPR and lock service action pollingManager.StopAsync(); // Polling must be stopped before any COPR and lock service action
bikesViewModel.ActionText = "Stay with the bike until the lock is closed."; bikesViewModel.ActionText = "The lock bolt moves through the spokes of the rear wheel.";
locks[0].CloseAsync(); locks[0].CloseAsync();
bikesViewModel.ActionText = string.Empty; bikesViewModel.ActionText = string.Empty;
viewService.DisplayAlert( viewService.DisplayAlert(
@ -432,7 +432,7 @@ namespace TestTINKLib.Fixtures.ObjectTests.ViewModel.Bikes.Bike.BluetoothLock.Re
bikesViewModel.Received(1).IsIdle = false; // GUI must be locked bikesViewModel.Received(1).IsIdle = false; // GUI must be locked
bikesViewModel.ActionText = "One moment please..."; bikesViewModel.ActionText = "One moment please...";
pollingManager.StopAsync(); // Polling must be stopped before any COPR and lock service action pollingManager.StopAsync(); // Polling must be stopped before any COPR and lock service action
bikesViewModel.ActionText = "Stay with the bike until the lock is closed."; bikesViewModel.ActionText = "The lock bolt moves through the spokes of the rear wheel.";
locks[0].CloseAsync(); locks[0].CloseAsync();
bikesViewModel.ActionText = string.Empty; bikesViewModel.ActionText = string.Empty;
viewService.DisplayAlert( viewService.DisplayAlert(
@ -510,7 +510,7 @@ namespace TestTINKLib.Fixtures.ObjectTests.ViewModel.Bikes.Bike.BluetoothLock.Re
bikesViewModel.Received(1).IsIdle = false; // GUI must be locked bikesViewModel.Received(1).IsIdle = false; // GUI must be locked
bikesViewModel.ActionText = "One moment please..."; bikesViewModel.ActionText = "One moment please...";
pollingManager.StopAsync(); // Polling must be stopped before any COPR and lock service action pollingManager.StopAsync(); // Polling must be stopped before any COPR and lock service action
bikesViewModel.ActionText = "Stay with the bike until the lock is closed."; bikesViewModel.ActionText = "The lock bolt moves through the spokes of the rear wheel.";
locks[0].CloseAsync(); locks[0].CloseAsync();
bikesViewModel.ActionText = "Canceling reservation..."; bikesViewModel.ActionText = "Canceling reservation...";
connector.Command.DoCancelReservation(bike); connector.Command.DoCancelReservation(bike);
@ -581,7 +581,7 @@ namespace TestTINKLib.Fixtures.ObjectTests.ViewModel.Bikes.Bike.BluetoothLock.Re
bikesViewModel.Received(1).IsIdle = false; // GUI must be locked bikesViewModel.Received(1).IsIdle = false; // GUI must be locked
bikesViewModel.ActionText = "One moment please..."; bikesViewModel.ActionText = "One moment please...";
pollingManager.StopAsync(); // Polling must be stopped before any COPR and lock service action pollingManager.StopAsync(); // Polling must be stopped before any COPR and lock service action
bikesViewModel.ActionText = "Stay with the bike until the lock is closed."; bikesViewModel.ActionText = "The lock bolt moves through the spokes of the rear wheel.";
locks[0].CloseAsync(); locks[0].CloseAsync();
bikesViewModel.ActionText = "Canceling reservation..."; bikesViewModel.ActionText = "Canceling reservation...";
connector.Command.DoCancelReservation(bike); connector.Command.DoCancelReservation(bike);
@ -652,7 +652,7 @@ namespace TestTINKLib.Fixtures.ObjectTests.ViewModel.Bikes.Bike.BluetoothLock.Re
bikesViewModel.Received(1).IsIdle = false; // GUI must be locked bikesViewModel.Received(1).IsIdle = false; // GUI must be locked
bikesViewModel.ActionText = "One moment please..."; bikesViewModel.ActionText = "One moment please...";
pollingManager.StopAsync(); // Polling must be stopped before any COPR and lock service action pollingManager.StopAsync(); // Polling must be stopped before any COPR and lock service action
bikesViewModel.ActionText = "Stay with the bike until the lock is closed."; bikesViewModel.ActionText = "The lock bolt moves through the spokes of the rear wheel.";
locks[0].CloseAsync(); locks[0].CloseAsync();
bikesViewModel.ActionText = "Canceling reservation..."; bikesViewModel.ActionText = "Canceling reservation...";
connector.Command.DoCancelReservation(bike); connector.Command.DoCancelReservation(bike);

View file

@ -682,7 +682,7 @@ namespace TestShareeLib.ViewModel.Bikes.Bike.BluetoothLock.RequestHandler
bikesViewModel.Received(1).IsIdle = false; // GUI must be locked bikesViewModel.Received(1).IsIdle = false; // GUI must be locked
bikesViewModel.ActionText = "One moment please..."; bikesViewModel.ActionText = "One moment please...";
pollingManager.StopAsync(); // Polling must be stopped before any COPR and lock service action pollingManager.StopAsync(); // Polling must be stopped before any COPR and lock service action
bikesViewModel.ActionText = "Stay with the bike until the lock is closed."; bikesViewModel.ActionText = "The lock bolt moves through the spokes of the rear wheel.";
bikesViewModel.ActionText = "Updating lock state..."; bikesViewModel.ActionText = "Updating lock state...";
bikesViewModel.ActionText = "One moment please..."; bikesViewModel.ActionText = "One moment please...";
pollingManager.StartAsync(); // polling must be restarted again pollingManager.StartAsync(); // polling must be restarted again
@ -743,7 +743,7 @@ namespace TestShareeLib.ViewModel.Bikes.Bike.BluetoothLock.RequestHandler
bikesViewModel.Received(1).IsIdle = false; // GUI must be locked bikesViewModel.Received(1).IsIdle = false; // GUI must be locked
bikesViewModel.ActionText = "One moment please..."; bikesViewModel.ActionText = "One moment please...";
pollingManager.StopAsync(); // Polling must be stopped before any COPR and lock service action pollingManager.StopAsync(); // Polling must be stopped before any COPR and lock service action
bikesViewModel.ActionText = "Stay with the bike until the lock is closed."; bikesViewModel.ActionText = "The lock bolt moves through the spokes of the rear wheel.";
bikesViewModel.ActionText = string.Empty; bikesViewModel.ActionText = string.Empty;
viewService.DisplayAlert("Lock could not be closed!", "Make sure you have granted Bluetooth permission to the app. Step as close as possible to the bike lock and try again.", "OK"); viewService.DisplayAlert("Lock could not be closed!", "Make sure you have granted Bluetooth permission to the app. Step as close as possible to the bike lock and try again.", "OK");
bikesViewModel.ActionText = "Updating..."; bikesViewModel.ActionText = "Updating...";
@ -808,7 +808,7 @@ namespace TestShareeLib.ViewModel.Bikes.Bike.BluetoothLock.RequestHandler
bikesViewModel.Received(1).IsIdle = false; // GUI must be locked bikesViewModel.Received(1).IsIdle = false; // GUI must be locked
bikesViewModel.ActionText = "One moment please..."; bikesViewModel.ActionText = "One moment please...";
pollingManager.StopAsync(); // Polling must be stopped before any COPR and lock service action pollingManager.StopAsync(); // Polling must be stopped before any COPR and lock service action
bikesViewModel.ActionText = "Stay with the bike until the lock is closed."; bikesViewModel.ActionText = "The lock bolt moves through the spokes of the rear wheel.";
bikesViewModel.ActionText = string.Empty; bikesViewModel.ActionText = string.Empty;
viewService.DisplayAlert( viewService.DisplayAlert(
"Lock could not be closed!", "Lock could not be closed!",
@ -877,7 +877,7 @@ namespace TestShareeLib.ViewModel.Bikes.Bike.BluetoothLock.RequestHandler
bikesViewModel.Received(1).IsIdle = false; // GUI must be locked bikesViewModel.Received(1).IsIdle = false; // GUI must be locked
bikesViewModel.ActionText = "One moment please..."; bikesViewModel.ActionText = "One moment please...";
pollingManager.StopAsync(); // Polling must be stopped before any COPR and lock service action pollingManager.StopAsync(); // Polling must be stopped before any COPR and lock service action
bikesViewModel.ActionText = "Stay with the bike until the lock is closed."; bikesViewModel.ActionText = "The lock bolt moves through the spokes of the rear wheel.";
bikesViewModel.ActionText = "Updating lock state..."; bikesViewModel.ActionText = "Updating lock state...";
bikesViewModel.ActionText = "Internet must be available for updating lock status. Please establish an Internet connection!"; bikesViewModel.ActionText = "Internet must be available for updating lock status. Please establish an Internet connection!";
bikesViewModel.ActionText = "One moment please..."; bikesViewModel.ActionText = "One moment please...";
@ -943,7 +943,7 @@ namespace TestShareeLib.ViewModel.Bikes.Bike.BluetoothLock.RequestHandler
bikesViewModel.Received(1).IsIdle = false; // GUI must be locked bikesViewModel.Received(1).IsIdle = false; // GUI must be locked
bikesViewModel.ActionText = "One moment please..."; bikesViewModel.ActionText = "One moment please...";
pollingManager.StopAsync(); // Polling must be stopped before any COPR and lock service action pollingManager.StopAsync(); // Polling must be stopped before any COPR and lock service action
bikesViewModel.ActionText = "Stay with the bike until the lock is closed."; bikesViewModel.ActionText = "The lock bolt moves through the spokes of the rear wheel.";
bikesViewModel.ActionText = "Updating lock state..."; bikesViewModel.ActionText = "Updating lock state...";
bikesViewModel.ActionText = "Connection error on updating locking status."; bikesViewModel.ActionText = "Connection error on updating locking status.";
bikesViewModel.ActionText = "One moment please..."; bikesViewModel.ActionText = "One moment please...";
@ -1009,7 +1009,7 @@ namespace TestShareeLib.ViewModel.Bikes.Bike.BluetoothLock.RequestHandler
bikesViewModel.Received(1).IsIdle = false; // GUI must be locked bikesViewModel.Received(1).IsIdle = false; // GUI must be locked
bikesViewModel.ActionText = "One moment please..."; bikesViewModel.ActionText = "One moment please...";
pollingManager.StopAsync(); // Polling must be stopped before any COPR and lock service action pollingManager.StopAsync(); // Polling must be stopped before any COPR and lock service action
bikesViewModel.ActionText = "Stay with the bike until the lock is closed."; bikesViewModel.ActionText = "The lock bolt moves through the spokes of the rear wheel.";
bikesViewModel.ActionText = "Updating lock state..."; bikesViewModel.ActionText = "Updating lock state...";
bikesViewModel.ActionText = "Status error on updating lock state."; bikesViewModel.ActionText = "Status error on updating lock state.";
bikesViewModel.ActionText = "One moment please..."; bikesViewModel.ActionText = "One moment please...";

View file

@ -74,7 +74,7 @@ namespace TestShareeLib.ViewModel.Bikes.Bike.BluetoothLock
//Step.StartingQueryingLocation //Step.StartingQueryingLocation
bikesViewModel.ActionText = "Start query location..."; bikesViewModel.ActionText = "Start query location...";
//Step.ClosingLock //Step.ClosingLock
bikesViewModel.ActionText = "Stay with the bike until the lock is closed."; bikesViewModel.ActionText = "The lock bolt moves through the spokes of the rear wheel.";
//Step.WaitStopPollingQueryLocation //Step.WaitStopPollingQueryLocation
bikesViewModel.ActionText = "Query location..."; bikesViewModel.ActionText = "Query location...";
//Step.UpdateLockingState //Step.UpdateLockingState
@ -166,7 +166,7 @@ namespace TestShareeLib.ViewModel.Bikes.Bike.BluetoothLock
//Step.StartingQueryingLocation //Step.StartingQueryingLocation
bikesViewModel.ActionText = "Start query location..."; bikesViewModel.ActionText = "Start query location...";
//Step.ClosingLock //Step.ClosingLock
bikesViewModel.ActionText = "Stay with the bike until the lock is closed."; bikesViewModel.ActionText = "The lock bolt moves through the spokes of the rear wheel.";
//Step.WaitStopPollingQueryLocation //Step.WaitStopPollingQueryLocation
bikesViewModel.ActionText = "Query location..."; bikesViewModel.ActionText = "Query location...";
//Step.UpdateLockingState //Step.UpdateLockingState

View file

@ -55,7 +55,7 @@ namespace TestShareeLib.ViewModel.Bikes.Bike.CopriLock.RequestHandler
bikesViewModel.Received(1).IsIdle = false; // GUI must be locked bikesViewModel.Received(1).IsIdle = false; // GUI must be locked
bikesViewModel.ActionText = "One moment please..."; bikesViewModel.ActionText = "One moment please...";
pollingManager.StopAsync(); // Polling must be stopped before any COPR and lock service action pollingManager.StopAsync(); // Polling must be stopped before any COPR and lock service action
viewService.DisplayUserFeedbackPopup(Arg.Any<IBatteryMutable>(), Arg.Any<string>()); viewService.DisplayUserFeedbackPopup(Arg.Any<IBatteryMutable>());
bikesViewModel.ActionText = "Submitting feedback..."; bikesViewModel.ActionText = "Submitting feedback...";
connector.Command.DoSubmitFeedback(Arg.Any<TINK.Model.Connector.IUserFeedback>(), Arg.Any<Uri>()); // Booking must be performed connector.Command.DoSubmitFeedback(Arg.Any<TINK.Model.Connector.IUserFeedback>(), Arg.Any<Uri>()); // Booking must be performed
bikesViewModel.ActionText = string.Empty; bikesViewModel.ActionText = string.Empty;
@ -117,7 +117,7 @@ namespace TestShareeLib.ViewModel.Bikes.Bike.CopriLock.RequestHandler
bikesViewModel.Received(1).IsIdle = false; // GUI must be locked bikesViewModel.Received(1).IsIdle = false; // GUI must be locked
bikesViewModel.ActionText = "One moment please..."; bikesViewModel.ActionText = "One moment please...";
pollingManager.StopAsync(); // Polling must be stopped before any COPR and lock service action pollingManager.StopAsync(); // Polling must be stopped before any COPR and lock service action
viewService.DisplayUserFeedbackPopup(Arg.Any<IBatteryMutable>(), Arg.Any<string>()); viewService.DisplayUserFeedbackPopup(Arg.Any<IBatteryMutable>());
bikesViewModel.ActionText = "Submitting feedback..."; bikesViewModel.ActionText = "Submitting feedback...";
connector.Command.DoSubmitFeedback(Arg.Any<TINK.Model.Connector.IUserFeedback>(), Arg.Any<Uri>()); // Booking must be performed connector.Command.DoSubmitFeedback(Arg.Any<TINK.Model.Connector.IUserFeedback>(), Arg.Any<Uri>()); // Booking must be performed
bikesViewModel.ActionText = "Updating..."; bikesViewModel.ActionText = "Updating...";
@ -176,7 +176,7 @@ namespace TestShareeLib.ViewModel.Bikes.Bike.CopriLock.RequestHandler
bikesViewModel.Received(1).IsIdle = false; // GUI must be locked bikesViewModel.Received(1).IsIdle = false; // GUI must be locked
bikesViewModel.ActionText = "One moment please..."; bikesViewModel.ActionText = "One moment please...";
pollingManager.StopAsync(); // Polling must be stopped before any COPR and lock service action pollingManager.StopAsync(); // Polling must be stopped before any COPR and lock service action
viewService.DisplayUserFeedbackPopup(Arg.Any<IBatteryMutable>(), Arg.Any<string>()); viewService.DisplayUserFeedbackPopup(Arg.Any<IBatteryMutable>());
bikesViewModel.ActionText = "Submitting feedback..."; bikesViewModel.ActionText = "Submitting feedback...";
connector.Command.DoSubmitFeedback(Arg.Any<TINK.Model.Connector.IUserFeedback>(), Arg.Any<Uri>()); // Booking must be performed connector.Command.DoSubmitFeedback(Arg.Any<TINK.Model.Connector.IUserFeedback>(), Arg.Any<Uri>()); // Booking must be performed
viewService.PushModalAsync(ViewTypes.MiniSurvey); viewService.PushModalAsync(ViewTypes.MiniSurvey);