/* * Copyright (c) 2020 WildFireChat. All rights reserved. */ package cn.wildfire.chat.kit.contact; import android.content.Context; import android.content.SharedPreferences; import androidx.lifecycle.LiveData; import androidx.lifecycle.MutableLiveData; import androidx.lifecycle.ViewModel; import cn.wildfire.chat.kit.Config; import cn.wildfire.chat.kit.WfcUIKit; import cn.wildfire.chat.kit.common.OperateResult; import cn.wildfire.chat.kit.contact.model.UIUserInfo; import cn.wildfirechat.model.Conversation; import cn.wildfirechat.model.FriendRequest; import cn.wildfirechat.model.GroupInfo; import cn.wildfirechat.model.UserInfo; import cn.wildfirechat.remote.*; import java.util.List; import java.util.concurrent.atomic.AtomicInteger; public class ContactViewModel extends ViewModel implements OnFriendUpdateListener { private MutableLiveData> contactListLiveData; private MutableLiveData> groupListLiveData; private MutableLiveData friendRequestUpdatedLiveData; private MutableLiveData> favContactListLiveData; public ContactViewModel() { super(); ChatManager.Instance().addFriendUpdateListener(this); } @Override protected void onCleared() { super.onCleared(); ChatManager.Instance().removeFriendUpdateListener(this); } public MutableLiveData> contactListLiveData() { if (contactListLiveData == null) { contactListLiveData = new MutableLiveData<>(); } reloadContact(); return contactListLiveData; } public MutableLiveData> groupListLiveData() { if (groupListLiveData == null) { groupListLiveData = new MutableLiveData<>(); } reloadGroup(); return groupListLiveData; } public MutableLiveData friendRequestUpdatedLiveData() { if (friendRequestUpdatedLiveData == null) { friendRequestUpdatedLiveData = new MutableLiveData<>(); } int count = getUnreadFriendRequestCount(); friendRequestUpdatedLiveData.setValue(count); return friendRequestUpdatedLiveData; } public MutableLiveData> favContactListLiveData() { if (favContactListLiveData == null) { favContactListLiveData = new MutableLiveData<>(); } reloadFavContact(); return favContactListLiveData; } public void reloadFriendRequestStatus() { if (friendRequestUpdatedLiveData != null) { ChatManager.Instance().getWorkHandler().post(() -> { int count = getUnreadFriendRequestCount(); friendRequestUpdatedLiveData.postValue(count); }); } } public void reloadFavContact() { ChatManager.Instance().getFavUsers(new StringListCallback() { @Override public void onSuccess(List userIds) { if (userIds == null || userIds.isEmpty()) { return; } List userInfos = ChatManager.Instance().getUserInfos(userIds, null); favContactListLiveData.postValue(UIUserInfo.fromUserInfos(userInfos, true)); } @Override public void onFail(int errorCode) { } }); } public List getFriends(boolean refresh) { return ChatManager.Instance().getMyFriendList(refresh); } private AtomicInteger loadingCount = new AtomicInteger(0); public void reloadGroup() { int count = loadingCount.get(); if (count > 0) { return; } loadingCount.incrementAndGet(); ChatManager.Instance().getWorkHandler().post(() -> { loadingCount.decrementAndGet(); SharedPreferences sp = WfcUIKit.getWfcUIKit().getApplication().getSharedPreferences("config", Context.MODE_PRIVATE); boolean pcLogined = sp.getBoolean("wfc_uikit_had_pc_session", false); ChatManager.Instance().getFavGroups(new GetGroupsCallback() { @Override public void onSuccess(List groupInfos) { if (groupListLiveData != null) { groupListLiveData.postValue(groupInfos); } } @Override public void onFail(int errorCode) { } }); }); } public void reloadContact() { int count = loadingCount.get(); if (count > 0) { return; } loadingCount.incrementAndGet(); ChatManager.Instance().getWorkHandler().post(() -> { loadingCount.decrementAndGet(); SharedPreferences sp = WfcUIKit.getWfcUIKit().getApplication().getSharedPreferences("config", Context.MODE_PRIVATE); boolean pcLogined = sp.getBoolean("wfc_uikit_had_pc_session", false); UserInfo fileHelpUserInfo = null; if (pcLogined) { fileHelpUserInfo = ChatManager.Instance().getUserInfo(Config.FILE_TRANSFER_ID, true); } List userInfos = ChatManager.Instance().getMyFriendListInfo(false); if (fileHelpUserInfo != null && userInfos != null) { userInfos.add(fileHelpUserInfo); } if (contactListLiveData != null) { contactListLiveData.postValue(UIUserInfo.fromUserInfos(userInfos)); } }); } public List getContacts(boolean refresh) { return ChatManager.Instance().getMyFriendListInfo(refresh); } public int getUnreadFriendRequestCount() { return ChatManager.Instance().getUnreadFriendRequestStatus(); } public void clearUnreadFriendRequestStatus() { ChatManager.Instance().clearUnreadFriendRequestStatus(); } @Override public void onFriendListUpdate(List updateFriendList) { reloadContact(); } @Override public void onFriendRequestUpdate(List newRequests) { if (friendRequestUpdatedLiveData != null) { friendRequestUpdatedLiveData.setValue(getUnreadFriendRequestCount()); } } public List getFriendRequest() { return ChatManager.Instance().getFriendRequest(true); } public MutableLiveData acceptFriendRequest(String friendId) { MutableLiveData result = new MutableLiveData<>(); ChatManager.Instance().handleFriendRequest(friendId, true, null, new GeneralCallback() { @Override public void onSuccess() { ChatManager.Instance().loadFriendRequestFromRemote(); List inComingFriendRequests = ChatManager.Instance().getFriendRequest(true); for (FriendRequest request : inComingFriendRequests) { if (request.target.equals(friendId)) { result.setValue(true); return; } } result.setValue(false); } @Override public void onFail(int errorCode) { result.setValue(false); } }); return result; } public MutableLiveData> searchUser(String keyword, ChatManager.SearchUserType searchUserType, int page) { MutableLiveData> result = new MutableLiveData<>(); ChatManager.Instance().searchUser(keyword, searchUserType, page, new SearchUserCallback() { @Override public void onSuccess(List userInfos) { result.setValue(userInfos); } @Override public void onFail(int errorCode) { result.setValue(null); } }); return result; } public boolean isFriend(String targetUid) { return ChatManager.Instance().isMyFriend(targetUid); } public boolean isBlacklisted(String targetUid) { return ChatManager.Instance().isBlackListed(targetUid); } public boolean isFav(String targetUid) { return ChatManager.Instance().isFavUser(targetUid); } public LiveData> deleteFriend(String userId) { MutableLiveData> result = new MutableLiveData<>(); ChatManager.Instance().deleteFriend(userId, new GeneralCallback() { @Override public void onSuccess() { ChatManager.Instance().removeConversation(new Conversation(Conversation.ConversationType.Single, userId, 0), true); result.postValue(new OperateResult<>(0)); } @Override public void onFail(int errorCode) { result.postValue(new OperateResult<>(errorCode)); } }); return result; } public LiveData> setBlacklist(String userId, boolean value) { MutableLiveData> result = new MutableLiveData<>(); ChatManager.Instance().setBlackList(userId, value, new GeneralCallback() { @Override public void onSuccess() { result.postValue(new OperateResult<>(0)); } @Override public void onFail(int errorCode) { result.postValue(new OperateResult<>(errorCode)); } }); return result; } public LiveData> setFav(String userId, boolean fav) { MutableLiveData> result = new MutableLiveData<>(); ChatManager.Instance().setFavUser(userId, fav, new GeneralCallback() { @Override public void onSuccess() { result.postValue(new OperateResult<>(0)); } @Override public void onFail(int errorCode) { result.postValue(new OperateResult<>(errorCode)); } }); return result; } public MutableLiveData invite(String targetUid, String message) { MutableLiveData result = new MutableLiveData<>(); ChatManager.Instance().sendFriendRequest(targetUid, message, new GeneralCallback() { @Override public void onSuccess() { result.setValue(true); } @Override public void onFail(int errorCode) { result.setValue(false); } }); return result; } public MutableLiveData> setFriendAlias(String userId, String alias) { MutableLiveData> data = new MutableLiveData<>(); ChatManager.Instance().setFriendAlias(userId, alias, new GeneralCallback() { @Override public void onSuccess() { data.setValue(new OperateResult<>(0)); } @Override public void onFail(int errorCode) { data.setValue(new OperateResult<>(errorCode)); } }); return data; } public String getFriendAlias(String userId) { return ChatManager.Instance().getFriendAlias(userId); } }