package com.orgzly.android.widgets;
import android.content.Context;
import android.content.Intent;
import android.content.res.Resources;
import android.database.Cursor;
import android.graphics.Color;
import android.os.Binder;
import android.util.TypedValue;
import android.view.View;
import android.widget.RemoteViews;
import android.widget.RemoteViewsService;
import com.orgzly.BuildConfig;
import com.orgzly.R;
import com.orgzly.android.Note;
import com.orgzly.android.SearchQuery;
import com.orgzly.android.prefs.AppPreferences;
import com.orgzly.android.provider.clients.NotesClient;
import com.orgzly.android.ui.util.TitleGenerator;
import com.orgzly.android.util.LogUtils;
import com.orgzly.android.util.UserTimeFormatter;
import com.orgzly.org.OrgHead;
public class ListWidgetViewsFactory implements RemoteViewsService.RemoteViewsFactory {
private static final String TAG = ListWidgetViewsFactory.class.getName();
private Cursor mCursor;
private Context mContext;
private SearchQuery query;
private TitleGenerator titleGenerator;
private UserTimeFormatter userTimeFormatter;
public ListWidgetViewsFactory(Context mContext, String queryString) {
this.mContext = mContext;
// this should be a query string, which doesn't match anything
this.query = new SearchQuery(queryString != null ? queryString : ".b.a b.a");
this.userTimeFormatter = new UserTimeFormatter(mContext);
this.titleGenerator = new TitleGenerator(mContext, false, new TitleGenerator.TitleAttributes(
Color.rgb(0xdc, 0,0),
Color.rgb(0, 0x80,0),
Color.rgb(0, 0,0xff),
// see http://stackoverflow.com/a/8296048/7757713
(int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_SP, 12, Resources.getSystem().getDisplayMetrics()),
Color.rgb(0x69, 0x69,0x69)
));
}
@Override
public void onCreate() { }
@Override
public void onDataSetChanged() {
if (mCursor != null) {
mCursor.close();
}
// from http://stackoverflow.com/a/20645908
final long token = Binder.clearCallingIdentity();
try {
mCursor = NotesClient.getCursorForQuery(mContext, query);
} finally {
Binder.restoreCallingIdentity(token);
}
}
@Override
public void onDestroy() {
if (mCursor != null) {
mCursor.close();
}
}
@Override
public int getCount() {
return mCursor.getCount();
}
@Override
public RemoteViews getViewAt(int position) {
if (BuildConfig.LOG_DEBUG) LogUtils.d(TAG, "getViewAt", position);
Note note = null;
if (mCursor.moveToPosition(position)) {
note = NotesClient.fromCursor(mCursor);
}
RemoteViews row = new RemoteViews(mContext.getPackageName(), R.layout.item_list_widget);
if (note != null) {
setContent(row, note);
final Intent openIntent = new Intent();
openIntent.putExtra(ListWidgetProvider.EXTRA_CLICK_TYPE, ListWidgetProvider.OPEN_CLICK_TYPE);
openIntent.putExtra(ListWidgetProvider.EXTRA_NOTE_ID, note.getId());
openIntent.putExtra(ListWidgetProvider.EXTRA_BOOK_ID, note.getPosition().getBookId());
row.setOnClickFillInIntent(R.id.item_list_widget_layout, openIntent);
final Intent doneIntent = new Intent();
doneIntent.putExtra(ListWidgetProvider.EXTRA_CLICK_TYPE, ListWidgetProvider.DONE_CLICK_TYPE);
doneIntent.putExtra(ListWidgetProvider.EXTRA_NOTE_ID, note.getId());
row.setOnClickFillInIntent(R.id.item_list_widget_done, doneIntent);
}
return row;
}
private void setContent(RemoteViews row, Note note) {
/* see also HeadsListViewAdapter.bindView */
OrgHead head = note.getHead();
row.setTextViewText(R.id.item_list_widget_title, titleGenerator.generateTitle(note, head));
/* Closed time. */
if (head.hasClosed() && AppPreferences.displayPlanning(mContext)) {
row.setTextViewText(R.id.item_list_widget_closed_text, userTimeFormatter.formatAll(head.getClosed()));
row.setViewVisibility(R.id.item_list_widget_closed, View.VISIBLE);
} else {
row.setViewVisibility(R.id.item_list_widget_closed, View.GONE);
}
/* Deadline time. */
if (head.hasDeadline() && AppPreferences.displayPlanning(mContext)) {
row.setTextViewText(R.id.item_list_widget_deadline_text, userTimeFormatter.formatAll(head.getDeadline()));
row.setViewVisibility(R.id.item_list_widget_deadline, View.VISIBLE);
} else {
row.setViewVisibility(R.id.item_list_widget_deadline, View.GONE);
}
/* Scheduled time. */
if (head.hasScheduled() && AppPreferences.displayPlanning(mContext)) {
row.setTextViewText(R.id.item_list_widget_scheduled_text, userTimeFormatter.formatAll(head.getScheduled()));
row.setViewVisibility(R.id.item_list_widget_scheduled, View.VISIBLE);
} else {
row.setViewVisibility(R.id.item_list_widget_scheduled, View.GONE);
}
if (AppPreferences.todoKeywordsSet(mContext).contains(head.getState())) {
row.setViewVisibility(R.id.item_list_widget_done, View.VISIBLE);
} else {
row.setViewVisibility(R.id.item_list_widget_done, View.GONE);
}
}
@Override
public RemoteViews getLoadingView() {
return null;
}
@Override
public int getViewTypeCount() {
return 1;
}
@Override
public long getItemId(int position) {
if (BuildConfig.LOG_DEBUG) LogUtils.d(TAG, "getItemId", position);
if (mCursor.moveToPosition(position)) {
return NotesClient.idFromCursor(mCursor);
}
return -position;
}
@Override
public boolean hasStableIds() {
return true;
}
}