mirror of
https://dev.azure.com/TeilRad/sharee.bike%20App/_git/Code
synced 2025-06-21 21:46:27 +02:00
Version 3.0.361
This commit is contained in:
parent
faf68061f4
commit
cba4da9357
88 changed files with 1119 additions and 1502 deletions
|
@ -676,6 +676,11 @@ namespace TINK.Model
|
|||
new Version(3, 0, 360),
|
||||
AppResources.ChangeLog_3_0_358_MK_SB,
|
||||
new List<AppFlavor> { AppFlavor.MeinKonrad, AppFlavor.ShareeBike }
|
||||
},
|
||||
{
|
||||
new Version(3, 0, 361),
|
||||
AppResources.ChangeLog_3_0_361_MK_SB,
|
||||
new List<AppFlavor> { AppFlavor.MeinKonrad, AppFlavor.ShareeBike }
|
||||
},
|
||||
};
|
||||
|
||||
|
|
|
@ -757,6 +757,15 @@ namespace TINK.MultilingualResources {
|
|||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Looks up a localized string similar to If you have reserved or rented a bike, this will now be shown to you as an icon on the map page. Clicking on it will take you directly to the 'My bikes' page. We have also made small design changes..
|
||||
/// </summary>
|
||||
public static string ChangeLog_3_0_361_MK_SB {
|
||||
get {
|
||||
return ResourceManager.GetString("ChangeLog_3_0_361_MK_SB", resourceCulture);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Looks up a localized string similar to We have fixed some bugs. Enjoy the ride!.
|
||||
/// </summary>
|
||||
|
@ -1873,7 +1882,7 @@ namespace TINK.MultilingualResources {
|
|||
}
|
||||
|
||||
/// <summary>
|
||||
/// Looks up a localized string similar to Station id: {0}.
|
||||
/// Looks up a localized string similar to ID: {0}.
|
||||
/// </summary>
|
||||
public static string MarkingBikesAtStationStationId {
|
||||
get {
|
||||
|
@ -1945,7 +1954,7 @@ namespace TINK.MultilingualResources {
|
|||
}
|
||||
|
||||
/// <summary>
|
||||
/// Looks up a localized string similar to <font color="blue"><u>Contact</u></font> {0}..
|
||||
/// Looks up a localized string similar to <u>Contact</u> {0}..
|
||||
/// </summary>
|
||||
public static string MarkingContactSupport {
|
||||
get {
|
||||
|
|
|
@ -599,7 +599,7 @@ Layout Anzeige Radnamen und nummern verbessert.</value>
|
|||
<value>Wahl eines Rads über die Radnummer hinzugefügt.</value>
|
||||
</data>
|
||||
<data name="MarkingContactSupport" xml:space="preserve">
|
||||
<value>{0} <font color="blue"><u>kontaktieren</u></font>.</value>
|
||||
<value>{0} <u>kontaktieren</u>.</value>
|
||||
</data>
|
||||
<data name="MarkingLoginRequiredToRerserve" xml:space="preserve">
|
||||
<value>Bitte Anmelden um Fahrräder zu reservieren! <font color="blue"><u>Hier</u></font> tippen, um auf Anmeldeseite zu wechseln.</value>
|
||||
|
@ -694,7 +694,7 @@ Kleinere Verbesserungen.</value>
|
|||
<value>Komponenten von Fremdanbietern aktualisiert.</value>
|
||||
</data>
|
||||
<data name="MarkingBikesAtStationStationId" xml:space="preserve">
|
||||
<value>Stationskennung: {0}</value>
|
||||
<value>ID: {0}</value>
|
||||
</data>
|
||||
<data name="ChangeLog3_0_250" xml:space="preserve">
|
||||
<value>Anzeige Stationskennung.
|
||||
|
@ -1140,4 +1140,7 @@ Wenn sich das Schloss weiterhin nicht öffnen lässt, vergewissern Sie sich, das
|
|||
<value>Neue Funktionen:<ul><li>Wenn Ihr Gerät nicht mit dem Internet verbunden ist, wird dies nun oben angezeigt.</li><li>Sie können jetzt Ihre Fahrradansicht aktualisieren, indem Sie von oben nach unten ziehen. Das ist besonders nützlich, wenn Sie sich wieder mit dem Internet verbunden haben.</li></ul>
|
||||
<br/>Außerdem:<ul><li>Software Pakete wurde aktualisiert.</li><li>Kleinere Fehlerbehebungen.</li></ul></value>
|
||||
</data>
|
||||
<data name="ChangeLog_3_0_361_MK_SB" xml:space="preserve">
|
||||
<value>Wenn Sie ein Rad reserviert oder gemietet haben, wird dies Ihnen nun auf der Kartenseite als Symbol angezeigt. Ein Klick darauf führt Sie direkt zur Seite 'Meine Räder'. Wir haben außerdem kleine Designänderungen vorgenommen.</value>
|
||||
</data>
|
||||
</root>
|
|
@ -717,7 +717,7 @@ Layout of bike names and id display improved.</value>
|
|||
<value>Contact operator?</value>
|
||||
</data>
|
||||
<data name="MarkingContactSupport" xml:space="preserve">
|
||||
<value><font color="blue"><u>Contact</u></font> {0}.</value>
|
||||
<value><u>Contact</u> {0}.</value>
|
||||
</data>
|
||||
<data name="MarkingLoginRequiredToRerserve" xml:space="preserve">
|
||||
<value>Please login to reserve bikes! Tap <font color="blue"><u>here</u></font> to switch to login page.</value>
|
||||
|
@ -802,7 +802,7 @@ Minor fixes.</value>
|
|||
<value>Third-party components updated.</value>
|
||||
</data>
|
||||
<data name="MarkingBikesAtStationStationId" xml:space="preserve">
|
||||
<value>Station id: {0}</value>
|
||||
<value>ID: {0}</value>
|
||||
</data>
|
||||
<data name="ChangeLog3_0_250" xml:space="preserve">
|
||||
<value>Station id displayed.
|
||||
|
@ -1230,4 +1230,7 @@ Try it out!</value>
|
|||
<data name="MarkingNoNetworkConnection" xml:space="preserve">
|
||||
<value>Oops, there is no internet connection.</value>
|
||||
</data>
|
||||
<data name="ChangeLog_3_0_361_MK_SB" xml:space="preserve">
|
||||
<value>If you have reserved or rented a bike, this will now be shown to you as an icon on the map page. Clicking on it will take you directly to the 'My bikes' page. We have also made small design changes.</value>
|
||||
</data>
|
||||
</root>
|
|
@ -802,8 +802,8 @@ Layout Anzeige Radnamen und nummern verbessert.</target>
|
|||
<target state="translated">Wahl eines Rads über die Radnummer hinzugefügt.</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="MarkingContactSupport" translate="yes" xml:space="preserve">
|
||||
<source><bpt id="1"><font color="blue"></bpt><bpt id="2"><u></bpt>Contact<ept id="2"></u></ept><ept id="1"></font></ept> {0}.</source>
|
||||
<target state="translated">{0} <bpt id="1"><font color="blue"></bpt><bpt id="2"><u></bpt>kontaktieren<ept id="2"></u></ept><ept id="1"></font></ept>.</target>
|
||||
<source><bpt id="1"><u></bpt>Contact<ept id="1"></u></ept> {0}.</source>
|
||||
<target state="translated">{0} <bpt id="1"><u></bpt>kontaktieren<ept id="1"></u></ept>.</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="MarkingLoginRequiredToRerserve" translate="yes" xml:space="preserve">
|
||||
<source>Please login to reserve bikes! Tap <bpt id="1"><font color="blue"></bpt><bpt id="2"><u></bpt>here<ept id="2"></u></ept><ept id="1"></font></ept> to switch to login page.</source>
|
||||
|
@ -929,8 +929,8 @@ Kleinere Verbesserungen.</target>
|
|||
<target state="translated">Komponenten von Fremdanbietern aktualisiert.</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="MarkingBikesAtStationStationId" translate="yes" xml:space="preserve">
|
||||
<source>Station id: {0}</source>
|
||||
<target state="translated">Stationskennung: {0}</target>
|
||||
<source>ID: {0}</source>
|
||||
<target state="translated">ID: {0}</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="ChangeLog3_0_250" translate="yes" xml:space="preserve">
|
||||
<source>Station id displayed.
|
||||
|
@ -1562,6 +1562,10 @@ Wenn sich das Schloss weiterhin nicht öffnen lässt, vergewissern Sie sich, das
|
|||
<target state="translated">Neue Funktionen:<bpt id="1"><ul></bpt><bpt id="2"><li></bpt>Wenn Ihr Gerät nicht mit dem Internet verbunden ist, wird dies nun oben angezeigt.<ept id="2"></li></ept><bpt id="3"><li></bpt>Sie können jetzt Ihre Fahrradansicht aktualisieren, indem Sie von oben nach unten ziehen. Das ist besonders nützlich, wenn Sie sich wieder mit dem Internet verbunden haben.<ept id="3"></li></ept><ept id="1"></ul></ept>
|
||||
<br/>Außerdem:<bpt id="4"><ul></bpt><bpt id="5"><li></bpt>Software Pakete wurde aktualisiert.<ept id="5"></li></ept><bpt id="6"><li></bpt>Kleinere Fehlerbehebungen.<ept id="6"></li></ept><ept id="4"></ul></ept></target>
|
||||
</trans-unit>
|
||||
<trans-unit id="ChangeLog_3_0_361_MK_SB" translate="yes" xml:space="preserve">
|
||||
<source>If you have reserved or rented a bike, this will now be shown to you as an icon on the map page. Clicking on it will take you directly to the 'My bikes' page. We have also made small design changes.</source>
|
||||
<target state="translated">Wenn Sie ein Rad reserviert oder gemietet haben, wird dies Ihnen nun auf der Kartenseite als Symbol angezeigt. Ein Klick darauf führt Sie direkt zur Seite 'Meine Räder'. Wir haben außerdem kleine Designänderungen vorgenommen.</target>
|
||||
</trans-unit>
|
||||
</group>
|
||||
</body>
|
||||
</file>
|
||||
|
|
|
@ -3,7 +3,6 @@ using System.Collections.Generic;
|
|||
using System.Threading.Tasks;
|
||||
using TINK.Model.Bikes.BikeInfoNS.BluetoothLock;
|
||||
using TINK.Model.Connector;
|
||||
using TINK.Model.Device;
|
||||
using TINK.Repository.Request;
|
||||
using TINK.Repository.Response;
|
||||
|
||||
|
|
|
@ -9,6 +9,9 @@
|
|||
<!--Secondary color-->
|
||||
<Color x:Key="secondary-back-title-color">#FF0020</Color>
|
||||
|
||||
<!--Background color-->
|
||||
<Color x:Key="background-color">#BEBEBE</Color>
|
||||
|
||||
<!--Attention color-->
|
||||
<Color x:Key="attention-color">#06D1B1</Color>
|
||||
|
||||
|
|
|
@ -6,6 +6,9 @@
|
|||
<!--Main color-->
|
||||
<Color x:Key="primary-back-title-color">#009899</Color>
|
||||
|
||||
<!--Background color-->
|
||||
<Color x:Key="background-color">#BEBEBE</Color>
|
||||
|
||||
<!--Attention color-->
|
||||
<Color x:Key="attention-color">#FC870D</Color>
|
||||
|
||||
|
|
|
@ -387,6 +387,11 @@ namespace TINK.ViewModel.Bikes
|
|||
return Exception.GetShortErrorInfoText(IsReportLevelVerbose);
|
||||
}
|
||||
|
||||
if (!IsConnected)
|
||||
{
|
||||
return AppResources.ActivityTextConnectionStateOffline;
|
||||
}
|
||||
|
||||
return ActionText ?? string.Empty;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -27,6 +27,11 @@ using TINK.Repository;
|
|||
using TINK.Services.Geolocation;
|
||||
using TINK.Model.State;
|
||||
using TINK.ViewModel.Bikes;
|
||||
using Location = Xamarin.Essentials.Location;
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
@ -238,31 +243,38 @@ namespace TINK.ViewModel.Map
|
|||
{
|
||||
Log.ForContext<MapPageViewModel>().Debug($"Starting update of stations pins color for {stationsColorList.Count} stations...");
|
||||
|
||||
int MyBikesCount = 0;
|
||||
// Update colors of pins.
|
||||
for (int pinIndex = 0; pinIndex < stationsColorList.Count; pinIndex++)
|
||||
{
|
||||
var indexPartPrefix = int.TryParse(Pins[pinIndex].Tag.ToString(), out int stationId)
|
||||
&& stationId <= CUSTOM_ICONS_COUNT
|
||||
? $"{stationId}" // there is a station marker with index letter for given station id
|
||||
: "Open"; // there is no station marker. Use open marker.
|
||||
var indexPartPrefix = int.TryParse(Pins[pinIndex].Tag.ToString(), out int stationId)
|
||||
&& stationId <= CUSTOM_ICONS_COUNT
|
||||
? $"{stationId}" // there is a station marker with index letter for given station id
|
||||
: "Open"; // there is no station marker. Use open marker.
|
||||
|
||||
var colorPartPrefix = GetRessourceNameColorPart(stationsColorList[pinIndex]);
|
||||
var colorPartPrefix = GetRessourceNameColorPart(stationsColorList[pinIndex]);
|
||||
if (colorPartPrefix == "Blue" || colorPartPrefix == "LightBlue")
|
||||
{
|
||||
MyBikesCount = MyBikesCount + 1;
|
||||
};
|
||||
|
||||
var name = $"{indexPartPrefix.ToString().PadLeft(2, '0')}_{colorPartPrefix}{(DeviceInfo.Platform == DevicePlatform.Android ? ".png" : string.Empty)}";
|
||||
try
|
||||
{
|
||||
Pins[pinIndex].Icon = BitmapDescriptorFactory.FromBundle(name);
|
||||
}
|
||||
catch (Exception excption)
|
||||
{
|
||||
Log.ForContext<MapPageViewModel>().Error("Station icon {name} can not be loaded. {@excption}.", name, excption);
|
||||
Pins[pinIndex].Label = stationId.ToString();
|
||||
Pins[pinIndex].Icon = BitmapDescriptorFactory.DefaultMarker(stationsColorList[pinIndex]);
|
||||
}
|
||||
var name = $"{indexPartPrefix.ToString().PadLeft(2, '0')}_{colorPartPrefix}{(DeviceInfo.Platform == DevicePlatform.Android ? ".png" : string.Empty)}";
|
||||
try
|
||||
{
|
||||
Pins[pinIndex].Icon = BitmapDescriptorFactory.FromBundle(name);
|
||||
}
|
||||
catch (Exception excption)
|
||||
{
|
||||
Log.ForContext<MapPageViewModel>().Error("Station icon {name} can not be loaded. {@excption}.", name, excption);
|
||||
Pins[pinIndex].Label = stationId.ToString();
|
||||
Pins[pinIndex].Icon = BitmapDescriptorFactory.DefaultMarker(stationsColorList[pinIndex]);
|
||||
}
|
||||
|
||||
Pins[pinIndex].IsVisible = true;
|
||||
}
|
||||
|
||||
MyBikesCountText = MyBikesCount > 0 ? string.Format(MyBikesCount.ToString()) : string.Empty;
|
||||
|
||||
var pinsCount = Pins.Count;
|
||||
for (int pinIndex = stationsColorList.Count; pinIndex < pinsCount; pinIndex++)
|
||||
{
|
||||
|
@ -273,6 +285,20 @@ namespace TINK.ViewModel.Map
|
|||
Log.ForContext<MapPageViewModel>().Debug("Update of stations pins color done.");
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// label for number of reserved/rented bikes;
|
||||
/// </summary>
|
||||
private string _myBikesCountText = string.Empty;
|
||||
public string MyBikesCountText
|
||||
{
|
||||
get { return _myBikesCountText; }
|
||||
set
|
||||
{
|
||||
_myBikesCountText = value;
|
||||
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(nameof(MyBikesCountText)));
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary> Gets the color related part of the ressrouce name.</summary>
|
||||
/// <param name="color">Color to get name for.</param>
|
||||
/// <returns>Resource name.</returns>
|
||||
|
@ -340,7 +366,7 @@ namespace TINK.ViewModel.Map
|
|||
{
|
||||
// Context switch should not be required because code is called from GUI thread
|
||||
// but a xf-issue requires call (see issue #594).
|
||||
TinkApp.PostAction( async (x) =>
|
||||
TinkApp.PostAction(async (x) =>
|
||||
{
|
||||
// Show COPRI message once.
|
||||
await ViewService.DisplayAlert(
|
||||
|
@ -376,11 +402,11 @@ namespace TINK.ViewModel.Map
|
|||
{
|
||||
var status = await PermissionsService.CheckStatusAsync();
|
||||
if (status == Status.Granted)
|
||||
{
|
||||
// Get from smart device
|
||||
mapSpan = await GetFromLocationService(status);
|
||||
}
|
||||
{
|
||||
// Get from smart device
|
||||
mapSpan = await GetFromLocationService(status);
|
||||
}
|
||||
}
|
||||
|
||||
if (mapSpan == null)
|
||||
{
|
||||
|
@ -462,16 +488,16 @@ namespace TINK.ViewModel.Map
|
|||
{
|
||||
if (Pins.Count > 0 && Pins.Count != stations.Count)
|
||||
{
|
||||
// Either
|
||||
// - user logged in/ logged out which might lead to more/ less stations beeing available
|
||||
// - new stations were added/ existing ones remove
|
||||
Pins.Clear();
|
||||
// Either
|
||||
// - user logged in/ logged out which might lead to more/ less stations beeing available
|
||||
// - new stations were added/ existing ones remove
|
||||
Pins.Clear();
|
||||
}
|
||||
|
||||
// Check if there are alreay any pins to the map
|
||||
// i.e detecte first call of member OnAppearing after construction
|
||||
if (Pins.Count <= 0)
|
||||
{
|
||||
{
|
||||
Log.ForContext<MapPageViewModel>().Debug($"{(ActiveFilterMap.GetGroup().Any() ? $"Active map filter is {string.Join(",", ActiveFilterMap.GetGroup())}." : "Map filter is off.")}");
|
||||
|
||||
// Map was not yet initialized.
|
||||
|
@ -546,15 +572,15 @@ namespace TINK.ViewModel.Map
|
|||
AppResources.MessageAnswerYes,
|
||||
AppResources.MessageAnswerNo);
|
||||
|
||||
if (dialogResult)
|
||||
{
|
||||
// User decided to give access to locations permissions.
|
||||
PermissionsService.OpenAppSettings();
|
||||
ActionText = string.Empty;
|
||||
IsProcessWithRunningProcessView = false;
|
||||
IsNavBarVisible = true;
|
||||
IsMapPageEnabled = true;
|
||||
}
|
||||
if (dialogResult)
|
||||
{
|
||||
// User decided to give access to locations permissions.
|
||||
PermissionsService.OpenAppSettings();
|
||||
ActionText = string.Empty;
|
||||
IsProcessWithRunningProcessView = false;
|
||||
IsNavBarVisible = true;
|
||||
IsMapPageEnabled = true;
|
||||
}
|
||||
}
|
||||
return status;
|
||||
}
|
||||
|
@ -661,40 +687,40 @@ namespace TINK.ViewModel.Map
|
|||
/// <param name="selectedStationId">Id of station user clicked on.</param>
|
||||
public async void OnStationClicked(string selectedStationId)
|
||||
{
|
||||
try
|
||||
{
|
||||
Log.ForContext<MapPageViewModel>().Information($"User taped station {selectedStationId}.");
|
||||
try
|
||||
{
|
||||
Log.ForContext<MapPageViewModel>().Information($"User taped station {selectedStationId}.");
|
||||
|
||||
// Lock action to prevent multiple instances of "BikeAtStation" being opened.
|
||||
IsMapPageEnabled = false;
|
||||
// Lock action to prevent multiple instances of "BikeAtStation" being opened.
|
||||
IsMapPageEnabled = false;
|
||||
|
||||
TinkApp.SelectedStation = TinkApp.Stations.FirstOrDefault(x => x.Id == selectedStationId)
|
||||
?? new Station(selectedStationId, new List<string>(), null); // Station might not be in list StationDictinaly because this list is not updatd in background task.
|
||||
TinkApp.SelectedStation = TinkApp.Stations.FirstOrDefault(x => x.Id == selectedStationId)
|
||||
?? new Station(selectedStationId, new List<string>(), null); // Station might not be in list StationDictinaly because this list is not updatd in background task.
|
||||
|
||||
#if TRYNOTBACKSTYLE
|
||||
m_oNavigation.ShowPage(
|
||||
typeof(BikesAtStationPage),
|
||||
p_strStationName);
|
||||
#else
|
||||
{
|
||||
// Show page.
|
||||
await ViewService.PushAsync(ViewTypes.BikesAtStation);
|
||||
|
||||
IsMapPageEnabled = true;
|
||||
ActionText = string.Empty;
|
||||
}
|
||||
}
|
||||
catch (Exception exception)
|
||||
{
|
||||
// Show page.
|
||||
await ViewService.PushAsync(ViewTypes.BikesAtStation);
|
||||
|
||||
IsMapPageEnabled = true;
|
||||
ActionText = string.Empty;
|
||||
|
||||
Log.ForContext<MapPageViewModel>().Error("Fehler beim Öffnen der Ansicht \"Fahrräder an Station\" aufgetreten. {Exception}", exception);
|
||||
await ViewService.DisplayAlert(
|
||||
"Fehler",
|
||||
$"Fehler beim Öffnen der Ansicht \"Fahrräder an Station\" aufgetreten. {exception.Message}",
|
||||
"OK");
|
||||
}
|
||||
}
|
||||
catch (Exception exception)
|
||||
{
|
||||
IsMapPageEnabled = true;
|
||||
ActionText = string.Empty;
|
||||
|
||||
Log.ForContext<MapPageViewModel>().Error("Fehler beim Öffnen der Ansicht \"Fahrräder an Station\" aufgetreten. {Exception}", exception);
|
||||
await ViewService.DisplayAlert(
|
||||
"Fehler",
|
||||
$"Fehler beim Öffnen der Ansicht \"Fahrräder an Station\" aufgetreten. {exception.Message}",
|
||||
"OK");
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
|
@ -858,11 +884,44 @@ namespace TINK.ViewModel.Map
|
|||
// An error occurred getting data from copri.
|
||||
return Exception.GetShortErrorInfoText(TinkApp.IsReportLevelVerbose);
|
||||
}
|
||||
if (!IsConnected)
|
||||
{
|
||||
return AppResources.ActivityTextConnectionStateOffline;
|
||||
}
|
||||
|
||||
return ActionText ?? string.Empty;
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary> Processes request to view my bikes.</summary>
|
||||
public System.Windows.Input.ICommand OnMyBikesButtonClicked => new Xamarin.Forms.Command(async () =>
|
||||
{
|
||||
try
|
||||
{
|
||||
Log.ForContext<MapPageViewModel>().Information($"User clicked on MyBikesButton.");
|
||||
|
||||
// Lock action to prevent multiple instances of "BikeAtStation" being opened.
|
||||
IsMapPageEnabled = false;
|
||||
|
||||
// Show page.
|
||||
await ViewService.PushAsync(ViewTypes.MyBikesPage);
|
||||
|
||||
IsMapPageEnabled = true;
|
||||
ActionText = string.Empty;
|
||||
}
|
||||
catch (Exception exception)
|
||||
{
|
||||
IsMapPageEnabled = true;
|
||||
ActionText = string.Empty;
|
||||
|
||||
Log.ForContext<MapPageViewModel>().Error("Fehler beim Öffnen der Ansicht \"Meine Räder\" aufgetreten. {Exception}", exception);
|
||||
await ViewService.DisplayAlert(
|
||||
"Fehler",
|
||||
$"Fehler beim Öffnen der Ansicht \"Meine Räder\" aufgetreten. {exception.Message}",
|
||||
"OK");
|
||||
}
|
||||
});
|
||||
|
||||
/// <summary> Command object to bind login button to view model.</summary>
|
||||
public System.Windows.Input.ICommand OnToggleTinkToKonrad => new Xamarin.Forms.Command(async () => await ToggleTinkToKonrad());
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue