diff --git a/lib/utils/iap/windows_iap_service.dart b/lib/utils/iap/windows_iap_service.dart index 14f0f1d..13193f6 100644 --- a/lib/utils/iap/windows_iap_service.dart +++ b/lib/utils/iap/windows_iap_service.dart @@ -60,8 +60,13 @@ class WindowsIAPService { } final trial = await _windowsIapPlugin.getTrialStatusAndRemainingDays(); core.connection.signalNotification(LogNotification('Trial status: $trial')); - trialDaysRemaining = trial.remainingDays; - if (trial.isActive && !trial.isTrial && trial.remainingDays <= 0) { + final trialEndDate = trial.remainingDays; + if (trial.isTrial && trialEndDate.isNotEmpty && !trialEndDate.contains("?")) { + trialDaysRemaining = DateTime.parse(trialEndDate).difference(DateTime.now()).inDays; + } else { + trialDaysRemaining = 0; + } + if (trial.isActive && !trial.isTrial && trialDaysRemaining <= 0) { IAPManager.instance.isPurchased.value = true; await _prefs.write(key: _purchaseStatusKey, value: "true"); } else { diff --git a/windows_iap/lib/models/trial.dart b/windows_iap/lib/models/trial.dart index 6e2d1a7..7d0cc24 100644 --- a/windows_iap/lib/models/trial.dart +++ b/windows_iap/lib/models/trial.dart @@ -1,6 +1,6 @@ class Trial { final bool isTrial; - final int remainingDays; + final String remainingDays; final bool isActive; final bool isTrialOwnedByThisUser; diff --git a/windows_iap/lib/windows_iap_method_channel.dart b/windows_iap/lib/windows_iap_method_channel.dart index fc0b60a..e7c63f4 100644 --- a/windows_iap/lib/windows_iap_method_channel.dart +++ b/windows_iap/lib/windows_iap_method_channel.dart @@ -112,7 +112,8 @@ class MethodChannelWindowsIap extends WindowsIapPlatform { isActive: result?['isActive'] as bool? ?? false, isTrialOwnedByThisUser: result?['isTrialOwnedByThisUser'] as bool? ?? false, - remainingDays: result?['remainingDays'] as int? ?? 0, + remainingDays: result?['remainingDays'] as String? ?? + DateTime.now().add(Duration(days: 7)).toString(), ); } diff --git a/windows_iap/windows/windows_iap_plugin.cpp b/windows_iap/windows/windows_iap_plugin.cpp index fb69a69..6d2c05f 100644 --- a/windows_iap/windows/windows_iap_plugin.cpp +++ b/windows_iap/windows/windows_iap_plugin.cpp @@ -15,6 +15,8 @@ #include #include +#include +#include #include #include #include @@ -267,7 +269,7 @@ namespace windows_iap flutter::EncodableMap result; result[flutter::EncodableValue("isTrial")] = flutter::EncodableValue(true); - result[flutter::EncodableValue("remainingDays")] = flutter::EncodableValue(0); + result[flutter::EncodableValue("remainingDays")] = flutter::EncodableValue(""); result[flutter::EncodableValue("isActive")] = flutter::EncodableValue(license.IsActive()); result[flutter::EncodableValue("isTrialOwnedByThisUser")] = flutter::EncodableValue(license.IsTrialOwnedByThisUser()); @@ -282,10 +284,24 @@ namespace windows_iap { result[flutter::EncodableValue("isTrial")] = flutter::EncodableValue(true); - winrt::Windows::Foundation::TimeSpan expiration = license.TrialTimeRemaining(); - const auto inDays = std::chrono::duration_cast(expiration).count() / 24.0; + auto expirationDate = license.ExpirationDate(); + + // dt is your winrt::Windows::Foundation::DateTime + std::time_t t = winrt::clock::to_time_t(expirationDate); // Convert to time_t (UTC seconds since 1970) + std::tm tm_buf; + localtime_s(&tm_buf, &t); // Safe version + + std::wstringstream wss; + wss << std::put_time(&tm_buf, L"%Y-%m-%d %H:%M:%S"); // Custom format + + winrt::hstring readable = winrt::hstring{ wss.str() }; + std::string utf8 = winrt::to_string(readable); // Converts hstring to UTF-8 std::string + + result[flutter::EncodableValue("remainingDays")] = flutter::EncodableValue(utf8); + } + else { + result[flutter::EncodableValue("isTrial")] = flutter::EncodableValue(false); - result[flutter::EncodableValue("remainingDays")] = flutter::EncodableValue(inDays); } resultCallback->Success(flutter::EncodableValue(result));