package com.ijoomer.components.jbolochat;
import android.app.Activity;
import android.content.Intent;
import android.graphics.drawable.Drawable;
import android.text.Html;
import android.text.SpannableStringBuilder;
import android.text.method.LinkMovementMethod;
import android.text.style.URLSpan;
import android.view.View;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.ListView;
import android.widget.ProgressBar;
import android.widget.RadioGroup;
import android.widget.SeekBar;
import com.androidquery.AQuery;
import com.androidquery.callback.AjaxCallback;
import com.androidquery.callback.AjaxStatus;
import com.ijoomer.common.classes.IjoomerFileChooserActivity;
import com.ijoomer.common.classes.IjoomerUtilities;
import com.ijoomer.common.classes.URLImageParser;
import com.ijoomer.common.classes.ViewHolder;
import com.ijoomer.common.configuration.IjoomerGlobalConfiguration;
import com.ijoomer.customviews.IjoomerTextView;
import com.ijoomer.customviews.IjoomerVoiceAndTextMessager;
import com.ijoomer.library.jbolochat.JBoloChatDataProvider;
import com.ijoomer.src.R;
import com.ijoomer.weservice.WebCallListener;
import com.smart.framework.CustomAlertMagnatic;
import com.smart.framework.CustomAlertNeutral;
import com.smart.framework.ItemView;
import com.smart.framework.SmartListAdapterWithHolder;
import com.smart.framework.SmartListItem;
import java.io.File;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.LinkedHashMap;
/**
* This Class Contains All Method Related To JboloMessageListActivity.
*
* @author tasol
*
*/
public class JboloMessageListActivity extends JBoloChatMasterActivity {
private ListView lstMessage;
private IjoomerVoiceAndTextMessager voiceMessager;
private LinearLayout lnrHistory;
private LinearLayout lnrSendFile;
private LinearLayout lnrClearConversion;
private LinearLayout lnrLeaveGroup;
private LinearLayout lnrGroupChat;
private ProgressBar pbrMessage;
private ArrayList<SmartListItem> pendingSmartListItems = new ArrayList<SmartListItem>();
private ArrayList<SmartListItem> listData = new ArrayList<SmartListItem>();
private HashMap<String,String> IN_CHAT_USER;
private SmartListAdapterWithHolder adapterWithHolder;
private AQuery androidQuery;
private JBoloChatManager chatManager;
private JBoloChatDataProvider provider;
final private int DOWNLOAD_FILE_LOCATION = 5;
final private int UPLOAD_FILE_LOCATION = 4;
final private int GROUP_CHAT = 3;
private String IN_CHAT_USER_NAME;
private String nodeId;
private String messageType;
private String downlodFileUrl="";
Drawable d = null;
private LinkedHashMap<String,Integer> smiley = new LinkedHashMap<String, Integer>(){
{
put(":)", R.drawable.jbolo_chat_smiley1);
put(":(", R.drawable.jbolo_chat_smiley2);
put(";)", R.drawable.jbolo_chat_smiley3);
put(";(", R.drawable.jbolo_chat_smiley4);
put("B-)", R.drawable.jbolo_chat_smiley5);
put(":D", R.drawable.jbolo_chat_smiley6);
put(":o", R.drawable.jbolo_chat_smiley7);
put(":-3", R.drawable.jbolo_chat_smiley8);
}
};
/**
* Overrides methods
*/
@Override
public int setLayoutId() {
return R.layout.jbolo_chat_message_list;
}
@Override
public void initComponents() {
lstMessage = (ListView) findViewById(R.id.lstMessage);
voiceMessager = (IjoomerVoiceAndTextMessager) findViewById(R.id.voiceMessager);
lnrHistory = (LinearLayout) findViewById(R.id.lnrHistory);
lnrSendFile = (LinearLayout) findViewById(R.id.lnrSendFile);
lnrClearConversion = (LinearLayout) findViewById(R.id.lnrClearConversion);
lnrGroupChat = (LinearLayout) findViewById(R.id.lnrGroupChat);
lnrLeaveGroup = (LinearLayout) findViewById(R.id.lnrLeaveGroup);
pbrMessage = (ProgressBar) findViewById(R.id.pbrMessage);
androidQuery = new AQuery(this);
provider = new JBoloChatDataProvider(this);
chatManager = JBoloChatManager.getInstance(this);
chatManager.setCurrentChatId("0");
}
@Override
public void prepareViews() {
lstMessage.setTranscriptMode(ListView.TRANSCRIPT_MODE_ALWAYS_SCROLL);
lstMessage.setStackFromBottom(true);
adapterWithHolder = getListAdapter();
lstMessage.setAdapter(adapterWithHolder);
getIntentData();
setConfig();
}
@Override
protected void onResume() {
super.onResume();
chatManager.setCurrentChatId(nodeId);
}
@Override
protected void onDestroy() {
super.onDestroy();
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if (resultCode == Activity.RESULT_OK) {
if (requestCode == DOWNLOAD_FILE_LOCATION) {
final String path = data.getStringExtra("IN_PATH");
if(downlodFileUrl.trim().length()>0){
int startIndex = downlodFileUrl.lastIndexOf("=") + 1;
String downlodFileName = downlodFileUrl.substring(startIndex,downlodFileUrl.length());
androidQuery.download(downlodFileUrl, new File(path + downlodFileName), new AjaxCallback<File>() {
@Override
public void callback(String url, File object, AjaxStatus status) {
super.callback(url, object, status);
if(status.getCode()==200){
downlodFileUrl="";
IjoomerUtilities.getCustomOkDialog(getString(R.string.download),getString(R.string.jbolo_chat_file_downloaded_successfully), getString(R.string.ok), R.layout.ijoomer_ok_dialog, new CustomAlertNeutral() {
@Override
public void NeutralMethod() {
}
});
}else{
IjoomerUtilities.getCustomOkDialog(getString(R.string.download), status.getMessage(), getString(R.string.ok), R.layout.ijoomer_ok_dialog, new CustomAlertNeutral() {
@Override
public void NeutralMethod() {
}
});
}
}
});
}
} else if (requestCode == UPLOAD_FILE_LOCATION) {
final String path = data.getStringExtra("IN_PATH");
if ((new File(path).length() / (1024 * 1024)) > IjoomerGlobalConfiguration.getJboloChatSendFileMaxLimit()) {
IjoomerUtilities.getCustomOkDialog(getString(R.string.video), getString(R.string.jbolo_chat_file_select_size_limit_exceeded), getString(R.string.ok),
R.layout.ijoomer_ok_dialog, new CustomAlertNeutral() {
@Override
public void NeutralMethod() {
}
});
}else{
onResume();
HashMap<String, String> hashMap = new HashMap<String, String>();
hashMap.put(FROMID, "0");
hashMap.put("custom", "");
hashMap.put(MESSAGE, "Sending File...");
final SmartListItem item = new SmartListItem();
item.setItemLayout(R.layout.jbolo_chat_message_list_item);
ArrayList<Object> obj = new ArrayList<Object>();
obj.add(hashMap);
item.setValues(obj);
pendingSmartListItems.add(item);
adapterWithHolder.add(item);
provider.sendFile(nodeId,path, new WebCallListener() {
@Override
public void onProgressUpdate(int progressCount) {
}
@Override
public void onCallComplete(int responseCode, String errorMessage, ArrayList<HashMap<String, String>> data1, Object data2) {
pendingSmartListItems.remove(item);
if(responseCode==400) {
IjoomerUtilities.getCustomOkDialog(getString(R.string.jbolochat), getString(R.string.jbolo_chat_unauthorized_do_this),
getString(R.string.ok), R.layout.ijoomer_ok_dialog, new CustomAlertNeutral() {
@Override
public void NeutralMethod() {
}
});
}else{
responseErrorMessageHandler(responseCode);
}
}
});
}
}else if(requestCode==GROUP_CHAT){
nodeId = data.getStringExtra("NODEID");
chatManager.setCurrentChatId(nodeId);
((IjoomerTextView)getHeaderView().findViewById(R.id.txtHeader)).setText("Group chat");
lnrLeaveGroup.setVisibility(View.VISIBLE);
}
}
}
@Override
public void setActionListeners() {
lnrLeaveGroup.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
IjoomerUtilities.getCustomConfirmDialog(getString(R.string.jbolo_chat_leave_group), getString(R.string.jbolo_chat_are_you_sure_leave_group), getString(R.string.yes), getString(R.string.no),
new CustomAlertMagnatic() {
@Override
public void PositiveMethod() {
final SeekBar proSeekBar = IjoomerUtilities.getLoadingDialog(getString(R.string.dialog_loading_sending_request));
provider.leavrGroup(nodeId, new WebCallListener() {
@Override
public void onCallComplete(int responseCode, String errorMessage, ArrayList<HashMap<String, String>> data1, Object data2) {
if(responseCode==200){
IjoomerUtilities.getCustomOkDialog(getString(R.string.jbolochat), getString(R.string.jbolo_chat_leave_group_successfully),
getString(R.string.ok), R.layout.ijoomer_ok_dialog, new CustomAlertNeutral() {
@Override
public void NeutralMethod() {
finish();
}
});
}else{
responseErrorMessageHandler(responseCode);
}
}
@Override
public void onProgressUpdate(int progressCount) {
proSeekBar.setProgress(progressCount);
}
});
}
@Override
public void NegativeMethod() {
}
});
}
});
lnrGroupChat.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
try {
loadNewResult(JboloInviteUserListActivity.class,JboloMessageListActivity.this,GROUP_CHAT,"IN_NODEID",nodeId);
} catch (Throwable e) {
e.printStackTrace();
}
}
});
lnrClearConversion.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
IjoomerUtilities.getCustomConfirmDialog(getString(R.string.jbolo_chat_clearconversion), getString(R.string.jbolo_chat_are_you_sure_clear_conversion), getString(R.string.yes), getString(R.string.no),
new CustomAlertMagnatic() {
@Override
public void PositiveMethod() {
provider.clearConversion(nodeId);
}
@Override
public void NegativeMethod() {
}
});
}
});
lnrHistory.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
try {
loadNew(JboloHistoryListActivity.class,JboloMessageListActivity.this,false,"IN_NODEID",nodeId,"IN_CHAT_USER_NAME",IN_CHAT_USER.size()>0?IN_CHAT_USER.get(USERNAME):IN_CHAT_USER_NAME);
} catch (Throwable e) {
e.printStackTrace();
}
}
});
lnrSendFile.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Intent intent = new Intent(JboloMessageListActivity.this, IjoomerFileChooserActivity.class);
intent.putExtra("IN_ISOPENFILE", true);
startActivityForResult(intent, UPLOAD_FILE_LOCATION);
}
});
chatManager.addJBoloChatHandler(new JBoloChatHandler() {
@Override
public void onUserOnlineUpdated(ArrayList<HashMap<String, String>> userOnline) {
}
@Override
public void onMessageUpdate(ArrayList<HashMap<String, String>> onMessage) {
pbrMessage.setVisibility(View.GONE);
prepareList(onMessage);
}
});
voiceMessager.setEmojisListener(new IjoomerVoiceAndTextMessager.EmojisListener() {
@Override
public LinkedHashMap<String, Integer> getEmojisSet() {
return smiley;
}
});
voiceMessager.setMessageHandler(new IjoomerVoiceAndTextMessager.MessageHandler() {
@Override
public void onVoiceMessageRecordingComplete(String message, String voiceMessagePath) {
}
@Override
public void onButtonSend(String message) {
hideSoftKeyboard();
HashMap<String, String> hashMap = new HashMap<String, String>();
hashMap.put(FROMID, "0");
hashMap.put("custom", "");
hashMap.put(MESSAGE, message);
final SmartListItem item = new SmartListItem();
item.setItemLayout(R.layout.jbolo_chat_message_list_item);
ArrayList<Object> obj = new ArrayList<Object>();
obj.add(hashMap);
item.setValues(obj);
pendingSmartListItems.add(item);
adapterWithHolder.add(item);
provider.sendChat(nodeId, message, new WebCallListener() {
@Override
public void onCallComplete(int responseCode, String errorMessage, ArrayList<HashMap<String, String>> data1, Object data2) {
pendingSmartListItems.remove(item);
if(responseCode==200){
prepareList(provider.getMessageDB(nodeId));
}else if(responseCode==400) {
IjoomerUtilities.getCustomOkDialog(getString(R.string.jbolochat), getString(R.string.jbolo_chat_unauthorized_do_this),
getString(R.string.ok), R.layout.ijoomer_ok_dialog, new CustomAlertNeutral() {
@Override
public void NeutralMethod() {
}
});
}else{
responseErrorMessageHandler(responseCode);
}
}
@Override
public void onProgressUpdate(int progressCount) {
}
});
}
@Override
public void onToggle(int messager) {
}
});
}
@Override
public void onCheckedChanged(RadioGroup arg0, int arg1) {
}
/**
* Class methods
*/
/**
* This method used to set jbolo extension config.
*/
private void setConfig(){
if(IjoomerGlobalConfiguration.isJboloChatGetHistory()){
lnrHistory.setVisibility(View.VISIBLE);
}
if(IjoomerGlobalConfiguration.isJboloChatSendFile()){
lnrSendFile.setVisibility(View.VISIBLE);
}
if(IjoomerGlobalConfiguration.isJboloChatGroupChat()){
lnrGroupChat.setVisibility(View.VISIBLE);
}
}
/**
* This method used to get intent data.
*/
private void getIntentData(){
IN_CHAT_USER = ((HashMap<String, String>) getIntent().getSerializableExtra("IN_CHAT_USER")) == null ? new HashMap<String, String>() : ((HashMap<String, String>) getIntent()
.getSerializableExtra("IN_CHAT_USER"));
nodeId = getIntent().getStringExtra("IN_NODEID")!=null ?getIntent().getStringExtra("IN_NODEID"):"";
IN_CHAT_USER_NAME = getIntent().getStringExtra("IN_CHAT_USER_NAME")!=null ? getIntent().getStringExtra("IN_CHAT_USER_NAME"):"";
messageType = getIntent().getStringExtra("IN_MESSAGE_TYPE")!=null ?getIntent().getStringExtra("IN_MESSAGE_TYPE"):"";
if(nodeId.trim().length()>0){
chatManager.setCurrentChatId(nodeId);
}else{
getNodeId(IN_CHAT_USER.get(USERID));
}
if(IN_CHAT_USER.size()>0){
((IjoomerTextView)getHeaderView().findViewById(R.id.txtHeader)).setText(IN_CHAT_USER.get(USERNAME));
((IjoomerTextView)getHeaderView().findViewById(R.id.txtHeader)).setVisibility(View.VISIBLE);
}else{
((IjoomerTextView)getHeaderView().findViewById(R.id.txtHeader)).setText(IN_CHAT_USER_NAME);
((IjoomerTextView)getHeaderView().findViewById(R.id.txtHeader)).setVisibility(View.VISIBLE);
}
if(messageType.trim().length()>0){
if(messageType.equals("2")){
lnrLeaveGroup.setVisibility(View.VISIBLE);
}
}
}
/**
* This method used to get node id.
* @param pid represented receiver user id
*/
private void getNodeId(final String pid){
provider.getNodeId(pid,new WebCallListener() {
@Override
public void onCallComplete(int responseCode, String errorMessage, ArrayList<HashMap<String, String>> data1, Object data2) {
if(responseCode==200){
nodeId = data1.get(0).get("nid");
chatManager.setCurrentChatId(nodeId);
}else{
if(responseCode==400){
IjoomerUtilities.getCustomOkDialog(getString(R.string.jbolochat), errorMessage,
getString(R.string.ok), R.layout.ijoomer_ok_dialog, new CustomAlertNeutral() {
@Override
public void NeutralMethod() {
finish();
}
});
}else{
responseErrorMessageHandler(responseCode);
}
}
}
@Override
public void onProgressUpdate(int progressCount) {
}
});
}
/**
* This method used to shown response message.
*
* @param responseCode
* represented response code
*/
private void responseErrorMessageHandler(final int responseCode) {
IjoomerUtilities.getCustomOkDialog(getString(R.string.jbolochat), getString(getResources().getIdentifier("code" + responseCode, "string", getPackageName())),
getString(R.string.ok), R.layout.ijoomer_ok_dialog, new CustomAlertNeutral() {
@Override
public void NeutralMethod() {
}
});
}
/**
* This method used to prepare chat.
* @param data represented chat data
*/
public void prepareList(ArrayList<HashMap<String, String>> data) {
listData.clear();
if(data!=null && data.size()>0){
for (HashMap<String, String> hashMap : data) {
SmartListItem item = new SmartListItem();
item.setItemLayout(R.layout.jbolo_chat_message_list_item);
ArrayList<Object> obj = new ArrayList<Object>();
obj.add(hashMap);
item.setValues(obj);
listData.add(item);
}
for (int i = 0; i < pendingSmartListItems.size(); i++) {
listData.add(pendingSmartListItems.get(i));
}
}
adapterWithHolder.notifyDataSetChanged();
}
/**
* List adapter chat.
*/
private SmartListAdapterWithHolder getListAdapter() {
SmartListAdapterWithHolder adapterWithHolder = new SmartListAdapterWithHolder(this, R.layout.jbolo_chat_message_list_item, listData, new ItemView() {
@Override
public View setItemView(final int position, View v, SmartListItem item, final ViewHolder holder) {
holder.lnrChatOthers = (LinearLayout) v.findViewById(R.id.lnrChatOthers);
holder.imgChatOthersUser = (ImageView) v.findViewById(R.id.imgChatOthersUser);
holder.txtChatOthersUserName = (IjoomerTextView) v.findViewById(R.id.txtChatOthersUserName);
holder.txtChatOthersMessage = (IjoomerTextView) v.findViewById(R.id.txtChatOthersMessage);
holder.txtChatOthersDate = (IjoomerTextView) v.findViewById(R.id.txtChatOthersDate);
holder.lnrChatMe = (LinearLayout) v.findViewById(R.id.lnrChatMe);
holder.txtMeChatDate = (IjoomerTextView) v.findViewById(R.id.txtMeChatDate);
holder.txtMeChatMessage = (IjoomerTextView) v.findViewById(R.id.txtMeChatMessage);
holder.pbrMeChatLoading = (ProgressBar) v.findViewById(R.id.pbrMeChatLoading);
holder.pbrMeChatLoading.setVisibility(View.GONE);
holder.lnrChat = (LinearLayout) v.findViewById(R.id.lnrChat);
holder.txtChatMessage = (IjoomerTextView) v.findViewById(R.id.txtChatMessage);
final HashMap<String, String> row = (HashMap<String, String>) item.getValues().get(0);
if (row.get(FROMID).equals("-1")) {
holder.lnrChat.setVisibility(View.VISIBLE);
holder.lnrChatOthers.setVisibility(View.GONE);
holder.lnrChatMe.setVisibility(View.GONE);
holder.txtChatMessage.setVisibility(View.VISIBLE);
holder.txtChatMessage.setText(Html.fromHtml(row.get(MESSAGE).trim()));
}else if (row.get(FROMID).equals("0")) {
if (row.containsKey(CUSTOM)) {
holder.pbrMeChatLoading.setVisibility(View.VISIBLE);
}
holder.lnrChatMe.setVisibility(View.VISIBLE);
holder.lnrChatOthers.setVisibility(View.GONE);
holder.lnrChat.setVisibility(View.GONE);
SimpleDateFormat ft = new SimpleDateFormat("dd MMM hh:mm a");
try {
holder.txtMeChatDate.setText(ft.format(new Date(IjoomerUtilities.getMillisecondsTimeZone(Long.parseLong(row.get(TIMESTAMP))))));
} catch (Exception e) {
holder.txtMeChatDate.setText("");
}
holder.txtMeChatMessage.setVisibility(View.VISIBLE);
SpannableStringBuilder builder;
try {
URLImageParser p = new URLImageParser(holder.txtMeChatMessage, JboloMessageListActivity.this);
builder = (SpannableStringBuilder) Html.fromHtml(row.get(MESSAGE).trim(), p, null);
} catch (Throwable e) {
builder = (SpannableStringBuilder) Html.fromHtml(row.get(MESSAGE));
}
builder = (SpannableStringBuilder) IjoomerUtilities.RichTextUtils.replaceAll(builder, URLSpan.class, new IjoomerUtilities.URLSpanConverter(new IjoomerUtilities.SpnebleListener() {
@Override
public void onUrlClick(String url) {
downlodFileUrl = url;
Intent intent = new Intent(JboloMessageListActivity.this, IjoomerFileChooserActivity.class);
startActivityForResult(intent, DOWNLOAD_FILE_LOCATION);
}
}));
holder.txtMeChatMessage.setMovementMethod(LinkMovementMethod.getInstance());
holder.txtMeChatMessage.setText(builder);
}else{
holder.lnrChatOthers.setVisibility(View.VISIBLE);
holder.lnrChatMe.setVisibility(View.GONE);
holder.lnrChat.setVisibility(View.GONE);
holder.imgChatOthersUser.setVisibility(View.VISIBLE);
androidQuery.id(holder.imgChatOthersUser).image(row.get(AVTR), true, true);
holder.txtChatOthersUserName.setVisibility(View.VISIBLE);
holder.txtChatOthersUserName.setText(row.get(FROMNAME));
SimpleDateFormat ft = new SimpleDateFormat("dd MMM hh:mm a");
try {
holder.txtChatOthersDate.setText(ft.format(new Date(IjoomerUtilities.getMillisecondsTimeZone(Long.parseLong(row.get(TIMESTAMP))))));
} catch (Exception e) {
holder.txtChatOthersDate.setText("");
}
holder.txtChatOthersMessage.setVisibility(View.VISIBLE);
SpannableStringBuilder builder;
try {
URLImageParser p = new URLImageParser(holder.txtChatOthersMessage, JboloMessageListActivity.this);
builder = (SpannableStringBuilder) Html.fromHtml(row.get(MESSAGE).trim(), p, null);
} catch (Throwable e) {
builder = (SpannableStringBuilder) Html.fromHtml(row.get(MESSAGE));
}
builder = (SpannableStringBuilder) IjoomerUtilities.RichTextUtils.replaceAll(builder, URLSpan.class, new IjoomerUtilities.URLSpanConverter(new IjoomerUtilities.SpnebleListener() {
@Override
public void onUrlClick(String url) {
downlodFileUrl = url;
Intent intent = new Intent(JboloMessageListActivity.this, IjoomerFileChooserActivity.class);
startActivityForResult(intent, DOWNLOAD_FILE_LOCATION);
}
}));
holder.txtChatOthersMessage.setMovementMethod(LinkMovementMethod.getInstance());
holder.txtChatOthersMessage.setText(builder);
}
return v;
}
@Override
public View setItemView(int position, View v, SmartListItem item) {
return null;
}
});
return adapterWithHolder;
}
}