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"?>
<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" />
<!-- Google Maps related permissions -->
<!-- Permission to receive remote notifications from Google Play Services -->

View file

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

View file

@ -150,7 +150,7 @@ namespace TINK.View.Account
#if USCSHARP9
public Task<IViewService.IUserFeedback> DisplayUserFeedbackPopup() => throw new NotSupportedException();
#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
}
}

View file

@ -249,9 +249,8 @@ namespace TINK.View.BikesAtStation
public async Task<IViewService.IUserFeedback> DisplayUserFeedbackPopup() => await Navigation.ShowPopupAsync<FeedbackPopup.Result>(new FeedbackPopup());
#else
/// <summary> Displays user feedback popup.</summary>
/// <param name="co2Saving"> Co2 saving information.</param>
/// <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
}
}

View file

@ -123,7 +123,7 @@ namespace TINK.View.Contact
#if USCSHARP9
public Task<IViewService.IUserFeedback> DisplayUserFeedbackPopup() => throw new NotSupportedException();
#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
#if USEFLYOUT

View file

@ -116,7 +116,7 @@ namespace TINK.View.Contact
#if USCSHARP9
public Task<IViewService.IUserFeedback> DisplayUserFeedbackPopup() => throw new NotSupportedException();
#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
#if USEFLYOUT

View file

@ -46,6 +46,7 @@ namespace TINK.View.FindBike
m_oViewModel = new FindBikePageViewModel(
model.ActiveUser,
model,
App.PermissionsService,
App.BluetoothService,
Device.RuntimePlatform,
@ -181,7 +182,7 @@ namespace TINK.View.FindBike
/// <summary> Displays user feedback popup.</summary>
/// <param name="co2Saving"> Co2 saving information.</param>
/// <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
}
}

View file

@ -123,7 +123,7 @@ namespace TINK.View.Info.BikeInfo
#if USCSHARP9
public Task<IViewService.IUserFeedback> DisplayUserFeedbackPopup() => throw new NotSupportedException();
#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
}
}

View file

@ -117,7 +117,7 @@ namespace TINK.View.Login
#if USCSHARP9
public Task<IViewService.IUserFeedback> DisplayUserFeedbackPopup() => throw new NotSupportedException();
#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
}
}

View file

@ -121,7 +121,7 @@ namespace TINK.View.Map
#if USCSHARP9
public Task<IViewService.IUserFeedback> DisplayUserFeedbackPopup() => throw new NotSupportedException();
#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
#if USEFLYOUT

View file

@ -94,7 +94,7 @@ namespace TINK.View.MiniSurvey
/// <summary> Displays user feedback popup.</summary>
/// <param name="co2Saving"> Co2 saving information.</param>
/// <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
}
}

View file

@ -181,7 +181,7 @@ namespace TINK.View.MyBikes
/// <summary> Displays user feedback popup.</summary>
/// <param name="co2Saving"> Co2 saving information.</param>
/// <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
}
}

View file

@ -150,7 +150,7 @@ namespace TINK.View.Settings
/// <summary> Displays user feedback popup.</summary>
/// <param name="co2Saving"> Co2 saving information.</param>
/// <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
#if USERFEEDBACKDLG_TRYOUT

View file

@ -77,7 +77,7 @@ namespace TINK.View.WhatsNew.Agb
#if USCSHARP9
public Task<IViewService.IUserFeedback> DisplayUserFeedbackPopup() => throw new NotSupportedException();
#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
}
}

View file

@ -80,7 +80,7 @@ namespace TINK.View.WhatsNew
#if USCSHARP9
public Task<IViewService.IUserFeedback> DisplayUserFeedbackPopup() => throw new NotSupportedException();
#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
/// <summary>

View file

@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android" android:installLocation="internalOnly" package="com.TeilRad.Meinkonrad" android:versionName="3.0.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" />
<!-- Google Maps related permissions -->
<!-- Permission to receive remote notifications from Google Play Services -->

View file

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

View file

@ -150,7 +150,7 @@ namespace TINK.View.Account
#if USCSHARP9
public Task<IViewService.IUserFeedback> DisplayUserFeedbackPopup() => throw new NotSupportedException();
#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
}
}

View file

@ -20,11 +20,12 @@
</ContentView.Resources>
<Frame
Padding="10"
Margin="0,10,0,5"
HorizontalOptions="FillAndExpand"
VerticalOptions="FillAndExpand"
BackgroundColor="White">
Padding="10"
Margin="0,10,0,5"
HasShadow="False"
HorizontalOptions="FillAndExpand"
VerticalOptions="FillAndExpand"
BackgroundColor="White">
<StackLayout
Orientation="Vertical"

View file

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

View file

@ -248,9 +248,8 @@ namespace TINK.View.BikesAtStation
public async Task<IViewService.IUserFeedback> DisplayUserFeedbackPopup() => await Navigation.ShowPopupAsync<FeedbackPopup.Result>(new FeedbackPopup());
#else
/// <summary> Displays user feedback popup.</summary>
/// <param name="co2Saving"> Co2 saving information.</param>
/// <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
}
}

View file

@ -107,29 +107,43 @@
<!--Buttons-->
<StackLayout
Spacing="5"
Margin="0,10,0,0">
Spacing="5"
Margin="0,10,0,0">
<!--- Phone to operator -->
<Button
x:Name="PhoneNumberButton"
IsVisible="{Binding PhoneNumberText, Converter={StaticResource StringNotNullOrEmpty_Converter}}"
Text="{Binding PhoneNumberText}"
IsEnabled="{Binding IsDoPhoncallAvailable}"
Command="{Binding OnPhoneRequest}"/>
x:Name="PhoneNumberButton"
IsVisible="{Binding PhoneNumberText, Converter={StaticResource StringNotNullOrEmpty_Converter}}"
Text="{Binding PhoneNumberText}"
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 -->
<Button
Style="{StaticResource SecondaryButton}"
x:Name="MailAddressButton"
IsVisible="{Binding MailAddressText, Converter={StaticResource StringNotNullOrEmpty_Converter}}"
Text="{Binding MailAddressText}"
IsEnabled="{Binding IsSendMailAvailable}"
Command="{Binding OnMailToOperatorRequest}"/>
Style="{StaticResource SecondaryButton}"
x:Name="MailAddressButton"
IsVisible="{Binding MailAddressText, Converter={StaticResource StringNotNullOrEmpty_Converter}}"
Text="{Binding MailAddressText}"
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-->
<Button
Style="{StaticResource NoOutlineButton}"
Style="{StaticResource NoOutlineButtonWhite}"
Text="{x:Static resources:AppResources.ActionSelectAnotherStation}"
Command="{Binding OnSelectStationRequest}"/>
@ -144,30 +158,30 @@
<!--- Contact app-developer -->
<StackLayout
Grid.Row="1"
Padding="10"
Margin="0,0,0,10"
VerticalOptions="End"
Spacing="0">
<StackLayout.GestureRecognizers>
<TapGestureRecognizer
Command="{Binding OnMailAppRelatedRequest}"/>
</StackLayout.GestureRecognizers>
Grid.Row="1"
Padding="10"
Margin="0,0,0,10"
VerticalOptions="End"
Spacing="0">
<BoxView
Margin="0,0,0,10"
HeightRequest="1"
WidthRequest="400"
HorizontalOptions="Center"
Color="DimGray"/>
Margin="0,0,0,10"
HeightRequest="1"
WidthRequest="400"
HorizontalOptions="Center"
Color="DimGray"/>
<Label
TextType="Html"
HorizontalOptions="Center"
TextColor="{DynamicResource primary-back-title-color}"
Text="{x:Static resources:AppResources.ActionSendDiagnosis}"
IsEnabled="{Binding IsSendMailAvailable}">
</Label>
<Button
x:Name="DiagnosticsButton"
Style="{StaticResource NoOutlineButtonBackgroundColor}"
Text="{x:Static resources:AppResources.ActionSendDiagnosis}"
Command="{Binding OnMailToOperatorRequest}">
<Button.Triggers>
<DataTrigger TargetType="Button" Binding="{Binding IsSendMailAvailable}" Value="False">
<Setter Property="TextColor" Value="DimGray" />
</DataTrigger>
</Button.Triggers>
</Button>
</StackLayout>

View file

@ -124,7 +124,7 @@ namespace TINK.View.Contact
#if USCSHARP9
public Task<IViewService.IUserFeedback> DisplayUserFeedbackPopup() => throw new NotSupportedException();
#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
#if USEFLYOUT

View file

@ -118,7 +118,7 @@ namespace TINK.View.Contact
#if USCSHARP9
public Task<IViewService.IUserFeedback> DisplayUserFeedbackPopup() => throw new NotSupportedException();
#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
#if USEFLYOUT

View file

@ -8,7 +8,7 @@
<TabbedPage.Resources>
<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>
</TabbedPage.Resources>

View file

@ -10,7 +10,8 @@
xmlns:sharedGui="clr-namespace:ShareeSharedGuiLib.View"
xmlns:rental_process="clr-namespace:TINK.ViewModel.Bikes;assembly=TINKLib"
xmlns:bikeRentalProcess="clr-namespace:ShareeSharedGuiLib.View.Bike.RentalProcess"
BackgroundColor="{DynamicResource background-color}">
BackgroundColor="{DynamicResource background-color}"
Shell.NavBarIsVisible="{Binding IsIdle}">
<Shell.TitleView>
<Grid ColumnDefinitions="Auto, 1*">
@ -112,8 +113,15 @@
Grid.Row="1"
WidthRequest="100"
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>
@ -141,7 +149,8 @@
<!--Bike-->
<ListView
Grid.Row="1"
x:Name="FindBikeListView"
x:Name="FindBikeListView"
BackgroundColor="{DynamicResource background-color}"
SelectionMode="None"
SelectedItem="{Binding SelectedBike}"
IsEnabled="{Binding IsIdle}"

View file

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

View file

@ -123,7 +123,7 @@ namespace TINK.View.Info.BikeInfo
#if USCSHARP9
public Task<IViewService.IUserFeedback> DisplayUserFeedbackPopup() => throw new NotSupportedException();
#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
}
}

View file

@ -28,119 +28,118 @@
Grid.Row="0">
<Frame
Padding="10"
Margin="0,10,0,5"
HorizontalOptions="FillAndExpand"
BackgroundColor="White">
Padding="10"
Margin="0,10,0,5"
HorizontalOptions="FillAndExpand"
BackgroundColor="White">
<StackLayout
x:Name="LoginPageView"
Padding="10">
<StackLayout
x:Name="LoginPageView"
Padding="10">
<Label
Text="{x:Static resources:AppResources.MarkingLoginEmailAddressLabel}"
Margin="0,0,0,-5">
<Label.Triggers>
<DataTrigger
TargetType="Label"
Binding="{Binding Source={x:Reference EMailEntry}, Path=Text, TargetNullValue=''}"
Value="">
<Setter
Property="IsVisible"
Value="False" />
</DataTrigger>
</Label.Triggers>
</Label>
<Label
Text="{x:Static resources:AppResources.MarkingLoginEmailAddressLabel}"
Margin="0,0,0,-5">
<Label.Triggers>
<DataTrigger
TargetType="Label"
Binding="{Binding Source={x:Reference EMailEntry}, Path=Text, TargetNullValue=''}"
Value="">
<Setter
Property="IsVisible"
Value="False" />
</DataTrigger>
</Label.Triggers>
</Label>
<Entry
Placeholder="{x:Static resources:AppResources.MarkingLoginEmailAddressPlaceholder}"
Keyboard="Email"
AutomationId="mail_address_text"
x:Name="EMailEntry"
Text="{Binding MailAddress}"
IsEnabled="{Binding IsLoggedOut}"/>
<Entry
Placeholder="{x:Static resources:AppResources.MarkingLoginEmailAddressPlaceholder}"
Keyboard="Email"
AutomationId="mail_address_text"
x:Name="EMailEntry"
Text="{Binding MailAddress}"
IsEnabled="{Binding IsLoggedOut}"/>
<Label
Text="{x:Static resources:AppResources.MarkingLoginPasswordPlaceholder}"
Margin="0,0,0,-5">
<Label.Triggers>
<DataTrigger
TargetType="Label"
Binding="{Binding Source={x:Reference PasswordEntry}, Path=Text, TargetNullValue=''}"
Value="">
<Setter
Property="IsVisible"
Value="False" />
</DataTrigger>
</Label.Triggers>
</Label>
<Label
Text="{x:Static resources:AppResources.MarkingLoginPasswordPlaceholder}"
Margin="0,0,0,-5">
<Label.Triggers>
<DataTrigger
TargetType="Label"
Binding="{Binding Source={x:Reference PasswordEntry}, Path=Text, TargetNullValue=''}"
Value="">
<Setter
Property="IsVisible"
Value="False" />
</DataTrigger>
</Label.Triggers>
</Label>
<sharedGui:TogglePasswordEntry
Placeholder="{x:Static resources:AppResources.MarkingLoginPasswordPlaceholder}"
Text="{Binding Password}"
HidePassword="True"
AutomationId="password_text"
x:Name="PasswordEntry"
IsEnabled="{Binding IsLoggedOut}"/>
<sharedGui:TogglePasswordEntry
Placeholder="{x:Static resources:AppResources.MarkingLoginPasswordPlaceholder}"
Text="{Binding Password}"
HidePassword="True"
AutomationId="password_text"
x:Name="PasswordEntry"
IsEnabled="{Binding IsLoggedOut}"/>
<Label
Text="{x:Static resources:AppResources.MarkingLoginPasswordLabel}"
HorizontalOptions="End"
Margin="0,-10,0,5"
FontSize="Small">
<Label.Triggers>
<DataTrigger
TargetType="Label"
Binding="{Binding Source={x:Reference PasswordEntry}, Path=Text, TargetNullValue=''}"
Value="">
<Setter
Property="IsVisible"
Value="False" />
</DataTrigger>
</Label.Triggers>
</Label>
<Label
Text="{x:Static resources:AppResources.MarkingLoginPasswordLabel}"
HorizontalOptions="End"
Margin="0,-10,0,5"
FontSize="Small">
<Label.Triggers>
<DataTrigger
TargetType="Label"
Binding="{Binding Source={x:Reference PasswordEntry}, Path=Text, TargetNullValue=''}"
Value="">
<Setter
Property="IsVisible"
Value="False" />
</DataTrigger>
</Label.Triggers>
</Label>
<Button
Text="{x:Static resources:AppResources.ActionLoginLogin}"
AutomationId="login_button"
Command="{Binding OnLoginRequest}"
IsEnabled="{Binding IsLoginRequestAllowed}">
</Button>
<Button
Text="{x:Static resources:AppResources.ActionLoginLogin}"
AutomationId="login_button"
Command="{Binding OnLoginRequest}">
<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
Style="{StaticResource SecondaryButton}"
Text="{x:Static resources:AppResources.ActionLoginRegister}"
AutomationId="register_button"
Command="{Binding OnRegisterRequest}"
IsVisible="{Binding IsWebViewElementsVisible}">
</Button>
<Button
Style="{StaticResource SecondaryButton}"
Text="{x:Static resources:AppResources.ActionLoginRegister}"
AutomationId="register_button"
Command="{Binding OnRegisterRequest}"
IsVisible="{Binding IsWebViewElementsVisible}">
</Button>
<Label
IsVisible="{Binding IsRegisterTargetsInfoVisible}"
FormattedText="{Binding RegisterTargetsInfo}">
</Label>
<Label
IsVisible="{Binding IsRegisterTargetsInfoVisible}"
FormattedText="{Binding RegisterTargetsInfo}">
</Label>
<Label
Margin="0,10,0,0"
TextType="Html"
AutomationId="password_forgotten_button"
HorizontalOptions="Center"
TextColor="{DynamicResource primary-back-title-color}"
Text="{x:Static resources:AppResources.ActionLoginPasswordForgotten}">
<Label.GestureRecognizers>
<TapGestureRecognizer
Command="{Binding OnPasswordForgottonRequest}"/>
</Label.GestureRecognizers>
</Label>
<Button
AutomationId="password_forgotten_button"
Style="{StaticResource NoOutlineButtonWhite}"
Text="{x:Static resources:AppResources.ActionLoginPasswordForgotten}"
Command="{Binding OnPasswordForgottonRequest}"/>
</StackLayout>
</StackLayout>
</Frame>
</Frame>
</StackLayout>
</StackLayout>
<!--While process is running-->
<sharedGui:RunningProcessView
<!--While process is running-->
<sharedGui:RunningProcessView
IsVisible="{Binding IsIdle, Converter={StaticResource BoolInverterConverter}}"
Grid.Row="0"/>

View file

@ -121,7 +121,7 @@ namespace TINK.View.Login
#if USCSHARP9
public Task<IViewService.IUserFeedback> DisplayUserFeedbackPopup() => throw new NotSupportedException();
#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
}
}

View file

@ -121,7 +121,7 @@ namespace TINK.View.Map
#if USCSHARP9
public Task<IViewService.IUserFeedback> DisplayUserFeedbackPopup() => throw new NotSupportedException();
#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
#if USEFLYOUT

View file

@ -93,7 +93,7 @@ namespace TINK.View.MiniSurvey
/// <summary> Displays user feedback popup.</summary>
/// <param name="co2Saving"> Co2 saving information.</param>
/// <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
}
}

View file

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

View file

@ -181,7 +181,7 @@ namespace TINK.View.MyBikes
/// <summary> Displays user feedback popup.</summary>
/// <param name="co2Saving"> Co2 saving information.</param>
/// <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
}
}

View file

@ -150,7 +150,7 @@ namespace TINK.View.Settings
/// <summary> Displays user feedback popup.</summary>
/// <param name="co2Saving"> Co2 saving information.</param>
/// <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
#if USERFEEDBACKDLG_TRYOUT

View file

@ -77,7 +77,7 @@ namespace TINK.View.WhatsNew.Agb
#if USCSHARP9
public Task<IViewService.IUserFeedback> DisplayUserFeedbackPopup() => throw new NotSupportedException();
#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
}
}

View file

@ -80,7 +80,7 @@ namespace TINK.View.WhatsNew
#if USCSHARP9
public Task<IViewService.IUserFeedback> DisplayUserFeedbackPopup() => throw new NotSupportedException();
#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
/// <summary>

View file

@ -3,6 +3,7 @@
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
xmlns:conv="clr-namespace:TINK.View"
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"
x:Class="ShareeSharedGuiLib.View.Bike.RentalProcess.RentalProcess2StepsBar">
@ -89,15 +90,30 @@
</MultiTrigger>
</Frame.Triggers>
<StackLayout
Orientation="Horizontal"
HorizontalOptions="Center"
VerticalOptions="Center">
Orientation="Horizontal"
HorizontalOptions="Center"
VerticalOptions="Center">
<Label
Text="1"
TextColor="White"
FontAttributes="Bold"/>
Text="{x:Static resources:AppResources.MarkingRentalProcessCloseLockFirstStep}"
TextColor="White">
<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
IsVisible="False">
IsVisible="False">
<Image.Triggers>
<DataTrigger TargetType="Image" Binding="{Binding RentalProcess.StepIndex}" Value="1">
<Setter Property="IsVisible" Value="True" />
@ -228,9 +244,8 @@
HorizontalOptions="Center"
VerticalOptions="Center">
<Label
Text="2"
TextColor="White"
FontAttributes="Bold"/>
Text="{x:Static resources:AppResources.MarkingRentalProcessCloseLockSecondStep}"
TextColor="White"/>
<Image
IsVisible="False">
<Image.Triggers>

View file

@ -3,6 +3,7 @@
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
xmlns:conv="clr-namespace:TINK.View"
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"
x:Class="ShareeSharedGuiLib.View.Bike.RentalProcess.RentalProcess3StepsBar">
@ -95,15 +96,36 @@
</MultiTrigger>
</Frame.Triggers>
<StackLayout
Orientation="Horizontal"
HorizontalOptions="Center"
VerticalOptions="Center">
Orientation="Horizontal"
HorizontalOptions="Center"
VerticalOptions="Center">
<Label
Text="1"
TextColor="White"
FontAttributes="Bold"/>
Text="{x:Static resources:AppResources.MarkingRentalProcessEndRentalFirstStep}"
TextColor="White">
<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
IsVisible="False">
IsVisible="False">
<Image.Triggers>
<DataTrigger TargetType="Image" Binding="{Binding RentalProcess.StepIndex}" Value="1">
<Setter Property="IsVisible" Value="True" />
@ -253,15 +275,30 @@
</MultiTrigger>
</Frame.Triggers>
<StackLayout
Orientation="Horizontal"
HorizontalOptions="Center"
VerticalOptions="Center">
Orientation="Horizontal"
HorizontalOptions="Center"
VerticalOptions="Center">
<Label
Text="2"
TextColor="White"
FontAttributes="Bold"/>
Text="{x:Static resources:AppResources.MarkingRentalProcessEndRentalSecondStep}"
TextColor="White">
<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
IsVisible="False">
IsVisible="False">
<Image.Triggers>
<DataTrigger TargetType="Image" Binding="{Binding RentalProcess.StepIndex}" Value="2">
<Setter Property="IsVisible" Value="True" />
@ -394,15 +431,14 @@
</MultiTrigger>
</Frame.Triggers>
<StackLayout
Orientation="Horizontal"
HorizontalOptions="Center"
VerticalOptions="Center">
Orientation="Horizontal"
HorizontalOptions="Center"
VerticalOptions="Center">
<Label
Text="3"
TextColor="White"
FontAttributes="Bold"/>
Text="{x:Static resources:AppResources.MarkingRentalProcessEndRentalThirdStep}"
TextColor="White"/>
<Image
IsVisible="False">
IsVisible="False">
<Image.Triggers>
<DataTrigger TargetType="Image" Binding="{Binding RentalProcess.StepIndex}" Value="3">
<Setter Property="IsVisible" Value="True" />

View file

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

View file

@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android" android:installLocation="internalOnly" package="com.hauffware.sharee" android:versionName="3.0.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" />
<!-- Google Maps related permissions -->
<!-- Permission to receive remote notifications from Google Play Services -->

View file

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

View file

@ -150,7 +150,7 @@ namespace TINK.View.Account
#if USCSHARP9
public Task<IViewService.IUserFeedback> DisplayUserFeedbackPopup() => throw new NotSupportedException();
#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
}
}

View file

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

View file

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

View file

@ -248,9 +248,8 @@ namespace TINK.View.BikesAtStation
public async Task<IViewService.IUserFeedback> DisplayUserFeedbackPopup() => await Navigation.ShowPopupAsync<FeedbackPopup.Result>(new FeedbackPopup());
#else
/// <summary> Displays user feedback popup.</summary>
/// <param name="co2Saving"> Co2 saving information.</param>
/// <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
}
}

View file

@ -111,26 +111,40 @@
<!--- Phone to operator -->
<Button
x:Name="PhoneNumberButton"
IsVisible="{Binding PhoneNumberText, Converter={StaticResource StringNotNullOrEmpty_Converter}}"
Text="{Binding PhoneNumberText}"
IsEnabled="{Binding IsDoPhoncallAvailable}"
Command="{Binding OnPhoneRequest}"/>
x:Name="PhoneNumberButton"
IsVisible="{Binding PhoneNumberText, Converter={StaticResource StringNotNullOrEmpty_Converter}}"
Text="{Binding PhoneNumberText}"
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 -->
<Button
Style="{StaticResource SecondaryButton}"
x:Name="MailAddressButton"
IsVisible="{Binding MailAddressText, Converter={StaticResource StringNotNullOrEmpty_Converter}}"
Text="{Binding MailAddressText}"
IsEnabled="{Binding IsSendMailAvailable}"
Command="{Binding OnMailToOperatorRequest}"/>
x:Name="MailAddressButton"
IsVisible="{Binding MailAddressText, Converter={StaticResource StringNotNullOrEmpty_Converter}}"
Text="{Binding MailAddressText}"
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-->
<Button
Style="{StaticResource NoOutlineButton}"
Text="{x:Static resources:AppResources.ActionSelectAnotherStation}"
Command="{Binding OnSelectStationRequest}"/>
Style="{StaticResource NoOutlineButtonWhite}"
Text="{x:Static resources:AppResources.ActionSelectAnotherStation}"
Command="{Binding OnSelectStationRequest}"/>
</StackLayout>
@ -141,34 +155,34 @@
</Frame>
<!--- Contact app-developer -->
<StackLayout
<!--- Contact app-developer -->
<StackLayout
Grid.Row="1"
Padding="10"
Margin="0,0,0,10"
VerticalOptions="End"
Spacing="0">
<StackLayout.GestureRecognizers>
<TapGestureRecognizer
Command="{Binding OnMailAppRelatedRequest}"/>
</StackLayout.GestureRecognizers>
<BoxView
Margin="0,0,0,10"
HeightRequest="1"
WidthRequest="400"
HorizontalOptions="Center"
Color="DimGray"/>
Margin="0,0,0,10"
HeightRequest="1"
WidthRequest="400"
HorizontalOptions="Center"
Color="DimGray"/>
<Label
TextType="Html"
HorizontalOptions="Center"
TextColor="{DynamicResource primary-back-title-color}"
Text="{x:Static resources:AppResources.ActionSendDiagnosis}"
IsEnabled="{Binding IsSendMailAvailable}">
</Label>
<Button
x:Name="DiagnosticsButton"
Style="{StaticResource NoOutlineButtonBackgroundColor}"
Text="{x:Static resources:AppResources.ActionSendDiagnosis}"
Command="{Binding OnMailToOperatorRequest}">
<Button.Triggers>
<DataTrigger TargetType="Button" Binding="{Binding IsSendMailAvailable}" Value="False">
<Setter Property="TextColor" Value="DimGray" />
</DataTrigger>
</Button.Triggers>
</Button>
</StackLayout>
</StackLayout>
</Grid>

View file

@ -125,7 +125,7 @@ namespace TINK.View.Contact
#if USCSHARP9
public Task<IViewService.IUserFeedback> DisplayUserFeedbackPopup() => throw new NotSupportedException();
#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
#if USEFLYOUT

View file

@ -117,7 +117,7 @@ namespace TINK.View.Contact
#if USCSHARP9
public Task<IViewService.IUserFeedback> DisplayUserFeedbackPopup() => throw new NotSupportedException();
#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
#if USEFLYOUT

View file

@ -8,7 +8,7 @@
<TabbedPage.Resources>
<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>
</TabbedPage.Resources>

View file

@ -83,8 +83,15 @@
Grid.Row="1"
WidthRequest="100"
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>
@ -112,7 +119,8 @@
<!--Bike-->
<ListView
Grid.Row="1"
x:Name="FindBikeListView"
x:Name="FindBikeListView"
BackgroundColor="{DynamicResource background-color}"
SelectionMode="None"
SelectedItem="{Binding SelectedBike}"
IsEnabled="{Binding IsIdle}"

View file

@ -45,6 +45,7 @@ namespace TINK.View.FindBike
m_oViewModel = new FindBikePageViewModel(
model.ActiveUser,
model,
App.PermissionsService,
App.BluetoothService,
Device.RuntimePlatform,
@ -182,7 +183,7 @@ namespace TINK.View.FindBike
/// <summary> Displays user feedback popup.</summary>
/// <param name="co2Saving"> Co2 saving information.</param>
/// <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
}
}

View file

@ -123,7 +123,7 @@ namespace TINK.View.Info.BikeInfo
#if USCSHARP9
public Task<IViewService.IUserFeedback> DisplayUserFeedbackPopup() => throw new NotSupportedException();
#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
}
}

View file

@ -23,125 +23,125 @@
<!--Grid for content and Running process in same row-->
<Grid>
<StackLayout
Grid.Row="0">
<StackLayout
Grid.Row="0">
<Frame
Padding="10"
Margin="0,10,0,5"
HorizontalOptions="FillAndExpand"
BackgroundColor="White">
<Frame
Padding="10"
Margin="0,10,0,5"
HorizontalOptions="FillAndExpand"
BackgroundColor="White">
<StackLayout
x:Name="LoginPageView"
Padding="10">
<StackLayout
x:Name="LoginPageView"
Padding="10">
<Label
Text="{x:Static resources:AppResources.MarkingLoginEmailAddressLabel}"
Margin="0,0,0,-5">
<Label.Triggers>
<DataTrigger
TargetType="Label"
Binding="{Binding Source={x:Reference EMailEntry}, Path=Text, TargetNullValue=''}"
Value="">
<Setter
Property="IsVisible"
Value="False" />
</DataTrigger>
</Label.Triggers>
</Label>
<Label
Text="{x:Static resources:AppResources.MarkingLoginEmailAddressLabel}"
Margin="0,0,0,-5">
<Label.Triggers>
<DataTrigger
TargetType="Label"
Binding="{Binding Source={x:Reference EMailEntry}, Path=Text, TargetNullValue=''}"
Value="">
<Setter
Property="IsVisible"
Value="False" />
</DataTrigger>
</Label.Triggers>
</Label>
<Entry
Placeholder="{x:Static resources:AppResources.MarkingLoginEmailAddressPlaceholder}"
Keyboard="Email"
AutomationId="mail_address_text"
x:Name="EMailEntry"
Text="{Binding MailAddress}"
IsEnabled="{Binding IsLoggedOut}"/>
<Entry
Placeholder="{x:Static resources:AppResources.MarkingLoginEmailAddressPlaceholder}"
Keyboard="Email"
AutomationId="mail_address_text"
x:Name="EMailEntry"
Text="{Binding MailAddress}"
IsEnabled="{Binding IsLoggedOut}"/>
<Label
Text="{x:Static resources:AppResources.MarkingLoginPasswordPlaceholder}"
Margin="0,0,0,-5">
<Label.Triggers>
<DataTrigger
TargetType="Label"
Binding="{Binding Source={x:Reference PasswordEntry}, Path=Text, TargetNullValue=''}"
Value="">
<Setter
Property="IsVisible"
Value="False" />
</DataTrigger>
</Label.Triggers>
</Label>
<Label
Text="{x:Static resources:AppResources.MarkingLoginPasswordPlaceholder}"
Margin="0,0,0,-5">
<Label.Triggers>
<DataTrigger
TargetType="Label"
Binding="{Binding Source={x:Reference PasswordEntry}, Path=Text, TargetNullValue=''}"
Value="">
<Setter
Property="IsVisible"
Value="False" />
</DataTrigger>
</Label.Triggers>
</Label>
<sharedGui:TogglePasswordEntry
Placeholder="{x:Static resources:AppResources.MarkingLoginPasswordPlaceholder}"
Text="{Binding Password}"
HidePassword="True"
AutomationId="password_text"
x:Name="PasswordEntry"
IsEnabled="{Binding IsLoggedOut}"/>
<sharedGui:TogglePasswordEntry
Placeholder="{x:Static resources:AppResources.MarkingLoginPasswordPlaceholder}"
Text="{Binding Password}"
HidePassword="True"
AutomationId="password_text"
x:Name="PasswordEntry"
IsEnabled="{Binding IsLoggedOut}"/>
<Label
Text="{x:Static resources:AppResources.MarkingLoginPasswordLabel}"
HorizontalOptions="End"
Margin="0,-10,0,5"
FontSize="Small">
<Label.Triggers>
<DataTrigger
TargetType="Label"
Binding="{Binding Source={x:Reference PasswordEntry}, Path=Text, TargetNullValue=''}"
Value="">
<Setter
Property="IsVisible"
Value="False" />
</DataTrigger>
</Label.Triggers>
</Label>
<Label
Text="{x:Static resources:AppResources.MarkingLoginPasswordLabel}"
HorizontalOptions="End"
Margin="0,-10,0,5"
FontSize="Small">
<Label.Triggers>
<DataTrigger
TargetType="Label"
Binding="{Binding Source={x:Reference PasswordEntry}, Path=Text, TargetNullValue=''}"
Value="">
<Setter
Property="IsVisible"
Value="False" />
</DataTrigger>
</Label.Triggers>
</Label>
<Button
Text="{x:Static resources:AppResources.ActionLoginLogin}"
AutomationId="login_button"
Command="{Binding OnLoginRequest}"
IsEnabled="{Binding IsLoginRequestAllowed}">
<Button
Text="{x:Static resources:AppResources.ActionLoginLogin}"
AutomationId="login_button"
Command="{Binding OnLoginRequest}">
<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
Style="{StaticResource SecondaryButton}"
Text="{x:Static resources:AppResources.ActionLoginRegister}"
AutomationId="register_button"
Command="{Binding OnRegisterRequest}"
IsVisible="{Binding IsWebViewElementsVisible}">
<Button
Style="{StaticResource SecondaryButton}"
Text="{x:Static resources:AppResources.ActionLoginRegister}"
AutomationId="register_button"
Command="{Binding OnRegisterRequest}"
IsVisible="{Binding IsWebViewElementsVisible}">
</Button>
<Label
IsVisible="{Binding IsRegisterTargetsInfoVisible}"
FormattedText="{Binding RegisterTargetsInfo}">
</Label>
<Label
Margin="0,10,0,0"
TextType="Html"
AutomationId="password_forgotten_button"
HorizontalOptions="Center"
TextColor="{DynamicResource primary-back-title-color}"
Text="{x:Static resources:AppResources.ActionLoginPasswordForgotten}">
<Label.GestureRecognizers>
<TapGestureRecognizer
Command="{Binding OnPasswordForgottonRequest}"/>
</Label.GestureRecognizers>
</Label>
<Label
IsVisible="{Binding IsRegisterTargetsInfoVisible}"
FormattedText="{Binding RegisterTargetsInfo}">
</Label>
</StackLayout>
<Button
AutomationId="password_forgotten_button"
Style="{StaticResource NoOutlineButtonWhite}"
Text="{x:Static resources:AppResources.ActionLoginPasswordForgotten}"
Command="{Binding OnPasswordForgottonRequest}">
</Button>
</Frame>
</StackLayout>
</Frame>
</StackLayout>
</StackLayout>
<!--While process is running-->
<sharedGui:RunningProcessView
IsVisible="{Binding IsIdle, Converter={StaticResource BoolInverterConverter}}"
Grid.Row="0"/>
<!--While process is running-->
<sharedGui:RunningProcessView
IsVisible="{Binding IsIdle, Converter={StaticResource BoolInverterConverter}}"
Grid.Row="0"/>
</Grid>

View file

@ -121,7 +121,7 @@ namespace TINK.View.Login
#if USCSHARP9
public Task<IViewService.IUserFeedback> DisplayUserFeedbackPopup() => throw new NotSupportedException();
#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
}
}

View file

@ -121,7 +121,7 @@ namespace TINK.View.Map
#if USCSHARP9
public Task<IViewService.IUserFeedback> DisplayUserFeedbackPopup() => throw new NotSupportedException();
#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
#if USEFLYOUT

View file

@ -93,7 +93,7 @@ namespace TINK.View.MiniSurvey
/// <summary> Displays user feedback popup.</summary>
/// <param name="co2Saving"> Co2 saving information.</param>
/// <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
}
}

View file

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

View file

@ -181,7 +181,7 @@ namespace TINK.View.MyBikes
/// <summary> Displays user feedback popup.</summary>
/// <param name="co2Saving"> Co2 saving information.</param>
/// <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
}
}

View file

@ -150,7 +150,7 @@ namespace TINK.View.Settings
/// <summary> Displays user feedback popup.</summary>
/// <param name="co2Saving"> Co2 saving information.</param>
/// <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
#if USERFEEDBACKDLG_TRYOUT

View file

@ -77,7 +77,7 @@ namespace TINK.View.WhatsNew.Agb
#if USCSHARP9
public Task<IViewService.IUserFeedback> DisplayUserFeedbackPopup() => throw new NotSupportedException();
#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
}
}

View file

@ -80,7 +80,7 @@ namespace TINK.View.WhatsNew
#if USCSHARP9
public Task<IViewService.IUserFeedback> DisplayUserFeedbackPopup() => throw new NotSupportedException();
#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
/// <summary>

View file

@ -13,6 +13,12 @@ namespace TINK.Model
/// <summary> Holds info about co2 saving accomplished by using cargo bike. </summary>
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>
public string RentalCosts { get; set; }

View file

@ -13,8 +13,10 @@ namespace TINK.Model.Connector.Updater
{
var bookingFinished = new BookingFinishedModel
{
Co2Saving = response?.co2saving,
RentalCosts = "0 €",
Co2Saving = response?.bike_returned.co2saving,
RentalCosts = response?.bike_returned.total_price,
Duration = response?.bike_returned.real_clock,
Distance = response?.bike_returned.distance,
};
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>
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>
string RentalCosts { get; set; }
}

View file

@ -727,6 +727,11 @@ namespace TINK.Model
string.Format("{0} <br /> {1}", AppResources.ChangeLog_PackageUpdates, AppResources.ChangeLog_MinorBugFixes),
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>

View file

@ -214,7 +214,7 @@ namespace TINK.MultilingualResources {
}
/// <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>
public static string ActionSendDiagnosis {
get {
@ -268,7 +268,7 @@ namespace TINK.MultilingualResources {
}
/// <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>
public static string ActivityTextClosingLock {
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>
/// Looks up a localized string similar to Updated to latest lock firmware..
/// </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>
/// 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>
@ -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>
/// 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;
@ -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>
/// Looks up a localized string similar to Your session has expired. Please login new and try again..
/// </summary>
@ -1717,7 +1726,16 @@ namespace TINK.MultilingualResources {
}
/// <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>
public static string ErrorLoginInvalidAuthorization {
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>
/// Looks up a localized string similar to Login cookie must not be empty. {0}.
/// </summary>
@ -1974,7 +2001,17 @@ namespace TINK.MultilingualResources {
}
/// <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>
public static string ErrorSelectBikeNoBikeFound {
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>
/// Looks up a localized string similar to The requested bike was not found..
/// </summary>
@ -2535,7 +2581,9 @@ namespace TINK.MultilingualResources {
}
/// <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>
public static string MarkingRentalProcessCloseLockCheckLock {
get {
@ -2544,7 +2592,27 @@ namespace TINK.MultilingualResources {
}
/// <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>
public static string MarkingRentalProcessCloseLockObserve {
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>
/// Looks up a localized string similar to Lock closes..
/// </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>
/// Looks up a localized string similar to Give feedback on the bike..
/// </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>
/// Looks up a localized string similar to Wait for the end of rental confirmation!.
/// </summary>
@ -2787,7 +2909,7 @@ namespace TINK.MultilingualResources {
}
/// <summary>
/// Looks up a localized string similar to Circular drives only!.
/// Looks up a localized string similar to Circular rides only!.
/// </summary>
public static string MessageAaRideTypeInfoTitle {
get {
@ -3024,7 +3146,7 @@ namespace TINK.MultilingualResources {
}
/// <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>
public static string MessageBikeTypeInfoText {
get {
@ -3106,7 +3228,7 @@ namespace TINK.MultilingualResources {
}
/// <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>
public static string MessageLogoutGoodbye {
get {
@ -3169,7 +3291,54 @@ namespace TINK.MultilingualResources {
}
/// <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!.
/// </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>
</data>
<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 name="ChangeLog_3_0_203" xml:space="preserve">
<value>Aktualisierrt auf aktuelle Schloss-Firmware.</value>
@ -653,7 +653,8 @@ Fehlerbehebung: Supportmails können wieder verschickt werden.</value>
{0}</value>
</data>
<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 name="ErrorSelectBikeTitle" xml:space="preserve">
<value>Das angefragte Fahrrad wurde nicht gefunden.</value>
@ -789,7 +790,7 @@ Kleinere Fehlerbehebungen.
<value>Reservierung konnte nicht aufgehoben werden!</value>
</data>
<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 name="ActivityTextSubmittingFeedback" xml:space="preserve">
<value>Sende Rückmeldung...</value>
@ -1029,7 +1030,7 @@ Außerdem:&lt;br/&gt;
<value>Sie suchen ein </value>
</data>
<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 name="MessageBikeTypeInfoTitle" xml:space="preserve">
<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>
</data>
<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>
</data>
@ -1082,7 +1083,7 @@ Vielen Dank für Ihre Fahrt!</value>
<value>Andere Station auswählen</value>
</data>
<data name="ActionSendDiagnosis" xml:space="preserve">
<value>&lt;u&gt;Diagnosedatei übermitteln&lt;/u&gt;</value>
<value>Diagnosedatei übermitteln</value>
</data>
<data name="MarkingLastSelectedStation" xml:space="preserve">
<value>Zuletzt ausgewählte Station</value>
@ -1105,7 +1106,9 @@ Vielen Dank für Ihre Fahrt!</value>
<value>Miete ist beendet</value>
</data>
<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 name="MarkingRentalProcessEndRentalWait" xml:space="preserve">
<value>Warten Sie auf die Mietende-Bestätigung!</value>
@ -1138,7 +1141,9 @@ Vielen Dank für Ihre Fahrt!</value>
<value>Miete beenden</value>
</data>
<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 name="SupportmailSubjectAppmailWithStation" xml:space="preserve">
<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">
<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 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>

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>
</data>
<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 name="ChangeLog_3_0_203" xml:space="preserve">
<value>Updated to latest lock firmware.</value>
@ -776,7 +776,8 @@ Bugfix: Sending support mails works again. </value>
{0}</value>
</data>
<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 name="ErrorSelectBikeTitle" xml:space="preserve">
<value>The requested bike was not found.</value>
@ -923,7 +924,7 @@ Minor bugfixes.</value>
<value>Bike could not be reserved!</value>
</data>
<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 name="ActivityTextSubmittingFeedback" xml:space="preserve">
<value>Submitting feedback...</value>
@ -1125,7 +1126,7 @@ Also:&lt;br/&gt;
- Package updates</value>
</data>
<data name="MessageAaRideTypeInfoTitle" xml:space="preserve">
<value>Circular drives only!</value>
<value>Circular rides only!</value>
</data>
<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;
@ -1158,7 +1159,7 @@ Also:&lt;br/&gt;
<value>You search a </value>
</data>
<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 name="MessageBikeTypeInfoTitle" xml:space="preserve">
<value>Selected bike type</value>
@ -1176,7 +1177,9 @@ Also:&lt;br/&gt;
<value>Lock closes.</value>
</data>
<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 name="MarkingRentalProcessCloseLockStepUpload" xml:space="preserve">
<value>Status is being synchronized.</value>
@ -1203,7 +1206,7 @@ Also:&lt;br/&gt;
<value>Finished</value>
</data>
<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>
</data>
@ -1226,7 +1229,7 @@ Thank you for your ride!</value>
<value>Operator</value>
</data>
<data name="ActionSendDiagnosis" xml:space="preserve">
<value>&lt;u&gt;Transfer diagnostic file&lt;/u&gt;</value>
<value>Transfer diagnostic file</value>
</data>
<data name="ChangeLog_3_0_369_MK_SB" xml:space="preserve">
<value>We have re-designed the contact page:
@ -1264,7 +1267,9 @@ Thank you for your ride!</value>
<value>End rental</value>
</data>
<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 name="SupportmailSubjectAppmail" xml:space="preserve">
<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>
</data>
<data name="MessageLogoutGoodbye" xml:space="preserve">
<value>User {0} successfully logged in.</value>
<value>User {0} successfully logged out.</value>
</data>
<data name="MessageLogoutGoodbyeTitle" xml:space="preserve">
<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">
<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 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>

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>
</trans-unit>
<trans-unit id="ActivityTextClosingLock" translate="yes" xml:space="preserve">
<source>Stay with the bike until the lock is closed.</source>
<target state="translated">Bleiben Sie am Fahrrad stehen, bis das Schloss geschlossen ist.</target>
<source>The lock bolt moves through the spokes of the rear wheel.</source>
<target state="translated">Der Schlossbügel bewegt sich durch die Speichen des Hinterrads.</target>
</trans-unit>
<trans-unit id="ChangeLog_3_0_203" translate="yes" xml:space="preserve">
<source>Updated to latest lock firmware.</source>
@ -881,8 +881,10 @@ Fehlerbehebung: Supportmails können wieder verschickt werden.</target>
{0}</target>
</trans-unit>
<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>
<target state="translated">Das Fahrrad mit ID {0} ist möglicherweise bereits durch einen anderen Nutzer / eine andere Nutzerin reserviert oder defekt.</target>
<source>Bike with id {0} may already be reserved by another user or it may be defective.
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 id="ErrorSelectBikeTitle" translate="yes" xml:space="preserve">
<source>The requested bike was not found.</source>
@ -1070,8 +1072,8 @@ Kleinere Fehlerbehebungen.
<target state="translated">Reservierung konnte nicht aufgehoben werden!</target>
</trans-unit>
<trans-unit id="ErrorLoginInvalidAuthorization" translate="yes" xml:space="preserve">
<source>Can not login user {0}. Mail address unknown or password invalid.</source>
<target state="translated">Kann Benutzenden {0} nicht anmelden. Mailadresse unbekannt oder Passwort ungültig.</target>
<source>Incorrect email address or password. Correct your input and try again.</source>
<target state="translated">E-Mailadresse oder Passwort falsch. Korrigieren Sie Ihre Eingabe und versuchen Sie es erneut.</target>
</trans-unit>
<trans-unit id="ActivityTextSubmittingFeedback" translate="yes" xml:space="preserve">
<source>Submitting feedback...</source>
@ -1376,9 +1378,8 @@ Außerdem:&lt;br/&gt;
- Paketaktualisierungen</target>
</trans-unit>
<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>
<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 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;
@ -1419,8 +1420,8 @@ Außerdem:&lt;br/&gt;
<target state="translated">Sie suchen ein </target>
</trans-unit>
<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>
<target state="translated">Sie können nur die Fahrräder des ausgewählten Fahrradtyps suchen. Ändern Sie Ihre Auswahl auf der Seite "Radstandorte".</target>
<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 unter "Radstandorte".</target>
</trans-unit>
<trans-unit id="MessageBikeTypeInfoTitle" translate="yes" xml:space="preserve">
<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>
</trans-unit>
<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>
<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>
</trans-unit>
@ -1491,8 +1492,8 @@ Vielen Dank für Ihre Fahrt!</target>
<target state="translated">Andere Station auswählen</target>
</trans-unit>
<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>
<target state="translated"><bpt id="1">&lt;u&gt;</bpt>Diagnosedatei übermitteln<ept id="1">&lt;/u&gt;</ept></target>
<source>Transfer diagnostic file</source>
<target state="translated">Diagnosedatei übermitteln</target>
</trans-unit>
<trans-unit id="MarkingLastSelectedStation" translate="yes" xml:space="preserve">
<source>Last selected station</source>
@ -1523,8 +1524,12 @@ Vielen Dank für Ihre Fahrt!</target>
<target state="translated">Miete ist beendet</target>
</trans-unit>
<trans-unit id="MarkingRentalProcessCloseLockObserve" translate="yes" xml:space="preserve">
<source>Watch the lock as it is closing!</source>
<target state="translated">Beobachten Sie das Schloss beim Schließen!</target>
<source>Watch the lock as it is closing.
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 id="MarkingRentalProcessEndRentalWait" translate="yes" xml:space="preserve">
<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>
</trans-unit>
<trans-unit id="MarkingRentalProcessCloseLockCheckLock" translate="yes" xml:space="preserve">
<source>Check if the lock is really closed!</source>
<target state="translated">Schauen Sie, ob das Schloss wirklich zu ist!</target>
<source>Check if the lock is really closed.
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 id="SupportmailSubjectAppmailWithStation" translate="yes" xml:space="preserve">
<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>
</trans-unit>
<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>
</trans-unit>
<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>
<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 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>
</body>
</file>

View file

@ -31,6 +31,31 @@ namespace TINK.Repository.Response
/// </summary>
[DataMember]
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>

View file

@ -79,11 +79,9 @@ namespace TINK.View
/// <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="co2Saving"> Co2 saving information.</param>
/// <returns>User feedback.</returns>
Task<IUserFeedback> DisplayUserFeedbackPopup(
IBatteryMutable battery = null,
string co2Saving = null);
IBatteryMutable battery = null);
#if USCSHARP9
/// <summary>

View file

@ -7,6 +7,7 @@
<!--Main color-->
<Color x:Key="primary-back-title-color">#D21113</Color>
<Color x:Key="bright-primary-back-title-color">#D16D6E</Color>
<!--Secondary color-->
<Color x:Key="secondary-back-title-color">#FF0020</Color>
@ -27,76 +28,54 @@
<Color x:Key="process-step-failed">#FC870D</Color>
<!--Primary Button-->
<Style 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="TextColor" Value="White"/>
<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"
Property="IsEnabled"
Value="False">
<Setter Property="BorderColor" Value="LightGray"/>
<Setter Property="BackgroundColor" Value="LightGray"/>
</Trigger>
</Style.Triggers>
</Style>
<!--Secondary Button-->
<Style x:Key="SecondaryButton" 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="TextColor" Value="{DynamicResource Key=primary-back-title-color}"/>
<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"
Property="IsEnabled"
Value="False">
<Setter Property="BorderColor" Value="LightGray"/>
<Setter Property="BackgroundColor" Value="DimGray"/>
</Trigger>
</Style.Triggers>
</Style>
<!--Button without outline-->
<Style x:Key="NoOutlineButton" TargetType="Button">
<Style 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=primary-back-title-color}"/>
<Setter Property="BackgroundColor" Value="{DynamicResource Key=primary-back-title-color}"/>
<Setter Property="TextColor" Value="White"/>
</Style>
<!--Secondary Button-->
<Style x:Key="SecondaryButton" 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=primary-back-title-color}"/>
<Setter Property="BackgroundColor" Value="White"/>
<Setter Property="TextColor" Value="{DynamicResource Key=primary-back-title-color}"/>
</Style>
<!--Button without outline-->
<Style x:Key="NoOutlineButtonWhite" 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="White"/>
<Setter Property="BackgroundColor" Value="White"/>
<Setter Property="TextColor" Value="{DynamicResource Key=primary-back-title-color}"/>
</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"
Property="IsEnabled"
Value="True">
<Setter Property="BorderColor" Value="White"/>
<Setter Property="BackgroundColor" Value="White"/>
</Trigger>
<Trigger TargetType="Button"
Property="IsEnabled"
Value="False">
<Setter Property="BorderColor" Value="LightGray"/>
<Setter Property="BackgroundColor" Value="DimGray"/>
</Trigger>
</Style.Triggers>
</Style>
<!--Switch-->
@ -106,20 +85,20 @@
Property="IsToggled"
Value="True">
<Setter Property="ThumbColor" Value="{DynamicResource Key=primary-back-title-color}"/>
</Trigger>
<Setter Property="OnColor" Value="{DynamicResource Key=bright-primary-back-title-color}"/>
</Trigger>
<Trigger TargetType="Switch"
Property="IsToggled"
Value="False">
<Setter Property="ThumbColor" Value="DimGray"/>
</Trigger>
<Setter Property="ThumbColor" Value="DimGray"/>
</Trigger>
</Style.Triggers>
</Style>
<!--Slider-->
<Style TargetType="Slider">
<Setter Property="ThumbColor" Value="{DynamicResource Key=primary-back-title-color}"/>
<Setter Property="Background" Value="LightGray"/>
</Style>
<Setter Property="ThumbColor" Value="{DynamicResource Key=primary-back-title-color}"/>
</Style>
<!--Label-->
<Style TargetType="Label">
@ -138,7 +117,7 @@
<Setter Property="TextColor" Value="White"/>
<Setter Property="VerticalOptions" 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 x:Key="Image-Navbar" TargetType="Image">
<Setter Property="Source" Value="navbar_theme.png"/>

View file

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

View file

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

View file

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

View file

@ -6,7 +6,6 @@ using System.Windows.Input;
using Plugin.Messaging;
using Serilog;
using TINK.Model;
using TINK.Model.Stations;
using TINK.Model.Stations.StationNS;
using TINK.MultilingualResources;
using TINK.View;
@ -90,25 +89,23 @@ namespace TINK.ViewModel.Info
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(nameof(PhoneNumberText)));
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(nameof(ProviderNameText)));
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(nameof(IsOperatorInfoAvaliable)));
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(nameof(IsDoPhoncallAvailable)));
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(nameof(IsSendMailAvailable)));
await Task.CompletedTask;
}
/// <summary> Command object to bind mail button to view model. </summary>
public ICommand OnMailToOperatorRequest
=> new Command(
async () => await DoSendMailToOperator(),
() => IsSendMailAvailable);
=> new Command(async () => await DoSendMailToOperator());
/// <summary> Command object to bind mail app related button to model. </summary>
public ICommand OnMailAppRelatedRequest
=> new Command(
async () => await DoSendMailAppRelated(),
() => IsSendMailAvailable);
=> new Command(async () => await DoSendMailAppRelated());
/// <summary>True if sending mail is possible.</summary>
public bool IsSendMailAvailable =>
CrossMessaging.Current.EmailMessenger.CanSendEmail;
public bool IsSendMailAvailable
=> CrossMessaging.Current.EmailMessenger.CanSendEmail;
/// <summary>cTrue if doing a phone call is possible.</summary>
@ -134,91 +131,107 @@ namespace TINK.ViewModel.Info
/// <returns> Returns true if either mail was sent or if no mailer available.</returns>
public async Task DoSendMailToOperator()
{
try
if (!IsSendMailAvailable)
{
if (!IsSendMailAvailable)
{
// Nothing to do because email can not be sent.
return;
}
// Send operator related support mail to operator.
await Email.ComposeAsync(new EmailMessage
{
To = new List<string> { MailAddressText },
Cc = APPSUPPORTMAILADDRESS.ToUpper() != MailAddressText.ToUpper() // do not sent copy if same mail address
&& MailAddressText != "konrad@sharee.bike" // do not sent copy if Mein konrad
? new List<string> { APPSUPPORTMAILADDRESS } : new List<string>(),
Subject = string.Format(AppResources.SupportmailSubjectOperatormail, AppFlavorName, SelectedStation?.Id),
Body = TinkApp.ActiveUser.Mail != null ? $"{AppResources.SupportmailBodyText}\r\n\r\n\r\n\r\n{string.Format(AppResources.MarkingLoggedInStateInfoLoggedIn, TinkApp.ActiveUser.Mail)}" : $"{AppResources.SupportmailBodyText}\r\n\r\n\r\n\r\n{string.Format(AppResources.SupportmailBodyNotLoggedIn)}"
});
return;
}
catch (Exception exception)
{
Log.Error("An unexpected error occurred sending mail to operator. {@Exception}", exception);
await ViewService.DisplayAdvancedAlert(
AppResources.MessageWaring,
await ViewService.DisplayAlert(
String.Empty,
AppResources.ErrorSupportmailMailingFailed,
exception.Message,
AppResources.MessageAnswerOk);
return;
}
else
{
try
{
// Send operator related support mail to operator.
await Email.ComposeAsync(new EmailMessage
{
To = new List<string> { MailAddressText },
Cc = APPSUPPORTMAILADDRESS.ToUpper() != MailAddressText.ToUpper() // do not sent copy if same mail address
&& MailAddressText != "konrad@sharee.bike" // do not sent copy if Mein konrad
? new List<string> { APPSUPPORTMAILADDRESS } : new List<string>(),
Subject = string.Format(AppResources.SupportmailSubjectOperatormail, AppFlavorName, SelectedStation?.Id),
Body = TinkApp.ActiveUser.Mail != null ? $"{AppResources.SupportmailBodyText}\r\n\r\n\r\n\r\n{string.Format(AppResources.MarkingLoggedInStateInfoLoggedIn, TinkApp.ActiveUser.Mail)}" : $"{AppResources.SupportmailBodyText}\r\n\r\n\r\n\r\n{string.Format(AppResources.SupportmailBodyNotLoggedIn)}"
});
return;
}
catch (Exception exception)
{
Log.Error("An unexpected error occurred sending mail to operator. {@Exception}", exception);
await ViewService.DisplayAdvancedAlert(
AppResources.MessageWaring,
AppResources.ErrorSupportmailMailingFailed,
exception.Message,
AppResources.MessageAnswerOk);
return;
}
}
}
/// <summary> Request to send a app related mail. </summary>
public async Task DoSendMailAppRelated()
{
try
if (!IsSendMailAvailable)
{
// Ask for permission to append diagnostics.
await ViewService.DisplayAlert(
AppResources.QuestionSupportmailAttachmentTitle,
AppResources.QuestionSupportmailAttachment,
String.Empty,
AppResources.ErrorSupportmailMailingFailed,
AppResources.MessageAnswerOk);
var message = new EmailMessage
{
To = new List<string> { APPSUPPORTMAILADDRESS },
Subject = SelectedStation?.Id != null ? string.Format(AppResources.SupportmailSubjectAppmailWithStation, AppFlavorName, SelectedStation?.Id) : string.Format(AppResources.SupportmailSubjectAppmail, AppFlavorName),
Body = TinkApp.ActiveUser.Mail != null ? $"{AppResources.SupportmailBodyText}\r\n\r\n\r\n\r\n{string.Format(AppResources.MarkingLoggedInStateInfoLoggedIn, TinkApp.ActiveUser.Mail)}" : $"{AppResources.SupportmailBodyText}\r\n\r\n\r\n\r\n{string.Format(AppResources.SupportmailBodyNotLoggedIn)}"
};
// Send with attachment.
var logFileName = string.Empty;
return;
}
else
{
try
{
logFileName = CreateAttachment();
// Ask for permission to append diagnostics.
await ViewService.DisplayAlert(
AppResources.QuestionSupportmailAttachmentTitle,
AppResources.QuestionSupportmailAttachment,
AppResources.MessageAnswerOk);
var message = new EmailMessage
{
To = new List<string> { APPSUPPORTMAILADDRESS },
Subject = SelectedStation?.Id != null ? string.Format(AppResources.SupportmailSubjectAppmailWithStation, AppFlavorName, SelectedStation?.Id) : string.Format(AppResources.SupportmailSubjectAppmail, AppFlavorName),
Body = TinkApp.ActiveUser.Mail != null ? $"{AppResources.SupportmailBodyText}\r\n\r\n\r\n\r\n{string.Format(AppResources.MarkingLoggedInStateInfoLoggedIn, TinkApp.ActiveUser.Mail)}" : $"{AppResources.SupportmailBodyText}\r\n\r\n\r\n\r\n{string.Format(AppResources.SupportmailBodyNotLoggedIn)}"
};
// Send with attachment.
var logFileName = string.Empty;
try
{
logFileName = CreateAttachment();
}
catch (Exception exception)
{
await ViewService.DisplayAdvancedAlert(
AppResources.MessageWaring,
AppResources.ErrorSupportmailCreateAttachment,
exception.Message,
AppResources.MessageAnswerOk);
Log.ForContext<ContactPageViewModel>().Error("An error occurred creating attachment for app mail. {@Exception)", exception);
}
if (!string.IsNullOrEmpty(logFileName))
{
message.Attachments.Add(new Xamarin.Essentials.EmailAttachment(logFileName));
}
// Send a tink app related mail
await Email.ComposeAsync(message);
}
catch (Exception exception)
{
Log.ForContext<ContactPageViewModel>().Error("An unexpected error occurred sending mail. {@Exception}", exception);
await ViewService.DisplayAdvancedAlert(
AppResources.MessageWaring,
AppResources.ErrorSupportmailCreateAttachment,
AppResources.ErrorSupportmailMailingFailed,
exception.Message,
AppResources.MessageAnswerOk);
Log.ForContext<ContactPageViewModel>().Error("An error occurred creating attachment for app mail. {@Exception)", exception);
return;
}
if (!string.IsNullOrEmpty(logFileName))
{
message.Attachments.Add(new Xamarin.Essentials.EmailAttachment(logFileName));
}
// Send a tink app related mail
await Email.ComposeAsync(message);
}
catch (Exception exception)
{
Log.ForContext<ContactPageViewModel>().Error("An unexpected error occurred sending mail. {@Exception}", exception);
await ViewService.DisplayAdvancedAlert(
AppResources.MessageWaring,
AppResources.ErrorSupportmailMailingFailed,
exception.Message,
AppResources.MessageAnswerOk);
return;
}
}
@ -257,31 +270,37 @@ namespace TINK.ViewModel.Info
/// <summary> Command object to bind phone call button. </summary>
public ICommand OnPhoneRequest
=> new Command(
async () => await DoPhoneCall(),
() => IsDoPhoncallAvailable);
=> new Command(async () => await DoPhoneCall());
/// <summary> Request to do a phone call. </summary>
public async Task DoPhoneCall()
{
try
if (!IsDoPhoncallAvailable)
{
// Make Phone Call
if (IsDoPhoncallAvailable)
{
CrossMessaging.Current.PhoneDialer.MakePhoneCall(PhoneNumberText);
}
}
catch (Exception exception)
{
Log.Error("An unexpected error occurred doing a phone call. {@Exception}", exception);
await ViewService.DisplayAdvancedAlert(
AppResources.MessageWaring,
await ViewService.DisplayAlert(
String.Empty,
AppResources.ErrorSupportmailPhoningFailed,
exception.Message,
AppResources.MessageAnswerOk);
return;
}
else
{
try
{
// Make Phone Call
CrossMessaging.Current.PhoneDialer.MakePhoneCall(PhoneNumberText);
}
catch (Exception exception)
{
Log.Error("An unexpected error occurred doing a phone call. {@Exception}", exception);
await ViewService.DisplayAdvancedAlert(
AppResources.MessageWaring,
AppResources.ErrorSupportmailPhoningFailed,
exception.Message,
AppResources.MessageAnswerOk);
return;
}
}
}
/// <summary> Text providing the id of the selected station.</summary>

View file

@ -13,10 +13,8 @@ using TINK.Model.Bikes;
using TINK.Model.Bikes.BikeInfoNS.BikeNS;
using TINK.Model.Bikes.BikeInfoNS.BluetoothLock;
using TINK.Model.Connector;
using TINK.Model.Connector.Filter;
using TINK.Model.Device;
using TINK.Model.Services.CopriApi;
using TINK.Model.State;
using TINK.Model.Stations.StationNS;
using TINK.Model.User;
using TINK.MultilingualResources;
@ -29,7 +27,6 @@ using TINK.Settings;
using TINK.View;
using TINK.ViewModel.Bikes;
using TINK.ViewModel.Map;
using Xamarin.Essentials;
using Xamarin.Forms;
using Command = Xamarin.Forms.Command;
@ -77,7 +74,7 @@ namespace TINK.ViewModel.FindBike
public BikeCollection Bikes { get; set; }
/// <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>
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>
private IEnumerable<IStation> Stations { get; }
/// <summary> Reference on the tink app instance. </summary>
private ITinkApp TinkApp { get; }
/// <summary>
/// True if ListView of Bikes is refreshing after user pulled;
/// </summary>
@ -124,6 +124,7 @@ namespace TINK.ViewModel.FindBike
/// <param name="openUrlInBrowser">Delegate to open browser.</param>
public FindBikePageViewModel(
User user,
ITinkApp tinkApp,
ILocationPermission permissions,
IBluetoothLE bluetoothLE,
string runtimPlatform,
@ -145,6 +146,9 @@ namespace TINK.ViewModel.FindBike
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 () => {
IsRefreshing = false;
@ -215,99 +219,136 @@ namespace TINK.ViewModel.FindBike
}
/// <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>
public async Task SelectBike()
{
// Get List of bike to be able to connect to.
ActionText = AppResources.ActivityTextFindBikeLoadingBikes;
IsIdle = false;
IsConnected = IsConnectedDelegate();
Result<BikeCollection> bikes = null;
try
if (!IsSelectBikeEnabled)
{
bikes = await ConnectorFactory(IsConnected).Query.GetBikesAsync();
}
catch (Exception exception)
{
if (exception is WebConnectFailureException)
{
// Copri server is not reachable.
Log.ForContext<FindBikePageViewModel>().Information("Getting bikes failed (Copri server not reachable).");
await ViewService.DisplayAlert(
AppResources.ErrorSelectBikeTitle,
AppResources.ErrorNoWeb,
AppResources.MessageAnswerOk);
}
else
{
Log.ForContext<FindBikePageViewModel>().Error("Getting bikes failed. {Exception}", exception);
await ViewService.DisplayAlert(
AppResources.ErrorSelectBikeTitle,
exception.Message,
AppResources.MessageAnswerOk);
}
ActionText = string.Empty;
IsIdle = true;
await ViewService.DisplayAlert(
String.Empty,
AppResources.ErrorSelectBikeInputNotSufficent,
AppResources.MessageAnswerOk);
return;
}
finally
else
{
Exception = bikes?.Exception ?? null; // Update communication error from query for bikes occupied.
Bikes = bikes.Response;
}
try
{
var selectedBike = Bikes.FirstOrDefault(x => x.Id.Equals(BikeIdUserInput.Trim(), StringComparison.OrdinalIgnoreCase));
// Get List of bike to be able to connect to.
ActionText = AppResources.ActivityTextFindBikeLoadingBikes;
IsIdle = false;
if (selectedBike == null)
IsConnected = IsConnectedDelegate();
Result<BikeCollection> bikes = null;
try
{
await ViewService.DisplayAlert(
AppResources.MessageHintTitle,
string.Format(AppResources.ErrorSelectBikeNoBikeFound, BikeIdUserInput),
AppResources.MessageAnswerOk);
bikes = await ConnectorFactory(IsConnected).Query.GetBikesAsync();
}
catch (Exception exception)
{
if (exception is WebConnectFailureException)
{
// Copri server is not reachable.
Log.ForContext<FindBikePageViewModel>().Information("Getting bikes failed (Copri server not reachable).");
await ViewService.DisplayAlert(
AppResources.ErrorSelectBikeTitle,
AppResources.ErrorNoWeb,
AppResources.MessageAnswerOk);
}
else
{
Log.ForContext<FindBikePageViewModel>().Error("Getting bikes failed. {Exception}", exception);
await ViewService.DisplayAlert(
AppResources.ErrorSelectBikeTitle,
exception.Message,
AppResources.MessageAnswerOk);
}
ActionText = string.Empty;
IsIdle = true;
return;
}
var bikeCollection = new BikeCollection(new Dictionary<string, Model.Bikes.BikeInfoNS.BC.BikeInfo> { { selectedBike.Id, selectedBike } });
var lockIdList = bikeCollection
.GetLockIt()
.Cast<BikeInfo>()
.Select(x => x.LockInfo)
.ToList();
if (LockService is ILocksServiceFake serviceFake)
finally
{
serviceFake.UpdateSimulation(bikeCollection);
Exception = bikes?.Exception ?? null; // Update communication error from query for bikes occupied.
Bikes = bikes.Response;
}
// Check bluetooth and location permission and states
ActionText = AppResources.ActivityTextCheckBluetoothState;
if (bikeCollection.FirstOrDefault(x => x is BikeInfo btBike) != null
//&& RuntimePlatform == Device.Android
)
try
{
// Check location permission
var status = await PermissionsService.CheckStatusAsync();
if (status != Status.Granted)
{
if (RuntimePlatform == Device.Android)
{
var permissionResult = await PermissionsService.RequestAsync();
var selectedBike = Bikes.FirstOrDefault(x => x.Id.Equals(BikeIdUserInput.Trim(), StringComparison.OrdinalIgnoreCase));
if (permissionResult != Status.Granted)
if (selectedBike == null)
{
await ViewService.DisplayAlert(
AppResources.ErrorSelectBikeTitle,
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);
ActionText = string.Empty;
IsIdle = true;
return;
}
var bikeCollection = new BikeCollection(new Dictionary<string, Model.Bikes.BikeInfoNS.BC.BikeInfo> { { selectedBike.Id, selectedBike } });
var lockIdList = bikeCollection
.GetLockIt()
.Cast<BikeInfo>()
.Select(x => x.LockInfo)
.ToList();
if (LockService is ILocksServiceFake serviceFake)
{
serviceFake.UpdateSimulation(bikeCollection);
}
// Check bluetooth and location permission and states
ActionText = AppResources.ActivityTextCheckBluetoothState;
if (bikeCollection.FirstOrDefault(x => x is BikeInfo btBike) != null
//&& RuntimePlatform == Device.Android
)
{
// Check location permission
var status = await PermissionsService.CheckStatusAsync();
if (status != Status.Granted)
{
if (RuntimePlatform == Device.Android)
{
var permissionResult = await PermissionsService.RequestAsync();
if (permissionResult != Status.Granted)
{
var dialogResult = await ViewService.DisplayAlert(
AppResources.MessageHintTitle,
AppResources.MessageBikesManagementLocationPermissionOpenDialog,
AppResources.MessageAnswerYes,
AppResources.MessageAnswerNo);
if (!dialogResult)
{
// User decided not to give access to locations permissions.
BikeCollection.Update(bikeCollection, Stations);
await StartUpdateTask(() => UpdateTask());
ActionText = string.Empty;
IsIdle = true;
return;
}
// Open permissions dialog.
PermissionsService.OpenAppSettings();
}
}
else
{
var dialogResult = await ViewService.DisplayAlert(
AppResources.MessageHintTitle,
@ -331,102 +372,79 @@ namespace TINK.ViewModel.FindBike
PermissionsService.OpenAppSettings();
}
}
else
// Location state
if (GeolocationService.IsGeolcationEnabled == false)
{
var dialogResult = await ViewService.DisplayAlert(
AppResources.MessageHintTitle,
AppResources.MessageBikesManagementLocationPermissionOpenDialog,
AppResources.MessageAnswerYes,
AppResources.MessageAnswerNo);
await ViewService.DisplayAlert(
AppResources.MessageHintTitle,
AppResources.MessageBikesManagementLocationActivation,
AppResources.MessageAnswerOk);
if (!dialogResult)
{
// User decided not to give access to locations permissions.
BikeCollection.Update(bikeCollection, Stations);
BikeCollection.Update(bikeCollection, Stations);
await StartUpdateTask(() => UpdateTask());
await StartUpdateTask(() => UpdateTask());
ActionText = string.Empty;
IsIdle = true;
return;
}
ActionText = string.Empty;
IsIdle = true;
return;
}
// Open permissions dialog.
PermissionsService.OpenAppSettings();
// Bluetooth state
if (await BluetoothService.GetBluetoothState() != BluetoothState.On)
{
await ViewService.DisplayAlert(
AppResources.MessageHintTitle,
AppResources.MessageBikesManagementBluetoothActivation,
AppResources.MessageAnswerOk);
BikeCollection.Update(bikeCollection, Stations);
await StartUpdateTask(() => UpdateTask());
ActionText = string.Empty;
IsIdle = true;
return;
}
}
// Location state
if (GeolocationService.IsGeolcationEnabled == false)
// Connect to bluetooth devices.
ActionText = AppResources.ActivityTextSearchBikes;
IEnumerable<LockInfoTdo> locksInfoTdo;
try
{
await ViewService.DisplayAlert(
AppResources.MessageHintTitle,
AppResources.MessageBikesManagementLocationActivation,
AppResources.MessageAnswerOk);
BikeCollection.Update(bikeCollection, Stations);
await StartUpdateTask(() => UpdateTask());
ActionText = string.Empty;
IsIdle = true;
return;
locksInfoTdo = await LockService.GetLocksStateAsync(
lockIdList.Select(x => x.ToLockInfoTdo()).ToList(),
LockService.TimeOut.MultiConnect);
}
catch (Exception exception)
{
Log.ForContext<FindBikePageViewModel>().Error("Getting bluetooth state failed. {Exception}", exception);
locksInfoTdo = new List<LockInfoTdo>();
}
// Bluetooth state
if (await BluetoothService.GetBluetoothState() != BluetoothState.On)
{
await ViewService.DisplayAlert(
AppResources.MessageHintTitle,
AppResources.MessageBikesManagementBluetoothActivation,
AppResources.MessageAnswerOk);
var locksInfo = lockIdList.UpdateById(locksInfoTdo);
BikeCollection.Update(bikeCollection, Stations);
BikeCollection.Update(bikeCollection.UpdateLockInfo(locksInfo), Stations);
await StartUpdateTask(() => UpdateTask());
await StartUpdateTask(() => UpdateTask());
ActionText = string.Empty;
IsIdle = true;
return;
}
}
// Connect to bluetooth devices.
ActionText = AppResources.ActivityTextSearchBikes;
IEnumerable<LockInfoTdo> locksInfoTdo;
try
{
locksInfoTdo = await LockService.GetLocksStateAsync(
lockIdList.Select(x => x.ToLockInfoTdo()).ToList(),
LockService.TimeOut.MultiConnect);
ActionText = string.Empty;
IsIdle = true;
}
catch (Exception exception)
{
Log.ForContext<FindBikePageViewModel>().Error("Getting bluetooth state failed. {Exception}", exception);
locksInfoTdo = new List<LockInfoTdo>();
await ViewService.DisplayAlert(
AppResources.ErrorSelectBikeTitle,
exception.Message,
AppResources.MessageAnswerOk);
Log.ForContext<FindBikePageViewModel>().Error("Running command to select bike failed. {Exception}", exception);
ActionText = string.Empty;
IsIdle = true;
return;
}
var locksInfo = lockIdList.UpdateById(locksInfoTdo);
BikeCollection.Update(bikeCollection.UpdateLockInfo(locksInfo), Stations);
await StartUpdateTask(() => UpdateTask());
ActionText = string.Empty;
IsIdle = true;
}
catch (Exception exception)
{
await ViewService.DisplayAlert(
AppResources.ErrorSelectBikeTitle,
exception.Message,
AppResources.MessageAnswerOk);
Log.ForContext<FindBikePageViewModel>().Error("Running command to select bike failed. {Exception}", exception);
ActionText = string.Empty;
IsIdle = true;
return;
}
}

View file

@ -254,157 +254,178 @@ namespace TINK.ViewModel
public async Task Login()
#endif
{
IsIdle = false;
StatusInfoText = AppResources.ActivityTextOneMomentPlease;
IAccount account = new EmptyAccount();
try
if (!IsLoginRequestAllowed)
{
Log.ForContext<LoginPageViewModel>().Information("User taped login button.");
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;
StatusInfoText = AppResources.ActivityTextOneMomentPlease;
IAccount account = new EmptyAccount();
try
{
Log.ForContext<LoginPageViewModel>().Information("User taped login button.");
try
{
TinkApp.ActiveUser.CheckIsPasswordValid(MailAddress, Password);
// Do login.
account = await TinkApp.GetConnector(CrossConnectivity.Current.IsConnected).Command.DoLogin(MailAddress, Password, TinkApp.ActiveUser.DeviceId);
await TinkApp.ActiveUser.Login(account);
// Update map page filter because user might be of both groups TINK an Konrad.
TinkApp.GroupFilterMapPage =
GroupFilterMapPageHelper.CreateUpdated(
TinkApp.GroupFilterMapPage,
TinkApp.ActiveUser.DoFilter(TinkApp.FilterGroupSetting.DoFilter()));
// Update settings page filter because user might be of both groups TINK an Konrad.
TinkApp.FilterGroupSetting.DoFilter(TinkApp.ActiveUser.Group);
// Persist new settings.
TinkApp.Save();
TinkApp.UpdateConnector();
}
catch (InvalidAuthorizationResponseException l_oException)
{
// Copri response is invalid.
Log.ForContext<LoginPageViewModel>().Error("Login failed (invalid. auth. response). {@l_oException}.", l_oException);
await m_oViewService.DisplayAlert(
AppResources.ErrorLoginTitle,
AppResources.ErrorLoginInvalidAuthorization,
AppResources.MessageAnswerOk);
IsIdle = true;
StatusInfoText = string.Empty;
return;
}
catch (UnsupportedCopriVersionDetectedException)
{
await m_oViewService.DisplayAlert(
AppResources.ErrorLoginTitle,
string.Format(
AppResources.MessageAppVersionIsOutdated,
TinkApp.Flavor.GetDisplayName()),
AppResources.MessageAnswerOk);
IsIdle = true;
StatusInfoText = string.Empty;
return;
}
catch (Exception l_oException)
{
// Copri server is not reachable.
if (l_oException is WebConnectFailureException)
{
Log.ForContext<LoginPageViewModel>().Information("Login failed (web communication exception). {@l_oException}.", l_oException);
await m_oViewService.DisplayAlert(
AppResources.ErrorNoConnectionTitle,
AppResources.ErrorNoWeb,
AppResources.MessageAnswerOk);
}
else if (l_oException is UsernamePasswordInvalidException)
{
// Cookie is empty.
Log.ForContext<LoginPageViewModel>().Error("Login failed (empty cookie). {@l_oException}.", l_oException);
await m_oViewService.DisplayAlert(
AppResources.ErrorLoginTitle,
string.Format(AppResources.ErrorLoginNoCookie, l_oException.Message),
AppResources.MessageAnswerOk);
}
else
{
Log.ForContext<LoginPageViewModel>().Error("Login failed. {@l_oException}.", l_oException);
await m_oViewService.DisplayAlert(
AppResources.ErrorLoginTitle,
l_oException.Message,
AppResources.MessageAnswerOk);
}
IsIdle = true;
StatusInfoText = string.Empty;
return;
}
// Display information that login succeeded.
Log.ForContext<LoginPageViewModel>().Information("Login succeeded. {@tinkApp.ActiveUser}.", TinkApp.ActiveUser);
var title = TinkApp.ActiveUser.Group.Intersect(new List<string> { Model.Connector.FilterHelper.CARGOBIKE, Model.Connector.FilterHelper.CITYBIKE }).Any()
? string.Format(AppResources.MessageLoginWelcomeTitleGroup, TinkApp.ActiveUser.GetUserGroupDisplayName())
: string.Format(AppResources.MessageLoginWelcomeTitle);
await m_oViewService.DisplayAlert(
title,
string.Format(AppResources.MessageLoginWelcome, TinkApp.ActiveUser.Mail),
AppResources.MessageAnswerOk);
}
catch (Exception p_oException)
{
Log.ForContext<LoginPageViewModel>().Error("An unexpected error occurred displaying log out page. {@Exception}", p_oException);
IsIdle = true;
StatusInfoText = string.Empty;
return;
}
try
{
TinkApp.ActiveUser.CheckIsPasswordValid(MailAddress, Password);
// Do login.
account = await TinkApp.GetConnector(CrossConnectivity.Current.IsConnected).Command.DoLogin(MailAddress, Password, TinkApp.ActiveUser.DeviceId);
await TinkApp.ActiveUser.Login(account);
// Update map page filter because user might be of both groups TINK an Konrad.
TinkApp.GroupFilterMapPage =
GroupFilterMapPageHelper.CreateUpdated(
TinkApp.GroupFilterMapPage,
TinkApp.ActiveUser.DoFilter(TinkApp.FilterGroupSetting.DoFilter()));
// Update settings page filter because user might be of both groups TINK an Konrad.
TinkApp.FilterGroupSetting.DoFilter(TinkApp.ActiveUser.Group);
// Persist new settings.
TinkApp.Save();
TinkApp.UpdateConnector();
}
catch (InvalidAuthorizationResponseException l_oException)
{
// Copri response is invalid.
Log.ForContext<LoginPageViewModel>().Error("Login failed (invalid. auth. response). {@l_oException}.", l_oException);
await m_oViewService.DisplayAlert(
AppResources.ErrorLoginTitle,
l_oException.Message,
AppResources.MessageAnswerOk);
IsIdle = true;
StatusInfoText = string.Empty;
return;
}
catch (UnsupportedCopriVersionDetectedException)
{
await m_oViewService.DisplayAlert(
AppResources.ErrorLoginTitle,
string.Format(
AppResources.MessageAppVersionIsOutdated,
TinkApp.Flavor.GetDisplayName()),
AppResources.MessageAnswerOk);
IsIdle = true;
StatusInfoText = string.Empty;
return;
}
catch (Exception l_oException)
{
// Copri server is not reachable.
if (l_oException is WebConnectFailureException)
if (!TinkApp.ActiveUser.Group.Contains(Model.Connector.FilterHelper.CARGOBIKE))
{
Log.ForContext<LoginPageViewModel>().Information("Login failed (web communication exception). {@l_oException}.", l_oException);
await m_oViewService.DisplayAlert(
AppResources.ErrorNoConnectionTitle,
AppResources.ErrorNoWeb,
AppResources.MessageAnswerOk);
}
else if (l_oException is UsernamePasswordInvalidException)
{
// Cookie is empty.
Log.ForContext<LoginPageViewModel>().Error("Login failed (empty cookie). {@l_oException}.", l_oException);
await m_oViewService.DisplayAlert(
AppResources.ErrorLoginTitle,
string.Format(AppResources.ErrorLoginNoCookie, l_oException.Message),
"OK");
}
else
{
Log.ForContext<LoginPageViewModel>().Error("Login failed. {@l_oException}.", l_oException);
await m_oViewService.DisplayAlert(
AppResources.ErrorLoginTitle,
l_oException.Message,
AppResources.MessageAnswerOk);
}
IsIdle = true;
StatusInfoText = string.Empty;
return;
}
// Display information that login succeeded.
Log.ForContext<LoginPageViewModel>().Information("Login succeeded. {@tinkApp.ActiveUser}.", TinkApp.ActiveUser);
var title = TinkApp.ActiveUser.Group.Intersect(new List<string> { Model.Connector.FilterHelper.CARGOBIKE, Model.Connector.FilterHelper.CITYBIKE }).Any()
? string.Format(AppResources.MessageLoginWelcomeTitleGroup, TinkApp.ActiveUser.GetUserGroupDisplayName())
: string.Format(AppResources.MessageLoginWelcomeTitle);
await m_oViewService.DisplayAlert(
title,
string.Format(AppResources.MessageLoginWelcome, TinkApp.ActiveUser.Mail),
AppResources.MessageAnswerOk);
}
catch (Exception p_oException)
{
Log.ForContext<LoginPageViewModel>().Error("An unexpected error occurred displaying log out page. {@Exception}", p_oException);
IsIdle = true;
StatusInfoText = string.Empty;
return;
}
try
{
if (!TinkApp.ActiveUser.Group.Contains(Model.Connector.FilterHelper.CARGOBIKE))
{
// No need to show "Anleitung TINK Räder" because user can not use tink.
// No need to show "Anleitung TINK Räder" because user can not use tink.
#if USEFLYOUT
m_oViewService.ShowPage(account.IsAgbAcknowledged ? ViewTypes.MapPage : ViewTypes.ManageAccountPage);
#else
await m_oViewService.ShowPage("//MapPage");
#endif
IsIdle = true;
StatusInfoText = string.Empty;
return;
}
// Switch to map page
#if USEFLYOUT
m_oViewService.ShowPage(ViewTypes.BikeInfoCarouselPage, AppResources.MarkingLoginInstructions);
#else
await m_oViewService.ShowPage("//MapPage");
#endif
}
catch (Exception p_oException)
{
Log.ForContext<LoginPageViewModel>().Error("Ein unerwarteter Fehler ist auf der Seite Anleitung TINK Räder (nach Anmeldeseite) aufgetreten. {@Exception}", p_oException);
IsIdle = true;
StatusInfoText = string.Empty;
return;
}
// Switch to map page
#if USEFLYOUT
m_oViewService.ShowPage(ViewTypes.BikeInfoCarouselPage, AppResources.MarkingLoginInstructions);
#else
await m_oViewService.ShowPage("//MapPage");
#endif
}
catch (Exception p_oException)
{
Log.ForContext<LoginPageViewModel>().Error("Ein unerwarteter Fehler ist auf der Seite Anleitung TINK Räder (nach Anmeldeseite) aufgetreten. {@Exception}", p_oException);
IsIdle = true;
StatusInfoText = string.Empty;
return;
}
#if BACKSTYLE
// Navigate back to map page.
await m_oNavigation.PopToRootAsync();
#endif
IsIdle = true;
StatusInfoText = string.Empty;
IsIdle = true;
StatusInfoText = string.Empty;
}
}
/// <summary> Holds whether TINK/ Copri info is shown.</summary>

View file

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

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.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...";
pollingManager.StartAsync(); // polling must be restarted again
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.ActionText = "One moment please...";
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;
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...";
@ -230,7 +230,7 @@ namespace TestTINKLib.Fixtures.ObjectTests.ViewModel.Bikes.Bike.BluetoothLock.Re
bikesViewModel.Received(1).IsIdle = false; // GUI must be locked
bikesViewModel.ActionText = "One moment please...";
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;
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...";
@ -294,7 +294,7 @@ namespace TestTINKLib.Fixtures.ObjectTests.ViewModel.Bikes.Bike.BluetoothLock.Re
bikesViewModel.Received(1).IsIdle = false; // GUI must be locked
bikesViewModel.ActionText = "One moment please...";
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;
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...";
@ -365,7 +365,7 @@ namespace TestTINKLib.Fixtures.ObjectTests.ViewModel.Bikes.Bike.BluetoothLock.Re
bikesViewModel.Received(1).IsIdle = false; // GUI must be locked
bikesViewModel.ActionText = "One moment please...";
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
locks.Received()[0].CloseAsync(); // Lock must be closed
#endif
@ -444,7 +444,7 @@ namespace TestTINKLib.Fixtures.ObjectTests.ViewModel.Bikes.Bike.BluetoothLock.Re
bikesViewModel.Received(1).IsIdle = false; // GUI must be locked
bikesViewModel.ActionText = "One moment please...";
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
locks.Received()[0].CloseAsync(); // Lock must be closed
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.ActionText = "One moment please...";
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
locks.Received()[0].CloseAsync(); // Lock must be closed
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.ActionText = "One moment please...";
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
locks.Received()[0].CloseAsync(); // Lock must be closed
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.ActionText = "One moment please...";
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 = "One moment please...";
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.ActionText = "One moment please...";
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;
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...";
@ -922,7 +922,7 @@ namespace TestShareeLib.ViewModel.Bikes.Bike.BluetoothLock.RequestHandler
bikesViewModel.Received(1).IsIdle = false; // GUI must be locked
bikesViewModel.ActionText = "One moment please...";
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;
viewService.DisplayAlert(
"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.ActionText = "One moment please...";
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 = "Internet must be available for updating lock status. Please establish an Internet connection!";
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.ActionText = "One moment please...";
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 = "Connection error on updating locking status.";
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.ActionText = "One moment please...";
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 = "Status error on updating lock state.";
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.ActionText = "One moment please...";
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();
bikesViewModel.ActionText = "Disconnecting lock...";
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.ActionText = "One moment please...";
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();
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");
@ -223,7 +223,7 @@ namespace TestTINKLib.Fixtures.ObjectTests.ViewModel.Bikes.Bike.BluetoothLock.Re
bikesViewModel.Received(1).IsIdle = false; // GUI must be locked
bikesViewModel.ActionText = "One moment please...";
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();
bikesViewModel.ActionText = string.Empty;
viewService.DisplayAdvancedAlert(
@ -362,7 +362,7 @@ namespace TestTINKLib.Fixtures.ObjectTests.ViewModel.Bikes.Bike.BluetoothLock.Re
"Bike could not be rented!",
"A stable Internet connection is required. Connect to WIFI or to mobile network and activate mobile data. Try again.",
"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();
bikesViewModel.ActionText = "Disconnecting lock...";
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);
bikesViewModel.ActionText = string.Empty;
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();
bikesViewModel.ActionText = "Disconnecting lock...";
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!",
"A stable Internet connection is required. Connect to WIFI or to mobile network and activate mobile data. Try again.",
"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();
bikesViewModel.ActionText = "Updating...";
pollingManager.StartAsync(); // polling must be restarted again
@ -232,7 +232,7 @@ namespace TestTINKLib.Fixtures.ObjectTests.ViewModel.Bikes.Bike.BluetoothLock.Re
"Exception message.",
"Please try again.",
"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();
bikesViewModel.ActionText = "Updating...";
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.ActionText = "One moment please...";
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();
bikesViewModel.ActionText = "Canceling reservation...";
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.ActionText = "One moment please...";
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();
bikesViewModel.ActionText = string.Empty;
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.ActionText = "One moment please...";
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();
bikesViewModel.ActionText = string.Empty;
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.ActionText = "One moment please...";
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();
bikesViewModel.ActionText = "Canceling reservation...";
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.ActionText = "One moment please...";
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();
bikesViewModel.ActionText = "Canceling reservation...";
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.ActionText = "One moment please...";
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();
bikesViewModel.ActionText = "Canceling reservation...";
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.ActionText = "One moment please...";
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 = "One moment please...";
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.ActionText = "One moment please...";
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;
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...";
@ -808,7 +808,7 @@ namespace TestShareeLib.ViewModel.Bikes.Bike.BluetoothLock.RequestHandler
bikesViewModel.Received(1).IsIdle = false; // GUI must be locked
bikesViewModel.ActionText = "One moment please...";
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;
viewService.DisplayAlert(
"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.ActionText = "One moment please...";
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 = "Internet must be available for updating lock status. Please establish an Internet connection!";
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.ActionText = "One moment please...";
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 = "Connection error on updating locking status.";
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.ActionText = "One moment please...";
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 = "Status error on updating lock state.";
bikesViewModel.ActionText = "One moment please...";

View file

@ -74,7 +74,7 @@ namespace TestShareeLib.ViewModel.Bikes.Bike.BluetoothLock
//Step.StartingQueryingLocation
bikesViewModel.ActionText = "Start query location...";
//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
bikesViewModel.ActionText = "Query location...";
//Step.UpdateLockingState
@ -166,7 +166,7 @@ namespace TestShareeLib.ViewModel.Bikes.Bike.BluetoothLock
//Step.StartingQueryingLocation
bikesViewModel.ActionText = "Start query location...";
//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
bikesViewModel.ActionText = "Query location...";
//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.ActionText = "One moment please...";
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...";
connector.Command.DoSubmitFeedback(Arg.Any<TINK.Model.Connector.IUserFeedback>(), Arg.Any<Uri>()); // Booking must be performed
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.ActionText = "One moment please...";
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...";
connector.Command.DoSubmitFeedback(Arg.Any<TINK.Model.Connector.IUserFeedback>(), Arg.Any<Uri>()); // Booking must be performed
bikesViewModel.ActionText = "Updating...";
@ -176,7 +176,7 @@ namespace TestShareeLib.ViewModel.Bikes.Bike.CopriLock.RequestHandler
bikesViewModel.Received(1).IsIdle = false; // GUI must be locked
bikesViewModel.ActionText = "One moment please...";
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...";
connector.Command.DoSubmitFeedback(Arg.Any<TINK.Model.Connector.IUserFeedback>(), Arg.Any<Uri>()); // Booking must be performed
viewService.PushModalAsync(ViewTypes.MiniSurvey);