package com.openerp.addons.message; import java.util.ArrayList; import java.util.List; import java.util.TimeZone; import com.openerp.OEArguments; import org.json.JSONArray; import org.json.JSONObject; import android.annotation.SuppressLint; import android.app.Activity; import android.app.ProgressDialog; import android.content.Context; import android.content.Intent; import android.os.AsyncTask; import android.os.Bundle; import android.text.TextUtils; import android.util.Log; import android.view.LayoutInflater; import android.view.Menu; import android.view.MenuInflater; import android.view.MenuItem; import android.view.View; import android.view.View.OnClickListener; import android.view.ViewGroup; import android.webkit.WebView; import android.widget.ImageView; import android.widget.ListView; import android.widget.TextView; import android.widget.Toast; import com.openerp.R; import com.openerp.orm.OEDataRow; import com.openerp.orm.OEHelper; import com.openerp.orm.OEValues; import com.openerp.support.BaseFragment; import com.openerp.support.OEUser; import com.openerp.support.listview.OEListAdapter; import com.openerp.util.Base64Helper; import com.openerp.util.OEBinaryDownloadHelper; import com.openerp.util.OEDate; import com.openerp.util.OEFileSizeHelper; import com.openerp.util.contactview.OEContactView; import com.openerp.util.drawer.DrawerItem; import com.openerp.util.drawer.DrawerListener; public class MessageDetail extends BaseFragment implements OnClickListener { public static final String TAg = "com.openerp.addons.message.MessageDetail"; private static final int MESSAGE_REPLY = 3; View mView = null; Integer mMessageId = null; OEDataRow mMessageData = null; ListView mMessageListView = null; OEListAdapter mMessageListAdapter = null; List<Object> mMessageObjects = new ArrayList<Object>(); MessageLoader mMessageLoader = null; StarredOperation mStarredOperation = null; ReadUnreadOperation mReadUnreadOperation = null; Integer[] mStarredDrawables = new Integer[] { R.drawable.ic_action_starred, R.drawable.ic_action_unstarred }; @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { setHasOptionsMenu(true); mView = inflater.inflate(R.layout.fragment_message_detail_view, container, false); init(); return mView; } private void init() { Log.d(TAg, "MessageDetail->init()"); Bundle bundle = getArguments(); if (bundle != null) { mMessageId = bundle.getInt("message_id"); mMessageData = db().select(mMessageId); initControls(); mMessageLoader = new MessageLoader(mMessageId); mMessageLoader.execute(); } } private void initControls() { mMessageListView = (ListView) mView.findViewById(R.id.lstMessageDetail); mMessageListAdapter = new OEListAdapter(getActivity(), R.layout.fragment_message_detail_listview_items, mMessageObjects) { @Override public View getView(int position, View convertView, ViewGroup parent) { View mView = convertView; if (mView == null) mView = getActivity().getLayoutInflater().inflate( getResource(), parent, false); mView = createListViewRow(mView, position); return mView; } }; mMessageListView.setAdapter(mMessageListAdapter); } @SuppressLint("CutPasteId") private View createListViewRow(View mView, final int position) { final OEDataRow row = (OEDataRow) mMessageObjects.get(position); TextView txvAuthor, txvEmail, txvTime, txvTo; final TextView txvVoteNumber; txvAuthor = (TextView) mView.findViewById(R.id.txvMessageAuthor); txvEmail = (TextView) mView.findViewById(R.id.txvAuthorEmail); txvTime = (TextView) mView.findViewById(R.id.txvTime); txvTo = (TextView) mView.findViewById(R.id.txvTo); txvVoteNumber = (TextView) mView.findViewById(R.id.txvmessageVotenb); String author = row.getString("email_from"); String email = author; OEDataRow author_id = null; if (author.equals("false")) { author_id = row.getM2ORecord("author_id").browse(); if (author_id != null) { author = author_id.getString("name"); email = author_id.getString("email"); } } txvAuthor.setText(author); txvEmail.setText(email); txvTime.setText(OEDate.getDate(row.getString("date"), TimeZone .getDefault().getID(), "MMM dd, yyyy, hh:mm a")); List<String> partners = new ArrayList<String>(); String partnersName = "none"; for (OEDataRow partner : row.getM2MRecord("partner_ids").browseEach()) { if (partner.getInt("id") == OEUser.current(getActivity()) .getPartner_id()) partners.add("me"); else partners.add(partner.getString("name")); } if (partners.size() > 0) partnersName = TextUtils.join(", ", partners.toArray(new String[partners.size()])); txvTo.setText(partnersName); /* Handling vote control */ txvVoteNumber.setText(row.getString("vote_nb")); int vote_nb = 0; if (!row.getString("vote_nb").equals("false")) vote_nb = row.getInt("vote_nb"); if (vote_nb == 0) { txvVoteNumber.setText(""); } boolean hasVoted = row.getBoolean("has_voted"); if (!hasVoted) { txvVoteNumber.setCompoundDrawablesWithIntrinsicBounds( getResources().getDrawable( R.drawable.ic_thumbs_up_unselected_dark_tablet), null, null, null); } else { txvVoteNumber.setCompoundDrawablesWithIntrinsicBounds( getResources().getDrawable( R.drawable.ic_thumbs_up_selected_dark_tablet), null, null, null); } txvVoteNumber.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { handleVoteToggle(position, txvVoteNumber, row); } }); WebView webView = (WebView) mView.findViewById(R.id.webViewMessageBody); webView.loadData(row.getString("body"), "text/html;charset=UTF-8", null); // Handling attachment for each message showAttachments(row.getM2MRecord("attachment_ids").browseEach(), mView); ImageView imgUserPicture, imgBtnStar; imgUserPicture = (ImageView) mView.findViewById(R.id.imgUserPicture); imgBtnStar = (ImageView) mView.findViewById(R.id.imgBtnStar); // Handling starred event final boolean starred = row.getBoolean("starred"); imgBtnStar.setImageResource((starred) ? mStarredDrawables[0] : mStarredDrawables[1]); imgBtnStar.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { // Handling Starred click event mStarredOperation = new StarredOperation(position, (starred) ? false : true); mStarredOperation.execute(); } }); if (author_id != null && !author_id.getString("image_small").equals("false")) { imgUserPicture.setImageBitmap(Base64Helper.getBitmapImage( getActivity(), author_id.getString("image_small"))); } // Handling reply button click event mView.findViewById(R.id.imgBtnReply).setOnClickListener(this); // handling contact view OEContactView oe_contactView = (OEContactView) mView .findViewById(R.id.imgUserPicture); int partner_id = 0; if (author_id != null) partner_id = author_id.getInt("id"); oe_contactView.assignPartnerId(partner_id); return mView; } private void showAttachments(List<OEDataRow> attachments, View mView) { if (attachments != null && attachments.size() > 0) { ViewGroup attachmentViewGroup = (ViewGroup) mView .findViewById(R.id.gridAttachments); LayoutInflater inflater = getActivity().getLayoutInflater(); attachmentViewGroup.removeAllViews(); int index = 0; for (OEDataRow attachment : attachments) { View attachmentView = inflater.inflate( R.layout.fragment_message_detail_attachment_grid_item, null, false); TextView txvAttachmentName = (TextView) attachmentView .findViewById(R.id.txvFileName); txvAttachmentName.setText(attachment.get("name").toString()); TextView txvAttachmentSize = (TextView) attachmentView .findViewById(R.id.txvFileSize); long fileSize = Long.parseLong(attachment .getString("file_size")); String file_size = OEFileSizeHelper.readableFileSize(fileSize); txvAttachmentSize.setText((file_size.equals("0")) ? " " : file_size); TextView txvAttachmentId = (TextView) attachmentView .findViewById(R.id.txvAttachmentId); txvAttachmentId.setText(attachment.getString("id")); attachmentViewGroup.addView(attachmentView, index, new ViewGroup.LayoutParams( ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT)); attachmentView.setOnClickListener(this); index++; } } else { mView.findViewById(R.id.layoutMessageAttachments).setVisibility( View.GONE); } } @Override public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { inflater.inflate(R.menu.menu_fragment_message_detail, menu); } @Override public boolean onOptionsItemSelected(MenuItem item) { // handle item selection switch (item.getItemId()) { case R.id.menu_message_detail_read: mReadUnreadOperation = new ReadUnreadOperation(false); mReadUnreadOperation.execute(); return true; case R.id.menu_message_detail_unread: mReadUnreadOperation = new ReadUnreadOperation(true); mReadUnreadOperation.execute(); return true; default: return super.onOptionsItemSelected(item); } } @Override public Object databaseHelper(Context context) { return new MessageDB(context); } @Override public List<DrawerItem> drawerMenus(Context context) { return null; } class MessageLoader extends AsyncTask<Void, Void, Void> { int mMessageId = 0; public MessageLoader(int message_id) { mMessageId = message_id; mView.findViewById(R.id.loadingProgress) .setVisibility(View.VISIBLE); } @Override protected Void doInBackground(Void... params) { mMessageObjects.clear(); List<OEDataRow> childs = db().select("parent_id = ?", new String[] { mMessageId + "" }, null, null, "date DESC"); mMessageObjects.add(mMessageData); mMessageObjects.addAll(childs); return null; } @Override protected void onPostExecute(Void result) { mView.findViewById(R.id.loadingProgress).setVisibility(View.GONE); mMessageListAdapter.notifiyDataChange(mMessageObjects); TextView txvTitle = (TextView) mView .findViewById(R.id.txvMessageTitle); String title = mMessageData.getString("subject"); if (title.equals("false")) { title = mMessageData.getString("type"); } if (!mMessageData.getString("record_name").equals("false")) title = mMessageData.getString("record_name"); txvTitle.setText(title); } } /** * When user press Reply button or download attachment. */ @Override public void onClick(View v) { if (v.findViewById(R.id.txvAttachmentId) != null) { // when click on attachment download int attachment_id = Integer.parseInt(((TextView) v .findViewById(R.id.txvAttachmentId)).getText().toString()); OEBinaryDownloadHelper binaryDownload = new OEBinaryDownloadHelper(); binaryDownload.downloadBinary(attachment_id, db(), getActivity()); } else { // when click on reply message Intent composeIntent = new Intent(getActivity(), MessageComposeActivity.class); composeIntent.putExtra("message_id", mMessageId); composeIntent.putExtra("send_reply", true); startActivityForResult(composeIntent, MESSAGE_REPLY); } } @Override public void onActivityResult(int requestCode, int resultCode, Intent data) { if (requestCode == MESSAGE_REPLY && resultCode == Activity.RESULT_OK) { int newId = data.getIntExtra("new_message_id", 0); mMessageObjects.add(1, db().select(newId)); mMessageListAdapter.notifiyDataChange(mMessageObjects); } } /** * Marking each row starred/unstarred in background */ public class StarredOperation extends AsyncTask<Void, Void, Boolean> { boolean mStarred = false; boolean isConnection = true; OEHelper mOE = null; ProgressDialog mProgressDialog = null; int mPosition = -1; public StarredOperation(int position, boolean starred) { mStarred = starred; mOE = db().getOEInstance(); mPosition = position; if (mOE == null) isConnection = false; mProgressDialog = new ProgressDialog(getActivity()); mProgressDialog.setMessage("Working..."); if (isConnection) { mProgressDialog.show(); } } @Override protected Boolean doInBackground(Void... params) { if (!isConnection) { return false; } JSONArray mIds = new JSONArray(); OEDataRow row = (OEDataRow) mMessageObjects.get(mPosition); mIds.put(row.getInt("id")); OEArguments args = new OEArguments(); // Param 1 : message_ids list args.add(mIds); // Param 2 : starred - boolean value args.add(mStarred); // Param 3 : create_missing - If table does not contain any value // for // this row than create new one args.add(true); // Creating Local Database Requirement Values OEValues values = new OEValues(); String value = (mStarred) ? "true" : "false"; values.put("starred", value); boolean response = (Boolean) mOE.call_kw("set_message_starred", args, null); response = (!mStarred && !response) ? true : response; if (response) { try { for (int i = 0; i < mIds.length(); i++) db().update(values, mIds.getInt(i)); } catch (Exception e) { } } return response; } @Override protected void onPostExecute(Boolean result) { if (result) { OEDataRow row = (OEDataRow) mMessageObjects.get(mPosition); row.put("starred", mStarred); mMessageListAdapter.notifiyDataChange(mMessageObjects); DrawerListener drawer = (DrawerListener) getActivity(); drawer.refreshDrawer(Message.TAG); } else { Toast.makeText(getActivity(), "No connection", Toast.LENGTH_LONG).show(); } mProgressDialog.dismiss(); } } /** * Making message read or unread or Archive */ public class ReadUnreadOperation extends AsyncTask<Void, Void, Boolean> { ProgressDialog mProgressDialog = null; boolean mToRead = false; boolean isConnection = true; OEHelper mOE = null; public ReadUnreadOperation(boolean toRead) { mOE = db().getOEInstance(); if (mOE == null) isConnection = false; mToRead = toRead; mProgressDialog = new ProgressDialog(getActivity()); mProgressDialog.setMessage("Working..."); if (isConnection) { mProgressDialog.show(); } } @Override protected Boolean doInBackground(Void... params) { if (!isConnection) return false; boolean flag = false; String default_model = "false"; JSONArray ids = new JSONArray(); int parent_id = 0, res_id = 0; parent_id = mMessageData.getInt("id"); res_id = mMessageData.getInt("res_id"); default_model = mMessageData.getString("model"); ids.put(parent_id); for (OEDataRow child : db().select("parent_id = ? ", new String[] { parent_id + "" })) { ids.put(child.getInt("id")); } if (toggleReadUnread(mOE, ids, default_model, res_id, parent_id, mToRead)) { flag = true; } return flag; } @Override protected void onPostExecute(Boolean result) { if (result) { DrawerListener drawer = (DrawerListener) getActivity(); drawer.refreshDrawer(Message.TAG); } else { Toast.makeText(getActivity(), "No connection", Toast.LENGTH_LONG).show(); } mProgressDialog.dismiss(); } } /* Method for Make Message as Read,Unread and Archive */ private boolean toggleReadUnread(OEHelper oe, JSONArray ids, String default_model, int res_id, int parent_id, boolean to_read) { boolean flag = false; JSONObject newContext = new JSONObject(); OEArguments args = new OEArguments(); try { if (default_model.equals("false")) { newContext.put("default_model", false); } else { newContext.put("default_model", default_model); } newContext.put("default_res_id", res_id); newContext.put("default_parent_id", parent_id); // Param 1 : message_ids list args.add(ids); // Param 2 : to_read - boolean value args.add((to_read) ? false : true); // Param 3 : create_missing - If table does not contain any value // for // this row than create new one args.add(true); // Param 4 : context args.add(newContext); // Creating Local Database Requirement Values OEValues values = new OEValues(); String value = (to_read) ? "true" : "false"; values.put("starred", false); values.put("to_read", value); int result = (Integer) oe.call_kw("set_message_read", args, null); if (result > 0) { for (int i = 0; i < ids.length(); i++) { int id = ids.getInt(i); db().update(values, id); } flag = true; } } catch (Exception e) { e.printStackTrace(); } return flag; } private void handleVoteToggle(int position, TextView view, Object obj) { OEDataRow row = (OEDataRow) obj; int vote_nb = row.getInt("vote_nb"); boolean hasVoted = row.getBoolean("has_voted"); MessageVoteToggle voteToggle = new MessageVoteToggle(row.getInt("id"), vote_nb, hasVoted); String newVote = ""; boolean btnvoted = false; if (hasVoted) { newVote = (vote_nb - 1) + ""; row.put("has_voted", "false"); } else { btnvoted = true; newVote = (vote_nb + 1) + ""; row.put("has_voted", "true"); } row.put("vote_nb", newVote); mMessageListAdapter.replaceObjectAtPosition(position, row); voteToggle.execute((Void) null); view.setText(newVote); if (!btnvoted) { view.setCompoundDrawablesWithIntrinsicBounds( getResources().getDrawable( R.drawable.ic_thumbs_up_unselected_dark_tablet), null, null, null); } else { view.setCompoundDrawablesWithIntrinsicBounds(getResources() .getDrawable(R.drawable.ic_thumbs_up_selected_dark_tablet), null, null, null); } if (newVote.equals("0")) { view.setText(""); } } private class MessageVoteToggle extends AsyncTask<Void, Void, Boolean> { int message_id = 0; int vote_nb = 0; boolean has_voted = false; public MessageVoteToggle(int message_id, int current_vote_nb, boolean has_voted) { this.message_id = message_id; this.vote_nb = current_vote_nb; this.has_voted = has_voted; } @Override protected Boolean doInBackground(Void... params) { OEHelper oe = db().getOEInstance(); if (oe == null) return false; try { OEArguments args = new OEArguments(); args.add(new JSONArray("[" + message_id + "]")); oe.call_kw("vote_toggle", args); OEValues values = new OEValues(); String vote = "false"; if (!this.has_voted) { vote = "true"; vote_nb = vote_nb + 1; } else { vote_nb = vote_nb - 1; } values.put("has_voted", vote); values.put("vote_nb", vote_nb); if (db().update(values, message_id) > 0) return true; } catch (Exception e) { e.printStackTrace(); } return false; } } }