package com.piusvelte.sonet; import android.annotation.SuppressLint; import android.appwidget.AppWidgetManager; import android.content.Context; import android.content.Intent; import android.database.Cursor; import android.graphics.BitmapFactory; import android.net.Uri; import android.os.Bundle; import android.text.TextUtils; import android.util.Log; import android.view.View; import android.widget.RemoteViews; import com.piusvelte.sonet.provider.StatusLinks; import com.piusvelte.sonet.provider.StatusesStyles; import com.piusvelte.sonet.social.Client; import com.piusvelte.sonet.util.CircleTransformation; import com.squareup.picasso.Picasso; @SuppressLint("NewApi") public class SonetRemoteViewsFactory implements android.widget.RemoteViewsService.RemoteViewsFactory { private static final String TAG = "SonetRemoteViewsFactory"; private static int sColumnIndexId; private static int sColumnIndexService; private static int sColumnIndexFriend; private static int sColumnIndexProfileUrl; private static int sColumnIndexMessage; private static int sColumnIndexCreatedText; private static int sColumnIndexImage; private Context mContext; private Cursor mCursor; private int mAppWidgetId; private Picasso mPicasso; private CircleTransformation mCircleTransformation; public SonetRemoteViewsFactory(Context context, Intent intent) { mContext = context; mAppWidgetId = intent.getIntExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, AppWidgetManager.INVALID_APPWIDGET_ID); mPicasso = Picasso.with(context); mCircleTransformation = new CircleTransformation(); } @Override public int getCount() { if (mCursor != null) { return mCursor.getCount(); } else { return 0; } } @Override public long getItemId(int position) { if ((mCursor != null) && !mCursor.isClosed() && mCursor.moveToPosition(position)) { return mCursor.getLong(mCursor.getColumnIndex(StatusesStyles._ID)); } return position; } @Override public RemoteViews getLoadingView() { return null; } @Override public RemoteViews getViewAt(int position) { // load the item final RemoteViews views; if (mCursor != null && !mCursor.isClosed() && mCursor.moveToPosition(position)) { views = new RemoteViews(mContext.getPackageName(), R.layout.widget_item); // set icons views.setImageViewResource(R.id.icon, Client.Network.get(mCursor.getInt(sColumnIndexService)).getIcon()); views.setTextViewText(R.id.message, mCursor.getString(sColumnIndexMessage)); // Set the click intent so that we can handle it and show a toast message final Intent fillInIntent = new Intent(); final Bundle extras = new Bundle(); extras.putString(StatusLinks.STATUS_ID, Long.toString(mCursor.getLong(sColumnIndexId))); fillInIntent.putExtras(extras); views.setOnClickFillInIntent(R.id.item, fillInIntent); views.setTextViewText(R.id.friend, mCursor.getString(sColumnIndexFriend)); views.setTextViewText(R.id.created, mCursor.getString(sColumnIndexCreatedText)); String imageUrl = mCursor.getString(sColumnIndexImage); if (!TextUtils.isEmpty(imageUrl)) { views.setViewVisibility(R.id.image, View.VISIBLE); mPicasso.load(imageUrl) .into(views, R.id.image, new int[] { mAppWidgetId }); } else { views.setViewVisibility(R.id.image, View.GONE); } String profileUrl = mCursor.getString(sColumnIndexProfileUrl); if (!TextUtils.isEmpty(profileUrl)) { mPicasso.load(profileUrl) .transform(mCircleTransformation) .error(R.drawable.ic_account_box_grey600_48dp) .into(views, R.id.profile, new int[] { mAppWidgetId }); } else { views.setImageViewBitmap(R.id.profile, mCircleTransformation.transform(BitmapFactory.decodeResource(mContext.getResources(), R.drawable.ic_account_box_grey600_48dp))); } } else { views = null; } return views; } @Override public int getViewTypeCount() { return 1; } @Override public boolean hasStableIds() { return false; } @Override public void onCreate() { } @Override public void onDataSetChanged() { // Refresh the cursor, warning: the resulting cursor could be null if (mCursor != null) { mCursor.close(); } if (BuildConfig.DEBUG) { Log.d(TAG, "onDataSetChanged: " + mAppWidgetId); } // use INVALID_APPWIDGET_ID as accounts are no longer widget specific mCursor = mContext.getContentResolver().query(Uri.withAppendedPath(StatusesStyles.getContentUri(mContext), Integer.toString(AppWidgetManager.INVALID_APPWIDGET_ID)), new String[] { StatusesStyles._ID, StatusesStyles.SERVICE, StatusesStyles.FRIEND, StatusesStyles.PROFILE_URL, StatusesStyles.MESSAGE, StatusesStyles.CREATEDTEXT, StatusesStyles.IMAGE_URL }, null, null, StatusesStyles.CREATED + " DESC"); if (mCursor != null) { sColumnIndexId = mCursor.getColumnIndexOrThrow(StatusesStyles._ID); sColumnIndexService = mCursor.getColumnIndexOrThrow(StatusesStyles.SERVICE); sColumnIndexFriend = mCursor.getColumnIndexOrThrow(StatusesStyles.FRIEND); sColumnIndexProfileUrl = mCursor.getColumnIndexOrThrow(StatusesStyles.PROFILE_URL); sColumnIndexMessage = mCursor.getColumnIndexOrThrow(StatusesStyles.MESSAGE); sColumnIndexCreatedText = mCursor.getColumnIndexOrThrow(StatusesStyles.CREATEDTEXT); sColumnIndexImage = mCursor.getColumnIndexOrThrow(StatusesStyles.IMAGE_URL); } } @Override public void onDestroy() { if (mCursor != null) { mCursor.close(); } } }