Skip to content

Commit

Permalink
Added 3.6.1
Browse files Browse the repository at this point in the history
  • Loading branch information
rimdoo committed Jul 12, 2023
1 parent 0f7a665 commit ff6f6aa
Show file tree
Hide file tree
Showing 9 changed files with 106 additions and 41 deletions.
3 changes: 3 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,4 +1,7 @@
# Changelog
### v3.6.1 (Jul 12, 2023) with Chat SDK `v4.9.4`
* Improved stability

### v3.6.0 (Jun 23, 2023) with Chat SDK `v4.9.1`
* Support feature configuration
* Added `UIKitConfig` object
Expand Down
2 changes: 1 addition & 1 deletion gradle.properties
Original file line number Diff line number Diff line change
Expand Up @@ -16,5 +16,5 @@ org.gradle.jvmargs=-Xmx1536m
# https://developer.android.com/topic/libraries/support-library/androidx-rn
android.useAndroidX=true

UIKIT_VERSION = 3.6.0
UIKIT_VERSION = 3.6.1
UIKIT_VERSION_CODE = 1
2 changes: 1 addition & 1 deletion uikit/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -68,7 +68,7 @@ dependencies {
implementation fileTree(dir: 'libs', include: ['*.jar'])

// Sendbird
api 'com.sendbird.sdk:sendbird-chat:4.9.1'
api 'com.sendbird.sdk:sendbird-chat:4.9.4'

implementation 'com.github.bumptech.glide:glide:4.13.0'
annotationProcessor 'com.github.bumptech.glide:compiler:4.13.0'
Expand Down
14 changes: 14 additions & 0 deletions uikit/src/main/java/com/sendbird/uikit/SendbirdUIKit.java
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,9 @@
import com.sendbird.android.handler.ConnectHandler;
import com.sendbird.android.handler.DisconnectHandler;
import com.sendbird.android.handler.InitResultHandler;
import com.sendbird.android.internal.sb.SendbirdPlatform;
import com.sendbird.android.internal.sb.SendbirdProduct;
import com.sendbird.android.internal.sb.SendbirdSdkInfo;
import com.sendbird.android.params.InitParams;
import com.sendbird.android.params.UserUpdateParams;
import com.sendbird.android.user.User;
Expand Down Expand Up @@ -55,6 +58,8 @@
import org.jetbrains.annotations.TestOnly;

import java.io.OutputStream;
import java.util.Arrays;
import java.util.Collections;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.atomic.AtomicReference;

Expand Down Expand Up @@ -286,6 +291,15 @@ public void onInitSucceed() {
sendbirdChatWrapper.addExtension(StringSet.sb_uikit, BuildConfig.VERSION_NAME);
} catch (Throwable ignored) {
}
try {
SendbirdSdkInfo o = new SendbirdSdkInfo(
SendbirdProduct.UIKIT_CHAT,
SendbirdPlatform.ANDROID,
BuildConfig.VERSION_NAME
);
sendbirdChatWrapper.addSendbirdExtensions(Collections.singletonList(o), null);
} catch (Throwable ignored) {
}

handler.onInitSucceed();
}
Expand Down
2 changes: 2 additions & 0 deletions uikit/src/main/java/com/sendbird/uikit/consts/StringSet.java
Original file line number Diff line number Diff line change
Expand Up @@ -84,6 +84,8 @@ public class StringSet {
public final static String KEY_CHANNEL_LIST_CONFIG = "KEY_CHANNEL_LIST_CONFIG";
public final static String KEY_CHANNEL_SETTING_CONFIG = "KEY_CHANNEL_SETTING_CONFIG";
public final static String KEY_OPEN_CHANNEL_CONFIG = "KEY_OPEN_CHANNEL_CONFIG";
public final static String KEY_EMOJI_REACTION_USER_LIST_SIZE = "KEY_EMOJI_REACTION_USER_LIST_SIZE";
public final static String KEY_EMOJI_REACTION_USER_ = "KEY_EMOJI_REACTION_USER_";

public final static String sb_uikit = "sb_uikit";
public final static String sbu_type = "sbu_type";
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,16 +6,24 @@ import com.sendbird.android.exception.SendbirdException
import com.sendbird.uikit.internal.extensions.runOnUiThread
import com.sendbird.uikit.internal.interfaces.GetTemplateResultHandler
import com.sendbird.uikit.internal.model.notifications.NotificationChannelSettings
import com.sendbird.uikit.internal.model.notifications.NotificationTemplate
import com.sendbird.uikit.internal.model.notifications.NotificationThemeMode
import com.sendbird.uikit.log.Logger
import java.util.concurrent.ConcurrentHashMap
import java.util.concurrent.Executors
import java.util.concurrent.atomic.AtomicBoolean

internal object NotificationChannelManager {
private data class TemplateRequestData(
val key: String,
val variables: Map<String, String>,
val themeMode: NotificationThemeMode,
val handler: GetTemplateResultHandler
)

private val worker = Executors.newFixedThreadPool(10)
private val isInitialized: AtomicBoolean = AtomicBoolean()
private val templateRequestHandlers: MutableMap<String, MutableSet<GetTemplateResultHandler>> = ConcurrentHashMap()
private val templateRequestDatas: MutableMap<String, MutableSet<TemplateRequestData>> = ConcurrentHashMap()

private lateinit var templateRepository: NotificationTemplateRepository
private lateinit var channelSettingsRepository: NotificationChannelRepository
Expand Down Expand Up @@ -47,25 +55,57 @@ internal object NotificationChannelManager {
return
}

synchronized(templateRequestHandlers) {
templateRequestHandlers[key]?.let {
it.add(callback)
Logger.i("-- return (fetching template request already exists), key=$key, handler count=${templateRequestHandlers.size}")
synchronized(templateRequestDatas) {
val request = TemplateRequestData(key, variables, themeMode, callback)
templateRequestDatas[key]?.let {
it.add(request)
Logger.i("-- return (fetching template request already exists), key=$key, handler count=${templateRequestDatas.size}")
return
} ?: run {
templateRequestHandlers[key] = mutableSetOf<GetTemplateResultHandler>().apply {
add(callback)
templateRequestDatas[key] = mutableSetOf<TemplateRequestData>().apply {
add(request)
}
}
}
Logger.d("++ templateRequestHandlers size=${templateRequestHandlers.size}, templateRequestHandlers[key].size=${templateRequestHandlers[key]?.size}")
Logger.d("++ templateRequestHandlers size=${templateRequestDatas.size}, templateRequestHandlers[key].size=${templateRequestDatas[key]?.size}")
worker.submit {
try {
val template = templateRepository.requestTemplateBlocking(key).getTemplateSyntax(variables, themeMode)
Logger.d("++ template[$key]=$template")
notifyTemplateFetched(key, template)
val rawTemplate = templateRepository.requestTemplateBlocking(key)
makeAndNotifyTemplate(key, rawTemplate)
} catch (e: Throwable) {
notifyTemplateFetched(key, null, SendbirdException(e))
notifyError(key, SendbirdException(e))
}
}
}

private fun makeAndNotifyTemplate(key: String, rawTemplate: NotificationTemplate) {
runOnUiThread {
synchronized(templateRequestDatas) {
try {
Logger.d("NotificationChannelManager::makeAndNotifyTemplate()")
templateRequestDatas[key]?.forEach { requestData ->
// The template may be the same but variable may be a different message.(NOTI-1027)
val template = rawTemplate.getTemplateSyntax(requestData.variables, requestData.themeMode)
requestData.handler.onResult(key, template, null)
}
} finally {
templateRequestDatas.remove(key)
}
}
}
}

private fun notifyError(key: String, e: SendbirdException) {
runOnUiThread {
synchronized(templateRequestDatas) {
try {
Logger.d("NotificationChannelManager::notifyError()")
templateRequestDatas[key]?.forEach { requestData ->
requestData.handler.onResult(key, null, e)
}
} finally {
templateRequestDatas.remove(key)
}
}
}
}
Expand Down Expand Up @@ -106,21 +146,6 @@ internal object NotificationChannelManager {
return channelSettingsRepository.requestSettings()
}

private fun notifyTemplateFetched(key: String, template: String?, e: SendbirdException? = null) {
runOnUiThread {
synchronized(templateRequestHandlers) {
try {
Logger.d("NotificationChannelManager::notifyTemplateFetched()")
templateRequestHandlers[key]?.forEach { handler ->
handler.onResult(key, template, e)
}
} finally {
templateRequestHandlers.remove(key)
}
}
}
}

@JvmStatic
fun clearAll() {
Logger.d("NotificationChannelManager::clearAll()")
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@ import com.sendbird.android.message.Reaction
import com.sendbird.android.user.User
import com.sendbird.uikit.R
import com.sendbird.uikit.activities.adapter.EmojiReactionUserListAdapter
import com.sendbird.uikit.consts.StringSet
import com.sendbird.uikit.databinding.SbFragmentUserListBinding
import com.sendbird.uikit.databinding.SbViewEmojiReactionUserListBinding
import com.sendbird.uikit.model.EmojiManager
Expand Down Expand Up @@ -83,21 +84,25 @@ internal class EmojiReactionUserListView @JvmOverloads constructor(
init {
itemCount = reactionUserInfo.size
reactionList.forEach {
val userList = reactionUserInfo[it]
fragmentList.add(UserListFragment(userList ?: emptyList()))
}
for (reaction in reactionList) {
val userList = reactionUserInfo[reaction]
fragmentList.add(UserListFragment(userList ?: emptyList()))
val userListFragment = UserListFragment()
reactionUserInfo[it]?.let { userList ->
val bundle = Bundle()
bundle.putInt(StringSet.KEY_EMOJI_REACTION_USER_LIST_SIZE, userList.size)
userList.forEachIndexed { index, user ->
bundle.putByteArray(StringSet.KEY_EMOJI_REACTION_USER_ + index.toString(), user?.serialize())
}
userListFragment.arguments = bundle
}
fragmentList.add(userListFragment)
}
}
}

// A class that inherits the Fragment must be public static.
// If user who was already reacted has been banned or was deactivated, the reacted user may be empty.
internal class UserListFragment(userList: List<User?>) : Fragment() {
internal class UserListFragment : Fragment() {
private lateinit var binding: SbFragmentUserListBinding
private val userList: List<User?>

override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View {
val themeInflater = inflater.cloneInContext(context)
binding = SbFragmentUserListBinding.inflate(themeInflater)
Expand All @@ -107,13 +112,18 @@ internal class EmojiReactionUserListView @JvmOverloads constructor(

override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
val userList = mutableListOf<User?>()
arguments?.let {
val userListSize = it.getInt(StringSet.KEY_EMOJI_REACTION_USER_LIST_SIZE)
for (i in 0 until userListSize) {
val user =
User.buildFromSerializedData(it.getByteArray(StringSet.KEY_EMOJI_REACTION_USER_ + i.toString()))
userList.add(user)
}
}
val userListAdapter = EmojiReactionUserListAdapter(userList)
binding.rvUserList.adapter = userListAdapter
binding.rvUserList.setHasFixedSize(true)
}

init {
this.userList = ArrayList(userList)
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ import com.sendbird.android.handler.ConnectHandler
import com.sendbird.android.handler.ConnectionHandler
import com.sendbird.android.handler.InitResultHandler
import com.sendbird.android.handler.UIKitConfigurationHandler
import com.sendbird.android.internal.sb.SendbirdSdkInfo
import com.sendbird.android.params.InitParams
import com.sendbird.android.params.UserUpdateParams

Expand Down Expand Up @@ -43,6 +44,13 @@ internal class SendbirdChatImpl : SendbirdChatWrapper {
SendbirdChat.addExtension(key, version)
}

override fun addSendbirdExtensions(
extensions: List<SendbirdSdkInfo>,
customData: Map<String, String>?
) {
SendbirdChat.addSendbirdExtensions(extensions, customData)
}

override fun getAppInfo(): AppInfo? = SendbirdChat.appInfo

override fun getConnectionState(): ConnectionState = SendbirdChat.connectionState
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ import com.sendbird.android.handler.ConnectHandler
import com.sendbird.android.handler.ConnectionHandler
import com.sendbird.android.handler.InitResultHandler
import com.sendbird.android.handler.UIKitConfigurationHandler
import com.sendbird.android.internal.sb.SendbirdSdkInfo
import com.sendbird.android.params.InitParams
import com.sendbird.android.params.UserUpdateParams

Expand All @@ -20,6 +21,8 @@ internal interface SendbirdChatWrapper {
fun connect(userId: String, accessToken: String?, handler: ConnectHandler?)
fun updateCurrentUserInfo(params: UserUpdateParams, handler: CompletionHandler?)
fun addExtension(key: String, version: String)

fun addSendbirdExtensions(extensions: List<SendbirdSdkInfo>, customData: Map<String, String>? = null)
fun getAppInfo(): AppInfo?
fun getConnectionState(): ConnectionState
fun getUIKitConfiguration(handler: UIKitConfigurationHandler?)
Expand Down

0 comments on commit ff6f6aa

Please sign in to comment.