savoirfairelinux issueshttps://git.jami.net/groups/savoirfairelinux/-/issues2021-03-12T21:01:11Zhttps://git.jami.net/savoirfairelinux/jami-client-qt/-/issues/311Swarm: probleme of sync UI2021-03-12T21:01:11ZSébastien BlinSwarm: probleme of sync UIIf another device adds or removes a conversation on one device, the client will receives signal to remove conversation. For now there still have multiple sync issueIf another device adds or removes a conversation on one device, the client will receives signal to remove conversation. For now there still have multiple sync issueBackloghttps://git.jami.net/savoirfairelinux/jami-client-qt/-/issues/310Preview displayed during conf2021-03-16T20:27:31ZGuillaume HellerPreview displayed during confScenario:
- appel conférence avec compte A
- switch vers un compte B
- retour à la conf avec compte A, la preview s affiche
![Image_Pasted_at_2021-2-26_10-06](/uploads/ce1ef7884fa438b317d5f76f65c2b23c/Image_Pasted_at_2021-2-26_10-06.pn...Scenario:
- appel conférence avec compte A
- switch vers un compte B
- retour à la conf avec compte A, la preview s affiche
![Image_Pasted_at_2021-2-26_10-06](/uploads/ce1ef7884fa438b317d5f76f65c2b23c/Image_Pasted_at_2021-2-26_10-06.png)
Autre problème: les bouttons sont accessibles mais masqués (mute, unmute)
Testé avec l'appimage Jami-Swarm-x86_64 du 2021-02-25 17:09Sébastien BlinSébastien Blinhttps://git.jami.net/savoirfairelinux/jami-client-ios/-/issues/122GNU/Linux->iOS send file after call (to confirm)2021-12-29T19:06:48ZSébastien BlinGNU/Linux->iOS send file after call (to confirm)# Scenario
+ GNU/Linux call iOS
+ iOS just let ringing
+ GNU/Linux hangup
+ GNU/Linux send a file immediately after (will fail, cause iOS will cut the socket)# Scenario
+ GNU/Linux call iOS
+ iOS just let ringing
+ GNU/Linux hangup
+ GNU/Linux send a file immediately after (will fail, cause iOS will cut the socket)Backloghttps://git.jami.net/savoirfairelinux/jami-client-android/-/issues/893Request to host latest apks, Gplay updates before Fdroid2021-02-26T16:07:35ZRequest to host latest apks, Gplay updates before FdroidTo regular user who doesn't want to compile if it isn't necessary this situation seems bad. I want a latest app and beta version without using google services. Official f-droid seems to update slowly. At least encourage people that choos...To regular user who doesn't want to compile if it isn't necessary this situation seems bad. I want a latest app and beta version without using google services. Official f-droid seems to update slowly. At least encourage people that choose free software to commit by giving them the same Google already offers. And beta could have its name changed so people can test it in free time and still have the working version.https://git.jami.net/savoirfairelinux/jami-client-qt/-/issues/309Removed contacts can still be on the "default moderators" list2021-04-02T13:19:50ZAlbert Babí OllerRemoved contacts can still be on the "default moderators" list1. Set a contact as default moderator
2. Remove the contact
3. Contact is not removed from "default moderators" list (UI shows empty name and identifier).1. Set a contact as default moderator
2. Remove the contact
3. Contact is not removed from "default moderators" list (UI shows empty name and identifier).Albert Babí OllerAlbert Babí Ollerhttps://git.jami.net/savoirfairelinux/jami-daemon/-/issues/454🔊 feedback loopback echo sound2021-03-16T19:57:16Zalexis🔊 feedback loopback echo soundHi, Using the new windows client 2019-01-10 and the android client or linux 2019-01-06 I can hear my voice from the computer who is connected to me (he has windows client). So I think the echo sound filter is not working in windows cli...Hi, Using the new windows client 2019-01-10 and the android client or linux 2019-01-06 I can hear my voice from the computer who is connected to me (he has windows client). So I think the echo sound filter is not working in windows client.Andreas TraczykAndreas Traczykhttps://git.jami.net/savoirfairelinux/jami-daemon/-/issues/453Add option to enable moderation for all participant in conferences2021-03-09T22:21:43ZPierre LespagnolAdd option to enable moderation for all participant in conferencesPierre LespagnolPierre Lespagnolhttps://git.jami.net/savoirfairelinux/jami-daemon/-/issues/452Swarm check cancelFile compat + generator (same id?)2021-06-12T11:39:06ZSébastien BlinSwarm check cancelFile compat + generator (same id?)Swarm-chatSébastien BlinSébastien Blinhttps://git.jami.net/savoirfairelinux/jami-project/-/issues/1196Add information about battery savers issues to the FAQ at jami.net2022-11-18T23:04:44ZArtemy GavrelyukAdd information about battery savers issues to the FAQ at jami.netHi!
Investigating ring-daemon#429 I've learned that mostly all the popular Android phones have built in power saving mechanisms that cause issues with connectivity.
For example, to make Jami work at Samsung Galaxy S20+, you have to dis...Hi!
Investigating ring-daemon#429 I've learned that mostly all the popular Android phones have built in power saving mechanisms that cause issues with connectivity.
For example, to make Jami work at Samsung Galaxy S20+, you have to disable two different options hidden in different places.
I guess, we should add this information to the [FAQ](https://jami.net/help/) and recommend to use [Don't kill my app](https://dontkillmyapp.com) (or any other FOSS alternative) to disable these technologies. Otherwise, any regular Android user will face connectivity issues and won't be able to solve them themselves.https://git.jami.net/savoirfairelinux/jami-client-qt/-/issues/308Swarm: Crash2021-03-26T18:57:25ZSébastien BlinSwarm: Crash```
Thread 1 "jami-qt" received signal SIGABRT, Aborted.
0x00007fffedaa49d5 in raise () from /lib64/libc.so.6
(gdb) bt
#0 0x00007fffedaa49d5 in raise () at /lib64/libc.so.6
#1 0x00007fffeda8d8a4 in abort () at /lib64/libc.so.6
#2 0x00...```
Thread 1 "jami-qt" received signal SIGABRT, Aborted.
0x00007fffedaa49d5 in raise () from /lib64/libc.so.6
(gdb) bt
#0 0x00007fffedaa49d5 in raise () at /lib64/libc.so.6
#1 0x00007fffeda8d8a4 in abort () at /lib64/libc.so.6
#2 0x00007fffede33926 in __gnu_cxx::__verbose_terminate_handler() [clone .cold] () at /lib64/libstdc++.so.6
#3 0x00007fffede3f1ac in __cxxabiv1::__terminate(void (*)()) () at /lib64/libstdc++.so.6
#4 0x00007fffede3f217 in () at /lib64/libstdc++.so.6
#5 0x00007fffede3f4c9 in () at /lib64/libstdc++.so.6
#6 0x00007ffff7c9fe9f in lrc::api::ContactModel::getContact(QString const&) const (this=0x7fffbc00ed90, contactUri=<optimized out>) at /home/amarok/Projects/jami/lrc/src/contactmodel.cpp:381
#7 0x00007ffff7d0f6f4 in lrc::api::ConversationModel::getConferenceableConversations(QString const&, QString const&) const (this=0xcd24e0, convId=<optimized out>, filter=...) at /home/amarok/Projects/jami/lrc/src/conversationmodel.cpp:398
#8 0x000000000044a2f9 in SmartListModel::setConferenceableFilter(QString const&) ()
#9 0x00000000004492c2 in SmartListModel::SmartListModel(QObject*, SmartListModel::Type) ()
#10 0x00000000004923a8 in ContactAdapter::getContactSelectableModel(int) ()
#11 0x000000000042b848 in ContactAdapter::qt_static_metacall(QObject*, QMetaObject::Call, int, void**) ()
#12 0x000000000042ba4a in ContactAdapter::qt_metacall(QMetaObject::Call, int, void**) ()
#13 0x00007fffee974cf5 in QQmlObjectOrGadget::metacall(QMetaObject::Call, int, void**) const () at /lib64/libQt5Qml.so.5
#14 0x00007fffee87d149 in CallPrecise(QQmlObjectOrGadget const&, QQmlPropertyData const&, QV4::ExecutionEngine*, QV4::CallData*, QMetaObject::Call) () at /lib64/libQt5Qml.so.5
#15 0x00007fffee87e3f7 in QV4::QObjectMethod::callInternal(QV4::Value const*, QV4::Value const*, int) const () at /lib64/libQt5Qml.so.5
#16 0x00007fffee8939dd in QV4::Moth::VME::interpret(QV4::CppStackFrame*, QV4::ExecutionEngine*, char const*) () at /lib64/libQt5Qml.so.5
#17 0x00007fffee899775 in QV4::Moth::VME::exec(QV4::CppStackFrame*, QV4::ExecutionEngine*) [clone .part.0] () at /lib64/libQt5Qml.so.5
#18 0x00007fffee8387bd in QV4::Function::call(QV4::Value const*, QV4::Value const*, int, QV4::ExecutionContext const*) () at /lib64/libQt5Qml.so.5
#19 0x00007fffee993e71 in QQmlJavaScriptExpression::evaluate(QV4::CallData*, bool*) () at /lib64/libQt5Qml.so.5
#20 0x00007fffee9945e8 in QQmlBinding::evaluate(bool*) () at /lib64/libQt5Qml.so.5
#21 0x00007fffee99610b in QQmlNonbindingBinding::doUpdate(QQmlJavaScriptExpression::DeleteWatcher const&, QFlags<QQmlPropertyData::WriteFlag>, QV4::Scope&) () at /lib64/libQt5Qml.so.5
#22 0x00007fffee996ffc in QQmlBinding::update(QFlags<QQmlPropertyData::WriteFlag>) () at /lib64/libQt5Qml.so.5
#23 0x00007fffee9a2b96 in QQmlObjectCreator::finalize(QQmlInstantiationInterrupt&) () at /lib64/libQt5Qml.so.5
#24 0x00007fffee946cfc in QQmlComponentPrivate::complete(QQmlEnginePrivate*, QQmlComponentPrivate::ConstructionState*) () at /lib64/libQt5Qml.so.5
#25 0x00007fffee946ec6 in QQmlComponentPrivate::completeCreate() () at /lib64/libQt5Qml.so.5
#26 0x00007fffee94a022 in QQmlComponent::createObject(QQmlV4Function*) () at /lib64/libQt5Qml.so.5
#27 0x00007fffee94ae93 in QQmlComponent::qt_metacall(QMetaObject::Call, int, void**) () at /lib64/libQt5Qml.so.5
#28 0x00007fffee974cf5 in QQmlObjectOrGadget::metacall(QMetaObject::Call, int, void**) const () at /lib64/libQt5Qml.so.5
#29 0x00007fffee87e7c8 in QV4::QObjectMethod::callInternal(QV4::Value const*, QV4::Value const*, int) const () at /lib64/libQt5Qml.so.5
#30 0x00007fffee8939dd in QV4::Moth::VME::interpret(QV4::CppStackFrame*, QV4::ExecutionEngine*, char const*) () at /lib64/libQt5Qml.so.5
#31 0x00007fffee899775 in QV4::Moth::VME::exec(QV4::CppStackFrame*, QV4::ExecutionEngine*) [clone .part.0] () at /lib64/libQt5Qml.so.5
#32 0x00007fffee843d48 in QV4::ArrowFunction::virtualCall(QV4::FunctionObject const*, QV4::Value const*, QV4::Value const*, int) () at /lib64/libQt5Qml.so.5
#33 0x00007fffee8a8c46 in QV4::Runtime::CallQmlContextPropertyLookup::call(QV4::ExecutionEngine*, unsigned int, QV4::Value*, int) () at /lib64/libQt5Qml.so.5
#34 0x00007fffee893d37 in QV4::Moth::VME::interpret(QV4::CppStackFrame*, QV4::ExecutionEngine*, char const*) () at /lib64/libQt5Qml.so.5
#35 0x00007fffee899775 in QV4::Moth::VME::exec(QV4::CppStackFrame*, QV4::ExecutionEngine*) [clone .part.0] () at /lib64/libQt5Qml.so.5
#36 0x00007fffee843d48 in QV4::ArrowFunction::virtualCall(QV4::FunctionObject const*, QV4::Value const*, QV4::Value const*, int) () at /lib64/libQt5Qml.so.5
#37 0x00007fffee8939dd in QV4::Moth::VME::interpret(QV4::CppStackFrame*, QV4::ExecutionEngine*, char const*) () at /lib64/libQt5Qml.so.5
#38 0x00007fffee899775 in QV4::Moth::VME::exec(QV4::CppStackFrame*, QV4::ExecutionEngine*) [clone .part.0] () at /lib64/libQt5Qml.so.5
#39 0x00007fffee8387bd in QV4::Function::call(QV4::Value const*, QV4::Value const*, int, QV4::ExecutionContext const*) () at /lib64/libQt5Qml.so.5
#40 0x00007fffee993e71 in QQmlJavaScriptExpression::evaluate(QV4::CallData*, bool*) () at /lib64/libQt5Qml.so.5
#41 0x00007fffee950011 in QQmlBoundSignalExpression::evaluate(void**) () at /lib64/libQt5Qml.so.5
#42 0x00007fffee951a63 in QQmlBoundSignal_callback(QQmlNotifierEndpoint*, void**) () at /lib64/libQt5Qml.so.5
#43 0x00007fffee974c0d in QQmlNotifier::emitNotify(QQmlNotifierEndpoint*, void**) () at /lib64/libQt5Qml.so.5
#44 0x00007fffee22e2f2 in void doActivate<false>(QObject*, int, void**) () at /lib64/libQt5Core.so.5
#45 0x00007fffee93576e in QQmlVMEMetaObject::metaCall(QObject*, QMetaObject::Call, int, void**) () at /lib64/libQt5Qml.so.5
#46 0x00007fffee974cf5 in QQmlObjectOrGadget::metacall(QMetaObject::Call, int, void**) const () at /lib64/libQt5Qml.so.5
#47 0x00007fffee87c4a6 in CallPrecise(QQmlObjectOrGadget const&, QQmlPropertyData const&, QV4::ExecutionEngine*, QV4::CallData*, QMetaObject::Call) () at /lib64/libQt5Qml.so.5
#48 0x00007fffee87e3f7 in QV4::QObjectMethod::callInternal(QV4::Value const*, QV4::Value const*, int) const () at /lib64/libQt5Qml.so.5
#49 0x00007fffee8939dd in QV4::Moth::VME::interpret(QV4::CppStackFrame*, QV4::ExecutionEngine*, char const*) () at /lib64/libQt5Qml.so.5
#50 0x00007fffee899775 in QV4::Moth::VME::exec(QV4::CppStackFrame*, QV4::ExecutionEngine*) [clone .part.0] () at /lib64/libQt5Qml.so.5
#51 0x00007fffee8387bd in QV4::Function::call(QV4::Value const*, QV4::Value const*, int, QV4::ExecutionContext const*) () at /lib64/libQt5Qml.so.5
#52 0x00007fffee993e71 in QQmlJavaScriptExpression::evaluate(QV4::CallData*, bool*) () at /lib64/libQt5Qml.so.5
#53 0x00007fffee950011 in QQmlBoundSignalExpression::evaluate(void**) () at /lib64/libQt5Qml.so.5
#54 0x00007fffee951a63 in QQmlBoundSignal_callback(QQmlNotifierEndpoint*, void**) () at /lib64/libQt5Qml.so.5
#55 0x00007fffee974c0d in QQmlNotifier::emitNotify(QQmlNotifierEndpoint*, void**) () at /lib64/libQt5Qml.so.5
#56 0x00007fffee22e2f2 in void doActivate<false>(QObject*, int, void**) () at /lib64/libQt5Core.so.5
#57 0x00007fffed944081 in QQuickAbstractButtonPrivate::handleRelease(QPointF const&) () at /lib64/libQt5QuickTemplates2.so.5
#58 0x00007fffed95eaf9 in QQuickControl::mouseReleaseEvent(QMouseEvent*) () at /lib64/libQt5QuickTemplates2.so.5
#59 0x00007fffef4337f9 in QQuickItem::event(QEvent*) () at /lib64/libQt5Quick.so.5
#60 0x00007ffff7100ec3 in QApplicationPrivate::notify_helper(QObject*, QEvent*) () at /lib64/libQt5Widgets.so.5
#61 0x00007fffee1febd8 in QCoreApplication::notifyInternal2(QObject*, QEvent*) () at /lib64/libQt5Core.so.5
#62 0x00007fffef447555 in QQuickWindowPrivate::deliverMouseEvent(QQuickPointerMouseEvent*) () at /lib64/libQt5Quick.so.5
#63 0x00007fffef447ee3 in QQuickWindowPrivate::deliverPointerEvent(QQuickPointerEvent*) () at /lib64/libQt5Quick.so.5
#64 0x00007fffeeca37b5 in QWindow::event(QEvent*) () at /lib64/libQt5Gui.so.5
#65 0x00007ffff7100ec3 in QApplicationPrivate::notify_helper(QObject*, QEvent*) () at /lib64/libQt5Widgets.so.5
#66 0x00007fffee1febd8 in QCoreApplication::notifyInternal2(QObject*, QEvent*) () at /lib64/libQt5Core.so.5
#67 0x00007fffeec98143 in QGuiApplicationPrivate::processMouseEvent(QWindowSystemInterfacePrivate::MouseEvent*) () at /lib64/libQt5Gui.so.5
#68 0x00007fffeec798cc in QWindowSystemInterface::sendWindowSystemEvents(QFlags<QEventLoop::ProcessEventsFlag>) () at /lib64/libQt5Gui.so.5
#69 0x00007fffd6edf47e in xcbSourceDispatch(_GSource*, int (*)(void*), void*) () at /lib64/libQt5XcbQpa.so.5
#70 0x00007ffff769596f in g_main_context_dispatch () at /lib64/libglib-2.0.so.0
#71 0x00007ffff76e7758 in g_main_context_iterate.constprop () at /lib64/libglib-2.0.so.0
#72 0x00007ffff7692d43 in g_main_context_iteration () at /lib64/libglib-2.0.so.0
#73 0x00007fffee24b6f3 in QEventDispatcherGlib::processEvents(QFlags<QEventLoop::ProcessEventsFlag>) () at /lib64/libQt5Core.so.5
#74 0x00007fffee1fd57b in QEventLoop::exec(QFlags<QEventLoop::ProcessEventsFlag>) () at /lib64/libQt5Core.so.5
#75 0x00007fffee2051b4 in QCoreApplication::exec() () at /lib64/libQt5Core.so.5
#76 0x000000000043d1b4 in main ()
```Albert Babí OllerAlbert Babí Ollerhttps://git.jami.net/savoirfairelinux/jami-project/-/issues/1194DTMF tones broken on Linux2021-07-09T20:46:43ZLibreTechTipsDTMF tones broken on LinuxHi there, I tried the latest nightly for openSUSE Tumbleweed and placed a SIP call with my Callcentric account to a PSTN number. I couldn't find any UI elements for showing a DTMF keypad, but I did hear them when typing them on my keyboa...Hi there, I tried the latest nightly for openSUSE Tumbleweed and placed a SIP call with my Callcentric account to a PSTN number. I couldn't find any UI elements for showing a DTMF keypad, but I did hear them when typing them on my keyboard. However, the toll free number menu system could not hear the tones. Thanks a lot!https://git.jami.net/savoirfairelinux/jami-client-qt/-/issues/307Smartlist: wrong cursor for resize mode2021-08-20T19:56:24ZSébastien BlinSmartlist: wrong cursor for resize modeall is in the titleall is in the titlehttps://git.jami.net/savoirfairelinux/jami-client-qt/-/issues/306Smartlist should be reductible to 02022-03-17T20:22:04ZSébastien BlinSmartlist should be reductible to 0+ Actually, minimum smartlist size is 120px.
the smartlist should be reductible (and if size = 0, we can pass in responsive mode)+ Actually, minimum smartlist size is 120px.
the smartlist should be reductible (and if size = 0, we can pass in responsive mode)https://git.jami.net/savoirfairelinux/jami-client-qt/-/issues/305Video: Preview way too big (and should be hideable)2022-11-10T08:44:58ZSébastien BlinVideo: Preview way too big (and should be hideable)All is in the title, In a call, the preview is way too bigAll is in the title, In a call, the preview is way too bigMing Rui ZhangAndreas TraczykMing Rui Zhanghttps://git.jami.net/savoirfairelinux/jami-client-qt/-/issues/304Gnome: resize offset2021-07-16T19:58:29ZSébastien BlinGnome: resize offsetSelecting the right corner at the bottom to be able to resize the window is harder than other gtk applications (less offset). The grab zone is too smalSelecting the right corner at the bottom to be able to resize the window is harder than other gtk applications (less offset). The grab zone is too smalhttps://git.jami.net/savoirfairelinux/jami-client-qt/-/issues/303Swarm: Compat with old client is broken for incoming invitations2021-03-01T19:28:01ZAlbert Babí OllerSwarm: Compat with old client is broken for incoming invitations1. Client with stack swarm creates account A. Old client (without swarm) creates account B.
2. B sends invitation request to A.
3. A accepts invitation. Problems:
- B does not appear on the contact list until account/tab switch.
- Conver...1. Client with stack swarm creates account A. Old client (without swarm) creates account B.
2. B sends invitation request to A.
3. A accepts invitation. Problems:
- B does not appear on the contact list until account/tab switch.
- Conversation with B is empty.
- Incoming call from B gives _"ConversationModelPimpl::slotIncomingCall, but conversation not found"_
- A tries to send messages -> B sees the composing status correctly but does not receive the messages.
4. When client-qt is closed and relaunched on A, contact B does not appear anymore on the smartlist.Albert Babí OllerAlbert Babí Ollerhttps://git.jami.net/savoirfairelinux/jami-packaging/-/issues/87OpenSUSE Tumbleweed Docker image fails to build2021-04-03T05:11:59ZMaxim CournoyerOpenSUSE Tumbleweed Docker image fails to buildDue to recent changes in Tumbleweed, the Docker image now fails to build:
```
(44/66) Installing: libpython3_8-1_0-3.8.7-2.1.x86_64 [............done]
(45/66) Installing: shadow-4.8.1-5.2.x86_64 [............done]
(46/66) Installing: py...Due to recent changes in Tumbleweed, the Docker image now fails to build:
```
(44/66) Installing: libpython3_8-1_0-3.8.7-2.1.x86_64 [............done]
(45/66) Installing: shadow-4.8.1-5.2.x86_64 [............done]
(46/66) Installing: python38-3.8.7-2.1.x86_64 [........done]
(47/66) Installing: sysuser-shadow-3.0-10.1.noarch [....done]
(48/66) Installing: python38-curses-3.8.7-2.1.x86_64 [..........done]
(49/66) Installing: dbus-1-1.12.20-3.2.x86_64 [..Installation of dbus-1-1.12.20-3.2.x86_64 failed:
Error: Subprocess failed. Error: RPM failed: ERROR: neither useradd nor busybox found!
error: %prein(dbus-1-1.12.20-3.2.x86_64) scriptlet failed, exit status 1
error: dbus-1-1.12.20-3.2.x86_64: install failed
error]
Abort, retry, ignore? [a/r/i] (a): a
Warning: %posttrans scripts skipped while aborting:
pam-1.5.1-3.1.x86_64.rpm
shadow-4.8.1-5.2.x86_64.rpm
Problem occurred during or after installation or removal of packages:
Installation has been aborted as directed.
Please see the above error message for a hint.
The command '/bin/sh -c zypper --non-interactive install dnf' returned a non-zero code: 8
```
The 'fix' is to use a up-to-date Docker as well as libseccomp library, IIUC. I tried updating Docker alone but that wasn't enough to fix it. See: https://bugzilla.opensuse.org/show_bug.cgi?id=1182451.Backloghttps://git.jami.net/savoirfairelinux/jami-client-gnome/-/issues/1252Conference: Host should be able to mute video & mic2021-12-29T19:08:40ZSébastien BlinConference: Host should be able to mute video & micBackloghttps://git.jami.net/savoirfairelinux/jami-packaging/-/issues/86Build Debian ARM packages via cross-compilation rather than emulation2021-05-04T13:42:47ZMaxim CournoyerBuild Debian ARM packages via cross-compilation rather than emulationThe Debian 10 ARM packaging currently relies on user-emulation provided by QEMU. Cross-compiling such as is done for Raspbian would provide a 5x performance boost (30 minutes instead of 2 h 30 !).The Debian 10 ARM packaging currently relies on user-emulation provided by QEMU. Cross-compiling such as is done for Raspbian would provide a 5x performance boost (30 minutes instead of 2 h 30 !).Maxim CournoyerMaxim Cournoyerhttps://git.jami.net/savoirfairelinux/jami-client-qt/-/issues/302Dpi scaling level issue2021-03-15T13:31:18ZMing Rui ZhangDpi scaling level issueWhen changing scaling factors, the client should refer to native apps(e.g. Windows settings).When changing scaling factors, the client should refer to native apps(e.g. Windows settings).Ming Rui ZhangMing Rui Zhang