GithubHelp home page GithubHelp logo

android_sdk's People

Contributors

budyakov avatar nichvolod avatar om-sv avatar uncreated avatar

Stargazers

 avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar

android_sdk's Issues

Fatal Exception: java.lang.IllegalStateException Can not perform this action after onSaveInstanceState

Если после открытия экрана чата не дожидаясь полной загрузки страницы свернуть приложение, то произойдет краш.
Так выглядит код моей активности с чатом:

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

Unable to reuse UsedeskChatSdk instance

При первичной инициализации чата все работает нормально (сообщения отправляются, 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

Support android 14 and target sdk 34

Привет!
Можете пожалуйста поднять версию до 34 target sdk. На 34 версии нужно явно указывать тип запускаемого сервиса :)
А то ловим MissingForegroundServiceTypeException

Падение при передаче clientToken с зарезервированными символами

При создании конфигурации 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)

android.view.InflateException:

Hello usedesk team!

After updating from version 4.1.3 to 4.2.2 the following error appeared

Stacktrace
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?

ProguardRules

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.
* { *; }

Request to migrate ExoPlayer dependency to "androidx.media3" for better compatibility

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.

Краш в MessagesAdapter

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)

Crash on UsedeskSdk.initChat

Добрый день! Использую ваш 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(), ошибка повторяется.

UsedeskSocketException на версии 3.6.0

Обновил версию 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

В чем может быть причина? Спасибо.

(Feature request) Open KB article by id

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.

Тянется зависимость org.json:json:20090211

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)

image

Signature

Добрый день,

получили рассылку, что signature теперь должна быть длинной не менее 64символа.
Здесь про это инфы нет, в чате тоже. Только в статье про виджет https://usedeskkb.atlassian.net/wiki/spaces/API/pages/293863434 .

Подскажет, где правда.
Есть ли ограничение на UsedeskChatConfiguration.clientSignature или нет?

Заранее спасибо

onMessagesObservable called twice 3.9.0

После отправки сообщения, колбэк 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)
                        }
                    }
            }

После первого срабатывания сообщения приходят правильно
image

Однако после второго - список сообщений заполнен только последним отправленным сообщением.
image

На более старых версиях, например 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":""}}

IllegalArgumentException crash when trying to send a file using chat GUI

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:

  • Xiaomi Redmi Note 8 Pro running Android 9
  • Xiaomi Mi A1 running Android 9

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.

Here is the stack trace
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.

Proguard rules

What proguard rules I should use? App sample isn't working in release build variant

Не могу сменить channelId

Привет! Столкнулся со следующей проблемой. Когда пользователь меняет в приложении язык, я хочу менять 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. Пробовал при разлогине передавать в этот метод пустую конфигурацию (передавал пустые строки во все поля конструктора), не помогает.

Невозможно программно убрать диалог выбора файла(UndeskAttachmentDialog)

Привет!
Мне после сворачивания приложения(onPause-onStop), нужно отображать свой экран.
Проблема в том, что вы делаете BottomSheetDialog и открываете обычный диалог.
Вот и получается проблема, что надо убрать диалог(без действий юзера), а он заколочен гвоздями. Нету ни метода отмены, ни колбэка например, никак не отчистишь его в бэкстеке(не BottomSheetDialogFragment) и не отнаследуешься(ибо все в привате, и получить доступ к диалогу нету возможности).
И пока юзер не отменит его, он не уберется.
Пофиксите это пожалуйста)

Duplicated UsedeskMessageClient

При неуспешной отправке файла клиентом, сообщения могут быть дублированы. При это одно сообщение будет помечено как SEND_FAILED, а второе как SUCCESSFULLY_SENT.

Screenshot_20210421-150340_FD 19

Шаги для воспроизведения:

  1. Удостовериться в наличии интернет соединения (в моем случае я использовал WiFi)
  2. Открыть чат
  3. Прикрепить к сообщению файл из галереи (желательно большого размера, вопроизводилось при отправке изображений от 4Мб)
  4. Нажать на кнопку отправить
  5. Отключить интернет соединение (отключить WiFi)
  6. Дождаться пока на новом сообщении не появится статус SEND_FAILED
  7. Восстановить интернет соединение (включить WiFi)
  8. Дождаться появления второго изображения

При этом, у этих двух сообщений будут разные ID: первый будет иметь отрицательный (что, как я понимаю, является локальным ID), второй положительный

Версия SDK: 3.1.8
Девайс: Samsung Galaxy S10

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.