package com.openerp.widgets.message;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.TimeZone;
import android.appwidget.AppWidgetManager;
import android.content.Context;
import android.content.Intent;
import android.graphics.Color;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.RemoteViews;
import android.widget.RemoteViewsService.RemoteViewsFactory;
import com.openerp.R;
import com.openerp.addons.message.MessageDB;
import com.openerp.orm.OEDataRow;
import com.openerp.support.OEUser;
import com.openerp.util.HTMLHelper;
import com.openerp.util.OEDate;
import com.openerp.widgets.WidgetHelper;
public class MessageRemoteViewFactory implements RemoteViewsFactory {
public static final String TAG = "com.openerp.widgets.message.MessageRemoteViewFactory";
Context mContext = null;
int mAppWidgetId = -1;
int[] starred_drawables = new int[] { R.drawable.ic_action_starred,
R.drawable.ic_action_unstarred };
List<Object> mMessageListItems = new ArrayList<Object>();
String mFilter = "inbox";
public MessageRemoteViewFactory(Context context, Intent intent) {
Log.d(TAG, "MessageRemoteViewFactory->constructor()");
mContext = context;
mAppWidgetId = intent.getIntExtra(AppWidgetManager.EXTRA_APPWIDGET_ID,
AppWidgetManager.INVALID_APPWIDGET_ID);
//mFilter = intent.getExtras().getString(AppWidgetManager.EXTRA_APPWIDGET_OPTIONS);
}
public int getCount() {
return mMessageListItems.size();
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public RemoteViews getLoadingView() {
RemoteViews mView = new RemoteViews(mContext.getPackageName(),
R.layout.listview_data_loading_progress);
return mView;
}
@Override
public RemoteViews getViewAt(int position) {
Log.d(TAG, "getViewAt()");
RemoteViews mView = new RemoteViews(mContext.getPackageName(),
R.layout.fragment_message_listview_items);
OEDataRow row = (OEDataRow) mMessageListItems.get(position);
boolean to_read = row.getBoolean("to_read");
if (!to_read) {
mView.setTextColor(R.id.txvMessageSubject, Color.BLACK);
mView.setTextColor(R.id.txvMessageFrom, Color.BLACK);
} else {
mView.setTextColor(R.id.txvMessageSubject,
Color.parseColor("#414141"));
mView.setTextColor(R.id.txvMessageFrom, Color.parseColor("#414141"));
}
final boolean starred = row.getBoolean("starred");
mView.setImageViewResource(R.id.imgMessageStarred,
(starred) ? starred_drawables[0] : starred_drawables[1]);
String subject = row.getString("subject");
if (subject.equals("false")) {
subject = row.getString("type");
}
if (!row.getString("record_name").equals("false"))
subject = row.getString("record_name");
mView.setTextViewText(R.id.txvMessageSubject, subject);
if (row.getInt("childs") > 0) {
mView.setViewVisibility(R.id.txvChilds, View.VISIBLE);
mView.setTextViewText(R.id.txvChilds, row.getString("childs")
+ " reply");
} else
mView.setViewVisibility(R.id.txvChilds, View.GONE);
mView.setTextViewText(R.id.txvMessageBody,
HTMLHelper.htmlToString(row.getString("body")));
String date = row.getString("date");
mView.setTextViewText(R.id.txvMessageDate,
OEDate.getDate(date, TimeZone.getDefault().getID()));
mView.setTextColor(R.id.txvMessageDate, Color.parseColor("#414141"));
String from = row.getString("email_from");
if (from.equals("false")) {
OEDataRow author_id = row.getM2ORecord("author_id").browse();
if (author_id != null)
from = row.getM2ORecord("author_id").browse().getString("name");
}
mView.setTextViewText(R.id.txvMessageFrom, from);
mView.setViewVisibility(R.id.txvMessageTag, View.GONE);
final Intent fillInIntent = new Intent();
fillInIntent.setAction(WidgetHelper.ACTION_WIDGET_CALL);
final Bundle bundle = new Bundle();
bundle.putInt(WidgetHelper.EXTRA_WIDGET_DATA_VALUE, row.getInt("id"));
fillInIntent.putExtras(bundle);
mView.setOnClickFillInIntent(R.id.messageListViewItem, fillInIntent);
return mView;
}
@Override
public int getViewTypeCount() {
return 1;
}
@Override
public boolean hasStableIds() {
return true;
}
@Override
public void onCreate() {
if (OEUser.current(mContext) == null)
return;
mMessageListItems.clear();
HashMap<String, OEDataRow> parents = new HashMap<String, OEDataRow>();
MessageDB message = new MessageDB(mContext);
HashMap<String, Object> whereMap = getWhere(mFilter);
String where = (String) whereMap.get("where");
String[] whereArgs = (String[]) whereMap.get("whereArgs");
List<OEDataRow> messages = message.select(where, whereArgs, null, null,
"date DESC");
for (OEDataRow row : messages) {
boolean isParent = true;
String key = row.getString("parent_id");
if (key.equals("false")) {
key = row.getString("id");
} else {
isParent = false;
}
if (!parents.containsKey(key)) {
// Fetching row parent message
OEDataRow newRow = null;
if (isParent) {
newRow = row;
} else {
newRow = message.select(Integer.parseInt(key));
}
int childs = message.count("parent_id = ? ",
new String[] { key });
newRow.put("childs", childs);
parents.put(key, null);
mMessageListItems.add(newRow);
}
}
}
public HashMap<String, Object> getWhere(String type) {
HashMap<String, Object> map = new HashMap<String, Object>();
String where = null;
String[] whereArgs = null;
if (type != null) {
if (type.equals("inbox")) {
where = "to_read = ? AND starred = ?";
whereArgs = new String[] { "true", "false" };
}
if (type.equals("to-do")) {
where = "to_read = ? AND starred = ?";
whereArgs = new String[] { "true", "true" };
}
if (type.equals("to:me")) {
where = "res_id = ? AND to_read = ?";
whereArgs = new String[] { "0", "true" };
}
}
map.put("where", where);
map.put("whereArgs", whereArgs);
return map;
}
@Override
public void onDataSetChanged() {
onCreate();
}
@Override
public void onDestroy() {
}
}