package com.openerp.addons.message;
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.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.graphics.Color;
import android.os.AsyncTask;
import android.os.Bundle;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.GridView;
import android.widget.ImageView;
import android.widget.TextView;
import android.widget.Toast;
import com.openerp.OETouchListener;
import com.openerp.OETouchListener.OnPullListener;
import com.openerp.R;
import com.openerp.base.mail.MailFollowers;
import com.openerp.orm.OEDataRow;
import com.openerp.orm.OEHelper;
import com.openerp.providers.groups.MailGroupProvider;
import com.openerp.receivers.SyncFinishReceiver;
import com.openerp.support.AppScope;
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.drawer.DrawerItem;
import com.openerp.util.drawer.DrawerListener;
public class MailGroup extends BaseFragment implements OnPullListener {
public static final String TAG = "com.openerp.addons.message.MailGroup";
/**
* OETouchListener
*/
private OETouchListener mTouchAttacher;
View mView = null;
Boolean hasSynced = false;
GridView mGroupGridView = null;
List<Object> mGroupGridListItems = new ArrayList<Object>();
OEListAdapter mGroupGridViewAdapter = null;
/**
* Tag Colors
*/
public static HashMap<String, Object> mMenuGroups = new HashMap<String, Object>();
String mTagColors[] = new String[] { "#218559", "#192823", "#FF8800",
"#CC0000", "#59A2BE", "#808080", "#9933CC", "#0099CC", "#669900",
"#EBB035" };
/**
* Loaders
*/
GroupsLoader mGroupsLoader = null;
JoinUnfollowGroup mJoinUnFollowGroup = null;
/**
* Database Objects
*/
MailFollowers mMailFollowerDB = null;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
mView = inflater.inflate(R.layout.fragment_message_groups_list,
container, false);
init();
return mView;
}
private void init() {
scope = new AppScope(getActivity());
mMailFollowerDB = new MailFollowers(getActivity());
initControls();
mGroupsLoader = new GroupsLoader();
mGroupsLoader.execute();
}
private void initControls() {
mGroupGridView = (GridView) mView.findViewById(R.id.listGroups);
mGroupGridViewAdapter = new OEListAdapter(getActivity(),
R.layout.fragment_message_groups_list_item, mGroupGridListItems) {
@Override
public View getView(int position, View convertView, ViewGroup parent) {
View mView = convertView;
if (mView == null)
mView = getActivity().getLayoutInflater().inflate(
getResource(), parent, false);
generateView(position, mView);
return mView;
}
};
mGroupGridView.setAdapter(mGroupGridViewAdapter);
mTouchAttacher = scope.main().getTouchAttacher();
mTouchAttacher.setPullableView(mGroupGridView, this);
}
private void generateView(int position, View mView) {
OEDataRow row = (OEDataRow) mGroupGridListItems.get(position);
TextView txvName = (TextView) mView.findViewById(R.id.txvGroupName);
TextView txvDesc = (TextView) mView
.findViewById(R.id.txvGroupDescription);
ImageView imgGroupPic = (ImageView) mView
.findViewById(R.id.imgGroupPic);
imgGroupPic.setImageBitmap(Base64Helper.getBitmapImage(getActivity(),
row.getString("image_medium")));
txvName.setText(row.getString("name"));
txvDesc.setText(row.getString("description"));
final int group_id = row.getInt("id");
final Button btnJoin = (Button) mView.findViewById(R.id.btnJoinGroup);
final Button btnUnJoin = (Button) mView
.findViewById(R.id.btnUnJoinGroup);
int total = mMailFollowerDB.count(
"res_model = ? AND res_id = ? AND partner_id = ?",
new String[] { db().getModelName(), group_id + "",
OEUser.current(getActivity()).getPartner_id() + "" });
btnUnJoin.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View arg0) {
mJoinUnFollowGroup = new JoinUnfollowGroup(group_id, false);
mJoinUnFollowGroup.execute();
btnJoin.setVisibility(View.VISIBLE);
btnUnJoin.setVisibility(View.GONE);
}
});
btnJoin.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
mJoinUnFollowGroup = new JoinUnfollowGroup(group_id, true);
mJoinUnFollowGroup.execute();
btnJoin.setVisibility(View.GONE);
btnUnJoin.setVisibility(View.VISIBLE);
}
});
if (total > 0) {
btnJoin.setVisibility(View.GONE);
btnUnJoin.setVisibility(View.VISIBLE);
} else {
btnJoin.setVisibility(View.VISIBLE);
btnUnJoin.setVisibility(View.GONE);
}
}
@Override
public Object databaseHelper(Context context) {
return new MailGroupDB(context);
}
@Override
public List<DrawerItem> drawerMenus(Context context) {
MailGroupDB db = new MailGroupDB(context);
mMailFollowerDB = new MailFollowers(context);
List<DrawerItem> menu = new ArrayList<DrawerItem>();
MailGroup group = new MailGroup();
Bundle bundle = new Bundle();
if (db.isInstalledOnServer()) {
menu.add(new DrawerItem(TAG, "My Groups", true));
// Join Group
group.setArguments(bundle);
menu.add(new DrawerItem(TAG, "Join Group", 0,
R.drawable.ic_action_social_group, group));
// Dynamic Groups
List<OEDataRow> groups = mMailFollowerDB.select(
"res_model = ? AND partner_id = ?",
new String[] { db.getModelName(),
OEUser.current(context).getPartner_id() + "" });
int index = 0;
MessageDB messageDB = new MessageDB(context);
for (OEDataRow row : groups) {
if (mTagColors.length - 1 < index)
index = 0;
OEDataRow grp = db.select(row.getInt("res_id"));
Message message = new Message();
bundle = new Bundle();
bundle.putInt("group_id", grp.getInt("id"));
message.setArguments(bundle);
int count = messageDB.count(
"to_read = ? AND model = ? AND res_id = ?",
new String[] { "true", db().getModelName(),
row.getString("id") });
menu.add(new DrawerItem(TAG, grp.getString("name"), count,
mTagColors[index], message));
grp.put("tag_color", Color.parseColor(mTagColors[index]));
mMenuGroups.put("group_" + grp.getInt("id"), grp);
index++;
}
}
return menu;
}
@Override
public void onPullStarted(View arg0) {
Log.d(TAG, "MailGroup->OETouchListener->onPullStarted()");
scope.main().requestSync(MailGroupProvider.AUTHORITY);
}
class GroupsLoader extends AsyncTask<Void, Void, Void> {
public GroupsLoader() {
mView.findViewById(R.id.loadingProgress)
.setVisibility(View.VISIBLE);
}
@Override
protected Void doInBackground(Void... params) {
mGroupGridListItems.clear();
mGroupGridListItems.addAll(db().select());
try {
Thread.sleep(1000);
} catch (Exception e) {
}
return null;
}
@Override
protected void onPostExecute(Void result) {
mView.findViewById(R.id.loadingProgress).setVisibility(View.GONE);
mGroupGridViewAdapter.notifiyDataChange(mGroupGridListItems);
mGroupsLoader = null;
checkStatus();
}
}
private void checkStatus() {
if (!db().isEmptyTable()) {
mView.findViewById(R.id.groupSyncWaiter).setVisibility(View.GONE);
} else {
mView.findViewById(R.id.groupSyncWaiter)
.setVisibility(View.VISIBLE);
TextView txvSyncDetail = (TextView) mView
.findViewById(R.id.txvMessageHeaderSubtitle);
txvSyncDetail.setText("Your groups will appear shortly");
if (!hasSynced) {
hasSynced = true;
scope.main().requestSync(MailGroupProvider.AUTHORITY);
}
}
}
@Override
public void onResume() {
super.onResume();
getActivity().registerReceiver(syncFinishReceiver,
new IntentFilter(SyncFinishReceiver.SYNC_FINISH));
}
@Override
public void onPause() {
super.onPause();
getActivity().unregisterReceiver(syncFinishReceiver);
}
private SyncFinishReceiver syncFinishReceiver = new SyncFinishReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
mTouchAttacher.setPullComplete();
mGroupsLoader = new GroupsLoader();
mGroupsLoader.execute();
DrawerListener drawer = (DrawerListener) getActivity();
drawer.refreshDrawer(TAG);
drawer.refreshDrawer(Message.TAG);
}
};
public class JoinUnfollowGroup extends AsyncTask<Void, Void, Boolean> {
int mGroupId = 0;
boolean mJoin = false;
String mToast = "";
JSONObject result = new JSONObject();
public JoinUnfollowGroup(int group_id, boolean join) {
mGroupId = group_id;
mJoin = join;
}
@Override
protected Boolean doInBackground(Void... params) {
try {
if (mMailFollowerDB == null)
mMailFollowerDB = new MailFollowers(getActivity());
int partner_id = OEUser.current(getActivity()).getPartner_id();
OEHelper oe = db().getOEInstance();
if (oe == null) {
mToast = "No Connection";
return false;
}
OEArguments arguments = new OEArguments();
arguments.add(new JSONArray().put(mGroupId));
arguments.add(oe.updateContext(new JSONObject()));
oe.debugMode(true);
if (mJoin) {
oe.call_kw("action_follow", arguments, null);
mToast = "Group joined";
oe.syncWithServer(true);
} else {
oe.call_kw("action_unfollow", arguments, null);
mToast = "Unfollowed from group";
mMailFollowerDB.delete(
"res_id = ? AND partner_id = ? AND res_model = ? ",
new String[] { mGroupId + "", partner_id + "",
db().getModelName() });
}
return true;
} catch (Exception e) {
e.printStackTrace();
}
return false;
}
@Override
protected void onPostExecute(Boolean result) {
Toast.makeText(getActivity(), mToast, Toast.LENGTH_LONG).show();
DrawerListener drawer = (DrawerListener) getActivity();
drawer.refreshDrawer(TAG);
drawer.refreshDrawer(Message.TAG);
}
}
}