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; } }