package org.fossasia.openevent.widget; import android.annotation.TargetApi; import android.appwidget.AppWidgetManager; import android.content.ComponentName; import android.content.Intent; import android.database.MatrixCursor; import android.os.Build; import android.os.Bundle; import android.widget.AdapterView; import android.widget.RemoteViews; import android.widget.RemoteViewsService; import org.fossasia.openevent.R; import org.fossasia.openevent.data.Session; import org.fossasia.openevent.dbutils.DbSingleton; import org.fossasia.openevent.utils.ConstantStrings; import org.fossasia.openevent.utils.ISO8601Date; import java.util.ArrayList; import timber.log.Timber; /** * User: Opticod(Anupam Das) * Date: 10/1/16 */ @TargetApi(Build.VERSION_CODES.HONEYCOMB) public class BookmarkWidgetRemoteViewsService extends RemoteViewsService { private static final int INDEX_BOOKMARK_ID = 0; private static final int INDEX_BOOKMARK_TITLE = 1; private static final int INDEX_BOOKMARK_START_TIME = 2; private static final int INDEX_BOOKMARK_END_TIME = 3; private final String ID = "id"; private final String TITLE = "title"; private final String START_TIME = "startTime"; private final String END_TIME = "endTime"; private ArrayList<Integer> bookmarkedIds; private int LESS_DETAIL_SIZE = 300; @Override public RemoteViewsFactory onGetViewFactory(Intent intent) { final AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(this); int[] appWidgetIds = appWidgetManager.getAppWidgetIds(new ComponentName(this, BookmarkWidgetProvider.class)); final int appWidgetId = appWidgetIds[0]; return new RemoteViewsFactory() { private MatrixCursor data = null; @Override public void onCreate() { } @Override public void onDataSetChanged() { if (data != null) { data.close(); } DbSingleton dbSingleton = DbSingleton.getInstance(); try { bookmarkedIds = dbSingleton.getBookmarkIds(); String[] columns = new String[]{ID, TITLE, START_TIME, END_TIME}; data = new MatrixCursor(columns); for (Integer id : bookmarkedIds) { Session session = dbSingleton.getSessionById(id); String start = ISO8601Date.get12HourTime(ISO8601Date.getDateObject(session.getStartTime())); String end = ISO8601Date.get12HourTime(ISO8601Date.getDateObject(session.getEndTime())); data.addRow(new Object[]{id, session.getTitle(), start, end}); } } catch (Exception e) { Timber.e("Parsing Error Occurred at BookmarkWidgetRemoteViewsService::onDataSetChanged."); } } @Override public void onDestroy() { if (data != null) { data.close(); data = null; } } @Override public int getCount() { return data == null ? 0 : data.getCount(); } @Override public RemoteViews getViewAt(int position) { if (position == AdapterView.INVALID_POSITION || data == null || !data.moveToPosition(position)) { return null; } int widgetWidth = getWidgetWidth(appWidgetManager, appWidgetId); String title = data.getString(INDEX_BOOKMARK_TITLE); String start = data.getString(INDEX_BOOKMARK_START_TIME); String end = data.getString(INDEX_BOOKMARK_END_TIME); int id = data.getInt(INDEX_BOOKMARK_ID); RemoteViews views = new RemoteViews(getPackageName(), R.layout.widget_list_item); views.setTextViewText(R.id.title_widget_bookmarks, getString(R.string.bullet) + " " + title); if (Build.VERSION.SDK_INT > Build.VERSION_CODES.JELLY_BEAN) { if (widgetWidth > LESS_DETAIL_SIZE) { views.setTextViewText(R.id.startTime_widget_bookmarks, start); views.setTextViewText(R.id.endTime_widget_bookmarks, end); } else { views.setTextViewText(R.id.startTime_widget_bookmarks, ""); views.setTextViewText(R.id.endTime_widget_bookmarks, ""); } } final Intent fillInIntent = new Intent(); fillInIntent.putExtra(ConstantStrings.SESSION, title); fillInIntent.putExtra(ConstantStrings.ID, id); views.setOnClickFillInIntent(R.id.widget_list_item, fillInIntent); return views; } @Override public RemoteViews getLoadingView() { return new RemoteViews(getPackageName(), R.layout.widget_list_item); } @Override public int getViewTypeCount() { return 1; } @Override public long getItemId(int position) { if (data.moveToPosition(position)) return data.getLong(INDEX_BOOKMARK_ID); return position; } @Override public boolean hasStableIds() { return true; } private int getWidgetWidth(AppWidgetManager appWidgetManager, int appWidgetId) { if (Build.VERSION.SDK_INT < Build.VERSION_CODES.JELLY_BEAN) { return getResources().getDimensionPixelSize(R.dimen.widget_min_resize_width); } return getWidgetWidthFromOptions(appWidgetManager, appWidgetId); } @TargetApi(Build.VERSION_CODES.JELLY_BEAN) private int getWidgetWidthFromOptions(AppWidgetManager appWidgetManager, int appWidgetId) { Bundle options = appWidgetManager.getAppWidgetOptions(appWidgetId); if (options.containsKey(AppWidgetManager.OPTION_APPWIDGET_MIN_WIDTH)) { return options.getInt(AppWidgetManager.OPTION_APPWIDGET_MIN_WIDTH); } return getResources().getDimensionPixelSize(R.dimen.widget_min_resize_width); } }; } }