usedesk / android_sdk Goto Github PK
View Code? Open in Web Editor NEWLicense: MIT License
License: MIT License
Невозможно использовать rootScope в проекте.
При первом запуске чата и нажатии на кнопку назад происходит переход к экрану с загрузкой вместо выхода из чата.
Если после открытия экрана чата не дожидаясь полной загрузки страницы свернуть приложение, то произойдет краш.
Так выглядит код моей активности с чатом:
public class UsedeskChatActivity extends PassphraseRequiredActionBarActivity implements IUsedeskOnFileClickListener {
@Override
public void onBackPressed() {
FragmentManager fragmentManager = getSupportFragmentManager();
if (fragmentManager.getBackStackEntryCount() > 1) {
Fragment fragment = fragmentManager.getFragments().get(0);
if (fragment instanceof UsedeskFragment && ((UsedeskFragment) fragment).onBackPressed()) {
return;
}
fragmentManager.popBackStack();
} else if (fragmentManager.getFragments().get(0) instanceof UsedeskFragment &&
((UsedeskFragment) fragmentManager.getFragments().get(0)).onBackPressed()) {
return;
} else {
finish();
}
}
@Override
protected void onCreate(Bundle savedInstanceState, boolean ready) {
UsedeskChatSdk.init(this);
setContentView(R.layout.container);
UsedeskChatScreen f = UsedeskChatScreen.newInstance();
getSupportFragmentManager().beginTransaction()
.addToBackStack(f.getClass().getName() + ":" + f.hashCode())
.replace(R.id.flContainer, f, "UsedeskChat")
.commit();
}
@Override
public void onFileClick(@NonNull UsedeskFile usedeskFile) {
UsedeskShowFileScreen sfs = UsedeskShowFileScreen.newInstance(usedeskFile);
getSupportFragmentManager().beginTransaction()
.setCustomAnimations(
R.anim.nav_default_enter_anim, // enter
R.anim.nav_default_exit_anim, // exit
R.anim.nav_default_pop_enter_anim, // popEnter
R.anim.nav_default_pop_exit_anim// popExit
)
.addToBackStack(sfs.getClass().getName() + ":" + sfs.hashCode())
.replace(getSupportFragmentManager().getFragments().get(0).getId(), sfs)
.commit();
}
}
Краш лог:
E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.exscudo.channels.int, PID: 31272
java.lang.IllegalStateException: Can not perform this action after onSaveInstanceState
at androidx.fragment.app.FragmentManager.checkStateLoss(FragmentManager.java:1844)
at androidx.fragment.app.FragmentManager.ensureExecReady(FragmentManager.java:1947)
at androidx.fragment.app.FragmentManager.execSingleAction(FragmentManager.java:1967)
at androidx.fragment.app.BackStackRecord.commitNow(BackStackRecord.java:305)
at ru.usedesk.chat_gui.chat.ChatNavigation.navigateToRoot$lambda-3(ChatNavigation.kt:54)
at ru.usedesk.chat_gui.chat.ChatNavigation.lambda$C78USWnbDQs1H3gi7xgmIczvXSo(Unknown Source:0)
at ru.usedesk.chat_gui.chat.-$$Lambda$ChatNavigation$C78USWnbDQs1H3gi7xgmIczvXSo.run(Unknown Source:4)
at android.os.Handler.handleCallback(Handler.java:938)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:236)
at android.app.ActivityThread.main(ActivityThread.java:8057)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:620)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1011)
Версия Usedesk SDK: 3.9.0
Использую только GUI
При первичной инициализации чата все работает нормально (сообщения отправляются, listener получает события):
UsedeskChatSdk.setConfiguration(...)
val usedeskChat = UsedeskChatSdk.init(context)
usedeskChat.addActionListener(...)
usedeskChat.connect()
Завершение работы с чатом:
usedeskChat.removeActionListener(...)
usedeskChat.disconnect()
Если же переиспользовать инициализированный instance, listener не получает никаких сообщений. При отправке сообщениий всегда возвращается UsedeskSocketException.Error.DISCONNECTED:
val usedeskChat = UsedeskChatSdk.getInstance() // usedeskChat != null
usedeskChat.addActionListener(...)
usedeskChat.connect()
...
usedeskChat.send(...) // <- UsedeskSocketException.Error.DISCONNECTED
SDK version: 3.1.8
Device: Samsung Galaxy S10
Привет!
Можете пожалуйста поднять версию до 34 target sdk. На 34 версии нужно явно указывать тип запускаемого сервиса :)
А то ловим MissingForegroundServiceTypeException
При создании конфигурации UsedeskChatConfiguration
и указания clientToken содержащим pathSeparator (/) падает ошибка java.lang.IllegalArgumentException: File UsedeskMessagesRepository{mega/Key}.xml contains a path separator
Планируются ли исправления данного кейса?
трейс:
W/System.err: at ru.usedesk.chat_sdk.data.repository.messages.MessagesRepository.getSharedPreferences(MessagesRepository.kt:32)
W/System.err: at ru.usedesk.chat_sdk.data.repository.messages.MessagesRepository.initIfNeeded(MessagesRepository.kt:129)
W/System.err: at ru.usedesk.chat_sdk.data.repository.messages.MessagesRepository.getDraft(MessagesRepository.kt:96)
W/System.err: at ru.usedesk.chat_sdk.domain.CachedMessagesInteractor$1.invokeSuspend(CachedMessagesInteractor.kt:32)
W/System.err: at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:33)
W/System.err: at kotlinx.coroutines.DispatchedTask.run(DispatchedTask.kt:106)
W/System.err: at kotlinx.coroutines.EventLoopImplBase.processNextEvent(EventLoop.common.kt:279)
W/System.err: at kotlinx.coroutines.BlockingCoroutine.joinBlocking(Builders.kt:85)
W/System.err: at kotlinx.coroutines.BuildersKt__BuildersKt.runBlocking(Builders.kt:59)
W/System.err: at kotlinx.coroutines.BuildersKt.runBlocking(Unknown Source:1)
W/System.err: at kotlinx.coroutines.BuildersKt__BuildersKt.runBlocking$default(Builders.kt:38)
W/System.err: at kotlinx.coroutines.BuildersKt.runBlocking$default(Unknown Source:1)
W/System.err: at ru.usedesk.chat_sdk.domain.CachedMessagesInteractor.<init>(CachedMessagesInteractor.kt:30)
W/System.err: at ru.usedesk.chat_sdk.di.ChatModule.provideCachedMessagesInteractor(ChatModule.kt:115)
W/System.err: at ru.usedesk.chat_sdk.di.ChatModule_ProvideCachedMessagesInteractorFactory.provideCachedMessagesInteractor(ChatModule_ProvideCachedMessagesInteractorFactory.java:49)
W/System.err: at ru.usedesk.chat_sdk.di.ChatModule_ProvideCachedMessagesInteractorFactory.get(ChatModule_ProvideCachedMessagesInteractorFactory.java:36)
W/System.err: at ru.usedesk.chat_sdk.di.ChatModule_ProvideCachedMessagesInteractorFactory.get(ChatModule_ProvideCachedMessagesInteractorFactory.java:13)
W/System.err: at dagger.internal.DoubleCheck.get(DoubleCheck.java:47)
W/System.err: at ru.usedesk.chat_sdk.di.ChatModule_ProvideChatInteractorFactory.get(ChatModule_ProvideChatInteractorFactory.java:41)
W/System.err: at ru.usedesk.chat_sdk.di.ChatModule_ProvideChatInteractorFactory.get(ChatModule_ProvideChatInteractorFactory.java:14)
W/System.err: at dagger.internal.DoubleCheck.get(DoubleCheck.java:47)
W/System.err: at ru.usedesk.chat_sdk.di.DaggerChatComponent.getChatInteractor(DaggerChatComponent.java:109)
W/System.err: at ru.usedesk.chat_sdk.di.InstanceBoxUsedesk.<init>(InstanceBoxUsedesk.kt:31)
W/System.err: at ru.usedesk.chat_sdk.UsedeskChatSdk.init(UsedeskChatSdk.kt:38)
При поднятии версии sdk с 3.11.10 до 4.1.2 возникает исключение:
Fatal Exception: java.lang.NullPointerException: Parameter specified as non-null is null: method kotlin.jvm.internal.Intrinsics.checkNotNullParameter, parameter urlChatApi at ru.usedesk.chat_sdk.entity.UsedeskChatConfiguration.copy(:43) at ru.usedesk.chat_sdk.entity.UsedeskChatConfiguration.copy$default(:183) at ru.usedesk.chat_sdk.domain.ChatInteractor$onChatInited$2.invoke(ChatInteractor.kt:891) at ru.usedesk.chat_sdk.domain.ChatInteractor$onChatInited$2.invoke(ChatInteractor.kt:891) at ru.usedesk.chat_sdk.data.repository.configuration.UserInfoRepository$updateConfiguration$1.invokeSuspend(UserInfoRepository.kt:45)
Hello usedesk team!
After updating from version 4.1.3 to 4.2.2 the following error appeared
android.view.InflateException: Binary XML file line #4 in com.mypackage:layout/usedesk_view_player: Binary XML file line #4 in com.mypackage:layout/usedesk_view_player: Error inflating class <unknown>
Caused by: android.view.InflateException: Binary XML file line #4 in com.mypackage:layout/usedesk_view_player: Error inflating class <unknown>
Caused by: java.lang.reflect.InvocationTargetException
at java.lang.reflect.Constructor.newInstance0(Native Method)
at java.lang.reflect.Constructor.newInstance(Constructor.java:343)
at android.view.LayoutInflater.createView(LayoutInflater.java:742)
at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:894)
at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:849)
at android.view.LayoutInflater.inflate(LayoutInflater.java:543)
at android.view.LayoutInflater.inflate(LayoutInflater.java:462)
at ru.usedesk.common_gui.UsedeskBindingKt.inflateItem(UsedeskBinding.kt:46)
at ru.usedesk.common_gui.UsedeskBindingKt.inflateItem(UsedeskBinding.kt:27)
at ru.usedesk.chat_gui.chat.MediaPlayerAdapter.<init>(MediaPlayerAdapter.kt:44)
at ru.usedesk.chat_gui.chat.UsedeskChatScreen$mediaPlayerAdapter$2.invoke(UsedeskChatScreen.kt:35)
at ru.usedesk.chat_gui.chat.UsedeskChatScreen$mediaPlayerAdapter$2.invoke(UsedeskChatScreen.kt:34)
at kotlin.SynchronizedLazyImpl.getValue(LazyJVM.kt:74)
at ru.usedesk.chat_gui.chat.UsedeskChatScreen.getMediaPlayerAdapter$chat_gui_release(UsedeskChatScreen.kt:34)
at ru.usedesk.chat_gui.chat.messages.MessagesPage.init(MessagesPage.kt:205)
at ru.usedesk.chat_gui.chat.messages.MessagesPage.onViewCreated(MessagesPage.kt:75)
at androidx.fragment.app.Fragment.performViewCreated(Fragment.java:3147)
at androidx.fragment.app.FragmentStateManager.createView(FragmentStateManager.java:588)
at androidx.fragment.app.FragmentStateManager.moveToExpectedState(FragmentStateManager.java:272)
at androidx.fragment.app.FragmentManager.executeOpsTogether(FragmentManager.java:1943)
at androidx.fragment.app.FragmentManager.removeRedundantOperationsAndExecute(FragmentManager.java:1845)
at androidx.fragment.app.FragmentManager.execPendingActions(FragmentManager.java:1782)
at androidx.fragment.app.FragmentManager$5.run(FragmentManager.java:565)
at android.os.Handler.handleCallback(Handler.java:959)
at android.os.Handler.dispatchMessage(Handler.java:100)
at android.os.Looper.loopOnce(Looper.java:232)
at android.os.Looper.loop(Looper.java:317)
at android.app.ActivityThread.main(ActivityThread.java:8501)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:552)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:878)
Caused by: java.lang.ClassCastException: com.google.android.exoplayer2.ui.AspectRatioFrameLayout cannot be cast to androidx.media3.ui.AspectRatioFrameLayout
at androidx.media3.ui.PlayerView.<init>(PlayerView.java:390)
at androidx.media3.ui.PlayerView.<init>(PlayerView.java:306)
at java.lang.reflect.Constructor.newInstance0(Native Method)
at java.lang.reflect.Constructor.newInstance(Constructor.java:343)
at android.view.LayoutInflater.createView(LayoutInflater.java:742)
at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:894)
at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:849)
at android.view.LayoutInflater.inflate(LayoutInflater.java:543)
at android.view.LayoutInflater.inflate(LayoutInflater.java:462)
at ru.usedesk.common_gui.UsedeskBindingKt.inflateItem(UsedeskBinding.kt:46)
at ru.usedesk.common_gui.UsedeskBindingKt.inflateItem(UsedeskBinding.kt:27)
at ru.usedesk.chat_gui.chat.MediaPlayerAdapter.<init>(MediaPlayerAdapter.kt:44)
at ru.usedesk.chat_gui.chat.UsedeskChatScreen$mediaPlayerAdapter$2.invoke(UsedeskChatScreen.kt:35)
at ru.usedesk.chat_gui.chat.UsedeskChatScreen$mediaPlayerAdapter$2.invoke(UsedeskChatScreen.kt:34)
at kotlin.SynchronizedLazyImpl.getValue(LazyJVM.kt:74)
at ru.usedesk.chat_gui.chat.UsedeskChatScreen.getMediaPlayerAdapter$chat_gui_release(UsedeskChatScreen.kt:34)
at ru.usedesk.chat_gui.chat.messages.MessagesPage.init(MessagesPage.kt:205)
at ru.usedesk.chat_gui.chat.messages.MessagesPage.onViewCreated(MessagesPage.kt:75)
at androidx.fragment.app.Fragment.performViewCreated(Fragment.java:3147)
at androidx.fragment.app.FragmentStateManager.createView(FragmentStateManager.java:588)
at androidx.fragment.app.FragmentStateManager.moveToExpectedState(FragmentStateManager.java:272)
at androidx.fragment.app.FragmentManager.executeOpsTogether(FragmentManager.java:1943)
at androidx.fragment.app.FragmentManager.removeRedundantOperationsAndExecute(FragmentManager.java:1845)
at androidx.fragment.app.FragmentManager.execPendingActions(FragmentManager.java:1782)
at androidx.fragment.app.FragmentManager$5.run(FragmentManager.java:565)
at android.os.Handler.handleCallback(Handler.java:959)
at android.os.Handler.dispatchMessage(Handler.java:100)
at android.os.Looper.loopOnce(Looper.java:232)
at android.os.Looper.loop(Looper.java:317)
at android.app.ActivityThread.main(ActivityThread.java:8501)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:552)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:878)
Is there a fix planned?
Do you can add proguard rules in documentation without these rules? I cant generate release build with enable proguard.
-keepclassmembers class ru.usedesk.chat_sdk.data.repository.api.entity.** { ; }
-keepclassmembers class ru.usedesk.chat_sdk.entity.* { ; }
-keepclassmembers class ru.usedesk.chat_sdk.data.repository.api.loader.socket._entity.* { *; }
I am currently integrating the UseDesk SDK into an Android project that has recently migrated to using androidx.media3 for media playback, which is the latest iteration of the ExoPlayer library under the AndroidX namespace. After the migration, we have encountered compatibility issues between the UseDesk SDK and the "androidx.media3" library, specifically related to class cast exceptions when attempting to use media playback functionalities provided by the SDK.
An example of such an exception is:
java.lang.ClassCastException: androidx.media3.ui.AspectRatioFrameLayout cannot be cast to com.google.android.exoplayer2.ui.AspectRatioFrameLayout
This issue arises because the UseDesk SDK internally uses the older "com.google.android.exoplayer" package, while our project has migrated to the newer "androidx.media3" package, leading to conflicts between these dependencies.
Given the growing adoption of "androidx.media3" for its improvements and compatibility with the AndroidX ecosystem, we kindly request the consideration of migrating the UseDesk SDK's ExoPlayer dependency to "androidx.media3". This update would greatly enhance compatibility and ease integration efforts for projects that have adopted or plan to adopt the newer media library.
We understand that such migrations can involve significant updates, but we believe this change will benefit many developers in the community by ensuring better future compatibility and leveraging the latest improvements in media playback on Android.
Thank you for considering this request. We appreciate the work you do on the UseDesk SDK and look forward to any updates on this matter.
sdk 3.11.1, используем chat gui
Нестабильно встречается при hide/show фрагмента чата
Fatal Exception: java.lang.IllegalArgumentException: Requested element count -1 is less than zero.
at kotlin.sequences.SequencesKt___SequencesKt.drop(_Sequences.kt:403)
at ru.usedesk.chat_gui.chat.messages.adapters.MessagesAdapter.updateFloatingDate$lambda-7(MessagesAdapter.java:96)
at ru.usedesk.chat_gui.chat.messages.adapters.MessagesAdapter$$InternalSyntheticLambda$3$0f089bf8925961cd1e1b6a2830f61c6f72f41edbdeae4b8b3c607bc67674893c$0.run$bridge(MessagesAdapter.java:9)
at android.os.Handler.handleCallback(Handler.java:873)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:201)
at android.app.ActivityThread.main(ActivityThread.java:6864)
at java.lang.reflect.Method.invoke(Method.java)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:547)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:873)
Добрый день! Использую ваш SDK через Maven, последняя версия 1.0.7. При повторном вызове метода UsedeskSdk.initChat()
приложение падает с такой ошибкой:
java.lang.NullPointerException: Attempt to invoke virtual method 'boolean java.lang.Long.equals(java.lang.Object)' on a null object reference
at ru.usedesk.sdk.internal.domain.interactor.ChatInteractor.init(ChatInteractor.java:278)
at ru.usedesk.sdk.external.UsedeskChat.init(UsedeskChat.java:28)
at ru.usedesk.sdk.external.UsedeskSdk$UsedeskChatBox.<init>(UsedeskSdk.java:135)
at ru.usedesk.sdk.external.UsedeskSdk.initChat(UsedeskSdk.java:49)
Чат освобождал через UsedeskSdk.releaseChat()
. Пробовал заново запускать установку конфигурации UsedeskSdk.setUsedeskConfiguration()
перед вызовом UsedeskSdk.initChat()
, ошибка повторяется.
Обновил версию sdk на android проекте до 3.6.0 и получаю теперь ошибку:
ru.usedesk.common_sdk.entity.exceptions.UsedeskSocketException
DISCONNECTED
Так же есть сообщения рода:
io.socket.client.SocketIOException: It seems you are trying to reach a Socket.IO server in v2.x with a v3.x client, which is not possible
В чем может быть причина? Спасибо.
Our team switched from Helpshift to UseDesk recently. One of the features we can not find in UseDesk is ability to show an article to user to explain how modify app permissions on Huawei phones, for example. Only option is to copy article to HTML and show it in local WebView. But it have many disadvantages: need to support both versions, code become more complicated.
It there any reasons this feature is absent for Android? Our iOS developer says that UseDesk iOS SDK have it.
io.socket:socket.io-client:2.0.1 тянет за собой зависимость org.json.
Результат - крэш при старте на обфусцированной сборке.
2022-04-06 04:28:36.852 10707-10707/? E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.zvooq.openplay, PID: 10707
java.lang.NoSuchMethodError: No virtual method o(I)Lorg/json/JSONObject; in class Lorg/json/JSONArray; or its super classes (declaration of 'org.json.JSONArray' appears in /apex/com.android.art/javalib/core-libart.jar)
at com.facebook.internal.FetchedAppGateKeepersManager.k(FetchedAppGateKeepersManager.kt:2)
at com.facebook.internal.FetchedAppGateKeepersManager.j(FetchedAppGateKeepersManager.kt:14)
at com.facebook.internal.FeatureManager.a(FeatureManager.kt:2)
at com.facebook.appevents.internal.ActivityLifecycleTracker.x(ActivityLifecycleTracker.kt:2)
at com.facebook.FacebookSdk.I(FacebookSdk.kt:15)
at com.facebook.FacebookSdk.H(FacebookSdk.kt:1)
at com.facebook.internal.FacebookInitProvider.onCreate(FacebookInitProvider.kt:2)
at android.content.ContentProvider.attachInfo(ContentProvider.java:2404)
at android.content.ContentProvider.attachInfo(ContentProvider.java:2374)
at android.app.ActivityThread.installProvider(ActivityThread.java:7431)
at android.app.ActivityThread.installContentProviders(ActivityThread.java:6948)
at android.app.ActivityThread.handleBindApplication(ActivityThread.java:6719)
at android.app.ActivityThread.access$1500(ActivityThread.java:256)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2090)
at android.os.Handler.dispatchMessage(Handler.java:106)
at android.os.Looper.loopOnce(Looper.java:201)
at android.os.Looper.loop(Looper.java:288)
at android.app.ActivityThread.main(ActivityThread.java:7842)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:548)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1003)
Добрый день,
получили рассылку, что signature теперь должна быть длинной не менее 64символа.
Здесь про это инфы нет, в чате тоже. Только в статье про виджет https://usedeskkb.atlassian.net/wiki/spaces/API/pages/293863434 .
Подскажет, где правда.
Есть ли ограничение на UsedeskChatConfiguration.clientSignature или нет?
Заранее спасибо
После отправки сообщения, колбэк onMessageObservable срабатывает дважды.
override fun onMessagesObservable(messagesObservable: Observable<List<UsedeskMessage>>): Disposable? {
return messagesObservable.subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread())
.subscribe { messages ->
messages.forEach { message ->
Timber.d((message as? UsedeskMessageClientText)?.text)
}
}
}
После первого срабатывания сообщения приходят правильно
Однако после второго - список сообщений заполнен только последним отправленным сообщением.
На более старых версиях, например 3.1.6 колбэк срабатывает 1 раз.
Здравствуйте!
Импортировал ваше SDK как модуль.
При загрузке чата падает приложение, если в любом из сообщений присутствует файл из-за строки с его размером: ожидает LONG, а приходит ему String.
Task threw exception com.google.gson.JsonSyntaxException: java.lang.NumberFormatException: For input string: "806.4 KB" at com.google.gson.internal.bind.TypeAdapters$11.read(TypeAdapters.java:305) at com.google.gson.internal.bind.TypeAdapters$11.read(TypeAdapters.java:295) at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$1.read(ReflectiveTypeAdapterFactory.java:129) at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$Adapter.read(ReflectiveTypeAdapterFactory.java:220) at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$1.read(ReflectiveTypeAdapterFactory.java:129) at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$Adapter.read(ReflectiveTypeAdapterFactory.java:220) at com.google.gson.internal.bind.TypeAdapterRuntimeTypeWrapper.read(TypeAdapterRuntimeTypeWrapper.java:41) at com.google.gson.internal.bind.CollectionTypeAdapterFactory$Adapter.read(CollectionTypeAdapterFactory.java:82) at com.google.gson.internal.bind.CollectionTypeAdapterFactory$Adapter.read(CollectionTypeAdapterFactory.java:61) at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$1.read(ReflectiveTypeAdapterFactory.java:129) at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$Adapter.read(ReflectiveTypeAdapterFactory.java:220) at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$1.read(ReflectiveTypeAdapterFactory.java:129) at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$Adapter.read(ReflectiveTypeAdapterFactory.java:220) at com.google.gson.TypeAdapter.fromJsonTree(TypeAdapter.java:285) at ru.usedesk.sdk.RuntimeTypeAdapterFactory$1.read(RuntimeTypeAdapterFactory.java:222) at com.google.gson.TypeAdapter$1.read(TypeAdapter.java:199) at com.google.gson.Gson.fromJson(Gson.java:888) at com.google.gson.Gson.fromJson(Gson.java:853) at com.google.gson.Gson.fromJson(Gson.java:802) at ru.usedesk.sdk.ResponseProcessorImpl.process(ResponseProcessorImpl.java:32) at ru.usedesk.sdk.UsedeskManager$BaseEventEmitterListener.call(UsedeskManager.java:373) at io.socket.emitter.Emitter.emit(Emitter.java:117) at io.socket.client.Socket.onevent(Socket.java:338) at io.socket.client.Socket.onpacket(Socket.java:289) at io.socket.client.Socket.access$100(Socket.java:24) at io.socket.client.Socket$2$2.call(Socket.java:120) at io.socket.emitter.Emitter.emit(Emitter.java:117) at io.socket.client.Manager.ondecoded(Manager.java:427) at io.socket.client.Manager.access$1600(Manager.java:30) at io.socket.client.Manager$7.call(Manager.java:403) at io.socket.parser.IOParser$Decoder.add(IOParser.java:105) at io.socket.client.Manager.ondata(Manager.java:419) at io.socket.client.Manager.access$1000(Manager.java:30) at io.socket.client.Manager$2.call(Manager.java:370) at io.socket.emitter.Emitter.emit(Emitter.java:117) at io.socket.engineio.client.Socket.onPacket(Socket.java:551) at io.socket.engineio.client.Socket.access$1000(Socket.java:36) at io.socket.engineio.client.Socket$5.call(Socket.java:335) at io.socket.emitter.Emitter.emit(Emitter.java:117) at io.socket.engineio.client.Transport.onPacket(Transport.java:126) at io.socket.engineio.client.transports.Polling.access$700(Polling.java:18) at io.socket.engineio.client.transports.Polling$2.call(Polling.java:127) at io.socket.engineio.parser.Parser.decodePayload(Parser.java:241) at io.socket.engineio.client.transports.Polling._onData(Polling.java:135) at io.socket.engineio.client.transports.Polling.onData(Polling.java:102) at io.socket.engineio.client.transports.PollingXHR$5$1.run(PollingXHR.java:125) at io.socket.thread.EventThread$2.run(EventThread.java:80) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1167) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:641) at java.lang.Thread.run(Thread.java:764) Caused by: java.lang.NumberFormatException: For input string: "806.4 KB" at java.lang.Long.parseLong(Long.java:594) at java.lang.Long.parseLong(Long.java:636) at com.google.gson.JsonPrimitive.getAsLong(JsonPrim E: FATAL EXCEPTION: EventThread Process: com.ginzago.android, PID: 17306 com.google.gson.JsonSyntaxException: java.lang.NumberFormatException: For input string: "806.4 KB" at com.google.gson.internal.bind.TypeAdapters$11.read(TypeAdapters.java:305) at com.google.gson.internal.bind.TypeAdapters$11.read(TypeAdapters.java:295) at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$1.read(ReflectiveTypeAdapterFactory.java:129) at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$Adapter.read(ReflectiveTypeAdapterFactory.java:220) at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$1.read(ReflectiveTypeAdapterFactory.java:129) at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$Adapter.read(ReflectiveTypeAdapterFactory.java:220) at com.google.gson.internal.bind.TypeAdapterRuntimeTypeWrapper.read(TypeAdapterRuntimeTypeWrapper.java:41) at com.google.gson.internal.bind.CollectionTypeAdapterFactory$Adapter.read(CollectionTypeAdapterFactory.java:82) at com.google.gson.internal.bind.CollectionTypeAdapterFactory$Adapter.read(CollectionTypeAdapterFactory.java:61) at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$1.read(ReflectiveTypeAdapterFactory.java:129) at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$Adapter.read(ReflectiveTypeAdapterFactory.java:220) at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$1.read(ReflectiveTypeAdapterFactory.java:129) at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$Adapter.read(ReflectiveTypeAdapterFactory.java:220) at com.google.gson.TypeAdapter.fromJsonTree(TypeAdapter.java:285) at ru.usedesk.sdk.RuntimeTypeAdapterFactory$1.read(RuntimeTypeAdapterFactory.java:222) at com.google.gson.TypeAdapter$1.read(TypeAdapter.java:199) at com.google.gson.Gson.fromJson(Gson.java:888) at com.google.gson.Gson.fromJson(Gson.java:853) at com.google.gson.Gson.fromJson(Gson.java:802) at ru.usedesk.sdk.ResponseProcessorImpl.process(ResponseProcessorImpl.java:32) at ru.usedesk.sdk.UsedeskManager$BaseEventEmitterListener.call(UsedeskManager.java:373) at io.socket.emitter.Emitter.emit(Emitter.java:117) at io.socket.client.Socket.onevent(Socket.java:338) at io.socket.client.Socket.onpacket(Socket.java:289) at io.socket.client.Socket.access$100(Socket.java:24) at io.socket.client.Socket$2$2.call(Socket.java:120) at io.socket.emitter.Emitter.emit(Emitter.java:117) at io.socket.client.Manager.ondecoded(Manager.java:427) at io.socket.client.Manager.access$1600(Manager.java:30) at io.socket.client.Manager$7.call(Manager.java:403) at io.socket.parser.IOParser$Decoder.add(IOParser.java:105) at io.socket.client.Manager.ondata(Manager.java:419) at io.socket.client.Manager.access$1000(Manager.java:30) at io.socket.client.Manager$2.call(Manager.java:370) at io.socket.emitter.Emitter.emit(Emitter.java:117) at io.socket.engineio.client.Socket.onPacket(Socket.java:551) at io.socket.engineio.client.Socket.access$1000(Socket.java:36) at io.socket.engineio.client.Socket$5.call(Socket.java:335) at io.socket.emitter.Emitter.emit(Emitter.java:117) at io.socket.engineio.client.Transport.onPacket(Transport.java:126) at io.socket.engineio.client.transports.Polling.access$700(Polling.java:18) at io.socket.engineio.client.transports.Polling$2.call(Polling.java:127) at io.socket.engineio.parser.Parser.decodePayload(Parser.java:241) at io.socket.engineio.client.transports.Polling._onData(Polling.java:135) at io.socket.engineio.client.transports.Polling.onData(Polling.java:102) at io.socket.engineio.client.transports.PollingXHR$5$1.run(PollingXHR.java:125) at io.socket.thread.EventThread$2.run(EventThread.java:80) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1167) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:641) at java.lang.Thread.run(Thread.java:764) Caused by: java.lang.NumberFormatException: For input string: "806.4 KB" at java.lang.Long.parseLong(Long.java:594) E: at java.lang.Long.parseLong(Long.java:636) at com.google.gson.JsonPrimitive.getAsLong(JsonPrimitive.java:242) at com.google.gson.internal.bind.JsonTreeReader.nextLong(JsonTreeReader.java:229) at com.google.gson.internal.bind.TypeAdapters$11.read(TypeAdapters.java:303) ... 49 more
Если в модели UsedeskFile убрать size или заменить его на String - падать чат перестает, однако, все сообщения, которые были с файлами отсутствуют в массиве сообщений.
Прикладываю json одного из сообщений, из-за которого падает:
{"id":48820804,"text":"","createdAt":"2019-07-15T04:49:53Z","chat":2464664,"type":"client_to_operator","name":"","payload":{"avatar":""},"file":{"content":"https://secure.usedesk.ru/files/156697/16365336/get-chat-comment-files/ZGsxM1Z6aHlNVFE0YlVGNU9WQklVakJOYTJNNVFUMDlPanBZOG1aelFRbU5abzJzSE9CV2I5VGo=","size":"1.28 MB","previewLink":"/upload/temp_files/tickets/180_100/2019_07_15/156697/16365336/3098ff43b56675f9ad82d81c632a0b8a/488208045d2c05f26b833.jpg","canHaveFullLink":true,"fullLink":"/upload/temp_files/tickets/full/2019_07_15/156697/16365336/3098ff43b56675f9ad82d81c632a0b8a/488208045d2c05f26b833.jpg","dataType":"image_preview","fileId":4288036,"file_name":"1563165704232.jpg","name":"1563165704232.jpg","type":""}}
Hi, Usedesk team!
We are using Usedesk Chat GUI SDK in our app. Recently, we've updated the SDK version from 4.0.4
to 4.1.5
and our QA team started experiencing crashes on devices running Android 9 while trying to send an image or a video to the chat.
We were able to reproduce the issue on the following devices:
It happens for some files, but not the others. We weren't able to link the issue to a specific file. It seems that the issue manifestation depends not on the file itself, but on the way the file was saved on the device and on the internal implementation details of the ContentProvider
used to retrieve the file.
java.lang.IllegalArgumentException: No subtype found for: ""
at okhttp3.MediaType$Companion.get(MediaType.kt:111)
at ru.usedesk.common_sdk.api.multipart.MultipartConverter.convert(MultipartConverter.kt:31)
at ru.usedesk.common_sdk.api.UsedeskApiRepository.doRequestMultipart(UsedeskApiRepository.kt:73)
at ru.usedesk.chat_sdk.data.repository.api.ApiRepository.sendFile(ApiRepository.kt:259)
at ru.usedesk.chat_sdk.domain.ChatInteractor$doSendFile$2.invokeSuspend(ChatInteractor.kt:462)
at ru.usedesk.chat_sdk.domain.ChatInteractor$doSendFile$2.invoke(ChatInteractor.kt)
at ru.usedesk.chat_sdk.domain.ChatInteractor$doSendFile$2.invoke(ChatInteractor.kt)
at ru.usedesk.chat_sdk.domain.ChatInteractor.withFirstMessageLock(ChatInteractor.kt:515)
at ru.usedesk.chat_sdk.domain.ChatInteractor.doSendFile(ChatInteractor.kt:445)
at ru.usedesk.chat_sdk.domain.ChatInteractor.access$doSendFile(ChatInteractor.kt:59)
at ru.usedesk.chat_sdk.domain.ChatInteractor$sendFileQueue$1.invoke(ChatInteractor.kt:114)
at ru.usedesk.chat_sdk.domain.ChatInteractor$sendFileQueue$1.invoke(ChatInteractor.kt:114)
at ru.usedesk.chat_sdk.domain.ChatInteractor$sam$kotlinx_coroutines_flow_FlowCollector$0.emit(ChatInteractor.kt)
at kotlinx.coroutines.flow.SharedFlowImpl.collect$suspendImpl(SharedFlow.kt:382)
at kotlinx.coroutines.flow.SharedFlowImpl$collect$1.invokeSuspend(SharedFlow.kt)
at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:33)
at kotlinx.coroutines.DispatchedTask.run(DispatchedTask.kt:108)
at kotlinx.coroutines.internal.LimitedDispatcher$Worker.run(LimitedDispatcher.kt:115)
at kotlinx.coroutines.scheduling.TaskImpl.run(Tasks.kt:103)
at kotlinx.coroutines.scheduling.CoroutineScheduler.runSafely(CoroutineScheduler.kt:584)
at kotlinx.coroutines.scheduling.CoroutineScheduler$Worker.executeTask(CoroutineScheduler.kt:793)
at kotlinx.coroutines.scheduling.CoroutineScheduler$Worker.runWorker(CoroutineScheduler.kt:697)
at kotlinx.coroutines.scheduling.CoroutineScheduler$Worker.run(CoroutineScheduler.kt:684)
Suppressed: kotlinx.coroutines.internal.DiagnosticCoroutineContextException
A little investigation on our side showed that the issue was likely introduced in version 4.1.0
when OkHttp's MediaType.parse()
in MultipartConverter
was replaced by String.toMediaType()
.
But it also seems that there might be a deeper cause. It looks like, for some files, the value for OpenableColumns.DISPLAY_NAME
returned by a ContentResolver
doesn't match the actual filename and is missing the filename extension, e.g. instead of cat.jpeg
it is just cat
. When FileLoader
copies such files into the app cache, the copied files are missing the filename extension as well.
So some files in the cache end up with URIs like
file:///data/user/0/com.example/cache/1714142463651-731591104
instead of
file:///data/user/0/com.example/cache/1714142463651-731591104.jpeg
.
When the cached files are sent to the server, their MIME type is determined based on the filename extension. When the extension is missing, ContentResolver.getMimeType()
returns an empty string. This leads to a crash on v4.1.0
and above or the MediaType
being null on v4.0.6
and below.
What proguard rules I should use? App sample isn't working in release build variant
Привет! Столкнулся со следующей проблемой. Когда пользователь меняет в приложении язык, я хочу менять channelId. Я делаю это следующим образом
val config = UsedeskChatConfiguration(
companyId = "161330",
channelId = when(LocaleHelper.appLanguage) {
LocaleHelper.RU -> "30408"
else -> "34610"
},
clientEmail = email,
clientName = fullName,
clientPhoneNumber = phone
)
UsedeskChatSdk.setConfiguration(config)
usedeskFragment = UsedeskChatScreen.newInstance()
supportFragmentManager.beginTransaction()
.replace(
R.id.container,
usedeskFragment
).commit()
Однако по какой-то причине чат не меняется, у меня так же подгружаются сообщения из первого чата, который я загрузил. А должен вроде как открываться новый чистый чат.
При работе с приложением возникает проблема при смене пользователя - в onMessagesReceived
имплементации UsedeskActionListener
приходят сообщения, которые были отправлены другими пользователями до него. При разлогине я освобождаю чат (UsedeskSdk.releaseChat
), при логине нового юзера в методе UsedeskSdk.setUsedeskConfiguration
передаю другой id
и номер телефона. После полной очистки данных приложения проблема исчезает. Кажется, что проблема возникает, т.к. полностью не очищается конфигурация. Как это правильно сделать? Метода по очистке не нашел, а параметр UsedeskSdk.setUsedeskConfiguration
помечен как @NonNull
. Пробовал при разлогине передавать в этот метод пустую конфигурацию (передавал пустые строки во все поля конструктора), не помогает.
Привет!
Мне после сворачивания приложения(onPause-onStop), нужно отображать свой экран.
Проблема в том, что вы делаете BottomSheetDialog и открываете обычный диалог.
Вот и получается проблема, что надо убрать диалог(без действий юзера), а он заколочен гвоздями. Нету ни метода отмены, ни колбэка например, никак не отчистишь его в бэкстеке(не BottomSheetDialogFragment) и не отнаследуешься(ибо все в привате, и получить доступ к диалогу нету возможности).
И пока юзер не отменит его, он не уберется.
Пофиксите это пожалуйста)
При неуспешной отправке файла клиентом, сообщения могут быть дублированы. При это одно сообщение будет помечено как SEND_FAILED, а второе как SUCCESSFULLY_SENT.
Шаги для воспроизведения:
При этом, у этих двух сообщений будут разные ID: первый будет иметь отрицательный (что, как я понимаю, является локальным ID), второй положительный
Версия SDK: 3.1.8
Девайс: Samsung Galaxy S10
A declarative, efficient, and flexible JavaScript library for building user interfaces.
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google ❤️ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.