مکان اشتراک گذاری در QT Client

چطوري ازش استفاده کنم؟

استفاده معمولی

در یک مکالمه، کاربر می تواند روی آیکون مکان برای نمایش یک نقشه کلیک کند. اگر Location Services در دستگاه فعال شده باشد، موقعیت کاربر در نقشه همراه با مکان های تمام اعضای دیگر که محل خود را به اشتراک می گذارند (از تمام مکالمه های حساب انتخاب شده) نشان داده می شود. کاربر می تواند با کلیک بر روی دکمه های اشتراک مکان، اشتراک گذاری محل را فعال و خاموش کند. به طور پیش فرض، محل کاربر برای 15 دقیقه به اشتراک گذاشته می شود، اما این تنظیمات می تواند در تنظیمات برنامه تغییر کند.

هنگامی که کاربر در مکالمه ای موقعیت خود را به اشتراک می گذارد، یک آیکون مکان قرمز در آیکون مکالمه ظاهر می شود. اگر کاربر از یک عضو دیگر مکان دریافت کند، یک آیکون مکان نارنجی در تمام مکالمهایی که عضو در آن حضور دارد نمایش داده می شود.

کاربر می تواند با نقشه با حال سازی، زوم کردن و بیرون رفتن، حرکت و بسته شدن آن تعامل داشته باشد. نقشه همچنین می تواند متصل یا بدون پیوند باشد. هنگامی که نقشه بدون پیوند است، می تواند دوباره پیوند شود اگر کاربر در حساب مناسب باشد. این ویژگی به کاربر اجازه می دهد تا نقشه را در حالی که همچنان از Jami استفاده می کند، قابل مشاهده نگه دارد.

استفاده پیشرفته

اشتراک گذاری چندگانه

سناریو

کاربر در حال حاضر محل را با مکالمه A و مکالمه B به اشتراک می گذارد.

ویژگی

اگر کاربر به مکالمه C تغییر کند، نقشه هنوز قابل مشاهده است و کاربر دو گزینه دارد

  1. روی دکمه اشتراک مکان کلیک کنید تا مکان را نیز با اعضای مکالمه C به اشتراک بگذارید.

  2. روی دکمه پایان اشتراک مکان کلیک کنید. این یک پاپ اپ را به نمایش می گذارد که به کاربر اجازه می دهد یا به طور کامل اشتراک گذاری مکان را خاموش کند یا فقط اشتراک گذاری مکان خود را با اعضای مکالمه C متوقف کند.

پنجره ای که به صورت پینه شده است

اگر پنجره غیر متصل شود، کاربر نمی تواند روی دکمه اشتراک مکان کلیک کند زیرا پنجره دیگر به مکالمه متصل نیست. برای شروع به اشتراک مکان با افراد جدید، کاربر باید دوباره پنجره را چاپ کند. توجه داشته باشید که حذف پنجره بر اشتراک مکان مداوم تأثیر نمی گذارد. علاوه بر این، کلیک بر دکمه پایان اشتراک مکان در حالی که پنجره غیر متصل است تمام اشتراک مکان فعلی را متوقف می کند و هیچ پاپ اپ به کاربر اجازه می دهد تا مکالمه خاصی را برای متوقف کردن اشتراک گذاری را انتخاب کند.

حساب های متعدد

هر حساب نقشه منحصر به فرد خود را دارد. اگر کاربر نقشه را در حالی که در حساب A است، باز کند، سپس به حساب B تغییر دهد و نقشه را باز کند، دو نقشه قابل مشاهده خواهد بود. نقشه های حساب های A و B موقعیت های به اشتراک گذاشته شده را با آن حساب ها به ترتیب نمایش می دهد و کاملاً از یکدیگر جدا هستند

چطور کار ميکنه؟

مقدمه

این ویژگی به سه بخش تقسیم شده است:

  1. ارسال موقعیت

  2. دریافت موقعیت

  3. نمایش موقعیت

برای تعیین موقعیت، [Qt Positioning] (https://doc.qt.io/qt-6/qtpositioning-index.html) API استفاده می شود. هنگامی که موقعیت تعیین شده است، به عنوان یک پیام در DHT ارسال می شود و به مشتری منتقل می شود. موقعیت دریافت شده سپس با استفاده از کتابخانه جاوا اسکریپت [OpenLayers] (https://openlayers.org/) نمایش داده می شود.

ارسال موقعیت

به محض باز کردن نقشه، کلاس Positioning به استفاده از کلاس QGeoPositionInfoSource از ماژول QtPositioning توجه به بازیافت موقعیت فعلی می کند. سپس موقعیت به قالب JSON تبدیل می شود و به positionManager منتقل می شود. این کلاس کل فرآیند اشتراک موقعیت را هماهنگ می کند. سپس موقعیت از طریق تابع sendPosition() به اشتراک گذاشته می شود. به اشتراک گذاشته می شود:

  • در محل از طریق سیگنال localPositionReceived تا کاربر بتواند موقعیت خود را ببیند

  • در DHT به تمام مکالمات در لیست positionShareConvIds_. این لیست حاوی کلید تمام مکالمات است که کاربر می خواهد موقعیت خود را با آن به اشتراک بگذارد. از این کلید، URIs همه شرکت کنندگان بدست می آید و یک پیام موقعیت به هر شرکت کننده ارسال می شود.

فرمت JSON یک موقعیت به شرح زیر است:

  • نوع (ملاحظات موقعیت یا توقف)

  • عرض جغرافیایی

  • طول جغرافیایی

  • زمان (که توسط QtClient استفاده نشده است)

نمونه ای از داده ها: {\"لات\":45.51616583988481\"طول\":-73.620693\"زمان\":1671658862000,\"نوع\":\"موقف\"}

وقتی موقعیت را به دیمون می فرستید، URI نویسنده نیز منتقل می شود.

هنگامی که کاربر با مکالمه ای اشتراک گذاری موقعیت خود را متوقف می کند، شناسه مکالمه به سادگی از لیست positionShareConvIds_ حذف می شود. یک پیام "stop" نیز به هر شرکت کننده ارسال می شود.

دریافت موقعیت

وقتی یک موقعیت دریافت می شود، اسلا "onPositionReceived() " فعال می شود. چه موقعیت محلی از ماژول QtPositioning باشد یا موقعیت دیگری از یک تماس. در سطح positionManager، لیست objectListSharingUris_ تمام موقعیت های مشتری را ذخیره می کند. موقعیت یا:

  • اضافه شده (URI در لیست موجود نیست)

  • به روز شده (URI در لیست موجود است)

  • حذف شده (تایپ = " توقف ")

موقعیت در لیست به صورت یک شی از نوع positionObject ذخیره می شود. این نوع اجازه می دهد تا برای هر موقعیت یک نگهبان باشد. اگر موقعیت در یک چارچوب زمانی مشخص به روز نشود، از لیست حذف می شود.

نمایش موقعیت

هنگامی که یک موقعیت دریافت می شود (slot onPositionReceived() ) ، موقعیت به Qml منتقل می شود که به نوبه خود اطلاعات را به کتابخانه [OpenLayers] (https://openlayers.org/) جاوا اسکریپت ارسال می کند. ماژول Qt WebEngine اجازه می دهد تا پل بین فناوری وب کتابخانه و Qml باشد. هر موقعیت توسط یک لایه اضافه شده به نقشه نمایش داده می شود. تابع newPosition() یک لایه جدید اضافه می کند، تابع updatePosition() عملکرد هماهنگی لایه را به روز می کند و تابع removePosition() طبقه را حذف می کند.