2
0
mirror of https://github.com/KDE/kdeconnect-android synced 2025-09-02 23:25:10 +00:00

Compare commits

...

30 Commits

Author SHA1 Message Date
Albert Vaca
c5961d6514 Bump version code to release 2018-11-29 20:22:41 +01:00
l10n daemon script
69e5623a4d GIT_SILENT made messages (after extraction) 2018-11-29 02:58:46 +01:00
Erik Duisters
5d50358f3f Allow sharing of empty files
Summary:
When an empty file is shared with the desktop a server is started that times-out after 10sec
this causes a notification to be displayed telling the user the transfer failed

Test Plan:
Send an empty file to the desktop
A notification should be displayed telling the user the transfer succeeded

Reviewers: #kde_connect, albertvaka

Reviewed By: #kde_connect, albertvaka

Subscribers: albertvaka, kdeconnect

Tags: #kde_connect

Differential Revision: https://phabricator.kde.org/D17176
2018-11-28 15:49:36 +01:00
l10n daemon script
58cd88b760 GIT_SILENT made messages (after extraction) 2018-11-26 02:58:21 +01:00
l10n daemon script
9561ff1cab GIT_SILENT made messages (after extraction) 2018-11-24 02:56:53 +01:00
l10n daemon script
e48993a5d7 GIT_SILENT made messages (after extraction) 2018-11-23 02:57:07 +01:00
l10n daemon script
f1d0649cc6 GIT_SILENT made messages (after extraction) 2018-11-22 02:57:31 +01:00
l10n daemon script
027856bc0b GIT_SILENT made messages (after extraction) 2018-11-21 02:58:56 +01:00
Nicolas Fella
6dd6bd3117 Enable opening on connected device (Android)
Summary: When a Share packet with a file and "open: true" arrives ope that file directly. Files are always downloaded to the standard location to avoid the FileProvider trouble

Test Plan: TBA

Reviewers: #kde_connect, albertvaka

Reviewed By: #kde_connect, albertvaka

Subscribers: albertvaka, kdeconnect

Tags: #kde_connect

Maniphest Tasks: T8637

Differential Revision: https://phabricator.kde.org/D15293
2018-11-20 21:50:01 +01:00
Albert Vaca
6ecf443238 Only send icons of new notification, not updates 2018-11-20 21:24:35 +01:00
Erik Duisters
96b0a9ea9b A SO_TIMEOUT of 1 second often leads to the socket timing out when transferring large files.
Summary:
When receiving large files (even worse when uploading multiple files) the receiving socket
often times-out.

Test Plan:
Send 1 or 2 big files from desktop to android without this patch and you should see 1 or both transfers
fail because of a SO_TIMEOUT

Apply this patch and re-run the test and both transfers should now complete without an SO_TIMEOUT

Reviewers: #kde_connect, albertvaka

Reviewed By: #kde_connect, albertvaka

Subscribers: zhigalin, albertvaka, kdeconnect

Tags: #kde_connect

Differential Revision: https://phabricator.kde.org/D16758
2018-11-20 13:50:07 +01:00
l10n daemon script
178e5ca050 GIT_SILENT made messages (after extraction) 2018-11-20 02:57:52 +01:00
Albert Vaca
df0d02cd0d Allow packets that carry both muted and volume 2018-11-20 01:10:09 +01:00
Alex Kovrigin
9be46002ad Refactor Duplicated Code in KDE Connect Android-side SMS Helper
Summary:
In src/org/kde/kdeconnect/Helpers/SMSHelper.java:
getMessagesWithFilter() and getConversations() functions are now both using new function: getMessages().

Test Plan:
* Build android app and run it on android phone
* Pair it with the desktop and open sms app (kdeconnect-sms).
* Everything works as earlier, but now with refactored code.

Reviewers: sredman

Reviewed By: sredman

Subscribers: sredman, alexkovrigin, kdeconnect

Tags: #kde_connect

Maniphest Tasks: T9841

Differential Revision: https://phabricator.kde.org/D17002
2018-11-19 10:21:45 -07:00
l10n daemon script
2cf9df3be8 GIT_SILENT made messages (after extraction) 2018-11-18 03:48:16 +01:00
l10n daemon script
27b4089061 GIT_SILENT made messages (after extraction) 2018-11-17 03:45:23 +01:00
l10n daemon script
b8a2757bce GIT_SILENT made messages (after extraction) 2018-11-16 03:42:45 +01:00
Simon Redman
da629f9756 [Android] Make message syncronization interface capable of handling future changes
Summary:
Update packet type with proper field names and commenting

Send new "event" field

Test Plan:
- Install corresponding Desktop-side patch D16599
- Verify that it is still possible to synchronize messages the same as it was before

Reviewers: #kde_connect, nicolasfella

Reviewed By: #kde_connect, nicolasfella

Subscribers: nicolasfella, kdeconnect

Tags: #kde_connect

Differential Revision: https://phabricator.kde.org/D16600
2018-11-15 16:56:25 -07:00
l10n daemon script
3de35361bb GIT_SILENT made messages (after extraction) 2018-11-13 03:54:06 +01:00
l10n daemon script
9cbf2a33bc GIT_SILENT made messages (after extraction) 2018-11-12 03:50:01 +01:00
l10n daemon script
1325cc2e0f GIT_SILENT made messages (after extraction) 2018-11-09 03:51:31 +01:00
Albert Vaca
7784a66df0 Fixed untranslatable strings
BUG: 400810
2018-11-08 14:51:40 +01:00
Erik Duisters
b29e7eb000 Need to dynamically register broadcast receiver for ConnectivityManager.CONNECTIVITY_ACTION broadcast on API >= 24
Summary:
On android versions >= 24 manifest registered broadcast receivers for ConnectivityManager.CONNECTIVITY_ACTION
will not receive the broadcast, see: https://developer.android.com/reference/android/net/ConnectivityManager#CONNECTIVITY_ACTION

Test Plan:
Run app on phone with API > 24 without this patch and this broadcast will not be received any longer
Run app on phone with API > 24 with this patch and this broadcast will be received again

Reviewers: #kde_connect, albertvaka

Reviewed By: #kde_connect, albertvaka

Subscribers: albertvaka, kdeconnect

Tags: #kde_connect

Differential Revision: https://phabricator.kde.org/D16738
2018-11-07 18:44:45 +01:00
Erik Duisters
1fa8f3c99d Load image with resampling to prevent OOM
Summary:
When loading large images you can run into an OOM situation crashing
the app and leaving the progress notification displayed indefinitely

BUG: 397507

Test Plan:
Before applying the patch find a phone where the app crashes when you send a very large
image to it (my 6.0.1 phone did not even crash when i send it a 85MB image but my 4.0.4 phone
already crashes on a 7MB image)

Apply patch install and send image again

Reviewers: #kde_connect, albertvaka

Reviewed By: #kde_connect, albertvaka

Subscribers: albertvaka, kdeconnect

Tags: #kde_connect

Differential Revision: https://phabricator.kde.org/D16712
2018-11-07 17:53:05 +01:00
Albert Vaca
9e1e479650 Disable bad cipher suites now that we dropped support for API<14
BUG: 400722
2018-11-07 16:24:00 +01:00
Erik Duisters
4eecf187c3 Manifest.permission.READ_EXTERNAL_STORAGE is not needed for API < 16
Summary:
Manifest.permission.READ_EXTERNAL_STORAGE was added in API 16 so older API's do not
have to request this permission

Test Plan:
Install on API < 16 device or emulator
Pair and browse device using dolphin

Reviewers: #kde_connect, albertvaka

Reviewed By: #kde_connect, albertvaka

Subscribers: nicolasfella, kdeconnect

Tags: #kde_connect

Differential Revision: https://phabricator.kde.org/D16613
2018-11-07 16:06:03 +01:00
Bertrand Lacost
8c48df6293 Add detection of the Meta/Super key press
Differential Revision: https://phabricator.kde.org/D10379
2018-11-07 16:05:30 +01:00
Erik Duisters
b4853508e0 When creating sharePendingIntent use a unique requestCode so a new PendingIntent is created
Summary:
Fixes the situation where when 2 or more files are send to Android clicking the share button
in either of the notifications will always share the last received file.

BUG: 396051

Test Plan:
Send 2 files to android
Click on the share button of the first received file

The first file is actually used for the share and not the last received file

Reviewers: #kde_connect, albertvaka

Reviewed By: #kde_connect, albertvaka

Subscribers: albertvaka, kdeconnect

Tags: #kde_connect

Differential Revision: https://phabricator.kde.org/D16707
2018-11-06 21:49:58 +01:00
Erik Duisters
6992f2f5ee While uploading a file the notification should not be dismissable
Summary: BUG: 399983

Test Plan:
Send a big file from Android
The notification can not be dismissed while the file is being transferred

Reviewers: #kde_connect, nicolasfella

Reviewed By: #kde_connect, nicolasfella

Subscribers: nicolasfella, kdeconnect

Tags: #kde_connect

Differential Revision: https://phabricator.kde.org/D16713
2018-11-06 19:57:02 +01:00
l10n daemon script
bb3018ea76 GIT_SILENT made messages (after extraction) 2018-11-06 03:45:34 +01:00
29 changed files with 363 additions and 139 deletions

View File

@@ -1,8 +1,8 @@
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="org.kde.kdeconnect_tp"
android:versionCode="11006"
android:versionName="1.10">
android:versionCode="11010"
android:versionName="1.10.1">
<supports-screens
android:anyDensity="true"

View File

@@ -157,6 +157,7 @@
<string name="pair_device_action">Aparella amb un dispositiu nou</string>
<string name="unpair_device_action">Desparella %s</string>
<string name="custom_device_list">Afegeix dispositius per la IP</string>
<string name="delete_custom_device">Suprimeixo %s?</string>
<string name="share_notification_preference">Rebombori de les notificacions</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>

View File

@@ -1,5 +1,8 @@
<?xml version='1.0' encoding='utf-8'?>
<resources>
<string name="kde_connect">KDE Connect</string>
<string name="foreground_notification_no_devices">Žádná připojená zařízení</string>
<string name="foreground_notification_devices">Připojen k: %s</string>
<string name="pref_plugin_telephony">Upozornění telefonie</string>
<string name="pref_plugin_telephony_desc">Posílat upozornění na příchozí hovory</string>
<string name="pref_plugin_battery">Hlášení baterie</string>
@@ -122,6 +125,7 @@
<string name="device">Zařízení</string>
<string name="pair_device">Spárovat zařízení</string>
<string name="remote_control">Vzdálené ovládání</string>
<string name="settings">Nastavení</string>
<string name="mpris_play">Přehrát</string>
<string name="mpris_pause">Pozastavit</string>
<string name="mpris_previous">Předchozí</string>
@@ -131,6 +135,7 @@
<string name="mpris_volume">Hlasitost</string>
<string name="mpris_settings">Nastavení multimédií</string>
<string name="mpris_time_settings_title">Tlačítka vpřed/přetočit</string>
<string name="mpris_time_settings_summary">Upravit čas pro rychlý posun/přetočení při stisku</string>
<string-array name="mpris_time_entries">
<item>10 sekund</item>
<item>20 sekund</item>
@@ -139,6 +144,8 @@
<item>2 minuty</item>
</string-array>
<string name="mpris_notification_settings_title">Obrazit upozornění pro ovládání médií</string>
<string name="mpris_notification_settings_summary">Umožnit ovládání přehrávače médií bez otevření KDE Connect</string>
<string name="share_to">Sdílet s...</string>
<string name="protocol_version_older">Toto zařízení používá starou verzi protokolu</string>
<string name="protocol_version_newer">Toto zařízení používá novější verzi protokolu</string>
<string name="general_settings">Obecná nastavení</string>
@@ -152,6 +159,7 @@
<string name="pair_device_action">Spárovat nové zařízení</string>
<string name="unpair_device_action">Zrušit párování %s</string>
<string name="custom_device_list">Přidat zařízení podle IP</string>
<string name="delete_custom_device">Smazat %s?</string>
<string name="share_notification_preference">Hlasitá upozornění</string>
<string name="share_notification_preference_summary">Vibrovat a přehrát melodii při přijímání souboru</string>
<string name="share_destination_customize">Přizpůsobte si cílový adresář</string>
@@ -220,6 +228,10 @@
<string name="pref_plugin_mprisreceiver">Ovládání přehrávače médií</string>
<string name="pref_plugin_mprisreceiver_desc">Ovládejte přehrávače médií na vašem telefonu z jiného zařízení</string>
<string name="dark_theme">Tmavý motiv</string>
<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="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>
@@ -233,4 +245,13 @@
<string name="pref_plugin_systemvolume">Hlasitost systému</string>
<string name="pref_plugin_systemvolume_desc">Ovládejte hlasitost systému vzdáleného zařízení</string>
<string name="mute">Ztlumit</string>
<string name="all">Vše</string>
<string name="devices">Zařízení</string>
<string name="settings_rename">Název zařízení</string>
<string name="settings_dark_mode">Tmavý motiv</string>
<string name="settings_more_settings_title">Více nastavení</string>
<string name="settings_more_settings_text">Nastavení \"pro každé zařízení\" lze najít v \'Nastavení modulu\' v zařízení.</string>
<string name="setting_persistent_notification">Ukázat stálé upozornění</string>
<string name="setting_persistent_notification_oreo_description">Vyžadováno Androidem od verze 8.0</string>
<string name="setting_persistent_notification_pie_description">Od Androidu 9.0 lze toto upozornění minimalizovat pouze jeho dlouhým podržením</string>
</resources>

View File

@@ -1,6 +1,10 @@
<?xml version='1.0' encoding='utf-8'?>
<resources>
<string name="kde_connect">KDE-Connect</string>
<string name="foreground_notification_no_devices">Keine Verbindung zu einem Gerät</string>
<string name="foreground_notification_devices">Verbunden mit %s</string>
<string name="pref_plugin_telephony">Telefon-Benachrichtigung</string>
<string name="pref_plugin_telephony_desc">Benachrichtigungen über eingehende Anrufe senden</string>
<string name="pref_plugin_battery">Akkubericht</string>
<string name="pref_plugin_battery_desc">Akkustatus periodisch berichten</string>
<string name="pref_plugin_sftp">Dateisystem zeigen</string>
@@ -12,7 +16,8 @@
<string name="pref_plugin_mpris">Multimedia-Bedienung</string>
<string name="pref_plugin_mpris_desc">Eine Fernbedienung für Ihre Medienwiedergabe</string>
<string name="pref_plugin_runcommand">Befehl ausführen</string>
<string name="pref_plugin_runcommand_desc">Von Ihrem Telefon oder Tablet Befehle auf anderen Geräten ausführen</string>
<string name="pref_plugin_runcommand_desc">Von Ihrem Telefon oder Tablett Befehle auf anderen Geräten ausführen</string>
<string name="pref_plugin_contacts">Kontakte-Abgleich</string>
<string name="pref_plugin_ping">Ping</string>
<string name="pref_plugin_ping_desc">Senden und Empfangen von Pings</string>
<string name="pref_plugin_notifications">Benachrichtigungs-Abgleich</string>
@@ -33,6 +38,7 @@
<string name="mousepad_double_tap_settings_title">Aktionsausführung bei Berührung mit zwei Fingern einstellen</string>
<string name="mousepad_triple_tap_settings_title">Aktionsausführung bei Berührung mit drei Fingern einstellen</string>
<string name="mousepad_sensitivity_settings_title">Empfindlichkeit des Touchpads einstellen</string>
<string name="mousepad_acceleration_profile_settings_title">Zeigerbeschleunigung einstellen</string>
<string name="mousepad_scroll_direction_title">Bildlaufrichtung umkehren</string>
<string-array name="mousepad_tap_entries">
<item>Rechtsklick</item>
@@ -47,10 +53,10 @@
<item>Schnellste</item>
</string-array>
<string-array name="mousepad_acceleration_profile_entries">
<item>No Acceleration</item>
<item>Keine Beschleunigung</item>
<item>Weakest</item>
<item>Weaker</item>
<item>Medium</item>
<item>Mittel</item>
<item>Stronger</item>
<item>Strongest</item>
</string-array>
@@ -106,6 +112,7 @@
<string name="device">Gerät</string>
<string name="pair_device">Gerät verbinden</string>
<string name="remote_control">Fernbedienung</string>
<string name="settings">Einstellungen</string>
<string name="mpris_play">Wiedergabe</string>
<string name="mpris_pause">Anhalten</string>
<string name="mpris_previous">Zurück</string>
@@ -115,6 +122,7 @@
<string name="mpris_volume">Lautstärke</string>
<string name="mpris_settings">Multimedia-Einstellungen</string>
<string name="mpris_time_settings_title">Knöpfe Vorwärts/Rückwärts</string>
<string name="mpris_time_settings_summary">Sprungweite für Vorlauf/Rücklauf anpassen</string>
<string-array name="mpris_time_entries">
<item>10 Sekunden</item>
<item>20 Sekunden</item>
@@ -122,6 +130,7 @@
<item>1 Minute</item>
<item>2 Minuten</item>
</string-array>
<string name="share_to">Freigeben für ...</string>
<string name="protocol_version_older">Dieses Gerät verwendet ein alte Protokollversion</string>
<string name="protocol_version_newer">Dieses Gerät verwendet ein neuere Protokollversion</string>
<string name="general_settings">Allgemeine Einstellungen</string>
@@ -135,12 +144,15 @@
<string name="pair_device_action">Ein neues Gerät verbinden</string>
<string name="unpair_device_action">Verbindung %s trennen</string>
<string name="custom_device_list">Geräte nach IP-Adresse hinzufügen</string>
<string name="delete_custom_device">%s löschen?</string>
<string name="share_notification_preference">Ausführliche Benachrichtigungen</string>
<string name="share_notification_preference_summary">Beim Empfang einer Datei vibrieren und einen Sound abspielen</string>
<string name="share_destination_customize">Zielverzeichnis anpassen</string>
<string name="share_destination_customize_summary_disabled">Empfangene Dateien werden in Downloads gespeichert</string>
<string name="share_destination_customize_summary_enabled">Dateien werden im folgenden Verzeichnis gespeichert</string>
<string name="share_destination_folder_preference">Zielverzeichnis</string>
<string name="share">Freigeben</string>
<string name="share_received_file">%s freigeben</string>
<string name="title_activity_notification_filter">Benachrichtigungs-Filter</string>
<string name="filter_apps_info">Benachrichtigungen werden zwischen den ausgewählten Anwendungen abgeglichen.</string>
<string name="sftp_internal_storage">Interner Speicher</string>
@@ -169,6 +181,7 @@
<string name="plugin_not_supported">Dieses Modul wird durch das Gerät nicht unterstützt</string>
<string name="findmyphone_title">Mein Telefon suchen</string>
<string name="findmyphone_title_tablet">Mein Tablet suchen</string>
<string name="findmyphone_title_tv">Mein TV suchen</string>
<string name="findmyphone_description">Ruft dieses Gerät an, damit sie es finden können</string>
<string name="findmyphone_found">Gefunden</string>
<string name="open">Öffnen</string>
@@ -189,10 +202,25 @@
<string name="mpris_coverart_description">Cover des aktuellen Mediums</string>
<string name="device_icon_description">Gerätesymbol</string>
<string name="settings_icon_description">Einstellungssymbol</string>
<string name="presenter_fullscreen">Vollbild</string>
<string name="presenter_exit">Präsentation beenden</string>
<string name="add_command">Einen Befehl hinzufügen</string>
<string name="addcommand_explanation">Es sind keine Befehle registriert.</string>
<string name="addcommand_explanation2">Sie können neue Befehle in den Systemeinstellungen für KDE-Connect hinzufügen.</string>
<string name="add_command_description">Sie können Befehle auf der Arbeitsfläche hinzufügen</string>
<string name="pref_plugin_mprisreceiver">Steuerung für Medienwiedergabe</string>
<string name="dark_theme">Dunkles Design</string>
<string name="notification_channel_default">Andere Benachrichtigungen</string>
<string name="notification_channel_filetransfer">Dateiübertragung</string>
<string name="copy_url_to_clipboard">Adresse in die Zwischenablage kopieren</string>
<string name="clipboard_toast">In die Zwischenablage kopiert</string>
<string name="runcommand_notreachable">Das Gerät ist nicht erreichbar</string>
<string name="runcommand_notpaired">Das Gerät ist nicht verbunden</string>
<string name="runcommand_nosuchdevice">Ein solches Gerät existiert nicht</string>
<string name="mute">Stummschalten</string>
<string name="all">Alle</string>
<string name="devices">Geräte</string>
<string name="settings_rename">Gerätename</string>
<string name="settings_dark_mode">Dunkles Design</string>
<string name="settings_more_settings_title">Weitere Einstellungen</string>
</resources>

View File

@@ -1,5 +1,8 @@
<?xml version='1.0' encoding='utf-8'?>
<resources>
<string name="kde_connect">KDE Connect</string>
<string name="foreground_notification_no_devices">No conectado a ningún dispositivo</string>
<string name="foreground_notification_devices">Conectado a: %s</string>
<string name="pref_plugin_telephony">Notificador de telefonía</string>
<string name="pref_plugin_telephony_desc">Enviar notificaciones por llamadas entrantes</string>
<string name="pref_plugin_battery">Informe de la batería</string>
@@ -120,6 +123,7 @@
<string name="device">Dispositivo</string>
<string name="pair_device">Vincular dispositivo</string>
<string name="remote_control">Control remoto</string>
<string name="settings">Preferencias</string>
<string name="mpris_play">Reproducir</string>
<string name="mpris_pause">Pausar</string>
<string name="mpris_previous">Anterior</string>
@@ -139,6 +143,7 @@
</string-array>
<string name="mpris_notification_settings_title">Mostrar notificación del control de medios</string>
<string name="mpris_notification_settings_summary">Permite controlar sus reproductores de medios sin abrir KDE Connect</string>
<string name="share_to">Compartir con...</string>
<string name="protocol_version_older">Este dispositivo usa una versión antigua del protocolo</string>
<string name="protocol_version_newer">Este dispositivo usa una versión más reciente del protocolo</string>
<string name="general_settings">Preferencias generales</string>
@@ -152,6 +157,7 @@
<string name="pair_device_action">Vincular un nuevo dispositivo</string>
<string name="unpair_device_action">Desvincular %s</string>
<string name="custom_device_list">Añadir dispositivos por IP</string>
<string name="delete_custom_device">¿Borrar %s?</string>
<string name="share_notification_preference">Notificaciones ruidosas</string>
<string name="share_notification_preference_summary">Vibrar y reproducir un sonido cuando se reciba un archivo</string>
<string name="share_destination_customize">Personalizar directorio destino</string>
@@ -220,6 +226,10 @@
<string name="pref_plugin_mprisreceiver">Control del reproductor de medios</string>
<string name="pref_plugin_mprisreceiver_desc">Controle los reproductores de medios de sus teléfonos desde otro dispositivo</string>
<string name="dark_theme">Tema oscuro</string>
<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="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>
@@ -234,4 +244,12 @@
<string name="pref_plugin_systemvolume_desc">Controle el volumen del sistema del dispositivo remoto</string>
<string name="mute">Silenciar</string>
<string name="all">Todo</string>
<string name="devices">Dispositivos</string>
<string name="settings_rename">Nombre del dispositivo</string>
<string name="settings_dark_mode">Tema oscuro</string>
<string name="settings_more_settings_title">Más preferencias</string>
<string name="settings_more_settings_text">Las preferencias por dispositivo se pueden encontrar bajo «Preferencias del complemento» dentro de cada dispositivo.</string>
<string name="setting_persistent_notification">Mostrar notificación persistente</string>
<string name="setting_persistent_notification_oreo_description">Requerido por Android desde Android 8.0</string>
<string name="setting_persistent_notification_pie_description">A partir de Android 9.0, esta notificación solo se puede minimizar mediante una pulsación larga en ella.</string>
</resources>

View File

@@ -157,6 +157,7 @@
<string name="pair_device_action">Emparellar cun novo dispositivo</string>
<string name="unpair_device_action">Desemparellarse de %s</string>
<string name="custom_device_list">Engadir dispositivos por IP</string>
<string name="delete_custom_device">Eliminar %s?</string>
<string name="share_notification_preference">Notificacións sonoras</string>
<string name="share_notification_preference_summary">Vibrar e reproducir un son ao recibir un ficheiro.</string>
<string name="share_destination_customize">Personalizar o directorio de destino</string>

View File

@@ -10,7 +10,7 @@
<string name="pref_plugin_mousepad">Input jarak jauh</string>
<string name="pref_plugin_mousepad_desc">Gunakan telepon atau tabletmu sebagai touchpad dan keyboard</string>
<string name="pref_plugin_remotekeyboard">Terima penekanan tuts jarak jauh</string>
<string name="pref_plugin_remotekeyboard_desc">Terima perihal tekan-tuts dari perangkat jarak jauh</string>
<string name="pref_plugin_remotekeyboard_desc">Terima peristiwa tekan-tuts dari perangkat jarak jauh</string>
<string name="pref_plugin_mpris">Kendalikan multimedia</string>
<string name="pref_plugin_mpris_desc">Menyediakan sebuah kendali jarak jauh untuk player mediamu</string>
<string name="pref_plugin_runcommand">Jalankan Perintah</string>
@@ -189,8 +189,8 @@
<string name="no_permissions_storage">Kamu perlu mengabulkan perizinan untuk mengakses penyimpanan</string>
<string name="plugins_need_permission">Beberapa plugin perlu perizinan untuk kerja (ketuk untuk info selebihnya):</string>
<string name="permission_explanation">Plugin ini perlu perizinan untuk kerja</string>
<string name="optional_permission_explanation">Kamu perlu mengabulkan perizinan extra untuk mengaktifkan semua fungsian</string>
<string name="plugins_need_optional_permission">Beberapa plugin yang memiliki fitur dinonaktifkan karena kurangnya perizinan (ketuk untuk info selebihnya):</string>
<string name="optional_permission_explanation">Kamu perlu mengabulkan perizinan extra untuk memfungsikan semua fungsian</string>
<string name="plugins_need_optional_permission">Beberapa plugin yang memiliki fitur dinonfungsikan karena kurangnya perizinan (ketuk untuk info selebihnya):</string>
<string name="sftp_permission_explanation">Untuk mengakses filemu dari PC-mu si apl perlu perizinan untuk mengakses penyimpanan teleponmu</string>
<string name="share_optional_permission_explanation">Untuk membagikan file antara teleponmu dan desktopmu kamu harus memberikan akses ke penyimpanan teleponmu</string>
<string name="telepathy_permission_explanation">Untuk membaca dan menulis SMS dari desktopmu kamu harus memberikan perizinan untuk SMS</string>

View File

@@ -1,5 +1,8 @@
<?xml version='1.0' encoding='utf-8'?>
<resources>
<string name="kde_connect">KDE Connect</string>
<string name="foreground_notification_no_devices">Non connesso ad alcun dispositivo</string>
<string name="foreground_notification_devices">Connesso a: %s</string>
<string name="pref_plugin_telephony">Notifiche telefoniche</string>
<string name="pref_plugin_telephony_desc">Invia notifiche per le chiamate in ingresso</string>
<string name="pref_plugin_battery">Livello batteria</string>
@@ -120,6 +123,7 @@
<string name="device">Dispositivo</string>
<string name="pair_device">Associa dispositivo</string>
<string name="remote_control">Telecomando</string>
<string name="settings">Impostazioni</string>
<string name="mpris_play">Riproduci</string>
<string name="mpris_pause">Pausa</string>
<string name="mpris_previous">Precedente</string>
@@ -139,6 +143,7 @@
</string-array>
<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>
<string name="protocol_version_older">Questo dispositivo usa una vecchia versione del protocollo di rete</string>
<string name="protocol_version_newer">Questo dispositivo usa una nuova versione del protocollo di rete</string>
<string name="general_settings">Impostazioni generali</string>
@@ -152,6 +157,7 @@
<string name="pair_device_action">Associa un nuovo dispositivo</string>
<string name="unpair_device_action">Disassocia %s</string>
<string name="custom_device_list">Aggiungi dispositivi per IP</string>
<string name="delete_custom_device">Vuoi eliminare %s?</string>
<string name="share_notification_preference">Notifiche rumorose</string>
<string name="share_notification_preference_summary">Vibra e riproduci un suono alla ricezione di un file</string>
<string name="share_destination_customize">Personalizza la cartella di destinazione</string>
@@ -220,6 +226,10 @@
<string name="pref_plugin_mprisreceiver">Controllo lettore multimediale</string>
<string name="pref_plugin_mprisreceiver_desc">Controlla i lettori multimediali del tuo telefono da un altro dispositivo</string>
<string name="dark_theme">Tema scuro</string>
<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="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>
@@ -234,4 +244,12 @@
<string name="pref_plugin_systemvolume_desc">Controlla il volume di sistema dal dispositivo remoto</string>
<string name="mute">Silenzia</string>
<string name="all">Tutto</string>
<string name="devices">Dispositivi</string>
<string name="settings_rename">Nome dispositivo</string>
<string name="settings_dark_mode">Tema scuro</string>
<string name="settings_more_settings_title">Altre impostazioni</string>
<string name="settings_more_settings_text">Le impostazioni per dispositivo sono disponibili sotto «Impostazione estensioni» dall\'interno del dispositivo.</string>
<string name="setting_persistent_notification">Mostra notifica persistente</string>
<string name="setting_persistent_notification_oreo_description">Richiesto da Android a partire da Android 8.0</string>
<string name="setting_persistent_notification_pie_description">Da Android 9.0, questa notifica potrà essere minimizzata solo con un tocco lungo</string>
</resources>

View File

@@ -98,7 +98,7 @@
<string name="received_url_text">Tap om \'%1s\' te openen</string>
<string name="incoming_file_title">Inkomend bestand van %1s</string>
<string name="incoming_file_text">%1s</string>
<string name="outgoing_file_title">Bezig bestand te verzenden naar %1s</string>
<string name="outgoing_file_title">Bestand wordt verzonden naar %1s</string>
<string name="outgoing_files_title">Bezig bestanden te verzenden naar %1s</string>
<plurals name="outgoing_files_text">
<item quantity="one">Bestand %1$d verzenden</item>
@@ -157,6 +157,7 @@
<string name="pair_device_action">Een paar maken met een nieuw apparaat</string>
<string name="unpair_device_action">Paar %s uit elkaar halen</string>
<string name="custom_device_list">Voeg apparaten toe per IP-adres</string>
<string name="delete_custom_device">%s verwijderen?</string>
<string name="share_notification_preference">Luidruchtige meldingen</string>
<string name="share_notification_preference_summary">Vibreer en speel een geluidje bij ontvangen van een bestand</string>
<string name="share_destination_customize">De bestemmingsmap aanpassen</string>

View File

@@ -1,5 +1,8 @@
<?xml version='1.0' encoding='utf-8'?>
<resources>
<string name="kde_connect">KDE Connect</string>
<string name="foreground_notification_no_devices">Ikkje tilkopla ei eining</string>
<string name="foreground_notification_devices">Kopla til: %s</string>
<string name="pref_plugin_telephony">Telefonvarsling</string>
<string name="pref_plugin_telephony_desc">Send varsling ved oppringing</string>
<string name="pref_plugin_battery">Batterirapport</string>
@@ -120,6 +123,7 @@
<string name="device">Eining</string>
<string name="pair_device">Par ny eining</string>
<string name="remote_control">Fjernstyring</string>
<string name="settings">Innstillingar</string>
<string name="mpris_play">Spel</string>
<string name="mpris_pause">Pause</string>
<string name="mpris_previous">Førre</string>
@@ -129,6 +133,7 @@
<string name="mpris_volume">Lydstyrke</string>
<string name="mpris_settings">Medieinnstillingar</string>
<string name="mpris_time_settings_title">Spoleknappar</string>
<string name="mpris_time_settings_summary">Juster tida for spoling ved trykking</string>
<string-array name="mpris_time_entries">
<item>10 sekund</item>
<item>20 sekund</item>
@@ -137,6 +142,8 @@
<item>2 minutt</item>
</string-array>
<string name="mpris_notification_settings_title">Vis varsling med avspelingskontrollar</string>
<string name="mpris_notification_settings_summary">Tillat å kontrollera mediespelarar utan å opna KDE Connect</string>
<string name="share_to">Del til </string>
<string name="protocol_version_older">Denne eininga brukar ein gammal protokollversjon</string>
<string name="protocol_version_newer">Denne eininga brukar ein nyare protokollversjon</string>
<string name="general_settings">Generelle innstillingar</string>
@@ -150,6 +157,7 @@
<string name="pair_device_action">Par ny eining</string>
<string name="unpair_device_action">Løys paring for %s</string>
<string name="custom_device_list">Legg til eining basert på IP</string>
<string name="delete_custom_device">Vil du sletta %s?</string>
<string name="share_notification_preference">Lydvarsling</string>
<string name="share_notification_preference_summary">Vibrer og spel ein lyd ved mottak av fil</string>
<string name="share_destination_customize">Sjølvvald målmappe</string>
@@ -169,11 +177,11 @@
<string name="add_host">Legg til vert/IP</string>
<string name="add_host_hint">Vertsnamn/IP-adresse</string>
<string name="no_players_connected">Fann ingen spelarar</string>
<string name="custom_dev_list_help">Bruk berre dette valet viss eininga ikkje vert kjend att automatisk. Skriv inn IP-adressa eller vertsnamnet nedanfor, og trykk på knappen for å leggja eininga til oversikta. Trykk på element i oversikta for å fjerna dei.</string>
<string name="custom_dev_list_help">Bruk berre dette valet viss eininga ikkje vert kjend att automatisk. Skriv inn IP-adressa eller vertsnamnet nedanfor, og trykk på knappen for å leggja til eininga. Trykk på oppføringar i lista for å fjerna dei.</string>
<string name="mpris_player_on_device">%1$s på %2$s</string>
<string name="send_files">Send filer</string>
<string name="pairing_title">KDE Connect-einingar</string>
<string name="pairing_description">Andre einingar i nettverket som køyrer KDE Connect vil dukka opp her.</string>
<string name="pairing_description">Andre einingar i nettverket som køyrer KDE Connect, vil dukka opp her.</string>
<string name="device_paired">Eininga er para</string>
<string name="device_rename_title">Endra namn på eining</string>
<string name="device_rename_confirm">Endra namn</string>
@@ -218,6 +226,10 @@
<string name="pref_plugin_mprisreceiver">Mediespelarkontrollar</string>
<string name="pref_plugin_mprisreceiver_desc">Kontroller mediespelarar på telefonen din frå ei anna eining</string>
<string name="dark_theme">Mørkt tema</string>
<string name="notification_channel_default">Andre varslingar</string>
<string name="notification_channel_persistent">Evigvarande varslingar</string>
<string name="notification_channel_media_control">Mediestyring</string>
<string name="notification_channel_filetransfer">Filoverføring</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>
@@ -231,4 +243,13 @@
<string name="pref_plugin_systemvolume">Systemlydstyrke</string>
<string name="pref_plugin_systemvolume_desc">Juster systemlydstyrken til ekstern eining</string>
<string name="mute">Demp lyd</string>
<string name="all">Alle</string>
<string name="devices">Einingar</string>
<string name="settings_rename">Einingsnamn</string>
<string name="settings_dark_mode">Mørkt tema</string>
<string name="settings_more_settings_title">Fleire innstillingar</string>
<string name="settings_more_settings_text">Innstillingar for einskildeiningar finn du under «Programtillegg-oppsett» på kvar eining.</string>
<string name="setting_persistent_notification">Vis evigvarande varsling</string>
<string name="setting_persistent_notification_oreo_description">Påkravd av Android frå og med versjon 8.0</string>
<string name="setting_persistent_notification_pie_description">Frå og med Android 9.0 kan du berre fjerna denne varslinga ved å trykkja lenge på ho</string>
</resources>

View File

@@ -157,6 +157,7 @@
<string name="pair_device_action">Emparelhar um novo dispositivo</string>
<string name="unpair_device_action">Desemparelhar o %s</string>
<string name="custom_device_list">Adicionar dispositivos pelo IP</string>
<string name="delete_custom_device">Apagar o %s?</string>
<string name="share_notification_preference">Notificações com ruído</string>
<string name="share_notification_preference_summary">Vibrar e tocar um som ao receber um ficheiro</string>
<string name="share_destination_customize">Personalizar a pasta de destino</string>

View File

@@ -108,7 +108,6 @@
<string name="device">Уређај</string>
<string name="pair_device">Упари уређај</string>
<string name="remote_control">Даљинско управљање</string>
<string name="settings">Поставке за КДЕ‑конекцију</string>
<string name="mpris_play">Пусти</string>
<string name="mpris_previous">Претходно</string>
<string name="mpris_rew">Премотај</string>
@@ -124,7 +123,6 @@
<item>1 минут</item>
<item>2 минута</item>
</string-array>
<string name="share_to">Дели...</string>
<string name="protocol_version_older">Овај уређај користи стару верзију протокола</string>
<string name="protocol_version_newer">Овај уређај користи новију верзију протокола</string>
<string name="general_settings">Опште поставке</string>

View File

@@ -157,6 +157,7 @@
<string name="pair_device_action">Para ihop med ny apparat</string>
<string name="unpair_device_action">Ta bort ihopparning %s</string>
<string name="custom_device_list">Lägg till apparater enligt IP-adress</string>
<string name="delete_custom_device">Ta bort %s?</string>
<string name="share_notification_preference">Ljudliga underrättelser</string>
<string name="share_notification_preference_summary">Vibrera och spela ett ljud när en fil tas emot</string>
<string name="share_destination_customize">Anpassa målkatalog</string>

View File

@@ -159,6 +159,7 @@
<string name="pair_device_action">Пов’язати новий пристрій</string>
<string name="unpair_device_action">Розірвати прив’язку %s</string>
<string name="custom_device_list">Додати пристрої за IP</string>
<string name="delete_custom_device">Вилучити %s?</string>
<string name="share_notification_preference">Звукові сповіщення</string>
<string name="share_notification_preference_summary">Вібрація і відтворення звуку у відповідь на отримання файла</string>
<string name="share_destination_customize">Налаштування каталогу призначення</string>

View File

@@ -1,5 +1,8 @@
<?xml version='1.0' encoding='utf-8'?>
<resources>
<string name="kde_connect">KDE Connect</string>
<string name="foreground_notification_no_devices">没有连接到任何设备</string>
<string name="foreground_notification_devices">已连接到:%s</string>
<string name="pref_plugin_telephony">电话通知</string>
<string name="pref_plugin_telephony_desc">发送来电通知</string>
<string name="pref_plugin_battery">电池报告</string>
@@ -119,6 +122,7 @@
<string name="device">设备</string>
<string name="pair_device">进行配对</string>
<string name="remote_control">远程控制</string>
<string name="settings">设置</string>
<string name="mpris_play">播放</string>
<string name="mpris_pause">Pause</string>
<string name="mpris_previous">前一个</string>
@@ -138,6 +142,7 @@
</string-array>
<string name="mpris_notification_settings_title">显示媒体控制通知部件</string>
<string name="mpris_notification_settings_summary">允许在不用打开 KDE 连接的情况下控制媒体播放器</string>
<string name="share_to">分享到...</string>
<string name="protocol_version_older">该设备使用旧版本的协议</string>
<string name="protocol_version_newer">该设备使用较新版本的协议</string>
<string name="general_settings">常规设置</string>
@@ -219,6 +224,10 @@
<string name="pref_plugin_mprisreceiver">控制媒体播放器</string>
<string name="pref_plugin_mprisreceiver_desc">从其他设备控制您手机的媒体播放器</string>
<string name="dark_theme">暗色主题</string>
<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="mpris_stop">停止但前播放器</string>
<string name="copy_url_to_clipboard">复制 URL 到剪贴板</string>
<string name="clipboard_toast">已复制到剪贴板</string>
@@ -232,4 +241,13 @@
<string name="pref_plugin_systemvolume">系统音量</string>
<string name="pref_plugin_systemvolume_desc">在远程设备上控制系统音量</string>
<string name="mute">静音</string>
<string name="all">全部</string>
<string name="devices">设备</string>
<string name="settings_rename">设备名</string>
<string name="settings_dark_mode">暗色主题</string>
<string name="settings_more_settings_title">更多设置</string>
<string name="settings_more_settings_text">每个设备的独立设置可以在设备页内的“插件设置”下找到。</string>
<string name="setting_persistent_notification">启用常驻通知栏</string>
<string name="setting_persistent_notification_oreo_description">Android 8.0 以及以上必须启用</string>
<string name="setting_persistent_notification_pie_description">Android 9.0 之后只能通过长按通知项最小化持久性通知</string>
</resources>

View File

@@ -198,6 +198,7 @@
<string name="pair_device_action">Pair a new device</string>
<string name="unpair_device_action">Unpair %s</string>
<string name="custom_device_list">Add devices by IP</string>
<string name="delete_custom_device">Delete %s?</string>
<string name="share_notification_preference">Noisy notifications</string>
<string name="share_notification_preference_summary">Vibrate and play a sound when receiving a file</string>
<string name="share_destination_customize">Customize destination directory</string>

View File

@@ -150,7 +150,7 @@ public class LanLink extends BaseLink {
//Prepare socket for the payload
final ServerSocket server;
if (np.hasPayload()) {
if (np.hasPayload() && np.getPayloadSize() != 0) {
server = LanLinkProvider.openServerSocketOnFreePort(LanLinkProvider.PAYLOAD_TRANSFER_MIN_PORT);
JSONObject payloadTransferInfo = new JSONObject();
payloadTransferInfo.put("port", server.getLocalPort());

View File

@@ -28,6 +28,7 @@ import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.content.SharedPreferences;
import android.net.ConnectivityManager;
import android.os.Binder;
import android.os.Build;
import android.os.IBinder;
@@ -37,7 +38,6 @@ import android.util.Log;
import org.kde.kdeconnect.Backends.BaseLink;
import org.kde.kdeconnect.Backends.BaseLinkProvider;
//import org.kde.kdeconnect.Backends.BluetoothBackend.BluetoothLinkProvider;
import org.kde.kdeconnect.Backends.LanBackend.LanLinkProvider;
import org.kde.kdeconnect.Helpers.NotificationHelper;
import org.kde.kdeconnect.Helpers.SecurityHelpers.RsaHelper;
@@ -53,6 +53,8 @@ import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
//import org.kde.kdeconnect.Backends.BluetoothBackend.BluetoothLinkProvider;
public class BackgroundService extends Service {
private static final int FOREGROUND_NOTIFICATION_ID = 1;
@@ -273,6 +275,10 @@ public class BackgroundService extends Service {
// Register screen on listener
IntentFilter filter = new IntentFilter(Intent.ACTION_SCREEN_ON);
// See: https://developer.android.com/reference/android/net/ConnectivityManager.html#CONNECTIVITY_ACTION
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
filter.addAction(ConnectivityManager.CONNECTIVITY_ACTION);
}
registerReceiver(new KdeConnectBroadcastReceiver(), filter);
Log.i("KDE/BackgroundService", "Service not started yet, initializing...");

View File

@@ -27,6 +27,7 @@ import android.net.Uri;
import android.os.Build;
import android.os.Looper;
import android.provider.Telephony;
import android.support.annotation.Nullable;
import android.support.annotation.RequiresApi;
import android.util.Log;
@@ -113,39 +114,66 @@ public class SMSHelper {
}
/**
* Get all messages matching the passed filter. See documentation for Android's ContentResolver
* Gets Messages for caller functions, such as: getMessagesWithFilter() and getConversations()
*
* @param Uri Uri indicating the messages database to read
* @param context android.content.Context running the request.
* @param selection Parameterizable filter to use with the ContentResolver query. May be null.
* @param selectionArgs Parameters for selection. May be null.
* @return List of messages matching the filter
* @return Returns HashMap<ThreadID, List<Message>>, which is transformed in caller functions into other classes.
*/
private static List<Message> getMessagesWithFilter(Context context, String selection, String[] selectionArgs) {
List<Message> toReturn = new ArrayList<>();
Uri smsUri = getSMSUri();
try (Cursor smsCursor = context.getContentResolver().query(
smsUri,
private static HashMap<ThreadID, List<Message>> getMessages(Uri Uri,
Context context,
String selection,
String[] selectionArgs) {
HashMap<ThreadID, List<Message>> toReturn = new HashMap<>();
try (Cursor myCursor = context.getContentResolver().query(
Uri,
Message.smsColumns,
selection,
selectionArgs,
null)
) {
if (smsCursor != null && smsCursor.moveToFirst()) {
if (myCursor != null && myCursor.moveToFirst()) {
int threadColumn = myCursor.getColumnIndexOrThrow(ThreadID.lookupColumn);
do {
HashMap<String, String> messageInfo = new HashMap<>();
for (int columnIdx = 0; columnIdx < smsCursor.getColumnCount(); columnIdx++) {
String colName = smsCursor.getColumnName(columnIdx);
String body = smsCursor.getString(columnIdx);
for (int columnIdx = 0; columnIdx < myCursor.getColumnCount(); columnIdx++) {
String colName = myCursor.getColumnName(columnIdx);
String body = myCursor.getString(columnIdx);
messageInfo.put(colName, body);
}
toReturn.add(new Message(messageInfo));
} while (smsCursor.moveToNext());
Message message = new Message(messageInfo);
ThreadID threadID = new ThreadID(message.m_threadID);
if (!toReturn.containsKey(threadID)) {
toReturn.put(threadID, new ArrayList<Message>());
}
toReturn.get(threadID).add(message);
} while (myCursor.moveToNext());
} else {
// No SMSes available?
// No conversations or SMSes available?
}
}
return toReturn;
}
/**
* Get all messages matching the passed filter. See documentation for Android's ContentResolver
*
* @param context android.content.Context running the request
* @param selection Parameterizable filter to use with the ContentResolver query. May be null.
* @param selectionArgs Parameters for selection. May be null.
* @return List of messages matching the filter
*/
private static List<Message> getMessagesWithFilter(Context context, String selection, String[] selectionArgs) {
HashMap<ThreadID, List<Message>> result = getMessages(SMSHelper.getSMSUri(), context, selection, selectionArgs);
List<Message> toReturn = new ArrayList<>();
for(Map.Entry<ThreadID, List<Message>> entry : result.entrySet()) {
toReturn.addAll(entry.getValue());
}
return toReturn;
}
@@ -157,35 +185,15 @@ public class SMSHelper {
* @return Mapping of thread_id to the first message in each thread
*/
public static Map<ThreadID, Message> getConversations(Context context) {
HashMap<ThreadID, List<Message>> result = getMessages(SMSHelper.getConversationUri(), context, null, null);
HashMap<ThreadID, Message> toReturn = new HashMap<>();
Uri conversationUri = getConversationUri();
for(Map.Entry<ThreadID, List<Message>> entry : result.entrySet()) {
ThreadID returnThreadID = entry.getKey();
List<Message> messages = entry.getValue();
try (Cursor conversationsCursor = context.getContentResolver().query(
conversationUri,
Message.smsColumns,
null,
null,
null)
) {
if (conversationsCursor != null && conversationsCursor.moveToFirst()) {
int threadColumn = conversationsCursor.getColumnIndexOrThrow(ThreadID.lookupColumn);
do {
int thread = conversationsCursor.getInt(threadColumn);
HashMap<String, String> messageInfo = new HashMap<>();
for (int columnIdx = 0; columnIdx < conversationsCursor.getColumnCount(); columnIdx++) {
String colName = conversationsCursor.getColumnName(columnIdx);
String body = conversationsCursor.getString(columnIdx);
messageInfo.put(colName, body);
}
toReturn.put(new ThreadID(thread), new Message(messageInfo));
} while (conversationsCursor.moveToNext());
} else {
// No conversations available?
}
toReturn.put(returnThreadID, messages.get(0));
}
return toReturn;
}
@@ -253,6 +261,14 @@ public class SMSHelper {
static final String THREAD_ID = ThreadID.lookupColumn; // Magic number which binds (message) threads
static final String U_ID = Telephony.Sms._ID; // Something which uniquely identifies this message
/**
* Event flags
* A message should have a bitwise-or of event flags before delivering the packet
* Any events not supported by the receiving device should be ignored
*/
public static final int TEXT_MESSAGE = 0x1; // This message has a "body" field which contains
// pure, human-readable text
/**
* Define the columns which are to be extracted from the Android SMS database
*/
@@ -364,4 +380,3 @@ public class SMSHelper {
}
}
}

View File

@@ -211,15 +211,11 @@ public class SslHelper {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
supportedCiphers.add("TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384"); // API 20+
supportedCiphers.add("TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256"); // API 20+
supportedCiphers.add("TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA"); // API 11+
} else {
supportedCiphers.add("TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA"); // API 11+
supportedCiphers.add("SSL_RSA_WITH_RC4_128_SHA"); // API 9+
supportedCiphers.add("SSL_RSA_WITH_RC4_128_MD5"); // API 9+
}
supportedCiphers.add("TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA"); // API 11+
socket.setEnabledCipherSuites(supportedCiphers.toArray(new String[0]));
socket.setSoTimeout(1000);
socket.setSoTimeout(10000);
if (isClient) {
socket.setUseClientMode(true);

View File

@@ -146,6 +146,11 @@ public class KeyListenerView extends View {
np.set("shift", true);
}
if (event.isMetaPressed()) {
np.set("super", true);
modifier = true;
}
int specialKey = SpecialKeysMap.get(keyCode, -1);
if (specialKey != -1) {

View File

@@ -55,7 +55,9 @@ import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.Arrays;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;
@TargetApi(Build.VERSION_CODES.JELLY_BEAN_MR2)
public class NotificationsPlugin extends Plugin implements NotificationReceiver.NotificationListener {
@@ -66,6 +68,7 @@ public class NotificationsPlugin extends Plugin implements NotificationReceiver.
private AppDatabase appDatabase;
private Set<String> currentNotifications;
private Map<String, RepliableNotification> pendingIntents;
private boolean serviceReady;
@@ -105,6 +108,7 @@ public class NotificationsPlugin extends Plugin implements NotificationReceiver.
if (!hasPermission()) return false;
pendingIntents = new HashMap<>();
currentNotifications = new HashSet<>();
appDatabase = new AppDatabase(context, true);
@@ -145,6 +149,7 @@ public class NotificationsPlugin extends Plugin implements NotificationReceiver.
np.set("id", id);
np.set("isCancel", true);
device.sendPacket(np);
currentNotifications.remove(id);
}
@Override
@@ -197,39 +202,46 @@ public class NotificationsPlugin extends Plugin implements NotificationReceiver.
np.set("requestAnswer", true); //For compatibility with old desktop versions of KDE Connect that don't support "silent"
}
try {
Bitmap appIcon = null;
Context foreignContext = context.createPackageContext(statusBarNotification.getPackageName(), 0);
if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.M) {
appIcon = iconToBitmap(foreignContext, notification.getLargeIcon());
} else {
appIcon = notification.largeIcon;
}
//appIcon = drawableToBitmap(context.getResources().getDrawable(R.drawable.icon));
if (appIcon == null) {
boolean isUpdate = currentNotifications.contains(key);
if (!isUpdate) {
//If it's an update, the other end should have the icon already: no need to extract it and create the payload again
try {
Bitmap appIcon = null;
Context foreignContext = context.createPackageContext(statusBarNotification.getPackageName(), 0);
if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.M) {
appIcon = iconToBitmap(foreignContext, notification.getSmallIcon());
appIcon = iconToBitmap(foreignContext, notification.getLargeIcon());
} else {
PackageManager pm = context.getPackageManager();
Resources foreignResources = pm.getResourcesForApplication(statusBarNotification.getPackageName());
Drawable foreignIcon = foreignResources.getDrawable(notification.icon);
appIcon = drawableToBitmap(foreignIcon);
appIcon = notification.largeIcon;
}
//appIcon = drawableToBitmap(context.getResources().getDrawable(R.drawable.icon));
if (appIcon == null) {
if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.M) {
appIcon = iconToBitmap(foreignContext, notification.getSmallIcon());
} else {
PackageManager pm = context.getPackageManager();
Resources foreignResources = pm.getResourcesForApplication(statusBarNotification.getPackageName());
Drawable foreignIcon = foreignResources.getDrawable(notification.icon);
appIcon = drawableToBitmap(foreignIcon);
}
}
if (appIcon != null) {
ByteArrayOutputStream outStream = new ByteArrayOutputStream();
appIcon.compress(Bitmap.CompressFormat.PNG, 90, outStream);
byte[] bitmapData = outStream.toByteArray();
Log.e("PAYLOAD", "PAYLOAD: " + getChecksum(bitmapData));
np.setPayload(bitmapData);
np.set("payloadHash", getChecksum(bitmapData));
}
} catch (Exception e) {
e.printStackTrace();
Log.e("NotificationsPlugin", "Error retrieving icon");
}
if (appIcon != null) {
ByteArrayOutputStream outStream = new ByteArrayOutputStream();
appIcon.compress(Bitmap.CompressFormat.PNG, 90, outStream);
byte[] bitmapData = outStream.toByteArray();
np.setPayload(bitmapData);
np.set("payloadHash", getChecksum(bitmapData));
}
} catch (Exception e) {
e.printStackTrace();
Log.e("NotificationsPlugin", "Error retrieving icon");
} else {
currentNotifications.add(key);
}
RepliableNotification rn = extractRepliableNotification(statusBarNotification);
@@ -247,6 +259,7 @@ public class NotificationsPlugin extends Plugin implements NotificationReceiver.
np.set("time", Long.toString(statusBarNotification.getPostTime()));
device.sendPacket(np);
}
private Bitmap drawableToBitmap(Drawable drawable) {
@@ -339,8 +352,6 @@ public class NotificationsPlugin extends Plugin implements NotificationReceiver.
}
}
//TODO Add compat for under Kitkat devices
return title;
}
@@ -350,21 +361,16 @@ public class NotificationsPlugin extends Plugin implements NotificationReceiver.
if (statusBarNotification != null) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
try {
Boolean reply = false;
//works for WhatsApp, but not for Telegram
if (statusBarNotification.getNotification().actions != null) {
for (Notification.Action act : statusBarNotification.getNotification().actions) {
if (act != null && act.getRemoteInputs() != null) {
// Is a reply
repliableNotification.remoteInputs.addAll(Arrays.asList(act.getRemoteInputs()));
repliableNotification.pendingIntent = act.actionIntent;
reply = true;
break;
}
}
repliableNotification.packageName = statusBarNotification.getPackageName();
repliableNotification.tag = statusBarNotification.getTag();//TODO find how to pass Tag with sending PendingIntent, might fix Hangout problem
}
} catch (Exception e) {
@@ -394,8 +400,6 @@ public class NotificationsPlugin extends Plugin implements NotificationReceiver.
}
}
//TODO Add compat for under Kitkat devices
return text;
}
@@ -469,12 +473,11 @@ public class NotificationsPlugin extends Plugin implements NotificationReceiver.
}
} else if (np.has("cancel")) {
final String dismissedId = np.getString("cancel");
currentNotifications.remove(dismissedId);
NotificationReceiver.RunCommand(context, service -> {
String dismissedId = np.getString("cancel");
cancelNotificationCompat(service, dismissedId);
});
} else if (np.has("requestReplyId") && np.has("message")) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT_WATCH) {
@@ -521,7 +524,7 @@ public class NotificationsPlugin extends Plugin implements NotificationReceiver.
} else {
int first = compatKey.indexOf(':');
if (first == -1) {
Log.e("cancelNotificationCompa", "Not formated like a notification key: " + compatKey);
Log.e("cancelNotificationCompa", "Not formatted like a notification key: " + compatKey);
return;
}
int last = compatKey.lastIndexOf(':');

View File

@@ -67,12 +67,16 @@ public class SMSPlugin extends Plugin {
* <p>
* For example:
* { "messages" : [
* { "event" : "sms",
* "messageBody" : "Hello",
* "phoneNumber" : "2021234567",
* "messageDate" : "1518846484880",
* "messageType" : "2",
* "threadID" : "132"
* { "event" : 1, // 32-bit field containing a bitwise-or of event flags
* // See constants declared in SMSHelper.Message for defined
* // values and explanations
* "body" : "Hello", // Text message body
* "address" : "2021234567", // Sending or receiving address of the message
* "date" : "1518846484880", // Timestamp of the message
* "type" : "2", // Compare with Android's
* // Telephony.TextBasedSmsColumns.MESSAGE_TYPE_*
* "thread_id" : "132" // Thread to which the message belongs
* "read" : true // Boolean representing whether a message is read or unread
* },
* { ... },
* ...
@@ -340,7 +344,7 @@ public class SMSPlugin extends Plugin {
try {
JSONObject json = message.toJSONObject();
json.put("event", "sms");
json.put("event", SMSHelper.Message.TEXT_MESSAGE);
body.put(json);
} catch (JSONException e) {

View File

@@ -21,6 +21,7 @@
package org.kde.kdeconnect.Plugins.SftpPlugin;
import android.Manifest;
import android.os.Build;
import android.os.Environment;
import org.kde.kdeconnect.Helpers.StorageHelper;
@@ -136,7 +137,11 @@ public class SftpPlugin extends Plugin {
@Override
public String[] getRequiredPermissions() {
return new String[]{Manifest.permission.READ_EXTERNAL_STORAGE};
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) {
return new String[]{Manifest.permission.READ_EXTERNAL_STORAGE};
} else {
return new String[0];
}
}
@Override

View File

@@ -42,6 +42,7 @@ class NotificationUpdateCallback extends Device.SendPacketStatusCallback {
builder = new NotificationCompat.Builder(context, NotificationHelper.Channels.FILETRANSFER)
.setSmallIcon(android.R.drawable.stat_sys_upload)
.setAutoCancel(true)
.setOngoing(true)
.setProgress(100, 0, false)
.setContentTitle(title)
.setTicker(title);

View File

@@ -39,18 +39,20 @@ import org.kde.kdeconnect.Helpers.NotificationHelper;
import org.kde.kdeconnect_tp.R;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
class ShareNotification {
private final String filename;
private final NotificationManager notificationManager;
private final int notificationId;
private NotificationCompat.Builder builder;
private final Device device;
//https://documentation.onesignal.com/docs/android-customizations#section-big-picture
private static final int bigImageWidth = 1440;
private static final int bigImageHeight = 720;
public ShareNotification(Device device, String filename) {
this.device = device;
this.filename = filename;
@@ -70,6 +72,10 @@ class ShareNotification {
NotificationHelper.notifyCompat(notificationManager, notificationId, builder.build());
}
public void cancel() {
notificationManager.cancel(notificationId);
}
public int getId() {
return notificationId;
}
@@ -106,8 +112,18 @@ class ShareNotification {
//If it's an image, try to show it in the notification
if (mimeType.startsWith("image/")) {
try (InputStream inputStream = device.getContext().getContentResolver().openInputStream(destinationUri)) {
Bitmap image = BitmapFactory.decodeStream(inputStream);
//https://developer.android.com/topic/performance/graphics/load-bitmap
final BitmapFactory.Options options = new BitmapFactory.Options();
options.inJustDecodeBounds = true;
try (InputStream decodeBoundsInputStream = device.getContext().getContentResolver().openInputStream(destinationUri);
InputStream decodeInputStream = device.getContext().getContentResolver().openInputStream(destinationUri)) {
BitmapFactory.decodeStream(decodeBoundsInputStream, null, options);
options.inJustDecodeBounds = false;
options.inSampleSize = calculateInSampleSize(options, bigImageWidth, bigImageHeight);
Bitmap image = BitmapFactory.decodeStream(decodeInputStream, null, options);
if (image != null) {
builder.setLargeIcon(image);
builder.setStyle(new NotificationCompat.BigPictureStyle()
@@ -116,6 +132,7 @@ class ShareNotification {
} catch (IOException ignored) {
}
}
if (!"file".equals(destinationUri.getScheme())) {
return;
}
@@ -150,10 +167,26 @@ class ShareNotification {
shareIntent = Intent.createChooser(shareIntent,
device.getContext().getString(R.string.share_received_file, destinationUri.getLastPathSegment()));
PendingIntent sharePendingIntent = PendingIntent.getActivity(device.getContext(), 0,
PendingIntent sharePendingIntent = PendingIntent.getActivity(device.getContext(), (int) System.currentTimeMillis(),
shareIntent, PendingIntent.FLAG_UPDATE_CURRENT);
NotificationCompat.Action.Builder shareAction = new NotificationCompat.Action.Builder(
R.drawable.ic_share_white, device.getContext().getString(R.string.share), sharePendingIntent);
builder.addAction(shareAction.build());
}
private int calculateInSampleSize(BitmapFactory.Options options, int targetWidth, int targetHeight) {
int inSampleSize = 1;
if (options.outHeight > targetHeight || options.outWidth > targetWidth) {
final int halfHeight = options.outHeight / 2;
final int halfWidth = options.outWidth / 2;
while ((halfHeight / inSampleSize) >= targetHeight
&& (halfWidth / inSampleSize) >= targetWidth) {
inSampleSize *= 2;
}
}
return inSampleSize;
}
}

View File

@@ -34,10 +34,12 @@ import android.content.res.Resources;
import android.database.Cursor;
import android.graphics.drawable.Drawable;
import android.net.Uri;
import android.os.Build;
import android.os.Bundle;
import android.provider.MediaStore;
import android.support.v4.app.NotificationCompat;
import android.support.v4.content.ContextCompat;
import android.support.v4.content.FileProvider;
import android.support.v4.provider.DocumentFile;
import android.util.Log;
import android.widget.Toast;
@@ -187,12 +189,19 @@ public class SharePlugin extends Plugin {
final long fileLength = np.getPayloadSize();
final String originalFilename = np.getString("filename", Long.toString(System.currentTimeMillis()));
String filename = originalFilename;
final DocumentFile destinationFolderDocument;
//We need to check for already existing files only when storing in the default path.
//User-defined paths use the new Storage Access Framework that already handles this.
final boolean customDestination = ShareSettingsActivity.isCustomDestinationEnabled(context);
final String defaultPath = ShareSettingsActivity.getDefaultDestinationDirectory().getAbsolutePath();
final String filename = customDestination ? originalFilename : FilesHelper.findNonExistingNameForNewFile(defaultPath, originalFilename);
//If the file should be opened immediately store it in the standard location to avoid the FileProvider trouble (See ShareNotification::setURI)
if (np.getBoolean("open") || !ShareSettingsActivity.isCustomDestinationEnabled(context)) {
final String defaultPath = ShareSettingsActivity.getDefaultDestinationDirectory().getAbsolutePath();
filename = FilesHelper.findNonExistingNameForNewFile(defaultPath, originalFilename);
destinationFolderDocument = DocumentFile.fromFile(new File(defaultPath));
} else {
destinationFolderDocument = ShareSettingsActivity.getDestinationDirectory(context);
}
String displayName = FilesHelper.getFileNameWithoutExt(filename);
final String mimeType = FilesHelper.getMimeTypeFromFile(filename);
@@ -200,7 +209,6 @@ public class SharePlugin extends Plugin {
displayName = filename;
}
final DocumentFile destinationFolderDocument = ShareSettingsActivity.getDestinationDirectory(context);
final DocumentFile destinationDocument = destinationFolderDocument.createFile(mimeType, displayName);
final OutputStream destinationOutput;
try {
@@ -242,20 +250,38 @@ public class SharePlugin extends Plugin {
Log.i("SharePlugin", "Transfer finished: " + destinationUri.getPath());
//Update the notification and allow to open the file from it
notification.setFinished(true);
notification.setURI(destinationUri, mimeType);
notification.show();
if (np.getBoolean("open")) {
if (!customDestination) {
Log.i("SharePlugin", "Adding to downloads");
DownloadManager manager = (DownloadManager) context.getSystemService(Context.DOWNLOAD_SERVICE);
manager.addCompletedDownload(destinationUri.getLastPathSegment(), device.getName(), true, mimeType, destinationUri.getPath(), fileLength, false);
notification.cancel();
Intent intent = new Intent(Intent.ACTION_VIEW);
if (Build.VERSION.SDK_INT >= 24) {
//Nougat and later require "content://" uris instead of "file://" uris
File file = new File(destinationUri.getPath());
Uri contentUri = FileProvider.getUriForFile(device.getContext(), "org.kde.kdeconnect_tp.fileprovider", file);
intent.setDataAndType(contentUri, mimeType);
intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
} else {
intent.setDataAndType(destinationUri, mimeType);
}
context.startActivity(intent);
} else {
//Make sure it is added to the Android Gallery anyway
MediaStoreHelper.indexFile(context, destinationUri);
}
//Update the notification and allow to open the file from it
notification.setFinished(true);
notification.setURI(destinationUri, mimeType);
notification.show();
if (!ShareSettingsActivity.isCustomDestinationEnabled(context)) {
Log.i("SharePlugin", "Adding to downloads");
DownloadManager manager = (DownloadManager) context.getSystemService(Context.DOWNLOAD_SERVICE);
manager.addCompletedDownload(destinationUri.getLastPathSegment(), device.getName(), true, mimeType, destinationUri.getPath(), fileLength, false);
} else {
//Make sure it is added to the Android Gallery anyway
MediaStoreHelper.indexFile(context, destinationUri);
}
}
} catch (Exception e) {
Log.e("SharePlugin", "Receiver thread exception");
e.printStackTrace();

View File

@@ -86,7 +86,8 @@ public class SystemvolumePlugin extends Plugin {
if (sinks.containsKey(name)) {
if (np.has("volume")) {
sinks.get(name).setVolume(np.getInt("volume"));
} else if (np.has("muted")) {
}
if (np.has("muted")) {
sinks.get(name).setMute(np.getBoolean("muted"));
}
}

View File

@@ -95,9 +95,9 @@ public class CustomDevicesActivity extends AppCompatActivity {
};
AlertDialog.Builder builder = new AlertDialog.Builder(CustomDevicesActivity.this);
builder.setMessage("Delete " + ipAddressList.get(position) + " ?");
builder.setPositiveButton("Yes", confirmationListener);
builder.setNegativeButton("No", confirmationListener);
builder.setMessage(getString(R.string.delete_custom_device, ipAddressList.get(position)));
builder.setPositiveButton(R.string.ok, confirmationListener);
builder.setNegativeButton(R.string.cancel, confirmationListener);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) { //DismissListener
dialogAlreadyShown = true;