package funkin.mobile.util; #if ios import funkin.external.apple.FNFCUtil as NativeFNFCUtil; #end #if android import funkin.external.android.JNIUtil; import funkin.external.android.CallbackUtil; #end import lime.system.System; import flixel.util.FlxSignal; /** * A class for handling the flow of loading FNFC song packs on mobile. */ class FNFCUtil { public static var onFNFCOpen:FlxTypedSignalVoid>; public static function init():Void { onFNFCOpen = new FlxTypedSignalVoid>(); #if ios FlxG.stage.window.onDropFile.add(function(_) { final url = queryFNFC(); if (url != null) getFNFCFromURL(url); }); #elseif android CallbackUtil.onFNFCOpen.add(onFNFCOpen.dispatch); #end } public static function queryFNFC():Null { #if ios final fileURL:Null = System.getHint("IOS_UIApplicationLaunchOptionsURLKey"); if (fileURL != null && fileURL.length > 0) getFNFCFromURL(fileURL); #elseif android final staticField = JNIUtil.createStaticField('funkin/extensions/FNFCExtension', 'lastFNFC', 'Ljava/lang/String;'); if (staticField != null) return staticField.get(); #end return null; } #if ios @:noCompletion private static var _lastFNFC:Null = null; @:noCompletion private static function getFNFCFromURL(url:String):Void { var cURL:cpp.ConstCharStar = cast url; NativeFNFCUtil.copyFNFCIntoCache(cURL, cpp.Callable.fromStaticFunction(fnfcCallback)); } @:noCompletion private static function fnfcCallback(cEvent:cpp.ConstCharStar, cValue:cpp.ConstCharStar) { var event:String = cast cEvent; var value:String = cast cValue; if (event != null && value != null) { trace('[$event] $value'); switch (event) { case "FNFC_RESULTS": onFNFCOpen.dispatch(value); default: } } } #end }