Advertisement
Guest User

Untitled

a guest
Sep 19th, 2019
123
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Kotlin 19.74 KB | None | 0 0
  1. class MatrixClientModule(reactContext: ReactApplicationContext) : ReactContextBaseJavaModule(reactContext) {
  2.     private val eventListeners = HashMap<String, NewEventsListener>()
  3.  
  4.     @Inject
  5.     lateinit var gson: Gson
  6.  
  7.     @Inject
  8.     lateinit var matrixInstance: Matrix
  9.  
  10.     init {
  11.         MainApplication.getComponent().injectsMatrixClientModule(this)
  12.     }
  13.  
  14.     override fun getName(): String {
  15.         return "MatrixClient"
  16.     }
  17.  
  18.     private fun isSessionExists(promise: Promise): Boolean {
  19.         if (matrixInstance.defaultSession == null) {
  20.             promise.reject("NullSession", "Session must not be null!")
  21.             return false
  22.         }
  23.         return true
  24.     }
  25.  
  26.     @ReactMethod
  27.     fun getDirectChats(promise: Promise) {
  28.         if (!isSessionExists(promise)) {
  29.             return
  30.         }
  31.         GlobalScope.launch {
  32.             for (i in 0 until 15) {
  33.                 if (!Globals.State.isInitialSyncComplete) {
  34.                     if (i == 14) {
  35.                         promise.reject("onUnexpectedError", "Sync waiting timeout!")
  36.                     }
  37.                     Thread.sleep(1000)
  38.                 }
  39.                 break
  40.             }
  41.  
  42.             promise.resolve(gson.toJson(getDirectChatsInternal()))
  43.         }
  44.     }
  45.  
  46.     private fun getDirectChatsInternal(): List<UserModel> {
  47.         val directChats = matrixInstance.defaultSession.dataHandler.store.rooms.filter {
  48.             it.isDirect
  49.         }
  50.  
  51.         val chatModels = mutableListOf<UserModel>()
  52.         directChats.forEach { room ->
  53.             val roomSummary = room.roomSummary
  54.             // hack for optimization: since we hold the same listener, we will not create a useless instance of this listener (else it will add new object to internal list of listeners and messing up the memory)
  55.             if (eventListeners[roomSummary!!.roomId] == null) {
  56.                 eventListeners[roomSummary.roomId] = NewEventsListener(reactApplicationContext, room, roomSummary)
  57.             }
  58.             room.timeline.addEventTimelineListener(eventListeners[room.roomId])
  59.             // hack end
  60.             val contactID = room.state.loadedMembers.filter {
  61.                 it.userId != matrixInstance.defaultSession.myUserId
  62.             }[0].userId
  63.             val contact = matrixInstance.defaultSession.dataHandler.store.getUser(contactID)
  64.             val chat = UserModel(
  65.                     contactID,
  66.                     room.getRoomDisplayName(reactApplicationContext),
  67.                     room.avatarUrl ?: "",
  68.                     contact.latestPresenceTs,
  69.                     contact.isActive,
  70.                     matrixInstance.defaultLatestChatMessageCache.getLatestText(reactApplicationContext, roomSummary.roomId),
  71.                     roomSummary.latestReceivedEvent.originServerTs,
  72.                     roomSummary.latestReceivedEvent.mSentState.name,
  73.                     roomSummary.mUnreadEventsCount,
  74.                     roomId = room.roomId
  75.             )
  76.             chatModels.add(chat)
  77.         }
  78.         return chatModels
  79.     }
  80.  
  81.     @ReactMethod
  82.     fun getUserById(userID: String, promise: Promise) {
  83.       getDataUser(userID,promise)
  84.     }
  85.  
  86.     private fun getDataUser(userID: String, promise: Promise){
  87.         if (!isSessionExists(promise)) {
  88.             return
  89.         }
  90.  
  91.         val userName = CompletableFuture<String?>()
  92.         val userAvatarUrl = CompletableFuture<String?>()
  93.         val userIsActive = CompletableFuture<Boolean?>()
  94.         val userLastSeen = CompletableFuture<Long?>()
  95.  
  96.  
  97.         val directChats = matrixInstance.defaultSession.dataHandler.store.rooms.filter {
  98.             it.isDirect
  99.         }
  100.  
  101.         val roomId = getRoomId(directChats,userID)
  102.  
  103.         matrixInstance.defaultSession.presenceApiClient.getPresence(userID,object : ApiCallback<User>{
  104.             override fun onSuccess(info: User?) {
  105.                 userIsActive.complete(info?.isActive)
  106.                 userLastSeen.complete(info?.lastActiveAgo)
  107.             }
  108.  
  109.             override fun onUnexpectedError(e: java.lang.Exception?) {
  110.                 userIsActive.complete(null)
  111.                 userLastSeen.complete(null)
  112.             }
  113.  
  114.             override fun onMatrixError(e: MatrixError?) {
  115.                 userIsActive.complete(null)
  116.                 userLastSeen.complete(null)
  117.             }
  118.  
  119.             override fun onNetworkError(e: java.lang.Exception?) {
  120.                 userIsActive.complete(null)
  121.                 userLastSeen.complete(null)
  122.             }
  123.         })
  124.  
  125.         matrixInstance.defaultSession.profileApiClient.displayname(userID, object : ApiCallback<String> {
  126.             override fun onSuccess(info: String?) {
  127.                 userName.complete(info)
  128.             }
  129.  
  130.             override fun onUnexpectedError(e: Exception?) {
  131.                 promise.reject(e)
  132.                 userName.complete(null)
  133.             }
  134.  
  135.             override fun onMatrixError(e: MatrixError?) {
  136.                 //promise.reject(RuntimeException(e!!.error))
  137.                 userName.complete("")
  138.             }
  139.  
  140.             override fun onNetworkError(e: Exception?) {
  141.                 promise.reject(e)
  142.                 userName.complete(null)
  143.             }
  144.         })
  145.  
  146.         matrixInstance.defaultSession.profileApiClient.avatarUrl(userID, object : ApiCallback<String> {
  147.             override fun onSuccess(info: String?) {
  148.                 userAvatarUrl.complete(info)
  149.             }
  150.  
  151.             override fun onUnexpectedError(e: Exception?) {
  152.                 promise.reject(e)
  153.                 userAvatarUrl.complete(null)
  154.             }
  155.  
  156.             override fun onMatrixError(e: MatrixError?) {
  157.                 //promise.reject(RuntimeException(e!!.error))
  158.                 userAvatarUrl.complete(null)
  159.             }
  160.  
  161.             override fun onNetworkError(e: Exception?) {
  162.                 promise.reject(e)
  163.                 userAvatarUrl.complete(null)
  164.             }
  165.         })
  166.  
  167.  
  168.         matrixInstance.defaultSession.roomsApiClient.getRoomMembers(roomId,null,null,null,object:ApiCallback<ChunkEvents>{
  169.             override fun onSuccess(info: ChunkEvents?) {
  170.                 info?.let{
  171.                     for(i in it.chunk.indices){
  172.                             if(userID== it.chunk[i].userId){
  173.                                 val
  174.                                 break
  175.                             }
  176.                     }
  177.                 }
  178.             }
  179.  
  180.             override fun onUnexpectedError(e: java.lang.Exception?) {
  181.                 var kek = ""
  182.             }
  183.  
  184.             override fun onMatrixError(e: MatrixError?) {
  185.                 var kek = ""
  186.             }
  187.  
  188.             override fun onNetworkError(e: java.lang.Exception?) {
  189.                 var kek = ""
  190.             }
  191.         })
  192.  
  193.         GlobalScope.launch {
  194.             val name = userName.get()
  195.             val avatarUrl = userAvatarUrl.get()
  196.             val isActive = userIsActive.get()
  197.             val lastSeen = userLastSeen.get()
  198.             if (name != null && avatarUrl != null) {
  199.                 promise.resolve(gson.toJson(UserModel(userID, name, avatarUrl,lastSeen = lastSeen,isActive = isActive,roomId = roomId)))
  200.             } else {
  201.                 promise.resolve(gson.toJson(UserModel(userID, "", "")))
  202.             }
  203.         }
  204.     }
  205.  
  206.     private fun getRoomId(rooms:List<Room>, useriD: String):String?{
  207.         for( i in rooms.indices){
  208.             if(rooms[i].getMember(useriD)!=null){
  209.                 return rooms[i].roomId
  210.             }
  211.         }
  212.         return null
  213.     }
  214.  
  215.     @ReactMethod
  216.     fun getMyMxId(promise: Promise) {
  217.         if (!isSessionExists(promise)) {
  218.             return
  219.         }
  220.  
  221.         promise.resolve(matrixInstance.defaultSession.myUserId)
  222.     }
  223.  
  224.     @ReactMethod
  225.     fun getMyProfile(promise: Promise) {
  226.         if (!isSessionExists(promise)) {
  227.             return
  228.         }
  229.  
  230.         val currentSession = matrixInstance.defaultSession
  231.         val httpUrlAvatar = currentSession.contentManager.getDownloadableUrl(currentSession.dataHandler.myUser.avatarUrl,false)
  232.         promise.resolve(gson.toJson(UserModel(currentSession.myUserId,
  233.                 currentSession.dataHandler.myUser.displayname,
  234.                 currentSession.dataHandler.myUser.avatarUrl,
  235.                 avatarLink = httpUrlAvatar)))
  236.     }
  237.  
  238.     @ReactMethod
  239.     fun createDirectChat(participantUserId: String, promise: Promise) {
  240.         if (!isSessionExists(promise)) {
  241.             return
  242.         }
  243.  
  244.         if (isDirectChatExists(participantUserId)) {
  245.             getDataUser(participantUserId,promise)
  246.             return
  247.         }
  248.  
  249.         matrixInstance.defaultSession.createDirectMessageRoom(participantUserId, object : ApiCallback<String> {
  250.             override fun onSuccess(roomId: String?) {
  251.                 promise.resolve(roomId)
  252.             }
  253.  
  254.             override fun onUnexpectedError(e: java.lang.Exception?) {
  255.                 promise.reject("onUnexpectedError", e)
  256.             }
  257.  
  258.             override fun onMatrixError(e: MatrixError?) {
  259.                 promise.reject("onMatrixError", e!!.message)
  260.             }
  261.  
  262.             override fun onNetworkError(e: java.lang.Exception?) {
  263.                 promise.reject("onNetworkError", e)
  264.             }
  265.         })
  266.     }
  267.  
  268.     private fun isDirectChatExists(participantUserId: String): Boolean {
  269.         val directChats = getDirectChatsInternal()
  270.         var exists = false
  271.         directChats.forEach {
  272.             if (it.userId == participantUserId) {
  273.                 exists = true
  274.             }
  275.         }
  276.         return exists
  277.     }
  278.  
  279.     @ReactMethod
  280.     fun searchUserById(userName: String, limit: Int?, promise: Promise) {
  281.         if (!isSessionExists(promise)) {
  282.             return
  283.         }
  284.  
  285.         val tempLimit: Int?
  286.         if (limit == 0) {
  287.             tempLimit = null
  288.         } else {
  289.             tempLimit = limit
  290.         }
  291.  
  292.         val users = ArrayList<UserModel>()
  293.         matrixInstance.defaultSession.searchUsers(userName, tempLimit, null, object : ApiCallback<SearchUsersResponse> {
  294.             override fun onSuccess(info: SearchUsersResponse?) {
  295.                 info!!.results.forEach {
  296.                     users.add(UserModel(it.user_id, it.displayname, it.avatarUrl))
  297.                 }
  298.                 promise.resolve(gson.toJson(users))
  299.             }
  300.  
  301.             override fun onUnexpectedError(e: java.lang.Exception?) {
  302.                 promise.reject("onUnexpectedError", e!!.message)
  303.             }
  304.  
  305.             override fun onMatrixError(e: MatrixError?) {
  306.                 promise.reject("onMatrixError", e!!.message)
  307.             }
  308.  
  309.             override fun onNetworkError(e: java.lang.Exception?) {
  310.                 promise.reject("onNetworkError", e!!.message)
  311.             }
  312.         })
  313.     }
  314.  
  315.     @ReactMethod
  316.     fun updateDisplayName(newDisplayName: String, promise: Promise) {
  317.         if (!isSessionExists(promise)) {
  318.             return
  319.         }
  320.  
  321.         matrixInstance.defaultSession.profileApiClient.updateDisplayname(newDisplayName, object : ApiCallback<Void> {
  322.             override fun onSuccess(info: Void?) {
  323.                 promise.resolve(true)
  324.             }
  325.  
  326.             override fun onUnexpectedError(e: java.lang.Exception?) {
  327.                 promise.reject("onUnexpectedError", e!!.message)
  328.             }
  329.  
  330.             override fun onMatrixError(e: MatrixError?) {
  331.                 promise.reject("onMatrixError", e!!.message)
  332.             }
  333.  
  334.             override fun onNetworkError(e: java.lang.Exception?) {
  335.                 promise.reject("onNetworkError", e!!.message)
  336.             }
  337.         })
  338.     }
  339.  
  340.     @ReactMethod
  341.     fun updateAvatar(base64Avatar: String, promise: Promise) {
  342.         if (!isSessionExists(promise)) {
  343.             return
  344.         }
  345.  
  346.         val future = uploadImage(base64Avatar)
  347.         future.thenAccept {
  348.             matrixInstance.defaultSession.profileApiClient.updateAvatarUrl(it, object : ApiCallback<Void> {
  349.                 override fun onSuccess(info: Void?) {
  350.                     promise.resolve(true)
  351.                 }
  352.  
  353.                 override fun onUnexpectedError(e: java.lang.Exception?) {
  354.                     promise.reject("onUnexpectedError", e!!.message)
  355.                 }
  356.  
  357.                 override fun onMatrixError(e: MatrixError?) {
  358.                     promise.reject("onMatrixError", e!!.message)
  359.                 }
  360.  
  361.                 override fun onNetworkError(e: java.lang.Exception?) {
  362.                     promise.reject("onNetworkError", e!!.message)
  363.                 }
  364.             })
  365.         }
  366.         future.exceptionally {
  367.             promise.reject(it)
  368.             ""
  369.         }
  370.     }
  371.  
  372.     private fun uploadImage(base64Image: String): CompletableFuture<String> {
  373.         val imageByteArray = Base64.decode(base64Image, Base64.DEFAULT)
  374.         val imageInputStream = ByteArrayInputStream(imageByteArray)
  375.         val fileMimeType = guessContentTypeFromStream(imageInputStream)
  376.  
  377.         val future = CompletableFuture<String>()
  378.  
  379.         matrixInstance.defaultSession.mediaCache.uploadContent(imageInputStream, null, fileMimeType, null, object : IMXMediaUploadListener {
  380.             override fun onUploadProgress(uploadId: String?, uploadStats: IMXMediaUploadListener.UploadStats?) {
  381.                 //
  382.             }
  383.  
  384.             override fun onUploadCancel(uploadId: String?) {
  385.                 future.completeExceptionally(RuntimeException("onUploadCancel, uploadId=$uploadId"))
  386.             }
  387.  
  388.             override fun onUploadStart(uploadId: String?) {
  389.                 //
  390.             }
  391.  
  392.             override fun onUploadComplete(uploadId: String?, contentUri: String?) {
  393.                 future.complete(contentUri)
  394.             }
  395.  
  396.             override fun onUploadError(uploadId: String?, serverResponseCode: Int, serverErrorMessage: String?) {
  397.                 future.completeExceptionally(RuntimeException("Error occurred! Response code=$serverResponseCode, error message=$serverErrorMessage"))
  398.             }
  399.         })
  400.  
  401.         return future
  402.     }
  403.  
  404.     @ReactMethod
  405.     private fun sendMessage(message: String, roomId: String, promise: Promise) {
  406.         val room = matrixInstance.defaultSession.dataHandler.getRoom(roomId)
  407.         room.sendTextMessage(message, message, message, object : RoomMediaMessage.EventCreationListener {
  408.             override fun onEventCreated(roomMediaMessage: RoomMediaMessage?) {
  409.               //  getHistoryMessageTest(roomId,null)
  410.                 promise.resolve(true)
  411.             }
  412.  
  413.             override fun onEventCreationFailed(roomMediaMessage: RoomMediaMessage?, errorMessage: String?) {
  414.                 promise.reject("onEventCreationError", roomMediaMessage!!.text.toString())
  415.             }
  416.  
  417.             override fun onEncryptionFailed(roomMediaMessage: RoomMediaMessage?) {
  418.                 promise.reject("onEncryptionError", roomMediaMessage!!.text.toString())
  419.             }
  420.         })
  421.     }
  422.  
  423.     @ReactMethod
  424.     private fun getHistoryMessage(roomId:String,tokenMessageEnd:String, promise: Promise){
  425.         val room = matrixInstance.defaultSession.dataHandler.getRoom(roomId)
  426.  
  427.         matrixInstance.defaultSession.roomsApiClient.getRoomMessagesFrom(room.roomId, tokenMessageEnd, EventTimeline.Direction.BACKWARDS, 15,null, object : ApiCallback<TokensChunkEvents> {
  428.  
  429.             override fun onSuccess(info: TokensChunkEvents) {
  430.                 //it hack need because we can`t direct convert info to Json
  431.                 val messages = arrayListOf<JsonObject>()
  432.  
  433.                 val newInfo: HashMap<String, Any> = hashMapOf()
  434.  
  435.                 for(i in info.chunk.indices){
  436.                         messages.add(info.chunk[i].toJsonObject())
  437.                 }
  438.  
  439.                 newInfo["start"] = info.start
  440.                 newInfo["end"] = info.end
  441.                 newInfo["messages"] = messages
  442.  
  443.                 val jsonMessages = gson.toJson(newInfo)
  444.                 promise.resolve(jsonMessages)
  445.             }
  446.  
  447.             override fun onUnexpectedError(e: Exception) {
  448.                 promise.reject("onUnexpectedError", e.message)
  449.             }
  450.  
  451.             override fun onNetworkError(e: Exception) {
  452.                 promise.reject("onNetworkError", e.message)
  453.             }
  454.  
  455.             override fun onMatrixError(e: MatrixError) {
  456.                 promise.reject("onMatrixError", e.message)
  457.             }
  458.         })
  459.     }
  460.  
  461.     @ReactMethod
  462.     fun acceptInvite(roomId:String,promise: Promise){
  463.         val room = matrixInstance.defaultSession.dataHandler.getRoom(roomId)
  464.         matrixInstance.defaultSession.roomsApiClient.joinRoom(roomId,null,null,object:ApiCallback<RoomResponse> {
  465.             override fun onSuccess(info: RoomResponse?) {
  466.                 val infoRoom = gson.toJson(info)
  467.                 promise.resolve(infoRoom)
  468.             }
  469.  
  470.             override fun onUnexpectedError(e: Exception) {
  471.                 promise.reject("onUnexpectedError", e.message)
  472.  
  473.             }
  474.  
  475.             override fun onMatrixError(e: MatrixError) {
  476.                 promise.reject("onMatrixError", e.message)
  477.             }
  478.  
  479.             override fun onNetworkError(e: java.lang.Exception) {
  480.                 promise.reject("onNetworkError", e.message)
  481.             }
  482.         })
  483.     }
  484.  
  485.     private fun getHistoryMessageTest(roomId:String,tokenMessageEnd:String?){
  486.         val room = matrixInstance.defaultSession.dataHandler.getRoom(roomId)
  487.  
  488.         matrixInstance.defaultSession.roomsApiClient.getRoomMessagesFrom(room.roomId, tokenMessageEnd, EventTimeline.Direction.BACKWARDS, 15,null, object : ApiCallback<TokensChunkEvents> {
  489.  
  490.             override fun onSuccess(info: TokensChunkEvents) {
  491.                 val messages = arrayListOf<JsonObject>()
  492.  
  493.                 val newInfo: HashMap<String, Any> = hashMapOf()
  494.  
  495.                 for(i in info.chunk.indices){
  496.                         messages.add(info.chunk[i].toJsonObject())
  497.                 }
  498.  
  499.                 newInfo["start"] = info.start
  500.                 newInfo["end"] = info.end
  501.                 newInfo["messages"] = messages
  502.  
  503.                 val jsonMessages = gson.toJson(newInfo)
  504.  
  505.  
  506.                 matrixInstance.defaultSession.roomsApiClient.getRoomMessagesFrom(room.roomId, info.end, EventTimeline.Direction.BACKWARDS, 15,null, object : ApiCallback<TokensChunkEvents> {
  507.  
  508.                     override fun onSuccess(info: TokensChunkEvents) {
  509.  
  510.                     }
  511.  
  512.                     override fun onUnexpectedError(e: Exception) {
  513.                     }
  514.  
  515.                     override fun onNetworkError(e: Exception) {
  516.                     }
  517.  
  518.                     override fun onMatrixError(e: MatrixError) {
  519.                     }
  520.                 })
  521.             }
  522.  
  523.             override fun onUnexpectedError(e: Exception) {
  524.             }
  525.  
  526.             override fun onNetworkError(e: Exception) {
  527.             }
  528.  
  529.             override fun onMatrixError(e: MatrixError) {
  530.             }
  531.         })
  532.     }
  533.  
  534.     //can refactor with use dagger2
  535.     internal class NewEventsListener(private val reactContext: ReactApplicationContext,
  536.                                      private val room: Room,
  537.                                      private val roomSummary: RoomSummary) : EventTimeline.Listener {
  538.         private val matrixInstance = Matrix.getInstance(reactContext)
  539.  
  540.         override fun onEvent(event: Event?, direction: EventTimeline.Direction?, roomState: RoomState?) {
  541.             event?.let {
  542.                 matrixInstance.defaultLatestChatMessageCache.updateLatestMessage(reactContext, room.roomId, event!!.contentAsJsonObject.get("body").asString)
  543.                 roomSummary.setLatestReceivedEvent(event, roomState)
  544.                 val gson =  Gson()
  545.                 val msg = gson.toJson(event.toJsonObject())
  546.                 sendEventWithOneStringArg(reactContext, "eventMessage", "message", msg)
  547.             }
  548.         }
  549.     }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement