From abf181bd02bc2848fd068416f4d662f97a6279f7 Mon Sep 17 00:00:00 2001 From: 张道锋 <1050130019@qq.com> Date: Fri, 23 Mar 2018 16:01:44 +0800 Subject: [PATCH] no message --- .idea/modules.xml | 2 +- app/build.gradle | 1 + app/src/main/AndroidManifest.xml | 48 +++++++++++++++++++++++++----------------------- app/src/main/java/com/shunzhi/parent/AppConfig.java | 2 ++ app/src/main/java/com/shunzhi/parent/bean/message/PHMessage.java | 39 +++++++++++++++++++++++++++++++++++++-- app/src/main/java/com/shunzhi/parent/bean/message/PHMessageSession.java | 35 +++++++++++++++++++++++++++++++++-- app/src/main/java/com/shunzhi/parent/manager/MessageManager.java | 92 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++--- app/src/main/java/com/shunzhi/parent/ui/MainActivity.java | 28 ++++++++++++++++++++++++++++ app/src/main/java/com/shunzhi/parent/ui/service/BadgeIntentService.java | 143 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 9 files changed, 359 insertions(+), 31 deletions(-) create mode 100644 app/src/main/java/com/shunzhi/parent/ui/service/BadgeIntentService.java diff --git a/.idea/modules.xml b/.idea/modules.xml index eac7886..45d1910 100644 --- a/.idea/modules.xml +++ b/.idea/modules.xml @@ -4,8 +4,8 @@ + - diff --git a/app/build.gradle b/app/build.gradle index 7232194..4be4291 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -47,4 +47,5 @@ dependencies { implementation project(':roundedimageview-2.2.1') implementation files('libs/AMap_Location_V3.8.0_20180201.jar') implementation 'org.greenrobot:greendao:3.2.2' // add library + compile "me.leolin:ShortcutBadger:1.1.19@aar" } diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 9add6c7..7b51a71 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -65,11 +65,11 @@ - + + - @@ -112,7 +112,8 @@ android:name="com.amap.api.v2.apikey" android:value="1d130afb822d8a1019e6592cbaf10bcc"/> - @@ -121,10 +122,10 @@ - - - - + + + + @@ -133,12 +134,12 @@ + android:screenOrientation="portrait" + android:windowSoftInputMode="adjustPan|stateAlwaysHidden"/> + android:screenOrientation="portrait"/> - - + - - - + android:screenOrientation="portrait"/> - - + - - + + + \ No newline at end of file diff --git a/app/src/main/java/com/shunzhi/parent/AppConfig.java b/app/src/main/java/com/shunzhi/parent/AppConfig.java index 66faa17..7c16f0d 100644 --- a/app/src/main/java/com/shunzhi/parent/AppConfig.java +++ b/app/src/main/java/com/shunzhi/parent/AppConfig.java @@ -22,6 +22,8 @@ public class AppConfig { public static String USER_SEX = "user_sex"; public static String USER_IMAGE = "user_image"; public static String PARENT_ID = "parent_id"; + public static String NIM_CONFIG_VIBRATE = "nim_config_vibrate"; + public static String NIM_CONFIG_SOUND = "nim_config_sound"; public static boolean ISLOGIN = false; diff --git a/app/src/main/java/com/shunzhi/parent/bean/message/PHMessage.java b/app/src/main/java/com/shunzhi/parent/bean/message/PHMessage.java index cbaad19..4177e60 100644 --- a/app/src/main/java/com/shunzhi/parent/bean/message/PHMessage.java +++ b/app/src/main/java/com/shunzhi/parent/bean/message/PHMessage.java @@ -1,10 +1,16 @@ package com.shunzhi.parent.bean.message; +import com.shunzhi.parent.AppContext; + import org.greenrobot.greendao.annotation.Entity; import org.greenrobot.greendao.annotation.Id; +import org.greenrobot.greendao.annotation.Keep; import org.greenrobot.greendao.annotation.NotNull; +import java.util.Collection; +import java.util.Collections; import java.util.Date; +import java.util.List; import org.greenrobot.greendao.annotation.Generated; @@ -26,11 +32,13 @@ public class PHMessage { private String fileUrl; private String messageType; private Integer sendState;//消息发送的状态 1未发送(或者null,不建议使用null) 2发送中 3发送成功 4发送失败 + private Integer sessionType; - @Generated(hash = 1293964777) + @Generated(hash = 1935192071) public PHMessage(Long id, Date date, String messageId, String sessionId, @NotNull String messageText, String exValue, String filePath, - String fileUrl, String messageType, Integer sendState) { + String fileUrl, String messageType, Integer sendState, + Integer sessionType) { this.id = id; this.date = date; this.messageId = messageId; @@ -41,12 +49,31 @@ public class PHMessage { this.fileUrl = fileUrl; this.messageType = messageType; this.sendState = sendState; + this.sessionType = sessionType; } @Generated(hash = 1001489632) public PHMessage() { } + + @Keep + public static long findUnreadNotificationCountBySessionType(Collection types) { + PHMessageDao dao = AppContext.getInstance().getDaoSession().getPHMessageDao(); + return dao.queryBuilder().where(PHMessageDao.Properties.SessionType.in(types)).count(); + } + + @Keep + public static long findUnreadNotificationCount() { + PHMessageDao dao = AppContext.getInstance().getDaoSession().getPHMessageDao(); + return dao.queryBuilder() + .where(PHMessageDao.Properties.SessionType.in( + PHMessageSession.sessionType_homework, + PHMessageSession.sessionType_notification//新加通知类型请在此处加上,否则会导致计数不准确 + )) + .count(); + } + public Long getId() { return this.id; } @@ -126,4 +153,12 @@ public class PHMessage { public void setSendState(Integer sendState) { this.sendState = sendState; } + + public Integer getSessionType() { + return this.sessionType; + } + + public void setSessionType(Integer sessionType) { + this.sessionType = sessionType; + } } diff --git a/app/src/main/java/com/shunzhi/parent/bean/message/PHMessageSession.java b/app/src/main/java/com/shunzhi/parent/bean/message/PHMessageSession.java index c80a121..4438cff 100644 --- a/app/src/main/java/com/shunzhi/parent/bean/message/PHMessageSession.java +++ b/app/src/main/java/com/shunzhi/parent/bean/message/PHMessageSession.java @@ -1,11 +1,15 @@ package com.shunzhi.parent.bean.message; +import com.shunzhi.parent.AppConfig; +import com.shunzhi.parent.AppContext; + import org.greenrobot.greendao.annotation.Entity; import org.greenrobot.greendao.annotation.Id; import java.util.Date; import org.greenrobot.greendao.annotation.Generated; +import org.greenrobot.greendao.annotation.Keep; /** * Created by 10501 on 2018/3/20. @@ -24,10 +28,15 @@ public class PHMessageSession { private String exValues; private Boolean isTop; + @Keep + public static final int sessionType_notification = 101; + @Keep + public static final int sessionType_homework = 102; + @Generated(hash = 1156938953) public PHMessageSession(Long id, String sessionId, String sessionText, String sessionName, - Date date, Integer sessionType, Integer newMessageCount, Integer unReadMessageCount, - String exValues, Boolean isTop) { + Date date, Integer sessionType, Integer newMessageCount, Integer unReadMessageCount, + String exValues, Boolean isTop) { this.id = id; this.sessionId = sessionId; this.sessionText = sessionText; @@ -44,6 +53,28 @@ public class PHMessageSession { public PHMessageSession() { } + @Keep + public static PHMessageSession findAndCreateSession(int sessionType, boolean autoCreate) { + PHMessageSession session = findSessionByType(sessionType); + if (autoCreate && session == null) { + session = new PHMessageSession(); + switch (sessionType) { + case sessionType_homework: + session.setSessionId(AppConfig.getAppConfig(AppContext.getInstance()).get(AppConfig.USER_ID) + "_homework_" + System.currentTimeMillis()); + session.setSessionName("作业通知"); + break; + } + AppContext.getInstance().getDaoSession().getPHMessageSessionDao().insert(session); + } + return session; + } + + @Keep + public static PHMessageSession findSessionByType(int sessionType) { + PHMessageSessionDao dao = AppContext.getInstance().getDaoSession().getPHMessageSessionDao(); + return dao.queryBuilder().where(PHMessageSessionDao.Properties.SessionType.eq(sessionType)).unique(); + } + public Long getId() { return this.id; } diff --git a/app/src/main/java/com/shunzhi/parent/manager/MessageManager.java b/app/src/main/java/com/shunzhi/parent/manager/MessageManager.java index 520b903..3356959 100644 --- a/app/src/main/java/com/shunzhi/parent/manager/MessageManager.java +++ b/app/src/main/java/com/shunzhi/parent/manager/MessageManager.java @@ -1,9 +1,12 @@ package com.shunzhi.parent.manager; +import android.app.Notification; +import android.app.NotificationManager; +import android.app.PendingIntent; import android.content.Context; import android.content.Intent; import android.content.SharedPreferences; -import android.support.annotation.NonNull; +import android.support.v4.app.NotificationCompat; import com.netease.nimlib.sdk.NIMClient; import com.netease.nimlib.sdk.Observer; @@ -16,14 +19,26 @@ import com.netease.nimlib.sdk.msg.MsgServiceObserve; import com.netease.nimlib.sdk.msg.model.CustomNotification; import com.netease.nimlib.sdk.msg.model.IMMessage; import com.share.mvpsdk.utils.ToastUtils; +import com.shunzhi.parent.AppConfig; import com.shunzhi.parent.AppContext; +import com.shunzhi.parent.R; import com.shunzhi.parent.bean.NIMLoginResultBean; +import com.shunzhi.parent.bean.message.PHMessage; +import com.shunzhi.parent.bean.message.PHMessageDao; +import com.shunzhi.parent.bean.message.PHMessageSession; +import com.shunzhi.parent.ui.MainActivity; import com.shunzhi.parent.ui.activity.LoginAndRegistActivity; +import com.shunzhi.parent.ui.service.BadgeIntentService; +import org.json.JSONException; +import org.json.JSONObject; + +import java.util.Date; import java.util.List; import io.reactivex.Observable; import io.reactivex.subjects.PublishSubject; +import me.leolin.shortcutbadger.ShortcutBadger; import timber.log.Timber; /** @@ -32,6 +47,8 @@ import timber.log.Timber; public class MessageManager { + public boolean isNotiNotification = true; + private static class InstanceHolder { static final MessageManager instance = new MessageManager(); } @@ -75,10 +92,79 @@ public class MessageManager { } - private void onCustomNotificationReceive(CustomNotification customnotification) { + private void onCustomNotificationReceive(CustomNotification customNotification) { + try { + JSONObject json = new JSONObject(customNotification.getContent()); + String type = json.optString("type"); + String uuid = json.optString("msgId"); + if ("homework".equals(type)) { + PHMessageSession session = PHMessageSession.findAndCreateSession(PHMessageSession.sessionType_homework, true); + session.setSessionName("作业通知"); + session.setDate(new Date(customNotification.getTime())); + session.setSessionText(json.optString("title")); + PHMessage message = new PHMessage(); + PHMessageDao messageDao = AppContext.getInstance().getDaoSession().getPHMessageDao(); + message.setDate(new Date(customNotification.getTime())); + message.setMessageId(uuid); + message.setSessionId(session.getSessionId()); + message.setSessionType(session.getSessionType()); + Long id = messageDao.insert(message); + notifyNotification(uuid, id, "收到一条作业通知"); + } + + + } catch (JSONException e) { + e.printStackTrace(); + } + } + + public void notifyNotification(String uuid, long msgLongId, String text) { + if (!isNotiNotification) + return; + int notificationCount = (int) PHMessage.findUnreadNotificationCount();//XSTMessage.findUnreadNotificationCount(); + boolean setBadgerSuccessful = ShortcutBadger.applyCount(AppContext.getInstance(), notificationCount); + Timber.i("----== notificationCount : %s ,setBadgerSuccessful : %s", notificationCount, setBadgerSuccessful); + if (!setBadgerSuccessful) { + BadgeIntentService.start(AppContext.getInstance(), notificationCount, "通知", text, uuid, msgLongId); + return; + } + Intent resultIntent = new Intent(AppContext.getInstance(), MainActivity.class); + resultIntent.putExtra("sid", msgLongId); + resultIntent.putExtra("uuid", uuid); + //resultIntent.setFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP); + PendingIntent resultPendingIntent = + PendingIntent.getActivity( + AppContext.getInstance(), + 0, + resultIntent, + PendingIntent.FLAG_UPDATE_CURRENT + ); + NotificationCompat.Builder mBuilder = + new NotificationCompat.Builder(AppContext.getInstance()) + .setSmallIcon(R.mipmap.ic_launcher) + .setContentTitle("通知") + .setContentText(text) + //.setDefaults(Notification.DEFAULT_SOUND|Notification.DEFAULT_VIBRATE) + .setAutoCancel(true) + .setContentIntent(resultPendingIntent); + AppConfig config = AppConfig.getAppConfig(AppContext.getInstance()); + boolean vibrate = Boolean.parseBoolean(config.get(AppConfig.NIM_CONFIG_VIBRATE));//XSTApp.instance.getVibrateState(); + boolean sound = Boolean.parseBoolean(config.get(AppConfig.NIM_CONFIG_SOUND));//XSTApp.instance.getRingState(); + if (vibrate && sound) { + mBuilder.setDefaults(Notification.DEFAULT_SOUND | Notification.DEFAULT_VIBRATE); + } else if (vibrate) { + mBuilder.setDefaults(Notification.DEFAULT_VIBRATE); + } else if (sound) { + mBuilder.setDefaults(Notification.DEFAULT_SOUND); + } + NotificationManager notifyMgr = + (NotificationManager) AppContext.getInstance().getSystemService(Context.NOTIFICATION_SERVICE); + notifyMgr.notify((int) msgLongId, mBuilder.build()); + } + public Observable login(String account, String password) { final PublishSubject subject = PublishSubject.create(); SharedPreferences sp = AppContext.getInstance().getApplicationContext().getSharedPreferences("info", Context.MODE_PRIVATE); @@ -91,7 +177,7 @@ public class MessageManager { public void onSuccess(Object o) { NIMLoginResultBean bean = new NIMLoginResultBean(true, 200, null); subject.onNext(bean); - Timber.i("----===onSuccess : %s",o); + Timber.i("----===onSuccess : %s", o); } @Override diff --git a/app/src/main/java/com/shunzhi/parent/ui/MainActivity.java b/app/src/main/java/com/shunzhi/parent/ui/MainActivity.java index 964e322..b004a1f 100644 --- a/app/src/main/java/com/shunzhi/parent/ui/MainActivity.java +++ b/app/src/main/java/com/shunzhi/parent/ui/MainActivity.java @@ -1,5 +1,6 @@ package com.shunzhi.parent.ui; +import android.content.Intent; import android.os.Bundle; import android.support.annotation.NonNull; import android.support.design.widget.BottomNavigationView; @@ -12,6 +13,10 @@ import com.share.mvpsdk.helper.BottomNavigationViewHelper; import com.share.mvpsdk.utils.PermissionUtils; import com.shunzhi.parent.AppContext; import com.shunzhi.parent.R; +import com.shunzhi.parent.bean.message.PHMessage; +import com.shunzhi.parent.bean.message.PHMessageDao; +import com.shunzhi.parent.bean.message.PHMessageSession; +import com.shunzhi.parent.manager.MessageManager; import com.shunzhi.parent.ui.fragment.CePingFragment; import com.shunzhi.parent.ui.fragment.ConsultFragment; import com.shunzhi.parent.ui.fragment.MineFragment; @@ -102,11 +107,33 @@ public class MainActivity extends BaseCompatActivity implements PermissionUtils. } @Override + protected void onNewIntent(Intent intent) { + super.onNewIntent(intent); + handIntent(intent); + } + + private void handIntent(Intent intent) { + long msgLongId = intent.getLongExtra("sid", -1); + PHMessageDao dao = AppContext.getInstance().getDaoSession().getPHMessageDao(); + PHMessage message = dao.queryBuilder().where(PHMessageDao.Properties.Id.eq(msgLongId)).unique(); + if (message == null) return; + if (message.getSessionType() == PHMessageSession.sessionType_homework) { + //TODO 跳转 + } + } + + @Override protected int getLayoutId() { return R.layout.activity_main; } @Override + protected void onPause() { + super.onPause(); + MessageManager.getInstance().isNotiNotification = true; + } + + @Override protected void onDestroy() { super.onDestroy(); AppContext.getInstance().destoryLocation(); @@ -120,5 +147,6 @@ public class MainActivity extends BaseCompatActivity implements PermissionUtils. @Override protected void onResume() { super.onResume(); + MessageManager.getInstance().isNotiNotification = false; } } diff --git a/app/src/main/java/com/shunzhi/parent/ui/service/BadgeIntentService.java b/app/src/main/java/com/shunzhi/parent/ui/service/BadgeIntentService.java new file mode 100644 index 0000000..0db9547 --- /dev/null +++ b/app/src/main/java/com/shunzhi/parent/ui/service/BadgeIntentService.java @@ -0,0 +1,143 @@ +package com.shunzhi.parent.ui.service; + +import android.app.IntentService; +import android.app.Notification; +import android.app.NotificationManager; +import android.app.PendingIntent; +import android.content.Context; +import android.content.Intent; +import android.os.Build; +import android.support.annotation.Nullable; +import android.support.v4.app.NotificationCompat; +import android.text.TextUtils; + +import com.shunzhi.parent.AppConfig; +import com.shunzhi.parent.AppContext; +import com.shunzhi.parent.R; +import com.shunzhi.parent.ui.MainActivity; + +import me.leolin.shortcutbadger.ShortcutBadger; + + +/** + * An {@link IntentService} subclass for handling asynchronous task requests in + * a service on a separate handler thread. + *

+ * TODO: Customize class - update intent actions and extra parameters. + */ +public class BadgeIntentService extends IntentService { + private int notificationId = 0; + + public BadgeIntentService() { + super("BadgeIntentService"); + } + + private NotificationManager mNotificationManager; + + public static void start(Context context, int badgeCount, String title, String message) { + Intent i = new Intent(context, BadgeIntentService.class); + i.putExtra("badgeCount", badgeCount); + i.putExtra("title", title); + i.putExtra("message", message); + context.startService(i); + } + + public static void start(Context context, int badgeCount, String title, String message, String uuid, long xstsid) { + Intent i = new Intent(context, BadgeIntentService.class); + i.putExtra("badgeCount", badgeCount); + i.putExtra("title", title); + i.putExtra("uuid", uuid); + i.putExtra("xstsid", xstsid); + i.putExtra("message", message); + context.startService(i); + } + + public BadgeIntentService(String name) { + super(name); + } + + @Override + public void onStart(Intent intent, int startId) { + super.onStart(intent, startId); + mNotificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE); + } + + @Override + protected void onHandleIntent(Intent intent) { + if (intent != null) { + int badgeCount = intent.getIntExtra("badgeCount", 0); + String title = intent.getStringExtra("title"); + String message = intent.getStringExtra("message"); + //String uuid, long xstsid + String uuid = intent.getStringExtra("uuid"); + long xstsid = intent.getLongExtra("xstsid", -1); + if (xstsid == -1 || TextUtils.isEmpty(uuid)) + createIntentNotification(badgeCount, title, message); + if (xstsid != -1 && !TextUtils.isEmpty(uuid)) + createPendingIntentNotification(badgeCount, title, message, uuid, xstsid); + + } + } + + private void createIntentNotification(int badgeCount, String title, String message) { + if (mNotificationManager == null) { + mNotificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE); + } + if (title == null) title = ""; + if (message == null) message = ""; + if (mNotificationManager != null) + mNotificationManager.cancel(notificationId); + + notificationId++; + + Notification.Builder builder = new Notification.Builder(getApplicationContext()) + .setContentTitle(title) + .setContentText(message) + .setSmallIcon(R.mipmap.ic_launcher); + Notification notification = Build.VERSION.SDK_INT > 15 ? builder.build() : builder.getNotification(); + ShortcutBadger.applyNotification(getApplicationContext(), notification, badgeCount); + if (mNotificationManager != null) + mNotificationManager.notify(notificationId, notification); + } + + private void createPendingIntentNotification(int badgeCount, String title, String message, String uuid, long xstsid) { + if (mNotificationManager == null) { + mNotificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE); + } + Intent resultIntent = new Intent(AppContext.getInstance(), MainActivity.class); + resultIntent.putExtra("sid", xstsid); + resultIntent.putExtra("uuid", uuid); + mNotificationManager.cancel(notificationId); + notificationId = (int) xstsid; + //resultIntent.setFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP); + PendingIntent resultPendingIntent = + PendingIntent.getActivity( + AppContext.getInstance(), + 0, + resultIntent, + PendingIntent.FLAG_UPDATE_CURRENT + ); + NotificationCompat.Builder mBuilder = + new NotificationCompat.Builder(AppContext.getInstance()) + .setSmallIcon(R.mipmap.ic_launcher) + .setContentTitle("通知") + .setContentText(message) + //.setDefaults(Notification.DEFAULT_SOUND|Notification.DEFAULT_VIBRATE) + .setAutoCancel(true) + .setContentIntent(resultPendingIntent); + AppConfig config = AppConfig.getAppConfig(AppContext.getInstance()); + boolean vibrate = Boolean.parseBoolean(config.get(AppConfig.NIM_CONFIG_VIBRATE));//XSTApp.instance.getVibrateState(); + boolean sound = Boolean.parseBoolean(config.get(AppConfig.NIM_CONFIG_SOUND));//XSTApp.instance.getRingState(); + if (vibrate && sound) { + mBuilder.setDefaults(Notification.DEFAULT_SOUND | Notification.DEFAULT_VIBRATE); + } else if (vibrate) { + mBuilder.setDefaults(Notification.DEFAULT_VIBRATE); + } else if (sound) { + mBuilder.setDefaults(Notification.DEFAULT_SOUND); + } + Notification notification = mBuilder.build(); + ShortcutBadger.applyNotification(getApplicationContext(), notification, badgeCount); + mNotificationManager.notify((int) xstsid, notification); + + } +} -- libgit2 0.21.0