2
0
mirror of https://github.com/KDE/kdeconnect-android synced 2025-09-01 06:35:09 +00:00

Compare commits

...

28 Commits

Author SHA1 Message Date
Albert Vaca Cintora
d6a284cb25 Bump all the versions 2021-01-06 12:47:33 +01:00
Albert Vaca Cintora
fc0320e2b3 Release 1.16.0 2021-01-06 12:38:07 +01:00
Térence Clastres
d914c8763f StoragePreference: Use findViewbyId() instead of trying to bind
Since commit f3ada9738d, the app crashes with a ClassCastException when going into the "expose filesystem" menu.

This is because view binding checks if the root view is the one it expects but the one passed here isn't directly the checkbox layout but instead the whole StoragePreference layout.

Because there is one view to bind, view binding here doesn't make much sense so replace it with a findViewbyId().
Also  add viewBindingIgnore="true" to the view so its binding class is
not generated.
2021-01-05 09:17:49 +00:00
l10n daemon script
e95e66b1cb GIT_SILENT made messages (after extraction) 2021-01-05 02:28:04 +01:00
l10n daemon script
d1d451be46 GIT_SILENT made messages (after extraction) 2020-12-22 02:27:52 +01:00
l10n daemon script
d2cd898d6a GIT_SILENT made messages (after extraction) 2020-12-21 02:28:42 +01:00
l10n daemon script
bc9032119a GIT_SILENT made messages (after extraction) 2020-12-20 02:27:31 +01:00
l10n daemon script
ccc1e74e88 GIT_SILENT made messages (after extraction) 2020-12-13 02:29:10 +01:00
Nicolas Fella
f6ca187fb2 Fix not sending our own notification
This got broken during some MMS work.

BUG: 428754
BUG: 428715
2020-12-07 19:51:49 +00:00
l10n daemon script
edc2de7a33 GIT_SILENT made messages (after extraction) 2020-12-07 02:26:56 +01:00
l10n daemon script
b107c3d37c GIT_SILENT made messages (after extraction) 2020-12-04 02:25:40 +01:00
l10n daemon script
66b6c2c533 GIT_SILENT made messages (after extraction) 2020-12-02 02:29:20 +01:00
l10n daemon script
4691123cfe GIT_SILENT made messages (after extraction) 2020-11-30 02:26:02 +01:00
l10n daemon script
15a18fa5b8 GIT_SILENT made messages (after extraction) 2020-11-29 02:23:59 +01:00
l10n daemon script
af791fa676 GIT_SILENT made messages (after extraction) 2020-11-28 02:25:52 +01:00
Albert Vaca Cintora
d09ad45e11 Add a verification key that's displayed when pairing
The key is a sha256 of both devices' certificates. Both should generate the
same key, so hey user can check they are pairing against the right device.

Thanks Matthias Gerstner <mgerstner@suse.de> for reporting this.
2020-11-26 11:30:53 +01:00
l10n daemon script
dd210259b9 GIT_SILENT made messages (after extraction) 2020-11-22 02:22:34 +01:00
l10n daemon script
19f4cd8c42 GIT_SILENT made messages (after extraction) 2020-11-14 02:25:02 +01:00
l10n daemon script
f6482155c4 GIT_SILENT made messages (after extraction) 2020-11-13 02:24:18 +01:00
l10n daemon script
e26ff862a9 GIT_SILENT made messages (after extraction) 2020-11-11 02:42:17 +01:00
l10n daemon script
43800903a2 GIT_SILENT made messages (after extraction) 2020-11-08 02:24:09 +01:00
l10n daemon script
3f829681a2 GIT_SILENT made messages (after extraction) 2020-11-07 02:23:40 +01:00
Isira Seneviratne
9aeb49ad49 Remove Butterknife. 2020-11-03 11:31:20 +00:00
Isira Seneviratne
b52ba2e29d Use view binding in EditTextAlertDialogFragment. 2020-11-03 11:31:20 +00:00
Isira Seneviratne
8d71354aea Use view binding in CustomDevicesAdapter. 2020-11-03 11:31:20 +00:00
Isira Seneviratne
10b2d561f0 Use view binding in StoragePreferenceDialogFragment. 2020-11-03 11:31:20 +00:00
Isira Seneviratne
f3ada9738d Use view binding in StoragePreference. 2020-11-03 11:31:19 +00:00
Isira Seneviratne
df1a9fb557 Use view binding in MprisActivity. 2020-11-03 11:31:19 +00:00
51 changed files with 302 additions and 323 deletions

View File

@@ -2,8 +2,8 @@
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
package="org.kde.kdeconnect_tp"
android:versionCode="11510"
android:versionName="1.15.1">
android:versionCode="11600"
android:versionName="1.16.0">
<supports-screens
android:anyDensity="true"

View File

@@ -6,7 +6,7 @@ apply plugin: 'com.android.application'
apply plugin: 'kotlin-android'
buildscript {
ext.kotlin_version = '1.4.10'
ext.kotlin_version = '1.4.21'
repositories {
jcenter()
google()
@@ -14,7 +14,7 @@ buildscript {
dependencies {
// Pinned 4.0.2 due to this bug on 4.1: https://issuetracker.google.com/issues/172096891
//noinspection GradleDependency
classpath 'com.android.tools.build:gradle:4.0.2'
classpath 'com.android.tools.build:gradle:4.1.1'
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
}
}
@@ -152,10 +152,10 @@ dependencies {
*/
}
coreLibraryDesugaring 'com.android.tools:desugar_jdk_libs:1.0.10'
coreLibraryDesugaring 'com.android.tools:desugar_jdk_libs:1.1.1'
implementation 'androidx.multidex:multidex:2.0.1'
implementation 'androidx.media:media:1.2.0'
implementation 'androidx.media:media:1.2.1'
implementation 'androidx.appcompat:appcompat:1.2.0'
implementation 'androidx.core:core-ktx:1.3.2'
implementation 'androidx.preference:preference:1.1.1'
@@ -176,10 +176,6 @@ dependencies {
//implementation('com.github.bright:slf4android:0.1.6') { transitive = true } // For org.apache.sshd debugging
implementation 'com.madgag.spongycastle:bcpkix-jdk15on:1.58.0.0' //For SSL certificate generation
//noinspection AnnotationProcessorOnCompilePath - c.f. https://issuetracker.google.com/issues/140881211
implementation 'com.jakewharton:butterknife:10.2.1'
annotationProcessor 'com.jakewharton:butterknife-compiler:10.0.0'
implementation 'org.atteo.classindex:classindex:3.6'
annotationProcessor 'org.atteo.classindex:classindex:3.6'
@@ -187,7 +183,7 @@ dependencies {
implementation 'commons-io:commons-io:2.7'
implementation 'org.apache.commons:commons-collections4:4.4'
implementation 'org.apache.commons:commons-lang3:3.10'
implementation 'org.apache.commons:commons-lang3:3.11'
// Kotlin
implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk8:$kotlin_version"

10
res/drawable/ic_key.xml Normal file
View File

@@ -0,0 +1,10 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportWidth="24"
android:viewportHeight="24"
android:tint="?attr/colorControlNormal">
<path
android:fillColor="@android:color/white"
android:pathData="M12.65,10C11.83,7.67 9.61,6 7,6c-3.31,0 -6,2.69 -6,6s2.69,6 6,6c2.61,0 4.83,-1.67 5.65,-4H17v4h4v-4h2v-4H12.65zM7,14c-1.1,0 -2,-0.9 -2,-2s0.9,-2 2,-2 2,0.9 2,2 -0.9,2 -2,2z"/>
</vector>

View File

@@ -30,6 +30,18 @@
android:text="@string/device_not_paired"
android:textAppearance="?android:attr/textAppearanceMedium"/>
<TextView
android:id="@+id/pair_verification"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:drawablePadding="5dp"
android:drawableLeft="@drawable/ic_key"
android:drawableStart="@drawable/ic_key"
android:layout_marginBottom="8dip"
android:visibility="gone"
android:text=""
android:textAppearance="?android:attr/textAppearanceMedium"/>
<Button
android:id="@+id/pair_button"
android:layout_width="match_parent"

View File

@@ -19,6 +19,7 @@
<include
layout="@layout/mpris_control"
android:id="@+id/mpris_control"
android:layout_width="match_parent"
android:layout_height="wrap_content" />

View File

@@ -1,9 +1,11 @@
<?xml version="1.0" encoding="utf-8"?>
<CheckBox
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/checkbox"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:focusable="false"
android:clickable="false"
tools:viewBindingIgnore="true"
android:background="@null"/>

View File

@@ -69,7 +69,6 @@
<string name="encryption_info_title">معلومات التّعمية</string>
<string name="encryption_info_msg_no_ssl">لا يستخدم الجهاز الآخر إصدارة حديثة من «كدي المتّصل»، ستُستخدم طريقة التّعمية القديمة.</string>
<string name="my_device_fingerprint">بصمة SHA1 لشهادة جهازك هي:</string>
<string name="remote_device_fingerprint">بصمة SHA1 لشهادة الجهاز البعيد هي:</string>
<string name="pair_requested">طُلب الاقتران</string>
<string name="pairing_request_from">طلب اقتران من %1s</string>
<string name="received_file_text">المس لفتح \'%1s\'</string>

View File

@@ -12,7 +12,7 @@
<string name="pref_plugin_clipboard">Sincronización del cartafueyu</string>
<string name="pref_plugin_clipboard_desc">Comparte\'l conteníu del cartafueyu</string>
<string name="pref_plugin_mousepad">Entrada remota</string>
<string name="pref_plugin_mousepad_desc">Usa\'l preséu como panel táutil y tecláu</string>
<string name="pref_plugin_mousepad_desc">Usa\'l preséu como panel táctil y tecláu</string>
<string name="pref_plugin_presenter">Mandu pa presentaciones de diapositives</string>
<string name="pref_plugin_presenter_desc">Usa esti preséu pa cambiar de diapositives nuna presentación</string>
<string name="pref_plugin_remotekeyboard">Receición de calcos de tecles remotos</string>
@@ -41,14 +41,14 @@
<string name="remotekeyboard_editing_only_title">Remanar les tecles remotes namás al editar</string>
<string name="remotekeyboard_connected">La conexón col tecláu remotu ta activa</string>
<string name="open_mousepad">Entrada remota</string>
<string name="mousepad_info">Movi un deu pela pantalla pa mover el mur. Con un toque faes un clic esquierdu y teniendo primío faes l\'aición d\'arrastrar y soltar, col toque de dos deos simules un clic drechu y col toque de tres simules un clic col botón d\'en mediu del mur. Esliza dos deos pela pantalla pa desplazate.</string>
<string name="mousepad_info">Movi un deu pela pantalla pa mover el mur. Con un toque faes un clic esquierdu y teniendo primío faes l\'aición d\'arrastrar y soltar, col toque de dos deos simules un clic derechu y col toque de tres simules un clic col botón d\'en mediu del mur. Esliza dos deos pela pantalla pa desplazate.</string>
<string name="mousepad_double_tap_settings_title">Aición al tocar con dos deos</string>
<string name="mousepad_triple_tap_settings_title">Aición al tocar con tres deos</string>
<string name="mousepad_sensitivity_settings_title">Sensibilidá del panel táutil</string>
<string name="mousepad_sensitivity_settings_title">Sensibilidá del panel táctil</string>
<string name="mousepad_acceleration_profile_settings_title">Aceleración del punteru</string>
<string name="mousepad_scroll_direction_title">Direición de desplazamientu inversa</string>
<string-array name="mousepad_tap_entries">
<item>Clic drechu</item>
<item>Clic derechu</item>
<item>Clic d\'en mediu</item>
<item>Nada</item>
</string-array>
@@ -78,7 +78,7 @@
<string name="encryption_info_title">Información del cifráu</string>
<string name="encryption_info_msg_no_ssl">L\'otru preséu nun executa una versión recién de KDE Connect y usa\'l métodu heredáu de cifráu.</string>
<string name="my_device_fingerprint">La buelga SHA1 d\'esti preséu ye:</string>
<string name="remote_device_fingerprint">La buelga SHA1 del preséu remotu ye:</string>
<string name="remote_device_fingerprint">La buelga SHA256 del certificáu del preséu remotu:</string>
<string name="pair_requested">Solicitóse l\'empareyamientu</string>
<string name="pairing_request_from">Solicitú d\'empareyamientu de %1s</string>
<plurals name="incoming_file_title">
@@ -116,7 +116,7 @@
<string name="received_file_text">Toca p\'abrir «%1s»</string>
<string name="cannot_create_file">Nun pue crease\'l ficheru %s</string>
<string name="tap_to_answer">Toca pa responder</string>
<string name="right_click">Unviar un clic drechu</string>
<string name="right_click">Unviar un clic derechu</string>
<string name="middle_click">Unviar un clic d\'en mediu</string>
<string name="show_keyboard">Amosar el tecláu</string>
<string name="device_not_paired">Nun s\'empareyó\'l preséu</string>
@@ -142,7 +142,7 @@
<string name="custom_devices_settings">Llista de preseos personalizada</string>
<string name="custom_device_list">Amestar preseos pola IP</string>
<string name="custom_device_deleted">Desanicióse\'l preséu personalizáu</string>
<string name="custom_device_list_help">Si\'l preséu nun se deteuta automáticamente, pues amestar la so direición IP o nome d\'agospiu calcando nel botón flotante d\'aición</string>
<string name="custom_device_list_help">Si\'l preséu nun se detecta automáticamente, pues amestar la so direición IP o nome d\'agospiu calcando nel botón flotante d\'aición</string>
<string name="undo">Desfacer</string>
<string name="share_notification_preference">Avisos sonoros</string>
<string name="share_notification_preference_summary">Fai que\'l teléfonu vibre y reproduza un soníu al recibir un ficheru</string>
@@ -189,7 +189,7 @@
<string name="plugins_need_optional_permission">Dalgunos plugins tienen carauterísiques desactivaes pola falta de permisos (tócalos pa más información):</string>
<string name="select_ringtone">Timbre</string>
<string name="telephony_pref_blocked_title">Númberos bloquiaos</string>
<string name="telephony_pref_blocked_dialog_desc">Nun amuesa les llamaes nin SMS de los númberos que configures. Especifica un númberu per llinia.</string>
<string name="telephony_pref_blocked_dialog_desc">Nun s\'amuesen les llamaes nin SMS de los númberos que configures. Especifica un númberu per llinia.</string>
<string name="presenter_fullscreen">Pantalla completa</string>
<string name="presenter_exit">Colar de la presentación</string>
<string name="presenter_lock_tip">Pues bloquiar esti preséu y usar les tecles de volume pa dir a la diapositiva anterior/siguiente</string>
@@ -204,8 +204,11 @@
<string name="notification_channel_media_control">Mandu multimedia</string>
<string name="notification_channel_filetransfer">Tresferencia de ficheros</string>
<string name="notification_channel_high_priority">Prioridá alta</string>
<string name="notification_channel_sms_mms">Mensaxes nuevos</string>
<string name="copy_url_to_clipboard">Copiar la URL al cartafueyu</string>
<string name="clipboard_toast">Copióse al cartafueyu</string>
<string name="runcommand_notreachable">El preséu nun ye algamable</string>
<string name="runcommand_notpaired">El preséu nun ta empareyáu</string>
<string name="runcommand_noruncommandplugin">Esti preséu nun tien activáu\'l plugin Execución de comandos</string>
<string name="pref_plugin_findremotedevice_desc">Fai que\'l preséu remotu suene</string>
<string name="ring">Facer sonar</string>
@@ -237,21 +240,28 @@
<string name="location_permission_needed_title">Ríquese un permisu</string>
<string name="location_permission_needed_desc">Android rique\'l permisu Allugamientu pa indentificar redes Wi-Fi</string>
<string name="clipboard_android_x_incompat">Android 10 quitó l\'accesu al cartafueyu en toles aplicaciones. Esti plugin va desactivase.</string>
<string name="cant_open_url">Nun pue abrise la URL pa siguir cola reproducción</string>
<string name="bigscreen_optional_permission_explanation">Pa compartir la entrada del micrófonu del preséu precises dar accesu a la entrada d\'audiu del preséu</string>
<string name="message_reply_label">RESPONDER</string>
<string name="user_display_name">Tu</string>
<string name="set_long_text_as_mms_title">Unviar testos llargos como MMS</string>
<string name="convert_to_mms_after_title">Conversión a MMS</string>
<string-array name="convert_to_mms_after_entries">
<item>After one message</item>
<item>After two messages</item>
<item>After three messages</item>
<item>After four messages</item>
<item>After five messages</item>
<item>Dempués d\'un mensaxes</item>
<item>Dempués de dos mensaxes</item>
<item>Dempués de tres mensaxes</item>
<item>Dempués de cuatro mensaxes</item>
<item>Dempués de cinco mensaxes</item>
</string-array>
<string name="theme_dialog_title">Estilu de l\'aplicación</string>
<string-array name="theme_list">
<item>Set by Battery Saver</item>
<item>Light</item>
<item>Dark</item>
<item>Claridá</item>
<item>Escuridá</item>
</string-array>
<string-array name="theme_list_v28">
<item/>
<item>Light</item>
<item>Dark</item>
<item>System Default</item>
<item>Claridá</item>
<item>Escuridá</item>
</string-array>
</resources>

View File

@@ -13,7 +13,7 @@
<string name="pref_plugin_clipboard">Mübadilə Buferini eyniləşdirmək</string>
<string name="pref_plugin_clipboard_desc">Mübadilə buferi tərkiblərini paylaşmaq</string>
<string name="pref_plugin_clipboard_sent">Mübadilə buferini göndərmək</string>
<string name="pref_plugin_mousepad">Məsafədən yazmaq</string>
<string name="pref_plugin_mousepad">Məsafədən giriş</string>
<string name="pref_plugin_mousepad_desc">Telefon və Planşetinizi toxunma paneli və klaviatura kimi istifadə edin</string>
<string name="pref_plugin_presenter">Məsafədən slayd göstərişi</string>
<string name="pref_plugin_presenter_desc">Cihazınızı təqdimatda slaydları dəyişmək üçün istifadə edin</string>
@@ -47,7 +47,7 @@
<string name="remotekeyboard_not_connected">Aktiv bir uzaq klaviatura bağlantısı yoxdur, onu kdeconnect-də yaradın</string>
<string name="remotekeyboard_connected">Uzaq klaviatura bağlantısını aktiv edin</string>
<string name="remotekeyboard_multiple_connections">Birdən çox uzaq klaviatura bağlantısı var, tənzimləmək üçün cihazı seçin</string>
<string name="open_mousepad">Məsafədən yazmaq</string>
<string name="open_mousepad">Məsafədən giriş</string>
<string name="mousepad_info">Siçan kursorunu hərəkət etdirmək üçün barmağı ekranda sürüşdürün. Klik üçün ekrana vurun, sağ və orta siçan düymələri üçün iki/üç barmaqla toxunuş edin. Sürüşdürmək üçün iki barmaqdan istifadə edin. Tutub saxlamaq üçün basın saxlayın.</string>
<string name="mousepad_double_tap_settings_title">İki barmaq toxunuşu əməlini təyin edin</string>
<string name="mousepad_triple_tap_settings_title">Üç barmaq toxunuşu əməlini təyin edin</string>
@@ -90,7 +90,7 @@
<string name="encryption_info_title">Şifrələmə məlumatı</string>
<string name="encryption_info_msg_no_ssl">Digər cihaz köhnə şifrələmə metodu istifadə edən KDE Connect\'in sonuncu versiyasını istifadə etmir.</string>
<string name="my_device_fingerprint">Cihazınızın SHA1 şifrə izi:</string>
<string name="remote_device_fingerprint">Uzaq cihazın SHA1 şifrə izi:</string>
<string name="remote_device_fingerprint">Uzaq cihaz sertifikatının SHA256 şifrə izi:</string>
<string name="pair_requested">Qoşulma soruşuldu</string>
<string name="pairing_request_from">%1s tərəfindən qoşulma sorğusu</string>
<plurals name="incoming_file_title">

View File

@@ -16,7 +16,7 @@
<string name="pref_plugin_mousepad">Entrada remota</string>
<string name="pref_plugin_mousepad_desc">Usa el vostre telèfon o tauleta com un ratolí i un teclat</string>
<string name="pref_plugin_presenter">Presentació de diapositives remota</string>
<string name="pref_plugin_presenter_desc">Usa el dispositiu per a canviar les dispositives d\'una presentació</string>
<string name="pref_plugin_presenter_desc">Usa el dispositiu per a canviar les diapositives d\'una presentació</string>
<string name="pref_plugin_remotekeyboard">Rep les pulsacions remotes de tecla</string>
<string name="pref_plugin_remotekeyboard_desc">Rep els esdeveniments de pulsacions de tecla des de dispositius remots</string>
<string name="pref_plugin_mpris">Controls multimèdia</string>
@@ -30,7 +30,7 @@
<string name="pref_plugin_notifications">Sincronitza les notificacions</string>
<string name="pref_plugin_notifications_desc">Accedeix a les vostres notificacions des d\'altres dispositius</string>
<string name="pref_plugin_receive_notifications">Rep les notificacions</string>
<string name="pref_plugin_receive_notifications_desc">Rep notificacions des d\'altres dispositius i mostrar-los a l\'Android</string>
<string name="pref_plugin_receive_notifications_desc">Rep notificacions des d\'altres dispositius i mostrar-les a l\'Android</string>
<string name="pref_plugin_sharereceiver">Comparteix i rep</string>
<string name="pref_plugin_sharereceiver_desc">Comparteix els fitxers i URL entre els dispositius</string>
<string name="device_list_empty">No hi ha cap dispositiu</string>
@@ -77,8 +77,8 @@
<string name="category_connected_devices">Dispositius connectats</string>
<string name="category_not_paired_devices">Dispositius disponibles</string>
<string name="category_remembered_devices">Dispositius recordats</string>
<string name="device_menu_plugins">Arranjament del connector</string>
<string name="device_menu_unpair">Desparella</string>
<string name="device_menu_plugins">Arranjament dels connectors</string>
<string name="device_menu_unpair">Desaparella</string>
<string name="pair_new_device">Aparella amb un dispositiu nou</string>
<string name="unknown_device">Dispositiu desconegut</string>
<string name="error_not_reachable">No es pot accedir al dispositiu</string>
@@ -90,7 +90,7 @@
<string name="encryption_info_title">Informació de l\'encriptatge</string>
<string name="encryption_info_msg_no_ssl">L\'altre dispositiu no usa una versió recent del KDE Connect, s\'utilitzarà el mètode d\'encriptatge antic.</string>
<string name="my_device_fingerprint">L\'empremta digital SHA1 del certificat del vostre dispositiu és:</string>
<string name="remote_device_fingerprint">L\'empremta digital SHA1 del certificat del dispositiu remot és:</string>
<string name="remote_device_fingerprint">L\'empremta digital SHA256 del certificat del dispositiu remot és:</string>
<string name="pair_requested">S\'ha demanat aparellar</string>
<string name="pairing_request_from">S\'ha demanat aparellar des de %1s</string>
<plurals name="incoming_file_title">
@@ -157,7 +157,7 @@
<string name="mpris_notification_settings_summary">Permet controlar els reproductors multimèdia sense obrir el KDE Connect</string>
<string name="share_to">Comparteix amb...</string>
<string name="protocol_version_newer">Aquest dispositiu usa una versió nova del protocol</string>
<string name="plugin_settings_with_name">Ajustaments del %s</string>
<string name="plugin_settings_with_name">Configuració del %s</string>
<string name="invalid_device_name">El nom del dispositiu no és vàlid</string>
<string name="shareplugin_text_saved">S\'ha rebut text i s\'ha desat al porta-retalls</string>
<string name="custom_devices_settings">Llista personalitzada de dispositius</string>
@@ -166,7 +166,7 @@
<string name="custom_device_list_help">Si el dispositiu no es detecta automàticament, podeu afegir la seva adreça IP o el nom de la màquina fent clic al botó flotant d\'acció</string>
<string name="custom_device_fab_hint">Afegeix un dispositiu</string>
<string name="undo">Desfés</string>
<string name="share_notification_preference">Rebombori de les notificacions</string>
<string name="share_notification_preference">Notificacions sonores</string>
<string name="share_notification_preference_summary">Vibra i reprodueix un so en rebre un fitxer</string>
<string name="share_destination_customize">Personalitza el directori de destinació</string>
<string name="share_destination_customize_summary_disabled">Els fitxers rebuts apareixeran a Baixades</string>
@@ -269,11 +269,11 @@
<string name="devices">Dispositius</string>
<string name="settings_rename">Nom del dispositiu</string>
<string name="settings_dark_mode">Tema fosc</string>
<string name="settings_more_settings_title">Més ajustaments</string>
<string name="settings_more_settings_text">Els ajustaments per dispositiu es poden trobar a «Arranjament del connector» des d\'un dispositiu.</string>
<string name="settings_more_settings_title">Més opcions</string>
<string name="settings_more_settings_text">La configuració per dispositiu es pot trobar a «Arranjament dels connectors» des d\'un dispositiu.</string>
<string name="setting_persistent_notification">Mostra les notificacions persistents</string>
<string name="setting_persistent_notification_oreo">Notificacions persistents</string>
<string name="setting_persistent_notification_description">Tocar per a des/activar els ajustaments de les notificacions</string>
<string name="setting_persistent_notification_description">Tocar per a des/activar la configuració de les notificacions</string>
<string name="extra_options">Opcions extres</string>
<string name="privacy_options">Opcions de privadesa</string>
<string name="set_privacy_options">Establiu les opcions de privadesa</string>

View File

@@ -90,7 +90,6 @@
<string name="encryption_info_title">Informace o šifrování</string>
<string name="encryption_info_msg_no_ssl">Druhé zařízení nepoužívá poslední verzi KDE connect. Bude použita stará metoda šifrování.</string>
<string name="my_device_fingerprint">Otisk SHA1 certifikátu vašeho zařízení je:</string>
<string name="remote_device_fingerprint">Otisk SHA1 certifikátu vzdáleného zařízení je:</string>
<string name="pair_requested">Bylo vyžádáno párování</string>
<string name="pairing_request_from">Požadavek o párování z %1s</string>
<plurals name="incoming_file_title">

View File

@@ -75,7 +75,6 @@
<string name="encryption_info_title">Krypteringsinfo</string>
<string name="encryption_info_msg_no_ssl">Den anden enhed bruger ikke en nylig version af KDE Connect, og bruger dermed den forældede krypteringsmetode.</string>
<string name="my_device_fingerprint">SHA1-fingeraftrykket for dit enhedscertifikat er:</string>
<string name="remote_device_fingerprint">SHA1-fingeraftrykket for det eksterne enhedscertifikat er:</string>
<string name="pair_requested">Anmodet om parring</string>
<string name="pairing_request_from">Parringsanmodning fra %1s</string>
<string name="received_file_text">Tap for at åbne \"%1s\"</string>

View File

@@ -87,7 +87,6 @@
<string name="encryption_info_title">Verschlüsselungsinformationen</string>
<string name="encryption_info_msg_no_ssl">Das andere Gerät verwendet eine ältere Version von KDE Connect. Daher muss eine veraltete Verschlüsselungsmethode verwendet werden</string>
<string name="my_device_fingerprint">Der SHA1-Fingerabdruck Ihres Gerätezertifikats lautet:</string>
<string name="remote_device_fingerprint">Der SHA1-Fingerabdruck des Gerätezertifikats der Gegenstelle lautet:</string>
<string name="pair_requested">Verbindung angefordert</string>
<string name="pairing_request_from">Kopplungsanfrage von %1s</string>
<plurals name="incoming_file_title">

View File

@@ -90,7 +90,6 @@
<string name="encryption_info_title">Πληροφορίες κρυπτογράφησης</string>
<string name="encryption_info_msg_no_ssl">Η άλλη συσκευή δεν χρησιμοποιεί μια πρόσφατη έκδοση του KDE Connect, θα χρησιμοποιηθεί η παλαιά μέθοδος κρυπτογράφησης.</string>
<string name="my_device_fingerprint">Το ίχνος SHA1 του πιστοποιητικού της συσκευής σας είναι:</string>
<string name="remote_device_fingerprint">Το ίχνος SHA1 του πιστοποιητικού της απομακρυσμένης συσκευής είναι:</string>
<string name="pair_requested">Ζητήθηκε σύζευξη</string>
<string name="pairing_request_from">Αίτημα σύζευξης από %1s</string>
<plurals name="incoming_file_title">

View File

@@ -90,7 +90,7 @@
<string name="encryption_info_title">Encryption Info</string>
<string name="encryption_info_msg_no_ssl">The other device doesn\'t use a recent version of KDE Connect, using the legacy encryption method.</string>
<string name="my_device_fingerprint">SHA1 fingerprint of your device certificate is:</string>
<string name="remote_device_fingerprint">SHA1 fingerprint of remote device certificate is:</string>
<string name="remote_device_fingerprint">SHA256 fingerprint of remote device certificate is:</string>
<string name="pair_requested">Pair requested</string>
<string name="pairing_request_from">Pairing request from %1s</string>
<plurals name="incoming_file_title">

View File

@@ -90,7 +90,7 @@
<string name="encryption_info_title">Información de cifrado</string>
<string name="encryption_info_msg_no_ssl">El otro dispositivo no dispone de una versión reciente de KDE Connect, se usará un método de cifrado antiguo.</string>
<string name="my_device_fingerprint">La huella digital SHA1 del certificado de su dispositivo es:</string>
<string name="remote_device_fingerprint">La huella digital SHA1 del certificado del dispositivo remoto es:</string>
<string name="remote_device_fingerprint">La huella digital SHA256 del certificado del dispositivo remoto es:</string>
<string name="pair_requested">Vinculación solicitada</string>
<string name="pairing_request_from">Solicitud de vinculación de %1s</string>
<plurals name="incoming_file_title">

View File

@@ -90,7 +90,6 @@
<string name="encryption_info_title">Krüptimise teave</string>
<string name="encryption_info_msg_no_ssl">Teine seade ei kasuta KDE Connecti uusimat versiooni ja tarvitab krüptimisel pärandmeetodit.</string>
<string name="my_device_fingerprint">Sinu seadme sertifikaadi SHA1 sõrmejälg on:</string>
<string name="remote_device_fingerprint">Kaugseadme sertifikaadi SHA1 sõrmejälg on:</string>
<string name="pair_requested">Paardumise soov</string>
<string name="pairing_request_from">Paardumise soov seadmest %1s</string>
<plurals name="incoming_file_title">

View File

@@ -90,7 +90,7 @@
<string name="encryption_info_title">Zifratze informazioa</string>
<string name="encryption_info_msg_no_ssl">Beste gailuak ez du oraintsuko KDE Connect bertsio bat erabiltzen, erabili aurreko bertsioetako metodoa.</string>
<string name="my_device_fingerprint">Zure gailuaren ziurtagiriaren SHA1 hatz-marka hau da:</string>
<string name="remote_device_fingerprint">Urruneko gailuaren ziurtagiriaren SHA1 hatz-marka hau da:</string>
<string name="remote_device_fingerprint">Urruneko gailuaren ziurtagiriaren SHA256 hatz-marka hau da:</string>
<string name="pair_requested">Parekatzea eskatu da</string>
<string name="pairing_request_from">Parekatzeko eskaria %1s-tik</string>
<plurals name="incoming_file_title">
@@ -226,6 +226,7 @@
<string name="permission_explanation">Plugin honek baimena behar du funtzionatzeko</string>
<string name="optional_permission_explanation">Baimen gehiago eman behar dituzu funtzio guztiak gaitzeko</string>
<string name="plugins_need_optional_permission">Plugin batzuek desgaitutako eginbideak dituzte baimenak faltan dituztelako (tak egin informazio gehiagorako):</string>
<string name="share_optional_permission_explanation">Partekatutako fitxategiak jasotzeko jomugako direktorio bat aukeratu behar duzu</string>
<string name="telepathy_permission_explanation">SMSak zure mahaigainetik bidali ahal izateko, SMSak erabiltzeko baimena eman behar duzu</string>
<string name="telephony_permission_explanation">Telefono deiak zure mahaigainetik ikusteko, telefono deien egunkarira eta telefonoaren egoerara baimena eman behar duzu</string>
<string name="telephony_optional_permission_explanation">Telefono zenbakiaren ordez kontaktuaren izena ikusteko telefonoko kontaktuak atzitzeko baimena eman behar duzu</string>

View File

@@ -90,7 +90,7 @@
<string name="encryption_info_title">Salaustiedot</string>
<string name="encryption_info_msg_no_ssl">Toinen laite ei käytä KDE Connectin uudehkoa versiota, joten käytetään vanhaa salausmenetelmää.</string>
<string name="my_device_fingerprint">Laitteen varmenteen SHA1-sormenjälki on:</string>
<string name="remote_device_fingerprint">Etälaitteen varmenteen SHA1-sormenjälki on:</string>
<string name="remote_device_fingerprint">Etälaitteen varmenteen SHA256-sormenjälki on:</string>
<string name="pair_requested">Paripyyntö</string>
<string name="pairing_request_from">Paripyyntö laitteesta %1s</string>
<plurals name="incoming_file_title">
@@ -226,6 +226,7 @@
<string name="permission_explanation">Liitännäinen tarvitsee toimiakseen lisäkäyttöoikeuksia</string>
<string name="optional_permission_explanation">Kaikkien toimintojen käyttämiseksi sinun on annettava lisäkäyttöoikeuksia</string>
<string name="plugins_need_optional_permission">Jotkin liitännäisten ominaisuudet eivät ole käytössä puuttuvien käyttöoikeuksien takia (lisätietoa napsauttamalla):</string>
<string name="share_optional_permission_explanation">Jaettujen tiedostojen vastaanottamiseksi on määritettävä kohdekansio</string>
<string name="telepathy_permission_explanation">Lukeaksesi ja lähettääksesi tekstiviestejä työpöydältä sinun on annettava käyttöoikeudet tekstiviesteihin</string>
<string name="telephony_permission_explanation">Puhelujen näyttäminen työpöydällä vaatii käyttöoikeuden puhelulokiin ja puhelimen tilaan</string>
<string name="telephony_optional_permission_explanation">Puhelimen yhteystietoihin on annettava käyttöoikeudet, jotta voit nähdä yhteystiedoissa nimet puhelinnumerojen sijaan</string>

View File

@@ -90,7 +90,7 @@
<string name="encryption_info_title">Informations de chiffrement</string>
<string name="encryption_info_msg_no_ssl">Ce périphérique n\'utilise pas une version récente de KDE Connect qui utilise l\'ancienne méthode de chiffrement.</string>
<string name="my_device_fingerprint">L\'empreinte SHA1 du certificat de votre appareil est :</string>
<string name="remote_device_fingerprint">L\'empreinte SHA1 du certificat du périphérique distant est :</string>
<string name="remote_device_fingerprint">L\'empreinte « SHA256 » du certificat du périphérique distant est :</string>
<string name="pair_requested">Paire demandée</string>
<string name="pairing_request_from">Demande d\'association provenant de %1s</string>
<plurals name="incoming_file_title">

View File

@@ -87,7 +87,6 @@
<string name="encryption_info_title">Información do cifrado</string>
<string name="encryption_info_msg_no_ssl">O outro dispositivo non usa unha versión recente de KDE Connect, usarase un método obsoleto de cifrado.</string>
<string name="my_device_fingerprint">A pegada SHA1 do certificado do seu dispositivo é:</string>
<string name="remote_device_fingerprint">A pegada SHA1 do certificado do dispositivo remoto é:</string>
<string name="pair_requested">Solicitude de emparellamento</string>
<string name="pairing_request_from">Solicitude de emparellamento de %1s.</string>
<plurals name="incoming_file_title">

View File

@@ -84,7 +84,6 @@
<string name="encryption_info_title">Info Enkripsi</string>
<string name="encryption_info_msg_no_ssl">Perangkat lain tidaklah menggunakan KDE Connect yang berversi saat ini, menggunakan metode enkripsi kuno.</string>
<string name="my_device_fingerprint">Sidik jari SHA1 pada sertifikat perangkatmu adalah:</string>
<string name="remote_device_fingerprint">Sidik jari SHA1 pada sertifikat perangkat jarak jauh adalah:</string>
<string name="pair_requested">Meminta sanding</string>
<string name="pairing_request_from">Minta penyandingan dari %1s</string>
<plurals name="incoming_file_title">

View File

@@ -90,7 +90,7 @@
<string name="encryption_info_title">Informazioni di cifratura</string>
<string name="encryption_info_msg_no_ssl">L\'altro dispositivo non utilizza una versione recente di KDE Connect, utilizzando il metodo di cifratura precedente.</string>
<string name="my_device_fingerprint">L\'impronta digitale SHA1 del certificato di dispositivo è:</string>
<string name="remote_device_fingerprint">L\'impronta digitale SHA1 del certificato di dispositivo remoto è:</string>
<string name="remote_device_fingerprint">L\'impronta digitale SHA256 del certificato del dispositivo remoto è:</string>
<string name="pair_requested">Richiesta di associazione</string>
<string name="pairing_request_from">Richiesta associazione da %1s</string>
<plurals name="incoming_file_title">

View File

@@ -75,7 +75,6 @@
<string name="encryption_info_title">פרטי הצפנה</string>
<string name="encryption_info_msg_no_ssl">ההתקן השני אינו משתמש בגרסה האחרונה של KDE Connect, משתמש בשיטת ההצפנה הישנה.</string>
<string name="my_device_fingerprint">טביעת האצבע SHA1 של ההתקן היא:</string>
<string name="remote_device_fingerprint">"טביעת האצבע SHA1 של ההתקן המרוחק היא: "</string>
<string name="pair_requested">בקשת התאמה</string>
<string name="pairing_request_from">בוקשה התאמה מ־%1s</string>
<string name="received_file_text">לחץ כדי לפתוח את \"%1s\"</string>

View File

@@ -87,7 +87,6 @@
<string name="encryption_info_title">暗号化情報</string>
<string name="encryption_info_msg_no_ssl">他のデバイスは最近のバージョンの KDE Connect を利用していません。古い暗号化方式を使用しています</string>
<string name="my_device_fingerprint">このデバイスの証明書の SHA1 フィンガープリント:</string>
<string name="remote_device_fingerprint">リモートデバイスの証明書の SHA1 フィンガープリント:</string>
<string name="pair_requested">ペアリング要求済み</string>
<string name="pairing_request_from">%1s からペアリングを要求されました</string>
<plurals name="incoming_file_title">

View File

@@ -90,7 +90,6 @@
<string name="encryption_info_title">암호화 정보</string>
<string name="encryption_info_msg_no_ssl">다른 장치에서 KDE Connect의 최근 버전을 실행하고 있지 않아서 레거시 암호화를 사용합니다.</string>
<string name="my_device_fingerprint">내 장치 인증서의 SHA1 지문:</string>
<string name="remote_device_fingerprint">원격 장치 인증서의 SHA1 지문:</string>
<string name="pair_requested">연결 요청됨</string>
<string name="pairing_request_from">%1s에서 연결 요청</string>
<plurals name="incoming_file_title">

View File

@@ -90,7 +90,6 @@
<string name="encryption_info_title">Šifravimo informacija</string>
<string name="encryption_info_msg_no_ssl">Kitas įrenginys nenaudoja paskiausios KDE Connect versijos, naudojamas pasenęs šifravimo metodas.</string>
<string name="my_device_fingerprint">Jūsų įrenginio liudijimo SHA1 kontrolinis kodas yra:</string>
<string name="remote_device_fingerprint">Nuotolinio įrenginio liudijimo SHA1 kontrolinis kodas yra:</string>
<string name="pair_requested">Užklaustas suporavimas</string>
<string name="pairing_request_from">Suporavimo užklausa iš %1s</string>
<plurals name="incoming_file_title">

View File

@@ -90,7 +90,7 @@
<string name="encryption_info_title">Versleutelde informatie</string>
<string name="encryption_info_msg_no_ssl">Het andere apparaat gebruikt geen recente versie van KDE Connect, de verouderde versleutelingsmethode zal worden gebruikt.</string>
<string name="my_device_fingerprint">De SHA1 vingerafdruk van het certificaat van uw apparaat is:</string>
<string name="remote_device_fingerprint">De SHA1 vingerafdruk van het certificaat van het apparaat op afstand is:</string>
<string name="remote_device_fingerprint">De SHA256 vingerafdruk van het certificaat van het apparaat op afstand is:</string>
<string name="pair_requested">Paarvorming gevraagd</string>
<string name="pairing_request_from">Verzoek om een paar te maken van %1s</string>
<plurals name="incoming_file_title">

View File

@@ -90,7 +90,7 @@
<string name="encryption_info_title">Krypteringsinfo</string>
<string name="encryption_info_msg_no_ssl">Den andre eininga brukar ein gammal versjon av KDE Connect, med ein utdatert krypteringsmetode.</string>
<string name="my_device_fingerprint">SHA-fingeravtrykket til einingssertifikatet er:</string>
<string name="remote_device_fingerprint">SHA-fingeravtrykket til fjerneiningssertifikatet er:</string>
<string name="remote_device_fingerprint">SHA-256-fingeravtrykket til fjerneiningssertifikatet er:</string>
<string name="pair_requested">Paringsførespurnad</string>
<string name="pairing_request_from">Paringsførespurnad frå %1s</string>
<plurals name="incoming_file_title">

View File

@@ -87,7 +87,6 @@
<string name="encryption_info_title">Dane o szyfrowaniu</string>
<string name="encryption_info_msg_no_ssl">Drugie urządzenie nie używa ostatniej wersji KDE Connect, użyto przestarzałego szyfrowania.</string>
<string name="my_device_fingerprint">Odcisk palca SHA1 certyfikatu twojego urządzenia to:</string>
<string name="remote_device_fingerprint">Odcisk palca SHA1 certyfikatu twojego zdalnego urządzenia to:</string>
<string name="pair_requested">Zażądano parowania</string>
<string name="pairing_request_from">Żądanie parowania z %1s</string>
<plurals name="incoming_file_title">

View File

@@ -89,8 +89,8 @@
<string name="error_canceled_by_other_peer">Cancelado pelo outro dispositivo</string>
<string name="encryption_info_title">Informação de criptografia</string>
<string name="encryption_info_msg_no_ssl">O outro dispositivo não usa uma versão recente do KDE Connect. Será utilizado o método antigo de criptografia.</string>
<string name="my_device_fingerprint">Código SHA1 do certificado do seu dispositivo:</string>
<string name="remote_device_fingerprint">Código SHA1 do certificado do dispositivo remoto:</string>
<string name="my_device_fingerprint">A impressão digital SHA1 do certificado do seu dispositivo é:</string>
<string name="remote_device_fingerprint">A impressão digital SHA256 do certificado do dispositivo remoto é:</string>
<string name="pair_requested">Solicitação de emparelhamento</string>
<string name="pairing_request_from">Emparelhamento solicitado por %1s</string>
<plurals name="incoming_file_title">

View File

@@ -90,7 +90,7 @@
<string name="encryption_info_title">Dados de Encriptação</string>
<string name="encryption_info_msg_no_ssl">O outro dispositivo não usa uma versão recente do KDE Connect; será usado o método antigo de encriptação.</string>
<string name="my_device_fingerprint">A impressão digital SHA1 do certificado do seu dispositivo é:</string>
<string name="remote_device_fingerprint">A impressão digital SHA1 do certificado do dispositivo remoto é:</string>
<string name="remote_device_fingerprint">A impressão digital SHA256 do certificado do dispositivo remoto é:</string>
<string name="pair_requested">Emparelhamento pedido</string>
<string name="pairing_request_from">Pedido de emparelhamento de %1s</string>
<plurals name="incoming_file_title">

View File

@@ -90,7 +90,7 @@
<string name="encryption_info_title">Informații despre criptare</string>
<string name="encryption_info_msg_no_ssl">Celălalt dispozitiv nu folosește o versiune recentă de KDE Connect, se va folosi metoda de criptare moștenită.</string>
<string name="my_device_fingerprint">Amprenta SHA1 a certificatului acestui dispozitiv e:</string>
<string name="remote_device_fingerprint">Amprenta SHA1 a certificatului dispozitivului distant e:</string>
<string name="remote_device_fingerprint">Amprenta SHA256 a certificatului dispozitivului distant e:</string>
<string name="pair_requested">Asociere cerută</string>
<string name="pairing_request_from">Cerere de asociere de la %1s</string>
<plurals name="incoming_file_title">
@@ -234,6 +234,7 @@
<string name="permission_explanation">Această extensie are nevoie de permisiuni ca să lucreze</string>
<string name="optional_permission_explanation">Trebuie să acordați permisiuni suplimentare pentru activarea tuturor funcțiilor</string>
<string name="plugins_need_optional_permission">Unele extensii au caracteristici dezactivate din cauza lipsei permisiunilor (atingeți pentru informații suplimentare):</string>
<string name="share_optional_permission_explanation">Trebuie să alegeți un dosar destinație pentru a primi fișiere partajate</string>
<string name="telepathy_permission_explanation">Pentru a citi și scrie SMS de pe calculatorul de birou, trebuie să acordați permisiuni asupra SMS-urilor</string>
<string name="telephony_permission_explanation">Pentru a vedea apelurile pe calculatorul de birou, trebuie să acordați permisiuni asupra jurnalului de apeluri și stării telefonului</string>
<string name="telephony_optional_permission_explanation">Pentru a vedea numele contactului în locul numărului de telefon, trebuie să permiteți accesul la contactele telefonului.</string>

View File

@@ -90,7 +90,6 @@
<string name="encryption_info_title">Информация о шифровании</string>
<string name="encryption_info_msg_no_ssl">На другом устройстве используется старая версия KDE Connect, используется старый метод шифрования.</string>
<string name="my_device_fingerprint">Отпечаток SHA-1 сертификата вашего устройства:</string>
<string name="remote_device_fingerprint">Отпечаток SHA-1 сертификата удалённого устройства:</string>
<string name="pair_requested">Запрошено сопряжение</string>
<string name="pairing_request_from">Запрос на сопряжение от %1s</string>
<plurals name="incoming_file_title">

View File

@@ -90,7 +90,6 @@
<string name="encryption_info_title">Informácie o šifrovaní</string>
<string name="encryption_info_msg_no_ssl">Druhé zariadenie nepoužíva najnovšiu verziu aplikácie KDE Connect. Použije sa zastaralý spôsob šifrovania.</string>
<string name="my_device_fingerprint">Odtlačok SHA1 certifikátu vášho zariadenia je:</string>
<string name="remote_device_fingerprint">Odtlačok SHA1 certifikátu vzdialeného zariadenia je:</string>
<string name="pair_requested">Spárovanie vyžiadané</string>
<string name="pairing_request_from">Požiadavka na spárovanie zo zariadenia %1s</string>
<plurals name="incoming_file_title">

View File

@@ -90,7 +90,7 @@
<string name="encryption_info_title">Informacija o šifriranju</string>
<string name="encryption_info_msg_no_ssl">Druga naprava ne uporablja najnovejše različice KDE Connect, uporablja podedovano metodo šifriranja.</string>
<string name="my_device_fingerprint">Prstni odtis SHA1 certifikata vaše naprave je:</string>
<string name="remote_device_fingerprint">Prstni odtis SHA1 certifikata oddaljene naprave je:</string>
<string name="remote_device_fingerprint">Prstni odtis SHA256 certifikata oddaljene naprave je:</string>
<string name="pair_requested">Zahtevan je par</string>
<string name="pairing_request_from">Zahtevek za uparjanje od %1s</string>
<plurals name="incoming_file_title">

View File

@@ -90,7 +90,7 @@
<string name="encryption_info_title">Krypteringsinformation</string>
<string name="encryption_info_msg_no_ssl">Den andra apparaten använder inte en aktuell version av KDE-anslut. Använder den föråldrade krypteringsmetoden.</string>
<string name="my_device_fingerprint">SHA1-fingeravtryck för din apparats certifikat är:</string>
<string name="remote_device_fingerprint">SHA1-fingeravtryck för den andra apparatens certifikat är:</string>
<string name="remote_device_fingerprint">SHA256-fingeravtryck för den andra apparatens certifikat är:</string>
<string name="pair_requested">Ihopparning begärd</string>
<string name="pairing_request_from">Begäran om ihopparning från %1s</string>
<plurals name="incoming_file_title">

View File

@@ -87,7 +87,6 @@
<string name="encryption_info_title">Şifreleme Bilgisi</string>
<string name="encryption_info_msg_no_ssl">Diğer aygıt, KDE Connect\'in son sürümünü kullanmıyor, eski şifreleme yöntemini kullanıyor.</string>
<string name="my_device_fingerprint">Aygıt sertifikanızın SHA1 parmak izi:</string>
<string name="remote_device_fingerprint">Uzak aygıt sertifikanızın SHA1 parmak izi:</string>
<string name="pair_requested">Eşleşme talep edildi</string>
<string name="pairing_request_from">%1s için eşleşme talebi</string>
<plurals name="incoming_file_title">

View File

@@ -90,7 +90,7 @@
<string name="encryption_info_title">Дані щодо шифрування</string>
<string name="encryption_info_msg_no_ssl">На сторонньому пристрої не використовується нова версія KDE Connect, у якій використовується застарілий спосіб шифрування.</string>
<string name="my_device_fingerprint">Відбиток SHA1 сертифіката пристрою:</string>
<string name="remote_device_fingerprint">Відбиток SHA1 сертифіката віддаленого пристрою:</string>
<string name="remote_device_fingerprint">Відбиток SHA256 сертифіката віддаленого пристрою:</string>
<string name="pair_requested">Запит щодо пов’язування</string>
<string name="pairing_request_from">Запит щодо пов’язування від %1s</string>
<plurals name="incoming_file_title">

View File

@@ -1,10 +1,10 @@
<?xml version='1.0' encoding='utf-8'?>
<resources>
<string name="kde_connect">KDE Connect</string>
<string name="foreground_notification_no_devices">没有连接到任何设备</string>
<string name="kde_connect">KDE 连接</string>
<string name="foreground_notification_no_devices">连接到任何设备</string>
<string name="foreground_notification_devices">已连接到:%s</string>
<string name="foreground_notification_send_clipboard">发送剪</string>
<string name="pref_plugin_telephony">通知</string>
<string name="foreground_notification_send_clipboard">发送剪</string>
<string name="pref_plugin_telephony">电通知</string>
<string name="pref_plugin_telephony_desc">发送来电通知</string>
<string name="pref_plugin_battery">电池报告</string>
<string name="pref_plugin_battery_desc">定期报告电池状态</string>
@@ -20,40 +20,40 @@
<string name="pref_plugin_remotekeyboard">接收远程按键</string>
<string name="pref_plugin_remotekeyboard_desc">从远程设备接收按键事件</string>
<string name="pref_plugin_mpris">多媒体控制</string>
<string name="pref_plugin_mpris_desc">媒体播放器的遥控器</string>
<string name="pref_plugin_runcommand">行命令</string>
<string name="pref_plugin_mpris_desc">遥控媒体播放器</string>
<string name="pref_plugin_runcommand">行命令</string>
<string name="pref_plugin_runcommand_desc">触发您的手机或平板电脑的远程命令</string>
<string name="pref_plugin_contacts">联系人同步</string>
<string name="pref_plugin_contacts">联系人同步</string>
<string name="pref_plugin_contacts_desc">允许同步设备的通讯录</string>
<string name="pref_plugin_ping">Ping</string>
<string name="pref_plugin_ping_desc">发送和接受ping</string>
<string name="pref_plugin_ping_desc">发送和接受 Ping</string>
<string name="pref_plugin_notifications">通知同步</string>
<string name="pref_plugin_notifications_desc">从其他设备访问您的通知</string>
<string name="pref_plugin_receive_notifications">接收通知</string>
<string name="pref_plugin_receive_notifications_desc">从其他设备接收通知并显示在 Android 上</string>
<string name="pref_plugin_sharereceiver">分享和接收</string>
<string name="pref_plugin_sharereceiver_desc">在设备间共享文件和 URL</string>
<string name="pref_plugin_sharereceiver">发送和接收</string>
<string name="pref_plugin_sharereceiver_desc">在设备间共享文件和链接</string>
<string name="device_list_empty">无设备</string>
<string name="ok"></string>
<string name="ok"></string>
<string name="sad_ok">确定 :(</string>
<string name="cancel">取消</string>
<string name="open_settings">设置</string>
<string name="no_permissions">您需要授予权限以便访问通知</string>
<string name="no_permission_mprisreceiver">为了能够控制您的媒体播放器,您需要授予访问通知消息的权限</string>
<string name="no_permissions_remotekeyboard">要接收按键,您需要激活 KDE Connect 远程键盘</string>
<string name="send_ping">发送ping</string>
<string name="open_settings">开设置</string>
<string name="no_permissions">您需要授予权限以访问通知</string>
<string name="no_permission_mprisreceiver">为了控制您的媒体播放器,您需要授予访问通知的权限</string>
<string name="no_permissions_remotekeyboard">要接收按键,您需要激活 K 易连远程键盘</string>
<string name="send_ping">发送 Ping</string>
<string name="open_mpris_controls">多媒体控制</string>
<string name="remotekeyboard_editing_only_title">只有在编辑时才接受远程按键</string>
<string name="remotekeyboard_not_connected">没有活动的远程键盘链接,请在 KDE Connect 中连接</string>
<string name="remotekeyboard_not_connected">没有活动的远程键盘链接,请在 K 易连中连接</string>
<string name="remotekeyboard_connected">远程键盘连接已启用</string>
<string name="remotekeyboard_multiple_connections">发现多个远程键盘连接,请选择设备进行配置</string>
<string name="remotekeyboard_multiple_connections">发现多个远程键盘连接,请选择要配置的设备</string>
<string name="open_mousepad">远程输入</string>
<string name="mousepad_info">在屏幕上移动手指来移动光标。轻击代表左键,双指或三指点击代表右键或中键。用双指滚动。用长按来拖放。</string>
<string name="mousepad_double_tap_settings_title">设置双指点击动作</string>
<string name="mousepad_triple_tap_settings_title">设置三指点击动作</string>
<string name="mousepad_sensitivity_settings_title">设置触摸板灵敏度</string>
<string name="mousepad_acceleration_profile_settings_title">设置指针加速</string>
<string name="mousepad_scroll_direction_title">滚动方向反向</string>
<string name="mousepad_acceleration_profile_settings_title">设置指针加速</string>
<string name="mousepad_scroll_direction_title">反转滚动方向</string>
<string-array name="mousepad_tap_entries">
<item>右键点击</item>
<item>中键点击</item>
@@ -74,25 +74,25 @@
<item>更强</item>
<item>最强</item>
</string-array>
<string name="category_connected_devices">连接设备</string>
<string name="category_not_paired_devices">可用设备</string>
<string name="category_remembered_devices">记住设备</string>
<string name="category_connected_devices">连接设备</string>
<string name="category_not_paired_devices">可用设备</string>
<string name="category_remembered_devices">记住设备</string>
<string name="device_menu_plugins">插件设置</string>
<string name="device_menu_unpair">取消配对</string>
<string name="pair_new_device">配对新设备</string>
<string name="unknown_device">未知设备</string>
<string name="error_not_reachable">设备不可及</string>
<string name="error_already_paired">设备已配对</string>
<string name="error_could_not_send_package">数据包无法发送</string>
<string name="error_could_not_send_package">无法发送数据包</string>
<string name="error_timed_out">超时</string>
<string name="error_canceled_by_user">已被用户取消</string>
<string name="error_canceled_by_other_peer">已被另一方取消</string>
<string name="error_canceled_by_other_peer">已被其他对等点取消</string>
<string name="encryption_info_title">加密信息</string>
<string name="encryption_info_msg_no_ssl">另一设备没有使用最新的 KDE Connect,使用旧版加密方法。</string>
<string name="encryption_info_msg_no_ssl">另一设备没有使用最新的 K 易连,使用旧版加密方法。</string>
<string name="my_device_fingerprint">您的设备证书的 SHA1 指纹是:</string>
<string name="remote_device_fingerprint">远程设备证书的 SHA1 指纹是:</string>
<string name="remote_device_fingerprint">远程设备证书的 SHA256 指纹是:</string>
<string name="pair_requested">已请求配对</string>
<string name="pairing_request_from">来自%1s的配对请求</string>
<string name="pairing_request_from">来自 %1s 的配对请求</string>
<plurals name="incoming_file_title">
<item quantity="other">正在从 %2$s 接收 %1$d 个文件</item>
</plurals>
@@ -100,7 +100,7 @@
<item quantity="other">(%3$d 个文件中的第 %2$d 个)%1$s</item>
</plurals>
<plurals name="outgoing_file_title">
<item quantity="other">正在发送 %1$d 个文件 %2$s</item>
<item quantity="other">正在发送 %1$d 个文件 %2$s</item>
</plurals>
<plurals name="outgoing_files_text">
<item quantity="other">(%3$d 个文件中的 %2$d 个)%1$s</item>
@@ -117,10 +117,10 @@
<plurals name="send_files_fail_title">
<item quantity="other">发送给 %1$s 的 %3$d 个文件中的 %2$d 个失败</item>
</plurals>
<string name="tap_to_open">点击打开</string>
<string name="received_file_text">点击打开“%1s”</string>
<string name="tap_to_open">点击打开</string>
<string name="received_file_text">点击打开“%1s”</string>
<string name="cannot_create_file">无法创建文件 %s</string>
<string name="tap_to_answer">点击应答</string>
<string name="tap_to_answer">点击应答</string>
<string name="right_click">发送右键点击</string>
<string name="middle_click">发送中键点击</string>
<string name="show_keyboard">显示键盘</string>
@@ -194,8 +194,8 @@
<string name="sftp_saf_permission_explanation">要远程访问文件,您需要配置存储位置</string>
<string name="no_players_connected">未找到播放器</string>
<string name="send_files">发送文件</string>
<string name="pairing_title">KDE Connect 设备</string>
<string name="pairing_description">其他在同一网络运行 KDE Connect 的设备会在此处显示。</string>
<string name="pairing_title">K 易连设备</string>
<string name="pairing_description">其他在同一网络运行 K 易连的设备会在此处显示。</string>
<string name="device_rename_title">重命名设备</string>
<string name="device_rename_confirm">重命名</string>
<string name="refresh">刷新</string>
@@ -206,7 +206,7 @@
<string name="pref_plugin_telepathy">发送短消息</string>
<string name="pref_plugin_telepathy_desc">从桌面发送短消息</string>
<string name="pref_plugin_telepathy_mms">发送彩信</string>
<string name="pref_plugin_telepathy_mms_desc">您需要将 KDE Connect 设置为默认短信应用程序才能通过它发送彩信。</string>
<string name="pref_plugin_telepathy_mms_desc">您需要将 K 易连设置为默认短信应用程序才能通过它发送彩信。</string>
<string name="findmyphone_title">找到我的手机</string>
<string name="findmyphone_title_tablet">找到我的平板电脑</string>
<string name="findmyphone_title_tv">查找我的电视</string>
@@ -218,6 +218,7 @@
<string name="permission_explanation">这个插件需要权限才能工作</string>
<string name="optional_permission_explanation">您需要授予额外权限以启用全部功能</string>
<string name="plugins_need_optional_permission">因缺少权限,某些插件的一些功能已禁用(点击以查看更多信息):</string>
<string name="share_optional_permission_explanation">要接收共享的文件,您需要选择一个目标目录</string>
<string name="telepathy_permission_explanation">从计算机桌面读取、写入短消息需要向应用程序授予 SMS 权限</string>
<string name="telephony_permission_explanation">要桌面上查看手机通话记录,您需要授予访问通话记录和手机状态的权限</string>
<string name="telephony_optional_permission_explanation">要查看联系人姓名而非电话号码,您需要授予访问手机通讯录的权限</string>
@@ -233,7 +234,7 @@
<string name="presenter_lock_tip">您可以锁定设备,用音量键作为上一页/下一页按钮</string>
<string name="add_command">添加命令</string>
<string name="addcommand_explanation">没有已注册的命令</string>
<string name="addcommand_explanation2">您可以在 KDE Connect 系统设置中添加新命令</string>
<string name="addcommand_explanation2">您可以在 K 易连系统设置中添加新命令</string>
<string name="add_command_description">您可以在桌面添加新命令</string>
<string name="pref_plugin_mprisreceiver">控制媒体播放器</string>
<string name="pref_plugin_mprisreceiver_desc">从其他设备控制您的手机的播放器</string>
@@ -274,7 +275,7 @@
<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="remote_keyboard_service">K 易连远程键盘</string>
<string name="presenter_pointer">指针</string>
<string name="trusted_networks">信任的网络</string>
<string name="trusted_networks_desc">限制只在已知网络中启用自动发现</string>

View File

@@ -90,7 +90,6 @@
<string name="encryption_info_title">加密資訊</string>
<string name="encryption_info_msg_no_ssl">其他的裝置沒有使用新版本的KDE連線使用傳統的加密模式。</string>
<string name="my_device_fingerprint">您裝置憑證的 SHA1 指紋是:</string>
<string name="remote_device_fingerprint">您遠端裝置憑證的 SHA1 指紋是:</string>
<string name="pair_requested">已請求配對</string>
<string name="pairing_request_from">來自 %1s 的配對請求</string>
<plurals name="incoming_file_title">

View File

@@ -126,9 +126,10 @@
<string name="encryption_info_title">Encryption Info</string>
<string name="encryption_info_msg_no_ssl">The other device doesn\'t use a recent version of KDE Connect, using the legacy encryption method.</string>
<string name="my_device_fingerprint">SHA1 fingerprint of your device certificate is:</string>
<string name="remote_device_fingerprint">SHA1 fingerprint of remote device certificate is:</string>
<string name="remote_device_fingerprint">SHA256 fingerprint of remote device certificate is:</string>
<string name="pair_requested">Pair requested</string>
<string name="pairing_request_from">Pairing request from %1s</string>
<string name="pairing_verification_code" translatable="false">🔑%1s...</string>
<plurals name="incoming_file_title">Receiving file from %1s>
<item quantity="one">Receiving %1$d file from %2$s</item>
<item quantity="other">Receiving %1$d files from %2$s</item>

View File

@@ -391,10 +391,11 @@ public class Device implements BaseLink.PacketReceiver {
final NotificationManager notificationManager = ContextCompat.getSystemService(getContext(), NotificationManager.class);
String verificationKeyShort = SslHelper.getVerificationKey(SslHelper.certificate, certificate).substring(8);
Notification noti = new NotificationCompat.Builder(getContext(), NotificationHelper.Channels.DEFAULT)
.setContentTitle(res.getString(R.string.pairing_request_from, getName()))
.setContentText(res.getString(R.string.tap_to_answer))
.setContentIntent(pendingIntent)
.setContentText(res.getString(R.string.pairing_verification_code, verificationKeyShort))
.setTicker(res.getString(R.string.pair_requested))
.setSmallIcon(R.drawable.ic_notification)
.addAction(R.drawable.ic_accept_pairing_24dp, res.getString(R.string.pairing_accept), acceptedPendingIntent)

View File

@@ -30,6 +30,7 @@ import org.spongycastle.cert.jcajce.JcaX509v3CertificateBuilder;
import org.spongycastle.jce.provider.BouncyCastleProvider;
import org.spongycastle.operator.ContentSigner;
import org.spongycastle.operator.jcajce.JcaContentSignerBuilder;
import org.spongycastle.util.Arrays;
import java.io.IOException;
import java.math.BigInteger;
@@ -254,7 +255,7 @@ public class SslHelper {
public static String getCertificateHash(Certificate certificate) {
try {
byte[] hash = MessageDigest.getInstance("SHA-1").digest(certificate.getEncoded());
byte[] hash = MessageDigest.getInstance("SHA-256").digest(certificate.getEncoded());
Formatter formatter = new Formatter();
int i;
for (i = 0; i < hash.length - 1; i++) {
@@ -279,4 +280,31 @@ public class SslHelper {
return IETFUtils.valueToString(rdn.getFirst().getValue());
}
public static String getVerificationKey(X509Certificate certificateA, Certificate certificateB) {
try {
byte[] a = certificateA.getPublicKey().getEncoded();
byte[] b = certificateB.getPublicKey().getEncoded();
if (Arrays.compareUnsigned(a, b) < 0) {
// Swap them so on both devices they are in the same order
byte[] aux = a;
a = b;
b = aux;
}
byte[] concat = new byte[a.length + b.length];
System.arraycopy(a, 0, concat, 0, a.length);
System.arraycopy(b, 0, concat, a.length, b.length);
byte[] hash = MessageDigest.getInstance("SHA-256").digest(concat);
Formatter formatter = new Formatter();
for (int i = 0; i < hash.length - 1; i++) {
formatter.format("%02x", hash[i]);
}
return formatter.toString();
} catch(Exception e) {
e.printStackTrace();
return "error";
}
}
}

View File

@@ -23,12 +23,7 @@ import android.view.MenuItem;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.ImageButton;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.SeekBar;
import android.widget.Spinner;
import android.widget.TextView;
import android.widget.Toast;
import androidx.annotation.NonNull;
@@ -46,13 +41,12 @@ import org.kde.kdeconnect.NetworkPacket;
import org.kde.kdeconnect.Plugins.SystemvolumePlugin.SystemvolumeFragment;
import org.kde.kdeconnect.UserInterface.ThemeUtil;
import org.kde.kdeconnect_tp.R;
import org.kde.kdeconnect_tp.databinding.ActivityMprisBinding;
import org.kde.kdeconnect_tp.databinding.MprisControlBinding;
import java.net.MalformedURLException;
import java.util.List;
import butterknife.BindView;
import butterknife.ButterKnife;
public class MprisActivity extends AppCompatActivity {
private String deviceId;
@@ -60,54 +54,8 @@ public class MprisActivity extends AppCompatActivity {
private Runnable positionSeekUpdateRunnable = null;
private MprisPlugin.MprisPlayer targetPlayer = null;
@BindView(R.id.play_button)
ImageButton playButton;
@BindView(R.id.prev_button)
ImageButton prevButton;
@BindView(R.id.next_button)
ImageButton nextButton;
@BindView(R.id.rew_button)
ImageButton rewButton;
@BindView(R.id.ff_button)
ImageButton ffButton;
@BindView(R.id.time_textview)
TextView timeText;
@BindView(R.id.album_art)
ImageView albumArtView;
@BindView(R.id.player_spinner)
Spinner playerSpinner;
@BindView(R.id.no_players)
TextView noPlayers;
@BindView(R.id.now_playing_textview)
TextView nowPlayingText;
@BindView(R.id.positionSeek)
SeekBar positionBar;
@BindView(R.id.progress_slider)
LinearLayout progressSlider;
@BindView(R.id.volume_seek)
SeekBar volumeSeek;
@BindView(R.id.volume_layout)
LinearLayout volumeLayout;
@BindView(R.id.stop_button)
ImageButton stopButton;
@BindView(R.id.progress_textview)
TextView progressText;
private ActivityMprisBinding activityMprisBinding;
private MprisControlBinding mprisControlBinding;
private static String milisToProgress(long milis) {
int length = (int) (milis / 1000); //From milis to seconds
@@ -128,7 +76,6 @@ public class MprisActivity extends AppCompatActivity {
}
private void connectToPlugin(final String targetPlayerName) {
BackgroundService.RunWithPlugin(this, deviceId, MprisPlugin.class, mpris -> {
targetPlayer = mpris.getPlayerStatus(targetPlayerName);
@@ -152,19 +99,18 @@ public class MprisActivity extends AppCompatActivity {
adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
runOnUiThread(() -> {
playerSpinner.setAdapter(adapter);
mprisControlBinding.playerSpinner.setAdapter(adapter);
if (playerList.isEmpty()) {
noPlayers.setVisibility(View.VISIBLE);
playerSpinner.setVisibility(View.GONE);
nowPlayingText.setText("");
mprisControlBinding.noPlayers.setVisibility(View.VISIBLE);
mprisControlBinding.playerSpinner.setVisibility(View.GONE);
mprisControlBinding.nowPlayingTextview.setText("");
} else {
noPlayers.setVisibility(View.GONE);
playerSpinner.setVisibility(View.VISIBLE);
mprisControlBinding.noPlayers.setVisibility(View.GONE);
mprisControlBinding.playerSpinner.setVisibility(View.VISIBLE);
}
playerSpinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
mprisControlBinding.playerSpinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
@Override
public void onItemSelected(AdapterView<?> arg0, View arg1, int pos, long id) {
@@ -196,7 +142,7 @@ public class MprisActivity extends AppCompatActivity {
if (targetPlayer != null) {
int targetIndex = adapter.getPosition(targetPlayer.getPlayer());
if (targetIndex >= 0) {
playerSpinner.setSelection(targetIndex);
mprisControlBinding.playerSpinner.setSelection(targetIndex);
} else {
targetPlayer = null;
}
@@ -204,18 +150,16 @@ public class MprisActivity extends AppCompatActivity {
//If no player selected, select the first one (if any)
if (targetPlayer == null && !playerList.isEmpty()) {
targetPlayer = mpris.getPlayerStatus(playerList.get(0));
playerSpinner.setSelection(0);
mprisControlBinding.playerSpinner.setSelection(0);
}
updatePlayerStatus(mpris);
});
}
});
});
}
private void addSystemVolumeFragment() {
if (findViewById(R.id.systemvolume_fragment) == null)
return;
@@ -249,8 +193,8 @@ public class MprisActivity extends AppCompatActivity {
}
String song = playerStatus.getCurrentSong();
if (!nowPlayingText.getText().toString().equals(song)) {
nowPlayingText.setText(song);
if (!mprisControlBinding.nowPlayingTextview.getText().toString().equals(song)) {
mprisControlBinding.nowPlayingTextview.setText(song);
}
Bitmap albumArt = playerStatus.getAlbumArt();
@@ -259,47 +203,47 @@ public class MprisActivity extends AppCompatActivity {
assert drawable != null;
Drawable placeholder_art = DrawableCompat.wrap(drawable);
DrawableCompat.setTint(placeholder_art, ContextCompat.getColor(this, R.color.primary));
albumArtView.setImageDrawable(placeholder_art);
activityMprisBinding.albumArt.setImageDrawable(placeholder_art);
} else {
albumArtView.setImageBitmap(albumArt);
activityMprisBinding.albumArt.setImageBitmap(albumArt);
}
if (playerStatus.isSeekAllowed()) {
timeText.setText(milisToProgress(playerStatus.getLength()));
positionBar.setMax((int) (playerStatus.getLength()));
positionBar.setProgress((int) (playerStatus.getPosition()));
progressSlider.setVisibility(View.VISIBLE);
mprisControlBinding.timeTextview.setText(milisToProgress(playerStatus.getLength()));
mprisControlBinding.positionSeek.setMax((int) (playerStatus.getLength()));
mprisControlBinding.positionSeek.setProgress((int) (playerStatus.getPosition()));
mprisControlBinding.progressSlider.setVisibility(View.VISIBLE);
} else {
progressSlider.setVisibility(View.GONE);
mprisControlBinding.progressSlider.setVisibility(View.GONE);
}
int volume = playerStatus.getVolume();
volumeSeek.setProgress(volume);
mprisControlBinding.volumeSeek.setProgress(volume);
boolean isPlaying = playerStatus.isPlaying();
if (isPlaying) {
playButton.setImageResource(R.drawable.ic_pause_black);
playButton.setEnabled(playerStatus.isPauseAllowed());
mprisControlBinding.playButton.setImageResource(R.drawable.ic_pause_black);
mprisControlBinding.playButton.setEnabled(playerStatus.isPauseAllowed());
} else {
playButton.setImageResource(R.drawable.ic_play_black);
playButton.setEnabled(playerStatus.isPlayAllowed());
mprisControlBinding.playButton.setImageResource(R.drawable.ic_play_black);
mprisControlBinding.playButton.setEnabled(playerStatus.isPlayAllowed());
}
volumeLayout.setVisibility(playerStatus.isSetVolumeAllowed() ? View.VISIBLE : View.GONE);
rewButton.setVisibility(playerStatus.isSeekAllowed() ? View.VISIBLE : View.GONE);
ffButton.setVisibility(playerStatus.isSeekAllowed() ? View.VISIBLE : View.GONE);
mprisControlBinding.volumeLayout.setVisibility(playerStatus.isSetVolumeAllowed() ? View.VISIBLE : View.GONE);
mprisControlBinding.rewButton.setVisibility(playerStatus.isSeekAllowed() ? View.VISIBLE : View.GONE);
mprisControlBinding.ffButton.setVisibility(playerStatus.isSeekAllowed() ? View.VISIBLE : View.GONE);
invalidateOptionsMenu();
//Show and hide previous/next buttons simultaneously
if (playerStatus.isGoPreviousAllowed() || playerStatus.isGoNextAllowed()) {
prevButton.setVisibility(View.VISIBLE);
prevButton.setEnabled(playerStatus.isGoPreviousAllowed());
nextButton.setVisibility(View.VISIBLE);
nextButton.setEnabled(playerStatus.isGoNextAllowed());
mprisControlBinding.prevButton.setVisibility(View.VISIBLE);
mprisControlBinding.prevButton.setEnabled(playerStatus.isGoPreviousAllowed());
mprisControlBinding.nextButton.setVisibility(View.VISIBLE);
mprisControlBinding.nextButton.setEnabled(playerStatus.isGoNextAllowed());
} else {
prevButton.setVisibility(View.GONE);
nextButton.setVisibility(View.GONE);
mprisControlBinding.prevButton.setVisibility(View.GONE);
mprisControlBinding.nextButton.setVisibility(View.GONE);
}
}
@@ -366,8 +310,11 @@ public class MprisActivity extends AppCompatActivity {
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
ThemeUtil.setUserPreferredTheme(this);
setContentView(R.layout.activity_mpris);
ButterKnife.bind(this);
activityMprisBinding = ActivityMprisBinding.inflate(getLayoutInflater());
mprisControlBinding = activityMprisBinding.mprisControl;
setContentView(activityMprisBinding.getRoot());
String targetPlayerName = getIntent().getStringExtra("player");
getIntent().removeExtra("player");
@@ -388,19 +335,19 @@ public class MprisActivity extends AppCompatActivity {
BackgroundService.RunCommand(MprisActivity.this, service -> service.addConnectionListener(connectionReceiver));
connectToPlugin(targetPlayerName);
performActionOnClick(playButton, MprisPlugin.MprisPlayer::playPause);
performActionOnClick(mprisControlBinding.playButton, MprisPlugin.MprisPlayer::playPause);
performActionOnClick(prevButton, MprisPlugin.MprisPlayer::previous);
performActionOnClick(mprisControlBinding.prevButton, MprisPlugin.MprisPlayer::previous);
performActionOnClick(rewButton, p -> targetPlayer.seek(interval_time * -1));
performActionOnClick(mprisControlBinding.rewButton, p -> targetPlayer.seek(interval_time * -1));
performActionOnClick(ffButton, p -> p.seek(interval_time));
performActionOnClick(mprisControlBinding.ffButton, p -> p.seek(interval_time));
performActionOnClick(nextButton, MprisPlugin.MprisPlayer::next);
performActionOnClick(mprisControlBinding.nextButton, MprisPlugin.MprisPlayer::next);
performActionOnClick(stopButton, MprisPlugin.MprisPlayer::stop);
performActionOnClick(mprisControlBinding.stopButton, MprisPlugin.MprisPlayer::stop);
volumeSeek.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
mprisControlBinding.volumeSeek.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
@Override
public void onProgressChanged(SeekBar seekBar, int i, boolean b) {
}
@@ -416,22 +363,21 @@ public class MprisActivity extends AppCompatActivity {
targetPlayer.setVolume(seekBar.getProgress());
});
}
});
positionSeekUpdateRunnable = () -> BackgroundService.RunCommand(MprisActivity.this, service -> {
if (targetPlayer != null) {
positionBar.setProgress((int) (targetPlayer.getPosition()));
mprisControlBinding.positionSeek.setProgress((int) (targetPlayer.getPosition()));
}
positionSeekUpdateHandler.removeCallbacks(positionSeekUpdateRunnable);
positionSeekUpdateHandler.postDelayed(positionSeekUpdateRunnable, 1000);
});
positionSeekUpdateHandler.postDelayed(positionSeekUpdateRunnable, 200);
positionBar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
mprisControlBinding.positionSeek.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
@Override
public void onProgressChanged(SeekBar seekBar, int progress, boolean byUser) {
progressText.setText(milisToProgress(progress));
mprisControlBinding.progressTextview.setText(milisToProgress(progress));
}
@Override
@@ -448,13 +394,11 @@ public class MprisActivity extends AppCompatActivity {
positionSeekUpdateHandler.postDelayed(positionSeekUpdateRunnable, 200);
});
}
});
nowPlayingText.setSelected(true);
mprisControlBinding.nowPlayingTextview.setSelected(true);
}
final static int MENU_OPEN_URL = Menu.FIRST;
public boolean onPrepareOptionsMenu(Menu menu) {

View File

@@ -204,14 +204,8 @@ public class NotificationsPlugin extends Plugin implements NotificationReceiver.
}
if ("org.kde.kdeconnect_tp".equals(packageName)) {
// Don't send our own notifications except notifications posted by SMSPlugin
String groupKey = "";
// SMS Notifications on devices running API's lower than Lollipop are not supported
// as groupKey's are not supported on API's older than Lollipop
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
groupKey = statusBarNotification.getGroupKey();
}
// Don't send our own notifications
return;
}
NetworkPacket np = new NetworkPacket(PACKET_TYPE_NOTIFICATION);

View File

@@ -13,14 +13,12 @@ import android.util.AttributeSet;
import android.view.View;
import android.widget.CheckBox;
import org.kde.kdeconnect_tp.R;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.preference.DialogPreference;
import androidx.preference.PreferenceViewHolder;
import butterknife.BindView;
import butterknife.ButterKnife;
import org.kde.kdeconnect_tp.R;
public class StoragePreference extends DialogPreference {
@Nullable
@@ -28,7 +26,7 @@ public class StoragePreference extends DialogPreference {
@Nullable
private OnLongClickListener onLongClickListener;
@BindView(R.id.checkbox) CheckBox checkbox;
CheckBox checkbox;
public boolean inSelectionMode;
public void setInSelectionMode(boolean inSelectionMode) {
@@ -101,7 +99,7 @@ public class StoragePreference extends DialogPreference {
public void onBindViewHolder(PreferenceViewHolder holder) {
super.onBindViewHolder(holder);
ButterKnife.bind(this, holder.itemView);
checkbox = (CheckBox) holder.itemView.findViewById(R.id.checkbox);
checkbox.setVisibility(inSelectionMode ? View.VISIBLE : View.INVISIBLE);

View File

@@ -18,14 +18,6 @@ import android.text.TextWatcher;
import android.view.View;
import android.widget.Button;
import com.google.android.material.textfield.TextInputEditText;
import com.google.android.material.textfield.TextInputLayout;
import org.json.JSONException;
import org.json.JSONObject;
import org.kde.kdeconnect.Helpers.StorageHelper;
import org.kde.kdeconnect_tp.R;
import androidx.annotation.NonNull;
import androidx.appcompat.app.AlertDialog;
import androidx.appcompat.content.res.AppCompatResources;
@@ -33,10 +25,12 @@ import androidx.core.content.ContextCompat;
import androidx.core.graphics.drawable.DrawableCompat;
import androidx.core.widget.TextViewCompat;
import androidx.preference.PreferenceDialogFragmentCompat;
import butterknife.BindView;
import butterknife.ButterKnife;
import butterknife.OnClick;
import butterknife.Unbinder;
import org.json.JSONException;
import org.json.JSONObject;
import org.kde.kdeconnect.Helpers.StorageHelper;
import org.kde.kdeconnect_tp.R;
import org.kde.kdeconnect_tp.databinding.FragmentStoragePreferenceDialogBinding;
public class StoragePreferenceDialogFragment extends PreferenceDialogFragmentCompat implements TextWatcher {
private static final int REQUEST_CODE_DOCUMENT_TREE = 1001;
@@ -46,11 +40,8 @@ public class StoragePreferenceDialogFragment extends PreferenceDialogFragmentCom
private static final String KEY_STORAGE_INFO = "StorageInfo";
private static final String KEY_TAKE_FLAGS = "TakeFlags";
@BindView(R.id.storageLocation) TextInputEditText storageLocation;
@BindView(R.id.storageDisplayName) TextInputEditText storageDisplayName;
@BindView(R.id.storageDisplayNameInputLayout) TextInputLayout storageDisplayInputLayout;
private FragmentStoragePreferenceDialogBinding binding;
private Unbinder unbinder;
private Callback callback;
private Drawable arrowDropDownDrawable;
private Button positiveButton;
@@ -117,26 +108,33 @@ public class StoragePreferenceDialogFragment extends PreferenceDialogFragmentCom
protected void onBindDialogView(View view) {
super.onBindDialogView(view);
unbinder = ButterKnife.bind(this, view);
binding = FragmentStoragePreferenceDialogBinding.bind(view);
storageDisplayName.setFilters(new InputFilter[]{new FileSeparatorCharFilter()});
storageDisplayName.addTextChangedListener(this);
binding.storageLocation.setOnClickListener(v -> {
Intent intent = new Intent(Intent.ACTION_OPEN_DOCUMENT_TREE);
//For API >= 26 we can also set Extra: DocumentsContract.EXTRA_INITIAL_URI
startActivityForResult(intent, REQUEST_CODE_DOCUMENT_TREE);
});
binding.storageDisplayName.setFilters(new InputFilter[]{new FileSeparatorCharFilter()});
binding.storageDisplayName.addTextChangedListener(this);
if (getPreference().getKey().equals(getString(R.string.sftp_preference_key_add_storage))) {
if (!stateRestored) {
enablePositiveButton = false;
storageLocation.setText(requireContext().getString(R.string.sftp_storage_preference_click_to_select));
binding.storageLocation.setText(requireContext().getString(R.string.sftp_storage_preference_click_to_select));
}
boolean isClickToSelect = TextUtils.equals(storageLocation.getText(),
boolean isClickToSelect = TextUtils.equals(binding.storageLocation.getText(),
getString(R.string.sftp_storage_preference_click_to_select));
TextViewCompat.setCompoundDrawablesRelative(storageLocation, null, null, isClickToSelect ? arrowDropDownDrawable : null, null);
storageLocation.setEnabled(isClickToSelect);
storageLocation.setFocusable(false);
storageLocation.setFocusableInTouchMode(false);
TextViewCompat.setCompoundDrawablesRelative(binding.storageLocation, null, null,
isClickToSelect ? arrowDropDownDrawable : null, null);
binding.storageLocation.setEnabled(isClickToSelect);
binding.storageLocation.setFocusable(false);
binding.storageLocation.setFocusableInTouchMode(false);
storageDisplayName.setEnabled(!isClickToSelect);
binding.storageDisplayName.setEnabled(!isClickToSelect);
} else {
if (!stateRestored) {
StoragePreference preference = (StoragePreference) getPreference();
@@ -149,20 +147,20 @@ public class StoragePreferenceDialogFragment extends PreferenceDialogFragmentCom
storageInfo = SftpPlugin.StorageInfo.copy(info);
if (Build.VERSION.SDK_INT < 21) {
storageLocation.setText(storageInfo.uri.getPath());
binding.storageLocation.setText(storageInfo.uri.getPath());
} else {
storageLocation.setText(DocumentsContract.getTreeDocumentId(storageInfo.uri));
binding.storageLocation.setText(DocumentsContract.getTreeDocumentId(storageInfo.uri));
}
storageDisplayName.setText(storageInfo.displayName);
binding.storageDisplayName.setText(storageInfo.displayName);
}
TextViewCompat.setCompoundDrawablesRelative(storageLocation, null, null, null, null);
storageLocation.setEnabled(false);
storageLocation.setFocusable(false);
storageLocation.setFocusableInTouchMode(false);
TextViewCompat.setCompoundDrawablesRelative(binding.storageLocation, null, null, null, null);
binding.storageLocation.setEnabled(false);
binding.storageLocation.setFocusable(false);
binding.storageLocation.setFocusableInTouchMode(false);
storageDisplayName.setEnabled(true);
binding.storageDisplayName.setEnabled(true);
}
}
@@ -170,15 +168,7 @@ public class StoragePreferenceDialogFragment extends PreferenceDialogFragmentCom
public void onDestroyView() {
super.onDestroyView();
unbinder.unbind();
}
@TargetApi(Build.VERSION_CODES.LOLLIPOP)
@OnClick(R.id.storageLocation)
void onSelectStorageClicked() {
Intent intent = new Intent(Intent.ACTION_OPEN_DOCUMENT_TREE);
//For API >= 26 we can also set Extra: DocumentsContract.EXTRA_INITIAL_URI
startActivityForResult(intent, REQUEST_CODE_DOCUMENT_TREE);
binding = null;
}
@TargetApi(Build.VERSION_CODES.LOLLIPOP)
@@ -207,16 +197,16 @@ public class StoragePreferenceDialogFragment extends PreferenceDialogFragmentCom
storageInfo = new SftpPlugin.StorageInfo(displayName, uri);
storageLocation.setText(documentId);
TextViewCompat.setCompoundDrawablesRelative(storageLocation, null, null, null, null);
storageLocation.setError(null);
storageLocation.setEnabled(false);
binding.storageLocation.setText(documentId);
TextViewCompat.setCompoundDrawablesRelative(binding.storageLocation, null, null, null, null);
binding.storageLocation.setError(null);
binding.storageLocation.setEnabled(false);
// TODO: Show name as used in android's picker app but I don't think it's possible to get that, everything I tried throws PermissionDeniedException
storageDisplayName.setText(displayName);
storageDisplayName.setEnabled(true);
binding.storageDisplayName.setText(displayName);
binding.storageDisplayName.setEnabled(true);
} else {
storageLocation.setError(result.errorMessage);
binding.storageLocation.setError(result.errorMessage);
setPositiveButtonEnabled(false);
}
break;
@@ -240,7 +230,7 @@ public class StoragePreferenceDialogFragment extends PreferenceDialogFragmentCom
@Override
public void onDialogClosed(boolean positiveResult) {
if (positiveResult) {
storageInfo.displayName = storageDisplayName.getText().toString();
storageInfo.displayName = binding.storageDisplayName.getText().toString();
if (getPreference().getKey().equals(getString(R.string.sftp_preference_key_add_storage))) {
callback.addNewStoragePreference(storageInfo, takeFlags);
@@ -274,7 +264,7 @@ public class StoragePreferenceDialogFragment extends PreferenceDialogFragmentCom
setPositiveButtonEnabled(true);
} else {
setPositiveButtonEnabled(false);
storageDisplayName.setError(result.errorMessage);
binding.storageDisplayName.setError(result.errorMessage);
}
}
}

View File

@@ -12,12 +12,6 @@ import android.os.Build;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.FrameLayout;
import android.widget.TextView;
import org.kde.kdeconnect_tp.R;
import java.util.ArrayList;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
@@ -25,8 +19,11 @@ import androidx.appcompat.content.res.AppCompatResources;
import androidx.core.widget.TextViewCompat;
import androidx.recyclerview.widget.ItemTouchHelper;
import androidx.recyclerview.widget.RecyclerView;
import butterknife.BindView;
import butterknife.ButterKnife;
import org.kde.kdeconnect_tp.R;
import org.kde.kdeconnect_tp.databinding.CustomDeviceItemBinding;
import java.util.ArrayList;
public class CustomDevicesAdapter extends RecyclerView.Adapter<CustomDevicesAdapter.ViewHolder> {
private ArrayList<String> customDevices;
@@ -56,9 +53,10 @@ public class CustomDevicesAdapter extends RecyclerView.Adapter<CustomDevicesAdap
@NonNull
@Override
public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.custom_device_item, parent, false);
CustomDeviceItemBinding itemBinding =
CustomDeviceItemBinding.inflate(LayoutInflater.from(parent.getContext()), parent, false);
return new ViewHolder(v);
return new ViewHolder(itemBinding);
}
@Override
@@ -72,30 +70,29 @@ public class CustomDevicesAdapter extends RecyclerView.Adapter<CustomDevicesAdap
}
class ViewHolder extends RecyclerView.ViewHolder implements SwipeableViewHolder {
@BindView(R.id.deviceNameOrIPBackdrop) TextView deviceNameOrIPBackdrop;
@BindView(R.id.swipeableView) FrameLayout swipeableView;
@BindView(R.id.deviceNameOrIP) TextView deviceNameOrIP;
private final CustomDeviceItemBinding itemBinding;
ViewHolder(@NonNull View itemView) {
super(itemView);
ButterKnife.bind(this, itemView);
ViewHolder(@NonNull CustomDeviceItemBinding itemBinding) {
super(itemBinding.getRoot());
this.itemBinding = itemBinding;
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP) {
Drawable deleteDrawable = AppCompatResources.getDrawable(itemView.getContext(), R.drawable.ic_delete);
TextViewCompat.setCompoundDrawablesRelativeWithIntrinsicBounds(deviceNameOrIPBackdrop, deleteDrawable, null, deleteDrawable, null);
Drawable deleteDrawable = AppCompatResources.getDrawable(itemBinding.getRoot().getContext(),
R.drawable.ic_delete);
TextViewCompat.setCompoundDrawablesRelativeWithIntrinsicBounds(itemBinding.deviceNameOrIPBackdrop,
deleteDrawable, null, deleteDrawable, null);
}
deviceNameOrIP.setOnClickListener(v -> callback.onCustomDeviceClicked(customDevices.get(getAdapterPosition())));
itemBinding.deviceNameOrIP.setOnClickListener(v -> callback.onCustomDeviceClicked(customDevices.get(getAdapterPosition())));
}
void bind(String customDevice) {
deviceNameOrIP.setText(customDevice);
itemBinding.deviceNameOrIP.setText(customDevice);
}
@Override
public View getSwipeableView() {
return swipeableView;
return itemBinding.swipeableView;
}
}

View File

@@ -104,6 +104,8 @@ public class DeviceFragment extends Fragment {
binding.pairButton.setOnClickListener(v -> {
binding.pairButton.setVisibility(View.GONE);
binding.pairMessage.setText("");
binding.pairVerification.setVisibility(View.VISIBLE);
binding.pairVerification.setText(SslHelper.getVerificationKey(SslHelper.certificate, device.certificate));
binding.pairProgress.setVisibility(View.VISIBLE);
BackgroundService.RunCommand(mActivity, service -> {
device = service.getDevice(mDeviceId);
@@ -259,6 +261,8 @@ public class DeviceFragment extends Fragment {
public void run() {
if (device.isPairRequestedByPeer()) {
binding.pairMessage.setText(R.string.pair_requested);
binding.pairVerification.setVisibility(View.VISIBLE);
binding.pairVerification.setText(SslHelper.getVerificationKey(SslHelper.certificate, device.certificate));
binding.pairingButtons.setVisibility(View.VISIBLE);
binding.pairProgress.setVisibility(View.GONE);
binding.pairButton.setVisibility(View.GONE);
@@ -333,6 +337,8 @@ public class DeviceFragment extends Fragment {
mActivity.runOnUiThread(() -> {
if (binding.getRoot() == null) return;
binding.pairMessage.setText(error);
binding.pairVerification.setText("");
binding.pairVerification.setVisibility(View.GONE);
binding.pairProgress.setVisibility(View.GONE);
binding.pairButton.setVisibility(View.VISIBLE);
binding.pairRequestButtons.setVisibility(View.GONE);
@@ -345,6 +351,7 @@ public class DeviceFragment extends Fragment {
mActivity.runOnUiThread(() -> {
if (binding.getRoot() == null) return;
binding.pairMessage.setText(R.string.device_not_paired);
binding.pairVerification.setVisibility(View.GONE);
binding.pairProgress.setVisibility(View.GONE);
binding.pairButton.setVisibility(View.VISIBLE);
binding.pairRequestButtons.setVisibility(View.GONE);

View File

@@ -9,23 +9,22 @@ package org.kde.kdeconnect.UserInterface;
import android.app.Dialog;
import android.os.Bundle;
import com.google.android.material.textfield.TextInputEditText;
import com.google.android.material.textfield.TextInputLayout;
import org.kde.kdeconnect_tp.R;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.annotation.StringRes;
import butterknife.BindView;
import butterknife.ButterKnife;
import com.google.android.material.textfield.TextInputEditText;
import org.kde.kdeconnect_tp.R;
import org.kde.kdeconnect_tp.databinding.EditTextAlertDialogViewBinding;
public class EditTextAlertDialogFragment extends AlertDialogFragment {
private static final String KEY_HINT_RES_ID = "HintResId";
private static final String KEY_TEXT = "Text";
@BindView(R.id.textInputLayout) TextInputLayout textInputLayout;
@BindView(R.id.textInputEditText) TextInputEditText editText;
private EditTextAlertDialogViewBinding binding;
TextInputEditText editText;
private @StringRes int hintResId;
private String text;
@@ -35,10 +34,12 @@ public class EditTextAlertDialogFragment extends AlertDialogFragment {
Dialog dialog = super.onCreateDialog(savedInstanceState);
dialog.setOnShowListener(dialogInterface -> {
dialog.setOnShowListener(null);
ButterKnife.bind(EditTextAlertDialogFragment.this, dialog);
textInputLayout.setHintEnabled(true);
textInputLayout.setHint(getString(hintResId));
binding = EditTextAlertDialogViewBinding.bind(dialog.getWindow().getDecorView());
editText = binding.textInputEditText;
binding.textInputLayout.setHintEnabled(true);
binding.textInputLayout.setHint(getString(hintResId));
editText.setText(text);
});