Merge branch 'master' into sslmaster
@ -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="904"
|
||||
android:versionName="0.9">
|
||||
android:versionCode="909"
|
||||
android:versionName="0.9e">
|
||||
|
||||
<uses-sdk android:minSdkVersion="9"
|
||||
android:targetSdkVersion="22" />
|
||||
@ -114,6 +114,13 @@
|
||||
-->
|
||||
</receiver>
|
||||
|
||||
<activity
|
||||
android:name="org.kde.kdeconnect.Plugins.FindMyPhonePlugin.FindMyPhoneActivity"
|
||||
android:label="@string/findmyphone_title"
|
||||
android:theme="@style/Theme.AppCompat"
|
||||
android:launchMode="singleInstance">
|
||||
</activity>
|
||||
|
||||
<!-- Plugin-related activities and services -->
|
||||
|
||||
<activity
|
||||
@ -125,12 +132,20 @@
|
||||
android:name="android.support.PARENT_ACTIVITY"
|
||||
android:value="org.kde.kdeconnect.UserInterface.MaterialActivity" />
|
||||
</activity>
|
||||
<activity
|
||||
android:name="org.kde.kdeconnect.Plugins.RunCommandPlugin.RunCommandActivity"
|
||||
android:label="@string/remote_control"
|
||||
android:parentActivityName="org.kde.kdeconnect.UserInterface.MaterialActivity"
|
||||
>
|
||||
<meta-data
|
||||
android:name="android.support.PARENT_ACTIVITY"
|
||||
android:value="org.kde.kdeconnect.UserInterface.MaterialActivity" />
|
||||
</activity>
|
||||
<activity
|
||||
android:name="org.kde.kdeconnect.Plugins.MousePadPlugin.MousePadActivity"
|
||||
android:configChanges="orientation|keyboardHidden|screenSize"
|
||||
android:label="@string/remote_control"
|
||||
android:parentActivityName="org.kde.kdeconnect.UserInterface.MaterialActivity"
|
||||
android:screenOrientation="fullSensor"
|
||||
android:windowSoftInputMode="stateHidden|adjustResize" >
|
||||
<meta-data
|
||||
android:name="android.support.PARENT_ACTIVITY"
|
||||
|
@ -22,4 +22,4 @@ You can install this app from the [Play Store](https://play.google.com/store/app
|
||||
## License
|
||||
[GNU GPL v2](https://www.gnu.org/licenses/gpl-2.0.html) and [GNU GPL v3](https://www.gnu.org/licenses/gpl-3.0.html)
|
||||
|
||||
If you are reading this from Github, you should know that this is just a mirror of the [KDE Project repo](https://projects.kde.org/projects/playground/base/kdeconnect-android/repository/).
|
||||
If you are reading this from Github, you should know that this is just a mirror of the [KDE Project repo](https://projects.kde.org/projects/extragear/network/kdeconnect-android/repository/).
|
||||
|
26
activity_find_my_phone.xml
Normal file
@ -0,0 +1,26 @@
|
||||
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
xmlns:tools="http://schemas.android.com/tools"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent"
|
||||
android:paddingLeft="@dimen/activity_horizontal_margin"
|
||||
android:paddingRight="@dimen/activity_horizontal_margin"
|
||||
android:paddingTop="@dimen/activity_vertical_margin"
|
||||
android:paddingBottom="@dimen/activity_vertical_margin"
|
||||
tools:context="org.kde.kdeconnect.Plugins.FindMyPhonePlugin.FindMyPhoneActivity">
|
||||
|
||||
|
||||
|
||||
<Button
|
||||
android:layout_width="fill_parent"
|
||||
android:layout_height="fill_parent"
|
||||
android:text="@string/findmyphone_found"
|
||||
android:textSize="50dp"
|
||||
android:id="@+id/bFindMyPhone"
|
||||
android:layout_alignParentBottom="true"
|
||||
android:layout_alignParentLeft="true"
|
||||
android:layout_alignParentStart="true" />
|
||||
|
||||
|
||||
|
||||
|
||||
</RelativeLayout>
|
31
icon.svg
@ -14,7 +14,7 @@
|
||||
height="274.43201"
|
||||
id="svg2"
|
||||
version="1.1"
|
||||
inkscape:version="0.91 r13725"
|
||||
inkscape:version="0.91 r"
|
||||
sodipodi:docname="icon.svg"
|
||||
inkscape:export-filename="/home/vaka/kdeconnect/kdeconnect-android/res/drawable-mdpi/icon.png"
|
||||
inkscape:export-xdpi="15.741604"
|
||||
@ -736,23 +736,24 @@
|
||||
borderopacity="1"
|
||||
inkscape:pageopacity="0"
|
||||
inkscape:pageshadow="2"
|
||||
inkscape:zoom="0.49497475"
|
||||
inkscape:cx="-397.02564"
|
||||
inkscape:cy="247.25211"
|
||||
inkscape:zoom="2"
|
||||
inkscape:cx="118.88075"
|
||||
inkscape:cy="143.06055"
|
||||
inkscape:document-units="px"
|
||||
inkscape:current-layer="layer1"
|
||||
showgrid="true"
|
||||
showguides="true"
|
||||
inkscape:guide-bbox="true"
|
||||
inkscape:window-width="1920"
|
||||
inkscape:window-height="1025"
|
||||
inkscape:window-x="0"
|
||||
inkscape:window-height="1017"
|
||||
inkscape:window-x="-4"
|
||||
inkscape:window-y="0"
|
||||
inkscape:window-maximized="1"
|
||||
fit-margin-top="0"
|
||||
fit-margin-left="0"
|
||||
fit-margin-right="0"
|
||||
fit-margin-bottom="0">
|
||||
fit-margin-bottom="0"
|
||||
showborder="true">
|
||||
<inkscape:grid
|
||||
type="xygrid"
|
||||
id="grid2985"
|
||||
@ -814,7 +815,7 @@
|
||||
id="layer1"
|
||||
transform="translate(8.7869998,-787.86042)">
|
||||
<path
|
||||
style="fill:#f2f2f2;fill-opacity:1;stroke:none"
|
||||
style="fill:#f5f5f5;fill-opacity:1;stroke:none"
|
||||
d="m 64.090487,801.86214 128.677053,0 c 5.09194,0 9.19121,3.92526 9.19121,8.80103 l 0,44.00509 -11.02945,0 0,-40.48469 -125.000587,0 0,214.74493 125.000587,0 0,-174.26024 11.02945,0 0,184.82144 c 0,4.8757 -4.09927,8.801 -9.19121,8.801 l -128.677053,0 c -5.091955,0 -9.191239,-3.9253 -9.191239,-8.801 l 0,-228.82653 c 0,-4.87577 4.099284,-8.80103 9.191239,-8.80103 z"
|
||||
id="rect3099-1"
|
||||
inkscape:connector-curvature="0"
|
||||
@ -861,5 +862,19 @@
|
||||
id="rect3907-9-4"
|
||||
inkscape:connector-curvature="0"
|
||||
sodipodi:nodetypes="cccccc" />
|
||||
<path
|
||||
style="opacity:0.4;fill:#ffffff;fill-opacity:1;stroke:none"
|
||||
d="m 72.876953,14.001953 c -5.091955,0 -9.191406,3.925011 -9.191406,8.800781 l 0,2 c 0,-4.87577 4.099451,-8.800781 9.191406,-8.800781 l 128.677737,0 c 5.09194,0 9.1914,3.925011 9.1914,8.800781 l 0,-2 c 0,-4.87577 -4.09946,-8.800781 -9.1914,-8.800781 z"
|
||||
transform="translate(-8.7869998,787.86042)"
|
||||
id="path4295"
|
||||
inkscape:connector-curvature="0"
|
||||
sodipodi:nodetypes="sscsscsss" />
|
||||
<path
|
||||
style="fill:#000000;fill-opacity:1;stroke:none;opacity:0.1"
|
||||
d="m 63.685547,249.62891 0,2 c 0,4.8757 4.099451,8.80078 9.191406,8.80078 l 128.677737,0 c 5.09194,0 9.1914,-3.92508 9.1914,-8.80078 l 0,-2 c 0,4.8757 -4.09946,8.80078 -9.1914,8.80078 l -128.677737,0 c -5.091955,0 -9.191406,-3.92508 -9.191406,-8.80078 z"
|
||||
id="path4300"
|
||||
inkscape:connector-curvature="0"
|
||||
sodipodi:nodetypes="csssscssc"
|
||||
transform="translate(-8.7869998,787.86042)" />
|
||||
</g>
|
||||
</svg>
|
||||
|
Before Width: | Height: | Size: 27 KiB After Width: | Height: | Size: 28 KiB |
Before Width: | Height: | Size: 2.1 KiB After Width: | Height: | Size: 2.1 KiB |
Before Width: | Height: | Size: 477 B After Width: | Height: | Size: 449 B |
BIN
res/drawable-hdpi/runcommand_plugin_icon.png
Normal file
After Width: | Height: | Size: 553 B |
Before Width: | Height: | Size: 1.4 KiB After Width: | Height: | Size: 1.4 KiB |
Before Width: | Height: | Size: 311 B After Width: | Height: | Size: 290 B |
BIN
res/drawable-mdpi/runcommand_plugin_icon.png
Normal file
After Width: | Height: | Size: 351 B |
Before Width: | Height: | Size: 373 B After Width: | Height: | Size: 308 B |
Before Width: | Height: | Size: 2.8 KiB After Width: | Height: | Size: 2.8 KiB |
Before Width: | Height: | Size: 667 B After Width: | Height: | Size: 529 B |
BIN
res/drawable-xhdpi/runcommand_plugin_icon.png
Normal file
After Width: | Height: | Size: 591 B |
Before Width: | Height: | Size: 684 B After Width: | Height: | Size: 608 B |
Before Width: | Height: | Size: 4.1 KiB After Width: | Height: | Size: 4.2 KiB |
Before Width: | Height: | Size: 686 B After Width: | Height: | Size: 1.0 KiB |
BIN
res/drawable-xxhdpi/runcommand_plugin_icon.png
Normal file
After Width: | Height: | Size: 1.1 KiB |
Before Width: | Height: | Size: 1.2 KiB After Width: | Height: | Size: 1.0 KiB |
BIN
res/drawable-xxxhdpi/mpris_plugin_action.png
Normal file
After Width: | Height: | Size: 1.5 KiB |
BIN
res/drawable-xxxhdpi/runcommand_plugin_icon.png
Normal file
After Width: | Height: | Size: 1.1 KiB |
BIN
res/drawable-xxxhdpi/share_plugin_action.png
Normal file
After Width: | Height: | Size: 1.5 KiB |
26
res/layout/activity_find_my_phone.xml
Normal file
@ -0,0 +1,26 @@
|
||||
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
xmlns:tools="http://schemas.android.com/tools"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent"
|
||||
android:paddingLeft="@dimen/activity_horizontal_margin"
|
||||
android:paddingRight="@dimen/activity_horizontal_margin"
|
||||
android:paddingTop="@dimen/activity_vertical_margin"
|
||||
android:paddingBottom="@dimen/activity_vertical_margin"
|
||||
tools:context="org.kde.kdeconnect.Plugins.FindMyPhonePlugin.FindMyPhoneActivity">
|
||||
|
||||
|
||||
|
||||
<Button
|
||||
android:layout_width="fill_parent"
|
||||
android:layout_height="fill_parent"
|
||||
android:text="@string/findmyphone_found"
|
||||
android:textSize="50dp"
|
||||
android:id="@+id/bFindMyPhone"
|
||||
android:layout_alignParentBottom="true"
|
||||
android:layout_alignParentLeft="true"
|
||||
android:layout_alignParentStart="true" />
|
||||
|
||||
|
||||
|
||||
|
||||
</RelativeLayout>
|
@ -2,7 +2,8 @@
|
||||
xmlns:tools="http://schemas.android.com/tools"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent"
|
||||
android:padding="16dip"
|
||||
android:paddingLeft="16dip"
|
||||
android:paddingRight="16dip"
|
||||
tools:context=".MainActivity"
|
||||
android:id="@+id/listView1"
|
||||
android:addStatesFromChildren="true"
|
||||
|
@ -29,8 +29,8 @@
|
||||
android:layout_height="wrap_content"
|
||||
android:textAppearance="?android:attr/textAppearanceSmall"
|
||||
android:singleLine="true"
|
||||
android:textColor="#CC2222"
|
||||
android:visibility="gone"
|
||||
android:textColor="@android:color/darker_gray"
|
||||
android:text="" />
|
||||
|
||||
|
||||
|
@ -2,7 +2,6 @@
|
||||
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="160dp"
|
||||
android:padding="16dp"
|
||||
android:background="@drawable/drawer_header"
|
||||
android:orientation="vertical"
|
||||
android:gravity="bottom">
|
||||
@ -14,8 +13,13 @@
|
||||
android:text="KDE Connect"
|
||||
android:textColor="#FFF"
|
||||
android:textStyle="bold"
|
||||
android:paddingBottom="4dp"
|
||||
android:layout_above="@+id/device_name"
|
||||
android:id="@+id/kdeconnect_label"
|
||||
android:paddingLeft="16dp"
|
||||
android:paddingStart="16dp"
|
||||
android:paddingTop="8dp"
|
||||
android:paddingRight="48dp"
|
||||
android:paddingEnd="48dp"
|
||||
/>
|
||||
|
||||
<TextView
|
||||
@ -23,12 +27,17 @@
|
||||
android:layout_height="wrap_content"
|
||||
android:text="My device"
|
||||
android:id="@+id/device_name"
|
||||
android:layout_marginBottom="8dp"
|
||||
android:layout_marginBottom="0dp"
|
||||
android:textColor="#fff"
|
||||
android:layout_alignParentBottom="true"
|
||||
android:layout_alignParentLeft="true"
|
||||
android:layout_alignParentStart="true"
|
||||
/>
|
||||
android:paddingBottom="16dp"
|
||||
android:paddingTop="4dp"
|
||||
android:paddingRight="48dp"
|
||||
android:paddingEnd="48dp"
|
||||
android:paddingStart="16dp"
|
||||
android:paddingLeft="16dp" />
|
||||
|
||||
<!--
|
||||
<ImageView
|
||||
|
@ -12,6 +12,8 @@
|
||||
<string name="pref_plugin_mousepad_desc">Usa el vostre telèfon com un ratolí i un teclat</string>
|
||||
<string name="pref_plugin_mpris">Controls multimèdia</string>
|
||||
<string name="pref_plugin_mpris_desc">Controla l\'àudio i el vídeo del vostre telèfon</string>
|
||||
<string name="pref_plugin_runcommand">Executa una ordre</string>
|
||||
<string name="pref_plugin_runcommand_desc">Executa una ordre al vostre sistema</string>
|
||||
<string name="pref_plugin_ping">Ping</string>
|
||||
<string name="pref_plugin_ping_desc">Envia i rep els pings</string>
|
||||
<string name="pref_plugin_notifications">Sincronitza les notificacions</string>
|
||||
@ -138,4 +140,9 @@
|
||||
<string name="pref_plugin_telepathy">Envia un SMS</string>
|
||||
<string name="pref_plugin_telepathy_desc">Envia missatges de text des de l\'escriptori</string>
|
||||
<string name="plugin_not_supported">Aquest connector no és admès pel dispositiu</string>
|
||||
<string name="findmyphone_title">Troba el meu telèfon</string>
|
||||
<string name="findmyphone_description">Fa sonar aquest telèfon perquè el pugueu trobar.</string>
|
||||
<string name="findmyphone_found">L\'he trobat</string>
|
||||
<string name="open">Obre</string>
|
||||
<string name="close">Tanca</string>
|
||||
</resources>
|
||||
|
@ -12,6 +12,8 @@
|
||||
<string name="pref_plugin_mousepad_desc">Používejte svůj telefon jako myš a klávesnici</string>
|
||||
<string name="pref_plugin_mpris">Ovládání multimédií</string>
|
||||
<string name="pref_plugin_mpris_desc">Ovládejte audio/video z vašeho telefonu</string>
|
||||
<string name="pref_plugin_runcommand">Spustit příkaz</string>
|
||||
<string name="pref_plugin_runcommand_desc">Spustí příkaz na vašem počítači</string>
|
||||
<string name="pref_plugin_ping">Ping</string>
|
||||
<string name="pref_plugin_ping_desc">Posílat a přijímat ping</string>
|
||||
<string name="pref_plugin_notifications">Synchronizace upozornění</string>
|
||||
@ -138,4 +140,9 @@
|
||||
<string name="pref_plugin_telepathy">Poslat SMS</string>
|
||||
<string name="pref_plugin_telepathy_desc">Posílejte zprávy ze své pracovní plochy</string>
|
||||
<string name="plugin_not_supported">Tento modul zařízení nepodporuje</string>
|
||||
<string name="findmyphone_title">Najít můj telefon</string>
|
||||
<string name="findmyphone_description">Prozvoní tento telefon, takže jej můžete najít.</string>
|
||||
<string name="findmyphone_found">Nalezeno</string>
|
||||
<string name="open">Otevřít</string>
|
||||
<string name="close">Zavřít</string>
|
||||
</resources>
|
||||
|
@ -10,11 +10,16 @@
|
||||
<string name="pref_plugin_clipboard_desc">Del indholdet af udklipsholderen</string>
|
||||
<string name="pref_plugin_mousepad">Eksternt input</string>
|
||||
<string name="pref_plugin_mousepad_desc">Brug din telefon som mus og tastatur</string>
|
||||
<string name="pref_plugin_mpris">Multimediekontroller</string>
|
||||
<string name="pref_plugin_mpris_desc">Styr lyd og video fra din telefon</string>
|
||||
<string name="pref_plugin_runcommand">Kør kommando</string>
|
||||
<string name="pref_plugin_runcommand_desc">Kører en kommando på dit system</string>
|
||||
<string name="pref_plugin_ping">Ping</string>
|
||||
<string name="pref_plugin_ping_desc">Send og modtag ping</string>
|
||||
<string name="pref_plugin_notifications">Synk. af bekendtgørelser</string>
|
||||
<string name="pref_plugin_notifications_desc">Tilgå dine bekendtgørelser fra andre enheder</string>
|
||||
<string name="pref_plugin_sharereceiver">Del og modtag</string>
|
||||
<string name="pref_plugin_sharereceiver_desc">Del filer og URL\'er mellem enheder</string>
|
||||
<string name="plugin_not_available">Denne funktion er ikke tilgængelig i din Android-version</string>
|
||||
<string name="device_list_empty">Ingen enheder</string>
|
||||
<string name="ok">O.k.</string>
|
||||
@ -22,6 +27,8 @@
|
||||
<string name="open_settings">Åbn indstillinger</string>
|
||||
<string name="no_permissions">Du skal give tilladelse for at tilgå bekendtgørelser</string>
|
||||
<string name="send_ping">Send ping</string>
|
||||
<string name="open_mpris_controls">Multimediekontrol</string>
|
||||
<string name="open_mousepad">Eksternt input</string>
|
||||
<string name="mousepad_info">Bevæg en finger på skærmen for at flytte musemarkøren. Tap for at klikke og brug to/tre-fingre for højre og midterste museknap. Brug et langt tryk til at trække og slippe.</string>
|
||||
<string name="mousepad_double_tap_settings_title">Angiv handling for tap med to fingre</string>
|
||||
<string name="mousepad_triple_tap_settings_title">Angiv handling for tap med tre fingre</string>
|
||||
@ -103,6 +110,8 @@
|
||||
<string name="invalid_device_name">Ugyldigt enhedsnavn</string>
|
||||
<string name="shareplugin_text_saved">Modtog tekst, gemt til udklipsholder</string>
|
||||
<string name="custom_devices_settings">Brugertilpasset liste over enheder</string>
|
||||
<string name="pair_device_action">Par med en ny enhed</string>
|
||||
<string name="unpair_device_action">Fjern parring med %s</string>
|
||||
<string name="custom_device_list">Tilføj enheder via IP</string>
|
||||
<string name="share_notification_preference">Støjende bekendtgørelser</string>
|
||||
<string name="share_notification_preference_summary">Vibrér og afspil en lyd når en fil modtages</string>
|
||||
@ -119,4 +128,21 @@
|
||||
<string name="no_players_connected">Ingen afspillere fundet</string>
|
||||
<string name="custom_dev_list_help">Brug kun denne indstilling hvis din enhed ikke opdages automatisk. Angiv IP-adresse eller værtsnavn nedenfor og tryk på knappen for at føje den til listen. Tryk på et eksisterende element for at fjerne det fra listen.</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-enheder</string>
|
||||
<string name="pairing_description">Andre enheder som kører KDE Connect i samme netværk som dig, bør dukke op her.</string>
|
||||
<string name="device_paired">Enhed parret</string>
|
||||
<string name="device_rename_title">Omdøb enhed</string>
|
||||
<string name="device_rename_confirm">Omdøb</string>
|
||||
<string name="refresh">Genopfrisk</string>
|
||||
<string name="unreachable_description">Denne parrede enhed kan ikke nås. Sørg for at den er forbundet til samme netværk som dig.</string>
|
||||
<string name="no_file_browser">Der er ingen filhåndtering installeret.</string>
|
||||
<string name="pref_plugin_telepathy">Send SMS</string>
|
||||
<string name="pref_plugin_telepathy_desc">Send SMS-beskeder fra din desktop</string>
|
||||
<string name="plugin_not_supported">Dette plugin er ikke understøttet af enheden</string>
|
||||
<string name="findmyphone_title">Find min telefon</string>
|
||||
<string name="findmyphone_description">Ringer til denne telefon, så du kan finde den.</string>
|
||||
<string name="findmyphone_found">Fundet</string>
|
||||
<string name="open">Åbn</string>
|
||||
<string name="close">Luk</string>
|
||||
</resources>
|
||||
|
@ -11,6 +11,8 @@
|
||||
<string name="pref_plugin_mousepad_desc">Verwendet Ihr Handy als Maus und Tastatur</string>
|
||||
<string name="pref_plugin_mpris">Multimedia-Bedienung</string>
|
||||
<string name="pref_plugin_mpris_desc">Audio und Video mit Ihrem Telefon steuern</string>
|
||||
<string name="pref_plugin_runcommand">Befehl ausführen</string>
|
||||
<string name="pref_plugin_runcommand_desc">Führt einen Befehl auf Ihrem System aus</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>
|
||||
@ -99,6 +101,8 @@
|
||||
<string name="invalid_device_name">Ungültiger Gerätename</string>
|
||||
<string name="shareplugin_text_saved">Text empfangen und in der Zwischenablage gespeichert</string>
|
||||
<string name="custom_devices_settings">Benutzerdefinierte Geräteliste</string>
|
||||
<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 hinzufügen</string>
|
||||
<string name="share_notification_preference_summary">Beim Empfang einer Datei vibrieren und einen Sound abspielen</string>
|
||||
<string name="title_activity_notification_filter">Benachrichtigungs-Filter</string>
|
||||
@ -113,4 +117,15 @@
|
||||
<string name="add_host_hint">Rechnername oder IP</string>
|
||||
<string name="no_players_connected">Keine Medienspieler gefunden</string>
|
||||
<string name="mpris_player_on_device">%1$s auf %2$s</string>
|
||||
<string name="send_files">Dateien senden</string>
|
||||
<string name="pairing_title">KDE-Connect-Geräte</string>
|
||||
<string name="device_paired">Gerät verbunden</string>
|
||||
<string name="device_rename_title">Geräte umbenennen</string>
|
||||
<string name="device_rename_confirm">Umbenennen</string>
|
||||
<string name="refresh">Aktualisieren</string>
|
||||
<string name="pref_plugin_telepathy">SMS senden</string>
|
||||
<string name="plugin_not_supported">Dieses Modul wird durch das Gerät nicht unterstützt</string>
|
||||
<string name="findmyphone_found">Gefunden</string>
|
||||
<string name="open">Öffnen</string>
|
||||
<string name="close">Schließen</string>
|
||||
</resources>
|
||||
|
148
res/values-en-rGB/strings.xml
Normal file
@ -0,0 +1,148 @@
|
||||
<?xml version='1.0' encoding='utf-8'?>
|
||||
<resources>
|
||||
<string name="pref_plugin_telephony">Telephony notifier</string>
|
||||
<string name="pref_plugin_telephony_desc">Send notifications for SMS and calls</string>
|
||||
<string name="pref_plugin_battery">Battery report</string>
|
||||
<string name="pref_plugin_battery_desc">Periodically report battery status</string>
|
||||
<string name="pref_plugin_sftp">Filesystem expose</string>
|
||||
<string name="pref_plugin_sftp_desc">Allows to browse the phone\'s filesystem remotely</string>
|
||||
<string name="pref_plugin_clipboard">Clipboard sync</string>
|
||||
<string name="pref_plugin_clipboard_desc">Share the clipboard content</string>
|
||||
<string name="pref_plugin_mousepad">Remote input</string>
|
||||
<string name="pref_plugin_mousepad_desc">Use your phone as a mouse and keyboard</string>
|
||||
<string name="pref_plugin_mpris">Multimedia controls</string>
|
||||
<string name="pref_plugin_mpris_desc">Control audio/video from your phone</string>
|
||||
<string name="pref_plugin_runcommand">Run Command</string>
|
||||
<string name="pref_plugin_runcommand_desc">Runs a command on your system</string>
|
||||
<string name="pref_plugin_ping">Ping</string>
|
||||
<string name="pref_plugin_ping_desc">Send and receive pings</string>
|
||||
<string name="pref_plugin_notifications">Notification sync</string>
|
||||
<string name="pref_plugin_notifications_desc">Access your notifications from other devices</string>
|
||||
<string name="pref_plugin_sharereceiver">Share and receive</string>
|
||||
<string name="pref_plugin_sharereceiver_desc">Share files and URLs between devices</string>
|
||||
<string name="plugin_not_available">This feature is not available in your Android version</string>
|
||||
<string name="device_list_empty">No devices</string>
|
||||
<string name="ok">OK</string>
|
||||
<string name="cancel">Cancel</string>
|
||||
<string name="open_settings">Open settings</string>
|
||||
<string name="no_permissions">You need to grant permission to access notifications</string>
|
||||
<string name="send_ping">Send ping</string>
|
||||
<string name="open_mpris_controls">Multimedia control</string>
|
||||
<string name="open_mousepad">Remote input</string>
|
||||
<string name="mousepad_info">Move a finger on the screen to move the mouse cursor. Tap for a click, and use two/three fingers for right and middle buttons. Use a long press to drag\'n drop.</string>
|
||||
<string name="mousepad_double_tap_settings_title">Set two finger tap action</string>
|
||||
<string name="mousepad_triple_tap_settings_title">Set three finger tap action</string>
|
||||
<string-array name="mousepad_tap_entries">
|
||||
<item>Right click</item>
|
||||
<item>Middle click</item>
|
||||
<item>Nothing</item>
|
||||
</string-array>
|
||||
<string name="mousepad_double_default">right</string>
|
||||
<string name="mousepad_triple_default">middle</string>
|
||||
<string name="category_connected_devices">Connected devices</string>
|
||||
<string name="category_not_paired_devices">Available devices</string>
|
||||
<string name="category_remembered_devices">Remembered devices</string>
|
||||
<string name="plugins_failed_to_load">Plugins failed to load (tap for more info):</string>
|
||||
<string name="device_menu_plugins">Plugin settings</string>
|
||||
<string name="device_menu_unpair">Unpair</string>
|
||||
<string name="device_not_reachable">Paired device not reachable</string>
|
||||
<string name="unknown_device">Unknown device</string>
|
||||
<string name="error_not_reachable">Device not reachable</string>
|
||||
<string name="error_already_requested">Pairing already requested</string>
|
||||
<string name="error_already_paired">Device already paired</string>
|
||||
<string name="error_could_not_send_package">Could not send package</string>
|
||||
<string name="error_timed_out">Timed out</string>
|
||||
<string name="error_canceled_by_user">Cancelled by user</string>
|
||||
<string name="error_canceled_by_other_peer">Cancelled by other peer</string>
|
||||
<string name="error_invalid_key">Invalid key received</string>
|
||||
<string name="pair_requested">Pair requested</string>
|
||||
<string name="pairing_request_from">Pairing request from %1s</string>
|
||||
<string name="received_url_title">Received link from %1s</string>
|
||||
<string name="received_url_text">Tap to open \'%1s\'</string>
|
||||
<string name="incoming_file_title">Incoming file from %1s</string>
|
||||
<string name="incoming_file_text">%1s</string>
|
||||
<string name="outgoing_file_title">Sending file to %1s</string>
|
||||
<string name="outgoing_file_text">%1s</string>
|
||||
<string name="received_file_title">Received file from %1s</string>
|
||||
<string name="received_file_fail_title">Failed receiving file from %1s</string>
|
||||
<string name="received_file_text">Tap to open \'%1s\'</string>
|
||||
<string name="sent_file_title">Sent file to %1s</string>
|
||||
<string name="sent_file_text">%1s</string>
|
||||
<string name="sent_file_failed_title">Failed to send file %1s</string>
|
||||
<string name="sent_file_failed_text">%1s</string>
|
||||
<string name="tap_to_answer">Tap to answer</string>
|
||||
<string name="reconnect">Reconnect</string>
|
||||
<string name="right_click">Send Right Click</string>
|
||||
<string name="middle_click">Send Middle Click</string>
|
||||
<string name="show_keyboard">Show Keyboard</string>
|
||||
<string name="device_not_paired">Device not paired</string>
|
||||
<string name="request_pairing">Request pairing</string>
|
||||
<string name="pairing_accept">Accept</string>
|
||||
<string name="pairing_reject">Reject</string>
|
||||
<string name="device">Device</string>
|
||||
<string name="pair_device">Pair device</string>
|
||||
<string name="remote_control">Remote control</string>
|
||||
<string name="settings">KDE Connect Settings</string>
|
||||
<string name="mpris_play">Play</string>
|
||||
<string name="mpris_previous">Previous</string>
|
||||
<string name="mpris_rew">Rewind</string>
|
||||
<string name="mpris_ff">Fast-forward</string>
|
||||
<string name="mpris_next">Next</string>
|
||||
<string name="mpris_volume">Volume</string>
|
||||
<string name="mpris_settings">Multimedia Settings</string>
|
||||
<string name="mpris_time_settings_title">Forward/rewind buttons</string>
|
||||
<string name="mpris_time_settings_summary">Adjust the time to fast forward/rewind when pressed.</string>
|
||||
<string-array name="mpris_time_entries">
|
||||
<item>10 seconds</item>
|
||||
<item>20 seconds</item>
|
||||
<item>30 seconds</item>
|
||||
<item>1 minute</item>
|
||||
<item>2 minutes</item>
|
||||
</string-array>
|
||||
<string name="share_to">Share To...</string>
|
||||
<string name="protocol_version_older">This device uses an old protocol version</string>
|
||||
<string name="protocol_version_newer">This device uses a newer protocol version</string>
|
||||
<string name="general_settings">General Settings</string>
|
||||
<string name="plugin_settings">Settings</string>
|
||||
<string name="plugin_settings_with_name">%s settings</string>
|
||||
<string name="device_name">Device name</string>
|
||||
<string name="device_name_preference_summary">%s</string>
|
||||
<string name="invalid_device_name">Invalid device name</string>
|
||||
<string name="shareplugin_text_saved">Received text, saved to clipboard</string>
|
||||
<string name="custom_devices_settings">Custom device list</string>
|
||||
<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="share_notification_preference">Noisy notifications</string>
|
||||
<string name="share_notification_preference_summary">Vibrate and play a sound when receiving a file</string>
|
||||
<string name="title_activity_notification_filter">Notification filter</string>
|
||||
<string name="filter_apps_info">Notifications will be synchronised for the selected apps.</string>
|
||||
<string name="sftp_internal_storage">Internal storage</string>
|
||||
<string name="sftp_all_files">All files</string>
|
||||
<string name="sftp_sdcard_num">SD card %d</string>
|
||||
<string name="sftp_sdcard">SD card</string>
|
||||
<string name="sftp_readonly">(read only)</string>
|
||||
<string name="sftp_camera">Camera pictures</string>
|
||||
<string name="add_host">Add host/IP</string>
|
||||
<string name="add_host_hint">Hostname or IP</string>
|
||||
<string name="no_players_connected">No players found</string>
|
||||
<string name="custom_dev_list_help">Use this option only if your device is not automatically detected. Enter IP address or hostname below and touch the button to add it to the list. Touch an existing item to remove it from the list.</string>
|
||||
<string name="mpris_player_on_device">%1$s on %2$s</string>
|
||||
<string name="send_files">Send files</string>
|
||||
<string name="pairing_title">KDE Connect Devices</string>
|
||||
<string name="pairing_description">Other devices running KDE Connect in your same network should appear here.</string>
|
||||
<string name="device_paired">Device paired</string>
|
||||
<string name="device_rename_title">Rename device</string>
|
||||
<string name="device_rename_confirm">Rename</string>
|
||||
<string name="refresh">Refresh</string>
|
||||
<string name="unreachable_description">This paired device is not reachable. Make sure it is connected to your same network.</string>
|
||||
<string name="no_file_browser">There are no file browsers installed.</string>
|
||||
<string name="pref_plugin_telepathy">Send SMS</string>
|
||||
<string name="pref_plugin_telepathy_desc">Send text messages from your desktop</string>
|
||||
<string name="plugin_not_supported">This plugin is not supported by the device</string>
|
||||
<string name="findmyphone_title">Find My Phone</string>
|
||||
<string name="findmyphone_description">Rings this phone so you can find it.</string>
|
||||
<string name="findmyphone_found">Found</string>
|
||||
<string name="open">Open</string>
|
||||
<string name="close">Close</string>
|
||||
</resources>
|
@ -12,6 +12,8 @@
|
||||
<string name="pref_plugin_mousepad_desc">Usar su teléfono como ratón y teclado</string>
|
||||
<string name="pref_plugin_mpris">Controles multimedia</string>
|
||||
<string name="pref_plugin_mpris_desc">Controlar audio y vídeo desde el teléfono</string>
|
||||
<string name="pref_plugin_runcommand">Ejecutar orden</string>
|
||||
<string name="pref_plugin_runcommand_desc">Ejecuta una orden en su sistema</string>
|
||||
<string name="pref_plugin_ping">Ping</string>
|
||||
<string name="pref_plugin_ping_desc">Enviar y recibir pings</string>
|
||||
<string name="pref_plugin_notifications">Sincronizar notificaciones</string>
|
||||
@ -138,4 +140,9 @@
|
||||
<string name="pref_plugin_telepathy">Enviar SMS</string>
|
||||
<string name="pref_plugin_telepathy_desc">Enviar mensajes de texto desde el escritorio</string>
|
||||
<string name="plugin_not_supported">Este complemento no está permitido por el dispositivo</string>
|
||||
<string name="findmyphone_title">Encontrar mi teléfono</string>
|
||||
<string name="findmyphone_description">Hace sonar este teléfono para que pueda encontrarlo.</string>
|
||||
<string name="findmyphone_found">Encontrado</string>
|
||||
<string name="open">Abrir</string>
|
||||
<string name="close">Cerrar</string>
|
||||
</resources>
|
||||
|
@ -12,6 +12,8 @@
|
||||
<string name="pref_plugin_mousepad_desc">Käytä puhelintasi hiirenä ja näppäimistönä</string>
|
||||
<string name="pref_plugin_mpris">Multimedian ohjaus</string>
|
||||
<string name="pref_plugin_mpris_desc">Ohjaa ääntä ja videota puhelimestasi</string>
|
||||
<string name="pref_plugin_runcommand">Suorita komento</string>
|
||||
<string name="pref_plugin_runcommand_desc">Suorita komento järjestelmässäsi</string>
|
||||
<string name="pref_plugin_ping">Tiedustelupaketti</string>
|
||||
<string name="pref_plugin_ping_desc">Lähetä ja vastaanota tiedustelupaketteja</string>
|
||||
<string name="pref_plugin_notifications">Ilmoitusten synkronointi</string>
|
||||
@ -133,9 +135,14 @@
|
||||
<string name="device_rename_title">Laitteen nimen muuttaminen</string>
|
||||
<string name="device_rename_confirm">Muuta nimi</string>
|
||||
<string name="refresh">Päivitä</string>
|
||||
<string name="unreachable_description">Tämä pariksi kytketty laite ei ole tavoitttavissa. Tarkista, että se on yhteydessä samaan verkkoon.</string>
|
||||
<string name="unreachable_description">Tämä pariksi kytketty laite ei ole tavoitettavissa. Tarkista, että se on yhteydessä samaan verkkoon.</string>
|
||||
<string name="no_file_browser">Tiedostoselaimia ei asennettu.</string>
|
||||
<string name="pref_plugin_telepathy">Lähetä tekstiviesti</string>
|
||||
<string name="pref_plugin_telepathy_desc">Lähetä tekstiviestejä työpöydältäsi</string>
|
||||
<string name="plugin_not_supported">Laite ei tue tätä liitännäistä</string>
|
||||
<string name="findmyphone_title">Löydä puhelimeni</string>
|
||||
<string name="findmyphone_description">Laittaa puhelimen soimaan, jotta voit löytää sen.</string>
|
||||
<string name="findmyphone_found">Löytyi</string>
|
||||
<string name="open">Avaa</string>
|
||||
<string name="close">Sulje</string>
|
||||
</resources>
|
||||
|
@ -10,11 +10,14 @@
|
||||
<string name="pref_plugin_clipboard_desc">Partage le contenu du presse-papiers</string>
|
||||
<string name="pref_plugin_mousepad">Contrôle distant</string>
|
||||
<string name="pref_plugin_mousepad_desc">Utilisez votre téléphone comme une souris et un clavier</string>
|
||||
<string name="pref_plugin_mpris">Contrôles multimédia</string>
|
||||
<string name="pref_plugin_mpris_desc">Contrôle l\'audio / la vidéo depuis votre téléphone</string>
|
||||
<string name="pref_plugin_ping">Commande « Ping »</string>
|
||||
<string name="pref_plugin_ping_desc">Envoie et reçoit des commandes « Ping »</string>
|
||||
<string name="pref_plugin_notifications">Synchronisation des notifications</string>
|
||||
<string name="pref_plugin_notifications_desc">Accédez à vos notifications depuis d\'autres périphériques</string>
|
||||
<string name="pref_plugin_sharereceiver">Partager et recevoir</string>
|
||||
<string name="pref_plugin_sharereceiver_desc">Partagez des URLs et des fichiers entre périphériques</string>
|
||||
<string name="plugin_not_available">Cette fonctionnalité n\'est pas disponible dans votre version de Android</string>
|
||||
<string name="device_list_empty">Pas de périphériques</string>
|
||||
<string name="ok">Ok</string>
|
||||
@ -22,6 +25,8 @@
|
||||
<string name="open_settings">Accéder aux paramètres</string>
|
||||
<string name="no_permissions">Vous devez accorder la permission d\'accéder aux notifications</string>
|
||||
<string name="send_ping">Envoyer un « Ping »</string>
|
||||
<string name="open_mpris_controls">Contrôles multimédia</string>
|
||||
<string name="open_mousepad">Contrôle distant</string>
|
||||
<string name="mousepad_info">Déplacer le doigt sur l\'écran pour bouger le pointeur de la souris. Appuyez pour cliquer et utiliser deux/trois doigts pour les clic droit et centre. Appuyez longtemps pour faire un glisser déplacer.</string>
|
||||
<string name="mousepad_double_tap_settings_title">Action pour l\'appui à deux doigts</string>
|
||||
<string name="mousepad_triple_tap_settings_title">Action pour l\'appui à trois doigts</string>
|
||||
@ -57,6 +62,7 @@
|
||||
<string name="outgoing_file_title">Envoi d\'un fichier à %1s</string>
|
||||
<string name="outgoing_file_text">%1s</string>
|
||||
<string name="received_file_title">Fichier reçu de %1s</string>
|
||||
<string name="received_file_fail_title">Impossible de recevoir le fichier depuis : %1s</string>
|
||||
<string name="received_file_text">Appuyez pour ouvrir %1s</string>
|
||||
<string name="sent_file_title">Fichier envoyé à %1s</string>
|
||||
<string name="sent_file_text">%1s</string>
|
||||
|
@ -12,6 +12,8 @@
|
||||
<string name="pref_plugin_mousepad_desc">Use o teléfono como rato e teclado.</string>
|
||||
<string name="pref_plugin_mpris">Controis multimedia</string>
|
||||
<string name="pref_plugin_mpris_desc">Controle o son e o vídeo desde o teléfono.</string>
|
||||
<string name="pref_plugin_runcommand">Executar unha orde</string>
|
||||
<string name="pref_plugin_runcommand_desc">Executa unha orde no sistema.</string>
|
||||
<string name="pref_plugin_ping">Ping</string>
|
||||
<string name="pref_plugin_ping_desc">Envíe e reciba pings.</string>
|
||||
<string name="pref_plugin_notifications">Sincronización de notificacións</string>
|
||||
@ -108,6 +110,8 @@
|
||||
<string name="invalid_device_name">Nome de dispositivo incorrecto</string>
|
||||
<string name="shareplugin_text_saved">Recibiuse un texto e gardouse no portapapeis</string>
|
||||
<string name="custom_devices_settings">Lista de dispositivos personalizada</string>
|
||||
<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="share_notification_preference">Notificacións sonoras</string>
|
||||
<string name="share_notification_preference_summary">Vibrar e reproducir un son ao recibir un ficheiro.</string>
|
||||
@ -124,4 +128,21 @@
|
||||
<string name="no_players_connected">Non se atoparon reprodutores.</string>
|
||||
<string name="custom_dev_list_help">Marque esta opción unicamente se o seu dispositivo non se detecta automaticamente. Escriba o enderezo IP ou o nome de servidor do dispositivo e toque o botón para engadilo á lista. Toque un elemento existente para retiralo da lista.</string>
|
||||
<string name="mpris_player_on_device">%1$s en %2$s</string>
|
||||
<string name="send_files">Enviar ficheiros</string>
|
||||
<string name="pairing_title">Dispositivos con KDE Connect</string>
|
||||
<string name="pairing_description">Outros dispositivos que estean a executar KDE Connect na mesma rede deberían aparecer aquí.</string>
|
||||
<string name="device_paired">Emparellouse co dispositivo</string>
|
||||
<string name="device_rename_title">Cambiar o nome do dispositivo</string>
|
||||
<string name="device_rename_confirm">Mudar o nome</string>
|
||||
<string name="refresh">Actualizar</string>
|
||||
<string name="unreachable_description">Este dispositivo emparellado está fóra do alcance. Asegúrese de que está conectado á mesma rede.</string>
|
||||
<string name="no_file_browser">Non hai navegadores de ficheiros instalados.</string>
|
||||
<string name="pref_plugin_telepathy">Enviar unha mensaxe de texto</string>
|
||||
<string name="pref_plugin_telepathy_desc">Enviar mensaxes de texto desde un computador de escritorio.</string>
|
||||
<string name="plugin_not_supported">O dispositivo non é compatíbel con este complemento.</string>
|
||||
<string name="findmyphone_title">Atopar o móbil</string>
|
||||
<string name="findmyphone_description">Reproduce un son de chamada no móbil para que poida atopalo.</string>
|
||||
<string name="findmyphone_found">Atopado</string>
|
||||
<string name="open">Abrir</string>
|
||||
<string name="close">Pechar</string>
|
||||
</resources>
|
||||
|
@ -12,6 +12,8 @@
|
||||
<string name="pref_plugin_mousepad_desc">Usa il tuo telefono come mouse e tastiera</string>
|
||||
<string name="pref_plugin_mpris">Controlli multimediali</string>
|
||||
<string name="pref_plugin_mpris_desc">Controlla la riproduzione audio/video dal telefono</string>
|
||||
<string name="pref_plugin_runcommand">Esegui comando</string>
|
||||
<string name="pref_plugin_runcommand_desc">Esegue un comando sul tuo sistema</string>
|
||||
<string name="pref_plugin_ping">Ping</string>
|
||||
<string name="pref_plugin_ping_desc">Invia e ricevi ping</string>
|
||||
<string name="pref_plugin_notifications">Sincronizzazione notifiche</string>
|
||||
@ -108,6 +110,8 @@
|
||||
<string name="invalid_device_name">Nome dispositivo non valido</string>
|
||||
<string name="shareplugin_text_saved">Testo ricevuto, salvato negli appunti</string>
|
||||
<string name="custom_devices_settings">Elenco dispositivi personalizzato</string>
|
||||
<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="share_notification_preference">Notifiche rumorose</string>
|
||||
<string name="share_notification_preference_summary">Vibra e riproduci un suono alla ricezione di un file</string>
|
||||
@ -124,4 +128,21 @@
|
||||
<string name="no_players_connected">Nessun lettore trovato</string>
|
||||
<string name="custom_dev_list_help">Usa questa opzione solo se il tuo dispositivo non è rilevato automaticamente. Digita l\'indirizzo IP o il nome host in basso e tocca il pulsante per aggiungerlo all\'elenco. Tocca un elemento esistente per rimuoverlo dall\'elenco.</string>
|
||||
<string name="mpris_player_on_device">%1$s su %2$s</string>
|
||||
<string name="send_files">Invia file</string>
|
||||
<string name="pairing_title">Dispositivi KDE Connect</string>
|
||||
<string name="pairing_description">Altri dispositivi che eseguono KDE Connect nella tua stessa rete dovrebbero apparire qui.</string>
|
||||
<string name="device_paired">Dispositivo associato</string>
|
||||
<string name="device_rename_title">Rinomina dispositivo</string>
|
||||
<string name="device_rename_confirm">Rinomina</string>
|
||||
<string name="refresh">Aggiorna</string>
|
||||
<string name="unreachable_description">Questo dispositivo associato non è raggiungibile. Assicurati che sia connesso alla tua stessa rete.</string>
|
||||
<string name="no_file_browser">Non ci sono navigatori di file installati.</string>
|
||||
<string name="pref_plugin_telepathy">Invia SMS</string>
|
||||
<string name="pref_plugin_telepathy_desc">Invia messaggi di testo dal tuo desktop</string>
|
||||
<string name="plugin_not_supported">Questa estensione non è supportata dal dispositivo</string>
|
||||
<string name="findmyphone_title">Trova il mio telefono</string>
|
||||
<string name="findmyphone_description">Fa squillare questo telefono per trovarlo.</string>
|
||||
<string name="findmyphone_found">Trovato</string>
|
||||
<string name="open">Apri</string>
|
||||
<string name="close">Chiudi</string>
|
||||
</resources>
|
||||
|
@ -10,11 +10,16 @@
|
||||
<string name="pref_plugin_clipboard_desc">클립보드 내용 동기화</string>
|
||||
<string name="pref_plugin_mousepad">원격 입력</string>
|
||||
<string name="pref_plugin_mousepad_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_runcommand_desc">시스템에서 명령 실행</string>
|
||||
<string name="pref_plugin_ping">핑</string>
|
||||
<string name="pref_plugin_ping_desc">핑 보내고 받기</string>
|
||||
<string name="pref_plugin_notifications">알림 동기화</string>
|
||||
<string name="pref_plugin_notifications_desc">다른 장치에서 알림 보기</string>
|
||||
<string name="pref_plugin_sharereceiver">공유하고 받기</string>
|
||||
<string name="pref_plugin_sharereceiver_desc">장치끼리 파일과 URL 공유</string>
|
||||
<string name="plugin_not_available">현재 안드로이드 버전에서 사용할 수 없습니다</string>
|
||||
<string name="device_list_empty">장치 없음</string>
|
||||
<string name="ok">확인</string>
|
||||
@ -22,45 +27,60 @@
|
||||
<string name="open_settings">설정 열기</string>
|
||||
<string name="no_permissions">알림 접근 권한을 허가해야 합니다</string>
|
||||
<string name="send_ping">핑 보내기</string>
|
||||
<string name="open_mpris_controls">멀티미디어 제어</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-array name="mousepad_tap_entries">
|
||||
<item/>
|
||||
<item/>
|
||||
<item>Nothing</item>
|
||||
<item>오른쪽 단추 누름</item>
|
||||
<item>가운데 단추 누름</item>
|
||||
<item>아무것도 안 함</item>
|
||||
</string-array>
|
||||
<string name="mousepad_double_default">오른쪽</string>
|
||||
<string name="mousepad_triple_default">가운데</string>
|
||||
<string name="category_connected_devices">연결된 장치</string>
|
||||
<string name="category_not_paired_devices">사용 가능한 장치</string>
|
||||
<string name="category_remembered_devices">기억하는 장치</string>
|
||||
<string name="plugins_failed_to_load">불러올 수 없는 플러그인(정보를 보려면 누르기)</string>
|
||||
<string name="device_menu_unpair">페어링 해제</string>
|
||||
<string name="device_not_reachable">페어링된 장치에 도달할 수 없음</string>
|
||||
<string name="device_menu_plugins">플러그인 설정</string>
|
||||
<string name="device_menu_unpair">연결 해제</string>
|
||||
<string name="device_not_reachable">연결된 장치에 도달할 수 없음</string>
|
||||
<string name="unknown_device">알 수 없는 장치</string>
|
||||
<string name="error_not_reachable">장치에 접근할 수 없음</string>
|
||||
<string name="error_already_requested">페어링이 이미 요청됨</string>
|
||||
<string name="error_already_paired">장치가 이미 페어링됨</string>
|
||||
<string name="error_already_requested">연결이 이미 요청됨</string>
|
||||
<string name="error_already_paired">장치가 이미 연결됨</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_invalid_key">잘못된 키 받음</string>
|
||||
<string name="pair_requested">페어링 요청됨</string>
|
||||
<string name="pairing_request_from">%1s에서 페어링 요청</string>
|
||||
<string name="pair_requested">연결 요청됨</string>
|
||||
<string name="pairing_request_from">%1s에서 연결 요청</string>
|
||||
<string name="received_url_title">%1s에서 링크 받음</string>
|
||||
<string name="received_url_text">\'%1s\'을(를) 열려면 누르십시오</string>
|
||||
<string name="incoming_file_title">%1s에서 파일 보냄</string>
|
||||
<string name="incoming_file_text">%1s</string>
|
||||
<string name="outgoing_file_title">%1s(으)로 파일 보내는 중</string>
|
||||
<string name="outgoing_file_text">%1s</string>
|
||||
<string name="received_file_title">%1s에서 파일 받음</string>
|
||||
<string name="received_file_fail_title">%1s에서 파일 받기 실패</string>
|
||||
<string name="received_file_text">\'%1s\'을(를) 열려면 누르십시오</string>
|
||||
<string name="sent_file_title">%1s(으)로 파일 보냄</string>
|
||||
<string name="sent_file_text">%1s</string>
|
||||
<string name="sent_file_failed_title">파일 %1s을(를) 보낼 수 없음</string>
|
||||
<string name="sent_file_failed_text">%1s</string>
|
||||
<string name="tap_to_answer">눌러서 응답하기</string>
|
||||
<string name="reconnect">다시 연결</string>
|
||||
<string name="right_click">오른쪽 단추 누름 신호 보내기</string>
|
||||
<string name="middle_click">가운데 단추 누름 신호 보내기</string>
|
||||
<string name="show_keyboard">키보드 보이기</string>
|
||||
<string name="device_not_paired">장치가 페어링되지 않음</string>
|
||||
<string name="request_pairing">페어링 요청</string>
|
||||
<string name="device_not_paired">장치가 연결되지 않음</string>
|
||||
<string name="request_pairing">연결 요청</string>
|
||||
<string name="pairing_accept">수락</string>
|
||||
<string name="pairing_reject">거부</string>
|
||||
<string name="device">장치</string>
|
||||
<string name="pair_device">장치 페어링</string>
|
||||
<string name="pair_device">장치 연결</string>
|
||||
<string name="remote_control">원격 제어</string>
|
||||
<string name="settings">KDE Connect 설정</string>
|
||||
<string name="mpris_play">재생</string>
|
||||
@ -70,6 +90,8 @@
|
||||
<string name="mpris_next">다음</string>
|
||||
<string name="mpris_volume">음량</string>
|
||||
<string name="mpris_settings">멀티미디어 설정</string>
|
||||
<string name="mpris_time_settings_title">되감기/빨리감기 단추</string>
|
||||
<string name="mpris_time_settings_summary">눌렀을 때 되감거나 빨리 감을 시간을 조정합니다.</string>
|
||||
<string-array name="mpris_time_entries">
|
||||
<item>10초</item>
|
||||
<item>20초</item>
|
||||
@ -88,9 +110,13 @@
|
||||
<string name="invalid_device_name">잘못된 장치 이름</string>
|
||||
<string name="shareplugin_text_saved">텍스트 수신, 클립보드에 복사됨</string>
|
||||
<string name="custom_devices_settings">사용자 정의 장치 목록</string>
|
||||
<string name="pair_device_action">새 장치 연결</string>
|
||||
<string name="unpair_device_action">%s 연결 해제</string>
|
||||
<string name="custom_device_list">IP로 장치 추가</string>
|
||||
<string name="share_notification_preference">시끄러운 알림</string>
|
||||
<string name="share_notification_preference_summary">파일을 받았을 때 진동과 소리로 알림</string>
|
||||
<string name="title_activity_notification_filter">알림 필터</string>
|
||||
<string name="filter_apps_info">선택한 앱의 알림을 동기화합니다.</string>
|
||||
<string name="sftp_internal_storage">내부 저장소</string>
|
||||
<string name="sftp_all_files">모든 파일</string>
|
||||
<string name="sftp_sdcard_num">SD 카드 %d</string>
|
||||
@ -98,7 +124,25 @@
|
||||
<string name="sftp_readonly">(읽기 전용)</string>
|
||||
<string name="sftp_camera">카메라 사진</string>
|
||||
<string name="add_host">호스트/IP 주소 추가</string>
|
||||
<string name="add_host_hint">호스트 이름이나 IP</string>
|
||||
<string name="no_players_connected">재생기를 찾을 수 없음</string>
|
||||
<string name="custom_dev_list_help">장치를 자동으로 인식할 수 없을 때 이 옵션을 사용하십시오. IP 주소나 호스트 이름을 입력하고 단추를 누르면 목록에 추가합니다. 목록에 있는 항목을 누르면 삭제합니다.</string>
|
||||
<string name="mpris_player_on_device">%2$s의 %1$s</string>
|
||||
<string name="send_files">파일 보내기</string>
|
||||
<string name="pairing_title">KDE Connect 장치</string>
|
||||
<string name="pairing_description">같은 네트워크에서 KDE Connect를 실행하는 다른 장치가 여기에 표시됩니다.</string>
|
||||
<string name="device_paired">장치 연결됨</string>
|
||||
<string name="device_rename_title">장치 이름 바꾸기</string>
|
||||
<string name="device_rename_confirm">이름 바꾸기</string>
|
||||
<string name="refresh">새로 고침</string>
|
||||
<string name="unreachable_description">이 연결된 장치에 접근할 수 없습니다. 같은 네트워크에 있는 지 확인하십시오.</string>
|
||||
<string name="no_file_browser">설치된 파일 탐색기가 없습니다.</string>
|
||||
<string name="pref_plugin_telepathy">SMS 보내기</string>
|
||||
<string name="pref_plugin_telepathy_desc">데스크톱에서 문자 메시지 보내기</string>
|
||||
<string name="plugin_not_supported">장치에서 이 플러그인을 지원하지 않습니다</string>
|
||||
<string name="findmyphone_title">내 휴대폰 찾기</string>
|
||||
<string name="findmyphone_description">소리를 울려서 휴대폰을 찾는 데 도움을 줍니다.</string>
|
||||
<string name="findmyphone_found">찾았음</string>
|
||||
<string name="open">열기</string>
|
||||
<string name="close">닫기</string>
|
||||
</resources>
|
||||
|
@ -12,6 +12,8 @@
|
||||
<string name="pref_plugin_mousepad_desc">Uw telefoon gebruiken als een muis en toetsenbord</string>
|
||||
<string name="pref_plugin_mpris">Bediening van multimedia</string>
|
||||
<string name="pref_plugin_mpris_desc">Bedien de audio/video vanaf uw telefoon</string>
|
||||
<string name="pref_plugin_runcommand">Commando uitvoeren</string>
|
||||
<string name="pref_plugin_runcommand_desc">Voert een commando uit op uw systeem</string>
|
||||
<string name="pref_plugin_ping">Ping</string>
|
||||
<string name="pref_plugin_ping_desc">Pings verzenden en ontvangen</string>
|
||||
<string name="pref_plugin_notifications">Synchronisatie van meldingen</string>
|
||||
@ -138,4 +140,9 @@
|
||||
<string name="pref_plugin_telepathy">SMS verzenden</string>
|
||||
<string name="pref_plugin_telepathy_desc">Stuur tekstberichten van uw bureaublad</string>
|
||||
<string name="plugin_not_supported">Deze plug-in wordt niet ondersteund door het apparaat</string>
|
||||
<string name="findmyphone_title">Zoek mijn telefoon</string>
|
||||
<string name="findmyphone_description">Laat deze telefoon bellen zodat u het kunt vinden.</string>
|
||||
<string name="findmyphone_found">Gevonden</string>
|
||||
<string name="open">Openen</string>
|
||||
<string name="close">Sluiten</string>
|
||||
</resources>
|
||||
|
@ -12,6 +12,8 @@
|
||||
<string name="pref_plugin_mousepad_desc">Użyj swojego telefonu jako myszy i klawiatury</string>
|
||||
<string name="pref_plugin_mpris">Sterowanie multimediami</string>
|
||||
<string name="pref_plugin_mpris_desc">Steruj dźwiękiem/obrazem ze swojego telefonu</string>
|
||||
<string name="pref_plugin_runcommand">Wykonaj polecenie</string>
|
||||
<string name="pref_plugin_runcommand_desc">Wykonuje polecenie na twoim systmie</string>
|
||||
<string name="pref_plugin_ping">Ping</string>
|
||||
<string name="pref_plugin_ping_desc">Wysyłaj i otrzymuj pingi</string>
|
||||
<string name="pref_plugin_notifications">Powiadomienia synchronizacji</string>
|
||||
@ -108,6 +110,8 @@
|
||||
<string name="invalid_device_name">Nieprawidłowa nazwa urządzenia</string>
|
||||
<string name="shareplugin_text_saved">Otrzymano tekst, zapisano do schowka</string>
|
||||
<string name="custom_devices_settings">Lista własnych urządzeń</string>
|
||||
<string name="pair_device_action">Sparuj nowe urządzenie</string>
|
||||
<string name="unpair_device_action">Rozparuj %s</string>
|
||||
<string name="custom_device_list">Dodaj urządzenia po numerze IP</string>
|
||||
<string name="share_notification_preference">Hałaśliwe powiadomienia</string>
|
||||
<string name="share_notification_preference_summary">Zadrżyj i odegraj dźwięk przy odebraniu pliku</string>
|
||||
@ -124,4 +128,21 @@
|
||||
<string name="no_players_connected">Nie znaleziono żadnego odtwarzacza</string>
|
||||
<string name="custom_dev_list_help">Użyj tej opcji tylko wtedy, gdy twoje urządzenie nie jest samoczynnie wykrywane. Podaj adres IP i nazwę gospodarza poniżej i dotknij przycisku, aby dodać je do listy. Dotknij istniejącego elementu, aby usunąć go z listy.</string>
|
||||
<string name="mpris_player_on_device">%1$s na %2$s</string>
|
||||
<string name="send_files">Wyślij pliki</string>
|
||||
<string name="pairing_title">Urządzenia KDE Connect</string>
|
||||
<string name="pairing_description">Tutaj powinny pojawić się inne urządzenia uruchmione z KDE Connect w twojej sieci.</string>
|
||||
<string name="device_paired">Urządzenie sparowane</string>
|
||||
<string name="device_rename_title">Zmień nazwę urządzenia</string>
|
||||
<string name="device_rename_confirm">Zmień nazwę</string>
|
||||
<string name="refresh">Odśwież</string>
|
||||
<string name="unreachable_description">To sparowane urządzenie jest nieosiągalne. Upewnij się, że jest podłączone do tej samej sieci.</string>
|
||||
<string name="no_file_browser">Nie wgrano żadanych przeglądarek plików.</string>
|
||||
<string name="pref_plugin_telepathy">Wyślij SMS-a</string>
|
||||
<string name="pref_plugin_telepathy_desc">Wyślij wiadomość tekstową z komputera</string>
|
||||
<string name="plugin_not_supported">Ta wtyczka nie jest obsługiwana przez to urządzenie</string>
|
||||
<string name="findmyphone_title">Znajdź mój telefon</string>
|
||||
<string name="findmyphone_description">Dzwoni na ten telefon, tak abyś mógł go znaleźć.</string>
|
||||
<string name="findmyphone_found">Znaleziony</string>
|
||||
<string name="open">Otwórz</string>
|
||||
<string name="close">Zamknij</string>
|
||||
</resources>
|
||||
|
@ -12,6 +12,8 @@
|
||||
<string name="pref_plugin_mousepad_desc">Usar seu telefone como mouse ou teclado</string>
|
||||
<string name="pref_plugin_mpris">Controle multimídia</string>
|
||||
<string name="pref_plugin_mpris_desc">Controla áudio e vídeo a partir do seu telefone</string>
|
||||
<string name="pref_plugin_runcommand">Executar comando</string>
|
||||
<string name="pref_plugin_runcommand_desc">Executa um comando no seu sistema</string>
|
||||
<string name="pref_plugin_ping">Ping</string>
|
||||
<string name="pref_plugin_ping_desc">Envia e recebe pings</string>
|
||||
<string name="pref_plugin_notifications">Sincronização de notificações</string>
|
||||
@ -138,4 +140,9 @@
|
||||
<string name="pref_plugin_telepathy">Enviar SMS</string>
|
||||
<string name="pref_plugin_telepathy_desc">Enviar mensagens de texto do seu Desktop</string>
|
||||
<string name="plugin_not_supported">Este plugin não é suportado pelo dispositivo</string>
|
||||
<string name="findmyphone_title">Encontrar meu telefone</string>
|
||||
<string name="findmyphone_description">Faça este telefone tocar para encontrá-lo.</string>
|
||||
<string name="findmyphone_found">Encontrado</string>
|
||||
<string name="open">Abrir</string>
|
||||
<string name="close">Fechar</string>
|
||||
</resources>
|
||||
|
@ -12,6 +12,8 @@
|
||||
<string name="pref_plugin_mousepad_desc">Usar o seu telefone como um rato ou teclado</string>
|
||||
<string name="pref_plugin_mpris">Comandos multimédia</string>
|
||||
<string name="pref_plugin_mpris_desc">Controlar o áudio/vídeo a partir do seu telefone</string>
|
||||
<string name="pref_plugin_runcommand">Executar um Comando</string>
|
||||
<string name="pref_plugin_runcommand_desc">Executa um comando no seu sistema</string>
|
||||
<string name="pref_plugin_ping">Contacto</string>
|
||||
<string name="pref_plugin_ping_desc">Enviar e receber pedidos de contacto (\'ping\')</string>
|
||||
<string name="pref_plugin_notifications">Sincronização da notificação</string>
|
||||
@ -138,4 +140,9 @@
|
||||
<string name="pref_plugin_telepathy">Enviar um SMS</string>
|
||||
<string name="pref_plugin_telepathy_desc">Enviar mensagens de texto a partir do seu ambiente de trabalho</string>
|
||||
<string name="plugin_not_supported">Este \'plugin\' não é suportado pelo dispositivo</string>
|
||||
<string name="findmyphone_title">Descobrir o Meu Telefone</string>
|
||||
<string name="findmyphone_description">Toca este telefone para que o possa encontrar.</string>
|
||||
<string name="findmyphone_found">Encontrado</string>
|
||||
<string name="open">Abrir</string>
|
||||
<string name="close">Fechar</string>
|
||||
</resources>
|
||||
|
@ -1,65 +1,148 @@
|
||||
<?xml version='1.0' encoding='utf-8'?>
|
||||
<resources>
|
||||
<string name="pref_plugin_telephony">Уведомления телефонии</string>
|
||||
<string name="pref_plugin_telephony_desc">Отправлять уведомления о SMS и звонках</string>
|
||||
<string name="pref_plugin_telephony">События телефонии</string>
|
||||
<string name="pref_plugin_telephony_desc">Отправка уведомлений об SMS и звонках</string>
|
||||
<string name="pref_plugin_battery">Состояние батареи</string>
|
||||
<string name="pref_plugin_battery_desc">Периодически сообщать о состоянии батареи</string>
|
||||
<string name="pref_plugin_battery_desc">Периодическое информирование о состоянии батареи</string>
|
||||
<string name="pref_plugin_sftp">Просмотр файловой системы</string>
|
||||
<string name="pref_plugin_sftp_desc">Позволяет удалённо просматривать файловую систему телефона</string>
|
||||
<string name="pref_plugin_clipboard">Синхронизация буфера обмена</string>
|
||||
<string name="pref_plugin_clipboard_desc">Сделать содержимое буфера обмена общим</string>
|
||||
<string name="pref_plugin_mpris_desc">Управление аудио/видео с устройства</string>
|
||||
<string name="pref_plugin_clipboard_desc">Использование общего буфера обмена</string>
|
||||
<string name="pref_plugin_mousepad">Удалённый ввод</string>
|
||||
<string name="pref_plugin_mousepad_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_runcommand_desc">Выполнение команд на вашем компьютере</string>
|
||||
<string name="pref_plugin_ping">Пинг</string>
|
||||
<string name="pref_plugin_ping_desc">Посылать и получать пинги</string>
|
||||
<string name="pref_plugin_ping_desc">Отправка и получение тестовых сигналов</string>
|
||||
<string name="pref_plugin_notifications">Синхронизация уведомлений</string>
|
||||
<string name="pref_plugin_notifications_desc">Доступ к уведомлениям с других устройств</string>
|
||||
<string name="plugin_not_available">Этот функционал недоступен в вашей версии Android</string>
|
||||
<string name="pref_plugin_sharereceiver">Отправка и приём данных</string>
|
||||
<string name="pref_plugin_sharereceiver_desc">Пересылка файлов и адресов URL между устройствами</string>
|
||||
<string name="plugin_not_available">Эта функциональность недоступна в вашей версии Android</string>
|
||||
<string name="device_list_empty">Нет устройств</string>
|
||||
<string name="ok">OK</string>
|
||||
<string name="ok">ОК</string>
|
||||
<string name="cancel">Отмена</string>
|
||||
<string name="open_settings">Открыть настройки</string>
|
||||
<string name="no_permissions">Вы должны разрешить доступ к уведомлениям</string>
|
||||
<string name="send_ping">Послать пинг</string>
|
||||
<string name="open_settings">Настроить</string>
|
||||
<string name="no_permissions">Нужно разрешить доступ к уведомлениям</string>
|
||||
<string name="send_ping">Отправить тестовый сигнал</string>
|
||||
<string name="open_mpris_controls">Управление воспроизведением</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-array name="mousepad_tap_entries">
|
||||
<item>Right click</item>
|
||||
<item>Middle click</item>
|
||||
<item>Nothing</item>
|
||||
<item>Нажатие правой кнопки</item>
|
||||
<item>Нажатие средней кнопки</item>
|
||||
<item>Ничего не делать</item>
|
||||
</string-array>
|
||||
<string name="mousepad_double_default">Нажатие правой кнопки</string>
|
||||
<string name="mousepad_triple_default">Нажатие средней кнопки</string>
|
||||
<string name="category_connected_devices">Подключённые устройства</string>
|
||||
<string name="category_remembered_devices">Запомненные устройства</string>
|
||||
<string name="plugins_failed_to_load">Сбой загрузки следующих модулей (прикоснитесь чтобы получить подробности):</string>
|
||||
<string name="device_menu_unpair">Разделить спаренные устройства</string>
|
||||
<string name="category_not_paired_devices">Доступные устройства</string>
|
||||
<string name="category_remembered_devices">Известные устройства</string>
|
||||
<string name="plugins_failed_to_load">Не удалось загрузить следующие модули (нажмите для просмотра подробностей):</string>
|
||||
<string name="device_menu_plugins">Настройка модулей</string>
|
||||
<string name="device_menu_unpair">Снять сопряжение</string>
|
||||
<string name="device_not_reachable">Сопряжённое устройство недоступно</string>
|
||||
<string name="unknown_device">Неизвестное устройство</string>
|
||||
<string name="error_not_reachable">Устройство недоступно</string>
|
||||
<string name="error_already_requested">Запрос на спаривание уже был сделан</string>
|
||||
<string name="error_already_paired">Устройство уже спарено</string>
|
||||
<string name="error_could_not_send_package">Не удалось послать пакет</string>
|
||||
<string name="error_already_requested">Запрос на сопряжение уже был сделан</string>
|
||||
<string name="error_already_paired">Устройство уже сопряжено</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_invalid_key">Недопустимый получатель ключа</string>
|
||||
<string name="pair_requested">Запрошено спаривание</string>
|
||||
<string name="pairing_request_from">Запрос на спаривание от %1s</string>
|
||||
<string name="tap_to_answer">Коснитесь чтобы ответить</string>
|
||||
<string name="reconnect">Переподключить</string>
|
||||
<string name="device_not_paired">Устройство не спарено</string>
|
||||
<string name="request_pairing">Запросить спаривание</string>
|
||||
<string name="error_invalid_key">Получен недопустимый ключ</string>
|
||||
<string name="pair_requested">Запрошено сопряжение</string>
|
||||
<string name="pairing_request_from">Запрос на сопряжение от %1s</string>
|
||||
<string name="received_url_title">Получена ссылка от %1s</string>
|
||||
<string name="received_url_text">Нажмите, чтобы открыть «%1s»</string>
|
||||
<string name="incoming_file_title">Входящий файл с %1s</string>
|
||||
<string name="incoming_file_text">%1s</string>
|
||||
<string name="outgoing_file_title">Отправка файла на %1s</string>
|
||||
<string name="outgoing_file_text">%1s</string>
|
||||
<string name="received_file_title">Получен файл с %1s</string>
|
||||
<string name="received_file_fail_title">Не удалось получить файл с %1s</string>
|
||||
<string name="received_file_text">Нажмите, чтобы открыть «%1s»</string>
|
||||
<string name="sent_file_title">Файл отправлен на %1s</string>
|
||||
<string name="sent_file_text">%1s</string>
|
||||
<string name="sent_file_failed_title">Не удалось отправить файл %1s</string>
|
||||
<string name="sent_file_failed_text">%1s</string>
|
||||
<string name="tap_to_answer">Нажмите, чтобы ответить</string>
|
||||
<string name="reconnect">Подключить заново</string>
|
||||
<string name="right_click">Нажатие правой кнопки</string>
|
||||
<string name="middle_click">Нажатие средней кнопки</string>
|
||||
<string name="show_keyboard">Показать клавиатуру</string>
|
||||
<string name="device_not_paired">Устройство не сопряжено</string>
|
||||
<string name="request_pairing">Запросить сопряжение</string>
|
||||
<string name="pairing_accept">Принять</string>
|
||||
<string name="pairing_reject">Отклонить</string>
|
||||
<string name="device">Устройство</string>
|
||||
<string name="pair_device">Спарить устройство</string>
|
||||
<string name="pair_device">Сопрячь устройство</string>
|
||||
<string name="remote_control">Дистанционное управление</string>
|
||||
<string name="settings">Настройки KDE Connect</string>
|
||||
<string name="mpris_play">Воспроизвести</string>
|
||||
<string name="mpris_previous">Предыдущий</string>
|
||||
<string name="mpris_next">Следующее</string>
|
||||
<string name="settings">Настройка KDE Connect</string>
|
||||
<string name="mpris_play">Воспроизведение</string>
|
||||
<string name="mpris_previous">Предыдущая</string>
|
||||
<string name="mpris_rew">Назад</string>
|
||||
<string name="mpris_ff">Вперёд</string>
|
||||
<string name="mpris_next">Следующая</string>
|
||||
<string name="mpris_volume">Громкость</string>
|
||||
<string name="mpris_settings">Настройка мультимедиа</string>
|
||||
<string name="mpris_time_settings_title">Кнопки вперёд/назад</string>
|
||||
<string name="mpris_time_settings_summary">Дальность перемотки вперёд/назад при нажатии.</string>
|
||||
<string-array name="mpris_time_entries">
|
||||
<item>10 seconds</item>
|
||||
<item>20 seconds</item>
|
||||
<item>30 seconds</item>
|
||||
<item>1 minute</item>
|
||||
<item>2 minutes</item>
|
||||
<item>10 секунд</item>
|
||||
<item>20 секунд</item>
|
||||
<item>30 секунд</item>
|
||||
<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="share_to">Отправить на...</string>
|
||||
<string name="protocol_version_older">Это устройство использует старую версию протокола.</string>
|
||||
<string name="protocol_version_newer">Это устройство использует более новую версию протокола.</string>
|
||||
<string name="general_settings">Общие параметры</string>
|
||||
<string name="plugin_settings">Настройка</string>
|
||||
<string name="plugin_settings_with_name">Настройка %s</string>
|
||||
<string name="device_name">Имя устройства</string>
|
||||
<string name="device_name_preference_summary">%s</string>
|
||||
<string name="invalid_device_name">Недопустимое имя устройства</string>
|
||||
<string name="shareplugin_text_saved">Получен текст, он сохранен в буфер обмена</string>
|
||||
<string name="custom_devices_settings">Ручной список устройств</string>
|
||||
<string name="pair_device_action">Сопрячь с новым устройством</string>
|
||||
<string name="unpair_device_action">Снять сопряжение с %s</string>
|
||||
<string name="custom_device_list">Добавить устройства по IP</string>
|
||||
<string name="share_notification_preference">Звуковые уведомления</string>
|
||||
<string name="share_notification_preference_summary">Использовать звуковой сигнал и вибрацию при получении файла.</string>
|
||||
<string name="title_activity_notification_filter">Фильтр уведомлений</string>
|
||||
<string name="filter_apps_info">Уведомления будут синхронизированы для выбранных приложений.</string>
|
||||
<string name="sftp_internal_storage">Встроенная память</string>
|
||||
<string name="sftp_all_files">Все файлы</string>
|
||||
<string name="sftp_sdcard_num">SD-карта %d</string>
|
||||
<string name="sftp_sdcard">SD-карта</string>
|
||||
<string name="sftp_readonly">(только чтение)</string>
|
||||
<string name="sftp_camera">Фотографии с камеры</string>
|
||||
<string name="add_host">Добавить хост/IP-адрес</string>
|
||||
<string name="add_host_hint">Имя хоста или IP-адрес</string>
|
||||
<string name="no_players_connected">Медиапроигрывателей не найдено</string>
|
||||
<string name="custom_dev_list_help">Используйте эту форму только если ваше устройство не определяется автоматически. Введите IP-адрес или имя хоста ниже и нажмите кнопку для добавления в список. Нажмите на существующий элемент для удаления из списка.</string>
|
||||
<string name="mpris_player_on_device">%1$s на %2$s</string>
|
||||
<string name="send_files">Отправить файлы</string>
|
||||
<string name="pairing_title">Устройства с KDE Connect</string>
|
||||
<string name="pairing_description">Здесь появятся другие устройства в этой же сети, на которых запущен KDE Connect.</string>
|
||||
<string name="device_paired">Устройство сопряжено</string>
|
||||
<string name="device_rename_title">Переименование устройства</string>
|
||||
<string name="device_rename_confirm">Переименовать</string>
|
||||
<string name="refresh">Обновить</string>
|
||||
<string name="unreachable_description">Это сопряжённое устройство недоступно. Проверьте, что оно подключено к той же локальной сети.</string>
|
||||
<string name="no_file_browser">Не удалось открыть диалог выбора файла.</string>
|
||||
<string name="pref_plugin_telepathy">Отправка SMS</string>
|
||||
<string name="pref_plugin_telepathy_desc">Отправка SMS-сообщений с вашего компьютера</string>
|
||||
<string name="plugin_not_supported">Этот модуль не поддерживается устройством</string>
|
||||
<string name="findmyphone_title">Поиск телефона</string>
|
||||
<string name="findmyphone_description">Подача звукового сигнала на телефоне, чтобы вы могли его найти.</string>
|
||||
<string name="findmyphone_found">Найден</string>
|
||||
<string name="open">Открыть</string>
|
||||
<string name="close">Закрыть</string>
|
||||
</resources>
|
||||
|
@ -12,6 +12,8 @@
|
||||
<string name="pref_plugin_mousepad_desc">Použiť váš telefón ako myš a klávesnicu</string>
|
||||
<string name="pref_plugin_mpris">Multimediálne ovládače</string>
|
||||
<string name="pref_plugin_mpris_desc">Ovládať audio/video z vášho telefónu</string>
|
||||
<string name="pref_plugin_runcommand">Spustiť príkaz</string>
|
||||
<string name="pref_plugin_runcommand_desc">Spustí príkazy na vašom systéme</string>
|
||||
<string name="pref_plugin_ping">Ping</string>
|
||||
<string name="pref_plugin_ping_desc">Poslať a prijať pingy</string>
|
||||
<string name="pref_plugin_notifications">Synchronizácia pripomienok</string>
|
||||
@ -108,6 +110,8 @@
|
||||
<string name="invalid_device_name">Neplatný názov zariadenia</string>
|
||||
<string name="shareplugin_text_saved">Prijatý text, uložený do schránky</string>
|
||||
<string name="custom_devices_settings">Zoznam vlastných zariadení</string>
|
||||
<string name="pair_device_action">Spárovať nové zariadenie</string>
|
||||
<string name="unpair_device_action">Odpárovať %s</string>
|
||||
<string name="custom_device_list">Pridať zariadenia podľa IP</string>
|
||||
<string name="share_notification_preference">Hlučné pripomienky</string>
|
||||
<string name="share_notification_preference_summary">Vibrovať a prehrať zvuk pri prijatí súboru</string>
|
||||
@ -124,4 +128,21 @@
|
||||
<string name="no_players_connected">Nenašli sa žiadne prehrávače</string>
|
||||
<string name="custom_dev_list_help">Túto voľbu použite iba vtedy, ak vaše zariadenie nie je automaticky detekované. Zadajte IP adresu alebo názov hostiteľa nižšie a kliknite na tlačidlo na pridanie do zoznamu. Kliknite na existujúcu položku na odstránenie jej zo zoznamu.</string>
|
||||
<string name="mpris_player_on_device">%1$s na %2$s</string>
|
||||
<string name="send_files">Odoslať súbory</string>
|
||||
<string name="pairing_title">KDE Connect zariadenia</string>
|
||||
<string name="pairing_description">Iné zariadenie so spusteným KDE Connect v rovnakej sieti by sa tu mali objaviť.</string>
|
||||
<string name="device_paired">Zariadenie spárované</string>
|
||||
<string name="device_rename_title">Premenovať zariadenie</string>
|
||||
<string name="device_rename_confirm">Premenovať</string>
|
||||
<string name="refresh">Obnoviť</string>
|
||||
<string name="unreachable_description">Toto spárované zariadenie nie je dosiahnuteľné. Prosím, uistite sa, že je pripojené do rovnakej siete.</string>
|
||||
<string name="no_file_browser">Nie sú nainštalované žiadne prehliadače.</string>
|
||||
<string name="pref_plugin_telepathy">Poslať SMS</string>
|
||||
<string name="pref_plugin_telepathy_desc">Posielať textové správy z vášho počítača</string>
|
||||
<string name="plugin_not_supported">Tento plugin nie je podporovaný zariadením</string>
|
||||
<string name="findmyphone_title">Nájsť môj telefón</string>
|
||||
<string name="findmyphone_description">Prezvoní vaše zariadenie, aby ste ho našli.</string>
|
||||
<string name="findmyphone_found">Nájdené</string>
|
||||
<string name="open">Otvoriť</string>
|
||||
<string name="close">Zavrieť</string>
|
||||
</resources>
|
||||
|
@ -12,6 +12,8 @@
|
||||
<string name="pref_plugin_mousepad_desc">Använd telefonen som mus och tangentbord</string>
|
||||
<string name="pref_plugin_mpris">Multimediakontroller</string>
|
||||
<string name="pref_plugin_mpris_desc">Styr ljud och video från telefonen</string>
|
||||
<string name="pref_plugin_runcommand">Kör kommando</string>
|
||||
<string name="pref_plugin_runcommand_desc">Kör ett kommando på systemet</string>
|
||||
<string name="pref_plugin_ping">Ping</string>
|
||||
<string name="pref_plugin_ping_desc">Skicka och ta emot ping</string>
|
||||
<string name="pref_plugin_notifications">Synkronisering av underrättelser</string>
|
||||
@ -133,9 +135,14 @@
|
||||
<string name="device_rename_title">Byt namn på apparat</string>
|
||||
<string name="device_rename_confirm">Byt namn</string>
|
||||
<string name="refresh">Uppdatera</string>
|
||||
<string name="unreachable_description">Den här ihopparade apparaten kan inte nås. Försälkra dig om att den är ansluten till samma nätverk.</string>
|
||||
<string name="unreachable_description">Den här ihopparade apparaten kan inte nås. Försäkra dig om att den är ansluten till samma nätverk.</string>
|
||||
<string name="no_file_browser">Det finns inga filbläddrare installerade.</string>
|
||||
<string name="pref_plugin_telepathy">Skicka SMS</string>
|
||||
<string name="pref_plugin_telepathy_desc">Skicka textmeddelanden från skrivbordet</string>
|
||||
<string name="plugin_not_supported">Insticksprogrammet stöds inte av apparaten</string>
|
||||
<string name="findmyphone_title">Hitta min telefon</string>
|
||||
<string name="findmyphone_description">Ringer till telefonen så att du kan hitta den.</string>
|
||||
<string name="findmyphone_found">Hittade den</string>
|
||||
<string name="open">Öppna</string>
|
||||
<string name="close">Stäng</string>
|
||||
</resources>
|
||||
|
@ -12,6 +12,8 @@
|
||||
<string name="pref_plugin_mousepad_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_runcommand_desc">Виконує команду у вашій системі</string>
|
||||
<string name="pref_plugin_ping">Підтримання зв’язку</string>
|
||||
<string name="pref_plugin_ping_desc">Надсилання і отримання сигналів підтримання зв’язку</string>
|
||||
<string name="pref_plugin_notifications">Синхронізація сповіщень</string>
|
||||
@ -138,4 +140,9 @@
|
||||
<string name="pref_plugin_telepathy">Надіслати SMS</string>
|
||||
<string name="pref_plugin_telepathy_desc">Надсилати текстові повідомлення з вашої робочої станції</string>
|
||||
<string name="plugin_not_supported">Підтримки цього додатка не передбачено на пристрої</string>
|
||||
<string name="findmyphone_title">Знайти телефон</string>
|
||||
<string name="findmyphone_description">Відтворити дзвінок, щоб телефон було простіше знайти.</string>
|
||||
<string name="findmyphone_found">Знайдено</string>
|
||||
<string name="open">Відкрити</string>
|
||||
<string name="close">Закрити</string>
|
||||
</resources>
|
||||
|
@ -10,11 +10,16 @@
|
||||
<string name="pref_plugin_clipboard_desc">共享剪贴板内容</string>
|
||||
<string name="pref_plugin_mousepad">远程输入</string>
|
||||
<string name="pref_plugin_mousepad_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_runcommand_desc">在您的系统上执行命令</string>
|
||||
<string name="pref_plugin_ping">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_sharereceiver">分享和接收</string>
|
||||
<string name="pref_plugin_sharereceiver_desc">在设备间共享文件和 URL</string>
|
||||
<string name="plugin_not_available">该特性不适用于您的Android版本</string>
|
||||
<string name="device_list_empty">无设备</string>
|
||||
<string name="ok">确认</string>
|
||||
@ -22,6 +27,8 @@
|
||||
<string name="open_settings">开启设置</string>
|
||||
<string name="no_permissions">你需要授予权限以便访问通知</string>
|
||||
<string name="send_ping">发送ping</string>
|
||||
<string name="open_mpris_controls">多媒体控制</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>
|
||||
@ -103,6 +110,8 @@
|
||||
<string name="invalid_device_name">设备名无效</string>
|
||||
<string name="shareplugin_text_saved">已收到文本,存至剪贴板</string>
|
||||
<string name="custom_devices_settings">自定义设备列表</string>
|
||||
<string name="pair_device_action">配对新设备</string>
|
||||
<string name="unpair_device_action">取消配对 %s</string>
|
||||
<string name="custom_device_list">通过IP增加设备</string>
|
||||
<string name="share_notification_preference">出声通知</string>
|
||||
<string name="share_notification_preference_summary">当收到文件时震动并播放声音</string>
|
||||
@ -119,4 +128,21 @@
|
||||
<string name="no_players_connected">未找到播放器</string>
|
||||
<string name="custom_dev_list_help">仅当你的设备没有被自动检测出时再使用本选项。在下方输入IP地址或主机名,然后点击按钮以添加其到列表中。点击已有条目来从列表中删除它。</string>
|
||||
<string name="mpris_player_on_device">%2$s上的%1$s</string>
|
||||
<string name="send_files">发送文件</string>
|
||||
<string name="pairing_title">KDE Connect 设备</string>
|
||||
<string name="pairing_description">其他在同一网络运行 KDE Connect 的设备会在此处显示。</string>
|
||||
<string name="device_paired">已配对设备</string>
|
||||
<string name="device_rename_title">重命名设备</string>
|
||||
<string name="device_rename_confirm">重命名</string>
|
||||
<string name="refresh">刷新</string>
|
||||
<string name="unreachable_description">此配对设备不可达。请确认它已经连接到与您相同的网络。</string>
|
||||
<string name="no_file_browser">未安装文件浏览器</string>
|
||||
<string name="pref_plugin_telepathy">发送短消息</string>
|
||||
<string name="pref_plugin_telepathy_desc">从桌面发送短消息</string>
|
||||
<string name="plugin_not_supported">设备不支持此插件</string>
|
||||
<string name="findmyphone_title">找到我的手机</string>
|
||||
<string name="findmyphone_description">让手机响铃从而找到它</string>
|
||||
<string name="findmyphone_found">找到</string>
|
||||
<string name="open">打开</string>
|
||||
<string name="close">关闭</string>
|
||||
</resources>
|
||||
|
@ -13,6 +13,8 @@
|
||||
<string name="pref_plugin_mousepad_desc">Use your phone as a mouse and keyboard</string>
|
||||
<string name="pref_plugin_mpris">Multimedia controls</string>
|
||||
<string name="pref_plugin_mpris_desc">Control audio/video from your phone</string>
|
||||
<string name="pref_plugin_runcommand">Run Command</string>
|
||||
<string name="pref_plugin_runcommand_desc">Runs a command on your system</string>
|
||||
<string name="pref_plugin_ping">Ping</string>
|
||||
<string name="pref_plugin_ping_desc">Send and receive pings</string>
|
||||
<string name="pref_plugin_notifications">Notification sync</string>
|
||||
@ -33,6 +35,8 @@
|
||||
<string name="mousepad_triple_tap_settings_title">Set three finger tap action</string>
|
||||
<string name="mousepad_double_tap_key" translatable="false">mousepad_double_tap_key</string>
|
||||
<string name="mousepad_triple_tap_key" translatable="false">mousepad_triple_tap_key</string>
|
||||
<string name="mousepad_scroll_direction_title">Reverse Scrolling Direction</string>
|
||||
<string name="mousepad_scroll_direction" translatable="false">mousepad_scroll_direction</string>
|
||||
<string-array name="mousepad_tap_entries">
|
||||
<item>Right click</item>
|
||||
<item>Middle click</item>
|
||||
@ -160,5 +164,10 @@
|
||||
<string name="pref_plugin_telepathy">Send SMS</string>
|
||||
<string name="pref_plugin_telepathy_desc">Send text messages from your desktop</string>
|
||||
<string name="plugin_not_supported">This plugin is not supported by the device</string>
|
||||
<string name="findmyphone_title">Find My Phone</string>
|
||||
<string name="findmyphone_description">Rings this phone so you can find it.</string>
|
||||
<string name="findmyphone_found">Found</string>
|
||||
|
||||
<string name="open">Open</string>
|
||||
<string name="close">Close</string>
|
||||
</resources>
|
||||
|
@ -20,5 +20,9 @@
|
||||
android:entries="@array/mousepad_tap_entries"
|
||||
android:entryValues="@array/mousepad_tap_values"
|
||||
android:defaultValue="@string/mousepad_triple_default" />
|
||||
|
||||
<CheckBoxPreference
|
||||
android:id="@+id/mousepad_scroll_preference"
|
||||
android:key="@string/mousepad_scroll_direction"
|
||||
android:title="@string/mousepad_scroll_direction_title"
|
||||
android:defaultValue="false" />
|
||||
</PreferenceScreen>
|
@ -74,22 +74,14 @@ public class LanPairingHandler extends BasePairingHandler {
|
||||
|
||||
boolean wantsPair = np.getBoolean("pair");
|
||||
|
||||
Log.e("KDE/LPHPackageReceived", "Wants pair " + wantsPair + ", isPaired " + isPaired() );
|
||||
|
||||
if (wantsPair == isPaired()) {
|
||||
if (mPairStatus == PairStatus.Requested) {
|
||||
//Log.e("Device","Unpairing (pair rejected)");
|
||||
mPairStatus = PairStatus.NotPaired;
|
||||
if (mPairingTimer != null) mPairingTimer.cancel();
|
||||
hidePairingNotification();
|
||||
mCallback.pairingFailed(mDevice.getContext().getString(R.string.error_canceled_by_other_peer));
|
||||
return;
|
||||
} else if (mPairStatus == PairStatus.Paired) {
|
||||
/**
|
||||
* If wants pair is true and is paired is true, this means other device is trying to pair again, might be because it unpaired this device somehow
|
||||
* and we don't know it, unpair it internally
|
||||
*/
|
||||
mCallback.unpaired();
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
if (wantsPair) {
|
||||
@ -100,21 +92,20 @@ public class LanPairingHandler extends BasePairingHandler {
|
||||
byte[] publicKeyBytes = Base64.decode(publicKeyContent, 0);
|
||||
mDevice.publicKey = KeyFactory.getInstance("RSA").generatePublic(new X509EncodedKeySpec(publicKeyBytes));
|
||||
} catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
Log.e("KDE/Device","Pairing exception: Received incorrect key");
|
||||
mCallback.pairingFailed(mDevice.getContext().getString(R.string.error_invalid_key));
|
||||
return;
|
||||
}
|
||||
|
||||
if (mPairStatus == PairStatus.Requested) { //We started pairing
|
||||
|
||||
Log.i("KDE/Pairing","Pair answer");
|
||||
|
||||
if (mPairingTimer != null) mPairingTimer.cancel();
|
||||
hidePairingNotification();
|
||||
|
||||
pairingDone();
|
||||
|
||||
} else {
|
||||
|
||||
Log.i("KDE/Pairing", "Pair request");
|
||||
|
||||
/**
|
||||
* If device is already paired, accept pairing silently
|
||||
*/
|
||||
@ -127,9 +118,9 @@ public class LanPairingHandler extends BasePairingHandler {
|
||||
* Pairing notifications are still managed by device as there is no other way to know about notificationId to cancel notification when PairActivity is started
|
||||
* Even putting notificationId in intent does not work because PairActivity can be started from MainActivity too, so then notificationId cannot be set
|
||||
*/
|
||||
hidePairingNotification();
|
||||
mDevice.displayPairingNotification();
|
||||
|
||||
if (mPairingTimer != null) mPairingTimer.cancel();
|
||||
mPairingTimer = new Timer();
|
||||
|
||||
mPairingTimer.schedule(new TimerTask() {
|
||||
@ -137,8 +128,7 @@ public class LanPairingHandler extends BasePairingHandler {
|
||||
public void run() {
|
||||
Log.e("KDE/Device","Unpairing (timeout B)");
|
||||
mPairStatus = PairStatus.NotPaired;
|
||||
|
||||
mDevice.cancelPairingNotification();
|
||||
hidePairingNotification();
|
||||
}
|
||||
}, 25*1000); //Time to show notification, waiting for user to accept (peer will timeout in 30 seconds)
|
||||
mPairStatus = PairStatus.RequestedByPeer;
|
||||
@ -149,7 +139,7 @@ public class LanPairingHandler extends BasePairingHandler {
|
||||
Log.i("KDE/Pairing", "Unpair request");
|
||||
|
||||
if (mPairStatus == PairStatus.Requested) {
|
||||
if (mPairingTimer != null) mPairingTimer.cancel();
|
||||
hidePairingNotification();
|
||||
mCallback.pairingFailed(mDevice.getContext().getString(R.string.error_canceled_by_other_peer));
|
||||
} else if (mPairStatus == PairStatus.Paired) {
|
||||
mCallback.unpaired();
|
||||
@ -167,7 +157,7 @@ public class LanPairingHandler extends BasePairingHandler {
|
||||
Device.SendPackageStatusCallback statusCallback = new Device.SendPackageStatusCallback() {
|
||||
@Override
|
||||
protected void onSuccess() {
|
||||
if (mPairingTimer != null) mPairingTimer.cancel();
|
||||
hidePairingNotification(); //Will stop the pairingTimer if it was running
|
||||
mPairingTimer = new Timer();
|
||||
mPairingTimer.schedule(new TimerTask() {
|
||||
@Override
|
||||
@ -185,12 +175,20 @@ public class LanPairingHandler extends BasePairingHandler {
|
||||
mCallback.pairingFailed(mDevice.getContext().getString(R.string.error_could_not_send_package));
|
||||
}
|
||||
};
|
||||
//createPublicKeyPackage() ?
|
||||
mDevice.sendPackage(createPairPackage(), statusCallback);
|
||||
}
|
||||
|
||||
public void hidePairingNotification() {
|
||||
mDevice.hidePairingNotification();
|
||||
if (pairingTimer != null) {
|
||||
pairingTimer.cancel();
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void acceptPairing() {
|
||||
if (mPairingTimer != null) mPairingTimer.cancel();
|
||||
hidePairingNotification();
|
||||
Device.SendPackageStatusCallback statusCallback = new Device.SendPackageStatusCallback() {
|
||||
@Override
|
||||
protected void onSuccess() {
|
||||
@ -207,7 +205,7 @@ public class LanPairingHandler extends BasePairingHandler {
|
||||
|
||||
@Override
|
||||
public void rejectPairing() {
|
||||
if (mPairingTimer != null) mPairingTimer.cancel();
|
||||
hidePairingNotification();
|
||||
mPairStatus = PairStatus.NotPaired;
|
||||
NetworkPackage np = new NetworkPackage(NetworkPackage.PACKAGE_TYPE_PAIR);
|
||||
np.set("pair", false);
|
||||
|
@ -74,11 +74,11 @@ public class BackgroundService extends Service {
|
||||
}
|
||||
}
|
||||
|
||||
public static void addGuiInUseCounter(Activity activity) {
|
||||
public static void addGuiInUseCounter(Context activity) {
|
||||
addGuiInUseCounter(activity, false);
|
||||
}
|
||||
|
||||
public static void addGuiInUseCounter(final Activity activity, final boolean forceNetworkRefresh) {
|
||||
public static void addGuiInUseCounter(final Context activity, final boolean forceNetworkRefresh) {
|
||||
BackgroundService.RunCommand(activity, new BackgroundService.InstanceCallback() {
|
||||
@Override
|
||||
public void onServiceStart(BackgroundService service) {
|
||||
@ -90,7 +90,7 @@ public class BackgroundService extends Service {
|
||||
});
|
||||
}
|
||||
|
||||
public static void removeGuiInUseCounter(final Activity activity) {
|
||||
public static void removeGuiInUseCounter(final Context activity) {
|
||||
BackgroundService.RunCommand(activity, new BackgroundService.InstanceCallback() {
|
||||
@Override
|
||||
public void onServiceStart(BackgroundService service) {
|
||||
@ -163,7 +163,7 @@ public class BackgroundService extends Service {
|
||||
|
||||
private void cleanDevices() {
|
||||
for(Device d : devices.values()) {
|
||||
if (!d.isPaired()) {
|
||||
if (!d.isPaired() && !d.isPairRequested() && !d.isPairRequestedByOtherEnd() && d.getConnectionSource() == BaseLink.ConnectionStarted.Remotely) {
|
||||
d.disconnect();
|
||||
}
|
||||
}
|
||||
@ -183,9 +183,14 @@ public class BackgroundService extends Service {
|
||||
} else {
|
||||
Log.i("KDE/BackgroundService", "addLink,unknown device: " + deviceId);
|
||||
device = new Device(BackgroundService.this, identityPackage, link);
|
||||
if (device.isPaired() || !discoveryModeAcquisitions.isEmpty()) {
|
||||
if (device.isPaired() || device.isPairRequested() || device.isPairRequestedByOtherEnd()
|
||||
|| link.getConnectionSource() == BaseLink.ConnectionStarted.Locally
|
||||
||!discoveryModeAcquisitions.isEmpty() )
|
||||
{
|
||||
devices.put(deviceId, device);
|
||||
device.addPairingCallback(devicePairingCallback);
|
||||
} else {
|
||||
device.disconnect();
|
||||
}
|
||||
}
|
||||
|
||||
@ -198,7 +203,7 @@ public class BackgroundService extends Service {
|
||||
Log.i("KDE/onConnectionLost", "removeLink, deviceId: " + link.getDeviceId());
|
||||
if (d != null) {
|
||||
d.removeLink(link);
|
||||
if (!d.isReachable() && !d.isPaired() && (link.getConnectionSource() == BaseLink.ConnectionStarted.Locally)) {
|
||||
if (!d.isReachable() && !d.isPaired()) {
|
||||
//Log.e("onConnectionLost","Removing connection device because it was not paired");
|
||||
devices.remove(link.getDeviceId());
|
||||
d.removePairingCallback(devicePairingCallback);
|
||||
@ -295,11 +300,14 @@ public class BackgroundService extends Service {
|
||||
public int onStartCommand(Intent intent, int flags, int startId) {
|
||||
//This will be called for each intent launch, even if the service is already started and it is reused
|
||||
mutex.lock();
|
||||
for (InstanceCallback c : callbacks) {
|
||||
c.onServiceStart(this);
|
||||
try {
|
||||
for (InstanceCallback c : callbacks) {
|
||||
c.onServiceStart(this);
|
||||
}
|
||||
callbacks.clear();
|
||||
} finally {
|
||||
mutex.unlock();
|
||||
}
|
||||
callbacks.clear();
|
||||
mutex.unlock();
|
||||
return Service.START_STICKY;
|
||||
}
|
||||
|
||||
@ -313,8 +321,11 @@ public class BackgroundService extends Service {
|
||||
public void run() {
|
||||
if (callback != null) {
|
||||
mutex.lock();
|
||||
callbacks.add(callback);
|
||||
mutex.unlock();
|
||||
try {
|
||||
callbacks.add(callback);
|
||||
} finally {
|
||||
mutex.unlock();
|
||||
}
|
||||
}
|
||||
Intent serviceIntent = new Intent(c, BackgroundService.class);
|
||||
c.startService(serviceIntent);
|
||||
|
@ -28,8 +28,6 @@ import android.content.Intent;
|
||||
import android.content.SharedPreferences;
|
||||
import android.content.res.Resources;
|
||||
import android.graphics.drawable.Drawable;
|
||||
import android.os.Handler;
|
||||
import android.os.Looper;
|
||||
import android.preference.PreferenceManager;
|
||||
import android.support.v4.app.NotificationCompat;
|
||||
import android.support.v4.content.ContextCompat;
|
||||
@ -38,6 +36,7 @@ import android.util.Log;
|
||||
|
||||
import org.kde.kdeconnect.Backends.BaseLink;
|
||||
import org.kde.kdeconnect.Backends.BasePairingHandler;
|
||||
import org.kde.kdeconnect.Helpers.ObjectsHelper;
|
||||
import org.kde.kdeconnect.Plugins.Plugin;
|
||||
import org.kde.kdeconnect.Plugins.PluginFactory;
|
||||
import org.kde.kdeconnect.UserInterface.MaterialActivity;
|
||||
@ -57,6 +56,9 @@ import java.util.HashMap;
|
||||
import java.util.HashSet;
|
||||
import java.util.Map;
|
||||
import java.util.Set;
|
||||
import java.util.Timer;
|
||||
import java.util.TimerTask;
|
||||
import java.util.concurrent.ConcurrentHashMap;
|
||||
import java.util.concurrent.CopyOnWriteArrayList;
|
||||
|
||||
public class Device implements BaseLink.PackageReceiver {
|
||||
@ -81,11 +83,12 @@ public class Device implements BaseLink.PackageReceiver {
|
||||
private ArrayList<String> incomingCapabilities;
|
||||
private ArrayList<String> outgoingCapabilities;
|
||||
|
||||
private final HashMap<String, Plugin> plugins = new HashMap<>();
|
||||
private final HashMap<String, Plugin> failedPlugins = new HashMap<>();
|
||||
private final ConcurrentHashMap<String, Plugin> plugins = new ConcurrentHashMap<>();
|
||||
private final ConcurrentHashMap<String, Plugin> failedPlugins = new ConcurrentHashMap<>();
|
||||
|
||||
private ArrayList<String> unsupportedPlugins = new ArrayList<>();
|
||||
private HashSet<String> supportedIncomingInterfaces = new HashSet<>();
|
||||
private HashSet<String> supportedOutgoingInterfaces = new HashSet<>();
|
||||
|
||||
private HashMap<String, ArrayList<String>> pluginsByIncomingInterface;
|
||||
private HashMap<String, ArrayList<String>> pluginsByOutgoingInterface;
|
||||
@ -237,11 +240,12 @@ public class Device implements BaseLink.PackageReceiver {
|
||||
return pairRequestedByPeer;
|
||||
}
|
||||
|
||||
public boolean isPairRequestedByOtherEnd() {
|
||||
return pairStatus == PairStatus.RequestedByPeer;
|
||||
}
|
||||
|
||||
public void addPairingCallback(PairingCallback callback) {
|
||||
pairingCallback.add(callback);
|
||||
if (isPairRequestedByPeer()) {
|
||||
callback.incomingRequest();
|
||||
}
|
||||
}
|
||||
|
||||
public void removePairingCallback(PairingCallback callback) {
|
||||
@ -310,6 +314,8 @@ public class Device implements BaseLink.PackageReceiver {
|
||||
|
||||
//Log.e("Device", "Storing as trusted, deviceId: "+deviceId);
|
||||
|
||||
hidePairingNotification();
|
||||
|
||||
pairStatus = PairStatus.Paired;
|
||||
|
||||
//Store as trusted device
|
||||
@ -367,6 +373,8 @@ public class Device implements BaseLink.PackageReceiver {
|
||||
|
||||
public void displayPairingNotification() {
|
||||
|
||||
hidePairingNotification();
|
||||
|
||||
notificationId = (int)System.currentTimeMillis();
|
||||
|
||||
Intent intent = new Intent(getContext(), MaterialActivity.class);
|
||||
@ -389,6 +397,7 @@ public class Device implements BaseLink.PackageReceiver {
|
||||
final NotificationManager notificationManager = (NotificationManager) getContext().getSystemService(Context.NOTIFICATION_SERVICE);
|
||||
|
||||
try {
|
||||
BackgroundService.addGuiInUseCounter(context);
|
||||
notificationManager.notify(notificationId, noti);
|
||||
} catch(Exception e) {
|
||||
//4.1 will throw an exception about not having the VIBRATE permission, ignore it.
|
||||
@ -396,12 +405,12 @@ public class Device implements BaseLink.PackageReceiver {
|
||||
}
|
||||
}
|
||||
|
||||
public void cancelPairingNotification() {
|
||||
public void hidePairingNotification() {
|
||||
final NotificationManager notificationManager = (NotificationManager) getContext().getSystemService(Context.NOTIFICATION_SERVICE);
|
||||
notificationManager.cancel(notificationId);
|
||||
BackgroundService.removeGuiInUseCounter(context);
|
||||
}
|
||||
|
||||
|
||||
//
|
||||
// ComputerLink-related functions
|
||||
//
|
||||
@ -549,7 +558,7 @@ public class Device implements BaseLink.PackageReceiver {
|
||||
plugin.onPackageReceived(np);
|
||||
} catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
Log.e("KDE/Device", "Exception in "+plugin.getDisplayName()+"'s onPackageReceived()");
|
||||
Log.e("KDE/Device", "Exception in "+pluginKey+"'s onPackageReceived()");
|
||||
}
|
||||
}
|
||||
} else {
|
||||
@ -665,46 +674,40 @@ public class Device implements BaseLink.PackageReceiver {
|
||||
return plugin;
|
||||
}
|
||||
|
||||
private synchronized void addPlugin(final String pluginKey) {
|
||||
private synchronized boolean addPlugin(final String pluginKey) {
|
||||
Plugin existing = plugins.get(pluginKey);
|
||||
if (existing != null) {
|
||||
//Log.w("KDE/addPlugin","plugin already present:" + pluginKey);
|
||||
return;
|
||||
return false;
|
||||
}
|
||||
|
||||
final Plugin plugin = PluginFactory.instantiatePluginForDevice(context, pluginKey, this);
|
||||
if (plugin == null) {
|
||||
Log.e("KDE/addPlugin","could not instantiate plugin: "+pluginKey);
|
||||
failedPlugins.put(pluginKey, null);
|
||||
return;
|
||||
return false;
|
||||
}
|
||||
|
||||
new Handler(Looper.getMainLooper()).post(new Runnable() {
|
||||
@Override
|
||||
public void run() {
|
||||
boolean success;
|
||||
try {
|
||||
success = plugin.onCreate();
|
||||
} catch (Exception e) {
|
||||
success = false;
|
||||
e.printStackTrace();
|
||||
Log.e("KDE/addPlugin", "Exception loading plugin " + pluginKey);
|
||||
}
|
||||
|
||||
boolean success;
|
||||
try {
|
||||
success = plugin.onCreate();
|
||||
} catch (Exception e) {
|
||||
success = false;
|
||||
e.printStackTrace();
|
||||
Log.e("KDE/addPlugin", "Exception loading plugin " + pluginKey);
|
||||
}
|
||||
|
||||
if (success) {
|
||||
//Log.e("addPlugin","added " + pluginKey);
|
||||
failedPlugins.remove(pluginKey);
|
||||
plugins.put(pluginKey, plugin);
|
||||
} else {
|
||||
Log.e("KDE/addPlugin", "plugin failed to load " + pluginKey);
|
||||
plugins.remove(pluginKey);
|
||||
failedPlugins.put(pluginKey, plugin);
|
||||
}
|
||||
|
||||
}
|
||||
});
|
||||
if (success) {
|
||||
//Log.e("addPlugin","added " + pluginKey);
|
||||
failedPlugins.remove(pluginKey);
|
||||
plugins.put(pluginKey, plugin);
|
||||
} else {
|
||||
Log.e("KDE/addPlugin", "plugin failed to load " + pluginKey);
|
||||
plugins.remove(pluginKey);
|
||||
failedPlugins.put(pluginKey, plugin);
|
||||
}
|
||||
|
||||
return success;
|
||||
}
|
||||
|
||||
private synchronized boolean removePlugin(String pluginKey) {
|
||||
@ -754,9 +757,13 @@ public class Device implements BaseLink.PackageReceiver {
|
||||
|
||||
ArrayList<String> newUnsupportedPlugins = new ArrayList<>();
|
||||
HashSet<String> newSupportedIncomingInterfaces = new HashSet<>();
|
||||
HashSet<String> newSupportedOutgoingInterfaces = new HashSet<>();
|
||||
HashMap<String, ArrayList<String>> newPluginsByIncomingInterface = new HashMap<>();
|
||||
HashMap<String, ArrayList<String>> newPluginsByOutgoingInterface = new HashMap<>();
|
||||
|
||||
final boolean supportsCapabilities = (incomingCapabilities != null && !incomingCapabilities.isEmpty()) ||
|
||||
(incomingCapabilities != null && !outgoingCapabilities.isEmpty());
|
||||
|
||||
for (String pluginKey : availablePlugins) {
|
||||
|
||||
PluginFactory.PluginInfo pluginInfo = PluginFactory.getPluginInfo(context, pluginKey);
|
||||
@ -769,12 +776,9 @@ public class Device implements BaseLink.PackageReceiver {
|
||||
pluginEnabled = isPluginEnabled(pluginKey);
|
||||
}
|
||||
|
||||
if (pluginEnabled) {
|
||||
newSupportedIncomingInterfaces.addAll(incomingInterfaces);
|
||||
}
|
||||
//TODO: Check for plugins that will fail to load before checking the capabilities
|
||||
|
||||
if ((incomingCapabilities != null && !incomingCapabilities.isEmpty()) ||
|
||||
(incomingCapabilities != null && !outgoingCapabilities.isEmpty())) {
|
||||
if (supportsCapabilities && (!incomingInterfaces.isEmpty() || !outgoingInterfaces.isEmpty())) {
|
||||
HashSet<String> supportedOut = new HashSet<>(outgoingInterfaces);
|
||||
supportedOut.retainAll(incomingCapabilities); //Intersection
|
||||
HashSet<String> supportedIn = new HashSet<>(incomingInterfaces);
|
||||
@ -782,24 +786,37 @@ public class Device implements BaseLink.PackageReceiver {
|
||||
if (supportedOut.isEmpty() && supportedIn.isEmpty()) {
|
||||
Log.w("ReloadPlugins", "not loading " + pluginKey + "because of unmatched capabilities");
|
||||
newUnsupportedPlugins.add(pluginKey);
|
||||
pluginEnabled = false;
|
||||
if (pluginEnabled) {
|
||||
//We still want to announce this capability, to prevent a deadlock
|
||||
newSupportedOutgoingInterfaces.addAll(outgoingInterfaces);
|
||||
newSupportedIncomingInterfaces.addAll(incomingInterfaces);
|
||||
pluginEnabled = false;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (pluginEnabled) {
|
||||
addPlugin(pluginKey);
|
||||
boolean success = addPlugin(pluginKey);
|
||||
|
||||
if (success) {
|
||||
|
||||
newSupportedIncomingInterfaces.addAll(incomingInterfaces);
|
||||
newSupportedOutgoingInterfaces.addAll(outgoingInterfaces);
|
||||
|
||||
for (String packageType : incomingInterfaces) {
|
||||
ArrayList<String> plugins = newPluginsByIncomingInterface.get(packageType);
|
||||
if (plugins == null) plugins = new ArrayList<>();
|
||||
plugins.add(pluginKey);
|
||||
newPluginsByIncomingInterface.put(packageType, plugins);
|
||||
}
|
||||
|
||||
for (String packageType : outgoingInterfaces) {
|
||||
ArrayList<String> plugins = newPluginsByOutgoingInterface.get(packageType);
|
||||
if (plugins == null) plugins = new ArrayList<>();
|
||||
plugins.add(pluginKey);
|
||||
newPluginsByOutgoingInterface.put(packageType, plugins);
|
||||
}
|
||||
|
||||
for (String packageType : incomingInterfaces) {
|
||||
ArrayList<String> plugins = newPluginsByIncomingInterface.get(packageType);
|
||||
if (plugins == null) plugins = new ArrayList<>();
|
||||
plugins.add(pluginKey);
|
||||
newPluginsByIncomingInterface.put(packageType, plugins);
|
||||
}
|
||||
for (String packageType : outgoingInterfaces) {
|
||||
ArrayList<String> plugins = newPluginsByOutgoingInterface.get(packageType);
|
||||
if (plugins == null) plugins = new ArrayList<>();
|
||||
plugins.add(pluginKey);
|
||||
newPluginsByOutgoingInterface.put(packageType, plugins);
|
||||
}
|
||||
} else {
|
||||
removePlugin(pluginKey);
|
||||
@ -809,33 +826,38 @@ public class Device implements BaseLink.PackageReceiver {
|
||||
|
||||
boolean capabilitiesChanged = false;
|
||||
if (!newSupportedIncomingInterfaces.equals(supportedIncomingInterfaces) ||
|
||||
!newPluginsByOutgoingInterface.equals(pluginsByOutgoingInterface)) {
|
||||
!newSupportedOutgoingInterfaces.equals(supportedOutgoingInterfaces)) {
|
||||
capabilitiesChanged = true;
|
||||
}
|
||||
|
||||
pluginsByOutgoingInterface = newPluginsByOutgoingInterface;
|
||||
pluginsByIncomingInterface = newPluginsByIncomingInterface;
|
||||
supportedIncomingInterfaces = newSupportedIncomingInterfaces;
|
||||
supportedOutgoingInterfaces = newSupportedOutgoingInterfaces;
|
||||
unsupportedPlugins = newUnsupportedPlugins;
|
||||
|
||||
for (PluginsChangedListener listener : pluginsChangedListeners) {
|
||||
listener.onPluginsChanged(Device.this);
|
||||
}
|
||||
onPluginsChanged();
|
||||
|
||||
if (capabilitiesChanged && isReachable() && isPaired()) {
|
||||
NetworkPackage np = new NetworkPackage(NetworkPackage.PACKAGE_TYPE_CAPABILITIES);
|
||||
np.set("IncomingCapabilities", new ArrayList<>(newSupportedIncomingInterfaces));
|
||||
np.set("OutgoingCapabilities", new ArrayList<>(newPluginsByOutgoingInterface.keySet()));
|
||||
np.set("OutgoingCapabilities", new ArrayList<>(newSupportedOutgoingInterfaces));
|
||||
sendPackage(np);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
public HashMap<String,Plugin> getLoadedPlugins() {
|
||||
public void onPluginsChanged() {
|
||||
for (PluginsChangedListener listener : pluginsChangedListeners) {
|
||||
listener.onPluginsChanged(Device.this);
|
||||
}
|
||||
}
|
||||
|
||||
public ConcurrentHashMap<String,Plugin> getLoadedPlugins() {
|
||||
return plugins;
|
||||
}
|
||||
|
||||
public HashMap<String,Plugin> getFailedPlugins() {
|
||||
public ConcurrentHashMap<String,Plugin> getFailedPlugins() {
|
||||
return failedPlugins;
|
||||
}
|
||||
|
||||
@ -852,4 +874,14 @@ public class Device implements BaseLink.PackageReceiver {
|
||||
link.disconnect();
|
||||
}
|
||||
}
|
||||
|
||||
public BaseLink.ConnectionStarted getConnectionSource() {
|
||||
for(BaseLink l : links) {
|
||||
if (l.getConnectionSource() == BaseLink.ConnectionStarted.Locally) {
|
||||
return BaseLink.ConnectionStarted.Locally;
|
||||
}
|
||||
}
|
||||
return BaseLink.ConnectionStarted.Remotely;
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -54,7 +54,7 @@ public class ContactsHelper {
|
||||
String name = cursor.getString(nameIndex);
|
||||
//Log.e("PhoneNumberLookup", "success: " + name);
|
||||
cursor.close();
|
||||
return name + " (" + number + ")";
|
||||
return name;
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -37,7 +37,7 @@ public class DeviceHelper {
|
||||
|
||||
//from https://github.com/meetup/android-device-names
|
||||
//Converted to java using:
|
||||
//cat android_models.properties | awk -F'=' '{sub(/ *$/, "", $1)} sub(/^ */, "", $2) { if ($2 != "") print "humanReadableNames.put(\""$1"\",\"" $2 "\");"}'
|
||||
//cat android_models.properties | awk -F'=' '{sub(/ *$/, "", $1)} sub(/^ */, "", $2) { if ($2 != "") print "humanReadableNames.put(\""$1"\",\"" $2 "\");"}' | sed -e 's/\\ /_/g'
|
||||
private final static HashMap<String,String> humanReadableNames = new HashMap<>();
|
||||
static {
|
||||
humanReadableNames.put("5860E","Coolpad Quattro 4G");
|
||||
@ -55,6 +55,7 @@ public class DeviceHelper {
|
||||
humanReadableNames.put("ALCATEL_ONE_TOUCH_7041X","Alcatel One Touch Pop C7");
|
||||
humanReadableNames.put("ASUS_T00J","Asus ZenFone 5");
|
||||
humanReadableNames.put("ASUS_Transformer_Pad_TF300T","Asus Transformer Pad");
|
||||
humanReadableNames.put("ASUS_Transformer_Pad_TF700T","Asus Transformer Pad");
|
||||
humanReadableNames.put("Aquaris_E4.5","bq Aquaris E4.5");
|
||||
humanReadableNames.put("C1905","Sony Xperia M");
|
||||
humanReadableNames.put("C2105","Sony Xperia L");
|
||||
@ -168,6 +169,7 @@ public class DeviceHelper {
|
||||
humanReadableNames.put("HTC_PH39100","HTC Vivid 4G");
|
||||
humanReadableNames.put("HTC_PN071","HTC One");
|
||||
humanReadableNames.put("HTC_Sensation_Z710e","HTC Sensation");
|
||||
humanReadableNames.put("HTC_Sensation_4G","HTC Sensation");
|
||||
humanReadableNames.put("HTC_VLE_U","HTC One S");
|
||||
humanReadableNames.put("HUAWEI_G510-0251","Huawei Ascend G510");
|
||||
humanReadableNames.put("HUAWEI_P6-U06","Huawei Ascend P6");
|
||||
@ -236,9 +238,13 @@ public class DeviceHelper {
|
||||
humanReadableNames.put("MOTWX435KT","Motorola Triumph");
|
||||
humanReadableNames.put("N3","Star NO.1 N3");
|
||||
humanReadableNames.put("N860","ZTE Warp N860");
|
||||
humanReadableNames.put("NEXUS 4","Nexus 4");
|
||||
humanReadableNames.put("NEXUS 5","Nexus 5");
|
||||
humanReadableNames.put("NEXUS 6","Nexus 6");
|
||||
humanReadableNames.put("NEXUS_4","Nexus 4");
|
||||
humanReadableNames.put("NEXUS_5","Nexus 5");
|
||||
humanReadableNames.put("NEXUS_5X","Nexus 5X");
|
||||
humanReadableNames.put("LG-D820","Nexus 5");
|
||||
humanReadableNames.put("LG-D821","Nexus 5");
|
||||
humanReadableNames.put("NEXUS_6","Nexus 6");
|
||||
humanReadableNames.put("NEXUS_6P","Nexus 6P");
|
||||
humanReadableNames.put("Nexus_10","Google Nexus 10");
|
||||
humanReadableNames.put("Nexus_4","Google Nexus 4");
|
||||
humanReadableNames.put("Nexus_7","Asus Nexus 7");
|
||||
@ -400,8 +406,8 @@ public class DeviceHelper {
|
||||
humanReadableNames.put("ST21i","Sony Xperia Tipo");
|
||||
humanReadableNames.put("ST25i","Sony Xperia U");
|
||||
humanReadableNames.put("ST26i","Sony Xperia J");
|
||||
humanReadableNames.put("Transformer_Prime_TF201","Asus Eee Pad Transformer Prime");
|
||||
humanReadableNames.put("Transformer_TF101","Asus Eee Pad Transformer");
|
||||
humanReadableNames.put("Transformer_Prime_TF201","Asus Transformer Prime");
|
||||
humanReadableNames.put("Transformer_TF101","Asus Transformer");
|
||||
humanReadableNames.put("VM670","LG Optimus V");
|
||||
humanReadableNames.put("VS840_4G","LG Lucid 4G");
|
||||
humanReadableNames.put("VS870_4G","LG Lucid 2");
|
||||
|
@ -51,6 +51,8 @@ public class NetworkPackage {
|
||||
public final static String PACKAGE_TYPE_MOUSEPAD = "kdeconnect.mousepad";
|
||||
public final static String PACKAGE_TYPE_SHARE = "kdeconnect.share";
|
||||
public static final String PACKAGE_TYPE_CAPABILITIES = "kdeconnect.capabilities";
|
||||
public final static String PACKAGE_TYPE_FINDMYPHONE = "kdeconnect.findmyphone" ;
|
||||
public final static String PACKAGE_TYPE_RUNCOMMAND = "kdeconnect.runcommand";
|
||||
|
||||
private long mId;
|
||||
private String mType;
|
||||
|
@ -25,6 +25,8 @@ import android.content.ClipData;
|
||||
import android.content.Context;
|
||||
import android.content.ClipboardManager;
|
||||
import android.os.Build;
|
||||
import android.os.Handler;
|
||||
import android.os.Looper;
|
||||
|
||||
import org.kde.kdeconnect.Device;
|
||||
import org.kde.kdeconnect.NetworkPackage;
|
||||
@ -45,28 +47,33 @@ public class ClipboardListener {
|
||||
return;
|
||||
}
|
||||
|
||||
cm = (ClipboardManager)context.getSystemService(Context.CLIPBOARD_SERVICE);
|
||||
listener = new ClipboardManager.OnPrimaryClipChangedListener() {
|
||||
new Handler(Looper.getMainLooper()).post(new Runnable() {
|
||||
@Override
|
||||
public void onPrimaryClipChanged() {
|
||||
try {
|
||||
public void run() {
|
||||
cm = (ClipboardManager) context.getSystemService(Context.CLIPBOARD_SERVICE);
|
||||
listener = new ClipboardManager.OnPrimaryClipChangedListener() {
|
||||
@Override
|
||||
public void onPrimaryClipChanged() {
|
||||
try {
|
||||
|
||||
ClipData.Item item = cm.getPrimaryClip().getItemAt(0);
|
||||
String content = item.coerceToText(context).toString();
|
||||
ClipData.Item item = cm.getPrimaryClip().getItemAt(0);
|
||||
String content = item.coerceToText(context).toString();
|
||||
|
||||
if (!content.equals(currentContent)) {
|
||||
NetworkPackage np = new NetworkPackage(NetworkPackage.PACKAGE_TYPE_CLIPBOARD);
|
||||
np.set("content", content);
|
||||
device.sendPackage(np);
|
||||
currentContent = content;
|
||||
if (!content.equals(currentContent)) {
|
||||
NetworkPackage np = new NetworkPackage(NetworkPackage.PACKAGE_TYPE_CLIPBOARD);
|
||||
np.set("content", content);
|
||||
device.sendPackage(np);
|
||||
currentContent = content;
|
||||
}
|
||||
|
||||
} catch (Exception e) {
|
||||
//Probably clipboard was not text
|
||||
}
|
||||
}
|
||||
|
||||
} catch(Exception e) {
|
||||
//Probably clipboard was not text
|
||||
}
|
||||
};
|
||||
cm.addPrimaryClipChangedListener(listener);
|
||||
}
|
||||
};
|
||||
cm.addPrimaryClipChangedListener(listener);
|
||||
});
|
||||
}
|
||||
|
||||
public void stop() {
|
||||
|
@ -0,0 +1,55 @@
|
||||
package org.kde.kdeconnect.Plugins.FindMyPhonePlugin;
|
||||
|
||||
import android.app.Activity;
|
||||
import android.media.AudioAttributes;
|
||||
import android.media.AudioManager;
|
||||
import android.media.Ringtone;
|
||||
import android.media.RingtoneManager;
|
||||
import android.net.Uri;
|
||||
import android.os.Bundle;
|
||||
import android.view.View;
|
||||
import android.view.Window;
|
||||
import android.view.WindowManager;
|
||||
|
||||
import org.kde.kdeconnect_tp.R;
|
||||
|
||||
public class FindMyPhoneActivity extends Activity {
|
||||
Ringtone ringtone;
|
||||
|
||||
@Override
|
||||
protected void onCreate(Bundle savedInstanceState) {
|
||||
super.onCreate(savedInstanceState);
|
||||
setContentView(R.layout.activity_find_my_phone);
|
||||
|
||||
Window window = this.getWindow();
|
||||
window.addFlags(WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD |
|
||||
WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED |
|
||||
WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON);
|
||||
|
||||
Uri notification = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_ALARM);
|
||||
ringtone = RingtoneManager.getRingtone(getApplicationContext(), notification);
|
||||
|
||||
if (android.os.Build.VERSION.SDK_INT >= 21) {
|
||||
AudioAttributes.Builder b = new AudioAttributes.Builder();
|
||||
b.setUsage(AudioAttributes.USAGE_ALARM);
|
||||
ringtone.setAudioAttributes(b.build());
|
||||
} else {
|
||||
ringtone.setStreamType(AudioManager.STREAM_ALARM);
|
||||
}
|
||||
|
||||
ringtone.play();
|
||||
|
||||
findViewById(R.id.bFindMyPhone).setOnClickListener(new View.OnClickListener() {
|
||||
@Override
|
||||
public void onClick(View view) {
|
||||
finish();
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
@Override
|
||||
public void finish() {
|
||||
ringtone.stop();
|
||||
super.finish();
|
||||
}
|
||||
}
|
@ -0,0 +1,54 @@
|
||||
package org.kde.kdeconnect.Plugins.FindMyPhonePlugin;
|
||||
|
||||
import android.app.Activity;
|
||||
import android.app.AlertDialog;
|
||||
import android.content.Intent;
|
||||
import android.graphics.drawable.Drawable;
|
||||
import android.util.Log;
|
||||
import android.widget.Button;
|
||||
|
||||
import org.kde.kdeconnect.NetworkPackage;
|
||||
import org.kde.kdeconnect.Plugins.Plugin;
|
||||
import org.kde.kdeconnect_tp.R;
|
||||
|
||||
|
||||
/**
|
||||
* Created by vineet on 1/11/14.
|
||||
* and David Edmundson 2015
|
||||
*/
|
||||
public class FindMyPhonePlugin extends Plugin {
|
||||
@Override
|
||||
public String getDisplayName() {
|
||||
return context.getString(R.string.findmyphone_title);
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getDescription() {
|
||||
return context.getString(R.string.findmyphone_description);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean onPackageReceived(NetworkPackage np) {
|
||||
Log.e("FindMyPhonePR", "onPackageReceived");
|
||||
if (np.getType().equals(NetworkPackage.PACKAGE_TYPE_FINDMYPHONE)) {
|
||||
//Log.e("PingPackageReceiver", "was a find my phone!");
|
||||
|
||||
Intent intent = new Intent(context,FindMyPhoneActivity.class);
|
||||
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
|
||||
context.startActivity(intent);
|
||||
return true;
|
||||
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String[] getSupportedPackageTypes() {
|
||||
return new String[]{NetworkPackage.PACKAGE_TYPE_FINDMYPHONE};
|
||||
}
|
||||
|
||||
@Override
|
||||
public String[] getOutgoingPackageTypes() {
|
||||
return new String[0];
|
||||
}
|
||||
}
|
@ -159,10 +159,13 @@ public class KeyListenerView extends View {
|
||||
char keyCharacter = event.getDisplayLabel();
|
||||
np.set("key", new String(new char[]{keyCharacter}).toLowerCase());
|
||||
} else {
|
||||
return false; //normal keys will be handled by KeyInputConnection
|
||||
//A normal key, but still not handled by the KeyInputConnection (happens with numbers)
|
||||
np.set("key", new String(new char[]{(char)event.getUnicodeChar()}));
|
||||
}
|
||||
|
||||
sendKeyPressPackage(np);
|
||||
return true;
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -49,6 +49,7 @@ public class MousePadActivity extends ActionBarActivity implements GestureDetect
|
||||
private float mPrevY;
|
||||
private float mCurrentX;
|
||||
private float mCurrentY;
|
||||
private int scrollDirection = 1;
|
||||
|
||||
boolean isScrolling = false;
|
||||
float accumulatedDistanceY = 0;
|
||||
@ -89,6 +90,11 @@ public class MousePadActivity extends ActionBarActivity implements GestureDetect
|
||||
keyListenerView.setDeviceId(deviceId);
|
||||
|
||||
SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(this);
|
||||
if (prefs.getBoolean(getString(R.string.mousepad_scroll_direction),false)) {
|
||||
scrollDirection = -1;
|
||||
} else {
|
||||
scrollDirection = 1;
|
||||
}
|
||||
String doubleTapSetting = prefs.getString(getString(R.string.mousepad_double_tap_key),
|
||||
getString(R.string.mousepad_double_default));
|
||||
String tripleTapSetting = prefs.getString(getString(R.string.mousepad_triple_tap_key),
|
||||
@ -229,7 +235,7 @@ public class MousePadActivity extends ActionBarActivity implements GestureDetect
|
||||
Device device = service.getDevice(deviceId);
|
||||
MousePadPlugin mousePadPlugin = device.getPlugin(MousePadPlugin.class);
|
||||
if (mousePadPlugin == null) return;
|
||||
mousePadPlugin.sendScroll(0, scrollToSendY);
|
||||
mousePadPlugin.sendScroll(0, scrollDirection * scrollToSendY);
|
||||
}
|
||||
});
|
||||
|
||||
@ -345,17 +351,18 @@ public class MousePadActivity extends ActionBarActivity implements GestureDetect
|
||||
}
|
||||
});
|
||||
}
|
||||
private void sendSingleHold() {
|
||||
BackgroundService.RunCommand(this, new BackgroundService.InstanceCallback() {
|
||||
@Override
|
||||
public void onServiceStart(BackgroundService service) {
|
||||
Device device = service.getDevice(deviceId);
|
||||
MousePadPlugin mousePadPlugin = device.getPlugin(MousePadPlugin.class);
|
||||
if (mousePadPlugin == null) return;
|
||||
mousePadPlugin.sendSingleHold();
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
private void sendSingleHold() {
|
||||
BackgroundService.RunCommand(this, new BackgroundService.InstanceCallback() {
|
||||
@Override
|
||||
public void onServiceStart(BackgroundService service) {
|
||||
Device device = service.getDevice(deviceId);
|
||||
MousePadPlugin mousePadPlugin = device.getPlugin(MousePadPlugin.class);
|
||||
if (mousePadPlugin == null) return;
|
||||
mousePadPlugin.sendSingleHold();
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
private void showKeyboard() {
|
||||
InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
|
||||
|
@ -91,7 +91,7 @@ public class MprisActivity extends ActionBarActivity {
|
||||
String song = mpris.getCurrentSong();
|
||||
((TextView) findViewById(R.id.now_playing_textview)).setText(song);
|
||||
|
||||
if (mpris.getLength() > -1 && mpris.getPosition() > -1 && !"Spotify".equals(mpris.getPlayer())) {
|
||||
if (mpris.getLength() > -1 && mpris.getPosition() > -1 && !"spotify".equals(mpris.getPlayer().toLowerCase())) {
|
||||
((TextView) findViewById(R.id.time_textview)).setText(milisToProgress(mpris.getLength()));
|
||||
|
||||
SeekBar positionSeek = (SeekBar)findViewById(R.id.positionSeek);
|
||||
@ -154,7 +154,7 @@ public class MprisActivity extends ActionBarActivity {
|
||||
mpris.setPlayer(player);
|
||||
//Spotify doesn't support changing the volume yet...
|
||||
//Also doesn't support seeking and telling actual position...
|
||||
if (player.equals("Spotify")) {
|
||||
if (player.toLowerCase().equals("spotify")) {
|
||||
findViewById(R.id.volume_layout).setVisibility(View.INVISIBLE);
|
||||
findViewById(R.id.rew_button).setVisibility(View.GONE);
|
||||
findViewById(R.id.ff_button).setVisibility(View.GONE);
|
||||
@ -410,10 +410,13 @@ public class MprisActivity extends ActionBarActivity {
|
||||
@Override
|
||||
public void onServiceStart(BackgroundService service) {
|
||||
Device device = service.getDevice(deviceId);
|
||||
MprisPlugin mpris = device.getPlugin(MprisPlugin.class);
|
||||
if (mpris != null) {
|
||||
positionSeek.setProgress((int) (mpris.getPosition()));
|
||||
if (device != null) {
|
||||
MprisPlugin mpris = device.getPlugin(MprisPlugin.class);
|
||||
if (mpris != null) {
|
||||
positionSeek.setProgress((int) (mpris.getPosition()));
|
||||
}
|
||||
}
|
||||
positionSeekUpdateHandler.removeCallbacks(positionSeekUpdateRunnable);
|
||||
positionSeekUpdateHandler.postDelayed(positionSeekUpdateRunnable, 1000);
|
||||
}
|
||||
});
|
||||
|
@ -80,11 +80,14 @@ public class NotificationReceiver extends NotificationListenerService {
|
||||
public int onStartCommand(Intent intent, int flags, int startId) {
|
||||
//Log.e("NotificationReceiver", "onStartCommand");
|
||||
mutex.lock();
|
||||
for (InstanceCallback c : callbacks) {
|
||||
c.onServiceStart(this);
|
||||
try {
|
||||
for (InstanceCallback c : callbacks) {
|
||||
c.onServiceStart(this);
|
||||
}
|
||||
callbacks.clear();
|
||||
} finally {
|
||||
mutex.unlock();
|
||||
}
|
||||
callbacks.clear();
|
||||
mutex.unlock();
|
||||
return Service.START_STICKY;
|
||||
}
|
||||
|
||||
@ -96,8 +99,11 @@ public class NotificationReceiver extends NotificationListenerService {
|
||||
public static void RunCommand(Context c, final InstanceCallback callback) {
|
||||
if (callback != null) {
|
||||
mutex.lock();
|
||||
callbacks.add(callback);
|
||||
mutex.unlock();
|
||||
try {
|
||||
callbacks.add(callback);
|
||||
} finally {
|
||||
mutex.unlock();
|
||||
}
|
||||
}
|
||||
Intent serviceIntent = new Intent(c, NotificationReceiver.class);
|
||||
c.startService(serviceIntent);
|
||||
|
@ -360,7 +360,7 @@ public class NotificationsPlugin extends Plugin implements NotificationReceiver.
|
||||
return new String[]{NetworkPackage.PACKAGE_TYPE_NOTIFICATION};
|
||||
}
|
||||
|
||||
//For compat with API<21, because lollipop changed they way to cancel notifications
|
||||
//For compat with API<21, because lollipop changed the way to cancel notifications
|
||||
public static void cancelNotificationCompat(NotificationReceiver service, String compatKey) {
|
||||
if (Build.VERSION.SDK_INT >= 21) {
|
||||
service.cancelNotification(compatKey);
|
||||
|
@ -26,7 +26,9 @@ import android.util.Log;
|
||||
|
||||
import org.kde.kdeconnect.Device;
|
||||
import org.kde.kdeconnect.Plugins.BatteryPlugin.BatteryPlugin;
|
||||
import org.kde.kdeconnect.Plugins.FindMyPhonePlugin.FindMyPhonePlugin;
|
||||
import org.kde.kdeconnect.Plugins.MousePadPlugin.MousePadPlugin;
|
||||
import org.kde.kdeconnect.Plugins.RunCommandPlugin.RunCommandPlugin;
|
||||
import org.kde.kdeconnect.Plugins.SftpPlugin.SftpPlugin;
|
||||
import org.kde.kdeconnect.Plugins.ClibpoardPlugin.ClipboardPlugin;
|
||||
import org.kde.kdeconnect.Plugins.MprisPlugin.MprisPlugin;
|
||||
@ -121,6 +123,8 @@ public class PluginFactory {
|
||||
PluginFactory.registerPlugin(MousePadPlugin.class);
|
||||
PluginFactory.registerPlugin(SharePlugin.class);
|
||||
PluginFactory.registerPlugin(TelepathyPlugin.class);
|
||||
PluginFactory.registerPlugin(FindMyPhonePlugin.class);
|
||||
PluginFactory.registerPlugin(RunCommandPlugin.class);
|
||||
}
|
||||
|
||||
public static PluginInfo getPluginInfo(Context context, String pluginKey) {
|
||||
|
@ -0,0 +1,148 @@
|
||||
/*
|
||||
* Copyright 2015 Aleix Pol Gonzalez <aleixpol@kde.org>
|
||||
* Copyright 2015 Albert Vaca Cintora <albertvaka@gmail.com>
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU General Public License as
|
||||
* published by the Free Software Foundation; either version 2 of
|
||||
* the License or (at your option) version 3 or any later version
|
||||
* accepted by the membership of KDE e.V. (or its successor approved
|
||||
* by the membership of KDE e.V.), which shall act as a proxy
|
||||
* defined in Section 14 of version 3 of the license.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
package org.kde.kdeconnect.Plugins.RunCommandPlugin;
|
||||
|
||||
import android.os.Bundle;
|
||||
import android.support.v7.app.ActionBarActivity;
|
||||
import android.util.Log;
|
||||
import android.view.View;
|
||||
import android.widget.AdapterView;
|
||||
import android.widget.ListView;
|
||||
|
||||
import org.json.JSONException;
|
||||
import org.json.JSONObject;
|
||||
import org.kde.kdeconnect.BackgroundService;
|
||||
import org.kde.kdeconnect.Device;
|
||||
import org.kde.kdeconnect.UserInterface.List.EntryItem;
|
||||
import org.kde.kdeconnect.UserInterface.List.ListAdapter;
|
||||
import org.kde.kdeconnect_tp.R;
|
||||
|
||||
import java.util.ArrayList;
|
||||
|
||||
public class RunCommandActivity extends ActionBarActivity {
|
||||
|
||||
private String deviceId;
|
||||
|
||||
private void updateView() {
|
||||
BackgroundService.RunCommand(this, new BackgroundService.InstanceCallback() {
|
||||
@Override
|
||||
public void onServiceStart(final BackgroundService service) {
|
||||
|
||||
final Device device = service.getDevice(deviceId);
|
||||
final RunCommandPlugin plugin = device.getPlugin(RunCommandPlugin.class);
|
||||
if (plugin == null) {
|
||||
Log.e("RunCommandActivity", "device has no runcommand plugin!");
|
||||
return;
|
||||
}
|
||||
|
||||
runOnUiThread(new Runnable() {
|
||||
@Override
|
||||
public void run() {
|
||||
ListView view = (ListView) findViewById(R.id.listView1);
|
||||
|
||||
final ArrayList<JSONObject> commands = plugin.getCommandList();
|
||||
|
||||
ArrayList<ListAdapter.Item> commandItems = new ArrayList<>();
|
||||
for (JSONObject obj : commands) {
|
||||
try {
|
||||
Log.e("cacaca", obj.toString());
|
||||
commandItems.add(new EntryItem(obj.getString("name"), obj.getString("command")));
|
||||
} catch (JSONException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
|
||||
ListAdapter adapter = new ListAdapter(RunCommandActivity.this, commandItems);
|
||||
|
||||
view.setAdapter(adapter);
|
||||
view.setOnItemClickListener(new AdapterView.OnItemClickListener() {
|
||||
@Override
|
||||
public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {
|
||||
try {
|
||||
Log.e("fu", commands.get(i).getString("command"));
|
||||
plugin.runCommand(commands.get(i).getString("key"));
|
||||
} catch (JSONException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
});
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
private final RunCommandPlugin.CommandsChangedCallback theCallback = new RunCommandPlugin.CommandsChangedCallback() {
|
||||
@Override
|
||||
public void update() {
|
||||
updateView();
|
||||
}
|
||||
};
|
||||
|
||||
@Override
|
||||
protected void onCreate(Bundle savedInstanceState) {
|
||||
super.onCreate(savedInstanceState);
|
||||
setContentView(R.layout.activity_list);
|
||||
|
||||
deviceId = getIntent().getStringExtra("deviceId");
|
||||
|
||||
updateView();
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void onResume() {
|
||||
super.onResume();
|
||||
|
||||
BackgroundService.RunCommand(this, new BackgroundService.InstanceCallback() {
|
||||
@Override
|
||||
public void onServiceStart(final BackgroundService service) {
|
||||
|
||||
final Device device = service.getDevice(deviceId);
|
||||
final RunCommandPlugin plugin = device.getPlugin(RunCommandPlugin.class);
|
||||
if (plugin == null) {
|
||||
Log.e("RunCommandActivity", "device has no runcommand plugin!");
|
||||
return;
|
||||
}
|
||||
plugin.addCommandsUpdatedCallback(theCallback);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void onPause() {
|
||||
super.onPause();
|
||||
|
||||
BackgroundService.RunCommand(this, new BackgroundService.InstanceCallback() {
|
||||
@Override
|
||||
public void onServiceStart(final BackgroundService service) {
|
||||
|
||||
final Device device = service.getDevice(deviceId);
|
||||
final RunCommandPlugin plugin = device.getPlugin(RunCommandPlugin.class);
|
||||
if (plugin == null) {
|
||||
Log.e("RunCommandActivity", "device has no runcommand plugin!");
|
||||
return;
|
||||
}
|
||||
plugin.removeCommandsUpdatedCallback(theCallback);
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
@ -0,0 +1,149 @@
|
||||
/*
|
||||
* Copyright 2015 Aleix Pol Gonzalez <aleixpol@kde.org>
|
||||
* Copyright 2015 Albert Vaca Cintora <albertvaka@gmail.com>
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU General Public License as
|
||||
* published by the Free Software Foundation; either version 2 of
|
||||
* the License or (at your option) version 3 or any later version
|
||||
* accepted by the membership of KDE e.V. (or its successor approved
|
||||
* by the membership of KDE e.V.), which shall act as a proxy
|
||||
* defined in Section 14 of version 3 of the license.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
package org.kde.kdeconnect.Plugins.RunCommandPlugin;
|
||||
|
||||
import android.app.Activity;
|
||||
import android.content.Intent;
|
||||
import android.graphics.drawable.Drawable;
|
||||
import android.support.v4.content.ContextCompat;
|
||||
|
||||
import org.json.JSONException;
|
||||
import org.json.JSONObject;
|
||||
import org.kde.kdeconnect.NetworkPackage;
|
||||
import org.kde.kdeconnect.Plugins.Plugin;
|
||||
import org.kde.kdeconnect_tp.R;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.Iterator;
|
||||
|
||||
public class RunCommandPlugin extends Plugin {
|
||||
|
||||
private ArrayList<JSONObject> commandList = new ArrayList<>();
|
||||
private ArrayList<CommandsChangedCallback> callbacks = new ArrayList<>();
|
||||
|
||||
public void addCommandsUpdatedCallback(CommandsChangedCallback newCallback) {
|
||||
callbacks.add(newCallback);
|
||||
}
|
||||
|
||||
public void removeCommandsUpdatedCallback(CommandsChangedCallback theCallback) {
|
||||
callbacks.remove(theCallback);
|
||||
}
|
||||
|
||||
interface CommandsChangedCallback {
|
||||
void update();
|
||||
};
|
||||
|
||||
public ArrayList<JSONObject> getCommandList() {
|
||||
return commandList;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getDisplayName() {
|
||||
return context.getResources().getString(R.string.pref_plugin_runcommand);
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getDescription() {
|
||||
return context.getResources().getString(R.string.pref_plugin_runcommand_desc);
|
||||
}
|
||||
|
||||
@Override
|
||||
public Drawable getIcon() {
|
||||
return ContextCompat.getDrawable(context, R.drawable.runcommand_plugin_icon);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean onCreate() {
|
||||
requestCommandList();
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean onPackageReceived(NetworkPackage np) {
|
||||
if (!np.getType().equals(NetworkPackage.PACKAGE_TYPE_RUNCOMMAND)) return false;
|
||||
|
||||
if (np.has("commandList")) {
|
||||
commandList.clear();
|
||||
try {
|
||||
JSONObject obj = new JSONObject(np.getString("commandList"));
|
||||
Iterator<String> keys = obj.keys();
|
||||
while(keys.hasNext()){
|
||||
String s = keys.next();
|
||||
JSONObject o = obj.getJSONObject(s);
|
||||
o.put("key", s);
|
||||
commandList.add(o);
|
||||
}
|
||||
} catch (JSONException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
|
||||
for (CommandsChangedCallback aCallback : callbacks) {
|
||||
aCallback.update();
|
||||
}
|
||||
|
||||
device.onPluginsChanged();
|
||||
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String[] getSupportedPackageTypes() {
|
||||
return new String[]{NetworkPackage.PACKAGE_TYPE_RUNCOMMAND};
|
||||
}
|
||||
|
||||
@Override
|
||||
public String[] getOutgoingPackageTypes() {
|
||||
return new String[]{NetworkPackage.PACKAGE_TYPE_RUNCOMMAND};
|
||||
}
|
||||
|
||||
public void runCommand(String cmdKey) {
|
||||
NetworkPackage np = new NetworkPackage(NetworkPackage.PACKAGE_TYPE_RUNCOMMAND);
|
||||
np.set("key", cmdKey);
|
||||
device.sendPackage(np);
|
||||
}
|
||||
|
||||
private void requestCommandList() {
|
||||
NetworkPackage np = new NetworkPackage(NetworkPackage.PACKAGE_TYPE_RUNCOMMAND);
|
||||
np.set("requestCommandList", true);
|
||||
device.sendPackage(np);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean hasMainActivity() {
|
||||
return !commandList.isEmpty();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void startMainActivity(Activity parentActivity) {
|
||||
Intent intent = new Intent(parentActivity, RunCommandActivity.class);
|
||||
intent.putExtra("deviceId", device.getDeviceId());
|
||||
parentActivity.startActivity(intent);
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getActionName() {
|
||||
return context.getString(R.string.pref_plugin_runcommand);
|
||||
}
|
||||
|
||||
}
|
@ -52,6 +52,8 @@ import org.kde.kdeconnect_tp.R;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Collection;
|
||||
import java.util.ConcurrentModificationException;
|
||||
import java.util.HashMap;
|
||||
import java.util.concurrent.ConcurrentHashMap;
|
||||
|
||||
|
||||
/**
|
||||
@ -320,73 +322,89 @@ public class DeviceFragment extends Fragment {
|
||||
return;
|
||||
}
|
||||
|
||||
//Once in-app, there is no point in keep displaying the notification if any
|
||||
device.hidePairingNotification();
|
||||
|
||||
mActivity.runOnUiThread(new Runnable() {
|
||||
@Override
|
||||
public void run() {
|
||||
|
||||
boolean paired = device.isPaired();
|
||||
boolean reachable = device.isReachable();
|
||||
if (device.isPairRequestedByOtherEnd()) {
|
||||
((TextView) rootView.findViewById(R.id.pair_message)).setText(R.string.pair_requested);
|
||||
rootView.findViewById(R.id.pair_progress).setVisibility(View.GONE);
|
||||
rootView.findViewById(R.id.pair_button).setVisibility(View.GONE);
|
||||
rootView.findViewById(R.id.pair_request).setVisibility(View.VISIBLE);
|
||||
} else {
|
||||
|
||||
rootView.findViewById(R.id.pairing_buttons).setVisibility(paired ? View.GONE : View.VISIBLE);
|
||||
rootView.findViewById(R.id.unpair_message).setVisibility((paired && !reachable) ? View.VISIBLE : View.GONE);
|
||||
boolean paired = device.isPaired();
|
||||
boolean reachable = device.isReachable();
|
||||
|
||||
try {
|
||||
ArrayList<ListAdapter.Item> items = new ArrayList<>();
|
||||
rootView.findViewById(R.id.pairing_buttons).setVisibility(paired ? View.GONE : View.VISIBLE);
|
||||
rootView.findViewById(R.id.unpair_message).setVisibility((paired && !reachable) ? View.VISIBLE : View.GONE);
|
||||
|
||||
//Plugins button list
|
||||
final Collection<Plugin> plugins = device.getLoadedPlugins().values();
|
||||
for (final Plugin p : plugins) {
|
||||
if (!p.hasMainActivity()) continue;
|
||||
if (p.displayInContextMenu()) continue;
|
||||
try {
|
||||
ArrayList<ListAdapter.Item> items = new ArrayList<>();
|
||||
|
||||
items.add(new PluginItem(p, new View.OnClickListener() {
|
||||
@Override
|
||||
public void onClick(View v) {
|
||||
p.startMainActivity(mActivity);
|
||||
//Plugins button list
|
||||
final Collection<Plugin> plugins = device.getLoadedPlugins().values();
|
||||
for (final Plugin p : plugins) {
|
||||
if (!p.hasMainActivity()) continue;
|
||||
if (p.displayInContextMenu()) continue;
|
||||
|
||||
items.add(new PluginItem(p, new View.OnClickListener() {
|
||||
@Override
|
||||
public void onClick(View v) {
|
||||
p.startMainActivity(mActivity);
|
||||
}
|
||||
}));
|
||||
}
|
||||
}));
|
||||
}
|
||||
|
||||
//Failed plugins List
|
||||
final Collection<Plugin> failed = device.getFailedPlugins().values();
|
||||
if (!failed.isEmpty()) {
|
||||
if (errorHeader == null) {
|
||||
errorHeader = new TextView(mActivity);
|
||||
errorHeader.setPadding(
|
||||
0,
|
||||
((int) (28 * getResources().getDisplayMetrics().density)),
|
||||
0,
|
||||
((int) (8 * getResources().getDisplayMetrics().density))
|
||||
);
|
||||
errorHeader.setOnClickListener(null);
|
||||
errorHeader.setOnLongClickListener(null);
|
||||
errorHeader.setText(getResources().getString(R.string.plugins_failed_to_load));
|
||||
}
|
||||
items.add(new CustomItem(errorHeader));
|
||||
for (final Plugin p : failed) {
|
||||
items.add(new SmallEntryItem(p.getDisplayName(), new View.OnClickListener() {
|
||||
@Override
|
||||
public void onClick(View v) {
|
||||
p.getErrorDialog(mActivity).show();
|
||||
//Failed plugins List
|
||||
final ConcurrentHashMap<String, Plugin> failed = device.getFailedPlugins();
|
||||
if (!failed.isEmpty()) {
|
||||
if (errorHeader == null) {
|
||||
errorHeader = new TextView(mActivity);
|
||||
errorHeader.setPadding(
|
||||
0,
|
||||
((int) (28 * getResources().getDisplayMetrics().density)),
|
||||
0,
|
||||
((int) (8 * getResources().getDisplayMetrics().density))
|
||||
);
|
||||
errorHeader.setOnClickListener(null);
|
||||
errorHeader.setOnLongClickListener(null);
|
||||
errorHeader.setText(getResources().getString(R.string.plugins_failed_to_load));
|
||||
}
|
||||
}));
|
||||
items.add(new CustomItem(errorHeader));
|
||||
for (String s : failed.keySet()) {
|
||||
final Plugin p = failed.get(s);
|
||||
if (p == null) {
|
||||
items.add(new SmallEntryItem(s));
|
||||
} else {
|
||||
items.add(new SmallEntryItem(p.getDisplayName(), new View.OnClickListener() {
|
||||
@Override
|
||||
public void onClick(View v) {
|
||||
p.getErrorDialog(mActivity).show();
|
||||
}
|
||||
}));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
ListView buttonsList = (ListView) rootView.findViewById(R.id.buttons_list);
|
||||
ListAdapter adapter = new ListAdapter(mActivity, items);
|
||||
buttonsList.setAdapter(adapter);
|
||||
|
||||
mActivity.invalidateOptionsMenu();
|
||||
|
||||
} catch (IllegalStateException e) {
|
||||
e.printStackTrace();
|
||||
//Ignore: The activity was closed while we were trying to update it
|
||||
} catch (ConcurrentModificationException e) {
|
||||
Log.e("DeviceActivity", "ConcurrentModificationException");
|
||||
this.run(); //Try again
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
ListView buttonsList = (ListView) rootView.findViewById(R.id.buttons_list);
|
||||
ListAdapter adapter = new ListAdapter(mActivity, items);
|
||||
buttonsList.setAdapter(adapter);
|
||||
|
||||
mActivity.invalidateOptionsMenu();
|
||||
|
||||
} catch (IllegalStateException e) {
|
||||
e.printStackTrace();
|
||||
//Ignore: The activity was closed while we were trying to update it
|
||||
} catch (ConcurrentModificationException e) {
|
||||
Log.e("DeviceActivity", "ConcurrentModificationException");
|
||||
this.run(); //Try again
|
||||
}
|
||||
|
||||
}
|
||||
});
|
||||
|
||||
@ -396,17 +414,7 @@ public class DeviceFragment extends Fragment {
|
||||
|
||||
@Override
|
||||
public void incomingRequest() {
|
||||
mActivity.runOnUiThread(new Runnable() {
|
||||
@Override
|
||||
public void run() {
|
||||
((TextView) rootView.findViewById(R.id.pair_message)).setText(R.string.pair_requested);
|
||||
rootView.findViewById(R.id.pair_progress).setVisibility(View.GONE);
|
||||
rootView.findViewById(R.id.pair_button).setVisibility(View.GONE);
|
||||
rootView.findViewById(R.id.pair_request).setVisibility(View.VISIBLE);
|
||||
}
|
||||
});
|
||||
NotificationManager notificationManager = (NotificationManager) mActivity.getSystemService(Context.NOTIFICATION_SERVICE);
|
||||
notificationManager.cancel(device.getNotificationId());
|
||||
refreshUI();
|
||||
}
|
||||
|
||||
@Override
|
||||
|
@ -29,9 +29,16 @@ import org.kde.kdeconnect_tp.R;
|
||||
public class EntryItem implements ListAdapter.Item {
|
||||
|
||||
private final String title;
|
||||
private final String subtitle;
|
||||
|
||||
public EntryItem(String title) {
|
||||
public EntryItem(String title) {
|
||||
this.title = title;
|
||||
this.subtitle = null;
|
||||
}
|
||||
|
||||
public EntryItem(String title, String subtitle) {
|
||||
this.title = title;
|
||||
this.subtitle = subtitle;
|
||||
}
|
||||
|
||||
@Override
|
||||
@ -41,6 +48,14 @@ public class EntryItem implements ListAdapter.Item {
|
||||
TextView titleView = (TextView)v.findViewById(R.id.list_item_entry_title);
|
||||
if (titleView != null) titleView.setText(title);
|
||||
|
||||
if (subtitle != null) {
|
||||
TextView subtitleView = (TextView) v.findViewById(R.id.list_item_entry_summary);
|
||||
if (subtitleView != null) {
|
||||
subtitleView.setVisibility(View.VISIBLE);
|
||||
subtitleView.setText(subtitle);
|
||||
}
|
||||
}
|
||||
|
||||
return v;
|
||||
}
|
||||
|
||||
|
@ -13,6 +13,7 @@ import android.support.v4.app.Fragment;
|
||||
import android.support.v4.view.GravityCompat;
|
||||
import android.support.v4.widget.DrawerLayout;
|
||||
import android.support.v7.app.ActionBar;
|
||||
import android.support.v7.app.ActionBarDrawerToggle;
|
||||
import android.support.v7.app.AppCompatActivity;
|
||||
import android.support.v7.widget.Toolbar;
|
||||
import android.text.TextUtils;
|
||||
@ -39,6 +40,7 @@ public class MaterialActivity extends AppCompatActivity {
|
||||
|
||||
private NavigationView mNavigationView;
|
||||
private DrawerLayout mDrawerLayout;
|
||||
private ActionBarDrawerToggle mDrawerToggle;
|
||||
|
||||
private String mCurrentDevice;
|
||||
|
||||
@ -57,21 +59,32 @@ public class MaterialActivity extends AppCompatActivity {
|
||||
setSupportActionBar(toolbar);
|
||||
|
||||
ActionBar actionBar = getSupportActionBar();
|
||||
actionBar.setHomeAsUpIndicator(R.drawable.ic_drawer);
|
||||
|
||||
mDrawerToggle = new ActionBarDrawerToggle(this, /* host Activity */
|
||||
mDrawerLayout, /* DrawerLayout object */
|
||||
R.string.open, /* "open drawer" description */
|
||||
R.string.close /* "close drawer" description */
|
||||
);
|
||||
|
||||
mDrawerLayout.setDrawerListener(mDrawerToggle);
|
||||
mDrawerLayout.setDrawerShadow(R.drawable.drawer_shadow, GravityCompat.START);
|
||||
actionBar.setDisplayHomeAsUpEnabled(true);
|
||||
|
||||
mDrawerLayout.setDrawerShadow(R.drawable.drawer_shadow, GravityCompat.START);
|
||||
mDrawerToggle.setDrawerIndicatorEnabled(true);
|
||||
mDrawerToggle.syncState();
|
||||
|
||||
String deviceName = DeviceHelper.getDeviceName(this);
|
||||
TextView nameView = (TextView) mDrawerLayout.findViewById(R.id.device_name);
|
||||
nameView.setText(deviceName);
|
||||
|
||||
nameView.setOnClickListener(new View.OnClickListener() {
|
||||
View.OnClickListener renameListener = new View.OnClickListener() {
|
||||
@Override
|
||||
public void onClick(View v) {
|
||||
renameDevice();
|
||||
}
|
||||
});
|
||||
};
|
||||
mDrawerLayout.findViewById(R.id.kdeconnect_label).setOnClickListener(renameListener);
|
||||
mDrawerLayout.findViewById(R.id.device_name).setOnClickListener(renameListener);
|
||||
|
||||
mNavigationView.setNavigationItemSelectedListener(new NavigationView.OnNavigationItemSelectedListener() {
|
||||
@Override
|
||||
@ -96,7 +109,7 @@ public class MaterialActivity extends AppCompatActivity {
|
||||
Log.i("MaterialActivity", "Loading selected device from saved activity state");
|
||||
savedDevice = savedInstanceState.getString(STATE_SELECTED_DEVICE);
|
||||
} else {
|
||||
Log.i("MaterialActivity","Loading selected device from persistent storage");
|
||||
Log.i("MaterialActivity", "Loading selected device from persistent storage");
|
||||
savedDevice = preferences.getString(STATE_SELECTED_DEVICE, null);
|
||||
}
|
||||
onDeviceSelected(savedDevice);
|
||||
@ -195,7 +208,7 @@ public class MaterialActivity extends AppCompatActivity {
|
||||
|
||||
preferences.edit().putString(STATE_SELECTED_DEVICE, mCurrentDevice).apply();
|
||||
|
||||
for(HashMap.Entry<MenuItem, String> entry : mMapMenuToDeviceId.entrySet()) {
|
||||
for (HashMap.Entry<MenuItem, String> entry : mMapMenuToDeviceId.entrySet()) {
|
||||
boolean selected = TextUtils.equals(entry.getValue(), deviceId); //null-safe
|
||||
entry.getKey().setChecked(selected);
|
||||
}
|
||||
@ -232,8 +245,7 @@ public class MaterialActivity extends AppCompatActivity {
|
||||
|
||||
@Override
|
||||
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
|
||||
switch (requestCode)
|
||||
{
|
||||
switch (requestCode) {
|
||||
case RESULT_NEEDS_RELOAD:
|
||||
BackgroundService.RunCommand(this, new BackgroundService.InstanceCallback() {
|
||||
@Override
|
||||
@ -248,11 +260,17 @@ public class MaterialActivity extends AppCompatActivity {
|
||||
}
|
||||
}
|
||||
|
||||
void renameDevice() {
|
||||
public void renameDevice() {
|
||||
final TextView nameView = (TextView) mDrawerLayout.findViewById(R.id.device_name);
|
||||
final EditText deviceNameEdit = new EditText(MaterialActivity.this);
|
||||
String deviceName = DeviceHelper.getDeviceName(MaterialActivity.this);
|
||||
deviceNameEdit.setText(deviceName);
|
||||
deviceNameEdit.setPadding(
|
||||
((int) (18 * getResources().getDisplayMetrics().density)),
|
||||
((int) (16 * getResources().getDisplayMetrics().density)),
|
||||
((int) (18 * getResources().getDisplayMetrics().density)),
|
||||
((int) (12 * getResources().getDisplayMetrics().density))
|
||||
);
|
||||
new AlertDialog.Builder(MaterialActivity.this)
|
||||
.setView(deviceNameEdit)
|
||||
.setPositiveButton(R.string.device_rename_confirm, new DialogInterface.OnClickListener() {
|
||||
|
@ -77,7 +77,7 @@ public class PairingFragment extends Fragment implements PairingDeviceItem.Callb
|
||||
|
||||
TextView text = new TextView(inflater.getContext());
|
||||
text.setText(getString(R.string.pairing_description));
|
||||
text.setPadding(0, 0, 0, (int) (12 * getResources().getDisplayMetrics().density));
|
||||
text.setPadding(0, (int) (16 * getResources().getDisplayMetrics().density), 0, (int) (12 * getResources().getDisplayMetrics().density));
|
||||
((ListView) rootView).addHeaderView(text);
|
||||
|
||||
return rootView;
|
||||
|
BIN
store/header.png
Before Width: | Height: | Size: 80 KiB After Width: | Height: | Size: 686 KiB |
BIN
store/header.xcf
Normal file
BIN
store/icon.png
Normal file
After Width: | Height: | Size: 16 KiB |
BIN
store/screen1.png
Normal file
After Width: | Height: | Size: 375 KiB |
BIN
store/screen2.png
Normal file
After Width: | Height: | Size: 55 KiB |
BIN
store/screen3.png
Normal file
After Width: | Height: | Size: 228 KiB |
BIN
store/screen4.png
Normal file
After Width: | Height: | Size: 87 KiB |
BIN
store/screen5.png
Normal file
After Width: | Height: | Size: 166 KiB |