using ReactNative.Bridge; using System; using System.Collections.Generic; using System.Globalization; using System.Net.Http; using System.Text.RegularExpressions; using Windows.ApplicationModel; using Windows.UI.Xaml; using Windows.UI.Xaml.Controls; using Windows.Devices.Power; using Windows.System; using Windows.Security.Credentials.UI; using Windows.Networking; using Windows.Networking.Connectivity; using System.Linq; namespace RNDeviceInfo { public class RNDeviceInfoModule : ReactContextNativeModuleBase { public RNDeviceInfoModule(ReactContext reactContext) : base(reactContext) { } public override string Name { get { return "RNDeviceInfo"; } } private bool IsEmulator(string model) { Regex rgx = new Regex("(?i:virtual)"); return rgx.IsMatch(model); } private bool IsTablet(string os) { Regex rgx = new Regex("(?i:windowsphone)"); return !rgx.IsMatch(os); } private bool is24Hour() { return DateTimeFormatInfo.CurrentInfo.ShortTimePattern.Contains("H"); } [ReactMethod] public async void isPinOrFingerprintSet(ICallback actionCallback) { try { var ucvAvailability = await UserConsentVerifier.CheckAvailabilityAsync(); actionCallback.Invoke(ucvAvailability == UserConsentVerifierAvailability.Available); } catch (Exception ex) { actionCallback.Invoke(false); } } [ReactMethod] public async void getIpAddress(IPromise promise) { var hostNameType = HostNameType.Ipv4; var icp = NetworkInformation.GetInternetConnectionProfile(); if (icp?.NetworkAdapter == null) { promise.Reject(new InvalidOperationException("Network adapter not found.")); } else { var hostname = NetworkInformation.GetHostNames() .FirstOrDefault( hn => hn.Type == hostNameType && hn.IPInformation?.NetworkAdapter != null && hn.IPInformation.NetworkAdapter.NetworkAdapterId == icp.NetworkAdapter.NetworkAdapterId); promise.Resolve(hostname?.CanonicalName); } } [ReactMethod] public async void getBatteryLevel(IPromise promise) { // Create aggregate battery object var aggBattery = Battery.AggregateBattery; // Get report var report = aggBattery.GetReport(); if ((report.FullChargeCapacityInMilliwattHours == null) || (report.RemainingCapacityInMilliwattHours == null)) { promise.Reject(new InvalidOperationException("Could not fetch battery information.")); } else { var max = Convert.ToDouble(report.FullChargeCapacityInMilliwattHours); var value = Convert.ToDouble(report.RemainingCapacityInMilliwattHours); promise.Resolve(value / max); } } public override IReadOnlyDictionary<string, object> Constants { get { Dictionary<string, object> constants = new Dictionary<string, object>(); constants["appVersion"] = "not available"; constants["buildVersion"] = "not available"; constants["buildNumber"] = 0; Package package = Package.Current; PackageId packageId = package.Id; PackageVersion version = packageId.Version; String bundleId = packageId.Name; String appName = package.DisplayName; try { constants["appVersion"] = string.Format("{0}.{1}.{2}.{3}", version.Major, version.Minor, version.Build, version.Revision); constants["buildNumber"] = version.Build.ToString(); constants["buildVersion"] = version.Build.ToString(); } catch { } String deviceName = "not available"; String manufacturer = "not available"; String device_id = "not available"; String model = "not available"; String hardwareVersion = "not available"; String osVersion = "not available"; String os = "not available"; CultureInfo culture = CultureInfo.CurrentCulture; try { var deviceInfo = new Windows.Security.ExchangeActiveSyncProvisioning.EasClientDeviceInformation(); deviceName = deviceInfo.FriendlyName; manufacturer = deviceInfo.SystemManufacturer; device_id = deviceInfo.Id.ToString(); model = deviceInfo.SystemProductName; hardwareVersion = deviceInfo.SystemHardwareVersion; os = deviceInfo.OperatingSystem; string deviceFamilyVersion = Windows.System.Profile.AnalyticsInfo.VersionInfo.DeviceFamilyVersion; ulong version2 = ulong.Parse(deviceFamilyVersion); ulong major = (version2 & 0xFFFF000000000000L) >> 48; ulong minor = (version2 & 0x0000FFFF00000000L) >> 32; osVersion = $"{major}.{minor}"; } catch { } constants["instanceId"] = "not available"; constants["deviceName"] = deviceName; constants["systemName"] = "Windows"; constants["systemVersion"] = osVersion; constants["apiLevel"] = "not available"; constants["model"] = model; constants["brand"] = model; constants["deviceId"] = hardwareVersion; constants["deviceLocale"] = culture.Name; constants["deviceCountry"] = culture.EnglishName; constants["uniqueId"] = device_id; constants["systemManufacturer"] = manufacturer; constants["bundleId"] = bundleId; constants["appName"] = appName; constants["userAgent"] = "not available"; constants["timezone"] = TimeZoneInfo.Local.Id; constants["isEmulator"] = IsEmulator(model); constants["isTablet"] = IsTablet(os); constants["carrier"] = "not available"; constants["is24Hour"] = is24Hour(); constants["maxMemory"] = MemoryManager.AppMemoryUsageLimit; constants["firstInstallTime"] = package.InstalledDate.ToUnixTimeMilliseconds(); return constants; } } } }