package com.mcxiaoke.minicat.push; import android.app.AlarmManager; import android.app.Notification; import android.app.NotificationManager; import android.app.PendingIntent; import android.content.Context; import android.content.Intent; import android.database.Cursor; import android.graphics.Color; import android.support.v4.app.NotificationCompat; import android.text.TextUtils; import com.mcxiaoke.bus.Bus; import com.mcxiaoke.minicat.AppContext; import com.mcxiaoke.minicat.R; import com.mcxiaoke.minicat.api.Api; import com.mcxiaoke.minicat.api.Paging; import com.mcxiaoke.minicat.app.UIHome; import com.mcxiaoke.minicat.app.UIStatus; import com.mcxiaoke.minicat.controller.DataController; import com.mcxiaoke.minicat.dao.model.DirectMessageModel; import com.mcxiaoke.minicat.dao.model.StatusModel; import com.mcxiaoke.minicat.preference.PreferenceHelper; import com.mcxiaoke.minicat.receiver.PushReceiver; import com.mcxiaoke.minicat.service.BaseIntentService; import com.mcxiaoke.minicat.service.SyncService; import com.mcxiaoke.minicat.util.DateTimeHelper; import com.mcxiaoke.minicat.util.LogUtil; import java.util.Calendar; import java.util.List; /** * Project: fanfouapp * Package: com.mcxiaoke.fanfouapp.push * User: mcxiaoke * Date: 13-6-2 * Time: 下午6:04 */ public class PushService extends BaseIntentService { public static final String ACTION_START = "com.mcxiaoke.fanfouapp.PushService.ACTION_START"; public static final int TYPE_ALL = -100; public static final int TYPE_MENTION = -101; public static final int TYPE_MESSAGE = -102; public static final String EXTRA_TYPE = "com.mcxiaoke.fanfouapp.PushService.EXTRA_TYPE"; public static final String EXTRA_DATA = "com.mcxiaoke.fanfouapp.PushService.EXTRA_DATA"; private static final String TAG = PushService.class.getSimpleName(); private static final int NOTIFICATION_STATUS_ID = 1234; private static final int NOTIFICATION_DM_ID = 2234; private static boolean DEBUG = AppContext.DEBUG; public PushService() { super(TAG); debug("PushService()"); } private static void debug(String message) { LogUtil.v(TAG, message); } public static void checkAll(Context context) { Intent intent = new Intent(context, PushService.class); intent.putExtra("type", TYPE_ALL); PushReceiver.startWakefulService(context, intent); } public static void checkMentions(Context context) { Intent intent = new Intent(context, PushService.class); intent.putExtra("type", TYPE_MENTION); PushReceiver.startWakefulService(context, intent); } public static void checkMessages(Context context) { Intent intent = new Intent(context, PushService.class); intent.putExtra("type", TYPE_MESSAGE); PushReceiver.startWakefulService(context, intent); } public static void check(Context context) { boolean enabled = PreferenceHelper.getInstance(context).isPushNotificationEnabled(); if (DEBUG) { debug("check() enabled=" + enabled); } if (enabled) { set(context); } else { cancel(context); } } private static void set(Context context) { final Calendar calendar = Calendar.getInstance(); if (DEBUG) { debug("setAlarm() now time is " + DateTimeHelper.formatDate(calendar.getTime())); } calendar.add(Calendar.MINUTE, 5); final long interval = 10 * 60 * 1000L;// 提醒间隔10分钟 final long nextTime = calendar.getTimeInMillis(); AlarmManager am = (AlarmManager) context.getSystemService(ALARM_SERVICE); am.setInexactRepeating(AlarmManager.RTC_WAKEUP, nextTime, interval, getPendingIntent(context)); if (DEBUG) { debug("setAlarm() next time is " + DateTimeHelper.formatDate(nextTime)); } } public static void cancel(Context context) { AlarmManager alarmManager = (AlarmManager) context.getSystemService(ALARM_SERVICE); alarmManager.cancel(getPendingIntent(context)); if (DEBUG) { debug("cancelAlarm()"); } } private static PendingIntent getPendingIntent(Context context) { Intent broadcast = new Intent(context, PushReceiver.class); broadcast.setAction(ACTION_START); return PendingIntent.getBroadcast(context, 0, broadcast, PendingIntent.FLAG_UPDATE_CURRENT); } private static void showMentionNotification(Context context, final StatusModel sm) { debug("showMentionNotification() sm=" + sm); Intent intent = new Intent(context, UIStatus.class); intent.setAction("DUMMY_ACTION" + System.currentTimeMillis()); intent.putExtra("data", sm); PendingIntent pi = PendingIntent.getActivity(context, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT); String ticker = "来自@" + sm.getUserScreenName() + "的新消息"; String title = sm.getUserScreenName(); String text = sm.getSimpleText(); String subText = DateTimeHelper.getInterval(sm.getTime()); showNotification(context, NOTIFICATION_STATUS_ID, R.drawable.ic_stat_mention, pi, ticker, title, text, subText); } private static void showDMNotification(Context context, final DirectMessageModel dm) { debug("showDMNotification() dm=" + dm); Intent intent = new Intent(context, UIHome.class); intent.setAction("DUMMY_ACTION" + System.currentTimeMillis()); intent.putExtra("data", dm); PendingIntent pi = PendingIntent.getActivity(context, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT); String ticker = "来自@" + dm.getSenderScreenName() + "的新私信"; String title = dm.getSenderScreenName(); String text = dm.getText(); String subText = DateTimeHelper.getInterval(dm.getTime()); showNotification(context, NOTIFICATION_DM_ID, R.drawable.ic_stat_dm, pi, ticker, title, text, subText); } private static void showNotification(Context context, int id, int iconId, PendingIntent pi, String ticker, String title, String text, String subText) { debug("showNotification() id=" + id + " ticker=" + ticker); NotificationCompat.Builder nb = new NotificationCompat.Builder(context); nb.setWhen(System.currentTimeMillis()); nb.setSmallIcon(iconId); nb.setTicker(ticker).setContentTitle(title).setContentText(text); nb.setSubText(subText); nb.setLights(Color.GREEN, 200, 200); nb.setDefaults(Notification.DEFAULT_ALL); nb.setAutoCancel(true).setOnlyAlertOnce(true); nb.setContentIntent(pi); NotificationManager nm = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE); nm.notify(id, nb.build()); } @Override protected void onHandleIntent(Intent intent) { super.onHandleIntent(intent); debug("onHandleIntent()"); doWakefulWork(intent); PushReceiver.completeWakefulIntent(intent); } protected void doWakefulWork(Intent intent) { boolean enabled = PreferenceHelper.getInstance(this).isPushNotificationEnabled(); if (!enabled) { debug("doWakefulWork() push disabled, ignore"); return; } final Calendar calendar = Calendar.getInstance(); if (calendar.get(Calendar.HOUR_OF_DAY) < 6) { // 6点不提醒 return; } int type = intent.getIntExtra("type", TYPE_ALL); debug("doWakefulWork() type=" + type); switch (type) { case TYPE_MENTION: checkMentions(); break; case TYPE_MESSAGE: checkDirectMessages(); break; case TYPE_ALL: checkMentions(); checkDirectMessages(); break; default: break; } } private void checkMentions() { String sinceId = getSinceId(); debug("checkMentions() sinceId=" + sinceId); if (!TextUtils.isEmpty(sinceId)) { Api api = AppContext.getApi(); Paging p = new Paging(); p.sinceId = sinceId; try { List<StatusModel> ss = api.getMentions(p); if (ss != null && ss.size() > 0) { debug("checkMentions() result=" + ss); DataController.store(this, ss); StatusModel sm = ss.get(0); showMention(sm); if (AppContext.homeVisible) { Bus.getDefault().post(new PushStatusEvent(sm)); } } } catch (Exception e) { e.printStackTrace(); } } } private void checkDirectMessages() { String sinceId = getDMSinceId(); debug("checkDirectMessages() sinceId=" + sinceId); if (!TextUtils.isEmpty(sinceId)) { Api api = AppContext.getApi(); Paging p = new Paging(); p.sinceId = sinceId; try { List<DirectMessageModel> dms = api.getDirectMessagesInbox(p); if (dms != null && dms.size() > 0) { debug("checkDirectMessages() result=" + dms); DataController.store(this, dms); DirectMessageModel dm = dms.get(0); showDM(dm); if (AppContext.homeVisible) { Bus.getDefault().post(new PushMessageEvent(dm)); } } } catch (Exception e) { e.printStackTrace(); } } else { debug("checkDirectMessages() init fetch"); SyncService.getConversationList(getApplication()); } } private String getDMSinceId() { Cursor cursor = null; try { cursor = DataController.getDirectMessageCursor(this); if (cursor != null && cursor.moveToFirst()) { DirectMessageModel dm = DirectMessageModel.from(cursor); debug("getDMSinceId dm=" + dm); if (dm != null) { return dm.getId(); } } } finally { if (cursor != null) { cursor.close(); } } return null; } private String getSinceId() { Cursor cursor = null; try { cursor = DataController.getHomeTimelineCursor(this); if (cursor != null && cursor.moveToFirst()) { StatusModel st = StatusModel.from(cursor); debug("getSinceId st=" + st); if (st != null) { return st.getId(); } } } finally { if (cursor != null) { cursor.close(); } } return null; } private void showMention(StatusModel st) { String lastId = PreferenceHelper.getInstance(this).getLastPushStatusId(); if (st.getId().equals(lastId)) { return; } showMentionNotification(this, st); } private void showDM(DirectMessageModel dm) { String lastId = PreferenceHelper.getInstance(this).getKeyLastPushDmId(); if (dm.getId().equals(lastId)) { return; } PreferenceHelper.getInstance(this).setLastPushStatusId(dm.getId()); showDMNotification(this, dm); } @Override public void onCreate() { super.onCreate(); debug("onCreate()"); } @Override public void onDestroy() { super.onDestroy(); debug("onDestroy()"); } }