package net.dev123.yibo;
import java.util.List;
import net.dev123.commons.Paging;
import net.dev123.commons.util.StringUtil;
import net.dev123.commons.util.TimeSpanUtil;
import net.dev123.mblog.entity.Status;
import net.dev123.mblog.entity.User;
import net.dev123.yibo.common.CacheManager;
import net.dev123.yibo.common.Constants;
import net.dev123.yibo.common.StatusCatalog;
import net.dev123.yibo.db.LocalStatus;
import net.dev123.yibo.db.StatusDao;
import net.dev123.yibo.service.cache.ImageCache;
import net.dev123.yibo.service.cache.wrap.CachedImage;
import net.dev123.yibo.service.cache.wrap.CachedImageKey;
import android.app.PendingIntent;
import android.appwidget.AppWidgetManager;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.content.res.Resources;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.text.Html;
import android.text.SpannableString;
import android.text.Spanned;
import android.text.style.ForegroundColorSpan;
import android.util.Log;
import android.view.View;
import android.widget.RemoteViews;
public class RollerWidgetWrap {
private static final String TAG = "RollerWidgetReceiver";
public static final String ALART_ACTION = "net.dev123.action.update_widget";
private static final String MOVE_NEXT = "net.dev123.yibo.move_next";
private static final String IS_AUTO = "net.dev123.yibo.is_auto";
private static final int PAGE_COLOR = 0xFF297acc;
private Bitmap DEFAULT_HEADER_BITMAP;
private ComponentName thisWidget;
private AppWidgetManager manager;;
private List<Status> listStatus;
private int index;
private int count;
private boolean isLastAuto = true;
private ForegroundColorSpan fcSpan;
public void onReceive(Context context, Intent intent) {
boolean isMoveNext = intent.getBooleanExtra(MOVE_NEXT, true);
boolean isAuto = intent.getBooleanExtra(IS_AUTO, true);
//如果手动移动的话,则取消掉自动一次
if (!isLastAuto && isAuto) {
isLastAuto = true;
return;
}
if (!isAuto) {
isLastAuto = false;
}
Status status = null;
if (listStatus == null) {
listStatus = getFreshStatus(context);
index = 0;
//清除使用数据View
//remoteViewsHasData = new RemoteViews(context.getPackageName(), R.layout.widget_roller);
}
if (listStatus != null) {
count = listStatus.size();
if (!isMoveNext) {
index = (listStatus.size() + index - 2) % listStatus.size();
}
status = listStatus.get(index++);
if (index >= listStatus.size()) {
index = 0;
listStatus = null;
}
}
RemoteViews remoteViews = buildRemoteViews(context, status);
thisWidget = new ComponentName(context, RollerWidget.class);
manager = AppWidgetManager.getInstance(context);
manager.updateAppWidget(thisWidget, remoteViews);
if (Constants.DEBUG) Log.d(TAG, "onReceive" + ": " + this.hashCode());
}
private RemoteViews buildRemoteViews(Context context, Status status) {
if (status == null
|| (status instanceof LocalStatus
&& ((LocalStatus)status).isDivider())) {
return buildRemoteViewsNoData(context);
}
User user = status.getUser();
RemoteViews remoteViews = new RemoteViews(context.getPackageName(), R.layout.widget_roller);
if (DEFAULT_HEADER_BITMAP == null) {
Resources res = context.getResources();
DEFAULT_HEADER_BITMAP = BitmapFactory.decodeResource(res, R.drawable.icon_header_default_min);
}
remoteViews.setImageViewBitmap(R.id.ivProfilePicture, DEFAULT_HEADER_BITMAP);
String profileUrl = user.getProfileImageUrl();
if (StringUtil.isNotBlank(profileUrl)) {
ImageCache imageCache = (ImageCache)CacheManager.getInstance().getCache(ImageCache.class.getName());
CachedImageKey imageInfo = new CachedImageKey(profileUrl, CachedImageKey.IMAGE_HEAD_MINI);
CachedImage wrap = imageCache.get(imageInfo);
if (wrap != null && wrap.getWrap() != null) {
remoteViews.setImageViewBitmap(R.id.ivProfilePicture, wrap.getWrap());
}
}
remoteViews.setTextViewText(R.id.tvScreenName, user.getScreenName());
if (user.isVerified()) {
remoteViews.setViewVisibility(R.id.ivVerify, View.VISIBLE);
} else {
remoteViews.setViewVisibility(R.id.ivVerify, View.GONE);
}
if (status.isFavorited()) {
remoteViews.setViewVisibility(R.id.ivFavorite, View.VISIBLE);
} else {
remoteViews.setViewVisibility(R.id.ivFavorite, View.GONE);
}
String thumbnailUrl = status.getThumbnailPicture();
Status retweet = status.getRetweetedStatus();
if (retweet != null) {
thumbnailUrl = retweet.getThumbnailPicture();
}
if (StringUtil.isNotEmpty(thumbnailUrl)) {
remoteViews.setViewVisibility(R.id.ivAttachment, View.VISIBLE);
} else {
remoteViews.setViewVisibility(R.id.ivAttachment, View.GONE);
}
remoteViews.setTextViewText(R.id.tvCreateAt, TimeSpanUtil.toTimeSpanString(status.getCreatedAt()));
remoteViews.setTextViewText(R.id.tvText, Html.fromHtml(status.getText()));
if (retweet != null) {
remoteViews.setViewVisibility(R.id.llRetweet, View.VISIBLE);
String retweetText = "@" + retweet.getUser().getScreenName() +
": " + retweet.getText();
remoteViews.setTextViewText(R.id.tvRetweetText, Html.fromHtml(retweetText));
} else {
remoteViews.setViewVisibility(R.id.llRetweet, View.GONE);
}
int pageIndex = (index == 0) ? count : index;
String page = pageIndex + "/" + count;
SpannableString pageSpan = new SpannableString(page);
if (fcSpan == null) {
fcSpan = new ForegroundColorSpan(PAGE_COLOR);
}
pageSpan.setSpan(
fcSpan, 0,
String.valueOf(pageIndex).length(),
Spanned.SPAN_EXCLUSIVE_EXCLUSIVE
);
remoteViews.setTextViewText(R.id.tvPage, pageSpan);
Intent appIntent = new Intent(context, HomePageActivity.class);
PendingIntent appPendingIntent = PendingIntent.getActivity(context, 0, appIntent, 0);
remoteViews.setOnClickPendingIntent(R.id.ibtnWidgetLogo, appPendingIntent);
Intent editMicroBlogIntent = new Intent(context, EditMicroBlogActivity.class);
PendingIntent editStatusPendingIntent = PendingIntent.getActivity(context, 0, editMicroBlogIntent, 0);
remoteViews.setOnClickPendingIntent(R.id.ibtnWidgetStatus, editStatusPendingIntent);
Intent viewStatusIntent = new Intent(context, MicroBlogActivity.class);
viewStatusIntent.putExtra("STATUS", status);
viewStatusIntent.putExtra("SOURCE", Constants.SOURCE_WIDGET);
PendingIntent viewStatusPendingIntent = PendingIntent.getActivity(context, (int)System.currentTimeMillis(), viewStatusIntent, 0);
remoteViews.setOnClickPendingIntent(R.id.llStatus, viewStatusPendingIntent);
Intent cameraIntent = new Intent(context, EditMicroBlogActivity.class);
cameraIntent.putExtra("TYPE", Constants.EDIT_TYPE_TWEET);
cameraIntent.putExtra("SOURCE", Constants.SOURCE_WIDGET_CAMERA);
PendingIntent cameraPendingIntent = PendingIntent.getActivity(context, 1, cameraIntent, 0);
remoteViews.setOnClickPendingIntent(R.id.ibtnWidgetCamera, cameraPendingIntent);
Intent previousIntent = new Intent(ALART_ACTION);
previousIntent.putExtra(MOVE_NEXT, false);
previousIntent.putExtra(IS_AUTO, false);
PendingIntent previousPendingIntent = PendingIntent.getBroadcast(context, 1, previousIntent, 0);
remoteViews.setOnClickPendingIntent(R.id.ibtnWidgetPrevious, previousPendingIntent);
Intent nextIntent = new Intent(ALART_ACTION);
previousIntent.putExtra(MOVE_NEXT, true);
nextIntent.putExtra(IS_AUTO, false);
PendingIntent nextPendingIntent = PendingIntent.getBroadcast(context, 2, nextIntent, 0);
remoteViews.setOnClickPendingIntent(R.id.ibtnWidgetNext, nextPendingIntent);
return remoteViews;
}
private RemoteViews buildRemoteViewsNoData(Context context) {
RemoteViews remoteViews = new RemoteViews(context.getPackageName(), R.layout.widget_roller_no_data);
Intent appIntent = new Intent(context, HomePageActivity.class);
PendingIntent appPendingIntent = PendingIntent.getActivity(context, 0, appIntent, 0);
remoteViews.setOnClickPendingIntent(R.id.ibtnWidgetLogo, appPendingIntent);
Intent editStatusIntent = new Intent(context, EditMicroBlogActivity.class);
PendingIntent editStatusPendingIntent = PendingIntent.getActivity(context, 0, editStatusIntent, 0);
remoteViews.setOnClickPendingIntent(R.id.ibtnWidgetStatus, editStatusPendingIntent);
Intent cameraIntent = new Intent(context, EditMicroBlogActivity.class);
cameraIntent.putExtra("TYPE", Constants.EDIT_TYPE_TWEET);
cameraIntent.putExtra("SOURCE", Constants.SOURCE_WIDGET_CAMERA);
PendingIntent cameraPendingIntent = PendingIntent.getActivity(context, (int)System.currentTimeMillis(), cameraIntent, 0);
remoteViews.setOnClickPendingIntent(R.id.ibtnWidgetCamera, cameraPendingIntent);
return remoteViews;
}
private List<Status> getFreshStatus(Context context) {
Paging<Status> page = new Paging<Status>();
page.moveToNext();
StatusDao dao = new StatusDao(context);
StringBuffer sql = new StringBuffer();
sql.append(
"select " +
" * " +
"from " +
" Status " +
"where " +
" Catalog = " + StatusCatalog.Home.getCatalogId() + " " +
"order by " +
" Created_At desc " +
"limit " +
" " + page.getPageSize()
);
List<Status> listStatus = dao.find(sql.toString());
return listStatus;
}
}