/**
* Odoo, Open Source Management Solution
* Copyright (C) 2012-today Odoo SA (<http:www.odoo.com>)
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as
* published by the Free Software Foundation, either version 3 of the
* License, or (at your option) any later version
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <http:www.gnu.org/licenses/>
*
* Created on 27/2/15 5:53 PM
*/
package com.odoo.base.addons.mail.widget;
import android.app.ProgressDialog;
import android.content.Context;
import android.content.Intent;
import android.net.Uri;
import android.os.AsyncTask;
import android.os.Bundle;
import android.support.v7.app.ActionBarActivity;
import android.text.TextUtils;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.EditText;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.TextView;
import com.odoo.R;
import com.odoo.base.addons.ir.IrAttachment;
import com.odoo.base.addons.ir.feature.OFileManager;
import com.odoo.base.addons.mail.MailMessage;
import com.odoo.base.addons.res.ResPartner;
import com.odoo.core.orm.ODataRow;
import com.odoo.core.orm.OModel;
import com.odoo.core.orm.OValues;
import com.odoo.core.orm.fields.OColumn;
import com.odoo.core.utils.BitmapUtils;
import com.odoo.core.utils.JSONUtils;
import com.odoo.core.utils.OControls;
import com.odoo.core.utils.OResource;
import com.odoo.core.utils.OStringColorUtil;
import com.odoo.core.utils.logger.OLog;
import org.json.JSONArray;
import org.json.JSONObject;
import java.util.ArrayList;
import java.util.List;
import odoo.OArguments;
public class MailChatterCompose extends ActionBarActivity implements View.OnClickListener {
public static final String TAG = MailChatterCompose.class.getSimpleName();
private OModel mModel;
private IrAttachment irAttachment;
private int server_id = -1;
private int partner_id = -1;
private OFileManager fileManager;
private LinearLayout horizontalScrollView;
private List<Integer> attachmentIds = new ArrayList<>();
public enum MessageType {
Message, InternalNote
}
private MessageType mType = MessageType.Message;
private View parent;
private MailMessage mailMessage;
private EditText edtSubject, edtBody;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.base_mail_chatter_message_compose);
getWindow().setLayout(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT);
getSupportActionBar().hide();
fileManager = new OFileManager(this);
Bundle extra = getIntent().getExtras();
mType = MessageType.valueOf(extra.getString("type"));
mModel = OModel.get(this, extra.getString("model"), null);
irAttachment = new IrAttachment(this, null);
mailMessage = new MailMessage(this, null);
server_id = extra.getInt("server_id");
if (mModel.getModelName().equals("res.partner")) {
partner_id = server_id;
} else {
ODataRow row = mModel.browse(mModel.selectRowId(server_id));
for (OColumn col : mModel.getColumns(false)) {
if (col.getType().isAssignableFrom(ResPartner.class)) {
if (col.getRelationType() != null
&& col.getRelationType() == OColumn.RelationType.ManyToOne) {
ODataRow partner = null;
if (!row.getString(col.getName()).equals("false")) {
partner = row.getM2ORecord(col.getName()).browse();
}
if (partner != null && partner.getInt("id") != 0) {
partner_id = partner.getInt("id");
}
}
}
}
}
findViewById(R.id.btnAttachment).setOnClickListener(this);
findViewById(R.id.btnSend).setOnClickListener(this);
findViewById(R.id.btnCancel).setOnClickListener(this);
edtSubject = (EditText) findViewById(R.id.messageSubject);
edtBody = (EditText) findViewById(R.id.messageBody);
horizontalScrollView = (LinearLayout) findViewById(R.id.attachmentsList);
init();
}
private void init() {
TextView recordName = (TextView) findViewById(R.id.recordName);
parent = (View) recordName.getParent().getParent();
ODataRow record = mModel.browse(mModel.selectRowId(server_id));
String name = record.getString(mModel.getDefaultNameColumn());
findViewById(R.id.dialogHeader)
.setBackgroundColor(OStringColorUtil.getStringColor(this, name));
if (mType == MessageType.Message) {
edtSubject.setText("Re: " + name);
recordName.setText(String.format(OResource.string(this, R.string.message_to), name));
} else {
recordName.setText(R.string.add_internal_note);
edtSubject.setVisibility(View.GONE);
edtBody.setHint(R.string.internal_note_hint);
OControls.setText(parent, R.id.btnSend, R.string.label_log_note);
}
edtBody.requestFocus();
}
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.btnSend:
sendMessage();
break;
case R.id.btnCancel:
finish();
break;
case R.id.btnAttachment:
fileManager.requestForFile(OFileManager.RequestType.ALL_FILE_TYPE);
break;
}
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
OValues response = fileManager.handleResult(requestCode, resultCode, data);
if (response != null) {
addAttachment(response);
}
}
private void addAttachment(OValues values) {
View attachmentView = LayoutInflater.from(this)
.inflate(R.layout.base_attachment_item, horizontalScrollView, false);
String fileName = values.getString("name");
String type = values.getString("file_type");
ImageView imgPreview = (ImageView) attachmentView.findViewById(R.id.attachmentPreview);
if (type.contains("image")) {
OLog.log(values.getString("file_uri"));
imgPreview.setImageURI(Uri.parse(values.getString("file_uri")));
} else if (type.contains("audio")) {
imgPreview.setImageResource(R.drawable.audio);
} else if (type.contains("video")) {
imgPreview.setImageResource(R.drawable.video);
} else {
imgPreview.setImageResource(R.drawable.file);
}
OControls.setText(attachmentView, R.id.attachmentFileName, fileName);
attachmentView.setTag(values);
attachmentView.findViewById(R.id.btnRemoveAttachment)
.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
horizontalScrollView.removeView(
(View) v.getParent()
);
}
});
horizontalScrollView.addView(attachmentView);
}
private void sendMessage() {
edtSubject.setError(null);
edtBody.setError(null);
if (mType == MessageType.Message) {
if (TextUtils.isEmpty(edtSubject.getText())) {
edtSubject.setError("Subject required");
edtSubject.requestFocus();
return;
}
}
if (TextUtils.isEmpty(edtBody.getText())) {
edtBody.setError(((mType == MessageType.Message) ? "Message" : "Note") + " required");
edtBody.requestFocus();
return;
}
int attachments_count = horizontalScrollView.getChildCount();
if (attachments_count > 0) {
// Has attachments
List<OValues> attachments = new ArrayList<>();
for (int i = 0; i < attachments_count; i++) {
attachments.add((OValues) horizontalScrollView.getChildAt(i).getTag());
}
CreateAttachments createAttachments = new CreateAttachments();
createAttachments.execute(attachments);
} else {
postMessage();
}
}
private void postMessage() {
String subject = (mType == MessageType.Message) ?
edtSubject.getText().toString() : "false";
MessagePost messagePost = new MessagePost();
messagePost.execute(subject, edtBody.getText().toString());
}
private class CreateAttachments extends AsyncTask<List<OValues>, Void, List<Integer>> {
private ProgressDialog progressDialog;
@Override
protected void onPreExecute() {
super.onPreExecute();
progressDialog = new ProgressDialog(MailChatterCompose.this);
progressDialog.setTitle(R.string.title_working);
progressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
progressDialog.setMessage("Uploading attachments...");
progressDialog.setMax(horizontalScrollView.getChildCount());
progressDialog.setCancelable(false);
progressDialog.setProgress(1);
progressDialog.show();
}
@Override
protected List<Integer> doInBackground(final List<OValues>... params) {
try {
List<Integer> ids = new ArrayList<>();
for (final OValues value : params[0]) {
boolean isImage = (value.getString("file_type").contains("image"));
value.put("datas", BitmapUtils.uriToBase64(
Uri.parse(value.getString("file_uri"))
, getContentResolver(), isImage
));
JSONObject data = IrAttachment.valuesToData(irAttachment, value);
if (data != null) {
runOnUiThread(new Runnable() {
@Override
public void run() {
progressDialog.setProgress(params[0].indexOf(value) + 1);
}
});
int newId = irAttachment.getServerDataHelper().createOnServer(data);
value.put("id", newId);
irAttachment.createAttachment(value, mailMessage.getModelName(),
0);
ids.add(newId);
}
}
return ids;
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
@Override
protected void onPostExecute(List<Integer> ids) {
super.onPostExecute(ids);
progressDialog.dismiss();
attachmentIds.clear();
attachmentIds.addAll(ids);
if (ids != null)
postMessage();
}
}
private class MessagePost extends AsyncTask<String, Void, Boolean> {
private ProgressDialog progressDialog;
@Override
protected void onPreExecute() {
super.onPreExecute();
progressDialog = new ProgressDialog(MailChatterCompose.this);
progressDialog.setTitle(R.string.title_working);
progressDialog.setMessage(((mType == MessageType.Message) ? "Sending message" :
"Logging internal note") + "...");
progressDialog.setCancelable(false);
progressDialog.show();
}
@Override
protected Boolean doInBackground(String... params) {
try {
String subject = params[0];
String body = params[1];
OArguments args = new OArguments();
args.add(server_id);
JSONObject data = new JSONObject();
data.put("body", body);
data.put("subject", (subject.equals("false")) ? false : subject);
data.put("parent_id", false);
data.put("attachment_ids", JSONUtils.toArray(attachmentIds));
JSONArray partner_ids = new JSONArray();
if (partner_id != -1 && mType == MessageType.Message) {
partner_ids.put(partner_id);
}
data.put("partner_ids", partner_ids);
JSONObject context = new JSONObject();
context.put("mail_read_set_read", true);
context.put("default_res_id", server_id);
context.put("default_model", mModel.getModelName());
context.put("mail_post_autofollow", true);
context.put("mail_post_autofollow_partner_ids", new JSONArray());
data.put("context", context);
data.put("type", "comment");
data.put("content_subtype", "plaintext");
data.put("subtype", (mType == MessageType.Message) ? "mail.mt_comment" : false);
int newId = (int)
mModel.getServerDataHelper().callMethod("message_post", args, null, data);
Thread.sleep(500);
ODataRow row = new ODataRow();
row.put("id", newId);
mailMessage.quickCreateRecord(row);
return true;
} catch (Exception e) {
e.printStackTrace();
}
return false;
}
@Override
protected void onPostExecute(Boolean aBoolean) {
super.onPostExecute(aBoolean);
progressDialog.dismiss();
Context ctx = MailChatterCompose.this;
Intent intent = new Intent();
intent.setAction("mail.message.update");
ctx.sendBroadcast(intent);
finish();
}
}
}