Compare commits
60 Commits
Author | SHA1 | Date | |
---|---|---|---|
|
275cd03b19 | ||
|
c0a70e35f0 | ||
|
8f3e0a8555 | ||
|
2f77e24ad1 | ||
|
5b694a3b3e | ||
|
9a04f24de6 | ||
|
39fba2ef2a | ||
|
de66bdfae3 | ||
|
017d05b189 | ||
|
d6264c3359 | ||
|
3e70c21031 | ||
|
2a6325c472 | ||
|
3aadc94278 | ||
|
9e8efb1822 | ||
|
74f5e2bf84 | ||
|
45fdf3c0ac | ||
|
e00376a316 | ||
|
f41fb4a9da | ||
|
e9a2cbd36b | ||
|
d5cb11e6c2 | ||
|
3b0a3e265d | ||
|
a5e9b29e20 | ||
|
307071e9e7 | ||
|
7c3e223e29 | ||
|
899c73d254 | ||
|
bd14c462dd | ||
|
e9b4ca70e9 | ||
|
706e3f71b5 | ||
|
f9b69a7e45 | ||
|
299e7e8375 | ||
|
f82c9c08cf | ||
|
25e1505df0 | ||
|
4d65382fa1 | ||
|
bf02f639b7 | ||
|
067f01134a | ||
|
7e2df27adb | ||
|
45bbed6d72 | ||
|
42f2f425a1 | ||
|
801c7cbd45 | ||
|
366aaea282 | ||
|
02f5ce2581 | ||
|
a360ca0a01 | ||
|
d356a9e964 | ||
|
e588428812 | ||
|
db0f6288ff | ||
|
86236169d1 | ||
|
32d9f199ff | ||
|
1d51c8792d | ||
|
6124b9a206 | ||
|
c3ad265490 | ||
|
9cf9f43118 | ||
|
11012e21e5 | ||
|
b7faa97292 | ||
|
cc17402609 | ||
|
a0b82d17b4 | ||
|
8550de5e7f | ||
|
46c70639ac | ||
|
fb2b1232fb | ||
|
c2011831a9 | ||
|
ac3ab375ab |
@@ -1,11 +1,11 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
package="org.kde.kdeconnect_tp"
|
||||
android:versionCode="805"
|
||||
android:versionName="0.8e">
|
||||
android:versionCode="808"
|
||||
android:versionName="0.8h">
|
||||
|
||||
<uses-sdk android:minSdkVersion="9"
|
||||
android:targetSdkVersion="21" />
|
||||
android:targetSdkVersion="22" />
|
||||
|
||||
<supports-screens
|
||||
android:smallScreens="true"
|
||||
@@ -32,6 +32,7 @@
|
||||
android:allowBackup="true"
|
||||
android:icon="@drawable/icon"
|
||||
android:label="KDE Connect"
|
||||
android:theme="@style/KdeConnectTheme"
|
||||
>
|
||||
|
||||
<service
|
||||
@@ -40,7 +41,6 @@
|
||||
</service>
|
||||
|
||||
<activity
|
||||
android:theme="@style/Theme.AppCompat"
|
||||
android:name="org.kde.kdeconnect.UserInterface.MainActivity"
|
||||
android:label="KDE Connect" >
|
||||
|
||||
@@ -60,7 +60,6 @@
|
||||
</activity>
|
||||
|
||||
<activity
|
||||
android:theme="@style/Theme.AppCompat"
|
||||
android:name="org.kde.kdeconnect.UserInterface.DeviceActivity"
|
||||
android:label="@string/device"
|
||||
android:parentActivityName="org.kde.kdeconnect.UserInterface.MainActivity"
|
||||
@@ -70,7 +69,6 @@
|
||||
</activity>
|
||||
|
||||
<activity
|
||||
android:theme="@style/Theme.AppCompat"
|
||||
android:name="org.kde.kdeconnect.UserInterface.PairActivity"
|
||||
android:label="@string/pair_device"
|
||||
android:parentActivityName="org.kde.kdeconnect.UserInterface.MainActivity"
|
||||
@@ -136,7 +134,6 @@
|
||||
<!-- Plugin-related activities and services -->
|
||||
|
||||
<activity
|
||||
android:theme="@style/Theme.AppCompat"
|
||||
android:name="org.kde.kdeconnect.Plugins.MprisPlugin.MprisActivity"
|
||||
android:label="@string/remote_control"
|
||||
android:parentActivityName="org.kde.kdeconnect.UserInterface.DeviceActivity"
|
||||
@@ -146,7 +143,6 @@
|
||||
</activity>
|
||||
|
||||
<activity
|
||||
android:theme="@style/Theme.AppCompat"
|
||||
android:name="org.kde.kdeconnect.Plugins.MousePadPlugin.MousePadActivity"
|
||||
android:label="@string/remote_control"
|
||||
android:windowSoftInputMode="stateHidden|adjustResize"
|
||||
@@ -159,7 +155,6 @@
|
||||
</activity>
|
||||
|
||||
<activity
|
||||
android:theme="@style/Theme.AppCompat"
|
||||
android:name="org.kde.kdeconnect.Plugins.SharePlugin.ShareActivity"
|
||||
android:label="KDE Connect"
|
||||
>
|
||||
@@ -185,7 +180,6 @@
|
||||
<activity
|
||||
android:name="org.kde.kdeconnect.Plugins.NotificationsPlugin.NotificationFilterActivity"
|
||||
android:label="@string/title_activity_notification_filter"
|
||||
android:theme="@style/Theme.AppCompat"
|
||||
android:parentActivityName="org.kde.kdeconnect.UserInterface.PluginSettingsActivity" >
|
||||
<meta-data
|
||||
android:name="android.support.PARENT_ACTIVITY"
|
||||
|
25
README.md
Normal file
@@ -0,0 +1,25 @@
|
||||
# KDE Connect - Android app
|
||||
|
||||
KDE Connect is a multi-platform app that allows your devices to communicate (eg: your phone and your computer).
|
||||
|
||||
## (Some) Features
|
||||
- **Shared clipboard**: copy and paste between your phone and your computer (or any other device).
|
||||
- **Notification sync**: Read your Android notifications from the desktop.
|
||||
- **Share files and URLs** instantly from one device to another.
|
||||
- **Multimedia remote control**: Use your phone as a remote for Linux media players.
|
||||
- **Virtual touchpad**: Use your phone screen as your computer's touchpad.
|
||||
|
||||
All this without wires, over the already existing WiFi network, and using a secure, encrypted protocol.
|
||||
|
||||
## About this app
|
||||
|
||||
This is a native Android port of the KDE Connect Qt app. You will find a more complete readme about KDE Connect [here](https://github.com/albertvaka/kdeconnect-kde).
|
||||
|
||||
## How to install this app
|
||||
|
||||
You can install this app from the [Play Store](https://play.google.com/store/apps/details?id=org.kde.kdeconnect_tp) as well as [F-Droid](https://f-droid.org/repository/browse/?fdid=org.kde.kdeconnect_tp). Note you will also need to install the [desktop app](https://github.com/albertvaka/kdeconnect-kde) for it to work.
|
||||
|
||||
## 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/).
|
34
build.gradle
@@ -3,18 +3,18 @@ buildscript {
|
||||
jcenter()
|
||||
}
|
||||
dependencies {
|
||||
classpath 'com.android.tools.build:gradle:1.0.+'
|
||||
classpath 'com.android.tools.build:gradle:1.1.0'
|
||||
}
|
||||
}
|
||||
|
||||
apply plugin: 'com.android.application'
|
||||
|
||||
android {
|
||||
compileSdkVersion 21
|
||||
buildToolsVersion '21.1.2'
|
||||
compileSdkVersion 22
|
||||
buildToolsVersion '22.0.1'
|
||||
defaultConfig {
|
||||
minSdkVersion 9
|
||||
targetSdkVersion 21
|
||||
targetSdkVersion 22
|
||||
}
|
||||
sourceSets {
|
||||
main {
|
||||
@@ -24,19 +24,24 @@ android {
|
||||
res.srcDirs = ['res']
|
||||
assets.srcDirs = ['assets']
|
||||
}
|
||||
androidTest {
|
||||
java.srcDirs = ['tests']
|
||||
}
|
||||
}
|
||||
packagingOptions {
|
||||
exclude "META-INF/DEPENDENCIES"
|
||||
exclude "META-INF/NOTICE"
|
||||
exclude "META-INF/LICENSE"
|
||||
exclude "META-INF/LICENSE.txt"
|
||||
exclude "META-INF/NOTICE.txt"
|
||||
pickFirst "META-INF/DEPENDENCIES"
|
||||
pickFirst "META-INF/LICENSE"
|
||||
pickFirst "META-INF/NOTICE"
|
||||
}
|
||||
lintOptions {
|
||||
abortOnError false
|
||||
checkReleaseBuilds false
|
||||
}
|
||||
buildTypes {
|
||||
release {
|
||||
minifyEnabled true
|
||||
proguardFiles getDefaultProguardFile('proguard-android.txt'),'proguard-rules.pro'
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -44,11 +49,18 @@ dependencies {
|
||||
repositories {
|
||||
mavenCentral()
|
||||
}
|
||||
compile 'com.android.support:support-v4:21.0.3'
|
||||
compile 'com.android.support:appcompat-v7:21.0.3'
|
||||
compile 'com.android.support:support-v4:22.2.0'
|
||||
compile 'com.android.support:appcompat-v7:22.2.0'
|
||||
compile 'org.apache.mina:mina-core:2.0.9'
|
||||
compile 'org.apache.sshd:sshd-core:0.8.0'
|
||||
compile 'org.bouncycastle:bcprov-jdk16:1.46'
|
||||
|
||||
|
||||
androidTestCompile 'org.mockito:mockito-core:1.10.19'
|
||||
|
||||
// Because mockito has some problems with dex environment
|
||||
androidTestCompile 'com.google.dexmaker:dexmaker:1.1'
|
||||
androidTestCompile 'com.google.dexmaker:dexmaker-mockito:1.1'
|
||||
|
||||
//compile fileTree(dir: 'libs', include: '*.jar')
|
||||
}
|
||||
|
28
proguard-rules.pro
vendored
Normal file
@@ -0,0 +1,28 @@
|
||||
# Add project specific ProGuard rules here.
|
||||
# By default, the flags in this file are appended to flags specified
|
||||
# in {SDKHOME}/tools/proguard/proguard-android.txt
|
||||
# You can edit the include path and order by changing the proguardFiles
|
||||
# directive in build.gradle.
|
||||
#
|
||||
# For more details, see
|
||||
# http://developer.android.com/guide/developing/tools/proguard.html
|
||||
|
||||
# Add any project specific keep options here:
|
||||
|
||||
# If your project uses WebView with JS, uncomment the following
|
||||
# and specify the fully qualified class name to the JavaScript interface
|
||||
# class:
|
||||
#-keepclassmembers class fqcn.of.javascript.interface.for.webview {
|
||||
# public *;
|
||||
#}
|
||||
|
||||
# Allow obfuscation of android.support.v7.internal.view.menu.**
|
||||
# to avoid problem on Samsung 4.2.2 devices with appcompat v21
|
||||
# see https://code.google.com/p/android/issues/detail?id=78377
|
||||
-keep class !android.support.v7.internal.view.menu.**,** {*;}
|
||||
|
||||
-dontwarn org.apache.sshd.**
|
||||
-dontwarn org.apache.mina.**
|
||||
-dontwarn org.bouncycastle.**
|
||||
-dontwarn org.slf4j.**
|
||||
|
BIN
res/drawable-hdpi/ic_device_laptop.png
Normal file
After Width: | Height: | Size: 627 B |
BIN
res/drawable-hdpi/ic_device_laptop_selected.png
Normal file
After Width: | Height: | Size: 671 B |
BIN
res/drawable-hdpi/ic_device_phone.png
Normal file
After Width: | Height: | Size: 560 B |
BIN
res/drawable-hdpi/ic_device_phone_selected.png
Normal file
After Width: | Height: | Size: 561 B |
BIN
res/drawable-hdpi/ic_device_tablet.png
Normal file
After Width: | Height: | Size: 444 B |
BIN
res/drawable-hdpi/ic_device_tablet_selected.png
Normal file
After Width: | Height: | Size: 456 B |
BIN
res/drawable-hdpi/mpris_plugin_action.png
Normal file
After Width: | Height: | Size: 477 B |
BIN
res/drawable-hdpi/share_plugin_action.png
Normal file
After Width: | Height: | Size: 441 B |
BIN
res/drawable-hdpi/touchpad_plugin_action.png
Normal file
After Width: | Height: | Size: 1.3 KiB |
Before Width: | Height: | Size: 2.0 KiB |
Before Width: | Height: | Size: 431 B After Width: | Height: | Size: 431 B |
Before Width: | Height: | Size: 750 B After Width: | Height: | Size: 750 B |
Before Width: | Height: | Size: 365 B After Width: | Height: | Size: 365 B |
BIN
res/drawable-mdpi/ic_device_laptop.png
Normal file
After Width: | Height: | Size: 377 B |
BIN
res/drawable-mdpi/ic_device_laptop_selected.png
Normal file
After Width: | Height: | Size: 385 B |
BIN
res/drawable-mdpi/ic_device_phone.png
Normal file
After Width: | Height: | Size: 402 B |
BIN
res/drawable-mdpi/ic_device_phone_selected.png
Normal file
After Width: | Height: | Size: 423 B |
BIN
res/drawable-mdpi/ic_device_tablet.png
Normal file
After Width: | Height: | Size: 304 B |
BIN
res/drawable-mdpi/ic_device_tablet_selected.png
Normal file
After Width: | Height: | Size: 299 B |
Before Width: | Height: | Size: 1.0 KiB After Width: | Height: | Size: 1.0 KiB |
Before Width: | Height: | Size: 3.0 KiB After Width: | Height: | Size: 3.0 KiB |
BIN
res/drawable-mdpi/mpris_plugin_action.png
Normal file
After Width: | Height: | Size: 311 B |
BIN
res/drawable-mdpi/share_plugin_action.png
Normal file
After Width: | Height: | Size: 373 B |
BIN
res/drawable-mdpi/touchpad_plugin_action.png
Normal file
After Width: | Height: | Size: 841 B |
BIN
res/drawable-xhdpi/ic_device_laptop.png
Normal file
After Width: | Height: | Size: 790 B |
BIN
res/drawable-xhdpi/ic_device_laptop_selected.png
Normal file
After Width: | Height: | Size: 839 B |
BIN
res/drawable-xhdpi/ic_device_phone.png
Normal file
After Width: | Height: | Size: 693 B |
BIN
res/drawable-xhdpi/ic_device_phone_selected.png
Normal file
After Width: | Height: | Size: 733 B |
BIN
res/drawable-xhdpi/ic_device_tablet.png
Normal file
After Width: | Height: | Size: 611 B |
BIN
res/drawable-xhdpi/ic_device_tablet_selected.png
Normal file
After Width: | Height: | Size: 623 B |
BIN
res/drawable-xhdpi/mpris_plugin_action.png
Normal file
After Width: | Height: | Size: 667 B |
BIN
res/drawable-xhdpi/share_plugin_action.png
Normal file
After Width: | Height: | Size: 684 B |
BIN
res/drawable-xhdpi/touchpad_plugin_action.png
Normal file
After Width: | Height: | Size: 1.8 KiB |
BIN
res/drawable-xxhdpi/ic_device_laptop.png
Normal file
After Width: | Height: | Size: 1.1 KiB |
BIN
res/drawable-xxhdpi/ic_device_laptop_selected.png
Normal file
After Width: | Height: | Size: 1.2 KiB |
BIN
res/drawable-xxhdpi/ic_device_phone.png
Normal file
After Width: | Height: | Size: 1.0 KiB |
BIN
res/drawable-xxhdpi/ic_device_phone_selected.png
Normal file
After Width: | Height: | Size: 1.0 KiB |
BIN
res/drawable-xxhdpi/ic_device_tablet.png
Normal file
After Width: | Height: | Size: 843 B |
BIN
res/drawable-xxhdpi/ic_device_tablet_selected.png
Normal file
After Width: | Height: | Size: 873 B |
BIN
res/drawable-xxhdpi/mpris_plugin_action.png
Normal file
After Width: | Height: | Size: 686 B |
BIN
res/drawable-xxhdpi/share_plugin_action.png
Normal file
After Width: | Height: | Size: 1.2 KiB |
BIN
res/drawable-xxhdpi/touchpad_plugin_action.png
Normal file
After Width: | Height: | Size: 3.0 KiB |
BIN
res/drawable-xxxhdpi/ic_device_laptop.png
Normal file
After Width: | Height: | Size: 1.6 KiB |
BIN
res/drawable-xxxhdpi/ic_device_laptop_selected.png
Normal file
After Width: | Height: | Size: 1.8 KiB |
BIN
res/drawable-xxxhdpi/ic_device_phone.png
Normal file
After Width: | Height: | Size: 1.7 KiB |
BIN
res/drawable-xxxhdpi/ic_device_phone_selected.png
Normal file
After Width: | Height: | Size: 1.8 KiB |
BIN
res/drawable-xxxhdpi/ic_device_tablet.png
Normal file
After Width: | Height: | Size: 1.4 KiB |
BIN
res/drawable-xxxhdpi/ic_device_tablet_selected.png
Normal file
After Width: | Height: | Size: 1.4 KiB |
@@ -10,14 +10,11 @@
|
||||
<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_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">احفظ الملفّات الواردة إلى تخزين الهاتف</string>
|
||||
<string name="plugin_not_available">هذه الميزة غير متوفّرة في إصدار أندرويد لديك</string>
|
||||
<string name="device_list_empty">لا أجهزة</string>
|
||||
<string name="ok">حسنًا</string>
|
||||
@@ -25,8 +22,6 @@
|
||||
<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-array name="mousepad_tap_entries">
|
||||
<item/>
|
||||
<item/>
|
||||
|
@@ -8,7 +8,6 @@
|
||||
<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">Отдалечен мултимедиен контрол</string>
|
||||
<string name="pref_plugin_mpris_desc">Управление на звук/видео от телефона</string>
|
||||
<string name="pref_plugin_ping">Пинг</string>
|
||||
<string name="pref_plugin_ping_desc">Изпращане и получаване на пинг</string>
|
||||
@@ -21,7 +20,6 @@
|
||||
<string name="open_settings">Отваряне на настройките</string>
|
||||
<string name="no_permissions">Трябва да осигурите права за достъп до уведомленията</string>
|
||||
<string name="send_ping">Изпращане на пинг</string>
|
||||
<string name="open_mpris_controls">Отваряне на отдалечен контрол</string>
|
||||
<string-array name="mousepad_tap_entries">
|
||||
<item>Right click</item>
|
||||
<item>Middle click</item>
|
||||
|
@@ -10,14 +10,11 @@
|
||||
<string name="pref_plugin_clipboard_desc">Podijeli sadržaj sandučića</string>
|
||||
<string name="pref_plugin_mousepad">Daljinska kontrola ulaza</string>
|
||||
<string name="pref_plugin_mousepad_desc">Koristi telofon kao miš i tastaturu</string>
|
||||
<string name="pref_plugin_mpris">Daljinske kontrole multimedije</string>
|
||||
<string name="pref_plugin_mpris_desc">Upravljajte zvukom/slikom sa vašeg telefona</string>
|
||||
<string name="pref_plugin_ping">Ping</string>
|
||||
<string name="pref_plugin_ping_desc">Šalji i primaj ping-ove</string>
|
||||
<string name="pref_plugin_notifications">Sinhronizovano obavještenje</string>
|
||||
<string name="pref_plugin_notifications_desc">Pristupite vašim notifikacijama sa drugog uređaja</string>
|
||||
<string name="pref_plugin_sharereceiver">Podijeli prijemnik</string>
|
||||
<string name="pref_plugin_sharereceiver_desc">Spasi dolazeće datoteke na telefonsku memoriju</string>
|
||||
<string name="plugin_not_available">Ovo svojstvo nije dostupno i vašoj Android verziji</string>
|
||||
<string name="device_list_empty">Nema uređaja</string>
|
||||
<string name="ok">OK</string>
|
||||
@@ -25,8 +22,6 @@
|
||||
<string name="open_settings">Otvori postavke</string>
|
||||
<string name="no_permissions">Morate odobriti dopuštenje da pristupite notifikacijama</string>
|
||||
<string name="send_ping">Pošalji ping</string>
|
||||
<string name="open_mpris_controls">Otvori daljinsku kontrolu</string>
|
||||
<string name="open_mousepad">Otvori touchpad kontrolu</string>
|
||||
<string name="mousepad_info">Pomjerite prst na ekranu da opmjerite kursor miša. Tapnite za klik i koristite dva ili tri prsta za srednje i desno dugme. Koristite dugi pritisak za prevlačenje.</string>
|
||||
<string name="mousepad_double_tap_settings_title">Postavite akciju tapa sa dva prsta</string>
|
||||
<string name="mousepad_triple_tap_settings_title">Postavite akciju tapa sa tri prsta</string>
|
||||
|
@@ -10,14 +10,14 @@
|
||||
<string name="pref_plugin_clipboard_desc">Comparteix el contingut del porta-retalls</string>
|
||||
<string name="pref_plugin_mousepad">Entrada remota</string>
|
||||
<string name="pref_plugin_mousepad_desc">Usa el vostre telèfon com un ratolí i un teclat</string>
|
||||
<string name="pref_plugin_mpris">Comandament a distància multimèdia</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_ping">Ping</string>
|
||||
<string name="pref_plugin_ping_desc">Envia i rep els pings</string>
|
||||
<string name="pref_plugin_notifications">Sincronitza les notificacions</string>
|
||||
<string name="pref_plugin_notifications_desc">Accedeix a les vostres notificacions des d\'altres dispositius</string>
|
||||
<string name="pref_plugin_sharereceiver">Receptor de compartits</string>
|
||||
<string name="pref_plugin_sharereceiver_desc">Desa els fitxers entrants a l\'emmagatzematge del telèfon</string>
|
||||
<string name="pref_plugin_sharereceiver">Comparteix i rep</string>
|
||||
<string name="pref_plugin_sharereceiver_desc">Comparteix els fitxers i els URL entre els dispositius</string>
|
||||
<string name="plugin_not_available">Aquesta característica no està disponible en la vostra versió d\'Android</string>
|
||||
<string name="device_list_empty">No hi ha cap dispositiu</string>
|
||||
<string name="ok">D\'acord</string>
|
||||
@@ -25,8 +25,8 @@
|
||||
<string name="open_settings">Obre l\'arranjament</string>
|
||||
<string name="no_permissions">Us caldrà concedir permís per accedir a les notificacions</string>
|
||||
<string name="send_ping">Envia un ping</string>
|
||||
<string name="open_mpris_controls">Obre el comandament a distància</string>
|
||||
<string name="open_mousepad">Obre el control pel plafó tàctil</string>
|
||||
<string name="open_mpris_controls">Control multimèdia</string>
|
||||
<string name="open_mousepad">Entrada remota</string>
|
||||
<string name="mousepad_info">Moveu un dit per la pantalla per a moure el cursor del ratolí. Toqueu per un clic, i empreu dos/tres dits pels botons dret i mig. Empreu un toc llarg per arrossegar i deixar anar.</string>
|
||||
<string name="mousepad_double_tap_settings_title">Estableix l\'acció de tocar amb dos dits</string>
|
||||
<string name="mousepad_triple_tap_settings_title">Estableix l\'acció de tocar amb tres dits</string>
|
||||
@@ -62,6 +62,7 @@
|
||||
<string name="outgoing_file_title">S\'està enviant el fitxer a %1s</string>
|
||||
<string name="outgoing_file_text">%1s</string>
|
||||
<string name="received_file_title">Fitxer rebut des de %1s</string>
|
||||
<string name="received_file_fail_title">Ha fallat en rebre el fitxer des de %1s</string>
|
||||
<string name="received_file_text">Puntegeu per obrir «%1s»</string>
|
||||
<string name="sent_file_title">Envia el fitxer a %1s</string>
|
||||
<string name="sent_file_text">%1s</string>
|
||||
|
@@ -10,14 +10,14 @@
|
||||
<string name="pref_plugin_clipboard_desc">Sdílet obsah schránky</string>
|
||||
<string name="pref_plugin_mousepad">Vzdálený vstup</string>
|
||||
<string name="pref_plugin_mousepad_desc">Používejte svůj telefon jako myš a klávesnici</string>
|
||||
<string name="pref_plugin_mpris">Vzdálené ovládání multimédií</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_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>
|
||||
<string name="pref_plugin_notifications_desc">Zpřístupněte si upozornění z jiných zařízení</string>
|
||||
<string name="pref_plugin_sharereceiver">Sdílet příjemce</string>
|
||||
<string name="pref_plugin_sharereceiver_desc">Ukládat příchozí soubory do úložiště telefonu</string>
|
||||
<string name="pref_plugin_sharereceiver">Sdílet s přijmnout</string>
|
||||
<string name="pref_plugin_sharereceiver_desc">Sdílet soubory a odkazy mezi zařízeními</string>
|
||||
<string name="plugin_not_available">Tato vlastnost není pro vaši verzi Androidu platná</string>
|
||||
<string name="device_list_empty">Žádná zařízení</string>
|
||||
<string name="ok">OK</string>
|
||||
@@ -25,8 +25,8 @@
|
||||
<string name="open_settings">Otevřít nastavení</string>
|
||||
<string name="no_permissions">Pro zpřístupnění upozornění potřebujete oprávnění</string>
|
||||
<string name="send_ping">Poslat ping</string>
|
||||
<string name="open_mpris_controls">Otevřít vzdálené ovládání</string>
|
||||
<string name="open_mousepad">Otevřít dotykové ovládání</string>
|
||||
<string name="open_mpris_controls">Ovládání multimédií</string>
|
||||
<string name="open_mousepad">Vzdálený vstup</string>
|
||||
<string name="mousepad_info">Pohybujte prstem po obrazovce pro pohybování kurzorem myši. Ťukněte pro kliknutí a použijte dva/tři prsty jako pravé a prostřední tlačítko. Pro přetažení dlouze podržte.</string>
|
||||
<string name="mousepad_double_tap_settings_title">Nastavit činnost pro ťuknutí dvěma prsty</string>
|
||||
<string name="mousepad_triple_tap_settings_title">Nastavit činnost pro ťuknutí třemi prsty</string>
|
||||
@@ -62,6 +62,7 @@
|
||||
<string name="outgoing_file_title">Odesílám soubor do %1s</string>
|
||||
<string name="outgoing_file_text">%1s</string>
|
||||
<string name="received_file_title">Přijat soubor od %1s</string>
|
||||
<string name="received_file_fail_title">Selhalo přijímání souboru od %1s</string>
|
||||
<string name="received_file_text">Ťukněte pro otevření \'%1s\'</string>
|
||||
<string name="sent_file_title">Soubor byl odeslán do %1s</string>
|
||||
<string name="sent_file_text">%1s</string>
|
||||
|
@@ -10,14 +10,11 @@
|
||||
<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">Fjernbetjening af multimedie</string>
|
||||
<string name="pref_plugin_mpris_desc">Styr lyd og video fra din telefon</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 modtager</string>
|
||||
<string name="pref_plugin_sharereceiver_desc">Gem indkommende filer til telefonens lager</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>
|
||||
@@ -25,8 +22,6 @@
|
||||
<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">Åbn fjernbetjening</string>
|
||||
<string name="open_mousepad">Åbn touchpad-kontrol</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>
|
||||
@@ -62,6 +57,7 @@
|
||||
<string name="outgoing_file_title">Sender fil til %1s</string>
|
||||
<string name="outgoing_file_text">%1s</string>
|
||||
<string name="received_file_title">Modtog fil fra %1s</string>
|
||||
<string name="received_file_fail_title">Kunne ikke modtage fil fra %1s</string>
|
||||
<string name="received_file_text">Tap for at åbne \"%1s\"</string>
|
||||
<string name="sent_file_title">Fil sendt til %1s</string>
|
||||
<string name="sent_file_text">%1s</string>
|
||||
|
@@ -8,13 +8,12 @@
|
||||
<string name="pref_plugin_sftp_desc">Erlaubt das Browsen des Dateisystems auf dem entfernten Handy</string>
|
||||
<string name="pref_plugin_clipboard">Abgleich der Zwischenablage</string>
|
||||
<string name="pref_plugin_clipboard_desc">Inhalt der Zwischenablage freigeben</string>
|
||||
<string name="pref_plugin_mpris">Multimedia-Fernbedienungen</string>
|
||||
<string name="pref_plugin_mousepad_desc">Verwendet Ihr Handy als Maus und Tastatur</string>
|
||||
<string name="pref_plugin_mpris_desc">Audio und Video mit Ihrem Telefon steuern</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>
|
||||
<string name="pref_plugin_notifications_desc">Zugriff auf Ihre Benachrichtigungen von anderen Geräten</string>
|
||||
<string name="pref_plugin_sharereceiver_desc">Eingehende Dateien auf dem Telefonspeicher ablegen</string>
|
||||
<string name="plugin_not_available">Diese Funktion ist in Ihrer Android-Version nicht verfügbar</string>
|
||||
<string name="device_list_empty">Keine Geräte</string>
|
||||
<string name="ok">OK</string>
|
||||
@@ -22,8 +21,6 @@
|
||||
<string name="open_settings">Einstellungen öffnen</string>
|
||||
<string name="no_permissions">Sie müssen die Erlaubnis zum Zugriff auf Benachrichtigungen erteilen</string>
|
||||
<string name="send_ping">Ping senden</string>
|
||||
<string name="open_mpris_controls">Fernbedienung öffnen</string>
|
||||
<string name="open_mousepad">Touchpad-Steuerung öffnen</string>
|
||||
<string-array name="mousepad_tap_entries">
|
||||
<item>Rechtsklick</item>
|
||||
<item>Mittelklick</item>
|
||||
@@ -52,9 +49,12 @@
|
||||
<string name="received_url_title">Verknüpfung von %1s erhalten</string>
|
||||
<string name="incoming_file_title">Eingehende Datei von %1s</string>
|
||||
<string name="incoming_file_text">%1s</string>
|
||||
<string name="outgoing_file_title">Datei wird an %1s gesendet</string>
|
||||
<string name="outgoing_file_text">%1s</string>
|
||||
<string name="received_file_title">Datei von %1s erhalten</string>
|
||||
<string name="sent_file_title">Datei an %1s gesendet</string>
|
||||
<string name="sent_file_text">%1s</string>
|
||||
<string name="sent_file_failed_title">Das Senden der Datei an %1s ist fehlgeschlagen</string>
|
||||
<string name="sent_file_failed_text">%1s</string>
|
||||
<string name="tap_to_answer">Tippen zum Antworten</string>
|
||||
<string name="reconnect">Erneut verbinden</string>
|
||||
@@ -94,7 +94,9 @@
|
||||
<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="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>
|
||||
<string name="sftp_internal_storage">Interner Speicher</string>
|
||||
<string name="sftp_all_files">Alle Dateien</string>
|
||||
<string name="sftp_sdcard_num">SD-Karte %d</string>
|
||||
|
@@ -10,14 +10,11 @@
|
||||
<string name="pref_plugin_clipboard_desc">Compartir el contenido del portapapeles</string>
|
||||
<string name="pref_plugin_mousepad">Entrada remota</string>
|
||||
<string name="pref_plugin_mousepad_desc">Usar su teléfono como ratón y teclado</string>
|
||||
<string name="pref_plugin_mpris">Controles remotos multimedia</string>
|
||||
<string name="pref_plugin_mpris_desc">Controlar audio y vídeo desde el teléfono</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>
|
||||
<string name="pref_plugin_notifications_desc">Acceder a las notificaciones desde otros dispositivos</string>
|
||||
<string name="pref_plugin_sharereceiver">Compartir receptor</string>
|
||||
<string name="pref_plugin_sharereceiver_desc">Guardar archivos entrantes en el almacenamiento del teléfono</string>
|
||||
<string name="plugin_not_available">Esta funcionalidad no está disponible en su versión de Android</string>
|
||||
<string name="device_list_empty">Ningún dispositivo</string>
|
||||
<string name="ok">Aceptar</string>
|
||||
@@ -25,8 +22,6 @@
|
||||
<string name="open_settings">Abrir preferencias</string>
|
||||
<string name="no_permissions">Debe otorgar permiso para acceder a las notificaciones</string>
|
||||
<string name="send_ping">Enviar ping</string>
|
||||
<string name="open_mpris_controls">Abrir control remoto</string>
|
||||
<string name="open_mousepad">Abrir control del panel táctil</string>
|
||||
<string name="mousepad_info">Mueva un dedo sobre la pantalla para mover el cursor del ratón. Pulse para ejecutar un clic y use dos/tres dedos para emular los botones derecho y central. Use una pulsación larga para arrastrar y soltar.</string>
|
||||
<string name="mousepad_double_tap_settings_title">Establecer la acción al pulsar con dos dedos</string>
|
||||
<string name="mousepad_triple_tap_settings_title">Establecer la acción al pulsar con tres dedos</string>
|
||||
@@ -62,6 +57,7 @@
|
||||
<string name="outgoing_file_title">Enviando archivo a %1s</string>
|
||||
<string name="outgoing_file_text">%1s</string>
|
||||
<string name="received_file_title">Archivo recibido desde %1s</string>
|
||||
<string name="received_file_fail_title">Fallo recibiendo archivo desde %1s</string>
|
||||
<string name="received_file_text">Pulse para abrir «%1s»</string>
|
||||
<string name="sent_file_title">Archivo enviado a %1s</string>
|
||||
<string name="sent_file_text">%1s</string>
|
||||
|
@@ -10,14 +10,11 @@
|
||||
<string name="pref_plugin_clipboard_desc">Jaa leikepöydän sisältö</string>
|
||||
<string name="pref_plugin_mousepad">Kauko-ohjaus</string>
|
||||
<string name="pref_plugin_mousepad_desc">Käytä puhelintasi hiirenä ja näppäimistönä</string>
|
||||
<string name="pref_plugin_mpris">Multimedian kauko-ohjaus</string>
|
||||
<string name="pref_plugin_mpris_desc">Ohjaa ääntä ja videota puhelimestasi</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>
|
||||
<string name="pref_plugin_notifications_desc">Näe ilmoituksesi muissa laitteissa</string>
|
||||
<string name="pref_plugin_sharereceiver">Jaon vastaanottaja</string>
|
||||
<string name="pref_plugin_sharereceiver_desc">Tallenna tulevat tiedoston puhelimen muistiin</string>
|
||||
<string name="plugin_not_available">Piirre ei ole käytettävissä Android-versiossasi</string>
|
||||
<string name="device_list_empty">Ei laitteita</string>
|
||||
<string name="ok">OK</string>
|
||||
@@ -25,8 +22,6 @@
|
||||
<string name="open_settings">Avaa asetukset</string>
|
||||
<string name="no_permissions">Sinun on annettava lupa ilmoitusten näkemiseen</string>
|
||||
<string name="send_ping">Lähetä tiedustelupaketti</string>
|
||||
<string name="open_mpris_controls">Avaa kauko-ohjain</string>
|
||||
<string name="open_mousepad">Avaa hiiren ohjain</string>
|
||||
<string name="mousepad_info">Liikuta hiiren osoitinta liikuttamalla sormeasi näytöllä. Napsauta napauttamalla yhdellä sormella, käytä oikeaa painiketta kahdella sormella ja keskipainiketta kolmella. Vedä ja pudota painamalla pitkään.</string>
|
||||
<string name="mousepad_double_tap_settings_title">Aseta kahden sormen napautuksen toiminto</string>
|
||||
<string name="mousepad_triple_tap_settings_title">Aseta kolmen sormen napautuksen toiminto</string>
|
||||
@@ -62,6 +57,7 @@
|
||||
<string name="outgoing_file_title">Lähetetään tiedostoa laitteeseen %1s</string>
|
||||
<string name="outgoing_file_text">%1s</string>
|
||||
<string name="received_file_title">Vastaanotettiin tiedosto lähettäjältä %1s</string>
|
||||
<string name="received_file_fail_title">Ei voitu vastaanottaa tiedostoa lähettäjältä %1s</string>
|
||||
<string name="received_file_text">Avaa ”%1s” napauttamalla</string>
|
||||
<string name="sent_file_title">Tiedosto lähetetty laitteeseen %1s</string>
|
||||
<string name="sent_file_text">%1s</string>
|
||||
|
@@ -10,14 +10,11 @@
|
||||
<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 distants 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">Réception de fichier</string>
|
||||
<string name="pref_plugin_sharereceiver_desc">Enregistrer les fichiers reçus dans le stockage du téléphone</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>
|
||||
@@ -25,8 +22,6 @@
|
||||
<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">Ouvrir un contrôle distant</string>
|
||||
<string name="open_mousepad">Ouvrir le pavé tactile</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>
|
||||
|
59
res/values-gl/strings.xml
Normal file
@@ -0,0 +1,59 @@
|
||||
<?xml version='1.0' encoding='utf-8'?>
|
||||
<resources>
|
||||
<string name="pref_plugin_ping">Ping</string>
|
||||
<string name="pref_plugin_ping_desc">Enviar e recibir pings.</string>
|
||||
<string name="pref_plugin_notifications">Sincronización de notificacións</string>
|
||||
<string name="device_list_empty">Non hai dispositivos.</string>
|
||||
<string name="ok">Aceptar</string>
|
||||
<string name="cancel">Cancelar</string>
|
||||
<string name="open_settings">Abrir a configuración</string>
|
||||
<string name="send_ping">Enviar un ping</string>
|
||||
<string-array name="mousepad_tap_entries">
|
||||
<item>Clic dereito</item>
|
||||
<item>Clic central</item>
|
||||
<item>Nada</item>
|
||||
</string-array>
|
||||
<string name="mousepad_double_default">dereita</string>
|
||||
<string name="mousepad_triple_default">medio</string>
|
||||
<string name="category_connected_devices">Dispositivos conectados</string>
|
||||
<string name="category_not_paired_devices">Dispositivos dispoñíbeis</string>
|
||||
<string name="device_menu_plugins">Configuración do engadido</string>
|
||||
<string name="device_menu_unpair">Desemparellarse</string>
|
||||
<string name="unknown_device">Dispositivo descoñecido</string>
|
||||
<string name="error_not_reachable">Dispositivo fóra do alcance</string>
|
||||
<string name="error_timed_out">Esgotouse o tempo límite</string>
|
||||
<string name="error_canceled_by_user">Cancelouno o usuario.</string>
|
||||
<string name="error_canceled_by_other_peer">Cancelouse remotamente</string>
|
||||
<string name="incoming_file_text">%1s</string>
|
||||
<string name="outgoing_file_text">%1s</string>
|
||||
<string name="sent_file_text">%1s</string>
|
||||
<string name="sent_file_failed_text">%1s</string>
|
||||
<string name="reconnect">Conectar de novo</string>
|
||||
<string name="show_keyboard">Mostrar o teclado</string>
|
||||
<string name="pairing_accept">Aceptar</string>
|
||||
<string name="pairing_reject">Rexeitar</string>
|
||||
<string name="device">Dispositivo</string>
|
||||
<string name="remote_control">Control remoto</string>
|
||||
<string name="settings">Configuración de KDE Connect</string>
|
||||
<string name="mpris_play">Reproducir</string>
|
||||
<string name="mpris_previous">Anterior</string>
|
||||
<string name="mpris_rew">Retroceder</string>
|
||||
<string name="mpris_ff">Cara a adiante</string>
|
||||
<string name="mpris_next">Seguinte</string>
|
||||
<string name="mpris_volume">Volume</string>
|
||||
<string-array name="mpris_time_entries">
|
||||
<item>10 segundos</item>
|
||||
<item>20 segundos</item>
|
||||
<item>30 segundos</item>
|
||||
<item>1 minuto</item>
|
||||
<item>2 minutos</item>
|
||||
</string-array>
|
||||
<string name="general_settings">Configuración xeral</string>
|
||||
<string name="plugin_settings">Configuración</string>
|
||||
<string name="device_name">Nome do dispositivo</string>
|
||||
<string name="device_name_preference_summary">%s</string>
|
||||
<string name="sftp_internal_storage">Almacenamento interno</string>
|
||||
<string name="sftp_all_files">Todos os ficheiros</string>
|
||||
<string name="sftp_readonly">(só lectura)</string>
|
||||
<string name="sftp_camera">Imaxes da cámara</string>
|
||||
</resources>
|
@@ -8,14 +8,11 @@
|
||||
<string name="pref_plugin_sftp_desc">Lehetővé teszi a telefon fájlrendszerének távolról történő tallózását</string>
|
||||
<string name="pref_plugin_clipboard">Vágólap szinkronizáció</string>
|
||||
<string name="pref_plugin_clipboard_desc">A vágólap tartalmának megosztása</string>
|
||||
<string name="pref_plugin_mpris">Multimedia távirányítók</string>
|
||||
<string name="pref_plugin_mpris_desc">Hang vagy videó vezérlése a telefonról</string>
|
||||
<string name="pref_plugin_ping">Ping</string>
|
||||
<string name="pref_plugin_ping_desc">Pingek küldése és fogadása</string>
|
||||
<string name="pref_plugin_notifications">Értesítés szinkronizáció</string>
|
||||
<string name="pref_plugin_notifications_desc">Hozzáférés az értesítésekhez más eszközökről</string>
|
||||
<string name="pref_plugin_sharereceiver">Megosztás vevő</string>
|
||||
<string name="pref_plugin_sharereceiver_desc">Bejövő fájlok mentése a telefon háttértárára</string>
|
||||
<string name="plugin_not_available">Ez a funkció nem érhető el az ön Android verziójában</string>
|
||||
<string name="device_list_empty">Nincsenek eszközök</string>
|
||||
<string name="ok">OK</string>
|
||||
@@ -23,8 +20,6 @@
|
||||
<string name="open_settings">Beállítások megnyitása</string>
|
||||
<string name="no_permissions">Jogot kell adnia az értesítésekhez való hozzáféréshez</string>
|
||||
<string name="send_ping">Ping küldése</string>
|
||||
<string name="open_mpris_controls">Távirányító megnyitása</string>
|
||||
<string name="open_mousepad">Érintőtábla vezérlő megnyitása</string>
|
||||
<string-array name="mousepad_tap_entries">
|
||||
<item/>
|
||||
<item/>
|
||||
|
@@ -10,14 +10,11 @@
|
||||
<string name="pref_plugin_clipboard_desc">Condividi il contenuto degli appunti</string>
|
||||
<string name="pref_plugin_mousepad">Impulso remoto</string>
|
||||
<string name="pref_plugin_mousepad_desc">Usa il tuo telefono come mouse e tastiera</string>
|
||||
<string name="pref_plugin_mpris">Telecomando multimediale</string>
|
||||
<string name="pref_plugin_mpris_desc">Controlla la riproduzione audio/video dal telefono</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>
|
||||
<string name="pref_plugin_notifications_desc">Consenti l\'accesso alle notifiche dagli altri dispositivi</string>
|
||||
<string name="pref_plugin_sharereceiver">Condivisione ricevitore</string>
|
||||
<string name="pref_plugin_sharereceiver_desc">Salva i file in ingresso nella memoria del telefono</string>
|
||||
<string name="plugin_not_available">Questa funzionalità non è disponibile sulla tua versione di Android</string>
|
||||
<string name="device_list_empty">Nessun dispositivo</string>
|
||||
<string name="ok">OK</string>
|
||||
@@ -25,8 +22,6 @@
|
||||
<string name="open_settings">Apri impostazioni</string>
|
||||
<string name="no_permissions">Devi concedere i permessi per l\'accesso alle notifiche</string>
|
||||
<string name="send_ping">Invia ping</string>
|
||||
<string name="open_mpris_controls">Apri telecomando</string>
|
||||
<string name="open_mousepad">Apri controllo del touchpad</string>
|
||||
<string name="mousepad_info">Muovi un dito sullo schermo per spostare il puntatore del mouse. Tocca per un clic e usa due/tre dita per i pulsanti destro e centrale. Utilizza una pressione lunga per trascinare e rilasciare.</string>
|
||||
<string name="mousepad_double_tap_settings_title">Imposta azione per il tocco a due dita</string>
|
||||
<string name="mousepad_triple_tap_settings_title">Imposta azione per il tocco a tre dita</string>
|
||||
@@ -62,6 +57,7 @@
|
||||
<string name="outgoing_file_title">Invio file a %1s</string>
|
||||
<string name="outgoing_file_text">%1s</string>
|
||||
<string name="received_file_title">File ricevuto da %1s</string>
|
||||
<string name="received_file_fail_title">Ricezione file da %1s non riuscita</string>
|
||||
<string name="received_file_text">Tocca per aprire «%1s»</string>
|
||||
<string name="sent_file_title">File inviato a %1s</string>
|
||||
<string name="sent_file_text">%1s</string>
|
||||
|
@@ -10,14 +10,11 @@
|
||||
<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_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">보낸 파일을 장치에 저장합니다</string>
|
||||
<string name="plugin_not_available">현재 안드로이드 버전에서 사용할 수 없습니다</string>
|
||||
<string name="device_list_empty">장치 없음</string>
|
||||
<string name="ok">확인</string>
|
||||
@@ -25,8 +22,6 @@
|
||||
<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-array name="mousepad_tap_entries">
|
||||
<item/>
|
||||
<item/>
|
||||
|
@@ -10,14 +10,14 @@
|
||||
<string name="pref_plugin_clipboard_desc">De inhoud van het klembord delen</string>
|
||||
<string name="pref_plugin_mousepad">Invoer op afstand</string>
|
||||
<string name="pref_plugin_mousepad_desc">Uw telefoon gebruiken als een muis en toetsenbord</string>
|
||||
<string name="pref_plugin_mpris">Afstandsbediening van multimedia</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_ping">Ping</string>
|
||||
<string name="pref_plugin_ping_desc">Pings verzenden en ontvangen</string>
|
||||
<string name="pref_plugin_notifications">Synchronisatie van meldingen</string>
|
||||
<string name="pref_plugin_notifications_desc">Bekijk uw meldingen van andere apparaten</string>
|
||||
<string name="pref_plugin_sharereceiver">Ontvanger delen</string>
|
||||
<string name="pref_plugin_sharereceiver_desc">Inkomende bestanden opslaan naar de opslag van de telefoon</string>
|
||||
<string name="pref_plugin_sharereceiver">Delen en Ontvangen</string>
|
||||
<string name="pref_plugin_sharereceiver_desc">Bestanden en URL\'s delen tussen apparaten</string>
|
||||
<string name="plugin_not_available">Deze functie is niet beschikbaar in uw versie van Android</string>
|
||||
<string name="device_list_empty">Geen apparaten</string>
|
||||
<string name="ok">OK</string>
|
||||
@@ -25,8 +25,8 @@
|
||||
<string name="open_settings">Instellingen openen</string>
|
||||
<string name="no_permissions">U moet toestemming geven voor toegang tot meldingen</string>
|
||||
<string name="send_ping">Ping verzenden</string>
|
||||
<string name="open_mpris_controls">Afstandsbediening openen</string>
|
||||
<string name="open_mousepad">Afstandsbediening van touchpad openen</string>
|
||||
<string name="open_mpris_controls">Bediening van multimedia</string>
|
||||
<string name="open_mousepad">Invoer op afstand</string>
|
||||
<string name="mousepad_info">Veeg met een vinger op het scherm om de muiscursor te verplaatsen. Tik om te klikken en gebruik twee/drie vingers voor rechter en middelste knop. Druk lang voor slepen en loslaten.</string>
|
||||
<string name="mousepad_double_tap_settings_title">Tikactie met twee vingers instellen</string>
|
||||
<string name="mousepad_triple_tap_settings_title">Tikactie met drie vingers instellen</string>
|
||||
@@ -62,6 +62,7 @@
|
||||
<string name="outgoing_file_title">Bezig bestand te verzenden naar %1s</string>
|
||||
<string name="outgoing_file_text">%1s</string>
|
||||
<string name="received_file_title">Bestand ontvangen van %1s</string>
|
||||
<string name="received_file_fail_title">Bestand ontvangen van %1s is mislukt</string>
|
||||
<string name="received_file_text">Tap om \'%1s\' te openen</string>
|
||||
<string name="sent_file_title">Bestand verzonden naar %1s</string>
|
||||
<string name="sent_file_text">%1s</string>
|
||||
|
@@ -10,14 +10,14 @@
|
||||
<string name="pref_plugin_clipboard_desc">Udostępnij zawartość schowka</string>
|
||||
<string name="pref_plugin_mousepad">Zdalne sterowanie</string>
|
||||
<string name="pref_plugin_mousepad_desc">Użyj swojego telefonu jako myszy i klawiatury</string>
|
||||
<string name="pref_plugin_mpris">Zdalne sterowanie multimediami</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_ping">Ping</string>
|
||||
<string name="pref_plugin_ping_desc">Wysyłaj i otrzymuj pingi</string>
|
||||
<string name="pref_plugin_notifications">Powiadomienia synchronizacji</string>
|
||||
<string name="pref_plugin_notifications_desc">Uzyskaj dostęp do swoich powiadomień z innego urządzenia</string>
|
||||
<string name="pref_plugin_sharereceiver">Udostępnij odbiornik</string>
|
||||
<string name="pref_plugin_sharereceiver_desc">Zapisz przychodzące pliki do pamięci telefonu</string>
|
||||
<string name="pref_plugin_sharereceiver">Udostępniaj i otrzymuj</string>
|
||||
<string name="pref_plugin_sharereceiver_desc">Współdziel pliki i adresy URL pomiędzy urządzeniami</string>
|
||||
<string name="plugin_not_available">Funkcja ta nie jest dostępna w twojej wersji Androida</string>
|
||||
<string name="device_list_empty">Brak urządzeń</string>
|
||||
<string name="ok">OK</string>
|
||||
@@ -25,8 +25,8 @@
|
||||
<string name="open_settings">Otwórz ustawienia</string>
|
||||
<string name="no_permissions">Musisz przydzielić uprawnienia, aby uzyskać dostęp do powiadomień</string>
|
||||
<string name="send_ping">Wyślij ping</string>
|
||||
<string name="open_mpris_controls">Otwórz zdalne sterowanie</string>
|
||||
<string name="open_mousepad">Otwórz sterowanie gładzikiem</string>
|
||||
<string name="open_mpris_controls">Sterowanie multimediami</string>
|
||||
<string name="open_mousepad">Zdalne sterowanie</string>
|
||||
<string name="mousepad_info">Przesuń palcem po ekranie, aby przesunąć wskaźnik myszy. Stuknij, aby wywołać naciśniecie lewym przyciskiem myszy i użyj dwóch/trzech palców, aby wywołać naciśniecie prawym i środkowym przyciskiem myszy. Przyciśnij na dłużej, aby przeciągnąć i upuścić.</string>
|
||||
<string name="mousepad_double_tap_settings_title">Ustaw działanie po dwukrotnym stuknięciu palcem</string>
|
||||
<string name="mousepad_triple_tap_settings_title">Ustaw działanie po trzykrotnym stuknięciu palcem</string>
|
||||
@@ -62,6 +62,7 @@
|
||||
<string name="outgoing_file_title">Wysyłanie pliku do %1s</string>
|
||||
<string name="outgoing_file_text">%1s</string>
|
||||
<string name="received_file_title">Odebrano plik od %1s</string>
|
||||
<string name="received_file_fail_title">Nieudane odbieranie pliku z %1s</string>
|
||||
<string name="received_file_text">Znacznik do otwarcia \'%1s\'</string>
|
||||
<string name="sent_file_title">Plik wysłano do %1s</string>
|
||||
<string name="sent_file_text">%1s</string>
|
||||
|
@@ -10,14 +10,14 @@
|
||||
<string name="pref_plugin_clipboard_desc">Compartilha o conteúdo da área de transferência</string>
|
||||
<string name="pref_plugin_mousepad">Introdução de dados remota</string>
|
||||
<string name="pref_plugin_mousepad_desc">Usar seu telefone como mouse ou teclado</string>
|
||||
<string name="pref_plugin_mpris">Controle remoto multimídia</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_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>
|
||||
<string name="pref_plugin_notifications_desc">Acesse suas notificações a partir de outros dispositivos</string>
|
||||
<string name="pref_plugin_sharereceiver">Destinatário do compartilhamento</string>
|
||||
<string name="pref_plugin_sharereceiver_desc">Salvar os arquivos recebidos no armazenamento do celular</string>
|
||||
<string name="pref_plugin_sharereceiver">Compartilhar e receber</string>
|
||||
<string name="pref_plugin_sharereceiver_desc">Compartilhar arquivos e URLs entre os dispositivos</string>
|
||||
<string name="plugin_not_available">Esta funcionalidade não está disponível na sua versão do Android</string>
|
||||
<string name="device_list_empty">Sem dispositivos</string>
|
||||
<string name="ok">OK</string>
|
||||
@@ -25,8 +25,8 @@
|
||||
<string name="open_settings">Abrir configurações</string>
|
||||
<string name="no_permissions">Você precisa conceder permissão para acessar as notificações</string>
|
||||
<string name="send_ping">Enviar ping</string>
|
||||
<string name="open_mpris_controls">Abra o controle remoto</string>
|
||||
<string name="open_mousepad">Abrir o controle do touchpad</string>
|
||||
<string name="open_mpris_controls">Controle multimídia</string>
|
||||
<string name="open_mousepad">Introdução de dados remota</string>
|
||||
<string name="mousepad_info">Mova um dedo pelo tela para mover o ponteiro do mouse. Dê um toque para clicar e use dois/três dedos para os botões da direita e do meio. Use uma pressão longa para arrastar e soltar.</string>
|
||||
<string name="mousepad_double_tap_settings_title">Definir a ação do toque com dois dedos</string>
|
||||
<string name="mousepad_triple_tap_settings_title">Definir a ação do toque com três dedos</string>
|
||||
@@ -62,6 +62,7 @@
|
||||
<string name="outgoing_file_title">Enviando arquivo para %1s</string>
|
||||
<string name="outgoing_file_text">%1s</string>
|
||||
<string name="received_file_title">Arquivo recebido de %1s</string>
|
||||
<string name="received_file_fail_title">Falha ao receber o arquivo de %1s</string>
|
||||
<string name="received_file_text">Toque para abrir o \'%1s\'</string>
|
||||
<string name="sent_file_title">Enviar arquivo para %1s</string>
|
||||
<string name="sent_file_text">%1s</string>
|
||||
|
@@ -10,14 +10,14 @@
|
||||
<string name="pref_plugin_clipboard_desc">Partilhar o conteúdo da área de transferência</string>
|
||||
<string name="pref_plugin_mousepad">Introdução remota de dados</string>
|
||||
<string name="pref_plugin_mousepad_desc">Usar o seu telefone como um rato ou teclado</string>
|
||||
<string name="pref_plugin_mpris">Comando à distância multimédia</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_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>
|
||||
<string name="pref_plugin_notifications_desc">Aceder às suas notificações a partir de outros dispositivos</string>
|
||||
<string name="pref_plugin_sharereceiver">Destinatário da partilha</string>
|
||||
<string name="pref_plugin_sharereceiver_desc">Gravar os ficheiros recebidos no armazenamento do telemóvel</string>
|
||||
<string name="pref_plugin_sharereceiver">Partilhar e receber</string>
|
||||
<string name="pref_plugin_sharereceiver_desc">Partilhar ficheiros e URL\'s entre dispositivos</string>
|
||||
<string name="plugin_not_available">Esta funcionalidade não está disponível na sua versão do Android</string>
|
||||
<string name="device_list_empty">Sem dispositivos</string>
|
||||
<string name="ok">OK</string>
|
||||
@@ -25,8 +25,8 @@
|
||||
<string name="open_settings">Abrir a configuração</string>
|
||||
<string name="no_permissions">Precisa de dar permissões de acesso às notificações</string>
|
||||
<string name="send_ping">Enviar um pedido de contacto</string>
|
||||
<string name="open_mpris_controls">Abrir o comando à distância</string>
|
||||
<string name="open_mousepad">Abrir o controlo do painel do rato</string>
|
||||
<string name="open_mpris_controls">Comando multimédia</string>
|
||||
<string name="open_mousepad">Introdução remota de dados</string>
|
||||
<string name="mousepad_info">Mova um dedo pelo ecrã para mover o cursor do rato. Dê um toque para carregar no botão esquerdo e use dois/três dedos para os botões direito e do meio. Use uma pressão longa para arrastar e largar.</string>
|
||||
<string name="mousepad_double_tap_settings_title">Definir a acção do toque com dois dedos</string>
|
||||
<string name="mousepad_triple_tap_settings_title">Definir a acção do toque com três dedos</string>
|
||||
@@ -62,6 +62,7 @@
|
||||
<string name="outgoing_file_title">A enviar o ficheiro para o %1s</string>
|
||||
<string name="outgoing_file_text">%1s</string>
|
||||
<string name="received_file_title">Ficheiro recebido de %1s</string>
|
||||
<string name="received_file_fail_title">Falhou a recepção do ficheiro de %1s</string>
|
||||
<string name="received_file_text">Toque para abrir o \'%1s\'</string>
|
||||
<string name="sent_file_title">O ficheiro foi enviado para %1s</string>
|
||||
<string name="sent_file_text">%1s</string>
|
||||
|
@@ -8,7 +8,6 @@
|
||||
<string name="pref_plugin_sftp_desc">Vă permite să răsfoiți de la distanță sistemul de fișiere al dispozitivului</string>
|
||||
<string name="pref_plugin_clipboard">Sincronizare clipboard</string>
|
||||
<string name="pref_plugin_clipboard_desc">Partajează conținutul clipboardului</string>
|
||||
<string name="pref_plugin_mpris">Controale multimedia distante</string>
|
||||
<string name="pref_plugin_mpris_desc">Controlați audio/video de pe telefon</string>
|
||||
<string name="pref_plugin_ping">Ping</string>
|
||||
<string name="pref_plugin_ping_desc">Trimite și primește ping-uri</string>
|
||||
@@ -21,7 +20,6 @@
|
||||
<string name="open_settings">Deschide configurările</string>
|
||||
<string name="no_permissions">Trebuie să acordați permisiunea pentru accesarea notificărilor</string>
|
||||
<string name="send_ping">Trimite ping</string>
|
||||
<string name="open_mpris_controls">Deschide controlul de la distanță</string>
|
||||
<string-array name="mousepad_tap_entries">
|
||||
<item>Right click</item>
|
||||
<item>Middle click</item>
|
||||
|
@@ -6,7 +6,6 @@
|
||||
<string name="pref_plugin_battery_desc">Периодически сообщать о состоянии батареи</string>
|
||||
<string name="pref_plugin_clipboard">Синхронизация буфера обмена</string>
|
||||
<string name="pref_plugin_clipboard_desc">Сделать содержимое буфера обмена общим</string>
|
||||
<string name="pref_plugin_mpris">ДУ для мультимедия</string>
|
||||
<string name="pref_plugin_mpris_desc">Управление аудио/видео с устройства</string>
|
||||
<string name="pref_plugin_ping">Пинг</string>
|
||||
<string name="pref_plugin_ping_desc">Посылать и получать пинги</string>
|
||||
@@ -19,7 +18,6 @@
|
||||
<string name="open_settings">Открыть настройки</string>
|
||||
<string name="no_permissions">Вы должны разрешить доступ к уведомлениям</string>
|
||||
<string name="send_ping">Послать пинг</string>
|
||||
<string name="open_mpris_controls">Открыть дистанционное управление</string>
|
||||
<string-array name="mousepad_tap_entries">
|
||||
<item>Right click</item>
|
||||
<item>Middle click</item>
|
||||
|
@@ -10,14 +10,11 @@
|
||||
<string name="pref_plugin_clipboard_desc">Zdieľať obsah schránky</string>
|
||||
<string name="pref_plugin_mousepad">Vzdialený vstup</string>
|
||||
<string name="pref_plugin_mousepad_desc">Použiť váš telefón ako myš a klávesnicu</string>
|
||||
<string name="pref_plugin_mpris">Multimediálne diaľkové ovládače</string>
|
||||
<string name="pref_plugin_mpris_desc">Ovládať audio/video z vášho telefónu</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>
|
||||
<string name="pref_plugin_notifications_desc">Prístup k vašim pripomienkam z iných zariadení</string>
|
||||
<string name="pref_plugin_sharereceiver">Zdieľať prijímač</string>
|
||||
<string name="pref_plugin_sharereceiver_desc">Uložiť prichádzajúce súbory na úložiska telefónu</string>
|
||||
<string name="plugin_not_available">Táto funkcia nie je dostupná vo vašej verzii Androidu</string>
|
||||
<string name="device_list_empty">Žiadne zariadenia</string>
|
||||
<string name="ok">OK</string>
|
||||
@@ -25,8 +22,7 @@
|
||||
<string name="open_settings">Otvoriť nastavenia</string>
|
||||
<string name="no_permissions">Musíte povoliť oprávnenia na prístup k pripomienkam</string>
|
||||
<string name="send_ping">Poslať ping</string>
|
||||
<string name="open_mpris_controls">Otvoriť diaľkové ovládanie</string>
|
||||
<string name="open_mousepad">Otvoriť ovládanie touchpadu</string>
|
||||
<string name="mousepad_info">Posúvajte prst na obrazovke na posun kurzora. Ťuknutie vyvolá klik a použite dva/tri prsty pre pravé a stredné tlačidlo. Použite dlhé stlačenie pre drag and drop.</string>
|
||||
<string name="mousepad_double_tap_settings_title">Nastaviť akciu dvoch prstov</string>
|
||||
<string name="mousepad_triple_tap_settings_title">Nastaviť akciu troch prstov</string>
|
||||
<string-array name="mousepad_tap_entries">
|
||||
@@ -58,10 +54,14 @@
|
||||
<string name="received_url_text">Ťuknite na otvorenie \'%1s\'</string>
|
||||
<string name="incoming_file_title">Prichádzajúci súbor od %s</string>
|
||||
<string name="incoming_file_text">%1s</string>
|
||||
<string name="outgoing_file_title">Posielam súbor pre %1s</string>
|
||||
<string name="outgoing_file_text">%1s</string>
|
||||
<string name="received_file_title">Prijatý súbor od %1s</string>
|
||||
<string name="received_file_fail_title">Zlyhalo prijatie súboru od %1s</string>
|
||||
<string name="received_file_text">Ťuknite na otvorenie \'%1s\'</string>
|
||||
<string name="sent_file_title">Poslať súbor pre %1s</string>
|
||||
<string name="sent_file_text">%1s</string>
|
||||
<string name="sent_file_failed_title">Zlyhalo poslanie súboru %1s</string>
|
||||
<string name="sent_file_failed_text">%1s</string>
|
||||
<string name="tap_to_answer">Tapnite na odpoveď</string>
|
||||
<string name="reconnect">Znovu pripojiť</string>
|
||||
@@ -83,6 +83,8 @@
|
||||
<string name="mpris_next">Nasledovné</string>
|
||||
<string name="mpris_volume">Hlasitosť</string>
|
||||
<string name="mpris_settings">Multimediálne nastavenia</string>
|
||||
<string name="mpris_time_settings_title">Tlačidlá dopredu/pretočiť</string>
|
||||
<string name="mpris_time_settings_summary">Prispôsobiť čas na pretáčanie dopredu alebo dozadu pri stlačení.</string>
|
||||
<string-array name="mpris_time_entries">
|
||||
<item>10 sekúnd</item>
|
||||
<item>20 sekúnd</item>
|
||||
@@ -104,6 +106,8 @@
|
||||
<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>
|
||||
<string name="title_activity_notification_filter">Filter upozornení</string>
|
||||
<string name="filter_apps_info">Upozornenia budú synchronizované pre vybrané aplikácie.</string>
|
||||
<string name="sftp_internal_storage">Interné úložisko</string>
|
||||
<string name="sftp_all_files">Všetky súbory</string>
|
||||
<string name="sftp_sdcard_num">SD karta %d</string>
|
||||
@@ -111,6 +115,7 @@
|
||||
<string name="sftp_readonly">(iba na čítanie)</string>
|
||||
<string name="sftp_camera">Obrázky fotoaparátu</string>
|
||||
<string name="add_host">Pridať hostiteľa/IP</string>
|
||||
<string name="add_host_hint">Názov hostiteľa alebo IP</string>
|
||||
<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>
|
||||
|
@@ -10,14 +10,14 @@
|
||||
<string name="pref_plugin_clipboard_desc">Dela klippbordets innehåll</string>
|
||||
<string name="pref_plugin_mousepad">Fjärrinmatning</string>
|
||||
<string name="pref_plugin_mousepad_desc">Använd telefonen som mus och tangentbord</string>
|
||||
<string name="pref_plugin_mpris">Fjärrkontroll av multimedia</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_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>
|
||||
<string name="pref_plugin_notifications_desc">Kom åt underrättelser från andra apparater</string>
|
||||
<string name="pref_plugin_sharereceiver">Dela mottagare</string>
|
||||
<string name="pref_plugin_sharereceiver_desc">Spara inkommande filer i telefonens minne</string>
|
||||
<string name="pref_plugin_sharereceiver">Dela och ta emot</string>
|
||||
<string name="pref_plugin_sharereceiver_desc">Dela filer och webbadresser mellan enheter</string>
|
||||
<string name="plugin_not_available">Funktionen är inte tillgänglig i Android-versionen</string>
|
||||
<string name="device_list_empty">Inga apparater</string>
|
||||
<string name="ok">Ok</string>
|
||||
@@ -25,8 +25,8 @@
|
||||
<string name="open_settings">Öppna inställningarna</string>
|
||||
<string name="no_permissions">Du måste ge rättighet att komma åt underrättelser</string>
|
||||
<string name="send_ping">Skicka ping</string>
|
||||
<string name="open_mpris_controls">Öppna fjärrkontroll</string>
|
||||
<string name="open_mousepad">Öppna kontroll med tryckplatta</string>
|
||||
<string name="open_mpris_controls">Kontroll av multimedia</string>
|
||||
<string name="open_mousepad">Fjärrinmatning</string>
|
||||
<string name="mousepad_info">Flytta fingret på skärmen för att röra muspekaren. Rör för att klicka, och använd två eller tre fingrar för höger- och mittenknapparna. Använd en längre beröring för drag och släpp.</string>
|
||||
<string name="mousepad_double_tap_settings_title">Ställ in åtgärd vid två fingerberöringar</string>
|
||||
<string name="mousepad_triple_tap_settings_title">Ställ in åtgärd vid tre fingerberöringar</string>
|
||||
@@ -62,6 +62,7 @@
|
||||
<string name="outgoing_file_title">Skickar fil till %1s</string>
|
||||
<string name="outgoing_file_text">%1s</string>
|
||||
<string name="received_file_title">Tog emot fil från %1s</string>
|
||||
<string name="received_file_fail_title">Misslyckades ta emot fil från %1s</string>
|
||||
<string name="received_file_text">Rör för att öppna \'%1s\'</string>
|
||||
<string name="sent_file_title">Skickade fil till %1s</string>
|
||||
<string name="sent_file_text">%1s</string>
|
||||
|
@@ -10,14 +10,14 @@
|
||||
<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">Керування відтворенням</string>
|
||||
<string name="pref_plugin_mpris_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">Зберігає вхідні файли на носій даних телефону</string>
|
||||
<string name="pref_plugin_sharereceiver">Надання і отримання</string>
|
||||
<string name="pref_plugin_sharereceiver_desc">Спільне використання файлів і адрес між пристроями</string>
|
||||
<string name="plugin_not_available">Ця можливість є недоступною для вашої версії для Android</string>
|
||||
<string name="device_list_empty">Немає пристроїв</string>
|
||||
<string name="ok">Гаразд</string>
|
||||
@@ -25,8 +25,8 @@
|
||||
<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="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>
|
||||
@@ -62,6 +62,7 @@
|
||||
<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>
|
||||
|
@@ -1,11 +0,0 @@
|
||||
<resources>
|
||||
|
||||
<!--
|
||||
Base application theme for API 11+. This theme completely replaces
|
||||
AppBaseTheme from res/values/styles.xml on API 11+ devices.
|
||||
-->
|
||||
<style name="AppBaseTheme" parent="android:Theme.Holo">
|
||||
<!-- API 11 theme customizations can go here. -->
|
||||
</style>
|
||||
|
||||
</resources>
|
122
res/values-zh-rCN/strings.xml
Normal file
@@ -0,0 +1,122 @@
|
||||
<?xml version='1.0' encoding='utf-8'?>
|
||||
<resources>
|
||||
<string name="pref_plugin_telephony">电话通知</string>
|
||||
<string name="pref_plugin_telephony_desc">为短信和来电发送通知</string>
|
||||
<string name="pref_plugin_battery">电池报告</string>
|
||||
<string name="pref_plugin_battery_desc">定期报告电池状态</string>
|
||||
<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_mousepad">远程输入</string>
|
||||
<string name="pref_plugin_mousepad_desc">将手机用作鼠标和键盘</string>
|
||||
<string name="pref_plugin_mpris_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="plugin_not_available">该特性不适用于您的Android版本</string>
|
||||
<string name="device_list_empty">无设备</string>
|
||||
<string name="ok">确认</string>
|
||||
<string name="cancel">取消</string>
|
||||
<string name="open_settings">开启设置</string>
|
||||
<string name="no_permissions">你需要授予权限以便访问通知</string>
|
||||
<string name="send_ping">发送ping</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>中键点击</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_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_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="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="remote_control">远程控制</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秒</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="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="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">%2$s上的%1$s</string>
|
||||
</resources>
|
@@ -11,14 +11,14 @@
|
||||
<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 remote controls</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_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 receiver</string>
|
||||
<string name="pref_plugin_sharereceiver_desc">Save incoming files to the phone storage</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>
|
||||
@@ -26,8 +26,8 @@
|
||||
<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">Open remote control</string>
|
||||
<string name="open_mousepad">Open touchpad control</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>
|
||||
@@ -70,6 +70,7 @@
|
||||
<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>
|
||||
|
@@ -1,20 +1,7 @@
|
||||
<resources>
|
||||
|
||||
<!--
|
||||
Base application theme, dependent on API level. This theme is replaced
|
||||
by AppBaseTheme from res/values-vXX/styles.xml on newer devices.
|
||||
-->
|
||||
<style name="AppBaseTheme" parent="android:Theme">
|
||||
<!--
|
||||
Theme customizations available in newer API levels can go in
|
||||
res/values-vXX/styles.xml, while customizations related to
|
||||
backward-compatibility can go here.
|
||||
-->
|
||||
</style>
|
||||
<style name="KdeConnectTheme" parent="Theme.AppCompat">
|
||||
|
||||
<!-- Application theme. -->
|
||||
<style name="AppTheme" parent="AppBaseTheme">
|
||||
<!-- All customizations that are NOT specific to a particular API-level can go here. -->
|
||||
</style>
|
||||
|
||||
</resources>
|
||||
|
@@ -7,7 +7,7 @@
|
||||
<EditTextPreference
|
||||
android:key="device_name_preference"
|
||||
android:title="@string/device_name"
|
||||
android:summary="@string/device_name_preference_summary"
|
||||
android:summary=""
|
||||
android:dialogTitle="@string/device_name"
|
||||
android:singleLine="true" />
|
||||
|
||||
|
@@ -46,13 +46,13 @@ public abstract class BaseLinkProvider {
|
||||
|
||||
//These two should be called when the provider links to a new computer
|
||||
protected void connectionAccepted(NetworkPackage identityPackage, BaseLink link) {
|
||||
Log.i("LinkProvider", "connectionAccepted");
|
||||
//Log.i("KDE/LinkProvider", "connectionAccepted");
|
||||
for(ConnectionReceiver cr : connectionReceivers) {
|
||||
cr.onConnectionReceived(identityPackage, link);
|
||||
}
|
||||
}
|
||||
protected void connectionLost(BaseLink link) {
|
||||
Log.i("LinkProvider", "connectionLost");
|
||||
//Log.i("KDE/LinkProvider", "connectionLost");
|
||||
for(ConnectionReceiver cr : connectionReceivers) {
|
||||
cr.onConnectionLost(link);
|
||||
}
|
||||
|
@@ -47,8 +47,10 @@ public class LanLink extends BaseLink {
|
||||
private IoSession session = null;
|
||||
|
||||
public void disconnect() {
|
||||
if (session == null) return;
|
||||
//Log.i("LanLink", "Disconnect: "+session.getRemoteAddress().toString());
|
||||
if (session == null) {
|
||||
Log.e("KDE/LanLink", "Not yet connected");
|
||||
return;
|
||||
}
|
||||
session.close(true);
|
||||
}
|
||||
|
||||
@@ -60,7 +62,7 @@ public class LanLink extends BaseLink {
|
||||
//Blocking, do not call from main thread
|
||||
private void sendPackageInternal(NetworkPackage np, final Device.SendPackageStatusCallback callback, PublicKey key) {
|
||||
if (session == null) {
|
||||
Log.e("sendPackage", "Not yet connected");
|
||||
Log.e("KDE/sendPackage", "Not yet connected");
|
||||
callback.sendFailure(new NotYetConnectedException());
|
||||
return;
|
||||
}
|
||||
@@ -87,7 +89,7 @@ public class LanLink extends BaseLink {
|
||||
WriteFuture future = session.write(np.serialize());
|
||||
future.awaitUninterruptibly();
|
||||
if (!future.isWritten()) {
|
||||
Log.e("sendPackage", "!future.isWritten()");
|
||||
Log.e("KDE/sendPackage", "!future.isWritten()");
|
||||
callback.sendFailure(future.getException());
|
||||
return;
|
||||
}
|
||||
@@ -97,19 +99,10 @@ public class LanLink extends BaseLink {
|
||||
OutputStream socket = null;
|
||||
try {
|
||||
//Wait a maximum of 10 seconds for the other end to establish a connection with our socket, close it afterwards
|
||||
Timer timeout = new Timer();
|
||||
timeout.schedule(new TimerTask() {
|
||||
@Override
|
||||
public void run() {
|
||||
Log.e("sendPackage","Timeout");
|
||||
try { server.close(); } catch (Exception e) { }
|
||||
callback.sendFailure(new TimeoutException("Timed out waiting for other end to establish a connection to receive the payload."));
|
||||
}
|
||||
},10*1000);
|
||||
server.setSoTimeout(10*1000);
|
||||
socket = server.accept().getOutputStream();
|
||||
timeout.cancel();
|
||||
|
||||
Log.i("LanLink", "Beginning to send payload");
|
||||
Log.i("KDE/LanLink", "Beginning to send payload");
|
||||
|
||||
byte[] buffer = new byte[4096];
|
||||
int bytesRead;
|
||||
@@ -123,9 +116,11 @@ public class LanLink extends BaseLink {
|
||||
callback.sendProgress((int)(progress / np.getPayloadSize()));
|
||||
}
|
||||
}
|
||||
Log.i("LanLink", "Finished sending payload");
|
||||
socket.flush();
|
||||
stream.close();
|
||||
Log.i("KDE/LanLink", "Finished sending payload ("+progress+" bytes written)");
|
||||
} catch (Exception e) {
|
||||
Log.e("sendPackage", "Exception: "+e);
|
||||
Log.e("KDE/sendPackage", "Exception: "+e);
|
||||
callback.sendFailure(e);
|
||||
return;
|
||||
} finally {
|
||||
@@ -167,22 +162,24 @@ public class LanLink extends BaseLink {
|
||||
np = np.decrypt(privateKey);
|
||||
} catch(Exception e) {
|
||||
e.printStackTrace();
|
||||
Log.e("onPackageReceived","Exception reading the key needed to decrypt the package");
|
||||
Log.e("KDE/onPackageReceived","Exception reading the key needed to decrypt the package");
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
if (np.hasPayloadTransferInfo()) {
|
||||
|
||||
Socket socket = null;
|
||||
try {
|
||||
Socket socket = new Socket();
|
||||
socket = new Socket();
|
||||
int tcpPort = np.getPayloadTransferInfo().getInt("port");
|
||||
InetSocketAddress address = (InetSocketAddress)session.getRemoteAddress();
|
||||
socket.connect(new InetSocketAddress(address.getAddress(), tcpPort));
|
||||
np.setPayload(socket.getInputStream(), np.getPayloadSize());
|
||||
} catch (Exception e) {
|
||||
try { socket.close(); } catch(Exception ignored) { }
|
||||
e.printStackTrace();
|
||||
Log.e("LanLink", "Exception connecting to payload remote socket");
|
||||
Log.e("KDE/LanLink", "Exception connecting to payload remote socket");
|
||||
}
|
||||
|
||||
}
|
||||
@@ -200,12 +197,12 @@ public class LanLink extends BaseLink {
|
||||
candidateServer = new ServerSocket();
|
||||
candidateServer.bind(new InetSocketAddress(tcpPort));
|
||||
success = true;
|
||||
Log.i("LanLink", "Using port "+tcpPort);
|
||||
Log.i("KDE/LanLink", "Using port "+tcpPort);
|
||||
} catch(IOException e) {
|
||||
//Log.e("LanLink", "Exception openning serversocket: "+e);
|
||||
tcpPort++;
|
||||
if (tcpPort >= 1764) {
|
||||
Log.e("LanLink", "No more ports available");
|
||||
Log.e("KDE/LanLink", "No more ports available");
|
||||
throw e;
|
||||
}
|
||||
}
|
||||
|
@@ -21,7 +21,6 @@
|
||||
package org.kde.kdeconnect.Backends.LanBackend;
|
||||
|
||||
import android.content.Context;
|
||||
import android.os.AsyncTask;
|
||||
import android.preference.PreferenceManager;
|
||||
import android.support.v4.util.LongSparseArray;
|
||||
import android.util.Log;
|
||||
@@ -47,9 +46,11 @@ import java.net.DatagramPacket;
|
||||
import java.net.DatagramSocket;
|
||||
import java.net.InetAddress;
|
||||
import java.net.InetSocketAddress;
|
||||
import java.net.SocketAddress;
|
||||
import java.nio.charset.Charset;
|
||||
import java.util.ArrayList;
|
||||
import java.util.HashMap;
|
||||
import java.util.Set;
|
||||
|
||||
public class LanLinkProvider extends BaseLinkProvider {
|
||||
|
||||
@@ -59,6 +60,7 @@ public class LanLinkProvider extends BaseLinkProvider {
|
||||
private final Context context;
|
||||
private final HashMap<String, LanLink> visibleComputers = new HashMap<String, LanLink>();
|
||||
private final LongSparseArray<LanLink> nioSessions = new LongSparseArray<LanLink>();
|
||||
private final LongSparseArray<NioSocketConnector> nioConnectors = new LongSparseArray<NioSocketConnector>();
|
||||
|
||||
private NioSocketAcceptor tcpAcceptor = null;
|
||||
private NioDatagramAcceptor udpAcceptor = null;
|
||||
@@ -66,11 +68,24 @@ public class LanLinkProvider extends BaseLinkProvider {
|
||||
private final IoHandler tcpHandler = new IoHandlerAdapter() {
|
||||
@Override
|
||||
public void sessionClosed(IoSession session) throws Exception {
|
||||
|
||||
final LanLink brokenLink = nioSessions.get(session.getId());
|
||||
try {
|
||||
long id = session.getId();
|
||||
final LanLink brokenLink = nioSessions.get(id);
|
||||
NioSocketConnector connector = nioConnectors.get(id);
|
||||
if (connector != null) {
|
||||
connector.dispose();
|
||||
nioConnectors.remove(id);
|
||||
}
|
||||
if (brokenLink != null) {
|
||||
nioSessions.remove(session.getId());
|
||||
nioSessions.remove(id);
|
||||
//Log.i("KDE/LanLinkProvider", "nioSessions.size(): " + nioSessions.size() + " (-)");
|
||||
try {
|
||||
brokenLink.disconnect();
|
||||
} catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
Log.e("KDE/LanLinkProvider", "Exception. Already disconnected?");
|
||||
}
|
||||
//Log.i("KDE/LanLinkProvider", "Disconnected!");
|
||||
String deviceId = brokenLink.getDeviceId();
|
||||
if (visibleComputers.get(deviceId) == brokenLink) {
|
||||
visibleComputers.remove(deviceId);
|
||||
@@ -81,14 +96,18 @@ public class LanLinkProvider extends BaseLinkProvider {
|
||||
//Wait a bit before emiting connectionLost, in case the same device re-appears
|
||||
try {
|
||||
Thread.sleep(200);
|
||||
} catch (InterruptedException e) { }
|
||||
} catch (InterruptedException e) {
|
||||
}
|
||||
connectionLost(brokenLink);
|
||||
|
||||
}
|
||||
}).start();
|
||||
|
||||
}
|
||||
|
||||
} catch (Exception e) { //If we don't catch it here, Mina will swallow it :/
|
||||
e.printStackTrace();
|
||||
Log.e("KDE/LanLinkProvider", "sessionClosed exception");
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -100,7 +119,7 @@ public class LanLinkProvider extends BaseLinkProvider {
|
||||
|
||||
String theMessage = (String) message;
|
||||
if (theMessage.isEmpty()) {
|
||||
Log.e("LanLinkProvider","Empty package received");
|
||||
Log.e("KDE/LanLinkProvider","Empty package received");
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -113,15 +132,16 @@ public class LanLinkProvider extends BaseLinkProvider {
|
||||
return;
|
||||
}
|
||||
|
||||
//Log.e("LanLinkProvider", "Identity package received from "+np.getString("deviceName"));
|
||||
//Log.i("KDE/LanLinkProvider", "Identity package received from " + np.getString("deviceName"));
|
||||
|
||||
LanLink link = new LanLink(session, np.getString("deviceId"), LanLinkProvider.this);
|
||||
nioSessions.put(session.getId(),link);
|
||||
//Log.e("KDE/LanLinkProvider","nioSessions.size(): " + nioSessions.size());
|
||||
addLink(np, link);
|
||||
} else {
|
||||
LanLink prevLink = nioSessions.get(session.getId());
|
||||
if (prevLink == null) {
|
||||
Log.e("LanLinkProvider","2 Expecting an identity package");
|
||||
Log.e("KDE/LanLinkProvider","Expecting an identity package (A)");
|
||||
} else {
|
||||
prevLink.injectNetworkPackage(np);
|
||||
}
|
||||
@@ -143,7 +163,7 @@ public class LanLinkProvider extends BaseLinkProvider {
|
||||
final NetworkPackage identityPackage = NetworkPackage.unserialize(theMessage);
|
||||
|
||||
if (!identityPackage.getType().equals(NetworkPackage.PACKAGE_TYPE_IDENTITY)) {
|
||||
Log.e("LanLinkProvider", "1 Expecting an identity package");
|
||||
Log.e("KDE/LanLinkProvider", "Expecting an identity package (B)");
|
||||
return;
|
||||
} else {
|
||||
String myId = NetworkPackage.createIdentityPackage(context).getString("deviceId");
|
||||
@@ -152,7 +172,7 @@ public class LanLinkProvider extends BaseLinkProvider {
|
||||
}
|
||||
}
|
||||
|
||||
Log.i("LanLinkProvider", "Identity package received, creating link");
|
||||
//Log.i("KDE/LanLinkProvider", "Identity package received, creating link");
|
||||
|
||||
final InetSocketAddress address = (InetSocketAddress) udpSession.getRemoteAddress();
|
||||
|
||||
@@ -165,16 +185,17 @@ public class LanLinkProvider extends BaseLinkProvider {
|
||||
connector.getFilterChain().addLast("codec", new ProtocolCodecFilter(textLineFactory));
|
||||
|
||||
int tcpPort = identityPackage.getInt("tcpPort", port);
|
||||
ConnectFuture future = connector.connect(new InetSocketAddress(address.getAddress(), tcpPort));
|
||||
final ConnectFuture future = connector.connect(new InetSocketAddress(address.getAddress(), tcpPort));
|
||||
future.addListener(new IoFutureListener<IoFuture>() {
|
||||
|
||||
@Override
|
||||
public void operationComplete(IoFuture ioFuture) {
|
||||
try {
|
||||
future.removeListener(this);
|
||||
final IoSession session = ioFuture.getSession();
|
||||
Log.i("KDE/LanLinkProvider", "Connection successful: " + session.isConnected());
|
||||
|
||||
final LanLink link = new LanLink(session, identityPackage.getString("deviceId"), LanLinkProvider.this);
|
||||
|
||||
Log.i("LanLinkProvider", "Connection successful: " + session.isConnected());
|
||||
|
||||
new Thread(new Runnable() {
|
||||
@Override
|
||||
public void run() {
|
||||
@@ -183,23 +204,28 @@ public class LanLinkProvider extends BaseLinkProvider {
|
||||
@Override
|
||||
protected void onSuccess() {
|
||||
nioSessions.put(session.getId(), link);
|
||||
nioConnectors.put(session.getId(), connector);
|
||||
//Log.e("KDE/LanLinkProvider","nioSessions.size(): " + nioSessions.size());
|
||||
addLink(identityPackage, link);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void onFailure(Throwable e) {
|
||||
|
||||
Log.e("KDE/LanLinkProvider", "Connection failed: could not send identity package back");
|
||||
}
|
||||
});
|
||||
|
||||
}
|
||||
}).start();
|
||||
|
||||
} catch (Exception e) { //If we don't catch it here, Mina will swallow it :/
|
||||
e.printStackTrace();
|
||||
Log.e("KDE/LanLinkProvider", "sessionClosed exception");
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
} catch (Exception e) {
|
||||
Log.e("LanLinkProvider","Exception receiving udp package!!");
|
||||
Log.e("KDE/LanLinkProvider","Exception receiving udp package!!");
|
||||
e.printStackTrace();
|
||||
}
|
||||
|
||||
@@ -208,16 +234,16 @@ public class LanLinkProvider extends BaseLinkProvider {
|
||||
|
||||
private void addLink(NetworkPackage identityPackage, LanLink link) {
|
||||
String deviceId = identityPackage.getString("deviceId");
|
||||
Log.i("LanLinkProvider","addLink to "+deviceId);
|
||||
Log.i("KDE/LanLinkProvider","addLink to "+deviceId);
|
||||
LanLink oldLink = visibleComputers.get(deviceId);
|
||||
if (oldLink == link) {
|
||||
Log.e("KDEConnect", "LanLinkProvider: oldLink == link. This should not happen!");
|
||||
Log.e("KDE/LanLinkProvider", "oldLink == link. This should not happen!");
|
||||
return;
|
||||
}
|
||||
visibleComputers.put(deviceId, link);
|
||||
connectionAccepted(identityPackage, link);
|
||||
if (oldLink != null) {
|
||||
Log.i("LanLinkProvider","Removing old connection to same device");
|
||||
Log.i("KDE/LanLinkProvider","Removing old connection to same device");
|
||||
oldLink.disconnect();
|
||||
connectionLost(oldLink);
|
||||
}
|
||||
@@ -232,13 +258,11 @@ public class LanLinkProvider extends BaseLinkProvider {
|
||||
tcpAcceptor.setHandler(tcpHandler);
|
||||
tcpAcceptor.getSessionConfig().setKeepAlive(true);
|
||||
tcpAcceptor.getSessionConfig().setReuseAddress(true);
|
||||
tcpAcceptor.setCloseOnDeactivation(false);
|
||||
//TextLineCodecFactory will buffer incoming data and emit a message very time it finds a \n
|
||||
TextLineCodecFactory textLineFactory = new TextLineCodecFactory(Charset.defaultCharset(), LineDelimiter.UNIX, LineDelimiter.UNIX);
|
||||
textLineFactory.setDecoderMaxLineLength(512*1024); //Allow to receive up to 512kb of data
|
||||
tcpAcceptor.getFilterChain().addLast("codec", new ProtocolCodecFilter(textLineFactory));
|
||||
|
||||
|
||||
udpAcceptor = new NioDatagramAcceptor();
|
||||
udpAcceptor.getSessionConfig().setReuseAddress(true); //Share port if existing
|
||||
//TextLineCodecFactory will buffer incoming data and emit a message very time it finds a \n
|
||||
@@ -256,12 +280,19 @@ public class LanLinkProvider extends BaseLinkProvider {
|
||||
|
||||
//This handles the case when I'm the existing device in the network and receive a "hello" UDP package
|
||||
|
||||
Set<SocketAddress> addresses = udpAcceptor.getLocalAddresses();
|
||||
for (SocketAddress address : addresses) {
|
||||
Log.i("KDE/LanLinkProvider", "UDP unbind old address");
|
||||
udpAcceptor.unbind(address);
|
||||
}
|
||||
|
||||
//Log.i("KDE/LanLinkProvider", "UDP Bind.");
|
||||
udpAcceptor.setHandler(udpHandler);
|
||||
|
||||
try {
|
||||
udpAcceptor.bind(new InetSocketAddress(port));
|
||||
} catch(Exception e) {
|
||||
Log.e("LanLinkProvider", "Error: Could not bind udp socket");
|
||||
Log.e("KDE/LanLinkProvider", "Error: Could not bind udp socket");
|
||||
e.printStackTrace();
|
||||
}
|
||||
|
||||
@@ -276,50 +307,73 @@ public class LanLinkProvider extends BaseLinkProvider {
|
||||
}
|
||||
}
|
||||
|
||||
Log.i("LanLinkProvider","Using tcpPort "+tcpPort);
|
||||
Log.i("KDE/LanLinkProvider","Using tcpPort "+tcpPort);
|
||||
|
||||
//I'm on a new network, let's be polite and introduce myself
|
||||
final int finalTcpPort = tcpPort;
|
||||
new AsyncTask<Void,Void,Void>() {
|
||||
new Thread(new Runnable() {
|
||||
@Override
|
||||
protected Void doInBackground(Void... voids) {
|
||||
public void run() {
|
||||
|
||||
String deviceListPrefs = PreferenceManager.getDefaultSharedPreferences(context).getString(
|
||||
KEY_CUSTOM_DEVLIST_PREFERENCE, "");
|
||||
ArrayList<String> iplist = new ArrayList<String>();
|
||||
if (!deviceListPrefs.isEmpty()) {
|
||||
iplist = CustomDevicesActivity.deserializeIpList(deviceListPrefs);
|
||||
}
|
||||
iplist.add("255.255.255.255");
|
||||
iplist.add("255.255.255.255"); //Default: broadcast.
|
||||
|
||||
NetworkPackage identity = NetworkPackage.createIdentityPackage(context);
|
||||
identity.set("tcpPort", finalTcpPort);
|
||||
DatagramSocket socket = null;
|
||||
byte[] bytes = null;
|
||||
try {
|
||||
socket = new DatagramSocket();
|
||||
socket.setReuseAddress(true);
|
||||
socket.setBroadcast(true);
|
||||
bytes = identity.serialize().getBytes("UTF-8");
|
||||
} catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
Log.e("KDE/LanLinkProvider","Failed to create DatagramSocket");
|
||||
}
|
||||
|
||||
if (bytes != null) {
|
||||
//Log.e("KDE/LanLinkProvider","Sending packet to "+iplist.size()+" ips");
|
||||
for (String ipstr : iplist) {
|
||||
try {
|
||||
InetAddress client = InetAddress.getByName(ipstr);
|
||||
NetworkPackage identity = NetworkPackage.createIdentityPackage(context);
|
||||
identity.set("tcpPort", finalTcpPort);
|
||||
byte[] b = identity.serialize().getBytes("UTF-8");
|
||||
DatagramPacket packet = new DatagramPacket(b, b.length, client, port);
|
||||
DatagramSocket socket = new DatagramSocket();
|
||||
socket.setReuseAddress(true);
|
||||
socket.setBroadcast(true);
|
||||
DatagramPacket packet = new DatagramPacket(bytes, bytes.length, client, port);
|
||||
socket.send(packet);
|
||||
//Log.i("LanLinkProvider","Udp identity package sent to address "+packet.getAddress());
|
||||
//Log.i("KDE/LanLinkProvider","Udp identity package sent to address "+packet.getAddress());
|
||||
} catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
Log.e("LanLinkProvider","Sending udp identity package failed. Invalid address? ("+ipstr+")");
|
||||
Log.e("KDE/LanLinkProvider", "Sending udp identity package failed. Invalid address? (" + ipstr + ")");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return null;
|
||||
socket.close();
|
||||
|
||||
}
|
||||
|
||||
}.execute();
|
||||
|
||||
}).start();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onNetworkChange() {
|
||||
//Log.e("KDE/LanLinkProvider","onNetworkChange");
|
||||
|
||||
//FilesHelper.LogOpenFileCount();
|
||||
|
||||
//Keep existing connections open while unbinding the socket
|
||||
tcpAcceptor.setCloseOnDeactivation(false);
|
||||
onStop();
|
||||
tcpAcceptor.setCloseOnDeactivation(true);
|
||||
|
||||
//FilesHelper.LogOpenFileCount();
|
||||
|
||||
onStart();
|
||||
|
||||
//FilesHelper.LogOpenFileCount();
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -327,14 +381,12 @@ public class LanLinkProvider extends BaseLinkProvider {
|
||||
udpAcceptor.unbind();
|
||||
tcpAcceptor.unbind();
|
||||
}
|
||||
/*
|
||||
@Override
|
||||
public int getPriority() {
|
||||
return 1000;
|
||||
}
|
||||
*/
|
||||
|
||||
@Override
|
||||
public String getName() {
|
||||
return "LanLinkProvider";
|
||||
}
|
||||
|
||||
|
||||
|
||||
}
|
||||
|
@@ -105,17 +105,17 @@ public class BackgroundService extends Service {
|
||||
@Override
|
||||
public void onConnectionReceived(final NetworkPackage identityPackage, final BaseLink link) {
|
||||
|
||||
Log.i("BackgroundService", "Connection accepted!");
|
||||
Log.i("KDE/BackgroundService", "Connection accepted!");
|
||||
|
||||
String deviceId = identityPackage.getString("deviceId");
|
||||
|
||||
Device device = devices.get(deviceId);
|
||||
|
||||
if (device != null) {
|
||||
Log.i("BackgroundService", "addLink, known device: " + deviceId);
|
||||
Log.i("KDE/BackgroundService", "addLink, known device: " + deviceId);
|
||||
device.addLink(identityPackage, link);
|
||||
} else {
|
||||
Log.i("BackgroundService", "addLink,unknown device: " + deviceId);
|
||||
Log.i("KDE/BackgroundService", "addLink,unknown device: " + deviceId);
|
||||
device = new Device(BackgroundService.this, identityPackage, link);
|
||||
devices.put(deviceId, device);
|
||||
device.addPairingCallback(devicePairingCallback);
|
||||
@@ -127,7 +127,7 @@ public class BackgroundService extends Service {
|
||||
@Override
|
||||
public void onConnectionLost(BaseLink link) {
|
||||
Device d = devices.get(link.getDeviceId());
|
||||
Log.i("onConnectionLost", "removeLink, deviceId: " + link.getDeviceId());
|
||||
Log.i("KDE/onConnectionLost", "removeLink, deviceId: " + link.getDeviceId());
|
||||
if (d != null) {
|
||||
d.removeLink(link);
|
||||
if (!d.isReachable() && !d.isPaired()) {
|
||||
@@ -136,7 +136,7 @@ public class BackgroundService extends Service {
|
||||
d.removePairingCallback(devicePairingCallback);
|
||||
}
|
||||
} else {
|
||||
Log.e("onConnectionLost","Removing connection to unknown device, this should not happen");
|
||||
Log.e("KDE/onConnectionLost","Removing connection to unknown device, this should not happen");
|
||||
}
|
||||
if (deviceListChangedCallback != null) deviceListChangedCallback.onDeviceListChanged();
|
||||
}
|
||||
@@ -147,34 +147,35 @@ public class BackgroundService extends Service {
|
||||
}
|
||||
|
||||
public void startDiscovery() {
|
||||
Log.i("BackgroundService","StartDiscovery");
|
||||
Log.i("KDE/BackgroundService","StartDiscovery");
|
||||
for (BaseLinkProvider a : linkProviders) {
|
||||
a.onStart();
|
||||
}
|
||||
}
|
||||
|
||||
public void stopDiscovery() {
|
||||
Log.i("BackgroundService","StopDiscovery");
|
||||
Log.i("KDE/BackgroundService","StopDiscovery");
|
||||
for (BaseLinkProvider a : linkProviders) {
|
||||
a.onStop();
|
||||
}
|
||||
}
|
||||
|
||||
public void onNetworkChange() {
|
||||
Log.i("BackgroundService","OnNetworkChange");
|
||||
Log.i("KDE/BackgroundService","OnNetworkChange");
|
||||
for (BaseLinkProvider a : linkProviders) {
|
||||
a.onNetworkChange();
|
||||
}
|
||||
}
|
||||
|
||||
public void addConnectionListener(BaseLinkProvider.ConnectionReceiver cr) {
|
||||
Log.i("BackgroundService","Registering connection listener");
|
||||
Log.i("KDE/BackgroundService","Registering connection listener");
|
||||
for (BaseLinkProvider a : linkProviders) {
|
||||
a.addConnectionReceiver(cr);
|
||||
}
|
||||
}
|
||||
|
||||
public void removeConnectionListener(BaseLinkProvider.ConnectionReceiver cr) {
|
||||
Log.i("KDE/BackgroundService","Removing connection listener");
|
||||
for (BaseLinkProvider a : linkProviders) {
|
||||
a.removeConnectionReceiver(cr);
|
||||
}
|
||||
@@ -198,7 +199,7 @@ public class BackgroundService extends Service {
|
||||
IntentFilter filter = new IntentFilter(Intent.ACTION_SCREEN_ON);
|
||||
registerReceiver(new KdeConnectBroadcastReceiver(), filter);
|
||||
|
||||
Log.i("BackgroundService","Service not started yet, initializing...");
|
||||
Log.i("KDE/BackgroundService","Service not started yet, initializing...");
|
||||
|
||||
initializeRsaKeys();
|
||||
MainSettingsActivity.initializeDeviceName(this);
|
||||
@@ -223,7 +224,7 @@ public class BackgroundService extends Service {
|
||||
keyPair = keyGen.genKeyPair();
|
||||
} catch(Exception e) {
|
||||
e.printStackTrace();
|
||||
Log.e("initializeRsaKeys","Exception");
|
||||
Log.e("KDE/initializeRsaKeys","Exception");
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -268,7 +269,7 @@ public class BackgroundService extends Service {
|
||||
|
||||
@Override
|
||||
public void onDestroy() {
|
||||
Log.i("BackgroundService", "Destroying");
|
||||
Log.i("KDE/BackgroundService", "Destroying");
|
||||
stopDiscovery();
|
||||
super.onDestroy();
|
||||
}
|
||||
@@ -305,7 +306,10 @@ public class BackgroundService extends Service {
|
||||
RunCommand(c, null);
|
||||
}
|
||||
|
||||
public static void RunCommand(Context c, final InstanceCallback callback) {
|
||||
public static void RunCommand(final Context c, final InstanceCallback callback) {
|
||||
new Thread(new Runnable() {
|
||||
@Override
|
||||
public void run() {
|
||||
if (callback != null) {
|
||||
mutex.lock();
|
||||
callbacks.add(callback);
|
||||
@@ -314,5 +318,7 @@ public class BackgroundService extends Service {
|
||||
Intent serviceIntent = new Intent(c, BackgroundService.class);
|
||||
c.startService(serviceIntent);
|
||||
}
|
||||
}).start();
|
||||
}
|
||||
|
||||
}
|
||||
|
@@ -27,6 +27,8 @@ import android.content.Context;
|
||||
import android.content.Intent;
|
||||
import android.content.SharedPreferences;
|
||||
import android.content.res.Resources;
|
||||
import android.graphics.drawable.Drawable;
|
||||
import android.os.Build;
|
||||
import android.os.Handler;
|
||||
import android.os.Looper;
|
||||
import android.preference.PreferenceManager;
|
||||
@@ -61,13 +63,32 @@ public class Device implements BaseLink.PackageReceiver {
|
||||
private int notificationId;
|
||||
private int protocolVersion;
|
||||
|
||||
private enum PairStatus {
|
||||
public enum PairStatus {
|
||||
NotPaired,
|
||||
Requested,
|
||||
RequestedByPeer,
|
||||
Paired
|
||||
}
|
||||
|
||||
public enum DeviceType {
|
||||
Phone,
|
||||
Tablet,
|
||||
Computer;
|
||||
|
||||
public static DeviceType FromString(String s) {
|
||||
if ("tablet".equals(s)) return Tablet;
|
||||
if ("computer".equals(s)) return Computer;
|
||||
return Phone; //Default
|
||||
}
|
||||
public String toString() {
|
||||
switch (this) {
|
||||
case Tablet: return "tablet";
|
||||
case Computer: return "computer";
|
||||
default: return "phone";
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public interface PairingCallback {
|
||||
abstract void incomingRequest();
|
||||
abstract void pairingSuccessful();
|
||||
@@ -75,6 +96,7 @@ public class Device implements BaseLink.PackageReceiver {
|
||||
abstract void unpaired();
|
||||
}
|
||||
|
||||
private DeviceType deviceType;
|
||||
private PairStatus pairStatus;
|
||||
private ArrayList<PairingCallback> pairingCallback = new ArrayList<PairingCallback>();
|
||||
private Timer pairingTimer;
|
||||
@@ -96,13 +118,15 @@ public class Device implements BaseLink.PackageReceiver {
|
||||
this.name = settings.getString("deviceName", context.getString(R.string.unknown_device));
|
||||
this.pairStatus = PairStatus.Paired;
|
||||
this.protocolVersion = NetworkPackage.ProtocolVersion; //We don't know it yet
|
||||
this.deviceType = DeviceType.FromString(settings.getString("deviceType", "computer"));
|
||||
|
||||
try {
|
||||
byte[] publicKeyBytes = Base64.decode(settings.getString("publicKey", ""), 0);
|
||||
publicKey = KeyFactory.getInstance("RSA").generatePublic(new X509EncodedKeySpec(publicKeyBytes));
|
||||
} catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
Log.e("Device","Exception");
|
||||
unpair();
|
||||
Log.e("KDE/Device","Exception");
|
||||
}
|
||||
|
||||
reloadPluginsFromSettings();
|
||||
@@ -116,8 +140,9 @@ public class Device implements BaseLink.PackageReceiver {
|
||||
this.context = context;
|
||||
this.deviceId = np.getString("deviceId");
|
||||
this.name = np.getString("deviceName", context.getString(R.string.unknown_device));
|
||||
this.protocolVersion = np.getInt("protocolVersion");
|
||||
this.pairStatus = PairStatus.NotPaired;
|
||||
this.protocolVersion = np.getInt("protocolVersion");
|
||||
this.deviceType = DeviceType.FromString(np.getString("deviceType", "computer"));
|
||||
this.publicKey = null;
|
||||
|
||||
settings = context.getSharedPreferences(deviceId, Context.MODE_PRIVATE);
|
||||
@@ -129,6 +154,19 @@ public class Device implements BaseLink.PackageReceiver {
|
||||
return name != null? name : context.getString(R.string.unknown_device);
|
||||
}
|
||||
|
||||
public Drawable getIcon()
|
||||
{
|
||||
switch (deviceType) {
|
||||
case Phone: return context.getResources().getDrawable(R.drawable.ic_device_phone);
|
||||
case Tablet: return context.getResources().getDrawable(R.drawable.ic_device_tablet);
|
||||
default: return context.getResources().getDrawable(R.drawable.ic_device_laptop);
|
||||
}
|
||||
}
|
||||
|
||||
public DeviceType getDeviceType() {
|
||||
return deviceType;
|
||||
}
|
||||
|
||||
public String getDeviceId() {
|
||||
return deviceId;
|
||||
}
|
||||
@@ -200,7 +238,7 @@ public class Device implements BaseLink.PackageReceiver {
|
||||
for (PairingCallback cb : pairingCallback) {
|
||||
cb.pairingFailed(context.getString(R.string.error_timed_out));
|
||||
}
|
||||
Log.e("Device","Unpairing (timeout A)");
|
||||
Log.e("KDE/Device","Unpairing (timeout A)");
|
||||
pairStatus = PairStatus.NotPaired;
|
||||
}
|
||||
}, 30*1000); //Time to wait for the other to accept
|
||||
@@ -212,7 +250,7 @@ public class Device implements BaseLink.PackageReceiver {
|
||||
for (PairingCallback cb : pairingCallback) {
|
||||
cb.pairingFailed(context.getString(R.string.error_could_not_send_package));
|
||||
}
|
||||
Log.e("Device","Unpairing (sendFailed A)");
|
||||
Log.e("KDE/Device","Unpairing (sendFailed A)");
|
||||
pairStatus = PairStatus.NotPaired;
|
||||
}
|
||||
|
||||
@@ -257,6 +295,7 @@ public class Device implements BaseLink.PackageReceiver {
|
||||
//Store device information needed to create a Device object in a future
|
||||
SharedPreferences.Editor editor = settings.edit();
|
||||
editor.putString("deviceName", getName());
|
||||
editor.putString("deviceType", deviceType.toString());
|
||||
String encodedPublicKey = Base64.encodeToString(publicKey.getEncoded(), 0);
|
||||
editor.putString("publicKey", encodedPublicKey);
|
||||
editor.apply();
|
||||
@@ -271,7 +310,7 @@ public class Device implements BaseLink.PackageReceiver {
|
||||
|
||||
public void acceptPairing() {
|
||||
|
||||
Log.i("Device","Accepted pair request started by the other device");
|
||||
Log.i("KDE/Device","Accepted pair request started by the other device");
|
||||
|
||||
//Send our own public key
|
||||
NetworkPackage np = NetworkPackage.createPublicKeyPackage(context);
|
||||
@@ -294,7 +333,7 @@ public class Device implements BaseLink.PackageReceiver {
|
||||
|
||||
public void rejectPairing() {
|
||||
|
||||
Log.i("Device","Rejected pair request started by the other device");
|
||||
Log.i("KDE/Device","Rejected pair request started by the other device");
|
||||
|
||||
//Log.e("Device","Unpairing (rejectPairing)");
|
||||
pairStatus = PairStatus.NotPaired;
|
||||
@@ -321,6 +360,7 @@ public class Device implements BaseLink.PackageReceiver {
|
||||
}
|
||||
|
||||
public void addLink(NetworkPackage identityPackage, BaseLink link) {
|
||||
//FilesHelper.LogOpenFileCount();
|
||||
|
||||
this.protocolVersion = identityPackage.getInt("protocolVersion");
|
||||
|
||||
@@ -331,6 +371,10 @@ public class Device implements BaseLink.PackageReceiver {
|
||||
editor.apply();
|
||||
}
|
||||
|
||||
if (identityPackage.has("deviceType")) {
|
||||
this.deviceType = DeviceType.FromString(identityPackage.getString("deviceType", "computer"));
|
||||
}
|
||||
|
||||
|
||||
links.add(link);
|
||||
|
||||
@@ -341,10 +385,10 @@ public class Device implements BaseLink.PackageReceiver {
|
||||
link.setPrivateKey(privateKey);
|
||||
} catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
Log.e("Device", "Exception reading our own private key"); //Should not happen
|
||||
Log.e("KDE/Device", "Exception reading our own private key"); //Should not happen
|
||||
}
|
||||
|
||||
Log.i("Device","addLink "+link.getLinkProvider().getName()+" -> "+getName() + " active links: "+ links.size());
|
||||
Log.i("KDE/Device","addLink "+link.getLinkProvider().getName()+" -> "+getName() + " active links: "+ links.size());
|
||||
|
||||
/*
|
||||
Collections.sort(links, new Comparator<BaseLink>() {
|
||||
@@ -363,9 +407,11 @@ public class Device implements BaseLink.PackageReceiver {
|
||||
}
|
||||
|
||||
public void removeLink(BaseLink link) {
|
||||
//FilesHelper.LogOpenFileCount();
|
||||
|
||||
link.removePackageReceiver(this);
|
||||
links.remove(link);
|
||||
Log.i("Device","removeLink: "+link.getLinkProvider().getName() + " -> "+getName() + " active links: "+ links.size());
|
||||
Log.i("KDE/Device","removeLink: "+link.getLinkProvider().getName() + " -> "+getName() + " active links: "+ links.size());
|
||||
if (links.isEmpty()) {
|
||||
reloadPluginsFromSettings();
|
||||
}
|
||||
@@ -376,7 +422,7 @@ public class Device implements BaseLink.PackageReceiver {
|
||||
|
||||
if (np.getType().equals(NetworkPackage.PACKAGE_TYPE_PAIR)) {
|
||||
|
||||
Log.i("Device","Pair package");
|
||||
Log.i("KDE/Device","Pair package");
|
||||
|
||||
boolean wantsPair = np.getBoolean("pair");
|
||||
|
||||
@@ -401,7 +447,7 @@ public class Device implements BaseLink.PackageReceiver {
|
||||
publicKey = KeyFactory.getInstance("RSA").generatePublic(new X509EncodedKeySpec(publicKeyBytes));
|
||||
} catch(Exception e) {
|
||||
e.printStackTrace();
|
||||
Log.e("Device","Pairing exception: Received incorrect key");
|
||||
Log.e("KDE/Device","Pairing exception: Received incorrect key");
|
||||
for (PairingCallback cb : pairingCallback) {
|
||||
cb.pairingFailed(context.getString(R.string.error_invalid_key));
|
||||
}
|
||||
@@ -410,7 +456,7 @@ public class Device implements BaseLink.PackageReceiver {
|
||||
|
||||
if (pairStatus == PairStatus.Requested) { //We started pairing
|
||||
|
||||
Log.i("Pairing","Pair answer");
|
||||
Log.i("KDE/Pairing","Pair answer");
|
||||
|
||||
if (pairingTimer != null) pairingTimer.cancel();
|
||||
|
||||
@@ -418,7 +464,7 @@ public class Device implements BaseLink.PackageReceiver {
|
||||
|
||||
} else {
|
||||
|
||||
Log.i("Pairing","Pair request");
|
||||
Log.i("KDE/Pairing","Pair request");
|
||||
|
||||
Intent intent = new Intent(context, PairActivity.class);
|
||||
intent.putExtra("deviceId", deviceId);
|
||||
@@ -439,7 +485,12 @@ public class Device implements BaseLink.PackageReceiver {
|
||||
|
||||
final NotificationManager notificationManager = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);
|
||||
notificationId = (int)System.currentTimeMillis();
|
||||
try {
|
||||
notificationManager.notify(notificationId, noti);
|
||||
} catch(Exception e) {
|
||||
//4.1 will throw an exception about not having the VIBRATE permission, ignore it.
|
||||
//https://android.googlesource.com/platform/frameworks/base/+/android-4.2.1_r1.2%5E%5E!/
|
||||
}
|
||||
|
||||
if (pairingTimer != null) pairingTimer.cancel();
|
||||
pairingTimer = new Timer();
|
||||
@@ -447,7 +498,7 @@ public class Device implements BaseLink.PackageReceiver {
|
||||
pairingTimer.schedule(new TimerTask() {
|
||||
@Override
|
||||
public void run() {
|
||||
Log.e("Device","Unpairing (timeout B)");
|
||||
Log.e("KDE/Device","Unpairing (timeout B)");
|
||||
pairStatus = PairStatus.NotPaired;
|
||||
notificationManager.cancel(notificationId);
|
||||
}
|
||||
@@ -457,7 +508,7 @@ public class Device implements BaseLink.PackageReceiver {
|
||||
|
||||
}
|
||||
} else {
|
||||
Log.i("Pairing","Unpair request");
|
||||
Log.i("KDE/Pairing","Unpair request");
|
||||
|
||||
if (pairStatus == PairStatus.Requested) {
|
||||
pairingTimer.cancel();
|
||||
@@ -470,27 +521,30 @@ public class Device implements BaseLink.PackageReceiver {
|
||||
reloadPluginsFromSettings();
|
||||
}
|
||||
|
||||
//Log.e("Device","Unpairing (unpair request)");
|
||||
pairStatus = PairStatus.NotPaired;
|
||||
for (PairingCallback cb : pairingCallback) cb.unpaired();
|
||||
|
||||
}
|
||||
} else if (!isPaired()) {
|
||||
|
||||
unpair();
|
||||
Log.e("onPackageReceived","Device not paired, ignoring package!");
|
||||
|
||||
} else {
|
||||
} else if (isPaired()) {
|
||||
|
||||
for (Plugin plugin : plugins.values()) {
|
||||
try {
|
||||
plugin.onPackageReceived(np);
|
||||
} catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
Log.e("Device", "Exception in "+plugin.getDisplayName()+"'s onPackageReceived()");
|
||||
Log.e("KDE/Device", "Exception in "+plugin.getDisplayName()+"'s onPackageReceived()");
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
} else {
|
||||
|
||||
Log.e("KDE/onPackageReceived","Device not paired, ignoring package!");
|
||||
|
||||
if (pairStatus != PairStatus.Requested) {
|
||||
unpair();
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
@@ -508,9 +562,9 @@ public class Device implements BaseLink.PackageReceiver {
|
||||
public void sendFailure(Throwable e) {
|
||||
if (e != null) {
|
||||
e.printStackTrace();
|
||||
Log.e("sendPackage", "Exception: " + e.getMessage());
|
||||
Log.e("KDE/sendPackage", "Exception: " + e.getMessage());
|
||||
} else {
|
||||
Log.e("sendPackage", "Unknown (null) exception");
|
||||
Log.e("KDE/sendPackage", "Unknown (null) exception");
|
||||
}
|
||||
onFailure(e);
|
||||
}
|
||||
@@ -543,6 +597,7 @@ public class Device implements BaseLink.PackageReceiver {
|
||||
//Make a copy to avoid concurrent modification exception if the original list changes
|
||||
ArrayList<BaseLink> mLinks = new ArrayList<BaseLink>(links);
|
||||
for (final BaseLink link : mLinks) {
|
||||
if (link == null) continue; //Since we made a copy, maybe somebody destroyed the link in the meanwhile
|
||||
if (useEncryption) {
|
||||
link.sendPackageEncrypted(np, callback, publicKey);
|
||||
} else {
|
||||
@@ -552,7 +607,7 @@ public class Device implements BaseLink.PackageReceiver {
|
||||
}
|
||||
|
||||
if (!callback.success) {
|
||||
Log.e("sendPackage", "No device link (of "+mLinks.size()+" available) could send the package. Package lost!");
|
||||
Log.e("KDE/sendPackage", "No device link (of "+mLinks.size()+" available) could send the package. Package lost!");
|
||||
backtrace.printStackTrace();
|
||||
}
|
||||
|
||||
@@ -565,29 +620,37 @@ public class Device implements BaseLink.PackageReceiver {
|
||||
// Plugin-related functions
|
||||
//
|
||||
|
||||
public Plugin getPlugin(String name) {
|
||||
return getPlugin(name, false);
|
||||
public <T extends Plugin> T getPlugin(Class<T> pluginClass) {
|
||||
return (T)getPlugin(Plugin.getPluginKey(pluginClass));
|
||||
}
|
||||
|
||||
public Plugin getPlugin(String name, boolean includeFailed) {
|
||||
Plugin plugin = plugins.get(name);
|
||||
public <T extends Plugin> T getPlugin(Class<T> pluginClass, boolean includeFailed) {
|
||||
return (T)getPlugin(Plugin.getPluginKey(pluginClass), includeFailed);
|
||||
}
|
||||
|
||||
public Plugin getPlugin(String pluginKey) {
|
||||
return getPlugin(pluginKey, false);
|
||||
}
|
||||
|
||||
public Plugin getPlugin(String pluginKey, boolean includeFailed) {
|
||||
Plugin plugin = plugins.get(pluginKey);
|
||||
if (includeFailed && plugin == null) {
|
||||
plugin = failedPlugins.get(name);
|
||||
plugin = failedPlugins.get(pluginKey);
|
||||
}
|
||||
return plugin;
|
||||
}
|
||||
|
||||
private synchronized void addPlugin(final String name) {
|
||||
Plugin existing = plugins.get(name);
|
||||
private synchronized void addPlugin(final String pluginKey) {
|
||||
Plugin existing = plugins.get(pluginKey);
|
||||
if (existing != null) {
|
||||
Log.w("addPlugin","plugin already present:" + name);
|
||||
Log.w("KDE/addPlugin","plugin already present:" + pluginKey);
|
||||
return;
|
||||
}
|
||||
|
||||
final Plugin plugin = PluginFactory.instantiatePluginForDevice(context, name, this);
|
||||
final Plugin plugin = PluginFactory.instantiatePluginForDevice(context, pluginKey, this);
|
||||
if (plugin == null) {
|
||||
Log.e("addPlugin","could not instantiate plugin: "+name);
|
||||
failedPlugins.put(name, plugin);
|
||||
Log.e("KDE/addPlugin","could not instantiate plugin: "+pluginKey);
|
||||
failedPlugins.put(pluginKey, plugin);
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -601,17 +664,17 @@ public class Device implements BaseLink.PackageReceiver {
|
||||
} catch (Exception e) {
|
||||
success = false;
|
||||
e.printStackTrace();
|
||||
Log.e("addPlugin", "Exception loading plugin " + name);
|
||||
Log.e("KDE/addPlugin", "Exception loading plugin " + pluginKey);
|
||||
}
|
||||
|
||||
if (success) {
|
||||
//Log.e("addPlugin","added " + name);
|
||||
failedPlugins.remove(name);
|
||||
plugins.put(name, plugin);
|
||||
//Log.e("addPlugin","added " + pluginKey);
|
||||
failedPlugins.remove(pluginKey);
|
||||
plugins.put(pluginKey, plugin);
|
||||
} else {
|
||||
Log.e("addPlugin", "plugin failed to load " + name);
|
||||
plugins.remove(name);
|
||||
failedPlugins.put(name, plugin);
|
||||
Log.e("KDE/addPlugin", "plugin failed to load " + pluginKey);
|
||||
plugins.remove(pluginKey);
|
||||
failedPlugins.put(pluginKey, plugin);
|
||||
}
|
||||
|
||||
for (PluginsChangedListener listener : pluginsChangedListeners) {
|
||||
@@ -623,10 +686,10 @@ public class Device implements BaseLink.PackageReceiver {
|
||||
|
||||
}
|
||||
|
||||
private synchronized boolean removePlugin(String name) {
|
||||
private synchronized boolean removePlugin(String pluginKey) {
|
||||
|
||||
Plugin plugin = plugins.remove(name);
|
||||
Plugin failedPlugin = failedPlugins.remove(name);
|
||||
Plugin plugin = plugins.remove(pluginKey);
|
||||
Plugin failedPlugin = failedPlugins.remove(pluginKey);
|
||||
|
||||
if (plugin == null) {
|
||||
if (failedPlugin == null) {
|
||||
@@ -638,10 +701,10 @@ public class Device implements BaseLink.PackageReceiver {
|
||||
|
||||
try {
|
||||
plugin.onDestroy();
|
||||
//Log.e("removePlugin","removed " + name);
|
||||
//Log.e("removePlugin","removed " + pluginKey);
|
||||
} catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
Log.e("removePlugin","Exception calling onDestroy for plugin "+name);
|
||||
Log.e("KDE/removePlugin","Exception calling onDestroy for plugin "+pluginKey);
|
||||
}
|
||||
|
||||
for (PluginsChangedListener listener : pluginsChangedListeners) {
|
||||
@@ -651,15 +714,15 @@ public class Device implements BaseLink.PackageReceiver {
|
||||
return true;
|
||||
}
|
||||
|
||||
public void setPluginEnabled(String pluginName, boolean value) {
|
||||
settings.edit().putBoolean(pluginName,value).apply();
|
||||
if (value && isPaired() && isReachable()) addPlugin(pluginName);
|
||||
else removePlugin(pluginName);
|
||||
public void setPluginEnabled(String pluginKey, boolean value) {
|
||||
settings.edit().putBoolean(pluginKey,value).apply();
|
||||
if (value && isPaired() && isReachable()) addPlugin(pluginKey);
|
||||
else removePlugin(pluginKey);
|
||||
}
|
||||
|
||||
public boolean isPluginEnabled(String pluginName) {
|
||||
boolean enabledByDefault = PluginFactory.getPluginInfo(context, pluginName).isEnabledByDefault();
|
||||
boolean enabled = settings.getBoolean(pluginName, enabledByDefault);
|
||||
public boolean isPluginEnabled(String pluginKey) {
|
||||
boolean enabledByDefault = PluginFactory.getPluginInfo(context, pluginKey).isEnabledByDefault();
|
||||
boolean enabled = settings.getBoolean(pluginKey, enabledByDefault);
|
||||
return enabled;
|
||||
}
|
||||
|
||||
@@ -673,15 +736,15 @@ public class Device implements BaseLink.PackageReceiver {
|
||||
|
||||
Set<String> availablePlugins = PluginFactory.getAvailablePlugins();
|
||||
|
||||
for(String pluginName : availablePlugins) {
|
||||
for(String pluginKey : availablePlugins) {
|
||||
boolean enabled = false;
|
||||
if (isPaired() && isReachable()) {
|
||||
enabled = isPluginEnabled(pluginName);
|
||||
enabled = isPluginEnabled(pluginKey);
|
||||
}
|
||||
if (enabled) {
|
||||
addPlugin(pluginName);
|
||||
addPlugin(pluginKey);
|
||||
} else {
|
||||
removePlugin(pluginName);
|
||||
removePlugin(pluginKey);
|
||||
}
|
||||
}
|
||||
|
||||
|
@@ -23,6 +23,7 @@ package org.kde.kdeconnect.Helpers;
|
||||
import android.content.res.Configuration;
|
||||
import android.content.res.Resources;
|
||||
import android.os.Build;
|
||||
import android.util.Log;
|
||||
|
||||
import java.util.HashMap;
|
||||
|
||||
@@ -335,16 +336,26 @@ public class DeviceHelper {
|
||||
}
|
||||
|
||||
public static String getDeviceName() {
|
||||
|
||||
String deviceName = null;
|
||||
try {
|
||||
String dictName = humanReadableNames.get(Build.MODEL.replace(' ', '_'));
|
||||
if (dictName != null) return dictName;
|
||||
|
||||
if (Build.BRAND.equals("samsung") || Build.BRAND.equals("Samsung")) {
|
||||
return "Samsung" + Build.MODEL;
|
||||
if (dictName != null) {
|
||||
deviceName = dictName;
|
||||
} else if (Build.BRAND.equalsIgnoreCase("samsung")) {
|
||||
deviceName = "Samsung " + Build.MODEL;
|
||||
} else {
|
||||
deviceName = Build.BRAND;
|
||||
}
|
||||
} catch (Exception e) {
|
||||
//Some phones might not define BRAND or MODEL, ignore exceptions
|
||||
Log.e("Exception", e.getMessage());
|
||||
e.printStackTrace();
|
||||
}
|
||||
if (deviceName == null || deviceName.isEmpty()) {
|
||||
return "Android"; //Could not find a name
|
||||
} else {
|
||||
return deviceName;
|
||||
}
|
||||
|
||||
return Build.MODEL;
|
||||
|
||||
}
|
||||
|
||||
public static boolean isTablet() {
|
||||
|
@@ -20,8 +20,11 @@
|
||||
|
||||
package org.kde.kdeconnect.Helpers;
|
||||
|
||||
import android.util.Log;
|
||||
import android.webkit.MimeTypeMap;
|
||||
|
||||
import java.io.File;
|
||||
|
||||
public class FilesHelper {
|
||||
|
||||
public static String getFileExt(String fileName) {
|
||||
@@ -73,4 +76,11 @@ public class FilesHelper {
|
||||
return toFileSystemSafeName(name, true, 255);
|
||||
}
|
||||
|
||||
public static int GetOpenFileCount() {
|
||||
return new File("/proc/self/fd").listFiles().length;
|
||||
}
|
||||
|
||||
public static void LogOpenFileCount() {
|
||||
Log.e("KDE/FileCount",""+GetOpenFileCount());
|
||||
}
|
||||
}
|
||||
|
@@ -81,7 +81,9 @@ public class StorageHelper {
|
||||
if (storage.exists() && storage.isDirectory()) {
|
||||
String mounts = null;
|
||||
try {
|
||||
mounts = new Scanner( new File("/proc/mounts") ).useDelimiter("\\A").next();
|
||||
Scanner scanner = new Scanner( new File("/proc/mounts") );
|
||||
mounts = scanner.useDelimiter("\\A").next();
|
||||
scanner.close();
|
||||
//Log.e("Mounts",mounts);
|
||||
} catch(Exception e) {
|
||||
e.printStackTrace();
|
||||
|
@@ -85,6 +85,10 @@ public class NetworkPackage {
|
||||
return mType;
|
||||
}
|
||||
|
||||
public long getId() {
|
||||
return mId;
|
||||
}
|
||||
|
||||
//Most commons getters and setters defined for convenience
|
||||
public String getString(String key) { return mBody.optString(key,""); }
|
||||
public String getString(String key, String defaultValue) { return mBody.optString(key,defaultValue); }
|
||||
|
@@ -20,20 +20,17 @@
|
||||
|
||||
package org.kde.kdeconnect.Plugins.BatteryPlugin;
|
||||
|
||||
import android.app.Activity;
|
||||
import android.app.AlertDialog;
|
||||
import android.content.BroadcastReceiver;
|
||||
import android.content.Context;
|
||||
import android.content.Intent;
|
||||
import android.content.IntentFilter;
|
||||
import android.graphics.drawable.Drawable;
|
||||
import android.os.BatteryManager;
|
||||
import android.widget.Button;
|
||||
|
||||
import org.kde.kdeconnect.NetworkPackage;
|
||||
import org.kde.kdeconnect.Plugins.Plugin;
|
||||
import org.kde.kdeconnect_tp.R;
|
||||
|
||||
|
||||
public class BatteryPlugin extends Plugin {
|
||||
|
||||
// keep these fields in sync with kdeconnect-kded:BatteryPlugin.h:ThresholdBatteryEvent
|
||||
@@ -42,11 +39,6 @@ public class BatteryPlugin extends Plugin {
|
||||
|
||||
private NetworkPackage lastInfo = null;
|
||||
|
||||
@Override
|
||||
public String getPluginName() {
|
||||
return "plugin_battery";
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getDisplayName() {
|
||||
return context.getResources().getString(R.string.pref_plugin_battery);
|
||||
@@ -57,21 +49,6 @@ public class BatteryPlugin extends Plugin {
|
||||
return context.getResources().getString(R.string.pref_plugin_battery_desc);
|
||||
}
|
||||
|
||||
@Override
|
||||
public Drawable getIcon() {
|
||||
return context.getResources().getDrawable(R.drawable.icon);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean hasSettings() {
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isEnabledByDefault() {
|
||||
return true;
|
||||
}
|
||||
|
||||
private final BroadcastReceiver receiver = new BroadcastReceiver() {
|
||||
@Override
|
||||
public void onReceive(Context context, Intent batteryIntent) {
|
||||
@@ -133,13 +110,4 @@ public class BatteryPlugin extends Plugin {
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public AlertDialog getErrorDialog(Activity deviceActivity) {
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Button getInterfaceButton(Activity activity) {
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
@@ -31,10 +31,6 @@ import org.kde.kdeconnect_tp.R;
|
||||
|
||||
public class ClipboardPlugin extends Plugin {
|
||||
|
||||
@Override
|
||||
public String getPluginName() {
|
||||
return "plugin_clipboard";
|
||||
}
|
||||
@Override
|
||||
public String getDisplayName() {
|
||||
return context.getResources().getString(R.string.pref_plugin_clipboard);
|
||||
|
@@ -176,7 +176,7 @@ public class KeyListenerView extends View {
|
||||
@Override
|
||||
public void onServiceStart(BackgroundService service) {
|
||||
Device device = service.getDevice(deviceId);
|
||||
MousePadPlugin mousePadPlugin = (MousePadPlugin) device.getPlugin("plugin_mousepad");
|
||||
MousePadPlugin mousePadPlugin = (MousePadPlugin) device.getPlugin(MousePadPlugin.class);
|
||||
if (mousePadPlugin == null) return;
|
||||
mousePadPlugin.sendKeyboardPacket(np);
|
||||
}
|
||||
|
@@ -182,7 +182,7 @@ public class MousePadActivity extends ActionBarActivity implements GestureDetect
|
||||
@Override
|
||||
public void onServiceStart(BackgroundService service) {
|
||||
Device device = service.getDevice(deviceId);
|
||||
MousePadPlugin mousePadPlugin = (MousePadPlugin)device.getPlugin("plugin_mousepad");
|
||||
MousePadPlugin mousePadPlugin = device.getPlugin(MousePadPlugin.class);
|
||||
if (mousePadPlugin == null) return;
|
||||
mousePadPlugin.sendMouseDelta(mCurrentX - mPrevX, mCurrentY - mPrevY);
|
||||
mPrevX = mCurrentX;
|
||||
@@ -227,7 +227,7 @@ public class MousePadActivity extends ActionBarActivity implements GestureDetect
|
||||
@Override
|
||||
public void onServiceStart(BackgroundService service) {
|
||||
Device device = service.getDevice(deviceId);
|
||||
MousePadPlugin mousePadPlugin = (MousePadPlugin)device.getPlugin("plugin_mousepad");
|
||||
MousePadPlugin mousePadPlugin = device.getPlugin(MousePadPlugin.class);
|
||||
if (mousePadPlugin == null) return;
|
||||
mousePadPlugin.sendScroll(0, scrollToSendY);
|
||||
}
|
||||
@@ -248,7 +248,7 @@ public class MousePadActivity extends ActionBarActivity implements GestureDetect
|
||||
@Override
|
||||
public void onServiceStart(BackgroundService service) {
|
||||
Device device = service.getDevice(deviceId);
|
||||
MousePadPlugin mousePadPlugin = (MousePadPlugin)device.getPlugin("plugin_mousepad");
|
||||
MousePadPlugin mousePadPlugin = device.getPlugin(MousePadPlugin.class);
|
||||
if (mousePadPlugin == null) return;
|
||||
mousePadPlugin.sendSingleHold();
|
||||
}
|
||||
@@ -266,7 +266,7 @@ public class MousePadActivity extends ActionBarActivity implements GestureDetect
|
||||
@Override
|
||||
public void onServiceStart(BackgroundService service) {
|
||||
Device device = service.getDevice(deviceId);
|
||||
MousePadPlugin mousePadPlugin = (MousePadPlugin)device.getPlugin("plugin_mousepad");
|
||||
MousePadPlugin mousePadPlugin = device.getPlugin(MousePadPlugin.class);
|
||||
if (mousePadPlugin == null) return;
|
||||
mousePadPlugin.sendSingleClick();
|
||||
}
|
||||
@@ -280,7 +280,7 @@ public class MousePadActivity extends ActionBarActivity implements GestureDetect
|
||||
@Override
|
||||
public void onServiceStart(BackgroundService service) {
|
||||
Device device = service.getDevice(deviceId);
|
||||
MousePadPlugin mousePadPlugin = (MousePadPlugin)device.getPlugin("plugin_mousepad");
|
||||
MousePadPlugin mousePadPlugin = device.getPlugin(MousePadPlugin.class);
|
||||
if (mousePadPlugin == null) return;
|
||||
mousePadPlugin.sendDoubleClick();
|
||||
}
|
||||
@@ -327,7 +327,7 @@ public class MousePadActivity extends ActionBarActivity implements GestureDetect
|
||||
@Override
|
||||
public void onServiceStart(BackgroundService service) {
|
||||
Device device = service.getDevice(deviceId);
|
||||
MousePadPlugin mousePadPlugin = (MousePadPlugin)device.getPlugin("plugin_mousepad");
|
||||
MousePadPlugin mousePadPlugin = device.getPlugin(MousePadPlugin.class);
|
||||
if (mousePadPlugin == null) return;
|
||||
mousePadPlugin.sendMiddleClick();
|
||||
}
|
||||
@@ -339,7 +339,7 @@ public class MousePadActivity extends ActionBarActivity implements GestureDetect
|
||||
@Override
|
||||
public void onServiceStart(BackgroundService service) {
|
||||
Device device = service.getDevice(deviceId);
|
||||
MousePadPlugin mousePadPlugin = (MousePadPlugin) device.getPlugin("plugin_mousepad");
|
||||
MousePadPlugin mousePadPlugin = device.getPlugin(MousePadPlugin.class);
|
||||
if (mousePadPlugin == null) return;
|
||||
mousePadPlugin.sendRightClick();
|
||||
}
|
||||
@@ -350,7 +350,7 @@ public class MousePadActivity extends ActionBarActivity implements GestureDetect
|
||||
@Override
|
||||
public void onServiceStart(BackgroundService service) {
|
||||
Device device = service.getDevice(deviceId);
|
||||
MousePadPlugin mousePadPlugin = (MousePadPlugin) device.getPlugin("plugin_mousepad");
|
||||
MousePadPlugin mousePadPlugin = device.getPlugin(MousePadPlugin.class);
|
||||
if (mousePadPlugin == null) return;
|
||||
mousePadPlugin.sendSingleHold();
|
||||
}
|
||||
|
@@ -21,11 +21,8 @@
|
||||
package org.kde.kdeconnect.Plugins.MousePadPlugin;
|
||||
|
||||
import android.app.Activity;
|
||||
import android.app.AlertDialog;
|
||||
import android.content.Intent;
|
||||
import android.graphics.drawable.Drawable;
|
||||
import android.view.View;
|
||||
import android.widget.Button;
|
||||
|
||||
import org.kde.kdeconnect.NetworkPackage;
|
||||
import org.kde.kdeconnect.Plugins.Plugin;
|
||||
@@ -33,11 +30,6 @@ import org.kde.kdeconnect_tp.R;
|
||||
|
||||
public class MousePadPlugin extends Plugin {
|
||||
|
||||
@Override
|
||||
public String getPluginName() {
|
||||
return "plugin_mousepad";
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getDisplayName() {
|
||||
return context.getString(R.string.pref_plugin_mousepad);
|
||||
@@ -50,12 +42,7 @@ public class MousePadPlugin extends Plugin {
|
||||
|
||||
@Override
|
||||
public Drawable getIcon() {
|
||||
return context.getResources().getDrawable(R.drawable.icon);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isEnabledByDefault() {
|
||||
return true;
|
||||
return context.getResources().getDrawable(R.drawable.touchpad_plugin_action);
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -64,36 +51,20 @@ public class MousePadPlugin extends Plugin {
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean onCreate() {
|
||||
public boolean hasMainActivity() {
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onDestroy() {
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean onPackageReceived(NetworkPackage np) {
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public AlertDialog getErrorDialog(Activity deviceActivity) { return null; }
|
||||
|
||||
@Override
|
||||
public Button getInterfaceButton(final Activity activity) {
|
||||
Button button = new Button(activity);
|
||||
button.setText(R.string.open_mousepad);
|
||||
button.setOnClickListener(new View.OnClickListener() {
|
||||
@Override
|
||||
public void onClick(View v) {
|
||||
Intent intent = new Intent(activity, MousePadActivity.class);
|
||||
public void startMainActivity(Activity parentActivity) {
|
||||
Intent intent = new Intent(parentActivity, MousePadActivity.class);
|
||||
intent.putExtra("deviceId", device.getDeviceId());
|
||||
activity.startActivity(intent);
|
||||
parentActivity.startActivity(intent);
|
||||
}
|
||||
});
|
||||
return button;
|
||||
|
||||
@Override
|
||||
public String getActionName() {
|
||||
return context.getString(R.string.open_mousepad);
|
||||
}
|
||||
|
||||
public void sendMouseDelta(float dx, float dy) {
|
||||
|
@@ -75,7 +75,7 @@ public class MprisActivity extends ActionBarActivity {
|
||||
public void onServiceStart(BackgroundService service) {
|
||||
|
||||
final Device device = service.getDevice(deviceId);
|
||||
final MprisPlugin mpris = (MprisPlugin) device.getPlugin("plugin_mpris");
|
||||
final MprisPlugin mpris = device.getPlugin(MprisPlugin.class);
|
||||
if (mpris == null) {
|
||||
Log.e("MprisActivity", "device has no mpris plugin!");
|
||||
return;
|
||||
@@ -246,7 +246,7 @@ public class MprisActivity extends ActionBarActivity {
|
||||
@Override
|
||||
public void onServiceStart(BackgroundService service) {
|
||||
Device device = service.getDevice(deviceId);
|
||||
MprisPlugin mpris = (MprisPlugin) device.getPlugin("plugin_mpris");
|
||||
MprisPlugin mpris = device.getPlugin(MprisPlugin.class);
|
||||
if (mpris == null) return;
|
||||
updateVolume(mpris, 5);
|
||||
}
|
||||
@@ -257,7 +257,7 @@ public class MprisActivity extends ActionBarActivity {
|
||||
@Override
|
||||
public void onServiceStart(BackgroundService service) {
|
||||
Device device = service.getDevice(deviceId);
|
||||
MprisPlugin mpris = (MprisPlugin) device.getPlugin("plugin_mpris");
|
||||
MprisPlugin mpris = device.getPlugin(MprisPlugin.class);
|
||||
if (mpris == null) return;
|
||||
updateVolume(mpris, -5);
|
||||
}
|
||||
@@ -309,7 +309,7 @@ public class MprisActivity extends ActionBarActivity {
|
||||
@Override
|
||||
public void onServiceStart(BackgroundService service) {
|
||||
Device device = service.getDevice(deviceId);
|
||||
MprisPlugin mpris = (MprisPlugin)device.getPlugin("plugin_mpris");
|
||||
MprisPlugin mpris = device.getPlugin(MprisPlugin.class);
|
||||
if (mpris == null) return;
|
||||
mpris.sendAction("PlayPause");
|
||||
}
|
||||
@@ -324,7 +324,7 @@ public class MprisActivity extends ActionBarActivity {
|
||||
@Override
|
||||
public void onServiceStart(BackgroundService service) {
|
||||
Device device = service.getDevice(deviceId);
|
||||
MprisPlugin mpris = (MprisPlugin)device.getPlugin("plugin_mpris");
|
||||
MprisPlugin mpris = device.getPlugin(MprisPlugin.class);
|
||||
if (mpris == null) return;
|
||||
mpris.sendAction("Previous");
|
||||
}
|
||||
@@ -339,7 +339,7 @@ public class MprisActivity extends ActionBarActivity {
|
||||
@Override
|
||||
public void onServiceStart(BackgroundService service) {
|
||||
Device device = service.getDevice(deviceId);
|
||||
MprisPlugin mpris = (MprisPlugin)device.getPlugin("plugin_mpris");
|
||||
MprisPlugin mpris = device.getPlugin(MprisPlugin.class);
|
||||
if (mpris == null) return;
|
||||
mpris.Seek(interval_time * -1);
|
||||
}
|
||||
@@ -354,7 +354,7 @@ public class MprisActivity extends ActionBarActivity {
|
||||
@Override
|
||||
public void onServiceStart(BackgroundService service) {
|
||||
Device device = service.getDevice(deviceId);
|
||||
MprisPlugin mpris = (MprisPlugin)device.getPlugin("plugin_mpris");
|
||||
MprisPlugin mpris = device.getPlugin(MprisPlugin.class);
|
||||
if (mpris == null) return;
|
||||
mpris.Seek(interval_time);
|
||||
}
|
||||
@@ -369,7 +369,7 @@ public class MprisActivity extends ActionBarActivity {
|
||||
@Override
|
||||
public void onServiceStart(BackgroundService service) {
|
||||
Device device = service.getDevice(deviceId);
|
||||
MprisPlugin mpris = (MprisPlugin)device.getPlugin("plugin_mpris");
|
||||
MprisPlugin mpris = device.getPlugin(MprisPlugin.class);
|
||||
if (mpris == null) return;
|
||||
mpris.sendAction("Next");
|
||||
}
|
||||
@@ -392,7 +392,7 @@ public class MprisActivity extends ActionBarActivity {
|
||||
@Override
|
||||
public void onServiceStart(BackgroundService service) {
|
||||
Device device = service.getDevice(deviceId);
|
||||
MprisPlugin mpris = (MprisPlugin) device.getPlugin("plugin_mpris");
|
||||
MprisPlugin mpris = device.getPlugin(MprisPlugin.class);
|
||||
if (mpris == null) return;
|
||||
mpris.setVolume(seekBar.getProgress());
|
||||
}
|
||||
@@ -409,7 +409,7 @@ public class MprisActivity extends ActionBarActivity {
|
||||
@Override
|
||||
public void onServiceStart(BackgroundService service) {
|
||||
Device device = service.getDevice(deviceId);
|
||||
MprisPlugin mpris = (MprisPlugin) device.getPlugin("plugin_mpris");
|
||||
MprisPlugin mpris = device.getPlugin(MprisPlugin.class);
|
||||
if (mpris != null) {
|
||||
positionSeek.setProgress((int) (mpris.getPosition()));
|
||||
}
|
||||
@@ -438,7 +438,7 @@ public class MprisActivity extends ActionBarActivity {
|
||||
@Override
|
||||
public void onServiceStart(BackgroundService service) {
|
||||
Device device = service.getDevice(deviceId);
|
||||
MprisPlugin mpris = (MprisPlugin) device.getPlugin("plugin_mpris");
|
||||
MprisPlugin mpris = device.getPlugin(MprisPlugin.class);
|
||||
if (mpris != null) {
|
||||
mpris.setPosition(seekBar.getProgress());
|
||||
}
|
||||
|
@@ -21,14 +21,11 @@
|
||||
package org.kde.kdeconnect.Plugins.MprisPlugin;
|
||||
|
||||
import android.app.Activity;
|
||||
import android.app.AlertDialog;
|
||||
import android.content.Intent;
|
||||
import android.graphics.drawable.Drawable;
|
||||
import android.os.Handler;
|
||||
import android.os.Message;
|
||||
import android.util.Log;
|
||||
import android.view.View;
|
||||
import android.widget.Button;
|
||||
|
||||
import org.kde.kdeconnect.NetworkPackage;
|
||||
import org.kde.kdeconnect.Plugins.Plugin;
|
||||
@@ -51,11 +48,6 @@ public class MprisPlugin extends Plugin {
|
||||
private ArrayList<String> playerList = new ArrayList<String>();
|
||||
private HashMap<String,Handler> playerListUpdated = new HashMap<String,Handler>();
|
||||
|
||||
@Override
|
||||
public String getPluginName() {
|
||||
return "plugin_mpris";
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getDisplayName() {
|
||||
return context.getResources().getString(R.string.pref_plugin_mpris);
|
||||
@@ -68,7 +60,7 @@ public class MprisPlugin extends Plugin {
|
||||
|
||||
@Override
|
||||
public Drawable getIcon() {
|
||||
return context.getResources().getDrawable(R.drawable.icon);
|
||||
return context.getResources().getDrawable(R.drawable.mpris_plugin_action);
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -76,11 +68,6 @@ public class MprisPlugin extends Plugin {
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isEnabledByDefault() {
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean onCreate() {
|
||||
requestPlayerList();
|
||||
@@ -267,22 +254,20 @@ public class MprisPlugin extends Plugin {
|
||||
}
|
||||
|
||||
@Override
|
||||
public AlertDialog getErrorDialog(Activity deviceActivity) {
|
||||
return null;
|
||||
public boolean hasMainActivity() {
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Button getInterfaceButton(final Activity activity) {
|
||||
Button b = new Button(activity);
|
||||
b.setText(R.string.open_mpris_controls);
|
||||
b.setOnClickListener(new View.OnClickListener() {
|
||||
@Override
|
||||
public void onClick(View view) {
|
||||
Intent intent = new Intent(activity, MprisActivity.class);
|
||||
public void startMainActivity(Activity parentActivity) {
|
||||
Intent intent = new Intent(parentActivity, MprisActivity.class);
|
||||
intent.putExtra("deviceId", device.getDeviceId());
|
||||
activity.startActivity(intent);
|
||||
parentActivity.startActivity(intent);
|
||||
}
|
||||
});
|
||||
return b;
|
||||
|
||||
@Override
|
||||
public String getActionName() {
|
||||
return context.getString(R.string.open_mpris_controls);
|
||||
}
|
||||
|
||||
}
|
||||
|
@@ -64,13 +64,14 @@ public class NotificationFilterActivity extends ActionBarActivity {
|
||||
res.moveToNext();
|
||||
i++;
|
||||
}
|
||||
res.close();
|
||||
appDatabase.close();
|
||||
|
||||
ArrayAdapter<String> adapter = new ArrayAdapter<String>(this,
|
||||
android.R.layout.simple_list_item_multiple_choice,android.R.id.text1, appName);
|
||||
listView.setAdapter(adapter);
|
||||
listView.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE);
|
||||
for (i = 0 ; i < res.getCount(); i++){
|
||||
for (i = 0 ; i < isFiltered.length; i++){
|
||||
if (isFiltered[i]) {
|
||||
listView.setItemChecked(i, true);
|
||||
}
|
||||
@@ -85,6 +86,7 @@ public class NotificationFilterActivity extends ActionBarActivity {
|
||||
appDatabase.close();
|
||||
}
|
||||
});
|
||||
|
||||
}
|
||||
|
||||
// Delete apps from database which are uninstalled
|
||||
@@ -101,6 +103,7 @@ public class NotificationFilterActivity extends ActionBarActivity {
|
||||
}
|
||||
res.moveToNext();
|
||||
}
|
||||
res.close();
|
||||
}
|
||||
appDatabase.close();
|
||||
|
||||
|