2
0
mirror of https://github.com/KDE/kdeconnect-android synced 2025-08-31 06:05:12 +00:00

Compare commits

..

21 Commits

Author SHA1 Message Date
l10n daemon script
1d833841f5 GIT_SILENT made messages (after extraction) 2025-08-30 02:04:43 +00:00
l10n daemon script
90f7b190dd GIT_SILENT made messages (after extraction) 2025-08-22 02:01:24 +00:00
l10n daemon script
f08b0f0f1c GIT_SILENT Sync po/docbooks with svn 2025-08-21 02:34:28 +00:00
l10n daemon script
0fbbf1d6ed GIT_SILENT made messages (after extraction) 2025-08-16 02:03:09 +00:00
l10n daemon script
66db45b39e GIT_SILENT Sync po/docbooks with svn 2025-08-15 02:45:26 +00:00
l10n daemon script
c9bdcbbf9b GIT_SILENT made messages (after extraction) 2025-08-15 02:17:56 +00:00
l10n daemon script
ccaccee653 GIT_SILENT made messages (after extraction) 2025-08-13 02:01:55 +00:00
l10n daemon script
2ced849bd0 GIT_SILENT Sync po/docbooks with svn 2025-08-12 02:29:00 +00:00
l10n daemon script
f0b879e830 GIT_SILENT made messages (after extraction) 2025-08-11 02:03:04 +00:00
l10n daemon script
e84568ffb5 GIT_SILENT made messages (after extraction) 2025-08-06 02:10:15 +00:00
l10n daemon script
6cc41ab890 GIT_SILENT Sync po/docbooks with svn 2025-08-05 02:51:31 +00:00
l10n daemon script
038c96fe35 GIT_SILENT made messages (after extraction) 2025-08-05 02:23:48 +00:00
l10n daemon script
56e4b20d1f GIT_SILENT made messages (after extraction) 2025-07-29 02:01:57 +00:00
l10n daemon script
689ccff843 GIT_SILENT Sync po/docbooks with svn 2025-07-16 03:01:09 +00:00
Mohammed Aquib Azad
4e83693dc7 Bug 494056 - Smooth volume changes on media control plugin 2025-07-12 14:57:19 -07:00
Philip Cohn-Cort
a0a6accc66 Fix Regex syntax in DeviceHost.kt 2025-07-07 17:43:26 -04:00
David Barouh
f6f7d1e970 Edit DeviceHost.kt
Add the `:` character in the regex recognizing the IP address, to recognize IPv6 too.
2025-07-04 17:50:43 +00:00
l10n daemon script
ddda58e896 GIT_SILENT made messages (after extraction) 2025-07-03 08:11:42 +00:00
Albert Vaca Cintora
4f796446d6 Bump deps 2025-07-02 21:14:07 +02:00
Albert Vaca Cintora
04f5863f6a Add TODO 2025-07-02 08:55:18 +02:00
Albert Vaca Cintora
c0c5ba1024 Fix devices not being clickable in share activity 2025-07-02 08:34:29 +02:00
29 changed files with 145 additions and 244 deletions

View File

@@ -298,6 +298,7 @@ SPDX-License-Identifier: GPL-2.0-only OR GPL-3.0-only OR LicenseRef-KDE-Accepted
android:name="android.support.PARENT_ACTIVITY"
android:value="org.kde.kdeconnect.Plugins.MousePadPlugin.MousePadActivity" />
</activity>
<!-- TODO: Remove? This is only used by https://github.com/andOTP/andOTP, which is unmaintained since 2021. Do people use forks or can we remove this? -->
<activity
android:name="org.kde.kdeconnect.Plugins.MousePadPlugin.SendKeystrokesToHostActivity"
android:label="@string/pref_plugin_mousepad_send_keystrokes"

View File

@@ -4,11 +4,11 @@
- الوصول إلى الملفات الموجودة على هاتفك من حاسوبك، دون أسلاك.
- الحافظة المشتركة: النسخ واللصق بين أجهزتك.
- الحصول على إشعارات للمكالمات والرسائل الواردة على حاسوبك.
- لوحة اللمس الافتراضية: استخدم شاشة هاتفك كلوحة لمس لحاسوبك.
- لوحة اللمس افتراضية: استخدم شاشة هاتفك كلوحة لمس لحاسوبك.
- مزامنة الإشعارات: الوصول إلى إشعارات هاتفك من حاسوبك والرد على الرسائل.
- التحكم عن بعد في الوسائط المتعددة: استخدم هاتفك كجهاز تحكم عن بعد لمشغلات الوسائط لينكس.
- اتصال واي فاي: لا حاجة إلى سلك USB أو بلوتوث.
- تشفير TLS من البداية إلى النهاية: معلوماتك آمنة.
- اتصال واي فاي: لا حاجة إلى سلك يو اس بي أو بلوتوث.
- تعمية TLS من البداية إلى النهاية: معلوماتك آمنة.
يرجى ملاحظة أنك ستحتاج إلى تثبيت جسر كِيدِي على حاسوبك حتى يعمل هذا التطبيق، والحفاظ على تحديث إصدار سطح المكتب بإصدار أندوريد حتى تعمل أحدث الميزات.
@@ -16,6 +16,6 @@
* إذن إمكانية الوصول: مطلوب لتلقي إدخال من جهاز آخر للتحكم في هاتف أندرويد خاص بك، إذا كنت تستخدم ميزة الإدخال عن بُعد.
* إذن تحديد الموقع في الخلفية: مطلوب لمعرفة شبكة واي فاي التي تتصل بها، إذا كنت تستخدم ميزة الشبكات الموثوقة.
لا يرسل جسر كِيدِي أي معلومات إلى كيدي أو إلى أي طرف ثالث. يرسل جسر كِيدِي البيانات من جهاز إلى آخر مباشرةً باستخدام الشبكة المحلية، وليس عبر الإنترنت، وباستخدام التشفير من البداية إلى النهاية.
لا يرسل جسر كِيدِي أي معلومات إلى كيدي أو إلى أي طرف ثالث. يرسل جسر كِيدِي البيانات من جهاز إلى آخر مباشرةً باستخدام الشبكة المحلية، وليس عبر الإنترنت، وباستخدام التعمية من البداية إلى النهاية.
هذا التطبيق جزء من مشروع مفتوح المصدر وهو موجود بفضل جميع الأشخاص الذين ساهموا فيه. قم بزيارة الموقع الإلكتروني للحصول على الشفرة المصدرية.
هذا التطبيق جزء من مشروع مفتوح المصدر وهو موجود بفضل جميع الأشخاص الذين ساهموا فيه. زر الموقع الإلكتروني للحصول على الشفرة المصدرية.

View File

@@ -1,9 +1,9 @@
[versions]
activityCompose = "1.10.1"
androidDesugarJdkLibs = "2.1.5"
androidGradlePlugin = "8.10.1"
androidGradlePlugin = "8.11.0"
androidSmsmms = "kdeconnect-1-21-0"
appcompat = "1.7.0"
appcompat = "1.7.1"
bcpkixJdk15on = "1.70"
classindexksp = "1.2"
commonsCollections4 = "4.5.0"
@@ -17,11 +17,11 @@ documentfile = "1.1.0"
gridlayout = "1.1.0"
jsonassert = "1.5.3"
junit = "4.13.2"
kotlin = "2.1.21"
kspPlugin = "2.1.21-2.0.1"
kotlin = "2.2.0"
kspPlugin = "2.2.0-2.0.2"
kotlinxCoroutinesCore = "1.10.2"
lifecycleExtensions = "2.2.0"
lifecycleRuntimeKtx = "2.9.0"
lifecycleRuntimeKtx = "2.9.1"
logger = "1.0.3"
material = "1.12.0"
material3 = "1.3.2"
@@ -35,7 +35,7 @@ rxjava = "2.2.21"
sl4j = "2.0.13"
sshdCore = "2.15.0"
swiperefreshlayout = "1.1.0"
uiToolingPreview = "1.8.2"
uiToolingPreview = "1.8.3"
univocityParsers = "2.9.1"
[libraries]

View File

@@ -5,7 +5,7 @@ msgstr ""
"Project-Id-Version: \n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2023-11-05 12:31+0000\n"
"PO-Revision-Date: 2025-05-31 17:29+0400\n"
"PO-Revision-Date: 2025-08-20 21:20+0400\n"
"Last-Translator: Zayed Al-Saidi <zayed.alsaidi@gmail.com>\n"
"Language-Team: ar\n"
"Language: ar\n"
@@ -13,7 +13,7 @@ msgstr ""
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 "
"&& n%100<=10 ? 3 : n%100>=11 && n%100<=99 ? 4 : 5;\n"
"&& n%100<=10 ? 3 : n%100>=11 ? 4 : 5;\n"
"X-Generator: Lokalize 23.08.5\n"
msgid ""
@@ -55,12 +55,12 @@ msgstr ""
"- الوصول إلى الملفات الموجودة على هاتفك من حاسوبك، دون أسلاك.\n"
"- الحافظة المشتركة: النسخ واللصق بين أجهزتك.\n"
"- الحصول على إشعارات للمكالمات والرسائل الواردة على حاسوبك.\n"
"- لوحة اللمس الافتراضية: استخدم شاشة هاتفك كلوحة لمس لحاسوبك.\n"
"- لوحة اللمس افتراضية: استخدم شاشة هاتفك كلوحة لمس لحاسوبك.\n"
"- مزامنة الإشعارات: الوصول إلى إشعارات هاتفك من حاسوبك والرد على الرسائل.\n"
"- التحكم عن بعد في الوسائط المتعددة: استخدم هاتفك كجهاز تحكم عن بعد لمشغلات "
"الوسائط لينكس.\n"
"- اتصال واي فاي: لا حاجة إلى سلك USB أو بلوتوث.\n"
"- تشفير TLS من البداية إلى النهاية: معلوماتك آمنة.\n"
"- اتصال واي فاي: لا حاجة إلى سلك يو اس بي أو بلوتوث.\n"
"- تعمية TLS من البداية إلى النهاية: معلوماتك آمنة.\n"
"\n"
"يرجى ملاحظة أنك ستحتاج إلى تثبيت جسر كِيدِي على حاسوبك حتى يعمل هذا التطبيق، "
"والحفاظ على تحديث إصدار سطح المكتب بإصدار أندوريد حتى تعمل أحدث الميزات.\n"
@@ -73,7 +73,7 @@ msgstr ""
"\n"
"لا يرسل جسر كِيدِي أي معلومات إلى كيدي أو إلى أي طرف ثالث. يرسل جسر كِيدِي "
"البيانات من جهاز إلى آخر مباشرةً باستخدام الشبكة المحلية، وليس عبر الإنترنت، "
"وباستخدام التشفير من البداية إلى النهاية.\n"
"وباستخدام التعمية من البداية إلى النهاية.\n"
"\n"
"هذا التطبيق جزء من مشروع مفتوح المصدر وهو موجود بفضل جميع الأشخاص الذين "
"ساهموا فيه. قم بزيارة الموقع الإلكتروني للحصول على الشفرة المصدرية.\n"
"ساهموا فيه. زر الموقع الإلكتروني للحصول على الشفرة المصدرية.\n"

View File

@@ -13,7 +13,7 @@ msgstr ""
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 "
"&& n%100<=10 ? 3 : n%100>=11 && n%100<=99 ? 4 : 5;\n"
"&& n%100<=10 ? 3 : n%100>=11 ? 4 : 5;\n"
"X-Generator: Lokalize 23.08.5\n"
msgid "KDE Connect integrates your smartphone and computer"

View File

@@ -1,5 +1,5 @@
# Frederik Schwarzer <schwarzer@kde.org>, 2023.
# tobi <onewayme001@posteo.de>, 2024.
# SPDX-FileCopyrightText: 2023 Frederik Schwarzer <schwarzer@kde.org>
# SPDX-FileCopyrightText: 2024 tobi <onewayme001@posteo.de>
#. extracted from ./metadata/android/en-US/full_description.txt
msgid ""
msgstr ""

View File

@@ -1,4 +1,4 @@
# Frederik Schwarzer <schwarzer@kde.org>, 2023.
# SPDX-FileCopyrightText: 2023 Frederik Schwarzer <schwarzer@kde.org>
#. extracted from ./metadata/android/en-US/short_description.txt
msgid ""
msgstr ""

View File

@@ -6,7 +6,7 @@
<string name="foreground_notification_devices">متّصل بـ: %s</string>
<string name="foreground_notification_send_clipboard">أرسل الحافظة</string>
<string name="pref_plugin_telephony">مُخطِر المهاتفة</string>
<string name="pref_plugin_telephony_desc">أرسل إخطارات للمكالمات الواردة</string>
<string name="pref_plugin_telephony_desc">أرسل إشعارات للمكالمات الواردة</string>
<string name="pref_plugin_battery">تقرير البطّاريّة</string>
<string name="pref_plugin_battery_desc">بلّغ عن حالة البطّاريّة دوريًّا</string>
<string name="pref_plugin_connectivity_report">تقرير الاتصال</string>
@@ -42,7 +42,7 @@
<string name="cancel">ألغِ</string>
<string name="open_settings">افتح الإعدادات</string>
<string name="no_permissions">عليك إعطاء التّطبيق صلاحيّات للنّفاذ إلى الإشعارات</string>
<string name="no_permission_mprisreceiver">لتكون قادرًا على التحكم في مشغلات الوسائط الخاصة بك ، تحتاج إلى منح حق الوصول إلى الإشعارات</string>
<string name="no_permission_mprisreceiver">لتكون قادرًا على التحكم في مشغلات الوسائط الخاصة بك، تحتاج إلى منح حق الوصول إلى الإشعارات</string>
<string name="no_permissions_remotekeyboard">لتلقي ضغطات المفاتيح تحتاج إلى تنشيط لوحة المفاتيح البعيدة لجسر كِيدِي</string>
<string name="send_ping">أرسل وخزة ping</string>
<string name="open_mpris_controls">متحكّمات الوسائط المتعدّدة</string>
@@ -113,7 +113,7 @@
<string name="cancel_pairing">ألغ الاقتران</string>
<string name="unknown_device">جهاز مجهول</string>
<string name="error_not_reachable">الجهاز غير قابل الوصول</string>
<string name="error_already_paired">الجهاز مقترن بالفعل</string>
<string name="error_already_paired">الجهاز مقترن فعلًا</string>
<string name="error_timed_out">انتهت المهلة</string>
<string name="error_clocks_not_match">ساعات الجهاز غير متزامنة</string>
<string name="error_canceled_by_user">ألغاه المستخدم</string>
@@ -201,7 +201,7 @@
<string name="request_pairing">اطلب الاقتران</string>
<string name="pairing_accept">اقبل</string>
<string name="pairing_reject">ارفض</string>
<string name="pairing_explanation">سيؤدي إقران جهازين إلى منحهما إمكانية الوصول إلى بعضهما البعض. قم بإقران أجهزتك الخاصة بك فقط.</string>
<string name="pairing_explanation">سيؤدي إقران جهازين إلى منحهما إمكانية الوصول إلى بعضهما البعض. أقرن أجهزتك الخاصة بك فقط.</string>
<string name="settings">إعدادات</string>
<string name="mpris_play">شغّل</string>
<string name="mpris_pause">ألبث</string>
@@ -236,10 +236,10 @@
<string name="custom_devices_settings_summary">%d أجهزة مضافة يدوياً</string>
<string name="custom_device_list">أضف أجهزة بعنوان IP</string>
<string name="custom_device_deleted">حُذف الجهاز المخصّص</string>
<string name="custom_device_list_help">إذا لم يُكتشف جهازك آلياً يمكنك إضافة عنوان IP الخاص به أو اسم المضيف الخاص به من خلال النقر على زر الإجراء العائم</string>
<string name="custom_device_list_help">إذا لم يُكتشف جهازك آليّاً يمكنك إضافة عنوان IP الخاص به أو اسم المضيف الخاص به من خلال النقر على زر الإجراء العائم</string>
<string name="custom_device_fab_hint">أضف جهازاً</string>
<string name="undo">تراجع</string>
<string name="share_notification_preference">إخطارات مزعجة</string>
<string name="share_notification_preference">إشعارات مزعجة</string>
<string name="share_notification_preference_summary">اهتزّ وشغّل صوتًا عند استقبال ملفّ</string>
<string name="share_destination_customize">خصص مجلد المقصد</string>
<string name="share_destination_customize_summary_disabled">ستظهر الملفات المستلمة في التنزيلات</string>
@@ -247,9 +247,9 @@
<string name="share_destination_folder_preference">مجلد الوجهة</string>
<string name="share">شارك</string>
<string name="share_received_file">شارك \"%s\"</string>
<string name="title_activity_notification_filter">مرشّح الإخطارات</string>
<string name="filter_apps_info">ستُزامن الإخطارات من التّطبيقات المحدّدة.</string>
<string name="show_notification_if_screen_off">أرسل تنبيهات فقط إذا كانت الشاشة مغلقة</string>
<string name="title_activity_notification_filter">مرشّح الإشعارات</string>
<string name="filter_apps_info">ستُزامن الإشعارات من التّطبيقات المحدّدة.</string>
<string name="show_notification_if_screen_off">أرسل إشعارات فقط إذا كانت الشاشة مغلقة</string>
<string name="add_device_dialog_title">أضف جهازاً</string>
<string name="add_device_hint">اسم المضيف أو عنوان IP</string>
<string name="sftp_preference_configured_storage_locations">أماكن التّخزين المضبوطة</string>
@@ -276,7 +276,7 @@
<string name="refresh">حدّث</string>
<string name="unreachable_description">الجهاز المقترن هذا لا يمكن الوصول إليه. تأكّد من اتّصاله بنفس الشّبكة.</string>
<string name="no_wifi">أنت غير متصل بشبكة واي فاي، لذلك قد لا تتمكن من رؤية أي أجهزة. انقر هنا لتمكين واي فاي.</string>
<string name="on_non_trusted_message">ليس على شبكة موثوق بها: الاكتشاف التلقائي معطل.</string>
<string name="on_non_trusted_message">ليس على شبكة موثوق بها: الاكتشاف الآليّ معطل.</string>
<string name="no_file_browser">لا متصفّحات ملفّات مثبّتة.</string>
<string name="pref_plugin_telepathy">أرسل رسالة نصية قصيرة</string>
<string name="pref_plugin_telepathy_desc">أرسل رسائل نصّيّة من سطح المكتب</string>
@@ -347,27 +347,27 @@
<string name="settings_export_logs_text">أنشئ ملفًا يحتوي على معلومات التنفيذ التي يمكن أن تساعد في استكشاف المشكلات وإصلاحها.</string>
<string name="settings_more_settings_title">المزيد من الإعدادات</string>
<string name="settings_more_settings_text">يمكن العثور على إعدادات لكل جهاز ضمن ”إعدادات الملحقة“ من داخل الجهاز.</string>
<string name="setting_persistent_notification">أظهر الإخطارات المستمرّة</string>
<string name="setting_persistent_notification_oreo">الإخطارات المستمرّة</string>
<string name="setting_persistent_notification">أظهر الإشعارات المستمرّة</string>
<string name="setting_persistent_notification_oreo">الإشعارات المستمرّة</string>
<string name="setting_persistent_notification_description">اطرق للتمكين/التعطيل في إعدادات الإشعارات</string>
<string name="extra_options">الخيارات الإضافية</string>
<string name="privacy_options">خيارات الخصوصية</string>
<string name="set_privacy_options">حدد خيارات الخصوصية</string>
<string name="block_contents">امنح محتويات الإخطارات</string>
<string name="block_images">امنع الصور في الإخطارات</string>
<string name="notification_channel_receivenotification">إخطارات من أجهزة أخرى</string>
<string name="block_contents">امنح محتويات الإشعارات</string>
<string name="block_images">امنع الصور في الإشعارات</string>
<string name="notification_channel_receivenotification">إشعارات من أجهزة أخرى</string>
<string name="no_app_for_opening">لا يوجد تطبيق مناسب لفتح هذا الملف</string>
<string name="remote_keyboard_service">لوحة مفاتيح بعيده لجسر كِيدِي</string>
<string name="presenter_pointer">المؤشر</string>
<string name="trusted_networks">الشّبكات الموثوقة</string>
<string name="trusted_networks_desc">اقَصْر الاكتشاف التلقائي على الشبكات المعروفة</string>
<string name="trusted_networks_desc">اقَصْر الاكتشاف الآليّ على الشبكات المعروفة</string>
<string name="add_trusted_network">أضف %1s</string>
<string name="empty_trusted_networks_list_text">لم تضف أي شبكة موثوق بها حتى الآن</string>
<string name="allow_all_networks_text">اسمح للكل</string>
<string name="location_permission_needed_title">الإذن مطلوب</string>
<string name="bluetooth_permission_needed_desc">يحتاج جسر كِيدِي إلى إذن للاتصال بالأجهزة القريبة لإتاحة الأجهزة المقترنة باستخدام البلوتوث في جسر كِيدِي.</string>
<string name="location_permission_needed_desc">يحتاج جسر كِيدِي إلى إذن الموقع في الخلفية لمعرفة شبكة الواي فاي التي تتصل بها حتى عندما يكون التطبيق في الخلفية. وذلك لأنه يمكن استخدام اسم شبكات الواي فاي من حولك للعثور على موقعك، حتى وإن لم يكن هذا ما يفعله جسر كِيدِي.</string>
<string name="clipboard_android_x_incompat">قام أندرويد 10 بإزالة وصول للحافظة إلى جميع التطبيقات. ستعطل هذه الملحقة.</string>
<string name="clipboard_android_x_incompat">أزال أندرويد 10 الوصول للحافظة إلى جميع التطبيقات. ستعطل هذه الملحقة.</string>
<string name="mpris_open_url">استمر في التشغيل هنا</string>
<string name="cant_open_url">تعذر فتح العنوان للاستمرار في التشغيل</string>
<string name="bigscreen_home">المنزل</string>
@@ -416,7 +416,7 @@
<string name="thanks_to">الشكر إلى</string>
<string name="easter_egg">بيض الفصح</string>
<string name="email_contributor">راسل المساهم:\n%s</string>
<string name="visit_contributors_homepage">زر صفحة المساهم الرئيسية\n%s</string>
<string name="visit_contributors_homepage">زر صفحة المساهم الرئيسة\n%s</string>
<string name="version">الإصدار %s</string>
<string name="about_kde">عن كِيدِي</string>
<string name="kde_be_free">كِيدِي- كن حرًّا!</string>
@@ -425,16 +425,16 @@
<string name="rise_up">ارفع</string>
<string name="rise_down">اخفض</string>
<string name="click_here_to_type">اطُرق هنا لتكتب</string>
<string name="clear_compose">امسح</string>
<string name="clear_compose">امحُ</string>
<string name="send_compose">أرسل</string>
<string name="compose_send_title">اكتب أرسل</string>
<string name="open_compose_send">اكتب نصًا</string>
<string name="double_tap_to_drag">طرق مزدوج للسحب</string>
<string name="hold_to_drag">اضغط مع الاستمرار للسحب</string>
<string name="about_kde_about"><h1>حول</h1>" "<p>كيدي مجتمع عالمي من مهندسي البرمجيات والفنانين والكتاب والمترجمين والمبدعين الملتزمين بتطوير البرمجيات الحرة. تُنتج كيدي بيئة سطح المكتب بلازما، ومئات التطبيقات، والعديد من مكتبات البرمجيات التي تدعمها.</p>" "<p>كيدي مشروع تعاوني: لا تتحكم جهة واحدة في توجهاته أو منتجاته. بل نعمل معًا لتحقيق هدفنا المشترك المتمثل في بناء أفضل برمجيات حرة في العالم. الجميع مدعوون للانضمام والمساهمة في كيدي، بمن فيهم أنت.</p>" قم بزيارة &lt;a href=https://www.kde.org/&gt;https://www.kde.org/&lt;/a&gt; للحصول على مزيد من المعلومات حول مجتمع كيدي والبرمجيات التي ننتجها"</string>
<string name="about_kde_about"><h1>حول</h1>" "<p>كيدي مجتمع عالمي من مهندسي البرمجيات والفنانين والكتاب والمترجمين والمبدعين الملتزمين بتطوير البرمجيات الحرة. تُنتج كيدي بيئة سطح المكتب بلازما، ومئات التطبيقات، والعديد من مكتبات البرمجيات التي تدعمها.</p>" "<p>كيدي مشروع تعاوني: لا تتحكم جهة واحدة في توجهاته أو منتجاته. بل نعمل معًا لتحقيق هدفنا المشترك المتمثل في بناء أفضل برمجيات حرة في العالم. الجميع مدعوون للانضمام والمساهمة في كيدي، بمن فيهم أنت.</p>" زر &lt;a href=https://www.kde.org/&gt;https://www.kde.org/&lt;/a&gt; للحصول على مزيد من المعلومات حول مجتمع كيدي والبرمجيات التي ننتجها"</string>
<string name="about_kde_report_bugs_or_wishes">&lt;h1&gt;الإبلاغ عن الأخطاء أو الرغبات&lt;/h1&gt; &lt;p&gt;يمكن دائمًا تحسين البرامج، وفريق كيدي مستعدٌّ لذلك. ومع ذلك، يجب عليك - كمستخدم - إبلاغنا عندما لا يعمل شيءٌ ما كما هو متوقع أو عندما يكون من الممكن تحسينه.&lt;/p&gt; &lt;p&gt;تحتوي كيدي على نظام تتبع للأخطاء. تفضل بزيارة &lt;a href=https://bugs.kde.org/&gt;https://bugs.kde.org/&lt;/a&gt; أو استخدم زر \"الإبلاغ عن خطأ\" من شاشة \"حول\" للإبلاغ عن الأخطاء.&lt;/p&gt; إذا كانت لديك أي اقتراحات للتحسين، فنرحب بك باستخدام نظام تتبع الأخطاء لتسجيل رغبتك. تأكد من استخدام مستوى الخطورة المسمى \"قائمة الأمنيات\".</string>
<string name="about_kde_join_kde">&lt;h1&gt;انضم إلى كيدي&lt;/h1&gt; &lt;p&gt;لا يلزم أن تكون مطور برامج لكي تكون عضوًا في فريق كيدي. يمكنك الانضمام إلى فرق اللغات التي تترجم واجهات البرامج. يمكنك توفير الرسومات والموضوعات والأصوات والوثائق المُحسّنة. القرار لك! &lt;p&gt;قم بزيارة &lt;a href=https://community.kde.org/Get_Involved&gt;https://community.kde.org/Get_Involved&lt;/a&gt; للحصول على معلومات حول بعض المشاريع التي يمكنك المشاركة فيها.&lt;/p&gt; إذا كنت بحاجة إلى مزيد من المعلومات أو الوثائق، فإن زيارة &lt;a href=https://techbase.kde.org/&gt;https://techbase.kde.org/&lt;/a&gt; ستوفر لك ما تحتاجه.</string>
<string name="about_kde_support_kde">&lt;h1&gt;دعم كيدي&lt;/h1&gt; &lt;p&gt;برامج كيدي متاحة دائمًا بالمجان، ولكن إنشاءها ليس مجانيًا.&lt;/p&gt; &lt;p&gt;لدعم التطوير، قام مجتمع كيدي بتأسيس KDE e.V.، وهي منظمة غير ربحية تأسست بشكل قانوني في ألمانيا. تمثل KDE e.V. مجتمع كيدي في الشؤون القانونية والمالية. انظر &lt;a href=https://ev.kde.org/&gt;https://ev.kde.org/&lt;/a&gt; للحصول على معلومات حول KDE e.V.&lt;/p&gt; &lt;p&gt;يستفيد كيدي من العديد من أنواع المساهمات، بما في ذلك المساهمات المالية. نحن نستخدم الأموال لتعويض الأعضاء وغيرهم عن النفقات التي يتكبدونها عند المساهمة. ويتم استخدام المزيد من الأموال للدعم القانوني وتنظيم المؤتمرات والاجتماعات.&lt;/p&gt; &lt;p&gt;نود أن نشجعكم على دعم جهودنا من خلال التبرع المالي، باستخدام إحدى الطرق الموضحة في &lt;a href=https://www.kde.org/community/donations/&gt;https://www.kde.org/community/donations/&lt;/a&gt;.&lt;/p&gt; نشكركم جزيل الشكر مقدمًا على دعمكم.</string>
<string name="about_kde_join_kde">&lt;h1&gt;انضم إلى كيدي&lt;/h1&gt; &lt;p&gt;لا يلزم أن تكون مطور برامج لكي تكون عضوًا في فريق كيدي. يمكنك الانضمام إلى فرق اللغات التي تترجم واجهات البرامج. يمكنك توفير الرسومات والموضوعات والأصوات والوثائق المُحسّنة. القرار لك! &lt;p&gt;زر &lt;a href=https://community.kde.org/Get_Involved&gt;https://community.kde.org/Get_Involved&lt;/a&gt; للحصول على معلومات حول بعض المشاريع التي يمكنك المشاركة فيها.&lt;/p&gt; إذا كنت بحاجة إلى مزيد من المعلومات أو الوثائق، فإن زيارة &lt;a href=https://techbase.kde.org/&gt;https://techbase.kde.org/&lt;/a&gt; ستوفر لك ما تحتاجه.</string>
<string name="about_kde_support_kde">"&lt;h1&gt;دعم كيدي&lt;/h1&gt; &lt;p&gt;برامج كيدي متاحة دائمًا بالمجان، ولكن إنشاءها ليس مجانيًا.&lt;/p&gt; &lt;p&gt;لدعم التطوير، أسس مجتمع كيدي KDE e.V.، وهي منظمة غير ربحية تأسست بشكل قانوني في ألمانيا. تمثل KDE e.V. مجتمع كيدي في الشؤون القانونية والمالية. انظر &lt;a href=https://ev.kde.org/&gt;https://ev.kde.org/&lt;/a&gt; للحصول على معلومات حول KDE e.V.&lt;/p&gt; &lt;p&gt;تستفيد كيدي من العديد من أنواع المساهمات، بما في ذلك المساهمات المالية. نحن نستخدم الأموال لتعويض الأعضاء وغيرهم عن النفقات التي يتكبد عند المساهمة. وتستخدم الأموال للدعم القانوني وتنظيم المؤتمرات والاجتماعات.&lt;/p&gt; &lt;p&gt;نود أن نشجعكم على دعم جهودنا من خلال التبرع المالي، باستخدام إحدى الطرق الموضحة في &lt;a href=https://www.kde.org/community/donations/&gt;https://www.kde.org/community/donations/&lt;/a&gt;.&lt;/p&gt; نشكركم جزيل الشكر مقدمًا على دعمكم."</string>
<string name="maintainer_and_developer">الصائن ومطوّر</string>
<string name="developer">مطوّر</string>
<string name="apple_support">دعم ماك أو إس. العمل على دعم iOS</string>
@@ -451,7 +451,7 @@
<string name="tap_to_execute">اطرق لتنفيذه</string>
<string name="plugin_stats">ملحقة الإحصائيات</string>
<string name="enable_udp_broadcast">مكّن اكتشاف الجهاز عن طريق UDP</string>
<string name="enable_bluetooth">فعّل بلوتوث (بيتا)</string>
<string name="enable_bluetooth">مكّن بلوتوث (بيتا)</string>
<string name="receive_notifications_permission_explanation">يجب السماح بتلقي الإشعارات من الأجهزة الأخرى</string>
<string name="findmyphone_notifications_explanation">إذن الإشعارات مطلوب حتى يتمكن الهاتف من الرنين عندما يكون التطبيق في الخلفية</string>
<string name="no_notifications">الإشعارات معطلة، لن تتلقى إشعارات الأزواج الواردة.</string>

View File

@@ -397,7 +397,7 @@
<string name="send_compose">Envia</string>
<string name="compose_send_title">Títol de l\'enviament</string>
<string name="open_compose_send">Redacta text</string>
<string name="double_tap_to_drag">Dos tocs per a arrossegar</string>
<string name="double_tap_to_drag">Toc doble per a arrossegar</string>
<string name="hold_to_drag">Mantenir premut per a arrossegar</string>
<string name="about_kde_about">&lt;h1&gt;Quant al&lt;/h1&gt; &lt;p&gt;KDE és una comunitat mundial d\'enginyers, artistes, escriptors, traductors i creadors de programari compromesos amb el desenvolupament de &lt;a href=https://www.gnu.org/philosophy/free-sw.html&gt;programari lliure&lt;/a&gt;. KDE produeix l\'entorn d\'escriptori Plasma, centenars d\'aplicacions i moltes biblioteques de programari que els donen suport.&lt;/p&gt; &lt;p&gt;KDE és una empresa en cooperativa: cap entitat controla la seva direcció o els productes. En el seu lloc, treballem junts per a aconseguir l\'objectiu comú de construir el millor programari lliure del món. Tothom hi és benvingut a &lt;a href=https://community.kde.org/Get_Involved&gt;unir-se i contribuir&lt;/a&gt; a KDE, inclosos vosaltres.&lt;/p&gt; Visiteu &lt;a href=https://www.kde.org/ca/&gt;https://www.kde.org/ca/&lt;/a&gt; per a obtenir més informació sobre la comunitat KDE i el programari que produïm.</string>
<string name="about_kde_report_bugs_or_wishes">&lt;h1&gt;Informeu dels errors o desitjos&lt;/h1&gt; &lt;p&gt;El programari sempre es pot millorar, i l\'equip del KDE està a punt per a fer-ho. No obstant això, l\'usuari, ha de dir-nos quan alguna cosa no funciona com s\'esperava o si podria fer-se millor.&lt;/p&gt; &lt;p&gt;El KDE té un sistema de seguiment d\'errors. Per a informar-ne d\'un, visiteu &lt;a href=https://bugs.kde.org/&gt;https://bugs.kde.org/&lt;/a&gt; o useu el botó «Informeu d\'un error» des de la pantalla Quant al.&lt;/p&gt; Si teniu un suggeriment de millora, podeu usar el sistema de seguiment d\'errors per a enregistrar el vostre desig. Assegureu-vos d\'usar la severitat anomenada «Llista de desitjos» (Wishlist).</string>

View File

@@ -94,6 +94,7 @@
<string name="sendkeystrokes_pref_category_title">Tastendrücke senden</string>
<string name="sendkeystrokes_pref_enabled">Senden von Tastendrücken aktivieren</string>
<string name="sendkeystrokes_pref_enabled_summary">Auf Daten mit dem MIME-Typ „text/x-keystrokes“ warten</string>
<string name="sendkeystrokes_safe_text_enabled_summary">Kurze Ziffernfolgen ohne Bestätigung senden</string>
<string name="pref_plugin_mousepad_send_keystrokes">Als Tastendruck senden</string>
<string name="mouse_receiver_plugin_description">Empfänger für entfernte Mauseingaben</string>
<string name="mouse_receiver_plugin_name">Maus-Empfänger</string>
@@ -112,6 +113,7 @@
<string name="error_not_reachable">Das Gerät ist nicht erreichbar</string>
<string name="error_already_paired">Das Gerät ist bereits verbunden</string>
<string name="error_timed_out">Zeitüberschreitung</string>
<string name="error_clocks_not_match">Uhren der Geräte sind nicht synchron</string>
<string name="error_canceled_by_user">Abbruch durch Benutzer</string>
<string name="error_canceled_by_other_peer">Abbruch durch Gegenstelle</string>
<string name="encryption_info_title">Verschlüsselungsinformationen</string>
@@ -161,9 +163,11 @@
<string name="middle_click">Mittelklick senden</string>
<string name="show_keyboard">Tastatur anzeigen</string>
<string name="device_not_paired">Das Gerät ist nicht verbunden</string>
<string name="pairing_duplicate_names">Achtung: Es gibt mehrere Geräte mit dem gleichen Namen.</string>
<string name="request_pairing">Kopplung anfordern</string>
<string name="pairing_accept">Annehmen</string>
<string name="pairing_reject">Ablehnen</string>
<string name="pairing_explanation">Zwei Geräte zu koppeln ermöglicht diesen, auf das jeweils andere zuzugreifen. Koppeln Sie nur Ihre eigenen Geräte.</string>
<string name="settings">Einstellungen</string>
<string name="mpris_play">Wiedergabe</string>
<string name="mpris_pause">Anhalten</string>
@@ -186,13 +190,16 @@
<string name="mpris_notifications_explanation">Benachrichtigungen müssen erlaubt sein, um entfernte Medien im Benachrichtigungsfenster zu zeigen.</string>
<string name="mpris_notification_settings_title">Benachrichtigung zur Medienkontrolle anzeigen</string>
<string name="mpris_notification_settings_summary">Die Steuerung der Medienwiedergabe auch dann erlauben wenn KDE Connect nicht geöffnet ist</string>
<string name="share_to">Freigeben für ...</string>
<string name="share_to">Freigeben für …</string>
<string name="unreachable_device_dynamic_shortcut">%s (✕)</string>
<string name="unreachable_device_url_share_text">URLs, die mit einem nicht erreichbaren Gerät geteilt werden, werden zugestellt sobald es erreichbar wird.\n\n</string>
<string name="protocol_version">Protokollversion:</string>
<string name="protocol_version_newer">Dieses Gerät verwendet eine neuere Protokollversion</string>
<string name="plugin_settings_with_name">%s-Einstellungen</string>
<string name="invalid_device_name">Ungültiger Gerätename</string>
<string name="shareplugin_text_saved">Text empfangen und in die Zwischenablage kopiert</string>
<string name="custom_devices_settings">Benutzerdefinierte Geräteliste</string>
<string name="custom_devices_settings_summary">%d Geräte manuell hinzugefügt</string>
<string name="custom_device_list">Geräte nach IP-Adresse hinzufügen</string>
<string name="custom_device_deleted">Benutzerdefinierte Geräte gelöscht</string>
<string name="custom_device_list_help">Falls Ihr Gerät nicht automatisch erkannt wird, können Sie es über die IP-Adresse oder den Gerätenamen hinzufügen. Klicken Sie dafür auf den schwebenden Aktionsknopf</string>
@@ -375,6 +382,7 @@
<string name="kde_be_free">KDE - Freiheit genießen.</string>
<string name="kde">KDE</string>
<string name="konqi">Konqi</string>
<string name="click_here_to_type">Hier tippen, um zu schreiben</string>
<string name="clear_compose">Leeren</string>
<string name="send_compose">Senden</string>
<string name="open_compose_send">Text schreiben</string>
@@ -391,10 +399,14 @@
<string name="everyone_else">Jeder, der über die Jahre noch zu KDE Connect beigetragen hat</string>
<string name="send_clipboard">Zwischenablage senden</string>
<string name="tap_to_execute">Tippen um auszuführen</string>
<string name="plugin_stats">Modul-Statistik</string>
<string name="enable_udp_broadcast">UDP-Geräteerkennung einschalten</string>
<string name="enable_bluetooth">Bluetooth aktivieren (Beta)</string>
<string name="findmyphone_notifications_explanation">Benachrichtigungen müssen erlaubt sein, damit das Telefon klingeln kann, wenn die App im Hintergrund ist</string>
<string name="no_notifications">Benachrichtigungen sind abgeschaltet, Sie erhalten keine Benachrichtigungen für eingehende Verbindungen.</string>
<string name="mpris_keepwatching">Wiedergabe fortsetzen</string>
<string name="mpris_keepwatching_settings_title">Wiedergabe fortsetzen</string>
<string name="notification_channel_keepwatching">Wiedergabe fortsetzen</string>
<string name="ping_result">Ping-Dauer: %1$d Millisekunden</string>
<string name="ping_in_progress">Ping läuft </string>
</resources>

View File

@@ -192,7 +192,7 @@
<string name="mpris_notifications_explanation">Urruneko euskarria jakinarazpen tiraderan erakusteko jakinarazpen-baimena behar da</string>
<string name="mpris_notification_settings_title">Erakutsi euskarri kontrolaren jakinarazpena</string>
<string name="mpris_notification_settings_summary">Utzi zure euskarri-jotzaileak kontrolatzen KDE Connect ireki gabe</string>
<string name="share_to">Partekatu honekin...</string>
<string name="share_to">Partekatu honekin</string>
<string name="unreachable_device_dynamic_shortcut">%s (✕)</string>
<string name="unreachable_device_url_share_text">Gailu eskuraezinekin partekatutako URLak, hartara bidaliko dira eskuragarri dagoenean.\n\n</string>
<string name="protocol_version">Protokoloaren bertsioa:</string>
@@ -429,7 +429,7 @@
<string name="notification_channel_keepwatching">Jarraitu jotzen</string>
<string name="ping_result">«Ping» %1$d milisegundotan egin da</string>
<string name="ping_failed">Ezin izan dio gailuari «ping» egin</string>
<string name="ping_in_progress">«Ping» egiten...</string>
<string name="ping_in_progress">«Ping» egiten</string>
<string name="device_host_invalid">Ostalaria baliogabea da. Erabili balio duen ostalari-izen bat, IPv4, edo IPv6</string>
<string name="device_host_duplicate">Ostalaria jada zerrendan dago</string>
</resources>

View File

@@ -115,6 +115,7 @@
<string name="error_not_reachable">Dispositivo inacessível</string>
<string name="error_already_paired">Dispositivo já emparelhado</string>
<string name="error_timed_out">Tempo limite expirou</string>
<string name="error_clocks_not_match">Os relógios dos dispositivos estão dessincronizados</string>
<string name="error_canceled_by_user">Cancelado pelo usuário</string>
<string name="error_canceled_by_other_peer">Cancelado pelo outro dispositivo</string>
<string name="encryption_info_title">Informação de criptografia</string>
@@ -164,9 +165,11 @@
<string name="middle_click">Enviar um Botão do Meio</string>
<string name="show_keyboard">Mostrar teclado</string>
<string name="device_not_paired">Dispositivo não emparelhado</string>
<string name="pairing_duplicate_names">Cuidado: Há vários dispositivos com o mesmo nome.</string>
<string name="request_pairing">Solicitar emparelhamento</string>
<string name="pairing_accept">Aceitar</string>
<string name="pairing_reject">Rejeitar</string>
<string name="pairing_explanation">Emparelhar dois dispositivos dará acesso um ao outro. Emparelhe apenas seus próprios dispositivos.</string>
<string name="settings">Configurações</string>
<string name="mpris_play">Reproduzir</string>
<string name="mpris_pause">Pausar</string>
@@ -190,12 +193,15 @@
<string name="mpris_notification_settings_title">Mostrar a notificação do controle multimídia</string>
<string name="mpris_notification_settings_summary">Permite controlar os seus reprodutores de mídias sem abrir o KDE Connect</string>
<string name="share_to">Compartilhar com...</string>
<string name="unreachable_device_dynamic_shortcut">%s (✕)</string>
<string name="unreachable_device_url_share_text">URLs compartilhadas com um dispositivo inalcançável serão enviadas para ele assim que ele voltar a ficar disponível.\n\n</string>
<string name="protocol_version">Versão do protocolo:</string>
<string name="protocol_version_newer">Este dispositivo usa uma versão mais recente do protocolo</string>
<string name="plugin_settings_with_name">Configurações de %s</string>
<string name="invalid_device_name">Nome do dispositivo inválido</string>
<string name="shareplugin_text_saved">Texto recebido e salvo na área de transferência</string>
<string name="custom_devices_settings">Lista de dispositivos personalizada</string>
<string name="custom_devices_settings_summary">%d dispositivos adicionados manualmente</string>
<string name="custom_device_list">Adicionar dispositivos pelo IP</string>
<string name="custom_device_deleted">Dispositivo personalizado excluído</string>
<string name="custom_device_list_help">Se o seu dispositivo não for detectado automaticamente você pode adicionar o endereço IP ou nome de máquina dele clicando no botão de ação flutuante</string>
@@ -305,6 +311,8 @@
<string name="devices">Dispositivos</string>
<string name="settings_rename">Nome do dispositivo</string>
<string name="settings_dark_mode">Tema escuro</string>
<string name="settings_export_logs">Exportar registros do KDE Connect</string>
<string name="settings_export_logs_text">Gera um arquivo com informações de execução que podem ajudar a solucionar problemas.</string>
<string name="settings_more_settings_title">Mais opções</string>
<string name="settings_more_settings_text">As configurações por dispositivo podem ser encontradas nas \'Configurações do plugin\' dentro de um determinado dispositivo.</string>
<string name="setting_persistent_notification">Mostrar a notificação persistente</string>
@@ -325,6 +333,7 @@
<string name="empty_trusted_networks_list_text">Você ainda não adicionou nenhuma rede confiável</string>
<string name="allow_all_networks_text">Permitir tudo</string>
<string name="location_permission_needed_title">É necessário ter permissão</string>
<string name="bluetooth_permission_needed_desc">O KDE Connect precisa de permissão para se conectar a dispositivos próximos para tornar os dispositivos pareados via Bluetooth disponíveis no KDE Connect.</string>
<string name="location_permission_needed_desc">O KDE Connect precisa da permissão de localização em segundo plano para conhecer a rede WiFi à qual você está conectado, mesmo quando o aplicativo está em segundo plano. Isso ocorre porque o nome da rede WiFi ao seu redor pode ser usado para encontrar sua localização, mesmo quando não é isso que o KDE Connect faz.</string>
<string name="clipboard_android_x_incompat">O Android 10 removeu o acesso à área de transferência para todos os aplicativos. Este plugin ficará desativado.</string>
<string name="mpris_open_url">Continuar tocando aqui</string>
@@ -410,6 +419,7 @@
<string name="tap_to_execute">Toque para executar</string>
<string name="plugin_stats">Estatísticas do plugin</string>
<string name="enable_udp_broadcast">Habilitar a descoberta de dispositivo via UDP</string>
<string name="enable_bluetooth">Habilitar o bluetooth (beta)</string>
<string name="receive_notifications_permission_explanation">Notificações devem ser permitidas para receber notificações dos outros dispositivos</string>
<string name="findmyphone_notifications_explanation">A permissão de notificação é necessária para que o telefone possa tocar quando o app estiver em segudo plano</string>
<string name="no_notifications">As notificações estão desabilitadas, você não receberá notificações de solicitação de pareamento.</string>
@@ -417,4 +427,9 @@
<string name="mpris_keepwatching_settings_title">Continuar a execução</string>
<string name="mpris_keepwatching_settings_summary">Exibe uma notificação silenciosa para continuar a execução neste dispositivo após o fechamento da mídia.</string>
<string name="notification_channel_keepwatching">Continuar a execução</string>
<string name="ping_result">Pingado em %1$d milissegundos</string>
<string name="ping_failed">Não foi possível pingar o dispositivo</string>
<string name="ping_in_progress">Pingando...</string>
<string name="device_host_invalid">O host é inválido. Use um nome de host válido, IPv4 ou IPv6.</string>
<string name="device_host_duplicate">O host já existe na lista</string>
</resources>

View File

@@ -137,8 +137,6 @@ SPDX-License-Identifier: GPL-2.0-only OR GPL-3.0-only OR LicenseRef-KDE-Accepted
<item>stronger</item>
</string-array>
<string name="virtualmonitor_rdp_client_not_installed">No app can handle RDP. Please install aFreeRDP or another client.</string>
<string name="sendkeystrokes_send_to">Send keystrokes to</string>
<string name="sendkeystrokes_textbox_hint">Send keystrokes to host</string>
<string name="sendkeystrokes_disabled_toast">Sending keystrokes is disabled - enable it in the settings</string>
@@ -395,8 +393,6 @@ SPDX-License-Identifier: GPL-2.0-only OR GPL-3.0-only OR LicenseRef-KDE-Accepted
<string name="pref_plugin_findremotedevice">Find remote device</string>
<string name="pref_plugin_findremotedevice_desc">Ring your remote device</string>
<string name="ring">Ring</string>
<string name="pref_plugin_virtualmonitor">Virtual Monitor</string>
<string name="pref_plugin_virtualmonitor_desc">Extend your devices monitors</string>
<string name="pref_plugin_systemvolume">System volume</string>
<string name="pref_plugin_systemvolume_desc">Control the system volume of the remote device</string>

View File

@@ -9,7 +9,6 @@ package org.kde.kdeconnect.Backends;
import android.content.Context;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.annotation.WorkerThread;
import org.kde.kdeconnect.Device;
@@ -17,8 +16,6 @@ import org.kde.kdeconnect.DeviceInfo;
import org.kde.kdeconnect.NetworkPacket;
import java.io.IOException;
import java.net.InetAddress;
import java.net.SocketAddress;
import java.util.ArrayList;
@@ -46,8 +43,6 @@ public abstract class BaseLink {
return getDeviceInfo().id;
}
public abstract @Nullable InetAddress getDeviceIp();
public BaseLinkProvider getLinkProvider() {
return linkProvider;
}

View File

@@ -21,7 +21,6 @@ import java.io.InputStream
import java.io.InputStreamReader
import java.io.OutputStream
import java.io.Reader
import java.net.InetAddress
import java.util.UUID
import kotlin.text.Charsets.UTF_8
@@ -99,10 +98,6 @@ class BluetoothLink(
return theDeviceInfo
}
override fun getDeviceIp(): InetAddress? {
return null;
}
override fun disconnect() {
if (connection == null) {
return
@@ -164,4 +159,4 @@ class BluetoothLink(
false
}
}
}
}

View File

@@ -27,11 +27,9 @@ import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.net.InetAddress;
import java.net.InetSocketAddress;
import java.net.ServerSocket;
import java.net.Socket;
import java.net.SocketAddress;
import java.net.SocketTimeoutException;
import java.nio.channels.NotYetConnectedException;
@@ -258,7 +256,4 @@ public class LanLink extends BaseLink {
packetReceived(np);
}
@Override
public InetAddress getDeviceIp() { return socket.getInetAddress(); }
}

View File

@@ -13,16 +13,12 @@ import org.kde.kdeconnect.Device
import org.kde.kdeconnect.DeviceInfo
import org.kde.kdeconnect.Helpers.DeviceHelper.getDeviceInfo
import org.kde.kdeconnect.NetworkPacket
import java.net.InetAddress
class LoopbackLink : BaseLink {
constructor(context: Context, linkProvider: BaseLinkProvider) : super(context, linkProvider)
override fun getName(): String = "LoopbackLink"
override fun getDeviceInfo(): DeviceInfo = getDeviceInfo(context)
override fun getDeviceIp(): InetAddress {
return InetAddress.getLoopbackAddress()
}
@WorkerThread
override fun sendPacket(packet: NetworkPacket, callback: Device.SendPacketStatusCallback, sendPayloadFromSameThread: Boolean): Boolean {

View File

@@ -46,8 +46,6 @@ import java.util.concurrent.ConcurrentHashMap
import java.util.concurrent.ConcurrentMap
import java.util.concurrent.CopyOnWriteArrayList
import androidx.core.content.edit
import java.net.InetAddress
import java.net.SocketAddress
class Device : PacketReceiver {
@@ -649,10 +647,6 @@ class Device : PacketReceiver {
fun removePluginsChangedListener(listener: PluginsChangedListener) = pluginsChangedListeners.remove(listener)
fun ipAddress(): InetAddress? {
return links.firstNotNullOf { it.deviceIp }
}
fun disconnect() {
links.forEach(BaseLink::disconnect)
}

View File

@@ -43,7 +43,7 @@ class DeviceHost private constructor(private val host: String) {
companion object {
/** Ping timeout */
private const val PING_TIMEOUT = 3_000
private val hostnameValidityPattern = Regex("^[0-9A-Za-z._-]+$")
private val hostnameValidityPattern = Regex("^[0-9A-Za-z.:_-]+$")
@JvmStatic
fun isValidDeviceHost(host: String): Boolean {

View File

@@ -19,7 +19,7 @@ object NetworkHelper {
//
// If we run across an interface that has this, we can safely
// ignore it. In fact, it's much safer to do. If we don't, we
// might get invalid IP addresses out of it.
// might get invalid IP adddresses out of it.
@JvmStatic
val localIpAddress: InetAddress?
get() {
@@ -34,7 +34,7 @@ object NetworkHelper {
//
// If we run across an interface that has this, we can safely
// ignore it. In fact, it's much safer to do. If we don't, we
// might get invalid IP addresses out of it.
// might get invalid IP adddresses out of it.
if (intf.displayName.contains("rmnet")) {
continue
}

View File

@@ -36,6 +36,7 @@ import java.util.stream.Collectors;
import kotlin.Lazy;
import kotlin.LazyKt;
import kotlin.Unit;
public class SendKeystrokesToHostActivity extends BaseActivity<ActivitySendkeystrokesBinding> {
@@ -166,17 +167,16 @@ public class SendKeystrokesToHostActivity extends BaseActivity<ActivitySendkeyst
for (Device d : devices) {
if (d.isReachable() && d.isPaired()) {
devicesList.add(d);
items.add(new DeviceItem(d));
items.add(new DeviceItem(d, this::deviceClicked));
section.isEmpty = false;
}
}
getBinding().devicesList.setAdapter(new ListAdapter(SendKeystrokesToHostActivity.this, items));
getBinding().devicesList.setOnItemClickListener((adapterView, view, i, l) -> {
Device device = devicesList.get(i - 1); // NOTE: -1 because of the title!
sendKeys(device);
this.finish(); // close the activity
});
// Configure focus order for Accessibility, for touchpads, and for TV remotes
// (allow focus of items in the device list)
getBinding().devicesList.setItemsCanFocus(true);
// only one device is connected and we trust the text to send -> send it and close the activity.
// Usually we already check it in `onStart` - but if the BackgroundService was not started/connected to the host
@@ -185,8 +185,15 @@ public class SendKeystrokesToHostActivity extends BaseActivity<ActivitySendkeyst
if (devicesList.size() == 1 && contentIsOkay) {
Device device = devicesList.get(0);
sendKeys(device);
this.finish(); // close the activity
finish(); // close the activity
}
}
private Unit deviceClicked(Device device) {
sendKeys(device);
finish(); // close the activity
return Unit.INSTANCE;
}
}

View File

@@ -99,7 +99,7 @@ class MprisMediaSession : OnSharedPreferenceChangeListener, NotificationReceiver
* @param device The device id
*/
fun onCreate(context: Context?, plugin: MprisPlugin, device: String) {
if (mprisDevices.isEmpty) {
if (mprisDevices.isEmpty()) {
val prefs = PreferenceManager.getDefaultSharedPreferences(context)
prefs.registerOnSharedPreferenceChangeListener(this)
}
@@ -137,7 +137,7 @@ class MprisMediaSession : OnSharedPreferenceChangeListener, NotificationReceiver
plugin.removePlayerListUpdatedHandler("media_notification")
updateMediaNotification()
if (mprisDevices.isEmpty) {
if (mprisDevices.isEmpty()) {
val prefs = PreferenceManager.getDefaultSharedPreferences(context)
prefs.unregisterOnSharedPreferenceChangeListener(this)
}

View File

@@ -103,14 +103,14 @@ class MprisNowPlayingFragment : Fragment(), VolumeKeyListener {
performActionOnClick(mprisControlBinding.stopButton, MprisPlayer::sendStop)
mprisControlBinding.volumeSeek.setOnSeekBarChangeListener(object : OnSeekBarChangeListener {
override fun onProgressChanged(seekBar: SeekBar, i: Int, b: Boolean) {}
override fun onStartTrackingTouch(seekBar: SeekBar) {}
override fun onStopTrackingTouch(seekBar: SeekBar) {
override fun onProgressChanged(seekBar: SeekBar, i: Int, b: Boolean) {
val targetPlayer = targetPlayer ?: return
targetPlayer.sendSetVolume(seekBar.progress)
}
override fun onStartTrackingTouch(seekBar: SeekBar) {}
override fun onStopTrackingTouch(seekBar: SeekBar) {}
})
positionSeekUpdateRunnable = Runnable {

View File

@@ -11,21 +11,14 @@ import android.appwidget.AppWidgetManager.EXTRA_APPWIDGET_ID
import android.content.Context
import android.content.Intent
import android.os.Bundle
import android.view.View
import android.view.ViewGroup
import android.view.Window
import android.widget.ArrayAdapter
import android.widget.ImageView
import android.widget.TextView
import androidx.appcompat.app.AppCompatActivity
import androidx.core.content.edit
import org.kde.kdeconnect.Device
import org.kde.kdeconnect.KdeConnect
import org.kde.kdeconnect.UserInterface.List.DeviceItem
import org.kde.kdeconnect.UserInterface.List.ListAdapter
import org.kde.kdeconnect_tp.R
import org.kde.kdeconnect_tp.databinding.WidgetRemoteCommandPluginDialogBinding
import java.util.stream.Collectors
class RunCommandWidgetConfigActivity : AppCompatActivity() {
@@ -47,24 +40,25 @@ class RunCommandWidgetConfigActivity : AppCompatActivity() {
val binding = WidgetRemoteCommandPluginDialogBinding.inflate(layoutInflater)
setContentView(binding.root)
val pairedDevices = KdeConnect.getInstance().devices.values.stream().filter(Device::isPaired).collect(Collectors.toList())
val pairedDevices = KdeConnect.getInstance().devices.values.asSequence().filter(Device::isPaired).toList()
val list = ListAdapter(this, pairedDevices.map { DeviceItem(it) })
val list = ListAdapter(this, pairedDevices.map { DeviceItem(it, ::deviceClicked) })
binding.runCommandsDeviceList.adapter = list
binding.runCommandsDeviceList.setOnItemClickListener { _, _, position, _ ->
val deviceId = pairedDevices[position].deviceId
saveWidgetDeviceIdPref(this, appWidgetId, deviceId)
val appWidgetManager = AppWidgetManager.getInstance(this)
updateAppWidget(this, appWidgetManager, appWidgetId)
val resultValue = Intent()
resultValue.putExtra(EXTRA_APPWIDGET_ID, appWidgetId)
setResult(RESULT_OK, resultValue)
finish()
}
binding.runCommandsDeviceList.emptyView = binding.noDevices
}
fun deviceClicked(device: Device) {
val deviceId = device.deviceId
saveWidgetDeviceIdPref(this, appWidgetId, deviceId)
val appWidgetManager = AppWidgetManager.getInstance(this)
updateAppWidget(this, appWidgetManager, appWidgetId)
val resultValue = Intent()
resultValue.putExtra(EXTRA_APPWIDGET_ID, appWidgetId)
setResult(RESULT_OK, resultValue)
finish()
}
}
private const val PREFS_NAME = "org.kde.kdeconnect_tp.WidgetProvider"

View File

@@ -39,6 +39,7 @@ import java.util.Set;
import kotlin.Lazy;
import kotlin.LazyKt;
import kotlin.Unit;
public class ShareActivity extends BaseActivity<ActivityShareBinding> {
private static final String KEY_UNREACHABLE_URL_LIST = "key_unreachable_url_list";
@@ -111,26 +112,31 @@ public class ShareActivity extends BaseActivity<ActivityShareBinding> {
if (d.isPaired() && (intentHasUrl || d.isReachable())) {
devicesList.add(d);
if (!d.isReachable()) {
items.add(new UnreachableDeviceItem(d));
items.add(new UnreachableDeviceItem(d, device -> deviceClicked(device, intentHasUrl, intent)));
} else {
items.add(new DeviceItem(d));
items.add(new DeviceItem(d, device -> deviceClicked(device, intentHasUrl, intent)));
}
section.isEmpty = false;
}
}
getBinding().devicesListLayout.devicesList.setAdapter(new ListAdapter(ShareActivity.this, items));
getBinding().devicesListLayout.devicesList.setOnItemClickListener((adapterView, view, i, l) -> {
Device device = devicesList.get(i - 1); //NOTE: -1 because of the title!
SharePlugin plugin = KdeConnect.getInstance().getDevicePlugin(device.getDeviceId(), SharePlugin.class);
if (intentHasUrl && !device.isReachable()) {
// Store the URL to be delivered once device becomes online
storeUrlForFutureDelivery(device, intent.getStringExtra(Intent.EXTRA_TEXT));
} else if (plugin != null) {
plugin.share(intent);
}
finish();
});
// Configure focus order for Accessibility, for touchpads, and for TV remotes
// (allow focus of items in the device list)
getBinding().devicesListLayout.devicesList.setItemsCanFocus(true);
}
private Unit deviceClicked(Device device, boolean intentHasUrl, Intent intent) {
SharePlugin plugin = KdeConnect.getInstance().getDevicePlugin(device.getDeviceId(), SharePlugin.class);
if (intentHasUrl && !device.isReachable()) {
// Store the URL to be delivered once device becomes online
storeUrlForFutureDelivery(device, intent.getStringExtra(Intent.EXTRA_TEXT));
} else if (plugin != null) {
plugin.share(intent);
}
finish();
return Unit.INSTANCE;
}
private boolean doesIntentContainUrl(Intent intent) {

View File

@@ -1,104 +0,0 @@
/*
* SPDX-FileCopyrightText: 2025 Aleix Pol i Gonzalez <aleixpol@kde.org>
*
* SPDX-License-Identifier: GPL-2.0-only OR GPL-3.0-only OR LicenseRef-KDE-Accepted-GPL
*/
package org.kde.kdeconnect.Plugins.VirtualMonitorPlugin
import android.content.Intent
import android.net.Uri
import android.util.Log
import android.widget.Toast
import androidx.core.net.toUri
import org.json.JSONArray
import org.json.JSONObject
import org.kde.kdeconnect.NetworkPacket
import org.kde.kdeconnect.Plugins.Plugin
import org.kde.kdeconnect.Plugins.PluginFactory.LoadablePlugin
import org.kde.kdeconnect_tp.R
const val PACKET_TYPE_VIRTUALMONITOR: String = "kdeconnect.virtualmonitor"
const val PACKET_TYPE_VIRTUALMONITOR_REQUEST: String = "kdeconnect.virtualmonitor.request"
@LoadablePlugin
class VirtualMonitorPlugin : Plugin() {
override val displayName: String
get() = context.resources.getString(R.string.pref_plugin_virtualmonitor)
override val description: String
get() = context.resources.getString(R.string.pref_plugin_virtualmonitor_desc)
private fun openUrlExternally(url: Uri): Boolean {
val intent = Intent(Intent.ACTION_VIEW, url)
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
if (intent.resolveActivity(context.packageManager) != null) {
context.startActivity(intent)
return true
} else {
return false
}
}
override fun onPacketReceived(np: NetworkPacket): Boolean {
if (np.type == PACKET_TYPE_VIRTUALMONITOR_REQUEST) {
// At least a password is necessary, we have defaults for all other parameters
if (!np.has("password")) {
Log.e("KDE/VirtualMonitor", "Request invalid, missing password")
return false
}
val addr = device.ipAddress()?.hostAddress
if (addr == null) {
Log.e("KDE/VirtualMonitor", "Request invalid, no address")
return false
}
val protocol = np.getString("protocol")
val username = np.getString("username")
val password = np.getString("password")
val port = np.getInt("port", -1)
val url = "$protocol://$username:$password@$addr:$port".toUri()
Log.i("KDE/VirtualMonitor", "Received request, try connecting to $url")
if (!openUrlExternally(url)) {
Toast.makeText(context, R.string.virtualmonitor_rdp_client_not_installed, Toast.LENGTH_LONG).show()
openUrlExternally("https://f-droid.org/en/packages/com.freerdp.afreerdp/".toUri())
val failure = NetworkPacket(PACKET_TYPE_VIRTUALMONITOR).apply {
this["failed"] = 0
}
device.sendPacket(failure)
}
}
return true
}
override fun onCreate() : Boolean
{
if (device.ipAddress() == null) {
Log.e("KDE/VirtualMonitor", "No IP address for device, pass.")
return false
}
val metrics = context.resources.displayMetrics
val np = NetworkPacket(PACKET_TYPE_VIRTUALMONITOR).apply {
this["resolutions"] = JSONArray().apply {
put(JSONObject().apply {
put("resolution", "${metrics.widthPixels}x${metrics.heightPixels}")
put("scale", metrics.density)
})
}
this["supports_rdp"] = true
this["supports_virt_mon"] = false
}
device.sendPacket(np)
return true
}
override val supportedPacketTypes: Array<String>
get() = arrayOf(PACKET_TYPE_VIRTUALMONITOR, PACKET_TYPE_VIRTUALMONITOR_REQUEST)
override val outgoingPacketTypes: Array<String>
get() = arrayOf(PACKET_TYPE_VIRTUALMONITOR)
}

View File

@@ -12,11 +12,9 @@ import org.kde.kdeconnect_tp.databinding.ListItemDeviceEntryBinding
open class DeviceItem(
val device: Device,
private val callback: ((d: Device) -> Unit)?
private val callback: ((d: Device) -> Unit)
) : ListAdapter.Item
{
constructor(device: Device) : this(device, null)
protected lateinit var binding: ListItemDeviceEntryBinding
override fun inflateView(layoutInflater: LayoutInflater): View {
@@ -25,11 +23,9 @@ open class DeviceItem(
binding.listItemEntryIcon.setImageDrawable(device.icon)
binding.listItemEntryTitle.text = device.name
if (callback != null) {
binding.getRoot().setOnClickListener(View.OnClickListener { v1: View? ->
callback(device)
})
}
binding.getRoot().setOnClickListener(View.OnClickListener { v1: View? ->
callback(device)
})
return binding.getRoot()
}

View File

@@ -12,7 +12,7 @@ import org.kde.kdeconnect_tp.R
class PairingDeviceItem(
device: Device,
callback: ((d: Device) -> Unit)?
callback: ((d: Device) -> Unit)
) : DeviceItem(device, callback) {
override fun inflateView(layoutInflater: LayoutInflater): View {
return super.inflateView(layoutInflater).also {

View File

@@ -10,7 +10,10 @@ import android.view.View
import org.kde.kdeconnect.Device
import org.kde.kdeconnect_tp.R
class UnreachableDeviceItem(device: Device) : DeviceItem(device) {
class UnreachableDeviceItem(
device: Device,
callback: ((d: Device) -> Unit),
) : DeviceItem(device, callback) {
override fun inflateView(layoutInflater: LayoutInflater): View {
return super.inflateView(layoutInflater).also {
binding.listItemEntrySummary.setText(R.string.runcommand_notreachable)