package com.jasonchen.microlang.utils; import android.annotation.SuppressLint; import android.app.Notification; import android.app.NotificationManager; import android.app.PendingIntent; import android.content.Context; import android.content.Intent; import android.content.IntentFilter; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.os.Handler; import android.os.Looper; import android.os.Parcelable; import android.widget.Toast; import com.jasonchen.microlang.R; import com.jasonchen.microlang.activitys.MainActivity; import com.jasonchen.microlang.activitys.WriteCommentActivity; import com.jasonchen.microlang.beans.AccountBean; import com.jasonchen.microlang.beans.CommentBean; import com.jasonchen.microlang.beans.CommentListBean; import com.jasonchen.microlang.beans.ItemBean; import com.jasonchen.microlang.beans.MessageBean; import com.jasonchen.microlang.beans.MessageListBean; import com.jasonchen.microlang.beans.UnreadBean; import com.jasonchen.microlang.beans.UserBean; import com.jasonchen.microlang.database.NotificationDBTask; import com.jasonchen.microlang.debug.AppLogger; import com.jasonchen.microlang.receivers.RecordOperationAppBroadcastReceiver; import com.jasonchen.microlang.utils.file.FileLocationMethod; import com.jasonchen.microlang.utils.file.FileManager; import com.jasonchen.microlang.utils.image.ImageUtility; import java.util.ArrayList; import java.util.HashMap; /** * jasonchen * 2015/06/12 */ public class BigTextNotificationService extends NotificationServiceHelper { public static Intent newIntent(AccountBean accountBean, MessageListBean mentionsWeiboData, CommentListBean commentsToMeData , CommentListBean mentionsCommentData, UnreadBean unreadBean, Intent clickNotificationToOpenAppPendingIntentInner, String ticker, int currentIndex) { Intent intent = new Intent(GlobalContext.getInstance(), BigTextNotificationService.class); intent.putExtra(NotificationServiceHelper.ACCOUNT_ARG, accountBean); intent.putExtra(NotificationServiceHelper.MENTIONS_WEIBO_ARG, mentionsWeiboData); intent.putExtra(NotificationServiceHelper.MENTIONS_COMMENT_ARG, mentionsCommentData); intent.putExtra(NotificationServiceHelper.COMMENTS_TO_ME_ARG, commentsToMeData); intent.putExtra(NotificationServiceHelper.UNREAD_ARG, unreadBean); intent.putExtra(NotificationServiceHelper.CURRENT_INDEX_ARG, currentIndex); intent.putExtra(NotificationServiceHelper.PENDING_INTENT_INNER_ARG, clickNotificationToOpenAppPendingIntentInner); intent.putExtra(NotificationServiceHelper.TICKER, ticker); return intent; } private class ValueWrapper { private AccountBean accountBean; private MessageListBean mentionsWeibo; private CommentListBean mentionsComment; private CommentListBean commentsToMe; private UnreadBean unreadBean; private int currentIndex; private Intent clickToOpenAppPendingIntentInner; private String ticker; private ArrayList<Parcelable> notificationItems; private RecordOperationAppBroadcastReceiver clearNotificationEventReceiver; } //key is account uid private static HashMap<String, ValueWrapper> valueBagHashMap = new HashMap<String, ValueWrapper>(); @Override public int onStartCommand(Intent intent, int flags, int startId) { AccountBean accountBean = intent.getParcelableExtra(NotificationServiceHelper.ACCOUNT_ARG); if (accountBean == null) { throw new IllegalArgumentException( "you must use BigTextNotificationService newIntent method"); } ValueWrapper valueWrapper = valueBagHashMap.get(accountBean.getUid()); if (valueWrapper == null) { valueWrapper = new ValueWrapper(); } valueWrapper.accountBean = intent.getParcelableExtra(NotificationServiceHelper.ACCOUNT_ARG); valueWrapper.mentionsWeibo = intent .getParcelableExtra(NotificationServiceHelper.MENTIONS_WEIBO_ARG); valueWrapper.commentsToMe = intent .getParcelableExtra(NotificationServiceHelper.COMMENTS_TO_ME_ARG); valueWrapper.mentionsComment = intent .getParcelableExtra(NotificationServiceHelper.MENTIONS_COMMENT_ARG); valueWrapper.unreadBean = intent.getParcelableExtra(NotificationServiceHelper.UNREAD_ARG); valueWrapper.currentIndex = intent .getIntExtra(NotificationServiceHelper.CURRENT_INDEX_ARG, 0); valueWrapper.clickToOpenAppPendingIntentInner = intent .getParcelableExtra(NotificationServiceHelper.PENDING_INTENT_INNER_ARG); valueWrapper.ticker = intent.getStringExtra(NotificationServiceHelper.TICKER); ArrayList<Parcelable> notificationItems = new ArrayList<Parcelable>(); if (valueWrapper.commentsToMe != null) { notificationItems.addAll(valueWrapper.commentsToMe.getItemList()); } if (valueWrapper.mentionsComment != null) { notificationItems.addAll(valueWrapper.mentionsComment.getItemList()); } if (valueWrapper.mentionsWeibo != null) { notificationItems.addAll(valueWrapper.mentionsWeibo.getItemList()); } valueWrapper.notificationItems = notificationItems; valueBagHashMap.put(valueWrapper.accountBean.getUid(), valueWrapper); AppLogger.i("service account name=" + valueWrapper.accountBean.getUsernick()); buildNotification(valueWrapper.accountBean.getUid()); stopSelf(); return super.onStartCommand(intent, flags, startId); } @SuppressLint("NewApi") private void buildNotification(String uid) { final ValueWrapper valueWrapper = valueBagHashMap.get(uid); if (valueWrapper == null) { return; } final AccountBean accountBean = valueWrapper.accountBean; final MessageListBean mentionsWeibo = valueWrapper.mentionsWeibo; final CommentListBean mentionsComment = valueWrapper.mentionsComment; final CommentListBean commentsToMe = valueWrapper.commentsToMe; final UnreadBean unreadBean = valueWrapper.unreadBean; int currentIndex = valueWrapper.currentIndex; Intent clickToOpenAppPendingIntentInner = valueWrapper.clickToOpenAppPendingIntentInner; String ticker = valueWrapper.ticker; ArrayList<Parcelable> notificationItems = valueWrapper.notificationItems; // int count = Math.min(unreadBean.getMention_status(), data.getSize()); int count = notificationItems.size(); if (count == 0) { return; } Parcelable itemBean = notificationItems.get(currentIndex); Notification.Builder builder = new Notification.Builder(getBaseContext()) .setTicker(ticker) .setContentText(ticker) .setSubText(accountBean.getUsernick()) .setSmallIcon(R.drawable.ic_notification) .setAutoCancel(true) .setContentIntent( getPendingIntent(clickToOpenAppPendingIntentInner, itemBean, accountBean)) .setOnlyAlertOnce(true); builder.setContentTitle(getString(R.string.app_name)); if (count > 1) { builder.setNumber(count); } Utility.unregisterReceiverIgnoredReceiverNotRegisteredException( GlobalContext.getInstance(), valueWrapper.clearNotificationEventReceiver); valueWrapper.clearNotificationEventReceiver = new RecordOperationAppBroadcastReceiver() { //mark these messages as read, write to database @Override public void onReceive(Context context, Intent intent) { new Thread(new Runnable() { @Override public void run() { try { ArrayList<String> ids = new ArrayList<String>(); if (mentionsWeibo != null) { for (MessageBean msg : mentionsWeibo.getItemList()) { ids.add(msg.getId()); } NotificationDBTask.addUnreadNotification(accountBean.getUid(), ids, NotificationDBTask.UnreadDBType.mentionsWeibo); } ids.clear(); if (commentsToMe != null) { for (CommentBean msg : commentsToMe.getItemList()) { ids.add(msg.getId()); } NotificationDBTask.addUnreadNotification(accountBean.getUid(), ids, NotificationDBTask.UnreadDBType.commentsToMe); } ids.clear(); if (mentionsComment != null) { for (CommentBean msg : mentionsComment.getItemList()) { ids.add(msg.getId()); } NotificationDBTask.addUnreadNotification(accountBean.getUid(), ids, NotificationDBTask.UnreadDBType.mentionsComment); } } finally { Utility.unregisterReceiverIgnoredReceiverNotRegisteredException( GlobalContext.getInstance(), valueWrapper.clearNotificationEventReceiver); if (Utility.isDebugMode()) { new Handler(Looper.getMainLooper()).post(new Runnable() { @Override public void run() { Toast.makeText(getApplicationContext(), "x.ray:remove notification items" + System .currentTimeMillis(), Toast.LENGTH_SHORT).show(); } }); } } } }).start(); } }; IntentFilter intentFilter = new IntentFilter(RESET_UNREAD_MENTIONS_WEIBO_ACTION); Utility.registerReceiverIgnoredReceiverHasRegisteredHereException( GlobalContext.getInstance(), valueWrapper.clearNotificationEventReceiver, intentFilter); Intent broadcastIntent = new Intent(RESET_UNREAD_MENTIONS_WEIBO_ACTION); PendingIntent deletedPendingIntent = PendingIntent .getBroadcast(GlobalContext.getInstance(), accountBean.getUid().hashCode(), broadcastIntent, PendingIntent.FLAG_UPDATE_CURRENT); builder.setDeleteIntent(deletedPendingIntent); /*if (itemBean instanceof MessageBean) { MessageBean msg = (MessageBean) itemBean; Intent intent = MainActivity.newIntent(accountBean); PendingIntent pendingIntent = PendingIntent .getActivity(getApplicationContext(), 0, intent, PendingIntent.FLAG_UPDATE_CURRENT); builder.addAction(R.drawable.comment_light, getApplicationContext().getString(R.string.comment), pendingIntent); } else if (itemBean instanceof CommentBean) { CommentBean commentBean = (CommentBean) itemBean; Intent intent = MainActivity.newIntent(accountBean); PendingIntent pendingIntent = PendingIntent .getActivity(getApplicationContext(), 0, intent, PendingIntent.FLAG_UPDATE_CURRENT); builder.addAction(R.drawable.reply_to_comment_light, getApplicationContext().getString(R.string.reply), pendingIntent); }*/ String avatar = ((ItemBean) itemBean).getUser().getAvatar_large(); String avatarPath = FileManager.getFilePathFromUrl(avatar, FileLocationMethod.avatar_large); if (ImageUtility.isThisBitmapCanRead(avatarPath) && TaskCache .isThisUrlTaskFinished(avatar)) { Bitmap bitmap = BitmapFactory.decodeFile(avatarPath, new BitmapFactory.Options()); if (bitmap != null) { builder.setLargeIcon(bitmap); } } /*if (count > 1) { String actionName; int nextIndex; int actionDrawable; if (currentIndex < count - 1) { nextIndex = currentIndex + 1; actionName = getString(R.string.next_message); actionDrawable = R.drawable.notification_action_next; } else { nextIndex = 0; actionName = getString(R.string.first_message); actionDrawable = R.drawable.notification_action_previous; } Intent nextIntent = BigTextNotificationService .newIntent(accountBean, mentionsWeibo, commentsToMe, mentionsComment, unreadBean, clickToOpenAppPendingIntentInner, ticker, nextIndex); PendingIntent retrySendIntent = PendingIntent .getService(BigTextNotificationService.this, accountBean.getUid().hashCode(), nextIntent, PendingIntent.FLAG_UPDATE_CURRENT); builder.addAction(actionDrawable, actionName, retrySendIntent); }*/ Notification.BigTextStyle bigTextStyle = new Notification.BigTextStyle(builder); bigTextStyle.setBigContentTitle( getItemBigContentTitle(accountBean, notificationItems, currentIndex)); bigTextStyle.bigText(getItemBigText(notificationItems, currentIndex)); String summaryText; // if (count > 1) { // summaryText = accountBean.getUsernick() + "(" + (currentIndex + 1) + "/" + count + ")"; // } else { summaryText = accountBean.getUsernick(); // } bigTextStyle.setSummaryText(summaryText); builder.setStyle(bigTextStyle); Utility.configVibrateLedRingTone(builder); NotificationManager notificationManager = (NotificationManager) getApplicationContext() .getSystemService(NOTIFICATION_SERVICE); notificationManager.notify(getMentionsWeiboNotificationId(accountBean), builder.build()); } private PendingIntent getPendingIntent(Intent clickToOpenAppPendingIntentInner, Parcelable itemBean, AccountBean accountBean) { clickToOpenAppPendingIntentInner.setExtrasClassLoader(getClass().getClassLoader()); UnreadTabIndex unreadTabIndex = UnreadTabIndex.NONE; if (itemBean instanceof MessageBean) { unreadTabIndex = UnreadTabIndex.MENTION_WEIBO; } else if (itemBean instanceof CommentBean) { CommentBean commentBean = (CommentBean) itemBean; MessageBean messageBean = commentBean.getStatus(); if (messageBean != null) { AppLogger.e(commentBean.getText()); if(accountBean.getInfo().equals(messageBean.getUser())){ unreadTabIndex = UnreadTabIndex.COMMENT_TO_ME; }else{ unreadTabIndex = UnreadTabIndex.MENTION_COMMENT; } if(commentBean.getText().contains("回复@")){ unreadTabIndex = UnreadTabIndex.COMMENT_TO_ME; } /*UserBean userBean = messageBean.getUser(); if (accountBean.getInfo().equals(userBean)) { unreadTabIndex = UnreadTabIndex.COMMENT_TO_ME; } else { unreadTabIndex = UnreadTabIndex.MENTION_COMMENT; }*/ } else { unreadTabIndex = UnreadTabIndex.MENTION_COMMENT; } } clickToOpenAppPendingIntentInner .putExtra(BundleArgsConstants.OPEN_NAVIGATION_INDEX_EXTRA, unreadTabIndex); PendingIntent pendingIntent = PendingIntent .getActivity(getBaseContext(), getMentionsWeiboNotificationId(accountBean), clickToOpenAppPendingIntentInner, PendingIntent.FLAG_UPDATE_CURRENT); return pendingIntent; } private String getItemBigContentTitle(AccountBean accountBean, ArrayList<Parcelable> notificationItems, int currentIndex) { // Parcelable itemBean = notificationItems.get(currentIndex); // if (itemBean instanceof MessageBean) { // MessageBean msg = (MessageBean) itemBean; // if (msg.getText().contains(accountBean.getUsernick())) { // // mentioned you // return "@" // + msg.getUser().getScreen_name() // + getString(R.string.weibo_at_to_you); // } else { // // retweeted your weibo // return "@" // + msg.getUser().getScreen_name() // + getString(R.string.retweeted_your_weibo); // } // } else if (itemBean instanceof CommentBean) { // CommentBean commentBean = (CommentBean) itemBean; // CommentBean oriCommentBean = commentBean.getReply_comment(); // MessageBean oriMessageBean = commentBean.getStatus(); // if (oriCommentBean != null && accountBean.getInfo().equals(oriCommentBean.getUser())) { // return "@" // + commentBean.getUser().getScreen_name() // + getString(R.string.reply_to_you); // } else if (oriMessageBean != null && accountBean.getInfo() // .equals(oriMessageBean.getUser())) { // return "@" // + commentBean.getUser().getScreen_name() // + getString(R.string.comment_sent_to_you); // } else { // return commentBean.getUser().getScreen_name() // + getString(R.string.comment_at_to_you); // } // } ItemBean itemBean = (ItemBean) notificationItems.get(currentIndex); return itemBean.getUser().getScreen_name(); } private CharSequence getItemBigText(ArrayList<Parcelable> notificationItems, int currentIndex) { ItemBean itemBean = (ItemBean) notificationItems.get(currentIndex); return TimeLineUtility.convertNormalStringToSpannableString(itemBean.getText()); } }