Version 3.0.369

This commit is contained in:
Anja 2023-07-19 10:10:36 +02:00
parent 1a58bf58d3
commit f5cf9bb22f
70 changed files with 1130 additions and 773 deletions

View file

@ -16,7 +16,7 @@
<AndroidResgenFile>Resources\Resource.Designer.cs</AndroidResgenFile> <AndroidResgenFile>Resources\Resource.Designer.cs</AndroidResgenFile>
<GenerateSerializationAssemblies>Off</GenerateSerializationAssemblies> <GenerateSerializationAssemblies>Off</GenerateSerializationAssemblies>
<AndroidManifest>Properties\AndroidManifest.xml</AndroidManifest> <AndroidManifest>Properties\AndroidManifest.xml</AndroidManifest>
<TargetFrameworkVersion>v12.0</TargetFrameworkVersion> <TargetFrameworkVersion>v13.0</TargetFrameworkVersion>
<AndroidStoreUncompressedFileExtensions /> <AndroidStoreUncompressedFileExtensions />
<MandroidI18n /> <MandroidI18n />
<JavaMaximumHeapSize>2G</JavaMaximumHeapSize> <JavaMaximumHeapSize>2G</JavaMaximumHeapSize>

View file

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

View file

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

View file

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

View file

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

View file

@ -16,7 +16,7 @@
<AndroidResgenFile>Resources\Resource.Designer.cs</AndroidResgenFile> <AndroidResgenFile>Resources\Resource.Designer.cs</AndroidResgenFile>
<GenerateSerializationAssemblies>Off</GenerateSerializationAssemblies> <GenerateSerializationAssemblies>Off</GenerateSerializationAssemblies>
<AndroidManifest>Properties\AndroidManifest.xml</AndroidManifest> <AndroidManifest>Properties\AndroidManifest.xml</AndroidManifest>
<TargetFrameworkVersion>v12.0</TargetFrameworkVersion> <TargetFrameworkVersion>v13.0</TargetFrameworkVersion>
<AndroidStoreUncompressedFileExtensions /> <AndroidStoreUncompressedFileExtensions />
<MandroidI18n /> <MandroidI18n />
<JavaMaximumHeapSize>2G</JavaMaximumHeapSize> <JavaMaximumHeapSize>2G</JavaMaximumHeapSize>
@ -302,21 +302,6 @@
<Generator>MSBuild:UpdateGeneratedFiles</Generator> <Generator>MSBuild:UpdateGeneratedFiles</Generator>
</AndroidResource> </AndroidResource>
</ItemGroup> </ItemGroup>
<ItemGroup>
<AndroidResource Include="Resources\drawable-hdpi\konrad_nobg.png" />
</ItemGroup>
<ItemGroup>
<AndroidResource Include="Resources\drawable-mdpi\konrad_nobg.png" />
</ItemGroup>
<ItemGroup>
<AndroidResource Include="Resources\drawable-xhdpi\konrad_nobg.png" />
</ItemGroup>
<ItemGroup>
<AndroidResource Include="Resources\drawable-xxhdpi\konrad_nobg.png" />
</ItemGroup>
<ItemGroup>
<AndroidResource Include="Resources\drawable-xxxhdpi\konrad_nobg.png" />
</ItemGroup>
<ItemGroup> <ItemGroup>
<AndroidResource Include="Resources\drawable\konrad_nobg.png"> <AndroidResource Include="Resources\drawable\konrad_nobg.png">
<Generator>MSBuild:UpdateGeneratedFiles</Generator> <Generator>MSBuild:UpdateGeneratedFiles</Generator>
@ -362,41 +347,11 @@
<Generator>MSBuild:UpdateGeneratedFiles</Generator> <Generator>MSBuild:UpdateGeneratedFiles</Generator>
</AndroidResource> </AndroidResource>
</ItemGroup> </ItemGroup>
<ItemGroup>
<AndroidResource Include="Resources\drawable-hdpi\swk_theme.png" />
</ItemGroup>
<ItemGroup>
<AndroidResource Include="Resources\drawable-mdpi\swk_theme.png" />
</ItemGroup>
<ItemGroup>
<AndroidResource Include="Resources\drawable-xhdpi\swk_theme.png" />
</ItemGroup>
<ItemGroup>
<AndroidResource Include="Resources\drawable-xxhdpi\swk_theme.png" />
</ItemGroup>
<ItemGroup>
<AndroidResource Include="Resources\drawable-xxxhdpi\swk_theme.png" />
</ItemGroup>
<ItemGroup> <ItemGroup>
<AndroidResource Include="Resources\drawable\swk_theme.png"> <AndroidResource Include="Resources\drawable\swk_theme.png">
<Generator>MSBuild:UpdateGeneratedFiles</Generator> <Generator>MSBuild:UpdateGeneratedFiles</Generator>
</AndroidResource> </AndroidResource>
</ItemGroup> </ItemGroup>
<ItemGroup>
<AndroidResource Include="Resources\drawable-hdpi\menu_swk_theme.png" />
</ItemGroup>
<ItemGroup>
<AndroidResource Include="Resources\drawable-mdpi\menu_swk_theme.png" />
</ItemGroup>
<ItemGroup>
<AndroidResource Include="Resources\drawable-xhdpi\menu_swk_theme.png" />
</ItemGroup>
<ItemGroup>
<AndroidResource Include="Resources\drawable-xxhdpi\menu_swk_theme.png" />
</ItemGroup>
<ItemGroup>
<AndroidResource Include="Resources\drawable-xxxhdpi\menu_swk_theme.png" />
</ItemGroup>
<ItemGroup> <ItemGroup>
<AndroidResource Include="Resources\drawable\menu_swk_theme.png"> <AndroidResource Include="Resources\drawable\menu_swk_theme.png">
<Generator>MSBuild:UpdateGeneratedFiles</Generator> <Generator>MSBuild:UpdateGeneratedFiles</Generator>

View file

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

Binary file not shown.

Before

Width:  |  Height:  |  Size: 52 KiB

After

Width:  |  Height:  |  Size: 27 KiB

View file

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

View file

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

View file

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

View file

@ -89,7 +89,7 @@
<!--Bike data--> <!--Bike data-->
<Grid <Grid
RowDefinitions="Auto,Auto" RowDefinitions="Auto,1*"
RowSpacing="0"> RowSpacing="0">
<!--Hint for Outdated Data.--> <!--Hint for Outdated Data.-->

View file

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

View file

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

View file

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

View file

@ -46,7 +46,7 @@
<!--Bike data--> <!--Bike data-->
<Grid <Grid
RowDefinitions="Auto,Auto" RowDefinitions="Auto,1*"
RowSpacing="0"> RowSpacing="0">
<!--Hint for Outdated Data.--> <!--Hint for Outdated Data.-->

View file

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

View file

@ -16,7 +16,7 @@
<AndroidResgenFile>Resources\Resource.Designer.cs</AndroidResgenFile> <AndroidResgenFile>Resources\Resource.Designer.cs</AndroidResgenFile>
<GenerateSerializationAssemblies>Off</GenerateSerializationAssemblies> <GenerateSerializationAssemblies>Off</GenerateSerializationAssemblies>
<AndroidManifest>Properties\AndroidManifest.xml</AndroidManifest> <AndroidManifest>Properties\AndroidManifest.xml</AndroidManifest>
<TargetFrameworkVersion>v12.0</TargetFrameworkVersion> <TargetFrameworkVersion>v13.0</TargetFrameworkVersion>
<AndroidStoreUncompressedFileExtensions /> <AndroidStoreUncompressedFileExtensions />
<MandroidI18n /> <MandroidI18n />
<JavaMaximumHeapSize>2G</JavaMaximumHeapSize> <JavaMaximumHeapSize>2G</JavaMaximumHeapSize>

View file

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

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.7 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 18 KiB

View file

@ -271,9 +271,6 @@
<HintPath>..\..\..\..\.nuget\packages\xamarin.google.ios.maps\2.5.0\lib\Xamarin.iOS10\Google.Maps.dll</HintPath> <HintPath>..\..\..\..\.nuget\packages\xamarin.google.ios.maps\2.5.0\lib\Xamarin.iOS10\Google.Maps.dll</HintPath>
</Reference> </Reference>
</ItemGroup> </ItemGroup>
<ItemGroup>
<BundleResource Include="Resources\tink2.png" />
</ItemGroup>
<ItemGroup> <ItemGroup>
<ProjectReference Include="..\..\LockItBLE\LockItBLE.csproj"> <ProjectReference Include="..\..\LockItBLE\LockItBLE.csproj">
<Project>{bde9ce26-15cf-47da-a4f6-b6956d02d0fc}</Project> <Project>{bde9ce26-15cf-47da-a4f6-b6956d02d0fc}</Project>

Binary file not shown.

Before

Width:  |  Height:  |  Size: 582 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 344 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 451 KiB

Binary file not shown.

Before

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

Binary file not shown.

Before

Width:  |  Height:  |  Size: 356 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 804 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 283 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 399 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 500 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 886 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 322 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.2 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 457 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 396 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.1 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 388 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 997 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 352 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 488 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 622 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.6 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 600 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 965 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 338 KiB

Binary file not shown.

Binary file not shown.

View file

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

View file

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

View file

@ -88,7 +88,7 @@
<!--Bike data--> <!--Bike data-->
<Grid <Grid
RowDefinitions="Auto,Auto" RowDefinitions="Auto,1*"
RowSpacing="0"> RowSpacing="0">
<!--Hint for Outdated Data.--> <!--Hint for Outdated Data.-->

View file

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

View file

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

View file

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

View file

@ -43,7 +43,7 @@
<!--Bike data--> <!--Bike data-->
<Grid <Grid
RowDefinitions="Auto,Auto" RowDefinitions="Auto,1*"
RowSpacing="0"> RowSpacing="0">
<!--Hint for Outdated Data.--> <!--Hint for Outdated Data.-->

View file

@ -702,6 +702,11 @@ namespace TINK.Model
new Version(3, 0, 368), new Version(3, 0, 368),
string.Format("{0} <br /> {1}", AppResources.ChangeLog_PackageUpdates, AppResources.ChangeLog_MinorBugFixes), string.Format("{0} <br /> {1}", AppResources.ChangeLog_PackageUpdates, AppResources.ChangeLog_MinorBugFixes),
new List<AppFlavor> { AppFlavor.MeinKonrad, AppFlavor.ShareeBike } new List<AppFlavor> { AppFlavor.MeinKonrad, AppFlavor.ShareeBike }
},
{
new Version(3, 0, 369),
AppResources.ChangeLog_3_0_369_MK_SB,
new List<AppFlavor> { AppFlavor.MeinKonrad, AppFlavor.ShareeBike }
}, },
}; };

View file

@ -1,4 +1,4 @@
//------------------------------------------------------------------------------ //------------------------------------------------------------------------------
// <auto-generated> // <auto-generated>
// This code was generated by a tool. // This code was generated by a tool.
// Runtime Version:4.0.30319.42000 // Runtime Version:4.0.30319.42000
@ -96,24 +96,6 @@ namespace TINK.MultilingualResources {
} }
} }
/// <summary>
/// Looks up a localized string similar to Sent e-mail.
/// </summary>
public static string ActionContactMailAppReleated {
get {
return ResourceManager.GetString("ActionContactMailAppReleated", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Submit rating.
/// </summary>
public static string ActionContactRate {
get {
return ResourceManager.GetString("ActionContactRate", resourceCulture);
}
}
/// <summary> /// <summary>
/// Looks up a localized string similar to Give feedback. /// Looks up a localized string similar to Give feedback.
/// </summary> /// </summary>
@ -204,6 +186,15 @@ namespace TINK.MultilingualResources {
} }
} }
/// <summary>
/// Looks up a localized string similar to Select another station.
/// </summary>
public static string ActionSelectAnotherStation {
get {
return ResourceManager.GetString("ActionSelectAnotherStation", resourceCulture);
}
}
/// <summary> /// <summary>
/// Looks up a localized string similar to Select station. /// Looks up a localized string similar to Select station.
/// </summary> /// </summary>
@ -213,6 +204,15 @@ namespace TINK.MultilingualResources {
} }
} }
/// <summary>
/// Looks up a localized string similar to &lt;u&gt;Transfer diagnostic file&lt;/u&gt;.
/// </summary>
public static string ActionSendDiagnosis {
get {
return ResourceManager.GetString("ActionSendDiagnosis", resourceCulture);
}
}
/// <summary> /// <summary>
/// Looks up a localized string similar to Auth. expired. /// Looks up a localized string similar to Auth. expired.
/// </summary> /// </summary>
@ -811,6 +811,17 @@ namespace TINK.MultilingualResources {
} }
} }
/// <summary>
/// Looks up a localized string similar to We have re-designed the contact page:
/// &lt;ul&gt;&lt;li&gt;Please contact the customer support immediately in case of problems with the bike rental!
///&lt;/li&gt;&lt;li&gt;To diagnose a problem, you can send us your app usage data via &quot;Transfer diagnostic file&quot;. Without your active sending we do not record any of your data!&lt;/li&gt;&lt;/ul&gt;.
/// </summary>
public static string ChangeLog_3_0_369_MK_SB {
get {
return ResourceManager.GetString("ChangeLog_3_0_369_MK_SB", resourceCulture);
}
}
/// <summary> /// <summary>
/// Looks up a localized string similar to - We have fixed a few minor bugs. Enjoy the ride!. /// Looks up a localized string similar to - We have fixed a few minor bugs. Enjoy the ride!.
/// </summary> /// </summary>
@ -2023,7 +2034,16 @@ namespace TINK.MultilingualResources {
} }
/// <summary> /// <summary>
/// Looks up a localized string similar to Contact operator?. /// Looks up a localized string similar to Customer support.
/// </summary>
public static string MarkingContactCustomerSupportTitle {
get {
return ResourceManager.GetString("MarkingContactCustomerSupportTitle", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to First select the station whose operator you want to contact..
/// </summary> /// </summary>
public static string MarkingContactNoStationInfoAvailableNoButton { public static string MarkingContactNoStationInfoAvailableNoButton {
get { get {
@ -2166,6 +2186,15 @@ namespace TINK.MultilingualResources {
} }
} }
/// <summary>
/// Looks up a localized string similar to Last selected station.
/// </summary>
public static string MarkingLastSelectedStation {
get {
return ResourceManager.GetString("MarkingLastSelectedStation", resourceCulture);
}
}
/// <summary> /// <summary>
/// Looks up a localized string similar to Lock control. /// Looks up a localized string similar to Lock control.
/// </summary> /// </summary>
@ -2329,6 +2358,15 @@ namespace TINK.MultilingualResources {
} }
} }
/// <summary>
/// Looks up a localized string similar to Operator.
/// </summary>
public static string MarkingOperator {
get {
return ResourceManager.GetString("MarkingOperator", resourceCulture);
}
}
/// <summary> /// <summary>
/// Looks up a localized string similar to Is bike okay?. /// Looks up a localized string similar to Is bike okay?.
/// </summary> /// </summary>
@ -2976,15 +3014,6 @@ namespace TINK.MultilingualResources {
} }
} }
/// <summary>
/// Looks up a localized string similar to Feedback to app development?.
/// </summary>
public static string MessageRateMail {
get {
return ResourceManager.GetString("MessageRateMail", resourceCulture);
}
}
/// <summary> /// <summary>
/// Looks up a localized string similar to Connection error when renting the bike!. /// Looks up a localized string similar to Connection error when renting the bike!.
/// </summary> /// </summary>
@ -3084,15 +3113,6 @@ 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> /// <summary>
/// Looks up a localized string similar to Prefix and No., e.g. TR15. /// Looks up a localized string similar to Prefix and No., e.g. TR15.
/// </summary> /// </summary>
@ -3193,9 +3213,9 @@ namespace TINK.MultilingualResources {
} }
/// <summary> /// <summary>
/// Looks up a localized string similar to I hereby consent to the transmission of my log file. /// Looks up a localized string similar to I hereby consent to the transmission of my diagnostic file.
/// ///
///The log file contains your app usage data as well as system information. The data will only be used for diagnostic purposes or to improve the app and then deleted.. ///The diagnostic file contains your app usage data as well as system information. The data will only be used for diagnostic purposes or to improve the app and is then deleted..
/// </summary> /// </summary>
public static string QuestionSupportmailAttachment { public static string QuestionSupportmailAttachment {
get { get {
@ -3384,7 +3404,7 @@ namespace TINK.MultilingualResources {
} }
/// <summary> /// <summary>
/// Looks up a localized string similar to {0} request. /// Looks up a localized string similar to {0}-request: station {1}.
/// </summary> /// </summary>
public static string SupportmailSubjectOperatormail { public static string SupportmailSubjectOperatormail {
get { get {

View file

@ -157,9 +157,6 @@ Mietende ist nur möglich, wenn das Rad in Reichweite ist und Standortinformatio
<data name="MessageContactMail" xml:space="preserve"> <data name="MessageContactMail" xml:space="preserve">
<value>Fragen? Hinweise?</value> <value>Fragen? Hinweise?</value>
</data> </data>
<data name="MessageRateMail" xml:space="preserve">
<value>Rückmeldung an die App-Entwicklung?</value>
</data>
<data name="MessageWaring" xml:space="preserve"> <data name="MessageWaring" xml:space="preserve">
<value>Warnung</value> <value>Warnung</value>
</data> </data>
@ -170,9 +167,9 @@ Mietende ist nur möglich, wenn das Rad in Reichweite ist und Standortinformatio
<value>Ja</value> <value>Ja</value>
</data> </data>
<data name="QuestionSupportmailAttachment" xml:space="preserve"> <data name="QuestionSupportmailAttachment" xml:space="preserve">
<value>Hiermit stimme ich der Übermittlung meiner Protokolldatei zu. <value>Hiermit stimme ich der Übermittlung meiner Diagnosedatei zu.
Die Protokolldatei enthält Ihre App-Nutzungsdaten sowie Systeminformationen. Die Daten werden ausschließlich für Diagnosezwecke bzw. Verbesserung der App verwendet und werden anschließend gelöscht.</value> Die Diagnosedatei enthält Ihre App-Nutzungsdaten sowie Systeminformationen. Die Daten werden ausschließlich für Diagnosezwecke bzw. Verbesserung der App verwendet und werden anschließend gelöscht.</value>
</data> </data>
<data name="QuestionTitle" xml:space="preserve"> <data name="QuestionTitle" xml:space="preserve">
<value>Frage</value> <value>Frage</value>
@ -248,9 +245,6 @@ Bitte melden Sie sich erneut an.</value>
<data name="MarkingLoginPasswordPlaceholder" xml:space="preserve"> <data name="MarkingLoginPasswordPlaceholder" xml:space="preserve">
<value>Passwort</value> <value>Passwort</value>
</data> </data>
<data name="ActionContactRate" xml:space="preserve">
<value>Bewertung abgeben</value>
</data>
<data name="MarkingLoginInstructions" xml:space="preserve"> <data name="MarkingLoginInstructions" xml:space="preserve">
<value>Anleitung TINK Räder</value> <value>Anleitung TINK Räder</value>
</data> </data>
@ -605,7 +599,7 @@ Layout Anzeige Radnamen und nummern verbessert.</value>
<value>Bitte Anmelden, um Räder zu reservieren! &lt;font color="blue"&gt;&lt;u&gt;Hier&lt;/u&gt;&lt;/font&gt; tippen, um auf Anmeldeseite zu wechseln.</value> <value>Bitte Anmelden, um Räder zu reservieren! &lt;font color="blue"&gt;&lt;u&gt;Hier&lt;/u&gt;&lt;/font&gt; tippen, um auf Anmeldeseite zu wechseln.</value>
</data> </data>
<data name="MarkingContactNoStationInfoAvailableNoButton" xml:space="preserve"> <data name="MarkingContactNoStationInfoAvailableNoButton" xml:space="preserve">
<value>Betreiber kontaktieren?</value> <value>Wählen Sie zunächst die Station, zu deren Betreiber Sie Kontakt aufnehmen möchten.</value>
</data> </data>
<data name="ChangeLog3_0_241" xml:space="preserve"> <data name="ChangeLog3_0_241" xml:space="preserve">
<value>Auf der Kontaktseite werden Kontaktinformationen betreiberspezifisch angezeigt.</value> <value>Auf der Kontaktseite werden Kontaktinformationen betreiberspezifisch angezeigt.</value>
@ -907,13 +901,6 @@ Kleinere Fehlerbehebungen.
<data name="ActionGiveFeedback" xml:space="preserve"> <data name="ActionGiveFeedback" xml:space="preserve">
<value>Rückmeldung geben</value> <value>Rückmeldung geben</value>
</data> </data>
<data name="ActionContactMailAppReleated" xml:space="preserve">
<value>E-Mail senden</value>
</data>
<data name="MiscContactMailAppReleatedSubject" xml:space="preserve">
<value>{0}-App Anfrage</value>
<comment>Subject of contact mail to ("Feedback about the app").</comment>
</data>
<data name="MessageReservingBikeErrorConnectionTitle" xml:space="preserve"> <data name="MessageReservingBikeErrorConnectionTitle" xml:space="preserve">
<value>Verbingungsfehler beim Reservieren des Rads!</value> <value>Verbingungsfehler beim Reservieren des Rads!</value>
</data> </data>
@ -998,7 +985,7 @@ Außerdem: Kleine Grafiken lassen auf einen Blick erkennen um was für einen Rad
<value>{0}-App Anfrage</value> <value>{0}-App Anfrage</value>
</data> </data>
<data name="SupportmailSubjectOperatormail" xml:space="preserve"> <data name="SupportmailSubjectOperatormail" xml:space="preserve">
<value>{0} Anfrage</value> <value>{0}-Anfrage: Station {1}</value>
</data> </data>
<data name="QuestionSupportmailAnswerNo" xml:space="preserve"> <data name="QuestionSupportmailAnswerNo" xml:space="preserve">
<value>Nein, Datei nicht anhängen</value> <value>Nein, Datei nicht anhängen</value>
@ -1207,4 +1194,24 @@ Außerdem:&lt;br/&gt;
<data name="ErrorQueryGeolocation" xml:space="preserve"> <data name="ErrorQueryGeolocation" xml:space="preserve">
<value>Standortabfrage fehlgeschlagen</value> <value>Standortabfrage fehlgeschlagen</value>
</data> </data>
<data name="MarkingContactCustomerSupportTitle" xml:space="preserve">
<value>Kundensupport</value>
</data>
<data name="ActionSelectAnotherStation" xml:space="preserve">
<value>Andere Station auswählen</value>
</data>
<data name="ActionSendDiagnosis" xml:space="preserve">
<value>&lt;u&gt;Diagnosedatei übermitteln&lt;/u&gt;</value>
</data>
<data name="MarkingLastSelectedStation" xml:space="preserve">
<value>Zuletzt ausgewählte Station</value>
</data>
<data name="MarkingOperator" xml:space="preserve">
<value>Betreiber</value>
</data>
<data name="ChangeLog_3_0_369_MK_SB" xml:space="preserve">
<value>Wir haben die Kontakt-Seite neu gestaltet:
&lt;ul&gt;&lt;li&gt;Bitte kontaktieren Sie bei Problemen bei der Fahrradmiete umgehend den Kundensupport!
&lt;/li&gt;&lt;li&gt;Für die Diagnose eines Problems können Sie über "Diagnosedatei übermitteln" Ihre App-Nutzungsdaten an uns senden. Ohne Ihr aktives Zusenden zeichnen wir keine Ihrer Daten auf!&lt;/li&gt;&lt;/ul&gt;</value>
</data>
</root> </root>

View file

@ -248,9 +248,6 @@ Please log in again.</value>
<data name="MessagePhoneMail" xml:space="preserve"> <data name="MessagePhoneMail" xml:space="preserve">
<value>Urgent questions?</value> <value>Urgent questions?</value>
</data> </data>
<data name="MessageRateMail" xml:space="preserve">
<value>Feedback to app development?</value>
</data>
<data name="MessageWaring" xml:space="preserve"> <data name="MessageWaring" xml:space="preserve">
<value>Warning</value> <value>Warning</value>
</data> </data>
@ -267,9 +264,9 @@ Please log in again.</value>
<value>{0} request</value> <value>{0} request</value>
</data> </data>
<data name="QuestionSupportmailAttachment" xml:space="preserve"> <data name="QuestionSupportmailAttachment" xml:space="preserve">
<value>I hereby consent to the transmission of my log file. <value>I hereby consent to the transmission of my diagnostic file.
The log file contains your app usage data as well as system information. The data will only be used for diagnostic purposes or to improve the app and then deleted.</value> The diagnostic file contains your app usage data as well as system information. The data will only be used for diagnostic purposes or to improve the app and is then deleted.</value>
</data> </data>
<data name="QuestionSupportmailSubject" xml:space="preserve"> <data name="QuestionSupportmailSubject" xml:space="preserve">
<value>Does your request/comment relate to the {0}-app or to a more general subject?</value> <value>Does your request/comment relate to the {0}-app or to a more general subject?</value>
@ -328,9 +325,6 @@ The log file contains your app usage data as well as system information. The dat
<data name="StatusTextReservationExpiredLocationReservationTime" xml:space="preserve"> <data name="StatusTextReservationExpiredLocationReservationTime" xml:space="preserve">
<value>Location {0}, still {1} min. reserved.</value> <value>Location {0}, still {1} min. reserved.</value>
</data> </data>
<data name="ActionContactRate" xml:space="preserve">
<value>Submit rating</value>
</data>
<data name="ActionLoginLogin" xml:space="preserve"> <data name="ActionLoginLogin" xml:space="preserve">
<value>Login</value> <value>Login</value>
</data> </data>
@ -714,7 +708,7 @@ Layout of bike names and id display improved.</value>
<value>Find bike by id functionality added.</value> <value>Find bike by id functionality added.</value>
</data> </data>
<data name="MarkingContactNoStationInfoAvailableNoButton" xml:space="preserve"> <data name="MarkingContactNoStationInfoAvailableNoButton" xml:space="preserve">
<value>Contact operator?</value> <value>First select the station whose operator you want to contact.</value>
</data> </data>
<data name="MarkingContactSupport" xml:space="preserve"> <data name="MarkingContactSupport" xml:space="preserve">
<value>&lt;u&gt;Contact&lt;/u&gt; {0}.</value> <value>&lt;u&gt;Contact&lt;/u&gt; {0}.</value>
@ -1012,13 +1006,6 @@ Minor bugfixes.</value>
<data name="ActionGiveFeedback" xml:space="preserve"> <data name="ActionGiveFeedback" xml:space="preserve">
<value>Give feedback</value> <value>Give feedback</value>
</data> </data>
<data name="ActionContactMailAppReleated" xml:space="preserve">
<value>Sent e-mail</value>
</data>
<data name="MiscContactMailAppReleatedSubject" xml:space="preserve">
<value>{0}-app releated request</value>
<comment>Subject of contact mail to ("Feedback about the app").</comment>
</data>
<data name="MessageReservingBikeErrorConnectionTitle" xml:space="preserve"> <data name="MessageReservingBikeErrorConnectionTitle" xml:space="preserve">
<value>Connection error when reserving the bike!</value> <value>Connection error when reserving the bike!</value>
</data> </data>
@ -1103,7 +1090,7 @@ In addition: Small graphics let you see at a glance what type of bike it is.</va
<value>{0}-app request</value> <value>{0}-app request</value>
</data> </data>
<data name="SupportmailSubjectOperatormail" xml:space="preserve"> <data name="SupportmailSubjectOperatormail" xml:space="preserve">
<value>{0} request</value> <value>{0}-request: station {1}</value>
</data> </data>
<data name="QuestionSupportmailAnswerNo" xml:space="preserve"> <data name="QuestionSupportmailAnswerNo" xml:space="preserve">
<value>No, do not attach file</value> <value>No, do not attach file</value>
@ -1296,4 +1283,24 @@ Also:&lt;br/&gt;
<data name="ErrorQueryGeolocation" xml:space="preserve"> <data name="ErrorQueryGeolocation" xml:space="preserve">
<value>Location query failed</value> <value>Location query failed</value>
</data> </data>
<data name="ActionSelectAnotherStation" xml:space="preserve">
<value>Select another station</value>
</data>
<data name="MarkingContactCustomerSupportTitle" xml:space="preserve">
<value>Customer support</value>
</data>
<data name="MarkingLastSelectedStation" xml:space="preserve">
<value>Last selected station</value>
</data>
<data name="MarkingOperator" xml:space="preserve">
<value>Operator</value>
</data>
<data name="ActionSendDiagnosis" xml:space="preserve">
<value>&lt;u&gt;Transfer diagnostic file&lt;/u&gt;</value>
</data>
<data name="ChangeLog_3_0_369_MK_SB" xml:space="preserve">
<value>We have re-designed the contact page:
&lt;ul&gt;&lt;li&gt;Please contact the customer support immediately in case of problems with the bike rental!
&lt;/li&gt;&lt;li&gt;To diagnose a problem, you can send us your app usage data via "Transfer diagnostic file". Without your active sending we do not record any of your data!&lt;/li&gt;&lt;/ul&gt;</value>
</data>
</root> </root>

View file

@ -202,10 +202,6 @@ Mietende ist nur möglich, wenn das Rad in Reichweite ist und Standortinformatio
<source>Questions? Remarks?</source> <source>Questions? Remarks?</source>
<target state="translated">Fragen? Hinweise?</target> <target state="translated">Fragen? Hinweise?</target>
</trans-unit> </trans-unit>
<trans-unit id="MessageRateMail" translate="yes" xml:space="preserve">
<source>Feedback to app development?</source>
<target state="translated">Rückmeldung an die App-Entwicklung?</target>
</trans-unit>
<trans-unit id="MessageWaring" translate="yes" xml:space="preserve"> <trans-unit id="MessageWaring" translate="yes" xml:space="preserve">
<source>Warning</source> <source>Warning</source>
<target state="translated">Warnung</target> <target state="translated">Warnung</target>
@ -219,12 +215,12 @@ Mietende ist nur möglich, wenn das Rad in Reichweite ist und Standortinformatio
<target state="translated">Ja</target> <target state="translated">Ja</target>
</trans-unit> </trans-unit>
<trans-unit id="QuestionSupportmailAttachment" translate="yes" xml:space="preserve"> <trans-unit id="QuestionSupportmailAttachment" translate="yes" xml:space="preserve">
<source>I hereby consent to the transmission of my log file. <source>I hereby consent to the transmission of my diagnostic file.
The log file contains your app usage data as well as system information. The data will only be used for diagnostic purposes or to improve the app and then deleted.</source> The diagnostic file contains your app usage data as well as system information. The data will only be used for diagnostic purposes or to improve the app and is then deleted.</source>
<target state="translated">Hiermit stimme ich der Übermittlung meiner Protokolldatei zu. <target state="translated">Hiermit stimme ich der Übermittlung meiner Diagnosedatei zu.
Die Protokolldatei enthält Ihre App-Nutzungsdaten sowie Systeminformationen. Die Daten werden ausschließlich für Diagnosezwecke bzw. Verbesserung der App verwendet und werden anschließend gelöscht.</target> Die Diagnosedatei enthält Ihre App-Nutzungsdaten sowie Systeminformationen. Die Daten werden ausschließlich für Diagnosezwecke bzw. Verbesserung der App verwendet und werden anschließend gelöscht.</target>
</trans-unit> </trans-unit>
<trans-unit id="QuestionTitle" translate="yes" xml:space="preserve"> <trans-unit id="QuestionTitle" translate="yes" xml:space="preserve">
<source>Question</source> <source>Question</source>
@ -323,10 +319,6 @@ Bitte melden Sie sich erneut an.</target>
<source>Password</source> <source>Password</source>
<target state="translated">Passwort</target> <target state="translated">Passwort</target>
</trans-unit> </trans-unit>
<trans-unit id="ActionContactRate" translate="yes" xml:space="preserve">
<source>Submit rating</source>
<target state="translated">Bewertung abgeben</target>
</trans-unit>
<trans-unit id="MarkingLoginInstructions" translate="yes" xml:space="preserve"> <trans-unit id="MarkingLoginInstructions" translate="yes" xml:space="preserve">
<source>Instructions TINK bikes</source> <source>Instructions TINK bikes</source>
<target state="translated">Anleitung TINK Räder</target> <target state="translated">Anleitung TINK Räder</target>
@ -814,8 +806,8 @@ Layout Anzeige Radnamen und nummern verbessert.</target>
<target state="translated">Bitte Anmelden, um Räder zu reservieren! <bpt id="1">&lt;font color="blue"&gt;</bpt><bpt id="2">&lt;u&gt;</bpt>Hier<ept id="2">&lt;/u&gt;</ept><ept id="1">&lt;/font&gt;</ept> tippen, um auf Anmeldeseite zu wechseln.</target> <target state="translated">Bitte Anmelden, um Räder zu reservieren! <bpt id="1">&lt;font color="blue"&gt;</bpt><bpt id="2">&lt;u&gt;</bpt>Hier<ept id="2">&lt;/u&gt;</ept><ept id="1">&lt;/font&gt;</ept> tippen, um auf Anmeldeseite zu wechseln.</target>
</trans-unit> </trans-unit>
<trans-unit id="MarkingContactNoStationInfoAvailableNoButton" translate="yes" xml:space="preserve"> <trans-unit id="MarkingContactNoStationInfoAvailableNoButton" translate="yes" xml:space="preserve">
<source>Contact operator?</source> <source>First select the station whose operator you want to contact.</source>
<target state="translated">Betreiber kontaktieren?</target> <target state="translated">Wählen Sie zunächst die Station, zu deren Betreiber Sie Kontakt aufnehmen möchten.</target>
</trans-unit> </trans-unit>
<trans-unit id="ChangeLog3_0_241" translate="yes" xml:space="preserve"> <trans-unit id="ChangeLog3_0_241" translate="yes" xml:space="preserve">
<source>Bike sharing system operator specific support info displayed on contact page.</source> <source>Bike sharing system operator specific support info displayed on contact page.</source>
@ -1234,16 +1226,6 @@ Kleinere Fehlerbehebungen.
<source>Give feedback</source> <source>Give feedback</source>
<target state="translated">Rückmeldung geben</target> <target state="translated">Rückmeldung geben</target>
</trans-unit> </trans-unit>
<trans-unit id="ActionContactMailAppReleated" translate="yes" xml:space="preserve">
<source>Sent e-mail</source>
<target state="translated">E-Mail senden</target>
</trans-unit>
<trans-unit id="MiscContactMailAppReleatedSubject" translate="yes" xml:space="preserve">
<source>{0}-app releated request</source>
<target state="translated">{0}-App Anfrage</target>
<note from="MultilingualBuild" annotates="source" priority="2">Subject of contact mail to ("Feedback about the app").</note>
<note from="MultilingualUpdate" annotates="source" priority="2">Please verify the translations accuracy as the source string was updated after it was translated.</note>
</trans-unit>
<trans-unit id="MessageReservingBikeErrorConnectionTitle" translate="yes" xml:space="preserve"> <trans-unit id="MessageReservingBikeErrorConnectionTitle" translate="yes" xml:space="preserve">
<source>Connection error when reserving the bike!</source> <source>Connection error when reserving the bike!</source>
<target state="translated">Verbingungsfehler beim Reservieren des Rads!</target> <target state="translated">Verbingungsfehler beim Reservieren des Rads!</target>
@ -1361,8 +1343,8 @@ Außerdem: Kleine Grafiken lassen auf einen Blick erkennen um was für einen Rad
<target state="translated">{0}-App Anfrage</target> <target state="translated">{0}-App Anfrage</target>
</trans-unit> </trans-unit>
<trans-unit id="SupportmailSubjectOperatormail" translate="yes" xml:space="preserve"> <trans-unit id="SupportmailSubjectOperatormail" translate="yes" xml:space="preserve">
<source>{0} request</source> <source>{0}-request: station {1}</source>
<target state="translated">{0} Anfrage</target> <target state="translated">{0}-Anfrage: Station {1}</target>
</trans-unit> </trans-unit>
<trans-unit id="QuestionSupportmailAnswerNo" translate="yes" xml:space="preserve"> <trans-unit id="QuestionSupportmailAnswerNo" translate="yes" xml:space="preserve">
<source>No, do not attach file</source> <source>No, do not attach file</source>
@ -1669,6 +1651,34 @@ Außerdem:&lt;br/&gt;
<source>Location query failed</source> <source>Location query failed</source>
<target state="translated">Standortabfrage fehlgeschlagen</target> <target state="translated">Standortabfrage fehlgeschlagen</target>
</trans-unit> </trans-unit>
<trans-unit id="MarkingContactCustomerSupportTitle" translate="yes" xml:space="preserve">
<source>Customer support</source>
<target state="translated">Kundensupport</target>
</trans-unit>
<trans-unit id="ActionSelectAnotherStation" translate="yes" xml:space="preserve">
<source>Select another station</source>
<target state="translated">Andere Station auswählen</target>
</trans-unit>
<trans-unit id="ActionSendDiagnosis" translate="yes" xml:space="preserve">
<source><bpt id="1">&lt;u&gt;</bpt>Transfer diagnostic file<ept id="1">&lt;/u&gt;</ept></source>
<target state="translated"><bpt id="1">&lt;u&gt;</bpt>Diagnosedatei übermitteln<ept id="1">&lt;/u&gt;</ept></target>
</trans-unit>
<trans-unit id="MarkingLastSelectedStation" translate="yes" xml:space="preserve">
<source>Last selected station</source>
<target state="translated">Zuletzt ausgewählte Station</target>
</trans-unit>
<trans-unit id="MarkingOperator" translate="yes" xml:space="preserve">
<source>Operator</source>
<target state="translated">Betreiber</target>
</trans-unit>
<trans-unit id="ChangeLog_3_0_369_MK_SB" translate="yes" xml:space="preserve">
<source>We have re-designed the contact page:
<bpt id="1">&lt;ul&gt;</bpt><bpt id="2">&lt;li&gt;</bpt>Please contact the customer support immediately in case of problems with the bike rental!
<ept id="2">&lt;/li&gt;</ept><bpt id="3">&lt;li&gt;</bpt>To diagnose a problem, you can send us your app usage data via "Transfer diagnostic file". Without your active sending we do not record any of your data!<ept id="3">&lt;/li&gt;</ept><ept id="1">&lt;/ul&gt;</ept></source>
<target state="translated">Wir haben die Kontakt-Seite neu gestaltet:
<bpt id="1">&lt;ul&gt;</bpt><bpt id="2">&lt;li&gt;</bpt>Bitte kontaktieren Sie bei Problemen bei der Fahrradmiete umgehend den Kundensupport!
<ept id="2">&lt;/li&gt;</ept><bpt id="3">&lt;li&gt;</bpt>Für die Diagnose eines Problems können Sie über "Diagnosedatei übermitteln" Ihre App-Nutzungsdaten an uns senden. Ohne Ihr aktives Zusenden zeichnen wir keine Ihrer Daten auf!<ept id="3">&lt;/li&gt;</ept><ept id="1">&lt;/ul&gt;</ept></target>
</trans-unit>
</group> </group>
</body> </body>
</file> </file>

View file

@ -63,6 +63,31 @@
</Style.Triggers> </Style.Triggers>
</Style> </Style>
<!--Button without outline-->
<Style x:Key="NoOutlineButton" TargetType="Button">
<Setter Property="WidthRequest" Value="400" />
<Setter Property="HorizontalOptions" Value="Center" />
<Setter Property="BorderWidth" Value="1"/>
<Setter Property="CornerRadius" Value="10" />
<Setter Property="FontSize" Value="Medium"/>
<Setter Property="FontFamily" Value="RobotoRegular"/>
<Setter Property="TextColor" Value="{DynamicResource Key=primary-back-title-color}"/>
<Style.Triggers>
<Trigger TargetType="Button"
Property="IsEnabled"
Value="True">
<Setter Property="BorderColor" Value="White"/>
<Setter Property="BackgroundColor" Value="White"/>
</Trigger>
<Trigger TargetType="Button"
Property="IsEnabled"
Value="False">
<Setter Property="BorderColor" Value="LightGray"/>
<Setter Property="BackgroundColor" Value="DimGray"/>
</Trigger>
</Style.Triggers>
</Style>
<!--Switch--> <!--Switch-->
<Style TargetType="Switch"> <Style TargetType="Switch">
<Style.Triggers> <Style.Triggers>

View file

@ -62,6 +62,31 @@
</Style.Triggers> </Style.Triggers>
</Style> </Style>
<!--Button without outline-->
<Style x:Key="NoOutlineButton" TargetType="Button">
<Setter Property="WidthRequest" Value="400" />
<Setter Property="HorizontalOptions" Value="Center" />
<Setter Property="BorderWidth" Value="1"/>
<Setter Property="CornerRadius" Value="10" />
<Setter Property="FontSize" Value="Medium"/>
<Setter Property="FontFamily" Value="RobotoRegular"/>
<Setter Property="TextColor" Value="{DynamicResource Key=primary-back-title-color}"/>
<Style.Triggers>
<Trigger TargetType="Button"
Property="IsEnabled"
Value="True">
<Setter Property="BorderColor" Value="White"/>
<Setter Property="BackgroundColor" Value="White"/>
</Trigger>
<Trigger TargetType="Button"
Property="IsEnabled"
Value="False">
<Setter Property="BorderColor" Value="LightGray"/>
<Setter Property="BackgroundColor" Value="DimGray"/>
</Trigger>
</Style.Triggers>
</Style>
<!--Switch--> <!--Switch-->
<Style TargetType="Switch"> <Style TargetType="Switch">
<Style.Triggers> <Style.Triggers>
@ -85,10 +110,22 @@
</Style> </Style>
<!--Label--> <!--Label-->
<Style TargetType="Label"> <Style TargetType="Label">
<Setter Property="FontSize" Value="Default"/> <Setter Property="FontSize" Value="Default"/>
<Setter Property="FontFamily" Value="RobotoRegular"/> <Setter Property="FontFamily" Value="RobotoRegular"/>
</Style> <Style.Triggers>
<Trigger TargetType="Label"
Property="FontAttributes"
Value="Bold">
<Setter Property="FontFamily" Value="RobotoBold"/>
</Trigger>
<Trigger TargetType="Label"
Property="FontAttributes"
Value="Italic">
<Setter Property="FontFamily" Value="RobotoItalic"/>
</Trigger>
</Style.Triggers>
</Style>
<!--Entry--> <!--Entry-->
<Style TargetType="Entry"> <Style TargetType="Entry">

View file

@ -1,4 +1,3 @@
using System; using System;
using System.ComponentModel; using System.ComponentModel;
using System.Threading.Tasks; using System.Threading.Tasks;
@ -43,6 +42,47 @@ namespace TINK.ViewModel.Account
/// <summary> Reference on the tink app instance. </summary> /// <summary> Reference on the tink app instance. </summary>
private ITinkApp TinkApp { get; } private ITinkApp TinkApp { get; }
/// <summary> Used to block more than on copri requests at a given time.</summary>
private bool isIdle = true;
/// <summary>
/// True if any action can be performed (logout etc.)
/// </summary>
public virtual bool IsIdle
{
get => isIdle;
set
{
if (value == isIdle)
return;
Log.ForContext<AccountPageViewModel>().Debug($"Switch value of {nameof(IsIdle)} to {value}.");
isIdle = value;
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(nameof(IsIdle)));
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(nameof(IsProcessWithRunningProcessView)));
}
}
public bool IsProcessWithRunningProcessView => !isIdle;
/// <summary> Holds info about current action. </summary>
private string statusInfoText;
/// <summary> Holds info about current action. </summary>
public string StatusInfoText
{
get => statusInfoText;
set
{
if (value == statusInfoText)
return;
Log.ForContext<LoginPageViewModel>().Debug($"Switch value of {nameof(StatusInfoText)} to {value}.");
statusInfoText = value;
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(nameof(StatusInfoText)));
}
}
/// <summary> Constructs a settings page view model object.</summary> /// <summary> Constructs a settings page view model object.</summary>
/// <param name="tinkApp"> Reference to tink app model.</param> /// <param name="tinkApp"> Reference to tink app model.</param>
/// <param name="p_oUser"></param> /// <param name="p_oUser"></param>
@ -261,6 +301,8 @@ namespace TINK.ViewModel.Account
/// </summary> /// </summary>
public async Task Logout() public async Task Logout()
{ {
StatusInfoText = AppResources.ActivityTextOneMomentPlease;
IsIdle = false;
try try
{ {
// Backup logout message before logout. // Backup logout message before logout.
@ -284,6 +326,9 @@ namespace TINK.ViewModel.Account
// Restart polling again. // Restart polling again.
await m_oViewUpdateManager.StartUpdateAyncPeridically(Polling.ToImmutable()); await m_oViewUpdateManager.StartUpdateAyncPeridically(Polling.ToImmutable());
IsIdle = true;
StatusInfoText = string.Empty;
return; return;
} }
catch (Exception l_oException) catch (Exception l_oException)
@ -303,6 +348,9 @@ namespace TINK.ViewModel.Account
// Restart polling again. // Restart polling again.
await m_oViewUpdateManager.StartUpdateAyncPeridically(Polling.ToImmutable()); await m_oViewUpdateManager.StartUpdateAyncPeridically(Polling.ToImmutable());
IsIdle = true;
StatusInfoText = string.Empty;
return; return;
} }
@ -314,8 +362,12 @@ namespace TINK.ViewModel.Account
catch (Exception p_oException) catch (Exception p_oException)
{ {
Log.Error("An unexpected error occurred displaying log out page. {@Exception}", p_oException); Log.Error("An unexpected error occurred displaying log out page. {@Exception}", p_oException);
IsIdle = true;
StatusInfoText = string.Empty;
return; return;
} }
try try
{ {
// Switch to map view after log out. // Switch to map view after log out.
@ -328,8 +380,14 @@ namespace TINK.ViewModel.Account
catch (Exception p_oException) catch (Exception p_oException)
{ {
Log.Error("An unexpected error occurred switching back to map page after displaying log out page. {@Exception}", p_oException); Log.Error("An unexpected error occurred switching back to map page after displaying log out page. {@Exception}", p_oException);
IsIdle = true;
StatusInfoText = string.Empty;
return; return;
} }
IsIdle = true;
StatusInfoText = string.Empty;
} }
/// <summary> /// <summary>

View file

@ -63,14 +63,14 @@ namespace TINK.ViewModel.Bikes.Bike.BluetoothLock.RequestHandler
/// <summary>Books bike by reserving bike, opening lock and booking bike.</summary> /// <summary>Books bike by reserving bike, opening lock and booking bike.</summary>
/// <returns>Next request handler.</returns> /// <returns>Next request handler.</returns>
public async Task<IRequestHandler> HandleRequestOption1() => await DoBookOrClose(); public async Task<IRequestHandler> HandleRequestOption1() => await CloseLockOrDoBook();
public async Task<IRequestHandler> HandleRequestOption2() => await UnsupportedRequest(); public async Task<IRequestHandler> HandleRequestOption2() => await UnsupportedRequest();
/// <summary>Books bike by reserving bike, opening lock and booking bike.</summary> /// <summary>Books bike by reserving bike, opening lock and booking bike.</summary>
/// <returns>Next request handler.</returns> /// <returns>Next request handler.</returns>
public async Task<IRequestHandler> DoBookOrClose() public async Task<IRequestHandler> CloseLockOrDoBook()
{ {
BikesViewModel.IsIdle = false; // Lock list to avoid multiple taps while copri action is pending. BikesViewModel.IsIdle = false; // Lock list to avoid multiple taps while copri action is pending.

View file

@ -75,6 +75,8 @@ namespace TINK.ViewModel.Info
SelectedStation = selectedStation; SelectedStation = selectedStation;
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(nameof(SelectedStationId)));
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(nameof(SelectedStationName)));
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(nameof(MailAddressText))); PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(nameof(MailAddressText)));
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(nameof(OfficeHoursText))); PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(nameof(OfficeHoursText)));
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(nameof(PhoneNumberText))); PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(nameof(PhoneNumberText)));
@ -132,32 +134,14 @@ namespace TINK.ViewModel.Info
return; return;
} }
// Ask whether mail is operator or app specific. // Send operator related support mail to operator.
var operatorRelatedMail = await ViewService.DisplayAlert(
AppResources.QuestionTitle,
string.Format(AppResources.QuestionSupportmailSubject, AppFlavorName),
string.Format(AppResources.QuestionSupportmailAnswerOperator, AppFlavorName),
string.Format(AppResources.QuestionSupportmailAnswerApp, AppFlavorName));
if (operatorRelatedMail)
{
// Send operator related support mail to operator.
await Email.ComposeAsync(new EmailMessage
{
To = new List<string> { MailAddressText },
Subject = string.Format(AppResources.SupportmailSubjectOperatormail, AppFlavorName)
});
return;
}
// Send app-related support mail to operator.
await Email.ComposeAsync(new EmailMessage await Email.ComposeAsync(new EmailMessage
{ {
To = new List<string> { MailAddressText }, To = new List<string> { MailAddressText },
Cc = APPSUPPORTMAILADDRESS.ToUpper() != MailAddressText.ToUpper() // do not sent copy if same mail address Cc = APPSUPPORTMAILADDRESS.ToUpper() != MailAddressText.ToUpper() // do not sent copy if same mail address
&& MailAddressText != "konrad@sharee.bike" // do not sent copy if Mein konrad && MailAddressText != "konrad@sharee.bike" // do not sent copy if Mein konrad
? new List<string> { APPSUPPORTMAILADDRESS } : new List<string>(), ? new List<string> { APPSUPPORTMAILADDRESS } : new List<string>(),
Subject = string.Format(AppResources.SupportmailSubjectAppmail, AppFlavorName) Subject = string.Format(AppResources.SupportmailSubjectOperatormail, AppFlavorName, SelectedStation?.Id)
}); });
return; return;
@ -180,12 +164,10 @@ namespace TINK.ViewModel.Info
try try
{ {
// Ask for permission to append diagnostics. // Ask for permission to append diagnostics.
var appendFile = false; await ViewService.DisplayAlert(
appendFile = await ViewService.DisplayAlert(
AppResources.QuestionSupportmailTitle, AppResources.QuestionSupportmailTitle,
AppResources.QuestionSupportmailAttachment, AppResources.QuestionSupportmailAttachment,
AppResources.QuestionAnswerYes, AppResources.MessageAnswerOk);
AppResources.QuestionSupportmailAnswerNo);
var message = new EmailMessage var message = new EmailMessage
{ {
@ -193,13 +175,6 @@ namespace TINK.ViewModel.Info
Subject = string.Format(AppResources.SupportmailSubjectAppmail, AppFlavorName) Subject = string.Format(AppResources.SupportmailSubjectAppmail, AppFlavorName)
}; };
if (appendFile == false)
{
// Send without attachment
await Email.ComposeAsync(message);
return;
}
// Send with attachment. // Send with attachment.
var logFileName = string.Empty; var logFileName = string.Empty;
try try
@ -299,13 +274,18 @@ namespace TINK.ViewModel.Info
} }
} }
/// <summary> Text providing the id of the selected station.</summary>
public string SelectedStationId
=> SelectedStation?.Id;
public string SelectedStationName
=> SelectedStation?.StationName;
/// <summary> Text providing mail address and possilbe reasons to contact. </summary> /// <summary> Text providing the name of the operator of the selected station </summary>
public string ProviderNameText public string ProviderNameText
=> string.Format("Betreiber: {0}", SelectedStation?.OperatorData?.Name) => SelectedStation?.OperatorData?.Name;
;
/// <summary> Text providing mail address and possilbe reasons to contact. </summary> /// <summary> Text providing mail address and possible reasons to contact. </summary>
public FormattedString MailAddressAndMotivationsText public FormattedString MailAddressAndMotivationsText
{ {
get get
@ -316,35 +296,6 @@ namespace TINK.ViewModel.Info
} }
} }
/// <summary> Invitation to rate app.</summary>
public FormattedString LikeTinkApp
{
get
{
var hint = new FormattedString();
hint.Spans.Add(new Span { Text = string.Format(AppResources.MessageRateMail, AppFlavorName) });
return hint;
}
}
/// <summary> User clicks rate button.</summary>
public ICommand OnRateRequest
=> new Command(() => RegisterRequest());
/// <summary> Opens login page.</summary>
public void RegisterRequest()
{
try
{
OpenUrlInExternalBrowser();
}
catch (Exception p_oException)
{
Log.Error("Ein unerwarteter Fehler ist auf der Login Seite beim Öffnen eines Browsers, Seite {url}, aufgetreten. {@Exception}", p_oException);
return;
}
}
/// <summary> Invitation to rate app.</summary> /// <summary> Invitation to rate app.</summary>
public FormattedString PhoneContactText public FormattedString PhoneContactText
{ {

View file

@ -22,6 +22,9 @@ using TINK.MultilingualResources;
using TINK.Repository; using TINK.Repository;
using TINK.Services.Geolocation; using TINK.Services.Geolocation;
using TINK.Model.State; using TINK.Model.State;
using TINK.ViewModel.Map;
using TINK.Model.Stations.StationNS;
using TINK.Model.Bikes.BikeInfoNS.BC;
namespace TINK.ViewModel.Contact namespace TINK.ViewModel.Contact
{ {
@ -395,6 +398,7 @@ namespace TINK.ViewModel.Contact
var colors = GetStationColors( var colors = GetStationColors(
Pins.Select(x => x.Tag.ToString()).ToList(), Pins.Select(x => x.Tag.ToString()).ToList(),
resultStationsAndBikes.Response.StationsAll,
resultStationsAndBikes.Response.BikesOccupied); resultStationsAndBikes.Response.BikesOccupied);
// Update pins color form count of bikes located at station. // Update pins color form count of bikes located at station.
@ -491,10 +495,13 @@ namespace TINK.ViewModel.Contact
/// Gets the list of station color for all stations. /// Gets the list of station color for all stations.
/// </summary> /// </summary>
/// <param name="stationsId">Station id list to get color for.</param> /// <param name="stationsId">Station id list to get color for.</param>
/// <param name="stations">Station object dictionary to get count of available bike from for each station.</param>
/// <param name="bikesReserved">Bike collection to get count of reserved/ rented bikes from for each station.</param>
/// <returns></returns> /// <returns></returns>
private static IList<Color> GetStationColors( internal static IList<Color> GetStationColors(
IEnumerable<string> stationsId, IEnumerable<string> stationsId,
BikeCollection bikesAll) IEnumerable<IStation> stations,
IEnumerable<BikeInfo> bikesReserved)
{ {
if (stationsId == null) if (stationsId == null)
{ {
@ -502,11 +509,14 @@ namespace TINK.ViewModel.Contact
return new List<Color>(); return new List<Color>();
} }
if (bikesAll == null) if (stations == null)
{ {
// If object is null an error occurred querying bikes centered or bikes occupied which results in an unknown state. Log.ForContext<SelectStationPageViewModel>().Error("No stations info available to get count of bikes available to determine whether a pin is green or not.");
Log.ForContext<SelectStationPageViewModel>().Error("No bikes available to determine pins color."); }
return new List<Color>(stationsId.Select(x => Color.Blue));
if (bikesReserved == null)
{
Log.ForContext<SelectStationPageViewModel>().Error("No bikes info available to determine whether a pins is light blue or not.");
} }
// Get state for each station. // Get state for each station.
@ -514,15 +524,14 @@ namespace TINK.ViewModel.Contact
foreach (var stationId in stationsId) foreach (var stationId in stationsId)
{ {
// Get color of given station. // Get color of given station.
var bikesAtStation = bikesAll.Where(x => x.StationId == stationId).ToList(); if (bikesReserved?.Where(x => x.StationId == stationId).Count() > 0)
if (bikesAtStation.FirstOrDefault(x => x.State.Value.IsOccupied()) != null)
{ {
// There is at least one requested or booked bike // There is at least one requested or booked bike
colors.Add(Color.LightBlue); colors.Add(Color.LightBlue);
continue; continue;
} }
if (bikesAtStation.ToList().Count > 0) if (stations?.FirstOrDefault(x => x.Id == stationId)?.AvailableBikesCount > 0)
{ {
// There is at least one bike available // There is at least one bike available
colors.Add(Color.Green); colors.Add(Color.Green);

View file

@ -25,7 +25,7 @@ namespace TINK.ViewModel
private readonly IViewService m_oViewService; private readonly IViewService m_oViewService;
#if BACKSTYLE #if BACKSTYLE
/// <summary> Reference to naviagion object to navigate back to map page when login succeeded. </summary> /// <summary> Reference to navigation object to navigate back to map page when login succeeded. </summary>
private INavigation m_oNavigation; private INavigation m_oNavigation;
#endif #endif
/// <summary> Reference on the tink app instance. </summary> /// <summary> Reference on the tink app instance. </summary>
@ -51,6 +51,47 @@ namespace TINK.ViewModel
/// </summary> /// </summary>
public event PropertyChangedEventHandler PropertyChanged; public event PropertyChangedEventHandler PropertyChanged;
/// <summary> Used to block more than on copri requests at a given time.</summary>
private bool isIdle = true;
/// <summary>
/// True if any action can be performed (login etc.)
/// </summary>
public virtual bool IsIdle
{
get => isIdle;
set
{
if (value == isIdle)
return;
Log.ForContext<LoginPageViewModel>().Debug($"Switch value of {nameof(IsIdle)} to {value}.");
isIdle = value;
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(nameof(IsIdle)));
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(nameof(IsProcessWithRunningProcessView)));
}
}
public bool IsProcessWithRunningProcessView => !isIdle;
/// <summary> Holds info about current action. </summary>
private string statusInfoText;
/// <summary> Holds info about current action. </summary>
public string StatusInfoText
{
get => statusInfoText;
set
{
if (value == statusInfoText)
return;
Log.ForContext<LoginPageViewModel>().Debug($"Switch value of {nameof(StatusInfoText)} to {value}.");
statusInfoText = value;
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(nameof(StatusInfoText)));
}
}
/// <summary> /// <summary>
/// ///
/// </summary> /// </summary>
@ -159,7 +200,7 @@ namespace TINK.ViewModel
{ {
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(nameof(IsLoginRequestAllowed))); PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(nameof(IsLoginRequestAllowed)));
} }
} }
/// <summary> /// <summary>
/// Command object to bind login button to view model. /// Command object to bind login button to view model.
@ -213,6 +254,8 @@ namespace TINK.ViewModel
public async Task Login() public async Task Login()
#endif #endif
{ {
IsIdle = false;
StatusInfoText = AppResources.ActivityTextOneMomentPlease;
IAccount account = new EmptyAccount(); IAccount account = new EmptyAccount();
try try
{ {
@ -251,6 +294,8 @@ namespace TINK.ViewModel
l_oException.Message, l_oException.Message,
AppResources.MessageAnswerOk); AppResources.MessageAnswerOk);
IsIdle = true;
StatusInfoText = string.Empty;
return; return;
} }
catch (UnsupportedCopriVersionDetectedException) catch (UnsupportedCopriVersionDetectedException)
@ -262,6 +307,8 @@ namespace TINK.ViewModel
TinkApp.Flavor.GetDisplayName()), TinkApp.Flavor.GetDisplayName()),
AppResources.MessageAnswerOk); AppResources.MessageAnswerOk);
IsIdle = true;
StatusInfoText = string.Empty;
return; return;
} }
catch (Exception l_oException) catch (Exception l_oException)
@ -294,6 +341,8 @@ namespace TINK.ViewModel
AppResources.MessageAnswerOk); AppResources.MessageAnswerOk);
} }
IsIdle = true;
StatusInfoText = string.Empty;
return; return;
} }
@ -312,6 +361,9 @@ namespace TINK.ViewModel
catch (Exception p_oException) catch (Exception p_oException)
{ {
Log.ForContext<LoginPageViewModel>().Error("An unexpected error occurred displaying log out page. {@Exception}", p_oException); Log.ForContext<LoginPageViewModel>().Error("An unexpected error occurred displaying log out page. {@Exception}", p_oException);
IsIdle = true;
StatusInfoText = string.Empty;
return; return;
} }
@ -326,6 +378,8 @@ namespace TINK.ViewModel
#else #else
await m_oViewService.ShowPage("//MapPage"); await m_oViewService.ShowPage("//MapPage");
#endif #endif
IsIdle = true;
StatusInfoText = string.Empty;
return; return;
} }
@ -339,6 +393,9 @@ namespace TINK.ViewModel
catch (Exception p_oException) catch (Exception p_oException)
{ {
Log.ForContext<LoginPageViewModel>().Error("Ein unerwarteter Fehler ist auf der Seite Anleitung TINK Räder (nach Anmeldeseite) aufgetreten. {@Exception}", p_oException); Log.ForContext<LoginPageViewModel>().Error("Ein unerwarteter Fehler ist auf der Seite Anleitung TINK Räder (nach Anmeldeseite) aufgetreten. {@Exception}", p_oException);
IsIdle = true;
StatusInfoText = string.Empty;
return; return;
} }
@ -346,6 +403,8 @@ namespace TINK.ViewModel
// Navigate back to map page. // Navigate back to map page.
await m_oNavigation.PopToRootAsync(); await m_oNavigation.PopToRootAsync();
#endif #endif
IsIdle = true;
StatusInfoText = string.Empty;
} }
/// <summary> Holds whether TINK/ Copri info is shown.</summary> /// <summary> Holds whether TINK/ Copri info is shown.</summary>