902 lines
26 KiB
C++
902 lines
26 KiB
C++
#pragma once
|
|
|
|
#include "pch.h"
|
|
#include "NativeModules.h"
|
|
#include <regex>
|
|
#include <sstream>
|
|
#include <chrono>
|
|
#include <future>
|
|
#include <winrt/Windows.Foundation.h>
|
|
#include <winrt/Windows.Networking.Connectivity.h>
|
|
|
|
using namespace winrt::Microsoft::ReactNative;
|
|
using namespace winrt::Windows::Foundation;
|
|
using namespace winrt::Windows::Networking;
|
|
using namespace winrt::Windows::Networking::Connectivity;
|
|
|
|
namespace winrt::RNDeviceInfoCPP
|
|
{
|
|
REACT_MODULE(RNDeviceInfoCPP, L"RNDeviceInfo");
|
|
struct RNDeviceInfoCPP
|
|
{
|
|
const std::string Name = "RNDeviceInfo";
|
|
|
|
ReactContext m_reactContext;
|
|
REACT_INIT(Initialize)
|
|
void Initialize(ReactContext const &reactContext) noexcept
|
|
{
|
|
m_reactContext = reactContext;
|
|
Windows::System::Power::PowerManager::EnergySaverStatusChanged([&](
|
|
const auto&, winrt::Windows::Foundation::IInspectable obj) { OnEnergySaverStatusChanged(); });
|
|
Windows::Devices::Power::Battery::AggregateBattery().ReportUpdated([&](
|
|
const auto&, winrt::Windows::Foundation::IInspectable obj) { OnBatteryReportUpdated(); });
|
|
}
|
|
|
|
REACT_CONSTANT_PROVIDER(constantsViaConstantsProvider);
|
|
void constantsViaConstantsProvider(ReactConstantProvider& provider) noexcept
|
|
{
|
|
provider.Add(L"deviceId", getDeviceIdSync());
|
|
provider.Add(L"serialNumber", getSerialNumberSync());
|
|
provider.Add(L"bundleId", getBundleIdSync());
|
|
provider.Add(L"systemVersion", getSystemVersionSync());
|
|
provider.Add(L"appVersion", getAppVersionSync());
|
|
provider.Add(L"buildNumber", getBuildNumberSync());
|
|
provider.Add(L"isTablet", isTabletSync());
|
|
provider.Add(L"appName", getAppNameSync());
|
|
provider.Add(L"brand", getBrandSync());
|
|
provider.Add(L"model", getModelSync());
|
|
provider.Add(L"deviceType", getDeviceTypeSync());
|
|
provider.Add(L"supportedAbis", getSupportedAbisSync());
|
|
}
|
|
|
|
bool isEmulatorHelper(std::string model)
|
|
{
|
|
return std::regex_match(model, std::regex(".*virtual.*", std::regex_constants::icase));
|
|
}
|
|
|
|
// What is a tablet is a debateable topic in Windows, as some windows devices can dynamically switch back and forth.
|
|
// Also, see isTabletMode() instead of isTablet or deviceType.
|
|
// More refinement should be applied into this area as neccesary.
|
|
bool isTabletHelper()
|
|
{
|
|
// AnalyticsInfo doesn't always return the values one might expect.
|
|
// DeviceForm potential but not inclusive results:
|
|
// [Mobile, Tablet, Television, Car, Watch, VirtualReality, Desktop, Unknown]
|
|
// DeviceFamily potential but not inclusive results:
|
|
// [Windows.Desktop, Windows.Mobile, Windows.Xbox, Windows.Holographic, Windows.Team, Windows.IoT]
|
|
auto deviceForm = winrt::Windows::System::Profile::AnalyticsInfo::DeviceForm();
|
|
auto deviceFamily = winrt::Windows::System::Profile::AnalyticsInfo::VersionInfo().DeviceFamily();
|
|
|
|
bool isTabletByAnalytics = deviceForm == L"Tablet" || deviceForm == L"Mobile" || deviceFamily == L"Windows.Mobile";
|
|
|
|
if (isTabletByAnalytics)
|
|
{
|
|
return true;
|
|
}
|
|
return false;
|
|
}
|
|
|
|
IAsyncOperation<bool> isPinOrFingerprint()
|
|
{
|
|
try
|
|
{
|
|
auto ucAvailability = co_await Windows::Security::Credentials::UI::UserConsentVerifier::CheckAvailabilityAsync();
|
|
return ucAvailability == Windows::Security::Credentials::UI::UserConsentVerifierAvailability::Available;
|
|
}
|
|
catch (...)
|
|
{
|
|
return false;
|
|
}
|
|
}
|
|
|
|
REACT_SYNC_METHOD(getSupportedAbisSync);
|
|
JSValueArray getSupportedAbisSync() noexcept
|
|
{
|
|
JSValueArray result = JSValueArray{};
|
|
winrt::Windows::System::ProcessorArchitecture architecture =
|
|
winrt::Windows::ApplicationModel::Package::Current().Id().Architecture();
|
|
std::string arch;
|
|
switch (architecture)
|
|
{
|
|
case Windows::System::ProcessorArchitecture::X86:
|
|
arch = "win_x86";
|
|
break;
|
|
case Windows::System::ProcessorArchitecture::Arm:
|
|
arch = "win_arm";
|
|
break;
|
|
case Windows::System::ProcessorArchitecture::X64:
|
|
arch = "win_x64";
|
|
break;
|
|
case Windows::System::ProcessorArchitecture::Neutral:
|
|
arch = "neutral";
|
|
break;
|
|
default:
|
|
arch = "unknown";
|
|
break;
|
|
}
|
|
result.push_back(arch);
|
|
return result;
|
|
}
|
|
|
|
REACT_METHOD(getSupportedAbis)
|
|
void getSupportedAbis(ReactPromise<JSValueArray> promise) noexcept
|
|
{
|
|
promise.Resolve(getSupportedAbisSync());
|
|
}
|
|
|
|
REACT_SYNC_METHOD(getDeviceTypeSync);
|
|
std::string getDeviceTypeSync() noexcept
|
|
{
|
|
if (isTabletHelper())
|
|
{
|
|
return "Tablet";
|
|
}
|
|
else if (winrt::Windows::System::Profile::AnalyticsInfo::VersionInfo().DeviceFamily() == L"Windows.Xbox")
|
|
{
|
|
return "GamingConsole";
|
|
}
|
|
else
|
|
{
|
|
return "Desktop";
|
|
}
|
|
}
|
|
|
|
REACT_METHOD(getDeviceType);
|
|
void getDeviceType(ReactPromise<std::string> promise) noexcept
|
|
{
|
|
promise.Resolve(getDeviceTypeSync());
|
|
}
|
|
|
|
REACT_SYNC_METHOD(isPinOrFingerprintSetSync);
|
|
bool isPinOrFingerprintSetSync() noexcept
|
|
{
|
|
return isPinOrFingerprint().get();
|
|
}
|
|
|
|
REACT_METHOD(isPinOrFingerprintSet);
|
|
void isPinOrFingerprintSet(ReactPromise<bool> promise) noexcept
|
|
{
|
|
auto async_op = isPinOrFingerprint();
|
|
async_op.Completed([promise](auto const& op, auto const&)
|
|
{
|
|
promise.Resolve(op.GetResults());
|
|
});
|
|
}
|
|
|
|
REACT_SYNC_METHOD(isKeyboardConnectedSync);
|
|
bool isKeyboardConnectedSync() noexcept
|
|
{
|
|
auto keyboardCapabilities = winrt::Windows::Devices::Input::KeyboardCapabilities();
|
|
return keyboardCapabilities.KeyboardPresent();
|
|
}
|
|
|
|
REACT_METHOD(isKeyboardConnected);
|
|
void isKeyboardConnected(ReactPromise<bool> promise) noexcept
|
|
{
|
|
promise.Resolve(isKeyboardConnectedSync());
|
|
}
|
|
|
|
REACT_SYNC_METHOD(isMouseConnectedSync);
|
|
bool isMouseConnectedSync() noexcept
|
|
{
|
|
auto mouseCapabilities = winrt::Windows::Devices::Input::MouseCapabilities();
|
|
return mouseCapabilities.MousePresent();
|
|
}
|
|
|
|
REACT_METHOD(isMouseConnected);
|
|
void isMouseConnected(ReactPromise<bool> promise) noexcept
|
|
{
|
|
promise.Resolve(isMouseConnectedSync());
|
|
}
|
|
|
|
REACT_METHOD(isTabletMode);
|
|
void isTabletMode(ReactPromise<bool> promise) noexcept
|
|
{
|
|
// NOTE: Should eventually add IsXamlIsland() relevant code when it's exposed through RNW's public API.
|
|
|
|
m_reactContext.UIDispatcher().Post([promise]() {
|
|
auto view = winrt::Windows::UI::ViewManagement::UIViewSettings::GetForCurrentView();
|
|
auto mode = view.UserInteractionMode();
|
|
switch(mode)
|
|
{
|
|
case winrt::Windows::UI::ViewManagement::UserInteractionMode::Touch:
|
|
{
|
|
promise.Resolve(true);
|
|
return;
|
|
}
|
|
case winrt::Windows::UI::ViewManagement::UserInteractionMode::Mouse:
|
|
default:
|
|
{
|
|
promise.Resolve(false);
|
|
}
|
|
} });
|
|
}
|
|
|
|
REACT_SYNC_METHOD(getIpAddressSync);
|
|
std::string getIpAddressSync() noexcept
|
|
{
|
|
auto icp = Windows::Networking::Connectivity::NetworkInformation::GetInternetConnectionProfile();
|
|
if (!icp || !icp.NetworkAdapter())
|
|
{
|
|
return "unknown";
|
|
}
|
|
else
|
|
{
|
|
auto hostnames = Windows::Networking::Connectivity::NetworkInformation::GetHostNames();
|
|
for (auto const& hostname : hostnames)
|
|
{
|
|
if (
|
|
hostname.Type() == Windows::Networking::HostNameType::Ipv4 &&
|
|
hostname.IPInformation() &&
|
|
hostname.IPInformation().NetworkAdapter() &&
|
|
hostname.IPInformation().NetworkAdapter().NetworkAdapterId() == icp.NetworkAdapter().NetworkAdapterId())
|
|
{
|
|
return winrt::to_string(hostname.CanonicalName());
|
|
}
|
|
}
|
|
return "unknown";
|
|
}
|
|
}
|
|
|
|
REACT_METHOD(getIpAddress);
|
|
void getIpAddress(ReactPromise<std::string> promise) noexcept
|
|
{
|
|
promise.Resolve(getIpAddressSync());
|
|
}
|
|
|
|
IAsyncOperation<bool> isCameraPresentTask()
|
|
{
|
|
Windows::Devices::Enumeration::DeviceInformationCollection devices =
|
|
co_await Windows::Devices::Enumeration::DeviceInformation::FindAllAsync(Windows::Devices::Enumeration::DeviceClass::VideoCapture);
|
|
|
|
return devices.Size() > 0;
|
|
}
|
|
|
|
REACT_SYNC_METHOD(isCameraPresentSync);
|
|
bool isCameraPresentSync() noexcept
|
|
{
|
|
return isCameraPresentTask().get();
|
|
}
|
|
|
|
REACT_METHOD(isCameraPresent);
|
|
void isCameraPresent(ReactPromise<bool> promise) noexcept
|
|
{
|
|
auto async_op = isCameraPresentTask();
|
|
async_op.Completed([promise](auto const& op, auto const&)
|
|
{
|
|
promise.Resolve(op.GetResults());
|
|
});
|
|
}
|
|
|
|
REACT_SYNC_METHOD(getBatteryLevelSync);
|
|
double getBatteryLevelSync() noexcept
|
|
{
|
|
auto aggBattery = Windows::Devices::Power::Battery::AggregateBattery();
|
|
auto report = aggBattery.GetReport();
|
|
if (report.FullChargeCapacityInMilliwattHours() == nullptr ||
|
|
report.RemainingCapacityInMilliwattHours() == nullptr)
|
|
{
|
|
return (double)-1;
|
|
}
|
|
else
|
|
{
|
|
auto max = report.FullChargeCapacityInMilliwattHours().GetDouble();
|
|
auto value = report.RemainingCapacityInMilliwattHours().GetDouble();
|
|
if (max <= 0)
|
|
{
|
|
return (double)-1;
|
|
}
|
|
else
|
|
{
|
|
auto result = value / max;
|
|
if (result <= 0.2)
|
|
{
|
|
m_reactContext.EmitJSEvent(L"RCTDeviceEventEmitter", L"RNDeviceInfo_batteryLevelIsLow", result);
|
|
}
|
|
return result;
|
|
}
|
|
}
|
|
}
|
|
|
|
REACT_METHOD(getBatteryLevel);
|
|
void getBatteryLevel(ReactPromise<double> promise) noexcept
|
|
{
|
|
promise.Resolve(getBatteryLevelSync());
|
|
}
|
|
|
|
REACT_SYNC_METHOD(getPowerStateSync);
|
|
JSValue getPowerStateSync() noexcept
|
|
{
|
|
JSValueObject result = JSValueObject{};
|
|
const std::string states[4] = { "not present", "discharging", "idle", "charging" };
|
|
auto aggBattery = Windows::Devices::Power::Battery::AggregateBattery();
|
|
auto report = aggBattery.GetReport();
|
|
if (report.FullChargeCapacityInMilliwattHours() != nullptr &&
|
|
report.RemainingCapacityInMilliwattHours() != nullptr)
|
|
{
|
|
auto max = report.FullChargeCapacityInMilliwattHours().GetDouble();
|
|
auto value = report.RemainingCapacityInMilliwattHours().GetDouble();
|
|
if (max <= 0)
|
|
{
|
|
result["batteryLevel"] = (double)-1;
|
|
}
|
|
else
|
|
{
|
|
result["batteryLevel"] = value / max;
|
|
}
|
|
result["batteryState"] = states[static_cast<int>(report.Status())];
|
|
result["lowPowerMode"] = (Windows::System::Power::PowerManager::EnergySaverStatus() == Windows::System::Power::EnergySaverStatus::On);
|
|
}
|
|
|
|
return result;
|
|
}
|
|
|
|
REACT_METHOD(getPowerState);
|
|
void getPowerState(ReactPromise<JSValue> promise) noexcept
|
|
{
|
|
promise.Resolve(getPowerStateSync());
|
|
}
|
|
|
|
REACT_SYNC_METHOD(isBatteryChargingSync);
|
|
bool isBatteryChargingSync() noexcept
|
|
{
|
|
auto aggBattery = Windows::Devices::Power::Battery::AggregateBattery();
|
|
auto report = aggBattery.GetReport();
|
|
return report.Status() == Windows::System::Power::BatteryStatus::Charging;
|
|
}
|
|
|
|
REACT_METHOD(isBatteryCharging);
|
|
void isBatteryCharging(ReactPromise<bool> promise) noexcept
|
|
{
|
|
promise.Resolve(isBatteryChargingSync());
|
|
}
|
|
|
|
REACT_SYNC_METHOD(getAppVersionSync);
|
|
std::string getAppVersionSync() noexcept
|
|
{
|
|
try
|
|
{
|
|
Windows::ApplicationModel::PackageVersion version = Windows::ApplicationModel::Package::Current().Id().Version();
|
|
|
|
std::ostringstream ostream;
|
|
ostream << version.Major << "." << version.Minor << "." << version.Build << "." << version.Revision;
|
|
return ostream.str();
|
|
} catch (...)
|
|
{
|
|
return "unknown";
|
|
}
|
|
}
|
|
|
|
REACT_METHOD(getAppVersion);
|
|
void getAppVersion(ReactPromise<std::string> promise) noexcept
|
|
{
|
|
promise.Resolve(getAppVersionSync());
|
|
}
|
|
|
|
REACT_SYNC_METHOD(getBuildNumberSync);
|
|
std::string getBuildNumberSync() noexcept
|
|
{
|
|
try
|
|
{
|
|
return std::to_string(Windows::ApplicationModel::Package::Current().Id().Version().Build);
|
|
} catch (...)
|
|
{
|
|
return "unknown";
|
|
}
|
|
}
|
|
REACT_METHOD(getBuildNumber);
|
|
void getBuildNumber(ReactPromise<std::string> promise) noexcept
|
|
{
|
|
promise.Resolve(getBuildNumberSync());
|
|
}
|
|
|
|
REACT_SYNC_METHOD(getBuildVersionSync);
|
|
std::string getBuildVersionSync() noexcept
|
|
{
|
|
return getBuildNumberSync();
|
|
}
|
|
|
|
REACT_METHOD(getBuildVersion);
|
|
void getBuildVersion(ReactPromise<std::string> promise) noexcept
|
|
{
|
|
promise.Resolve(getBuildVersionSync());
|
|
}
|
|
|
|
REACT_SYNC_METHOD(getInstallerPackageNameSync);
|
|
std::string getInstallerPackageNameSync() noexcept
|
|
{
|
|
try
|
|
{
|
|
return winrt::to_string(Windows::ApplicationModel::Package::Current().Id().Name());
|
|
} catch (...)
|
|
{
|
|
return "unknown";
|
|
}
|
|
}
|
|
REACT_METHOD(getInstallerPackageName);
|
|
void getInstallerPackageName(ReactPromise<std::string> promise) noexcept
|
|
{
|
|
promise.Resolve(getInstallerPackageNameSync());
|
|
}
|
|
|
|
REACT_SYNC_METHOD(getInstallReferrerSync);
|
|
std::string getInstallReferrerSync() noexcept
|
|
{
|
|
try
|
|
{
|
|
Windows::Services::Store::StoreContext context = Windows::Services::Store::StoreContext::GetDefault();
|
|
|
|
// Get campaign ID for users with a recognized Microsoft account.
|
|
Windows::Services::Store::StoreProductResult result = context.GetStoreProductForCurrentAppAsync().get();
|
|
if (result.Product() != nullptr)
|
|
{
|
|
for (auto sku : result.Product().Skus())
|
|
{
|
|
if (sku.IsInUserCollection())
|
|
{
|
|
return winrt::to_string(sku.CollectionData().CampaignId());
|
|
}
|
|
}
|
|
}
|
|
|
|
// Get campaing ID from the license data for users without a recognized Microsoft account.
|
|
Windows::Services::Store::StoreAppLicense license = context.GetAppLicenseAsync().get();
|
|
auto json = Windows::Data::Json::JsonObject::Parse(license.ExtendedJsonData());
|
|
if (json.HasKey(L"customPolicyField1"))
|
|
{
|
|
return winrt::to_string(json.GetNamedString(L"customPolicyField1", L"unknown"));
|
|
}
|
|
|
|
} catch (...)
|
|
{
|
|
}
|
|
return "unknown";
|
|
}
|
|
REACT_METHOD(getInstallReferrer);
|
|
void getInstallReferrer(ReactPromise<std::string> promise) noexcept
|
|
{
|
|
promise.Resolve(getInstallReferrerSync());
|
|
}
|
|
|
|
REACT_SYNC_METHOD(getMaxMemorySync);
|
|
uint64_t getMaxMemorySync() noexcept
|
|
{
|
|
return Windows::System::MemoryManager::AppMemoryUsageLimit();
|
|
}
|
|
|
|
REACT_METHOD(getMaxMemory);
|
|
void getMaxMemory(ReactPromise<uint64_t> promise) noexcept
|
|
{
|
|
promise.Resolve(getMaxMemorySync());
|
|
}
|
|
|
|
REACT_SYNC_METHOD(getUsedMemorySync);
|
|
uint64_t getUsedMemorySync() noexcept
|
|
{
|
|
return Windows::System::MemoryManager::AppMemoryUsage();
|
|
}
|
|
|
|
REACT_METHOD(getUsedMemory);
|
|
void getUsedMemory(ReactPromise<uint64_t> promise) noexcept
|
|
{
|
|
promise.Resolve(getUsedMemorySync());
|
|
}
|
|
|
|
REACT_SYNC_METHOD(getFirstInstallTimeSync);
|
|
int64_t getFirstInstallTimeSync() noexcept
|
|
{
|
|
auto installTime = Windows::ApplicationModel::Package::Current().InstalledDate().time_since_epoch();
|
|
return std::chrono::duration_cast<std::chrono::milliseconds>(installTime).count();
|
|
}
|
|
|
|
REACT_METHOD(getFirstInstallTime);
|
|
void getFirstInstallTime(ReactPromise<int64_t> promise) noexcept
|
|
{
|
|
promise.Resolve(getFirstInstallTimeSync());
|
|
}
|
|
|
|
REACT_SYNC_METHOD(getAppNameSync);
|
|
std::string getAppNameSync() noexcept
|
|
{
|
|
return winrt::to_string(Windows::ApplicationModel::Package::Current().DisplayName());
|
|
}
|
|
|
|
REACT_METHOD(getAppName);
|
|
void getAppName(ReactPromise<std::string> promise) noexcept
|
|
{
|
|
promise.Resolve(getAppNameSync());
|
|
}
|
|
|
|
REACT_SYNC_METHOD(getBundleIdSync);
|
|
std::string getBundleIdSync() noexcept
|
|
{
|
|
return winrt::to_string(Windows::ApplicationModel::Package::Current().Id().Name());
|
|
}
|
|
|
|
REACT_METHOD(getBundleId);
|
|
void getBundleId(ReactPromise<std::string> promise) noexcept
|
|
{
|
|
promise.Resolve(getBundleIdSync());
|
|
}
|
|
|
|
REACT_SYNC_METHOD(getDeviceNameSync);
|
|
std::string getDeviceNameSync() noexcept
|
|
{
|
|
try
|
|
{
|
|
return winrt::to_string(Windows::Security::ExchangeActiveSyncProvisioning::EasClientDeviceInformation().FriendlyName());
|
|
} catch (...)
|
|
{
|
|
return "unknown";
|
|
}
|
|
}
|
|
|
|
REACT_METHOD(getDeviceName);
|
|
void getDeviceName(ReactPromise<std::string> promise) noexcept
|
|
{
|
|
promise.Resolve(getDeviceNameSync());
|
|
}
|
|
|
|
REACT_SYNC_METHOD(getSystemVersionSync);
|
|
std::string getSystemVersionSync() noexcept
|
|
{
|
|
try
|
|
{
|
|
std::string deviceFamilyVersion = winrt::to_string(Windows::System::Profile::AnalyticsInfo::VersionInfo().DeviceFamilyVersion());
|
|
uint64_t version2 = std::stoull(deviceFamilyVersion);
|
|
uint64_t major = (version2 & 0xFFFF000000000000L) >> 48;
|
|
uint64_t minor = (version2 & 0x0000FFFF00000000L) >> 32;
|
|
std::ostringstream ostream;
|
|
ostream << major << "." << minor;
|
|
return ostream.str();
|
|
}
|
|
catch (...)
|
|
{
|
|
return "unknown";
|
|
}
|
|
}
|
|
|
|
REACT_METHOD(getSystemVersion);
|
|
void getSystemVersion(ReactPromise<std::string> promise) noexcept
|
|
{
|
|
promise.Resolve(getSystemVersionSync());
|
|
}
|
|
|
|
REACT_SYNC_METHOD(getBaseOsSync);
|
|
std::string getBaseOsSync() noexcept
|
|
{
|
|
try
|
|
{
|
|
std::string deviceFamilyVersion = winrt::to_string(Windows::System::Profile::AnalyticsInfo::VersionInfo().DeviceFamilyVersion());
|
|
uint64_t version2 = std::stoull(deviceFamilyVersion);
|
|
uint64_t major = (version2 & 0xFFFF000000000000L) >> 48;
|
|
uint64_t minor = (version2 & 0x0000FFFF00000000L) >> 32;
|
|
uint64_t build = (version2 & 0x00000000FFFF0000L) >> 16;
|
|
uint64_t revision = (version2 & 0x000000000000FFFFL);
|
|
std::ostringstream ostream;
|
|
ostream << major << "." << minor << "." << build << "." << revision;
|
|
return ostream.str();
|
|
}
|
|
catch (...)
|
|
{
|
|
return "unknown";
|
|
}
|
|
}
|
|
|
|
REACT_METHOD(getBaseOs);
|
|
void getBaseOs(ReactPromise<std::string> promise) noexcept
|
|
{
|
|
promise.Resolve(getBaseOsSync());
|
|
}
|
|
|
|
REACT_SYNC_METHOD(getBuildIdSync);
|
|
std::string getBuildIdSync() noexcept
|
|
{
|
|
try
|
|
{
|
|
std::string deviceFamilyVersion = winrt::to_string(Windows::System::Profile::AnalyticsInfo::VersionInfo().DeviceFamilyVersion());
|
|
uint64_t version2 = std::stoull(deviceFamilyVersion);
|
|
uint64_t build = (version2 & 0x00000000FFFF0000L) >> 16;
|
|
std::ostringstream ostream;
|
|
ostream << build;
|
|
return ostream.str();
|
|
}
|
|
catch (...)
|
|
{
|
|
return "unknown";
|
|
}
|
|
}
|
|
|
|
REACT_METHOD(getBuildId);
|
|
void getBuildId(ReactPromise<std::string> promise) noexcept
|
|
{
|
|
promise.Resolve(getBuildIdSync());
|
|
}
|
|
|
|
REACT_SYNC_METHOD(getModelSync);
|
|
std::string getModelSync() noexcept
|
|
{
|
|
try
|
|
{
|
|
return winrt::to_string(Windows::Security::ExchangeActiveSyncProvisioning::EasClientDeviceInformation().SystemProductName());
|
|
}
|
|
catch (...)
|
|
{
|
|
return "unknown";
|
|
}
|
|
}
|
|
|
|
REACT_METHOD(getModel);
|
|
void getModel(ReactPromise<std::string> promise) noexcept
|
|
{
|
|
promise.Resolve(getModelSync());
|
|
}
|
|
|
|
REACT_SYNC_METHOD(getBrandSync);
|
|
std::string getBrandSync() noexcept
|
|
{
|
|
return getModelSync();
|
|
}
|
|
|
|
REACT_METHOD(getBrand);
|
|
void getBrand(ReactPromise<std::string> promise) noexcept
|
|
{
|
|
promise.Resolve(getBrandSync());
|
|
}
|
|
|
|
REACT_SYNC_METHOD(isEmulatorSync);
|
|
bool isEmulatorSync() noexcept
|
|
{
|
|
try
|
|
{
|
|
auto deviceInfo = Windows::Security::ExchangeActiveSyncProvisioning::EasClientDeviceInformation();
|
|
return winrt::to_string(deviceInfo.SystemProductName()) == "Virtual";
|
|
} catch (...)
|
|
{
|
|
return false;
|
|
}
|
|
}
|
|
|
|
REACT_METHOD(isEmulator);
|
|
void isEmulator(ReactPromise<bool> promise) noexcept
|
|
{
|
|
promise.Resolve(isEmulatorSync());
|
|
}
|
|
|
|
REACT_SYNC_METHOD(getUniqueIdSync);
|
|
std::string getUniqueIdSync() noexcept
|
|
{
|
|
try
|
|
{
|
|
return winrt::to_string(winrt::to_hstring(Windows::Security::ExchangeActiveSyncProvisioning::EasClientDeviceInformation().Id()));
|
|
} catch (...)
|
|
{
|
|
return "unknown";
|
|
}
|
|
}
|
|
|
|
REACT_METHOD(getUniqueId);
|
|
void getUniqueId(ReactPromise<std::string> promise) noexcept
|
|
{
|
|
promise.Resolve(getUniqueIdSync());
|
|
}
|
|
|
|
REACT_SYNC_METHOD(getDeviceIdSync);
|
|
std::string getDeviceIdSync() noexcept
|
|
{
|
|
try
|
|
{
|
|
return winrt::to_string(Windows::Security::ExchangeActiveSyncProvisioning::EasClientDeviceInformation().SystemSku());
|
|
} catch (...)
|
|
{
|
|
return "unknown";
|
|
}
|
|
}
|
|
|
|
REACT_METHOD(getDeviceId);
|
|
void getDeviceId(ReactPromise<std::string> promise) noexcept
|
|
{
|
|
promise.Resolve(getDeviceIdSync());
|
|
}
|
|
|
|
REACT_SYNC_METHOD(getSerialNumberSync);
|
|
std::string getSerialNumberSync() noexcept
|
|
{
|
|
try
|
|
{
|
|
return winrt::to_string(Windows::System::Profile::SystemManufacturers::SmbiosInformation::SerialNumber().c_str());
|
|
}
|
|
catch (...)
|
|
{
|
|
return "unknown";
|
|
}
|
|
}
|
|
|
|
REACT_METHOD(getSerialNumber);
|
|
void getSerialNumber(ReactPromise<std::string> promise) noexcept
|
|
{
|
|
promise.Resolve(getSerialNumberSync());
|
|
}
|
|
|
|
REACT_SYNC_METHOD(getSystemManufacturerSync);
|
|
std::string getSystemManufacturerSync() noexcept
|
|
{
|
|
try
|
|
{
|
|
return winrt::to_string(Windows::Security::ExchangeActiveSyncProvisioning::EasClientDeviceInformation().SystemManufacturer());
|
|
} catch (...)
|
|
{
|
|
return "unknown";
|
|
}
|
|
}
|
|
|
|
REACT_METHOD(getSystemManufacturer);
|
|
void getSystemManufacturer(ReactPromise<std::string> promise) noexcept
|
|
{
|
|
promise.Resolve(getSystemManufacturerSync());
|
|
}
|
|
|
|
REACT_SYNC_METHOD(isTabletSync);
|
|
bool isTabletSync() noexcept
|
|
{
|
|
try
|
|
{
|
|
return isTabletHelper();
|
|
} catch (...)
|
|
{
|
|
return false;
|
|
}
|
|
}
|
|
|
|
REACT_METHOD(isTablet);
|
|
void isTablet(ReactPromise<bool> promise) noexcept
|
|
{
|
|
promise.Resolve(isTabletSync());
|
|
}
|
|
|
|
REACT_SYNC_METHOD(getTotalMemorySync);
|
|
int64_t getTotalMemorySync() noexcept
|
|
{
|
|
// Device memory is not available through winrt APIs.
|
|
return -1;
|
|
}
|
|
|
|
REACT_METHOD(getTotalMemory);
|
|
void getTotalMemory(ReactPromise<int64_t> promise) noexcept
|
|
{
|
|
promise.Resolve(getTotalMemorySync());
|
|
}
|
|
|
|
REACT_SYNC_METHOD(getFontScaleSync);
|
|
double getFontScaleSync() noexcept
|
|
{
|
|
Windows::UI::ViewManagement::UISettings uiSettings;
|
|
return uiSettings.TextScaleFactor();
|
|
}
|
|
|
|
REACT_METHOD(getFontScale);
|
|
void getFontScale(ReactPromise<double> promise) noexcept
|
|
{
|
|
promise.Resolve(getFontScaleSync());
|
|
}
|
|
|
|
IAsyncOperation<int64_t> getFreeDiskStorageTask()
|
|
{
|
|
try
|
|
{
|
|
auto localFolder = Windows::Storage::ApplicationData::Current().LocalFolder();
|
|
auto props = co_await localFolder.Properties().RetrievePropertiesAsync({ L"System.FreeSpace" });
|
|
return winrt::unbox_value<uint64_t>(props.Lookup(L"System.FreeSpace"));
|
|
} catch (...)
|
|
{
|
|
co_return -1;
|
|
}
|
|
}
|
|
|
|
REACT_SYNC_METHOD(getFreeDiskStorageSync);
|
|
int64_t getFreeDiskStorageSync() noexcept
|
|
{
|
|
return getFreeDiskStorageTask().get();
|
|
}
|
|
|
|
REACT_METHOD(getFreeDiskStorage);
|
|
void getFreeDiskStorage(ReactPromise<int64_t> promise) noexcept
|
|
{
|
|
auto async_op = getFreeDiskStorageTask();
|
|
async_op.Completed([promise](auto const& op, auto const&)
|
|
{
|
|
promise.Resolve(op.GetResults());
|
|
});
|
|
}
|
|
|
|
IAsyncOperation<int64_t> getTotalDiskCapacityTask()
|
|
{
|
|
try
|
|
{
|
|
auto localFolder = Windows::Storage::ApplicationData::Current().LocalFolder();
|
|
auto props = co_await localFolder.Properties().RetrievePropertiesAsync({ L"System.Capacity" });
|
|
return winrt::unbox_value<uint64_t>(props.Lookup(L"System.Capacity"));
|
|
} catch (...)
|
|
{
|
|
co_return -1;
|
|
}
|
|
}
|
|
|
|
REACT_SYNC_METHOD(getTotalDiskCapacitySync);
|
|
int64_t getTotalDiskCapacitySync() noexcept
|
|
{
|
|
return getTotalDiskCapacityTask().get();
|
|
}
|
|
|
|
REACT_METHOD(getTotalDiskCapacity);
|
|
void getTotalDiskCapacity(ReactPromise<int64_t> promise) noexcept
|
|
{
|
|
auto async_op = getTotalDiskCapacityTask();
|
|
async_op.Completed([promise](auto const& op, auto const&)
|
|
{
|
|
promise.Resolve(op.GetResults());
|
|
});
|
|
}
|
|
|
|
REACT_SYNC_METHOD(getHostSync);
|
|
std::string getHostSync() noexcept
|
|
{
|
|
try
|
|
{
|
|
return winrt::to_string(NetworkInformation::GetHostNames().GetAt(0).DisplayName());
|
|
}
|
|
catch (...)
|
|
{
|
|
return "unknown";
|
|
}
|
|
}
|
|
|
|
REACT_METHOD(getHost);
|
|
void getHost(ReactPromise<std::string> promise) noexcept
|
|
{
|
|
promise.Resolve(getHostSync());
|
|
}
|
|
|
|
REACT_SYNC_METHOD(getHostNamesSync);
|
|
JSValueArray getHostNamesSync() noexcept
|
|
{
|
|
JSValueArray result = JSValueArray{};
|
|
winrt::Windows::Foundation::Collections::IVectorView<HostName> hostNames = NetworkInformation::GetHostNames();
|
|
for (HostName hostName : hostNames)
|
|
{
|
|
result.push_back(winrt::to_string(hostName.DisplayName()));
|
|
}
|
|
|
|
return result;
|
|
}
|
|
|
|
REACT_METHOD(getHostNames)
|
|
void getHostNames(ReactPromise<JSValueArray> promise) noexcept
|
|
{
|
|
promise.Resolve(getHostNamesSync());
|
|
}
|
|
|
|
REACT_METHOD(addListener);
|
|
void addListener(std::string) noexcept
|
|
{
|
|
// Keep: Required for RN built in Event Emitter Calls.
|
|
}
|
|
|
|
REACT_METHOD(removeListeners);
|
|
void removeListeners(int64_t) noexcept
|
|
{
|
|
// Keep: Required for RN built in Event Emitter Calls.
|
|
}
|
|
|
|
void OnEnergySaverStatusChanged()
|
|
{
|
|
m_reactContext.EmitJSEvent(L"RCTDeviceEventEmitter", L"RNDeviceInfo_powerStateDidChange", getPowerStateSync());
|
|
}
|
|
void OnBatteryReportUpdated()
|
|
{
|
|
m_reactContext.EmitJSEvent(L"RCTDeviceEventEmitter", L"RNDeviceInfo_batteryLevelDidChange", getBatteryLevelSync());
|
|
}
|
|
};
|
|
|
|
}
|