/*
* Copyright (C) 2014 Tubor Team
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.sgu.findyourfriend.mgr;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import android.annotation.SuppressLint;
import android.content.Context;
import android.graphics.drawable.Drawable;
import android.util.Log;
import com.google.android.gms.internal.fd;
import com.google.android.gms.internal.hm;
import com.google.android.gms.maps.model.LatLng;
import com.sgu.findyourfriend.R;
import com.sgu.findyourfriend.model.Friend;
import com.sgu.findyourfriend.model.History;
import com.sgu.findyourfriend.model.SimpleUserAndLocation;
import com.sgu.findyourfriend.model.User;
import com.sgu.findyourfriend.net.PostData;
public class FriendManager extends BaseManager {
public static String TAG = "FRIEND MANAGER";
private static FriendManager instance;
private List<Friend> tmpFriendList;
private ArrayList<SimpleUserAndLocation> tmpStrangers;
private List<Friend> friendList;
// hashmap store request friends
public HashMap<Integer, Friend> hmRequestFriends;
// hashmap store member list
public HashMap<Integer, Friend> hmMemberFriends;
// hashmap strangers
public HashMap<Integer, LatLng> hmStrangers;
// hashmap strangers
public HashMap<Integer, Friend> hmInvited;
// pure friends - not mine
public ArrayList<Friend> pureFriends;
// friends and mine and plus
public ArrayList<Friend> friends;
// hashmap store drawable of friend
public HashMap<Integer, Drawable> hmImageP;
public Context context;
public boolean isStop;
@Override
public void init(Context context) {
this.context = context;
isStop = false;
tmpFriendList = new ArrayList<Friend>();
friendList = new ArrayList<Friend>();
tmpStrangers = new ArrayList<SimpleUserAndLocation>();
hmStrangers = new HashMap<Integer, LatLng>();
hmInvited = new HashMap<Integer, Friend>();
friendList = PostData.friendGetFriendList(context, MyProfileManager
.getInstance().getMyID());
// load strangers
tmpStrangers.clear();
if (null != MyProfileManager.getInstance().getMyPosition())
tmpStrangers.addAll(PostData.findInDistance(context,
MyProfileManager.getInstance().getMyPosition(),
SettingManager.STRAGNER_DISTANCE));
else
tmpStrangers.addAll(PostData.findInDistance(context,
SettingManager.getInstance().centerVNLatLng,
SettingManager.STRAGNER_DISTANCE));
}
public synchronized static FriendManager getInstance() {
if (instance == null) {
instance = new FriendManager();
}
return instance;
}
// public void loadFriend() {
// if (!Config.MODE_OFFLINE) {
// friendList.clear();
// friendList.addAll(PostData.friendGetFriendList(context,
// MyProfileManager.getInstance().getMyID()));
//
// tmpStrangers.clear();
// tmpStrangers.addAll(PostData
// .findInDistance(context, MyProfileManager
// .getInstance().getMyPosition().latitude,
// MyProfileManager.getInstance()
// .getMyPosition().longitude,
// SettingManager.STRAGNER_DISTANCE));
//
// }
// }
public void preLoadUpdate() {
tmpFriendList.clear();
tmpFriendList.addAll(PostData.friendGetFriendList(context,
MyProfileManager.getInstance().getMyID()));
}
public void endLoadUpdate() {
friendList.clear();
friendList.addAll(tmpFriendList);
setupAfterLoading();
}
public void setupAfterLoading() {
if (isStop)
return;
Log.i("DEBUG friend size", friendList.size() + "");
pureFriends.clear();
// friendList.clear();
// friendList.addAll(tmpFriendList);
if (null != MyProfileManager.getInstance().getMineInstance())
friendList.add(MyProfileManager.getInstance().getMineInstance());
hmImageP.clear();
@SuppressWarnings("unchecked")
Iterator<Friend> it = (new ArrayList(friendList)).iterator();
while (it.hasNext()) {
Friend f = it.next();
if (!f.getUserInfo().getAvatar().equals(""))
hmImageP.put(f.getUserInfo().getId(),
Drawable.createFromPath(f.getUserInfo().getAvatar()));
else
hmImageP.put(f.getUserInfo().getId(), context.getResources()
.getDrawable(R.drawable.ic_no_imgprofile));
}
hmMemberFriends.clear();
hmRequestFriends.clear();
int mID = MyProfileManager.getInstance().getMyID();
// filter request friend
@SuppressWarnings("unchecked")
Iterator<Friend> it2 = (new ArrayList(friendList)).iterator();
while (it2.hasNext()) {
Friend f = it2.next();
if (f.getAcceptState() == Friend.FRIEND_RELATIONSHIP
|| f.getAcceptState() == Friend.REQUEST_SHARE
|| f.getAcceptState() == Friend.REQUESTED_SHARE
|| f.getAcceptState() == Friend.SHARE_RELATIONSHIP) {
hmMemberFriends.put(f.getUserInfo().getId(), f);
if (f.getUserInfo().getId() != mID)
pureFriends.add(f);
} else if (f.getAcceptState() == Friend.REQUESTED_FRIEND) {
hmRequestFriends.put(f.getUserInfo().getId(), f);
} else if (f.getAcceptState() == Friend.REQUEST_FRIEND) {
hmInvited.put(f.getUserInfo().getId(), f);
Log.i("invite===================", f.getUserInfo().getId() + "");
}
}
// setup friends
friends = new ArrayList<Friend>(pureFriends);
friends.add(0, MyProfileManager.getInstance().getMineInstance());
}
@SuppressLint("UseSparseArrays")
@Override
public void setup() {
int mID = 0;
// friendList.clear();
// friendList.addAll(tmpFriendList);
pureFriends = new ArrayList<Friend>();
friends = new ArrayList<Friend>();
if (null != MyProfileManager.getInstance().getMineInstance()) {
friendList.add(0, MyProfileManager.getInstance().getMineInstance());
mID = MyProfileManager.getInstance().getMyID();
}
// setup drawable icon
hmImageP = new HashMap<Integer, Drawable>();
@SuppressWarnings("unchecked")
Iterator<Friend> it = (new ArrayList(friendList)).iterator();
while (it.hasNext()) {
Friend f = it.next();
if (null == f.getUserInfo().getAvatar()
|| f.getUserInfo().getAvatar().equals(""))
hmImageP.put(f.getUserInfo().getId(), context.getResources()
.getDrawable(R.drawable.ic_no_imgprofile));
else
hmImageP.put(f.getUserInfo().getId(),
Drawable.createFromPath(f.getUserInfo().getAvatar()));
}
hmRequestFriends = new HashMap<Integer, Friend>();
hmMemberFriends = new HashMap<Integer, Friend>();
@SuppressWarnings("rawtypes")
Iterator<Friend> it2 = (new ArrayList(friendList)).iterator();
while (it2.hasNext()) {
Friend f = it2.next();
if (f.getAcceptState() == Friend.FRIEND_RELATIONSHIP
|| f.getAcceptState() == Friend.REQUEST_SHARE
|| f.getAcceptState() == Friend.REQUESTED_SHARE
|| f.getAcceptState() == Friend.SHARE_RELATIONSHIP) {
hmMemberFriends.put(f.getUserInfo().getId(), f);
if (f.getUserInfo().getId() != mID)
pureFriends.add(f);
} else if (f.getAcceptState() == Friend.REQUESTED_FRIEND) {
hmRequestFriends.put(f.getUserInfo().getId(), f);
} else if (f.getAcceptState() == Friend.REQUEST_FRIEND) {
hmInvited.put(f.getUserInfo().getId(), f);
Log.i("DEBUG INVITED", f.getUserInfo().getId() + " # "
+ f.getUserInfo().getName());
}
}
// import stranger offline
// if (Config.MODE_OFFLINE) {
// hmStrangers.put(100, new LatLng(11.574108, 107.8529177));
// hmStrangers.put(101, new LatLng(10.214108, 106.41529177));
// hmStrangers.put(102, new LatLng(10.414108, 106.9529177));
// }
// setup friends
friends = new ArrayList<Friend>(pureFriends);
friends.add(0, MyProfileManager.getInstance().getMineInstance());
// stranger
hmStrangers.clear();
for (SimpleUserAndLocation sn : tmpStrangers) {
Log.i("STR", sn.getId() + "");
if (MyProfileManager.getInstance().getMyID() != sn.getId()
&& !hmInvited.containsKey(sn.getId())
&& !hmMemberFriends.containsKey(sn.getId())
&& !hmRequestFriends.containsKey(sn.getId()))
hmStrangers.put(sn.getId(),
new LatLng(sn.getLat(), sn.getLng()));
}
}
public void updateFriend(Friend friend) {
int key = friend.getUserInfo().getId();
int size = friendList.size() - 1;
while (size >= 0 && friendList.get(size).getUserInfo().getId() != key)
size--;
if (size >= 0) {
friendList.set(size, friend);
}
if (hmRequestFriends.containsKey(key))
hmRequestFriends.put(key, friend);
if (hmMemberFriends.containsKey(key))
hmMemberFriends.put(key, friend);
if (hmImageP.containsKey(key))
if (!friend.getUserInfo().getAvatar().equals(""))
hmImageP.put(friend.getUserInfo().getId(), Drawable
.createFromPath(friend.getUserInfo().getAvatar()));
else
hmImageP.put(friend.getUserInfo().getId(), context
.getResources()
.getDrawable(R.drawable.ic_no_imgprofile));
// updateSwipeFriends();
for (Friend f : friends) {
if (f.getUserInfo().getId() == key) {
f = friend;
break;
}
}
}
public void updateChangeRequestToMember(Friend fr) {
int key = fr.getUserInfo().getId();
int size = friendList.size() - 1;
while (size >= 0 && friendList.get(size).getUserInfo().getId() != key)
size--;
if (size >= 0) {
friendList.set(size, fr);
}
hmRequestFriends.remove(key);
hmMemberFriends.put(key, fr);
pureFriends.add(fr);
friends.add(friends.size(), fr);
}
public void removeFriendRequest(Friend fr) {
int key = fr.getUserInfo().getId();
int size = friendList.size() - 1;
while (size >= 0 && friendList.get(size).getUserInfo().getId() != key)
size--;
if (size >= 0) {
friendList.remove(size);
}
hmRequestFriends.remove(fr.getUserInfo().getId());
}
public void addFriendRequest(Friend fr) {
int key = fr.getUserInfo().getId();
int size = friendList.size() - 1;
while (size >= 0 && friendList.get(size).getUserInfo().getId() != key)
size--;
if (size < 0) {
friendList.add(fr);
}
hmRequestFriends.put(fr.getUserInfo().getId(), fr);
if (!fr.getUserInfo().getAvatar().equals(""))
hmImageP.put(fr.getUserInfo().getId(),
Drawable.createFromPath(fr.getUserInfo().getAvatar()));
else
hmImageP.put(fr.getUserInfo().getId(), context.getResources()
.getDrawable(R.drawable.ic_no_imgprofile));
}
public void addFriendMember(Friend fr) {
int key = fr.getUserInfo().getId();
int size = friendList.size() - 1;
while (size >= 0 && friendList.get(size).getUserInfo().getId() != key)
size--;
if (size >= 0) {
friendList.set(size, fr);
} else {
friendList.add(fr);
}
Log.i("ADDMEMBER", fr.getUserInfo().getId() + "");
hmMemberFriends.put(fr.getUserInfo().getId(), fr);
if (!fr.getUserInfo().getAvatar().equals(""))
hmImageP.put(fr.getUserInfo().getId(),
Drawable.createFromPath(fr.getUserInfo().getAvatar()));
else
hmImageP.put(fr.getUserInfo().getId(), context.getResources()
.getDrawable(R.drawable.ic_no_imgprofile));
pureFriends.add(fr);
// friendList.add(fr);
}
public void updateChangeMemberFriend(Friend fr) {
int key = fr.getUserInfo().getId();
int size = friendList.size() - 1;
while (size >= 0 && friendList.get(size).getUserInfo().getId() != key)
size--;
if (size >= 0) {
friendList.set(size, fr);
}
hmMemberFriends.remove(key);
hmMemberFriends.put(key, fr);
int i = 0;
size = friends.size();
while (i < size
&& friends.get(i).getUserInfo().getId() != fr.getUserInfo()
.getId()) {
i++;
}
if (i < size) {
friends.get(i).setAcceptState(fr.getAcceptState());
Log.i(TAG, "updated into updateChangleMember");
}
for (Friend f : friends) {
Log.i(TAG,
"friend " + f.getUserInfo().getName() + ", state: "
+ f.getAcceptState());
}
// ArrayList<Friend> fs = new ArrayList<Friend>(friends);
// friends.clear();
// friends.addAll(fs);
}
public void setStop(boolean b) {
this.isStop = b;
}
public boolean hasFriendId(int idSender) {
for (Friend f : pureFriends) {
if (f.getUserInfo().getId() == idSender)
return true;
}
return false;
}
public void removeFriend(int fIDCurrent) {
int size = friendList.size() - 1;
while (size >= 0
&& friendList.get(size).getUserInfo().getId() != fIDCurrent)
size--;
if (size >= 0) {
friendList.remove(size);
}
for (Friend f : pureFriends) {
if (f.getUserInfo().getId() == fIDCurrent) {
pureFriends.remove(f);
Log.i(TAG, "remove frienf from pure");
break;
}
}
for (Friend f : friends) {
if (f.getUserInfo().getId() == fIDCurrent) {
friends.remove(f);
Log.i(TAG, "remove friend from friend");
break;
}
}
if (hmMemberFriends.containsKey(fIDCurrent)) {
Log.i(TAG, "remove frienf from hmMember");
hmMemberFriends.remove(fIDCurrent);
}
}
public void stopShare(int fIDCurrent) {
int size = friendList.size() - 1;
while (size >= 0
&& friendList.get(size).getUserInfo().getId() != fIDCurrent)
size--;
if (size >= 0) {
Friend f = hmMemberFriends.get(fIDCurrent);
f.setAcceptState(Friend.FRIEND_RELATIONSHIP);
friendList.set(size, f);
}
for (Friend f : pureFriends) {
if (f.getUserInfo().getId() == fIDCurrent) {
f.setAcceptState(Friend.FRIEND_RELATIONSHIP);
break;
}
}
for (Friend f : friends) {
if (f.getUserInfo().getId() == fIDCurrent) {
f.setAcceptState(Friend.FRIEND_RELATIONSHIP);
break;
}
}
if (hmMemberFriends.containsKey(fIDCurrent)) {
Friend f = hmMemberFriends.remove(fIDCurrent);
f.setAcceptState(Friend.FRIEND_RELATIONSHIP);
hmMemberFriends.put(fIDCurrent, f);
}
}
public String getNameFriend(int idFriend) {
for (Friend f : friendList) {
if (f.getUserInfo().getId() == idFriend)
return f.getUserInfo().getName();
}
return "Không có";
}
public ArrayList<Friend> getFriendsAndMine() {
ArrayList<Friend> fs = new ArrayList<Friend>();
fs.add(MyProfileManager.getInstance().getMineInstance());
for (Friend f : friendList) {
if (f.getUserInfo().getId() != MyProfileManager.getInstance()
.getMyID()
&& (f.getAcceptState() == Friend.FRIEND_RELATIONSHIP
|| f.getAcceptState() == Friend.REQUEST_SHARE
|| f.getAcceptState() == Friend.REQUESTED_SHARE || f
.getAcceptState() == Friend.SHARE_RELATIONSHIP))
fs.add(f);
}
return fs;
}
public void removeStranger(int id) {
// find and remove stranger or invited
if (hmStrangers.containsKey(id))
hmStrangers.remove(id);
if (hmInvited.containsKey(id))
hmInvited.remove(id);
int size = friendList.size() - 1;
while (size >= 0 && friendList.get(size).getUserInfo().getId() != id)
size--;
}
public void addStranger(int fIDCurrent) {
int size = friendList.size() - 1;
while (size >= 0
&& friendList.get(size).getUserInfo().getId() != fIDCurrent)
size--;
if (size >= 0) {
hmStrangers.put(fIDCurrent, friendList.get(size).getLastLocation());
}
}
public void changeStrangerToInvited(int id) {
// find and remove stranger or invited
if (hmStrangers.containsKey(id))
hmStrangers.remove(id);
}
public void addFriendInvited(Friend fr) {
int key = fr.getUserInfo().getId();
int size = friendList.size() - 1;
while (size >= 0 && friendList.get(size).getUserInfo().getId() != key)
size--;
if (size < 0) {
friendList.add(fr);
}
hmInvited.put(fr.getUserInfo().getId(), fr);
if (!fr.getUserInfo().getAvatar().equals(""))
hmImageP.put(fr.getUserInfo().getId(),
Drawable.createFromPath(fr.getUserInfo().getAvatar()));
else
hmImageP.put(fr.getUserInfo().getId(), context.getResources()
.getDrawable(R.drawable.ic_no_imgprofile));
}
}