@onekeyfe/react-native-jpush 0.0.0-stage → 6.7.0-23

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (183) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +56 -2
  3. package/ReactNativeJpush.podspec +66 -0
  4. package/android/CMakeLists.txt +24 -0
  5. package/android/build.gradle +144 -0
  6. package/android/fcm/build.gradle +36 -0
  7. package/android/fcm/consumer-rules.pro +2 -0
  8. package/android/fcm/src/main/AndroidManifest.xml +25 -0
  9. package/android/fcm/src/main/java/com/onekey/jpush/fcm/FcmInitProvider.java +25 -0
  10. package/android/fcm/src/main/java/com/onekey/jpush/fcm/FcmMessagingService.java +84 -0
  11. package/android/fcm/src/main/java/com/onekey/jpush/fcm/FcmPushManager.java +69 -0
  12. package/android/fcm/src/test/java/com/onekey/jpush/fcm/FcmAdapterTest.java +684 -0
  13. package/android/fcm/src/test/java/com/onekey/jpush/fcm/FcmManifestTest.java +54 -0
  14. package/android/gradle.properties +4 -0
  15. package/android/src/main/AndroidManifest.xml +143 -0
  16. package/android/src/main/cpp/cpp-adapter.cpp +6 -0
  17. package/android/src/main/java/cn/android/service/JTransitActivity.java +19 -0
  18. package/android/src/main/java/cn/jiguang/android/BuildConfig.java +10 -0
  19. package/android/src/main/java/cn/jiguang/android/IDataShare.java +190 -0
  20. package/android/src/main/java/cn/jiguang/api/BaseLogger.java +82 -0
  21. package/android/src/main/java/cn/jiguang/api/JAction.java +22 -0
  22. package/android/src/main/java/cn/jiguang/api/JActionExtra.java +21 -0
  23. package/android/src/main/java/cn/jiguang/api/JAnalyticsAction.java +11 -0
  24. package/android/src/main/java/cn/jiguang/api/JCoreInterface.java +228 -0
  25. package/android/src/main/java/cn/jiguang/api/JCoreManager.java +156 -0
  26. package/android/src/main/java/cn/jiguang/api/JDispatchAction.java +66 -0
  27. package/android/src/main/java/cn/jiguang/api/MultiSpHelper.java +114 -0
  28. package/android/src/main/java/cn/jiguang/api/ReportCallBack.java +9 -0
  29. package/android/src/main/java/cn/jiguang/api/SdkType.java +13 -0
  30. package/android/src/main/java/cn/jiguang/api/utils/JCollectionAuth.java +28 -0
  31. package/android/src/main/java/cn/jiguang/core/JCoreCrypto.java +545 -0
  32. package/android/src/main/java/cn/jiguang/core/JCoreStorage.java +737 -0
  33. package/android/src/main/java/cn/jiguang/core/JCoreTcpEngine.java +1395 -0
  34. package/android/src/main/java/cn/jiguang/core/JCoreWireCodec.java +1716 -0
  35. package/android/src/main/java/cn/jiguang/internal/ActionManager.java +63 -0
  36. package/android/src/main/java/cn/jiguang/internal/JConstants.java +61 -0
  37. package/android/src/main/java/cn/jiguang/internal/JCoreHelperAction.java +12 -0
  38. package/android/src/main/java/cn/jiguang/internal/JCoreInternalHelper.java +102 -0
  39. package/android/src/main/java/cn/jiguang/net/DefaultHostVerifier.java +40 -0
  40. package/android/src/main/java/cn/jiguang/net/HttpRequest.java +78 -0
  41. package/android/src/main/java/cn/jiguang/net/HttpResponse.java +48 -0
  42. package/android/src/main/java/cn/jiguang/net/HttpUtils.java +106 -0
  43. package/android/src/main/java/cn/jiguang/plugins/core/JCoreModule.java +91 -0
  44. package/android/src/main/java/cn/jiguang/plugins/core/JCorePackage.java +27 -0
  45. package/android/src/main/java/cn/jiguang/plugins/push/JPushModule.java +773 -0
  46. package/android/src/main/java/cn/jiguang/plugins/push/JPushPackage.java +25 -0
  47. package/android/src/main/java/cn/jiguang/plugins/push/common/JConstants.java +88 -0
  48. package/android/src/main/java/cn/jiguang/plugins/push/common/JLogger.java +122 -0
  49. package/android/src/main/java/cn/jiguang/plugins/push/helper/JPushHelper.java +710 -0
  50. package/android/src/main/java/cn/jiguang/plugins/push/receiver/JPushBroadcastReceiver.java +37 -0
  51. package/android/src/main/java/cn/jiguang/plugins/push/receiver/JPushModuleReceiver.java +264 -0
  52. package/android/src/main/java/cn/jiguang/plugins/service/JCoreModuleService.java +7 -0
  53. package/android/src/main/java/cn/jpush/android/api/BasicPushNotificationBuilder.java +83 -0
  54. package/android/src/main/java/cn/jpush/android/api/CallBackParams.java +50 -0
  55. package/android/src/main/java/cn/jpush/android/api/CmdMessage.java +33 -0
  56. package/android/src/main/java/cn/jpush/android/api/CustomMessage.java +28 -0
  57. package/android/src/main/java/cn/jpush/android/api/CustomPushNotificationBuilder.java +81 -0
  58. package/android/src/main/java/cn/jpush/android/api/DefaultPushNotificationBuilder.java +90 -0
  59. package/android/src/main/java/cn/jpush/android/api/InAppSlotParams.java +65 -0
  60. package/android/src/main/java/cn/jpush/android/api/InstrumentedActivity.java +17 -0
  61. package/android/src/main/java/cn/jpush/android/api/InstrumentedListActivity.java +17 -0
  62. package/android/src/main/java/cn/jpush/android/api/JPushInterface.java +490 -0
  63. package/android/src/main/java/cn/jpush/android/api/JPushMessage.java +121 -0
  64. package/android/src/main/java/cn/jpush/android/api/JThirdPlatFormInterface.java +247 -0
  65. package/android/src/main/java/cn/jpush/android/api/MultiActionsNotificationBuilder.java +72 -0
  66. package/android/src/main/java/cn/jpush/android/api/NotificationCustomButton.java +50 -0
  67. package/android/src/main/java/cn/jpush/android/api/NotificationMessage.java +67 -0
  68. package/android/src/main/java/cn/jpush/android/api/PushNotificationBuilder.java +13 -0
  69. package/android/src/main/java/cn/jpush/android/api/TagAliasCallback.java +8 -0
  70. package/android/src/main/java/cn/jpush/android/data/JPushCollectControl.java +96 -0
  71. package/android/src/main/java/cn/jpush/android/data/JPushConfig.java +79 -0
  72. package/android/src/main/java/cn/jpush/android/data/JPushConfigEx.java +41 -0
  73. package/android/src/main/java/cn/jpush/android/data/JPushLocalNotification.java +155 -0
  74. package/android/src/main/java/cn/jpush/android/helper/JCoreHelper.java +70 -0
  75. package/android/src/main/java/cn/jpush/android/helper/Logger.java +82 -0
  76. package/android/src/main/java/cn/jpush/android/local/ActionHelper.java +1293 -0
  77. package/android/src/main/java/cn/jpush/android/local/ActivityLifeCallBack.java +47 -0
  78. package/android/src/main/java/cn/jpush/android/local/JPushAction.java +67 -0
  79. package/android/src/main/java/cn/jpush/android/local/JPushConstants.java +34 -0
  80. package/android/src/main/java/cn/jpush/android/local/JPushResponse.java +26 -0
  81. package/android/src/main/java/cn/jpush/android/local/ProxyActivityAction.java +34 -0
  82. package/android/src/main/java/cn/jpush/android/service/AlarmReceiver.java +15 -0
  83. package/android/src/main/java/cn/jpush/android/service/BActivity.java +19 -0
  84. package/android/src/main/java/cn/jpush/android/service/DActivity.java +19 -0
  85. package/android/src/main/java/cn/jpush/android/service/DaemonService.java +17 -0
  86. package/android/src/main/java/cn/jpush/android/service/DataProvider.java +136 -0
  87. package/android/src/main/java/cn/jpush/android/service/DataShare.java +129 -0
  88. package/android/src/main/java/cn/jpush/android/service/DownloadProvider.java +139 -0
  89. package/android/src/main/java/cn/jpush/android/service/InitProvider.java +48 -0
  90. package/android/src/main/java/cn/jpush/android/service/JCommonService.java +79 -0
  91. package/android/src/main/java/cn/jpush/android/service/JNotifyActivity.java +28 -0
  92. package/android/src/main/java/cn/jpush/android/service/JPushMessageReceiver.java +94 -0
  93. package/android/src/main/java/cn/jpush/android/service/PushReceiver.java +26 -0
  94. package/android/src/main/java/cn/jpush/android/service/PushService.java +28 -0
  95. package/android/src/main/java/cn/jpush/android/service/SchedulerReceiver.java +17 -0
  96. package/android/src/main/java/cn/jpush/android/service/TagAliasReceiver.java +11 -0
  97. package/android/src/main/java/cn/jpush/android/service/WakedResultReceiver.java +24 -0
  98. package/android/src/main/java/cn/jpush/android/ui/FullScreenView.java +11 -0
  99. package/android/src/main/java/cn/jpush/android/ui/PopWinActivity.java +16 -0
  100. package/android/src/main/java/cn/jpush/android/ui/PushActivity.java +27 -0
  101. package/android/src/main/java/cn/jpush/android/ui/RoundedImageView.java +63 -0
  102. package/android/src/main/java/cn/jpush/android/ui/ShadowViewCard.java +56 -0
  103. package/android/src/main/java/cn/jpush/android/ups/ICallbackResult.java +5 -0
  104. package/android/src/main/java/cn/jpush/android/ups/JPushUPSManager.java +37 -0
  105. package/android/src/main/java/cn/jpush/android/ups/TokenResult.java +47 -0
  106. package/android/src/main/java/cn/jpush/android/ups/UPSRegisterCallBack.java +4 -0
  107. package/android/src/main/java/cn/jpush/android/ups/UPSTurnCallBack.java +4 -0
  108. package/android/src/main/java/cn/jpush/android/ups/UPSUnRegisterCallBack.java +4 -0
  109. package/android/src/main/java/com/margelo/nitro/reactnativejpush/ReactNativeJpush.kt +455 -0
  110. package/android/src/main/java/com/margelo/nitro/reactnativejpush/ReactNativeJpushPackage.kt +50 -0
  111. package/android/src/main/res/values/jpush_string.xml +7 -0
  112. package/android/src/main/res/values/jpush_style.xml +22 -0
  113. package/android/src/test/java/com/margelo/nitro/reactnativejpush/JPushCloudHandshakeTest.java +110 -0
  114. package/android/src/test/java/com/margelo/nitro/reactnativejpush/JPushHandshakeFailureTest.java +73 -0
  115. package/android/src/test/java/com/margelo/nitro/reactnativejpush/ReactNativeJpushProtocolTest.java +908 -0
  116. package/ios/ReactNativeJpush.swift +522 -0
  117. package/ios/bridge/RCTJCoreModule.h +5 -0
  118. package/ios/bridge/RCTJCoreModule.m +31 -0
  119. package/ios/bridge/RCTJPushEventQueue.h +14 -0
  120. package/ios/bridge/RCTJPushEventQueue.m +23 -0
  121. package/ios/bridge/RCTJPushModule.h +37 -0
  122. package/ios/bridge/RCTJPushModule.m +1165 -0
  123. package/ios/include/JCOREService.h +3 -0
  124. package/ios/include/JGCOREAPI.h +14 -0
  125. package/ios/include/JGInforCollectionAuth.h +17 -0
  126. package/ios/include/JGInforCollectionAuthItems.h +2 -0
  127. package/ios/include/JGPushNotificationTrigger.h +2 -0
  128. package/ios/include/JPUSHService.h +359 -0
  129. package/ios/jcore/JCOREConfiguration.h +141 -0
  130. package/ios/jcore/JCOREConfiguration.m +703 -0
  131. package/ios/jcore/JCORECrypto.h +73 -0
  132. package/ios/jcore/JCORECrypto.m +649 -0
  133. package/ios/jcore/JCORESisResolver.h +56 -0
  134. package/ios/jcore/JCORESisResolver.m +525 -0
  135. package/ios/jcore/JCORETcpSession.h +42 -0
  136. package/ios/jcore/JCORETcpSession.m +956 -0
  137. package/ios/jcore/JCOREWireProtocol.h +274 -0
  138. package/ios/jcore/JCOREWireProtocol.m +1453 -0
  139. package/ios/jpush/JPUSHModels.m +214 -0
  140. package/ios/jpush/JPUSHNotificationManager.h +34 -0
  141. package/ios/jpush/JPUSHNotificationManager.m +360 -0
  142. package/ios/jpush/JPUSHService.m +794 -0
  143. package/ios/tests/ReactNativeJpushTests.m +148 -0
  144. package/lib/module/ReactNativeJpush.nitro.js +4 -0
  145. package/lib/module/ReactNativeJpush.nitro.js.map +1 -0
  146. package/lib/module/index.js +801 -0
  147. package/lib/module/index.js.map +1 -0
  148. package/lib/module/package.json +1 -0
  149. package/lib/typescript/package.json +1 -0
  150. package/lib/typescript/src/ReactNativeJpush.nitro.d.ts +60 -0
  151. package/lib/typescript/src/ReactNativeJpush.nitro.d.ts.map +1 -0
  152. package/lib/typescript/src/index.d.ts +235 -0
  153. package/lib/typescript/src/index.d.ts.map +1 -0
  154. package/nitro.json +23 -0
  155. package/nitrogen/generated/android/c++/JFunc_void_bool.hpp +75 -0
  156. package/nitrogen/generated/android/c++/JFunc_void_std__string_std__string.hpp +76 -0
  157. package/nitrogen/generated/android/c++/JHybridReactNativeJpushSpec.cpp +310 -0
  158. package/nitrogen/generated/android/c++/JHybridReactNativeJpushSpec.hpp +115 -0
  159. package/nitrogen/generated/android/kotlin/com/margelo/nitro/reactnativejpush/Func_void_bool.kt +78 -0
  160. package/nitrogen/generated/android/kotlin/com/margelo/nitro/reactnativejpush/Func_void_std__string_std__string.kt +78 -0
  161. package/nitrogen/generated/android/kotlin/com/margelo/nitro/reactnativejpush/HybridReactNativeJpushSpec.kt +274 -0
  162. package/nitrogen/generated/android/kotlin/com/margelo/nitro/reactnativejpush/reactnativejpushOnLoad.kt +35 -0
  163. package/nitrogen/generated/android/reactnativejpush+autolinking.cmake +81 -0
  164. package/nitrogen/generated/android/reactnativejpush+autolinking.gradle +27 -0
  165. package/nitrogen/generated/android/reactnativejpushOnLoad.cpp +58 -0
  166. package/nitrogen/generated/android/reactnativejpushOnLoad.hpp +34 -0
  167. package/nitrogen/generated/ios/ReactNativeJpush+autolinking.rb +62 -0
  168. package/nitrogen/generated/ios/ReactNativeJpush-Swift-Cxx-Bridge.cpp +49 -0
  169. package/nitrogen/generated/ios/ReactNativeJpush-Swift-Cxx-Bridge.hpp +147 -0
  170. package/nitrogen/generated/ios/ReactNativeJpush-Swift-Cxx-Umbrella.hpp +46 -0
  171. package/nitrogen/generated/ios/ReactNativeJpushAutolinking.mm +33 -0
  172. package/nitrogen/generated/ios/ReactNativeJpushAutolinking.swift +26 -0
  173. package/nitrogen/generated/ios/c++/HybridReactNativeJpushSpecSwift.cpp +11 -0
  174. package/nitrogen/generated/ios/c++/HybridReactNativeJpushSpecSwift.hpp +402 -0
  175. package/nitrogen/generated/ios/swift/Func_void_bool.swift +46 -0
  176. package/nitrogen/generated/ios/swift/Func_void_std__string_std__string.swift +46 -0
  177. package/nitrogen/generated/ios/swift/HybridReactNativeJpushSpec.swift +107 -0
  178. package/nitrogen/generated/ios/swift/HybridReactNativeJpushSpec_cxx.swift +723 -0
  179. package/nitrogen/generated/shared/c++/HybridReactNativeJpushSpec.cpp +73 -0
  180. package/nitrogen/generated/shared/c++/HybridReactNativeJpushSpec.hpp +116 -0
  181. package/package.json +174 -4
  182. package/src/ReactNativeJpush.nitro.ts +93 -0
  183. package/src/index.tsx +1090 -0
@@ -0,0 +1,773 @@
1
+
2
+ package cn.jiguang.plugins.push;
3
+ import android.app.NotificationChannel;
4
+ import android.app.NotificationManager;
5
+ import android.net.Uri;
6
+ import android.os.Build;
7
+ import android.app.Activity;
8
+ import android.app.Application;
9
+ import android.os.Bundle;
10
+ import android.text.TextUtils;
11
+ import android.util.Log;
12
+
13
+ import com.facebook.react.bridge.Arguments;
14
+ import com.facebook.react.bridge.Callback;
15
+ import com.facebook.react.bridge.ReactApplicationContext;
16
+ import com.facebook.react.bridge.ReactContextBaseJavaModule;
17
+ import com.facebook.react.bridge.ReactMethod;
18
+ import com.facebook.react.bridge.ReadableArray;
19
+ import com.facebook.react.bridge.ReadableMap;
20
+ import com.facebook.react.bridge.ReadableNativeMap;
21
+ import com.facebook.react.bridge.WritableMap;
22
+
23
+ import org.json.JSONObject;
24
+
25
+ import java.util.Collections;
26
+ import java.util.HashMap;
27
+ import java.util.HashSet;
28
+ import java.util.Set;
29
+ import java.util.concurrent.CopyOnWriteArraySet;
30
+ import java.lang.*;
31
+
32
+ import cn.jiguang.plugins.push.common.JConstants;
33
+ import cn.jiguang.plugins.push.common.JLogger;
34
+ import cn.jiguang.plugins.push.helper.JPushHelper;
35
+ import cn.jiguang.plugins.push.receiver.JPushBroadcastReceiver;
36
+ import cn.jpush.android.api.BasicPushNotificationBuilder;
37
+ import cn.jpush.android.api.JPushInterface;
38
+ import cn.jpush.android.data.JPushCollectControl;
39
+ import cn.jpush.android.data.JPushLocalNotification;
40
+
41
+ public class JPushModule extends ReactContextBaseJavaModule {
42
+
43
+ public static ReactApplicationContext reactContext;
44
+ private static final Set<ReactApplicationContext> ACTIVE_CONTEXTS =
45
+ new CopyOnWriteArraySet<ReactApplicationContext>();
46
+
47
+ public static boolean isAppForeground = false;
48
+
49
+ public static void registerReactContext(ReactApplicationContext ctx) {
50
+ if (ctx != null) {
51
+ ACTIVE_CONTEXTS.add(ctx);
52
+ if (reactContext == null) {
53
+ reactContext = ctx;
54
+ }
55
+ JPushHelper.flushPendingEvents();
56
+ }
57
+ }
58
+
59
+ public static Set<ReactApplicationContext> getActiveReactContexts() {
60
+ return Collections.unmodifiableSet(ACTIVE_CONTEXTS);
61
+ }
62
+
63
+ public static void clearActiveReactContexts() {
64
+ ACTIVE_CONTEXTS.clear();
65
+ reactContext = null;
66
+ }
67
+
68
+ public JPushModule(ReactApplicationContext reactApplicationContext) {
69
+ super(reactApplicationContext);
70
+ reactContext = reactApplicationContext;
71
+ registerReactContext(reactApplicationContext);
72
+ }
73
+
74
+ @Override
75
+ public String getName() {
76
+ return "JPushModule";
77
+ }
78
+
79
+ @ReactMethod
80
+ public void setDebugMode(boolean enable) {
81
+ JPushInterface.setDebugMode(enable);
82
+ JLogger.setLoggerEnable(enable);
83
+ }
84
+
85
+ @ReactMethod
86
+ public void init() {
87
+ JPushInterface.init(reactContext);
88
+ if (JPushBroadcastReceiver.NOTIFICATION_BUNDLE != null) {
89
+ Bundle bundle = JPushBroadcastReceiver.NOTIFICATION_BUNDLE;
90
+ java.util.Map<String, Object> map = JPushHelper.convertNotificationBundleToMapObject(
91
+ JConstants.NOTIFICATION_OPENED,
92
+ bundle
93
+ );
94
+ String eventName = bundle.getInt(JPushInterface.EXTRA_NOTI_TYPE, 0) == 1
95
+ ? JConstants.LOCAL_NOTIFICATION_EVENT
96
+ : JConstants.NOTIFICATION_EVENT;
97
+ JPushHelper.sendEventMap(eventName, map);
98
+ JPushBroadcastReceiver.NOTIFICATION_BUNDLE = null;
99
+ }
100
+ JPushInterface.setNotificationCallBackEnable(reactContext,true);
101
+ }
102
+
103
+ @ReactMethod
104
+ public void stopPush() {
105
+ JPushInterface.stopPush(reactContext);
106
+ }
107
+
108
+ @ReactMethod
109
+ public void resumePush() {
110
+ JPushInterface.resumePush(reactContext);
111
+ }
112
+
113
+ @ReactMethod
114
+ public void isPushStopped(Callback callback) {
115
+ boolean isPushStopped = JPushInterface.isPushStopped(reactContext);
116
+ if (callback == null) {
117
+ JLogger.w(JConstants.CALLBACK_NULL);
118
+ return;
119
+ }
120
+ callback.invoke(isPushStopped);
121
+ }
122
+
123
+ @ReactMethod
124
+ public void setChannel(ReadableMap readableMap) {
125
+ if (readableMap == null) {
126
+ JLogger.w(JConstants.PARAMS_NULL);
127
+ return;
128
+ }
129
+ String channel = readableMap.getString(JConstants.CHANNEL);
130
+ if (TextUtils.isEmpty(channel)) {
131
+ JLogger.w(JConstants.PARAMS_ILLEGAL);
132
+ } else {
133
+ JPushInterface.setChannel(reactContext, channel);
134
+ }
135
+ }
136
+ @ReactMethod
137
+ public void setChannelAndSound(ReadableMap readableMap) {
138
+ if (readableMap == null) {
139
+ JLogger.w(JConstants.PARAMS_NULL);
140
+ return;
141
+ }
142
+ String channel = readableMap.getString(JConstants.CHANNEL);
143
+ String sound = readableMap.getString(JConstants.SOUND);
144
+ String channelId = readableMap.getString(JConstants.CHANNELID);
145
+ try {
146
+ NotificationManager manager= (NotificationManager) reactContext.getSystemService("notification");
147
+ if(Build.VERSION.SDK_INT<26){
148
+ return;
149
+ }
150
+ if(TextUtils.isEmpty(channel)||TextUtils.isEmpty(channelId)){
151
+ return;
152
+ }
153
+ NotificationChannel channel1=new NotificationChannel(channelId,channel, NotificationManager.IMPORTANCE_HIGH);
154
+ if(!TextUtils.isEmpty(sound)){
155
+ channel1.setSound(Uri.parse("android.resource://"+reactContext.getPackageName()+"/raw/"+sound),null);
156
+ }
157
+ manager.createNotificationChannel(channel1);
158
+ JPushInterface.setChannel(reactContext,channel);
159
+ }catch (Throwable throwable){
160
+ }
161
+ }
162
+ @ReactMethod
163
+ public void setLinkMergeEnable(boolean enable) {
164
+ JPushInterface.setLinkMergeEnable(reactContext, enable);
165
+ }
166
+
167
+ @ReactMethod
168
+ public void setSmartPushEnable(boolean enable) {
169
+ JPushInterface.setSmartPushEnable(reactContext, enable);
170
+ }
171
+
172
+ @ReactMethod
173
+ public void setDataInsightsEnable(boolean enable) {
174
+ JPushInterface.setDataInsightsEnable(reactContext, enable);
175
+ }
176
+
177
+ @ReactMethod
178
+ public void setGeofenceEnable(boolean enable) {
179
+ JPushInterface.setGeofenceEnable(reactContext, enable);
180
+ }
181
+
182
+ @ReactMethod
183
+ public void setCollectControl(ReadableMap readableMap) {
184
+ if (readableMap == null) {
185
+ JLogger.w(JConstants.PARAMS_NULL);
186
+ return;
187
+ }
188
+ boolean hadValue = false;
189
+ JPushCollectControl.Builder builder = new JPushCollectControl.Builder();
190
+ if (readableMap.hasKey(JConstants.IMEI)) {
191
+ hadValue = true;
192
+ builder.imei(readableMap.getBoolean(JConstants.IMEI));
193
+ }
194
+ if (readableMap.hasKey(JConstants.IMSI)) {
195
+ hadValue = true;
196
+ builder.imsi(readableMap.getBoolean(JConstants.IMSI));
197
+ }
198
+ if (readableMap.hasKey(JConstants.MAC)) {
199
+ hadValue = true;
200
+ builder.mac(readableMap.getBoolean(JConstants.MAC));
201
+ }
202
+ if (readableMap.hasKey(JConstants.WIFI)) {
203
+ hadValue = true;
204
+ builder.wifi(readableMap.getBoolean(JConstants.WIFI));
205
+ }
206
+ if (readableMap.hasKey(JConstants.BSSID)) {
207
+ hadValue = true;
208
+ builder.bssid(readableMap.getBoolean(JConstants.BSSID));
209
+ }
210
+ if (readableMap.hasKey(JConstants.SSID)) {
211
+ hadValue = true;
212
+ builder.ssid(readableMap.getBoolean(JConstants.SSID));
213
+ }
214
+ if (readableMap.hasKey(JConstants.CELL)) {
215
+ hadValue = true;
216
+ builder.cell(readableMap.getBoolean(JConstants.CELL));
217
+ }
218
+ if (hadValue) {
219
+ JPushInterface.setCollectControl(reactContext, builder.build());
220
+ }
221
+ }
222
+ @ReactMethod
223
+ public void setBadgeNumber(ReadableMap readableMap) {
224
+ if (readableMap == null) {
225
+ JLogger.w(JConstants.PARAMS_NULL);
226
+ return;
227
+ }
228
+ if (readableMap.hasKey(JConstants.BADGE_NUMBER)) {
229
+ int number = readableMap.getInt(JConstants.BADGE_NUMBER);
230
+ JPushInterface.setBadgeNumber(reactContext,number);
231
+ } else {
232
+ JLogger.w("there are no " + JConstants.BADGE_NUMBER);
233
+ }
234
+ }
235
+ @ReactMethod
236
+ public void setPushTime(ReadableMap readableMap) {
237
+ if (readableMap == null) {
238
+ JLogger.w(JConstants.PARAMS_NULL);
239
+ return;
240
+ }
241
+ ReadableArray readableArray = readableMap.getArray(JConstants.PUSH_TIME_DAYS);
242
+ int startHour = readableMap.getInt(JConstants.PUSH_TIME_START_HOUR);
243
+ int endHour = readableMap.getInt(JConstants.PUSH_TIME_END_HOUR);
244
+ if (readableArray == null || startHour < 0 || startHour > 23 || endHour < 0 || endHour > 23) {
245
+ JLogger.w(JConstants.PARAMS_NULL);
246
+ return;
247
+ }
248
+ Set<Integer> days = new HashSet<Integer>();
249
+ for (int i = 0; i < readableArray.size(); i++) {
250
+ int day = readableArray.getInt(i);
251
+ if (day > 6 || day < 0) {
252
+ JLogger.w(JConstants.PARAMS_NULL);
253
+ return;
254
+ }
255
+ days.add(day);
256
+ }
257
+ JPushInterface.setPushTime(reactContext, days, startHour, endHour);
258
+ }
259
+
260
+ @ReactMethod
261
+ public void setSilenceTime(ReadableMap readableMap) {
262
+ if (readableMap == null) {
263
+ JLogger.w(JConstants.PARAMS_NULL);
264
+ return;
265
+ }
266
+ int startHour = readableMap.getInt(JConstants.SILENCE_TIME_START_HOUR);
267
+ int startMinute = readableMap.getInt(JConstants.SILENCE_TIME_START_MINUTE);
268
+ int endHour = readableMap.getInt(JConstants.SILENCE_TIME_END_HOUR);
269
+ int endMinute = readableMap.getInt(JConstants.SILENCE_TIME_END_MINUTE);
270
+ if (startHour < 0 || startHour > 23 || startMinute < 0 || startMinute > 59
271
+ || endHour < 0 || endHour > 23 || endMinute < 0 || endMinute > 59) {
272
+ JLogger.w(JConstants.PARAMS_NULL);
273
+ return;
274
+ }
275
+ JPushInterface.setSilenceTime(reactContext, startHour, startMinute, endHour, endMinute);
276
+ }
277
+
278
+ @ReactMethod
279
+ public void getRegistrationID(Callback callback) {
280
+ if (callback == null) {
281
+ JLogger.w(JConstants.CALLBACK_NULL);
282
+ return;
283
+ }
284
+ String registrationID = JPushInterface.getRegistrationID(reactContext);
285
+ WritableMap writableMap = Arguments.createMap();
286
+ writableMap.putString(JConstants.REGISTRATION_ID, registrationID);
287
+ callback.invoke(writableMap);
288
+ }
289
+
290
+ @ReactMethod
291
+ public void getUdid(Callback callback) {
292
+ if (callback == null) {
293
+ JLogger.w(JConstants.CALLBACK_NULL);
294
+ return;
295
+ }
296
+ String udid = JPushInterface.getUdid(reactContext);
297
+ callback.invoke(udid);
298
+ }
299
+
300
+ @ReactMethod
301
+ public void setLatestNotificationNumber(ReadableMap readableMap) {
302
+ if (readableMap == null) {
303
+ JLogger.w(JConstants.PARAMS_NULL);
304
+ return;
305
+ }
306
+ if (readableMap.hasKey(JConstants.NOTIFICATION_MAX_NUMBER)) {
307
+ int maxNumber = readableMap.getInt(JConstants.NOTIFICATION_MAX_NUMBER);
308
+ JPushInterface.setLatestNotificationNumber(reactContext, maxNumber);
309
+ } else {
310
+ JLogger.w("there are no " + JConstants.NOTIFICATION_MAX_NUMBER);
311
+ }
312
+ }
313
+
314
+ @ReactMethod
315
+ public void setDefaultPushNotificationBuilder(ReadableMap readableMap) {
316
+ if (readableMap == null) {
317
+ JLogger.w(JConstants.PARAMS_NULL);
318
+ return;
319
+ }
320
+ BasicPushNotificationBuilder builder = new BasicPushNotificationBuilder(reactContext);
321
+ JPushInterface.setDefaultPushNotificationBuilder(builder);
322
+ }
323
+
324
+ @ReactMethod
325
+ public void filterValidTags(ReadableMap readableMap, Callback callback) {
326
+ if (readableMap == null) {
327
+ JLogger.w(JConstants.PARAMS_NULL);
328
+ return;
329
+ }
330
+ if (readableMap.hasKey(JConstants.TAGS)) {
331
+ ReadableArray tags = readableMap.getArray(JConstants.TAGS);
332
+ Set<String> tagSet = new HashSet<>();
333
+ for (int i = 0; i < tags.size(); i++) {
334
+ String tag = tags.getString(i);
335
+ tagSet.add(tag);
336
+ }
337
+ JPushInterface.filterValidTags(tagSet);
338
+ } else {
339
+ JLogger.w("there are no " + JConstants.TAGS);
340
+ }
341
+ }
342
+ @ReactMethod
343
+ public void setProperties(ReadableMap readableMap) {
344
+ if (readableMap == null) {
345
+ JLogger.w(JConstants.PARAMS_NULL);
346
+ return;
347
+ }
348
+ if (readableMap.hasKey(JConstants.PROPERTIES)) {
349
+ int sequence = readableMap.getInt(JConstants.SEQUENCE);
350
+ ReadableMap readMap = readableMap.getMap(JConstants.PROPERTIES);
351
+ HashMap<String, Object> properties = readMap != null ? readMap.toHashMap() : new HashMap<String, Object>();
352
+ JPushInterface.setProperties(reactContext,sequence,properties);
353
+ } else {
354
+ JLogger.w("there are no " + JConstants.PROPERTIES);
355
+ }
356
+ }
357
+ @ReactMethod
358
+ public void deleteProperties(ReadableMap readableMap) {
359
+ if (readableMap == null) {
360
+ JLogger.w(JConstants.PARAMS_NULL);
361
+ return;
362
+ }
363
+ if (readableMap.hasKey(JConstants.PROPERTIES)) {
364
+ int sequence = readableMap.getInt(JConstants.SEQUENCE);
365
+ ReadableMap readMap = readableMap.getMap(JConstants.PROPERTIES);
366
+ HashMap<String, Object> properties = readMap != null ? readMap.toHashMap() : new HashMap<String, Object>();
367
+ JPushInterface.deleteProperties(reactContext,sequence,properties);
368
+ } else {
369
+ JLogger.w("there are no " + JConstants.PROPERTIES);
370
+ }
371
+
372
+ }
373
+ @ReactMethod
374
+ public void cleanProperties(ReadableMap readableMap) {
375
+ if (readableMap == null) {
376
+ JLogger.w(JConstants.PARAMS_NULL);
377
+ return;
378
+ }
379
+ int sequence = readableMap.getInt(JConstants.SEQUENCE);
380
+ JPushInterface.cleanProperties(reactContext,sequence);
381
+ }
382
+ @ReactMethod
383
+ public void setTags(ReadableMap readableMap) {
384
+ if (readableMap == null) {
385
+ JLogger.w(JConstants.PARAMS_NULL);
386
+ return;
387
+ }
388
+ if (readableMap.hasKey(JConstants.TAGS)) {
389
+ ReadableArray tags = readableMap.getArray(JConstants.TAGS);
390
+ int sequence = readableMap.getInt(JConstants.SEQUENCE);
391
+ Set<String> tagSet = new HashSet<>();
392
+ for (int i = 0; i < tags.size(); i++) {
393
+ String tag = tags.getString(i);
394
+ tagSet.add(tag);
395
+ }
396
+ JPushInterface.setTags(reactContext, sequence, tagSet);
397
+ } else {
398
+ JLogger.w("there are no " + JConstants.TAGS);
399
+ }
400
+ }
401
+
402
+ @ReactMethod
403
+ public void addTags(ReadableMap readableMap) {
404
+ if (readableMap == null) {
405
+ JLogger.w(JConstants.PARAMS_NULL);
406
+ return;
407
+ }
408
+ if (readableMap.hasKey(JConstants.TAGS)) {
409
+ ReadableArray tags = readableMap.getArray(JConstants.TAGS);
410
+ int sequence = readableMap.getInt(JConstants.SEQUENCE);
411
+ Set<String> tagSet = new HashSet<>();
412
+ for (int i = 0; i < tags.size(); i++) {
413
+ String tag = tags.getString(i);
414
+ tagSet.add(tag);
415
+ }
416
+ JPushInterface.addTags(reactContext, sequence, tagSet);
417
+ } else {
418
+ JLogger.w("there are no " + JConstants.TAGS);
419
+ }
420
+ }
421
+
422
+ @ReactMethod
423
+ public void deleteTags(ReadableMap readableMap) {
424
+ if (readableMap == null) {
425
+ JLogger.w(JConstants.PARAMS_NULL);
426
+ return;
427
+ }
428
+ if (readableMap.hasKey(JConstants.TAGS)) {
429
+ ReadableArray tags = readableMap.getArray(JConstants.TAGS);
430
+ int sequence = readableMap.getInt(JConstants.SEQUENCE);
431
+ Set<String> tagSet = new HashSet<>();
432
+ for (int i = 0; i < tags.size(); i++) {
433
+ String tag = tags.getString(i);
434
+ tagSet.add(tag);
435
+ }
436
+ JPushInterface.deleteTags(reactContext, sequence, tagSet);
437
+ } else {
438
+ JLogger.w("there are no " + JConstants.TAGS);
439
+ }
440
+ }
441
+
442
+ @ReactMethod
443
+ public void cleanTags(ReadableMap readableMap) {
444
+ if (readableMap == null) {
445
+ JLogger.w(JConstants.PARAMS_NULL);
446
+ return;
447
+ }
448
+ int sequence = readableMap.getInt(JConstants.SEQUENCE);
449
+ JPushInterface.cleanTags(reactContext, sequence);
450
+ }
451
+
452
+ @ReactMethod
453
+ public void getAllTags(ReadableMap readableMap) {
454
+ if (readableMap == null) {
455
+ JLogger.w(JConstants.PARAMS_NULL);
456
+ return;
457
+ }
458
+ int sequence = readableMap.getInt(JConstants.SEQUENCE);
459
+ JPushInterface.getAllTags(reactContext, sequence);
460
+ }
461
+
462
+ @ReactMethod
463
+ public void checkTagBindState(ReadableMap readableMap) {
464
+ if (readableMap == null) {
465
+ JLogger.w(JConstants.PARAMS_NULL);
466
+ return;
467
+ }
468
+ int sequence = readableMap.getInt(JConstants.SEQUENCE);
469
+ String tag = readableMap.getString(JConstants.TAG);
470
+ JPushInterface.checkTagBindState(reactContext, sequence, tag);
471
+ }
472
+
473
+ @ReactMethod
474
+ public void setAlias(ReadableMap readableMap) {
475
+ if (readableMap == null) {
476
+ JLogger.w(JConstants.PARAMS_NULL);
477
+ return;
478
+ }
479
+ int sequence = readableMap.getInt(JConstants.SEQUENCE);
480
+ String alias = readableMap.getString(JConstants.ALIAS);
481
+ JPushInterface.setAlias(reactContext, sequence, alias);
482
+ }
483
+
484
+ @ReactMethod
485
+ public void deleteAlias(ReadableMap readableMap) {
486
+ if (readableMap == null) {
487
+ JLogger.w(JConstants.PARAMS_NULL);
488
+ return;
489
+ }
490
+ int sequence = readableMap.getInt(JConstants.SEQUENCE);
491
+ JPushInterface.deleteAlias(reactContext, sequence);
492
+ }
493
+
494
+ @ReactMethod
495
+ public void getAlias(ReadableMap readableMap) {
496
+ if (readableMap == null) {
497
+ JLogger.w(JConstants.PARAMS_NULL);
498
+ return;
499
+ }
500
+ int sequence = readableMap.getInt(JConstants.SEQUENCE);
501
+ JPushInterface.getAlias(reactContext, sequence);
502
+ }
503
+
504
+ @ReactMethod
505
+ public void setMobileNumber(ReadableMap readableMap) {
506
+ if (readableMap == null) {
507
+ JLogger.w(JConstants.PARAMS_NULL);
508
+ return;
509
+ }
510
+ int sequence = readableMap.getInt(JConstants.SEQUENCE);
511
+ String mobileNumber = readableMap.getString(JConstants.MOBILE_NUMBER);
512
+ JPushInterface.setMobileNumber(reactContext, sequence, mobileNumber);
513
+ }
514
+
515
+ @ReactMethod
516
+ public void onResume() {
517
+ JPushInterface.onResume(reactContext);
518
+ }
519
+
520
+ @ReactMethod
521
+ public void onPause() {
522
+ JPushInterface.onPause(reactContext);
523
+ }
524
+
525
+ @ReactMethod
526
+ public void onKillProcess() {
527
+ JPushInterface.onKillProcess(reactContext);
528
+ }
529
+
530
+ @ReactMethod
531
+ public void initCrashHandler() {
532
+ JPushInterface.initCrashHandler(reactContext);
533
+ }
534
+
535
+ @ReactMethod
536
+ public void stopCrashHandler() {
537
+ JPushInterface.stopCrashHandler(reactContext);
538
+ }
539
+
540
+ @ReactMethod
541
+ public void addLocalNotification(ReadableMap readableMap) {
542
+ if (readableMap == null) {
543
+ JLogger.w(JConstants.PARAMS_NULL);
544
+ return;
545
+ }
546
+ if (!readableMap.hasKey(JConstants.MESSAGE_ID)) {
547
+ JLogger.w(JConstants.PARAMS_ILLEGAL);
548
+ return;
549
+ }
550
+ String notificationID = readableMap.getString(JConstants.MESSAGE_ID);
551
+ if(notificationID==null || TextUtils.isEmpty(notificationID)){
552
+ JLogger.w(JConstants.PARAMS_ILLEGAL);
553
+ return;
554
+ }
555
+ long id = parseNotificationId(notificationID);
556
+ String notificationTitle = readableMap.hasKey(JConstants.TITLE) ? readableMap.getString(JConstants.TITLE) : reactContext.getPackageName();
557
+ String notificationContent = readableMap.hasKey(JConstants.CONTENT) ? readableMap.getString(JConstants.CONTENT) : reactContext.getPackageName();
558
+ String broadcastTime = readableMap.hasKey(JConstants.BROADCAST_TIME) ? readableMap.getString(JConstants.BROADCAST_TIME) : "0";
559
+ JPushLocalNotification notification = new JPushLocalNotification();
560
+ notification.setNotificationId(id);
561
+ notification.setTitle(notificationTitle);
562
+ notification.setContent(notificationContent);
563
+ try {
564
+ notification.setBroadcastTime(Long.parseLong(broadcastTime));
565
+ }catch (Throwable throwable){
566
+ }
567
+ if (readableMap.hasKey(JConstants.EXTRAS)) {
568
+ ReadableMap notificationExtra = readableMap.getMap(JConstants.EXTRAS);
569
+ JSONObject notificationExtraJson = new JSONObject(notificationExtra.toHashMap());
570
+ notification.setExtras(notificationExtraJson.toString());
571
+ }
572
+
573
+ // 设置BuilderId
574
+ if (readableMap.hasKey(JConstants.BUILDER_NAME)) {
575
+ try {
576
+ String layoutFileName = readableMap.getString(JConstants.BUILDER_NAME);
577
+ if (!TextUtils.isEmpty(layoutFileName)) {
578
+ // 通过布局文件名获取资源ID
579
+ int builderId = reactContext.getResources().getIdentifier(
580
+ layoutFileName,
581
+ "layout",
582
+ reactContext.getPackageName()
583
+ );
584
+ if (builderId != 0) {
585
+ notification.setBuilderId(builderId);
586
+ } else {
587
+ JLogger.w("Layout file not found: " + layoutFileName);
588
+ }
589
+ }
590
+ } catch (Exception e) {
591
+ JLogger.w("Failed to set BuilderId: " + e.getMessage());
592
+ }
593
+ }
594
+
595
+ // 设置Category
596
+ if (readableMap.hasKey(JConstants.CATEGORY)) {
597
+ String category = readableMap.getString(JConstants.CATEGORY);
598
+ if (!TextUtils.isEmpty(category)) {
599
+ notification.setCategory(category);
600
+ }
601
+ }
602
+
603
+ // 设置Priority
604
+ if (readableMap.hasKey(JConstants.PRIORITY)) {
605
+ try {
606
+ int priority = readableMap.getInt(JConstants.PRIORITY);
607
+ notification.setPriority(priority);
608
+ } catch (Exception e) {
609
+ JLogger.w("Priority must be a number");
610
+ }
611
+ }
612
+
613
+ JPushInterface.addLocalNotification(reactContext, notification);
614
+ }
615
+
616
+ private static long parseNotificationId(String notificationID) {
617
+ try {
618
+ return Long.parseLong(notificationID);
619
+ } catch (NumberFormatException ignored) {
620
+ return (long) notificationID.hashCode();
621
+ }
622
+ }
623
+
624
+ @ReactMethod
625
+ public void removeLocalNotification(ReadableMap readableMap) {
626
+ if (readableMap == null) {
627
+ JLogger.w(JConstants.PARAMS_NULL);
628
+ return;
629
+ }
630
+ if (readableMap.hasKey(JConstants.MESSAGE_ID)) {
631
+ String notificationID = readableMap.getString(JConstants.MESSAGE_ID);
632
+ if(notificationID==null || TextUtils.isEmpty(notificationID)){
633
+ JLogger.w(JConstants.PARAMS_ILLEGAL);
634
+ return;
635
+ }
636
+ long id = parseNotificationId(notificationID);
637
+ JPushInterface.removeLocalNotification(reactContext, id);
638
+ } else {
639
+ JLogger.w("there are no " + JConstants.MESSAGE_ID);
640
+ }
641
+ }
642
+
643
+ @ReactMethod
644
+ public void clearLocalNotifications() {
645
+ JPushInterface.clearLocalNotifications(reactContext);
646
+ }
647
+
648
+ @ReactMethod
649
+ public void requestPermission() {
650
+ Activity current = getCurrentActivity();
651
+ JPushInterface.requestPermission(current != null ? current : reactContext);
652
+ }
653
+
654
+ @ReactMethod
655
+ public void setGeofenceInterval(ReadableMap readableMap) {
656
+ if (readableMap == null) {
657
+ JLogger.w(JConstants.PARAMS_NULL);
658
+ return;
659
+ }
660
+ if (readableMap.hasKey(JConstants.GEO_FENCE_INTERVAL)) {
661
+ int interval = readableMap.getInt(JConstants.GEO_FENCE_INTERVAL);
662
+ JPushInterface.setGeofenceInterval(reactContext, interval);
663
+ } else {
664
+ JLogger.w("there are no " + JConstants.GEO_FENCE_INTERVAL);
665
+ }
666
+ }
667
+
668
+ @ReactMethod
669
+ public void setMaxGeofenceNumber(ReadableMap readableMap) {
670
+ if (readableMap == null) {
671
+ JLogger.w(JConstants.PARAMS_NULL);
672
+ return;
673
+ }
674
+ if (readableMap.hasKey(JConstants.GEO_FENCE_MAX_NUMBER)) {
675
+ int maxNumber = readableMap.getInt(JConstants.GEO_FENCE_MAX_NUMBER);
676
+ JPushInterface.setMaxGeofenceNumber(reactContext, maxNumber);
677
+ } else {
678
+ JLogger.w("there are no " + JConstants.GEO_FENCE_MAX_NUMBER);
679
+ }
680
+ }
681
+
682
+ @ReactMethod
683
+ public void deleteGeofence(ReadableMap readableMap) {
684
+ if (readableMap == null) {
685
+ JLogger.w(JConstants.PARAMS_NULL);
686
+ return;
687
+ }
688
+ if (readableMap.hasKey(JConstants.GEO_FENCE_ID)) {
689
+ String id = readableMap.getString(JConstants.GEO_FENCE_ID);
690
+ JPushInterface.deleteGeofence(reactContext, id);
691
+ } else {
692
+ JLogger.w("there are no " + JConstants.GEO_FENCE_ID);
693
+ }
694
+ }
695
+
696
+ @ReactMethod
697
+ public void clearAllNotifications(){
698
+ JPushInterface.clearAllNotifications(reactContext);
699
+ }
700
+
701
+ @ReactMethod
702
+ public void clearNotificationById(ReadableMap readableMap){
703
+ if (readableMap == null){
704
+ JLogger.w(JConstants.PARAMS_NULL);
705
+ return;
706
+ }
707
+ if (readableMap.hasKey(JConstants.NOTIFICATION_ID)){
708
+ Integer id = readableMap.getInt(JConstants.NOTIFICATION_ID);
709
+ JPushInterface.clearNotificationById(reactContext,id);
710
+ }else {
711
+ JLogger.w("there are no " + JConstants.GEO_FENCE_ID);
712
+ }
713
+ }
714
+
715
+ @ReactMethod
716
+ public void setPowerSaveMode(boolean bool){
717
+ JPushInterface.setPowerSaveMode(reactContext,bool);
718
+ }
719
+
720
+ @ReactMethod
721
+ public void isNotificationEnabled(Callback callback){
722
+ Integer isEnabled = JPushInterface.isNotificationEnabled(reactContext);
723
+ if (callback == null){
724
+ JLogger.w(JConstants.CALLBACK_NULL);
725
+ return;
726
+ }
727
+ callback.invoke(isEnabled);
728
+ }
729
+
730
+
731
+ //*****************************应用前后台状态监听*****************************
732
+ public static void registerActivityLifecycle(Application application) {
733
+ application.registerActivityLifecycleCallbacks(new Application.ActivityLifecycleCallbacks() {
734
+ @Override
735
+ public void onActivityCreated(Activity activity, Bundle bundle) {
736
+ JLogger.d("onActivityCreated");
737
+ }
738
+
739
+ @Override
740
+ public void onActivityStarted(Activity activity) {
741
+ JLogger.d("onActivityStarted");
742
+ }
743
+
744
+ @Override
745
+ public void onActivityResumed(Activity activity) {
746
+ JLogger.d("onActivityResumed");
747
+ isAppForeground = true;
748
+ }
749
+
750
+ @Override
751
+ public void onActivityPaused(Activity activity) {
752
+ JLogger.d("onActivityPaused");
753
+ isAppForeground = false;
754
+ }
755
+
756
+ @Override
757
+ public void onActivityStopped(Activity activity) {
758
+ JLogger.d("onActivityStopped");
759
+ }
760
+
761
+ @Override
762
+ public void onActivitySaveInstanceState(Activity activity, Bundle bundle) {
763
+ JLogger.d("onActivitySaveInstanceState");
764
+ }
765
+
766
+ @Override
767
+ public void onActivityDestroyed(Activity activity) {
768
+ JLogger.d("onActivityDestroyed");
769
+ }
770
+ });
771
+ }
772
+
773
+ }