attempt to fix remaining trial days calculation

This commit is contained in:
jonas.bark@gmx.de
2025-12-21 15:42:17 +01:00
parent 102f4a8818
commit c84c685a8f
4 changed files with 30 additions and 8 deletions

View File

@@ -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 {

View File

@@ -1,6 +1,6 @@
class Trial {
final bool isTrial;
final int remainingDays;
final String remainingDays;
final bool isActive;
final bool isTrialOwnedByThisUser;

View File

@@ -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(),
);
}

View File

@@ -15,6 +15,8 @@
#include <winrt/Windows.Foundation.Collections.h>
#include <shobjidl.h>
#include <chrono>
#include <iomanip>
#include <flutter/event_sink.h>
#include <flutter/event_channel.h>
#include <flutter/event_stream_handler.h>
@@ -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<std::chrono::hours>(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));