diff --git a/cm_utils/src/main/java/com/sucstepsoft/cm_utils/constant/PathConfig.java b/cm_utils/src/main/java/com/sucstepsoft/cm_utils/constant/PathConfig.java index e771d30..6830be6 100755 --- a/cm_utils/src/main/java/com/sucstepsoft/cm_utils/constant/PathConfig.java +++ b/cm_utils/src/main/java/com/sucstepsoft/cm_utils/constant/PathConfig.java @@ -18,6 +18,7 @@ public class PathConfig { public static final int VIEW_STATE_LOADING = 0x1234;//加载中 //=============================主页按钮模块类型=========================== + public static final int NOTIFY_ID = 9999;//通知栏ID public static final String MODULE_CALL = "call"; public static final String MODULE_PRISON = "prison"; public static final String MODULE_CHECK = "check"; @@ -33,8 +34,8 @@ public class PathConfig { public static final String ACTION_FROM_SOCKET_PUSH_MSG = "com.tenlionsoft.xz_cultural.SOCKET_MSG_PUBLIC_ACTION"; public static final String PUSH_DATA_KEY = "PUBLIC_CODE_KEY"; - - public static final String PROJECT_NAME = "locationReal";//TODO ===项目名称== + public static final String PROJECT_NAME = "city-governance";/* ===项目名称==*/ + public static final String PROJECT_NAME_CH = "数字文化云"; public static final String ACTION_SYSTEM_MESSAGE = "com.sucstepsoft.hs.message"; public static final String ACTION_LOCATION_MESSAGE = "com.sucstepsoft.realtimelocation.MESSAGE_RECEIVED_ACTION"; public static final String ACTION_PUNCH_TIME_MESSAGE = "com.sucstepsoft.realtimelocation.MESSAGE_PUNCH_ACTION"; diff --git a/cm_utils/src/main/java/com/sucstepsoft/cm_utils/core/widget/base/CommonWebActivity.java b/cm_utils/src/main/java/com/sucstepsoft/cm_utils/core/widget/base/CommonWebActivity.java index a4f3f83..7ac644d 100644 --- a/cm_utils/src/main/java/com/sucstepsoft/cm_utils/core/widget/base/CommonWebActivity.java +++ b/cm_utils/src/main/java/com/sucstepsoft/cm_utils/core/widget/base/CommonWebActivity.java @@ -23,6 +23,7 @@ import com.sucstepsoft.cm_utils.core.retrofit_net.api.BaseApiService; import com.sucstepsoft.cm_utils.utils.ExceptionHandler; import com.sucstepsoft.cm_utils.utils.LogUtils; import com.sucstepsoft.cm_utils.utils.UserLgUtils; +import com.sucstepsoft.cm_utils.utils.toast.ToastUtils; import java.io.UnsupportedEncodingException; import java.net.URLEncoder; @@ -199,6 +200,8 @@ public class CommonWebActivity extends BaseActivity { setResult(RESULT_OK); finish(); } catch (Exception e) { + ToastUtils.show("打开微信失败,请稍后重试"); + finish(); e.printStackTrace(); } } @@ -212,7 +215,10 @@ public class CommonWebActivity extends BaseActivity { String query = ""; String str = "userId=" + UserLgUtils.getUserId(); try { - query = URLEncoder.encode(str, "UTF-8"); + String key = URLEncoder.encode("userId", "UTF-8"); + String value = URLEncoder.encode(UserLgUtils.getUserId(), "UTF-8"); + query = key + "=" + value; +// query = URLEncoder.encode(str, "UTF-8"); } catch (UnsupportedEncodingException e) { throw new RuntimeException(e); } diff --git a/cm_utils/src/main/java/com/sucstepsoft/cm_utils/core/widget/base/NotificationUtils.java b/cm_utils/src/main/java/com/sucstepsoft/cm_utils/core/widget/base/NotificationUtils.java index bbd5a83..af0d9c5 100755 --- a/cm_utils/src/main/java/com/sucstepsoft/cm_utils/core/widget/base/NotificationUtils.java +++ b/cm_utils/src/main/java/com/sucstepsoft/cm_utils/core/widget/base/NotificationUtils.java @@ -53,6 +53,45 @@ public class NotificationUtils extends ContextWrapper { } return mManager; } + private static NotificationManager mNotificationManager; + private final static String PRIMARY_CHANNEL = "citygovernance"; + + public static Notification buildNotification(Context context, String title, String hintMsg) { + Notification notification = null; + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { + NotificationChannel channel = new NotificationChannel(PRIMARY_CHANNEL, + context.getString(R.string.app_name), NotificationManager.IMPORTANCE_HIGH); + channel.setLightColor(Color.GREEN); + channel.setLockscreenVisibility(Notification.VISIBILITY_PRIVATE); + getNotificationManager(context).createNotificationChannel(channel); + Notification.Builder builder = new Notification.Builder(context, + PRIMARY_CHANNEL) + .setContentTitle(title) + .setContentText(hintMsg) + .setVisibility(Notification.VISIBILITY_PUBLIC) + .setSmallIcon(R.drawable.app_logo_smal) + .setAutoCancel(true); + notification = builder.build(); + } else { + Notification.Builder builder = new Notification.Builder(context); + builder.setSmallIcon(R.drawable.app_logo_smal); + builder.setContentTitle(title); + builder.setContentText(hintMsg) + .setPriority(Notification.PRIORITY_MAX) + .setWhen(System.currentTimeMillis()); + notification = builder.build(); + } + + return notification; + } + + private static NotificationManager getNotificationManager(Context context) { + if (mNotificationManager == null) { + mNotificationManager = (NotificationManager) context.getSystemService( + Context.NOTIFICATION_SERVICE); + } + return mNotificationManager; + } /** * 发送通知 diff --git a/modulemain/src/main/AndroidManifest.xml b/modulemain/src/main/AndroidManifest.xml index 90cc33c..053abf4 100755 --- a/modulemain/src/main/AndroidManifest.xml +++ b/modulemain/src/main/AndroidManifest.xml @@ -18,6 +18,7 @@ + @@ -155,6 +156,9 @@ + \ No newline at end of file diff --git a/modulemain/src/main/java/com/tengshisoft/mudulemain/cultural/activitys/base/MainActivity.java b/modulemain/src/main/java/com/tengshisoft/mudulemain/cultural/activitys/base/MainActivity.java index 965f28b..5df7d46 100755 --- a/modulemain/src/main/java/com/tengshisoft/mudulemain/cultural/activitys/base/MainActivity.java +++ b/modulemain/src/main/java/com/tengshisoft/mudulemain/cultural/activitys/base/MainActivity.java @@ -217,6 +217,7 @@ public class MainActivity extends BaseActivity { doCheckPermission(); checkAppVersion(); getUserInfo(); + getUserIsPublicCode(); } diff --git a/modulemain/src/main/java/com/tengshisoft/mudulemain/cultural/activitys/news/NewsLocalDetailActivity.java b/modulemain/src/main/java/com/tengshisoft/mudulemain/cultural/activitys/news/NewsLocalDetailActivity.java index 57f9b7b..d93b4c3 100644 --- a/modulemain/src/main/java/com/tengshisoft/mudulemain/cultural/activitys/news/NewsLocalDetailActivity.java +++ b/modulemain/src/main/java/com/tengshisoft/mudulemain/cultural/activitys/news/NewsLocalDetailActivity.java @@ -48,6 +48,7 @@ import com.sucstepsoft.cm_utils.core.beans.AddPhotoBean; import com.sucstepsoft.cm_utils.core.beans.BaseImageBean; import com.sucstepsoft.cm_utils.core.retrofit_net.BaseUrlApi; import com.sucstepsoft.cm_utils.core.retrofit_net.RetrofitManager; +import com.sucstepsoft.cm_utils.core.retrofit_net.api.BaseApiService; import com.sucstepsoft.cm_utils.core.widget.base.BannerImageTextAllAdapter; import com.sucstepsoft.cm_utils.core.widget.base.BaseActivity; import com.sucstepsoft.cm_utils.core.widget.base.CommonWebActivity; @@ -57,6 +58,7 @@ import com.sucstepsoft.cm_utils.core.widget.views.ButtomDialogView; import com.sucstepsoft.cm_utils.core.widget.views.ItemSplitDivider; import com.sucstepsoft.cm_utils.core.widget.views.NestedScrollWebView; import com.sucstepsoft.cm_utils.core.widget.views.TypeFaceTextView; +import com.sucstepsoft.cm_utils.utils.AppUtils; import com.sucstepsoft.cm_utils.utils.ConvertUtils; import com.sucstepsoft.cm_utils.utils.ExceptionHandler; import com.sucstepsoft.cm_utils.utils.FileUtils; @@ -81,6 +83,7 @@ import com.tengshisoft.mudulemain.R; import com.tengshisoft.mudulemain.R2; import com.tengshisoft.mudulemain.cultural.adapter.CommentAdapter; import com.tengshisoft.mudulemain.cultural.adapter.NewsCategoryAdapter; +import com.tengshisoft.mudulemain.cultural.beans.AttentionCodeBean; import com.tengshisoft.mudulemain.cultural.beans.BaseUserBean; import com.tengshisoft.mudulemain.cultural.beans.CollectBean; import com.tengshisoft.mudulemain.cultural.beans.CommentListBean; @@ -88,7 +91,7 @@ import com.tengshisoft.mudulemain.cultural.beans.CommentPublishBean; import com.tengshisoft.mudulemain.cultural.beans.LikeBean; import com.tengshisoft.mudulemain.cultural.beans.NewsDetailBean; import com.tengshisoft.mudulemain.cultural.net.HomeApi; -import com.tengshisoft.mudulemain.cultural.socket.WsManager; +import com.tengshisoft.mudulemain.cultural.socket.SocketService; import com.tengshisoft.mudulemain.cultural.widget.ButtomCommentListDialogView; import com.youth.banner.Banner; import com.youth.banner.transformer.ScaleInTransformer; @@ -385,7 +388,6 @@ public class NewsLocalDetailActivity extends BaseActivity { } else { //是否需要关注公众号 if (newsDetailBean.getNewsViewAuth().contains("2")) { - startSocket(); showPublicCodeDialog(newsDetailBean); } else { setDataToView(newsDetailBean); @@ -416,12 +418,12 @@ public class NewsLocalDetailActivity extends BaseActivity { * 开启Socket */ private void startSocket() { - WsManager wsManager = new WsManager - .Builder(getApplication()) - .wsUrl(BaseUrlApi.SOCKET_IP + UserLgUtils.getUserId()) - .needReconnect(true) - .build(); - wsManager.startConnect(); + Intent intent = new Intent(mActivity, SocketService.class); + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { + mActivity.startForegroundService(intent); + } else { + mActivity.startService(intent); + } } /** @@ -433,6 +435,7 @@ public class NewsLocalDetailActivity extends BaseActivity { if (!UserLgUtils.getIsPublicCode()) { mRlPublicCode.setVisibility(View.VISIBLE); mBtnPublic.setOnClickListener(v -> { + startSocket(); Intent intent = new Intent(mActivity, CommonWebActivity.class); mResultLauncher.launch(intent); }); @@ -1182,6 +1185,19 @@ public class NewsLocalDetailActivity extends BaseActivity { @Override protected void onStart() { super.onStart(); + //在socket断链的情况先手动获取一次是否关注 + LogUtils.e("是否关注" + UserLgUtils.getIsPublicCode()); + if (!UserLgUtils.getIsPublicCode()) { + if (mContentSkeleton != null) { + mContentSkeleton.show(); + } else { + mContentSkeleton = Skeleton.bind(mLlNewsContent) + .load(R.layout.item_skeleton_news_content_local) + .show(); + } + mRlPublicCode.setVisibility(View.GONE); + getUserIsPublicCode(); + } mCommentPage = 1; if (!TextUtils.isEmpty(UserLgUtils.getToken())) { getCommentListByLogin(mCommentPage); @@ -1190,6 +1206,40 @@ public class NewsLocalDetailActivity extends BaseActivity { } } + private void getUserIsPublicCode() { + if (!TextUtils.isEmpty(UserLgUtils.getUserId())) { + RetrofitManager.getInstance() + .create(BaseApiService.class) + .getIsPublicCode(UserLgUtils.getUserId()) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(new Observer() { + @Override + public void onSubscribe(Disposable d) { + + } + + @Override + public void onNext(Boolean baseSuccessBean) { + UserLgUtils.putIsPublicCode(baseSuccessBean); + getNewsDetail(); + } + + @Override + public void onError(Throwable e) { + getNewsDetail(); + } + + @Override + public void onComplete() { + + } + }); + } else { + getNewsDetail(); + } + } + /** * 显示评论dialog */ @@ -1537,6 +1587,18 @@ public class NewsLocalDetailActivity extends BaseActivity { } } + private void refreshPage() { + if (mContentSkeleton != null) { + mContentSkeleton.show(); + } else { + mContentSkeleton = Skeleton.bind(mLlNewsContent) + .load(R.layout.item_skeleton_news_content_local) + .show(); + } + mRlPublicCode.setVisibility(View.GONE); + getNewsDetail(); + } + public class SocketMsg extends BroadcastReceiver { @Override @@ -1544,8 +1606,17 @@ public class NewsLocalDetailActivity extends BaseActivity { String action = intent.getAction(); if (PathConfig.ACTION_FROM_SOCKET_PUSH_MSG.equals(action)) { //关注公众号 - String strData = intent.getStringExtra(PathConfig.PUSH_DATA_KEY); - LogUtils.e("二维码返回:" + strData); + //关闭socket + stopService(new Intent(mActivity, SocketService.class)); + try { + String strData = intent.getStringExtra(PathConfig.PUSH_DATA_KEY); + AttentionCodeBean errorBean = new Gson().fromJson(strData, AttentionCodeBean.class); + UserLgUtils.putIsPublicCode(errorBean.isAttention()); + //刷新页面 + refreshPage(); + } catch (Exception e) { + + } } } } @@ -1557,6 +1628,10 @@ public class NewsLocalDetailActivity extends BaseActivity { mAudio.pause(); mAudio.release(); } + boolean processIsRuning = AppUtils.getProcessIsRuning(mActivity, "com.tengshisoft.mudulemain.cultural.socket.SocketService"); + if (processIsRuning) { + stopService(new Intent(mActivity, SocketService.class)); + } if (mSocketMsg != null) { unregisterReceiver(mSocketMsg); } diff --git a/modulemain/src/main/java/com/tengshisoft/mudulemain/cultural/beans/AttentionCodeBean.java b/modulemain/src/main/java/com/tengshisoft/mudulemain/cultural/beans/AttentionCodeBean.java new file mode 100644 index 0000000..24e24c8 --- /dev/null +++ b/modulemain/src/main/java/com/tengshisoft/mudulemain/cultural/beans/AttentionCodeBean.java @@ -0,0 +1,32 @@ +package com.tengshisoft.mudulemain.cultural.beans; + +public class AttentionCodeBean { + + private String appId; + private String userId; + private boolean attention; + + public String getAppId() { + return appId; + } + + public void setAppId(String appId) { + this.appId = appId; + } + + public String getUserId() { + return userId; + } + + public void setUserId(String userId) { + this.userId = userId; + } + + public boolean isAttention() { + return attention; + } + + public void setAttention(boolean attention) { + this.attention = attention; + } +} diff --git a/modulemain/src/main/java/com/tengshisoft/mudulemain/cultural/socket/SocketService.java b/modulemain/src/main/java/com/tengshisoft/mudulemain/cultural/socket/SocketService.java new file mode 100644 index 0000000..0dcaf53 --- /dev/null +++ b/modulemain/src/main/java/com/tengshisoft/mudulemain/cultural/socket/SocketService.java @@ -0,0 +1,217 @@ +package com.tengshisoft.mudulemain.cultural.socket; + +import android.app.ActivityManager; +import android.app.Service; +import android.content.Context; +import android.content.Intent; +import android.media.MediaPlayer; +import android.os.IBinder; + +import androidx.annotation.Nullable; + +import com.sucstepsoft.cm_utils.constant.PathConfig; +import com.sucstepsoft.cm_utils.core.retrofit_net.BaseUrlApi; +import com.sucstepsoft.cm_utils.core.widget.base.NotificationUtils; +import com.sucstepsoft.cm_utils.utils.LogUtils; +import com.sucstepsoft.cm_utils.utils.UserLgUtils; +import com.tengshisoft.mudulemain.R; + +import org.json.JSONObject; + +import java.util.List; + +import io.reactivex.disposables.Disposable; + +public class SocketService extends Service { + + + private MediaPlayer mMediaPlayer; + private WsManager mWsManager; + private Disposable mSocketHeart; + + @Override + public void onCreate() { + super.onCreate(); + } + + @Override + public int onStartCommand(Intent intent, int flags, int startId) { + startPlayVoice(); + startForegroundNotify(); + startSocket(); + return START_STICKY; + } + + + private void startSocket() { + mWsManager = new WsManager + .Builder(getApplication()) + .wsUrl(BaseUrlApi.SOCKET_IP + UserLgUtils.getUserId()) + .needReconnect(true) + .build(); + mWsManager.startConnect(); + } + + /** + * 进程保活-开启前台通知,提升服务进程 + */ + private void startForegroundNotify() { + startForeground(PathConfig.NOTIFY_ID, NotificationUtils.buildNotification(getApplicationContext(), PathConfig.PROJECT_NAME_CH, PathConfig.PROJECT_NAME_CH + "平台正在运行中...")); + } + + /** + * 进程保活-后台播放音乐 + */ + private void startPlayVoice() { + if (mMediaPlayer == null) { + mMediaPlayer = MediaPlayer.create(this, R.raw.no_kill); + mMediaPlayer.setVolume(0f, 0f); + mMediaPlayer.setOnCompletionListener(mp -> playVoice()); + playVoice(); + } + } + + /** + * 开始播放音乐 + */ + private void playVoice() { + if (mMediaPlayer != null && !mMediaPlayer.isPlaying()) { + mMediaPlayer.start(); + } + } + + + private void pauseVoice() { + if (mMediaPlayer != null && mMediaPlayer.isPlaying()) { + mMediaPlayer.pause(); + } + } + + + /** + * 判断activity是否在运行 + * + * @return + */ + private boolean isActivityAlive() { + ActivityManager am = (ActivityManager) this.getSystemService(Context.ACTIVITY_SERVICE); + List runningTasks = am.getRunningTasks(100); + for (ActivityManager.RunningTaskInfo info : runningTasks) { + LogUtils.e("前台运行===" + info.topActivity.getClassName()); + if (this.getPackageName().equals(info.topActivity.getPackageName())) { + return true; + } + } + return false; + } + + /** + * 判断App是否在前台 + * + * @return + */ + private boolean appOnForeground() { + ActivityManager am = (ActivityManager) this.getSystemService(Context.ACTIVITY_SERVICE); + List appProcesses = am.getRunningAppProcesses(); + if (appProcesses == null) { + return false; + } + for (ActivityManager.RunningAppProcessInfo info : appProcesses) { + if (info.processName.equals(this.getPackageName()) && info.importance == ActivityManager.RunningAppProcessInfo.IMPORTANCE_FOREGROUND) { + return true; + } + } + return false; + } + + /** + * 发送系统通知 + */ + private void sendSystemNotify(String from, JSONObject obj) { + + } + + + /** + * 发送socket已办 + */ + private void sendSocketNoticeMsg(String msg) { + if (mWsManager != null) { + mWsManager.sendMessage(msg); + } + } + + + /** + * socket + */ + private void startSocketService() { + if (mWsManager == null) { + mWsManager = new WsManager + .Builder(getApplication()) + .wsUrl(BaseUrlApi.SOCKET_IP) + .needReconnect(true) + .build(); + } + + if (!mWsManager.isWsConnected()) { + mWsManager.startConnect(); + //心跳 + + } + } + + + /** + * 停止连接socket + */ + private void stopSocketService() { + if (mWsManager != null && mWsManager.isWsConnected()) { + mWsManager.stopConnect(); + mWsManager = null; + if (mSocketHeart != null && !mSocketHeart.isDisposed()) { + mSocketHeart.dispose(); + mSocketHeart = null; + } + } + } + + /** + * 发送一个通知 + */ + private void sendNotify(String from, String msg, String page, int type) { +// NotificationUtils utils = new NotificationUtils(SocketService.this); +// if (TextUtils.isEmpty(page)) { +// utils.sendNotification(1000865, from, msg); +// } else { +// // 判断是普通通知还是通话通知 +// Intent intent = new Intent(); +// intent.setAction(LionActions.ACTION_PUSH_MSG_ACTIVITY); +// intent.putExtra("page", page); +// intent.putExtra("type", type); +// intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); +// PendingIntent pIntent = PendingIntent.getActivity(this, 12, intent, PendingIntent.FLAG_CANCEL_CURRENT); +// utils.sendNotificationPendingIntent(from, msg, pIntent); +// +// } + } + + + @Override + public void onDestroy() { + super.onDestroy(); + + stopSocketService(); + + if (mMediaPlayer != null && mMediaPlayer.isPlaying()) { + mMediaPlayer.stop(); + mMediaPlayer = null; + } + } + + @Nullable + @Override + public IBinder onBind(Intent intent) { + return null; + } +} diff --git a/modulemain/src/main/java/com/tengshisoft/mudulemain/cultural/socket/WsManager.java b/modulemain/src/main/java/com/tengshisoft/mudulemain/cultural/socket/WsManager.java index e3e897f..ce14f89 100755 --- a/modulemain/src/main/java/com/tengshisoft/mudulemain/cultural/socket/WsManager.java +++ b/modulemain/src/main/java/com/tengshisoft/mudulemain/cultural/socket/WsManager.java @@ -10,7 +10,6 @@ import android.text.TextUtils; import com.sucstepsoft.cm_utils.constant.PathConfig; import com.sucstepsoft.cm_utils.utils.LogUtils; -import com.tengshisoft.mudulemain.cultural.utils.AesUtil; import java.util.concurrent.TimeUnit; import java.util.concurrent.locks.Lock; @@ -94,6 +93,7 @@ public class WsManager implements IWsManager { @Override public void onMessage(WebSocket webSocket, final ByteString bytes) { + LogUtils.e("接收到消息=" + bytes.toString()); if (Looper.myLooper() != Looper.getMainLooper()) { wsMainHandler.post(() -> sendNotify(bytes.toString())); } else { @@ -103,6 +103,7 @@ public class WsManager implements IWsManager { @Override public void onMessage(WebSocket webSocket, final String text) { + LogUtils.e("接收到消息=" + text); if (Looper.myLooper() != Looper.getMainLooper()) { wsMainHandler.post(() -> sendNotify(text)); } else { diff --git a/modulemain/src/main/res/layout/activity_news_local_detail.xml b/modulemain/src/main/res/layout/activity_news_local_detail.xml index ddd6431..62e2935 100644 --- a/modulemain/src/main/res/layout/activity_news_local_detail.xml +++ b/modulemain/src/main/res/layout/activity_news_local_detail.xml @@ -290,7 +290,8 @@ android:id="@+id/rl_public_code" android:layout_width="match_parent" android:layout_height="match_parent" - android:visibility="gone"> + android:visibility="gone" + tools:visibility="visible"> + android:textStyle="bold" + tools:textColor="@color/black" />