/*
* 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.Date;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import android.app.Dialog;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.os.AsyncTask;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import com.google.android.gms.maps.model.LatLng;
import com.sgu.findyourfriend.model.Friend;
import com.sgu.findyourfriend.model.Message;
import com.sgu.findyourfriend.model.TempMessage;
import com.sgu.findyourfriend.net.PostData;
import com.sgu.findyourfriend.utils.Utility;
import com.sgu.findyourfriend.utils.Utility.RReply;
public class MessageManager extends BaseManager {
public static String TAG = "MessageManager";
private static MessageManager instance;
private IMessage iMessage;
private Context context;
@Override
public void init(Context context) {
this.context = context;
this.context.registerReceiver(mHandleMessageReceiver, new IntentFilter(
Config.DISPLAY_MESSAGE_ACTION));
this.context.registerReceiver(mHandleMessageReceiver, new IntentFilter(
Config.LOCAL_MESSAGE_ACTION));
}
public synchronized static MessageManager getInstance() {
if (instance == null) {
instance = new MessageManager();
}
return instance;
}
public void setMessageListener(IMessage iMessage) {
Log.i("Message fragment", "set listener");
this.iMessage = iMessage;
}
public List<Message> getAllMessage() {
// return dataSource.getAllMessages();
return SQLiteDatabaseManager.getInstance().getAllMessage();
}
public void sendMessage(String msg, List<Integer> addrs) {
for (int addr : addrs) {
Message sms = new Message(msg, true, MyProfileManager.getInstance()
.getMyID(), MyProfileManager.getInstance().getMyName(),
addr, FriendManager.getInstance().hmMemberFriends.get(addr)
.getUserInfo().getName(), MyProfileManager
.getInstance().getMyPosition(), new Date(
System.currentTimeMillis()));
sms = SQLiteDatabaseManager.getInstance().saveMessage(sms);
if (null != iMessage)
iMessage.addNewMessage(sms);
(new SendMessage()).execute(msg, addr + "");
}
}
private class SendMessage extends AsyncTask<String, Void, Void> {
@Override
protected Void doInBackground(String... params) {
int regIdFrom = MyProfileManager.getInstance().getMyID();
int regIdTo = Integer.parseInt(params[1]);
String message = regIdFrom + Config.PARTERN_GET_MESSAGE + params[0];
if (null != MyProfileManager.getInstance().getMyPosition())
message += Config.PREFIX_LOCATION_IN_MESSAGE
+ MyProfileManager.getInstance().getMyPosition().latitude
+ " "
+ MyProfileManager.getInstance().getMyPosition().longitude;
PostData.sendMessage(context, regIdFrom, regIdTo, message);
return null;
}
@Override
protected void onPostExecute(Void result) {
}
}
// Create a broadcast receiver to get message and show on screen
private final BroadcastReceiver mHandleMessageReceiver = new BroadcastReceiver() {
@Override
public void onReceive(final Context context, Intent intent) {
String newMessage = intent.getExtras().getString(
Config.EXTRA_MESSAGE);
// check message here !
// update num msg for widget
SettingManager.getInstance().init(context);
if (Utility.verifyRequest(newMessage)) {
notifyRequestTask(newMessage);
} else if (Utility.verifyResponse(newMessage)) {
notifyResponseTask(newMessage);
} else {
notifyNormalMessageTask(newMessage);
}
// update by intent broadcast
Intent intentBC = new Intent(Config.UPDATE_MESSAGE_WIDGET_ACTION);
// Send Broadcast to Broadcast receiver with message
context.sendBroadcast(intentBC);
// Waking up mobile if it is sleeping
Utility.acquireWakeLock(context);
// Releasing wake lock
Utility.releaseWakeLock();
}
};
public void deleteMessage(Message message) {
SQLiteDatabaseManager.getInstance().removeMessage(message);
}
public Message createMessage(Message msg) {
return SQLiteDatabaseManager.getInstance().saveMessage(msg);
}
public void destroy() {
// remove all new message notify
SettingManager.getInstance().setNoNewMessage(0);
SettingManager.getInstance().setNoNewRequest(0);
context.unregisterReceiver(mHandleMessageReceiver);
}
private void notifyRequestTask(String newMessage) {
final RReply reply = Utility.getRequest(newMessage);
final Intent intentUpdate = new Intent(Config.UPDATE_UI);
(new AsyncTask<Void, Void, Void>() {
@Override
protected Void doInBackground(Void... params) {
if (reply.getType().equals(Utility.FRIEND)) {
// send broadcast update ui vs msg
intentUpdate.putExtra(Config.UPDATE_TYPE, Utility.FRIEND);
intentUpdate
.putExtra(Config.UPDATE_ACTION, Utility.REQUEST);
Friend fr = PostData.friendGetFriend(context,
reply.getFromId());
FriendManager.getInstance().addFriendRequest(fr);
// intent notify friend request
Intent intent2 = new Intent(Config.NOTIFY_UI);
intent2.putExtra(Config.FRIEND_REQUEST_NOTIFY, Config.SHOW);
context.sendBroadcast(intent2);
// if (!isLocalMessage)
// Utility.generateNotification(context,
// "Một yêu cầu kết bạn từ "
// + fr.getUserInfo().getName(), "");
} else if (reply.getType().equals(Utility.SHARE)) {
// send broadcast update ui vs msg
intentUpdate.putExtra(Config.UPDATE_TYPE, Utility.SHARE);
intentUpdate
.putExtra(Config.UPDATE_ACTION, Utility.REQUEST);
Friend fr = FriendManager.getInstance().hmMemberFriends
.get(reply.getFromId());
fr.setAcceptState(Friend.REQUESTED_SHARE);
FriendManager.getInstance().updateChangeMemberFriend(fr);
// if (!isLocalMessage)
// Utility.generateNotification(context,
// "Một yêu cầu chia sẻ từ "
// + fr.getUserInfo().getName(), "");
}
return null;
}
protected void onPostExecute(Void result) {
context.sendBroadcast(intentUpdate);
SettingManager.getInstance().setNoNewRequest(
SettingManager.getInstance().getNoNewRequest() + 1);
};
}).execute();
}
private void notifyResponseTask(String newMessage) {
final RReply reply = Utility.getResponse(newMessage);
final Intent intentUpdate = new Intent(Config.UPDATE_UI);
(new AsyncTask<Void, Void, Void>() {
@Override
protected Void doInBackground(Void... params) {
if (reply.getType().equals(Utility.FRIEND)) {
Log.i(TAG, "response friend");
// send broadcast update ui vs msg
intentUpdate.putExtra(Config.UPDATE_TYPE, Utility.FRIEND);
if (reply.isRes()) {
Log.i(TAG, "response friend yes");
// response yes
intentUpdate.putExtra(Config.UPDATE_ACTION,
Utility.RESPONSE_YES);
Friend fr = PostData.friendGetFriend(context,
reply.getFromId());
fr.setAcceptState(Friend.FRIEND_RELATIONSHIP);
FriendManager.getInstance().addFriendMember(fr);
// remove stranger or invited on map
FriendManager.getInstance().removeStranger(fr.getUserInfo().getId());
intentUpdate.putExtra(Config.FRIEND_ID, fr.getUserInfo().getId());
} else {
Log.i(TAG, "response friend no");
// response no
intentUpdate.putExtra(Config.UPDATE_ACTION,
Utility.RESPONSE_NO);
}
} else if (reply.getType().equals(Utility.SHARE)) {
intentUpdate.putExtra(Config.UPDATE_TYPE, Utility.SHARE);
Friend fr = FriendManager.getInstance().hmMemberFriends
.get(reply.getFromId());
if (reply.isRes()) {
// response yes
intentUpdate.putExtra(Config.UPDATE_ACTION,
Utility.RESPONSE_YES);
fr.setAcceptState(Friend.SHARE_RELATIONSHIP);
} else {
// response no
intentUpdate.putExtra(Config.UPDATE_ACTION,
Utility.RESPONSE_NO);
fr.setAcceptState(Friend.FRIEND_RELATIONSHIP);
}
FriendManager.getInstance().updateChangeMemberFriend(fr);
}
return null;
}
protected void onPostExecute(Void result) {
context.sendBroadcast(intentUpdate);
SettingManager.getInstance().setNoNewRequest(
SettingManager.getInstance().getNoNewRequest() + 1);
};
}).execute();
}
private void notifyNormalMessageTask(String newMessage) {
// update msg ui
Intent intentUpdate = new Intent(Config.UPDATE_UI);
intentUpdate.putExtra(Config.UPDATE_TYPE, Utility.MESSAGE);
Message sms = SQLiteDatabaseManager.getInstance().saveMessage(
Utility.parseMessage(newMessage));
Log.i("get message: ", sms.getIdSender() + " # rc" + sms.getIdReceiver());
// Display message on the screen
if (iMessage != null)
iMessage.addNewMessage(sms);
else {
Log.i(TAG, "iMessage null!");
}
context.sendBroadcast(intentUpdate);
SettingManager.getInstance().setNoNewMessage(
SettingManager.getInstance().getNoNewMesssage() + 1);
// intent notify normal message
Intent intent2 = new Intent(Config.NOTIFY_UI);
intent2.putExtra(Config.MESSAGE_NOTIFY, Config.SHOW);
context.sendBroadcast(intent2);
// if (!isLocalMessage)
// Utility.generateNotification(context, "Bạn có một tin nhắn mới từ "
// + sms.getSenderName(), sms.getMessage());
}
}