mirror of
https://github.com/KDE/kdeconnect-android
synced 2025-09-05 00:25:09 +00:00
Compare commits
23 Commits
Author | SHA1 | Date | |
---|---|---|---|
|
f2af39aa8e | ||
|
31fce7fdb0 | ||
|
41f511d675 | ||
|
14e61246ff | ||
|
9fdb71096e | ||
|
d0931f28a9 | ||
|
2ba79a2f58 | ||
|
7c649be2ce | ||
|
3baa9fa14e | ||
|
48919bddcd | ||
|
4d3480399d | ||
|
9290110fd8 | ||
|
dfb647536b | ||
|
3eedc88c3c | ||
|
1d3c818a2c | ||
|
a67447e3f5 | ||
|
57ec71e60b | ||
|
17757908c4 | ||
|
708889eed7 | ||
|
1096ace12c | ||
|
b4f33adb6c | ||
|
6ff71c3965 | ||
|
cd0ae95e58 |
@@ -8,8 +8,8 @@ SPDX-License-Identifier: GPL-2.0-only OR GPL-3.0-only OR LicenseRef-KDE-Accepted
|
||||
|
||||
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
xmlns:tools="http://schemas.android.com/tools"
|
||||
android:versionCode="12800"
|
||||
android:versionName="1.28.0">
|
||||
android:versionCode="12900"
|
||||
android:versionName="1.29.0">
|
||||
|
||||
<uses-feature
|
||||
android:name="android.hardware.telephony"
|
||||
@@ -107,6 +107,9 @@ SPDX-License-Identifier: GPL-2.0-only OR GPL-3.0-only OR LicenseRef-KDE-Accepted
|
||||
|
||||
<category android:name="android.intent.category.LAUNCHER" />
|
||||
</intent-filter>
|
||||
<intent-filter>
|
||||
<action android:name="android.service.quicksettings.action.QS_TILE_PREFERENCES"/>
|
||||
</intent-filter>
|
||||
</activity>
|
||||
<activity
|
||||
android:name="org.kde.kdeconnect.UserInterface.PluginSettingsActivity"
|
||||
@@ -379,8 +382,6 @@ SPDX-License-Identifier: GPL-2.0-only OR GPL-3.0-only OR LicenseRef-KDE-Accepted
|
||||
android:value="org.kde.kdeconnect.UserInterface.PluginSettingsActivity" />
|
||||
</activity>
|
||||
|
||||
<activity android:name="org.kde.kdeconnect.Plugins.PhotoPlugin.PhotoActivity" />
|
||||
|
||||
<activity
|
||||
android:name="org.kde.kdeconnect.UserInterface.TrustedNetworksActivity"
|
||||
android:label="@string/trusted_networks"
|
||||
|
7
fastlane/metadata/android/en-US/changelogs/12900.txt
Normal file
7
fastlane/metadata/android/en-US/changelogs/12900.txt
Normal file
@@ -0,0 +1,7 @@
|
||||
1.29
|
||||
* Added MDNS device discovery
|
||||
* Fixed crash opening the Run Command widget settings
|
||||
* Added more fine-grained notification channels
|
||||
* Added a confirmation before copying contacts
|
||||
* Long-tapping the "Send clipboard" quick settings tile now opens the app
|
||||
* Removed the photo plugin
|
@@ -4,7 +4,7 @@ msgstr ""
|
||||
"Project-Id-Version: kdeorg\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2023-07-30 00:45+0000\n"
|
||||
"PO-Revision-Date: 2023-09-02 02:56\n"
|
||||
"PO-Revision-Date: 2023-09-16 10:08\n"
|
||||
"Last-Translator: \n"
|
||||
"Language-Team: Chinese Simplified\n"
|
||||
"Language: zh_CN\n"
|
||||
|
@@ -4,7 +4,7 @@ msgstr ""
|
||||
"Project-Id-Version: kdeorg\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2023-06-07 00:47+0000\n"
|
||||
"PO-Revision-Date: 2023-09-02 02:56\n"
|
||||
"PO-Revision-Date: 2023-09-16 10:08\n"
|
||||
"Last-Translator: \n"
|
||||
"Language-Team: Chinese Simplified\n"
|
||||
"Language: zh_CN\n"
|
||||
|
@@ -1,13 +0,0 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<vector xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:viewportWidth="24"
|
||||
android:viewportHeight="24"
|
||||
android:width="24dp"
|
||||
android:height="24dp">
|
||||
<path
|
||||
android:pathData="M15.2 12A3.2 3.2 0 0 1 12 15.2 3.2 3.2 0 0 1 8.8 12 3.2 3.2 0 0 1 12 8.8 3.2 3.2 0 0 1 15.2 12Z"
|
||||
android:fillColor="#000000" />
|
||||
<path
|
||||
android:pathData="M9 2L7.17 4 4 4C2.9 4 2 4.9 2 6l0 12c0 1.1 0.9 2 2 2l16 0c1.1 0 2 -0.9 2 -2L22 6C22 4.9 21.1 4 20 4L16.83 4 15 2 9 2Zm3 15C9.24 17 7 14.76 7 12 7 9.24 9.24 7 12 7c2.76 0 5 2.24 5 5 0 2.76 -2.24 5 -5 5z"
|
||||
android:fillColor="#000000" />
|
||||
</vector>
|
5
res/drawable/ic_device_desktop_32dp.xml
Normal file
5
res/drawable/ic_device_desktop_32dp.xml
Normal file
@@ -0,0 +1,5 @@
|
||||
<vector android:height="32dp" android:tint="?attr/colorControlNormal"
|
||||
android:viewportHeight="24" android:viewportWidth="24"
|
||||
android:width="32dp" xmlns:android="http://schemas.android.com/apk/res/android">
|
||||
<path android:fillColor="@android:color/white" android:pathData="M21,2L3,2c-1.1,0 -2,0.9 -2,2v12c0,1.1 0.9,2 2,2h7v2L8,20v2h8v-2h-2v-2h7c1.1,0 2,-0.9 2,-2L23,4c0,-1.1 -0.9,-2 -2,-2zM21,16L3,16L3,4h18v12z"/>
|
||||
</vector>
|
@@ -48,6 +48,7 @@ SPDX-License-Identifier: GPL-2.0-only OR GPL-3.0-only OR LicenseRef-KDE-Accepted
|
||||
android:layout_gravity="bottom|end"
|
||||
android:layout_margin="@dimen/fab_margin"
|
||||
app:elevation="@dimen/fab_elevation"
|
||||
android:contentDescription="@string/add_device_dialog_title"
|
||||
android:src="@drawable/ic_add"/>
|
||||
</androidx.coordinatorlayout.widget.CoordinatorLayout>
|
||||
</androidx.coordinatorlayout.widget.CoordinatorLayout>
|
||||
|
@@ -39,6 +39,7 @@ SPDX-License-Identifier: GPL-2.0-only OR GPL-3.0-only OR LicenseRef-KDE-Accepted
|
||||
android:layout_margin="16dp"
|
||||
app:srcCompat="@drawable/ic_action_image_edit_24dp"
|
||||
app:layout_anchor="@id/run_commands_list"
|
||||
android:contentDescription="@string/add_command"
|
||||
app:layout_anchorGravity="bottom|end" />
|
||||
|
||||
<TextView
|
||||
|
@@ -166,9 +166,7 @@
|
||||
<string name="pref_plugin_mprisreceiver">متحكم الوسائط</string>
|
||||
<string name="notification_channel_default">إخطارات أخرى</string>
|
||||
<string name="notification_channel_media_control">متحكم الوسائط</string>
|
||||
<string name="notification_channel_filetransfer">نقل الملفّات</string>
|
||||
<string name="notification_channel_high_priority">مرتفعة الأولوية</string>
|
||||
<string name="notification_channel_sms_mms">رسالة جديدة</string>
|
||||
<string name="mpris_stop">أوقف المشغل الحالي</string>
|
||||
<string name="copy_url_to_clipboard">انسخ المسار إلى الحافظة</string>
|
||||
<string name="clipboard_toast">نُسخ إلى الحافظة</string>
|
||||
@@ -189,7 +187,6 @@
|
||||
<string name="block_contents">امنح محتويات الإخطارات</string>
|
||||
<string name="block_images">امنع الصور في الإخطارات</string>
|
||||
<string name="notification_channel_receivenotification">إخطارات من أجهزة أخرى</string>
|
||||
<string name="take_picture">شغّل الكاميرا</string>
|
||||
<string name="presenter_pointer">المؤشر</string>
|
||||
<string name="trusted_networks">الشّبكات الموثوقة</string>
|
||||
<string name="add_trusted_network">أضف %s</string>
|
||||
|
@@ -273,9 +273,7 @@
|
||||
<string name="notification_channel_default">Digər bildirişlər</string>
|
||||
<string name="notification_channel_persistent">"Daimi göstərici"</string>
|
||||
<string name="notification_channel_media_control">Media İdarəsi</string>
|
||||
<string name="notification_channel_filetransfer">Fayl göndərişi</string>
|
||||
<string name="notification_channel_high_priority">Yüksək üstünlük</string>
|
||||
<string name="notification_channel_sms_mms">Yeni İsmarıc</string>
|
||||
<string name="mpris_stop">Cari pleyeri dayandırmaq</string>
|
||||
<string name="copy_url_to_clipboard">URL\'u mübadilə buferinə kopyalamaq</string>
|
||||
<string name="clipboard_toast">Mübadilə buferinə kopyalandı</string>
|
||||
@@ -304,8 +302,6 @@
|
||||
<string name="block_contents">Bildirişlərin məzmununu bloklamaq</string>
|
||||
<string name="block_images">Bildirişlərin şəkillərini bloklamaq</string>
|
||||
<string name="notification_channel_receivenotification">Digar cihazlardan bilsirişlər</string>
|
||||
<string name="take_picture">Kameranı açmaq</string>
|
||||
<string name="plugin_photo_desc">Şəkillər çəkmək və göndərməyi asanlaşdırmaq üçün kamera tətbiqini başladın</string>
|
||||
<string name="no_app_for_opening">Bu faylı açmaq üçün uyğun tətbiq tapılmadı</string>
|
||||
<string name="remote_keyboard_service">KDE Connect Uzaq Klaviaturası</string>
|
||||
<string name="presenter_pointer">Kursor</string>
|
||||
|
@@ -276,9 +276,9 @@
|
||||
<string name="notification_channel_default">Други известия</string>
|
||||
<string name="notification_channel_persistent">Постоянен индикатор</string>
|
||||
<string name="notification_channel_media_control">Контрол на медиите</string>
|
||||
<string name="notification_channel_filetransfer">Прехвърляне на файл</string>
|
||||
<string name="notification_channel_filetransfer">Прехвърляне на входящ файл</string>
|
||||
<string name="notification_channel_filetransfer_upload">Прехвърляне на изходящ файл</string>
|
||||
<string name="notification_channel_high_priority">Висок приоритет</string>
|
||||
<string name="notification_channel_sms_mms">Ново съобщение</string>
|
||||
<string name="mpris_stop">Спиране на текущия плейър</string>
|
||||
<string name="copy_url_to_clipboard">Копиране на URL в клипборда</string>
|
||||
<string name="clipboard_toast">Копиран в клипборда</string>
|
||||
@@ -307,8 +307,6 @@
|
||||
<string name="block_contents">Блокиране на съдържанието на известията</string>
|
||||
<string name="block_images">Блокиране на изображения в известията</string>
|
||||
<string name="notification_channel_receivenotification">Известия от други устройства</string>
|
||||
<string name="take_picture">Стартиране на камерата</string>
|
||||
<string name="plugin_photo_desc">Стартирайте приложението за камера, за да улесните правенето и прехвърлянето на снимки</string>
|
||||
<string name="no_app_for_opening">Не е намерено подходящо приложение за отваряне на този файл</string>
|
||||
<string name="remote_keyboard_service">Отдалечена клавиатура KDE Connect</string>
|
||||
<string name="presenter_pointer">Показалец</string>
|
||||
|
@@ -276,9 +276,10 @@
|
||||
<string name="notification_channel_default">Altres notificacions</string>
|
||||
<string name="notification_channel_persistent">Indicador de persistència</string>
|
||||
<string name="notification_channel_media_control">Control multimèdia</string>
|
||||
<string name="notification_channel_filetransfer">Transferència de fitxers</string>
|
||||
<string name="notification_channel_filetransfer">Transferència de fitxer entrant</string>
|
||||
<string name="notification_channel_filetransfer_upload">Transferència de fitxer de sortida</string>
|
||||
<string name="notification_channel_filetransfer_error">Error de transferència de fitxer</string>
|
||||
<string name="notification_channel_high_priority">Prioritat alta</string>
|
||||
<string name="notification_channel_sms_mms">Missatge nou</string>
|
||||
<string name="mpris_stop">Atura el reproductor actual</string>
|
||||
<string name="copy_url_to_clipboard">Copia l\'URL al porta-retalls</string>
|
||||
<string name="clipboard_toast">Copiat al porta-retalls</string>
|
||||
@@ -307,8 +308,6 @@
|
||||
<string name="block_contents">Bloca el contingut de les notificacions</string>
|
||||
<string name="block_images">Bloca les imatges a les notificacions</string>
|
||||
<string name="notification_channel_receivenotification">Notificacions des d\'altres dispositius</string>
|
||||
<string name="take_picture">Inicia la càmera</string>
|
||||
<string name="plugin_photo_desc">Llança l\'aplicació de càmera per a facilitar la presa i la transferència de fotografies</string>
|
||||
<string name="no_app_for_opening">No s\'ha trobat cap aplicació adequada per a obrir aquest fitxer</string>
|
||||
<string name="remote_keyboard_service">Teclat remot del KDE Connect</string>
|
||||
<string name="presenter_pointer">Apuntador</string>
|
||||
|
@@ -289,9 +289,7 @@
|
||||
<string name="notification_channel_default">Ostatní oznámení</string>
|
||||
<string name="notification_channel_persistent">Stálý ukazatel</string>
|
||||
<string name="notification_channel_media_control">Ovládání médií</string>
|
||||
<string name="notification_channel_filetransfer">Přenos souboru</string>
|
||||
<string name="notification_channel_high_priority">Vysoká priorita</string>
|
||||
<string name="notification_channel_sms_mms">Nová zpráva</string>
|
||||
<string name="mpris_stop">Zastavit současný přehrávač</string>
|
||||
<string name="copy_url_to_clipboard">Kopírovat URL do schránky</string>
|
||||
<string name="clipboard_toast">Zkopírováno do schránky</string>
|
||||
@@ -320,8 +318,6 @@
|
||||
<string name="block_contents">Blokovat obsah oznámení</string>
|
||||
<string name="block_images">Blokovat obrázky v oznámení</string>
|
||||
<string name="notification_channel_receivenotification">Oznámení z ostatních zařízení</string>
|
||||
<string name="take_picture">Spustit fotoaparát</string>
|
||||
<string name="plugin_photo_desc">Spusťte aplikaci fotoaparátu pro snadné zachytávání s přenos obrázků</string>
|
||||
<string name="no_app_for_opening">Pro otevření tohoto souboru nebyla nalezena vhodná aplikace</string>
|
||||
<string name="remote_keyboard_service">Vzdálená klávesnice pro KDE Connect</string>
|
||||
<string name="presenter_pointer">Ukazatel</string>
|
||||
|
@@ -269,9 +269,7 @@
|
||||
<string name="notification_channel_default">Andere Benachrichtigungen</string>
|
||||
<string name="notification_channel_persistent">Dauerhafte Benachrichtigung</string>
|
||||
<string name="notification_channel_media_control">Medienkontrolle</string>
|
||||
<string name="notification_channel_filetransfer">Dateiübertragung</string>
|
||||
<string name="notification_channel_high_priority">Hohe Priorität</string>
|
||||
<string name="notification_channel_sms_mms">Neue Nachricht</string>
|
||||
<string name="mpris_stop">Die aktuelle Medienwiedergabe beenden</string>
|
||||
<string name="copy_url_to_clipboard">Adresse in die Zwischenablage kopieren</string>
|
||||
<string name="clipboard_toast">In die Zwischenablage kopiert</string>
|
||||
@@ -300,8 +298,6 @@
|
||||
<string name="block_contents">Inhalt von Benachrichtigungen blockieren</string>
|
||||
<string name="block_images">Bilder in Benachrichtigungen blockieren</string>
|
||||
<string name="notification_channel_receivenotification">Benachrichtigungen verbundener Geräte</string>
|
||||
<string name="take_picture">Kamera starten</string>
|
||||
<string name="plugin_photo_desc">Die Kamera starten um das Erstellen und Übertragen von Bildern zu vereinfachen</string>
|
||||
<string name="no_app_for_opening">Es wurde keine passende App zum Öffnen dieser Datei gefunden</string>
|
||||
<string name="remote_keyboard_service">Entfernte Tastatur für KDE Connect</string>
|
||||
<string name="presenter_pointer">Laserpointer</string>
|
||||
|
@@ -252,9 +252,7 @@
|
||||
<string name="pref_plugin_mprisreceiver_desc">Ελέγξτε τους αναπαραγωγείς πολυμέσων του τηλεφώνου σας από άλλη συσκευή</string>
|
||||
<string name="notification_channel_default">Άλλες ειδοποιήσεις</string>
|
||||
<string name="notification_channel_media_control">Κονσόλα πολυμέσων</string>
|
||||
<string name="notification_channel_filetransfer">Μεταφορά αρχείου</string>
|
||||
<string name="notification_channel_high_priority">Υψηλής προτεραιότητας</string>
|
||||
<string name="notification_channel_sms_mms">Νέο μήνυμα</string>
|
||||
<string name="mpris_stop">Διακοπή του τρέχοντος αναπαραγωγέα</string>
|
||||
<string name="copy_url_to_clipboard">Αντιγραφή του URL στο πρόχειρο</string>
|
||||
<string name="clipboard_toast">Έγινε αντιγραφή στο πρόχειρο</string>
|
||||
@@ -283,8 +281,6 @@
|
||||
<string name="block_contents">Φραγή περιεχομένου ειδοποιήσεων</string>
|
||||
<string name="block_images">Φραγή εικόνων σε ειδοποιήσεις</string>
|
||||
<string name="notification_channel_receivenotification">Ειδοποιήσεις από άλλες συσκευές</string>
|
||||
<string name="take_picture">Εκτέλεση κάμερας</string>
|
||||
<string name="plugin_photo_desc">Εκτέλεση της εφαρμογής κάμερας για διευκόλυνση στη λήψη και μεταφορά φωτογραφιών</string>
|
||||
<string name="no_app_for_opening">Δεν βρέθηκε κατάλληλη εφαρμογή για το άνοιγμα αυτού του αρχείου</string>
|
||||
<string name="remote_keyboard_service">Απομακρυσμένο πληκτρολόγιο KDE Connect</string>
|
||||
<string name="presenter_pointer">Δείκτης</string>
|
||||
|
@@ -273,9 +273,7 @@
|
||||
<string name="notification_channel_default">Other notifications</string>
|
||||
<string name="notification_channel_persistent">Persistent indicator</string>
|
||||
<string name="notification_channel_media_control">Media control</string>
|
||||
<string name="notification_channel_filetransfer">File transfer</string>
|
||||
<string name="notification_channel_high_priority">High priority</string>
|
||||
<string name="notification_channel_sms_mms">New Message</string>
|
||||
<string name="mpris_stop">Stop the current player</string>
|
||||
<string name="copy_url_to_clipboard">Copy URL to clipboard</string>
|
||||
<string name="clipboard_toast">Copied to clipboard</string>
|
||||
@@ -304,8 +302,6 @@
|
||||
<string name="block_contents">Block contents of notifications</string>
|
||||
<string name="block_images">Block images in notifications</string>
|
||||
<string name="notification_channel_receivenotification">Notifications from other devices</string>
|
||||
<string name="take_picture">Launch camera</string>
|
||||
<string name="plugin_photo_desc">Launch the camera app to ease taking and transferring pictures</string>
|
||||
<string name="no_app_for_opening">No suitable app found to open this file</string>
|
||||
<string name="remote_keyboard_service">KDE Connect Remote Keyboard</string>
|
||||
<string name="presenter_pointer">Pointer</string>
|
||||
|
@@ -276,9 +276,9 @@
|
||||
<string name="notification_channel_default">Otras notificaciones</string>
|
||||
<string name="notification_channel_persistent">Indicador persistente</string>
|
||||
<string name="notification_channel_media_control">Control multimedia</string>
|
||||
<string name="notification_channel_filetransfer">Transferencia de archivo</string>
|
||||
<string name="notification_channel_filetransfer">Transferencia de archivo entrante</string>
|
||||
<string name="notification_channel_filetransfer_upload">Transferencia de archivo saliente</string>
|
||||
<string name="notification_channel_high_priority">Alta prioridad</string>
|
||||
<string name="notification_channel_sms_mms">Nuevo mensaje</string>
|
||||
<string name="mpris_stop">Parar el reproductor actual</string>
|
||||
<string name="copy_url_to_clipboard">Copiar URL al portapapeles</string>
|
||||
<string name="clipboard_toast">Copiado en el portapapeles</string>
|
||||
@@ -307,8 +307,6 @@
|
||||
<string name="block_contents">Bloquear el contenido de las notificaciones</string>
|
||||
<string name="block_images">Bloquear las imágenes en las notificaciones</string>
|
||||
<string name="notification_channel_receivenotification">Notificaciones desde otros dispositivos</string>
|
||||
<string name="take_picture">Lanzar cámara</string>
|
||||
<string name="plugin_photo_desc">Lanzar la aplicación de la cámara para facilitar tomar y transferir imágenes</string>
|
||||
<string name="no_app_for_opening">No se encontró ninguna aplicación adecuada para abrir este archivo</string>
|
||||
<string name="remote_keyboard_service">Teclado remoto de KDE Connect</string>
|
||||
<string name="presenter_pointer">Puntero</string>
|
||||
|
@@ -228,9 +228,7 @@
|
||||
<string name="pref_plugin_mprisreceiver_desc">Telefoni meediamängijate juhtimine teisest seadmest</string>
|
||||
<string name="notification_channel_default">Muud märguanded</string>
|
||||
<string name="notification_channel_media_control">Meedia juhtimine</string>
|
||||
<string name="notification_channel_filetransfer">Failiülekanne</string>
|
||||
<string name="notification_channel_high_priority">Kõrge prioriteediga</string>
|
||||
<string name="notification_channel_sms_mms">Uus sõnum</string>
|
||||
<string name="mpris_stop">Peata aktiivne mängija</string>
|
||||
<string name="copy_url_to_clipboard">Kopeeri URL lõikepuhvrisse</string>
|
||||
<string name="clipboard_toast">Kopeeriti lõikepuhvrisse</string>
|
||||
@@ -259,8 +257,6 @@
|
||||
<string name="block_contents">Märguannete sisu blokkimine</string>
|
||||
<string name="block_images">Märguannete piltide blokkimine</string>
|
||||
<string name="notification_channel_receivenotification">Märguanded teistest seadmetest</string>
|
||||
<string name="take_picture">Käivita kaamera</string>
|
||||
<string name="plugin_photo_desc">Kaamerarakenduse käivitamine piltide tegemiseks ja ülekandmiseks</string>
|
||||
<string name="no_app_for_opening">Selle faili avamiseks ei leitud sobivat rakendust</string>
|
||||
<string name="remote_keyboard_service">KDE Connecti kaugklaviatuur</string>
|
||||
<string name="presenter_pointer">Osutusseade</string>
|
||||
|
@@ -276,9 +276,10 @@
|
||||
<string name="notification_channel_default">Beste jakinarazpen batzuk</string>
|
||||
<string name="notification_channel_persistent">Adierazle iraunkorra</string>
|
||||
<string name="notification_channel_media_control">Euskarrien kontrola</string>
|
||||
<string name="notification_channel_filetransfer">Fitxategi transferentzia</string>
|
||||
<string name="notification_channel_filetransfer">Sarrerako fitxategi transmisioa</string>
|
||||
<string name="notification_channel_filetransfer_upload">Irteerako fitxategi transmisioa</string>
|
||||
<string name="notification_channel_filetransfer_error">Fitxategi transmisio errorea</string>
|
||||
<string name="notification_channel_high_priority">Lehentasun handia</string>
|
||||
<string name="notification_channel_sms_mms">Mezu berria</string>
|
||||
<string name="mpris_stop">Gelditu uneko jotzailea</string>
|
||||
<string name="copy_url_to_clipboard">Kopiatu URLa arbelera</string>
|
||||
<string name="clipboard_toast">Arbelera kopiatua</string>
|
||||
@@ -307,8 +308,6 @@
|
||||
<string name="block_contents">Oztopatu jakinarazpenen edukiak</string>
|
||||
<string name="block_images">Oztopatu jakinarazpenen irudiak</string>
|
||||
<string name="notification_channel_receivenotification">Beste gailu batzuen jakinarazpenak</string>
|
||||
<string name="take_picture">Abiarazi kamera</string>
|
||||
<string name="plugin_photo_desc">Abiarazi kamerako aplikazioa argazkiak hartzeko eta transferitzeko</string>
|
||||
<string name="no_app_for_opening">Ez da fitxategi hau irekitzeko aplikazio egokirik aurkitu</string>
|
||||
<string name="remote_keyboard_service">KDE Connect urruneko teklatua</string>
|
||||
<string name="presenter_pointer">Erakuslea</string>
|
||||
|
@@ -273,9 +273,7 @@
|
||||
<string name="notification_channel_default">Muut ilmoitukset</string>
|
||||
<string name="notification_channel_persistent">Pysyvä ilmaisin</string>
|
||||
<string name="notification_channel_media_control">Mediaohjaimet</string>
|
||||
<string name="notification_channel_filetransfer">Tiedostonsiirto</string>
|
||||
<string name="notification_channel_high_priority">Korkea etusija</string>
|
||||
<string name="notification_channel_sms_mms">Uusi viesti</string>
|
||||
<string name="mpris_stop">Pysäytä nykyinen soitin</string>
|
||||
<string name="copy_url_to_clipboard">Kopioi verkko-osoite leikepöydälle</string>
|
||||
<string name="clipboard_toast">Kopioitu leikepöydälle</string>
|
||||
@@ -304,8 +302,6 @@
|
||||
<string name="block_contents">Estä ilmoitusten sisältö</string>
|
||||
<string name="block_images">Estä ilmoitusten kuvat</string>
|
||||
<string name="notification_channel_receivenotification">Muiden laitteiden ilmoitukset</string>
|
||||
<string name="take_picture">Käynnistä kamera</string>
|
||||
<string name="plugin_photo_desc">Helpota kuvien ottamista ja siirtämistä käynnistämällä kamerasovellus</string>
|
||||
<string name="no_app_for_opening">Tämän tiedoston avaamiseen sopivaa sovellusta ei löytynyt</string>
|
||||
<string name="remote_keyboard_service">KDE Connect -etänäppäimistö</string>
|
||||
<string name="presenter_pointer">Osoitin</string>
|
||||
|
@@ -274,9 +274,7 @@
|
||||
<string name="notification_channel_default">Autres notifications</string>
|
||||
<string name="notification_channel_persistent">Notification persistante</string>
|
||||
<string name="notification_channel_media_control">Contrôle multimédia</string>
|
||||
<string name="notification_channel_filetransfer">Transfert de fichiers</string>
|
||||
<string name="notification_channel_high_priority">Haute priorité</string>
|
||||
<string name="notification_channel_sms_mms">Nouveau message</string>
|
||||
<string name="mpris_stop">Arrêter le lecteur actuel</string>
|
||||
<string name="copy_url_to_clipboard">Copier l\'URL dans le presse-papiers</string>
|
||||
<string name="clipboard_toast">Copié dans le presse-papier</string>
|
||||
@@ -305,8 +303,6 @@
|
||||
<string name="block_contents">Bloquer les contenus des notifications</string>
|
||||
<string name="block_images">Bloquer les images des notifications</string>
|
||||
<string name="notification_channel_receivenotification">Notifications provenant d\'autres périphériques</string>
|
||||
<string name="take_picture">Lancer l\'appareil photo</string>
|
||||
<string name="plugin_photo_desc">Lancer l\'application appareil photo pour prendre et transférer des photos</string>
|
||||
<string name="no_app_for_opening">Aucune application adaptée trouvée pour ouvrir ce fichier.</string>
|
||||
<string name="remote_keyboard_service">Clavier à distance KDE Connect</string>
|
||||
<string name="presenter_pointer">Pointeur</string>
|
||||
|
@@ -8,7 +8,7 @@
|
||||
<string name="pref_plugin_telephony">Notificador de telefonía</string>
|
||||
<string name="pref_plugin_telephony_desc">Envíe notificacións de chamadas entrantes.</string>
|
||||
<string name="pref_plugin_battery">Informe da batería</string>
|
||||
<string name="pref_plugin_battery_desc">Envíe periodicamente un informe sobre o estado da batería.</string>
|
||||
<string name="pref_plugin_battery_desc">Informar periodicamente do estado da batería.</string>
|
||||
<string name="pref_plugin_connectivity_report">Informe de conectividade</string>
|
||||
<string name="pref_plugin_connectivity_report_desc">Informar da forza do sinal e do estado da rede</string>
|
||||
<string name="pref_plugin_sftp">Revelador do sistema de ficheiros</string>
|
||||
@@ -86,7 +86,7 @@
|
||||
<string name="sendkeystrokes_send_to">Enviar as pulsacións de tecla a</string>
|
||||
<string name="sendkeystrokes_textbox_hint">Enviar as pulsacións de tecla á máquina</string>
|
||||
<string name="sendkeystrokes_disabled_toast">O envío de pulsación de teclas está desactivado; actíveo na configuración.</string>
|
||||
<string name="sendkeystrokes_wrong_data">Tipo MIME non válido, ten que ser «text/x-keystrokes».</string>
|
||||
<string name="sendkeystrokes_wrong_data">Tipo MIME incorrecto, ten que ser «text/x-keystrokes».</string>
|
||||
<string name="sendkeystrokes_sent_text">Enviouse %1$s ao dispositivo %2$s</string>
|
||||
<string name="sendkeystrokes_pref_category_summary">Este módulo permite a outras aplicacións compartir segmentos de texto como pulsacións de tecla que se enviarán á máquina conectada</string>
|
||||
<string name="sendkeystrokes_pref_category_title">Enviar pulsacións de tecla</string>
|
||||
@@ -150,12 +150,12 @@
|
||||
<item quantity="other">Enviáronse os %2$d ficheiros a %1$s</item>
|
||||
</plurals>
|
||||
<plurals name="send_files_fail_title">
|
||||
<item quantity="one">Non se puido enviar o ficheiro a %1$s</item>
|
||||
<item quantity="other">Non se puideron enviar %2$d dos %3$d ficheiros a %1$s</item>
|
||||
<item quantity="one">Produciuse un erro ao enviar o ficheiro a %1$s</item>
|
||||
<item quantity="other">Produciuse un erro ao enviar %2$d dos %3$d ficheiros a %1$s</item>
|
||||
</plurals>
|
||||
<string name="tap_to_open">Toque para abrir</string>
|
||||
<string name="received_file_text">Toque para abrir «%1s».</string>
|
||||
<string name="cannot_create_file">Non se pode crear o ficheiro %s</string>
|
||||
<string name="cannot_create_file">Non é posíbel crear o ficheiro %s</string>
|
||||
<string name="tap_to_answer">Toque para contestar</string>
|
||||
<string name="right_click">Enviar un clic secundario</string>
|
||||
<string name="middle_click">Enviar un clic central</string>
|
||||
@@ -276,9 +276,9 @@
|
||||
<string name="notification_channel_default">Outras notificacións</string>
|
||||
<string name="notification_channel_persistent">Indicador persistente</string>
|
||||
<string name="notification_channel_media_control">Control de reprodución</string>
|
||||
<string name="notification_channel_filetransfer">Transferencia de ficheiros</string>
|
||||
<string name="notification_channel_filetransfer">Transferencia de ficheiros entrante</string>
|
||||
<string name="notification_channel_filetransfer_upload">Transferencia de ficheiros saíntes</string>
|
||||
<string name="notification_channel_high_priority">Prioridade alta</string>
|
||||
<string name="notification_channel_sms_mms">Mensaxe nova</string>
|
||||
<string name="mpris_stop">Deter o reprodutor actual</string>
|
||||
<string name="copy_url_to_clipboard">Copiar o URL no portapapeis</string>
|
||||
<string name="clipboard_toast">Copiouse no portapapeis</string>
|
||||
@@ -307,8 +307,6 @@
|
||||
<string name="block_contents">Bloquear o contido das notificacións</string>
|
||||
<string name="block_images">Bloquear as imaxes nas notificacións</string>
|
||||
<string name="notification_channel_receivenotification">Notificacións desde outros dispositivos</string>
|
||||
<string name="take_picture">Iniciar a cámara</string>
|
||||
<string name="plugin_photo_desc">Iniciar a aplicación da cámara para facilitar sacar e transferir imaxes.</string>
|
||||
<string name="no_app_for_opening">Non se atopou ningunha aplicación axeitada para abrir o ficheiro.</string>
|
||||
<string name="remote_keyboard_service">Teclado remoto de KDE Connect</string>
|
||||
<string name="presenter_pointer">Punteiro</string>
|
||||
@@ -318,7 +316,7 @@
|
||||
<string name="empty_trusted_networks_list_text">Aínda non engadiu ningunha rede de confianza</string>
|
||||
<string name="allow_all_networks_text">Permitilas todas</string>
|
||||
<string name="location_permission_needed_title">Require permiso</string>
|
||||
<string name="location_permission_needed_desc">KDE Connect necesita o permiso de localización en segundo planto para saber a rede WiFi á que o dispositivo está conectado incluso cando a aplicación está en segundo plano. Isto é porque o nome das redes WiFi ao redor seu podería usarse para descubrir a súa localización, aínda que KDE Connect non faga tal cousa.</string>
|
||||
<string name="location_permission_needed_desc">KDE Connect necesita o permiso de localización en segundo planto para saber a que rede WiFi se conectou incluso cando a aplicación está en segundo plano. Isto é porque o nome das redes WiFi ao redor seu podería usarse para descubrir a súa localización, aínda que KDE Connect non faga tal cousa.</string>
|
||||
<string name="clipboard_android_x_incompat">Android 10 retirou o acceso ao portapapeis a todas as aplicacións. Desactivarase este complemento.</string>
|
||||
<string name="mpris_open_url">Continuar reproducindo aquí</string>
|
||||
<string name="cant_open_url">Non se pode abrir o URL para continuar reproducindo</string>
|
||||
@@ -367,7 +365,7 @@
|
||||
<string name="authors">Autoría</string>
|
||||
<string name="thanks_to">Agradecementos</string>
|
||||
<string name="easter_egg">Ovo de Pascua</string>
|
||||
<string name="email_contributor">Enviar unha mensaxe de correo electrónico á persoa colaboradora\n%s</string>
|
||||
<string name="email_contributor">Escribir por correo electrónico á persoa colaboradora\n%s</string>
|
||||
<string name="visit_contributors_homepage">Visitar a páxina persoal da persoa colaboradora\n%s</string>
|
||||
<string name="version">Versión %s</string>
|
||||
<string name="about_kde">Sobre KDE</string>
|
||||
@@ -381,10 +379,10 @@
|
||||
<string name="send_compose">Enviar</string>
|
||||
<string name="compose_send_title">Preparar un envío</string>
|
||||
<string name="open_compose_send">Escribir texto</string>
|
||||
<string name="about_kde_about">"<h1>Sobre</h1> <p>KDE é unha comunidade internacional de persoas dedicadas á enxeñaría de software, á arte, á documentación, á tradución e á creación, todas elas comprometidas co desenvolvemento de <a href=https://www.gnu.org/philosophy/free-sw.html>software libre</a>. KDE produce o contorno de escritorio Plasma, centos de aplicacións, e as moitas bibliotecas de software sobre as que estas están construídas.</p> <p>KDE é un esforzo cooperativo: non hai unha única entidade que controle a súa dirección ou os seus produtos. No seu lugar, xuntámonos para traballar no obxectivo común de construír o mellor software libre do mundo. Todas as persoas son benvidas a <a href=https://community.kde.org/Get_Involved>unirse e colaborar</a> en KDE, incluída vostede.</p> Visite <a href=https://www.kde.org/>https://www.kde.org/</a> para máis información sobre a comunidade KDE e o software que produce."</string>
|
||||
<string name="about_kde_about">"<h1>Sobre</h1> <p>KDE é unha comunidade internacional de persoas dedicadas á enxeñaría de soporte lóxico, á arte, á documentación, á tradución e á creación, todas elas comprometidas co desenvolvemento de <a href=https://www.gnu.org/philosophy/free-sw.html>soporte lóxico libre</a>. KDE produce o contorno de escritorio Plasma, centos de aplicacións, e as moitas bibliotecas de soporte lóxico sobre as que estas están construídas.</p> <p>KDE é un esforzo cooperativo: non hai unha única entidade que controle a súa dirección ou os seus produtos. No seu lugar, xuntámonos para traballar no obxectivo común de construír o mellor soporte lóxico libre do mundo. Todas as persoas son benvidas a <a href=https://community.kde.org/Get_Involved>unirse e colaborar</a> en KDE, incluída vostede.</p> Visite <a href=https://www.kde.org/>https://www.kde.org/</a> para máis información sobre a comunidade KDE e o soporte lóxico que produce."</string>
|
||||
<string name="about_kde_report_bugs_or_wishes"><h1>Informe de fallos ou pida melloras</h1> <p>O software sempre pode mellorarse, e o equipo de KDE está preparado para facelo. Porén, vostede, a persoa usuaria, ten que avisarnos cando algo non funciona como espera ou podería mellorarse.</p> <p>KDE ten un sistema de seguimento de fallos. Visite <a href=https://bugs.kde.org/>https://bugs.kde.org/</a> ou use o botón de «Informar dun fallo» da pantalla de información para informar dun fallo.</p> Se ten unha suxestión de mellora tamén pode usar o sistema de seguimento de fallos para rexistrala. Asegúrese nese caso de usar a severidade «Lista de desexos».</string>
|
||||
<string name="about_kde_join_kde"><h1>Únase a KDE</h1> <p>Non necesita saber desenvolver software para formar parte do equipo de KDE. Pode unirse aos equipos nacionais que traducen as interfaces dos programas. Pode crear imaxes, temas, sons, e mellorar a documentación. Vostede decide!</p> <p>Visite <a href=https://community.kde.org/Get_Involved>https://community.kde.org/Get_Involved</a> para informarse sobre os proxectos nos que pode participar.</p> Se necesita máis información ou documentación, ten o que necesita en <a href=https://techbase.kde.org/>https://techbase.kde.org/</a>.</string>
|
||||
<string name="about_kde_support_kde"><h1>Apoie KDE</h1> <p>O software de KDE está e estará sempre dispoñíbel de balde, porén crealo ten custos.</p> <p>Para apoiar o seu desenvolvemento, a comunidade KDE formou o KDE e.V., unha organización sen ánimo de lucro fundada legalmente na Alemaña. KDE e.V. representa á comunidade KDE en asuntos legais e financeiros. Consulte <a href=https://ev.kde.org/>https://ev.kde.org/</a> para máis información sobre KDE e.V.</p> <p>KDE benefíciase de moitos tipos de contribucións, incluídas as monetarias. Usamos os fondos para cubrir gastos derivados de colaborar. A maiores, os fondos úsanse para asistencia legal e para organizar conferencias e encontros.</p> <p>Animámoslle a apoiar os nosos esforzos cunha doazón monetaria, mediante un dos sistemas detallados en <a href=https://www.kde.org/community/donations/>https://www.kde.org/community/donations/</a>.</p> Moitas grazas de antemán polo seu apoio.</string>
|
||||
<string name="about_kde_join_kde"><h1>Únase a KDE</h1> <p>Non necesita saber desenvolver software para formar parte do equipo de KDE. Pode unirse aos equipos nacionais que traducen as interfaces dos programas. Pode fornecer imaxes, temas, sons, e mellorar a documentación. Vostede decide!</p> <p>Visite <a href=https://community.kde.org/Get_Involved>https://community.kde.org/Get_Involved</a> para informarse sobre os proxectos nos que pode participar.</p> Se necesita máis información ou documentación, ten o que necesita en <a href=https://techbase.kde.org/>https://techbase.kde.org/</a>.</string>
|
||||
<string name="about_kde_support_kde"><h1>Apoie KDE</h1> <p>O soporte lóxico de KDE está e estará sempre dispoñíbel de balde, porén crealo ten custos.</p> <p>Para apoiar o seu desenvolvemento, a comunidade KDE formou o KDE e.V., unha organización sen ánimo de lucro fundada legalmente na Alemaña. KDE e.V. representa á comunidade KDE en asuntos legais e financeiros. Consulte <a href=https://ev.kde.org/>https://ev.kde.org/</a> para máis información sobre KDE e.V.</p> <p>KDE benefíciase de moitos tipos de contribucións, incluídas as monetarias. Usamos os fondos para cubrir gastos derivados de colaborar. A maiores, os fondos úsanse para asistencia legal e para organizar conferencias e encontros.</p> <p>Animámoslle a apoiar os nosos esforzos cunha doazón monetaria, mediante un dos sistemas detallados en <a href=https://www.kde.org/community/donations/>https://www.kde.org/community/donations/</a>.</p> Moitas grazas de antemán polo seu apoio.</string>
|
||||
<string name="maintainer_and_developer">Mantemento e desenvolvemento</string>
|
||||
<string name="developer">Desenvolvemento</string>
|
||||
<string name="apple_support">Compatibilidade con macOS. Traballando na compatibilidade con iOS</string>
|
||||
@@ -392,7 +390,7 @@
|
||||
<string name="samoilenko_yuri_task">Compatibilidade con SFTP, correccións de fallos e melloras xerais</string>
|
||||
<string name="aniket_kumar_task">Melloras no complemento de SMS</string>
|
||||
<string name="alex_fiestas_task">Melloras no complemento de contactos</string>
|
||||
<string name="maxim_leshchenko_task">Melloras na interface de uso e nesta páxina de información</string>
|
||||
<string name="maxim_leshchenko_task">Melloras na UI e nesta páxina de información</string>
|
||||
<string name="holger_kaelberer_task">Complemento de teclado remoto e correccións de fallos</string>
|
||||
<string name="saikrishna_arcot_task">Posibilidade de usar o teclado no complemento de entrada remota, correccións de fallos e melloras xerais</string>
|
||||
<string name="everyone_else">O resto de xente que colaborou en KDE Connect ao longo dos anos</string>
|
||||
|
@@ -261,9 +261,7 @@
|
||||
<string name="pref_plugin_mprisreceiver_desc">A telefon médialejátszóinak vezérlése egy másik eszközről</string>
|
||||
<string name="notification_channel_default">Egyéb értesítések</string>
|
||||
<string name="notification_channel_media_control">Médiavezérlő</string>
|
||||
<string name="notification_channel_filetransfer">Fájlátvitel</string>
|
||||
<string name="notification_channel_high_priority">Magas prioritás</string>
|
||||
<string name="notification_channel_sms_mms">Új üzenet</string>
|
||||
<string name="mpris_stop">Az aktuális lejátszó leállítása</string>
|
||||
<string name="copy_url_to_clipboard">URL másolása a vágólapra</string>
|
||||
<string name="clipboard_toast">Másolva a vágólapra</string>
|
||||
@@ -292,8 +290,6 @@
|
||||
<string name="block_contents">Értesítések tartalmának blokkolása</string>
|
||||
<string name="block_images">Képek blokkolása az értesítésekben</string>
|
||||
<string name="notification_channel_receivenotification">Értesítések más eszközökről</string>
|
||||
<string name="take_picture">Kamera indítása</string>
|
||||
<string name="plugin_photo_desc">A kamera alkalmazás indítása képek készítésének és átvitelének megkönnyítésére</string>
|
||||
<string name="no_app_for_opening">Nem található alkalmazás a fájl megnyitásához</string>
|
||||
<string name="remote_keyboard_service">KDE Connect távoli billentyűzet</string>
|
||||
<string name="presenter_pointer">Mutató</string>
|
||||
|
@@ -113,9 +113,9 @@
|
||||
<string name="settings_icon_description">Icone de Preferentias</string>
|
||||
<string name="presenter_fullscreen">Schermo plen</string>
|
||||
<string name="notification_channel_media_control">Controlo de multimedia</string>
|
||||
<string name="notification_channel_filetransfer">Transferimento de file</string>
|
||||
<string name="notification_channel_filetransfer">Transferimento de file in arrivata</string>
|
||||
<string name="notification_channel_filetransfer_upload">Transferimento de file in partita</string>
|
||||
<string name="notification_channel_high_priority">Prioritate alte</string>
|
||||
<string name="notification_channel_sms_mms">Nove message</string>
|
||||
<string name="copy_url_to_clipboard">Copia URL a area de transferentia</string>
|
||||
<string name="runcommand_notpaired">Dispositivo non es associate</string>
|
||||
<string name="pref_plugin_systemvolume">Volumine de systema</string>
|
||||
@@ -127,7 +127,6 @@
|
||||
<string name="settings_more_settings_title">Altere preferentias</string>
|
||||
<string name="extra_options">Optiones extra</string>
|
||||
<string name="privacy_options">Optiones de confidentialitate</string>
|
||||
<string name="take_picture">Lancea camera</string>
|
||||
<string name="presenter_pointer">Punctator</string>
|
||||
<string name="trusted_networks">Retes digne de fide</string>
|
||||
<string name="add_trusted_network">Adde %1s</string>
|
||||
|
@@ -253,9 +253,7 @@
|
||||
<string name="pref_plugin_mprisreceiver_desc">Kendalikan pemutar media ponsel Anda dari peranti lainnya</string>
|
||||
<string name="notification_channel_default">Notifikasi lainnya</string>
|
||||
<string name="notification_channel_media_control">Kontrol multimedia</string>
|
||||
<string name="notification_channel_filetransfer">Transfer file</string>
|
||||
<string name="notification_channel_high_priority">Prioritas tinggi</string>
|
||||
<string name="notification_channel_sms_mms">Pesan Baru</string>
|
||||
<string name="mpris_stop">Hentikan player saat ini</string>
|
||||
<string name="copy_url_to_clipboard">Salin URL ke clipboard</string>
|
||||
<string name="clipboard_toast">Disalin ke clipboard</string>
|
||||
@@ -284,8 +282,6 @@
|
||||
<string name="block_contents">Blokir konten-konten notifikasi</string>
|
||||
<string name="block_images">Blokir citra-citra dalam notifikasi</string>
|
||||
<string name="notification_channel_receivenotification">Notifikasi dari peranti lainnya</string>
|
||||
<string name="take_picture">Luncurkan kamera</string>
|
||||
<string name="plugin_photo_desc">Luncurkan aplikasi kamera untuk memudahkan mengambil dan mentransfer foto</string>
|
||||
<string name="no_app_for_opening">Tidak menemukan aplikasi yang dapat membuka berkas ini</string>
|
||||
<string name="remote_keyboard_service">Keyboard Remote KDE Connect</string>
|
||||
<string name="presenter_pointer">Penunjuk</string>
|
||||
|
@@ -235,9 +235,7 @@
|
||||
<string name="notification_channel_default">Aðrar tilkynningar</string>
|
||||
<string name="notification_channel_persistent">Viðvarandi gaumvísir</string>
|
||||
<string name="notification_channel_media_control">Margmiðlunarstýring</string>
|
||||
<string name="notification_channel_filetransfer">Skráarflutningur</string>
|
||||
<string name="notification_channel_high_priority">Hár forgangur</string>
|
||||
<string name="notification_channel_sms_mms">Ný skilaboð</string>
|
||||
<string name="mpris_stop">Stöðva virkan spilara</string>
|
||||
<string name="copy_url_to_clipboard">Afrita slóð á klippispjaldið</string>
|
||||
<string name="clipboard_toast">Afritað á klippispjald</string>
|
||||
@@ -263,7 +261,6 @@
|
||||
<string name="block_contents">Loka á efni tilkynninga</string>
|
||||
<string name="block_images">Loka á myndir í tilkynningum</string>
|
||||
<string name="notification_channel_receivenotification">Tilkynningar frá öðrum tækjum</string>
|
||||
<string name="take_picture">Ræsa myndavél</string>
|
||||
<string name="no_app_for_opening">Ekkert hentugt forrit fannst til að opna þessa skrá</string>
|
||||
<string name="remote_keyboard_service">Fjartengt lyklaborð KDE Connect</string>
|
||||
<string name="presenter_pointer">Bendill</string>
|
||||
|
@@ -183,6 +183,7 @@
|
||||
<item>1 minuto</item>
|
||||
<item>2 minuti</item>
|
||||
</string-array>
|
||||
<string name="mpris_notifications_explanation">L\'autorizzazione alle notifiche è necessaria per mostrare i media remoti nel riquadro delle notifiche</string>
|
||||
<string name="mpris_notification_settings_title">Mostra la notifica del controllo multimediale</string>
|
||||
<string name="mpris_notification_settings_summary">Consenti di controllare i lettori multimediali senza aprire KDE Connect</string>
|
||||
<string name="share_to">Condividi con…</string>
|
||||
@@ -252,6 +253,7 @@
|
||||
<string name="optional_permission_explanation">Devi concedere permessi aggiuntivi per abilitare tutte le funzioni</string>
|
||||
<string name="plugins_need_optional_permission">Alcune estensioni hanno funzioni disabilitate per una mancanza di permessi (tocca per maggiori informazioni):</string>
|
||||
<string name="share_optional_permission_explanation">Per ricevere i file devi consentire l\'accesso allo spazio di archiviazione</string>
|
||||
<string name="share_notifications_explanation">Per vedere lo stato di avanzamento durante l\'invio e la ricezione di file è necessario consentire le notifiche</string>
|
||||
<string name="telepathy_permission_explanation">Per leggere e scrivere SMS dal tuo desktop, devi concedere l\'autorizzazione per SMS</string>
|
||||
<string name="telephony_permission_explanation">Per vedere le chiamate telefoniche dal desktop devi dare l\'autorizzazione per accedere al registro delle chiamate e allo stato del telefono</string>
|
||||
<string name="telephony_optional_permission_explanation">Per vedere il nome di un contatto invece del numero di telefono devi dare accesso alla rubrica del telefono</string>
|
||||
@@ -274,9 +276,9 @@
|
||||
<string name="notification_channel_default">Altre notifiche</string>
|
||||
<string name="notification_channel_persistent">Indicatore persistente</string>
|
||||
<string name="notification_channel_media_control">Controllo multimediale</string>
|
||||
<string name="notification_channel_filetransfer">Trasferimento file</string>
|
||||
<string name="notification_channel_filetransfer">Trasferimento di file in arrivo</string>
|
||||
<string name="notification_channel_filetransfer_upload">Trasferimento di file in uscita</string>
|
||||
<string name="notification_channel_high_priority">Priorità alta</string>
|
||||
<string name="notification_channel_sms_mms">Nuovo messaggio</string>
|
||||
<string name="mpris_stop">Ferma il lettore attuale</string>
|
||||
<string name="copy_url_to_clipboard">Copia l\'URL negli appunti</string>
|
||||
<string name="clipboard_toast">Copiato negli appunti</string>
|
||||
@@ -305,8 +307,6 @@
|
||||
<string name="block_contents">Blocca i contenuti delle notifiche</string>
|
||||
<string name="block_images">Blocca le immagini nelle notifiche</string>
|
||||
<string name="notification_channel_receivenotification">Notifiche da altri dispositivi</string>
|
||||
<string name="take_picture">Avvia fotocamera</string>
|
||||
<string name="plugin_photo_desc">Avvia l\'applicazione della fotocamera per scattare e trasferire foto con facilità</string>
|
||||
<string name="no_app_for_opening">Nessuna applicazione appropriata trovata per aprire questo file</string>
|
||||
<string name="remote_keyboard_service">Tastiera remota di KDE Connect</string>
|
||||
<string name="presenter_pointer">Puntatore</string>
|
||||
@@ -398,4 +398,7 @@
|
||||
<string name="tap_to_execute">Tocca per eseguire</string>
|
||||
<string name="plugin_stats">Statistiche delle estensioni</string>
|
||||
<string name="enable_udp_broadcast">Abilita rilevamento UDP dei dispositivi</string>
|
||||
<string name="receive_notifications_permission_explanation">Le notifiche devono essere consentite per riceverle da altri dispositivi</string>
|
||||
<string name="findmyphone_notifications_explanation">L\'autorizzazione alle notifiche è necessaria affinché il telefono possa squillare quando l\'applicazione è sullo sfondo</string>
|
||||
<string name="no_notifications">Le notifiche sono disabilitate, non riceverai notifiche di associazione in arrivo.</string>
|
||||
</resources>
|
||||
|
@@ -266,9 +266,7 @@
|
||||
<string name="notification_channel_default">他の通知</string>
|
||||
<string name="notification_channel_persistent">永続的なインジケータ</string>
|
||||
<string name="notification_channel_media_control">メディアの操作</string>
|
||||
<string name="notification_channel_filetransfer">ファイル転送</string>
|
||||
<string name="notification_channel_high_priority">高い優先度</string>
|
||||
<string name="notification_channel_sms_mms">新しいメッセージ</string>
|
||||
<string name="mpris_stop">現在のプレーヤーを停止</string>
|
||||
<string name="copy_url_to_clipboard">URL をクリップボードにコピー</string>
|
||||
<string name="clipboard_toast">クリップボードにコピーしました</string>
|
||||
@@ -297,8 +295,6 @@
|
||||
<string name="block_contents">通知の内容をブロック</string>
|
||||
<string name="block_images">通知の画像をブロック</string>
|
||||
<string name="notification_channel_receivenotification">他のデバイスからの通知</string>
|
||||
<string name="take_picture">カメラを起動</string>
|
||||
<string name="plugin_photo_desc">写真を撮影して転送するためにカメラを起動</string>
|
||||
<string name="no_app_for_opening">このファイルを開くための適切なアプリが見つかりません</string>
|
||||
<string name="remote_keyboard_service">KDE Connect リモートキーボード</string>
|
||||
<string name="presenter_pointer">ポインタ</string>
|
||||
|
@@ -195,9 +195,9 @@
|
||||
<string name="notification_channel_default">სხვა გაფრთხილებები</string>
|
||||
<string name="notification_channel_persistent">მუდმივი მაჩვენებელი</string>
|
||||
<string name="notification_channel_media_control">მედიის კონტროლი</string>
|
||||
<string name="notification_channel_filetransfer">ფაილის მიმოცვლა</string>
|
||||
<string name="notification_channel_filetransfer">ფაილის გადაგზავნის შემომავალი მოთხოვნა</string>
|
||||
<string name="notification_channel_filetransfer_upload">გამავალი ფაილის მიმოცვლა</string>
|
||||
<string name="notification_channel_high_priority">მაღალი პრიორიტეტი</string>
|
||||
<string name="notification_channel_sms_mms">ახალი შეტყობინება</string>
|
||||
<string name="mpris_stop">მიმდინარე დამკვრელის გაჩერება</string>
|
||||
<string name="copy_url_to_clipboard">URL-ის ბუფერში კოპირება</string>
|
||||
<string name="clipboard_toast">დაკოპირდა გაცვლის ბაფერში</string>
|
||||
@@ -219,7 +219,6 @@
|
||||
<string name="set_privacy_options">თქვენი კონფიდენციალობის პარამეტრების დაყენება</string>
|
||||
<string name="block_contents">გაფრთხილების შემცველობის დაბლოკვა</string>
|
||||
<string name="block_images">გაფრთხილებებში გამოსახულებების დაბლოკვა</string>
|
||||
<string name="take_picture">კამერის გაშვება</string>
|
||||
<string name="presenter_pointer">კურსორი</string>
|
||||
<string name="trusted_networks">სანდო ქსელები</string>
|
||||
<string name="add_trusted_network">%1s-ის დაყენება</string>
|
||||
|
@@ -266,9 +266,7 @@
|
||||
<string name="notification_channel_default">기타 알림</string>
|
||||
<string name="notification_channel_persistent">항상 표시된 표시기</string>
|
||||
<string name="notification_channel_media_control">미디어 제어</string>
|
||||
<string name="notification_channel_filetransfer">파일 전송</string>
|
||||
<string name="notification_channel_high_priority">높은 우선 순위</string>
|
||||
<string name="notification_channel_sms_mms">새 메시지</string>
|
||||
<string name="mpris_stop">현재 재생기 정지</string>
|
||||
<string name="copy_url_to_clipboard">클립보드로 URL 복사</string>
|
||||
<string name="clipboard_toast">클립보드에 복사됨</string>
|
||||
@@ -297,8 +295,6 @@
|
||||
<string name="block_contents">알림 내용 숨기기</string>
|
||||
<string name="block_images">알림 이미지 숨기기</string>
|
||||
<string name="notification_channel_receivenotification">다른 장치의 알림</string>
|
||||
<string name="take_picture">카메라 실행</string>
|
||||
<string name="plugin_photo_desc">카메라 앱을 실행하여 쉽게 사진을 찍고 전송</string>
|
||||
<string name="no_app_for_opening">이 파일을 열 수 있는 앱을 찾을 수 없음</string>
|
||||
<string name="remote_keyboard_service">KDE Connect 원격 키보드</string>
|
||||
<string name="presenter_pointer">포인터</string>
|
||||
|
@@ -279,9 +279,7 @@
|
||||
<string name="notification_channel_default">Kiti pranešimai</string>
|
||||
<string name="notification_channel_persistent">Pastovus indikatorius</string>
|
||||
<string name="notification_channel_media_control">Įvairialypės terpės valdymas</string>
|
||||
<string name="notification_channel_filetransfer">Failų persiuntimas</string>
|
||||
<string name="notification_channel_high_priority">Didelė pirmenybė</string>
|
||||
<string name="notification_channel_sms_mms">Nauja žinutė</string>
|
||||
<string name="mpris_stop">Stabdyti dabartinę leistuvę</string>
|
||||
<string name="copy_url_to_clipboard">Kopijuoti URL į iškarpinę</string>
|
||||
<string name="clipboard_toast">Nukopijuota į iškarpinę</string>
|
||||
@@ -310,8 +308,6 @@
|
||||
<string name="block_contents">Blokuoti pranešimų turinį</string>
|
||||
<string name="block_images">Blokuoti pranešimuose paveiksliukus</string>
|
||||
<string name="notification_channel_receivenotification">Pranešimai iš kitų įrenginių</string>
|
||||
<string name="take_picture">Paleisti kamerą</string>
|
||||
<string name="plugin_photo_desc">Paleisti kameros programėlę, kad būtų palengvintas nuotraukų darymas ir persiuntimas</string>
|
||||
<string name="no_app_for_opening">Šio failo atvėrimui nerasta jokios tinkamos programėlės</string>
|
||||
<string name="remote_keyboard_service">KDE Connect nuotolinė klaviatūra</string>
|
||||
<string name="presenter_pointer">Rodyklė</string>
|
||||
|
@@ -276,9 +276,10 @@
|
||||
<string name="notification_channel_default">Overige meldingen</string>
|
||||
<string name="notification_channel_persistent">Blijvende indicator</string>
|
||||
<string name="notification_channel_media_control">Besturing van media</string>
|
||||
<string name="notification_channel_filetransfer">Bestandsoverdracht</string>
|
||||
<string name="notification_channel_filetransfer">Inkomende bestandsoverdracht</string>
|
||||
<string name="notification_channel_filetransfer_upload">Uitgaande bestandsoverdracht</string>
|
||||
<string name="notification_channel_filetransfer_error">Bestandsoverdrachtfout</string>
|
||||
<string name="notification_channel_high_priority">Hoge prioriteit</string>
|
||||
<string name="notification_channel_sms_mms">Nieuw bericht</string>
|
||||
<string name="mpris_stop">Stop de huidige speler</string>
|
||||
<string name="copy_url_to_clipboard">URL-adres kopiëren naar klembord</string>
|
||||
<string name="clipboard_toast">Gekopieerd naar klembord</string>
|
||||
@@ -307,8 +308,6 @@
|
||||
<string name="block_contents">Inhoud van meldingen blokkeren</string>
|
||||
<string name="block_images">Afbeeldingen in meldingen blokkeren</string>
|
||||
<string name="notification_channel_receivenotification">Meldingen van andere apparaten</string>
|
||||
<string name="take_picture">Start camera</string>
|
||||
<string name="plugin_photo_desc">Start de camera-app om nemen en overdragen van afbeeldingen te vergemakkelijken</string>
|
||||
<string name="no_app_for_opening">Geen geschikte toepassing gevonden om dit bestand te openen</string>
|
||||
<string name="remote_keyboard_service">KDE Connect Toetsenbord op afstand</string>
|
||||
<string name="presenter_pointer">Aanwijzer</string>
|
||||
|
@@ -274,9 +274,7 @@
|
||||
<string name="notification_channel_default">Andre varslingar</string>
|
||||
<string name="notification_channel_persistent">Evigvarande varsling</string>
|
||||
<string name="notification_channel_media_control">Mediestyring</string>
|
||||
<string name="notification_channel_filetransfer">Filoverføring</string>
|
||||
<string name="notification_channel_high_priority">Høg prioritet</string>
|
||||
<string name="notification_channel_sms_mms">Ny melding</string>
|
||||
<string name="mpris_stop">Stopp gjeldande avspelar</string>
|
||||
<string name="copy_url_to_clipboard">Kopier adresse til utklippstavla</string>
|
||||
<string name="clipboard_toast">Kopiert til utklippstavla</string>
|
||||
@@ -305,8 +303,6 @@
|
||||
<string name="block_contents">Blokker varslingsinnhald</string>
|
||||
<string name="block_images">Blokker bilete i varslingar</string>
|
||||
<string name="notification_channel_receivenotification">Varslingar frå andre einingar</string>
|
||||
<string name="take_picture">Opna kamera</string>
|
||||
<string name="plugin_photo_desc">Opna kamera-appen for å gjera det lettare å ta og overføra bilete</string>
|
||||
<string name="no_app_for_opening">Fann ikkje nokon app som kan opna denne fila</string>
|
||||
<string name="remote_keyboard_service">KDE Connect fjerntastatur</string>
|
||||
<string name="presenter_pointer">Peikar</string>
|
||||
|
@@ -288,9 +288,7 @@
|
||||
<string name="notification_channel_default">Inne powiadomienia</string>
|
||||
<string name="notification_channel_persistent">Nieznikający wskaźnik</string>
|
||||
<string name="notification_channel_media_control">Sterowanie multimediami</string>
|
||||
<string name="notification_channel_filetransfer">Przesyłanie plików</string>
|
||||
<string name="notification_channel_high_priority">Wysoki priorytet</string>
|
||||
<string name="notification_channel_sms_mms">Nowa wiadomość</string>
|
||||
<string name="mpris_stop">Zatrzymaj bieżący odtwarzacz</string>
|
||||
<string name="copy_url_to_clipboard">Skopiuj adres URL do schowka</string>
|
||||
<string name="clipboard_toast">Skopiowano do schowka</string>
|
||||
@@ -319,8 +317,6 @@
|
||||
<string name="block_contents">Blokuj treści w powiadomieniach</string>
|
||||
<string name="block_images">Blokuj obrazy w powiadomieniach</string>
|
||||
<string name="notification_channel_receivenotification">Powiadomienia z innych urządzeń</string>
|
||||
<string name="take_picture">Uruchamianie aparatu</string>
|
||||
<string name="plugin_photo_desc">Zezwala na uruchamianie aparatu, aby ułatwić robienie i przesyłanie zdjęć</string>
|
||||
<string name="no_app_for_opening">Nie znaleziono aplikacji do otwarcia tego pliku</string>
|
||||
<string name="remote_keyboard_service">Zdalna klawiatura KDE Connect</string>
|
||||
<string name="presenter_pointer">Wskaźnik</string>
|
||||
|
@@ -274,9 +274,7 @@
|
||||
<string name="notification_channel_default">Outras notificações</string>
|
||||
<string name="notification_channel_persistent">Indicador persistente</string>
|
||||
<string name="notification_channel_media_control">Controle multimídia</string>
|
||||
<string name="notification_channel_filetransfer">Transferência de arquivo</string>
|
||||
<string name="notification_channel_high_priority">Prioridade alta</string>
|
||||
<string name="notification_channel_sms_mms">Nova mensagem</string>
|
||||
<string name="mpris_stop">Parar o reprodutor atual</string>
|
||||
<string name="copy_url_to_clipboard">Copiar URL para a área de transferência</string>
|
||||
<string name="clipboard_toast">Copiado para a área de transferência</string>
|
||||
@@ -305,8 +303,6 @@
|
||||
<string name="block_contents">Bloquear o conteúdo das notificações</string>
|
||||
<string name="block_images">Bloquear as imagens das notificações</string>
|
||||
<string name="notification_channel_receivenotification">Notificações dos outros dispositivos</string>
|
||||
<string name="take_picture">Iniciar câmera</string>
|
||||
<string name="plugin_photo_desc">Iniciar o aplicativo da câmera para facilitar a captura e transferência de fotos</string>
|
||||
<string name="no_app_for_opening">Não foi encontrado nenhum aplicativo adequado para abrir este arquivo</string>
|
||||
<string name="remote_keyboard_service">Teclado Remoto do KDE Connect</string>
|
||||
<string name="presenter_pointer">Ponteiro</string>
|
||||
|
@@ -273,9 +273,7 @@
|
||||
<string name="notification_channel_default">Outras notificações</string>
|
||||
<string name="notification_channel_persistent">Indicador persistente</string>
|
||||
<string name="notification_channel_media_control">Comando multimédia</string>
|
||||
<string name="notification_channel_filetransfer">Transferência de ficheiros</string>
|
||||
<string name="notification_channel_high_priority">Alta prioridade</string>
|
||||
<string name="notification_channel_sms_mms">Nova Mensagem</string>
|
||||
<string name="mpris_stop">Parar o leitor actual</string>
|
||||
<string name="copy_url_to_clipboard">Copiar o URL para a área de transferência</string>
|
||||
<string name="clipboard_toast">Copiado para a área de transferência</string>
|
||||
@@ -304,8 +302,6 @@
|
||||
<string name="block_contents">Bloquear o conteúdo das notificações</string>
|
||||
<string name="block_images">Bloquear as imagens das notificações</string>
|
||||
<string name="notification_channel_receivenotification">Notificações dos outros dispositivos</string>
|
||||
<string name="take_picture">Lançar a câmara</string>
|
||||
<string name="plugin_photo_desc">Lança a aplicação da câmara para facilitar a tirada de fotografias e sua transferência</string>
|
||||
<string name="no_app_for_opening">Não existe nenhuma aplicação adequada para abrir este ficheiro</string>
|
||||
<string name="remote_keyboard_service">Teclado Remoto do KDE Connect</string>
|
||||
<string name="presenter_pointer">Cursor</string>
|
||||
|
@@ -269,9 +269,7 @@
|
||||
<string name="pref_plugin_mprisreceiver_desc">Controlați programele multimedia din telefon de pe alt dispozitiv</string>
|
||||
<string name="notification_channel_default">Alte notificări</string>
|
||||
<string name="notification_channel_media_control">Control multimedia</string>
|
||||
<string name="notification_channel_filetransfer">Transfer de fișiere</string>
|
||||
<string name="notification_channel_high_priority">Prioritate ridicată</string>
|
||||
<string name="notification_channel_sms_mms">Mesaj nou</string>
|
||||
<string name="mpris_stop">Oprește lectorul actual</string>
|
||||
<string name="copy_url_to_clipboard">Copiază URL în clipboard</string>
|
||||
<string name="clipboard_toast">Copiat în clipboard</string>
|
||||
@@ -300,8 +298,6 @@
|
||||
<string name="block_contents">Blochează conținutul notificărilor</string>
|
||||
<string name="block_images">Blochează imaginile din notificări</string>
|
||||
<string name="notification_channel_receivenotification">Notificări de pe alte dispozitive</string>
|
||||
<string name="take_picture">Lansează aparatul foto</string>
|
||||
<string name="plugin_photo_desc">Lansează aplicația de aparat foto pentru a facilita obținerea și transferul pozelor</string>
|
||||
<string name="no_app_for_opening">Nu a fost găsită nicio aplicație care să deschidă acest fișier</string>
|
||||
<string name="remote_keyboard_service">Tastatura de la distanță KDE Connect</string>
|
||||
<string name="presenter_pointer">Indicator</string>
|
||||
|
File diff suppressed because one or more lines are too long
@@ -260,9 +260,7 @@
|
||||
<string name="pref_plugin_mprisreceiver_desc">Ovláda multimediálne prehrávače vášho telefónu z iného zariadenia</string>
|
||||
<string name="notification_channel_default">Ostatné upozornenia</string>
|
||||
<string name="notification_channel_media_control">Multimediálny ovládač</string>
|
||||
<string name="notification_channel_filetransfer">Prenos súborov</string>
|
||||
<string name="notification_channel_high_priority">Vysoká priorita</string>
|
||||
<string name="notification_channel_sms_mms">Nová správa</string>
|
||||
<string name="mpris_stop">Zastaviť aktuálny prehrávač</string>
|
||||
<string name="copy_url_to_clipboard">Kopírovať URL do schránky</string>
|
||||
<string name="clipboard_toast">Uložené do schránky</string>
|
||||
@@ -291,8 +289,6 @@
|
||||
<string name="block_contents">Blokovať obsah upozornení</string>
|
||||
<string name="block_images">Blokovať obrázky v upozorneniach</string>
|
||||
<string name="notification_channel_receivenotification">Upozornenia z iných zariadení</string>
|
||||
<string name="take_picture">Spustenie fotoaparátu</string>
|
||||
<string name="plugin_photo_desc">Spustí aplikáciu fotoaparátu na uľahčenie zachytenia a prenosu obrázkov</string>
|
||||
<string name="no_app_for_opening">Nenašla sa vhodná aplikácia na otvorenie tohto súboru</string>
|
||||
<string name="remote_keyboard_service">KDE Connect Vzdialená Klávesnica</string>
|
||||
<string name="presenter_pointer">Ukazovateľ</string>
|
||||
|
@@ -292,9 +292,10 @@
|
||||
<string name="notification_channel_default">Ostala obvestila</string>
|
||||
<string name="notification_channel_persistent">Trajni indikator</string>
|
||||
<string name="notification_channel_media_control">Nadzor medija</string>
|
||||
<string name="notification_channel_filetransfer">Prenos datotek</string>
|
||||
<string name="notification_channel_filetransfer">Prenos datotek sem</string>
|
||||
<string name="notification_channel_filetransfer_upload">Prenos datotek tja</string>
|
||||
<string name="notification_channel_filetransfer_error">Napaka pri prenosu datoteke</string>
|
||||
<string name="notification_channel_high_priority">Visoka prednost</string>
|
||||
<string name="notification_channel_sms_mms">Novo sporočilo</string>
|
||||
<string name="mpris_stop">Ustavi trenutni predvajalnik</string>
|
||||
<string name="copy_url_to_clipboard">Kopiraj spletni naslov na odložišče</string>
|
||||
<string name="clipboard_toast">Kopirano na odložišče</string>
|
||||
@@ -323,8 +324,6 @@
|
||||
<string name="block_contents">Blokiraj vsebine obvestil</string>
|
||||
<string name="block_images">Blokiraj slike v obvestilih</string>
|
||||
<string name="notification_channel_receivenotification">Obvestila ostalih naprav</string>
|
||||
<string name="take_picture">Zaženi kamero</string>
|
||||
<string name="plugin_photo_desc">Zaženite aplikacijo za kamero, da olajšate fotografiranje in prenos fotografij</string>
|
||||
<string name="no_app_for_opening">Ni primerne aplikacije za odpiranje te datoteke</string>
|
||||
<string name="remote_keyboard_service">Oddaljena tipkovnica KDE Connect</string>
|
||||
<string name="presenter_pointer">Kazalec</string>
|
||||
|
@@ -276,9 +276,9 @@
|
||||
<string name="notification_channel_default">Andra underrättelser</string>
|
||||
<string name="notification_channel_persistent">Permanent indikering</string>
|
||||
<string name="notification_channel_media_control">Kontroll av media</string>
|
||||
<string name="notification_channel_filetransfer">Filöverföring</string>
|
||||
<string name="notification_channel_filetransfer">Inkommande filöverföring</string>
|
||||
<string name="notification_channel_filetransfer_upload">Utgående filöverföring</string>
|
||||
<string name="notification_channel_high_priority">Hög prioritet</string>
|
||||
<string name="notification_channel_sms_mms">Nytt meddelande</string>
|
||||
<string name="mpris_stop">Stoppa aktuell spelare</string>
|
||||
<string name="copy_url_to_clipboard">Kopiera webbadress till klippbordet</string>
|
||||
<string name="clipboard_toast">Kopierad till klippbordet</string>
|
||||
@@ -307,8 +307,6 @@
|
||||
<string name="block_contents">Blockera underrättelsernas innehåll</string>
|
||||
<string name="block_images">Blockera bilder i underrättelser</string>
|
||||
<string name="notification_channel_receivenotification">Underrättelser från andra apparater</string>
|
||||
<string name="take_picture">Starta kamera</string>
|
||||
<string name="plugin_photo_desc">Starta kameraprogrammet för att förenkla att ta och överföra bilder</string>
|
||||
<string name="no_app_for_opening">Inget lämpligt program hittades för att öppna filen</string>
|
||||
<string name="remote_keyboard_service">KDE-anslut fjärrtangentbord</string>
|
||||
<string name="presenter_pointer">Pekare</string>
|
||||
|
@@ -183,6 +183,7 @@
|
||||
<item>1 நிமிடம்</item>
|
||||
<item>2 நிமிடங்கள்</item>
|
||||
</string-array>
|
||||
<string name="mpris_notifications_explanation">தொலை ஊடக இயக்கிகளை அறிவிப்புகளில் காட்டுவதற்கு அறிவிப்புகள் அனுமதி தேவை</string>
|
||||
<string name="mpris_notification_settings_title">ஊடக கட்டுப்பாடு அறிவிப்பைக் காட்டு</string>
|
||||
<string name="mpris_notification_settings_summary">கே.டீ.யீ. கனெக்டைத் திறக்காமல் ஊடக இயக்கிகளைக் கட்டுப்படுத்த உதவும்</string>
|
||||
<string name="share_to">இதற்கு பகிர்...</string>
|
||||
@@ -252,6 +253,7 @@
|
||||
<string name="optional_permission_explanation">எல்லா செயல்பாடுகளையும் இயக்க நீங்கள் கூடுதல் அனுமதிகளை வழங்க வேண்டும்</string>
|
||||
<string name="plugins_need_optional_permission">அனுமதி இல்லாததால் சில செருகுநிரல்களின் அம்சங்கள் முடங்கியுள்ளன (மேலும் விவரங்களுக்கு தட்டவும்):</string>
|
||||
<string name="share_optional_permission_explanation">கோப்புகளை பெற சேமிப்பக அனுமதி தேவைப்படலாம்</string>
|
||||
<string name="share_notifications_explanation">கோப்புகளை அனுப்பும்போதும் பெறும்போதும் முன்னேற்ற நிலையைக் காண அறிவிப்புகளை அனுமதிக்க வேண்டும்</string>
|
||||
<string name="telepathy_permission_explanation">உங்கள் மேசைக்கணினியிலிருந்து SMS எழுத மற்றும் படிக்க நீங்கள் SMS அனுமதியைத் தர வேண்டும்</string>
|
||||
<string name="telephony_permission_explanation">மேசைக்கணினியிலிருந்து அழைப்புகளைக் காண நீங்கள் அழைப்பு வரலாறு மற்றும் தொலைபேசி நிலைக்கான அனுமதியைத் தர வேண்டும்</string>
|
||||
<string name="telephony_optional_permission_explanation">தொலைபேசி எண்ணுக்குப் பதிலாக நபரின் பெயரைக் காண நீங்கள் தொடர்புகளை அணுகும் அனுமதியைத் தர வேண்டும்</string>
|
||||
@@ -274,9 +276,7 @@
|
||||
<string name="notification_channel_default">பிற அறிவிப்புகள்</string>
|
||||
<string name="notification_channel_persistent">விடாப்பிடி அறிவிப்பு</string>
|
||||
<string name="notification_channel_media_control">ஊடக கட்டுப்பாடு</string>
|
||||
<string name="notification_channel_filetransfer">கோப்பு இடமாற்றம்</string>
|
||||
<string name="notification_channel_high_priority">அதிக முன்னுரிமை</string>
|
||||
<string name="notification_channel_sms_mms">புதிய தகவல்</string>
|
||||
<string name="mpris_stop">தற்போதைய இயக்கியை நிறுத்து</string>
|
||||
<string name="copy_url_to_clipboard">முகவரியை பிடிப்புப்பலகையில் நகலெடு</string>
|
||||
<string name="clipboard_toast">பிடிப்புப்பலகையில் நகலெடுக்கப்பட்டது</string>
|
||||
@@ -305,8 +305,6 @@
|
||||
<string name="block_contents">அறிவிப்புகளின் உள்ளடக்கத்தை காட்டாதே</string>
|
||||
<string name="block_images">அறிவிப்புகளில் படங்களை காட்டாதே</string>
|
||||
<string name="notification_channel_receivenotification">மற்ற சாதனங்களிலிருந்து அறிவிப்புகள்</string>
|
||||
<string name="take_picture">புகைப்பட செயலியை திற</string>
|
||||
<string name="plugin_photo_desc">புகைப்படங்களை எளிதாக எடுக்கவும் மாற்றவும் படக்கருவி செயலியை திறக்கும்</string>
|
||||
<string name="no_app_for_opening">இக்கோப்பை திறப்பதற்குகந்த செயலி ஏதுமில்லை</string>
|
||||
<string name="remote_keyboard_service">கே.டீ.யீ. கனெக்ட் தொலை விசைப்பலகை</string>
|
||||
<string name="presenter_pointer">சுட்டி</string>
|
||||
@@ -394,4 +392,8 @@
|
||||
<string name="send_clipboard">பிடிப்புப்பலகையை அனுப்பு</string>
|
||||
<string name="tap_to_execute">இயக்க தட்டவும்</string>
|
||||
<string name="plugin_stats">செருகுநிரல் புள்ளிவிவரங்கள்</string>
|
||||
<string name="enable_udp_broadcast">UDP சாதன கண்டுபிடிப்பை இயக்கு</string>
|
||||
<string name="receive_notifications_permission_explanation">மற்ற சாதனங்களில் அறிவிப்புகளைப் பெறுவதற்கு அறிவிப்புகள் அனுமதி தேவை</string>
|
||||
<string name="findmyphone_notifications_explanation">செயலி செயலில் இல்லாதபோதும் தொலைபேசியை இசைக்கச்செய்ய அறிவிப்புகள் அனுமதி தேவை</string>
|
||||
<string name="no_notifications">அறிவிப்புகள் முடக்கப்பட்டுள்ளன. உள்வரும் இணைப்புக்கோரிக்கைகளை பெறமாட்டீர்.</string>
|
||||
</resources>
|
||||
|
@@ -276,9 +276,9 @@
|
||||
<string name="notification_channel_default">Diğer bildirimler</string>
|
||||
<string name="notification_channel_persistent">Kalıcı gösterge</string>
|
||||
<string name="notification_channel_media_control">Ortam denetimi</string>
|
||||
<string name="notification_channel_filetransfer">Dosya aktarımı</string>
|
||||
<string name="notification_channel_filetransfer">Gelen dosya aktarımı</string>
|
||||
<string name="notification_channel_filetransfer_upload">Giden dosya aktarımı</string>
|
||||
<string name="notification_channel_high_priority">Yüksek öncelik</string>
|
||||
<string name="notification_channel_sms_mms">Yeni İleti</string>
|
||||
<string name="mpris_stop">Geçerli oynatıcıyı durdur</string>
|
||||
<string name="copy_url_to_clipboard">URL\'yi panoya kopyala</string>
|
||||
<string name="clipboard_toast">Panoya kopyalandı</string>
|
||||
@@ -307,8 +307,6 @@
|
||||
<string name="block_contents">Bildirimlerin içeriğini engelle</string>
|
||||
<string name="block_images">Bildirimlerde görüntüleri engelle</string>
|
||||
<string name="notification_channel_receivenotification">Diğer aygıtlardan gelen bildirimler</string>
|
||||
<string name="take_picture">Kamerayı başlat</string>
|
||||
<string name="plugin_photo_desc">Fotoğraf çekmeyi ve aktarmayı kolaylaştırmak için kamera uygulamasını başlatın</string>
|
||||
<string name="no_app_for_opening">Bu dosyayı açmak için uygun bir uygulama bulunamadı</string>
|
||||
<string name="remote_keyboard_service">KDE Bağlan Uzaktan Klavye</string>
|
||||
<string name="presenter_pointer">İşaretçi</string>
|
||||
|
@@ -292,9 +292,10 @@
|
||||
<string name="notification_channel_default">Інші сповіщення</string>
|
||||
<string name="notification_channel_persistent">Постійний індикатор</string>
|
||||
<string name="notification_channel_media_control">Керування відтворенням</string>
|
||||
<string name="notification_channel_filetransfer">Передавання файлів</string>
|
||||
<string name="notification_channel_filetransfer">Вхідне перенесення файла</string>
|
||||
<string name="notification_channel_filetransfer_upload">Вихідне перенесення файла</string>
|
||||
<string name="notification_channel_filetransfer_error">Помилка передавання файлів</string>
|
||||
<string name="notification_channel_high_priority">Високий пріоритет</string>
|
||||
<string name="notification_channel_sms_mms">Нове повідомлення</string>
|
||||
<string name="mpris_stop">Зупинити відтворення у поточному програвачі</string>
|
||||
<string name="copy_url_to_clipboard">Скопіювати адресу до буфера</string>
|
||||
<string name="clipboard_toast">Скопійовано до буфера</string>
|
||||
@@ -323,8 +324,6 @@
|
||||
<string name="block_contents">Блокувати вміст сповіщень</string>
|
||||
<string name="block_images">Блокувати зображення у сповіщеннях</string>
|
||||
<string name="notification_channel_receivenotification">Сповіщення з інших пристроїв</string>
|
||||
<string name="take_picture">Запустити камеру</string>
|
||||
<string name="plugin_photo_desc">Запустити додаток камери для спрощення знімання та передавання фотографій</string>
|
||||
<string name="no_app_for_opening">Не знайдено відповідної програми для відкриття цього файла</string>
|
||||
<string name="remote_keyboard_service">Віддалена клавіатура KDE Connect</string>
|
||||
<string name="presenter_pointer">Указка</string>
|
||||
|
@@ -175,6 +175,7 @@
|
||||
<item>1 分钟</item>
|
||||
<item>2 分钟</item>
|
||||
</string-array>
|
||||
<string name="mpris_notifications_explanation">在通知栏中显示远程媒体需要通知权限</string>
|
||||
<string name="mpris_notification_settings_title">显示媒体控制通知</string>
|
||||
<string name="mpris_notification_settings_summary">不打开 KDE Connect 也能在常驻通知中控制媒体播放器</string>
|
||||
<string name="share_to">分享到...</string>
|
||||
@@ -244,6 +245,7 @@
|
||||
<string name="optional_permission_explanation">您需要授予额外权限以启用全部功能</string>
|
||||
<string name="plugins_need_optional_permission">因缺少权限,某些插件的一些功能已禁用(点击以查看更多信息):</string>
|
||||
<string name="share_optional_permission_explanation">要接收文件,您必须允许存储访问权限</string>
|
||||
<string name="share_notifications_explanation">要查看发送和接收文件时的进度,您需要允许通知</string>
|
||||
<string name="telepathy_permission_explanation">从计算机桌面读取、写入短消息需要向应用程序授予 SMS 权限</string>
|
||||
<string name="telephony_permission_explanation">要桌面上查看手机通话记录,您需要授予访问通话记录和手机状态的权限</string>
|
||||
<string name="telephony_optional_permission_explanation">要查看联系人姓名而非电话号码,您需要授予访问手机通讯录的权限</string>
|
||||
@@ -266,9 +268,9 @@
|
||||
<string name="notification_channel_default">其他通知</string>
|
||||
<string name="notification_channel_persistent">持久性通知</string>
|
||||
<string name="notification_channel_media_control">媒体控制</string>
|
||||
<string name="notification_channel_filetransfer">文件传送</string>
|
||||
<string name="notification_channel_filetransfer">正在传入的文件传输</string>
|
||||
<string name="notification_channel_filetransfer_upload">正在传出的文件传输</string>
|
||||
<string name="notification_channel_high_priority">高优先级</string>
|
||||
<string name="notification_channel_sms_mms">新建消息</string>
|
||||
<string name="mpris_stop">停止但前播放器</string>
|
||||
<string name="copy_url_to_clipboard">复制 URL 到剪贴板</string>
|
||||
<string name="clipboard_toast">已复制到剪贴板</string>
|
||||
@@ -297,8 +299,6 @@
|
||||
<string name="block_contents">阻止通知内容</string>
|
||||
<string name="block_images">阻止通知图像</string>
|
||||
<string name="notification_channel_receivenotification">来自其他设备的通知</string>
|
||||
<string name="take_picture">启动相机</string>
|
||||
<string name="plugin_photo_desc">启动相机应用程序以方便拍摄和转移图片</string>
|
||||
<string name="no_app_for_opening">没有找到合适的应用程序打开此文件</string>
|
||||
<string name="remote_keyboard_service">KDE Connect 远程键盘</string>
|
||||
<string name="presenter_pointer">指针</string>
|
||||
@@ -390,4 +390,7 @@
|
||||
<string name="tap_to_execute">轻触执行</string>
|
||||
<string name="plugin_stats">插件状态</string>
|
||||
<string name="enable_udp_broadcast">启用 UPnP 设备发现</string>
|
||||
<string name="receive_notifications_permission_explanation">需要允许通知才能从其他设备接收通知</string>
|
||||
<string name="findmyphone_notifications_explanation">需要通知权限,这样当应用程序处于后台时手机可以发出铃声</string>
|
||||
<string name="no_notifications">通知已禁用,您将不会收到传入的配对通知。</string>
|
||||
</resources>
|
||||
|
@@ -223,7 +223,6 @@
|
||||
<string name="pref_plugin_mprisreceiver_desc">從另外一個裝置操控您手機的媒體播放器</string>
|
||||
<string name="notification_channel_default">其他通知</string>
|
||||
<string name="notification_channel_media_control">多媒體控制</string>
|
||||
<string name="notification_channel_filetransfer">檔案傳輸</string>
|
||||
<string name="notification_channel_high_priority">高優先度</string>
|
||||
<string name="mpris_stop">停止目前播放器</string>
|
||||
<string name="copy_url_to_clipboard">複製 URL 至剪貼簿</string>
|
||||
@@ -253,8 +252,6 @@
|
||||
<string name="block_contents">阻擋通知內容</string>
|
||||
<string name="block_images">阻擋通知中的圖片</string>
|
||||
<string name="notification_channel_receivenotification">其他裝置上的通知</string>
|
||||
<string name="take_picture">啟動相機</string>
|
||||
<string name="plugin_photo_desc">開啟相機應用程式以輕鬆拍攝並傳輸相片</string>
|
||||
<string name="no_app_for_opening">找不到適合用來開啟此檔案的應用程式</string>
|
||||
<string name="remote_keyboard_service">KDE 連線遠端鍵盤</string>
|
||||
<string name="presenter_pointer">指標裝置</string>
|
||||
|
@@ -337,6 +337,8 @@ SPDX-License-Identifier: GPL-2.0-only OR GPL-3.0-only OR LicenseRef-KDE-Accepted
|
||||
<string name="telephony_permission_explanation">To see phone calls on the desktop you need to give permission to phone call logs and phone state</string>
|
||||
<string name="telephony_optional_permission_explanation">To see a contact name instead of a phone number you need to give access to the phone\'s contacts</string>
|
||||
<string name="contacts_permission_explanation">To share your contacts book with the desktop, you need to give contacts permission</string>
|
||||
<string name="contacts_per_device_confirmation">Your phone contacts will be copied over to this device, so they can be used by the KDE Connect SMS app and other apps.</string>
|
||||
|
||||
<string name="select_ringtone">Select a ringtone</string>
|
||||
<string name="telephony_pref_blocked_title">Blocked numbers</string>
|
||||
<string name="telephony_pref_blocked_dialog_desc">Don\'t show calls and SMS from these numbers. Please specify one number per line</string>
|
||||
@@ -358,9 +360,10 @@ SPDX-License-Identifier: GPL-2.0-only OR GPL-3.0-only OR LicenseRef-KDE-Accepted
|
||||
<string name="notification_channel_default">Other notifications</string>
|
||||
<string name="notification_channel_persistent">Persistent indicator</string>
|
||||
<string name="notification_channel_media_control">Media control</string>
|
||||
<string name="notification_channel_filetransfer">File transfer</string>
|
||||
<string name="notification_channel_filetransfer">Incoming file transfer</string>
|
||||
<string name="notification_channel_filetransfer_upload">Outgoing file transfer</string>
|
||||
<string name="notification_channel_filetransfer_error">File transfer error</string>
|
||||
<string name="notification_channel_high_priority">High priority</string>
|
||||
<string name="notification_channel_sms_mms">New Message</string>
|
||||
|
||||
<string name="mpris_stop">Stop the current player</string>
|
||||
<string name="copy_url_to_clipboard">Copy URL to clipboard</string>
|
||||
@@ -394,8 +397,6 @@ SPDX-License-Identifier: GPL-2.0-only OR GPL-3.0-only OR LicenseRef-KDE-Accepted
|
||||
<string name="block_contents">Block contents of notifications</string>
|
||||
<string name="block_images">Block images in notifications</string>
|
||||
<string name="notification_channel_receivenotification">Notifications from other devices</string>
|
||||
<string name="take_picture">Launch camera</string>
|
||||
<string name="plugin_photo_desc">Launch the camera app to ease taking and transferring pictures</string>
|
||||
|
||||
<string name="findmyphone_preference_key_ringtone" translatable="false">findmyphone_ringtone</string>
|
||||
|
||||
@@ -549,6 +550,8 @@ SPDX-License-Identifier: GPL-2.0-only OR GPL-3.0-only OR LicenseRef-KDE-Accepted
|
||||
|
||||
<string name="plugin_stats">Plugin stats</string>
|
||||
|
||||
<string name="enable_udp_broadcast">Enable UDP device discovery</string>
|
||||
|
||||
<string name="receive_notifications_permission_explanation">Notifications need to be allowed to receive them from other devices</string>
|
||||
<string name="findmyphone_notifications_explanation">The notifications permission is needed so the phone can ring when the app is in the background</string>
|
||||
<string name="no_notifications">Notifications are disabled, you won\'t receive incoming pair notifications.</string>
|
||||
|
@@ -28,6 +28,7 @@ import org.kde.kdeconnect.Helpers.TrustedNetworkHelper;
|
||||
import org.kde.kdeconnect.KdeConnect;
|
||||
import org.kde.kdeconnect.NetworkPacket;
|
||||
import org.kde.kdeconnect.UserInterface.CustomDevicesActivity;
|
||||
import org.kde.kdeconnect.UserInterface.SettingsFragment;
|
||||
|
||||
import java.io.BufferedReader;
|
||||
import java.io.IOException;
|
||||
@@ -61,9 +62,9 @@ import kotlin.text.Charsets;
|
||||
*/
|
||||
public class LanLinkProvider extends BaseLinkProvider {
|
||||
|
||||
private final static int UDP_PORT = 1716;
|
||||
private final static int MIN_PORT = 1716;
|
||||
private final static int MAX_PORT = 1764;
|
||||
final static int UDP_PORT = 1716;
|
||||
final static int MIN_PORT = 1716;
|
||||
final static int MAX_PORT = 1764;
|
||||
final static int PAYLOAD_TRANSFER_MIN_PORT = 1739;
|
||||
|
||||
final static int MAX_UDP_PACKET_SIZE = 1024 * 512;
|
||||
@@ -72,13 +73,15 @@ public class LanLinkProvider extends BaseLinkProvider {
|
||||
|
||||
private final Context context;
|
||||
|
||||
private final HashMap<String, LanLink> visibleDevices = new HashMap<>(); // Links by device id
|
||||
final HashMap<String, LanLink> visibleDevices = new HashMap<>(); // Links by device id
|
||||
|
||||
final ConcurrentHashMap<String, Long> lastConnectionTime = new ConcurrentHashMap<>();
|
||||
|
||||
private ServerSocket tcpServer;
|
||||
private DatagramSocket udpServer;
|
||||
|
||||
private MdnsDiscovery mdnsDiscovery;
|
||||
|
||||
private long lastBroadcast = 0;
|
||||
private final static long delayBetweenBroadcasts = 200;
|
||||
|
||||
@@ -268,6 +271,7 @@ public class LanLinkProvider extends BaseLinkProvider {
|
||||
|
||||
public LanLinkProvider(Context context) {
|
||||
this.context = context;
|
||||
this.mdnsDiscovery = new MdnsDiscovery(context, this);
|
||||
}
|
||||
|
||||
private void setupUdpListener() {
|
||||
@@ -355,6 +359,11 @@ public class LanLinkProvider extends BaseLinkProvider {
|
||||
}
|
||||
|
||||
private void broadcastUdpIdentityPacket(@Nullable Network network) {
|
||||
SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(context);
|
||||
if (!preferences.getBoolean(SettingsFragment.KEY_UDP_BROADCAST_ENABLED, true)) {
|
||||
Log.i("LanLinkProvider", "UDP broadcast is disabled in settings. Skipping.");
|
||||
return;
|
||||
}
|
||||
|
||||
ThreadHelper.execute(() -> {
|
||||
List<String> ipStringList = CustomDevicesActivity
|
||||
@@ -442,6 +451,9 @@ public class LanLinkProvider extends BaseLinkProvider {
|
||||
setupUdpListener();
|
||||
setupTcpListener();
|
||||
|
||||
mdnsDiscovery.startDiscovering();
|
||||
mdnsDiscovery.startAnnouncing();
|
||||
|
||||
broadcastUdpIdentityPacket(null);
|
||||
}
|
||||
}
|
||||
@@ -455,12 +467,16 @@ public class LanLinkProvider extends BaseLinkProvider {
|
||||
lastBroadcast = System.currentTimeMillis();
|
||||
|
||||
broadcastUdpIdentityPacket(network);
|
||||
mdnsDiscovery.stopDiscovering();
|
||||
mdnsDiscovery.startDiscovering();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onStop() {
|
||||
//Log.i("KDE/LanLinkProvider", "onStop");
|
||||
listening = false;
|
||||
mdnsDiscovery.stopAnnouncing();
|
||||
mdnsDiscovery.stopDiscovering();
|
||||
try {
|
||||
tcpServer.close();
|
||||
} catch (Exception e) {
|
||||
|
224
src/org/kde/kdeconnect/Backends/LanBackend/MdnsDiscovery.java
Normal file
224
src/org/kde/kdeconnect/Backends/LanBackend/MdnsDiscovery.java
Normal file
@@ -0,0 +1,224 @@
|
||||
/*
|
||||
* SPDX-FileCopyrightText: 2023 Albert Vaca Cintora <albertvaka@gmail.com>
|
||||
*
|
||||
* SPDX-License-Identifier: GPL-2.0-only OR GPL-3.0-only OR LicenseRef-KDE-Accepted-GPL
|
||||
*/
|
||||
|
||||
|
||||
package org.kde.kdeconnect.Backends.LanBackend;
|
||||
|
||||
import android.content.Context;
|
||||
import android.net.nsd.NsdManager;
|
||||
import android.net.nsd.NsdServiceInfo;
|
||||
import android.net.wifi.WifiManager;
|
||||
import android.util.Log;
|
||||
|
||||
import org.kde.kdeconnect.Helpers.DeviceHelper;
|
||||
|
||||
import java.net.InetAddress;
|
||||
import java.util.Collections;
|
||||
|
||||
public class MdnsDiscovery {
|
||||
|
||||
static final String LOG_TAG = "MdnsDiscovery";
|
||||
|
||||
static final String SERVICE_TYPE = "_kdeconnect._udp";
|
||||
|
||||
private final Context context;
|
||||
|
||||
private final LanLinkProvider lanLinkProvider;
|
||||
|
||||
private final NsdManager mNsdManager;
|
||||
private NsdManager.RegistrationListener registrationListener;
|
||||
private NsdManager.DiscoveryListener discoveryListener;
|
||||
|
||||
private WifiManager.MulticastLock multicastLock;
|
||||
|
||||
private NsdResolveQueue mNsdResolveQueue;
|
||||
|
||||
public MdnsDiscovery(Context context, LanLinkProvider lanLinkProvider) {
|
||||
this.context = context;
|
||||
this.lanLinkProvider = lanLinkProvider;
|
||||
this.mNsdManager = (NsdManager) context.getSystemService(Context.NSD_SERVICE);
|
||||
this.mNsdResolveQueue = new NsdResolveQueue(this.mNsdManager);
|
||||
WifiManager wifiManager = (WifiManager) context.getSystemService(Context.WIFI_SERVICE);
|
||||
multicastLock = wifiManager.createMulticastLock("kdeConnectMdnsMulticastLock");
|
||||
}
|
||||
|
||||
void startDiscovering() {
|
||||
if (discoveryListener == null) {
|
||||
multicastLock.acquire();
|
||||
discoveryListener = createDiscoveryListener();
|
||||
mNsdManager.discoverServices(SERVICE_TYPE, NsdManager.PROTOCOL_DNS_SD, discoveryListener);
|
||||
}
|
||||
}
|
||||
|
||||
void stopDiscovering() {
|
||||
try {
|
||||
if (discoveryListener != null) {
|
||||
mNsdManager.stopServiceDiscovery(discoveryListener);
|
||||
multicastLock.release();
|
||||
}
|
||||
} catch(IllegalArgumentException e) {
|
||||
// Ignore "listener not registered" exception
|
||||
}
|
||||
discoveryListener = null;
|
||||
}
|
||||
|
||||
void stopAnnouncing() {
|
||||
try {
|
||||
if (registrationListener != null) {
|
||||
mNsdManager.unregisterService(registrationListener);
|
||||
}
|
||||
} catch(IllegalArgumentException e) {
|
||||
// Ignore "listener not registered" exception
|
||||
}
|
||||
registrationListener = null;
|
||||
}
|
||||
|
||||
void startAnnouncing() {
|
||||
if (registrationListener == null) {
|
||||
NsdServiceInfo serviceInfo;
|
||||
try {
|
||||
serviceInfo = createNsdServiceInfo();
|
||||
} catch (IllegalAccessException e) {
|
||||
Log.w(LOG_TAG, "Couldn't start announcing via MDNS: " + e.getMessage());
|
||||
return;
|
||||
}
|
||||
registrationListener = createRegistrationListener();
|
||||
mNsdManager.registerService(serviceInfo, NsdManager.PROTOCOL_DNS_SD, registrationListener);
|
||||
}
|
||||
}
|
||||
|
||||
NsdManager.RegistrationListener createRegistrationListener() {
|
||||
return new NsdManager.RegistrationListener() {
|
||||
|
||||
@Override
|
||||
public void onServiceRegistered(NsdServiceInfo serviceInfo) {
|
||||
// If Android changed the service name to avoid conflicts, here we can read it.
|
||||
Log.i(LOG_TAG, "Registered " + serviceInfo.getServiceName());
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onRegistrationFailed(NsdServiceInfo serviceInfo, int errorCode) {
|
||||
Log.e(LOG_TAG, "Registration failed with: " + errorCode);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onServiceUnregistered(NsdServiceInfo serviceInfo) {
|
||||
Log.d(LOG_TAG, "Service unregistered: " + serviceInfo);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onUnregistrationFailed(NsdServiceInfo serviceInfo, int errorCode) {
|
||||
Log.e(LOG_TAG, "Unregister of " + serviceInfo + " failed with: " + errorCode);
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
public NsdServiceInfo createNsdServiceInfo() throws IllegalAccessException {
|
||||
NsdServiceInfo serviceInfo = new NsdServiceInfo();
|
||||
|
||||
String deviceId = DeviceHelper.getDeviceId(context);
|
||||
// Without resolving the DNS, the service name is the only info we have so it must be sufficient to identify a device.
|
||||
// Also, it must be unique, otherwise it will be automatically renamed. For these reasons we use the deviceId.
|
||||
serviceInfo.setServiceName(deviceId);
|
||||
serviceInfo.setServiceType(SERVICE_TYPE);
|
||||
serviceInfo.setPort(LanLinkProvider.UDP_PORT);
|
||||
|
||||
// The following fields aren't really used for anything, since we can't include enough info
|
||||
// for it to be useful (namely: we can't include the device certificate).
|
||||
// Each field (key + value) needs to be < 255 bytes. All the fields combined need to be < 1300 bytes.
|
||||
// Also, on Android Lollipop those fields aren't resolved.
|
||||
String deviceName = DeviceHelper.getDeviceName(context);
|
||||
String deviceType = DeviceHelper.getDeviceType(context).toString();
|
||||
String protocolVersion = Integer.toString(DeviceHelper.ProtocolVersion);
|
||||
serviceInfo.setAttribute("id", deviceId);
|
||||
serviceInfo.setAttribute("name", deviceName);
|
||||
serviceInfo.setAttribute("type", deviceType);
|
||||
serviceInfo.setAttribute("protocol", protocolVersion);
|
||||
|
||||
Log.i(LOG_TAG, "My MDNS info: " + serviceInfo);
|
||||
|
||||
return serviceInfo;
|
||||
}
|
||||
|
||||
NsdManager.DiscoveryListener createDiscoveryListener() {
|
||||
return new NsdManager.DiscoveryListener() {
|
||||
|
||||
final String myId = DeviceHelper.getDeviceId(context);
|
||||
|
||||
@Override
|
||||
public void onDiscoveryStarted(String serviceType) {
|
||||
Log.i(LOG_TAG, "Service discovery started: " + serviceType);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onServiceFound(NsdServiceInfo serviceInfo) {
|
||||
Log.d(LOG_TAG, "Service discovered: " + serviceInfo);
|
||||
|
||||
String deviceId = serviceInfo.getServiceName();
|
||||
|
||||
if (myId.equals(deviceId)) {
|
||||
Log.d(LOG_TAG, "Discovered myself, ignoring.");
|
||||
return;
|
||||
}
|
||||
|
||||
if (lanLinkProvider.visibleDevices.containsKey(deviceId)) {
|
||||
Log.i(LOG_TAG, "MDNS discovered " + deviceId + " to which I'm already connected to. Ignoring.");
|
||||
return;
|
||||
}
|
||||
|
||||
// We use a queue because only one service can be resolved at
|
||||
// a time, otherwise we get error 3 (already active) in onResolveFailed.
|
||||
mNsdResolveQueue.resolveOrEnqueue(serviceInfo, createResolveListener());
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onServiceLost(NsdServiceInfo serviceInfo) {
|
||||
Log.w(LOG_TAG, "Service lost: " + serviceInfo);
|
||||
// We can't see this device via mdns. This probably means it's not reachable anymore
|
||||
// but we do nothing here since we have other ways to do detect unreachable devices
|
||||
// that hopefully will also trigger.
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onDiscoveryStopped(String serviceType) {
|
||||
Log.i(LOG_TAG, "MDNS discovery stopped: " + serviceType);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onStartDiscoveryFailed(String serviceType, int errorCode) {
|
||||
Log.e(LOG_TAG, "MDNS discovery start failed: " + errorCode);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onStopDiscoveryFailed(String serviceType, int errorCode) {
|
||||
Log.e(LOG_TAG, "MDNS discovery stop failed: " + errorCode);
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Returns a new listener instance since NsdManager wants a different listener each time you call resolveService
|
||||
*/
|
||||
NsdManager.ResolveListener createResolveListener() {
|
||||
return new NsdManager.ResolveListener() {
|
||||
@Override
|
||||
public void onResolveFailed(NsdServiceInfo serviceInfo, int errorCode) {
|
||||
Log.w(LOG_TAG, "MDNS error " + errorCode + " resolving service: " + serviceInfo);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onServiceResolved(NsdServiceInfo serviceInfo) {
|
||||
Log.i(LOG_TAG, "MDNS successfully resolved " + serviceInfo);
|
||||
|
||||
// Let the LanLinkProvider handle the connection
|
||||
InetAddress remoteAddress = serviceInfo.getHost();
|
||||
lanLinkProvider.sendUdpIdentityPacket(Collections.singletonList(remoteAddress), null);
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
}
|
@@ -0,0 +1,91 @@
|
||||
/*
|
||||
* SPDX-FileCopyrightText: 2023 Albert Vaca Cintora <albertvaka@gmail.com>
|
||||
*
|
||||
* SPDX-License-Identifier: GPL-2.0-only OR GPL-3.0-only OR LicenseRef-KDE-Accepted-GPL
|
||||
*/
|
||||
|
||||
package org.kde.kdeconnect.Backends.LanBackend;
|
||||
|
||||
import android.net.nsd.NsdManager;
|
||||
import android.net.nsd.NsdServiceInfo;
|
||||
import android.util.Log;
|
||||
|
||||
import androidx.annotation.NonNull;
|
||||
|
||||
import java.util.LinkedList;
|
||||
|
||||
public class NsdResolveQueue {
|
||||
|
||||
static final String LOG_TAG = "NsdResolveQueue";
|
||||
|
||||
final @NonNull NsdManager mNsdManager;
|
||||
|
||||
private final Object mLock = new Object();
|
||||
private final LinkedList<PendingResolve> mResolveRequests = new LinkedList<>();
|
||||
|
||||
public NsdResolveQueue(NsdManager nsdManager) {
|
||||
this.mNsdManager = nsdManager;
|
||||
}
|
||||
|
||||
private static class PendingResolve {
|
||||
final @NonNull NsdServiceInfo serviceInfo;
|
||||
final @NonNull NsdManager.ResolveListener listener;
|
||||
|
||||
private PendingResolve(@NonNull NsdServiceInfo serviceInfo, @NonNull NsdManager.ResolveListener listener) {
|
||||
this.serviceInfo = serviceInfo;
|
||||
this.listener = listener;
|
||||
}
|
||||
}
|
||||
|
||||
public void resolveOrEnqueue(@NonNull NsdServiceInfo serviceInfo, @NonNull NsdManager.ResolveListener listener) {
|
||||
synchronized (mLock) {
|
||||
for (PendingResolve existing : mResolveRequests) {
|
||||
if (serviceInfo.getServiceName().equals(existing.serviceInfo.getServiceName())) {
|
||||
Log.i(LOG_TAG, "Not enqueuing a new resolve request for the same service: " + serviceInfo.getServiceName());
|
||||
return;
|
||||
}
|
||||
}
|
||||
mResolveRequests.addLast(new PendingResolve(serviceInfo, new ListenerWrapper(listener)));
|
||||
|
||||
if (mResolveRequests.size() == 1) {
|
||||
resolveNextRequest();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private class ListenerWrapper implements NsdManager.ResolveListener {
|
||||
private final @NonNull NsdManager.ResolveListener mListener;
|
||||
|
||||
private ListenerWrapper(@NonNull NsdManager.ResolveListener listener) {
|
||||
mListener = listener;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onResolveFailed(NsdServiceInfo serviceInfo, int errorCode) {
|
||||
mListener.onResolveFailed(serviceInfo, errorCode);
|
||||
|
||||
synchronized (mLock) {
|
||||
mResolveRequests.pop();
|
||||
resolveNextRequest();
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onServiceResolved(NsdServiceInfo serviceInfo) {
|
||||
mListener.onServiceResolved(serviceInfo);
|
||||
|
||||
synchronized (mLock) {
|
||||
mResolveRequests.pop();
|
||||
resolveNextRequest();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private void resolveNextRequest() {
|
||||
if (!mResolveRequests.isEmpty()) {
|
||||
PendingResolve request = mResolveRequests.getFirst();
|
||||
mNsdManager.resolveService(request.serviceInfo, request.listener);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
@@ -102,13 +102,14 @@ class DeviceInfo(
|
||||
}
|
||||
|
||||
enum class DeviceType {
|
||||
PHONE, TABLET, COMPUTER, TV;
|
||||
PHONE, TABLET, DESKTOP, LAPTOP, TV;
|
||||
|
||||
override fun toString() =
|
||||
when (this) {
|
||||
TABLET -> "tablet"
|
||||
PHONE -> "phone"
|
||||
TV -> "tv"
|
||||
LAPTOP -> "laptop"
|
||||
else -> "desktop"
|
||||
}
|
||||
|
||||
@@ -120,7 +121,8 @@ enum class DeviceType {
|
||||
PHONE -> R.drawable.ic_device_phone_32dp
|
||||
TABLET -> R.drawable.ic_device_tablet_32dp
|
||||
TV -> R.drawable.ic_device_tv_32dp
|
||||
else -> R.drawable.ic_device_laptop_32dp
|
||||
LAPTOP -> R.drawable.ic_device_laptop_32dp
|
||||
else -> R.drawable.ic_device_desktop_32dp
|
||||
}
|
||||
|
||||
companion object {
|
||||
@@ -130,7 +132,8 @@ enum class DeviceType {
|
||||
"phone" -> PHONE
|
||||
"tablet" -> TABLET
|
||||
"tv" -> TV
|
||||
else -> COMPUTER
|
||||
"laptop" -> LAPTOP
|
||||
else -> DESKTOP
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@@ -20,6 +20,7 @@ import org.kde.kdeconnect_tp.R;
|
||||
|
||||
import java.util.Arrays;
|
||||
import java.util.List;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
public class NotificationHelper {
|
||||
|
||||
@@ -27,8 +28,11 @@ public class NotificationHelper {
|
||||
public final static String PERSISTENT = "persistent";
|
||||
public final static String DEFAULT = "default";
|
||||
public final static String MEDIA_CONTROL = "media_control";
|
||||
public final static String FILETRANSFER = "filetransfer";
|
||||
public final static String SMS_MMS = "sms_mms";
|
||||
|
||||
public final static String FILETRANSFER_DOWNLOAD = "filetransfer";
|
||||
public final static String FILETRANSFER_UPLOAD = "filetransfer_upload";
|
||||
public final static String FILETRANSFER_ERROR = "filetransfer_error";
|
||||
|
||||
public final static String RECEIVENOTIFICATION = "receive";
|
||||
public final static String HIGHPRIORITY = "highpriority";
|
||||
}
|
||||
@@ -64,28 +68,42 @@ public class NotificationHelper {
|
||||
.Builder(Channels.MEDIA_CONTROL, NotificationManagerCompat.IMPORTANCE_LOW)
|
||||
.setName(context.getString(R.string.notification_channel_media_control))
|
||||
.build();
|
||||
final NotificationChannelCompat fileTransferChannel = new NotificationChannelCompat
|
||||
.Builder(Channels.FILETRANSFER, NotificationManagerCompat.IMPORTANCE_LOW)
|
||||
final NotificationChannelCompat fileTransferDownloadChannel = new NotificationChannelCompat
|
||||
.Builder(Channels.FILETRANSFER_DOWNLOAD, NotificationManagerCompat.IMPORTANCE_LOW)
|
||||
.setName(context.getString(R.string.notification_channel_filetransfer))
|
||||
.setVibrationEnabled(false)
|
||||
.build();
|
||||
final NotificationChannelCompat fileTransferUploadChannel = new NotificationChannelCompat
|
||||
.Builder(Channels.FILETRANSFER_UPLOAD, NotificationManagerCompat.IMPORTANCE_LOW)
|
||||
.setName(context.getString(R.string.notification_channel_filetransfer_upload))
|
||||
.setVibrationEnabled(false)
|
||||
.build();
|
||||
final NotificationChannelCompat fileTransferErrorChannel = new NotificationChannelCompat
|
||||
.Builder(Channels.FILETRANSFER_ERROR, NotificationManagerCompat.IMPORTANCE_HIGH)
|
||||
.setName(context.getString(R.string.notification_channel_filetransfer_error))
|
||||
.setVibrationEnabled(false)
|
||||
.build();
|
||||
final NotificationChannelCompat receiveNotificationChannel = new NotificationChannelCompat
|
||||
.Builder(Channels.RECEIVENOTIFICATION, NotificationManagerCompat.IMPORTANCE_DEFAULT)
|
||||
.setName(context.getString(R.string.notification_channel_receivenotification))
|
||||
.build();
|
||||
final NotificationChannelCompat smsMmsChannel = new NotificationChannelCompat
|
||||
.Builder(Channels.SMS_MMS, NotificationManagerCompat.IMPORTANCE_DEFAULT)
|
||||
.setName(context.getString(R.string.notification_channel_sms_mms))
|
||||
.build();
|
||||
final NotificationChannelCompat highPriorityChannel = new NotificationChannelCompat
|
||||
.Builder(Channels.HIGHPRIORITY, NotificationManagerCompat.IMPORTANCE_HIGH)
|
||||
.setName(context.getString(R.string.notification_channel_high_priority))
|
||||
.build();
|
||||
|
||||
final List<NotificationChannelCompat> channels = Arrays.asList(persistentChannel,
|
||||
defaultChannel, mediaChannel, fileTransferChannel, receiveNotificationChannel,
|
||||
smsMmsChannel, highPriorityChannel);
|
||||
defaultChannel, mediaChannel, fileTransferDownloadChannel, fileTransferUploadChannel,
|
||||
fileTransferErrorChannel, receiveNotificationChannel, highPriorityChannel);
|
||||
|
||||
NotificationManagerCompat.from(context).createNotificationChannelsCompat(channels);
|
||||
|
||||
// Delete any notification channels which weren't added.
|
||||
// Use this to deprecate old channels.
|
||||
NotificationManagerCompat.from(context).deleteUnlistedNotificationChannels(
|
||||
channels.stream()
|
||||
.map(notificationChannelCompat -> notificationChannelCompat.getId())
|
||||
.collect(Collectors.toList()));
|
||||
}
|
||||
|
||||
public static void setPersistentNotificationEnabled(Context context, boolean enabled) {
|
||||
|
@@ -8,7 +8,9 @@ package org.kde.kdeconnect.Helpers.SecurityHelpers;
|
||||
|
||||
import android.content.Context;
|
||||
import android.content.SharedPreferences;
|
||||
import android.os.Build;
|
||||
import android.preference.PreferenceManager;
|
||||
import android.security.keystore.KeyProperties;
|
||||
import android.util.Base64;
|
||||
import android.util.Log;
|
||||
|
||||
@@ -18,6 +20,7 @@ import java.security.KeyPair;
|
||||
import java.security.KeyPairGenerator;
|
||||
import java.security.PrivateKey;
|
||||
import java.security.PublicKey;
|
||||
import java.security.spec.ECGenParameterSpec;
|
||||
import java.security.spec.PKCS8EncodedKeySpec;
|
||||
import java.security.spec.X509EncodedKeySpec;
|
||||
|
||||
@@ -29,10 +32,20 @@ public class RsaHelper {
|
||||
if (!settings.contains("publicKey") || !settings.contains("privateKey")) {
|
||||
|
||||
KeyPair keyPair;
|
||||
String keyAlgorithm;
|
||||
try {
|
||||
KeyPairGenerator keyGen = KeyPairGenerator.getInstance("RSA");
|
||||
keyGen.initialize(2048);
|
||||
keyPair = keyGen.genKeyPair();
|
||||
KeyPairGenerator keyGen;
|
||||
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
|
||||
keyAlgorithm = KeyProperties.KEY_ALGORITHM_EC;
|
||||
keyGen = KeyPairGenerator.getInstance(keyAlgorithm);
|
||||
ECGenParameterSpec spec = new ECGenParameterSpec("secp256r1");
|
||||
keyGen.initialize(spec);
|
||||
} else {
|
||||
keyAlgorithm = "RSA";
|
||||
keyGen = KeyPairGenerator.getInstance(keyAlgorithm);
|
||||
keyGen.initialize(2048);
|
||||
}
|
||||
keyPair = keyGen.generateKeyPair();
|
||||
} catch (Exception e) {
|
||||
Log.e("KDE/initializeRsaKeys", "Exception", e);
|
||||
return;
|
||||
@@ -44,6 +57,7 @@ public class RsaHelper {
|
||||
SharedPreferences.Editor edit = settings.edit();
|
||||
edit.putString("publicKey", Base64.encodeToString(publicKey, 0).trim() + "\n");
|
||||
edit.putString("privateKey", Base64.encodeToString(privateKey, 0));
|
||||
edit.putString("keyAlgorithm", keyAlgorithm);
|
||||
edit.apply();
|
||||
|
||||
}
|
||||
@@ -53,13 +67,17 @@ public class RsaHelper {
|
||||
public static PublicKey getPublicKey(Context context) throws GeneralSecurityException {
|
||||
SharedPreferences settings = PreferenceManager.getDefaultSharedPreferences(context);
|
||||
byte[] publicKeyBytes = Base64.decode(settings.getString("publicKey", ""), 0);
|
||||
return KeyFactory.getInstance("RSA").generatePublic(new X509EncodedKeySpec(publicKeyBytes));
|
||||
// For backwards compat: if no keyAlgorithm setting is set, it means it was generated using RSA
|
||||
String keyAlgorithm = settings.getString("keyAlgorithm", "RSA");
|
||||
return KeyFactory.getInstance(keyAlgorithm).generatePublic(new X509EncodedKeySpec(publicKeyBytes));
|
||||
}
|
||||
|
||||
public static PrivateKey getPrivateKey(Context context) throws GeneralSecurityException {
|
||||
SharedPreferences globalSettings = PreferenceManager.getDefaultSharedPreferences(context);
|
||||
byte[] privateKeyBytes = Base64.decode(globalSettings.getString("privateKey", ""), 0);
|
||||
return KeyFactory.getInstance("RSA").generatePrivate(new PKCS8EncodedKeySpec(privateKeyBytes));
|
||||
SharedPreferences settings = PreferenceManager.getDefaultSharedPreferences(context);
|
||||
byte[] privateKeyBytes = Base64.decode(settings.getString("privateKey", ""), 0);
|
||||
// For backwards compat: if no keyAlgorithm setting is set, it means it was generated using RSA
|
||||
String keyAlgorithm = settings.getString("keyAlgorithm", "RSA");
|
||||
return KeyFactory.getInstance(keyAlgorithm).generatePrivate(new PKCS8EncodedKeySpec(privateKeyBytes));
|
||||
}
|
||||
|
||||
|
||||
|
@@ -98,6 +98,8 @@ public class SslHelper {
|
||||
return;
|
||||
}
|
||||
|
||||
Log.i("SslHelper", "Key algorithm: " + publicKey.getAlgorithm());
|
||||
|
||||
String deviceId = DeviceHelper.getDeviceId(context);
|
||||
|
||||
boolean needsToGenerateCertificate = false;
|
||||
@@ -147,7 +149,9 @@ public class SslHelper {
|
||||
nameBuilder.build(),
|
||||
publicKey
|
||||
);
|
||||
ContentSigner contentSigner = new JcaContentSignerBuilder("SHA256WithRSA").build(privateKey);
|
||||
String keyAlgorithm = privateKey.getAlgorithm();
|
||||
String signatureAlgorithm = "RSA".equals(keyAlgorithm)? "SHA512withRSA" : "SHA512withECDSA";
|
||||
ContentSigner contentSigner = new JcaContentSignerBuilder(signatureAlgorithm).build(privateKey);
|
||||
byte[] certificateBytes = certificateBuilder.build(contentSigner).getEncoded();
|
||||
certificate = parseCertificate(certificateBytes);
|
||||
|
||||
|
@@ -13,6 +13,7 @@ import android.Manifest;
|
||||
import android.util.Log;
|
||||
|
||||
import androidx.annotation.NonNull;
|
||||
import androidx.fragment.app.DialogFragment;
|
||||
|
||||
import org.kde.kdeconnect.Helpers.ContactsHelper;
|
||||
import org.kde.kdeconnect.Helpers.ContactsHelper.ContactNotFoundException;
|
||||
@@ -21,6 +22,7 @@ import org.kde.kdeconnect.Helpers.ContactsHelper.uID;
|
||||
import org.kde.kdeconnect.NetworkPacket;
|
||||
import org.kde.kdeconnect.Plugins.Plugin;
|
||||
import org.kde.kdeconnect.Plugins.PluginFactory;
|
||||
import org.kde.kdeconnect.UserInterface.AlertDialogFragment;
|
||||
import org.kde.kdeconnect_tp.R;
|
||||
|
||||
import java.util.ArrayList;
|
||||
@@ -109,6 +111,39 @@ public class ContactsPlugin extends Plugin {
|
||||
// One day maybe we will also support WRITE_CONTACTS, but not yet
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean checkRequiredPermissions() {
|
||||
if (!arePermissionsGranted(getRequiredPermissions())) {
|
||||
return false;
|
||||
}
|
||||
return preferences.getBoolean("acceptedToTransferContacts", false);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean supportsDeviceSpecificSettings() {
|
||||
return true;
|
||||
}
|
||||
|
||||
public @NonNull DialogFragment getPermissionExplanationDialog() {
|
||||
if (!arePermissionsGranted(getRequiredPermissions())) {
|
||||
return super.getPermissionExplanationDialog();
|
||||
}
|
||||
AlertDialogFragment dialog = new AlertDialogFragment.Builder()
|
||||
.setTitle(getDisplayName())
|
||||
.setMessage(R.string.contacts_per_device_confirmation)
|
||||
.setPositiveButton(R.string.ok)
|
||||
.setNegativeButton(R.string.cancel)
|
||||
.create();
|
||||
dialog.setCallback(new AlertDialogFragment.Callback() {
|
||||
@Override
|
||||
public void onPositiveButtonClicked() {
|
||||
preferences.edit().putBoolean("acceptedToTransferContacts", true).apply();
|
||||
device.reloadPluginsFromSettings();
|
||||
}
|
||||
});
|
||||
return dialog;
|
||||
}
|
||||
|
||||
/**
|
||||
* Add custom fields to the vcard to keep track of KDE Connect-specific fields
|
||||
* <p>
|
||||
|
@@ -1,80 +0,0 @@
|
||||
/*
|
||||
* SPDX-FileCopyrightText: 2019 Nicolas Fella <nicolas.fella@gmx.de>
|
||||
*
|
||||
* SPDX-License-Identifier: GPL-2.0-only OR GPL-3.0-only OR LicenseRef-KDE-Accepted-GPL
|
||||
*/
|
||||
|
||||
package org.kde.kdeconnect.Plugins.PhotoPlugin;
|
||||
|
||||
import android.content.Intent;
|
||||
import android.net.Uri;
|
||||
import android.os.Environment;
|
||||
import android.provider.MediaStore;
|
||||
|
||||
import androidx.annotation.Nullable;
|
||||
import androidx.appcompat.app.AppCompatActivity;
|
||||
import androidx.core.content.FileProvider;
|
||||
|
||||
import org.kde.kdeconnect.KdeConnect;
|
||||
|
||||
import java.io.File;
|
||||
import java.io.IOException;
|
||||
import java.time.LocalDateTime;
|
||||
import java.time.format.DateTimeFormatter;
|
||||
|
||||
public class PhotoActivity extends AppCompatActivity {
|
||||
|
||||
private Uri photoURI;
|
||||
|
||||
@Override
|
||||
protected void onStart() {
|
||||
super.onStart();
|
||||
|
||||
Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
|
||||
if (takePictureIntent.resolveActivity(getPackageManager()) != null) {
|
||||
File photoFile = null;
|
||||
try {
|
||||
photoFile = createImageFile();
|
||||
} catch (IOException ignored) {
|
||||
}
|
||||
// Continue only if the File was successfully created
|
||||
if (photoFile != null) {
|
||||
photoURI = FileProvider.getUriForFile(this,
|
||||
"org.kde.kdeconnect_tp.fileprovider",
|
||||
photoFile);
|
||||
takePictureIntent.putExtra(MediaStore.EXTRA_OUTPUT, photoURI);
|
||||
startActivityForResult(takePictureIntent, 1);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
private File createImageFile() throws IOException {
|
||||
// Create an image file name
|
||||
String timeStamp = DateTimeFormatter.ofPattern("yyyyMMdd_HHmmss").format(LocalDateTime.now());
|
||||
String imageFileName = "JPEG_" + timeStamp + "_";
|
||||
File storageDir = getExternalFilesDir(Environment.DIRECTORY_PICTURES);
|
||||
return File.createTempFile(
|
||||
imageFileName, /* prefix */
|
||||
".jpg", /* suffix */
|
||||
storageDir /* directory */
|
||||
);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
|
||||
super.onActivityResult(requestCode, resultCode, data);
|
||||
String deviceId = getIntent().getStringExtra("deviceId");
|
||||
PhotoPlugin plugin = KdeConnect.getInstance().getDevicePlugin(deviceId, PhotoPlugin.class);
|
||||
if (plugin == null) {
|
||||
finish();
|
||||
return;
|
||||
}
|
||||
if (resultCode == -1) {
|
||||
plugin.sendPhoto(photoURI);
|
||||
} else {
|
||||
plugin.sendCancel();
|
||||
}
|
||||
finish();
|
||||
}
|
||||
}
|
@@ -1,73 +0,0 @@
|
||||
/*
|
||||
* SPDX-FileCopyrightText: 2019 Nicolas Fella <nicolas.fella@gmx.de>
|
||||
*
|
||||
* SPDX-License-Identifier: GPL-2.0-only OR GPL-3.0-only OR LicenseRef-KDE-Accepted-GPL
|
||||
*/
|
||||
|
||||
package org.kde.kdeconnect.Plugins.PhotoPlugin;
|
||||
|
||||
import android.content.Intent;
|
||||
import android.net.Uri;
|
||||
|
||||
import androidx.annotation.DrawableRes;
|
||||
import androidx.annotation.NonNull;
|
||||
|
||||
import org.kde.kdeconnect.Helpers.FilesHelper;
|
||||
import org.kde.kdeconnect.NetworkPacket;
|
||||
import org.kde.kdeconnect.Plugins.Plugin;
|
||||
import org.kde.kdeconnect.Plugins.PluginFactory;
|
||||
import org.kde.kdeconnect_tp.R;
|
||||
|
||||
@PluginFactory.LoadablePlugin
|
||||
public class PhotoPlugin extends Plugin {
|
||||
|
||||
private final static String PACKET_TYPE_PHOTO = "kdeconnect.photo";
|
||||
private final static String PACKET_TYPE_PHOTO_REQUEST = "kdeconnect.photo.request";
|
||||
|
||||
@Override
|
||||
public @NonNull String getDisplayName() {
|
||||
return context.getResources().getString(R.string.take_picture);
|
||||
}
|
||||
|
||||
@Override
|
||||
public @NonNull String getDescription() {
|
||||
return context.getResources().getString(R.string.plugin_photo_desc);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean onPacketReceived(@NonNull NetworkPacket np) {
|
||||
Intent intent = new Intent(context, PhotoActivity.class);
|
||||
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
|
||||
intent.putExtra("deviceId", device.getDeviceId());
|
||||
context.startActivity(intent);
|
||||
return true;
|
||||
}
|
||||
|
||||
void sendPhoto(Uri uri) {
|
||||
NetworkPacket np = FilesHelper.uriToNetworkPacket(context, uri, PACKET_TYPE_PHOTO);
|
||||
if (np != null) {
|
||||
device.sendPacket(np);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public @NonNull String[] getSupportedPacketTypes() {
|
||||
return new String[]{PACKET_TYPE_PHOTO_REQUEST};
|
||||
}
|
||||
|
||||
@Override
|
||||
public @NonNull String[] getOutgoingPacketTypes() {
|
||||
return new String[]{PACKET_TYPE_PHOTO};
|
||||
}
|
||||
|
||||
@Override
|
||||
public @DrawableRes int getIcon() {
|
||||
return R.drawable.ic_camera;
|
||||
}
|
||||
|
||||
void sendCancel() {
|
||||
NetworkPacket np = new NetworkPacket(PACKET_TYPE_PHOTO);
|
||||
np.set("cancel", true);
|
||||
device.sendPacket(np);
|
||||
}
|
||||
}
|
@@ -265,7 +265,7 @@ public abstract class Plugin {
|
||||
return (result == PackageManager.PERMISSION_GRANTED);
|
||||
}
|
||||
|
||||
private boolean arePermissionsGranted(@NonNull String[] permissions) {
|
||||
protected boolean arePermissionsGranted(@NonNull String[] permissions) {
|
||||
for (String permission : permissions) {
|
||||
if (!isPermissionGranted(permission)) {
|
||||
return false;
|
||||
|
@@ -22,6 +22,7 @@ import org.kde.kdeconnect.Device
|
||||
import org.kde.kdeconnect.KdeConnect
|
||||
import org.kde.kdeconnect_tp.R
|
||||
import org.kde.kdeconnect_tp.databinding.WidgetRemoteCommandPluginDialogBinding
|
||||
import java.util.stream.Collectors
|
||||
import kotlin.streams.toList
|
||||
|
||||
class RunCommandWidgetConfigActivity : AppCompatActivity() {
|
||||
@@ -44,7 +45,7 @@ class RunCommandWidgetConfigActivity : AppCompatActivity() {
|
||||
val binding = WidgetRemoteCommandPluginDialogBinding.inflate(layoutInflater)
|
||||
setContentView(binding.root)
|
||||
|
||||
val pairedDevices = KdeConnect.getInstance().devices.values.stream().filter(Device::isPaired).toList()
|
||||
val pairedDevices = KdeConnect.getInstance().devices.values.stream().filter(Device::isPaired).collect(Collectors.toList());
|
||||
|
||||
binding.runCommandsDeviceList.adapter = object : ArrayAdapter<Device>(this, 0, pairedDevices) {
|
||||
override fun getView(position: Int, convertView: View?, parent: ViewGroup): View {
|
||||
|
@@ -241,7 +241,7 @@ public class CompositeReceiveFileJob extends BackgroundJob<Device, Void> {
|
||||
failedFiles = (totalNumFiles - currentFileNum + 1);
|
||||
}
|
||||
|
||||
receiveNotification.setFinished(getDevice().getContext().getResources().getQuantityString(R.plurals.received_files_fail_title, failedFiles, getDevice().getName(), failedFiles, totalNumFiles));
|
||||
receiveNotification.setFailed(getDevice().getContext().getResources().getQuantityString(R.plurals.received_files_fail_title, failedFiles, getDevice().getName(), failedFiles, totalNumFiles));
|
||||
receiveNotification.show();
|
||||
reportError(e);
|
||||
} finally {
|
||||
|
@@ -127,7 +127,7 @@ public class CompositeUploadFileJob extends BackgroundJob<Device, Void> {
|
||||
int failedFiles;
|
||||
synchronized (lock) {
|
||||
failedFiles = (totalNumFiles - currentFileNum + 1);
|
||||
uploadNotification.setFinished(getDevice().getContext().getResources()
|
||||
uploadNotification.setFailed(getDevice().getContext().getResources()
|
||||
.getQuantityString(R.plurals.send_files_fail_title, failedFiles, getDevice().getName(),
|
||||
failedFiles, totalNumFiles));
|
||||
}
|
||||
@@ -229,7 +229,7 @@ public class CompositeUploadFileJob extends BackgroundJob<Device, Void> {
|
||||
|
||||
@Override
|
||||
public void onFailure(Throwable e) {
|
||||
//Ignored
|
||||
// Handled in the run() function when sendPacketBlocking returns false
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@@ -46,7 +46,7 @@ class ReceiveNotification {
|
||||
this.jobId = jobId;
|
||||
notificationId = (int) System.currentTimeMillis();
|
||||
notificationManager = ContextCompat.getSystemService(device.getContext(), NotificationManager.class);
|
||||
builder = new NotificationCompat.Builder(device.getContext(), NotificationHelper.Channels.FILETRANSFER)
|
||||
builder = new NotificationCompat.Builder(device.getContext(), NotificationHelper.Channels.FILETRANSFER_DOWNLOAD)
|
||||
.setSmallIcon(android.R.drawable.stat_sys_download)
|
||||
.setAutoCancel(true)
|
||||
.setOngoing(true)
|
||||
@@ -86,7 +86,7 @@ class ReceiveNotification {
|
||||
}
|
||||
|
||||
public void setFinished(String message) {
|
||||
builder = new NotificationCompat.Builder(device.getContext(), NotificationHelper.Channels.FILETRANSFER);
|
||||
builder = new NotificationCompat.Builder(device.getContext(), NotificationHelper.Channels.FILETRANSFER_DOWNLOAD);
|
||||
builder.setContentTitle(message)
|
||||
.setTicker(message)
|
||||
.setSmallIcon(android.R.drawable.stat_sys_download_done)
|
||||
@@ -99,6 +99,13 @@ class ReceiveNotification {
|
||||
}
|
||||
}
|
||||
|
||||
public void setFailed(String message) {
|
||||
setFinished(message);
|
||||
builder.setSmallIcon(android.R.drawable.stat_notify_error)
|
||||
.setChannelId(NotificationHelper.Channels.FILETRANSFER_ERROR);
|
||||
|
||||
}
|
||||
|
||||
public void setURI(Uri destinationUri, String mimeType, String filename) {
|
||||
/*
|
||||
* We only support file URIs (because sending a content uri to another app does not work for security reasons).
|
||||
|
@@ -33,7 +33,7 @@ class UploadNotification {
|
||||
|
||||
notificationId = (int) System.currentTimeMillis();
|
||||
notificationManager = ContextCompat.getSystemService(device.getContext(), NotificationManager.class);
|
||||
builder = new NotificationCompat.Builder(device.getContext(), NotificationHelper.Channels.FILETRANSFER)
|
||||
builder = new NotificationCompat.Builder(device.getContext(), NotificationHelper.Channels.FILETRANSFER_UPLOAD)
|
||||
.setSmallIcon(android.R.drawable.stat_sys_upload)
|
||||
.setAutoCancel(true)
|
||||
.setOngoing(true)
|
||||
@@ -64,7 +64,7 @@ class UploadNotification {
|
||||
}
|
||||
|
||||
public void setFinished(String message) {
|
||||
builder = new NotificationCompat.Builder(device.getContext(), NotificationHelper.Channels.FILETRANSFER);
|
||||
builder = new NotificationCompat.Builder(device.getContext(), NotificationHelper.Channels.FILETRANSFER_UPLOAD);
|
||||
builder.setContentTitle(message)
|
||||
.setTicker(message)
|
||||
.setSmallIcon(android.R.drawable.stat_sys_upload_done)
|
||||
@@ -79,7 +79,8 @@ class UploadNotification {
|
||||
|
||||
public void setFailed(String message) {
|
||||
setFinished(message);
|
||||
builder.setSmallIcon(android.R.drawable.stat_notify_error);
|
||||
builder.setSmallIcon(android.R.drawable.stat_notify_error)
|
||||
.setChannelId(NotificationHelper.Channels.FILETRANSFER_ERROR);
|
||||
}
|
||||
|
||||
public void cancel() {
|
||||
|
@@ -83,7 +83,7 @@ class EasterEggActivity : AppCompatActivity(), SensorEventListener {
|
||||
R.drawable.ic_baseline_info_24, R.drawable.ic_baseline_web_24,
|
||||
R.drawable.ic_baseline_send_24, R.drawable.ic_baseline_sms_24,
|
||||
R.drawable.ic_accept_pairing_24dp, R.drawable.ic_share_white,
|
||||
R.drawable.ic_camera, R.drawable.ic_delete,
|
||||
R.drawable.ic_delete,
|
||||
R.drawable.ic_device_laptop_32dp, R.drawable.ic_device_phone_32dp,
|
||||
R.drawable.ic_device_tablet_32dp, R.drawable.ic_device_tv_32dp,
|
||||
R.drawable.ic_delete, R.drawable.ic_warning,
|
||||
@@ -164,4 +164,4 @@ class EasterEggActivity : AppCompatActivity(), SensorEventListener {
|
||||
animator.start()
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@@ -37,6 +37,7 @@ import org.kde.kdeconnect_tp.R;
|
||||
|
||||
public class SettingsFragment extends PreferenceFragmentCompat {
|
||||
|
||||
public static final String KEY_UDP_BROADCAST_ENABLED = "udp_broadcast_enabled";
|
||||
public static final String KEY_APP_THEME = "theme_pref";
|
||||
|
||||
private EditTextPreference renameDevice;
|
||||
@@ -170,6 +171,12 @@ public class SettingsFragment extends PreferenceFragmentCompat {
|
||||
return true;
|
||||
});
|
||||
|
||||
// UDP broadcast toggle
|
||||
final TwoStatePreference udpBroadcastDiscovery = new SwitchPreference(context);
|
||||
udpBroadcastDiscovery.setDefaultValue(true);
|
||||
udpBroadcastDiscovery.setKey(KEY_UDP_BROADCAST_ENABLED);
|
||||
udpBroadcastDiscovery.setTitle(R.string.enable_udp_broadcast);
|
||||
screen.addPreference(udpBroadcastDiscovery);
|
||||
|
||||
// More settings text
|
||||
Preference moreSettingsText = new Preference(context);
|
||||
|
@@ -133,9 +133,10 @@ public class DeviceTest {
|
||||
public void testDeviceType() {
|
||||
assertEquals(DeviceType.PHONE, DeviceType.fromString(DeviceType.PHONE.toString()));
|
||||
assertEquals(DeviceType.TABLET, DeviceType.fromString(DeviceType.TABLET.toString()));
|
||||
assertEquals(DeviceType.COMPUTER, DeviceType.fromString(DeviceType.COMPUTER.toString()));
|
||||
assertEquals(DeviceType.DESKTOP, DeviceType.fromString(DeviceType.DESKTOP.toString()));
|
||||
assertEquals(DeviceType.LAPTOP, DeviceType.fromString(DeviceType.LAPTOP.toString()));
|
||||
assertEquals(DeviceType.TV, DeviceType.fromString(DeviceType.TV.toString()));
|
||||
assertEquals(DeviceType.COMPUTER, DeviceType.fromString("invalid"));
|
||||
assertEquals(DeviceType.DESKTOP, DeviceType.fromString("invalid"));
|
||||
}
|
||||
|
||||
// Basic paired device testing
|
||||
|
Reference in New Issue
Block a user