Codeunit 7569 Geolocation Impl., source in 24
Source242526272829metadata in 24
src/System Application/App/Geolocation/src/GeolocationImpl.Codeunit.al154 lines, Copyright (c) Microsoft Corporation. MIT
// ------------------------------------------------------------------------------------------------
// Copyright (c) Microsoft Corporation. All rights reserved.
// Licensed under the MIT License. See License.txt in the project root for license information.
// ------------------------------------------------------------------------------------------------
namespace System.Device;
using System;
codeunit 7569 "Geolocation Impl."
{
Access = Internal;
InherentEntitlements = X;
InherentPermissions = X;
var
GeolocationPage: Page Geolocation;
LocationNotRetrievedErrorMsg: Label 'The geographical location data was not retrieved.';
CachedLocation: DotNet Location;
LocationProvider: DotNet LocationProvider;
LocationOptions: DotNet LocationOptions;
LocationOptionsEnabled: Boolean;
procedure RequestGeolocation(GeolocationImpl: Codeunit "Geolocation Impl."): Boolean
begin
Clear(GeolocationPage);
GeolocationPage.SetGeolocationImpl(GeolocationImpl);
GeolocationPage.RunModal();
if HasGeolocation() then
exit(true);
exit(false);
end;
procedure LocationInteractionOnOpenPage(var LocationProvdr: DotNet LocationProvider; var LocationAvailable: Boolean)
var
Location: DotNet Location;
HandledByTest: Boolean;
begin
OnBeforeLocationInitialize(Location, HandledByTest);
if HandledByTest then begin
LocationInteractionOnLocationAvailable(Location);
exit;
end;
LocationAvailable := LocationProvdr.IsAvailable();
if not LocationAvailable then
exit;
InitializeLocationOptions();
LocationProvdr := LocationProvdr.Create();
LocationProvdr.RequestLocationAsync(LocationOptions);
LocationProvider := LocationProvdr;
end;
procedure LocationInteractionOnLocationAvailable(Location: DotNet Location)
begin
CachedLocation := Location;
end;
procedure IsAvailable(): Boolean
var
Available: Boolean;
begin
Available := LocationProvider.IsAvailable();
OnIsLocationAvailable(Available);
exit(Available);
end;
procedure HasGeolocation(): Boolean
begin
if IsNull(CachedLocation) then
exit(false);
exit(GetGeolocationStatus() = "Geolocation Status"::Available);
end;
procedure GetGeolocation(var Latitude: Decimal; var Longitude: Decimal)
begin
if (not HasGeolocation()) then
Error(LocationNotRetrievedErrorMsg);
Latitude := CachedLocation.Coordinate.Latitude;
Longitude := CachedLocation.Coordinate.Longitude;
end;
procedure GetGeolocationStatus(): Enum "Geolocation Status"
begin
if (IsNull(CachedLocation)) then
exit("Geolocation Status"::"Not Available");
exit("Geolocation Status".FromInteger(CachedLocation.Status));
end;
procedure SetHighAccuracy(Enable: Boolean)
begin
InitializeLocationOptions();
LocationOptions.EnableHighAccuracy(Enable);
end;
procedure SetTimeout(Timeout: Integer)
begin
InitializeLocationOptions();
LocationOptions.Timeout(Timeout)
end;
procedure SetMaximumAge(Age: Integer)
begin
InitializeLocationOptions();
LocationOptions.MaximumAge(Age)
end;
procedure GetHighAccuracy(): Boolean
begin
InitializeLocationOptions();
exit(LocationOptions.EnableHighAccuracy());
end;
procedure GetTimeout(): Integer
begin
InitializeLocationOptions();
exit(LocationOptions.Timeout());
end;
procedure GetMaximumAge(): Integer
begin
InitializeLocationOptions();
exit(LocationOptions.MaximumAge());
end;
local procedure InitializeLocationOptions()
begin
if LocationOptionsEnabled then
exit;
LocationOptions := LocationOptions.LocationOptions();
LocationOptions.EnableHighAccuracy := false;
LocationOptions.Timeout := 600000; // 10 minutes
LocationOptions.MaximumAge := 0;
LocationOptionsEnabled := true;
end;
[InternalEvent(false)]
procedure OnBeforeLocationInitialize(var Location: DotNet Location; var IsHandled: Boolean)
begin
// Used for testing
end;
[InternalEvent(false)]
procedure OnIsLocationAvailable(var IsAvailable: Boolean)
begin
// Used for testing
end;
}