Api.kt 7.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167
  1. package io.nexilis.service
  2. import android.app.Activity
  3. import android.content.Context
  4. import android.content.Intent
  5. import android.os.Build
  6. import android.util.Base64
  7. import android.util.Log
  8. import android.widget.Toast
  9. import com.google.firebase.Firebase
  10. import com.google.firebase.FirebaseApp
  11. import com.google.firebase.FirebaseOptions
  12. import com.google.firebase.app
  13. import com.google.firebase.initialize
  14. import io.newuniverse.SDK.nuSDKService
  15. import io.nexilis.service.core.Data
  16. import io.nexilis.service.core.Network
  17. import io.nexilis.service.core.api
  18. import io.nexilis.service.core.decrypt
  19. import io.nexilis.service.core.domain
  20. import io.nexilis.service.core.isLogin
  21. import io.nexilis.service.core.pref
  22. import io.nexilis.service.core.pin
  23. import io.nexilis.service.core.session
  24. import kotlinx.coroutines.launch
  25. import org.json.JSONObject
  26. import java.security.SecureRandom
  27. import java.util.Locale
  28. import java.util.concurrent.TimeUnit
  29. import java.util.concurrent.locks.Condition
  30. import java.util.concurrent.locks.ReentrantLock
  31. import kotlin.concurrent.withLock
  32. class Api {
  33. companion object {
  34. internal val lock = ReentrantLock()
  35. internal var condition: Condition? = null
  36. fun connect(account: String, activity: Activity) {
  37. Log.d(tag, "connect:$account")
  38. activity.startService(Intent(activity, nuSDKService::class.java))
  39. Thread {
  40. try {
  41. val urlData = Network().getSync("https://nexilis.io/dipp/NuN1v3rs3/Qm3r4i0/get_ip_domain?account=$account") ?: return@Thread
  42. Log.d(tag, "urlData:${urlData}")
  43. val decode = Base64.decode(urlData, Base64.DEFAULT).toString(Charsets.UTF_8)
  44. val json = JSONObject(decode.decrypt())
  45. val arrayAddress = json.getJSONArray("address")
  46. val domain = json.getString("domain")
  47. val address = arrayAddress.getJSONObject(0)
  48. val ip = address.getString("ip")
  49. val port = address.getString("portA").toInt()
  50. activity.pref().domain = domain
  51. Log.d(tag, "domain:${activity.pref().domain}")
  52. val options = FirebaseOptions.Builder()
  53. .setProjectId("push-kit-de2e3")
  54. .setApplicationId("1:36827599888:android:29e65c0ec8a560c5916695")
  55. .setApiKey("AIzaSyCLMlbL2GSDy7RVpw0dS55efV2uljB3R2U")
  56. .build()
  57. try {
  58. Firebase.app(FirebaseApp.DEFAULT_APP_NAME)
  59. Firebase.initialize(activity.applicationContext, options, "nexilis")
  60. } catch (e: Exception) {
  61. Firebase.initialize(activity.applicationContext, options, FirebaseApp.DEFAULT_APP_NAME)
  62. }
  63. while (!nuSDKService.bServiceStarted()) {
  64. Thread.sleep(100)
  65. }
  66. val preferences = activity.pref()
  67. preferences.api = account
  68. val random =
  69. String.format(Locale.getDefault(), "%010d", SecureRandom().nextInt(Int.MAX_VALUE))
  70. val session = preferences.session.ifEmpty { random }
  71. Log.d(tag, "initConnection:$pass,$account,$activity,$session")
  72. nuSDKService.getInstance(pass).initConnection(
  73. pass,
  74. account,
  75. activity,
  76. SdkCallback::class.java,
  77. SdkCallback(),
  78. ip,
  79. port,
  80. session,
  81. "09:00",
  82. false,
  83. "$ip:$port"
  84. )
  85. val signature: String = nuSDKService.getInstance(pass).sGetSignature()
  86. if ("1,1,1,1,1,1,1,1,1,1,1,1" != signature) nuSDKService.getInstance(pass)
  87. .UpdateSignature()
  88. if (preferences.pin.isEmpty()) {
  89. condition = lock.newCondition()
  90. lock.withLock {
  91. Log.d(tag, "wait:connection")
  92. condition?.let {
  93. val await = it.await(15, TimeUnit.SECONDS)
  94. Log.d(tag, "wait:result:$await")
  95. if (!await) {
  96. activity.runOnUiThread {
  97. Toast.makeText(activity, "Please check your internet connection", Toast.LENGTH_LONG).show()
  98. }
  99. return@Thread
  100. }
  101. Log.d(tag, "signup:start")
  102. preferences.session = session
  103. val response = Service.sendSync(
  104. Data(
  105. code = "SUA01",
  106. status = System.nanoTime().toString(),
  107. bodies = mutableMapOf("Api" to account)
  108. )
  109. )
  110. Log.d(tag, "signup:response:$response")
  111. response?.let { r ->
  112. Log.d(tag, "signup:isOk:${r.isOk()}")
  113. if (r.isOk()) {
  114. val p = r.bodies["A00"] ?: ""
  115. Log.d(tag, "signup:put:pin:$p")
  116. preferences.pin = p
  117. Log.d(tag, "signup:retrieve")
  118. Service.sendAsync(
  119. Data(
  120. code = "A050",
  121. status = System.nanoTime().toString(),
  122. )
  123. )
  124. }
  125. }
  126. }
  127. }
  128. }
  129. Log.d(tag, "user pin: ${preferences.pin}")
  130. } catch (e: Exception) {
  131. Log.e(tag, e.message, e)
  132. }
  133. }.start()
  134. }
  135. internal fun sendToken(context: Context, token: String) {
  136. val pin = context.pref().pin
  137. if (context.pref().isLogin && pin.isNotEmpty()) {
  138. apiScope.launch {
  139. Service.sendAsync(
  140. Data(
  141. code = "ATO",
  142. status = System.nanoTime().toString(),
  143. f_pin = pin,
  144. bodies = mutableMapOf(
  145. "TKN" to token, "Bo" to Build.BRAND
  146. )
  147. )
  148. )
  149. }
  150. }
  151. }
  152. fun version(): String? {
  153. return nuSDKService.getInstance(pass)?.sGetVersion()
  154. }
  155. fun isConnected(): Boolean {
  156. return nuSDKService.getInstance(pass)?.nGetCLXConnState() == 1.toByte()
  157. }
  158. }
  159. }