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
ui
xdoc
xml

View file

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

View file

@ -1,6 +1,6 @@
<?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">
<uses-sdk android:minSdkVersion="19" android:targetSdkVersion="31" />
<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="33" />
<!-- Google Maps related permissions -->
<!-- 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. -->
@ -9,14 +9,11 @@
<!-- Access Google based webservices -->
<!-- External storage for caching. -->
<!-- My 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.BLUETOOTH"
android:maxSdkVersion="30" />
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN"
android:maxSdkVersion="30" />
<uses-permission android:name="android.permission.BLUETOOTH_SCAN"
android:usesPermissionFlags="neverForLocation" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.BLUETOOTH" android:maxSdkVersion="30" />
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN" android:maxSdkVersion="30" />
<uses-permission android:name="android.permission.BLUETOOTH_SCAN" android:usesPermissionFlags="neverForLocation" />
<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.gps" android:required="false" />
@ -38,4 +35,4 @@
</intent>
</queries>
<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>
<string>LastenradBayern</string>
<key>CFBundleVersion</key>
<string>365</string>
<string>369</string>
<key>CFBundleShortVersionString</key>
<string>3.0.365</string>
<string>3.0.369</string>
</dict>
</plist>

View file

@ -120,7 +120,7 @@
<ItemGroup>
<PackageReference Include="Microsoft.Bcl.Build" Version="1.0.21" />
<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="MonkeyCache">
<Version>1.6.3</Version>
@ -136,7 +136,7 @@
<Version>6.3.0.19</Version>
</PackageReference>
<PackageReference Include="Serilog">
<Version>2.12.0</Version>
<Version>3.0.1</Version>
</PackageReference>
<PackageReference Include="Serilog.Sinks.File" Version="5.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.Build.Download" Version="0.11.4" />
<PackageReference Include="Xamarin.CommunityToolkit">
<Version>2.0.5</Version>
<Version>2.0.6</Version>
</PackageReference>
<PackageReference Include="Xamarin.Essentials">
<Version>1.7.5</Version>
<Version>1.7.7</Version>
</PackageReference>
<PackageReference Include="Xamarin.Forms.GoogleMaps">
<Version>5.0.0</Version>

View file

@ -196,40 +196,18 @@
<Generator>MSBuild:UpdateDesignTimeXaml</Generator>
</EmbeddedResource>
</ItemGroup>
<ItemGroup>
<EmbeddedResource Include="$(MSBuildThisFileDirectory)Images\trike_brake1_image.HZ17PY_678_382.png" />
</ItemGroup>
<ItemGroup>
<EmbeddedResource Include="$(MSBuildThisFileDirectory)View\Info\InfoTabbedPage.xaml">
<SubType>Designer</SubType>
<Generator>MSBuild:UpdateDesignTimeXaml</Generator>
</EmbeddedResource>
</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>
<EmbeddedResource Include="$(MSBuildThisFileDirectory)View\FeesAndBikes\FeesAndBikesPage.xaml">
<SubType>Designer</SubType>
<Generator>MSBuild:Compile</Generator>
</EmbeddedResource>
</ItemGroup>
<ItemGroup>
<EmbeddedResource Include="$(MSBuildThisFileDirectory)Images\Tink2.png" />
</ItemGroup>
<ItemGroup>
<EmbeddedResource Include="$(MSBuildThisFileDirectory)Images\Konrad.png" />
</ItemGroup>
<ItemGroup>
<EmbeddedResource Include="$(MSBuildThisFileDirectory)View\WhatsNew\WhatsNewPage.xaml">
<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:resources="clr-namespace:TINK.MultilingualResources;assembly=TINKLib"
x:Class="TINK.View.Contact.ContactPage">
<Shell.TitleView>
<Grid ColumnDefinitions="Auto, 1*">
<Label Style="{StaticResource Label-Navbar}"
Text="{x:Static resources:AppResources.MarkingContactPageTitle}"/>
</Grid>
</Shell.TitleView>
<ContentPage.Resources>
<conv:StringNotNullOrEmptyToVisibleConverter x:Key="StringNotNullOrEmpty_Converter"/>
<conv:BoolInverterConverter x:Key="BoolInvert_Converter"/>
</ContentPage.Resources>
<ContentPage.Content>
<ScrollView>
<Frame>
<StackLayout x:Name="ContactPageView">
<Frame
IsVisible="{Binding
Path=IsOperatorInfoAvaliable,
Converter={StaticResource BoolInvert_Converter}}">
<!-- Button to select station and explanation text -->
<StackLayout>
<Label
TextType="Html"
Text="{x:Static resources:AppResources.MarkingContactNoStationInfoAvailableNoButton}"/>
<Button
Text="{x:Static resources:AppResources.ActionSelectStation}"
Command="{Binding OnSelectStationRequest}"/>
</StackLayout>
</Frame>
<Frame
IsVisible="{Binding IsOperatorInfoAvaliable}">
<!-- Operator info -->
<StackLayout>
<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 -->
<Label
IsVisible="{Binding PhoneNumberText, Converter={StaticResource StringNotNullOrEmpty_Converter}}"
FormattedText="{Binding PhoneContactText}"/>
<Button
x:Name="PhoneNumberButton"
IsVisible="{Binding PhoneNumberText, Converter={StaticResource StringNotNullOrEmpty_Converter}}"
Text="{Binding PhoneNumberText}"
IsEnabled="{Binding IsDoPhoncallAvailable}"
Command="{Binding OnPhoneRequest}"/>
<ContentPage.Content>
<Grid
x:Name="ContactPageView"
RowSpacing="0"
RowDefinitions="1*,Auto">
<!-- Contact Support -->
<Frame
Grid.Row="0"
Padding="10"
Margin="0,10,0,5"
HorizontalOptions="FillAndExpand"
VerticalOptions="Start"
BackgroundColor="White"
HasShadow="False">
<StackLayout
Padding="20">
<!--Title Customer Support-->
<Label
Text="{x:Static resources:AppResources.MarkingContactCustomerSupportTitle}"
FontAttributes="Bold"
FontSize="Large"
/>
<!--No station selected-->
<StackLayout
IsVisible="{Binding Path=IsOperatorInfoAvaliable, Converter={StaticResource BoolInvert_Converter}}">
<Label
TextType="Html"
Text="{x:Static resources:AppResources.MarkingContactNoStationInfoAvailableNoButton}"/>
<Button
Text="{x:Static resources:AppResources.ActionSelectStation}"
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>
</Frame>
<Frame>
<StackLayout>
<Label FormattedText="{Binding LikeTinkApp}"/>
<!--- Mail to app- related support -->
<!--Buttons-->
<StackLayout
Spacing="5"
Margin="0,10,0,0">
<!--- Phone to operator -->
<Button
Text="{x:Static resources:AppResources.ActionContactMailAppReleated}"
IsEnabled="{Binding IsSendMailAvailable}"
Command="{Binding OnMailAppRelatedRequest}"/>
x:Name="PhoneNumberButton"
IsVisible="{Binding PhoneNumberText, Converter={StaticResource StringNotNullOrEmpty_Converter}}"
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>
</Frame>
</StackLayout>
</Frame>
</ScrollView>
</ContentPage.Content>
</StackLayout>
</StackLayout>
</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>

View file

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

View file

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

View file

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

View file

@ -1,6 +1,6 @@
<?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">
<uses-sdk android:minSdkVersion="19" android:targetSdkVersion="31" />
<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="33" />
<!-- Google Maps related permissions -->
<!-- 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. -->
@ -9,14 +9,11 @@
<!-- Access Google based webservices -->
<!-- External storage for caching. -->
<!-- My 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.BLUETOOTH"
android:maxSdkVersion="30" />
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN"
android:maxSdkVersion="30" />
<uses-permission android:name="android.permission.BLUETOOTH_SCAN"
android:usesPermissionFlags="neverForLocation" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.BLUETOOTH" android:maxSdkVersion="30" />
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN" android:maxSdkVersion="30" />
<uses-permission android:name="android.permission.BLUETOOTH_SCAN" android:usesPermissionFlags="neverForLocation" />
<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.gps" android:required="false" />
@ -38,4 +35,4 @@
</intent>
</queries>
<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>
<string>Mein konrad</string>
<key>CFBundleVersion</key>
<string>365</string>
<string>369</string>
<key>CFBundleShortVersionString</key>
<string>3.0.365</string>
<string>3.0.369</string>
</dict>
</plist>

View file

@ -121,7 +121,7 @@
<ItemGroup>
<PackageReference Include="Microsoft.Bcl.Build" Version="1.0.21" />
<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="MonkeyCache">
<Version>1.6.3</Version>
@ -137,7 +137,7 @@
<Version>6.3.0.19</Version>
</PackageReference>
<PackageReference Include="Serilog">
<Version>2.12.0</Version>
<Version>3.0.1</Version>
</PackageReference>
<PackageReference Include="Serilog.Sinks.File" Version="5.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.Build.Download" Version="0.11.4" />
<PackageReference Include="Xamarin.CommunityToolkit">
<Version>2.0.5</Version>
<Version>2.0.6</Version>
</PackageReference>
<PackageReference Include="Xamarin.Essentials">
<Version>1.7.5</Version>
<Version>1.7.7</Version>
</PackageReference>
<PackageReference Include="Xamarin.Forms.GoogleMaps">
<Version>5.0.0</Version>

View file

@ -201,40 +201,18 @@
<Generator>MSBuild:UpdateDesignTimeXaml</Generator>
</EmbeddedResource>
</ItemGroup>
<ItemGroup>
<EmbeddedResource Include="$(MSBuildThisFileDirectory)Images\trike_brake1_image.HZ17PY_678_382.png" />
</ItemGroup>
<ItemGroup>
<EmbeddedResource Include="$(MSBuildThisFileDirectory)View\Info\InfoTabbedPage.xaml">
<SubType>Designer</SubType>
<Generator>MSBuild:UpdateDesignTimeXaml</Generator>
</EmbeddedResource>
</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>
<EmbeddedResource Include="$(MSBuildThisFileDirectory)View\FeesAndBikes\FeesAndBikesPage.xaml">
<SubType>Designer</SubType>
<Generator>MSBuild:Compile</Generator>
</EmbeddedResource>
</ItemGroup>
<ItemGroup>
<EmbeddedResource Include="$(MSBuildThisFileDirectory)Images\Tink2.png" />
</ItemGroup>
<ItemGroup>
<EmbeddedResource Include="$(MSBuildThisFileDirectory)Images\Konrad.png" />
</ItemGroup>
<ItemGroup>
<EmbeddedResource Include="$(MSBuildThisFileDirectory)View\WhatsNew\WhatsNewPage.xaml">
<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:resources="clr-namespace:TINK.MultilingualResources;assembly=TINKLib"
mc:Ignorable="d"
xmlns:conv="clr-namespace:TINK.View"
xmlns:sharedGui="clr-namespace:ShareeSharedGuiLib.View"
x:Class="TINK.View.Account.AccountPage"
BackgroundColor="{DynamicResource background-color}">
@ -16,11 +18,19 @@
</Grid>
</Shell.TitleView>
<ContentPage.Resources>
<conv:BoolInverterConverter x:Key="BoolInverterConverter"/>
</ContentPage.Resources>
<ContentPage.Content>
<ScrollView>
<!--Grid for content and Running process in same row-->
<Grid>
<StackLayout>
<ScrollView
Grid.Row="0">
<StackLayout>
<Frame
Padding="10"
@ -57,6 +67,13 @@
</ScrollView>
<!--While process is running-->
<sharedGui:RunningProcessView
IsVisible="{Binding IsIdle, Converter={StaticResource BoolInverterConverter}}"
Grid.Row="0"/>
</Grid>
</ContentPage.Content>
</ContentPage>

View file

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

View file

@ -21,102 +21,158 @@
<ContentPage.Content>
<ScrollView>
<Grid
x:Name="ContactPageView"
RowSpacing="0"
RowDefinitions="1*,Auto">
<StackLayout
x:Name="ContactPageView">
<!-- Contact Support -->
<Frame
Grid.Row="0"
Padding="10"
Margin="0,10,0,5"
HorizontalOptions="FillAndExpand"
VerticalOptions="Start"
BackgroundColor="White"
HasShadow="False">
<Frame
Padding="10"
Margin="0,10,0,5"
HorizontalOptions="FillAndExpand"
BackgroundColor="White">
<StackLayout
Padding="20">
<!--Title Customer Support-->
<Label
Text="{x:Static resources:AppResources.MarkingContactCustomerSupportTitle}"
FontAttributes="Bold"
FontSize="Large"
/>
<!--No station selected-->
<StackLayout
Padding="10">
<!-- Button to select station and explanation text -->
<StackLayout
IsVisible="{Binding Path=IsOperatorInfoAvaliable, Converter={StaticResource BoolInvert_Converter}}">
<Label
<Label
TextType="Html"
Text="{x:Static resources:AppResources.MarkingContactNoStationInfoAvailableNoButton}"/>
<Button
<Button
Text="{x:Static resources:AppResources.ActionSelectStation}"
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>
<!-- 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>
</Frame>
</StackLayout>
<Frame
</Frame>
<!--- Contact app-developer -->
<StackLayout
Grid.Row="1"
Padding="10"
Margin="0,5,0,5"
HorizontalOptions="FillAndExpand"
BackgroundColor="White">
Margin="0,0,0,10"
VerticalOptions="End"
Spacing="0">
<!--- Contact app-developer -->
<StackLayout
Padding="10">
<BoxView
Margin="0,0,0,10"
HeightRequest="1"
WidthRequest="400"
HorizontalOptions="Center"
Color="DimGray"/>
<Label
FormattedText="{Binding LikeTinkApp}"/>
<!--- Mail to app-developer -->
<Button
Style="{StaticResource SecondaryButton}"
Text="{x:Static resources:AppResources.ActionContactMailAppReleated}"
IsEnabled="{Binding IsSendMailAvailable}"
Command="{Binding OnMailAppRelatedRequest}"/>
</StackLayout>
</Frame>
<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>
</ScrollView>
</Grid>
</ContentPage.Content>
</ContentPage>

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

@ -1,6 +1,6 @@
<?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">
<uses-sdk android:minSdkVersion="19" android:targetSdkVersion="31" />
<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="33" />
<!-- Google Maps related permissions -->
<!-- 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. -->
@ -9,14 +9,11 @@
<!-- Access Google based webservices -->
<!-- External storage for caching. -->
<!-- My 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.BLUETOOTH"
android:maxSdkVersion="30" />
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN"
android:maxSdkVersion="30" />
<uses-permission android:name="android.permission.BLUETOOTH_SCAN"
android:usesPermissionFlags="neverForLocation" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.BLUETOOTH" android:maxSdkVersion="30" />
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN" android:maxSdkVersion="30" />
<uses-permission android:name="android.permission.BLUETOOTH_SCAN" android:usesPermissionFlags="neverForLocation" />
<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.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>
<GenerateSerializationAssemblies>Off</GenerateSerializationAssemblies>
<AndroidManifest>Properties\AndroidManifest.xml</AndroidManifest>
<TargetFrameworkVersion>v12.0</TargetFrameworkVersion>
<TargetFrameworkVersion>v13.0</TargetFrameworkVersion>
<AndroidStoreUncompressedFileExtensions />
<MandroidI18n />
<JavaMaximumHeapSize>2G</JavaMaximumHeapSize>
@ -77,7 +77,7 @@
</PropertyGroup>
<ItemGroup>
<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="MonkeyCache">
<Version>1.6.3</Version>
@ -97,7 +97,7 @@
<Version>6.3.0.19</Version>
</PackageReference>
<PackageReference Include="Serilog">
<Version>2.12.0</Version>
<Version>3.0.1</Version>
</PackageReference>
<PackageReference Include="Serilog.Sinks.File" Version="5.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.Vector.Drawable" Version="28.0.0.3" />
<PackageReference Include="Xamarin.AndroidX.Core">
<Version>1.9.0.2</Version>
<Version>1.10.1.1</Version>
</PackageReference>
<PackageReference Include="Xamarin.AndroidX.MediaRouter">
<Version>1.3.1.2</Version>
<Version>1.4.0.1</Version>
</PackageReference>
<PackageReference Include="Xamarin.AndroidX.Palette">
<Version>1.0.0.16</Version>
<Version>1.0.0.18</Version>
</PackageReference>
<PackageReference Include="Xamarin.AndroidX.RecyclerView">
<Version>1.3.0</Version>
<Version>1.3.0.2</Version>
</PackageReference>
<PackageReference Include="Xamarin.Auth" Version="1.7.0" />
<PackageReference Include="Xamarin.Build.Download" Version="0.11.4" />
<PackageReference Include="Xamarin.CommunityToolkit">
<Version>2.0.5</Version>
<Version>2.0.6</Version>
</PackageReference>
<PackageReference Include="Xamarin.Essentials">
<Version>1.7.5</Version>
<Version>1.7.7</Version>
</PackageReference>
<PackageReference Include="Xamarin.Forms" Version="5.0.0.2578" />
<PackageReference Include="Xamarin.Forms.AppLinks">
@ -203,10 +203,10 @@
<Version>5.0.0</Version>
</PackageReference>
<PackageReference Include="Xamarin.Forms.GoogleMaps.Bindings" Version="3.0.0" />
<PackageReference Include="Xamarin.GooglePlayServices.Base" Version="118.1.0.1" />
<PackageReference Include="Xamarin.GooglePlayServices.Basement" Version="118.1.0.2" />
<PackageReference Include="Xamarin.GooglePlayServices.Maps" Version="118.1.0.1" />
<PackageReference Include="Xamarin.GooglePlayServices.Tasks" Version="118.0.2.1" />
<PackageReference Include="Xamarin.GooglePlayServices.Base" Version="118.2.0.1" />
<PackageReference Include="Xamarin.GooglePlayServices.Basement" Version="118.2.0.1" />
<PackageReference Include="Xamarin.GooglePlayServices.Maps" Version="118.1.0.2" />
<PackageReference Include="Xamarin.GooglePlayServices.Tasks" Version="118.0.2.2" />
</ItemGroup>
<ItemGroup>
<Reference Include="Mono.Android" />

View file

@ -56,8 +56,8 @@
<key>CFBundleDisplayName</key>
<string>sharee.bike</string>
<key>CFBundleVersion</key>
<string>365</string>
<string>369</string>
<key>CFBundleShortVersionString</key>
<string>3.0.365</string>
<string>3.0.369</string>
</dict>
</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>
<PackageReference Include="Microsoft.Bcl.Build" Version="1.0.21" />
<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="MonkeyCache">
<Version>1.6.3</Version>
@ -137,7 +137,7 @@
<Version>6.3.0.19</Version>
</PackageReference>
<PackageReference Include="Serilog">
<Version>2.12.0</Version>
<Version>3.0.1</Version>
</PackageReference>
<PackageReference Include="Serilog.Sinks.File" Version="5.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.Build.Download" Version="0.11.4" />
<PackageReference Include="Xamarin.CommunityToolkit">
<Version>2.0.5</Version>
<Version>2.0.6</Version>
</PackageReference>
<PackageReference Include="Xamarin.Essentials">
<Version>1.7.5</Version>
<Version>1.7.7</Version>
</PackageReference>
<PackageReference Include="Xamarin.Forms.GoogleMaps">
<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>
</Reference>
</ItemGroup>
<ItemGroup>
<BundleResource Include="Resources\tink2.png" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\..\LockItBLE\LockItBLE.csproj">
<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>
</EmbeddedResource>
</ItemGroup>
<ItemGroup>
<EmbeddedResource Include="$(MSBuildThisFileDirectory)Images\trike_brake1_image.HZ17PY_678_382.png" />
</ItemGroup>
<ItemGroup>
<EmbeddedResource Include="$(MSBuildThisFileDirectory)View\Info\InfoTabbedPage.xaml">
<SubType>Designer</SubType>
<Generator>MSBuild:UpdateDesignTimeXaml</Generator>
</EmbeddedResource>
</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>
<EmbeddedResource Include="$(MSBuildThisFileDirectory)View\FeesAndBikes\FeesAndBikesPage.xaml">
<SubType>Designer</SubType>
<Generator>MSBuild:Compile</Generator>
</EmbeddedResource>
</ItemGroup>
<ItemGroup>
<EmbeddedResource Include="$(MSBuildThisFileDirectory)Images\Tink2.png" />
</ItemGroup>
<ItemGroup>
<EmbeddedResource Include="$(MSBuildThisFileDirectory)Images\Konrad.png" />
</ItemGroup>
<ItemGroup>
<EmbeddedResource Include="$(MSBuildThisFileDirectory)View\WhatsNew\WhatsNewPage.xaml">
<SubType>Designer</SubType>
@ -340,4 +318,8 @@
<Generator>MSBuild:Compile</Generator>
</EmbeddedResource>
</ItemGroup>
<ItemGroup>
<Content Include="$(MSBuildThisFileDirectory)Resources\Fonts\Roboto-Bold.ttf" />
<Content Include="$(MSBuildThisFileDirectory)Resources\Fonts\Roboto-Italic.ttf" />
</ItemGroup>
</Project>

View file

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

View file

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

View file

@ -17,105 +17,161 @@
<conv:StringNotNullOrEmptyToVisibleConverter x:Key="StringNotNullOrEmpty_Converter"/>
<conv:BoolInverterConverter x:Key="BoolInvert_Converter"/>
</ContentPage.Resources>
<ContentPage.Content>
<ScrollView>
<ContentPage.Content>
<StackLayout
x:Name="ContactPageView">
<Grid
x:Name="ContactPageView"
RowSpacing="0"
RowDefinitions="1*,Auto">
<!-- Contact Support -->
<Frame
Padding="10"
Margin="0,10,0,5"
HorizontalOptions="FillAndExpand"
BackgroundColor="White">
Grid.Row="0"
Padding="10"
Margin="0,10,0,5"
HorizontalOptions="FillAndExpand"
VerticalOptions="Start"
BackgroundColor="White"
HasShadow="False">
<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
IsVisible="{Binding Path=IsOperatorInfoAvaliable, Converter={StaticResource BoolInvert_Converter}}">
<Label
TextType="Html"
Text="{x:Static resources:AppResources.MarkingContactNoStationInfoAvailableNoButton}"/>
<Button
Text="{x:Static resources:AppResources.ActionSelectStation}"
Command="{Binding OnSelectStationRequest}"/>
</StackLayout>
<!-- Contact operator -->
<!--Contact operator of selected station-->
<StackLayout
IsVisible="{Binding IsOperatorInfoAvaliable}">
<!--- Name of operator -->
<Label
IsVisible="{Binding IsOperatorInfoAvaliable}"
HorizontalOptions="Center"
FontAttributes="Bold"
Text="{Binding ProviderNameText}"/>
<!-- info about selected station -->
<StackLayout
Spacing="0">
<!--- 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}"/>
<StackLayout
Orientation="Horizontal"
Spacing="0">
<Label
Text="{x:Static resources:AppResources.MarkingLastSelectedStation}"/>
<Label
Text=": "/>
</StackLayout>
<!--- Phone to operator -->
<Label
IsVisible="{Binding PhoneNumberText, Converter={StaticResource StringNotNullOrEmpty_Converter}}"
FormattedText="{Binding PhoneContactText}"/>
<!-- Station -->
<StackLayout
Orientation="Horizontal"
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}"
x:Name="PhoneNumberButton"
IsVisible="{Binding PhoneNumberText, Converter={StaticResource StringNotNullOrEmpty_Converter}}"
Text="{Binding PhoneNumberText}"
IsEnabled="{Binding IsDoPhoncallAvailable}"
Command="{Binding OnPhoneRequest}"/>
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>
</StackLayout>
</Frame>
<Frame
<!--- Contact app-developer -->
<StackLayout
Grid.Row="1"
Padding="10"
Margin="0,5,0,5"
HorizontalOptions="FillAndExpand"
BackgroundColor="White">
Margin="0,0,0,10"
VerticalOptions="End"
Spacing="0">
<!--- Contact app-developer -->
<StackLayout
Padding="10">
<BoxView
Margin="0,0,0,10"
HeightRequest="1"
WidthRequest="400"
HorizontalOptions="Center"
Color="DimGray"/>
<Label
FormattedText="{Binding LikeTinkApp}"/>
<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>
<!--- Mail to app-developer -->
<Button
Style="{StaticResource SecondaryButton}"
Text="{x:Static resources:AppResources.ActionContactMailAppReleated}"
IsEnabled="{Binding IsSendMailAvailable}"
Command="{Binding OnMailAppRelatedRequest}"/>
</StackLayout>
</StackLayout>
</Frame>
</Grid>
</StackLayout>
</ScrollView>
</ContentPage.Content>
</ContentPage.Content>
</ContentPage>

View file

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

View file

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

View file

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

View file

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

View file

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

View file

@ -21,7 +21,7 @@ namespace TINK.Model.Bikes.BikeInfoNS.BC
private readonly StateInfoMutable _StateInfo;
/// <summary>
/// Constructs a bike.
/// Constructs a bike info object.
/// </summary>
/// <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>
@ -38,7 +38,7 @@ namespace TINK.Model.Bikes.BikeInfoNS.BC
string stationId = null,
string stationName = null,
Uri operatorUri = null,
RentalDescription tariffDescription = null,
IRentalDescription tariffDescription = null,
Func<DateTime> dateTimeProvider = 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>
[DataMember]
public string StationId { get; }
public string StationId { get; private set; }
/// <summary> Name of station a which bike is located, null otherwise. </summary>
[DataMember]
@ -65,7 +65,7 @@ namespace TINK.Model.Bikes.BikeInfoNS.BC
/// <summary> Holds description about the tariff. </summary>
[DataMember]
public RentalDescription TariffDescription { get; private set; }
public IRentalDescription TariffDescription { get; private set; }
/// <summary>
/// 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>
/// Converts the instance to text.
/// </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>
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;
}

View file

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

View file

@ -84,8 +84,9 @@ namespace TINK.Model.Bikes.BikeInfoNS.CopriLock
new StateInfo(
dateTimeProvider,
requestedAt,
tariffDescription?.MaxReservationTimeSpan ?? StateRequestedInfo.UNKNOWNMAXRESERVATIONTIMESPAN,
mailAddress,
""),
""), // BC code
bike != null
? new Bike(
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;
namespace TINK.Model.Bikes.BikeInfoNS
@ -6,20 +7,20 @@ namespace TINK.Model.Bikes.BikeInfoNS
/// Successor of TarifDescription- object.
/// Manages tariff- and rental info.
/// </summary>
public class RentalDescription
public class RentalDescription : IRentalDescription
{
/// <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>
public class TariffElement
{
/// <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>
public string Description { get; set; } = string.Empty;
/// <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>
public string Value { get; set; } = string.Empty;
}
@ -30,12 +31,12 @@ namespace TINK.Model.Bikes.BikeInfoNS
public class InfoElement
{
/// <summary>
/// Key which identyfies the value (required for special processing)
/// Key which identifies the value (required for special processing)
/// </summary>
public string Key { get; set; }
/// <summary>
/// Text to be displayed to user.
/// Text (language aware) to be displayed to user.
/// </summary>
public string Value { get; set; }
}
@ -50,8 +51,19 @@ namespace TINK.Model.Bikes.BikeInfoNS
/// </summary>
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>();
/// <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>();
}
}

View file

@ -1,9 +1,9 @@
using TINK.Model.MiniSurvey;
using TINK.Model.MiniSurvey;
namespace TINK.Model
{
/// <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>
public class BookingFinishedModel : IBookingFinishedModel
{

View file

@ -1,5 +1,6 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using TINK.Model.Bikes.BikeInfoNS.BluetoothLock;
using TINK.Model.Connector.Updater;
@ -288,7 +289,10 @@ namespace TINK.Model.Connector
DoReturnResponse response
= (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();
}

View file

@ -438,5 +438,20 @@ namespace TINK.Model.Connector
name,
int.TryParse(bikeGroup?.bike_count ?? "0", out var countCity) ? countCity : 0,
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)
{
// 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}");
return null;
}

View file

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

View file

@ -2,13 +2,11 @@ using System;
using TINK.Model.Bikes.BikeInfoNS.BC;
using TINK.Model.State;
using TINK.Model.Stations;
using TINK.Model.Stations.StationNS.Operator;
using TINK.Model.User.Account;
using TINK.Repository.Exception;
using TINK.Repository.Response;
using TINK.Repository.Response.Stations;
using TINK.Services.CopriApi;
using Xamarin.Forms;
using IBikeInfoMutable = TINK.Model.Bikes.BikeInfoNS.BC.IBikeInfoMutable;
namespace TINK.Model.Connector.Updater
@ -19,14 +17,6 @@ namespace TINK.Model.Connector.Updater
/// <todo>Rename to UpdateFromCopri.</todo>
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>
/// Gets all station for station provider and add them into station list.
/// </summary>
@ -135,6 +125,7 @@ namespace TINK.Model.Connector.Updater
bike.State.Load(
InUseStateEnum.Reserved,
bikeInfo.GetFrom(),
bikeInfo.rental_description.GetMaxReservationTimeSpan(),
mailAddress,
bikeInfo.timeCode,
notifyLevel);
@ -144,9 +135,9 @@ namespace TINK.Model.Connector.Updater
bike.State.Load(
InUseStateEnum.Booked,
bikeInfo.GetFrom(),
mailAddress,
bikeInfo.timeCode,
notifyLevel);
mailAddress: mailAddress,
code: bikeInfo.timeCode,
notifyLevel: notifyLevel);
break;
default:

View file

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

View file

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

View file

@ -1,4 +1,4 @@
using System;
using System;
namespace TINK.Model.State
{
@ -6,15 +6,17 @@ namespace TINK.Model.State
{
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="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="notifyLevel">Controls whether notify property changed events are fired or not.</param>
void Load(
InUseStateEnum state,
DateTime? from = null,
TimeSpan? reservationTimeSpan = null,
string mailAddress = null,
string code = null,
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.
/// </summary>
/// <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="code">Booking code.</param>
/// <param name="dateTimeNowProvider">Date time provider to calculate remaining time.</param>
public StateInfo(
Func<DateTime> dateTimeNowProvider,
DateTime requestedAt,
TimeSpan maxReservationTimeSpan,
string mailAddress,
string code)
{
// Todo: Handle p_oFrom == null here.
// Todo: Handle p_oDuration == null here.
_InUseState = new StateRequestedInfo(
dateTimeNowProvider ?? (() => DateTime.Now),
requestedAt,
maxReservationTimeSpan,
mailAddress,
code);
}
@ -81,9 +82,6 @@ namespace TINK.Model.State
string p_strMailAddress,
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(
p_oBookedAt,
p_strMailAddress,
@ -114,7 +112,7 @@ namespace TINK.Model.State
}
/// <summary>
/// Date of request/ bookeing action.
/// Date of request/ booking action.
/// </summary>
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>
/// Mail address.
/// </summary>
@ -152,7 +158,7 @@ namespace TINK.Model.State
/// <summary>
/// Tries update
/// </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>
public bool GetIsStillReserved(out TimeSpan? p_oRemainingTime)
{

View file

@ -4,7 +4,7 @@ namespace TINK.Model.State
{
using System.ComponentModel;
using System.Runtime.Serialization;
/// <summary>
/// Manges the state of a bike.
/// </summary>
@ -90,19 +90,18 @@ namespace TINK.Model.State
return new StateInfo(state != null ? state.Value == InUseStateEnum.FeedbackPending : false);
case InUseStateEnum.Reserved:
// Todo: Handle p_oFrom == null here.
// Todo: Handle p_oDuration == null here.
return new StateInfo(
dateTimeNowProvider,
state.From.Value,
state.From.HasValue ? dateTimeNowProvider : (() => DateTime.MaxValue),
state.From.HasValue ? state.From.Value : DateTime.MaxValue,
state.MaxReservationTimeSpan ?? StateRequestedInfo.UNKNOWNMAXRESERVATIONTIMESPAN,
state.MailAddress,
state.Code);
case InUseStateEnum.Booked:
// 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.
// Todo: Clarify question: What to do if code 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(
state.From.Value,
state.MailAddress,
@ -139,7 +138,7 @@ namespace TINK.Model.State
var l_oStateRequested = value as StateRequestedInfo;
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;
}
@ -158,7 +157,7 @@ namespace TINK.Model.State
/// <summary>
/// Checks and updates state if required.
/// </summary>
/// <returns>Value indicating wheter state has changed</returns>
/// <returns>Value indicating whether state has changed</returns>
public void UpdateOnTimeElapsed()
{
switch (_StateInfo.Value)
@ -172,7 +171,7 @@ namespace TINK.Model.State
// Check if maximum reserved time has elapsed.
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();
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(nameof(State)));
return;
@ -181,15 +180,17 @@ namespace TINK.Model.State
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="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="supressNotifyPropertyChanged">Controls whether notify property changed events are fired or not.</param>
public void Load(
InUseStateEnum state,
DateTime? from = null,
TimeSpan? maxReservationTimeSpan = null,
string mailAddress = null,
string code = null,
Bikes.BikeInfoNS.BC.NotifyPropertyChangedLevel notifyLevel = Bikes.BikeInfoNS.BC.NotifyPropertyChangedLevel.All)
@ -206,11 +207,10 @@ namespace TINK.Model.State
break;
case InUseStateEnum.Reserved:
// Todo: Handle p_oFrom == null here.
// Todo: Handle p_oDuration == null here.
_StateInfo = new StateInfo(
_DateTimeNowProvider,
from.Value,
from.HasValue ? _DateTimeNowProvider : (() => DateTime.MaxValue),
from.HasValue ? from.Value : DateTime.MaxValue,
maxReservationTimeSpan.HasValue ? maxReservationTimeSpan.Value : StateRequestedInfo.UNKNOWNMAXRESERVATIONTIMESPAN,
mailAddress,
code);
@ -245,7 +245,7 @@ namespace TINK.Model.State
}
/// <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>
public TimeSpan? RemainingTime
{
@ -261,7 +261,7 @@ namespace TINK.Model.State
if (_RemainingTime.HasValue == false)
{
// Value was not yet querried.
// Value was not yet queried.
// Do query before returning object.
_StateInfo.GetIsStillReserved(out _RemainingTime);
}

View file

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

View file

@ -1,6 +1,7 @@
using System;
using System.Collections.Generic;
using TINK.MultilingualResources;
using TINK.Repository.Exception;
using Xamarin.Essentials;
namespace TINK.Model
@ -692,6 +693,21 @@ namespace TINK.Model
AppResources.ChangeLog_3_0_365_MK_SB,
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>

View file

@ -1,4 +1,4 @@
//------------------------------------------------------------------------------
//------------------------------------------------------------------------------
// <auto-generated>
// This code was generated by a tool.
// 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>
/// Looks up a localized string similar to Give feedback.
/// </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>
/// Looks up a localized string similar to Select station.
/// </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>
/// Looks up a localized string similar to Auth. expired.
/// </summary>
@ -803,7 +803,27 @@ namespace TINK.MultilingualResources {
}
/// <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>
public static string ChangeLog_MinorBugFixes {
get {
@ -812,7 +832,7 @@ namespace TINK.MultilingualResources {
}
/// <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>
public static string ChangeLog_MinorDesignImprovements {
get {
@ -821,7 +841,7 @@ namespace TINK.MultilingualResources {
}
/// <summary>
/// Looks up a localized string similar to Minor improvements..
/// Looks up a localized string similar to - Minor improvements..
/// </summary>
public static string ChangeLog_MinorImprovements {
get {
@ -830,7 +850,7 @@ namespace TINK.MultilingualResources {
}
/// <summary>
/// Looks up a localized string similar to Software packages were updated..
/// Looks up a localized string similar to - Software packages were updated..
/// </summary>
public static string ChangeLog_PackageUpdates {
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>
/// 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>
@ -1727,7 +1756,8 @@ namespace TINK.MultilingualResources {
/// <summary>
/// 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>
public static string ErrorReturnBikeLockClosedGetGPSExceptionMessage {
get {
@ -2004,7 +2034,16 @@ namespace TINK.MultilingualResources {
}
/// <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>
public static string MarkingContactNoStationInfoAvailableNoButton {
get {
@ -2103,7 +2142,16 @@ namespace TINK.MultilingualResources {
}
/// <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>
public static string MarkingFindBikeLabel {
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>
/// Looks up a localized string similar to Menu.
/// </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>
/// Looks up a localized string similar to Lock control.
/// </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>
/// Looks up a localized string similar to Is bike okay?.
/// </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>
/// Looks up a localized string similar to Connection error when canceling the reservation!.
/// </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>
/// Looks up a localized string similar to Connection error when renting the bike!.
/// </summary>
@ -3030,16 +3114,7 @@ namespace TINK.MultilingualResources {
}
/// <summary>
/// Looks up a localized string similar to {0}-app releated request.
/// </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.
/// Looks up a localized string similar to Prefix and No., e.g. TR15.
/// </summary>
public static string PlaceholderFindBike {
get {
@ -3138,9 +3213,9 @@ namespace TINK.MultilingualResources {
}
/// <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>
public static string QuestionSupportmailAttachment {
get {
@ -3248,7 +3323,7 @@ namespace TINK.MultilingualResources {
}
/// <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>
public static string StatusTextReservationExpiredCodeLocationMaxReservationTime {
get {
@ -3266,7 +3341,7 @@ namespace TINK.MultilingualResources {
}
/// <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>
public static string StatusTextReservationExpiredCodeMaxReservationTime {
get {
@ -3284,7 +3359,7 @@ namespace TINK.MultilingualResources {
}
/// <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>
public static string StatusTextReservationExpiredLocationMaxReservationTime {
get {
@ -3302,7 +3377,7 @@ namespace TINK.MultilingualResources {
}
/// <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>
public static string StatusTextReservationExpiredMaximumReservationTime {
get {
@ -3329,7 +3404,7 @@ namespace TINK.MultilingualResources {
}
/// <summary>
/// Looks up a localized string similar to {0} request.
/// Looks up a localized string similar to {0}-request: station {1}.
/// </summary>
public static string SupportmailSubjectOperatormail {
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">
<value>Fragen? Hinweise?</value>
</data>
<data name="MessageRateMail" xml:space="preserve">
<value>Rückmeldung an die App-Entwicklung?</value>
</data>
<data name="MessageWaring" xml:space="preserve">
<value>Warnung</value>
</data>
@ -170,9 +167,9 @@ Mietende ist nur möglich, wenn das Rad in Reichweite ist und Standortinformatio
<value>Ja</value>
</data>
<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 name="QuestionTitle" xml:space="preserve">
<value>Frage</value>
@ -182,7 +179,7 @@ Die Protokolldatei enthält Ihre App-Nutzungsdaten sowie Systeminformationen. Di
Bitte melden Sie sich erneut an.</value>
</data>
<data name="StatusTextReservationExpiredCodeMaxReservationTime" xml:space="preserve">
<value>Code ist {0}, max. Reservierungszeit von {1} Min. abgelaufen.
<value>Code ist {0}, max. Reservierungszeit abgelaufen.
</value>
</data>
<data name="StatusTextReservationExpiredCodeRemaining" xml:space="preserve">
@ -199,13 +196,13 @@ Bitte melden Sie sich erneut an.</value>
<value>Noch {0} Min. reserviert.</value>
</data>
<data name="StatusTextReservationExpiredMaximumReservationTime" xml:space="preserve">
<value>Max. Reservierungszeit von {0} Min. abgelaufen.</value>
<value>Max. Reservierungszeit abgelaufen.</value>
</data>
<data name="StatusTextBookedCodeSince" xml:space="preserve">
<value>Code ist {0}, gemietet seit {1}.</value>
</data>
<data name="StatusTextReservationExpiredLocationMaxReservationTime" xml:space="preserve">
<value>Standort {0}, max. Reservierungszeit von {1} Min. abgelaufen.
<value>Standort {0}, max. Reservierungszeit abgelaufen.
</value>
</data>
<data name="StatusTextAvailable" xml:space="preserve">
@ -216,7 +213,7 @@ Bitte melden Sie sich erneut an.</value>
</value>
</data>
<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>
</data>
<data name="StatusTextReservationExpiredCodeLocationReservationTime" xml:space="preserve">
@ -248,9 +245,6 @@ Bitte melden Sie sich erneut an.</value>
<data name="MarkingLoginPasswordPlaceholder" xml:space="preserve">
<value>Passwort</value>
</data>
<data name="ActionContactRate" xml:space="preserve">
<value>Bewertung abgeben</value>
</data>
<data name="MarkingLoginInstructions" xml:space="preserve">
<value>Anleitung TINK Räder</value>
</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>
</data>
<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 name="ChangeLog3_0_241" xml:space="preserve">
<value>Auf der Kontaktseite werden Kontaktinformationen betreiberspezifisch angezeigt.</value>
@ -907,13 +901,6 @@ Kleinere Fehlerbehebungen.
<data name="ActionGiveFeedback" xml:space="preserve">
<value>Rückmeldung geben</value>
</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">
<value>Verbingungsfehler beim Reservieren des Rads!</value>
</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>
</data>
<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 name="ChangeLog3_0_338_LB_MK" xml:space="preserve">
<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>
</data>
<data name="SupportmailSubjectOperatormail" xml:space="preserve">
<value>{0} Anfrage</value>
<value>{0}-Anfrage: Station {1}</value>
</data>
<data name="QuestionSupportmailAnswerNo" xml:space="preserve">
<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>
</data>
<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 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!
@ -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>
</data>
<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 name="MarkingContactSupportBusy" xml:space="preserve">
<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>
</data>
<data name="ChangeLog_PackageUpdates" xml:space="preserve">
<value>Softwarepakete wurden aktualisiert.</value>
<value>- Softwarepakete wurden aktualisiert.</value>
</data>
<data name="ChangeLog_3_0_355_MK_SB_iOS" xml:space="preserve">
<value>Bluetooth-Kommunikation verbessert.</value>
@ -1113,7 +1100,7 @@ Probieren Sie es aus!</value>
<value>Information</value>
</data>
<data name="ChangeLog_MinorImprovements" xml:space="preserve">
<value>Kleine Verbesserungen.</value>
<value>- Kleine Verbesserungen.</value>
</data>
<data name="ErrorOpenLockBoldStatusIsUnknownMessage" xml:space="preserve">
<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 name="ErrorReturnBikeLockClosedGetGPSExceptionMessage" xml:space="preserve">
<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 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!
@ -1171,7 +1159,7 @@ Außerdem:&lt;br/&gt;
- Paketaktualisierungen</value>
</data>
<data name="MarkingFindBikeLabel" xml:space="preserve">
<value>Rad-ID inklusive Präfix</value>
<value>Rad-ID</value>
</data>
<data name="MarkingSearchBike" xml:space="preserve">
<value>Rad suchen</value>
@ -1188,4 +1176,42 @@ Außerdem:&lt;br/&gt;
<data name="ChangeLog_3_0_365_MK_SB" xml:space="preserve">
<value>Kleine Verbesserungen in Design und Performance.</value>
</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>

View file

@ -248,9 +248,6 @@ Please log in again.</value>
<data name="MessagePhoneMail" xml:space="preserve">
<value>Urgent questions?</value>
</data>
<data name="MessageRateMail" xml:space="preserve">
<value>Feedback to app development?</value>
</data>
<data name="MessageWaring" xml:space="preserve">
<value>Warning</value>
</data>
@ -267,9 +264,9 @@ Please log in again.</value>
<value>{0} request</value>
</data>
<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 name="QuestionSupportmailSubject" xml:space="preserve">
<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>
</data>
<data name="StatusTextReservationExpiredMaximumReservationTime" xml:space="preserve">
<value>Max. reservation time of {0} min. expired.</value>
<value>Max. reservation time expired.</value>
</data>
<data name="StatusTextReservationExpiredCodeRemaining" xml:space="preserve">
<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>
</data>
<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 name="StatusTextAvailable" xml:space="preserve">
<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>
</data>
<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 name="StatusTextReservationExpiredCodeLocationReservationTime" xml:space="preserve">
<value>Code {0}, location {1}, still {2} min. reserved.</value>
</data>
<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 name="StatusTextReservationExpiredLocationReservationTime" xml:space="preserve">
<value>Location {0}, still {1} min. reserved.</value>
</data>
<data name="ActionContactRate" xml:space="preserve">
<value>Submit rating</value>
</data>
<data name="ActionLoginLogin" xml:space="preserve">
<value>Login</value>
</data>
@ -714,7 +708,7 @@ Layout of bike names and id display improved.</value>
<value>Find bike by id functionality added.</value>
</data>
<data name="MarkingContactNoStationInfoAvailableNoButton" xml:space="preserve">
<value>Contact operator?</value>
<value>First select the station whose operator you want to contact.</value>
</data>
<data name="MarkingContactSupport" xml:space="preserve">
<value>&lt;u&gt;Contact&lt;/u&gt; {0}.</value>
@ -1012,13 +1006,6 @@ Minor bugfixes.</value>
<data name="ActionGiveFeedback" xml:space="preserve">
<value>Give feedback</value>
</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">
<value>Connection error when reserving the bike!</value>
</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>
</data>
<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 name="ChangeLog3_0_338_LB_MK" xml:space="preserve">
<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>
</data>
<data name="SupportmailSubjectOperatormail" xml:space="preserve">
<value>{0} request</value>
<value>{0}-request: station {1}</value>
</data>
<data name="QuestionSupportmailAnswerNo" xml:space="preserve">
<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>
</data>
<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 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!
@ -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>
</data>
<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 name="MarkingContactSupportBusy" xml:space="preserve">
<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>
</data>
<data name="ChangeLog_PackageUpdates" xml:space="preserve">
<value>Software packages were updated.</value>
<value>- Software packages were updated.</value>
</data>
<data name="ChangeLog_3_0_355_MK_SB_iOS" xml:space="preserve">
<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>
</data>
<data name="ChangeLog_MinorImprovements" xml:space="preserve">
<value>Minor improvements.</value>
<value>- Minor improvements.</value>
</data>
<data name="MarkingNoNetworkConnection" xml:space="preserve">
<value>Oops, there is no Internet connection.</value>
@ -1234,7 +1221,8 @@ Start getting geolocation failed.</value>
</data>
<data name="ErrorReturnBikeLockClosedGetGPSExceptionMessage" xml:space="preserve">
<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 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!
@ -1260,7 +1248,7 @@ Also:&lt;br/&gt;
- Package updates</value>
</data>
<data name="MarkingFindBikeLabel" xml:space="preserve">
<value>Bike ID including prefix</value>
<value>Bike id</value>
</data>
<data name="MarkingSearchBike" xml:space="preserve">
<value>Search bike</value>
@ -1277,4 +1265,42 @@ Also:&lt;br/&gt;
<data name="ChangeLog_3_0_365_MK_SB" xml:space="preserve">
<value>Minor design and performance improvements.</value>
</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>

View file

@ -202,10 +202,6 @@ Mietende ist nur möglich, wenn das Rad in Reichweite ist und Standortinformatio
<source>Questions? Remarks?</source>
<target state="translated">Fragen? Hinweise?</target>
</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">
<source>Warning</source>
<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>
</trans-unit>
<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>
<target state="translated">Hiermit stimme ich der Übermittlung meiner Protokolldatei zu.
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 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 id="QuestionTitle" translate="yes" xml:space="preserve">
<source>Question</source>
@ -237,8 +233,8 @@ Please log in again.</source>
Bitte melden Sie sich erneut an.</target>
</trans-unit>
<trans-unit id="StatusTextReservationExpiredCodeMaxReservationTime" translate="yes" xml:space="preserve">
<source>Code {0}, max. reservation time of {1} min. expired.</source>
<target state="translated">Code ist {0}, max. Reservierungszeit von {1} Min. abgelaufen.
<source>Code {0}, max. reservation time expired.</source>
<target state="translated">Code ist {0}, max. Reservierungszeit abgelaufen.
</target>
</trans-unit>
<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>
</trans-unit>
<trans-unit id="StatusTextReservationExpiredMaximumReservationTime" translate="yes" xml:space="preserve">
<source>Max. reservation time of {0} min. expired.</source>
<target state="translated">Max. Reservierungszeit von {0} Min. abgelaufen.</target>
<source>Max. reservation time expired.</source>
<target state="translated">Max. Reservierungszeit abgelaufen.</target>
</trans-unit>
<trans-unit id="StatusTextBookedCodeSince" translate="yes" xml:space="preserve">
<source>Code {0}, rented since {1}.</source>
<target state="translated">Code ist {0}, gemietet seit {1}.</target>
</trans-unit>
<trans-unit id="StatusTextReservationExpiredLocationMaxReservationTime" translate="yes" xml:space="preserve">
<source>Location {0}, max. reservation time of {1} min. expired.</source>
<target state="translated">Standort {0}, max. Reservierungszeit von {1} Min. abgelaufen.
<source>Location {0}, max. reservation time expired.</source>
<target state="translated">Standort {0}, max. Reservierungszeit abgelaufen.
</target>
</trans-unit>
<trans-unit id="StatusTextAvailable" translate="yes" xml:space="preserve">
@ -281,8 +277,8 @@ Bitte melden Sie sich erneut an.</target>
</target>
</trans-unit>
<trans-unit id="StatusTextReservationExpiredCodeLocationMaxReservationTime" translate="yes" xml:space="preserve">
<source>Code {0}, location {1}, max. reservation time of {2} min. expired.</source>
<target state="translated">Code ist {0}, Standort {1}, max. Reservierungszeit von {2} Min. abgelaufen.
<source>Code {0}, location {1}, max. reservation time expired.</source>
<target state="translated">Code ist {0}, Standort {1}, max. Reservierungszeit abgelaufen.
</target>
</trans-unit>
<trans-unit id="StatusTextReservationExpiredCodeLocationReservationTime" translate="yes" xml:space="preserve">
@ -323,10 +319,6 @@ Bitte melden Sie sich erneut an.</target>
<source>Password</source>
<target state="translated">Passwort</target>
</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">
<source>Instructions TINK bikes</source>
<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>
</trans-unit>
<trans-unit id="MarkingContactNoStationInfoAvailableNoButton" translate="yes" xml:space="preserve">
<source>Contact operator?</source>
<target state="translated">Betreiber kontaktieren?</target>
<source>First select the station whose operator you want to contact.</source>
<target state="translated">Wählen Sie zunächst die Station, zu deren Betreiber Sie Kontakt aufnehmen möchten.</target>
</trans-unit>
<trans-unit id="ChangeLog3_0_241" translate="yes" xml:space="preserve">
<source>Bike sharing system operator specific support info displayed on contact page.</source>
@ -1234,16 +1226,6 @@ Kleinere Fehlerbehebungen.
<source>Give feedback</source>
<target state="translated">Rückmeldung geben</target>
</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">
<source>Connection error when reserving the bike!</source>
<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>
</trans-unit>
<trans-unit id="ChangeLog_MinorBugFixes" translate="yes" xml:space="preserve">
<source>We have fixed some bugs. Enjoy the ride!</source>
<target state="translated">Wir haben einige Fehler behoben. Genießen Sie die Fahrt!</target>
<source>- We have fixed a few minor bugs. Enjoy the ride!</source>
<target state="translated">- Wir haben ein paar kleine Fehler behoben. Genießen Sie die Fahrt!</target>
</trans-unit>
<trans-unit id="ChangeLog3_0_338_LB_MK" translate="yes" xml:space="preserve">
<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>
</trans-unit>
<trans-unit id="SupportmailSubjectOperatormail" translate="yes" xml:space="preserve">
<source>{0} request</source>
<target state="translated">{0} Anfrage</target>
<source>{0}-request: station {1}</source>
<target state="translated">{0}-Anfrage: Station {1}</target>
</trans-unit>
<trans-unit id="QuestionSupportmailAnswerNo" translate="yes" xml:space="preserve">
<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>
</trans-unit>
<trans-unit id="PlaceholderFindBike" translate="yes" xml:space="preserve">
<source>Bike ID including prefix e.g. TR15</source>
<target state="translated">Rad-ID inklusive Präfix, z.B. TR15</target>
<source>Prefix and No., e.g. TR15</source>
<target state="translated">Präfix und Nr., z.B. TR15</target>
</trans-unit>
<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!
@ -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>
</trans-unit>
<trans-unit id="ChangeLog_MinorDesignImprovements" translate="yes" xml:space="preserve">
<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>
<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>
</trans-unit>
<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>
@ -1505,8 +1487,8 @@ Probieren Sie es aus!</target>
<ept id="1">&lt;/ul&gt;</ept></target>
</trans-unit>
<trans-unit id="ChangeLog_PackageUpdates" translate="yes" xml:space="preserve">
<source>Software packages were updated.</source>
<target state="translated">Softwarepakete wurden aktualisiert.</target>
<source>- Software packages were updated.</source>
<target state="translated">- Softwarepakete wurden aktualisiert.</target>
</trans-unit>
<trans-unit id="ChangeLog_3_0_355_MK_SB_iOS" translate="yes" xml:space="preserve">
<source>Bluetooth communication improved.</source>
@ -1529,8 +1511,8 @@ Probieren Sie es aus!</target>
<target state="translated">Information</target>
</trans-unit>
<trans-unit id="ChangeLog_MinorImprovements" translate="yes" xml:space="preserve">
<source>Minor improvements.</source>
<target state="translated">Kleine Verbesserungen.</target>
<source>- Minor improvements.</source>
<target state="translated">- Kleine Verbesserungen.</target>
</trans-unit>
<trans-unit id="ErrorOpenLockBoldStatusIsUnknownMessage" translate="yes" xml:space="preserve">
<source>The lock could not be opened correctly. Try again!
@ -1576,9 +1558,11 @@ Fehler beim Start der Standortabfrage!</target>
</trans-unit>
<trans-unit id="ErrorReturnBikeLockClosedGetGPSExceptionMessage" translate="yes" xml:space="preserve">
<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.
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 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!
@ -1620,8 +1604,8 @@ Außerdem:&lt;br/&gt;
- Paketaktualisierungen</target>
</trans-unit>
<trans-unit id="MarkingFindBikeLabel" translate="yes" xml:space="preserve">
<source>Bike ID including prefix</source>
<target state="translated">Rad-ID inklusive Präfix</target>
<source>Bike id</source>
<target state="translated">Rad-ID</target>
</trans-unit>
<trans-unit id="MarkingSearchBike" translate="yes" xml:space="preserve">
<source>Search bike</source>
@ -1643,6 +1627,58 @@ Außerdem:&lt;br/&gt;
<source>Minor design and performance improvements.</source>
<target state="translated">Kleine Verbesserungen in Design und Performance.</target>
</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>
</body>
</file>

View file

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

View file

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