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>
<GenerateSerializationAssemblies>Off</GenerateSerializationAssemblies>
<AndroidManifest>Properties\AndroidManifest.xml</AndroidManifest>
<TargetFrameworkVersion>v12.0</TargetFrameworkVersion>
<TargetFrameworkVersion>v13.0</TargetFrameworkVersion>
<AndroidStoreUncompressedFileExtensions />
<MandroidI18n />
<JavaMaximumHeapSize>2G</JavaMaximumHeapSize>

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

Binary file not shown.

Before

Width:  |  Height:  |  Size: 52 KiB

After

Width:  |  Height:  |  Size: 27 KiB

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.7 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 18 KiB

View file

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

Binary file not shown.

Before

Width:  |  Height:  |  Size: 582 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 344 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 451 KiB

Binary file not shown.

Before

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

Binary file not shown.

Before

Width:  |  Height:  |  Size: 356 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 804 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 283 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 399 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 500 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 886 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 322 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.2 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 457 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 396 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.1 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 388 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 997 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 352 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 488 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 622 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.6 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 600 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 965 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 338 KiB

Binary file not shown.

Binary file not shown.

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

@ -1,4 +1,4 @@
//------------------------------------------------------------------------------
//------------------------------------------------------------------------------
// <auto-generated>
// This code was generated by a tool.
// Runtime Version:4.0.30319.42000
@ -96,24 +96,6 @@ namespace TINK.MultilingualResources {
}
}
/// <summary>
/// Looks up a localized string similar to Sent e-mail.
/// </summary>
public static string ActionContactMailAppReleated {
get {
return ResourceManager.GetString("ActionContactMailAppReleated", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Submit rating.
/// </summary>
public static string ActionContactRate {
get {
return ResourceManager.GetString("ActionContactRate", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Give feedback.
/// </summary>
@ -204,6 +186,15 @@ namespace TINK.MultilingualResources {
}
}
/// <summary>
/// Looks up a localized string similar to Select another station.
/// </summary>
public static string ActionSelectAnotherStation {
get {
return ResourceManager.GetString("ActionSelectAnotherStation", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Select station.
/// </summary>
@ -213,6 +204,15 @@ namespace TINK.MultilingualResources {
}
}
/// <summary>
/// Looks up a localized string similar to &lt;u&gt;Transfer diagnostic file&lt;/u&gt;.
/// </summary>
public static string ActionSendDiagnosis {
get {
return ResourceManager.GetString("ActionSendDiagnosis", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Auth. expired.
/// </summary>
@ -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>
/// Looks up a localized string similar to - We have fixed a few minor bugs. Enjoy the ride!.
/// </summary>
@ -2023,7 +2034,16 @@ namespace TINK.MultilingualResources {
}
/// <summary>
/// Looks up a localized string similar to Contact operator?.
/// Looks up a localized string similar to Customer support.
/// </summary>
public static string MarkingContactCustomerSupportTitle {
get {
return ResourceManager.GetString("MarkingContactCustomerSupportTitle", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to First select the station whose operator you want to contact..
/// </summary>
public static string MarkingContactNoStationInfoAvailableNoButton {
get {
@ -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>
/// Looks up a localized string similar to Lock control.
/// </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>
/// Looks up a localized string similar to Is bike okay?.
/// </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>
/// Looks up a localized string similar to Connection error when renting the bike!.
/// </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>
/// Looks up a localized string similar to Prefix and No., e.g. TR15.
/// </summary>
@ -3193,9 +3213,9 @@ namespace TINK.MultilingualResources {
}
/// <summary>
/// Looks up a localized string similar to I hereby consent to the transmission of my log file.
/// Looks up a localized string similar to I hereby consent to the transmission of my diagnostic file.
///
///The log file contains your app usage data as well as system information. The data will only be used for diagnostic purposes or to improve the app and then deleted..
///The diagnostic file contains your app usage data as well as system information. The data will only be used for diagnostic purposes or to improve the app and is then deleted..
/// </summary>
public static string QuestionSupportmailAttachment {
get {
@ -3384,7 +3404,7 @@ namespace TINK.MultilingualResources {
}
/// <summary>
/// Looks up a localized string similar to {0} request.
/// Looks up a localized string similar to {0}-request: station {1}.
/// </summary>
public static string SupportmailSubjectOperatormail {
get {

View file

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

View file

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

View file

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

View file

@ -63,6 +63,31 @@
</Style.Triggers>
</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-->
<Style TargetType="Switch">
<Style.Triggers>

View file

@ -62,6 +62,31 @@
</Style.Triggers>
</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-->
<Style TargetType="Switch">
<Style.Triggers>
@ -85,10 +110,22 @@
</Style>
<!--Label-->
<Style TargetType="Label">
<Setter Property="FontSize" Value="Default"/>
<Style TargetType="Label">
<Setter Property="FontSize" Value="Default"/>
<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-->
<Style TargetType="Entry">

View file

@ -1,4 +1,3 @@
using System;
using System.ComponentModel;
using System.Threading.Tasks;
@ -43,6 +42,47 @@ namespace TINK.ViewModel.Account
/// <summary> Reference on the tink app instance. </summary>
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>
/// <param name="tinkApp"> Reference to tink app model.</param>
/// <param name="p_oUser"></param>
@ -261,6 +301,8 @@ namespace TINK.ViewModel.Account
/// </summary>
public async Task Logout()
{
StatusInfoText = AppResources.ActivityTextOneMomentPlease;
IsIdle = false;
try
{
// Backup logout message before logout.
@ -284,6 +326,9 @@ namespace TINK.ViewModel.Account
// Restart polling again.
await m_oViewUpdateManager.StartUpdateAyncPeridically(Polling.ToImmutable());
IsIdle = true;
StatusInfoText = string.Empty;
return;
}
catch (Exception l_oException)
@ -303,6 +348,9 @@ namespace TINK.ViewModel.Account
// Restart polling again.
await m_oViewUpdateManager.StartUpdateAyncPeridically(Polling.ToImmutable());
IsIdle = true;
StatusInfoText = string.Empty;
return;
}
@ -314,8 +362,12 @@ namespace TINK.ViewModel.Account
catch (Exception p_oException)
{
Log.Error("An unexpected error occurred displaying log out page. {@Exception}", p_oException);
IsIdle = true;
StatusInfoText = string.Empty;
return;
}
try
{
// Switch to map view after log out.
@ -328,8 +380,14 @@ namespace TINK.ViewModel.Account
catch (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;
}
IsIdle = true;
StatusInfoText = string.Empty;
}
/// <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>
/// <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();
/// <summary>Books bike by reserving bike, opening lock and booking bike.</summary>
/// <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.

View file

@ -75,6 +75,8 @@ namespace TINK.ViewModel.Info
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(OfficeHoursText)));
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(nameof(PhoneNumberText)));
@ -132,32 +134,14 @@ namespace TINK.ViewModel.Info
return;
}
// Ask whether mail is operator or app specific.
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.
// Send operator related support mail to operator.
await Email.ComposeAsync(new EmailMessage
{
To = new List<string> { MailAddressText },
Cc = APPSUPPORTMAILADDRESS.ToUpper() != MailAddressText.ToUpper() // do not sent copy if same mail address
&& MailAddressText != "konrad@sharee.bike" // do not sent copy if Mein konrad
? new List<string> { APPSUPPORTMAILADDRESS } : new List<string>(),
Subject = string.Format(AppResources.SupportmailSubjectAppmail, AppFlavorName)
&& MailAddressText != "konrad@sharee.bike" // do not sent copy if Mein konrad
? new List<string> { APPSUPPORTMAILADDRESS } : new List<string>(),
Subject = string.Format(AppResources.SupportmailSubjectOperatormail, AppFlavorName, SelectedStation?.Id)
});
return;
@ -180,12 +164,10 @@ namespace TINK.ViewModel.Info
try
{
// Ask for permission to append diagnostics.
var appendFile = false;
appendFile = await ViewService.DisplayAlert(
await ViewService.DisplayAlert(
AppResources.QuestionSupportmailTitle,
AppResources.QuestionSupportmailAttachment,
AppResources.QuestionAnswerYes,
AppResources.QuestionSupportmailAnswerNo);
AppResources.MessageAnswerOk);
var message = new EmailMessage
{
@ -193,13 +175,6 @@ namespace TINK.ViewModel.Info
Subject = string.Format(AppResources.SupportmailSubjectAppmail, AppFlavorName)
};
if (appendFile == false)
{
// Send without attachment
await Email.ComposeAsync(message);
return;
}
// Send with attachment.
var logFileName = string.Empty;
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
=> string.Format("Betreiber: {0}", SelectedStation?.OperatorData?.Name)
;
/// <summary> Text providing mail address and possilbe reasons to contact. </summary>
=> SelectedStation?.OperatorData?.Name;
/// <summary> Text providing mail address and possible reasons to contact. </summary>
public FormattedString MailAddressAndMotivationsText
{
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>
public FormattedString PhoneContactText
{

View file

@ -22,6 +22,9 @@ using TINK.MultilingualResources;
using TINK.Repository;
using TINK.Services.Geolocation;
using TINK.Model.State;
using TINK.ViewModel.Map;
using TINK.Model.Stations.StationNS;
using TINK.Model.Bikes.BikeInfoNS.BC;
namespace TINK.ViewModel.Contact
{
@ -395,6 +398,7 @@ namespace TINK.ViewModel.Contact
var colors = GetStationColors(
Pins.Select(x => x.Tag.ToString()).ToList(),
resultStationsAndBikes.Response.StationsAll,
resultStationsAndBikes.Response.BikesOccupied);
// 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.
/// </summary>
/// <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>
private static IList<Color> GetStationColors(
IEnumerable<string> stationsId,
BikeCollection bikesAll)
internal static IList<Color> GetStationColors(
IEnumerable<string> stationsId,
IEnumerable<IStation> stations,
IEnumerable<BikeInfo> bikesReserved)
{
if (stationsId == null)
{
@ -502,11 +509,14 @@ namespace TINK.ViewModel.Contact
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 bikes available to determine pins color.");
return new List<Color>(stationsId.Select(x => Color.Blue));
Log.ForContext<SelectStationPageViewModel>().Error("No stations info available to get count of bikes available to determine whether a pin is green or not.");
}
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.
@ -514,15 +524,14 @@ namespace TINK.ViewModel.Contact
foreach (var stationId in stationsId)
{
// Get color of given station.
var bikesAtStation = bikesAll.Where(x => x.StationId == stationId).ToList();
if (bikesAtStation.FirstOrDefault(x => x.State.Value.IsOccupied()) != null)
if (bikesReserved?.Where(x => x.StationId == stationId).Count() > 0)
{
// There is at least one requested or booked bike
colors.Add(Color.LightBlue);
continue;
}
if (bikesAtStation.ToList().Count > 0)
if (stations?.FirstOrDefault(x => x.Id == stationId)?.AvailableBikesCount > 0)
{
// There is at least one bike available
colors.Add(Color.Green);

View file

@ -25,7 +25,7 @@ namespace TINK.ViewModel
private readonly IViewService m_oViewService;
#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;
#endif
/// <summary> Reference on the tink app instance. </summary>
@ -51,6 +51,47 @@ namespace TINK.ViewModel
/// </summary>
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>
@ -159,7 +200,7 @@ namespace TINK.ViewModel
{
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(nameof(IsLoginRequestAllowed)));
}
}
}
/// <summary>
/// Command object to bind login button to view model.
@ -213,6 +254,8 @@ namespace TINK.ViewModel
public async Task Login()
#endif
{
IsIdle = false;
StatusInfoText = AppResources.ActivityTextOneMomentPlease;
IAccount account = new EmptyAccount();
try
{
@ -251,6 +294,8 @@ namespace TINK.ViewModel
l_oException.Message,
AppResources.MessageAnswerOk);
IsIdle = true;
StatusInfoText = string.Empty;
return;
}
catch (UnsupportedCopriVersionDetectedException)
@ -262,6 +307,8 @@ namespace TINK.ViewModel
TinkApp.Flavor.GetDisplayName()),
AppResources.MessageAnswerOk);
IsIdle = true;
StatusInfoText = string.Empty;
return;
}
catch (Exception l_oException)
@ -294,6 +341,8 @@ namespace TINK.ViewModel
AppResources.MessageAnswerOk);
}
IsIdle = true;
StatusInfoText = string.Empty;
return;
}
@ -312,6 +361,9 @@ namespace TINK.ViewModel
catch (Exception p_oException)
{
Log.ForContext<LoginPageViewModel>().Error("An unexpected error occurred displaying log out page. {@Exception}", p_oException);
IsIdle = true;
StatusInfoText = string.Empty;
return;
}
@ -326,6 +378,8 @@ namespace TINK.ViewModel
#else
await m_oViewService.ShowPage("//MapPage");
#endif
IsIdle = true;
StatusInfoText = string.Empty;
return;
}
@ -339,6 +393,9 @@ namespace TINK.ViewModel
catch (Exception p_oException)
{
Log.ForContext<LoginPageViewModel>().Error("Ein unerwarteter Fehler ist auf der Seite Anleitung TINK Räder (nach Anmeldeseite) aufgetreten. {@Exception}", p_oException);
IsIdle = true;
StatusInfoText = string.Empty;
return;
}
@ -346,6 +403,8 @@ namespace TINK.ViewModel
// Navigate back to map page.
await m_oNavigation.PopToRootAsync();
#endif
IsIdle = true;
StatusInfoText = string.Empty;
}
/// <summary> Holds whether TINK/ Copri info is shown.</summary>