package com.dwdesign.tweetings.appwidget.adapter; import static com.dwdesign.tweetings.appwidget.util.Utils.buildActivatedStatsWhereClause; import static com.dwdesign.tweetings.appwidget.util.Utils.buildFilterWhereClause; import static com.dwdesign.tweetings.appwidget.util.Utils.getAccountColor; import static com.dwdesign.tweetings.appwidget.util.Utils.getActivatedAccountIds; import static com.dwdesign.tweetings.appwidget.util.Utils.getFilename; import static com.dwdesign.tweetings.appwidget.util.Utils.getRoundedCornerBitmap; import static com.dwdesign.tweetings.appwidget.util.Utils.getTableNameForContentUri; import static com.dwdesign.tweetings.appwidget.util.Utils.getTweetingsCacheDir; import static com.dwdesign.tweetings.util.Utils.getBestCacheDir; import static com.dwdesign.tweetings.util.Utils.getBiggerTwitterProfileImage; import static com.dwdesign.tweetings.util.Utils.parseURL; import java.io.File; import java.net.URL; import com.dwdesign.tweetings.Constants; import com.dwdesign.tweetings.R; import com.dwdesign.tweetings.app.TweetingsApplication; import com.dwdesign.tweetings.model.StatusCursorIndices; import com.dwdesign.tweetings.provider.TweetStore.Statuses; import com.dwdesign.tweetings.util.HtmlEscapeHelper; import android.annotation.TargetApi; import android.app.PendingIntent; import android.appwidget.AppWidgetManager; import android.content.ContentResolver; import android.content.Context; import android.content.Intent; import android.content.SharedPreferences; import android.content.res.Resources; import android.database.Cursor; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.graphics.Color; import android.net.Uri; import android.os.Bundle; import android.text.format.DateUtils; import android.view.View; import android.widget.RemoteViews; import android.widget.RemoteViewsService.RemoteViewsFactory; @TargetApi(11) public abstract class StatusesAdapter implements RemoteViewsFactory, Constants { private final int layout; private final Context context; private final ContentResolver resolver; private final Resources resources; private final SharedPreferences preferences; private Cursor cursor; private StatusCursorIndices indices; private TweetingsApplication mApplication; private boolean should_show_account_color; public StatusesAdapter(final Context context, final int layout) { this.layout = layout; this.context = context; resolver = context.getContentResolver(); resources = context.getResources(); preferences = context.getSharedPreferences(SHARED_PREFERENCES_NAME, Context.MODE_PRIVATE); mApplication = TweetingsApplication.getInstance(context); } public abstract Uri getContentUri(); @Override public int getCount() { return cursor != null ? cursor.getCount() : 0; } @Override public long getItemId(final int position) { if (cursor == null) return -1; cursor.moveToPosition(position); return cursor.getLong(indices.status_id); } @Override public RemoteViews getLoadingView() { // return new RemoteViews(context.getPackageName(), // R.layout.status_item_loading); return null; } @Override public RemoteViews getViewAt(final int position) { final RemoteViews views = new RemoteViews(context.getPackageName(), layout); if (cursor == null || indices == null) return views; cursor.moveToPosition(position); if (!preferences.getBoolean(PREFERENCE_KEY_DISPLAY_NAME, false)) { views.setTextViewText(R.id.name, cursor.getString(indices.screen_name)); } else { views.setTextViewText(R.id.name, cursor.getString(indices.name)); } views.setTextViewText(R.id.text, HtmlEscapeHelper.unescape(cursor.getString(indices.text))); views.setTextViewText(R.id.time, DateUtils.getRelativeTimeSpanString(cursor.getLong(indices.status_timestamp))); final Uri.Builder uri_builder = new Uri.Builder(); uri_builder.scheme(SCHEME_TWEETINGS); uri_builder.authority(AUTHORITY_STATUS); uri_builder.appendQueryParameter(QUERY_PARAM_ACCOUNT_ID, String.valueOf(cursor.getLong(indices.account_id))); uri_builder.appendQueryParameter(QUERY_PARAM_STATUS_ID, String.valueOf(cursor.getLong(indices.status_id))); //final Intent intent = new Intent(Intent.ACTION_VIEW, uri_builder.build()); //final PendingIntent pending_intent = PendingIntent.getActivity(context, 0, intent, // Intent.FLAG_ACTIVITY_NEW_TASK); //views.setOnClickPendingIntent(R.id.tweet_item, pending_intent); //views.setPendingIntentTemplate(R.id.tweet_item, pending_intent);*/ Intent fillInIntent = new Intent(); fillInIntent.setData(uri_builder.build()); views.setOnClickFillInIntent(R.id.tweet_item, fillInIntent); if (!preferences.getBoolean(PREFERENCE_KEY_DISPLAY_PROFILE_IMAGE, true)) { views.setViewVisibility(R.id.profile_image, View.GONE); } else { views.setViewVisibility(R.id.profile_image, View.VISIBLE); try { final File cache_dir = getBestCacheDir(context, DIR_NAME_IMAGE_CACHE); final String profile_image_url = cursor.getString(indices.profile_image_url); final String file_name = getFilename(resources.getBoolean(R.bool.hires_profile_image) ? getBiggerTwitterProfileImage(profile_image_url) : profile_image_url); final File profile_image_file = cache_dir != null && cache_dir.isDirectory() && file_name != null ? new File( cache_dir, file_name) : null; final Bitmap profile_image = profile_image_file != null && profile_image_file.isFile() ? BitmapFactory .decodeFile(profile_image_file.getPath()) : null; if (profile_image != null) { views.setImageViewBitmap(R.id.profile_image, getRoundedCornerBitmap(resources, profile_image)); } else { views.setImageViewResource(R.id.profile_image, R.drawable.ic_profile_image_default); } }catch (Exception e) { views.setImageViewResource(R.id.profile_image, R.drawable.ic_profile_image_default); } } final long account_id = cursor.getLong(indices.account_id); views.setInt(R.id.account_color, "setBackgroundColor", should_show_account_color ? getAccountColor(context, account_id) : Color.TRANSPARENT); return views; } @Override public int getViewTypeCount() { return 1; } @Override public boolean hasStableIds() { return true; } @Override public void onCreate() { } @Override public void onDataSetChanged() { final Uri uri = getContentUri(); final String[] cols = new String[] { Statuses._ID, Statuses.ACCOUNT_ID, Statuses.STATUS_ID, Statuses.TEXT, Statuses.SCREEN_NAME, Statuses.NAME, Statuses.STATUS_TIMESTAMP, Statuses.PROFILE_IMAGE_URL }; String where = buildActivatedStatsWhereClause(context, null); if (preferences.getBoolean(PREFERENCE_KEY_ENABLE_FILTER, false)) { final String table = getTableNameForContentUri(uri); where = buildFilterWhereClause(table, where); } cursor = resolver.query(uri, cols, where, null, Statuses.DEFAULT_SORT_ORDER); indices = new StatusCursorIndices(cursor); should_show_account_color = getActivatedAccountIds(context).length > 1; } @Override public void onDestroy() { if (cursor != null) { cursor.close(); } cursor = null; } }