@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,737 @@
1
+ package cn.jiguang.core;
2
+
3
+ import android.content.Context;
4
+ import android.content.SharedPreferences;
5
+ import android.content.pm.ApplicationInfo;
6
+ import android.content.pm.PackageManager;
7
+ import android.os.Bundle;
8
+ import android.provider.Settings;
9
+ import java.util.ArrayList;
10
+ import java.util.Collection;
11
+ import java.util.Collections;
12
+ import java.util.HashMap;
13
+ import java.util.HashSet;
14
+ import java.util.Iterator;
15
+ import java.util.LinkedHashSet;
16
+ import java.util.List;
17
+ import java.util.Map;
18
+ import java.util.Set;
19
+ import java.util.UUID;
20
+ import java.util.concurrent.ConcurrentHashMap;
21
+ import java.util.concurrent.atomic.AtomicInteger;
22
+ import org.json.JSONObject;
23
+
24
+ public final class JCoreStorage {
25
+ private static final String PREFS_NAME = "cn.jiguang.sdk.clean.prefs";
26
+ private static final String KEY_APP_KEY = "app_key";
27
+ private static final String KEY_CHANNEL = "channel";
28
+ private static final String KEY_UID = "uid";
29
+ private static final String KEY_PASSWORD = "password";
30
+ private static final String KEY_REG_ID = "registration_id";
31
+ private static final String KEY_DEVICE_ID = "device_id";
32
+ private static final String KEY_SERVER_REGISTERED = "server_registered";
33
+ private static final String KEY_PUSH_STOPPED = "push_stopped";
34
+ private static final String KEY_COLLECTION_AUTH = "collection_auth";
35
+ private static final String KEY_DEBUG_MODE = "debug_mode";
36
+ private static final String KEY_TAGS = "tags";
37
+ private static final String KEY_ALIAS = "alias";
38
+ private static final String KEY_PROPERTIES = "properties_json";
39
+ private static final String KEY_MOBILE_NUMBER = "mobile_number";
40
+ private static final String KEY_CONNECTED = "tcp_connected";
41
+ private static final String KEY_COUNTRY_CODE = "country_code";
42
+ private static final String KEY_LOCAL_LOG_ENABLED = "local_log_enabled";
43
+ private static final String KEY_SIS_RAW_JSON = "sis_raw_json";
44
+ private static final String KEY_SIS_IPS = "sis_ips_list";
45
+ private static final String KEY_SIS_SSL_IPS = "sis_ssl_ips_list";
46
+ private static final String KEY_SIS_UDP_IPS = "sis_udp_ips_list";
47
+ private static final String KEY_SIS_HTTP_REPORT = "sis_http_report_list";
48
+ private static final String KEY_SIS_HTTPS_REPORT = "sis_https_report_list";
49
+ private static final String KEY_SIS_TCP_REPORT = "sis_tcp_report_list";
50
+ private static final String KEY_SIS_CERT_VER = "sis_cert_ver";
51
+ private static final String KEY_SIS_DATA_REPORT = "sis_data_report";
52
+ private static final String KEY_FAILED_IPS = "sis_failed_ips";
53
+ private static final String KEY_LAST_GOOD_IP = "sis_last_good_ip";
54
+ private static final String KEY_THIRD_TOKEN_PREFIX = "third_token_";
55
+ private static final String KEY_LATEST_NOTIFICATION_NUM = "latest_notification_num";
56
+ private static final String KEY_PUSH_TIME_CONFIGURED = "push_time_configured";
57
+ private static final String KEY_PUSH_TIME_DAYS = "push_time_days";
58
+ private static final String KEY_PUSH_TIME_START_HOUR = "push_time_start_hour";
59
+ private static final String KEY_PUSH_TIME_END_HOUR = "push_time_end_hour";
60
+ private static final String KEY_SILENCE_TIME_ENABLED = "silence_time_enabled";
61
+ private static final String KEY_SILENCE_START_HOUR = "silence_start_hour";
62
+ private static final String KEY_SILENCE_START_MIN = "silence_start_min";
63
+ private static final String KEY_SILENCE_END_HOUR = "silence_end_hour";
64
+ private static final String KEY_SILENCE_END_MIN = "silence_end_min";
65
+
66
+ private static final int MAX_LOCAL_LOG_CHARS = 32768;
67
+ private static final AtomicInteger REQUEST_ID = new AtomicInteger(100);
68
+ private static final Map<String, Object> MEMORY_FALLBACK = new ConcurrentHashMap<String, Object>();
69
+ private static final StringBuilder LOCAL_LOG_BUFFER = new StringBuilder();
70
+ private static volatile Context sAppContext;
71
+ private static volatile boolean sDebugMode = false;
72
+
73
+ private JCoreStorage() {
74
+ }
75
+
76
+ private static boolean isEmpty(String value) {
77
+ return value == null || value.isEmpty();
78
+ }
79
+
80
+ public static void setAppContext(Context context) {
81
+ if (context != null && sAppContext == null) {
82
+ try {
83
+ Context app = context.getApplicationContext();
84
+ sAppContext = app != null ? app : context;
85
+ } catch (Throwable ignored) {
86
+ sAppContext = context;
87
+ }
88
+ }
89
+ }
90
+
91
+ public static Context getAppContext(Context fallback) {
92
+ if (sAppContext != null) {
93
+ return sAppContext;
94
+ }
95
+ if (fallback != null) {
96
+ setAppContext(fallback);
97
+ return sAppContext;
98
+ }
99
+ return null;
100
+ }
101
+
102
+ private static SharedPreferences prefs(Context context) {
103
+ Context resolved = getAppContext(context);
104
+ if (resolved == null) {
105
+ return null;
106
+ }
107
+ try {
108
+ return resolved.getSharedPreferences(PREFS_NAME, Context.MODE_PRIVATE);
109
+ } catch (Throwable ignored) {
110
+ return null;
111
+ }
112
+ }
113
+
114
+ public static String getSpValue(Context context, String key, String defaultVal) {
115
+ if (isEmpty(key)) {
116
+ return defaultVal;
117
+ }
118
+ return getStringPref(context, key, defaultVal);
119
+ }
120
+
121
+ public static void putSpValue(Context context, String key, String value) {
122
+ if (isEmpty(key)) {
123
+ return;
124
+ }
125
+ putStringPref(context, key, value);
126
+ }
127
+
128
+ private static String getStringPref(Context context, String key, String defaultVal) {
129
+ Object mem = MEMORY_FALLBACK.get(key);
130
+ if (mem instanceof String) {
131
+ return (String) mem;
132
+ }
133
+ SharedPreferences sp = prefs(context);
134
+ if (sp != null) {
135
+ try {
136
+ String v = sp.getString(key, null);
137
+ if (v != null) {
138
+ MEMORY_FALLBACK.put(key, v);
139
+ return v;
140
+ }
141
+ } catch (Throwable ignored) {
142
+ }
143
+ }
144
+ return defaultVal;
145
+ }
146
+
147
+ private static void putStringPref(Context context, String key, String value) {
148
+ String safe = value != null ? value : "";
149
+ MEMORY_FALLBACK.put(key, safe);
150
+ SharedPreferences sp = prefs(context);
151
+ if (sp != null) {
152
+ try {
153
+ sp.edit().putString(key, safe).apply();
154
+ } catch (Throwable ignored) {
155
+ }
156
+ }
157
+ }
158
+
159
+ private static long getLongPref(Context context, String key, long defaultVal) {
160
+ Object mem = MEMORY_FALLBACK.get(key);
161
+ if (mem instanceof Number) {
162
+ return ((Number) mem).longValue();
163
+ }
164
+ SharedPreferences sp = prefs(context);
165
+ if (sp != null) {
166
+ try {
167
+ long v = sp.getLong(key, Long.MIN_VALUE);
168
+ if (v != Long.MIN_VALUE) {
169
+ MEMORY_FALLBACK.put(key, v);
170
+ return v;
171
+ }
172
+ } catch (Throwable ignored) {
173
+ }
174
+ }
175
+ return defaultVal;
176
+ }
177
+
178
+ private static void putLongPref(Context context, String key, long value) {
179
+ MEMORY_FALLBACK.put(key, value);
180
+ SharedPreferences sp = prefs(context);
181
+ if (sp != null) {
182
+ try {
183
+ sp.edit().putLong(key, value).apply();
184
+ } catch (Throwable ignored) {
185
+ }
186
+ }
187
+ }
188
+
189
+ private static boolean getBooleanPref(Context context, String key, boolean defaultVal) {
190
+ Object mem = MEMORY_FALLBACK.get(key);
191
+ if (mem instanceof Boolean) {
192
+ return (Boolean) mem;
193
+ }
194
+ SharedPreferences sp = prefs(context);
195
+ if (sp != null) {
196
+ try {
197
+ return sp.getBoolean(key, defaultVal);
198
+ } catch (Throwable ignored) {
199
+ }
200
+ }
201
+ return defaultVal;
202
+ }
203
+
204
+ private static void putBooleanPref(Context context, String key, boolean value) {
205
+ MEMORY_FALLBACK.put(key, value);
206
+ SharedPreferences sp = prefs(context);
207
+ if (sp != null) {
208
+ try {
209
+ sp.edit().putBoolean(key, value).apply();
210
+ } catch (Throwable ignored) {
211
+ }
212
+ }
213
+ }
214
+
215
+ public static int nextRid() {
216
+ int val = REQUEST_ID.incrementAndGet();
217
+ if (val <= 0 || val >= 65535) {
218
+ REQUEST_ID.set(100);
219
+ return 100;
220
+ }
221
+ return val;
222
+ }
223
+
224
+ public static void setDebugMode(boolean debug) {
225
+ sDebugMode = debug;
226
+ putBooleanPref(null, KEY_DEBUG_MODE, debug);
227
+ }
228
+
229
+ public static boolean isDebugMode() {
230
+ return getBooleanPref(null, KEY_DEBUG_MODE, sDebugMode);
231
+ }
232
+
233
+ public static void setCollectionAuth(Context context, boolean auth) {
234
+ putBooleanPref(context, KEY_COLLECTION_AUTH, auth);
235
+ }
236
+
237
+ public static boolean isCollectionAuth(Context context) {
238
+ return getBooleanPref(context, KEY_COLLECTION_AUTH, true);
239
+ }
240
+
241
+ public static String getAppKey(Context context) {
242
+ String cached = getStringPref(context, KEY_APP_KEY, "");
243
+ if (!isEmpty(cached)) {
244
+ return cached;
245
+ }
246
+ Context resolved = getAppContext(context);
247
+ if (resolved != null) {
248
+ try {
249
+ ApplicationInfo info = resolved.getPackageManager()
250
+ .getApplicationInfo(resolved.getPackageName(), PackageManager.GET_META_DATA);
251
+ Bundle meta = info != null ? info.metaData : null;
252
+ if (meta != null) {
253
+ String key = meta.getString("JPUSH_APPKEY");
254
+ if (!isEmpty(key)) {
255
+ if (key.contains("=")) {
256
+ key = key.substring(key.indexOf('=') + 1).trim();
257
+ }
258
+ putStringPref(context, KEY_APP_KEY, key);
259
+ return key;
260
+ }
261
+ }
262
+ } catch (Throwable ignored) {
263
+ }
264
+ }
265
+ return "";
266
+ }
267
+
268
+ public static void setAppKey(Context context, String appKey) {
269
+ if (!isEmpty(appKey)) {
270
+ putStringPref(context, KEY_APP_KEY, appKey);
271
+ }
272
+ }
273
+
274
+ public static String getChannel(Context context) {
275
+ String cached = getStringPref(context, KEY_CHANNEL, "");
276
+ if (!isEmpty(cached)) {
277
+ return cached;
278
+ }
279
+ Context resolved = getAppContext(context);
280
+ if (resolved != null) {
281
+ try {
282
+ ApplicationInfo info = resolved.getPackageManager()
283
+ .getApplicationInfo(resolved.getPackageName(), PackageManager.GET_META_DATA);
284
+ Bundle meta = info != null ? info.metaData : null;
285
+ if (meta != null) {
286
+ String channel = meta.getString("JPUSH_CHANNEL");
287
+ if (!isEmpty(channel)) {
288
+ return channel;
289
+ }
290
+ }
291
+ } catch (Throwable ignored) {
292
+ }
293
+ }
294
+ return "developer-default";
295
+ }
296
+
297
+ public static void setChannel(Context context, String channel) {
298
+ if (channel != null) {
299
+ putStringPref(context, KEY_CHANNEL, channel);
300
+ }
301
+ }
302
+
303
+ public static void setCountryCode(Context context, String countryCode) {
304
+ putStringPref(context, KEY_COUNTRY_CODE, countryCode != null ? countryCode : "");
305
+ }
306
+
307
+ public static String getCountryCode(Context context) {
308
+ return getStringPref(context, KEY_COUNTRY_CODE, "");
309
+ }
310
+
311
+ public static void enableSDKLocalLog(Context context, boolean enable, boolean uploadToServer) {
312
+ putBooleanPref(context, KEY_LOCAL_LOG_ENABLED, enable);
313
+ if (enable) {
314
+ appendLocalLog("SDKLocalLog enabled (upload=" + uploadToServer + ")");
315
+ }
316
+ }
317
+
318
+ public static boolean isLocalLogEnabled(Context context) {
319
+ return getBooleanPref(context, KEY_LOCAL_LOG_ENABLED, false);
320
+ }
321
+
322
+ public static synchronized void appendLocalLog(String line) {
323
+ if (line != null && !line.isEmpty()) {
324
+ if (LOCAL_LOG_BUFFER.length() > 0) {
325
+ LOCAL_LOG_BUFFER.append('\n');
326
+ }
327
+ LOCAL_LOG_BUFFER.append(line);
328
+ if (LOCAL_LOG_BUFFER.length() > MAX_LOCAL_LOG_CHARS) {
329
+ int excess = LOCAL_LOG_BUFFER.length() - MAX_LOCAL_LOG_CHARS;
330
+ int newlineIdx = LOCAL_LOG_BUFFER.indexOf("\n", excess);
331
+ if (newlineIdx >= 0 && newlineIdx + 1 < LOCAL_LOG_BUFFER.length()) {
332
+ LOCAL_LOG_BUFFER.delete(0, newlineIdx + 1);
333
+ } else {
334
+ LOCAL_LOG_BUFFER.delete(0, excess);
335
+ }
336
+ }
337
+ }
338
+ }
339
+
340
+ public static synchronized String readNewLogs(Context context) {
341
+ String logs = LOCAL_LOG_BUFFER.toString();
342
+ LOCAL_LOG_BUFFER.setLength(0);
343
+ return logs;
344
+ }
345
+
346
+ public static synchronized void ensureRegistration(Context context) {
347
+ String deviceId = getStringPref(context, KEY_DEVICE_ID, "");
348
+ if (!isEmpty(deviceId)) {
349
+ return;
350
+ }
351
+
352
+ Context resolved = getAppContext(context);
353
+ String seed = "";
354
+ if (resolved != null) {
355
+ try {
356
+ seed = Settings.Secure.getString(resolved.getContentResolver(), Settings.Secure.ANDROID_ID);
357
+ } catch (Throwable ignored) {
358
+ }
359
+ }
360
+ if (isEmpty(seed)) {
361
+ seed = UUID.randomUUID().toString();
362
+ }
363
+ String hash = JCoreCrypto.md5Hex(getAppKey(context) + ":" + seed);
364
+ deviceId = hash.substring(0, Math.min(24, hash.length()));
365
+ putStringPref(context, KEY_DEVICE_ID, deviceId);
366
+ }
367
+
368
+ public static synchronized void updateRegistration(Context context, long uid, String password, String regId) {
369
+ updateRegistration(context, uid, password, regId, null);
370
+ }
371
+
372
+ public static synchronized void updateRegistration(
373
+ Context context,
374
+ long uid,
375
+ String password,
376
+ String regId,
377
+ String deviceId
378
+ ) {
379
+ if (uid > 0L) {
380
+ putLongPref(context, KEY_UID, uid);
381
+ }
382
+ if (!isEmpty(password)) {
383
+ putStringPref(context, KEY_PASSWORD, password);
384
+ }
385
+ if (!isEmpty(regId)) {
386
+ putStringPref(context, KEY_REG_ID, regId);
387
+ }
388
+ if (!isEmpty(deviceId)) {
389
+ putStringPref(context, KEY_DEVICE_ID, deviceId);
390
+ }
391
+ }
392
+
393
+ public static synchronized void clearRegistration(Context context) {
394
+ putBooleanPref(context, KEY_SERVER_REGISTERED, false);
395
+ putLongPref(context, KEY_UID, 0L);
396
+ putStringPref(context, KEY_PASSWORD, "");
397
+ putStringPref(context, KEY_REG_ID, "");
398
+ }
399
+
400
+ public static boolean isServerRegistered(Context context) {
401
+ return getBooleanPref(context, KEY_SERVER_REGISTERED, false);
402
+ }
403
+
404
+ public static void setServerRegistered(Context context, boolean registered) {
405
+ putBooleanPref(context, KEY_SERVER_REGISTERED, registered);
406
+ }
407
+
408
+ public static long getUid(Context context) {
409
+ return getLongPref(context, KEY_UID, 0L);
410
+ }
411
+
412
+ public static String getPassword(Context context) {
413
+ return getStringPref(context, KEY_PASSWORD, "");
414
+ }
415
+
416
+ public static String getRegistrationId(Context context) {
417
+ return getStringPref(context, KEY_REG_ID, "");
418
+ }
419
+
420
+ public static String getDeviceId(Context context) {
421
+ ensureRegistration(context);
422
+ return getStringPref(context, KEY_DEVICE_ID, "");
423
+ }
424
+
425
+ public static boolean isPushStopped(Context context) {
426
+ return getBooleanPref(context, KEY_PUSH_STOPPED, false);
427
+ }
428
+
429
+ public static void setPushStopped(Context context, boolean stopped) {
430
+ putBooleanPref(context, KEY_PUSH_STOPPED, stopped);
431
+ }
432
+
433
+ public static boolean isConnected(Context context) {
434
+ return getBooleanPref(context, KEY_CONNECTED, false);
435
+ }
436
+
437
+ public static void setConnected(Context context, boolean connected) {
438
+ putBooleanPref(context, KEY_CONNECTED, connected);
439
+ }
440
+
441
+ public static void saveSisConfig(Context context, String rawJson) {
442
+ if (isEmpty(rawJson)) {
443
+ return;
444
+ }
445
+ putStringPref(context, KEY_SIS_RAW_JSON, rawJson);
446
+ saveCsvSet(context, KEY_SIS_IPS, JCoreWireCodec.extractJsonStringArray(rawJson, "ips"));
447
+ saveCsvSet(context, KEY_SIS_SSL_IPS, JCoreWireCodec.extractJsonStringArray(rawJson, "ssl_ips"));
448
+ saveCsvSet(context, KEY_SIS_UDP_IPS, JCoreWireCodec.extractJsonStringArray(rawJson, "sis_ips"));
449
+ saveCsvSet(context, KEY_SIS_HTTP_REPORT, JCoreWireCodec.extractJsonStringArray(rawJson, "http_report"));
450
+ saveCsvSet(context, KEY_SIS_HTTPS_REPORT, JCoreWireCodec.extractJsonStringArray(rawJson, "https_report"));
451
+ saveCsvSet(context, KEY_SIS_TCP_REPORT, JCoreWireCodec.extractJsonStringArray(rawJson, "tcp_report"));
452
+ putLongPref(context, KEY_SIS_CERT_VER, JCoreWireCodec.extractJsonInt(rawJson, "cert_ver", 1));
453
+ putBooleanPref(context, KEY_SIS_DATA_REPORT, rawJson.contains("\"data_report\":true") || rawJson.contains("\"data_report\":1"));
454
+ }
455
+
456
+ public static void resetSisCache(Context context) {
457
+ putStringPref(context, KEY_SIS_RAW_JSON, "");
458
+ putStringPref(context, KEY_SIS_IPS, "");
459
+ putStringPref(context, KEY_SIS_SSL_IPS, "");
460
+ putStringPref(context, KEY_SIS_UDP_IPS, "");
461
+ putStringPref(context, KEY_LAST_GOOD_IP, "");
462
+ putStringPref(context, KEY_FAILED_IPS, "");
463
+ }
464
+
465
+ public static List<String> getSisSslIps(Context context) {
466
+ return loadCsvList(context, KEY_SIS_SSL_IPS);
467
+ }
468
+
469
+ public static List<String> getSisIps(Context context) {
470
+ return loadCsvList(context, KEY_SIS_IPS);
471
+ }
472
+
473
+ public static List<String> getSisUdpIps(Context context) {
474
+ return loadCsvList(context, KEY_SIS_UDP_IPS);
475
+ }
476
+
477
+ public static List<String> getSisHttpReportIps(Context context) {
478
+ return loadCsvList(context, KEY_SIS_HTTP_REPORT);
479
+ }
480
+
481
+ public static List<String> getSisHttpsReportIps(Context context) {
482
+ return loadCsvList(context, KEY_SIS_HTTPS_REPORT);
483
+ }
484
+
485
+ public static int getSisCertVer(Context context) {
486
+ return (int) getLongPref(context, KEY_SIS_CERT_VER, 1L);
487
+ }
488
+
489
+ public static boolean getSisDataReport(Context context) {
490
+ return getBooleanPref(context, KEY_SIS_DATA_REPORT, false);
491
+ }
492
+
493
+ public static void setLastGoodIp(Context context, String ipPort) {
494
+ putStringPref(context, KEY_LAST_GOOD_IP, ipPort != null ? ipPort : "");
495
+ }
496
+
497
+ public static String getLastGoodIp(Context context) {
498
+ return getStringPref(context, KEY_LAST_GOOD_IP, "");
499
+ }
500
+
501
+ public static synchronized void recordFailedIp(Context context, String ipPort) {
502
+ if (isEmpty(ipPort)) {
503
+ return;
504
+ }
505
+ Set<String> set = new LinkedHashSet<String>(loadCsvList(context, KEY_FAILED_IPS));
506
+ set.add(ipPort);
507
+ saveCsvSet(context, KEY_FAILED_IPS, set);
508
+ }
509
+
510
+ public static synchronized List<String> getFailedIps(Context context) {
511
+ return loadCsvList(context, KEY_FAILED_IPS);
512
+ }
513
+
514
+ public static synchronized void clearFailedIps(Context context) {
515
+ putStringPref(context, KEY_FAILED_IPS, "");
516
+ }
517
+
518
+ private static void saveCsvSet(Context context, String key, Collection<String> items) {
519
+ if (items == null || items.isEmpty()) {
520
+ putStringPref(context, key, "");
521
+ return;
522
+ }
523
+ StringBuilder sb = new StringBuilder();
524
+ for (String item : items) {
525
+ if (isEmpty(item)) {
526
+ continue;
527
+ }
528
+ if (sb.length() > 0) {
529
+ sb.append(',');
530
+ }
531
+ sb.append(item.trim());
532
+ }
533
+ putStringPref(context, key, sb.toString());
534
+ }
535
+
536
+ private static List<String> loadCsvList(Context context, String key) {
537
+ String raw = getStringPref(context, key, "");
538
+ if (isEmpty(raw)) {
539
+ return Collections.emptyList();
540
+ }
541
+ String[] parts = raw.split(",");
542
+ List<String> out = new ArrayList<String>(parts.length);
543
+ for (String p : parts) {
544
+ String trimmed = p.trim();
545
+ if (!trimmed.isEmpty()) {
546
+ out.add(trimmed);
547
+ }
548
+ }
549
+ return out;
550
+ }
551
+
552
+ public static void saveThirdToken(Context context, byte platform, String token) {
553
+ putStringPref(context, KEY_THIRD_TOKEN_PREFIX + (platform & 0xFF), token != null ? token : "");
554
+ }
555
+
556
+ public static String getThirdToken(Context context, byte platform) {
557
+ return getStringPref(context, KEY_THIRD_TOKEN_PREFIX + (platform & 0xFF), "");
558
+ }
559
+
560
+ @SuppressWarnings("unchecked")
561
+ public static Set<String> getTags(Context context) {
562
+ Object mem = MEMORY_FALLBACK.get(KEY_TAGS);
563
+ if (mem instanceof Set) {
564
+ return new HashSet<String>((Set<String>) mem);
565
+ }
566
+ SharedPreferences sp = prefs(context);
567
+ if (sp != null) {
568
+ try {
569
+ Set<String> saved = sp.getStringSet(KEY_TAGS, null);
570
+ if (saved != null) {
571
+ return new HashSet<String>(saved);
572
+ }
573
+ } catch (Throwable ignored) {
574
+ }
575
+ }
576
+ return new HashSet<String>();
577
+ }
578
+
579
+ public static void saveTags(Context context, Set<String> tags) {
580
+ Set<String> copy = tags != null ? new HashSet<String>(tags) : Collections.<String>emptySet();
581
+ MEMORY_FALLBACK.put(KEY_TAGS, copy);
582
+ SharedPreferences sp = prefs(context);
583
+ if (sp != null) {
584
+ try {
585
+ sp.edit().putStringSet(KEY_TAGS, copy).apply();
586
+ } catch (Throwable ignored) {
587
+ }
588
+ }
589
+ }
590
+
591
+ public static String getAlias(Context context) {
592
+ return getStringPref(context, KEY_ALIAS, "");
593
+ }
594
+
595
+ public static void saveAlias(Context context, String alias) {
596
+ putStringPref(context, KEY_ALIAS, alias != null ? alias : "");
597
+ }
598
+
599
+ @SuppressWarnings("unchecked")
600
+ public static Map<String, Object> getProperties(Context context) {
601
+ Object mem = MEMORY_FALLBACK.get(KEY_PROPERTIES);
602
+ if (mem instanceof Map) {
603
+ return new HashMap<String, Object>((Map<String, Object>) mem);
604
+ }
605
+ Map<String, Object> result = new HashMap<String, Object>();
606
+ String raw = getStringPref(context, KEY_PROPERTIES, "");
607
+ if (isEmpty(raw)) {
608
+ return result;
609
+ }
610
+ try {
611
+ JSONObject json = new JSONObject(raw);
612
+ Iterator<String> keys = json.keys();
613
+ while (keys.hasNext()) {
614
+ String k = keys.next();
615
+ result.put(k, json.opt(k));
616
+ }
617
+ } catch (Throwable ignored) {
618
+ }
619
+ return result;
620
+ }
621
+
622
+ public static void saveProperties(Context context, Map<String, Object> props) {
623
+ if (props == null || props.isEmpty()) {
624
+ MEMORY_FALLBACK.remove(KEY_PROPERTIES);
625
+ SharedPreferences sp = prefs(context);
626
+ if (sp != null) {
627
+ try {
628
+ sp.edit().remove(KEY_PROPERTIES).apply();
629
+ } catch (Throwable ignored) {
630
+ }
631
+ }
632
+ return;
633
+ }
634
+ MEMORY_FALLBACK.put(KEY_PROPERTIES, new HashMap<String, Object>(props));
635
+ try {
636
+ JSONObject json = new JSONObject(props);
637
+ putStringPref(context, KEY_PROPERTIES, json.toString());
638
+ } catch (Throwable ignored) {
639
+ }
640
+ }
641
+
642
+ public static String getMobileNumber(Context context) {
643
+ return getStringPref(context, KEY_MOBILE_NUMBER, "");
644
+ }
645
+
646
+ public static void saveMobileNumber(Context context, String mobileNumber) {
647
+ putStringPref(context, KEY_MOBILE_NUMBER, mobileNumber != null ? mobileNumber : "");
648
+ }
649
+
650
+ public static void setLatestNotificationNumber(Context context, int maxNum) {
651
+ if (maxNum > 0) {
652
+ putLongPref(context, KEY_LATEST_NOTIFICATION_NUM, maxNum);
653
+ }
654
+ }
655
+
656
+ public static int getLatestNotificationNumber(Context context) {
657
+ long val = getLongPref(context, KEY_LATEST_NOTIFICATION_NUM, 5L);
658
+ return val > 0L ? (int) val : 5;
659
+ }
660
+
661
+ public static void setPushTime(Context context, Set<Integer> days, int startHour, int endHour) {
662
+ if (days == null) {
663
+ putBooleanPref(context, KEY_PUSH_TIME_CONFIGURED, false);
664
+ putStringPref(context, KEY_PUSH_TIME_DAYS, "");
665
+ return;
666
+ }
667
+ if (startHour < 0 || startHour > 23 || endHour < 0 || endHour > 23 || endHour < startHour) {
668
+ return;
669
+ }
670
+ List<String> validDays = new ArrayList<String>();
671
+ for (Integer day : days) {
672
+ if (day != null && day >= 0 && day <= 6) {
673
+ validDays.add(String.valueOf(day));
674
+ }
675
+ }
676
+ putBooleanPref(context, KEY_PUSH_TIME_CONFIGURED, true);
677
+ saveCsvSet(context, KEY_PUSH_TIME_DAYS, validDays);
678
+ putLongPref(context, KEY_PUSH_TIME_START_HOUR, startHour);
679
+ putLongPref(context, KEY_PUSH_TIME_END_HOUR, endHour);
680
+ }
681
+
682
+ public static boolean isPushTimeAllowed(Context context, int dayOfWeekZeroBasedSunday, int hourOfDay) {
683
+ if (!getBooleanPref(context, KEY_PUSH_TIME_CONFIGURED, false)) {
684
+ return true;
685
+ }
686
+ List<String> allowedDays = loadCsvList(context, KEY_PUSH_TIME_DAYS);
687
+ if (!allowedDays.contains(String.valueOf(dayOfWeekZeroBasedSunday))) {
688
+ return false;
689
+ }
690
+ int startHour = (int) getLongPref(context, KEY_PUSH_TIME_START_HOUR, 0L);
691
+ int endHour = (int) getLongPref(context, KEY_PUSH_TIME_END_HOUR, 23L);
692
+ return hourOfDay >= startHour && hourOfDay <= endHour;
693
+ }
694
+
695
+ public static void setSilenceTime(
696
+ Context context,
697
+ int startHour,
698
+ int startMinute,
699
+ int endHour,
700
+ int endMinute
701
+ ) {
702
+ if (startHour == 0 && startMinute == 0 && endHour == 0 && endMinute == 0) {
703
+ putBooleanPref(context, KEY_SILENCE_TIME_ENABLED, false);
704
+ return;
705
+ }
706
+ if (startHour < 0 || startHour > 23 || startMinute < 0 || startMinute > 59
707
+ || endHour < 0 || endHour > 23 || endMinute < 0 || endMinute > 59) {
708
+ return;
709
+ }
710
+ putBooleanPref(context, KEY_SILENCE_TIME_ENABLED, true);
711
+ putLongPref(context, KEY_SILENCE_START_HOUR, startHour);
712
+ putLongPref(context, KEY_SILENCE_START_MIN, startMinute);
713
+ putLongPref(context, KEY_SILENCE_END_HOUR, endHour);
714
+ putLongPref(context, KEY_SILENCE_END_MIN, endMinute);
715
+ }
716
+
717
+ public static boolean isInSilenceTime(Context context, int hourOfDay, int minute) {
718
+ if (!getBooleanPref(context, KEY_SILENCE_TIME_ENABLED, false)) {
719
+ return false;
720
+ }
721
+ int startHour = (int) getLongPref(context, KEY_SILENCE_START_HOUR, 0L);
722
+ int startMin = (int) getLongPref(context, KEY_SILENCE_START_MIN, 0L);
723
+ int endHour = (int) getLongPref(context, KEY_SILENCE_END_HOUR, 0L);
724
+ int endMin = (int) getLongPref(context, KEY_SILENCE_END_MIN, 0L);
725
+
726
+ int currentTotal = hourOfDay * 60 + minute;
727
+ int startTotal = startHour * 60 + startMin;
728
+ int endTotal = endHour * 60 + endMin;
729
+ if (startTotal == endTotal) {
730
+ return false;
731
+ }
732
+ if (startTotal < endTotal) {
733
+ return currentTotal >= startTotal && currentTotal <= endTotal;
734
+ }
735
+ return currentTotal >= startTotal || currentTotal <= endTotal;
736
+ }
737
+ }