BasePreferenceHelper.kt 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538
  1. package com.vpn.fastestvpnservice.helpers
  2. import android.app.Activity
  3. import android.content.Context
  4. import android.graphics.drawable.AdaptiveIconDrawable
  5. import android.graphics.drawable.Drawable
  6. import android.util.Log
  7. import com.google.gson.Gson
  8. import com.google.gson.GsonBuilder
  9. import com.google.gson.reflect.TypeToken
  10. import com.vpn.fastestvpnservice.R
  11. import com.vpn.fastestvpnservice.beans.*
  12. import com.vpn.fastestvpnservice.constants.AppEnum
  13. import com.vpn.fastestvpnservice.constants.splitList
  14. class BasePreferenceHelper(private val context: Context) : PreferencesHelper() {
  15. fun clearAllData() {
  16. removePreference(context, KEY_FILENAME, KEY_USER)
  17. removePreference(context, KEY_FILENAME, KEY_USER_PASSWORD)
  18. removePreference(context, KEY_FILENAME, KEY_SERVERS_DATA)
  19. // removePreference(context, KEY_FILENAME, KEY_SERVERS)
  20. removePreference(context, KEY_FILENAME, KEY_SELECTED_APPS)
  21. removePreference(context, KEY_FILENAME, KEY_SELECTED_APPS_NO_VPN)
  22. removePreference(context, KEY_FILENAME, KEY_SELECTED_APPS_NOT_ALLOW)
  23. removePreference(context, KEY_FILENAME, KEY_SPLIT_TUNNEL)
  24. removePreference(context, KEY_FILENAME, KEY_SPLIT_TUNNEL_TV)
  25. removePreference(context, KEY_FILENAME, PROTOCOL)
  26. removePreference(context, KEY_FILENAME, X_PLATFORM_TOKEN)
  27. removePreference(context, KEY_FILENAME, KEY_PRODUCT)
  28. removePreference(context, KEY_FILENAME, KEY_AVAILABLE_PROTOCOLS)
  29. removePreference(context, KEY_FILENAME, KEY_ENABLED_PROTOCOLS)
  30. removePreference(context, KEY_FILENAME, KEY_WIREGUARD)
  31. removePreference(context, KEY_FILENAME, KEY_FEATURES_DATA)
  32. removePreference(context, KEY_FILENAME, KEY_SPLIT_ENABLE_TV)
  33. removePreference(context, KEY_FILENAME, KEY_SPLIT_DISABLE_TV)
  34. removePreference(context, KEY_FILENAME, KEY_SPLIT_TUNNEL_ENTRY)
  35. removePreference(context, KEY_FILENAME, TV_SPLIT_CLASS)
  36. removePreference(context, KEY_FILENAME, KEY_ADBLOCK_SWITCH)
  37. removePreference(context, KEY_FILENAME, KEY_ISLOGGEDIN)
  38. // removePreference(context, KEY_FILENAME, THEME)
  39. removePreference(context, KEY_FILENAME, KEY_ISCONNECT)
  40. removePreference(context, KEY_FILENAME, KEY_SPLIT_POS)
  41. removePreference(context, KEY_FILENAME, FILTER)
  42. removePreference(context, KEY_FILENAME, SMART)
  43. removePreference(context, KEY_FILENAME, KEY_SMART_SERVER)
  44. removePreference(context, KEY_FILENAME, KEY_AUTO_OPENVPN)
  45. }
  46. fun saveUser(user: UserResponse) {
  47. putStringPreference(context, KEY_FILENAME, KEY_USER, Gson().toJson(user))
  48. }
  49. fun getUser(): UserResponse? {
  50. return Gson().fromJson<UserResponse>(
  51. getStringPreference(context, KEY_FILENAME, KEY_USER), UserResponse::class.java
  52. )
  53. }
  54. fun saveProduct(product: Product) {
  55. putStringPreference(context, KEY_FILENAME, KEY_PRODUCT, Gson().toJson(product))
  56. }
  57. fun getProduct(): Product? {
  58. return Gson().fromJson<Product>(
  59. getStringPreference(context, KEY_FILENAME, KEY_PRODUCT), Product::class.java
  60. )
  61. }
  62. fun saveWireGuard(wireGuard: WireGuard) {
  63. putStringPreference(context, KEY_FILENAME, KEY_WIREGUARD, Gson().toJson(wireGuard))
  64. }
  65. fun getWireGuard(): WireGuard? {
  66. return Gson().fromJson<WireGuard>(
  67. getStringPreference(context, KEY_FILENAME, KEY_WIREGUARD), WireGuard::class.java
  68. )
  69. }
  70. fun saveIpInfo(ipInfo: IpInfo) {
  71. putStringPreference(context, KEY_FILENAME, KEY_IPINFO, Gson().toJson(ipInfo))
  72. }
  73. fun getIpinfo(): IpInfo? {
  74. return Gson().fromJson<IpInfo>(
  75. getStringPreference(context, KEY_FILENAME, KEY_IPINFO), IpInfo::class.java
  76. )
  77. }
  78. fun savePassword(pass: String) {
  79. putStringPreference(context, KEY_FILENAME, KEY_USER_PASSWORD, pass)
  80. }
  81. fun getPassword(): String {
  82. return getStringPreference(context, KEY_FILENAME, KEY_USER_PASSWORD)
  83. }
  84. fun saveServerData(list: ArrayList<ServerData>) {
  85. putStringPreference(context, KEY_FILENAME, KEY_SERVERS_DATA, Gson().toJson(list))
  86. }
  87. fun getServerData(): ArrayList<ServerData> {
  88. val type = object : TypeToken<ArrayList<ServerData?>?>() {}.type
  89. return Gson().fromJson<ArrayList<ServerData>>(
  90. getStringPreference(
  91. context, KEY_FILENAME, KEY_SERVERS_DATA
  92. ), type
  93. )
  94. }
  95. fun saveFeaturesData(list: ArrayList<ProductFeatures>) {
  96. putStringPreference(context, KEY_FILENAME, KEY_FEATURES_DATA, Gson().toJson(list))
  97. }
  98. fun getFeaturesData(): List<ProductFeatures> {
  99. val type = object : TypeToken<List<ProductFeatures?>?>() {}.type
  100. return Gson().fromJson<List<ProductFeatures>>(
  101. getStringPreference(
  102. context, KEY_FILENAME, KEY_FEATURES_DATA
  103. ), type
  104. )
  105. }
  106. fun saveEnabledProtocols(list: ArrayList<String>) {
  107. putStringPreference(context, KEY_FILENAME, KEY_ENABLED_PROTOCOLS, Gson().toJson(list))
  108. }
  109. fun getEnabledProtocols(): ArrayList<String> {
  110. val type = object : TypeToken<ArrayList<String?>?>() {}.type
  111. try {
  112. return Gson().fromJson<ArrayList<String>>(
  113. getStringPreference(
  114. context, KEY_FILENAME, KEY_ENABLED_PROTOCOLS
  115. ), type
  116. )
  117. }
  118. catch (e: Exception) {
  119. val tempList = ArrayList<String>()
  120. tempList.add("WG")
  121. tempList.add("IKEV2")
  122. tempList.add("TCP")
  123. tempList.add("UDP")
  124. return tempList
  125. }
  126. }
  127. fun saveAvailableProtocols(list: ArrayList<String>) {
  128. var tempList = ArrayList<String>()
  129. if (list.contains(AppEnum.WG_PROTOCOL.key)) {
  130. tempList.add(AppEnum.WG_PROTOCOL.key)
  131. }
  132. if (list.contains(AppEnum.IKEV2_PROTOCOL.key)) {
  133. tempList.add(AppEnum.IKEV2_PROTOCOL.key)
  134. }
  135. if (list.contains(AppEnum.TCP_PROTOCOL.key)) {
  136. tempList.add(AppEnum.TCP_PROTOCOL.key)
  137. }
  138. if (list.contains(AppEnum.UDP_PROTOCOL.key)) {
  139. tempList.add(AppEnum.UDP_PROTOCOL.key)
  140. }
  141. putStringPreference(context, KEY_FILENAME, KEY_AVAILABLE_PROTOCOLS, Gson().toJson(tempList))
  142. }
  143. fun getAvailableProtocols(): ArrayList<String> {
  144. val type = object : TypeToken<ArrayList<String?>?>() {}.type
  145. return try {
  146. Gson().fromJson<ArrayList<String>>(
  147. getStringPreference(
  148. context, KEY_FILENAME, KEY_AVAILABLE_PROTOCOLS
  149. ), type
  150. )
  151. } catch (e: Exception) {
  152. val tempList = ArrayList<String>()
  153. tempList.add("WG")
  154. tempList.add("IKEV2")
  155. tempList.add("TCP")
  156. tempList.add("UDP")
  157. return tempList
  158. }
  159. }
  160. fun getEnableTvAppsSplit(): ArrayList<TvEnableApps>? {
  161. val type = object : TypeToken<ArrayList<TvEnableApps?>?>() {}.type
  162. return Gson().fromJson<ArrayList<TvEnableApps>>(
  163. getStringPreference(
  164. context, KEY_FILENAME, KEY_SPLIT_ENABLE_TV
  165. ), type
  166. )
  167. }
  168. fun setEnableTvAppsSplit(allSplitTunnelEnabled: ArrayList<TvEnableApps>?) {
  169. if (allSplitTunnelEnabled == null) {
  170. removePreference(context, KEY_FILENAME, KEY_SPLIT_ENABLE_TV)
  171. return
  172. }
  173. putStringPreference(context, KEY_FILENAME, KEY_SPLIT_ENABLE_TV, Gson().toJson(allSplitTunnelEnabled))
  174. }
  175. fun getDisableTvAppsSplit(): ArrayList<TvDisableApps>? {
  176. val type = object : TypeToken<ArrayList<TvDisableApps?>?>() {}.type
  177. return Gson().fromJson<ArrayList<TvDisableApps>>(
  178. getStringPreference(
  179. context, KEY_FILENAME, KEY_SPLIT_DISABLE_TV
  180. ), type
  181. )
  182. }
  183. fun setDisableTvAppsSplit(allSplitTunnelEnabled: ArrayList<TvDisableApps>?) {
  184. if (allSplitTunnelEnabled == null) {
  185. removePreference(context, KEY_FILENAME, KEY_SPLIT_DISABLE_TV)
  186. return
  187. }
  188. putStringPreference(context, KEY_FILENAME, KEY_SPLIT_DISABLE_TV, Gson().toJson(allSplitTunnelEnabled))
  189. }
  190. fun getSplitTunnelTvAppsName(): ArrayList<String>? {
  191. val type = object : TypeToken<ArrayList<String?>?>() {}.type
  192. return Gson().fromJson<ArrayList<String>>(
  193. getStringPreference(
  194. context, KEY_FILENAME, KEY_SPLIT_TUNNEL
  195. ), type
  196. )
  197. }
  198. fun setSplitTunnelTvAppsName(allSplitTunnelEnabled: ArrayList<String>?) {
  199. if (allSplitTunnelEnabled == null) {
  200. removePreference(context, KEY_FILENAME, KEY_SPLIT_TUNNEL)
  201. return
  202. }
  203. putStringPreference(context, KEY_FILENAME, KEY_SPLIT_TUNNEL, Gson().toJson(allSplitTunnelEnabled))
  204. }
  205. fun getSplitTunnelTvAppsPackageName(): ArrayList<String>? {
  206. val type = object : TypeToken<ArrayList<String?>?>() {}.type
  207. return Gson().fromJson<ArrayList<String>>(
  208. getStringPreference(
  209. context, KEY_FILENAME, KEY_SPLIT_TUNNEL_TV
  210. ), type
  211. )
  212. }
  213. fun setSplitTunnelTvAppsPackageName(allSplitTunnelEnabled: ArrayList<String>?) {
  214. if (allSplitTunnelEnabled == null) {
  215. removePreference(context, KEY_FILENAME, KEY_SPLIT_TUNNEL_TV)
  216. return
  217. }
  218. putStringPreference(context, KEY_FILENAME, KEY_SPLIT_TUNNEL_TV, Gson().toJson(allSplitTunnelEnabled))
  219. }
  220. fun getSplitTunnelTvAppsEntry(): ArrayList<String>? {
  221. val type = object : TypeToken<ArrayList<String?>?>() {}.type
  222. return Gson().fromJson<ArrayList<String>>(
  223. getStringPreference(
  224. context, KEY_FILENAME, KEY_SPLIT_TUNNEL_ENTRY
  225. ), type
  226. )
  227. }
  228. fun setSplitTunnelTvAppsEntry(appsEntry: ArrayList<String>?) {
  229. if (appsEntry == null) {
  230. removePreference(context, KEY_FILENAME, KEY_SPLIT_TUNNEL_ENTRY)
  231. return
  232. }
  233. putStringPreference(context, KEY_FILENAME, KEY_SPLIT_TUNNEL_ENTRY, Gson().toJson(appsEntry))
  234. }
  235. fun setInstanceActivity(activity: Activity){
  236. putStringPreference(context, KEY_FILENAME, KEY_ACTIVITY, Gson().toJson(activity))
  237. }
  238. fun getInstanceActivity(): Activity? {
  239. var activity: Activity? = null
  240. val mainActivity = getStringPreference(context, KEY_FILENAME, KEY_ACTIVITY)
  241. if (mainActivity != null){
  242. val gson = GsonBuilder().create()
  243. activity = gson.fromJson(mainActivity, Activity::class.java)
  244. }
  245. return activity
  246. }
  247. fun getServerObject(): Server? {
  248. var serverObj: Server? = null
  249. val serverObjStr: String = getStringPreference(context, KEY_FILENAME, KEY_SERVERS)
  250. if (serverObjStr != null) {
  251. val gson = GsonBuilder().create()
  252. serverObj = gson.fromJson(serverObjStr, Server::class.java)
  253. }
  254. return serverObj
  255. }
  256. fun setServerObject(serverObj: Server?) {
  257. putStringPreference(context, KEY_FILENAME, KEY_SERVERS, Gson().toJson(serverObj))
  258. }
  259. fun getSmartServerObject(): Server? {
  260. var serverObj: Server? = null
  261. val serverObjStr: String = getStringPreference(context, KEY_FILENAME, KEY_SMART_SERVER)
  262. if (serverObjStr != null) {
  263. val gson = GsonBuilder().create()
  264. serverObj = gson.fromJson(serverObjStr, Server::class.java)
  265. }
  266. return serverObj
  267. }
  268. fun setSmartServerObject(smartObj: Server?) {
  269. putStringPreference(context, KEY_FILENAME, KEY_SMART_SERVER, Gson().toJson(smartObj))
  270. }
  271. fun getSplitTunneledApps(): String? {
  272. return getStringPreference(context, KEY_FILENAME, KEY_SELECTED_APPS)
  273. }
  274. fun setSplitTunneledApps(selectedApps: String?) {
  275. if (selectedApps == null) {
  276. removePreference(context, KEY_FILENAME, KEY_SELECTED_APPS)
  277. return
  278. }
  279. putStringPreference(context, KEY_FILENAME, KEY_SELECTED_APPS, selectedApps)
  280. }
  281. fun getSplitTunneledAppsNoVpn(): String? {
  282. return getStringPreference(context, KEY_FILENAME, KEY_SELECTED_APPS_NO_VPN)
  283. }
  284. fun setSplitTunneledAppsNoVpn(selectedApps: String?) {
  285. if (selectedApps == null) {
  286. removePreference(context, KEY_FILENAME, KEY_SELECTED_APPS_NO_VPN)
  287. return
  288. }
  289. putStringPreference(context, KEY_FILENAME, KEY_SELECTED_APPS_NO_VPN, selectedApps)
  290. }
  291. fun getSplitTunneledAppsNotAllow(): String? {
  292. return getStringPreference(context, KEY_FILENAME, KEY_SELECTED_APPS_NOT_ALLOW)
  293. }
  294. fun setSplitTunneledAppsNotAllow(selectedApps: String?) {
  295. if (selectedApps == null) {
  296. removePreference(context, KEY_FILENAME, KEY_SELECTED_APPS_NOT_ALLOW)
  297. return
  298. }
  299. putStringPreference(context, KEY_FILENAME, KEY_SELECTED_APPS_NOT_ALLOW, selectedApps)
  300. }
  301. fun saveAppDetails(appDetails: String) {
  302. putStringPreference(context, KEY_FILENAME, APP_DETAILS, appDetails)
  303. }
  304. fun getAppDetails(): String {
  305. return getStringPreference(context, KEY_FILENAME, APP_DETAILS)
  306. }
  307. fun saveFileDetails(fileDetails: String) {
  308. putStringPreference(context, KEY_FILENAME, FILE_DETAILS, fileDetails)
  309. }
  310. fun getFileDetails(): String {
  311. return getStringPreference(context, KEY_FILENAME, FILE_DETAILS)
  312. }
  313. fun saveTheme(theme: String) {
  314. putStringPreference(context, KEY_FILENAME, THEME, theme)
  315. }
  316. fun getTheme(): String {
  317. return try {
  318. getStringPreference(context, KEY_FILENAME, THEME, themesList[0])
  319. } catch (ex: Exception) {
  320. themesList[0]
  321. }
  322. }
  323. fun saveFilterList(filter: String) {
  324. putStringPreference(context, KEY_FILENAME, FILTER, filter)
  325. }
  326. fun getFilterList(): String {
  327. return getStringPreference(context, KEY_FILENAME, FILTER)
  328. }
  329. fun saveSmartList(smart: String) {
  330. putStringPreference(context, KEY_FILENAME, SMART, smart)
  331. }
  332. fun getSmartList(): String {
  333. return getStringPreference(context, KEY_FILENAME, SMART)
  334. }
  335. fun saveTvSplitTunnel(tvSplitTunneling: ArrayList<TvSplitTunneling>) {
  336. putStringPreference(context, KEY_FILENAME, TV_SPLIT_CLASS, Gson().toJson(tvSplitTunneling))
  337. }
  338. fun getTvSplitTunnel(): ArrayList<TvSplitTunneling> {
  339. val tvSplitTunneling = Gson().fromJson<ArrayList<TvSplitTunneling>>(
  340. getStringPreference(context, KEY_FILENAME, TV_SPLIT_CLASS), TvSplitTunneling::class.java
  341. )
  342. return tvSplitTunneling
  343. }
  344. fun saveProtocol(protocol: Protocol) {
  345. putStringPreference(context, KEY_FILENAME, PROTOCOL, Gson().toJson(protocol))
  346. }
  347. fun getProtocol(): Protocol {
  348. var protocol = Gson().fromJson<Protocol>(
  349. getStringPreference(context, KEY_FILENAME, PROTOCOL), Protocol::class.java
  350. )
  351. protocol?.let {
  352. return protocol
  353. } ?: kotlin.run {
  354. return Protocol(
  355. AppEnum.WG_PROTOCOL.title, AppEnum.WG_PROTOCOL.key, 1
  356. // AppEnum.AUTO_PROTOCOL.title, AppEnum.IKEV2_PROTOCOL.key, 0
  357. ) //By default (AUTO) Protocol is selected (index 0 = AUTO). Checking IKEV2 first then check TCP/UDP
  358. }
  359. }
  360. // fun saveRadioBtnSplitPos(position: Int) {
  361. // putIntegerPreference(context, KEY_FILENAME, KEY_SPLIT_POS, position)
  362. // }
  363. //
  364. // fun getRadioBtnSplitPos(): Int {
  365. // return getIntegerPreference(context, KEY_FILENAME, KEY_SPLIT_POS)
  366. // }
  367. fun saveAdBlockState(status: Boolean) {
  368. putBooleanPreference(context, KEY_FILENAME, KEY_ADBLOCK_SWITCH, status)
  369. }
  370. fun getAdBlockState(): Boolean {
  371. return getBooleanPreference(context, KEY_FILENAME, KEY_ADBLOCK_SWITCH)
  372. }
  373. fun saveFcmToken(token: String) {
  374. putStringPreference(context, KEY_FILENAME, KEY_FCM, token)
  375. }
  376. fun getLoggedInState(): Boolean {
  377. return getBooleanPreference(context, KEY_FILENAME, KEY_ISLOGGEDIN)
  378. }
  379. fun setLoggedInState(state: Boolean) {
  380. putBooleanPreference(context, KEY_FILENAME, KEY_ISLOGGEDIN, state)
  381. }
  382. fun getConnectState(): Int {
  383. return getIntegerPreference(context, KEY_FILENAME, KEY_ISCONNECT)
  384. }
  385. fun setConnectState(state: Int) {
  386. putIntegerPreference(context, KEY_FILENAME, KEY_ISCONNECT, state)
  387. }
  388. fun isAutoOpenVpnConnected(): Boolean {
  389. return getBooleanPreference(context, KEY_FILENAME, KEY_AUTO_OPENVPN)
  390. }
  391. fun setAutoOpenVpnConnected(state: Boolean) {
  392. putBooleanPreference(context, KEY_FILENAME, KEY_AUTO_OPENVPN, state)
  393. }
  394. fun getFcmToken(): String {
  395. return getStringPreference(context, KEY_FILENAME, KEY_FCM)
  396. }
  397. fun saveXPlatformToken(token: String) {
  398. putStringPreference(context, KEY_FILENAME, X_PLATFORM_TOKEN, token)
  399. }
  400. fun getXPlatformToken(): String {
  401. return getStringPreference(context, KEY_FILENAME, X_PLATFORM_TOKEN)
  402. }
  403. fun saveSplitPosition(token: String) {
  404. putStringPreference(context, KEY_FILENAME, KEY_SPLIT_POS, token)
  405. }
  406. fun getSplitPosition(): String {
  407. try {
  408. return getStringPreference(context, KEY_FILENAME, KEY_SPLIT_POS)
  409. } catch (ex: Exception) {
  410. return splitList[0]
  411. }
  412. }
  413. companion object {
  414. private const val KEY_FILENAME = "file_fastestvpn"
  415. private const val KEY_USER = "keydata_user"
  416. private const val KEY_PRODUCT = "keydata_product"
  417. private const val KEY_WIREGUARD = "keydata_wireguard"
  418. private const val KEY_IPINFO = "keydata_ipinfo"
  419. private const val KEY_USER_PASSWORD = "keydata_user_password"
  420. private const val KEY_SERVERS_DATA = "keydata_servers_data"
  421. private const val KEY_FEATURES_DATA = "keydata_features_data"
  422. private const val KEY_ENABLED_PROTOCOLS = "keydata_enabled_protocols"
  423. private const val KEY_AVAILABLE_PROTOCOLS = "keydata_available_protocols"
  424. private const val KEY_SERVERS = "keydata_server"
  425. private const val KEY_SELECTED_APPS = "keydata_selectedApps"
  426. private const val KEY_SELECTED_APPS_NO_VPN = "keydata_selectedAppsNoVpn"
  427. private const val KEY_SELECTED_APPS_NOT_ALLOW = "keydata_selectedAppsNotAllow"
  428. private const val KEY_SPLIT_TUNNEL = "keydata_tv_apps_name"
  429. private const val KEY_SPLIT_TUNNEL_TV = "keydata_tv_apps_package_name"
  430. private const val KEY_SPLIT_ENABLE_TV = "keydata_tv_apps_enable"
  431. private const val KEY_SPLIT_DISABLE_TV = "keydata_tv_apps_disable"
  432. private const val KEY_SPLIT_TUNNEL_ENTRY = "keydata_tv_apps_entry"
  433. private const val APP_DETAILS = "keydata_app_detail"
  434. private const val FILE_DETAILS = "keydata_file_details"
  435. private const val PROTOCOL = "keydata_protocol"
  436. private const val TV_SPLIT_CLASS = "keydata_tvsplitclass"
  437. private const val X_PLATFORM_TOKEN = "keydata_x_platform_token"
  438. private const val KEY_FCM = "keydata_fcm"
  439. private const val KEY_SPLIT_POS = "keydata_split_pos"
  440. private const val KEY_ACTIVITY = "keydata_activity"
  441. private const val KEY_ADBLOCK_SWITCH = "keydata_adblock"
  442. private const val KEY_ISLOGGEDIN = "key_isloggedin"
  443. private const val THEME = "key_theme"
  444. private const val KEY_ISCONNECT = "keydata_isconnect"
  445. private const val FILTER = "keydata_filter"
  446. private const val SMART = "keydata_smart"
  447. private const val KEY_SMART_SERVER = "keydata_smart_server"
  448. private const val KEY_AUTO_OPENVPN = "keydata_auto_openvpn"
  449. }
  450. }