using asap.core; using cfg; using EnhancedUI.EnhancedScroller; using GameCore; using System; using System.Collections.Generic; using System.Threading.Tasks; using TMPro; using UnityEngine; using UnityEngine.UI; using UnityNative.Sharing; namespace game { public class FishingFriendAddPanel : BasePanel, IEnhancedScrollerDelegate { #region 分享 Button btn_invite; GameObject icon_gift_invite; #endregion GameObject empty; GameObject loading; Button btn_add; // 好友码相关 TMP_Text text_code; Button btn_copy; Button btn_share; // ScrollView相关 EnhancedScroller scroller; public FriendInvitedItemTitleBar invitedItemTitleBar; public FriendInvitedItem invitedItem; public FriendRecommendedItemTitleBar recommendedItemTitleBar; public FriendRecommendedItem recommendedItem; List m_DataList = new List(); List m_InvitedDataList = new List(); FriendRecommendedListData m_RecommendedListData; int m_PageNo = 0; #region 后台网络处理 private List m_BackendOperationList = new List(); #endregion private IUnityNativeSharing adapter; #region 主页处理 / 空白搜索处理 private async Task InitDefault() { m_DataList.Clear(); m_InvitedDataList.Clear(); if (m_RecommendedListData != null && m_RecommendedListData.RecommendedList != null) { m_RecommendedListData.RecommendedList.Clear(); } if (IsExpire()) { // 获取HomePage数据 string json = await GContext.container.Resolve().GetHomePage(GContext.container.Resolve().UserId, m_PageNo); bool flag = true; if (string.IsNullOrEmpty(json)) { flag = false; } GetHomePageResp getHomePageResp = null; if (flag == true) { try { getHomePageResp = Newtonsoft.Json.JsonConvert.DeserializeObject(json); } catch (Exception ex) { GameDebug.LogError("FishingFriendAddPanel deserialize [GetHomePageResp] data has failed. Exception: " + ex.ToString()); flag = false; } } m_DataList.Clear(); if (flag == false) { scroller.gameObject.SetActive(false); empty.SetActive(true); return; } if (getHomePageResp.Code > 0) { List list = new List(); if (getHomePageResp.Friends != null) { foreach (var item in getHomePageResp.Friends) { if (!string.IsNullOrEmpty(item)) { BFriendInfo info = Newtonsoft.Json.JsonConvert.DeserializeObject(item); FriendHelper.FixBFriendInfoData(info); list.Add(info); } } } if (list.Count > 0) { // InvitedItem TitleBar Data var invitedTitleBarData = new FriendAddItemData() { Type = FriendHelper.Friend_Add_Item_Type_Invited_TitleBar, FriendInfo = null, Extra = 0 }; m_InvitedDataList.Add(invitedTitleBarData); m_DataList.Add(invitedTitleBarData); // InvitedItem Data foreach (var item in list) { var invitedItemData = new FriendAddItemData() { Type = FriendHelper.Friend_Add_Item_Type_Invited_Item, FriendInfo = item, Extra = 0 }; m_DataList.Add(invitedItemData); m_InvitedDataList.Add(invitedItemData); } } if (getHomePageResp.RecommendedList != null && getHomePageResp.RecommendedList.Length > 0) { if (m_RecommendedListData != null && m_RecommendedListData.RecommendedList != null) { m_RecommendedListData.RecommendedList.Clear(); } m_RecommendedListData = new FriendRecommendedListData(); m_RecommendedListData.RecommendedList = new List(); m_RecommendedListData.ExpirationDate = DateTime.Now.AddDays(3); // RecommendedItem TitleBar Data var recommendedTitleBarData = new FriendAddItemData() { Type = FriendHelper.Friend_Add_Item_Type_Recommended_TitleBar, FriendInfo = null, Extra = 0 }; m_RecommendedListData.RecommendedList.Add(recommendedTitleBarData); m_DataList.Add(recommendedTitleBarData); // RecommendedItem Data foreach (var item in getHomePageResp.RecommendedList) { var recommendedItemData = new FriendAddItemData() { Type = FriendHelper.Friend_Add_Item_Type_Recommended_Item, FriendInfo = item, Extra = 0 }; m_RecommendedListData.RecommendedList.Add(recommendedItemData); m_DataList.Add(recommendedItemData); } SyncRecommendedListData(); } } if (m_DataList.Count > 0) { scroller.gameObject.SetActive(true); empty.SetActive(false); scroller.ReloadData(); } else { scroller.gameObject.SetActive(false); empty.SetActive(true); } } else { // 获取邀请列表数据,再合并推荐列表数据 string json = await GContext.container.Resolve().GetInvitedList(); bool flag = true; if (string.IsNullOrEmpty(json)) { flag = false; } GetInvitedListResp getInvitedListResp = null; if (flag == true) { try { getInvitedListResp = Newtonsoft.Json.JsonConvert.DeserializeObject(json); } catch (Exception ex) { GameDebug.LogError("FishingFriendAddPanel deserialize [GetInvitedListResp] data has failed. Exception: " + ex.ToString()); flag = false; } } m_DataList.Clear(); if (flag == false) { scroller.gameObject.SetActive(false); empty.SetActive(true); return; } if (getInvitedListResp.Code > 0) { List list = new List(); if (getInvitedListResp.Friends != null) { foreach (var item in getInvitedListResp.Friends) { if (!string.IsNullOrEmpty(item)) { BFriendInfo info = Newtonsoft.Json.JsonConvert.DeserializeObject(item); FriendHelper.FixBFriendInfoData(info); list.Add(info); } } } if (list.Count > 0) { // InvitedItem TitleBar Data var invitedTitleBarData = new FriendAddItemData() { Type = FriendHelper.Friend_Add_Item_Type_Invited_TitleBar, FriendInfo = null, Extra = 0 }; m_InvitedDataList.Add(invitedTitleBarData); m_DataList.Add(invitedTitleBarData); // InvitedItem Data foreach (var item in list) { var invitedItemData = new FriendAddItemData() { Type = FriendHelper.Friend_Add_Item_Type_Invited_Item, FriendInfo = item, Extra = 0 }; m_InvitedDataList.Add(invitedItemData); m_DataList.Add(invitedItemData); } } if (m_RecommendedListData != null && m_RecommendedListData.RecommendedList != null) { m_DataList.AddRange(m_RecommendedListData.RecommendedList.ToArray()); } } if (m_DataList.Count > 0) { scroller.gameObject.SetActive(true); scroller.ReloadData(); empty.SetActive(false); } else { scroller.gameObject.SetActive(false); empty.SetActive(true); } } } public bool IsExpire() { if (PlayerPrefs.HasKey(FriendHelper.FriendRecommendedListDataKey) == false) return true; string data = PlayerPrefs.GetString(FriendHelper.FriendRecommendedListDataKey); if (string.IsNullOrEmpty(data)) return true; m_RecommendedListData = Newtonsoft.Json.JsonConvert.DeserializeObject(data); if (m_RecommendedListData == null) return true; if (DateTime.Now < m_RecommendedListData.ExpirationDate) return false; return true; } public void SyncRecommendedListData() { lock (m_RecommendedListData) { if (m_RecommendedListData == null) { if (PlayerPrefs.HasKey(FriendHelper.FriendRecommendedListDataKey)) { PlayerPrefs.DeleteKey(FriendHelper.FriendRecommendedListDataKey); } return; } PlayerPrefs.SetString(FriendHelper.FriendRecommendedListDataKey, Newtonsoft.Json.JsonConvert.SerializeObject(m_RecommendedListData)); } } #endregion #region 数据相关 List m_RecommendedBackendOperationList = new List(); public void StartRecommendedInvite(FriendAddItemData data) { var backendOperation = new FriendAddPanelBackendOperation(); m_RecommendedBackendOperationList.Add(backendOperation); backendOperation.StartRecommendedInvite(this, data, ResumeRecommendedData); RemoveRecommendedData(data); } public void ResumeRecommendedData(FriendAddItemData data) { if (data == null) return; if (m_RecommendedBackendOperationList == null || m_RecommendedBackendOperationList.Count < 1) return; bool flag = false; int count = m_RecommendedBackendOperationList.Count; for (int i = count - 1; i >= 0; --i) { var item = m_RecommendedBackendOperationList[i]; if (item != null && item.Data != null && item.Data.EqualsPlayFabId(data)) { flag = true; m_RecommendedBackendOperationList.RemoveAt(i); break; } } if (!flag) return; if (m_RecommendedListData == null || m_RecommendedListData.RecommendedList == null) return; m_RecommendedListData.RecommendedList.Add(data); CombineData(); RedPointManager.Instance.SetRedPointState(RedPointName.Home_Friend_Add, m_InvitedDataList.Count > 0); } public void RemoveRecommendedData(FriendAddItemData data) { if (m_RecommendedListData == null || m_RecommendedListData.RecommendedList == null) return; lock (m_RecommendedListData.RecommendedList) { for (int i = m_InvitedDataList.Count - 1; i >= 0; --i) { var tmpData = m_InvitedDataList[i]; if (tmpData.EqualsPlayFabId(data)) { m_InvitedDataList.RemoveAt(i); } } for (int i = m_RecommendedListData.RecommendedList.Count - 1; i >= 0; --i) { var tmpData = m_RecommendedListData.RecommendedList[i]; if (tmpData.EqualsPlayFabId(data)) { m_RecommendedListData.RecommendedList.RemoveAt(i); } } if (m_InvitedDataList.Count <= 1) { for (int i = m_InvitedDataList.Count - 1; i >= 0; --i) { var tmpData = m_InvitedDataList[i]; if (tmpData.Type == FriendHelper.Friend_Add_Item_Type_Invited_TitleBar) { m_InvitedDataList.RemoveAt(i); } } } if (m_RecommendedListData.RecommendedList.Count <= 1) { for (int i = m_RecommendedListData.RecommendedList.Count - 1; i >= 0; --i) { var tmpData = m_RecommendedListData.RecommendedList[i]; if (tmpData.Type == FriendHelper.Friend_Add_Item_Type_Recommended_TitleBar) { m_RecommendedListData.RecommendedList.RemoveAt(i); } } } } SyncRecommendedListData(); CombineData(); RedPointManager.Instance.SetRedPointState(RedPointName.Home_Friend_Add, m_InvitedDataList.Count > 0); } List m_InvitedBackendOperationList = new List(); public void StartInvitedAccept(FriendAddItemData data) { var backendOperation = new FriendAddPanelBackendOperation(); m_InvitedBackendOperationList.Add(backendOperation); backendOperation.StartInvitedAccept(this, data, ResumeInvitedData); RemoveInvitedData(data); } public void StartInvitedIgnore(FriendAddItemData data) { var backendOperation = new FriendAddPanelBackendOperation(); m_RecommendedBackendOperationList.Add(backendOperation); backendOperation.StartInvitedIgnore(this, data, ResumeInvitedData); RemoveInvitedData(data); } public void ResumeInvitedData(FriendAddItemData data) { if (data == null) return; if (m_InvitedBackendOperationList == null || m_InvitedBackendOperationList.Count < 1) return; bool flag = false; int count = m_InvitedBackendOperationList.Count; for (int i = count - 1; i >= 0; --i) { var item = m_InvitedBackendOperationList[i]; if (item != null && item.Data != null && item.Data.EqualsPlayFabId(data)) { flag = true; m_InvitedBackendOperationList.RemoveAt(i); break; } } if (!flag) return; if (m_InvitedDataList == null) return; m_InvitedDataList.Add(data); CombineData(); RedPointManager.Instance.SetRedPointState(RedPointName.Home_Friend_Add, m_InvitedDataList.Count > 0); } public void RemoveInvitedData(FriendAddItemData data) { if (m_InvitedDataList == null) return; lock (m_InvitedDataList) { for (int i = m_InvitedDataList.Count - 1; i >= 0; --i) { var tmpData = m_InvitedDataList[i]; if (tmpData.EqualsPlayFabId(data)) { m_InvitedDataList.RemoveAt(i); } } for (int i = m_RecommendedListData.RecommendedList.Count - 1; i >= 0; --i) { var tmpData = m_RecommendedListData.RecommendedList[i]; if (tmpData.EqualsPlayFabId(data)) { m_RecommendedListData.RecommendedList.RemoveAt(i); } } if (m_InvitedDataList.Count <= 1) { m_InvitedDataList.Clear(); } if (m_RecommendedListData.RecommendedList.Count <= 1) { m_RecommendedListData.RecommendedList.Clear(); } } CombineData(); GContext.container.Resolve().GetInvitedListCount(); RedPointManager.Instance.SetRedPointState(RedPointName.Home_Friend_Add, m_InvitedDataList.Count > 0); } public void CombineData() { lock (m_DataList) { m_DataList.Clear(); if (m_InvitedDataList != null && m_InvitedDataList.Count > 1) { m_DataList.AddRange(m_InvitedDataList.ToArray()); } if (m_RecommendedListData != null && m_RecommendedListData.RecommendedList != null && m_RecommendedListData.RecommendedList.Count > 1) { m_DataList.AddRange(m_RecommendedListData.RecommendedList.ToArray()); } } if (m_DataList.Count > 0) { scroller.gameObject.SetActive(true); empty.SetActive(false); var position = scroller.ScrollPosition; scroller.ReloadData(); scroller.ScrollPosition = position; } else { scroller.gameObject.SetActive(false); empty.SetActive(true); } } private void UpdateLockAction(float deltaTime) { if (m_LockScrollViewCumulativeTime > 0) { m_LockScrollViewCumulativeTime -= deltaTime; } if (m_LockScrollViewCumulativeTime < 0) { m_LockScrollViewCumulativeTime = 0f; UnlockScrollView(); } } #endregion #region UI相关 private void OnBtnCopyClick() { GUIUtility.systemCopyBuffer = text_code.text; ToastPanel.Show(LocalizationMgr.GetText("UI_ToastPanel_25")); } void OnClickInviteLink() { if (adapter == null) { adapter = UnityNativeSharing.Create(); } string invite = LocalizationMgr.GetFormatTextValue("UI_FishingSocialPanel_45", text_code.text); adapter.ShareText(invite); } private string GetInvitationCodeByPlayFabID() { return GContext.container.Resolve().GetInvitationCodeByPlayFabID(GContext.container.Resolve().UserId); } #endregion #region EnhancedScroller Handlers private float m_LockScrollViewCumulativeTime = 0.0f; public void StartLockScrollView(float lockTime) { m_LockScrollViewCumulativeTime = lockTime; LockScrollView(); } void LockScrollView() { if (scroller == null || scroller.ScrollRect == null) return; if (scroller.ScrollRect.vertical) { scroller.ScrollRect.vertical = false; } } void UnlockScrollView() { if (scroller == null || scroller.ScrollRect == null) return; if (!scroller.ScrollRect.vertical) { scroller.ScrollRect.vertical = true; } } public int GetNumberOfCells(EnhancedScroller scroller) { return m_DataList.Count; } public float GetCellViewSize(EnhancedScroller scroller, int dataIndex) { if (m_DataList[dataIndex].Type == FriendHelper.Friend_Add_Item_Type_Invited_TitleBar) { return 72f; } else if (m_DataList[dataIndex].Type == FriendHelper.Friend_Add_Item_Type_Invited_Item) { return 150f; } else if (m_DataList[dataIndex].Type == FriendHelper.Friend_Add_Item_Type_Recommended_TitleBar) { return 72f; } return 150f; } public EnhancedScrollerCellView GetCellView(EnhancedScroller scroller, int dataIndex, int cellIndex) { FriendAddItem cellView; if (m_DataList[dataIndex].Type == FriendHelper.Friend_Add_Item_Type_Invited_TitleBar) { cellView = scroller.GetCellView(invitedItemTitleBar) as FriendInvitedItemTitleBar; cellView.name = "[Invited Title Bar]"; cellView.SetData(this, m_DataList[dataIndex], RemoveInvitedData); } else if (m_DataList[dataIndex].Type == FriendHelper.Friend_Add_Item_Type_Invited_Item) { cellView = scroller.GetCellView(invitedItem) as FriendInvitedItem; cellView.name = "[Invited Item] " + cellIndex + "-" + dataIndex; cellView.SetData(this, m_DataList[dataIndex], RemoveInvitedData); } else if (m_DataList[dataIndex].Type == FriendHelper.Friend_Add_Item_Type_Recommended_TitleBar) { cellView = scroller.GetCellView(recommendedItemTitleBar) as FriendRecommendedItemTitleBar; cellView.name = "[Recommended Title Bar]"; cellView.SetData(this, m_DataList[dataIndex], RemoveRecommendedData); } else { cellView = scroller.GetCellView(recommendedItem) as FriendRecommendedItem; cellView.name = "[Recommended Item] " + cellIndex + "-" + dataIndex; cellView.SetData(this, m_DataList[dataIndex], RemoveRecommendedData); } return cellView; } #endregion #region 生命周期 void Awake() { loading = transform.Find("loading").gameObject; empty = transform.Find("add").gameObject; empty.SetActive(false); btn_add = transform.Find("friendcode/btn_search").GetComponent