/**
*
*/
package com.photoshare.msg;
import java.io.File;
import java.util.ArrayList;
import java.util.List;
import com.photoshare.common.AbstractRequestListener;
import com.photoshare.common.RequestParam;
import com.photoshare.exception.NetworkError;
import com.photoshare.service.comments.PutCommentRequestParam;
import com.photoshare.service.follow.UserFollowRequestParam;
import com.photoshare.service.likes.PhotoLikeRequestParam;
import com.photoshare.service.photos.PhotoUploadRequestParam;
import com.photoshare.utils.Utils;
import com.photoshare.utils.async.AsyncUtils;
/**
* @author Aron
*
* The Message List is a singleton class. It saves all failed requests.
*
*/
public class MessageList {
private static final MessageList msgList = new MessageList();
private AsyncUtils async = AsyncUtils.getInstance();
public static MessageList getInstance() {
return msgList;
}
private MessageList() {
}
private String path = Utils.SDCARD_ABSOLUTE_PATH + File.separator
+ Utils.APP_NAME + File.separator + Utils.DIR_HOME + File.separator
+ Utils.DIR_MSG;
private String fileName = "message.xml";
public void initList() throws Exception {
tryConfigure();
reader = new MessageReader();
AbstractRequestListener<List<MessageItem>> listener = new AbstractRequestListener<List<MessageItem>>() {
@Override
public void onNetworkError(NetworkError networkError) {
// TODO Auto-generated method stub
}
@Override
public void onFault(Throwable fault) {
}
@Override
public void onComplete(List<MessageItem> bean) {
if (bean != null) {
list = bean;
}
}
};
async.readXMLList(reader, path, fileName, listener);
freeze();
}
private List<MessageItem> list = new ArrayList<MessageItem>();
private MessageReader reader;
private boolean configured;
private void freeze() {
this.configured = true;
}
private void tryConfigure() {
if (configured) {
return;
}
}
/**
* Add a Request Message to the Message List. (User could implement the
* interface {@link OnModifyListener} to do the subsequent operations after
* adding.)
*
* @param request
* which has been failed to send to the server in 3 times and
* will be automatically add to the message list.
*/
public void add(RequestMsg<? extends RequestParam> request) {
MessageItem item = new MessageItem();
RequestParam param = request.getAMsg();
if (param == null) {
return;
}
item.setMsgType(request.getType());
switch (request.getType()) {
case COMMENT:
PutCommentRequestParam cparam = (PutCommentRequestParam) param;
item.setEventId(cparam.getmPhotoId());
item.setMsgDescription(cparam.getComment());
item.setMsgPhotoUrl(cparam.getTinyUrl());
break;
case FOLLOW:
UserFollowRequestParam fparam = (UserFollowRequestParam) param;
item.setBtnStatus(fparam.isFollowing());
item.setEventId(fparam.getFollowId());
item.setMsgPhotoUrl(fparam.getTinyUrl());
break;
case LIKE:
PhotoLikeRequestParam lparam = (PhotoLikeRequestParam) param;
item.setBtnStatus(lparam.isLike());
item.setEventId(lparam.getPhotoId());
item.setMsgPhotoUrl(lparam.getTinyUrl());
break;
case NULL:
break;
case PHOTO:
PhotoUploadRequestParam uparam = (PhotoUploadRequestParam) param;
item.setEventId(uparam.getUid());
item.setMsgDescription(uparam.getCaption());
item.setMsgPhotoUrl(uparam.getFile().getAbsolutePath());
break;
default:
break;
}
list.add(item);
notifyOnAdd(item);
}
public void remove(MessageItem item) {
list.remove(item);
notifyOnRemove(item);
}
public void setList(List<MessageItem> list) {
this.list = list;
}
/**
* The method may risk the "escape" problem, thus why it is used as a
* temporary method, in which will be deprecated in future release.
*
* @return Message List
*/
public List<MessageItem> getList() {
return list;
}
/**
* The method may risk the "escape" problem, thus why it is used as a
* temporary method, in which will be deprecated in future release.
*
* @return Message List
*/
public ArrayList<MessageItem> getArrayList() {
return new ArrayList<MessageItem>(list);
}
/**
* @author Aron
*
* The interface OnModifyListener designed to notify the user any
* specific operations posed on the Message List
*
*/
public interface OnModifyListener {
public void OnAdd(MessageItem item);
public void OnRemove(MessageItem item);
}
private ArrayList<OnModifyListener> listeners = new ArrayList<MessageList.OnModifyListener>();
public void registerListener(OnModifyListener listener) {
this.listeners.add(listener);
}
private void notifyOnAdd(MessageItem item) {
for (OnModifyListener listener : listeners) {
listener.OnAdd(item);
}
}
private void notifyOnRemove(MessageItem item) {
for (OnModifyListener listener : listeners) {
listener.OnRemove(item);
}
}
}