Version 3.0.290

This commit is contained in:
Oliver Hauff 2022-04-10 17:38:34 +02:00
parent af3c20ea1c
commit ad3cdbcadf
231 changed files with 14555 additions and 7798 deletions

View file

@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android" android:installLocation="preferExternal" package="com.hauffware.sharee" android:versionName="3.0.277" android:versionCode="277">
<manifest xmlns:android="http://schemas.android.com/apk/res/android" android:installLocation="preferExternal" package="com.hauffware.sharee" android:versionName="3.0.290" android:versionCode="290">
<uses-sdk android:minSdkVersion="19" android:targetSdkVersion="30" />
<!-- Google Maps related permissions -->
<!-- Permission to receive remote notifications from Google Play Services -->
@ -21,16 +21,16 @@
<queries>
<intent>
<action android:name="android.intent.action.VIEW" />
<data android:scheme="http"/>
<data android:scheme="http" />
</intent>
<intent>
<action android:name="android.intent.action.VIEW" />
<data android:scheme="https"/>
<data android:scheme="https" />
</intent>
<intent>
<action android:name="android.intent.action.SENDTO" />
<data android:scheme="mailto" />
</intent>
</intent>
</queries>
<meta-data android:name="com.google.android.geo.API_KEY" android:value="000000000000000000000000000000000000000" />
</manifest>

View file

@ -34,7 +34,7 @@ using Xamarin.Forms;
[assembly: UsesPermission(Android.Manifest.Permission.Internet)]
[assembly: UsesPermission(Android.Manifest.Permission.WriteExternalStorage)]
#if Debug
#if DEBUG
[assembly: Application(Debuggable =true)]
#else
[assembly: Application(Debuggable = false)]

File diff suppressed because it is too large Load diff

View file

@ -30,7 +30,7 @@
<DebugType>full</DebugType>
<Optimize>false</Optimize>
<OutputPath>bin\Debug\</OutputPath>
<DefineConstants>TRACE;DEBUG;USEFLYOUT</DefineConstants>
<DefineConstants>TRACE;DEBUG</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>0</WarningLevel>
<AndroidUseSharedRuntime>true</AndroidUseSharedRuntime>
@ -49,7 +49,7 @@
<DebugType>pdbonly</DebugType>
<Optimize>true</Optimize>
<OutputPath>bin\Release\</OutputPath>
<DefineConstants>TRACE;USEFLYOUT</DefineConstants>
<DefineConstants>TRACE</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
<AndroidUseSharedRuntime>False</AndroidUseSharedRuntime>

View file

@ -37,24 +37,24 @@
<key>XSAppIconAssets</key>
<string>Media.xcassets/AppIcons.appiconset</string>
<key>NSBluetoothAlwaysUsageDescription</key>
<string>Is required to communicate with Bluetooth lock.</string>
<string>Bluetooth access is needed to open and close the locks of the bikes.</string>
<key>NSBluetoothPeripheralUsageDescription</key>
<string>Is required to communicate with Bluetooth lock.</string>
<string>Bluetooth access is needed to open and close the locks of the bikes.</string>
<key>NSLocationAlwaysUsageDescription</key>
<string>Is required to show map at current position and pass position to server when returning bike.</string>
<string>Location access is needed to show map at current position and pass position to server when returning bikes.</string>
<key>NSLocationAlwaysAndWhenInUseUsageDescription</key>
<string>Is required to show map at current position and pass position to server when returning bike.</string>
<string>Location access is needed to show map at current position and pass position to server when returning bikes.</string>
<key>CFBundleIdentifier</key>
<string>com.TeilRad.sharee.bike</string>
<key>MinimumOSVersion</key>
<string>9.0</string>
<key>NSLocationWhenInUseUsageDescription</key>
<string>Is required to show map at current position and pass position to server when returning bike.</string>
<string>Location access is needed to show map at current position and pass position to server when returning bikes.</string>
<key>CFBundleDisplayName</key>
<string>sharee.bike</string>
<key>CFBundleVersion</key>
<string>277</string>
<string>290</string>
<key>CFBundleShortVersionString</key>
<string>3.0.277</string>
<string>3.0.290</string>
</dict>
</plist>

View file

@ -0,0 +1,528 @@
{
"images": [
{
"filename": "ShareeBike NoBackground.pdf",
"idiom": "universal"
},
{
"scale": "1x",
"idiom": "universal"
},
{
"scale": "2x",
"idiom": "universal"
},
{
"scale": "3x",
"idiom": "universal"
},
{
"idiom": "iphone"
},
{
"scale": "1x",
"idiom": "iphone"
},
{
"scale": "2x",
"idiom": "iphone"
},
{
"subtype": "retina4",
"scale": "2x",
"idiom": "iphone"
},
{
"scale": "3x",
"idiom": "iphone"
},
{
"idiom": "ipad"
},
{
"scale": "1x",
"idiom": "ipad"
},
{
"scale": "2x",
"idiom": "ipad"
},
{
"idiom": "watch"
},
{
"scale": "2x",
"idiom": "watch"
},
{
"screenWidth": "{130,145}",
"scale": "2x",
"idiom": "watch"
},
{
"screenWidth": "{146,165}",
"scale": "2x",
"idiom": "watch"
},
{
"idiom": "mac"
},
{
"scale": "1x",
"idiom": "mac"
},
{
"scale": "2x",
"idiom": "mac"
},
{
"idiom": "car"
},
{
"scale": "2x",
"idiom": "car"
},
{
"scale": "3x",
"idiom": "car"
},
{
"appearances": [
{
"appearance": "luminosity",
"value": "dark"
}
],
"idiom": "universal"
},
{
"appearances": [
{
"appearance": "luminosity",
"value": "dark"
}
],
"scale": "1x",
"idiom": "universal"
},
{
"appearances": [
{
"appearance": "luminosity",
"value": "dark"
}
],
"scale": "2x",
"idiom": "universal"
},
{
"appearances": [
{
"appearance": "luminosity",
"value": "dark"
}
],
"scale": "3x",
"idiom": "universal"
},
{
"appearances": [
{
"appearance": "luminosity",
"value": "dark"
}
],
"idiom": "iphone"
},
{
"appearances": [
{
"appearance": "luminosity",
"value": "dark"
}
],
"scale": "1x",
"idiom": "iphone"
},
{
"appearances": [
{
"appearance": "luminosity",
"value": "dark"
}
],
"scale": "2x",
"idiom": "iphone"
},
{
"subtype": "retina4",
"appearances": [
{
"appearance": "luminosity",
"value": "dark"
}
],
"scale": "2x",
"idiom": "iphone"
},
{
"appearances": [
{
"appearance": "luminosity",
"value": "dark"
}
],
"scale": "3x",
"idiom": "iphone"
},
{
"appearances": [
{
"appearance": "luminosity",
"value": "dark"
}
],
"idiom": "ipad"
},
{
"appearances": [
{
"appearance": "luminosity",
"value": "dark"
}
],
"scale": "1x",
"idiom": "ipad"
},
{
"appearances": [
{
"appearance": "luminosity",
"value": "dark"
}
],
"scale": "2x",
"idiom": "ipad"
},
{
"appearances": [
{
"appearance": "luminosity",
"value": "dark"
}
],
"idiom": "watch"
},
{
"appearances": [
{
"appearance": "luminosity",
"value": "dark"
}
],
"scale": "2x",
"idiom": "watch"
},
{
"screenWidth": "{130,145}",
"appearances": [
{
"appearance": "luminosity",
"value": "dark"
}
],
"scale": "2x",
"idiom": "watch"
},
{
"screenWidth": "{146,165}",
"appearances": [
{
"appearance": "luminosity",
"value": "dark"
}
],
"scale": "2x",
"idiom": "watch"
},
{
"appearances": [
{
"appearance": "luminosity",
"value": "dark"
}
],
"idiom": "mac"
},
{
"appearances": [
{
"appearance": "luminosity",
"value": "dark"
}
],
"scale": "1x",
"idiom": "mac"
},
{
"appearances": [
{
"appearance": "luminosity",
"value": "dark"
}
],
"scale": "2x",
"idiom": "mac"
},
{
"appearances": [
{
"appearance": "luminosity",
"value": "dark"
}
],
"idiom": "car"
},
{
"appearances": [
{
"appearance": "luminosity",
"value": "dark"
}
],
"scale": "2x",
"idiom": "car"
},
{
"appearances": [
{
"appearance": "luminosity",
"value": "dark"
}
],
"scale": "3x",
"idiom": "car"
},
{
"appearances": [
{
"appearance": "luminosity",
"value": "light"
}
],
"idiom": "universal"
},
{
"appearances": [
{
"appearance": "luminosity",
"value": "light"
}
],
"scale": "1x",
"idiom": "universal"
},
{
"appearances": [
{
"appearance": "luminosity",
"value": "light"
}
],
"scale": "2x",
"idiom": "universal"
},
{
"appearances": [
{
"appearance": "luminosity",
"value": "light"
}
],
"scale": "3x",
"idiom": "universal"
},
{
"appearances": [
{
"appearance": "luminosity",
"value": "light"
}
],
"idiom": "iphone"
},
{
"appearances": [
{
"appearance": "luminosity",
"value": "light"
}
],
"scale": "1x",
"idiom": "iphone"
},
{
"appearances": [
{
"appearance": "luminosity",
"value": "light"
}
],
"scale": "2x",
"idiom": "iphone"
},
{
"subtype": "retina4",
"appearances": [
{
"appearance": "luminosity",
"value": "light"
}
],
"scale": "2x",
"idiom": "iphone"
},
{
"appearances": [
{
"appearance": "luminosity",
"value": "light"
}
],
"scale": "3x",
"idiom": "iphone"
},
{
"appearances": [
{
"appearance": "luminosity",
"value": "light"
}
],
"idiom": "ipad"
},
{
"appearances": [
{
"appearance": "luminosity",
"value": "light"
}
],
"scale": "1x",
"idiom": "ipad"
},
{
"appearances": [
{
"appearance": "luminosity",
"value": "light"
}
],
"scale": "2x",
"idiom": "ipad"
},
{
"appearances": [
{
"appearance": "luminosity",
"value": "light"
}
],
"idiom": "watch"
},
{
"appearances": [
{
"appearance": "luminosity",
"value": "light"
}
],
"scale": "2x",
"idiom": "watch"
},
{
"screenWidth": "{130,145}",
"appearances": [
{
"appearance": "luminosity",
"value": "light"
}
],
"scale": "2x",
"idiom": "watch"
},
{
"screenWidth": "{146,165}",
"appearances": [
{
"appearance": "luminosity",
"value": "light"
}
],
"scale": "2x",
"idiom": "watch"
},
{
"appearances": [
{
"appearance": "luminosity",
"value": "light"
}
],
"idiom": "mac"
},
{
"appearances": [
{
"appearance": "luminosity",
"value": "light"
}
],
"scale": "1x",
"idiom": "mac"
},
{
"appearances": [
{
"appearance": "luminosity",
"value": "light"
}
],
"scale": "2x",
"idiom": "mac"
},
{
"appearances": [
{
"appearance": "luminosity",
"value": "light"
}
],
"idiom": "car"
},
{
"appearances": [
{
"appearance": "luminosity",
"value": "light"
}
],
"scale": "2x",
"idiom": "car"
},
{
"appearances": [
{
"appearance": "luminosity",
"value": "light"
}
],
"scale": "3x",
"idiom": "car"
}
],
"info": {
"version": 1,
"author": "xcode"
}
}

View file

@ -0,0 +1,16 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>NSBluetoothAlwaysUsageDescription</key>
<string>Bluetooth Zugriff wird benötigt, um die Schlösser der Fahrräder zu öffnen und zu schließen.</string>
<key>NSBluetoothPeripheralUsageDescription</key>
<string>Bluetooth Zugriff wird benötigt, um die Schlösser der Fahrräder zu öffnen und zu schließen.</string>
<key>NSLocationAlwaysUsageDescription</key>
<string>Der Zugriff auf den Standort wird benötigt, um die Karte an der aktuellen Position anzuzeigen und die Position bei der Rückgabe der Fahrräder an den Server weiterzugeben.</string>
<key>NSLocationAlwaysAndWhenInUseUsageDescription</key>
<string>Der Zugriff auf den Standort wird benötigt, um die Karte an der aktuellen Position anzuzeigen und die Position bei der Rückgabe der Fahrräder an den Server weiterzugeben.</string>
<key>NSLocationWhenInUseUsageDescription</key>
<string>Der Zugriff auf den Standort wird benötigt, um die Karte an der aktuellen Position anzuzeigen und die Position bei der Rückgabe der Fahrräder an den Server weiterzugeben.</string>
</dict>
</plist>

View file

@ -0,0 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
</dict>
</plist>

View file

@ -20,35 +20,35 @@
<DebugType>full</DebugType>
<Optimize>false</Optimize>
<OutputPath>bin\iPhoneSimulator\Debug</OutputPath>
<DefineConstants>__IOS__;__MOBILE__;__UNIFIED__;DEBUG;USEFLYOUT</DefineConstants>
<DefineConstants>__IOS__;__MOBILE__;__UNIFIED__;DEBUG</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
<ConsolePause>false</ConsolePause>
<MtouchArch>i386, x86_64</MtouchArch>
<MtouchLink>None</MtouchLink>
<MtouchDebug>true</MtouchDebug>
<CodesignProvision>VS: com.tink.fapp Development</CodesignProvision>
<CodesignKey>iPhone Developer: Rainer Guempelein (9K8PNC2YM8)</CodesignKey>
<CodesignProvision>VS: com.TeilRad.sharee.bike Development</CodesignProvision>
<CodesignKey>Apple Development: Oliver Hauff (8SZ7J9P24J)</CodesignKey>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|iPhoneSimulator' ">
<DebugType>none</DebugType>
<Optimize>true</Optimize>
<OutputPath>bin\iPhoneSimulator\Release</OutputPath>
<DefineConstants>__IOS__;__MOBILE__;__UNIFIED__;USEFLYOUT</DefineConstants>
<DefineConstants>__IOS__;__MOBILE__;__UNIFIED__</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
<MtouchLink>None</MtouchLink>
<MtouchArch>i386, x86_64</MtouchArch>
<ConsolePause>false</ConsolePause>
<CodesignProvision>VS: com.tink.fapp Development</CodesignProvision>
<CodesignKey>iPhone Developer: Rainer Guempelein (9K8PNC2YM8)</CodesignKey>
<CodesignProvision>VS: com.TeilRad.sharee.bike Development</CodesignProvision>
<CodesignKey>Apple Development: Oliver Hauff (8SZ7J9P24J)</CodesignKey>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|iPhone' ">
<DebugSymbols>true</DebugSymbols>
<DebugType>full</DebugType>
<Optimize>false</Optimize>
<OutputPath>bin\iPhone\Debug</OutputPath>
<DefineConstants>DEBUG;USEFLYOUT</DefineConstants>
<DefineConstants>__IOS__;__MOBILE__;__UNIFIED__;DEBUG;</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
<ConsolePause>false</ConsolePause>
@ -56,7 +56,7 @@
<CodesignKey>Apple Development: Oliver Hauff (8SZ7J9P24J)</CodesignKey>
<MtouchDebug>true</MtouchDebug>
<CodesignEntitlements>Entitlements.plist</CodesignEntitlements>
<CodesignProvision>VS: WildCard Development</CodesignProvision>
<CodesignProvision>VS: com.TeilRad.sharee.bike Development</CodesignProvision>
<MtouchLink>None</MtouchLink>
<MtouchInterpreter>-all</MtouchInterpreter>
</PropertyGroup>
@ -64,14 +64,14 @@
<DebugType>none</DebugType>
<Optimize>true</Optimize>
<OutputPath>bin\iPhone\Release</OutputPath>
<DefineConstants>USEFLYOUT</DefineConstants>
<DefineConstants>__IOS__;__MOBILE__;__UNIFIED__</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
<MtouchArch>ARMv7, ARM64</MtouchArch>
<ConsolePause>false</ConsolePause>
<CodesignKey>iPhone Distribution: TeilRad GmbH (LXJD6URCHR)</CodesignKey>
<CodesignKey>Apple Development: Oliver Hauff (8SZ7J9P24J)</CodesignKey>
<CodesignEntitlements>Entitlements.plist</CodesignEntitlements>
<CodesignProvision>sharee.bike to App Store</CodesignProvision>
<CodesignProvision>VS: com.TeilRad.sharee.bike Development</CodesignProvision>
<IpaIncludeArtwork>
</IpaIncludeArtwork>
<CrashReportingApiKey>
@ -82,14 +82,13 @@
<DebugType>none</DebugType>
<Optimize>True</Optimize>
<OutputPath>bin\iPhone\Ad-Hoc</OutputPath>
<DefineConstants>USEFLYOUT</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
<ConsolePause>False</ConsolePause>
<MtouchArch>ARMv7, ARM64</MtouchArch>
<BuildIpa>True</BuildIpa>
<CodesignProvision>VS: com.tink.fapp Development</CodesignProvision>
<CodesignKey>iPhone Developer: Rainer Guempelein (9K8PNC2YM8)</CodesignKey>
<CodesignProvision>VS: com.TeilRad.sharee.bike Development</CodesignProvision>
<CodesignKey>Apple Development: Oliver Hauff (8SZ7J9P24J)</CodesignKey>
<CodesignEntitlements>Entitlements.plist</CodesignEntitlements>
<MtouchNoSymbolStrip>
</MtouchNoSymbolStrip>
@ -99,13 +98,12 @@
<DebugType>none</DebugType>
<Optimize>True</Optimize>
<OutputPath>bin\iPhone\AppStore</OutputPath>
<DefineConstants>USEFLYOUT</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
<ConsolePause>False</ConsolePause>
<MtouchArch>ARMv7, ARM64</MtouchArch>
<CodesignProvision>VS: com.tink.fapp Development</CodesignProvision>
<CodesignKey>iPhone Developer: Rainer Guempelein (9K8PNC2YM8)</CodesignKey>
<CodesignProvision>VS: com.TeilRad.sharee.bike Development</CodesignProvision>
<CodesignKey>Apple Development: Oliver Hauff (8SZ7J9P24J)</CodesignKey>
<CodesignEntitlements>Entitlements.plist</CodesignEntitlements>
<MtouchLink>SdkOnly</MtouchLink>
</PropertyGroup>
@ -246,6 +244,8 @@
<BundleResource Include="Resources\menu.png" />
<BundleResource Include="Resources\menu%402x.png" />
<BundleResource Include="Resources\menu%403x.png" />
<BundleResource Include="Resources\de.lproj\InfoPlist.strings" />
<BundleResource Include="Resources\en.lproj\InfoPlist.strings" />
</ItemGroup>
<ItemGroup>
<Reference Include="System" />
@ -1479,6 +1479,12 @@
<ImageAsset Include="Media.xcassets\AppIcons.appiconset\1024-1.png">
<Visible>false</Visible>
</ImageAsset>
<ImageAsset Include="Media.xcassets\sharee_no_background.imageset\Contents.json">
<Visible>false</Visible>
</ImageAsset>
<ImageAsset Include="Media.xcassets\sharee_no_background.imageset\ShareeBike NoBackground.pdf">
<Visible>false</Visible>
</ImageAsset>
</ItemGroup>
<ItemGroup>
<Folder Include="Media.xcassets\01_Blue.imageset\" />
@ -1605,6 +1611,7 @@
<Folder Include="Media.xcassets\Open_Green.imageset\" />
<Folder Include="Media.xcassets\Open_LightBlue.imageset\" />
<Folder Include="Media.xcassets\Open_Red.imageset\" />
<Folder Include="Media.xcassets\sharee_no_background.imageset\" />
</ItemGroup>
<Import Project="..\TINK\TINK.projitems" Label="Shared" Condition="Exists('..\TINK\TINK.projitems')" />
<Import Project="$(MSBuildExtensionsPath)\Xamarin\iOS\Xamarin.iOS.CSharp.targets" />

View file

@ -16,7 +16,7 @@ using Plugin.Connectivity;
using System.Threading;
using TINK.Model.Settings;
using TINK.Services.BluetoothLock.Crypto;
using TINK.Model.Services.Geolocation;
using TINK.Services.Geolocation;
using TINK.Services;
using System.Threading.Tasks;
using TINK.Services.Permissions;
@ -125,11 +125,12 @@ namespace TINK
IStore store = null;
var lastVersion = JsonSettingsDictionary.GetAppVersion(settingsJSON);
if (lastVersion > new Version(3, 0, 250))
if (new Version(3, 0, 290) <= lastVersion)
{
// App versions newer than 3.0.173 stored geolocation service in configuration.
// Force a switch to typeof(GeolocationService) for versions < 3.0.251
GeolocationServicesContainer.SetActive(settings.ActiveGeolocationService);
// Version 3.0.290: Geolocation service "GeolocationService" is no more supported.
// For this reasons a swich of geolocation service is forced when loading configurations from ealier versions.
LocationServicesContainer.SetActive(settings.ActiveGeolocationService);
}
store = new Store();
@ -147,23 +148,26 @@ namespace TINK
m_oModelRoot = new TinkApp(
settings,
store, // Manages user account
(isConnected, activeUri, sessionCookie, mail, expiresAfter) => ConnectorFactory.Create(isConnected, activeUri, new Repository.AppContextInfo(MERCHANTID, "sharee.bike", appInfoService.Version), sessionCookie, mail, expiresAfter),
MERCHANTID,
GeolocationServicesContainer,
null, /* locksService */
DependencyService.Get<ISmartDevice>(),
specialFolders,
new Cipher(),
null, // Permissions, no more used.
isConnectedFunc: () => CrossConnectivity.Current.IsConnected,
connectorFactory: (isConnected, activeUri, sessionCookie, mail, expiresAfter) => ConnectorFactory.Create(isConnected, activeUri, new Repository.AppContextInfo(MERCHANTID, "sharee.bike", appInfoService.Version), sessionCookie, mail, expiresAfter),
merchantId: MERCHANTID,
bluetoothService: BluetoothService, /* locksService */
locationPermissionsService: PermissionsService,
locationServicesContainer: LocationServicesContainer,
locksService: null,
device: DependencyService.Get<ISmartDevice>(),
specialFolder: specialFolders,
cipher: new Cipher(),
arendiCentral:
#if ARENDI
DependencyService.Get<ICentral>(),
#else
null,
#endif
isConnectedFunc: () => CrossConnectivity.Current.IsConnected,
#endif
postAction: (d, obj) => context.Post(d, obj),
currentVersion: appInfoService.Version,
lastVersion: JsonSettingsDictionary.GetAppVersion(settingsJSON),
lastVersion: lastVersion,
whatsNewShownInVersion: JsonSettingsDictionary.GetWhatsNew(settingsJSON) ?? settingsJSON.GetAppVersion());
Log.Debug("Main model successfully constructed.");
@ -323,12 +327,14 @@ namespace TINK
/// <summary>
/// Service container to manage geolocation services.
/// </summary>
public static IServicesContainer<IGeolocation> GeolocationServicesContainer { get; }
public static IServicesContainer<IGeolocation> LocationServicesContainer { get; }
= new ServicesContainerMutable<IGeolocation>(
new HashSet<IGeolocation> {
new LastKnownGeolocationService(DependencyService.Get<IGeolodationDependent>()),
new SimulatedGeolocationService(DependencyService.Get<IGeolodationDependent>()),
new GeolocationService(DependencyService.Get<IGeolodationDependent>()) },
new SimulatedGeolocationService(DependencyService.Get<IGeolodationDependent>()),
new GeolocationAccuracyMediumService(DependencyService.Get<IGeolodationDependent>()),
new GeolocationAccuracyHighService(DependencyService.Get<IGeolodationDependent>()),
new GeolocationAccuracyBestService(DependencyService.Get<IGeolodationDependent>())},
Model.Settings.Settings.DefaultLocationService.FullName);
}
}

View file

@ -72,7 +72,7 @@ namespace TINK.View.Account
/// <param name="cancel">Text of cancel button.</param>
/// <returns>True if user pressed accept.</returns>
public async Task<bool> DisplayAdvancedAlert(string title, string message, string details, string accept, string cancel)
=> await App.Current.MainPage.DisplayAlert(title, $"{message}\r\nDetails:\r\n{details}", accept, cancel);
=> await App.Current.MainPage.DisplayAlert(title, !string.IsNullOrEmpty(details) ? $"{message}\r\nDetails:\r\n{details}" : $"{message}", accept, cancel);
/// <summary>
/// Displays an action sheet.

View file

@ -56,10 +56,15 @@
<ColumnDefinition Width="Auto" />
<ColumnDefinition Width="*" />
</Grid.ColumnDefinitions>
<Label
Text=
"{x:Static resources:AppResources.MessageBikesManagementTariffDescriptionTariffHeader}"
FontAttributes="Bold"/>
<Label
Text=
"{Binding TariffDescription.Header}"
Grid.ColumnSpan="3"
Grid.Column="1"
Grid.ColumnSpan="2"
FontAttributes="Bold"/>
<Label
Text="{x:Static resources:AppResources.MessageBikesManagementTariffDescriptionFreeTimePerSession}"

View file

@ -90,7 +90,7 @@ using TINK.View.MasterDetail;
model.SelectedStation,
() => model.GetIsConnected(),
(isConnected) => model.GetConnector(isConnected),
App.GeolocationServicesContainer.Active,
App.LocationServicesContainer.Active,
model.LocksServices.Active,
model.Polling,
(url) => DependencyService.Get<IExternalBrowserService>().OpenUrl(url),
@ -177,7 +177,7 @@ using TINK.View.MasterDetail;
/// <param name="cancel">Text of cancel button.</param>
/// <returns>True if user pressed accept.</returns>
public async Task<bool> DisplayAdvancedAlert(string title, string message, string details, string accept, string cancel)
=> await App.Current.MainPage.DisplayAlert(title, $"{message}\r\nDetails:\r\n{details}", accept, cancel);
=> await App.Current.MainPage.DisplayAlert(title, !string.IsNullOrEmpty(details) ? $"{message}\r\nDetails:\r\n{details}" : $"{message}", accept, cancel);
#if USEFLYOUT

View file

@ -1,10 +1,12 @@
using System;
using Serilog;
using System;
using System.Threading.Tasks;
using TINK.Model.Device;
#if USEFLYOUT
using TINK.View.MasterDetail;
#endif
using TINK.ViewModel.Info;
using Xamarin.Essentials;
using Xamarin.Forms;
using Xamarin.Forms.Xaml;
@ -18,18 +20,39 @@ namespace TINK.View.Contact
#endif
{
public ContactPage ()
{
InitializeComponent ();
/// <summary> View model to notify view model if page appears. </summary>
private ContactPageViewModel ViewModel { get; set; }
ContactPageView.BindingContext = new ContactPageViewModel(
App.ModelRoot.SelectedStation,
App.ModelRoot.Uris.ActiveUri,
public ContactPage()
{
InitializeComponent();
ViewModel = new ContactPageViewModel(App.ModelRoot.Uris.ActiveUri,
AppInfo.Name,
() => App.CreateAttachment(),
() => DependencyService.Get<IExternalBrowserService>().OpenUrl(DependencyService.Get<IAppInfo>().StoreUrl),
this);
() => DependencyService.Get<IExternalBrowserService>().OpenUrl(DependencyService.Get<IAppInfo>().StoreUrl),
this);
ContactPageView.BindingContext = ViewModel;
}
/// <summary> Invoked when page is shown. </summary>
protected async override void OnAppearing()
{
try
{
Log.ForContext<ContentPage>().Verbose("OnAppearing...");
await ViewModel.OnAppearing(App.ModelRoot.SelectedStation);
}
catch (Exception exception)
{
Log.ForContext<ContentPage>().Error("Invoking OnAppearing on view model failed. {Exception}", exception);
return;
}
}
/// <summary> Displays alert message.</summary>
/// <param name="title">Title of message.</param>
/// <param name="message">Message to display.</param>
@ -50,7 +73,7 @@ namespace TINK.View.Contact
/// <param name="cancel">Text of cancel button.</param>
/// <returns>True if user pressed accept.</returns>
public async Task<bool> DisplayAdvancedAlert(string title, string message, string details, string accept, string cancel)
=> await App.Current.MainPage.DisplayAlert(title, $"{message}\r\nDetails:\r\n{details}", accept, cancel);
=> await App.Current.MainPage.DisplayAlert(title, !string.IsNullOrEmpty(details) ? $"{message}\r\nDetails:\r\n{details}" : $"{message}", accept, cancel);
#if USEFLYOUT
public void ShowPage(ViewTypes p_oType, string title = null)
@ -79,17 +102,19 @@ namespace TINK.View.Contact
public async Task PushAsync(ViewTypes typeOfPage)
{
#if USEFLYOUT
if (!(Activator.CreateInstance(typeOfPage.GetViewType()) is IDetailPage detailPage))
var page = Activator.CreateInstance(typeOfPage.GetViewType()) as IDetailPage;
#else
var page = Activator.CreateInstance(typeOfPage.GetViewType());
#endif
if (page == null)
{
await Task.CompletedTask;
return;
}
// Set reference to navigation object to be able to show page on newly shown detailPage.
detailPage.NavigationMasterDetail = NavigationMasterDetail;
await Navigation.PushAsync((Page)detailPage);
#if USEFLYOUT
page.NavigationMasterDetail = NavigationMasterDetail;
#endif
await Navigation.PushAsync((Page)page);
}
#if USCSHARP9

View file

@ -55,7 +55,7 @@ namespace TINK.View.Contact
/// <param name="cancel">Text of cancel button.</param>
/// <returns>True if user pressed accept.</returns>
public async Task<bool> DisplayAdvancedAlert(string title, string message, string details, string accept, string cancel)
=> await App.Current.MainPage.DisplayAlert(title, $"{message}\r\nDetails:\r\n{details}", accept, cancel);
=> await App.Current.MainPage.DisplayAlert(title, !string.IsNullOrEmpty(details) ? $"{message}\r\nDetails:\r\n{details}" : $"{message}", accept, cancel);
/// <summary>
/// Displays alert message.
@ -107,7 +107,6 @@ namespace TINK.View.Contact
#if USEFLYOUT
page.NavigationMasterDetail = NavigationMasterDetail;
#endif
await Navigation.PushAsync((Page)page);
}
@ -140,7 +139,7 @@ namespace TINK.View.Contact
App.ModelRoot,
App.PermissionsService,
App.BluetoothService,
App.GeolocationServicesContainer.Active,
App.LocationServicesContainer.Active,
(mapspan) => MyMap.MoveToRegion(mapspan),
this,
Navigation);

View file

@ -7,12 +7,16 @@
<Grid.RowDefinitions>
<RowDefinition Height="*"/>
</Grid.RowDefinitions>
<StackLayout>
<WebView x:Name="ManageAccount"
<WebView x:Name="ManageAccount"
HeightRequest="1400"
WidthRequest="1000"
Source="{Binding Uri}" />
</StackLayout>
<ActivityIndicator
x:Name="ActivityIndicatorLoading"
HeightRequest="100"
VerticalOptions="CenterAndExpand"
HorizontalOptions="CenterAndExpand"/>
</Grid>
</ContentPage.Content>
</ContentPage>

View file

@ -1,4 +1,5 @@
using TINK.Model.Device;
using Serilog;
using TINK.Model.Device;
using TINK.ViewModel.Login;
using Xamarin.Forms;
using Xamarin.Forms.Xaml;
@ -6,17 +7,20 @@ using Xamarin.Forms.Xaml;
namespace TINK.View.CopriWebView
{
[XamlCompilation(XamlCompilationOptions.Compile)]
public partial class ManageAccountPage : ContentPage
{
public ManageAccountPage ()
{
InitializeComponent ();
public partial class ManageAccountPage : ContentPage
{
public ManageAccountPage()
{
InitializeComponent();
ManageAccount.Navigating += (sender, ev) =>
{
if (!ev.Url.ToUpper().EndsWith(".PDF"))
{
// Stay inside web view except for downloading pdf- files.
this.IsEnabled = false;
ActivityIndicatorLoading.IsVisible = true;
ActivityIndicatorLoading.IsRunning = true;
return;
}
@ -25,12 +29,23 @@ namespace TINK.View.CopriWebView
ManageAccount.Navigated += (sender, ev) =>
{
if (ev.Result == WebNavigationResult.Success) return;
if (ev.Result == WebNavigationResult.Success)
{
this.IsEnabled = true;
ActivityIndicatorLoading.IsVisible = false;
ActivityIndicatorLoading.IsRunning = false;
return;
}
Log.ForContext<ManageAccountPage>().Error("Navigation did not succeed.{@Event}{@Sender}", ev, sender);
ManageAccount.Source = new HtmlWebViewSource
{
Html = "<html><b>Kann persönliche Daten nicht anzeigen/ verwalten!</b><br>Verbindung mit Internet ok?</html>"
};
this.IsEnabled = true;
ActivityIndicatorLoading.IsVisible = false;
ActivityIndicatorLoading.IsRunning = false;
};
ManageAccount.BindingContext = new ManageAccountViewModel(

View file

@ -7,12 +7,15 @@
<Grid.RowDefinitions>
<RowDefinition Height="*"/>
</Grid.RowDefinitions>
<StackLayout>
<WebView x:Name="PasswordForgottenWebView"
HeightRequest="1400"
WidthRequest="1000"
Source="{Binding Uri}" />
</StackLayout>
<ActivityIndicator
x:Name="ActivityIndicatorLoading"
HeightRequest="100"
VerticalOptions="CenterAndExpand"
HorizontalOptions="CenterAndExpand"/>
</Grid>
</ContentPage.Content>
</ContentPage>

View file

@ -1,4 +1,5 @@

using Serilog;
using TINK.ViewModel.CopriWebView;
using Xamarin.Forms;
using Xamarin.Forms.Xaml;
@ -12,14 +13,32 @@ namespace TINK.View.CopriWebView
{
InitializeComponent ();
PasswordForgottenWebView.Navigating += (sender, ev) =>
{
this.IsEnabled = false;
ActivityIndicatorLoading.IsVisible = true;
ActivityIndicatorLoading.IsRunning = true;
};
PasswordForgottenWebView.Navigated += (sender, ev) =>
{
if (ev.Result == WebNavigationResult.Success) return;
if (ev.Result == WebNavigationResult.Success)
{
this.IsEnabled = true;
ActivityIndicatorLoading.IsVisible = false;
ActivityIndicatorLoading.IsRunning = false;
return;
}
Log.ForContext<PasswordForgottenPage>().Error("Navigation did not succeed. {@Event}", ev);
PasswordForgottenWebView.Source = new HtmlWebViewSource
{
Html = "<html><b>Kann Passwort vergessen Seite nicht anzeigen!</b><br>Verbindung mit Internet ok?</html>"
};
this.IsEnabled = true;
ActivityIndicatorLoading.IsVisible = false;
ActivityIndicatorLoading.IsRunning = false;
};
PasswordForgottenWebView.BindingContext = new PasswordForgottonViewModel(

View file

@ -7,12 +7,15 @@
<Grid.RowDefinitions>
<RowDefinition Height="*"/>
</Grid.RowDefinitions>
<StackLayout>
<WebView x:Name="RegisterView"
HeightRequest="1400"
WidthRequest="1000"
Source="{Binding Uri}" />
</StackLayout>
<WebView x:Name="RegisterView"
HeightRequest="1400"
WidthRequest="1000"
Source="{Binding Uri}" />
<ActivityIndicator
x:Name="ActivityIndicatorLoading"
HeightRequest="100"
VerticalOptions="CenterAndExpand"
HorizontalOptions="CenterAndExpand"/>
</Grid>
</ContentPage.Content>
</ContentPage>

View file

@ -1,4 +1,5 @@

using Serilog;
using TINK.Model.Device;
using TINK.ViewModel.CopriWebView;
using Xamarin.Forms;
@ -15,14 +16,32 @@ namespace TINK.View.CopriWebView
InitializeComponent();
RegisterView.Navigating += (sender, ev) =>
{
this.IsEnabled = false;
ActivityIndicatorLoading.IsVisible = true;
ActivityIndicatorLoading.IsRunning = true;
};
RegisterView.Navigated += (sender, ev) =>
{
if (ev.Result == WebNavigationResult.Success) return;
if (ev.Result == WebNavigationResult.Success)
{
this.IsEnabled = true;
ActivityIndicatorLoading.IsVisible = false;
ActivityIndicatorLoading.IsRunning = false;
return;
}
Log.ForContext<RegisterPage>().Error("Navigation did not succeed. {@Event}", ev);
RegisterView.Source = new HtmlWebViewSource
{
Html = "<html><b>Kann Anmeldeseite nicht anzeigen</b>!<br>Verbindung mit Internet ok?</html>"
};
this.IsEnabled = true;
ActivityIndicatorLoading.IsVisible = false;
ActivityIndicatorLoading.IsRunning = false;
};
RegisterView.BindingContext = new RegisterPageViewModel(

View file

@ -46,7 +46,7 @@ namespace TINK.View.FindBike
Device.RuntimePlatform,
() => model.GetIsConnected(),
(isConnected) => model.GetConnector(isConnected),
App.GeolocationServicesContainer.Active,
App.LocationServicesContainer.Active,
model.LocksServices.Active,
model.Stations,
model.Polling,
@ -104,7 +104,7 @@ namespace TINK.View.FindBike
/// <param name="cancel">Text of cancel button.</param>
/// <returns>True if user pressed accept.</returns>
public async Task<bool> DisplayAdvancedAlert(string title, string message, string details, string accept, string cancel)
=> await App.Current.MainPage.DisplayAlert(title, $"{message}\r\nDetails:\r\n{details}", accept, cancel);
=> await App.Current.MainPage.DisplayAlert(title, !string.IsNullOrEmpty(details) ? $"{message}\r\nDetails:\r\n{details}" : $"{message}", accept, cancel);
/// <summary>
/// Displays alert message.

View file

@ -55,7 +55,7 @@ namespace TINK.View.Info.BikeInfo
/// <param name="cancel">Text of cancel button.</param>
/// <returns>True if user pressed accept.</returns>
public async Task<bool> DisplayAdvancedAlert(string title, string message, string details, string accept, string cancel)
=> await App.Current.MainPage.DisplayAlert(title, $"{message}\r\nDetails:\r\n{details}", accept, cancel);
=> await App.Current.MainPage.DisplayAlert(title, !string.IsNullOrEmpty(details) ? $"{message}\r\nDetails:\r\n{details}" : $"{message}", accept, cancel);
/// <summary>
/// Displays alert message.

View file

@ -63,7 +63,7 @@ namespace TINK.View.Login
/// <param name="cancel">Text of cancel button.</param>
/// <returns>True if user pressed accept.</returns>
public async Task<bool> DisplayAdvancedAlert(string title, string message, string details, string accept, string cancel)
=> await App.Current.MainPage.DisplayAlert(title, $"{message}\r\nDetails:\r\n{details}", accept, cancel);
=> await App.Current.MainPage.DisplayAlert(title, !string.IsNullOrEmpty(details) ? $"{message}\r\nDetails:\r\n{details}" : $"{message}", accept, cancel);
#if USEFLYOUT
/// <summary>

View file

@ -61,7 +61,7 @@ namespace TINK.View.Map
/// <param name="cancel">Text of cancel button.</param>
/// <returns>True if user pressed accept.</returns>
public async Task<bool> DisplayAdvancedAlert(string title, string message, string details, string accept, string cancel)
=> await App.Current.MainPage.DisplayAlert(title, $"{message}\r\nDetails:\r\n{details}", accept, cancel);
=> await App.Current.MainPage.DisplayAlert(title, !string.IsNullOrEmpty(details) ? $"{message}\r\nDetails:\r\n{details}" : $"{message}", accept, cancel);
/// <summary>
/// Displays alert message.
@ -234,7 +234,7 @@ namespace TINK.View.Map
App.ModelRoot,
App.PermissionsService,
App.BluetoothService,
App.GeolocationServicesContainer.Active,
App.LocationServicesContainer.Active,
(mapspan) => MyMap.MoveToRegion(mapspan),
this,
Navigation);

View file

@ -53,7 +53,7 @@ namespace TINK.View.MiniSurvey
/// <param name="cancel">Text of cancel button.</param>
/// <returns>True if user pressed accept.</returns>
public async Task<bool> DisplayAdvancedAlert(string title, string message, string details, string accept, string cancel)
=> await App.Current.MainPage.DisplayAlert(title, $"{message}\r\nDetails:\r\n{details}", accept, cancel);
=> await App.Current.MainPage.DisplayAlert(title, !string.IsNullOrEmpty(details) ? $"{message}\r\nDetails:\r\n{details}" : $"{message}", accept, cancel);
/// <summary>
/// Displays alert message.

View file

@ -63,7 +63,7 @@ namespace TINK.View.MyBikes
Device.RuntimePlatform,
() => model.GetIsConnected(),
(isConnected) => model.GetConnector(isConnected),
App.GeolocationServicesContainer.Active,
App.LocationServicesContainer.Active,
model.LocksServices.Active,
model.Stations,
model.Polling,
@ -135,7 +135,7 @@ namespace TINK.View.MyBikes
/// <param name="cancel">Text of cancel button.</param>
/// <returns>True if user pressed accept.</returns>
public async Task<bool> DisplayAdvancedAlert(string title, string message, string details, string accept, string cancel)
=> await App.Current.MainPage.DisplayAlert(title, $"{message}\r\nDetails:\r\n{details}", accept, cancel);
=> await App.Current.MainPage.DisplayAlert(title, !string.IsNullOrEmpty(details) ? $"{message}\r\nDetails:\r\n{details}" : $"{message}", accept, cancel);
/// <summary>
/// Displays alert message.

View file

@ -91,6 +91,7 @@
<FlyoutItem FlyoutDisplayOptions="AsMultipleItems">
<ShellContent
Title="{x:Static resources:AppResources.MarkingFeedbackAndContact}"
Route="ContactPage"
ContentTemplate="{DataTemplate contact:ContactPage}">
<ShellContent.FlyoutIcon>
<FontImageSource Glyph="{StaticResource IconContact}" Color="Black" FontFamily="FA-S" />

View file

@ -30,7 +30,7 @@ namespace TINK.View.Settings
m_oViewModel = new SettingsPageViewModel(
l_oModel,
App.GeolocationServicesContainer,
App.LocationServicesContainer,
this);
BindingContext = m_oViewModel;
@ -65,7 +65,7 @@ namespace TINK.View.Settings
/// <param name="cancel">Text of cancel button.</param>
/// <returns>True if user pressed accept.</returns>
public async Task<bool> DisplayAdvancedAlert(string title, string message, string details, string accept, string cancel)
=> await App.Current.MainPage.DisplayAlert(title, $"{message}\r\nDetails:\r\n{details}", accept, cancel);
=> await App.Current.MainPage.DisplayAlert(title, !string.IsNullOrEmpty(details) ? $"{message}\r\nDetails:\r\n{details}" : $"{message}", accept, cancel);
/// <summary> Displays alert message.</summary>
/// <param name="p_strTitle">Title of message.</param>

View file

@ -43,7 +43,7 @@ namespace TINK.View.WhatsNew.Agb
/// <param name="cancel">Text of cancel button.</param>
/// <returns>True if user pressed accept.</returns>
public async Task<bool> DisplayAdvancedAlert(string title, string message, string details, string accept, string cancel)
=> await App.Current.MainPage.DisplayAlert(title, $"{message}\r\nDetails:\r\n{details}", accept, cancel);
=> await App.Current.MainPage.DisplayAlert(title, !string.IsNullOrEmpty(details) ? $"{message}\r\nDetails:\r\n{details}" : $"{message}", accept, cancel);
/// <summary> Invoked when page is shown. </summary>
protected async override void OnAppearing()

View file

@ -48,7 +48,7 @@ namespace TINK.View.WhatsNew
/// <param name="cancel">Text of cancel button.</param>
/// <returns>True if user pressed accept.</returns>
public async Task<bool> DisplayAdvancedAlert(string title, string message, string details, string accept, string cancel)
=> await App.Current.MainPage.DisplayAlert(title, $"{message}\r\nDetails:\r\n{details}", accept, cancel);
=> await App.Current.MainPage.DisplayAlert(title, !string.IsNullOrEmpty(details) ? $"{message}\r\nDetails:\r\n{details}" : $"{message}", accept, cancel);
public Task PopModalAsync()
{