2026-01-23 10:13:53 +08:00

178 lines
7.4 KiB
C#

using Java.Lang;
using Com.Lvcheng.Lock.Shared.Nfc.Example.Java;
using NFCLockDemoV2.ViewModels;
using Android.Util;
using Exception = System.Exception;
using Microsoft.Maui.ApplicationModel;
namespace NFCLockDemoV2.Platforms.Android
{
public class NFCCallbacks : Java.Lang.Object, INFCCallbacks
{
private readonly MainViewModel mainViewModel;
private ViewModels.OperationType? operation => mainViewModel.Operation;
public NFCCallbacks(MainViewModel mainViewModel)
{
this.mainViewModel = mainViewModel;
}
public void OnFinished()
{
MainThread.BeginInvokeOnMainThread(() =>
{
mainViewModel.DeviceId = "--";
mainViewModel.DeviceRssi = "--";
mainViewModel.DeviceStatus = "NFC操作完成";
mainViewModel.Operation = null;
mainViewModel.ArcProgress = 0;
});
}
public Java.Lang.Boolean? OnLoop(DeviceManagerWrapper? wrapper, Long? id, Java.Lang.Boolean? isNew, Integer? rssi)
{
try
{
// 在主线程上更新UI
MainThread.BeginInvokeOnMainThread(() =>
{
// 更新设备信息
mainViewModel.DeviceId = id?.ToString() ?? "--";
mainViewModel.DeviceRssi = rssi?.ToString() ?? "--";
});
string password = mainViewModel.Password;
// 开关锁需要先充电
if (operation == ViewModels.OperationType.LOCK || operation == ViewModels.OperationType.UNLOCK)
{
while (true)
{
Com.Lvcheng.Lock.Shared.Nfc.Result result = wrapper.GetChargeLevel(password);
if (result == Com.Lvcheng.Lock.Shared.Nfc.Result.Ok)
{
Integer? level = wrapper.MGetChargeLevel();
string levelText = level?.ToString() ?? "0";
// 在主线程上更新UI
MainThread.BeginInvokeOnMainThread(() =>
{
mainViewModel.UpdateMessage("充电中(" + levelText + "%)");
// 更新进度条
if (level != null)
{
mainViewModel.ArcProgress = level.IntValue();
}
});
if (level != null && level.IntValue() >= 100)
{
break;
}
}
else if (result == Com.Lvcheng.Lock.Shared.Nfc.Result.Unauthorized)
{
MainThread.BeginInvokeOnMainThread(() =>
{
mainViewModel.UpdateMessage("验证失败");
});
// 返回 false 手动结束 NFC 连接
return new Java.Lang.Boolean(false);
}
else
{
MainThread.BeginInvokeOnMainThread(() =>
{
mainViewModel.UpdateMessage("充电失败");
});
return new Java.Lang.Boolean(false);
}
// 添加短暂延迟以避免过度频繁的循环
System.Threading.Thread.Sleep(100);
}
}
if (operation != null)
{
switch (operation)
{
case ViewModels.OperationType.UNLOCK:
if (wrapper.Control(password, false) == Com.Lvcheng.Lock.Shared.Nfc.Result.Ok)
{
MainThread.BeginInvokeOnMainThread(() =>
{
mainViewModel.UpdateMessage("开锁成功");
});
}
else
{
MainThread.BeginInvokeOnMainThread(() =>
{
mainViewModel.UpdateMessage("开锁失败");
});
}
return new Java.Lang.Boolean(false);
case ViewModels.OperationType.LOCK:
if (wrapper.Control(password, true) == Com.Lvcheng.Lock.Shared.Nfc.Result.Ok)
{
MainThread.BeginInvokeOnMainThread(() =>
{
mainViewModel.UpdateMessage("关锁成功");
});
}
else
{
MainThread.BeginInvokeOnMainThread(() =>
{
mainViewModel.UpdateMessage("关锁失败");
});
}
return new Java.Lang.Boolean(false);
case ViewModels.OperationType.SET_PASSWORD:
if (wrapper.SetKey(password, "") == Com.Lvcheng.Lock.Shared.Nfc.Result.Ok)
{
MainThread.BeginInvokeOnMainThread(() =>
{
mainViewModel.UpdateMessage("设置密码成功");
});
}
else
{
MainThread.BeginInvokeOnMainThread(() =>
{
mainViewModel.UpdateMessage("设置密码失败");
});
}
return new Java.Lang.Boolean(false);
}
}
return new Java.Lang.Boolean(true);
}
catch (Exception ex)
{
Log.Error("NFCCallbacks", "Error in OnLoop: " + ex.Message);
MainThread.BeginInvokeOnMainThread(() =>
{
mainViewModel.UpdateMessage("操作异常: " + ex.Message);
});
return new Java.Lang.Boolean(false);
}
}
public void OnLost()
{
MainThread.BeginInvokeOnMainThread(() =>
{
mainViewModel.DeviceId = "--";
mainViewModel.DeviceRssi = "--";
mainViewModel.DeviceStatus = "设备连接断开";
mainViewModel.Operation = null;
mainViewModel.ArcProgress = 0;
});
}
}
}