Compare commits

...

3 commits

Author SHA1 Message Date
Anja f5cf9bb22f Version 3.0.369 2023-07-19 10:10:36 +02:00
Anja 1a58bf58d3 Version 3.0.368 2023-07-04 11:06:38 +02:00
Anja 24cdfbb0ca Version 3.0.366 2023-06-06 12:05:48 +02:00
183 changed files with 5091 additions and 3946 deletions

View file

@ -12,3 +12,4 @@ sharee
tink tink
ui ui
xdoc xdoc
xml

View file

@ -16,7 +16,7 @@
<AndroidResgenFile>Resources\Resource.Designer.cs</AndroidResgenFile> <AndroidResgenFile>Resources\Resource.Designer.cs</AndroidResgenFile>
<GenerateSerializationAssemblies>Off</GenerateSerializationAssemblies> <GenerateSerializationAssemblies>Off</GenerateSerializationAssemblies>
<AndroidManifest>Properties\AndroidManifest.xml</AndroidManifest> <AndroidManifest>Properties\AndroidManifest.xml</AndroidManifest>
<TargetFrameworkVersion>v12.0</TargetFrameworkVersion> <TargetFrameworkVersion>v13.0</TargetFrameworkVersion>
<AndroidStoreUncompressedFileExtensions /> <AndroidStoreUncompressedFileExtensions />
<MandroidI18n /> <MandroidI18n />
<JavaMaximumHeapSize>2G</JavaMaximumHeapSize> <JavaMaximumHeapSize>2G</JavaMaximumHeapSize>
@ -77,7 +77,7 @@
</PropertyGroup> </PropertyGroup>
<ItemGroup> <ItemGroup>
<PackageReference Include="Microsoft.CSharp" Version="4.7.0" /> <PackageReference Include="Microsoft.CSharp" Version="4.7.0" />
<PackageReference Include="Microsoft.NETCore.Platforms" Version="7.0.1" /> <PackageReference Include="Microsoft.NETCore.Platforms" Version="7.0.3" />
<PackageReference Include="Microsoft.Win32.Primitives" Version="4.3.0" /> <PackageReference Include="Microsoft.Win32.Primitives" Version="4.3.0" />
<PackageReference Include="MonkeyCache"> <PackageReference Include="MonkeyCache">
<Version>1.6.3</Version> <Version>1.6.3</Version>
@ -97,7 +97,7 @@
<Version>6.3.0.19</Version> <Version>6.3.0.19</Version>
</PackageReference> </PackageReference>
<PackageReference Include="Serilog"> <PackageReference Include="Serilog">
<Version>2.12.0</Version> <Version>3.0.1</Version>
</PackageReference> </PackageReference>
<PackageReference Include="Serilog.Sinks.File" Version="5.0.0" /> <PackageReference Include="Serilog.Sinks.File" Version="5.0.0" />
<PackageReference Include="Serilog.Sinks.Xamarin" Version="1.0.0" /> <PackageReference Include="Serilog.Sinks.Xamarin" Version="1.0.0" />
@ -176,24 +176,24 @@
<PackageReference Include="Xamarin.Android.Support.v7.RecyclerView" Version="28.0.0.3" /> <PackageReference Include="Xamarin.Android.Support.v7.RecyclerView" Version="28.0.0.3" />
<PackageReference Include="Xamarin.Android.Support.Vector.Drawable" Version="28.0.0.3" /> <PackageReference Include="Xamarin.Android.Support.Vector.Drawable" Version="28.0.0.3" />
<PackageReference Include="Xamarin.AndroidX.Core"> <PackageReference Include="Xamarin.AndroidX.Core">
<Version>1.9.0.2</Version> <Version>1.10.1.1</Version>
</PackageReference> </PackageReference>
<PackageReference Include="Xamarin.AndroidX.MediaRouter"> <PackageReference Include="Xamarin.AndroidX.MediaRouter">
<Version>1.3.1.2</Version> <Version>1.4.0.1</Version>
</PackageReference> </PackageReference>
<PackageReference Include="Xamarin.AndroidX.Palette"> <PackageReference Include="Xamarin.AndroidX.Palette">
<Version>1.0.0.16</Version> <Version>1.0.0.18</Version>
</PackageReference> </PackageReference>
<PackageReference Include="Xamarin.AndroidX.RecyclerView"> <PackageReference Include="Xamarin.AndroidX.RecyclerView">
<Version>1.3.0</Version> <Version>1.3.0.2</Version>
</PackageReference> </PackageReference>
<PackageReference Include="Xamarin.Auth" Version="1.7.0" /> <PackageReference Include="Xamarin.Auth" Version="1.7.0" />
<PackageReference Include="Xamarin.Build.Download" Version="0.11.4" /> <PackageReference Include="Xamarin.Build.Download" Version="0.11.4" />
<PackageReference Include="Xamarin.CommunityToolkit"> <PackageReference Include="Xamarin.CommunityToolkit">
<Version>2.0.5</Version> <Version>2.0.6</Version>
</PackageReference> </PackageReference>
<PackageReference Include="Xamarin.Essentials"> <PackageReference Include="Xamarin.Essentials">
<Version>1.7.5</Version> <Version>1.7.7</Version>
</PackageReference> </PackageReference>
<PackageReference Include="Xamarin.Forms" Version="5.0.0.2578" /> <PackageReference Include="Xamarin.Forms" Version="5.0.0.2578" />
<PackageReference Include="Xamarin.Forms.AppLinks"> <PackageReference Include="Xamarin.Forms.AppLinks">
@ -203,10 +203,10 @@
<Version>5.0.0</Version> <Version>5.0.0</Version>
</PackageReference> </PackageReference>
<PackageReference Include="Xamarin.Forms.GoogleMaps.Bindings" Version="3.0.0" /> <PackageReference Include="Xamarin.Forms.GoogleMaps.Bindings" Version="3.0.0" />
<PackageReference Include="Xamarin.GooglePlayServices.Base" Version="118.1.0.1" /> <PackageReference Include="Xamarin.GooglePlayServices.Base" Version="118.2.0.1" />
<PackageReference Include="Xamarin.GooglePlayServices.Basement" Version="118.1.0.2" /> <PackageReference Include="Xamarin.GooglePlayServices.Basement" Version="118.2.0.1" />
<PackageReference Include="Xamarin.GooglePlayServices.Maps" Version="118.1.0.1" /> <PackageReference Include="Xamarin.GooglePlayServices.Maps" Version="118.1.0.2" />
<PackageReference Include="Xamarin.GooglePlayServices.Tasks" Version="118.0.2.1" /> <PackageReference Include="Xamarin.GooglePlayServices.Tasks" Version="118.0.2.2" />
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<Reference Include="Mono.Android" /> <Reference Include="Mono.Android" />

View file

@ -1,6 +1,6 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android" android:installLocation="internalOnly" package="com.TeilRad.LastenradBayern" android:versionName="3.0.365" android:versionCode="365"> <manifest xmlns:android="http://schemas.android.com/apk/res/android" android:installLocation="internalOnly" package="com.TeilRad.LastenradBayern" android:versionName="3.0.369" android:versionCode="369">
<uses-sdk android:minSdkVersion="19" android:targetSdkVersion="31" /> <uses-sdk android:minSdkVersion="19" android:targetSdkVersion="33" />
<!-- Google Maps related permissions --> <!-- Google Maps related permissions -->
<!-- Permission to receive remote notifications from Google Play Services --> <!-- Permission to receive remote notifications from Google Play Services -->
<!-- Notice here that we have the package name of our application as a prefix on the permissions. --> <!-- Notice here that we have the package name of our application as a prefix on the permissions. -->
@ -9,14 +9,11 @@
<!-- Access Google based webservices --> <!-- Access Google based webservices -->
<!-- External storage for caching. --> <!-- External storage for caching. -->
<!-- My Location --> <!-- My Location -->
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/> <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/> <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.BLUETOOTH" <uses-permission android:name="android.permission.BLUETOOTH" android:maxSdkVersion="30" />
android:maxSdkVersion="30" /> <uses-permission android:name="android.permission.BLUETOOTH_ADMIN" android:maxSdkVersion="30" />
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN" <uses-permission android:name="android.permission.BLUETOOTH_SCAN" android:usesPermissionFlags="neverForLocation" />
android:maxSdkVersion="30" />
<uses-permission android:name="android.permission.BLUETOOTH_SCAN"
android:usesPermissionFlags="neverForLocation" />
<uses-permission android:name="android.permission.BLUETOOTH_CONNECT" /> <uses-permission android:name="android.permission.BLUETOOTH_CONNECT" />
<uses-feature android:name="android.hardware.location" android:required="false" /> <uses-feature android:name="android.hardware.location" android:required="false" />
<uses-feature android:name="android.hardware.location.gps" android:required="false" /> <uses-feature android:name="android.hardware.location.gps" android:required="false" />
@ -38,4 +35,4 @@
</intent> </intent>
</queries> </queries>
<meta-data android:name="com.google.android.geo.API_KEY" android:value="000000000000000000000000000000000000000" /> <meta-data android:name="com.google.android.geo.API_KEY" android:value="000000000000000000000000000000000000000" />
</manifest> </manifest>

File diff suppressed because it is too large Load diff

View file

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

View file

@ -120,7 +120,7 @@
<ItemGroup> <ItemGroup>
<PackageReference Include="Microsoft.Bcl.Build" Version="1.0.21" /> <PackageReference Include="Microsoft.Bcl.Build" Version="1.0.21" />
<PackageReference Include="Microsoft.CSharp" Version="4.7.0" /> <PackageReference Include="Microsoft.CSharp" Version="4.7.0" />
<PackageReference Include="Microsoft.NETCore.Platforms" Version="7.0.1" /> <PackageReference Include="Microsoft.NETCore.Platforms" Version="7.0.3" />
<PackageReference Include="Microsoft.Win32.Primitives" Version="4.3.0" /> <PackageReference Include="Microsoft.Win32.Primitives" Version="4.3.0" />
<PackageReference Include="MonkeyCache"> <PackageReference Include="MonkeyCache">
<Version>1.6.3</Version> <Version>1.6.3</Version>
@ -136,7 +136,7 @@
<Version>6.3.0.19</Version> <Version>6.3.0.19</Version>
</PackageReference> </PackageReference>
<PackageReference Include="Serilog"> <PackageReference Include="Serilog">
<Version>2.12.0</Version> <Version>3.0.1</Version>
</PackageReference> </PackageReference>
<PackageReference Include="Serilog.Sinks.File" Version="5.0.0" /> <PackageReference Include="Serilog.Sinks.File" Version="5.0.0" />
<PackageReference Include="Serilog.Sinks.Xamarin" Version="1.0.0" /> <PackageReference Include="Serilog.Sinks.Xamarin" Version="1.0.0" />
@ -197,10 +197,10 @@
<PackageReference Include="Xamarin.Auth" Version="1.7.0" /> <PackageReference Include="Xamarin.Auth" Version="1.7.0" />
<PackageReference Include="Xamarin.Build.Download" Version="0.11.4" /> <PackageReference Include="Xamarin.Build.Download" Version="0.11.4" />
<PackageReference Include="Xamarin.CommunityToolkit"> <PackageReference Include="Xamarin.CommunityToolkit">
<Version>2.0.5</Version> <Version>2.0.6</Version>
</PackageReference> </PackageReference>
<PackageReference Include="Xamarin.Essentials"> <PackageReference Include="Xamarin.Essentials">
<Version>1.7.5</Version> <Version>1.7.7</Version>
</PackageReference> </PackageReference>
<PackageReference Include="Xamarin.Forms.GoogleMaps"> <PackageReference Include="Xamarin.Forms.GoogleMaps">
<Version>5.0.0</Version> <Version>5.0.0</Version>

View file

@ -196,40 +196,18 @@
<Generator>MSBuild:UpdateDesignTimeXaml</Generator> <Generator>MSBuild:UpdateDesignTimeXaml</Generator>
</EmbeddedResource> </EmbeddedResource>
</ItemGroup> </ItemGroup>
<ItemGroup>
<EmbeddedResource Include="$(MSBuildThisFileDirectory)Images\trike_brake1_image.HZ17PY_678_382.png" />
</ItemGroup>
<ItemGroup> <ItemGroup>
<EmbeddedResource Include="$(MSBuildThisFileDirectory)View\Info\InfoTabbedPage.xaml"> <EmbeddedResource Include="$(MSBuildThisFileDirectory)View\Info\InfoTabbedPage.xaml">
<SubType>Designer</SubType> <SubType>Designer</SubType>
<Generator>MSBuild:UpdateDesignTimeXaml</Generator> <Generator>MSBuild:UpdateDesignTimeXaml</Generator>
</EmbeddedResource> </EmbeddedResource>
</ItemGroup> </ItemGroup>
<ItemGroup>
<EmbeddedResource Include="$(MSBuildThisFileDirectory)Images\belt1_image.4XWCQY_679_382.png" />
<EmbeddedResource Include="$(MSBuildThisFileDirectory)Images\belt2_image.X3F1PY_679_382.png" />
<EmbeddedResource Include="$(MSBuildThisFileDirectory)Images\belt3_image.DYOXPY_679_382.png" />
<EmbeddedResource Include="$(MSBuildThisFileDirectory)Images\seat1_image.ZQ65PY_680_382.png" />
<EmbeddedResource Include="$(MSBuildThisFileDirectory)Images\seat2_image.QQZCQY_679_382.png" />
<EmbeddedResource Include="$(MSBuildThisFileDirectory)Images\seat3_image.NQ5FQY_679_382.png" />
<EmbeddedResource Include="$(MSBuildThisFileDirectory)Images\trike_brake2_image.1YBAQY_679_382.png" />
<EmbeddedResource Include="$(MSBuildThisFileDirectory)Images\trike_brake3_image.FJM2PY_679_382.png" />
<EmbeddedResource Include="$(MSBuildThisFileDirectory)Images\trike_stand1_image.4HJ5PY_679_382.png" />
<EmbeddedResource Include="$(MSBuildThisFileDirectory)Images\trike_stand2_image.RIX2PY_679_382.png" />
<EmbeddedResource Include="$(MSBuildThisFileDirectory)Images\trike_stand3_image.FDR7PY_679_382.png" />
</ItemGroup>
<ItemGroup> <ItemGroup>
<EmbeddedResource Include="$(MSBuildThisFileDirectory)View\FeesAndBikes\FeesAndBikesPage.xaml"> <EmbeddedResource Include="$(MSBuildThisFileDirectory)View\FeesAndBikes\FeesAndBikesPage.xaml">
<SubType>Designer</SubType> <SubType>Designer</SubType>
<Generator>MSBuild:Compile</Generator> <Generator>MSBuild:Compile</Generator>
</EmbeddedResource> </EmbeddedResource>
</ItemGroup> </ItemGroup>
<ItemGroup>
<EmbeddedResource Include="$(MSBuildThisFileDirectory)Images\Tink2.png" />
</ItemGroup>
<ItemGroup>
<EmbeddedResource Include="$(MSBuildThisFileDirectory)Images\Konrad.png" />
</ItemGroup>
<ItemGroup> <ItemGroup>
<EmbeddedResource Include="$(MSBuildThisFileDirectory)View\WhatsNew\WhatsNewPage.xaml"> <EmbeddedResource Include="$(MSBuildThisFileDirectory)View\WhatsNew\WhatsNewPage.xaml">
<SubType>Designer</SubType> <SubType>Designer</SubType>

View file

@ -1,36 +0,0 @@
<!DOCTYPE html>
<html xml:lang="de" lang="de">
<title>TINK Konstanz</title>
<meta charset="utf-8"/>
<body>
<h1>WIE FUNKTIONIERT DAS TRANSPORTRAD-MIETEN?</h1>
<h2>Erstmalige Registrierung</h2><br>
Vor der ersten Anmietung eines Transportrades ist es notwendig, sich
kostenlos als Nutzerin oder Nutzer zu registrieren. Das dauert nur
wenige Minuten und geht am einfachsten über den <a href="https://tink-konstanz.de/TINK-Konstanz/Mieten">Mieten</a> Button. Sobald der Account freigeschaltet ist, kann es losgehen.<br><br>
<h2>Transportrad mieten</h2><br>
Einfach zur nächsten TINK Station gehen (freie Räder siehe Karte) und den Code
für das Zahlenschloss mittels SMS anfordern. Die Anleitung, wie es genau
geht, findet sich direkt an den Stationen, auf den Rädern oder hier: <br><a href="https://tink-konstanz.de/TINK-Konstanz/Anleitungen#3401">
<li>Anleitung Mietvorgang</a><br><a href="https://tink-konstanz.de/TINK-Konstanz/Anleitungen#3402">
<li>Anleitung TINK Räder</a><br>
<span style="font-weight:bold"> <li>Wichtig:</span> Nach der Nutzung das Rad an eine der TINK Stationen zurückbringen, an der Station anschließen und mittels SMS ausloggen.<br><br>
Die erste Version der TINK APP ist verfügbar. Wir freuen uns auf konstruktives feedback.
<br><br><h2>Preise</h2><br>
Die erste Stunde pro Tag ist kostenfrei, danach kostet jede weitere halbe Stunde 1 Euro. Maximal
kostet ein Rad pro 24 Stunden 9 Euro. Es kann ein Rad pro Account
gemietet werden. Bezahlung per Abbuchung oder Kreditkarte.<br>Servicegebühren:
Bei Abstellen eines Rades außerhalb der Stationen werden
entfernungsabhängige Gebühren für die Rückführung berechnet. Aktuelle
Preisliste siehe AGBs.</div>
<h1>WELCHE TRANSPORTRÄDER GIBT ES BEI TINK?</h1>
<div class="content2"><span class="content1">Zweirädriges Transportrad mit Platz für zwei Getränkekisten, Zuladung bis 80 kg. <br>Dreirädriges Transportrad sogar mit Platz für vier Getränkekisten, Zuladung bis 100 kg.</span><br>Jedes
Rad verfügt über eine leichtgängige Achtgang-Schaltung und einen
höhenverstellbaren Sattel. Im Zweirad können 2 Kinder, im Dreirad sogar 4
Kinder bis 6 Jahre mitgenommen werden. Die wegklappbaren Kindersitze
verfügen über Sicherheitsgurte.<br>Die Räder sind nach etwas Gewöhnung
leicht und sicher zu fahren. Vor der ersten Nutzung empfehlen wir ein
kurzes Üben ohne Beladung abseits des Straßenverkehrs. Einfach mal
ausprobieren, es macht richtig Spaß!
</body>
</html>

View file

@ -4,77 +4,171 @@
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml" xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
xmlns:resources="clr-namespace:TINK.MultilingualResources;assembly=TINKLib" xmlns:resources="clr-namespace:TINK.MultilingualResources;assembly=TINKLib"
x:Class="TINK.View.Contact.ContactPage"> x:Class="TINK.View.Contact.ContactPage">
<Shell.TitleView> <Shell.TitleView>
<Grid ColumnDefinitions="Auto, 1*"> <Grid ColumnDefinitions="Auto, 1*">
<Label Style="{StaticResource Label-Navbar}" <Label Style="{StaticResource Label-Navbar}"
Text="{x:Static resources:AppResources.MarkingContactPageTitle}"/> Text="{x:Static resources:AppResources.MarkingContactPageTitle}"/>
</Grid> </Grid>
</Shell.TitleView> </Shell.TitleView>
<ContentPage.Resources> <ContentPage.Resources>
<conv:StringNotNullOrEmptyToVisibleConverter x:Key="StringNotNullOrEmpty_Converter"/> <conv:StringNotNullOrEmptyToVisibleConverter x:Key="StringNotNullOrEmpty_Converter"/>
<conv:BoolInverterConverter x:Key="BoolInvert_Converter"/> <conv:BoolInverterConverter x:Key="BoolInvert_Converter"/>
</ContentPage.Resources> </ContentPage.Resources>
<ContentPage.Content>
<ScrollView> <ContentPage.Content>
<Frame>
<StackLayout x:Name="ContactPageView"> <Grid
<Frame x:Name="ContactPageView"
IsVisible="{Binding RowSpacing="0"
Path=IsOperatorInfoAvaliable, RowDefinitions="1*,Auto">
Converter={StaticResource BoolInvert_Converter}}">
<!-- Button to select station and explanation text --> <!-- Contact Support -->
<StackLayout> <Frame
<Label Grid.Row="0"
TextType="Html" Padding="10"
Text="{x:Static resources:AppResources.MarkingContactNoStationInfoAvailableNoButton}"/> Margin="0,10,0,5"
<Button HorizontalOptions="FillAndExpand"
Text="{x:Static resources:AppResources.ActionSelectStation}" VerticalOptions="Start"
Command="{Binding OnSelectStationRequest}"/> BackgroundColor="White"
</StackLayout> HasShadow="False">
</Frame>
<Frame <StackLayout
IsVisible="{Binding IsOperatorInfoAvaliable}"> Padding="20">
<!-- Operator info -->
<StackLayout> <!--Title Customer Support-->
<Label <Label
IsVisible="{Binding IsOperatorInfoAvaliable}" Text="{x:Static resources:AppResources.MarkingContactCustomerSupportTitle}"
HorizontalOptions="Center" FontAttributes="Bold"
FontAttributes="Bold" FontSize="Large"
Text="{Binding ProviderNameText}"/> />
<!--- Mail to operator -->
<Label <!--No station selected-->
IsVisible="{Binding MailAddressText, Converter={StaticResource StringNotNullOrEmpty_Converter}}" <StackLayout
FormattedText="{Binding MailAddressAndMotivationsText}"/> IsVisible="{Binding Path=IsOperatorInfoAvaliable, Converter={StaticResource BoolInvert_Converter}}">
<Button
x:Name="MailAddressButton" <Label
IsVisible="{Binding MailAddressText, Converter={StaticResource StringNotNullOrEmpty_Converter}}" TextType="Html"
Text="{Binding MailAddressText}" Text="{x:Static resources:AppResources.MarkingContactNoStationInfoAvailableNoButton}"/>
IsEnabled="{Binding IsSendMailAvailable}"
Command="{Binding OnMailToOperatorRequest}"/> <Button
<!--- Phone --> Text="{x:Static resources:AppResources.ActionSelectStation}"
<Label Command="{Binding OnSelectStationRequest}"/>
IsVisible="{Binding PhoneNumberText, Converter={StaticResource StringNotNullOrEmpty_Converter}}"
FormattedText="{Binding PhoneContactText}"/> </StackLayout>
<Button
x:Name="PhoneNumberButton" <!--Contact operator of selected station-->
IsVisible="{Binding PhoneNumberText, Converter={StaticResource StringNotNullOrEmpty_Converter}}" <StackLayout
Text="{Binding PhoneNumberText}" IsVisible="{Binding IsOperatorInfoAvaliable}">
IsEnabled="{Binding IsDoPhoncallAvailable}"
Command="{Binding OnPhoneRequest}"/> <!-- info about selected station -->
<StackLayout
Spacing="0">
<StackLayout
Orientation="Horizontal"
Spacing="0">
<Label
Text="{x:Static resources:AppResources.MarkingLastSelectedStation}"/>
<Label
Text=": "/>
</StackLayout>
<!-- Station -->
<StackLayout
Orientation="Horizontal"
Spacing="0">
<Label
Text="{Binding SelectedStationName}"/>
<Label
Text=": "/>
<Label
FontAttributes="Bold"
Text="{Binding SelectedStationId}"/>
</StackLayout>
<!--- Operator -->
<StackLayout
Orientation="Horizontal"
Spacing="0">
<Label
Text="{x:Static resources:AppResources.MarkingOperator}"/>
<Label
Text=": "/>
<Label
FontAttributes="Bold"
Text="{Binding ProviderNameText}"/>
</StackLayout>
</StackLayout> </StackLayout>
</Frame>
<Frame> <!--Buttons-->
<StackLayout> <StackLayout
<Label FormattedText="{Binding LikeTinkApp}"/> Spacing="5"
<!--- Mail to app- related support --> Margin="0,10,0,0">
<!--- Phone to operator -->
<Button <Button
Text="{x:Static resources:AppResources.ActionContactMailAppReleated}" x:Name="PhoneNumberButton"
IsEnabled="{Binding IsSendMailAvailable}" IsVisible="{Binding PhoneNumberText, Converter={StaticResource StringNotNullOrEmpty_Converter}}"
Command="{Binding OnMailAppRelatedRequest}"/> Text="{Binding PhoneNumberText}"
IsEnabled="{Binding IsDoPhoncallAvailable}"
Command="{Binding OnPhoneRequest}"/>
<!--- Mail to operator -->
<Button
x:Name="MailAddressButton"
IsVisible="{Binding MailAddressText, Converter={StaticResource StringNotNullOrEmpty_Converter}}"
Text="{Binding MailAddressText}"
IsEnabled="{Binding IsSendMailAvailable}"
Command="{Binding OnMailToOperatorRequest}"/>
<!-- Change selected Station-->
<Button
Text="{x:Static resources:AppResources.ActionSelectAnotherStation}"
Command="{Binding OnSelectStationRequest}"/>
</StackLayout> </StackLayout>
</Frame>
</StackLayout> </StackLayout>
</Frame>
</ScrollView> </StackLayout>
</ContentPage.Content>
</Frame>
<!--- Contact app-developer -->
<StackLayout
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"/>
<Label
TextType="Html"
HorizontalOptions="Center"
TextColor="{DynamicResource primary-back-title-color}"
Text="{x:Static resources:AppResources.ActionSendDiagnosis}"
IsEnabled="{Binding IsSendMailAvailable}">
<Label.GestureRecognizers>
<TapGestureRecognizer
Command="{Binding OnMailAppRelatedRequest}"/>
</Label.GestureRecognizers>
</Label>
</StackLayout>
</Grid>
</ContentPage.Content>
</ContentPage> </ContentPage>

View file

@ -9,9 +9,9 @@
<ItemGroup> <ItemGroup>
<PackageReference Include="Plugin.BLE" Version="2.1.3" /> <PackageReference Include="Plugin.BLE" Version="2.1.3" />
<PackageReference Include="Polly" Version="7.2.3" /> <PackageReference Include="Polly" Version="7.2.4" />
<PackageReference Include="Serilog" Version="2.12.0" /> <PackageReference Include="Serilog" Version="3.0.1" />
<PackageReference Include="Xamarin.Essentials" Version="1.7.5" /> <PackageReference Include="Xamarin.Essentials" Version="1.7.7" />
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>

View file

@ -23,7 +23,7 @@
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<PackageReference Include="Newtonsoft.Json" Version="13.0.3" /> <PackageReference Include="Newtonsoft.Json" Version="13.0.3" />
<PackageReference Include="Serilog" Version="2.12.0" /> <PackageReference Include="Serilog" Version="3.0.1" />
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<Compile Update="MultilingualResources\Resources.Designer.cs"> <Compile Update="MultilingualResources\Resources.Designer.cs">

View file

@ -16,7 +16,7 @@
<AndroidResgenFile>Resources\Resource.Designer.cs</AndroidResgenFile> <AndroidResgenFile>Resources\Resource.Designer.cs</AndroidResgenFile>
<GenerateSerializationAssemblies>Off</GenerateSerializationAssemblies> <GenerateSerializationAssemblies>Off</GenerateSerializationAssemblies>
<AndroidManifest>Properties\AndroidManifest.xml</AndroidManifest> <AndroidManifest>Properties\AndroidManifest.xml</AndroidManifest>
<TargetFrameworkVersion>v12.0</TargetFrameworkVersion> <TargetFrameworkVersion>v13.0</TargetFrameworkVersion>
<AndroidStoreUncompressedFileExtensions /> <AndroidStoreUncompressedFileExtensions />
<MandroidI18n /> <MandroidI18n />
<JavaMaximumHeapSize>2G</JavaMaximumHeapSize> <JavaMaximumHeapSize>2G</JavaMaximumHeapSize>
@ -77,7 +77,7 @@
</PropertyGroup> </PropertyGroup>
<ItemGroup> <ItemGroup>
<PackageReference Include="Microsoft.CSharp" Version="4.7.0" /> <PackageReference Include="Microsoft.CSharp" Version="4.7.0" />
<PackageReference Include="Microsoft.NETCore.Platforms" Version="7.0.1" /> <PackageReference Include="Microsoft.NETCore.Platforms" Version="7.0.3" />
<PackageReference Include="Microsoft.Win32.Primitives" Version="4.3.0" /> <PackageReference Include="Microsoft.Win32.Primitives" Version="4.3.0" />
<PackageReference Include="MonkeyCache"> <PackageReference Include="MonkeyCache">
<Version>1.6.3</Version> <Version>1.6.3</Version>
@ -97,7 +97,7 @@
<Version>6.3.0.19</Version> <Version>6.3.0.19</Version>
</PackageReference> </PackageReference>
<PackageReference Include="Serilog"> <PackageReference Include="Serilog">
<Version>2.12.0</Version> <Version>3.0.1</Version>
</PackageReference> </PackageReference>
<PackageReference Include="Serilog.Sinks.File" Version="5.0.0" /> <PackageReference Include="Serilog.Sinks.File" Version="5.0.0" />
<PackageReference Include="Serilog.Sinks.Xamarin" Version="1.0.0" /> <PackageReference Include="Serilog.Sinks.Xamarin" Version="1.0.0" />
@ -176,24 +176,24 @@
<PackageReference Include="Xamarin.Android.Support.v7.RecyclerView" Version="28.0.0.3" /> <PackageReference Include="Xamarin.Android.Support.v7.RecyclerView" Version="28.0.0.3" />
<PackageReference Include="Xamarin.Android.Support.Vector.Drawable" Version="28.0.0.3" /> <PackageReference Include="Xamarin.Android.Support.Vector.Drawable" Version="28.0.0.3" />
<PackageReference Include="Xamarin.AndroidX.Core"> <PackageReference Include="Xamarin.AndroidX.Core">
<Version>1.9.0.2</Version> <Version>1.10.1.1</Version>
</PackageReference> </PackageReference>
<PackageReference Include="Xamarin.AndroidX.MediaRouter"> <PackageReference Include="Xamarin.AndroidX.MediaRouter">
<Version>1.3.1.2</Version> <Version>1.4.0.1</Version>
</PackageReference> </PackageReference>
<PackageReference Include="Xamarin.AndroidX.Palette"> <PackageReference Include="Xamarin.AndroidX.Palette">
<Version>1.0.0.16</Version> <Version>1.0.0.18</Version>
</PackageReference> </PackageReference>
<PackageReference Include="Xamarin.AndroidX.RecyclerView"> <PackageReference Include="Xamarin.AndroidX.RecyclerView">
<Version>1.3.0</Version> <Version>1.3.0.2</Version>
</PackageReference> </PackageReference>
<PackageReference Include="Xamarin.Auth" Version="1.7.0" /> <PackageReference Include="Xamarin.Auth" Version="1.7.0" />
<PackageReference Include="Xamarin.Build.Download" Version="0.11.4" /> <PackageReference Include="Xamarin.Build.Download" Version="0.11.4" />
<PackageReference Include="Xamarin.CommunityToolkit"> <PackageReference Include="Xamarin.CommunityToolkit">
<Version>2.0.5</Version> <Version>2.0.6</Version>
</PackageReference> </PackageReference>
<PackageReference Include="Xamarin.Essentials"> <PackageReference Include="Xamarin.Essentials">
<Version>1.7.5</Version> <Version>1.7.7</Version>
</PackageReference> </PackageReference>
<PackageReference Include="Xamarin.Forms" Version="5.0.0.2578" /> <PackageReference Include="Xamarin.Forms" Version="5.0.0.2578" />
<PackageReference Include="Xamarin.Forms.AppLinks"> <PackageReference Include="Xamarin.Forms.AppLinks">
@ -203,10 +203,10 @@
<Version>5.0.0</Version> <Version>5.0.0</Version>
</PackageReference> </PackageReference>
<PackageReference Include="Xamarin.Forms.GoogleMaps.Bindings" Version="3.0.0" /> <PackageReference Include="Xamarin.Forms.GoogleMaps.Bindings" Version="3.0.0" />
<PackageReference Include="Xamarin.GooglePlayServices.Base" Version="118.1.0.1" /> <PackageReference Include="Xamarin.GooglePlayServices.Base" Version="118.2.0.1" />
<PackageReference Include="Xamarin.GooglePlayServices.Basement" Version="118.1.0.2" /> <PackageReference Include="Xamarin.GooglePlayServices.Basement" Version="118.2.0.1" />
<PackageReference Include="Xamarin.GooglePlayServices.Maps" Version="118.1.0.1" /> <PackageReference Include="Xamarin.GooglePlayServices.Maps" Version="118.1.0.2" />
<PackageReference Include="Xamarin.GooglePlayServices.Tasks" Version="118.0.2.1" /> <PackageReference Include="Xamarin.GooglePlayServices.Tasks" Version="118.0.2.2" />
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<Reference Include="Mono.Android" /> <Reference Include="Mono.Android" />
@ -302,21 +302,6 @@
<Generator>MSBuild:UpdateGeneratedFiles</Generator> <Generator>MSBuild:UpdateGeneratedFiles</Generator>
</AndroidResource> </AndroidResource>
</ItemGroup> </ItemGroup>
<ItemGroup>
<AndroidResource Include="Resources\drawable-hdpi\konrad_nobg.png" />
</ItemGroup>
<ItemGroup>
<AndroidResource Include="Resources\drawable-mdpi\konrad_nobg.png" />
</ItemGroup>
<ItemGroup>
<AndroidResource Include="Resources\drawable-xhdpi\konrad_nobg.png" />
</ItemGroup>
<ItemGroup>
<AndroidResource Include="Resources\drawable-xxhdpi\konrad_nobg.png" />
</ItemGroup>
<ItemGroup>
<AndroidResource Include="Resources\drawable-xxxhdpi\konrad_nobg.png" />
</ItemGroup>
<ItemGroup> <ItemGroup>
<AndroidResource Include="Resources\drawable\konrad_nobg.png"> <AndroidResource Include="Resources\drawable\konrad_nobg.png">
<Generator>MSBuild:UpdateGeneratedFiles</Generator> <Generator>MSBuild:UpdateGeneratedFiles</Generator>
@ -362,41 +347,11 @@
<Generator>MSBuild:UpdateGeneratedFiles</Generator> <Generator>MSBuild:UpdateGeneratedFiles</Generator>
</AndroidResource> </AndroidResource>
</ItemGroup> </ItemGroup>
<ItemGroup>
<AndroidResource Include="Resources\drawable-hdpi\swk_theme.png" />
</ItemGroup>
<ItemGroup>
<AndroidResource Include="Resources\drawable-mdpi\swk_theme.png" />
</ItemGroup>
<ItemGroup>
<AndroidResource Include="Resources\drawable-xhdpi\swk_theme.png" />
</ItemGroup>
<ItemGroup>
<AndroidResource Include="Resources\drawable-xxhdpi\swk_theme.png" />
</ItemGroup>
<ItemGroup>
<AndroidResource Include="Resources\drawable-xxxhdpi\swk_theme.png" />
</ItemGroup>
<ItemGroup> <ItemGroup>
<AndroidResource Include="Resources\drawable\swk_theme.png"> <AndroidResource Include="Resources\drawable\swk_theme.png">
<Generator>MSBuild:UpdateGeneratedFiles</Generator> <Generator>MSBuild:UpdateGeneratedFiles</Generator>
</AndroidResource> </AndroidResource>
</ItemGroup> </ItemGroup>
<ItemGroup>
<AndroidResource Include="Resources\drawable-hdpi\menu_swk_theme.png" />
</ItemGroup>
<ItemGroup>
<AndroidResource Include="Resources\drawable-mdpi\menu_swk_theme.png" />
</ItemGroup>
<ItemGroup>
<AndroidResource Include="Resources\drawable-xhdpi\menu_swk_theme.png" />
</ItemGroup>
<ItemGroup>
<AndroidResource Include="Resources\drawable-xxhdpi\menu_swk_theme.png" />
</ItemGroup>
<ItemGroup>
<AndroidResource Include="Resources\drawable-xxxhdpi\menu_swk_theme.png" />
</ItemGroup>
<ItemGroup> <ItemGroup>
<AndroidResource Include="Resources\drawable\menu_swk_theme.png"> <AndroidResource Include="Resources\drawable\menu_swk_theme.png">
<Generator>MSBuild:UpdateGeneratedFiles</Generator> <Generator>MSBuild:UpdateGeneratedFiles</Generator>

View file

@ -1,6 +1,6 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android" android:installLocation="internalOnly" package="com.TeilRad.Meinkonrad" android:versionName="3.0.365" android:versionCode="365"> <manifest xmlns:android="http://schemas.android.com/apk/res/android" android:installLocation="internalOnly" package="com.TeilRad.Meinkonrad" android:versionName="3.0.369" android:versionCode="369">
<uses-sdk android:minSdkVersion="19" android:targetSdkVersion="31" /> <uses-sdk android:minSdkVersion="19" android:targetSdkVersion="33" />
<!-- Google Maps related permissions --> <!-- Google Maps related permissions -->
<!-- Permission to receive remote notifications from Google Play Services --> <!-- Permission to receive remote notifications from Google Play Services -->
<!-- Notice here that we have the package name of our application as a prefix on the permissions. --> <!-- Notice here that we have the package name of our application as a prefix on the permissions. -->
@ -9,14 +9,11 @@
<!-- Access Google based webservices --> <!-- Access Google based webservices -->
<!-- External storage for caching. --> <!-- External storage for caching. -->
<!-- My Location --> <!-- My Location -->
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/> <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/> <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.BLUETOOTH" <uses-permission android:name="android.permission.BLUETOOTH" android:maxSdkVersion="30" />
android:maxSdkVersion="30" /> <uses-permission android:name="android.permission.BLUETOOTH_ADMIN" android:maxSdkVersion="30" />
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN" <uses-permission android:name="android.permission.BLUETOOTH_SCAN" android:usesPermissionFlags="neverForLocation" />
android:maxSdkVersion="30" />
<uses-permission android:name="android.permission.BLUETOOTH_SCAN"
android:usesPermissionFlags="neverForLocation" />
<uses-permission android:name="android.permission.BLUETOOTH_CONNECT" /> <uses-permission android:name="android.permission.BLUETOOTH_CONNECT" />
<uses-feature android:name="android.hardware.location" android:required="false" /> <uses-feature android:name="android.hardware.location" android:required="false" />
<uses-feature android:name="android.hardware.location.gps" android:required="false" /> <uses-feature android:name="android.hardware.location.gps" android:required="false" />
@ -38,4 +35,4 @@
</intent> </intent>
</queries> </queries>
<meta-data android:name="com.google.android.geo.API_KEY" android:value="000000000000000000000000000000000000000" /> <meta-data android:name="com.google.android.geo.API_KEY" android:value="000000000000000000000000000000000000000" />
</manifest> </manifest>

File diff suppressed because it is too large Load diff

Binary file not shown.

Before

Width:  |  Height:  |  Size: 52 KiB

After

Width:  |  Height:  |  Size: 27 KiB

View file

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

View file

@ -121,7 +121,7 @@
<ItemGroup> <ItemGroup>
<PackageReference Include="Microsoft.Bcl.Build" Version="1.0.21" /> <PackageReference Include="Microsoft.Bcl.Build" Version="1.0.21" />
<PackageReference Include="Microsoft.CSharp" Version="4.7.0" /> <PackageReference Include="Microsoft.CSharp" Version="4.7.0" />
<PackageReference Include="Microsoft.NETCore.Platforms" Version="7.0.1" /> <PackageReference Include="Microsoft.NETCore.Platforms" Version="7.0.3" />
<PackageReference Include="Microsoft.Win32.Primitives" Version="4.3.0" /> <PackageReference Include="Microsoft.Win32.Primitives" Version="4.3.0" />
<PackageReference Include="MonkeyCache"> <PackageReference Include="MonkeyCache">
<Version>1.6.3</Version> <Version>1.6.3</Version>
@ -137,7 +137,7 @@
<Version>6.3.0.19</Version> <Version>6.3.0.19</Version>
</PackageReference> </PackageReference>
<PackageReference Include="Serilog"> <PackageReference Include="Serilog">
<Version>2.12.0</Version> <Version>3.0.1</Version>
</PackageReference> </PackageReference>
<PackageReference Include="Serilog.Sinks.File" Version="5.0.0" /> <PackageReference Include="Serilog.Sinks.File" Version="5.0.0" />
<PackageReference Include="Serilog.Sinks.Xamarin" Version="1.0.0" /> <PackageReference Include="Serilog.Sinks.Xamarin" Version="1.0.0" />
@ -198,10 +198,10 @@
<PackageReference Include="Xamarin.Auth" Version="1.7.0" /> <PackageReference Include="Xamarin.Auth" Version="1.7.0" />
<PackageReference Include="Xamarin.Build.Download" Version="0.11.4" /> <PackageReference Include="Xamarin.Build.Download" Version="0.11.4" />
<PackageReference Include="Xamarin.CommunityToolkit"> <PackageReference Include="Xamarin.CommunityToolkit">
<Version>2.0.5</Version> <Version>2.0.6</Version>
</PackageReference> </PackageReference>
<PackageReference Include="Xamarin.Essentials"> <PackageReference Include="Xamarin.Essentials">
<Version>1.7.5</Version> <Version>1.7.7</Version>
</PackageReference> </PackageReference>
<PackageReference Include="Xamarin.Forms.GoogleMaps"> <PackageReference Include="Xamarin.Forms.GoogleMaps">
<Version>5.0.0</Version> <Version>5.0.0</Version>

View file

@ -201,40 +201,18 @@
<Generator>MSBuild:UpdateDesignTimeXaml</Generator> <Generator>MSBuild:UpdateDesignTimeXaml</Generator>
</EmbeddedResource> </EmbeddedResource>
</ItemGroup> </ItemGroup>
<ItemGroup>
<EmbeddedResource Include="$(MSBuildThisFileDirectory)Images\trike_brake1_image.HZ17PY_678_382.png" />
</ItemGroup>
<ItemGroup> <ItemGroup>
<EmbeddedResource Include="$(MSBuildThisFileDirectory)View\Info\InfoTabbedPage.xaml"> <EmbeddedResource Include="$(MSBuildThisFileDirectory)View\Info\InfoTabbedPage.xaml">
<SubType>Designer</SubType> <SubType>Designer</SubType>
<Generator>MSBuild:UpdateDesignTimeXaml</Generator> <Generator>MSBuild:UpdateDesignTimeXaml</Generator>
</EmbeddedResource> </EmbeddedResource>
</ItemGroup> </ItemGroup>
<ItemGroup>
<EmbeddedResource Include="$(MSBuildThisFileDirectory)Images\belt1_image.4XWCQY_679_382.png" />
<EmbeddedResource Include="$(MSBuildThisFileDirectory)Images\belt2_image.X3F1PY_679_382.png" />
<EmbeddedResource Include="$(MSBuildThisFileDirectory)Images\belt3_image.DYOXPY_679_382.png" />
<EmbeddedResource Include="$(MSBuildThisFileDirectory)Images\seat1_image.ZQ65PY_680_382.png" />
<EmbeddedResource Include="$(MSBuildThisFileDirectory)Images\seat2_image.QQZCQY_679_382.png" />
<EmbeddedResource Include="$(MSBuildThisFileDirectory)Images\seat3_image.NQ5FQY_679_382.png" />
<EmbeddedResource Include="$(MSBuildThisFileDirectory)Images\trike_brake2_image.1YBAQY_679_382.png" />
<EmbeddedResource Include="$(MSBuildThisFileDirectory)Images\trike_brake3_image.FJM2PY_679_382.png" />
<EmbeddedResource Include="$(MSBuildThisFileDirectory)Images\trike_stand1_image.4HJ5PY_679_382.png" />
<EmbeddedResource Include="$(MSBuildThisFileDirectory)Images\trike_stand2_image.RIX2PY_679_382.png" />
<EmbeddedResource Include="$(MSBuildThisFileDirectory)Images\trike_stand3_image.FDR7PY_679_382.png" />
</ItemGroup>
<ItemGroup> <ItemGroup>
<EmbeddedResource Include="$(MSBuildThisFileDirectory)View\FeesAndBikes\FeesAndBikesPage.xaml"> <EmbeddedResource Include="$(MSBuildThisFileDirectory)View\FeesAndBikes\FeesAndBikesPage.xaml">
<SubType>Designer</SubType> <SubType>Designer</SubType>
<Generator>MSBuild:Compile</Generator> <Generator>MSBuild:Compile</Generator>
</EmbeddedResource> </EmbeddedResource>
</ItemGroup> </ItemGroup>
<ItemGroup>
<EmbeddedResource Include="$(MSBuildThisFileDirectory)Images\Tink2.png" />
</ItemGroup>
<ItemGroup>
<EmbeddedResource Include="$(MSBuildThisFileDirectory)Images\Konrad.png" />
</ItemGroup>
<ItemGroup> <ItemGroup>
<EmbeddedResource Include="$(MSBuildThisFileDirectory)View\WhatsNew\WhatsNewPage.xaml"> <EmbeddedResource Include="$(MSBuildThisFileDirectory)View\WhatsNew\WhatsNewPage.xaml">
<SubType>Designer</SubType> <SubType>Designer</SubType>

View file

@ -1,36 +0,0 @@
<!DOCTYPE html>
<html xml:lang="de" lang="de">
<title>TINK Konstanz</title>
<meta charset="utf-8"/>
<body>
<h1>WIE FUNKTIONIERT DAS TRANSPORTRAD-MIETEN?</h1>
<h2>Erstmalige Registrierung</h2><br>
Vor der ersten Anmietung eines Transportrades ist es notwendig, sich
kostenlos als Nutzerin oder Nutzer zu registrieren. Das dauert nur
wenige Minuten und geht am einfachsten über den <a href="https://tink-konstanz.de/TINK-Konstanz/Mieten">Mieten</a> Button. Sobald der Account freigeschaltet ist, kann es losgehen.<br><br>
<h2>Transportrad mieten</h2><br>
Einfach zur nächsten TINK Station gehen (freie Räder siehe Karte) und den Code
für das Zahlenschloss mittels SMS anfordern. Die Anleitung, wie es genau
geht, findet sich direkt an den Stationen, auf den Rädern oder hier: <br><a href="https://tink-konstanz.de/TINK-Konstanz/Anleitungen#3401">
<li>Anleitung Mietvorgang</a><br><a href="https://tink-konstanz.de/TINK-Konstanz/Anleitungen#3402">
<li>Anleitung TINK Räder</a><br>
<span style="font-weight:bold"> <li>Wichtig:</span> Nach der Nutzung das Rad an eine der TINK Stationen zurückbringen, an der Station anschließen und mittels SMS ausloggen.<br><br>
Die erste Version der TINK APP ist verfügbar. Wir freuen uns auf konstruktives feedback.
<br><br><h2>Preise</h2><br>
Die erste Stunde pro Tag ist kostenfrei, danach kostet jede weitere halbe Stunde 1 Euro. Maximal
kostet ein Rad pro 24 Stunden 9 Euro. Es kann ein Rad pro Account
gemietet werden. Bezahlung per Abbuchung oder Kreditkarte.<br>Servicegebühren:
Bei Abstellen eines Rades außerhalb der Stationen werden
entfernungsabhängige Gebühren für die Rückführung berechnet. Aktuelle
Preisliste siehe AGBs.</div>
<h1>WELCHE TRANSPORTRÄDER GIBT ES BEI TINK?</h1>
<div class="content2"><span class="content1">Zweirädriges Transportrad mit Platz für zwei Getränkekisten, Zuladung bis 80 kg. <br>Dreirädriges Transportrad sogar mit Platz für vier Getränkekisten, Zuladung bis 100 kg.</span><br>Jedes
Rad verfügt über eine leichtgängige Achtgang-Schaltung und einen
höhenverstellbaren Sattel. Im Zweirad können 2 Kinder, im Dreirad sogar 4
Kinder bis 6 Jahre mitgenommen werden. Die wegklappbaren Kindersitze
verfügen über Sicherheitsgurte.<br>Die Räder sind nach etwas Gewöhnung
leicht und sicher zu fahren. Vor der ersten Nutzung empfehlen wir ein
kurzes Üben ohne Beladung abseits des Straßenverkehrs. Einfach mal
ausprobieren, es macht richtig Spaß!
</body>
</html>

View file

@ -5,6 +5,8 @@
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:resources="clr-namespace:TINK.MultilingualResources;assembly=TINKLib" xmlns:resources="clr-namespace:TINK.MultilingualResources;assembly=TINKLib"
mc:Ignorable="d" mc:Ignorable="d"
xmlns:conv="clr-namespace:TINK.View"
xmlns:sharedGui="clr-namespace:ShareeSharedGuiLib.View"
x:Class="TINK.View.Account.AccountPage" x:Class="TINK.View.Account.AccountPage"
BackgroundColor="{DynamicResource background-color}"> BackgroundColor="{DynamicResource background-color}">
@ -16,11 +18,19 @@
</Grid> </Grid>
</Shell.TitleView> </Shell.TitleView>
<ContentPage.Resources>
<conv:BoolInverterConverter x:Key="BoolInverterConverter"/>
</ContentPage.Resources>
<ContentPage.Content> <ContentPage.Content>
<ScrollView> <!--Grid for content and Running process in same row-->
<Grid>
<StackLayout> <ScrollView
Grid.Row="0">
<StackLayout>
<Frame <Frame
Padding="10" Padding="10"
@ -57,6 +67,13 @@
</ScrollView> </ScrollView>
<!--While process is running-->
<sharedGui:RunningProcessView
IsVisible="{Binding IsIdle, Converter={StaticResource BoolInverterConverter}}"
Grid.Row="0"/>
</Grid>
</ContentPage.Content> </ContentPage.Content>
</ContentPage> </ContentPage>

View file

@ -32,7 +32,7 @@
<Grid <Grid
Grid.Row="0" Grid.Row="0"
RowSpacing="0" RowSpacing="0"
RowDefinitions="Auto,1*,Auto"> RowDefinitions="1*,Auto">
<StackLayout <StackLayout
Grid.Row="0" Grid.Row="0"
@ -84,17 +84,26 @@
</StackLayout> </StackLayout>
<!--No Network Connection--> <!--If Not Connected To Internet-->
<sharedGui:NotConnectedToNetView/> <sharedGui:NotConnectedToNetView/>
<!--Bike(s)--> <!--Bike data-->
<StackLayout <Grid
IsVisible="{Binding IsBikesListVisible}" RowDefinitions="Auto,1*"
Spacing="0"> RowSpacing="0">
<!--Hint for Outdated Data.--> <!--Hint for Outdated Data.-->
<sharedGui:HintForRefreshingPageView/> <sharedGui:HintForRefreshingPageView
Grid.Row="0"/>
<!--No Bikes-->
<Label
Grid.Row="1"
Margin="20"
IsVisible="{Binding IsNoBikesAtStationVisible}"
Text="{Binding NoBikesAtStationText}"/>
<!--Bike(s)-->
<ListView <ListView
Grid.Row="1" Grid.Row="1"
x:Name="BikesAtStationListView" x:Name="BikesAtStationListView"
@ -107,21 +116,13 @@
IsPullToRefreshEnabled="True" IsPullToRefreshEnabled="True"
RefreshCommand="{Binding RefreshCommand}" RefreshCommand="{Binding RefreshCommand}"
IsRefreshing="{Binding IsRefreshing}"/> IsRefreshing="{Binding IsRefreshing}"/>
</Grid>
</StackLayout>
</StackLayout> </StackLayout>
<!--No Bikes-->
<Label
Grid.Row="1"
Margin="20"
IsVisible="{Binding IsNoBikesAtStationVisible}"
Text="{Binding NoBikesAtStationText}"/>
<!--Info at End of Page--> <!--Info at End of Page-->
<StackLayout <StackLayout
Grid.Row="2" Grid.Row="1"
Orientation="Vertical" Orientation="Vertical"
Spacing="0" Spacing="0"
Padding="20,0,20,0"> Padding="20,0,20,0">

View file

@ -21,102 +21,158 @@
<ContentPage.Content> <ContentPage.Content>
<ScrollView> <Grid
x:Name="ContactPageView"
RowSpacing="0"
RowDefinitions="1*,Auto">
<StackLayout <!-- Contact Support -->
x:Name="ContactPageView"> <Frame
Grid.Row="0"
Padding="10"
Margin="0,10,0,5"
HorizontalOptions="FillAndExpand"
VerticalOptions="Start"
BackgroundColor="White"
HasShadow="False">
<Frame <StackLayout
Padding="10" Padding="20">
Margin="0,10,0,5"
HorizontalOptions="FillAndExpand"
BackgroundColor="White">
<!--Title Customer Support-->
<Label
Text="{x:Static resources:AppResources.MarkingContactCustomerSupportTitle}"
FontAttributes="Bold"
FontSize="Large"
/>
<!--No station selected-->
<StackLayout <StackLayout
Padding="10">
<!-- Button to select station and explanation text -->
<StackLayout
IsVisible="{Binding Path=IsOperatorInfoAvaliable, Converter={StaticResource BoolInvert_Converter}}"> IsVisible="{Binding Path=IsOperatorInfoAvaliable, Converter={StaticResource BoolInvert_Converter}}">
<Label <Label
TextType="Html" TextType="Html"
Text="{x:Static resources:AppResources.MarkingContactNoStationInfoAvailableNoButton}"/> Text="{x:Static resources:AppResources.MarkingContactNoStationInfoAvailableNoButton}"/>
<Button
<Button
Text="{x:Static resources:AppResources.ActionSelectStation}" Text="{x:Static resources:AppResources.ActionSelectStation}"
Command="{Binding OnSelectStationRequest}"/> Command="{Binding OnSelectStationRequest}"/>
</StackLayout>
<!--Contact operator of selected station-->
<StackLayout
IsVisible="{Binding IsOperatorInfoAvaliable}">
<!-- info about selected station -->
<StackLayout
Spacing="0">
<StackLayout
Orientation="Horizontal"
Spacing="0">
<Label
Text="{x:Static resources:AppResources.MarkingLastSelectedStation}"/>
<Label
Text=": "/>
</StackLayout>
<!-- Station -->
<StackLayout
Orientation="Horizontal"
Spacing="0">
<Label
Text="{Binding SelectedStationName}"/>
<Label
Text=": "/>
<Label
FontAttributes="Bold"
Text="{Binding SelectedStationId}"/>
</StackLayout>
<!--- Operator -->
<StackLayout
Orientation="Horizontal"
Spacing="0">
<Label
Text="{x:Static resources:AppResources.MarkingOperator}"/>
<Label
Text=": "/>
<Label
FontAttributes="Bold"
Text="{Binding ProviderNameText}"/>
</StackLayout>
</StackLayout>
<!--Buttons-->
<StackLayout
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}"/>
<!--- 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}"/>
<!-- Change selected Station-->
<Button
Style="{StaticResource NoOutlineButton}"
Text="{x:Static resources:AppResources.ActionSelectAnotherStation}"
Command="{Binding OnSelectStationRequest}"/>
</StackLayout> </StackLayout>
<!-- Contact operator -->
<StackLayout
IsVisible="{Binding IsOperatorInfoAvaliable}">
<!--- Name of operator -->
<Label
IsVisible="{Binding IsOperatorInfoAvaliable}"
HorizontalOptions="Center"
FontAttributes="Bold"
Text="{Binding ProviderNameText}"/>
<!--- Mail to operator -->
<Label
IsVisible="{Binding MailAddressText, Converter={StaticResource StringNotNullOrEmpty_Converter}}"
FormattedText="{Binding MailAddressAndMotivationsText}"/>
<Button
x:Name="MailAddressButton"
IsVisible="{Binding MailAddressText, Converter={StaticResource StringNotNullOrEmpty_Converter}}"
Text="{Binding MailAddressText}"
IsEnabled="{Binding IsSendMailAvailable}"
Command="{Binding OnMailToOperatorRequest}"/>
<!--- Phone to operator -->
<Label
IsVisible="{Binding PhoneNumberText, Converter={StaticResource StringNotNullOrEmpty_Converter}}"
FormattedText="{Binding PhoneContactText}"/>
<Button
Style="{StaticResource SecondaryButton}"
x:Name="PhoneNumberButton"
IsVisible="{Binding PhoneNumberText, Converter={StaticResource StringNotNullOrEmpty_Converter}}"
Text="{Binding PhoneNumberText}"
IsEnabled="{Binding IsDoPhoncallAvailable}"
Command="{Binding OnPhoneRequest}"/>
</StackLayout>
</StackLayout> </StackLayout>
</Frame> </StackLayout>
<Frame </Frame>
<!--- Contact app-developer -->
<StackLayout
Grid.Row="1"
Padding="10" Padding="10"
Margin="0,5,0,5" Margin="0,0,0,10"
HorizontalOptions="FillAndExpand" VerticalOptions="End"
BackgroundColor="White"> Spacing="0">
<!--- Contact app-developer --> <BoxView
<StackLayout Margin="0,0,0,10"
Padding="10"> HeightRequest="1"
WidthRequest="400"
HorizontalOptions="Center"
Color="DimGray"/>
<Label <Label
FormattedText="{Binding LikeTinkApp}"/> TextType="Html"
HorizontalOptions="Center"
<!--- Mail to app-developer --> TextColor="{DynamicResource primary-back-title-color}"
<Button Text="{x:Static resources:AppResources.ActionSendDiagnosis}"
Style="{StaticResource SecondaryButton}" IsEnabled="{Binding IsSendMailAvailable}">
Text="{x:Static resources:AppResources.ActionContactMailAppReleated}" <Label.GestureRecognizers>
IsEnabled="{Binding IsSendMailAvailable}" <TapGestureRecognizer
Command="{Binding OnMailAppRelatedRequest}"/> Command="{Binding OnMailAppRelatedRequest}"/>
</Label.GestureRecognizers>
</StackLayout> </Label>
</Frame>
</StackLayout> </StackLayout>
</ScrollView> </Grid>
</ContentPage.Content> </ContentPage.Content>
</ContentPage> </ContentPage>

View file

@ -2,6 +2,7 @@
<ContentPage xmlns="http://xamarin.com/schemas/2014/forms" <ContentPage xmlns="http://xamarin.com/schemas/2014/forms"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml" xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
x:Class="TINK.View.FindBike.FindBikePage" x:Class="TINK.View.FindBike.FindBikePage"
xmlns:conv="clr-namespace:TINK.View"
xmlns:resources="clr-namespace:TINK.MultilingualResources;assembly=TINKLib" xmlns:resources="clr-namespace:TINK.MultilingualResources;assembly=TINKLib"
xmlns:local_bike="clr-namespace:TINK.View.Bike" xmlns:local_bike="clr-namespace:TINK.View.Bike"
xmlns:sharedGui="clr-namespace:ShareeSharedGuiLib.View" xmlns:sharedGui="clr-namespace:ShareeSharedGuiLib.View"
@ -17,6 +18,7 @@
<ContentPage.Resources> <ContentPage.Resources>
<ResourceDictionary> <ResourceDictionary>
<local_bike:BikeViewCellTemplateSelector x:Key="bikeTemplateSelector"/> <local_bike:BikeViewCellTemplateSelector x:Key="bikeTemplateSelector"/>
<conv:StringNotNullOrEmptyToVisibleConverter x:Key="Label_Converter"/>
</ResourceDictionary> </ResourceDictionary>
</ContentPage.Resources> </ContentPage.Resources>
@ -25,80 +27,118 @@
<!--Grid for Bike(s) view and Running process in same row--> <!--Grid for Bike(s) view and Running process in same row-->
<Grid> <Grid>
<!-- Grid for Content -->
<Grid <Grid
RowDefinitions="1*,Auto" RowDefinitions="1*,Auto"
RowSpacing="0" RowSpacing="0"
Grid.Row="0"> Grid.Row="0">
<StackLayout <StackLayout
Grid.Row="0" Grid.Row="0"
Spacing="0" Spacing="0"
Orientation="Vertical"> Orientation="Vertical">
<!--No Network Connection--> <StackLayout
<sharedGui:NotConnectedToNetView/> BackgroundColor="White"
Padding="20,5,20,0">
<!--Search bike--> <!--Bike type-->
<Frame <StackLayout Orientation="Horizontal"
Padding="10" HorizontalOptions="Center"
Margin="0,10,0,5" IsVisible="{Binding ActiveFilteredBikeType, Converter={StaticResource Label_Converter}}"
IsVisible="{Binding IsSelectBikeVisible}" Spacing="0">
HorizontalOptions="FillAndExpand" <Label
BackgroundColor="White"> TextColor="DimGray"
Text="{x:Static resources:AppResources.MarkingFindBikeTypeOfBikeText}"/>
<Label
TextColor="{DynamicResource primary-back-title-color}"
FontAttributes="Bold"
Text="{Binding ActiveFilteredBikeType}"/>
<Button
Command="{Binding ShowFilterBikeTypeInfoCommand}"
WidthRequest="24"
HeightRequest="24"
BackgroundColor="Transparent"
BorderWidth="0"
Padding="0"
Margin="5,0,0,0">
<Button.ImageSource>
<FontImageSource
Glyph="{StaticResource InfoCircle}"
Color="DimGray"
FontFamily="FA-S"
Size="20"/>
</Button.ImageSource>
</Button>
</StackLayout>
<StackLayout <Grid
Padding="20"> RowDefinitions="Auto,Auto"
ColumnDefinitions="*,Auto">
<Label Text="{x:Static resources:AppResources.MarkingFindBikeLabel}" <!--Search bike-->
Margin="0,0,0,-5"> <Label
<Label.Triggers> Grid.Column="0"
<DataTrigger Grid.ColumnSpan="2"
TargetType="Label" Grid.Row="0"
Binding="{Binding Source={x:Reference FindBikeEntry}, Path=Text, TargetNullValue=''}" Text="{x:Static resources:AppResources.MarkingFindBikeLabel}"
Value=""> Margin="0,5,0,-5">
<Setter Property="IsVisible" Value="False" />
</DataTrigger>
</Label.Triggers>
</Label> </Label>
<Entry <Entry
Grid.Column="0"
Grid.Row="1"
x:Name="FindBikeEntry" x:Name="FindBikeEntry"
Placeholder="{x:Static resources:AppResources.PlaceholderFindBike}" Placeholder="{x:Static resources:AppResources.PlaceholderFindBike}"
MaxLength="10" MaxLength="10"
CursorPosition="0" CursorPosition="0"
Text="{Binding BikeIdUserInput}"/> Text="{Binding BikeIdUserInput, Mode=TwoWay}"/>
<Button <Button
Text="{x:Static resources:AppResources.MarkingSearchBike}" Grid.Column="1"
Grid.Row="1"
WidthRequest="100"
Text="{x:Static resources:AppResources.MarkingFindBikeButton}"
IsEnabled="{Binding IsSelectBikeEnabled}" IsEnabled="{Binding IsSelectBikeEnabled}"
Command="{Binding OnSelectBikeRequest}"/> Command="{Binding OnSelectBikeRequest}"/>
</StackLayout> </Grid>
</Frame> <!--Line-->
<BoxView
<!-- Bike --> HeightRequest="1"
<StackLayout WidthRequest="400"
Spacing="0" HorizontalOptions="Center"
IsVisible="{Binding IsBikesListVisible}" Color="{DynamicResource primary-back-title-color}"/>
Orientation="Vertical">
<!--Hint for Outdated Data.-->
<sharedGui:HintForRefreshingPageView/>
<ListView
x:Name="FindBikeListView"
SelectionMode="None"
SelectedItem="{Binding SelectedBike}"
IsEnabled="{Binding IsIdle}"
HasUnevenRows="True"
SeparatorVisibility="None"
ItemTemplate="{StaticResource bikeTemplateSelector}"
IsPullToRefreshEnabled="True"
RefreshCommand="{Binding RefreshCommand}"
IsRefreshing="{Binding IsRefreshing}"/>
</StackLayout> </StackLayout>
<!--No Network Connection-->
<sharedGui:NotConnectedToNetView/>
<!--Bike data-->
<Grid
RowDefinitions="Auto,Auto"
RowSpacing="0">
<!--Hint for Outdated Data.-->
<sharedGui:HintForRefreshingPageView
Grid.Row="0"/>
<!--Bike-->
<ListView
Grid.Row="1"
x:Name="FindBikeListView"
SelectionMode="None"
SelectedItem="{Binding SelectedBike}"
IsEnabled="{Binding IsIdle}"
HasUnevenRows="True"
SeparatorVisibility="None"
ItemTemplate="{StaticResource bikeTemplateSelector}"
IsPullToRefreshEnabled="True"
RefreshCommand="{Binding RefreshCommand}"
IsRefreshing="{Binding IsRefreshing}"/>
</Grid>
</StackLayout> </StackLayout>
<!--Info text--> <!--Info text-->

View file

@ -2,6 +2,7 @@
<ContentPage xmlns="http://xamarin.com/schemas/2014/forms" <ContentPage xmlns="http://xamarin.com/schemas/2014/forms"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml" xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
xmlns:resources="clr-namespace:TINK.MultilingualResources;assembly=TINKLib" xmlns:resources="clr-namespace:TINK.MultilingualResources;assembly=TINKLib"
xmlns:conv="clr-namespace:TINK.View"
xmlns:sharedGui="clr-namespace:ShareeSharedGuiLib.View" xmlns:sharedGui="clr-namespace:ShareeSharedGuiLib.View"
x:Class="TINK.View.Login.LoginPage" x:Class="TINK.View.Login.LoginPage"
BackgroundColor="{DynamicResource background-color}"> BackgroundColor="{DynamicResource background-color}">
@ -14,118 +15,137 @@
</Grid> </Grid>
</Shell.TitleView> </Shell.TitleView>
<StackLayout> <ContentPage.Resources>
<conv:BoolInverterConverter x:Key="BoolInverterConverter"/>
</ContentPage.Resources>
<Frame <ContentPage.Content>
Padding="10"
Margin="0,10,0,5" <!--Grid for content and Running process in same row-->
HorizontalOptions="FillAndExpand" <Grid>
BackgroundColor="White">
<StackLayout <StackLayout
x:Name="LoginPageView" Grid.Row="0">
Padding="10">
<Label <Frame
Text="{x:Static resources:AppResources.MarkingLoginEmailAddressLabel}" Padding="10"
Margin="0,0,0,-5"> Margin="0,10,0,5"
<Label.Triggers> HorizontalOptions="FillAndExpand"
<DataTrigger BackgroundColor="White">
TargetType="Label"
Binding="{Binding Source={x:Reference EMailEntry}, Path=Text, TargetNullValue=''}"
Value="">
<Setter
Property="IsVisible"
Value="False" />
</DataTrigger>
</Label.Triggers>
</Label>
<Entry <StackLayout
Placeholder="{x:Static resources:AppResources.MarkingLoginEmailAddressPlaceholder}" x:Name="LoginPageView"
Keyboard="Email" Padding="10">
AutomationId="mail_address_text"
x:Name="EMailEntry"
Text="{Binding MailAddress}"
IsEnabled="{Binding IsLoggedOut}"/>
<Label <Label
Text="{x:Static resources:AppResources.MarkingLoginPasswordPlaceholder}" Text="{x:Static resources:AppResources.MarkingLoginEmailAddressLabel}"
Margin="0,0,0,-5"> Margin="0,0,0,-5">
<Label.Triggers> <Label.Triggers>
<DataTrigger <DataTrigger
TargetType="Label" TargetType="Label"
Binding="{Binding Source={x:Reference PasswordEntry}, Path=Text, TargetNullValue=''}" Binding="{Binding Source={x:Reference EMailEntry}, Path=Text, TargetNullValue=''}"
Value=""> Value="">
<Setter <Setter
Property="IsVisible" Property="IsVisible"
Value="False" /> Value="False" />
</DataTrigger> </DataTrigger>
</Label.Triggers> </Label.Triggers>
</Label> </Label>
<sharedGui:TogglePasswordEntry <Entry
Placeholder="{x:Static resources:AppResources.MarkingLoginPasswordPlaceholder}" Placeholder="{x:Static resources:AppResources.MarkingLoginEmailAddressPlaceholder}"
Text="{Binding Password}" Keyboard="Email"
HidePassword="True" AutomationId="mail_address_text"
AutomationId="password_text" x:Name="EMailEntry"
x:Name="PasswordEntry" Text="{Binding MailAddress}"
IsEnabled="{Binding IsLoggedOut}"/> IsEnabled="{Binding IsLoggedOut}"/>
<Label <Label
Text="{x:Static resources:AppResources.MarkingLoginPasswordLabel}" Text="{x:Static resources:AppResources.MarkingLoginPasswordPlaceholder}"
HorizontalOptions="End" Margin="0,0,0,-5">
Margin="0,-10,0,5" <Label.Triggers>
FontSize="Small"> <DataTrigger
<Label.Triggers> TargetType="Label"
<DataTrigger Binding="{Binding Source={x:Reference PasswordEntry}, Path=Text, TargetNullValue=''}"
TargetType="Label" Value="">
Binding="{Binding Source={x:Reference PasswordEntry}, Path=Text, TargetNullValue=''}" <Setter
Value=""> Property="IsVisible"
<Setter Value="False" />
Property="IsVisible" </DataTrigger>
Value="False" /> </Label.Triggers>
</DataTrigger> </Label>
</Label.Triggers>
</Label>
<Button <sharedGui:TogglePasswordEntry
Text="{x:Static resources:AppResources.ActionLoginLogin}" Placeholder="{x:Static resources:AppResources.MarkingLoginPasswordPlaceholder}"
AutomationId="login_button" Text="{Binding Password}"
Command="{Binding OnLoginRequest}" HidePassword="True"
IsEnabled="{Binding IsLoginRequestAllowed}"> AutomationId="password_text"
</Button> x:Name="PasswordEntry"
IsEnabled="{Binding IsLoggedOut}"/>
<Button <Label
Style="{StaticResource SecondaryButton}" Text="{x:Static resources:AppResources.MarkingLoginPasswordLabel}"
Text="{x:Static resources:AppResources.ActionLoginRegister}" HorizontalOptions="End"
AutomationId="register_button" Margin="0,-10,0,5"
Command="{Binding OnRegisterRequest}" FontSize="Small">
IsVisible="{Binding IsWebViewElementsVisible}"> <Label.Triggers>
</Button> <DataTrigger
TargetType="Label"
Binding="{Binding Source={x:Reference PasswordEntry}, Path=Text, TargetNullValue=''}"
Value="">
<Setter
Property="IsVisible"
Value="False" />
</DataTrigger>
</Label.Triggers>
</Label>
<Label <Button
IsVisible="{Binding IsRegisterTargetsInfoVisible}" Text="{x:Static resources:AppResources.ActionLoginLogin}"
FormattedText="{Binding RegisterTargetsInfo}"> AutomationId="login_button"
</Label> Command="{Binding OnLoginRequest}"
IsEnabled="{Binding IsLoginRequestAllowed}">
</Button>
<Label <Button
Margin="0,10,0,0" Style="{StaticResource SecondaryButton}"
TextType="Html" Text="{x:Static resources:AppResources.ActionLoginRegister}"
AutomationId="password_forgotten_button" AutomationId="register_button"
HorizontalOptions="Center" Command="{Binding OnRegisterRequest}"
TextColor="{DynamicResource primary-back-title-color}" IsVisible="{Binding IsWebViewElementsVisible}">
Text="{x:Static resources:AppResources.ActionLoginPasswordForgotten}"> </Button>
<Label.GestureRecognizers>
<TapGestureRecognizer
Command="{Binding OnPasswordForgottonRequest}"/>
</Label.GestureRecognizers>
</Label>
</StackLayout> <Label
IsVisible="{Binding IsRegisterTargetsInfoVisible}"
FormattedText="{Binding RegisterTargetsInfo}">
</Label>
</Frame> <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>
</StackLayout>
</Frame>
</StackLayout>
<!--While process is running-->
<sharedGui:RunningProcessView
IsVisible="{Binding IsIdle, Converter={StaticResource BoolInverterConverter}}"
Grid.Row="0"/>
</Grid>
</ContentPage.Content>
</StackLayout>
</ContentPage> </ContentPage>

View file

@ -1,4 +1,4 @@
using System; using System;
using System.Threading.Tasks; using System.Threading.Tasks;
using TINK.Model.Bikes.BikeInfoNS.DriveNS.BatteryNS; using TINK.Model.Bikes.BikeInfoNS.DriveNS.BatteryNS;
using TINK.Model.Device; using TINK.Model.Device;
@ -18,18 +18,22 @@ namespace TINK.View.Login
public partial class LoginPage : ContentPage, IViewService public partial class LoginPage : ContentPage, IViewService
#endif #endif
{ {
/// <summary> Reference to view model. </summary>
LoginPageViewModel m_oViewModel = null;
/// <summary> Constructs a login page. </summary>
public LoginPage() public LoginPage()
{ {
InitializeComponent(); InitializeComponent();
var l_oModel = App.ModelRoot; var l_oModel = App.ModelRoot;
#if !BACKSTYLE #if !BACKSTYLE
var l_oViewModel = new LoginPageViewModel( m_oViewModel = new LoginPageViewModel(
l_oModel, l_oModel,
(url) => DependencyService.Get<IExternalBrowserService>().OpenUrl(url), (url) => DependencyService.Get<IExternalBrowserService>().OpenUrl(url),
this); this);
LoginPageView.BindingContext = l_oViewModel; BindingContext = m_oViewModel;
#else #else
LoginPageView.BindingContext = new LoginPageViewModel(l_oModel.ActiveUser, this, Navigation); LoginPageView.BindingContext = new LoginPageViewModel(l_oModel.ActiveUser, this, Navigation);
#endif #endif
@ -120,4 +124,4 @@ namespace TINK.View.Login
public async Task<IUserFeedback> DisplayUserFeedbackPopup(IBattery battery = null, string co2Saving = null) => throw new NotSupportedException(); public async Task<IUserFeedback> DisplayUserFeedbackPopup(IBattery battery = null, string co2Saving = null) => throw new NotSupportedException();
#endif #endif
} }
} }

View file

@ -44,34 +44,36 @@
<!--No Network Connection--> <!--No Network Connection-->
<sharedGui:NotConnectedToNetView/> <sharedGui:NotConnectedToNetView/>
<!--Bike(s)--> <!--Bike data-->
<StackLayout <Grid
Spacing="0" RowDefinitions="Auto,1*"
IsVisible="{Binding IsBikesListVisible}" RowSpacing="0">
Orientation="Vertical">
<!--Hint for Outdated Data.--> <!--Hint for Outdated Data.-->
<sharedGui:HintForRefreshingPageView/> <sharedGui:HintForRefreshingPageView
Grid.Row="0"/>
<!--No Bikes-->
<Label
Grid.Row="1"
Margin="20"
IsVisible="{Binding IsNoBikesOccupiedVisible}"
Text="{Binding NoBikesOccupiedText}"/>
<!--Bike(s)-->
<ListView <ListView
x:Name="MyBikesListView" Grid.Row="1"
SelectionMode="None" x:Name="MyBikesListView"
SelectedItem="{Binding SelectedBike}" SelectionMode="None"
IsEnabled="{Binding IsIdle}" SelectedItem="{Binding SelectedBike}"
HasUnevenRows="True" IsEnabled="{Binding IsIdle}"
SeparatorVisibility="None" HasUnevenRows="True"
ItemTemplate="{StaticResource bikeTemplateSelector}" SeparatorVisibility="None"
IsPullToRefreshEnabled="True" ItemTemplate="{StaticResource bikeTemplateSelector}"
RefreshCommand="{Binding RefreshCommand}" IsPullToRefreshEnabled="True"
IsRefreshing="{Binding IsRefreshing}"/> RefreshCommand="{Binding RefreshCommand}"
IsRefreshing="{Binding IsRefreshing}"/>
</StackLayout> </Grid>
<!--No Bikes-->
<Label
Margin="20"
IsVisible="{Binding IsNoBikesOccupiedVisible}"
Text="{Binding NoBikesOccupiedText}"/>
</StackLayout> </StackLayout>

View file

@ -33,7 +33,8 @@
<ScrollView> <ScrollView>
<StackLayout> <StackLayout
Spacing="0">
<Frame <Frame
Padding="10" Padding="10"

View file

@ -18,6 +18,7 @@
VerticalOptions="FillAndExpand" VerticalOptions="FillAndExpand"
BackgroundColor="Gray" BackgroundColor="Gray"
Opacity=".80" Opacity=".80"
HasShadow="False"
CornerRadius="0"/> CornerRadius="0"/>
<!--Show spinner and info text--> <!--Show spinner and info text-->
@ -29,6 +30,7 @@
VerticalOptions="Center" VerticalOptions="Center"
BackgroundColor="White" BackgroundColor="White"
Padding="10" Padding="10"
HasShadow="False"
CornerRadius="10"> CornerRadius="10">
<StackLayout Orientation="Vertical"> <StackLayout Orientation="Vertical">

View file

@ -1,6 +1,6 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android" android:installLocation="internalOnly" package="com.hauffware.sharee" android:versionName="3.0.365" android:versionCode="365"> <manifest xmlns:android="http://schemas.android.com/apk/res/android" android:installLocation="internalOnly" package="com.hauffware.sharee" android:versionName="3.0.369" android:versionCode="369">
<uses-sdk android:minSdkVersion="19" android:targetSdkVersion="31" /> <uses-sdk android:minSdkVersion="19" android:targetSdkVersion="33" />
<!-- Google Maps related permissions --> <!-- Google Maps related permissions -->
<!-- Permission to receive remote notifications from Google Play Services --> <!-- Permission to receive remote notifications from Google Play Services -->
<!-- Notice here that we have the package name of our application as a prefix on the permissions. --> <!-- Notice here that we have the package name of our application as a prefix on the permissions. -->
@ -9,14 +9,11 @@
<!-- Access Google based webservices --> <!-- Access Google based webservices -->
<!-- External storage for caching. --> <!-- External storage for caching. -->
<!-- My Location --> <!-- My Location -->
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/> <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/> <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.BLUETOOTH" <uses-permission android:name="android.permission.BLUETOOTH" android:maxSdkVersion="30" />
android:maxSdkVersion="30" /> <uses-permission android:name="android.permission.BLUETOOTH_ADMIN" android:maxSdkVersion="30" />
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN" <uses-permission android:name="android.permission.BLUETOOTH_SCAN" android:usesPermissionFlags="neverForLocation" />
android:maxSdkVersion="30" />
<uses-permission android:name="android.permission.BLUETOOTH_SCAN"
android:usesPermissionFlags="neverForLocation" />
<uses-permission android:name="android.permission.BLUETOOTH_CONNECT" /> <uses-permission android:name="android.permission.BLUETOOTH_CONNECT" />
<uses-feature android:name="android.hardware.location" android:required="false" /> <uses-feature android:name="android.hardware.location" android:required="false" />
<uses-feature android:name="android.hardware.location.gps" android:required="false" /> <uses-feature android:name="android.hardware.location.gps" android:required="false" />

File diff suppressed because it is too large Load diff

View file

@ -16,7 +16,7 @@
<AndroidResgenFile>Resources\Resource.Designer.cs</AndroidResgenFile> <AndroidResgenFile>Resources\Resource.Designer.cs</AndroidResgenFile>
<GenerateSerializationAssemblies>Off</GenerateSerializationAssemblies> <GenerateSerializationAssemblies>Off</GenerateSerializationAssemblies>
<AndroidManifest>Properties\AndroidManifest.xml</AndroidManifest> <AndroidManifest>Properties\AndroidManifest.xml</AndroidManifest>
<TargetFrameworkVersion>v12.0</TargetFrameworkVersion> <TargetFrameworkVersion>v13.0</TargetFrameworkVersion>
<AndroidStoreUncompressedFileExtensions /> <AndroidStoreUncompressedFileExtensions />
<MandroidI18n /> <MandroidI18n />
<JavaMaximumHeapSize>2G</JavaMaximumHeapSize> <JavaMaximumHeapSize>2G</JavaMaximumHeapSize>
@ -77,7 +77,7 @@
</PropertyGroup> </PropertyGroup>
<ItemGroup> <ItemGroup>
<PackageReference Include="Microsoft.CSharp" Version="4.7.0" /> <PackageReference Include="Microsoft.CSharp" Version="4.7.0" />
<PackageReference Include="Microsoft.NETCore.Platforms" Version="7.0.1" /> <PackageReference Include="Microsoft.NETCore.Platforms" Version="7.0.3" />
<PackageReference Include="Microsoft.Win32.Primitives" Version="4.3.0" /> <PackageReference Include="Microsoft.Win32.Primitives" Version="4.3.0" />
<PackageReference Include="MonkeyCache"> <PackageReference Include="MonkeyCache">
<Version>1.6.3</Version> <Version>1.6.3</Version>
@ -97,7 +97,7 @@
<Version>6.3.0.19</Version> <Version>6.3.0.19</Version>
</PackageReference> </PackageReference>
<PackageReference Include="Serilog"> <PackageReference Include="Serilog">
<Version>2.12.0</Version> <Version>3.0.1</Version>
</PackageReference> </PackageReference>
<PackageReference Include="Serilog.Sinks.File" Version="5.0.0" /> <PackageReference Include="Serilog.Sinks.File" Version="5.0.0" />
<PackageReference Include="Serilog.Sinks.Xamarin" Version="1.0.0" /> <PackageReference Include="Serilog.Sinks.Xamarin" Version="1.0.0" />
@ -176,24 +176,24 @@
<PackageReference Include="Xamarin.Android.Support.v7.RecyclerView" Version="28.0.0.3" /> <PackageReference Include="Xamarin.Android.Support.v7.RecyclerView" Version="28.0.0.3" />
<PackageReference Include="Xamarin.Android.Support.Vector.Drawable" Version="28.0.0.3" /> <PackageReference Include="Xamarin.Android.Support.Vector.Drawable" Version="28.0.0.3" />
<PackageReference Include="Xamarin.AndroidX.Core"> <PackageReference Include="Xamarin.AndroidX.Core">
<Version>1.9.0.2</Version> <Version>1.10.1.1</Version>
</PackageReference> </PackageReference>
<PackageReference Include="Xamarin.AndroidX.MediaRouter"> <PackageReference Include="Xamarin.AndroidX.MediaRouter">
<Version>1.3.1.2</Version> <Version>1.4.0.1</Version>
</PackageReference> </PackageReference>
<PackageReference Include="Xamarin.AndroidX.Palette"> <PackageReference Include="Xamarin.AndroidX.Palette">
<Version>1.0.0.16</Version> <Version>1.0.0.18</Version>
</PackageReference> </PackageReference>
<PackageReference Include="Xamarin.AndroidX.RecyclerView"> <PackageReference Include="Xamarin.AndroidX.RecyclerView">
<Version>1.3.0</Version> <Version>1.3.0.2</Version>
</PackageReference> </PackageReference>
<PackageReference Include="Xamarin.Auth" Version="1.7.0" /> <PackageReference Include="Xamarin.Auth" Version="1.7.0" />
<PackageReference Include="Xamarin.Build.Download" Version="0.11.4" /> <PackageReference Include="Xamarin.Build.Download" Version="0.11.4" />
<PackageReference Include="Xamarin.CommunityToolkit"> <PackageReference Include="Xamarin.CommunityToolkit">
<Version>2.0.5</Version> <Version>2.0.6</Version>
</PackageReference> </PackageReference>
<PackageReference Include="Xamarin.Essentials"> <PackageReference Include="Xamarin.Essentials">
<Version>1.7.5</Version> <Version>1.7.7</Version>
</PackageReference> </PackageReference>
<PackageReference Include="Xamarin.Forms" Version="5.0.0.2578" /> <PackageReference Include="Xamarin.Forms" Version="5.0.0.2578" />
<PackageReference Include="Xamarin.Forms.AppLinks"> <PackageReference Include="Xamarin.Forms.AppLinks">
@ -203,10 +203,10 @@
<Version>5.0.0</Version> <Version>5.0.0</Version>
</PackageReference> </PackageReference>
<PackageReference Include="Xamarin.Forms.GoogleMaps.Bindings" Version="3.0.0" /> <PackageReference Include="Xamarin.Forms.GoogleMaps.Bindings" Version="3.0.0" />
<PackageReference Include="Xamarin.GooglePlayServices.Base" Version="118.1.0.1" /> <PackageReference Include="Xamarin.GooglePlayServices.Base" Version="118.2.0.1" />
<PackageReference Include="Xamarin.GooglePlayServices.Basement" Version="118.1.0.2" /> <PackageReference Include="Xamarin.GooglePlayServices.Basement" Version="118.2.0.1" />
<PackageReference Include="Xamarin.GooglePlayServices.Maps" Version="118.1.0.1" /> <PackageReference Include="Xamarin.GooglePlayServices.Maps" Version="118.1.0.2" />
<PackageReference Include="Xamarin.GooglePlayServices.Tasks" Version="118.0.2.1" /> <PackageReference Include="Xamarin.GooglePlayServices.Tasks" Version="118.0.2.2" />
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<Reference Include="Mono.Android" /> <Reference Include="Mono.Android" />

View file

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

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.7 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 18 KiB

View file

@ -121,7 +121,7 @@
<ItemGroup> <ItemGroup>
<PackageReference Include="Microsoft.Bcl.Build" Version="1.0.21" /> <PackageReference Include="Microsoft.Bcl.Build" Version="1.0.21" />
<PackageReference Include="Microsoft.CSharp" Version="4.7.0" /> <PackageReference Include="Microsoft.CSharp" Version="4.7.0" />
<PackageReference Include="Microsoft.NETCore.Platforms" Version="7.0.1" /> <PackageReference Include="Microsoft.NETCore.Platforms" Version="7.0.3" />
<PackageReference Include="Microsoft.Win32.Primitives" Version="4.3.0" /> <PackageReference Include="Microsoft.Win32.Primitives" Version="4.3.0" />
<PackageReference Include="MonkeyCache"> <PackageReference Include="MonkeyCache">
<Version>1.6.3</Version> <Version>1.6.3</Version>
@ -137,7 +137,7 @@
<Version>6.3.0.19</Version> <Version>6.3.0.19</Version>
</PackageReference> </PackageReference>
<PackageReference Include="Serilog"> <PackageReference Include="Serilog">
<Version>2.12.0</Version> <Version>3.0.1</Version>
</PackageReference> </PackageReference>
<PackageReference Include="Serilog.Sinks.File" Version="5.0.0" /> <PackageReference Include="Serilog.Sinks.File" Version="5.0.0" />
<PackageReference Include="Serilog.Sinks.Xamarin" Version="1.0.0" /> <PackageReference Include="Serilog.Sinks.Xamarin" Version="1.0.0" />
@ -198,10 +198,10 @@
<PackageReference Include="Xamarin.Auth" Version="1.7.0" /> <PackageReference Include="Xamarin.Auth" Version="1.7.0" />
<PackageReference Include="Xamarin.Build.Download" Version="0.11.4" /> <PackageReference Include="Xamarin.Build.Download" Version="0.11.4" />
<PackageReference Include="Xamarin.CommunityToolkit"> <PackageReference Include="Xamarin.CommunityToolkit">
<Version>2.0.5</Version> <Version>2.0.6</Version>
</PackageReference> </PackageReference>
<PackageReference Include="Xamarin.Essentials"> <PackageReference Include="Xamarin.Essentials">
<Version>1.7.5</Version> <Version>1.7.7</Version>
</PackageReference> </PackageReference>
<PackageReference Include="Xamarin.Forms.GoogleMaps"> <PackageReference Include="Xamarin.Forms.GoogleMaps">
<Version>5.0.0</Version> <Version>5.0.0</Version>
@ -271,9 +271,6 @@
<HintPath>..\..\..\..\.nuget\packages\xamarin.google.ios.maps\2.5.0\lib\Xamarin.iOS10\Google.Maps.dll</HintPath> <HintPath>..\..\..\..\.nuget\packages\xamarin.google.ios.maps\2.5.0\lib\Xamarin.iOS10\Google.Maps.dll</HintPath>
</Reference> </Reference>
</ItemGroup> </ItemGroup>
<ItemGroup>
<BundleResource Include="Resources\tink2.png" />
</ItemGroup>
<ItemGroup> <ItemGroup>
<ProjectReference Include="..\..\LockItBLE\LockItBLE.csproj"> <ProjectReference Include="..\..\LockItBLE\LockItBLE.csproj">
<Project>{bde9ce26-15cf-47da-a4f6-b6956d02d0fc}</Project> <Project>{bde9ce26-15cf-47da-a4f6-b6956d02d0fc}</Project>

Binary file not shown.

Before

Width:  |  Height:  |  Size: 582 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 344 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 451 KiB

Binary file not shown.

Before

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

Binary file not shown.

Before

Width:  |  Height:  |  Size: 356 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 804 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 283 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 399 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 500 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 886 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 322 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.2 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 457 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 396 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.1 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 388 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 997 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 352 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 488 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 622 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.6 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 600 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 965 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 338 KiB

Binary file not shown.

Binary file not shown.

View file

@ -196,40 +196,18 @@
<Generator>MSBuild:UpdateDesignTimeXaml</Generator> <Generator>MSBuild:UpdateDesignTimeXaml</Generator>
</EmbeddedResource> </EmbeddedResource>
</ItemGroup> </ItemGroup>
<ItemGroup>
<EmbeddedResource Include="$(MSBuildThisFileDirectory)Images\trike_brake1_image.HZ17PY_678_382.png" />
</ItemGroup>
<ItemGroup> <ItemGroup>
<EmbeddedResource Include="$(MSBuildThisFileDirectory)View\Info\InfoTabbedPage.xaml"> <EmbeddedResource Include="$(MSBuildThisFileDirectory)View\Info\InfoTabbedPage.xaml">
<SubType>Designer</SubType> <SubType>Designer</SubType>
<Generator>MSBuild:UpdateDesignTimeXaml</Generator> <Generator>MSBuild:UpdateDesignTimeXaml</Generator>
</EmbeddedResource> </EmbeddedResource>
</ItemGroup> </ItemGroup>
<ItemGroup>
<EmbeddedResource Include="$(MSBuildThisFileDirectory)Images\belt1_image.4XWCQY_679_382.png" />
<EmbeddedResource Include="$(MSBuildThisFileDirectory)Images\belt2_image.X3F1PY_679_382.png" />
<EmbeddedResource Include="$(MSBuildThisFileDirectory)Images\belt3_image.DYOXPY_679_382.png" />
<EmbeddedResource Include="$(MSBuildThisFileDirectory)Images\seat1_image.ZQ65PY_680_382.png" />
<EmbeddedResource Include="$(MSBuildThisFileDirectory)Images\seat2_image.QQZCQY_679_382.png" />
<EmbeddedResource Include="$(MSBuildThisFileDirectory)Images\seat3_image.NQ5FQY_679_382.png" />
<EmbeddedResource Include="$(MSBuildThisFileDirectory)Images\trike_brake2_image.1YBAQY_679_382.png" />
<EmbeddedResource Include="$(MSBuildThisFileDirectory)Images\trike_brake3_image.FJM2PY_679_382.png" />
<EmbeddedResource Include="$(MSBuildThisFileDirectory)Images\trike_stand1_image.4HJ5PY_679_382.png" />
<EmbeddedResource Include="$(MSBuildThisFileDirectory)Images\trike_stand2_image.RIX2PY_679_382.png" />
<EmbeddedResource Include="$(MSBuildThisFileDirectory)Images\trike_stand3_image.FDR7PY_679_382.png" />
</ItemGroup>
<ItemGroup> <ItemGroup>
<EmbeddedResource Include="$(MSBuildThisFileDirectory)View\FeesAndBikes\FeesAndBikesPage.xaml"> <EmbeddedResource Include="$(MSBuildThisFileDirectory)View\FeesAndBikes\FeesAndBikesPage.xaml">
<SubType>Designer</SubType> <SubType>Designer</SubType>
<Generator>MSBuild:Compile</Generator> <Generator>MSBuild:Compile</Generator>
</EmbeddedResource> </EmbeddedResource>
</ItemGroup> </ItemGroup>
<ItemGroup>
<EmbeddedResource Include="$(MSBuildThisFileDirectory)Images\Tink2.png" />
</ItemGroup>
<ItemGroup>
<EmbeddedResource Include="$(MSBuildThisFileDirectory)Images\Konrad.png" />
</ItemGroup>
<ItemGroup> <ItemGroup>
<EmbeddedResource Include="$(MSBuildThisFileDirectory)View\WhatsNew\WhatsNewPage.xaml"> <EmbeddedResource Include="$(MSBuildThisFileDirectory)View\WhatsNew\WhatsNewPage.xaml">
<SubType>Designer</SubType> <SubType>Designer</SubType>
@ -340,4 +318,8 @@
<Generator>MSBuild:Compile</Generator> <Generator>MSBuild:Compile</Generator>
</EmbeddedResource> </EmbeddedResource>
</ItemGroup> </ItemGroup>
<ItemGroup>
<Content Include="$(MSBuildThisFileDirectory)Resources\Fonts\Roboto-Bold.ttf" />
<Content Include="$(MSBuildThisFileDirectory)Resources\Fonts\Roboto-Italic.ttf" />
</ItemGroup>
</Project> </Project>

View file

@ -3,7 +3,9 @@
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml" xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
xmlns:d="http://xamarin.com/schemas/2014/forms/design" xmlns:d="http://xamarin.com/schemas/2014/forms/design"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:resources="clr-namespace:TINK.MultilingualResources;assembly=TINKLib" xmlns:resources="clr-namespace:TINK.MultilingualResources;assembly=TINKLib"
xmlns:sharedGui="clr-namespace:ShareeSharedGuiLib.View"
xmlns:conv="clr-namespace:TINK.View"
mc:Ignorable="d" mc:Ignorable="d"
x:Class="TINK.View.Account.AccountPage" x:Class="TINK.View.Account.AccountPage"
BackgroundColor="{DynamicResource background-color}"> BackgroundColor="{DynamicResource background-color}">
@ -14,39 +16,49 @@
Text="{x:Static resources:AppResources.MarkingAccount}"/> Text="{x:Static resources:AppResources.MarkingAccount}"/>
</Grid> </Grid>
</Shell.TitleView> </Shell.TitleView>
<ContentPage.Resources>
<conv:BoolInverterConverter x:Key="BoolInverterConverter"/>
</ContentPage.Resources>
<ContentPage.Content> <ContentPage.Content>
<ScrollView> <!--Grid for content and Running process in same row-->
<Grid>
<ScrollView
Grid.Row="0">
<StackLayout> <StackLayout>
<Frame <Frame
Padding="10" Padding="10"
Margin="0,10,0,5" Margin="0,10,0,5"
HorizontalOptions="FillAndExpand" HorizontalOptions="FillAndExpand"
BackgroundColor="White"> BackgroundColor="White">
<StackLayout <StackLayout
Padding="10"> Padding="10">
<Label <Label
Text="{Binding LoggedInInfo}" /> Text="{Binding LoggedInInfo}" />
<Label <Label
IsVisible="{Binding IsBookingStateInfoVisible}" IsVisible="{Binding IsBookingStateInfoVisible}"
Text="{Binding BookingStateInfo}" /> Text="{Binding BookingStateInfo}" />
<Button <Button
Text="{x:Static resources:AppResources.MessageAccountPageManagePersonalData}" Text="{x:Static resources:AppResources.MessageAccountPageManagePersonalData}"
Command="{Binding OnManageAccount}" Command="{Binding OnManageAccount}"
IsEnabled="{Binding IsLogoutPossible}"/> IsEnabled="{Binding IsLogoutPossible}">
</Button>
<Button <Button
Style="{StaticResource SecondaryButton}" Style="{StaticResource SecondaryButton}"
Text="{x:Static resources:AppResources.MessageAccountPageManageLogout}" Text="{x:Static resources:AppResources.MessageAccountPageManageLogout}"
Command="{Binding OnLogoutRequest}" Command="{Binding OnLogoutRequest}"
IsEnabled="{Binding IsLogoutPossible}"/> IsEnabled="{Binding IsLogoutPossible}">
</Button>
</StackLayout> </StackLayout>
@ -56,6 +68,13 @@
</ScrollView> </ScrollView>
<!--While process is running-->
<sharedGui:RunningProcessView
IsVisible="{Binding IsIdle, Converter={StaticResource BoolInverterConverter}}"
Grid.Row="0"/>
</Grid>
</ContentPage.Content> </ContentPage.Content>
</ContentPage> </ContentPage>

View file

@ -31,8 +31,8 @@
<Grid <Grid
Grid.Row="0" Grid.Row="0"
RowSpacing="0" RowSpacing="0"
RowDefinitions="Auto,1*,Auto"> RowDefinitions="1*,Auto">
<StackLayout <StackLayout
Grid.Row="0" Grid.Row="0"
Spacing="0" Spacing="0"
@ -56,17 +56,17 @@
RowDefinitions="Auto" RowDefinitions="Auto"
Padding="0,0,0,5"> Padding="0,0,0,5">
<!--Station id--> <!--Station id-->
<Label <Label
Grid.Column="0" Grid.Column="0"
Grid.Row="0" Grid.Row="0"
FontSize="Small" FontSize="Small"
HorizontalOptions="Start" HorizontalOptions="Start"
TextColor="White" TextColor="White"
Text="{Binding StationDetailText}"/> Text="{Binding StationDetailText}"/>
<!--Contact to operator--> <!--Contact to operator-->
<Label <Label
Grid.Column="1" Grid.Column="1"
Grid.Row="0" Grid.Row="0"
TextType="Html" TextType="Html"
@ -74,26 +74,35 @@
HorizontalOptions="End" HorizontalOptions="End"
TextColor="White" TextColor="White"
Text="{Binding ContactSupportHintText}"> Text="{Binding ContactSupportHintText}">
<Label.GestureRecognizers> <Label.GestureRecognizers>
<TapGestureRecognizer Command="{Binding ContactSupportClickedCommand}"/> <TapGestureRecognizer Command="{Binding ContactSupportClickedCommand}"/>
</Label.GestureRecognizers> </Label.GestureRecognizers>
</Label> </Label>
</Grid> </Grid>
</StackLayout> </StackLayout>
<!--No Network Connection--> <!--If Not Connected To Internet-->
<sharedGui:NotConnectedToNetView/> <sharedGui:NotConnectedToNetView/>
<!--Bike(s)--> <!--Bike data-->
<StackLayout <Grid
IsVisible="{Binding IsBikesListVisible}" RowDefinitions="Auto,1*"
Spacing="0"> RowSpacing="0">
<!--Hint for Outdated Data.-->
<sharedGui:HintForRefreshingPageView/>
<!--Hint for Outdated Data.-->
<sharedGui:HintForRefreshingPageView
Grid.Row="0"/>
<!--No Bikes-->
<Label
Grid.Row="1"
Margin="20"
IsVisible="{Binding IsNoBikesAtStationVisible}"
Text="{Binding NoBikesAtStationText}"/>
<!--Bike(s)-->
<ListView <ListView
Grid.Row="1" Grid.Row="1"
x:Name="BikesAtStationListView" x:Name="BikesAtStationListView"
@ -106,21 +115,13 @@
IsPullToRefreshEnabled="True" IsPullToRefreshEnabled="True"
RefreshCommand="{Binding RefreshCommand}" RefreshCommand="{Binding RefreshCommand}"
IsRefreshing="{Binding IsRefreshing}"/> IsRefreshing="{Binding IsRefreshing}"/>
</Grid>
</StackLayout>
</StackLayout> </StackLayout>
<!--No Bikes-->
<Label
Grid.Row="1"
Margin="20"
IsVisible="{Binding IsNoBikesAtStationVisible}"
Text="{Binding NoBikesAtStationText}"/>
<!--Info at End of Page--> <!--Info at End of Page-->
<StackLayout <StackLayout
Grid.Row="2" Grid.Row="1"
Orientation="Vertical" Orientation="Vertical"
Spacing="0" Spacing="0"
Padding="20,0,20,0"> Padding="20,0,20,0">

View file

@ -17,105 +17,161 @@
<conv:StringNotNullOrEmptyToVisibleConverter x:Key="StringNotNullOrEmpty_Converter"/> <conv:StringNotNullOrEmptyToVisibleConverter x:Key="StringNotNullOrEmpty_Converter"/>
<conv:BoolInverterConverter x:Key="BoolInvert_Converter"/> <conv:BoolInverterConverter x:Key="BoolInvert_Converter"/>
</ContentPage.Resources> </ContentPage.Resources>
<ContentPage.Content>
<ScrollView> <ContentPage.Content>
<StackLayout <Grid
x:Name="ContactPageView"> x:Name="ContactPageView"
RowSpacing="0"
RowDefinitions="1*,Auto">
<!-- Contact Support -->
<Frame <Frame
Padding="10" Grid.Row="0"
Margin="0,10,0,5" Padding="10"
HorizontalOptions="FillAndExpand" Margin="0,10,0,5"
BackgroundColor="White"> HorizontalOptions="FillAndExpand"
VerticalOptions="Start"
BackgroundColor="White"
HasShadow="False">
<StackLayout <StackLayout
Padding="10"> Padding="20">
<!-- Button to select station and explanation text --> <!--Title Customer Support-->
<Label
Text="{x:Static resources:AppResources.MarkingContactCustomerSupportTitle}"
FontAttributes="Bold"
FontSize="Large"
/>
<!--No station selected-->
<StackLayout <StackLayout
IsVisible="{Binding Path=IsOperatorInfoAvaliable, Converter={StaticResource BoolInvert_Converter}}"> IsVisible="{Binding Path=IsOperatorInfoAvaliable, Converter={StaticResource BoolInvert_Converter}}">
<Label <Label
TextType="Html" TextType="Html"
Text="{x:Static resources:AppResources.MarkingContactNoStationInfoAvailableNoButton}"/> Text="{x:Static resources:AppResources.MarkingContactNoStationInfoAvailableNoButton}"/>
<Button <Button
Text="{x:Static resources:AppResources.ActionSelectStation}" Text="{x:Static resources:AppResources.ActionSelectStation}"
Command="{Binding OnSelectStationRequest}"/> Command="{Binding OnSelectStationRequest}"/>
</StackLayout> </StackLayout>
<!-- Contact operator --> <!--Contact operator of selected station-->
<StackLayout <StackLayout
IsVisible="{Binding IsOperatorInfoAvaliable}"> IsVisible="{Binding IsOperatorInfoAvaliable}">
<!--- Name of operator --> <!-- info about selected station -->
<Label <StackLayout
IsVisible="{Binding IsOperatorInfoAvaliable}" Spacing="0">
HorizontalOptions="Center"
FontAttributes="Bold"
Text="{Binding ProviderNameText}"/>
<!--- Mail to operator --> <StackLayout
<Label Orientation="Horizontal"
IsVisible="{Binding MailAddressText, Converter={StaticResource StringNotNullOrEmpty_Converter}}" Spacing="0">
FormattedText="{Binding MailAddressAndMotivationsText}"/> <Label
<Button Text="{x:Static resources:AppResources.MarkingLastSelectedStation}"/>
x:Name="MailAddressButton" <Label
IsVisible="{Binding MailAddressText, Converter={StaticResource StringNotNullOrEmpty_Converter}}" Text=": "/>
Text="{Binding MailAddressText}" </StackLayout>
IsEnabled="{Binding IsSendMailAvailable}"
Command="{Binding OnMailToOperatorRequest}"/>
<!--- Phone to operator --> <!-- Station -->
<Label <StackLayout
IsVisible="{Binding PhoneNumberText, Converter={StaticResource StringNotNullOrEmpty_Converter}}" Orientation="Horizontal"
FormattedText="{Binding PhoneContactText}"/> Spacing="0">
<Label
Text="{Binding SelectedStationName}"/>
<Label
Text=": "/>
<Label
FontAttributes="Bold"
Text="{Binding SelectedStationId}"/>
</StackLayout>
<Button <!--- Operator -->
<StackLayout
Orientation="Horizontal"
Spacing="0">
<Label
Text="{x:Static resources:AppResources.MarkingOperator}"/>
<Label
Text=": "/>
<Label
FontAttributes="Bold"
Text="{Binding ProviderNameText}"/>
</StackLayout>
</StackLayout>
<!--Buttons-->
<StackLayout
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}"/>
<!--- Mail to operator -->
<Button
Style="{StaticResource SecondaryButton}" Style="{StaticResource SecondaryButton}"
x:Name="PhoneNumberButton" x:Name="MailAddressButton"
IsVisible="{Binding PhoneNumberText, Converter={StaticResource StringNotNullOrEmpty_Converter}}" IsVisible="{Binding MailAddressText, Converter={StaticResource StringNotNullOrEmpty_Converter}}"
Text="{Binding PhoneNumberText}" Text="{Binding MailAddressText}"
IsEnabled="{Binding IsDoPhoncallAvailable}" IsEnabled="{Binding IsSendMailAvailable}"
Command="{Binding OnPhoneRequest}"/> Command="{Binding OnMailToOperatorRequest}"/>
<!-- Change selected Station-->
<Button
Style="{StaticResource NoOutlineButton}"
Text="{x:Static resources:AppResources.ActionSelectAnotherStation}"
Command="{Binding OnSelectStationRequest}"/>
</StackLayout>
</StackLayout> </StackLayout>
</StackLayout> </StackLayout>
</Frame> </Frame>
<Frame
<!--- Contact app-developer -->
<StackLayout
Grid.Row="1"
Padding="10" Padding="10"
Margin="0,5,0,5" Margin="0,0,0,10"
HorizontalOptions="FillAndExpand" VerticalOptions="End"
BackgroundColor="White"> Spacing="0">
<!--- Contact app-developer --> <BoxView
<StackLayout Margin="0,0,0,10"
Padding="10"> HeightRequest="1"
WidthRequest="400"
HorizontalOptions="Center"
Color="DimGray"/>
<Label <Label
FormattedText="{Binding LikeTinkApp}"/> TextType="Html"
HorizontalOptions="Center"
TextColor="{DynamicResource primary-back-title-color}"
Text="{x:Static resources:AppResources.ActionSendDiagnosis}"
IsEnabled="{Binding IsSendMailAvailable}">
<Label.GestureRecognizers>
<TapGestureRecognizer
Command="{Binding OnMailAppRelatedRequest}"/>
</Label.GestureRecognizers>
</Label>
<!--- Mail to app-developer --> </StackLayout>
<Button
Style="{StaticResource SecondaryButton}"
Text="{x:Static resources:AppResources.ActionContactMailAppReleated}"
IsEnabled="{Binding IsSendMailAvailable}"
Command="{Binding OnMailAppRelatedRequest}"/>
</StackLayout> </Grid>
</Frame>
</StackLayout> </ContentPage.Content>
</ScrollView>
</ContentPage.Content>
</ContentPage> </ContentPage>

View file

@ -3,6 +3,7 @@
xmlns="http://xamarin.com/schemas/2014/forms" xmlns="http://xamarin.com/schemas/2014/forms"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml" xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
x:Class="TINK.View.FindBike.FindBikePage" x:Class="TINK.View.FindBike.FindBikePage"
xmlns:conv="clr-namespace:TINK.View"
xmlns:resources="clr-namespace:TINK.MultilingualResources;assembly=TINKLib" xmlns:resources="clr-namespace:TINK.MultilingualResources;assembly=TINKLib"
xmlns:local_bike="clr-namespace:TINK.View.Bike" xmlns:local_bike="clr-namespace:TINK.View.Bike"
xmlns:sharedGui="clr-namespace:ShareeSharedGuiLib.View" xmlns:sharedGui="clr-namespace:ShareeSharedGuiLib.View"
@ -18,6 +19,7 @@
<ContentPage.Resources> <ContentPage.Resources>
<ResourceDictionary> <ResourceDictionary>
<local_bike:BikeViewCellTemplateSelector x:Key="bikeTemplateSelector"/> <local_bike:BikeViewCellTemplateSelector x:Key="bikeTemplateSelector"/>
<conv:StringNotNullOrEmptyToVisibleConverter x:Key="Label_Converter"/>
</ResourceDictionary> </ResourceDictionary>
</ContentPage.Resources> </ContentPage.Resources>
@ -26,80 +28,88 @@
<!--Grid for Bike(s) view and Running process in same row--> <!--Grid for Bike(s) view and Running process in same row-->
<Grid> <Grid>
<!-- Grid for Content -->
<Grid <Grid
RowDefinitions="1*,Auto" RowDefinitions="1*,Auto"
RowSpacing="0" RowSpacing="0"
Grid.Row="0"> Grid.Row="0">
<StackLayout <StackLayout
Grid.Row="0" Grid.Row="0"
Spacing="0" Spacing="0"
Orientation="Vertical"> Orientation="Vertical">
<!--No Network Connection--> <StackLayout
<sharedGui:NotConnectedToNetView/> BackgroundColor="White"
Padding="20,0,20,0">
<!--Search bike--> <Grid
<Frame RowDefinitions="Auto,Auto"
Padding="10" ColumnDefinitions="*,Auto">
Margin="0,10,0,5"
IsVisible="{Binding IsSelectBikeVisible}"
HorizontalOptions="FillAndExpand"
BackgroundColor="White">
<StackLayout <!--Search bike-->
Padding="20"> <Label
Grid.Column="0"
<Label Text="{x:Static resources:AppResources.MarkingFindBikeLabel}" Grid.ColumnSpan="2"
Margin="0,0,0,-5"> Grid.Row="0"
<Label.Triggers> Text="{x:Static resources:AppResources.MarkingFindBikeLabel}"
<DataTrigger Margin="0,5,0,-5">
TargetType="Label"
Binding="{Binding Source={x:Reference FindBikeEntry}, Path=Text, TargetNullValue=''}"
Value="">
<Setter Property="IsVisible" Value="False" />
</DataTrigger>
</Label.Triggers>
</Label> </Label>
<Entry <Entry
Grid.Column="0"
Grid.Row="1"
x:Name="FindBikeEntry" x:Name="FindBikeEntry"
Placeholder="{x:Static resources:AppResources.PlaceholderFindBike}" Placeholder="{x:Static resources:AppResources.PlaceholderFindBike}"
MaxLength="10" MaxLength="10"
CursorPosition="0" CursorPosition="0"
Text="{Binding BikeIdUserInput}"/> Text="{Binding BikeIdUserInput, Mode=TwoWay}"/>
<Button <Button
Text="{x:Static resources:AppResources.MarkingSearchBike}" Grid.Column="1"
Grid.Row="1"
WidthRequest="100"
Text="{x:Static resources:AppResources.MarkingFindBikeButton}"
IsEnabled="{Binding IsSelectBikeEnabled}" IsEnabled="{Binding IsSelectBikeEnabled}"
Command="{Binding OnSelectBikeRequest}"/> Command="{Binding OnSelectBikeRequest}"/>
</StackLayout> </Grid>
</Frame> <!--Line-->
<BoxView
HeightRequest="1"
WidthRequest="400"
HorizontalOptions="Center"
Color="{DynamicResource primary-back-title-color}"/>
<!-- Bike --> </StackLayout>
<StackLayout
Spacing="0" <!--No Network Connection-->
IsVisible="{Binding IsBikesListVisible}" <sharedGui:NotConnectedToNetView/>
Orientation="Vertical">
<!--Bike data-->
<Grid
RowDefinitions="Auto,Auto"
RowSpacing="0">
<!--Hint for Outdated Data.--> <!--Hint for Outdated Data.-->
<sharedGui:HintForRefreshingPageView/> <sharedGui:HintForRefreshingPageView
Grid.Row="0"/>
<!--Bike-->
<ListView
Grid.Row="1"
x:Name="FindBikeListView"
SelectionMode="None"
SelectedItem="{Binding SelectedBike}"
IsEnabled="{Binding IsIdle}"
HasUnevenRows="True"
SeparatorVisibility="None"
ItemTemplate="{StaticResource bikeTemplateSelector}"
IsPullToRefreshEnabled="True"
RefreshCommand="{Binding RefreshCommand}"
IsRefreshing="{Binding IsRefreshing}"/>
</Grid>
<ListView
x:Name="FindBikeListView"
SelectionMode="None"
SelectedItem="{Binding SelectedBike}"
IsEnabled="{Binding IsIdle}"
HasUnevenRows="True"
SeparatorVisibility="None"
ItemTemplate="{StaticResource bikeTemplateSelector}"
IsPullToRefreshEnabled="True"
RefreshCommand="{Binding RefreshCommand}"
IsRefreshing="{Binding IsRefreshing}"/>
</StackLayout>
</StackLayout> </StackLayout>
<!--Info text--> <!--Info text-->

View file

@ -1,130 +1,150 @@
<?xml version="1.0" encoding="utf-8" ?> <?xml version="1.0" encoding="utf-8" ?>
<ContentPage xmlns="http://xamarin.com/schemas/2014/forms" <ContentPage xmlns="http://xamarin.com/schemas/2014/forms"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml" xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
xmlns:resources="clr-namespace:TINK.MultilingualResources;assembly=TINKLib" xmlns:resources="clr-namespace:TINK.MultilingualResources;assembly=TINKLib"
xmlns:sharedGui="clr-namespace:ShareeSharedGuiLib.View" xmlns:sharedGui="clr-namespace:ShareeSharedGuiLib.View"
x:Class="TINK.View.Login.LoginPage" xmlns:conv="clr-namespace:TINK.View"
BackgroundColor="{DynamicResource background-color}"> x:Class="TINK.View.Login.LoginPage"
BackgroundColor="{DynamicResource background-color}">
<Shell.TitleView>
<Shell.TitleView>
<Grid ColumnDefinitions="Auto, 1*"> <Grid ColumnDefinitions="Auto, 1*">
<Label Style="{StaticResource Label-Navbar}" <Label Style="{StaticResource Label-Navbar}"
Text="{x:Static resources:AppResources.MarkingLogin}"/> Text="{x:Static resources:AppResources.MarkingLogin}"/>
</Grid> </Grid>
</Shell.TitleView> </Shell.TitleView>
<ContentPage.Resources>
<conv:BoolInverterConverter x:Key="BoolInverterConverter"/>
</ContentPage.Resources>
<ContentPage.Content>
<!--Grid for content and Running process in same row-->
<Grid>
<StackLayout> <StackLayout
Grid.Row="0">
<Frame <Frame
Padding="10" Padding="10"
Margin="0,10,0,5" Margin="0,10,0,5"
HorizontalOptions="FillAndExpand" HorizontalOptions="FillAndExpand"
BackgroundColor="White"> BackgroundColor="White">
<StackLayout <StackLayout
x:Name="LoginPageView" x:Name="LoginPageView"
Padding="10"> Padding="10">
<Label <Label
Text="{x:Static resources:AppResources.MarkingLoginEmailAddressLabel}" Text="{x:Static resources:AppResources.MarkingLoginEmailAddressLabel}"
Margin="0,0,0,-5"> Margin="0,0,0,-5">
<Label.Triggers> <Label.Triggers>
<DataTrigger <DataTrigger
TargetType="Label" TargetType="Label"
Binding="{Binding Source={x:Reference EMailEntry}, Path=Text, TargetNullValue=''}" Binding="{Binding Source={x:Reference EMailEntry}, Path=Text, TargetNullValue=''}"
Value=""> Value="">
<Setter <Setter
Property="IsVisible" Property="IsVisible"
Value="False" /> Value="False" />
</DataTrigger> </DataTrigger>
</Label.Triggers> </Label.Triggers>
</Label> </Label>
<Entry <Entry
Placeholder="{x:Static resources:AppResources.MarkingLoginEmailAddressPlaceholder}" Placeholder="{x:Static resources:AppResources.MarkingLoginEmailAddressPlaceholder}"
Keyboard="Email" Keyboard="Email"
AutomationId="mail_address_text" AutomationId="mail_address_text"
x:Name="EMailEntry" x:Name="EMailEntry"
Text="{Binding MailAddress}" Text="{Binding MailAddress}"
IsEnabled="{Binding IsLoggedOut}"/> IsEnabled="{Binding IsLoggedOut}"/>
<Label <Label
Text="{x:Static resources:AppResources.MarkingLoginPasswordPlaceholder}" Text="{x:Static resources:AppResources.MarkingLoginPasswordPlaceholder}"
Margin="0,0,0,-5"> Margin="0,0,0,-5">
<Label.Triggers> <Label.Triggers>
<DataTrigger <DataTrigger
TargetType="Label" TargetType="Label"
Binding="{Binding Source={x:Reference PasswordEntry}, Path=Text, TargetNullValue=''}" Binding="{Binding Source={x:Reference PasswordEntry}, Path=Text, TargetNullValue=''}"
Value=""> Value="">
<Setter <Setter
Property="IsVisible" Property="IsVisible"
Value="False" /> Value="False" />
</DataTrigger> </DataTrigger>
</Label.Triggers> </Label.Triggers>
</Label> </Label>
<sharedGui:TogglePasswordEntry <sharedGui:TogglePasswordEntry
Placeholder="{x:Static resources:AppResources.MarkingLoginPasswordPlaceholder}" Placeholder="{x:Static resources:AppResources.MarkingLoginPasswordPlaceholder}"
Text="{Binding Password}" Text="{Binding Password}"
HidePassword="True" HidePassword="True"
AutomationId="password_text" AutomationId="password_text"
x:Name="PasswordEntry" x:Name="PasswordEntry"
IsEnabled="{Binding IsLoggedOut}"/> IsEnabled="{Binding IsLoggedOut}"/>
<Label <Label
Text="{x:Static resources:AppResources.MarkingLoginPasswordLabel}" Text="{x:Static resources:AppResources.MarkingLoginPasswordLabel}"
HorizontalOptions="End" HorizontalOptions="End"
Margin="0,-10,0,5" Margin="0,-10,0,5"
FontSize="Small"> FontSize="Small">
<Label.Triggers> <Label.Triggers>
<DataTrigger <DataTrigger
TargetType="Label" TargetType="Label"
Binding="{Binding Source={x:Reference PasswordEntry}, Path=Text, TargetNullValue=''}" Binding="{Binding Source={x:Reference PasswordEntry}, Path=Text, TargetNullValue=''}"
Value=""> Value="">
<Setter <Setter
Property="IsVisible" Property="IsVisible"
Value="False" /> Value="False" />
</DataTrigger> </DataTrigger>
</Label.Triggers> </Label.Triggers>
</Label> </Label>
<Button <Button
Text="{x:Static resources:AppResources.ActionLoginLogin}" Text="{x:Static resources:AppResources.ActionLoginLogin}"
AutomationId="login_button" AutomationId="login_button"
Command="{Binding OnLoginRequest}" Command="{Binding OnLoginRequest}"
IsEnabled="{Binding IsLoginRequestAllowed}"> IsEnabled="{Binding IsLoginRequestAllowed}">
</Button> </Button>
<Button <Button
Style="{StaticResource SecondaryButton}" Style="{StaticResource SecondaryButton}"
Text="{x:Static resources:AppResources.ActionLoginRegister}" Text="{x:Static resources:AppResources.ActionLoginRegister}"
AutomationId="register_button" AutomationId="register_button"
Command="{Binding OnRegisterRequest}" Command="{Binding OnRegisterRequest}"
IsVisible="{Binding IsWebViewElementsVisible}"> IsVisible="{Binding IsWebViewElementsVisible}">
</Button> </Button>
<Label <Label
IsVisible="{Binding IsRegisterTargetsInfoVisible}" IsVisible="{Binding IsRegisterTargetsInfoVisible}"
FormattedText="{Binding RegisterTargetsInfo}"> FormattedText="{Binding RegisterTargetsInfo}">
</Label> </Label>
<Label <Label
Margin="0,10,0,0" Margin="0,10,0,0"
TextType="Html" TextType="Html"
AutomationId="password_forgotten_button" AutomationId="password_forgotten_button"
HorizontalOptions="Center" HorizontalOptions="Center"
TextColor="{DynamicResource primary-back-title-color}" TextColor="{DynamicResource primary-back-title-color}"
Text="{x:Static resources:AppResources.ActionLoginPasswordForgotten}"> Text="{x:Static resources:AppResources.ActionLoginPasswordForgotten}">
<Label.GestureRecognizers> <Label.GestureRecognizers>
<TapGestureRecognizer <TapGestureRecognizer
Command="{Binding OnPasswordForgottonRequest}"/> Command="{Binding OnPasswordForgottonRequest}"/>
</Label.GestureRecognizers> </Label.GestureRecognizers>
</Label> </Label>
</StackLayout> </StackLayout>
</Frame> </Frame>
</StackLayout> </StackLayout>
<!--While process is running-->
<sharedGui:RunningProcessView
IsVisible="{Binding IsIdle, Converter={StaticResource BoolInverterConverter}}"
Grid.Row="0"/>
</Grid>
</ContentPage.Content>
</ContentPage> </ContentPage>

View file

@ -18,18 +18,22 @@ namespace TINK.View.Login
public partial class LoginPage : ContentPage, IViewService public partial class LoginPage : ContentPage, IViewService
#endif #endif
{ {
/// <summary> Reference to view model. </summary>
LoginPageViewModel m_oViewModel = null;
/// <summary> Constructs a login page. </summary>
public LoginPage() public LoginPage()
{ {
InitializeComponent(); InitializeComponent();
var l_oModel = App.ModelRoot; var l_oModel = App.ModelRoot;
#if !BACKSTYLE #if !BACKSTYLE
var l_oViewModel = new LoginPageViewModel( m_oViewModel = new LoginPageViewModel(
l_oModel, l_oModel,
(url) => DependencyService.Get<IExternalBrowserService>().OpenUrl(url), (url) => DependencyService.Get<IExternalBrowserService>().OpenUrl(url),
this); this);
LoginPageView.BindingContext = l_oViewModel; BindingContext = m_oViewModel;
#else #else
LoginPageView.BindingContext = new LoginPageViewModel(l_oModel.ActiveUser, this, Navigation); LoginPageView.BindingContext = new LoginPageViewModel(l_oModel.ActiveUser, this, Navigation);
#endif #endif

View file

@ -29,9 +29,9 @@
<!--Bike(s) view--> <!--Bike(s) view-->
<Grid <Grid
RowDefinitions="1*,Auto" RowDefinitions="1*,Auto"
RowSpacing="0" RowSpacing="0"
Grid.Row="0"> Grid.Row="0">
<StackLayout <StackLayout
Grid.Row="0" Grid.Row="0"
@ -41,34 +41,36 @@
<!--No Network Connection--> <!--No Network Connection-->
<sharedGui:NotConnectedToNetView/> <sharedGui:NotConnectedToNetView/>
<!--Bike(s)--> <!--Bike data-->
<StackLayout <Grid
Spacing="0" RowDefinitions="Auto,1*"
IsVisible="{Binding IsBikesListVisible}" RowSpacing="0">
Orientation="Vertical">
<!--Hint for Outdated Data.--> <!--Hint for Outdated Data.-->
<sharedGui:HintForRefreshingPageView/> <sharedGui:HintForRefreshingPageView
Grid.Row="0"/>
<!--No Bikes-->
<Label
Grid.Row="1"
Margin="20"
IsVisible="{Binding IsNoBikesOccupiedVisible}"
Text="{Binding NoBikesOccupiedText}"/>
<!--Bike(s)-->
<ListView <ListView
x:Name="MyBikesListView" Grid.Row="1"
SelectionMode="None" x:Name="MyBikesListView"
SelectedItem="{Binding SelectedBike}" SelectionMode="None"
IsEnabled="{Binding IsIdle}" SelectedItem="{Binding SelectedBike}"
HasUnevenRows="True" IsEnabled="{Binding IsIdle}"
SeparatorVisibility="None" HasUnevenRows="True"
ItemTemplate="{StaticResource bikeTemplateSelector}" SeparatorVisibility="None"
IsPullToRefreshEnabled="True" ItemTemplate="{StaticResource bikeTemplateSelector}"
RefreshCommand="{Binding RefreshCommand}" IsPullToRefreshEnabled="True"
IsRefreshing="{Binding IsRefreshing}"/> RefreshCommand="{Binding RefreshCommand}"
IsRefreshing="{Binding IsRefreshing}"/>
</StackLayout> </Grid>
<!--No Bikes-->
<Label
Margin="20"
IsVisible="{Binding IsNoBikesOccupiedVisible}"
Text="{Binding NoBikesOccupiedText}"/>
</StackLayout> </StackLayout>

View file

@ -32,7 +32,8 @@
<ScrollView> <ScrollView>
<StackLayout> <StackLayout
Spacing="0">
<Frame <Frame
Padding="10" Padding="10"

View file

@ -21,7 +21,7 @@ namespace TINK.Model.Bikes.BikeInfoNS.BC
private readonly StateInfoMutable _StateInfo; private readonly StateInfoMutable _StateInfo;
/// <summary> /// <summary>
/// Constructs a bike. /// Constructs a bike info object.
/// </summary> /// </summary>
/// <param name="isDemo">True if device is demo device, false otherwise.</param> /// <param name="isDemo">True if device is demo device, false otherwise.</param>
/// <param name="dateTimeProvider">Provider for current date time to calculate remaining time on demand for state of type reserved.</param> /// <param name="dateTimeProvider">Provider for current date time to calculate remaining time on demand for state of type reserved.</param>
@ -38,7 +38,7 @@ namespace TINK.Model.Bikes.BikeInfoNS.BC
string stationId = null, string stationId = null,
string stationName = null, string stationName = null,
Uri operatorUri = null, Uri operatorUri = null,
RentalDescription tariffDescription = null, IRentalDescription tariffDescription = null,
Func<DateTime> dateTimeProvider = null, Func<DateTime> dateTimeProvider = null,
IStateInfo stateInfo = null) IStateInfo stateInfo = null)
{ {
@ -57,7 +57,7 @@ namespace TINK.Model.Bikes.BikeInfoNS.BC
/// <summary> Id of station a which bike is located, null otherwise.</summary> /// <summary> Id of station a which bike is located, null otherwise.</summary>
[DataMember] [DataMember]
public string StationId { get; } public string StationId { get; private set; }
/// <summary> Name of station a which bike is located, null otherwise. </summary> /// <summary> Name of station a which bike is located, null otherwise. </summary>
[DataMember] [DataMember]
@ -65,7 +65,7 @@ namespace TINK.Model.Bikes.BikeInfoNS.BC
/// <summary> Holds description about the tariff. </summary> /// <summary> Holds description about the tariff. </summary>
[DataMember] [DataMember]
public RentalDescription TariffDescription { get; private set; } public IRentalDescription TariffDescription { get; private set; }
/// <summary> /// <summary>
/// Holds the rent state of the bike. /// Holds the rent state of the bike.
@ -128,6 +128,24 @@ namespace TINK.Model.Bikes.BikeInfoNS.BC
} }
} }
/// <summary> Loads a bike object from copri server booking_cancel (cancel reservation)/ booking_update (return bike) response.</summary>
/// <param name="bike">Bike object to load response into.</param>
/// <param name="notifyLevel">Controls whether notify property changed events are fired or not.</param>
/// <param name="stationId">Id of the station if bike station changed, null otherwise.</param>
public void Load(
NotifyPropertyChangedLevel notifyLevel,
string stationId = null)
{
State.Load(InUseStateEnum.Disposable, notifyLevel: notifyLevel);
if (stationId == null)
{
// Station did not change.
return;
}
StationId = stationId;
}
/// <summary> /// <summary>
/// Converts the instance to text. /// Converts the instance to text.
/// </summary> /// </summary>

View file

@ -64,6 +64,18 @@ namespace TINK.Model.Bikes.BikeInfoNS.BC
/// <summary> Gets or sets the information where the data origins from. </summary> /// <summary> Gets or sets the information where the data origins from. </summary>
DataSource DataSource { get; set; } DataSource DataSource { get; set; }
/// <summary>
/// Gets the rental description.
/// </summary>
IRentalDescription TariffDescription { get; }
/// <summary> Loads a bike object from copri server booking_cancel (cancel reservation)/ booking_update (return bike) response.</summary>
/// <param name="notifyLevel">Controls whether notify property changed events are fired or not.</param>
/// <param name="stationId">Id of the station if bike station changed, null otherwise.</param>
void Load(
NotifyPropertyChangedLevel notifyLevel,
string stationId = null);
event PropertyChangedEventHandler PropertyChanged; event PropertyChangedEventHandler PropertyChanged;
} }

View file

@ -83,8 +83,9 @@ namespace TINK.Model.Bikes.BikeInfoNS.BluetoothLock
new StateInfo( new StateInfo(
dateTimeProvider, dateTimeProvider,
requestedAt, requestedAt,
tariffDescription?.MaxReservationTimeSpan ?? StateRequestedInfo.UNKNOWNMAXRESERVATIONTIMESPAN,
mailAddress, mailAddress,
""), "" ), // BC code
bike != null bike != null
? new Bike( ? new Bike(
bike.Id, bike.Id,

View file

@ -84,8 +84,9 @@ namespace TINK.Model.Bikes.BikeInfoNS.CopriLock
new StateInfo( new StateInfo(
dateTimeProvider, dateTimeProvider,
requestedAt, requestedAt,
tariffDescription?.MaxReservationTimeSpan ?? StateRequestedInfo.UNKNOWNMAXRESERVATIONTIMESPAN,
mailAddress, mailAddress,
""), ""), // BC code
bike != null bike != null
? new Bike( ? new Bike(
bike.Id, bike.Id,

View file

@ -0,0 +1,29 @@
using System;
using System.Collections.Generic;
using static TINK.Model.Bikes.BikeInfoNS.RentalDescription;
namespace TINK.Model.Bikes.BikeInfoNS
{
public interface IRentalDescription
{
/// <summary>
/// Name of the tariff.
/// </summary>
string Name { get; set; }
/// <summary>
/// Holds the time span for which a bike can be reserved.
/// </summary>
TimeSpan MaxReservationTimeSpan { get; set; }
/// <summary>
/// Dynamic language aware tariff elements to be displayed to user.
/// </summary>
Dictionary<string, TariffElement> TariffEntries { get; set; }
/// <summary>
/// Well known language aware elements (AGB, tracking info, ...) to be displayed to user.
/// </summary>
Dictionary<string, InfoElement> InfoEntries { get; set; }
}
}

View file

@ -1,3 +1,4 @@
using System;
using System.Collections.Generic; using System.Collections.Generic;
namespace TINK.Model.Bikes.BikeInfoNS namespace TINK.Model.Bikes.BikeInfoNS
@ -6,20 +7,20 @@ namespace TINK.Model.Bikes.BikeInfoNS
/// Successor of TarifDescription- object. /// Successor of TarifDescription- object.
/// Manages tariff- and rental info. /// Manages tariff- and rental info.
/// </summary> /// </summary>
public class RentalDescription public class RentalDescription : IRentalDescription
{ {
/// <summary> /// <summary>
/// The different elements of a tariff (example: "Max Gebühr", ) /// The different elements of a tariff (example: "Max Gebühr", ) to be displayed by sharee.bike without processing
/// </summary> /// </summary>
public class TariffElement public class TariffElement
{ {
/// <summary> /// <summary>
/// Describes the tariff element. To be displayed to user (example of elements: "Gratis Mietzeit", "Mietgebühr", "Max Gebühr"). /// Describes the tariff element (language aware). To be displayed to user (example of elements: "Gratis Mietzeit", "Mietgebühr", "Max Gebühr").
/// </summary> /// </summary>
public string Description { get; set; } = string.Empty; public string Description { get; set; } = string.Empty;
/// <summary> /// <summary>
/// Holds the tariff element value. To be displayed to user (example: "9.00 € / Tag"). /// Holds the tariff element value (language aware, i.e. value from backend might be english, german, ... depending on smart phone value). To be displayed to user (example: "9.00 € / Tag").
/// </summary> /// </summary>
public string Value { get; set; } = string.Empty; public string Value { get; set; } = string.Empty;
} }
@ -30,12 +31,12 @@ namespace TINK.Model.Bikes.BikeInfoNS
public class InfoElement public class InfoElement
{ {
/// <summary> /// <summary>
/// Key which identyfies the value (required for special processing) /// Key which identifies the value (required for special processing)
/// </summary> /// </summary>
public string Key { get; set; } public string Key { get; set; }
/// <summary> /// <summary>
/// Text to be displayed to user. /// Text (language aware) to be displayed to user.
/// </summary> /// </summary>
public string Value { get; set; } public string Value { get; set; }
} }
@ -50,8 +51,19 @@ namespace TINK.Model.Bikes.BikeInfoNS
/// </summary> /// </summary>
public int? Id { get; set; } public int? Id { get; set; }
/// <summary>
/// Holds the time span for which a bike can be reserved.
/// </summary>
public TimeSpan MaxReservationTimeSpan { get; set; }
/// <summary>
/// Dynamic language aware tariff elements to be displayed to user.
/// </summary>
public Dictionary<string, TariffElement> TariffEntries { get; set; } = new Dictionary<string, TariffElement>(); public Dictionary<string, TariffElement> TariffEntries { get; set; } = new Dictionary<string, TariffElement>();
/// <summary>
/// Well known language aware elements (AGB, tracking info, ...) to be displayed to user.
/// </summary>
public Dictionary<string, InfoElement> InfoEntries { get; set; } = new Dictionary<string, InfoElement>(); public Dictionary<string, InfoElement> InfoEntries { get; set; } = new Dictionary<string, InfoElement>();
} }
} }

View file

@ -1,9 +1,9 @@
using TINK.Model.MiniSurvey; using TINK.Model.MiniSurvey;
namespace TINK.Model namespace TINK.Model
{ {
/// <summary> /// <summary>
/// Holds tasks to be accoumplished/ information shown to user after booking has finished. /// Holds tasks to be accomplished/ information shown to user after booking has finished.
/// </summary> /// </summary>
public class BookingFinishedModel : IBookingFinishedModel public class BookingFinishedModel : IBookingFinishedModel
{ {

View file

@ -1,5 +1,6 @@
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks; using System.Threading.Tasks;
using TINK.Model.Bikes.BikeInfoNS.BluetoothLock; using TINK.Model.Bikes.BikeInfoNS.BluetoothLock;
using TINK.Model.Connector.Updater; using TINK.Model.Connector.Updater;
@ -288,7 +289,10 @@ namespace TINK.Model.Connector
DoReturnResponse response DoReturnResponse response
= (await CopriServer.DoReturn(bike.Id, location, bike.OperatorUri)).GetIsReturnBikeResponseOk(bike.Id); = (await CopriServer.DoReturn(bike.Id, location, bike.OperatorUri)).GetIsReturnBikeResponseOk(bike.Id);
bike.Load(Bikes.BikeInfoNS.BC.NotifyPropertyChangedLevel.None); bike.Load(
Bikes.BikeInfoNS.BC.NotifyPropertyChangedLevel.None,
response.bike_returned.station ?? string.Empty);
return response?.Create() ?? new BookingFinishedModel(); return response?.Create() ?? new BookingFinishedModel();
} }

View file

@ -438,5 +438,20 @@ namespace TINK.Model.Connector
name, name,
int.TryParse(bikeGroup?.bike_count ?? "0", out var countCity) ? countCity : 0, int.TryParse(bikeGroup?.bike_count ?? "0", out var countCity) ? countCity : 0,
bikeGroup?.bike_group ?? string.Empty); bikeGroup?.bike_group ?? string.Empty);
/// <summary>
/// Default value for reserve_timerange.
/// </summary>
private static int DEFAULTMAXRESERVATIONTIMESPAN = 15;
/// <summary>
/// Gets the reservation time span from response.
/// </summary>
/// <param name="description">Response to get time span from.</param>
/// <returns>Time span.</returns>
public static TimeSpan GetMaxReservationTimeSpan(this RentalDescription description) =>
TimeSpan.FromMinutes(int.TryParse(description?.reserve_timerange, out int minutes)
? minutes
: DEFAULTMAXRESERVATIONTIMESPAN );
} }
} }

View file

@ -313,7 +313,7 @@ namespace TINK.Model.Connector.Updater
} }
catch (ArgumentException ex) catch (ArgumentException ex)
{ {
// Contructor reported invalid arguemts (missing lock id, ....). // Constructor reported invalid arguments (missing lock id, ....).
Log.Error($"Can not create new {nameof(BikeInfo)}-object from {nameof(BikeInfoReservedOrBooked)} argument. Invalid response detected. Booked bike with id {bikeInfo.bike} skipped. {ex.Message}"); Log.Error($"Can not create new {nameof(BikeInfo)}-object from {nameof(BikeInfoReservedOrBooked)} argument. Invalid response detected. Booked bike with id {bikeInfo.bike} skipped. {ex.Message}");
return null; return null;
} }

View file

@ -1,58 +1,56 @@
using System.Collections.Generic; using System.Collections.Generic;
using System.Linq; using System.Linq;
using TINK.Model.Bikes.BikeInfoNS;
namespace TINK.Model.Connector.Updater namespace TINK.Model.Connector.Updater
{ {
public static class RentalDescriptionFactory public static class RentalDescriptionFactory
{ {
/// <summary> /// <summary>
/// Creates rental description object from JSON- tarif description object. /// Creates rental description object from JSON- tariff description object.
/// </summary> /// </summary>
/// <param name="rentalDesciption">Source JSON object.</param> /// <param name="rentalDesciption">Source JSON object.</param>
/// <returns>Tariff description object.</returns> /// <returns>Tariff description object.</returns>
public static Bikes.BikeInfoNS.RentalDescription Create(this Repository.Response.RentalDescription rentalDesciption) public static RentalDescription Create(this Repository.Response.RentalDescription rentalDesciption)
{ {
Bikes.BikeInfoNS.RentalDescription.TariffElement CreateTarifEntry(string[] elementValue) RentalDescription.TariffElement CreateTarifEntry(string[] elementValue) =>
{ new RentalDescription.TariffElement
return new Bikes.BikeInfoNS.RentalDescription.TariffElement {
{ Description = elementValue != null && elementValue.Length > 0 ? elementValue[0] : string.Empty,
Description = elementValue != null && elementValue.Length > 0 ? elementValue[0] : string.Empty, Value = elementValue != null && elementValue.Length > 1 ? elementValue[1] : string.Empty,
Value = elementValue != null && elementValue.Length > 1 ? elementValue[1] : string.Empty, };
};
}
Bikes.BikeInfoNS.RentalDescription.InfoElement CreateInfoElement(string[] elementValue) RentalDescription.InfoElement CreateInfoElement(string[] elementValue) =>
{ new RentalDescription.InfoElement
return new Bikes.BikeInfoNS.RentalDescription.InfoElement
{ {
Key = elementValue != null && elementValue.Length > 0 ? elementValue[0] : string.Empty, Key = elementValue != null && elementValue.Length > 0 ? elementValue[0] : string.Empty,
Value = elementValue != null && elementValue.Length > 1 ? elementValue[1] : string.Empty, Value = elementValue != null && elementValue.Length > 1 ? elementValue[1] : string.Empty,
}; };
}
// Read tariff elements. // Read tariff elements.
var tarifEntries = rentalDesciption?.tarif_elements != null var tarifEntries = rentalDesciption?.tarif_elements != null
? rentalDesciption.tarif_elements.Select(x => new ? rentalDesciption.tarif_elements.Select(x => new
{ {
Key = x.Key, x.Key,
Value = CreateTarifEntry(x.Value) Value = CreateTarifEntry(x.Value)
}).ToLookup(x => x.Key, x => x.Value).ToDictionary(x => x.Key, x => x.First()) }).ToLookup(x => x.Key, x => x.Value).ToDictionary(x => x.Key, x => x.First())
: new Dictionary<string, Bikes.BikeInfoNS.RentalDescription.TariffElement>(); : new Dictionary<string, RentalDescription.TariffElement>();
// Read info elements. // Read info elements.
var InfoEntries = rentalDesciption?.rental_info != null var InfoEntries = rentalDesciption?.rental_info != null
? rentalDesciption.rental_info.Select(x => new ? rentalDesciption.rental_info.Select(x => new
{ {
Key = x.Key, x.Key,
Value = CreateInfoElement(x.Value) Value = CreateInfoElement(x.Value)
}).ToLookup(x => x.Key, x => x.Value).ToDictionary(x => x.Key, x => x.First()) }).ToLookup(x => x.Key, x => x.Value).ToDictionary(x => x.Key, x => x.First())
: new Dictionary<string, Bikes.BikeInfoNS.RentalDescription.InfoElement>(); : new Dictionary<string, RentalDescription.InfoElement>();
var bike = new Bikes.BikeInfoNS.RentalDescription var bike = new RentalDescription
{ {
Name = rentalDesciption?.name ?? string.Empty, Name = rentalDesciption?.name ?? string.Empty,
Id = int.TryParse(rentalDesciption?.id ?? string.Empty, out int number) ? number : (int?)null, Id = int.TryParse(rentalDesciption?.id ?? string.Empty, out int number) ? number : (int?)null,
MaxReservationTimeSpan = rentalDesciption.GetMaxReservationTimeSpan(),
TariffEntries = tarifEntries, TariffEntries = tarifEntries,
InfoEntries = InfoEntries InfoEntries = InfoEntries
}; };

View file

@ -2,13 +2,11 @@ using System;
using TINK.Model.Bikes.BikeInfoNS.BC; using TINK.Model.Bikes.BikeInfoNS.BC;
using TINK.Model.State; using TINK.Model.State;
using TINK.Model.Stations; using TINK.Model.Stations;
using TINK.Model.Stations.StationNS.Operator;
using TINK.Model.User.Account; using TINK.Model.User.Account;
using TINK.Repository.Exception; using TINK.Repository.Exception;
using TINK.Repository.Response; using TINK.Repository.Response;
using TINK.Repository.Response.Stations; using TINK.Repository.Response.Stations;
using TINK.Services.CopriApi; using TINK.Services.CopriApi;
using Xamarin.Forms;
using IBikeInfoMutable = TINK.Model.Bikes.BikeInfoNS.BC.IBikeInfoMutable; using IBikeInfoMutable = TINK.Model.Bikes.BikeInfoNS.BC.IBikeInfoMutable;
namespace TINK.Model.Connector.Updater namespace TINK.Model.Connector.Updater
@ -19,14 +17,6 @@ namespace TINK.Model.Connector.Updater
/// <todo>Rename to UpdateFromCopri.</todo> /// <todo>Rename to UpdateFromCopri.</todo>
public static class UpdaterJSON public static class UpdaterJSON
{ {
/// <summary> Loads a bike object from copri server cancel reservation/ booking update request.</summary>
/// <param name="bike">Bike object to load response into.</param>
/// <param name="notifyLevel">Controls whether notify property changed events are fired or not.</param>
public static void Load(
this IBikeInfoMutable bike,
NotifyPropertyChangedLevel notifyLevel)
=> bike.State.Load(InUseStateEnum.Disposable, notifyLevel: notifyLevel);
/// <summary> /// <summary>
/// Gets all station for station provider and add them into station list. /// Gets all station for station provider and add them into station list.
/// </summary> /// </summary>
@ -135,6 +125,7 @@ namespace TINK.Model.Connector.Updater
bike.State.Load( bike.State.Load(
InUseStateEnum.Reserved, InUseStateEnum.Reserved,
bikeInfo.GetFrom(), bikeInfo.GetFrom(),
bikeInfo.rental_description.GetMaxReservationTimeSpan(),
mailAddress, mailAddress,
bikeInfo.timeCode, bikeInfo.timeCode,
notifyLevel); notifyLevel);
@ -144,9 +135,9 @@ namespace TINK.Model.Connector.Updater
bike.State.Load( bike.State.Load(
InUseStateEnum.Booked, InUseStateEnum.Booked,
bikeInfo.GetFrom(), bikeInfo.GetFrom(),
mailAddress, mailAddress: mailAddress,
bikeInfo.timeCode, code: bikeInfo.timeCode,
notifyLevel); notifyLevel: notifyLevel);
break; break;
default: default:

View file

@ -1,4 +1,4 @@
using System.Runtime.Serialization; using System.Runtime.Serialization;
namespace TINK.Model.State namespace TINK.Model.State
{ {
@ -12,7 +12,7 @@ namespace TINK.Model.State
[KnownType(typeof(StateOccupiedInfo))] [KnownType(typeof(StateOccupiedInfo))]
public abstract class BaseState public abstract class BaseState
{ {
/// <summary> Constructor for Json serialization. </summary> /// <summary> Constructor for JSON serialization. </summary>
/// <param name="value">State value.</param> /// <param name="value">State value.</param>
protected BaseState(InUseStateEnum value) { } protected BaseState(InUseStateEnum value) { }

View file

@ -1,4 +1,4 @@
using System; using System;
namespace TINK.Model.State namespace TINK.Model.State
{ {
@ -9,8 +9,16 @@ namespace TINK.Model.State
{ {
string MailAddress { get; } string MailAddress { get; }
/// <summary>
/// Date of request/ booking action.
/// </summary>
DateTime? From { get; } DateTime? From { get; }
/// <summary>
/// Time span for which a bike can be reserved.
/// </summary>
TimeSpan? MaxReservationTimeSpan { get; }
string Code { get; } string Code { get; }
} }
} }

View file

@ -1,4 +1,4 @@
using System; using System;
namespace TINK.Model.State namespace TINK.Model.State
{ {
@ -6,15 +6,17 @@ namespace TINK.Model.State
{ {
InUseStateEnum Value { get; } InUseStateEnum Value { get; }
/// <summary> Updates state from webserver. </summary> /// <summary> Updates state from web server. </summary>
/// <param name="state">State of the bike.</param> /// <param name="state">State of the bike.</param>
/// <param name="from">Date time when bike was reserved/ booked.</param> /// <param name="from">Date time when bike was reserved/ booked.</param>
/// <param name="mailAddress">Mailaddress of the one which reserved/ booked.</param> /// <param name="reservationTimeSpan">Time span for which a bike can be reserved.</param>
/// <param name="mailAddress">Mail address of the one which reserved/ booked.</param>
/// <param name="code">Booking code if bike is booked or reserved.</param> /// <param name="code">Booking code if bike is booked or reserved.</param>
/// <param name="notifyLevel">Controls whether notify property changed events are fired or not.</param> /// <param name="notifyLevel">Controls whether notify property changed events are fired or not.</param>
void Load( void Load(
InUseStateEnum state, InUseStateEnum state,
DateTime? from = null, DateTime? from = null,
TimeSpan? reservationTimeSpan = null,
string mailAddress = null, string mailAddress = null,
string code = null, string code = null,
Bikes.BikeInfoNS.BC.NotifyPropertyChangedLevel notifyLevel = Bikes.BikeInfoNS.BC.NotifyPropertyChangedLevel.All); Bikes.BikeInfoNS.BC.NotifyPropertyChangedLevel notifyLevel = Bikes.BikeInfoNS.BC.NotifyPropertyChangedLevel.All);

View file

@ -52,20 +52,21 @@ namespace TINK.Model.State
/// Constructs a state info object when state is requested. /// Constructs a state info object when state is requested.
/// </summary> /// </summary>
/// <param name="requestedAt">Date time when bike was requested</param> /// <param name="requestedAt">Date time when bike was requested</param>
/// <param name="maxReservationTimeSpan">Time span for which a bike can be reserved.</param>
/// <param name="mailAddress">Mail address of user which requested bike.</param> /// <param name="mailAddress">Mail address of user which requested bike.</param>
/// <param name="code">Booking code.</param> /// <param name="code">Booking code.</param>
/// <param name="dateTimeNowProvider">Date time provider to calculate remaining time.</param> /// <param name="dateTimeNowProvider">Date time provider to calculate remaining time.</param>
public StateInfo( public StateInfo(
Func<DateTime> dateTimeNowProvider, Func<DateTime> dateTimeNowProvider,
DateTime requestedAt, DateTime requestedAt,
TimeSpan maxReservationTimeSpan,
string mailAddress, string mailAddress,
string code) string code)
{ {
// Todo: Handle p_oFrom == null here.
// Todo: Handle p_oDuration == null here.
_InUseState = new StateRequestedInfo( _InUseState = new StateRequestedInfo(
dateTimeNowProvider ?? (() => DateTime.Now), dateTimeNowProvider ?? (() => DateTime.Now),
requestedAt, requestedAt,
maxReservationTimeSpan,
mailAddress, mailAddress,
code); code);
} }
@ -81,9 +82,6 @@ namespace TINK.Model.State
string p_strMailAddress, string p_strMailAddress,
string p_strCode) string p_strCode)
{ {
// Todo: Handle p_oFrom == null here.
// Todo: Clearify question: What to do if code changes form one value to another? This should never happen.
// Todo: Clearify question: What to do if from time changes form one value to another? This should never happen.
_InUseState = new StateOccupiedInfo( _InUseState = new StateOccupiedInfo(
p_oBookedAt, p_oBookedAt,
p_strMailAddress, p_strMailAddress,
@ -114,7 +112,7 @@ namespace TINK.Model.State
} }
/// <summary> /// <summary>
/// Date of request/ bookeing action. /// Date of request/ booking action.
/// </summary> /// </summary>
public DateTime? From public DateTime? From
{ {
@ -125,6 +123,14 @@ namespace TINK.Model.State
} }
} }
/// <summary>
/// Time span for which a bike can be reserved.
/// </summary>
public TimeSpan? MaxReservationTimeSpan =>
_InUseState is StateRequestedInfo reserved
? reserved.MaxReservationTimeSpan
: (TimeSpan?)null;
/// <summary> /// <summary>
/// Mail address. /// Mail address.
/// </summary> /// </summary>
@ -152,7 +158,7 @@ namespace TINK.Model.State
/// <summary> /// <summary>
/// Tries update /// Tries update
/// </summary> /// </summary>
/// <returns>True if reservation span has not exeeded and state remains reserved, false otherwise.</returns> /// <returns>True if reservation span has not exceeded and state remains reserved, false otherwise.</returns>
/// <todo>Implement logging of time stamps.</todo> /// <todo>Implement logging of time stamps.</todo>
public bool GetIsStillReserved(out TimeSpan? p_oRemainingTime) public bool GetIsStillReserved(out TimeSpan? p_oRemainingTime)
{ {

View file

@ -4,7 +4,7 @@ namespace TINK.Model.State
{ {
using System.ComponentModel; using System.ComponentModel;
using System.Runtime.Serialization; using System.Runtime.Serialization;
/// <summary> /// <summary>
/// Manges the state of a bike. /// Manges the state of a bike.
/// </summary> /// </summary>
@ -90,19 +90,18 @@ namespace TINK.Model.State
return new StateInfo(state != null ? state.Value == InUseStateEnum.FeedbackPending : false); return new StateInfo(state != null ? state.Value == InUseStateEnum.FeedbackPending : false);
case InUseStateEnum.Reserved: case InUseStateEnum.Reserved:
// Todo: Handle p_oFrom == null here.
// Todo: Handle p_oDuration == null here.
return new StateInfo( return new StateInfo(
dateTimeNowProvider, state.From.HasValue ? dateTimeNowProvider : (() => DateTime.MaxValue),
state.From.Value, state.From.HasValue ? state.From.Value : DateTime.MaxValue,
state.MaxReservationTimeSpan ?? StateRequestedInfo.UNKNOWNMAXRESERVATIONTIMESPAN,
state.MailAddress, state.MailAddress,
state.Code); state.Code);
case InUseStateEnum.Booked: case InUseStateEnum.Booked:
// Todo: Handle p_oFrom == null here. // Todo: Handle p_oFrom == null here.
// Todo: Clearify question: What to do if code changes form one value to another? This should never happen. // Todo: Clarify question: What to do if code changes form one value to another? This should never happen.
// Todo: Clearify question: What to do if from time changes form one value to another? This should never happen. // Todo: Clarify question: What to do if from time changes form one value to another? This should never happen.
return new StateInfo( return new StateInfo(
state.From.Value, state.From.Value,
state.MailAddress, state.MailAddress,
@ -139,7 +138,7 @@ namespace TINK.Model.State
var l_oStateRequested = value as StateRequestedInfo; var l_oStateRequested = value as StateRequestedInfo;
if (l_oStateRequested != null) if (l_oStateRequested != null)
{ {
_StateInfo = new StateInfo(_DateTimeNowProvider, l_oStateRequested.From, l_oStateRequested.MailAddress, l_oStateRequested.Code); _StateInfo = new StateInfo(_DateTimeNowProvider, l_oStateRequested.From, l_oStateRequested.MaxReservationTimeSpan, l_oStateRequested.MailAddress, l_oStateRequested.Code);
return; return;
} }
@ -158,7 +157,7 @@ namespace TINK.Model.State
/// <summary> /// <summary>
/// Checks and updates state if required. /// Checks and updates state if required.
/// </summary> /// </summary>
/// <returns>Value indicating wheter state has changed</returns> /// <returns>Value indicating whether state has changed</returns>
public void UpdateOnTimeElapsed() public void UpdateOnTimeElapsed()
{ {
switch (_StateInfo.Value) switch (_StateInfo.Value)
@ -172,7 +171,7 @@ namespace TINK.Model.State
// Check if maximum reserved time has elapsed. // Check if maximum reserved time has elapsed.
if (!_StateInfo.GetIsStillReserved(out _RemainingTime)) if (!_StateInfo.GetIsStillReserved(out _RemainingTime))
{ {
// Time has elapsed, switch state to disposable and notfiy client // Time has elapsed, switch state to disposable and notify client
_StateInfo = new StateInfo(); _StateInfo = new StateInfo();
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(nameof(State))); PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(nameof(State)));
return; return;
@ -181,15 +180,17 @@ namespace TINK.Model.State
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(nameof(RemainingTime))); PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(nameof(RemainingTime)));
} }
/// <summary> Updates state from webserver. </summary> /// <summary> Updates state from web server. </summary>
/// <param name="state">State of the bike.</param> /// <param name="state">State of the bike.</param>
/// <param name="from">Date time when bike was reserved/ booked.</param> /// <param name="from">Date time when bike was reserved/ booked.</param>
/// <param name="mailAddress">Mailaddress of the one which reserved/ booked.</param> /// <param name="maxReservationTimeSpan">Time span for which a bike can be reserved.</param>
/// <param name="mailAddress">Mail address of the one which reserved/ booked.</param>
/// <param name="code">Booking code if bike is booked or reserved.</param> /// <param name="code">Booking code if bike is booked or reserved.</param>
/// <param name="supressNotifyPropertyChanged">Controls whether notify property changed events are fired or not.</param> /// <param name="supressNotifyPropertyChanged">Controls whether notify property changed events are fired or not.</param>
public void Load( public void Load(
InUseStateEnum state, InUseStateEnum state,
DateTime? from = null, DateTime? from = null,
TimeSpan? maxReservationTimeSpan = null,
string mailAddress = null, string mailAddress = null,
string code = null, string code = null,
Bikes.BikeInfoNS.BC.NotifyPropertyChangedLevel notifyLevel = Bikes.BikeInfoNS.BC.NotifyPropertyChangedLevel.All) Bikes.BikeInfoNS.BC.NotifyPropertyChangedLevel notifyLevel = Bikes.BikeInfoNS.BC.NotifyPropertyChangedLevel.All)
@ -206,11 +207,10 @@ namespace TINK.Model.State
break; break;
case InUseStateEnum.Reserved: case InUseStateEnum.Reserved:
// Todo: Handle p_oFrom == null here.
// Todo: Handle p_oDuration == null here.
_StateInfo = new StateInfo( _StateInfo = new StateInfo(
_DateTimeNowProvider, from.HasValue ? _DateTimeNowProvider : (() => DateTime.MaxValue),
from.Value, from.HasValue ? from.Value : DateTime.MaxValue,
maxReservationTimeSpan.HasValue ? maxReservationTimeSpan.Value : StateRequestedInfo.UNKNOWNMAXRESERVATIONTIMESPAN,
mailAddress, mailAddress,
code); code);
@ -245,7 +245,7 @@ namespace TINK.Model.State
} }
/// <summary> /// <summary>
/// If bike is reserved time raimaining while bike stays reserved, null otherwise. /// If bike is reserved time remaining while bike stays reserved, null otherwise.
/// </summary> /// </summary>
public TimeSpan? RemainingTime public TimeSpan? RemainingTime
{ {
@ -261,7 +261,7 @@ namespace TINK.Model.State
if (_RemainingTime.HasValue == false) if (_RemainingTime.HasValue == false)
{ {
// Value was not yet querried. // Value was not yet queried.
// Do query before returning object. // Do query before returning object.
_StateInfo.GetIsStillReserved(out _RemainingTime); _StateInfo.GetIsStillReserved(out _RemainingTime);
} }

View file

@ -1,4 +1,4 @@
using System; using System;
using System.Runtime.Serialization; using System.Runtime.Serialization;
using Newtonsoft.Json; using Newtonsoft.Json;
@ -10,51 +10,63 @@ namespace TINK.Model.State
[DataContract] [DataContract]
public sealed class StateRequestedInfo : BaseState, IBaseState, INotAvailableState public sealed class StateRequestedInfo : BaseState, IBaseState, INotAvailableState
{ {
// Maximum time while reserving request is kept. /// <summary>
public static readonly TimeSpan MaximumReserveTime = new TimeSpan(0, 15, 0); // 15 mins /// Holds the value if time span is not known.
/// </summary>
/// <remarks> Default value see <see cref="TextToTypeHelper.DEFAULTMAXRESERVATIONTIMESPAN"/>. </remarks>
public static TimeSpan UNKNOWNMAXRESERVATIONTIMESPAN = TimeSpan.Zero;
// Reference to date time provider. // Reference to date time provider.
private Func<DateTime> _DateTimeNowProvider; private readonly Func<DateTime> _DateTimeNowProvider;
/// <summary>
/// Time span for which a bike can be reserved. Default value is zero.
/// </summary>
public TimeSpan MaxReservationTimeSpan { get; private set; } = UNKNOWNMAXRESERVATIONTIMESPAN;
/// <summary> /// <summary>
/// Prevents an invalid instance to be created. /// Prevents an invalid instance to be created.
/// Used by serializer only. /// Used by serializer only.
/// </summary> /// </summary>
private StateRequestedInfo() : base(InUseStateEnum.Reserved) internal StateRequestedInfo() : base(InUseStateEnum.Reserved)
{ {
// Is called in context of JSON deserialization. // Is called in context of JSON deserialization.
_DateTimeNowProvider = () => DateTime.Now; _DateTimeNowProvider = () => DateTime.Now;
} }
/// <summary> /// <summary>
/// Reservation performed with other device/ before start of app. /// Reservation performed with other device/ before start of app.
/// Date time info when bike was reserved has been received from webserver. /// Date time info when bike was reserved has been received from web server.
/// </summary> /// </summary>
/// <param name="p_oRemainingTime">Time span which holds duration how long bike still will be reserved.</param> /// <param name="maxReservationTimeSpan">Time span for which a bike can be reserved.</param>
[JsonConstructor] [JsonConstructor]
private StateRequestedInfo( private StateRequestedInfo(
InUseStateEnum Value, InUseStateEnum Value,
DateTime From, DateTime From,
TimeSpan maxReservationTimeSpan,
string MailAddress, string MailAddress,
string Code) : this(() => DateTime.Now, From, MailAddress, Code) string Code) : this(() => DateTime.Now, From, maxReservationTimeSpan, MailAddress, Code)
{ {
} }
/// <summary> /// <summary>
/// Reservation performed with other device/ before start of app. /// Reservation performed with other device/ before start of app.
/// Date time info when bike was reserved has been received from webserver. /// Date time info when bike was reserved has been received from web server.
/// </summary> /// </summary>
/// <param name="dateTimeNowProvider"> /// <param name="dateTimeNowProvider">
/// Used to to provide current date time information for potential calls of <seealso cref="GetIsStillReserved"/>. /// Used to provide current date time information for potential calls of <seealso cref="GetIsStillReserved"/>.
/// Not used to calculate remaining time because this duration whould always be shorter as the one received from webserver. /// Not used to calculate remaining time because this duration would always be shorter as the one received from web server.
/// </param> /// </param>
/// <param name="maxReservationTimeSpan">Time span for which a bike can be reserved.</param>
public StateRequestedInfo( public StateRequestedInfo(
Func<DateTime> dateTimeNowProvider, Func<DateTime> dateTimeNowProvider,
DateTime from, DateTime from,
TimeSpan maxReservationTimeSpan,
string mailAddress, string mailAddress,
string code) : base(InUseStateEnum.Reserved) string code) : base(InUseStateEnum.Reserved)
{ {
_DateTimeNowProvider = dateTimeNowProvider ?? (() => DateTime.Now); _DateTimeNowProvider = dateTimeNowProvider ?? (() => DateTime.Now);
MaxReservationTimeSpan = maxReservationTimeSpan;
From = from; From = from;
MailAddress = mailAddress; MailAddress = mailAddress;
Code = code; Code = code;
@ -63,34 +75,28 @@ namespace TINK.Model.State
/// <summary> /// <summary>
/// Tries update /// Tries update
/// </summary> /// </summary>
/// <returns>True if reservation span has not exeeded and state remains reserved, false otherwise.</returns> /// <returns>True if reservation span has not exceeded and state remains reserved, false otherwise.</returns>
/// <todo>Implement logging of time stamps.</todo> /// <todo>Implement logging of time stamps.</todo>
public bool GetIsStillReserved(out TimeSpan? p_oRemainingTime) public bool GetIsStillReserved(out TimeSpan? remainingTime)
{ {
var l_oTimeReserved = _DateTimeNowProvider().Subtract(From); var timeReserved = _DateTimeNowProvider().Subtract(From);
if (l_oTimeReserved > MaximumReserveTime) if (timeReserved > MaxReservationTimeSpan)
{ {
// Reservation has elapsed. To not update remaining time. // Reservation has elapsed. Do not update remaining time.
p_oRemainingTime = null; remainingTime = null;
return false; return false;
} }
p_oRemainingTime = MaximumReserveTime - l_oTimeReserved; remainingTime = MaxReservationTimeSpan - timeReserved;
return true; return true;
} }
/// <summary> /// <summary>
/// State reserved. /// State reserved.
/// Setter exists only for serialization purposes.
/// </summary> /// </summary>
public override InUseStateEnum Value public override InUseStateEnum Value =>
{ InUseStateEnum.Reserved;
get
{
return InUseStateEnum.Reserved;
}
}
/// <summary> /// <summary>
/// Date time when bike was reserved. /// Date time when bike was reserved.

View file

@ -1,6 +1,7 @@
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using TINK.MultilingualResources; using TINK.MultilingualResources;
using TINK.Repository.Exception;
using Xamarin.Essentials; using Xamarin.Essentials;
namespace TINK.Model namespace TINK.Model
@ -692,6 +693,21 @@ namespace TINK.Model
AppResources.ChangeLog_3_0_365_MK_SB, AppResources.ChangeLog_3_0_365_MK_SB,
new List<AppFlavor> { AppFlavor.MeinKonrad, AppFlavor.ShareeBike } new List<AppFlavor> { AppFlavor.MeinKonrad, AppFlavor.ShareeBike }
}, },
{
new Version(3, 0, 366),
AppResources.ChangeLog_3_0_366_MK_SB,
new List<AppFlavor> { AppFlavor.MeinKonrad, AppFlavor.ShareeBike }
},
{
new Version(3, 0, 368),
string.Format("{0} <br /> {1}", AppResources.ChangeLog_PackageUpdates, AppResources.ChangeLog_MinorBugFixes),
new List<AppFlavor> { AppFlavor.MeinKonrad, AppFlavor.ShareeBike }
},
{
new Version(3, 0, 369),
AppResources.ChangeLog_3_0_369_MK_SB,
new List<AppFlavor> { AppFlavor.MeinKonrad, AppFlavor.ShareeBike }
},
}; };
/// <summary> Manges the whats new information.</summary> /// <summary> Manges the whats new information.</summary>

View file

@ -1,4 +1,4 @@
//------------------------------------------------------------------------------ //------------------------------------------------------------------------------
// <auto-generated> // <auto-generated>
// This code was generated by a tool. // This code was generated by a tool.
// Runtime Version:4.0.30319.42000 // Runtime Version:4.0.30319.42000
@ -96,24 +96,6 @@ namespace TINK.MultilingualResources {
} }
} }
/// <summary>
/// Looks up a localized string similar to Sent e-mail.
/// </summary>
public static string ActionContactMailAppReleated {
get {
return ResourceManager.GetString("ActionContactMailAppReleated", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Submit rating.
/// </summary>
public static string ActionContactRate {
get {
return ResourceManager.GetString("ActionContactRate", resourceCulture);
}
}
/// <summary> /// <summary>
/// Looks up a localized string similar to Give feedback. /// Looks up a localized string similar to Give feedback.
/// </summary> /// </summary>
@ -204,6 +186,15 @@ namespace TINK.MultilingualResources {
} }
} }
/// <summary>
/// Looks up a localized string similar to Select another station.
/// </summary>
public static string ActionSelectAnotherStation {
get {
return ResourceManager.GetString("ActionSelectAnotherStation", resourceCulture);
}
}
/// <summary> /// <summary>
/// Looks up a localized string similar to Select station. /// Looks up a localized string similar to Select station.
/// </summary> /// </summary>
@ -213,6 +204,15 @@ namespace TINK.MultilingualResources {
} }
} }
/// <summary>
/// Looks up a localized string similar to &lt;u&gt;Transfer diagnostic file&lt;/u&gt;.
/// </summary>
public static string ActionSendDiagnosis {
get {
return ResourceManager.GetString("ActionSendDiagnosis", resourceCulture);
}
}
/// <summary> /// <summary>
/// Looks up a localized string similar to Auth. expired. /// Looks up a localized string similar to Auth. expired.
/// </summary> /// </summary>
@ -803,7 +803,27 @@ namespace TINK.MultilingualResources {
} }
/// <summary> /// <summary>
/// Looks up a localized string similar to We have fixed some bugs. Enjoy the ride!. /// 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> /// </summary>
public static string ChangeLog_MinorBugFixes { public static string ChangeLog_MinorBugFixes {
get { get {
@ -812,7 +832,7 @@ namespace TINK.MultilingualResources {
} }
/// <summary> /// <summary>
/// Looks up a localized string similar to A few small things have been changed in the design.. /// Looks up a localized string similar to - A few small things have been changed in the design..
/// </summary> /// </summary>
public static string ChangeLog_MinorDesignImprovements { public static string ChangeLog_MinorDesignImprovements {
get { get {
@ -821,7 +841,7 @@ namespace TINK.MultilingualResources {
} }
/// <summary> /// <summary>
/// Looks up a localized string similar to Minor improvements.. /// Looks up a localized string similar to - Minor improvements..
/// </summary> /// </summary>
public static string ChangeLog_MinorImprovements { public static string ChangeLog_MinorImprovements {
get { get {
@ -830,7 +850,7 @@ namespace TINK.MultilingualResources {
} }
/// <summary> /// <summary>
/// Looks up a localized string similar to Software packages were updated.. /// Looks up a localized string similar to - Software packages were updated..
/// </summary> /// </summary>
public static string ChangeLog_PackageUpdates { public static string ChangeLog_PackageUpdates {
get { get {
@ -1707,6 +1727,15 @@ namespace TINK.MultilingualResources {
} }
} }
/// <summary>
/// Looks up a localized string similar to Location query failed.
/// </summary>
public static string ErrorQueryGeolocation {
get {
return ResourceManager.GetString("ErrorQueryGeolocation", resourceCulture);
}
}
/// <summary> /// <summary>
/// Looks up a localized string similar to Your mobile device does not connect to the bike lock. Please step as close as possible to the bike and try again.. /// Looks up a localized string similar to Your mobile device does not connect to the bike lock. Please step as close as possible to the bike and try again..
/// </summary> /// </summary>
@ -1727,7 +1756,8 @@ namespace TINK.MultilingualResources {
/// <summary> /// <summary>
/// Looks up a localized string similar to End rental at an unknown location is not possible. /// Looks up a localized string similar to End rental at an unknown location is not possible.
///Getting geolocation failed.. ///Make sure you have granted location sharing permission and your location services are enabled.
///Try again!.
/// </summary> /// </summary>
public static string ErrorReturnBikeLockClosedGetGPSExceptionMessage { public static string ErrorReturnBikeLockClosedGetGPSExceptionMessage {
get { get {
@ -2004,7 +2034,16 @@ namespace TINK.MultilingualResources {
} }
/// <summary> /// <summary>
/// Looks up a localized string similar to Contact operator?. /// Looks up a localized string similar to Customer support.
/// </summary>
public static string MarkingContactCustomerSupportTitle {
get {
return ResourceManager.GetString("MarkingContactCustomerSupportTitle", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to First select the station whose operator you want to contact..
/// </summary> /// </summary>
public static string MarkingContactNoStationInfoAvailableNoButton { public static string MarkingContactNoStationInfoAvailableNoButton {
get { get {
@ -2103,7 +2142,16 @@ namespace TINK.MultilingualResources {
} }
/// <summary> /// <summary>
/// Looks up a localized string similar to Bike ID including prefix. /// Looks up a localized string similar to Search.
/// </summary>
public static string MarkingFindBikeButton {
get {
return ResourceManager.GetString("MarkingFindBikeButton", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Bike id.
/// </summary> /// </summary>
public static string MarkingFindBikeLabel { public static string MarkingFindBikeLabel {
get { get {
@ -2111,6 +2159,15 @@ namespace TINK.MultilingualResources {
} }
} }
/// <summary>
/// Looks up a localized string similar to You search a .
/// </summary>
public static string MarkingFindBikeTypeOfBikeText {
get {
return ResourceManager.GetString("MarkingFindBikeTypeOfBikeText", resourceCulture);
}
}
/// <summary> /// <summary>
/// Looks up a localized string similar to Menu. /// Looks up a localized string similar to Menu.
/// </summary> /// </summary>
@ -2129,6 +2186,15 @@ namespace TINK.MultilingualResources {
} }
} }
/// <summary>
/// Looks up a localized string similar to Last selected station.
/// </summary>
public static string MarkingLastSelectedStation {
get {
return ResourceManager.GetString("MarkingLastSelectedStation", resourceCulture);
}
}
/// <summary> /// <summary>
/// Looks up a localized string similar to Lock control. /// Looks up a localized string similar to Lock control.
/// </summary> /// </summary>
@ -2292,6 +2358,15 @@ namespace TINK.MultilingualResources {
} }
} }
/// <summary>
/// Looks up a localized string similar to Operator.
/// </summary>
public static string MarkingOperator {
get {
return ResourceManager.GetString("MarkingOperator", resourceCulture);
}
}
/// <summary> /// <summary>
/// Looks up a localized string similar to Is bike okay?. /// Looks up a localized string similar to Is bike okay?.
/// </summary> /// </summary>
@ -2662,6 +2737,24 @@ 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..
/// </summary>
public static string MessageBikeTypeInfoText {
get {
return ResourceManager.GetString("MessageBikeTypeInfoText", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Selected bike type.
/// </summary>
public static string MessageBikeTypeInfoTitle {
get {
return ResourceManager.GetString("MessageBikeTypeInfoTitle", resourceCulture);
}
}
/// <summary> /// <summary>
/// Looks up a localized string similar to Connection error when canceling the reservation!. /// Looks up a localized string similar to Connection error when canceling the reservation!.
/// </summary> /// </summary>
@ -2921,15 +3014,6 @@ namespace TINK.MultilingualResources {
} }
} }
/// <summary>
/// Looks up a localized string similar to Feedback to app development?.
/// </summary>
public static string MessageRateMail {
get {
return ResourceManager.GetString("MessageRateMail", resourceCulture);
}
}
/// <summary> /// <summary>
/// Looks up a localized string similar to Connection error when renting the bike!. /// Looks up a localized string similar to Connection error when renting the bike!.
/// </summary> /// </summary>
@ -3030,16 +3114,7 @@ namespace TINK.MultilingualResources {
} }
/// <summary> /// <summary>
/// Looks up a localized string similar to {0}-app releated request. /// Looks up a localized string similar to Prefix and No., e.g. TR15.
/// </summary>
public static string MiscContactMailAppReleatedSubject {
get {
return ResourceManager.GetString("MiscContactMailAppReleatedSubject", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Bike ID including prefix e.g. TR15.
/// </summary> /// </summary>
public static string PlaceholderFindBike { public static string PlaceholderFindBike {
get { get {
@ -3138,9 +3213,9 @@ namespace TINK.MultilingualResources {
} }
/// <summary> /// <summary>
/// Looks up a localized string similar to I hereby consent to the transmission of my log file. /// Looks up a localized string similar to I hereby consent to the transmission of my diagnostic file.
/// ///
///The log file contains your app usage data as well as system information. The data will only be used for diagnostic purposes or to improve the app and then deleted.. ///The diagnostic file contains your app usage data as well as system information. The data will only be used for diagnostic purposes or to improve the app and is then deleted..
/// </summary> /// </summary>
public static string QuestionSupportmailAttachment { public static string QuestionSupportmailAttachment {
get { get {
@ -3248,7 +3323,7 @@ namespace TINK.MultilingualResources {
} }
/// <summary> /// <summary>
/// Looks up a localized string similar to Code {0}, location {1}, max. reservation time of {2} min. expired.. /// Looks up a localized string similar to Code {0}, location {1}, max. reservation time expired..
/// </summary> /// </summary>
public static string StatusTextReservationExpiredCodeLocationMaxReservationTime { public static string StatusTextReservationExpiredCodeLocationMaxReservationTime {
get { get {
@ -3266,7 +3341,7 @@ namespace TINK.MultilingualResources {
} }
/// <summary> /// <summary>
/// Looks up a localized string similar to Code {0}, max. reservation time of {1} min. expired.. /// Looks up a localized string similar to Code {0}, max. reservation time expired..
/// </summary> /// </summary>
public static string StatusTextReservationExpiredCodeMaxReservationTime { public static string StatusTextReservationExpiredCodeMaxReservationTime {
get { get {
@ -3284,7 +3359,7 @@ namespace TINK.MultilingualResources {
} }
/// <summary> /// <summary>
/// Looks up a localized string similar to Location {0}, max. reservation time of {1} min. expired.. /// Looks up a localized string similar to Location {0}, max. reservation time expired..
/// </summary> /// </summary>
public static string StatusTextReservationExpiredLocationMaxReservationTime { public static string StatusTextReservationExpiredLocationMaxReservationTime {
get { get {
@ -3302,7 +3377,7 @@ namespace TINK.MultilingualResources {
} }
/// <summary> /// <summary>
/// Looks up a localized string similar to Max. reservation time of {0} min. expired.. /// Looks up a localized string similar to Max. reservation time expired..
/// </summary> /// </summary>
public static string StatusTextReservationExpiredMaximumReservationTime { public static string StatusTextReservationExpiredMaximumReservationTime {
get { get {
@ -3329,7 +3404,7 @@ namespace TINK.MultilingualResources {
} }
/// <summary> /// <summary>
/// Looks up a localized string similar to {0} request. /// Looks up a localized string similar to {0}-request: station {1}.
/// </summary> /// </summary>
public static string SupportmailSubjectOperatormail { public static string SupportmailSubjectOperatormail {
get { get {

View file

@ -157,9 +157,6 @@ Mietende ist nur möglich, wenn das Rad in Reichweite ist und Standortinformatio
<data name="MessageContactMail" xml:space="preserve"> <data name="MessageContactMail" xml:space="preserve">
<value>Fragen? Hinweise?</value> <value>Fragen? Hinweise?</value>
</data> </data>
<data name="MessageRateMail" xml:space="preserve">
<value>Rückmeldung an die App-Entwicklung?</value>
</data>
<data name="MessageWaring" xml:space="preserve"> <data name="MessageWaring" xml:space="preserve">
<value>Warnung</value> <value>Warnung</value>
</data> </data>
@ -170,9 +167,9 @@ Mietende ist nur möglich, wenn das Rad in Reichweite ist und Standortinformatio
<value>Ja</value> <value>Ja</value>
</data> </data>
<data name="QuestionSupportmailAttachment" xml:space="preserve"> <data name="QuestionSupportmailAttachment" xml:space="preserve">
<value>Hiermit stimme ich der Übermittlung meiner Protokolldatei zu. <value>Hiermit stimme ich der Übermittlung meiner Diagnosedatei zu.
Die Protokolldatei enthält Ihre App-Nutzungsdaten sowie Systeminformationen. Die Daten werden ausschließlich für Diagnosezwecke bzw. Verbesserung der App verwendet und werden anschließend gelöscht.</value> Die Diagnosedatei enthält Ihre App-Nutzungsdaten sowie Systeminformationen. Die Daten werden ausschließlich für Diagnosezwecke bzw. Verbesserung der App verwendet und werden anschließend gelöscht.</value>
</data> </data>
<data name="QuestionTitle" xml:space="preserve"> <data name="QuestionTitle" xml:space="preserve">
<value>Frage</value> <value>Frage</value>
@ -182,7 +179,7 @@ Die Protokolldatei enthält Ihre App-Nutzungsdaten sowie Systeminformationen. Di
Bitte melden Sie sich erneut an.</value> Bitte melden Sie sich erneut an.</value>
</data> </data>
<data name="StatusTextReservationExpiredCodeMaxReservationTime" xml:space="preserve"> <data name="StatusTextReservationExpiredCodeMaxReservationTime" xml:space="preserve">
<value>Code ist {0}, max. Reservierungszeit von {1} Min. abgelaufen. <value>Code ist {0}, max. Reservierungszeit abgelaufen.
</value> </value>
</data> </data>
<data name="StatusTextReservationExpiredCodeRemaining" xml:space="preserve"> <data name="StatusTextReservationExpiredCodeRemaining" xml:space="preserve">
@ -199,13 +196,13 @@ Bitte melden Sie sich erneut an.</value>
<value>Noch {0} Min. reserviert.</value> <value>Noch {0} Min. reserviert.</value>
</data> </data>
<data name="StatusTextReservationExpiredMaximumReservationTime" xml:space="preserve"> <data name="StatusTextReservationExpiredMaximumReservationTime" xml:space="preserve">
<value>Max. Reservierungszeit von {0} Min. abgelaufen.</value> <value>Max. Reservierungszeit abgelaufen.</value>
</data> </data>
<data name="StatusTextBookedCodeSince" xml:space="preserve"> <data name="StatusTextBookedCodeSince" xml:space="preserve">
<value>Code ist {0}, gemietet seit {1}.</value> <value>Code ist {0}, gemietet seit {1}.</value>
</data> </data>
<data name="StatusTextReservationExpiredLocationMaxReservationTime" xml:space="preserve"> <data name="StatusTextReservationExpiredLocationMaxReservationTime" xml:space="preserve">
<value>Standort {0}, max. Reservierungszeit von {1} Min. abgelaufen. <value>Standort {0}, max. Reservierungszeit abgelaufen.
</value> </value>
</data> </data>
<data name="StatusTextAvailable" xml:space="preserve"> <data name="StatusTextAvailable" xml:space="preserve">
@ -216,7 +213,7 @@ Bitte melden Sie sich erneut an.</value>
</value> </value>
</data> </data>
<data name="StatusTextReservationExpiredCodeLocationMaxReservationTime" xml:space="preserve"> <data name="StatusTextReservationExpiredCodeLocationMaxReservationTime" xml:space="preserve">
<value>Code ist {0}, Standort {1}, max. Reservierungszeit von {2} Min. abgelaufen. <value>Code ist {0}, Standort {1}, max. Reservierungszeit abgelaufen.
</value> </value>
</data> </data>
<data name="StatusTextReservationExpiredCodeLocationReservationTime" xml:space="preserve"> <data name="StatusTextReservationExpiredCodeLocationReservationTime" xml:space="preserve">
@ -248,9 +245,6 @@ Bitte melden Sie sich erneut an.</value>
<data name="MarkingLoginPasswordPlaceholder" xml:space="preserve"> <data name="MarkingLoginPasswordPlaceholder" xml:space="preserve">
<value>Passwort</value> <value>Passwort</value>
</data> </data>
<data name="ActionContactRate" xml:space="preserve">
<value>Bewertung abgeben</value>
</data>
<data name="MarkingLoginInstructions" xml:space="preserve"> <data name="MarkingLoginInstructions" xml:space="preserve">
<value>Anleitung TINK Räder</value> <value>Anleitung TINK Räder</value>
</data> </data>
@ -605,7 +599,7 @@ Layout Anzeige Radnamen und nummern verbessert.</value>
<value>Bitte Anmelden, um Räder zu reservieren! &lt;font color="blue"&gt;&lt;u&gt;Hier&lt;/u&gt;&lt;/font&gt; tippen, um auf Anmeldeseite zu wechseln.</value> <value>Bitte Anmelden, um Räder zu reservieren! &lt;font color="blue"&gt;&lt;u&gt;Hier&lt;/u&gt;&lt;/font&gt; tippen, um auf Anmeldeseite zu wechseln.</value>
</data> </data>
<data name="MarkingContactNoStationInfoAvailableNoButton" xml:space="preserve"> <data name="MarkingContactNoStationInfoAvailableNoButton" xml:space="preserve">
<value>Betreiber kontaktieren?</value> <value>Wählen Sie zunächst die Station, zu deren Betreiber Sie Kontakt aufnehmen möchten.</value>
</data> </data>
<data name="ChangeLog3_0_241" xml:space="preserve"> <data name="ChangeLog3_0_241" xml:space="preserve">
<value>Auf der Kontaktseite werden Kontaktinformationen betreiberspezifisch angezeigt.</value> <value>Auf der Kontaktseite werden Kontaktinformationen betreiberspezifisch angezeigt.</value>
@ -907,13 +901,6 @@ Kleinere Fehlerbehebungen.
<data name="ActionGiveFeedback" xml:space="preserve"> <data name="ActionGiveFeedback" xml:space="preserve">
<value>Rückmeldung geben</value> <value>Rückmeldung geben</value>
</data> </data>
<data name="ActionContactMailAppReleated" xml:space="preserve">
<value>E-Mail senden</value>
</data>
<data name="MiscContactMailAppReleatedSubject" xml:space="preserve">
<value>{0}-App Anfrage</value>
<comment>Subject of contact mail to ("Feedback about the app").</comment>
</data>
<data name="MessageReservingBikeErrorConnectionTitle" xml:space="preserve"> <data name="MessageReservingBikeErrorConnectionTitle" xml:space="preserve">
<value>Verbingungsfehler beim Reservieren des Rads!</value> <value>Verbingungsfehler beim Reservieren des Rads!</value>
</data> </data>
@ -978,7 +965,7 @@ Kleinere Fehlerbehebungen.
<value>Die App hat ein neues Design! --- Sie sind Beta-Tester? Geben Sie uns jederzeit hilfreiche Rückmeldung über 'Kontakt - Rückmeldung zur App'. Sie sind noch kein Beta-Tester? Werden Sie es und erhalten Sie tolle neue Features vor allen anderen!</value> <value>Die App hat ein neues Design! --- Sie sind Beta-Tester? Geben Sie uns jederzeit hilfreiche Rückmeldung über 'Kontakt - Rückmeldung zur App'. Sie sind noch kein Beta-Tester? Werden Sie es und erhalten Sie tolle neue Features vor allen anderen!</value>
</data> </data>
<data name="ChangeLog_MinorBugFixes" xml:space="preserve"> <data name="ChangeLog_MinorBugFixes" xml:space="preserve">
<value>Wir haben einige Fehler behoben. Genießen Sie die Fahrt!</value> <value>- Wir haben ein paar kleine Fehler behoben. Genießen Sie die Fahrt!</value>
</data> </data>
<data name="ChangeLog3_0_338_LB_MK" xml:space="preserve"> <data name="ChangeLog3_0_338_LB_MK" xml:space="preserve">
<value>Neben kleineren Fehlerbehebungen haben wir die Kontaktaufnahme vereinfacht: <value>Neben kleineren Fehlerbehebungen haben wir die Kontaktaufnahme vereinfacht:
@ -998,7 +985,7 @@ Außerdem: Kleine Grafiken lassen auf einen Blick erkennen um was für einen Rad
<value>{0}-App Anfrage</value> <value>{0}-App Anfrage</value>
</data> </data>
<data name="SupportmailSubjectOperatormail" xml:space="preserve"> <data name="SupportmailSubjectOperatormail" xml:space="preserve">
<value>{0} Anfrage</value> <value>{0}-Anfrage: Station {1}</value>
</data> </data>
<data name="QuestionSupportmailAnswerNo" xml:space="preserve"> <data name="QuestionSupportmailAnswerNo" xml:space="preserve">
<value>Nein, Datei nicht anhängen</value> <value>Nein, Datei nicht anhängen</value>
@ -1007,7 +994,7 @@ Außerdem: Kleine Grafiken lassen auf einen Blick erkennen um was für einen Rad
<value>Einwilligung</value> <value>Einwilligung</value>
</data> </data>
<data name="PlaceholderFindBike" xml:space="preserve"> <data name="PlaceholderFindBike" xml:space="preserve">
<value>Rad-ID inklusive Präfix, z.B. TR15</value> <value>Präfix und Nr., z.B. TR15</value>
</data> </data>
<data name="ChangeLog3_0_339_MK" xml:space="preserve"> <data name="ChangeLog3_0_339_MK" xml:space="preserve">
<value>Die Lastenräder aus den Vororten zeigen nun ihre Heimatstation im Namen an. Diese Räder müssen dort wieder abgeben werden! <value>Die Lastenräder aus den Vororten zeigen nun ihre Heimatstation im Namen an. Diese Räder müssen dort wieder abgeben werden!
@ -1018,7 +1005,7 @@ Sie können nun auf einen Blick sehen, welche App-Version Sie installiert haben:
<value>Sie können nun auf einen Blick sehen, welche App-Version Sie installiert haben: im Menü ganz unten. Bitte aktualisieren Sie die App regelmäßig, um in Funktionalität und Design auf dem neuesten Stand zu sein!</value> <value>Sie können nun auf einen Blick sehen, welche App-Version Sie installiert haben: im Menü ganz unten. Bitte aktualisieren Sie die App regelmäßig, um in Funktionalität und Design auf dem neuesten Stand zu sein!</value>
</data> </data>
<data name="ChangeLog_MinorDesignImprovements" xml:space="preserve"> <data name="ChangeLog_MinorDesignImprovements" xml:space="preserve">
<value>Es wurden ein paar Kleinigkeiten im Design verändert.</value> <value>- Es wurden ein paar Kleinigkeiten im Design verändert.</value>
</data> </data>
<data name="MarkingContactSupportBusy" xml:space="preserve"> <data name="MarkingContactSupportBusy" xml:space="preserve">
<value>{0} &lt;font color="gray"&gt;&lt;u&gt;kontaktieren&lt;/u&gt;&lt;/font&gt;.</value> <value>{0} &lt;font color="gray"&gt;&lt;u&gt;kontaktieren&lt;/u&gt;&lt;/font&gt;.</value>
@ -1095,7 +1082,7 @@ Probieren Sie es aus!</value>
&lt;/ul&gt;</value> &lt;/ul&gt;</value>
</data> </data>
<data name="ChangeLog_PackageUpdates" xml:space="preserve"> <data name="ChangeLog_PackageUpdates" xml:space="preserve">
<value>Softwarepakete wurden aktualisiert.</value> <value>- Softwarepakete wurden aktualisiert.</value>
</data> </data>
<data name="ChangeLog_3_0_355_MK_SB_iOS" xml:space="preserve"> <data name="ChangeLog_3_0_355_MK_SB_iOS" xml:space="preserve">
<value>Bluetooth-Kommunikation verbessert.</value> <value>Bluetooth-Kommunikation verbessert.</value>
@ -1113,7 +1100,7 @@ Probieren Sie es aus!</value>
<value>Information</value> <value>Information</value>
</data> </data>
<data name="ChangeLog_MinorImprovements" xml:space="preserve"> <data name="ChangeLog_MinorImprovements" xml:space="preserve">
<value>Kleine Verbesserungen.</value> <value>- Kleine Verbesserungen.</value>
</data> </data>
<data name="ErrorOpenLockBoldStatusIsUnknownMessage" xml:space="preserve"> <data name="ErrorOpenLockBoldStatusIsUnknownMessage" xml:space="preserve">
<value>Das Schloss konnte nicht korrekt geöffnet werden. Bitte versuchen Sie es erneut. <value>Das Schloss konnte nicht korrekt geöffnet werden. Bitte versuchen Sie es erneut.
@ -1145,7 +1132,8 @@ Fehler beim Start der Standortabfrage!</value>
</data> </data>
<data name="ErrorReturnBikeLockClosedGetGPSExceptionMessage" xml:space="preserve"> <data name="ErrorReturnBikeLockClosedGetGPSExceptionMessage" xml:space="preserve">
<value>Beenden der Miete an unbekanntem Standort is nicht möglich. <value>Beenden der Miete an unbekanntem Standort is nicht möglich.
Fehler bei der Standortabfrage!</value> Stellen Sie sicher, dass Sie die Erlaubnis zur Standortfreigabe erteilt haben und Ihre Standortdienste aktiviert sind.
Versuchen Sie erneut!</value>
</data> </data>
<data name="Error_ReturnBike_Station_Location_Message" xml:space="preserve"> <data name="Error_ReturnBike_Station_Location_Message" xml:space="preserve">
<value>Wir konnten das Rad keiner Station zuordnen. Dazu benötigen wir Ihre Standortinformationen, während Sie direkt neben dem Rad stehen. Nur dann kann Ihre Miete beendet werden! <value>Wir konnten das Rad keiner Station zuordnen. Dazu benötigen wir Ihre Standortinformationen, während Sie direkt neben dem Rad stehen. Nur dann kann Ihre Miete beendet werden!
@ -1171,7 +1159,7 @@ Außerdem:&lt;br/&gt;
- Paketaktualisierungen</value> - Paketaktualisierungen</value>
</data> </data>
<data name="MarkingFindBikeLabel" xml:space="preserve"> <data name="MarkingFindBikeLabel" xml:space="preserve">
<value>Rad-ID inklusive Präfix</value> <value>Rad-ID</value>
</data> </data>
<data name="MarkingSearchBike" xml:space="preserve"> <data name="MarkingSearchBike" xml:space="preserve">
<value>Rad suchen</value> <value>Rad suchen</value>
@ -1188,4 +1176,42 @@ Außerdem:&lt;br/&gt;
<data name="ChangeLog_3_0_365_MK_SB" xml:space="preserve"> <data name="ChangeLog_3_0_365_MK_SB" xml:space="preserve">
<value>Kleine Verbesserungen in Design und Performance.</value> <value>Kleine Verbesserungen in Design und Performance.</value>
</data> </data>
<data name="MarkingFindBikeTypeOfBikeText" xml:space="preserve">
<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>
</data>
<data name="MessageBikeTypeInfoTitle" xml:space="preserve">
<value>Ausgewählter Fahrradtyp</value>
</data>
<data name="MarkingFindBikeButton" xml:space="preserve">
<value>Suchen</value>
</data>
<data name="ChangeLog_3_0_366_MK_SB" xml:space="preserve">
<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="ErrorQueryGeolocation" xml:space="preserve">
<value>Standortabfrage fehlgeschlagen</value>
</data>
<data name="MarkingContactCustomerSupportTitle" xml:space="preserve">
<value>Kundensupport</value>
</data>
<data name="ActionSelectAnotherStation" xml:space="preserve">
<value>Andere Station auswählen</value>
</data>
<data name="ActionSendDiagnosis" xml:space="preserve">
<value>&lt;u&gt;Diagnosedatei übermitteln&lt;/u&gt;</value>
</data>
<data name="MarkingLastSelectedStation" xml:space="preserve">
<value>Zuletzt ausgewählte Station</value>
</data>
<data name="MarkingOperator" xml:space="preserve">
<value>Betreiber</value>
</data>
<data name="ChangeLog_3_0_369_MK_SB" xml:space="preserve">
<value>Wir haben die Kontakt-Seite neu gestaltet:
&lt;ul&gt;&lt;li&gt;Bitte kontaktieren Sie bei Problemen bei der Fahrradmiete umgehend den Kundensupport!
&lt;/li&gt;&lt;li&gt;Für die Diagnose eines Problems können Sie über "Diagnosedatei übermitteln" Ihre App-Nutzungsdaten an uns senden. Ohne Ihr aktives Zusenden zeichnen wir keine Ihrer Daten auf!&lt;/li&gt;&lt;/ul&gt;</value>
</data>
</root> </root>

View file

@ -248,9 +248,6 @@ Please log in again.</value>
<data name="MessagePhoneMail" xml:space="preserve"> <data name="MessagePhoneMail" xml:space="preserve">
<value>Urgent questions?</value> <value>Urgent questions?</value>
</data> </data>
<data name="MessageRateMail" xml:space="preserve">
<value>Feedback to app development?</value>
</data>
<data name="MessageWaring" xml:space="preserve"> <data name="MessageWaring" xml:space="preserve">
<value>Warning</value> <value>Warning</value>
</data> </data>
@ -267,9 +264,9 @@ Please log in again.</value>
<value>{0} request</value> <value>{0} request</value>
</data> </data>
<data name="QuestionSupportmailAttachment" xml:space="preserve"> <data name="QuestionSupportmailAttachment" xml:space="preserve">
<value>I hereby consent to the transmission of my log file. <value>I hereby consent to the transmission of my diagnostic file.
The log file contains your app usage data as well as system information. The data will only be used for diagnostic purposes or to improve the app and then deleted.</value> The diagnostic file contains your app usage data as well as system information. The data will only be used for diagnostic purposes or to improve the app and is then deleted.</value>
</data> </data>
<data name="QuestionSupportmailSubject" xml:space="preserve"> <data name="QuestionSupportmailSubject" xml:space="preserve">
<value>Does your request/comment relate to the {0}-app or to a more general subject?</value> <value>Does your request/comment relate to the {0}-app or to a more general subject?</value>
@ -299,7 +296,7 @@ The log file contains your app usage data as well as system information. The dat
<value>Rented since {0}.</value> <value>Rented since {0}.</value>
</data> </data>
<data name="StatusTextReservationExpiredMaximumReservationTime" xml:space="preserve"> <data name="StatusTextReservationExpiredMaximumReservationTime" xml:space="preserve">
<value>Max. reservation time of {0} min. expired.</value> <value>Max. reservation time expired.</value>
</data> </data>
<data name="StatusTextReservationExpiredCodeRemaining" xml:space="preserve"> <data name="StatusTextReservationExpiredCodeRemaining" xml:space="preserve">
<value>Code {0}, still {1} min. reserved.</value> <value>Code {0}, still {1} min. reserved.</value>
@ -308,7 +305,7 @@ The log file contains your app usage data as well as system information. The dat
<value>Still {0} min. reserved.</value> <value>Still {0} min. reserved.</value>
</data> </data>
<data name="StatusTextReservationExpiredCodeMaxReservationTime" xml:space="preserve"> <data name="StatusTextReservationExpiredCodeMaxReservationTime" xml:space="preserve">
<value>Code {0}, max. reservation time of {1} min. expired.</value> <value>Code {0}, max. reservation time expired.</value>
</data> </data>
<data name="StatusTextAvailable" xml:space="preserve"> <data name="StatusTextAvailable" xml:space="preserve">
<value>Available.</value> <value>Available.</value>
@ -317,20 +314,17 @@ The log file contains your app usage data as well as system information. The dat
<value>Code {0}, location {1}, rented since {2}.</value> <value>Code {0}, location {1}, rented since {2}.</value>
</data> </data>
<data name="StatusTextReservationExpiredCodeLocationMaxReservationTime" xml:space="preserve"> <data name="StatusTextReservationExpiredCodeLocationMaxReservationTime" xml:space="preserve">
<value>Code {0}, location {1}, max. reservation time of {2} min. expired.</value> <value>Code {0}, location {1}, max. reservation time expired.</value>
</data> </data>
<data name="StatusTextReservationExpiredCodeLocationReservationTime" xml:space="preserve"> <data name="StatusTextReservationExpiredCodeLocationReservationTime" xml:space="preserve">
<value>Code {0}, location {1}, still {2} min. reserved.</value> <value>Code {0}, location {1}, still {2} min. reserved.</value>
</data> </data>
<data name="StatusTextReservationExpiredLocationMaxReservationTime" xml:space="preserve"> <data name="StatusTextReservationExpiredLocationMaxReservationTime" xml:space="preserve">
<value>Location {0}, max. reservation time of {1} min. expired.</value> <value>Location {0}, max. reservation time expired.</value>
</data> </data>
<data name="StatusTextReservationExpiredLocationReservationTime" xml:space="preserve"> <data name="StatusTextReservationExpiredLocationReservationTime" xml:space="preserve">
<value>Location {0}, still {1} min. reserved.</value> <value>Location {0}, still {1} min. reserved.</value>
</data> </data>
<data name="ActionContactRate" xml:space="preserve">
<value>Submit rating</value>
</data>
<data name="ActionLoginLogin" xml:space="preserve"> <data name="ActionLoginLogin" xml:space="preserve">
<value>Login</value> <value>Login</value>
</data> </data>
@ -714,7 +708,7 @@ Layout of bike names and id display improved.</value>
<value>Find bike by id functionality added.</value> <value>Find bike by id functionality added.</value>
</data> </data>
<data name="MarkingContactNoStationInfoAvailableNoButton" xml:space="preserve"> <data name="MarkingContactNoStationInfoAvailableNoButton" xml:space="preserve">
<value>Contact operator?</value> <value>First select the station whose operator you want to contact.</value>
</data> </data>
<data name="MarkingContactSupport" xml:space="preserve"> <data name="MarkingContactSupport" xml:space="preserve">
<value>&lt;u&gt;Contact&lt;/u&gt; {0}.</value> <value>&lt;u&gt;Contact&lt;/u&gt; {0}.</value>
@ -1012,13 +1006,6 @@ Minor bugfixes.</value>
<data name="ActionGiveFeedback" xml:space="preserve"> <data name="ActionGiveFeedback" xml:space="preserve">
<value>Give feedback</value> <value>Give feedback</value>
</data> </data>
<data name="ActionContactMailAppReleated" xml:space="preserve">
<value>Sent e-mail</value>
</data>
<data name="MiscContactMailAppReleatedSubject" xml:space="preserve">
<value>{0}-app releated request</value>
<comment>Subject of contact mail to ("Feedback about the app").</comment>
</data>
<data name="MessageReservingBikeErrorConnectionTitle" xml:space="preserve"> <data name="MessageReservingBikeErrorConnectionTitle" xml:space="preserve">
<value>Connection error when reserving the bike!</value> <value>Connection error when reserving the bike!</value>
</data> </data>
@ -1083,7 +1070,7 @@ Minor bugfixes.</value>
<value>The app has a new design! --- You are a beta tester? Give us helpful feedback anytime via Contact - Feedback about the App. Not a beta tester yet? Become one and get great new features before anyone else!</value> <value>The app has a new design! --- You are a beta tester? Give us helpful feedback anytime via Contact - Feedback about the App. Not a beta tester yet? Become one and get great new features before anyone else!</value>
</data> </data>
<data name="ChangeLog_MinorBugFixes" xml:space="preserve"> <data name="ChangeLog_MinorBugFixes" xml:space="preserve">
<value>We have fixed some bugs. Enjoy the ride!</value> <value>- We have fixed a few minor bugs. Enjoy the ride!</value>
</data> </data>
<data name="ChangeLog3_0_338_LB_MK" xml:space="preserve"> <data name="ChangeLog3_0_338_LB_MK" xml:space="preserve">
<value>Besides minor bug fixes we have simplified the contact procedure: <value>Besides minor bug fixes we have simplified the contact procedure:
@ -1103,7 +1090,7 @@ In addition: Small graphics let you see at a glance what type of bike it is.</va
<value>{0}-app request</value> <value>{0}-app request</value>
</data> </data>
<data name="SupportmailSubjectOperatormail" xml:space="preserve"> <data name="SupportmailSubjectOperatormail" xml:space="preserve">
<value>{0} request</value> <value>{0}-request: station {1}</value>
</data> </data>
<data name="QuestionSupportmailAnswerNo" xml:space="preserve"> <data name="QuestionSupportmailAnswerNo" xml:space="preserve">
<value>No, do not attach file</value> <value>No, do not attach file</value>
@ -1112,7 +1099,7 @@ In addition: Small graphics let you see at a glance what type of bike it is.</va
<value>Consent</value> <value>Consent</value>
</data> </data>
<data name="PlaceholderFindBike" xml:space="preserve"> <data name="PlaceholderFindBike" xml:space="preserve">
<value>Bike ID including prefix e.g. TR15</value> <value>Prefix and No., e.g. TR15</value>
</data> </data>
<data name="ChangeLog3_0_339_MK" xml:space="preserve"> <data name="ChangeLog3_0_339_MK" xml:space="preserve">
<value>The cargo bikes from the suburbs now show their home station in their name. These bikes must be returned there! <value>The cargo bikes from the suburbs now show their home station in their name. These bikes must be returned there!
@ -1123,7 +1110,7 @@ You can now see at a glance which app version you have installed: in the menu at
<value>You can now see at a glance which app version you have installed: in the menu at the very bottom. Please update the app regularly to be up to date in functionality and design!</value> <value>You can now see at a glance which app version you have installed: in the menu at the very bottom. Please update the app regularly to be up to date in functionality and design!</value>
</data> </data>
<data name="ChangeLog_MinorDesignImprovements" xml:space="preserve"> <data name="ChangeLog_MinorDesignImprovements" xml:space="preserve">
<value>A few small things have been changed in the design.</value> <value>- A few small things have been changed in the design.</value>
</data> </data>
<data name="MarkingContactSupportBusy" xml:space="preserve"> <data name="MarkingContactSupportBusy" xml:space="preserve">
<value>&lt;font color="gray"&gt;&lt;u&gt;Contact&lt;/u&gt;&lt;/font&gt; {0}.</value> <value>&lt;font color="gray"&gt;&lt;u&gt;Contact&lt;/u&gt;&lt;/font&gt; {0}.</value>
@ -1198,7 +1185,7 @@ Try it out!</value>
&lt;/ul&gt;</value> &lt;/ul&gt;</value>
</data> </data>
<data name="ChangeLog_PackageUpdates" xml:space="preserve"> <data name="ChangeLog_PackageUpdates" xml:space="preserve">
<value>Software packages were updated.</value> <value>- Software packages were updated.</value>
</data> </data>
<data name="ChangeLog_3_0_355_MK_SB_iOS" xml:space="preserve"> <data name="ChangeLog_3_0_355_MK_SB_iOS" xml:space="preserve">
<value>Bluetooth communication improved.</value> <value>Bluetooth communication improved.</value>
@ -1220,7 +1207,7 @@ Try it out!</value>
&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;</value> &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;</value>
</data> </data>
<data name="ChangeLog_MinorImprovements" xml:space="preserve"> <data name="ChangeLog_MinorImprovements" xml:space="preserve">
<value>Minor improvements.</value> <value>- Minor improvements.</value>
</data> </data>
<data name="MarkingNoNetworkConnection" xml:space="preserve"> <data name="MarkingNoNetworkConnection" xml:space="preserve">
<value>Oops, there is no Internet connection.</value> <value>Oops, there is no Internet connection.</value>
@ -1234,7 +1221,8 @@ Start getting geolocation failed.</value>
</data> </data>
<data name="ErrorReturnBikeLockClosedGetGPSExceptionMessage" xml:space="preserve"> <data name="ErrorReturnBikeLockClosedGetGPSExceptionMessage" xml:space="preserve">
<value>End rental at an unknown location is not possible. <value>End rental at an unknown location is not possible.
Getting geolocation failed.</value> Make sure you have granted location sharing permission and your location services are enabled.
Try again!</value>
</data> </data>
<data name="Error_ReturnBike_Station_Location_Message" xml:space="preserve"> <data name="Error_ReturnBike_Station_Location_Message" xml:space="preserve">
<value>We could not assign the bike to any station. For this we need your location information while you are standing right next to the bike. Only then your rental can be terminated! <value>We could not assign the bike to any station. For this we need your location information while you are standing right next to the bike. Only then your rental can be terminated!
@ -1260,7 +1248,7 @@ Also:&lt;br/&gt;
- Package updates</value> - Package updates</value>
</data> </data>
<data name="MarkingFindBikeLabel" xml:space="preserve"> <data name="MarkingFindBikeLabel" xml:space="preserve">
<value>Bike ID including prefix</value> <value>Bike id</value>
</data> </data>
<data name="MarkingSearchBike" xml:space="preserve"> <data name="MarkingSearchBike" xml:space="preserve">
<value>Search bike</value> <value>Search bike</value>
@ -1277,4 +1265,42 @@ Also:&lt;br/&gt;
<data name="ChangeLog_3_0_365_MK_SB" xml:space="preserve"> <data name="ChangeLog_3_0_365_MK_SB" xml:space="preserve">
<value>Minor design and performance improvements.</value> <value>Minor design and performance improvements.</value>
</data> </data>
<data name="MarkingFindBikeTypeOfBikeText" xml:space="preserve">
<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>
</data>
<data name="MessageBikeTypeInfoTitle" xml:space="preserve">
<value>Selected bike type</value>
</data>
<data name="MarkingFindBikeButton" xml:space="preserve">
<value>Search</value>
</data>
<data name="ChangeLog_3_0_366_MK_SB" xml:space="preserve">
<value>On the "Select bike" page you can now search and rent several bikes one after the other. Afterwards you will find them under "My bikes".</value>
</data>
<data name="ErrorQueryGeolocation" xml:space="preserve">
<value>Location query failed</value>
</data>
<data name="ActionSelectAnotherStation" xml:space="preserve">
<value>Select another station</value>
</data>
<data name="MarkingContactCustomerSupportTitle" xml:space="preserve">
<value>Customer support</value>
</data>
<data name="MarkingLastSelectedStation" xml:space="preserve">
<value>Last selected station</value>
</data>
<data name="MarkingOperator" xml:space="preserve">
<value>Operator</value>
</data>
<data name="ActionSendDiagnosis" xml:space="preserve">
<value>&lt;u&gt;Transfer diagnostic file&lt;/u&gt;</value>
</data>
<data name="ChangeLog_3_0_369_MK_SB" xml:space="preserve">
<value>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 "Transfer diagnostic file". Without your active sending we do not record any of your data!&lt;/li&gt;&lt;/ul&gt;</value>
</data>
</root> </root>

View file

@ -202,10 +202,6 @@ Mietende ist nur möglich, wenn das Rad in Reichweite ist und Standortinformatio
<source>Questions? Remarks?</source> <source>Questions? Remarks?</source>
<target state="translated">Fragen? Hinweise?</target> <target state="translated">Fragen? Hinweise?</target>
</trans-unit> </trans-unit>
<trans-unit id="MessageRateMail" translate="yes" xml:space="preserve">
<source>Feedback to app development?</source>
<target state="translated">Rückmeldung an die App-Entwicklung?</target>
</trans-unit>
<trans-unit id="MessageWaring" translate="yes" xml:space="preserve"> <trans-unit id="MessageWaring" translate="yes" xml:space="preserve">
<source>Warning</source> <source>Warning</source>
<target state="translated">Warnung</target> <target state="translated">Warnung</target>
@ -219,12 +215,12 @@ Mietende ist nur möglich, wenn das Rad in Reichweite ist und Standortinformatio
<target state="translated">Ja</target> <target state="translated">Ja</target>
</trans-unit> </trans-unit>
<trans-unit id="QuestionSupportmailAttachment" translate="yes" xml:space="preserve"> <trans-unit id="QuestionSupportmailAttachment" translate="yes" xml:space="preserve">
<source>I hereby consent to the transmission of my log file. <source>I hereby consent to the transmission of my diagnostic file.
The log file contains your app usage data as well as system information. The data will only be used for diagnostic purposes or to improve the app and then deleted.</source> The diagnostic file contains your app usage data as well as system information. The data will only be used for diagnostic purposes or to improve the app and is then deleted.</source>
<target state="translated">Hiermit stimme ich der Übermittlung meiner Protokolldatei zu. <target state="translated">Hiermit stimme ich der Übermittlung meiner Diagnosedatei zu.
Die Protokolldatei enthält Ihre App-Nutzungsdaten sowie Systeminformationen. Die Daten werden ausschließlich für Diagnosezwecke bzw. Verbesserung der App verwendet und werden anschließend gelöscht.</target> Die Diagnosedatei enthält Ihre App-Nutzungsdaten sowie Systeminformationen. Die Daten werden ausschließlich für Diagnosezwecke bzw. Verbesserung der App verwendet und werden anschließend gelöscht.</target>
</trans-unit> </trans-unit>
<trans-unit id="QuestionTitle" translate="yes" xml:space="preserve"> <trans-unit id="QuestionTitle" translate="yes" xml:space="preserve">
<source>Question</source> <source>Question</source>
@ -237,8 +233,8 @@ Please log in again.</source>
Bitte melden Sie sich erneut an.</target> Bitte melden Sie sich erneut an.</target>
</trans-unit> </trans-unit>
<trans-unit id="StatusTextReservationExpiredCodeMaxReservationTime" translate="yes" xml:space="preserve"> <trans-unit id="StatusTextReservationExpiredCodeMaxReservationTime" translate="yes" xml:space="preserve">
<source>Code {0}, max. reservation time of {1} min. expired.</source> <source>Code {0}, max. reservation time expired.</source>
<target state="translated">Code ist {0}, max. Reservierungszeit von {1} Min. abgelaufen. <target state="translated">Code ist {0}, max. Reservierungszeit abgelaufen.
</target> </target>
</trans-unit> </trans-unit>
<trans-unit id="StatusTextReservationExpiredCodeRemaining" translate="yes" xml:space="preserve"> <trans-unit id="StatusTextReservationExpiredCodeRemaining" translate="yes" xml:space="preserve">
@ -259,16 +255,16 @@ Bitte melden Sie sich erneut an.</target>
<target state="translated">Noch {0} Min. reserviert.</target> <target state="translated">Noch {0} Min. reserviert.</target>
</trans-unit> </trans-unit>
<trans-unit id="StatusTextReservationExpiredMaximumReservationTime" translate="yes" xml:space="preserve"> <trans-unit id="StatusTextReservationExpiredMaximumReservationTime" translate="yes" xml:space="preserve">
<source>Max. reservation time of {0} min. expired.</source> <source>Max. reservation time expired.</source>
<target state="translated">Max. Reservierungszeit von {0} Min. abgelaufen.</target> <target state="translated">Max. Reservierungszeit abgelaufen.</target>
</trans-unit> </trans-unit>
<trans-unit id="StatusTextBookedCodeSince" translate="yes" xml:space="preserve"> <trans-unit id="StatusTextBookedCodeSince" translate="yes" xml:space="preserve">
<source>Code {0}, rented since {1}.</source> <source>Code {0}, rented since {1}.</source>
<target state="translated">Code ist {0}, gemietet seit {1}.</target> <target state="translated">Code ist {0}, gemietet seit {1}.</target>
</trans-unit> </trans-unit>
<trans-unit id="StatusTextReservationExpiredLocationMaxReservationTime" translate="yes" xml:space="preserve"> <trans-unit id="StatusTextReservationExpiredLocationMaxReservationTime" translate="yes" xml:space="preserve">
<source>Location {0}, max. reservation time of {1} min. expired.</source> <source>Location {0}, max. reservation time expired.</source>
<target state="translated">Standort {0}, max. Reservierungszeit von {1} Min. abgelaufen. <target state="translated">Standort {0}, max. Reservierungszeit abgelaufen.
</target> </target>
</trans-unit> </trans-unit>
<trans-unit id="StatusTextAvailable" translate="yes" xml:space="preserve"> <trans-unit id="StatusTextAvailable" translate="yes" xml:space="preserve">
@ -281,8 +277,8 @@ Bitte melden Sie sich erneut an.</target>
</target> </target>
</trans-unit> </trans-unit>
<trans-unit id="StatusTextReservationExpiredCodeLocationMaxReservationTime" translate="yes" xml:space="preserve"> <trans-unit id="StatusTextReservationExpiredCodeLocationMaxReservationTime" translate="yes" xml:space="preserve">
<source>Code {0}, location {1}, max. reservation time of {2} min. expired.</source> <source>Code {0}, location {1}, max. reservation time expired.</source>
<target state="translated">Code ist {0}, Standort {1}, max. Reservierungszeit von {2} Min. abgelaufen. <target state="translated">Code ist {0}, Standort {1}, max. Reservierungszeit abgelaufen.
</target> </target>
</trans-unit> </trans-unit>
<trans-unit id="StatusTextReservationExpiredCodeLocationReservationTime" translate="yes" xml:space="preserve"> <trans-unit id="StatusTextReservationExpiredCodeLocationReservationTime" translate="yes" xml:space="preserve">
@ -323,10 +319,6 @@ Bitte melden Sie sich erneut an.</target>
<source>Password</source> <source>Password</source>
<target state="translated">Passwort</target> <target state="translated">Passwort</target>
</trans-unit> </trans-unit>
<trans-unit id="ActionContactRate" translate="yes" xml:space="preserve">
<source>Submit rating</source>
<target state="translated">Bewertung abgeben</target>
</trans-unit>
<trans-unit id="MarkingLoginInstructions" translate="yes" xml:space="preserve"> <trans-unit id="MarkingLoginInstructions" translate="yes" xml:space="preserve">
<source>Instructions TINK bikes</source> <source>Instructions TINK bikes</source>
<target state="translated">Anleitung TINK Räder</target> <target state="translated">Anleitung TINK Räder</target>
@ -814,8 +806,8 @@ Layout Anzeige Radnamen und nummern verbessert.</target>
<target state="translated">Bitte Anmelden, um Räder zu reservieren! <bpt id="1">&lt;font color="blue"&gt;</bpt><bpt id="2">&lt;u&gt;</bpt>Hier<ept id="2">&lt;/u&gt;</ept><ept id="1">&lt;/font&gt;</ept> tippen, um auf Anmeldeseite zu wechseln.</target> <target state="translated">Bitte Anmelden, um Räder zu reservieren! <bpt id="1">&lt;font color="blue"&gt;</bpt><bpt id="2">&lt;u&gt;</bpt>Hier<ept id="2">&lt;/u&gt;</ept><ept id="1">&lt;/font&gt;</ept> tippen, um auf Anmeldeseite zu wechseln.</target>
</trans-unit> </trans-unit>
<trans-unit id="MarkingContactNoStationInfoAvailableNoButton" translate="yes" xml:space="preserve"> <trans-unit id="MarkingContactNoStationInfoAvailableNoButton" translate="yes" xml:space="preserve">
<source>Contact operator?</source> <source>First select the station whose operator you want to contact.</source>
<target state="translated">Betreiber kontaktieren?</target> <target state="translated">Wählen Sie zunächst die Station, zu deren Betreiber Sie Kontakt aufnehmen möchten.</target>
</trans-unit> </trans-unit>
<trans-unit id="ChangeLog3_0_241" translate="yes" xml:space="preserve"> <trans-unit id="ChangeLog3_0_241" translate="yes" xml:space="preserve">
<source>Bike sharing system operator specific support info displayed on contact page.</source> <source>Bike sharing system operator specific support info displayed on contact page.</source>
@ -1234,16 +1226,6 @@ Kleinere Fehlerbehebungen.
<source>Give feedback</source> <source>Give feedback</source>
<target state="translated">Rückmeldung geben</target> <target state="translated">Rückmeldung geben</target>
</trans-unit> </trans-unit>
<trans-unit id="ActionContactMailAppReleated" translate="yes" xml:space="preserve">
<source>Sent e-mail</source>
<target state="translated">E-Mail senden</target>
</trans-unit>
<trans-unit id="MiscContactMailAppReleatedSubject" translate="yes" xml:space="preserve">
<source>{0}-app releated request</source>
<target state="translated">{0}-App Anfrage</target>
<note from="MultilingualBuild" annotates="source" priority="2">Subject of contact mail to ("Feedback about the app").</note>
<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="MessageReservingBikeErrorConnectionTitle" translate="yes" xml:space="preserve"> <trans-unit id="MessageReservingBikeErrorConnectionTitle" translate="yes" xml:space="preserve">
<source>Connection error when reserving the bike!</source> <source>Connection error when reserving the bike!</source>
<target state="translated">Verbingungsfehler beim Reservieren des Rads!</target> <target state="translated">Verbingungsfehler beim Reservieren des Rads!</target>
@ -1329,8 +1311,8 @@ Kleinere Fehlerbehebungen.
<target state="translated">Die App hat ein neues Design! --- Sie sind Beta-Tester? Geben Sie uns jederzeit hilfreiche Rückmeldung über 'Kontakt - Rückmeldung zur App'. Sie sind noch kein Beta-Tester? Werden Sie es und erhalten Sie tolle neue Features vor allen anderen!</target> <target state="translated">Die App hat ein neues Design! --- Sie sind Beta-Tester? Geben Sie uns jederzeit hilfreiche Rückmeldung über 'Kontakt - Rückmeldung zur App'. Sie sind noch kein Beta-Tester? Werden Sie es und erhalten Sie tolle neue Features vor allen anderen!</target>
</trans-unit> </trans-unit>
<trans-unit id="ChangeLog_MinorBugFixes" translate="yes" xml:space="preserve"> <trans-unit id="ChangeLog_MinorBugFixes" translate="yes" xml:space="preserve">
<source>We have fixed some bugs. Enjoy the ride!</source> <source>- We have fixed a few minor bugs. Enjoy the ride!</source>
<target state="translated">Wir haben einige Fehler behoben. Genießen Sie die Fahrt!</target> <target state="translated">- Wir haben ein paar kleine Fehler behoben. Genießen Sie die Fahrt!</target>
</trans-unit> </trans-unit>
<trans-unit id="ChangeLog3_0_338_LB_MK" translate="yes" xml:space="preserve"> <trans-unit id="ChangeLog3_0_338_LB_MK" translate="yes" xml:space="preserve">
<source>Besides minor bug fixes we have simplified the contact procedure: <source>Besides minor bug fixes we have simplified the contact procedure:
@ -1361,8 +1343,8 @@ Außerdem: Kleine Grafiken lassen auf einen Blick erkennen um was für einen Rad
<target state="translated">{0}-App Anfrage</target> <target state="translated">{0}-App Anfrage</target>
</trans-unit> </trans-unit>
<trans-unit id="SupportmailSubjectOperatormail" translate="yes" xml:space="preserve"> <trans-unit id="SupportmailSubjectOperatormail" translate="yes" xml:space="preserve">
<source>{0} request</source> <source>{0}-request: station {1}</source>
<target state="translated">{0} Anfrage</target> <target state="translated">{0}-Anfrage: Station {1}</target>
</trans-unit> </trans-unit>
<trans-unit id="QuestionSupportmailAnswerNo" translate="yes" xml:space="preserve"> <trans-unit id="QuestionSupportmailAnswerNo" translate="yes" xml:space="preserve">
<source>No, do not attach file</source> <source>No, do not attach file</source>
@ -1373,8 +1355,8 @@ Außerdem: Kleine Grafiken lassen auf einen Blick erkennen um was für einen Rad
<target state="translated">Einwilligung</target> <target state="translated">Einwilligung</target>
</trans-unit> </trans-unit>
<trans-unit id="PlaceholderFindBike" translate="yes" xml:space="preserve"> <trans-unit id="PlaceholderFindBike" translate="yes" xml:space="preserve">
<source>Bike ID including prefix e.g. TR15</source> <source>Prefix and No., e.g. TR15</source>
<target state="translated">Rad-ID inklusive Präfix, z.B. TR15</target> <target state="translated">Präfix und Nr., z.B. TR15</target>
</trans-unit> </trans-unit>
<trans-unit id="ChangeLog3_0_339_MK" translate="yes" xml:space="preserve"> <trans-unit id="ChangeLog3_0_339_MK" translate="yes" xml:space="preserve">
<source>The cargo bikes from the suburbs now show their home station in their name. These bikes must be returned there! <source>The cargo bikes from the suburbs now show their home station in their name. These bikes must be returned there!
@ -1389,8 +1371,8 @@ Sie können nun auf einen Blick sehen, welche App-Version Sie installiert haben:
<target state="translated">Sie können nun auf einen Blick sehen, welche App-Version Sie installiert haben: im Menü ganz unten. Bitte aktualisieren Sie die App regelmäßig, um in Funktionalität und Design auf dem neuesten Stand zu sein!</target> <target state="translated">Sie können nun auf einen Blick sehen, welche App-Version Sie installiert haben: im Menü ganz unten. Bitte aktualisieren Sie die App regelmäßig, um in Funktionalität und Design auf dem neuesten Stand zu sein!</target>
</trans-unit> </trans-unit>
<trans-unit id="ChangeLog_MinorDesignImprovements" translate="yes" xml:space="preserve"> <trans-unit id="ChangeLog_MinorDesignImprovements" translate="yes" xml:space="preserve">
<source>A few small things have been changed in the design.</source> <source>- A few small things have been changed in the design.</source>
<target state="translated">Es wurden ein paar Kleinigkeiten im Design verändert.</target> <target state="translated">- Es wurden ein paar Kleinigkeiten im Design verändert.</target>
</trans-unit> </trans-unit>
<trans-unit id="MarkingContactSupportBusy" translate="yes" xml:space="preserve"> <trans-unit id="MarkingContactSupportBusy" translate="yes" xml:space="preserve">
<source><bpt id="1">&lt;font color="gray"&gt;</bpt><bpt id="2">&lt;u&gt;</bpt>Contact<ept id="2">&lt;/u&gt;</ept><ept id="1">&lt;/font&gt;</ept> {0}.</source> <source><bpt id="1">&lt;font color="gray"&gt;</bpt><bpt id="2">&lt;u&gt;</bpt>Contact<ept id="2">&lt;/u&gt;</ept><ept id="1">&lt;/font&gt;</ept> {0}.</source>
@ -1505,8 +1487,8 @@ Probieren Sie es aus!</target>
<ept id="1">&lt;/ul&gt;</ept></target> <ept id="1">&lt;/ul&gt;</ept></target>
</trans-unit> </trans-unit>
<trans-unit id="ChangeLog_PackageUpdates" translate="yes" xml:space="preserve"> <trans-unit id="ChangeLog_PackageUpdates" translate="yes" xml:space="preserve">
<source>Software packages were updated.</source> <source>- Software packages were updated.</source>
<target state="translated">Softwarepakete wurden aktualisiert.</target> <target state="translated">- Softwarepakete wurden aktualisiert.</target>
</trans-unit> </trans-unit>
<trans-unit id="ChangeLog_3_0_355_MK_SB_iOS" translate="yes" xml:space="preserve"> <trans-unit id="ChangeLog_3_0_355_MK_SB_iOS" translate="yes" xml:space="preserve">
<source>Bluetooth communication improved.</source> <source>Bluetooth communication improved.</source>
@ -1529,8 +1511,8 @@ Probieren Sie es aus!</target>
<target state="translated">Information</target> <target state="translated">Information</target>
</trans-unit> </trans-unit>
<trans-unit id="ChangeLog_MinorImprovements" translate="yes" xml:space="preserve"> <trans-unit id="ChangeLog_MinorImprovements" translate="yes" xml:space="preserve">
<source>Minor improvements.</source> <source>- Minor improvements.</source>
<target state="translated">Kleine Verbesserungen.</target> <target state="translated">- Kleine Verbesserungen.</target>
</trans-unit> </trans-unit>
<trans-unit id="ErrorOpenLockBoldStatusIsUnknownMessage" translate="yes" xml:space="preserve"> <trans-unit id="ErrorOpenLockBoldStatusIsUnknownMessage" translate="yes" xml:space="preserve">
<source>The lock could not be opened correctly. Try again! <source>The lock could not be opened correctly. Try again!
@ -1576,9 +1558,11 @@ Fehler beim Start der Standortabfrage!</target>
</trans-unit> </trans-unit>
<trans-unit id="ErrorReturnBikeLockClosedGetGPSExceptionMessage" translate="yes" xml:space="preserve"> <trans-unit id="ErrorReturnBikeLockClosedGetGPSExceptionMessage" translate="yes" xml:space="preserve">
<source>End rental at an unknown location is not possible. <source>End rental at an unknown location is not possible.
Getting geolocation failed.</source> Make sure you have granted location sharing permission and your location services are enabled.
Try again!</source>
<target state="translated">Beenden der Miete an unbekanntem Standort is nicht möglich. <target state="translated">Beenden der Miete an unbekanntem Standort is nicht möglich.
Fehler bei der Standortabfrage!</target> Stellen Sie sicher, dass Sie die Erlaubnis zur Standortfreigabe erteilt haben und Ihre Standortdienste aktiviert sind.
Versuchen Sie erneut!</target>
</trans-unit> </trans-unit>
<trans-unit id="Error_ReturnBike_Station_Location_Message" translate="yes" xml:space="preserve"> <trans-unit id="Error_ReturnBike_Station_Location_Message" translate="yes" xml:space="preserve">
<source>We could not assign the bike to any station. For this we need your location information while you are standing right next to the bike. Only then your rental can be terminated! <source>We could not assign the bike to any station. For this we need your location information while you are standing right next to the bike. Only then your rental can be terminated!
@ -1620,8 +1604,8 @@ Außerdem:&lt;br/&gt;
- Paketaktualisierungen</target> - Paketaktualisierungen</target>
</trans-unit> </trans-unit>
<trans-unit id="MarkingFindBikeLabel" translate="yes" xml:space="preserve"> <trans-unit id="MarkingFindBikeLabel" translate="yes" xml:space="preserve">
<source>Bike ID including prefix</source> <source>Bike id</source>
<target state="translated">Rad-ID inklusive Präfix</target> <target state="translated">Rad-ID</target>
</trans-unit> </trans-unit>
<trans-unit id="MarkingSearchBike" translate="yes" xml:space="preserve"> <trans-unit id="MarkingSearchBike" translate="yes" xml:space="preserve">
<source>Search bike</source> <source>Search bike</source>
@ -1643,6 +1627,58 @@ Außerdem:&lt;br/&gt;
<source>Minor design and performance improvements.</source> <source>Minor design and performance improvements.</source>
<target state="translated">Kleine Verbesserungen in Design und Performance.</target> <target state="translated">Kleine Verbesserungen in Design und Performance.</target>
</trans-unit> </trans-unit>
<trans-unit id="MarkingFindBikeTypeOfBikeText" translate="yes" xml:space="preserve">
<source>You search a </source>
<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>
</trans-unit>
<trans-unit id="MessageBikeTypeInfoTitle" translate="yes" xml:space="preserve">
<source>Selected bike type</source>
<target state="translated">Ausgewählter Fahrradtyp</target>
</trans-unit>
<trans-unit id="MarkingFindBikeButton" translate="yes" xml:space="preserve">
<source>Search</source>
<target state="translated">Suchen</target>
</trans-unit>
<trans-unit id="ChangeLog_3_0_366_MK_SB" translate="yes" xml:space="preserve">
<source>On the "Select bike" page you can now search and rent several bikes one after the other. Afterwards you will find them under "My bikes".</source>
<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="ErrorQueryGeolocation" translate="yes" xml:space="preserve">
<source>Location query failed</source>
<target state="translated">Standortabfrage fehlgeschlagen</target>
</trans-unit>
<trans-unit id="MarkingContactCustomerSupportTitle" translate="yes" xml:space="preserve">
<source>Customer support</source>
<target state="translated">Kundensupport</target>
</trans-unit>
<trans-unit id="ActionSelectAnotherStation" translate="yes" xml:space="preserve">
<source>Select another station</source>
<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>
</trans-unit>
<trans-unit id="MarkingLastSelectedStation" translate="yes" xml:space="preserve">
<source>Last selected station</source>
<target state="translated">Zuletzt ausgewählte Station</target>
</trans-unit>
<trans-unit id="MarkingOperator" translate="yes" xml:space="preserve">
<source>Operator</source>
<target state="translated">Betreiber</target>
</trans-unit>
<trans-unit id="ChangeLog_3_0_369_MK_SB" translate="yes" xml:space="preserve">
<source>We have re-designed the contact page:
<bpt id="1">&lt;ul&gt;</bpt><bpt id="2">&lt;li&gt;</bpt>Please contact the customer support immediately in case of problems with the bike rental!
<ept id="2">&lt;/li&gt;</ept><bpt id="3">&lt;li&gt;</bpt>To diagnose a problem, you can send us your app usage data via "Transfer diagnostic file". Without your active sending we do not record any of your data!<ept id="3">&lt;/li&gt;</ept><ept id="1">&lt;/ul&gt;</ept></source>
<target state="translated">Wir haben die Kontakt-Seite neu gestaltet:
<bpt id="1">&lt;ul&gt;</bpt><bpt id="2">&lt;li&gt;</bpt>Bitte kontaktieren Sie bei Problemen bei der Fahrradmiete umgehend den Kundensupport!
<ept id="2">&lt;/li&gt;</ept><bpt id="3">&lt;li&gt;</bpt>Für die Diagnose eines Problems können Sie über "Diagnosedatei übermitteln" Ihre App-Nutzungsdaten an uns senden. Ohne Ihr aktives Zusenden zeichnen wir keine Ihrer Daten auf!<ept id="3">&lt;/li&gt;</ept><ept id="1">&lt;/ul&gt;</ept></target>
</trans-unit>
</group> </group>
</body> </body>
</file> </file>

View file

@ -181,7 +181,7 @@ namespace TINK.Repository
IVersionInfo versionInfo) => IVersionInfo versionInfo) =>
await DoUpdateLockingStateAsync( await DoUpdateLockingStateAsync(
operatorUri?.AbsoluteUri ?? m_oCopriHost.AbsoluteUri, operatorUri?.AbsoluteUri ?? m_oCopriHost.AbsoluteUri,
requestBuilder.UpateLockingState(bikeId, state, location, batteryLevel, versionInfo), requestBuilder.UpdateLockingState(bikeId, state, location, batteryLevel, versionInfo),
UserAgent); UserAgent);
/// <summary> Gets booking request. </summary> /// <summary> Gets booking request. </summary>
@ -550,7 +550,7 @@ namespace TINK.Repository
#endif #endif
} }
/// <summary> Gets canel booking request response.</summary> /// <summary> Gets cancel booking request response.</summary>
/// <param name="copriHost">Host to connect to. </param> /// <param name="copriHost">Host to connect to. </param>
/// <param name="command">Command to log user in.</param> /// <param name="command">Command to log user in.</param>
/// <returns>Response on cancel booking request.</returns> /// <returns>Response on cancel booking request.</returns>

View file

@ -1376,7 +1376,7 @@ namespace TINK.Repository
} }
/// <summary> /// <summary>
/// Gets canel booking request response. /// Gets cancel booking request response.
/// </summary> /// </summary>
/// <param name="bikeId">Id of the bike to book.</param> /// <param name="bikeId">Id of the bike to book.</param>
/// <param name="cookie">Cookie of the logged in user.</param> /// <param name="cookie">Cookie of the logged in user.</param>
@ -1613,7 +1613,7 @@ namespace TINK.Repository
} }
/// <summary> /// <summary>
/// Gets canel booking request response. /// Gets cancel booking request response.
/// </summary> /// </summary>
/// <param name="bikeId">Id of the bike to book.</param> /// <param name="bikeId">Id of the bike to book.</param>
/// <param name="cookie">Cookie of the logged in user.</param> /// <param name="cookie">Cookie of the logged in user.</param>

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