package com.openerp.addons.message; import java.io.File; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import com.openerp.OEArguments; import org.json.JSONArray; import org.json.JSONObject; import android.app.Activity; import android.content.ActivityNotFoundException; import android.content.ContentResolver; import android.content.Context; import android.content.Intent; import android.database.Cursor; import android.net.Uri; import android.os.AsyncTask; import android.os.Bundle; import android.provider.MediaStore; import android.text.TextUtils; import android.view.LayoutInflater; import android.view.Menu; import android.view.MenuItem; import android.view.View; import android.view.View.OnClickListener; import android.view.ViewGroup; import android.widget.EditText; import android.widget.GridView; import android.widget.ImageView; import android.widget.TextView; import android.widget.Toast; import com.openerp.R; import com.openerp.base.ir.Ir_AttachmentDBHelper; import com.openerp.base.res.ResPartnerDB; import com.openerp.orm.OEDataRow; import com.openerp.orm.OEHelper; import com.openerp.orm.OEM2MIds; import com.openerp.orm.OEM2MIds.Operation; import com.openerp.orm.OEValues; import com.openerp.support.OEUser; import com.openerp.support.listview.OEListAdapter; import com.openerp.support.listview.OEListAdapter.RowFilterTextListener; import com.openerp.util.Base64Helper; import com.openerp.util.HTMLHelper; import com.openerp.util.OEDate; import com.openerp.util.controls.OETextView; import com.openerp.util.tags.MultiTagsTextView.TokenListener; import com.openerp.util.tags.TagsView; import com.openerp.util.tags.TagsView.CustomTagViewListener; public class MessageComposeActivity extends Activity implements TokenListener { public static final String TAG = "com.openerp.addons.message.MessageComposeActivity"; public static final Integer PICKFILE_RESULT_CODE = 1; Context mContext = null; Boolean isReply = false; Boolean isQuickCompose = false; Integer mParentMessageId = 0; OEDataRow mMessageRow = null; HashMap<String, OEDataRow> mSelectedPartners = new HashMap<String, OEDataRow>(); /** * DBs */ ResPartnerDB mPartnerDB = null; MessageDB mMessageDB = null; PartnerLoader mPartnerLoader = null; enum AttachmentType { IMAGE, FILE } /** * Attachment URIs */ List<Uri> mAttachmentURIs = new ArrayList<Uri>(); List<Object> mAttachments = new ArrayList<Object>(); GridView mAttachmentGridView = null; OEListAdapter mAttachmentAdapter = null; /** * Controls & Adapters */ TagsView mPartnerTagsView = null; OEListAdapter mPartnerTagsAdapter = null; List<Object> mTagsPartners = new ArrayList<Object>(); EditText edtSubject = null, edtBody = null; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_message_compose); mContext = this; initDBs(); initActionbar(); handleIntent(); initControls(); checkForContact(); } private void initControls() { if (!isReply) { mPartnerLoader = new PartnerLoader(); mPartnerLoader.execute(); } mPartnerTagsView = (TagsView) findViewById(R.id.receipients_view); mPartnerTagsView.setCustomTagView(new CustomTagViewListener() { @Override public View getViewForTags(LayoutInflater layoutInflater, Object object, ViewGroup tagsViewGroup) { OEDataRow row = (OEDataRow) object; View mView = layoutInflater.inflate( R.layout.fragment_message_receipient_tag_layout, null); OETextView txvSubject = (OETextView) mView .findViewById(R.id.txvTagSubject); txvSubject.setText(row.getString("name")); ImageView imgPic = (ImageView) mView .findViewById(R.id.imgTagImage); if (!row.getString("image_small").equals("false")) { imgPic.setImageBitmap(Base64Helper.getBitmapImage( getApplicationContext(), row.getString("image_small"))); } return mView; } }); mPartnerTagsAdapter = new OEListAdapter(this, R.layout.tags_view_partner_item_layout, mTagsPartners) { @Override public View getView(int position, View convertView, ViewGroup parent) { View mView = convertView; if (mView == null) { mView = getLayoutInflater().inflate(getResource(), parent, false); } OEDataRow row = (OEDataRow) mTagsPartners.get(position); TextView txvSubject = (TextView) mView .findViewById(R.id.txvSubject); TextView txvSubSubject = (TextView) mView .findViewById(R.id.txvSubSubject); ImageView imgPic = (ImageView) mView .findViewById(R.id.imgReceipientPic); txvSubject.setText(row.getString("name")); if (!row.getString("email").equals("false")) { txvSubSubject.setText(row.getString("email")); } else { txvSubSubject.setText("No email"); } if (!row.getString("image_small").equals("false")) { imgPic.setImageBitmap(Base64Helper.getBitmapImage(mContext, row.getString("image_small"))); } return mView; } }; mPartnerTagsAdapter .setRowFilterTextListener(new RowFilterTextListener() { @Override public String filterCompareWith(Object object) { OEDataRow row = (OEDataRow) object; return row.getString("name") + " " + row.getString("email"); } }); mPartnerTagsView.setAdapter(mPartnerTagsAdapter); mPartnerTagsView.setPrefix("To: "); mPartnerTagsView.allowDuplicates(false); mPartnerTagsView.setTokenListener(this); // Attachment View mAttachmentGridView = (GridView) findViewById(R.id.lstAttachments); mAttachmentAdapter = new OEListAdapter(this, R.layout.activity_message_compose_attachment_file_view_item, mAttachments) { @Override public View getView(final int position, View convertView, ViewGroup parent) { OEDataRow row = (OEDataRow) mAttachments.get(position); View mView = convertView; if (mView == null) mView = getLayoutInflater().inflate(getResource(), parent, false); TextView txvFileName = (TextView) mView .findViewById(R.id.txvFileName); txvFileName.setText(row.getString("name")); ImageView imgAttachmentImg = (ImageView) mView .findViewById(R.id.imgAttachmentFile); if (row.getString("type").equals("file")) { imgAttachmentImg .setImageResource(R.drawable.file_attachment); } else { imgAttachmentImg.setImageURI((Uri) row.get("uri")); } mView.findViewById(R.id.imgBtnRemoveAttachment) .setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { mAttachmentURIs.remove(position); mAttachments.remove(position); mAttachmentAdapter .notifiyDataChange(mAttachments); } }); return mView; } }; mAttachmentGridView.setAdapter(mAttachmentAdapter); // Edittext edtSubject = (EditText) findViewById(R.id.edtMessageSubject); edtBody = (EditText) findViewById(R.id.edtMessageBody); } private void initDBs() { mPartnerDB = new ResPartnerDB(mContext); mMessageDB = new MessageDB(mContext); } private void checkForContact() { Intent intent = getIntent(); handleIntentFilter(intent); if (intent.getData() != null) { Cursor cursor = getContentResolver().query(intent.getData(), null, null, null, null); if (cursor.moveToFirst()) { int partner_id = cursor.getInt(cursor.getColumnIndex("data2")); OEDataRow row = mPartnerDB.select(partner_id); mSelectedPartners.put("key_" + row.getString("id"), row); mPartnerTagsView.addObject(row); isQuickCompose = true; } } if (isReply) { mMessageRow = mMessageDB.select(mParentMessageId); List<OEDataRow> partners = mMessageRow.getM2MRecord("partner_ids") .browseEach(); if (partners != null) { for (OEDataRow partner : partners) { if (OEUser.current(mContext).getPartner_id() != partner .getInt("id")) { mSelectedPartners.put("key_" + partner.getString("id"), partner); mPartnerTagsView.addObject(partner); } } } edtSubject.setText("Re: " + mMessageRow.getString("subject")); edtBody.requestFocus(); } } private void handleIntent() { Intent intent = getIntent(); String title = "Compose"; if (intent.hasExtra("send_reply")) { isReply = true; mParentMessageId = intent.getExtras().getInt("message_id"); title = "Reply"; } setTitle(title); } private void initActionbar() { getActionBar().setHomeButtonEnabled(true); getActionBar().setDisplayHomeAsUpEnabled(true); } @Override public boolean onCreateOptionsMenu(Menu menu) { getMenuInflater().inflate(R.menu.menu_message_compose_activty, menu); return true; } @Override public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { case android.R.id.home: finish(); return true; case R.id.menu_message_compose_add_attachment_images: requestForAttachmentIntent(AttachmentType.IMAGE); return true; case R.id.menu_message_compose_add_attachment_files: requestForAttachmentIntent(AttachmentType.FILE); return true; case R.id.menu_message_compose_send: edtSubject.setError(null); edtBody.setError(null); if (mSelectedPartners.size() == 0) Toast.makeText(mContext, "Select atleast one receiptent", Toast.LENGTH_LONG).show(); else if (TextUtils.isEmpty(edtSubject.getText())) { edtSubject.setError("Provide Message Subject !"); } else if (TextUtils.isEmpty(edtBody.getText())) { edtBody.setError("Provide Message Body !"); } else { Toast.makeText(this, "Sending message...", Toast.LENGTH_LONG) .show(); SendMessage sendMessage = new SendMessage(); sendMessage.execute(); if (isQuickCompose) finish(); } return true; } return super.onOptionsItemSelected(item); } class SendMessage extends AsyncTask<Void, Void, Void> { OEHelper mOE = null; boolean isConnection = true; String mToast = ""; int newMessageId = 0; public SendMessage() { mOE = mMessageDB.getOEInstance(); if (mOE == null) isConnection = false; } @Override protected Void doInBackground(Void... params) { if (isConnection) { Ir_AttachmentDBHelper attachment = new Ir_AttachmentDBHelper( mContext); JSONArray attachmentIds = new JSONArray(); OEHelper oe = attachment.getOEInstance(); List<Integer> attachment_ids_list = new ArrayList<Integer>(); for (Uri uri : mAttachmentURIs) { File fileData = new File(uri.getPath()); String filename = getFilenameFromUri(uri); OEValues values = new OEValues(); values.put("datas_fname", filename); values.put("res_model", "mail.compose.message"); values.put("company_id", OEUser.current(mContext) .getCompany_id()); values.put("type", "binary"); values.put("res_id", 0); values.put("file_size", fileData.length()); values.put("db_datas", Base64Helper.fileUriToBase64(uri, getContentResolver())); values.put("name", filename); if (oe != null) { long newId = oe.create(values); attachmentIds.put(newId); attachment_ids_list.add((int) newId); } } try { OEDataRow user = new ResPartnerDB(mContext) .select(OEUser.current(mContext).getPartner_id()); OEArguments args = new OEArguments(); // Partners JSONArray partners = new JSONArray(); List<Integer> partner_ids_list = new ArrayList<Integer>(); for (String key : mSelectedPartners.keySet()) { partners.put(mSelectedPartners.get(key).getInt("id")); partner_ids_list.add(mSelectedPartners.get(key).getInt( "id")); } JSONArray partner_ids = new JSONArray(); if (partners.length() > 0) { partner_ids.put(6); partner_ids.put(false); partner_ids.put(partners); } // attachment ids JSONArray attachment_ids = new JSONArray(); if (attachmentIds.length() > 0) { attachment_ids.put(6); attachment_ids.put(false); attachment_ids.put(attachmentIds); } if (!isReply) { mToast = "Message sent."; JSONObject arguments = new JSONObject(); arguments.put("composition_mode", "comment"); arguments.put("model", false); arguments.put("parent_id", false); String email_from = user.getString("name") + " <" + user.getString("email") + ">"; arguments.put("email_from", email_from); arguments.put("subject", edtSubject.getText() .toString()); arguments.put("body", edtBody.getText().toString()); arguments.put("post", true); arguments.put("notify", false); arguments.put("same_thread", true); arguments.put("use_active_domain", false); arguments.put("reply_to", false); arguments.put("res_id", 0); if (partner_ids.length() > 0) arguments.put("partner_ids", new JSONArray("[" + partner_ids.toString() + "]")); else arguments.put("partner_ids", new JSONArray()); if (attachment_ids.length() > 0) arguments.put("attachment_ids", new JSONArray("[" + attachment_ids.toString() + "]")); else arguments.put("attachment_ids", new JSONArray()); arguments.put("template_id", false); JSONObject kwargs = new JSONObject(); kwargs.put("context", mOE.updateContext(new JSONObject())); mOE.updateKWargs(kwargs); args.add(arguments); String model = "mail.compose.message"; // Creating compose message int id = (Integer) mOE.call_kw(model, "create", args, null); // Resetting kwargs mOE.updateKWargs(null); args = new OEArguments(); args.add(new JSONArray().put(id)); args.add(mOE.updateContext(new JSONObject())); // Sending mail mOE.call_kw(model, "send_mail", args, null); mOE.syncWithServer(); } else { mToast = "Message reply sent."; String model = "mail.thread"; String method = "message_post"; args = new OEArguments(); args.add(false); JSONObject context = new JSONObject(); int res_id = mMessageRow.getInt("res_id"); String res_model = mMessageRow.getString("model"); context.put("default_model", (res_model.equals("false") ? false : res_model)); context.put("default_res_id", (res_id == 0) ? false : res_id); context.put("default_parent_id", mParentMessageId); context.put("mail_post_autofollow", true); context.put("mail_post_autofollow_partner_ids", new JSONArray()); JSONObject kwargs = new JSONObject(); kwargs.put("context", context); kwargs.put("subject", edtSubject.getText().toString()); kwargs.put("body", edtBody.getText().toString()); kwargs.put("parent_id", mParentMessageId); kwargs.put("attachment_ids", attachmentIds); if (partner_ids.length() > 0) kwargs.put("partner_ids", new JSONArray("[" + partner_ids.toString() + "]")); else kwargs.put("partner_ids", new JSONArray()); mOE.updateKWargs(kwargs); newMessageId = (Integer) mOE.call_kw(model, method, args, null); // Creating local entry OEValues values = new OEValues(); OEM2MIds partnerIds = new OEM2MIds(Operation.ADD, partner_ids_list); values.put("id", newMessageId); values.put("partner_ids", partnerIds); values.put("subject", edtSubject.getText().toString()); values.put("type", "comment"); values.put("body", edtBody.getText().toString()); values.put("email_from", false); values.put("parent_id", mParentMessageId); values.put("record_name", false); values.put("to_read", false); values.put("author_id", user.getInt("id")); values.put("model", res_model); values.put("res_id", res_id); values.put("date", OEDate.getDate()); values.put("has_voted", false); values.put("vote_nb", 0); values.put("starred", false); OEM2MIds attachment_Ids = new OEM2MIds(Operation.ADD, attachment_ids_list); values.put("attachment_ids", attachment_Ids); newMessageId = (int) mMessageDB.create(values); } } catch (Exception e) { e.printStackTrace(); } } return null; } @Override protected void onPostExecute(Void result) { if (!isConnection) { Toast.makeText(mContext, "No Connection", Toast.LENGTH_LONG) .show(); } else { Toast.makeText(mContext, mToast, Toast.LENGTH_LONG).show(); Intent intent = new Intent(); intent.putExtra("new_message_id", newMessageId); setResult(RESULT_OK, intent); finish(); } } } private void requestForAttachmentIntent(AttachmentType type) { Intent intent = new Intent(Intent.ACTION_GET_CONTENT); switch (type) { case FILE: intent.setType("application/file"); break; case IMAGE: intent.setType("image/*"); break; } try { startActivityForResult(intent, PICKFILE_RESULT_CODE); } catch (ActivityNotFoundException e) { Toast.makeText(this, "No Activity found to handle intent.", Toast.LENGTH_LONG).show(); } } class PartnerLoader extends AsyncTask<Void, Void, Void> { @Override protected Void doInBackground(Void... params) { mTagsPartners.clear(); // Loading records from server OEHelper oe = mPartnerDB.getOEInstance(); if (oe != null) { mTagsPartners.addAll(oe.search_read()); } return null; } @Override protected void onPostExecute(Void result) { mPartnerTagsAdapter.notifiyDataChange(mTagsPartners); } } @Override public void onTokenAdded(Object token, View view) { OEDataRow row = (OEDataRow) token; mSelectedPartners.put("key_" + row.getString("id"), row); } @Override public void onTokenSelected(Object token, View view) { } @Override public void onTokenRemoved(Object token) { OEDataRow row = (OEDataRow) token; if (!isReply) mSelectedPartners.remove("key_" + row.getString("id")); else mPartnerTagsView.addObject(token); } @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { if (requestCode == PICKFILE_RESULT_CODE && resultCode == RESULT_OK) { String FilePath = data.getDataString(); Uri fileUri = Uri.parse(FilePath); mAttachmentURIs.add(fileUri); handleIntentFilter(data); } super.onActivityResult(requestCode, resultCode, data); } /** * Handle message intent filter for attachments * * @param intent */ private void handleIntentFilter(Intent intent) { String action = intent.getAction(); String type = intent.getType(); // Single attachment if (Intent.ACTION_SEND.equals(action) && type != null) { Uri fileUri = (Uri) intent.getParcelableExtra(Intent.EXTRA_STREAM); mAttachmentURIs.add(fileUri); } // Multiple Attachments if (Intent.ACTION_SEND_MULTIPLE.equals(action) && type != null) { ArrayList<Uri> fileUris = intent .getParcelableArrayListExtra(Intent.EXTRA_STREAM); mAttachmentURIs.addAll(fileUris); } // note.note send as mail if (intent.hasExtra("note_body")) { EditText edtBody = (EditText) findViewById(R.id.edtMessageBody); String body = intent.getExtras().getString("note_body"); edtBody.setText(HTMLHelper.stringToHtml(body)); } if (intent.hasExtra("android.intent.extra.TEXT")) { edtBody.setText(intent.getExtras().getString( "android.intent.extra.TEXT")); } else { handleReceivedFile(); } } private void handleReceivedFile() { mAttachments.clear(); for (Uri uri : mAttachmentURIs) { ContentResolver cR = getContentResolver(); String type = cR.getType(uri); OEDataRow data = new OEDataRow(); data.put("name", getFilenameFromUri(uri)); data.put("uri", uri); data.put("type", "file"); if (type.contains("image/")) { data.put("type", "image"); } mAttachments.add(data); mAttachmentAdapter.notifiyDataChange(mAttachments); } } /** * getting real path from attachment URI. * * @param contentUri * @return */ private String getFilenameFromUri(Uri contentUri) { String filename = "unknown"; if (contentUri.getScheme().toString().compareTo("content") == 0) { Cursor cursor = getContentResolver().query(contentUri, null, null, null, null); if (cursor.moveToFirst()) { int column_index = cursor .getColumnIndexOrThrow(MediaStore.Images.Media.DATA); filename = cursor.getString(column_index); File fl = new File(filename); filename = fl.getName(); } } else if (contentUri.getScheme().compareTo("file") == 0) { filename = contentUri.getLastPathSegment().toString(); } else { filename = filename + "_" + contentUri.getLastPathSegment(); } return filename; } @Override protected void onPause() { super.onPause(); if (mPartnerLoader != null) mPartnerLoader.cancel(true); } }