package com.openerp.addons.note;
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.AlertDialog;
import android.content.Context;
import android.content.DialogInterface;
import android.os.AsyncTask;
import android.os.Bundle;
import android.support.v4.app.FragmentActivity;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.widget.GridView;
import android.widget.ImageView;
import android.widget.TextView;
import android.widget.Toast;
import com.openerp.R;
import com.openerp.base.res.ResPartnerDB;
import com.openerp.orm.OEDataRow;
import com.openerp.orm.OEHelper;
import com.openerp.orm.OEM2MIds.Operation;
import com.openerp.support.BaseFragment;
import com.openerp.support.listview.OEListAdapter;
import com.openerp.util.Base64Helper;
import com.openerp.util.contactview.OEContactView;
import com.openerp.util.controls.OETextView;
import com.openerp.util.drawer.DrawerItem;
import com.openerp.util.tags.MultiTagsTextView.TokenListener;
import com.openerp.util.tags.TagsItem;
import com.openerp.util.tags.TagsView;
public class NoteFollowers extends BaseFragment implements TokenListener,
OnClickListener {
public static final String TAG = "com.openerp.addons.note.NoteFollowers";
View mView = null;
TagsView mFollowersTag = null;
GridView mNoteFollowerGrid = null;
OEListAdapter mNoteFollowerAdapter = null;
Bundle mArguments = null;
List<Object> mFollowerList = new ArrayList<Object>();
List<Object> mPartnersList = new ArrayList<Object>();
PartnerLoader mPartnersLoader = null;
UnSubscribeOperation mUnSubscriber = null;
SubscribeOperation mSubscriber = null;
HashMap<String, TagsItem> mSelectedPartners = new HashMap<String, TagsItem>();
OEListAdapter mTagsAdapter = null;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
setHasOptionsMenu(true);
mView = inflater.inflate(R.layout.fragment_note_followers, container,
false);
return mView;
}
@Override
public void onStart() {
super.onStart();
mArguments = getArguments();
getActivity().setTitle(mArguments.getString("note_name"));
OEDataRow note = db().select(mArguments.getInt("note_id"));
mFollowerList.addAll(note.getM2MRecord("message_follower_ids")
.browseEach());
mPartnersLoader = new PartnerLoader(getActivity());
mPartnersLoader.execute();
setupTagsView();
setupGridView();
}
private void setupTagsView() {
mFollowersTag = (TagsView) mView.findViewById(R.id.edtNoteFollowers);
mFollowersTag.setTokenListener(this);
mTagsAdapter = new OEListAdapter(getActivity(),
R.layout.tags_view_partner_item_layout, mPartnersList) {
@Override
public View getView(int position, View convertView, ViewGroup parent) {
View mView = convertView;
if (mView == null) {
mView = getActivity().getLayoutInflater().inflate(
getResource(), parent, false);
}
TagsItem item = (TagsItem) mPartnersList.get(position);
TextView txvSubSubject, txvSubject;
ImageView imgPic = (ImageView) mView
.findViewById(R.id.imgReceipientPic);
txvSubject = (TextView) mView.findViewById(R.id.txvSubject);
txvSubSubject = (TextView) mView
.findViewById(R.id.txvSubSubject);
txvSubject.setText(item.getSubject());
if (!item.getSub_subject().equals("false")) {
txvSubSubject.setText(item.getSub_subject());
} else {
txvSubSubject.setText("No email");
}
if (item.getImage() != null && !item.getImage().equals("false")) {
imgPic.setImageBitmap(Base64Helper.getBitmapImage(
getActivity(), item.getImage()));
}
return mView;
}
};
mFollowersTag.setAdapter(mTagsAdapter);
mView.findViewById(R.id.imgBtnAddFollower).setOnClickListener(this);
}
private void setupGridView() {
mNoteFollowerGrid = (GridView) mView
.findViewById(R.id.noteFollowersGridView);
mNoteFollowerAdapter = new OEListAdapter(getActivity(),
R.layout.fragment_note_followers_grid_item_view, mFollowerList) {
@Override
public View getView(final int position, View convertView,
ViewGroup parent) {
View mView = convertView;
if (mView == null) {
mView = getActivity().getLayoutInflater().inflate(
getResource(), parent, false);
}
OEDataRow row = (OEDataRow) mFollowerList.get(position);
OEContactView imgContact = (OEContactView) mView
.findViewById(R.id.imgFollowerPic);
OETextView txvName = (OETextView) mView
.findViewById(R.id.txvFollowerName);
OETextView txvEmail = (OETextView) mView
.findViewById(R.id.txvFollowerEmail);
txvName.setText(row.getString("name"));
txvEmail.setText(row.getString("email"));
imgContact.assignPartnerId(row.getInt("id"));
imgContact.setImageBitmap(Base64Helper.getBitmapImage(
getActivity(), row.getString("image_small")));
mView.findViewById(R.id.imgFollowerRemove).setOnClickListener(
new OnClickListener() {
@Override
public void onClick(View v) {
confirmRemoveFollower(position);
}
});
return mView;
}
};
mNoteFollowerGrid.setAdapter(mNoteFollowerAdapter);
}
private void confirmRemoveFollower(final int position) {
AlertDialog.Builder deleteDialogConfirm = new AlertDialog.Builder(
getActivity());
deleteDialogConfirm.setTitle("Unsubscribe");
deleteDialogConfirm
.setMessage("Are you sure want to remove follower ?");
deleteDialogConfirm.setCancelable(true);
deleteDialogConfirm.setPositiveButton("Yes",
new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
mUnSubscriber = new UnSubscribeOperation(position,
mArguments.getInt("note_id"));
mUnSubscriber.execute();
}
});
deleteDialogConfirm.setNegativeButton("No", null);
deleteDialogConfirm.show();
}
class UnSubscribeOperation extends AsyncTask<Void, Void, Void> {
int mPosition = 0;
int mNoteID = 0;
int mPartnerId = 0;
String mToast = "";
public UnSubscribeOperation(int position, int note_id) {
mPosition = position;
mNoteID = note_id;
OEDataRow row = (OEDataRow) mFollowerList.get(position);
mPartnerId = row.getInt("id");
}
@Override
protected Void doInBackground(Void... params) {
OEHelper oe = db().getOEInstance();
mToast = "No Connection.";
if (oe != null) {
OEArguments arguments = new OEArguments();
arguments.add(new JSONArray().put(mNoteID));
arguments.add(new JSONArray().put(mPartnerId));
Boolean result = (Boolean) oe.call_kw("message_unsubscribe",
arguments);
if (result) {
db().updateManyToManyRecords("message_follower_ids",
Operation.REMOVE, mNoteID, mPartnerId);
}
mToast = "Follower removed";
}
return null;
}
@Override
protected void onPostExecute(Void result) {
mFollowerList.remove(mPosition);
mNoteFollowerAdapter.notifiyDataChange(mFollowerList);
Toast.makeText(getActivity(), mToast, Toast.LENGTH_LONG).show();
}
}
class SubscribeOperation extends AsyncTask<Void, Void, Void> {
List<Integer> mPartnerIds = null;
int mNoteID = 0;
String mToast = "";
public SubscribeOperation(List<Integer> ids, int note_id) {
mPartnerIds = ids;
mNoteID = note_id;
}
@Override
protected Void doInBackground(Void... params) {
OEHelper oe = db().getOEInstance();
mToast = "No Connection.";
if (oe != null) {
try {
JSONObject args = new JSONObject();
args.put("res_model", "note.note");
args.put("res_id", mNoteID);
args.put("message", "You have been invited to follow "
+ getArguments().getString("note_name"));
JSONArray partner_ids = new JSONArray();
partner_ids.put(6);
partner_ids.put(false);
JSONArray partnerIds = new JSONArray();
for (int id : mPartnerIds) {
partnerIds.put(id);
}
partner_ids.put(partnerIds);
args.put("partner_ids",
new JSONArray("[" + partner_ids.toString() + "]"));
JSONObject result = oe
.createNew("mail.wizard.invite", args);
int id = result.getInt("result");
OEArguments arguments = new OEArguments();
arguments.add(new JSONArray("[" + id + "]"));
JSONObject context = new JSONObject();
context.put("default_res_model", "note.note");
context.put("default_res_id", mNoteID);
oe.debugMode(true);
JSONObject res = (JSONObject) oe.call_kw(
"mail.wizard.invite", "add_followers", arguments,
context);
if (res != null) {
db().updateManyToManyRecords("message_follower_ids",
Operation.APPEND, mNoteID, mPartnerIds);
mToast = "Follower added";
for (Object obj : mFollowersTag.getObjects()) {
mFollowersTag.removeObject(obj);
}
}
} catch (Exception e) {
}
}
return null;
}
@Override
protected void onPostExecute(Void result) {
ResPartnerDB partner = new ResPartnerDB(getActivity());
for (int id : mPartnerIds) {
mFollowerList.add(partner.select(id));
}
mNoteFollowerAdapter.notifiyDataChange(mFollowerList);
Toast.makeText(getActivity(), mToast, Toast.LENGTH_LONG).show();
}
}
class PartnerLoader extends AsyncTask<Void, Void, Void> {
ResPartnerDB mPartner = null;
FragmentActivity mActivity = null;
OEHelper mOpenERP = null;
public PartnerLoader(FragmentActivity activity) {
mPartner = new ResPartnerDB(activity);
mActivity = activity;
mOpenERP = mPartner.getOEInstance();
}
@Override
protected Void doInBackground(Void... params) {
mPartnersList.clear();
if (mOpenERP != null) {
for (OEDataRow row : mOpenERP.search_read()) {
mPartnersList.add(new TagsItem(row.getInt("id"), row
.getString("name"), row.getString("email"), row
.getString("image_small")));
}
}
return null;
}
@Override
protected void onPostExecute(Void result) {
mTagsAdapter.notifiyDataChange(mPartnersList);
}
}
@Override
public Object databaseHelper(Context context) {
return new NoteDB(context);
}
@Override
public List<DrawerItem> drawerMenus(Context context) {
return null;
}
@Override
public void onPause() {
super.onPause();
mPartnersLoader.cancel(true);
mPartnersLoader = null;
}
@Override
public void onTokenAdded(Object token, View view) {
TagsItem tag = (TagsItem) token;
mSelectedPartners.put("_" + tag.getId(), tag);
}
@Override
public void onTokenSelected(Object token, View view) {
}
@Override
public void onTokenRemoved(Object token) {
TagsItem tag = (TagsItem) token;
mSelectedPartners.remove("_" + tag.getId());
}
/**
* Add Follower click listener
*/
@Override
public void onClick(View v) {
List<Integer> ids = new ArrayList<Integer>();
List<Object> mIds = new ArrayList<Object>();
ResPartnerDB partner = new ResPartnerDB(getActivity());
for (String key : mSelectedPartners.keySet()) {
TagsItem item = mSelectedPartners.get(key);
ids.add(item.getId());
mIds.add(item.getId());
}
OEHelper oe = partner.getOEInstance();
if (oe != null) {
oe.syncWithServer(false, null, mIds);
}
mSubscriber = new SubscribeOperation(ids, mArguments.getInt("note_id"));
mSubscriber.execute();
}
}