178 lines
7.4 KiB
C#
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;
|
|
});
|
|
}
|
|
}
|
|
} |