From 1a7efbd45a0628e48ddcb92051eae27c178b2c56 Mon Sep 17 00:00:00 2001 From: itgaojian Date: Fri, 28 Jul 2023 14:24:25 +0800 Subject: [PATCH] =?UTF-8?q?=E5=8F=91=E5=B8=83=E5=85=AC=E4=BC=97=E5=8F=B7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/city/release/output-metadata.json | 4 +- .../com/tengshisoft/BaseMyApplication.java | 7 +- build.gradle | 4 +- cm_utils/build.gradle | 2 + .../cm_utils/constant/PathConfig.java | 5 +- .../core/widget/base/CommonWebActivity.java | 2 +- .../core/widget/base/NotificationUtils.java | 39 +++ .../cm_utils/utils/ExceptionHandler.java | 16 +- .../utils/toast/ToastLogInterceptor.java | 11 +- .../cm_utils/utils/toast/ToastUtils.java | 320 +----------------- common.gradle | 2 +- modulemain/src/main/AndroidManifest.xml | 4 + .../activitys/base/LoginActivity.java | 4 +- .../cultural/activitys/base/MainActivity.java | 4 + .../news/NewsLocalDetailActivity.java | 113 ++++++- .../cultural/beans/AttentionCodeBean.java | 32 ++ .../cultural/socket/SocketService.java | 217 ++++++++++++ .../res/layout/activity_news_local_detail.xml | 24 +- modulemain/src/main/res/raw/no_kill.mp3 | Bin 0 -> 483623 bytes .../modulemine/activity/SettingActivity.java | 1 + 20 files changed, 459 insertions(+), 352 deletions(-) create mode 100755 modulemain/src/main/java/com/tengshisoft/mudulemain/cultural/beans/AttentionCodeBean.java create mode 100755 modulemain/src/main/java/com/tengshisoft/mudulemain/cultural/socket/SocketService.java create mode 100755 modulemain/src/main/res/raw/no_kill.mp3 diff --git a/app/city/release/output-metadata.json b/app/city/release/output-metadata.json index 95c5cd1..9c4c621 100644 --- a/app/city/release/output-metadata.json +++ b/app/city/release/output-metadata.json @@ -11,8 +11,8 @@ "type": "SINGLE", "filters": [], "attributes": [], - "versionCode": 13, - "versionName": "1.1.3", + "versionCode": 14, + "versionName": "1.1.4", "outputFile": "app-city-release.apk" } ], diff --git a/app/src/main/java/com/tengshisoft/BaseMyApplication.java b/app/src/main/java/com/tengshisoft/BaseMyApplication.java index 8902a7b..3ebac1d 100755 --- a/app/src/main/java/com/tengshisoft/BaseMyApplication.java +++ b/app/src/main/java/com/tengshisoft/BaseMyApplication.java @@ -9,6 +9,7 @@ import com.alibaba.android.arouter.launcher.ARouter; import com.baidu.location.BDLocation; import com.baidu.mapapi.CoordType; import com.baidu.mapapi.SDKInitializer; +import com.hjq.toast.Toaster; import com.scwang.smartrefresh.layout.SmartRefreshLayout; import com.scwang.smartrefresh.layout.footer.ClassicsFooter; import com.sucstepsoft.cm_utils.core.widget.refresh.CustomRefreshHeader; @@ -46,8 +47,8 @@ public class BaseMyApplication extends Application { initShare(); initBaiduMap(); - ToastUtils.init(this); - ToastUtils.setGravity(Gravity.TOP, 0, 80); + Toaster.init(this); + Toaster.setGravity(Gravity.TOP, 0, 100); getConfigCityCode(); } @@ -55,7 +56,7 @@ public class BaseMyApplication extends Application { UserLgUtils.setCurrentCityCode(this.getResources().getString(R.string.CITY_CODE)); UserLgUtils.setCurrentCity(this.getResources().getString(R.string.CITY_NAME)); UserLgUtils.setCurrentCityId(this.getResources().getString(R.string.CITY_ID)); - UserLgUtils.setAppPathCode(this.getResources().getString(R.string.APP_PATH_CODE)); + UserLgUtils.setAppPathCode(this.getResources().getString(R.string.VERSION_PATH_CODE)); } private void initShare() { diff --git a/build.gradle b/build.gradle index 6c2f190..86b6374 100755 --- a/build.gradle +++ b/build.gradle @@ -56,8 +56,8 @@ ext { gCompileSdkVersion = 31 gMinSdkVersion = 16 gTargetSdkVersion = 29 - gVersionCode = 13 - gVersionName = '1.1.3' + gVersionCode = 14 + gVersionName = '1.1.4' gBuildToolsVersion = "30.0.2" // gVersionCode=26 // gVersionName='1.3.0' diff --git a/cm_utils/build.gradle b/cm_utils/build.gradle index 19a6d1e..c7e5b64 100755 --- a/cm_utils/build.gradle +++ b/cm_utils/build.gradle @@ -76,5 +76,7 @@ dependencies { implementation 'com.gyf.immersionbar:immersionbar-components:3.0.0' //高斯模糊 api 'com.github.mmin18:realtimeblurview:1.2.1' + //toast + api 'com.github.getActivity:Toaster:12.3' } 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 8fd9006..4954856 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 @@ -32,7 +32,6 @@ public class PathConfig { public static final String WECHAT_APPID = "wxa5c5246b283713de"; public static final String WECHAT_SECERT = "e5b761f20841f81dd73a6d4aad2f8060"; public static final String SECRET = "CMXX_TOKEN_INFOS";//秘钥 - public static final String PROJECT_NAME = "locationReal";//TODO ===项目名称== 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"; @@ -65,7 +64,9 @@ public class PathConfig { public static final String CITY_DEFAULT_NAME = "日喀则市"; public static final String CITY_DEFAULT_ID = "640675"; public static final int CITY_DEFAULT_LEVEL = 3; - + public static final int NOTIFY_ID = 9999;//通知栏ID + public static final String PROJECT_NAME = "city-governance";/* ===项目名称==*/ + public static final String PROJECT_NAME_CH = "数字文化云"; public static final String DID_CITY_CODE = "640675";//日喀则市编码 //新闻类型 public static final int NEWS_TYPE_MULTI_PIC = 2332;//key_1 三图; key_2 一图左;key_3 一图右;key_4 一图下;key_5 纯文字;key_6 视频; 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 c37cc94..fc6af5f 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 @@ -207,7 +207,7 @@ public class CommonWebActivity extends BaseActivity { private RequestBody buildRequestBody() { PostWeChatTicketBean bean = new PostWeChatTicketBean(); PostWeChatTicketBean.JumpWxaBean subBean = new PostWeChatTicketBean.JumpWxaBean(); - subBean.setEnv_version("trial");//默认 release 正式版 trial 体验版 develop 开发版 + subBean.setEnv_version("release");//默认 release 正式版 trial 体验版 develop 开发版 subBean.setPath("/pages/commonQrCode/commonQrCode"); String query = ""; 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/cm_utils/src/main/java/com/sucstepsoft/cm_utils/utils/ExceptionHandler.java b/cm_utils/src/main/java/com/sucstepsoft/cm_utils/utils/ExceptionHandler.java index 47e42f0..5c3ef07 100755 --- a/cm_utils/src/main/java/com/sucstepsoft/cm_utils/utils/ExceptionHandler.java +++ b/cm_utils/src/main/java/com/sucstepsoft/cm_utils/utils/ExceptionHandler.java @@ -21,27 +21,31 @@ public class ExceptionHandler { public static void handleException(Throwable throwable) { if (throwable instanceof HttpException) { + LogUtils.e("HttpException"); HttpException ex = (HttpException) throwable; try { String errBody = ex.response().errorBody().string(); + LogUtils.e("错误体:"+errBody); if (!TextUtils.isEmpty(errBody)) { ErrorBean errorBean = new Gson().fromJson(errBody, ErrorBean.class); if (!TextUtils.isEmpty(errorBean.getMsg())) { - ToastUtils.showShort(errorBean.getMsg()); + ToastUtils.show(errorBean.getMsg()); } else { - ToastUtils.showShort(errorBean.getMessage()); + ToastUtils.show("网络错误(500)"); } + }else{ + ToastUtils.show("网络错误(500)"); } } catch (Exception e1) { - ToastUtils.showShort("网络错误,请稍后重试"); + ToastUtils.show("网络错误,请稍后重试"); e1.printStackTrace(); } } else if (throwable instanceof JsonParseException) { - ToastUtils.showShort("解析错误"); + ToastUtils.show("解析错误"); } else if (throwable instanceof SocketTimeoutException) { - ToastUtils.showShort("网络连接超时"); + ToastUtils.show("网络连接超时"); } else { - ToastUtils.showShort("网络错误,请稍后重试"); + ToastUtils.show("网络错误,请稍后重试"); } } diff --git a/cm_utils/src/main/java/com/sucstepsoft/cm_utils/utils/toast/ToastLogInterceptor.java b/cm_utils/src/main/java/com/sucstepsoft/cm_utils/utils/toast/ToastLogInterceptor.java index b330966..860639e 100755 --- a/cm_utils/src/main/java/com/sucstepsoft/cm_utils/utils/toast/ToastLogInterceptor.java +++ b/cm_utils/src/main/java/com/sucstepsoft/cm_utils/utils/toast/ToastLogInterceptor.java @@ -2,16 +2,15 @@ package com.sucstepsoft.cm_utils.utils.toast; import android.util.Log; - import com.sucstepsoft.cm_utils.utils.toast.config.IToastInterceptor; import java.lang.reflect.Modifier; /** - * author : Android 轮子哥 - * github : https://github.com/getActivity/ToastUtils - * time : 2020/11/04 - * desc : 自定义 Toast 拦截器(用于追踪 Toast 调用的位置) + * author : Android 轮子哥 + * github : https://github.com/getActivity/ToastUtils + * time : 2020/11/04 + * desc : 自定义 Toast 拦截器(用于追踪 Toast 调用的位置) */ public class ToastLogInterceptor implements IToastInterceptor { @@ -50,7 +49,7 @@ public class ToastLogInterceptor implements IToastInterceptor { } protected boolean isLogEnable() { - return ToastUtils.isDebugMode(); + return false; } protected void printLog(String msg) { diff --git a/cm_utils/src/main/java/com/sucstepsoft/cm_utils/utils/toast/ToastUtils.java b/cm_utils/src/main/java/com/sucstepsoft/cm_utils/utils/toast/ToastUtils.java index 72364fb..b7adcd6 100755 --- a/cm_utils/src/main/java/com/sucstepsoft/cm_utils/utils/toast/ToastUtils.java +++ b/cm_utils/src/main/java/com/sucstepsoft/cm_utils/utils/toast/ToastUtils.java @@ -1,17 +1,6 @@ package com.sucstepsoft.cm_utils.utils.toast; -import android.app.Application; -import android.content.pm.ApplicationInfo; -import android.content.res.Resources; -import android.widget.Toast; - -import com.sucstepsoft.cm_utils.utils.toast.config.IToastInterceptor; -import com.sucstepsoft.cm_utils.utils.toast.config.IToastStrategy; -import com.sucstepsoft.cm_utils.utils.toast.config.IToastStyle; -import com.sucstepsoft.cm_utils.utils.toast.style.BlackToastStyle; -import com.sucstepsoft.cm_utils.utils.toast.style.CustomViewToastStyle; -import com.sucstepsoft.cm_utils.utils.toast.style.LocationToastStyle; -import com.sucstepsoft.cm_utils.utils.toast.style.WhiteToastStyle; +import com.hjq.toast.Toaster; /** @@ -22,313 +11,24 @@ import com.sucstepsoft.cm_utils.utils.toast.style.WhiteToastStyle; */ @SuppressWarnings("unused") public final class ToastUtils { - - /** - * Application 对象 - */ - private static Application sApplication; - - /** - * Toast 处理策略 - */ - private static IToastStrategy sToastStrategy; - - /** - * Toast 样式 - */ - private static IToastStyle sToastStyle; - - /** - * Toast 拦截器(可空) - */ - private static IToastInterceptor sToastInterceptor; - - /** - * 调试模式 - */ - private static Boolean sDebugMode; - - /** - * 不允许被外部实例化 - */ - private ToastUtils() { + public static void show(String content) { + Toaster.show(content); } - /** - * 初始化 Toast,需要在 Application.create 中初始化 - * - * @param application 应用的上下文 - */ - public static void init(Application application) { - init(application, sToastStyle); + public static void show(int content) { + Toaster.show(content); } - public static void init(Application application, IToastStrategy strategy) { - init(application, strategy, null); + public static void showLong(String content) { + Toaster.showLong(content); } - public static void init(Application application, IToastStyle style) { - init(application, null, style); - } - - /** - * 初始化 Toast - * - * @param application 应用的上下文 - * @param strategy Toast 策略 - * @param style Toast 样式 - */ - public static void init(Application application, IToastStrategy strategy, IToastStyle style) { - sApplication = application; - - // 初始化 Toast 策略 - if (strategy == null) { - strategy = new ToastStrategy(); - } - setStrategy(strategy); - - // 设置 Toast 样式 - if (style == null) { - style = new BlackToastStyle(); - } - setStyle(style); - } - - /** - * 判断当前框架是否已经初始化 - */ - public static boolean isInit() { - return sApplication != null && sToastStrategy != null && sToastStyle != null; - } - - /** - * 延迟显示 Toast - */ - - public static void delayedShow(int id, long delayMillis) { - delayedShow(stringIdToCharSequence(id), delayMillis); - } - - public static void delayedShow(Object object, long delayMillis) { - delayedShow(objectToCharSequence(object), delayMillis); - } - - public static void delayedShow(CharSequence text, long delayMillis) { - ToastParams params = new ToastParams(); - params.text = text; - params.delayMillis = delayMillis; - show(params); - } - - /** - * debug 模式下显示 Toast - */ - - public static void debugShow(int id) { - debugShow(stringIdToCharSequence(id)); - } - - public static void debugShow(Object object) { - debugShow(objectToCharSequence(object)); - } - - public static void debugShow(CharSequence text) { - if (!isDebugMode()) { - return; - } - ToastParams params = new ToastParams(); - params.text = text; - show(params); - } - - /** - * 显示一个短 Toast - */ public static void showShort(int id) { - showShort(stringIdToCharSequence(id)); + Toaster.showShort(id); } - public static void showShort(Object object) { - showShort(objectToCharSequence(object)); - } - - public static void showShort(CharSequence text) { - ToastParams params = new ToastParams(); - params.text = text; - params.duration = Toast.LENGTH_SHORT; - show(params); - } - - /** - * 显示一个长 Toast - */ - - public static void showLong(int id) { - showLong(stringIdToCharSequence(id)); - } - - public static void showLong(Object object) { - showLong(objectToCharSequence(object)); - } - - public static void showLong(CharSequence text) { - ToastParams params = new ToastParams(); - params.text = text; - params.duration = Toast.LENGTH_LONG; - show(params); - } - - /** - * 显示 Toast - */ - - public static void show(int id) { - show(stringIdToCharSequence(id)); - } - - public static void show(Object object) { - show(objectToCharSequence(object)); - } - - public static void show(CharSequence text) { - ToastParams params = new ToastParams(); - params.text = text; - show(params); - } - - public static void show(ToastParams params) { - // 如果是空对象或者空文本就不显示 - if (params.text == null || params.text.length() == 0) { - return; - } - - if (params.strategy == null) { - params.strategy = sToastStrategy; - } - - if (params.interceptor == null) { - if (sToastInterceptor == null) { - sToastInterceptor = new ToastLogInterceptor(); - } - params.interceptor = sToastInterceptor; - } - - if (params.style == null) { - params.style = sToastStyle; - } - - if (params.interceptor.intercept(params)) { - return; - } - - if (params.duration == -1) { - params.duration = params.text.length() > 20 ? Toast.LENGTH_LONG : Toast.LENGTH_SHORT; - } - - params.strategy.showToast(params); - } - - /** - * 取消吐司的显示 - */ - public static void cancel() { - sToastStrategy.cancelToast(); - } - - /** - * 设置吐司的位置 - * - * @param gravity 重心 - */ - public static void setGravity(int gravity) { - setGravity(gravity, 0, 0); - } - - public static void setGravity(int gravity, int xOffset, int yOffset) { - setGravity(gravity, xOffset, yOffset, 0, 0); - } - - public static void setGravity(int gravity, int xOffset, int yOffset, float horizontalMargin, float verticalMargin) { - sToastStyle = new LocationToastStyle(sToastStyle, gravity, xOffset, yOffset, horizontalMargin, verticalMargin); - } - - /** - * 给当前 Toast 设置新的布局 - */ - public static void setView(int id) { - if (id <= 0) { - return; - } - setStyle(new CustomViewToastStyle(id, sToastStyle.getGravity(), - sToastStyle.getXOffset(), sToastStyle.getYOffset(), - sToastStyle.getHorizontalMargin(), sToastStyle.getVerticalMargin())); - } - - /** - * 初始化全局的 Toast 样式 - * - * @param style 样式实现类,框架已经实现两种不同的样式 - * 黑色样式:{@link BlackToastStyle} - * 白色样式:{@link WhiteToastStyle} - */ - public static void setStyle(IToastStyle style) { - sToastStyle = style; - } - - public static IToastStyle getStyle() { - return sToastStyle; - } - - /** - * 设置 Toast 显示策略 - */ - public static void setStrategy(IToastStrategy strategy) { - sToastStrategy = strategy; - sToastStrategy.registerStrategy(sApplication); - } - - public static IToastStrategy getStrategy() { - return sToastStrategy; - } - - /** - * 设置 Toast 拦截器(可以根据显示的内容决定是否拦截这个Toast) - * 场景:打印 Toast 内容日志、根据 Toast 内容是否包含敏感字来动态切换其他方式显示(这里可以使用我的另外一套框架 XToast) - */ - public static void setInterceptor(IToastInterceptor interceptor) { - sToastInterceptor = interceptor; - } - - public static IToastInterceptor getInterceptor() { - return sToastInterceptor; - } - - /** - * 是否为调试模式 - */ - public static void setDebugMode(boolean debug) { - sDebugMode = debug; - } - - static boolean isDebugMode() { - if (sDebugMode == null) { - sDebugMode = (sApplication.getApplicationInfo().flags & ApplicationInfo.FLAG_DEBUGGABLE) != 0; - } - return sDebugMode; - } - - private static CharSequence stringIdToCharSequence(int id) { - try { - // 如果这是一个资源 id - return sApplication.getResources().getText(id); - } catch (Resources.NotFoundException ignored) { - // 如果这是一个 int 整数 - return String.valueOf(id); - } - } - - private static CharSequence objectToCharSequence(Object object) { - return object != null ? object.toString() : "null"; + public static void showShort(String sequence) { + Toaster.showShort(sequence); } } \ No newline at end of file diff --git a/common.gradle b/common.gradle index f845e68..cb06f3f 100644 --- a/common.gradle +++ b/common.gradle @@ -11,7 +11,7 @@ project.ext { resValue("string", "CITY_CODE", "540200000000") resValue("string", "CITY_ID", "640675") resValue("string", "CITY_NAME", "日喀则市") - resValue("string","APP_PATH_CODE","f5935aa1-4405-4cbe-85bc-d7c1a8ddc9c4") + resValue("string","VERSION_PATH_CODE","f5935aa1-4405-4cbe-85bc-d7c1a8ddc9c4") manifestPlaceholders = [CHANNEL_VALUE: "cultural", APP_LOGO : "@drawable/app_logo", CITY_ID : "640675", diff --git a/modulemain/src/main/AndroidManifest.xml b/modulemain/src/main/AndroidManifest.xml index a2f9a9a..f7e667e 100755 --- a/modulemain/src/main/AndroidManifest.xml +++ b/modulemain/src/main/AndroidManifest.xml @@ -18,6 +18,7 @@ + @@ -154,6 +155,9 @@ + \ No newline at end of file diff --git a/modulemain/src/main/java/com/tengshisoft/mudulemain/cultural/activitys/base/LoginActivity.java b/modulemain/src/main/java/com/tengshisoft/mudulemain/cultural/activitys/base/LoginActivity.java index 59478d1..917038c 100755 --- a/modulemain/src/main/java/com/tengshisoft/mudulemain/cultural/activitys/base/LoginActivity.java +++ b/modulemain/src/main/java/com/tengshisoft/mudulemain/cultural/activitys/base/LoginActivity.java @@ -344,7 +344,9 @@ public class LoginActivity extends BaseActivity { public void onError(Throwable e) { dialog.dismiss(); ExceptionHandler.handleException(e); - ToastUtils.show("登录失败,请稍后重试"); +// ToastUtils.show("登录失败,请稍后重试"); + setResult(333); + finish(); } @Override 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 dafa7c9..2bec9cb 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 @@ -35,6 +35,7 @@ import com.sucstepsoft.cm_utils.core.retrofit_net.bean.VersionBean; import com.sucstepsoft.cm_utils.core.widget.base.BaseActivity; import com.sucstepsoft.cm_utils.core.widget.base.FragmentUtils; import com.sucstepsoft.cm_utils.core.widget.views.CenterDialogUpdateView; +import com.sucstepsoft.cm_utils.utils.ExceptionHandler; import com.sucstepsoft.cm_utils.utils.FileUtils; import com.sucstepsoft.cm_utils.utils.LogUtils; import com.sucstepsoft.cm_utils.utils.PermissionUtils; @@ -302,6 +303,9 @@ public class MainActivity extends BaseActivity { @Override public void onError(Throwable e) { + e.printStackTrace(); + ExceptionHandler.handleException(e); + UserLgUtils.putIsPublicCode(false); } @Override 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 9537282..2b1770e 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; @@ -180,6 +183,7 @@ public class NewsLocalDetailActivity extends BaseActivity { Button mBtnPublic; @BindView(R2.id.rl_public_code) RelativeLayout mRlPublicCode; + private AddPhotoBean mCurrentBean; private String mPicPath; private Unbinder mBind; @@ -204,6 +208,8 @@ public class NewsLocalDetailActivity extends BaseActivity { private NewsCategoryAdapter mCategoryAdapter; private ActivityResultLauncher mResultLauncher; private SocketMsg mSocketMsg; + private boolean mIsAttention = false;//是否需要关注公众号 + private boolean mIsFirst = true; @Override protected int setLayoutId() { @@ -345,8 +351,10 @@ public class NewsLocalDetailActivity extends BaseActivity { IntentFilter filter = new IntentFilter(); filter.addAction(PathConfig.ACTION_FROM_SOCKET_PUSH_MSG); registerReceiver(mSocketMsg, filter); + getNewsDetail(); String read = String.format(getResources().getString(R.string.big_data_str), "", mNId, "新闻"); + LogUtils.e(read); bigDataRead(read); } @@ -369,21 +377,24 @@ public class NewsLocalDetailActivity extends BaseActivity { @Override public void onNext(NewsDetailBean newsDetailBean) { if (!"".equals(newsDetailBean.getNewsContentId())) { - + setDataToView(newsDetailBean); if (TextUtils.isEmpty(newsDetailBean.getNewsViewAuth())) { setDataToView(newsDetailBean); + mIsAttention = false; } else { //是否登录 if (TextUtils.isEmpty(UserLgUtils.getToken())) { ARouter.getInstance() .build(PathConfig.PATH_MODULE_MAIN_LOGIN) .navigation(); + finish(); } else { //是否需要关注公众号 if (newsDetailBean.getNewsViewAuth().contains("2")) { - startSocket(); showPublicCodeDialog(newsDetailBean); + mIsAttention = true; } else { + mIsAttention = false; setDataToView(newsDetailBean); } } @@ -391,6 +402,7 @@ public class NewsLocalDetailActivity extends BaseActivity { } else { refreshView(STATE_LOAD_ERROR); } + } @Override @@ -406,16 +418,17 @@ 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); + } } /** @@ -427,6 +440,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); }); @@ -1176,6 +1190,22 @@ public class NewsLocalDetailActivity extends BaseActivity { @Override protected void onStart() { super.onStart(); + //在socket断链的情况先手动获取一次是否关注 + LogUtils.e("是否关注" + UserLgUtils.getIsPublicCode() + mIsFirst); + if (!mIsFirst) { + if (!UserLgUtils.getIsPublicCode() && mIsAttention) { + if (mContentSkeleton != null) { + mContentSkeleton.show(); + } else { + mContentSkeleton = Skeleton.bind(mLlNewsContent) + .load(R.layout.item_skeleton_news_content_local) + .show(); + } + mRlPublicCode.setVisibility(View.GONE); + getUserIsPublicCode(); + } + } + mIsFirst = false; mCommentPage = 1; if (!TextUtils.isEmpty(UserLgUtils.getToken())) { getCommentListByLogin(mCommentPage); @@ -1184,6 +1214,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 */ @@ -1531,6 +1595,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 @@ -1538,8 +1614,19 @@ 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()); + //刷新页面 + if (errorBean.isAttention()) { + refreshPage(); + } + } catch (Exception e) { + + } } } } @@ -1551,6 +1638,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 100755 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 100755 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/res/layout/activity_news_local_detail.xml b/modulemain/src/main/res/layout/activity_news_local_detail.xml index c992614..a7eaea5 100644 --- a/modulemain/src/main/res/layout/activity_news_local_detail.xml +++ b/modulemain/src/main/res/layout/activity_news_local_detail.xml @@ -290,8 +290,11 @@ + tools:visibility="visible"> + android:textStyle="bold" + tools:textColor="@color/black" />