using UnityEngine; using UnityEngine.Android; using com.tencent.timpush.unity; using com.tencent.timpush.unity.interfaces; using System.Collections; using System.Collections.Generic; using System.Runtime.InteropServices; using System.Text; using System.Threading.Tasks; using System.IO; using System.Linq; using System; using System.Threading; namespace com.tencent.timpush.unity.platforms { public class AndroidPushManager : IPushManager { private static SynchronizationContext _mainSyncContext = SynchronizationContext.Current; private static AndroidJavaClass _timPushManagerClass = new AndroidJavaClass("com.tencent.qcloud.tim.push.TIMPushManager"); private static AndroidJavaObject _timPushManagerInstance = _timPushManagerClass.CallStatic("getInstance"); private static AndroidJavaClass _nativePushCallbackClass = new AndroidJavaClass("com.tencent.qcloud.tim.push.unity.UnityPushCallback"); private static AndroidJavaClass _nativePushListenerClass = new AndroidJavaClass("com.tencent.qcloud.tim.push.unity.UnityPushListener"); private static AndroidJavaClass _unityPlayer = new AndroidJavaClass("com.unity3d.player.UnityPlayer"); public void RegisterPush(int sdkAppId, string appKey, PushCallback callback) { CallExperimentalAPI("setPushConfig", "{\"runningPlatform\":7}", new PushCallback()); AndroidJavaObject activity = _unityPlayer.GetStatic("currentActivity"); Java2CSharpCallback pushCallback = new Java2CSharpCallback( callback.onSuccess, callback.onError ); AndroidJavaObject callbackObject = _nativePushCallbackClass.CallStatic("createPushCallback", pushCallback); _timPushManagerInstance.Call( "registerPush", activity, sdkAppId, appKey, callbackObject ); } public void UnRegisterPush(PushCallback callback) { Java2CSharpCallback pushCallback = new Java2CSharpCallback( callback.onSuccess, callback.onError ); AndroidJavaObject callbackObject = _nativePushCallbackClass.CallStatic("createPushCallback", pushCallback); _timPushManagerInstance.Call( "unRegisterPush", callbackObject ); } public void SetRegistrationID(string registrationID, PushCallback callback) { Java2CSharpCallback pushCallback = new Java2CSharpCallback( callback.onSuccess, callback.onError ); AndroidJavaObject callbackObject = _nativePushCallbackClass.CallStatic("createPushCallback", pushCallback); _timPushManagerInstance.Call( "setRegistrationID", registrationID, callbackObject ); } public void GetRegistrationID(PushCallback callback) { Java2CSharpCallback pushCallback = new Java2CSharpCallback( callback.onSuccess, callback.onError ); AndroidJavaObject callbackObject = _nativePushCallbackClass.CallStatic("createPushCallback", pushCallback); _timPushManagerInstance.Call( "getRegistrationID", callbackObject ); } public void AddPushListener(PushListener listener) { Java2CSharpListenerHelper listenerHelper = new Java2CSharpListenerHelper( listener.onRecvPushMessage, listener.onRevokePushMessage, listener.onNotificationClicked ); AndroidJavaObject listenerObject = _nativePushListenerClass.CallStatic("createPushListener", listenerHelper); listener.SetListenerObject(listenerObject); _timPushManagerInstance.Call( "addPushListener", listenerObject ); } public void RemovePushListener(PushListener listener) { AndroidJavaObject listenerObject = listener.GetListenerObject(); if (listenerObject == null) { Debug.LogError("listenerObject is null"); return; } _timPushManagerInstance.Call( "removePushListener", listenerObject ); } public void ForceUseFCMPushChannel(bool enable) { _timPushManagerInstance.Call( "forceUseFCMPushChannel", enable ); } public void DisablePostNotificationInForeground(bool disable) { _timPushManagerInstance.Call( "disablePostNotificationInForeground", disable ); } public void CallExperimentalAPI(string api, object param, PushCallback callback) { Java2CSharpCallback pushCallback = new Java2CSharpCallback( callback.onSuccess, callback.onError ); AndroidJavaObject callbackObject = _nativePushCallbackClass.CallStatic("createPushCallback", pushCallback); _timPushManagerInstance.Call( "callExperimentalAPI", api, param, callbackObject ); } public class Java2CSharpCallback : AndroidJavaProxy { public Action onSuccessDelegate; public Action onErrorDelegate; public Java2CSharpCallback(Action onSuccess, Action onError) : base("com.tencent.qcloud.tim.push.unity.UnityPushCallback$IJava2CSharpCallback") { this.onSuccessDelegate = onSuccess; this.onErrorDelegate = onError; } public void onSuccess(object data) { _mainSyncContext.Post(_ => { this.onSuccessDelegate?.Invoke(data); }, null); } public void onError(int errCode, string errMsg, object data) { _mainSyncContext.Post(_ => { this.onErrorDelegate?.Invoke(errCode, errMsg, data); }, null); } } public class Java2CSharpListenerHelper : AndroidJavaProxy { public Action onRecvPushMessageDelegate; public Action onRevokePushMessageDelegate; public Action onNotificationClickedDelegate; public Java2CSharpListenerHelper(Action onRecvPushMessage, Action onRevokePushMessage, Action onNotificationClicked) : base("com.tencent.qcloud.tim.push.unity.UnityPushListener$IJava2CSharpListener") { this.onRecvPushMessageDelegate = onRecvPushMessage; this.onRevokePushMessageDelegate = onRevokePushMessage; this.onNotificationClickedDelegate = onNotificationClicked; } public void onRecvPushMessage(AndroidJavaObject data) { _mainSyncContext.Post(_ => { this.onRecvPushMessageDelegate?.Invoke(new PushMessage(data)); }, null); } public void onRevokePushMessage(string messageID) { _mainSyncContext.Post(_ => { this.onRevokePushMessageDelegate?.Invoke(messageID); }, null); } public void onNotificationClicked(string ext) { _mainSyncContext.Post(_ => { this.onNotificationClickedDelegate?.Invoke(ext); }, null); } } } }