2
0
mirror of https://github.com/KDE/kdeconnect-android synced 2025-09-04 16:15:09 +00:00

Compare commits

..

64 Commits
v0.8d ... v0.8h

Author SHA1 Message Date
Albert Vaca
275cd03b19 Increased version number to release 2015-06-14 03:04:54 -07:00
Albert Vaca
c0a70e35f0 Fixed widgets not using the theme of the app
The problem was that I was passing the base context instead of the view's
2015-06-14 02:59:14 -07:00
Albert Vaca
8f3e0a8555 Don't define a theme that we don't use.
Now we use our theme, even though it just inherits from AppCompat's theme
2015-06-14 02:59:14 -07:00
Albert Vaca
2f77e24ad1 Possible crash related to device name handling
BUG: 348844
2015-06-14 02:59:14 -07:00
Albert Vaca
5b694a3b3e Fixed Android 4.1 crash 2015-06-14 02:59:14 -07:00
Albert Vaca
9a04f24de6 Apply AppCompat theme application-wise instead of per activity.
Last appcompat-v7-22 allows preference activities to use the AppCompat
themes via an AppCompatDelegate.
2015-06-14 02:59:14 -07:00
Albert Vaca
39fba2ef2a Bumped SDK version 2015-06-14 00:11:38 -07:00
Albert Vaca
de66bdfae3 pickFirst seems a better option than exclude 2015-06-13 21:47:32 -07:00
Albert Vaca
017d05b189 Added a proguard file that should fix a crash on Android 4.2 for Samsung
Also reduces the size of the APK.
2015-06-13 21:47:32 -07:00
l10n daemon script
d6264c3359 SVN_SILENT made messages (after extraction) 2015-06-14 02:11:57 +00:00
Vineet Garg
3e70c21031 Added LanLinkTest and LanLinkProviderTest 2015-06-13 12:36:22 +05:30
l10n daemon script
2a6325c472 SVN_SILENT made messages (after extraction) 2015-06-12 02:11:42 +00:00
Vineet Garg
3aadc94278 Added tests - DeviceTest and NetworkPackageTest 2015-06-10 12:29:53 +05:30
l10n daemon script
9e8efb1822 SVN_SILENT made messages (after extraction) 2015-06-10 02:11:10 +00:00
l10n daemon script
74f5e2bf84 SVN_SILENT made messages (after extraction) 2015-06-09 02:20:08 +00:00
l10n daemon script
45fdf3c0ac SVN_SILENT made messages (after extraction) 2015-06-08 02:03:58 +00:00
Albert Vaca
e00376a316 I meant "outdated comment" 2015-06-06 00:48:22 -07:00
Albert Vaca
f41fb4a9da Removed outdated plugin 2015-06-06 00:47:00 -07:00
Albert Vaca
e9a2cbd36b Fixed inconsistent plugin names 2015-06-06 00:43:38 -07:00
Albert Vaca
d5cb11e6c2 Changed color of device icons 2015-06-06 00:39:04 -07:00
Albert Vaca
3b0a3e265d Plugin key is now the plugin class instead of being defined by each plugin 2015-06-06 00:39:04 -07:00
Albert Vaca
a5e9b29e20 Don't call mutex.lock in the main thread 2015-06-06 00:32:05 -07:00
Albert Vaca
307071e9e7 Better names for some plugins 2015-06-06 00:32:05 -07:00
Albert Vaca
7c3e223e29 Default to phone instead of tablet for unknown devices 2015-06-06 00:32:05 -07:00
Albert Vaca
899c73d254 Removed ldpi icon 2015-06-06 00:25:33 -07:00
l10n daemon script
bd14c462dd SVN_SILENT made messages (after extraction) 2015-05-28 02:06:01 +00:00
l10n daemon script
e9b4ca70e9 SVN_SILENT made messages (after extraction) 2015-05-25 02:00:51 +00:00
l10n daemon script
706e3f71b5 SVN_SILENT made messages (after extraction) 2015-05-24 02:12:55 +00:00
l10n daemon script
f9b69a7e45 SVN_SILENT made messages (after extraction) 2015-05-17 02:10:34 +00:00
Albert Vaca
299e7e8375 Handling device type. Added device type icons (still unused). 2015-05-08 23:24:01 -07:00
Albert Vaca
f82c9c08cf Added icons to plugins (still unused). 2015-05-08 23:24:01 -07:00
Albert Vaca
25e1505df0 New interface for plugins 2015-05-08 23:23:36 -07:00
Albert Vaca
4d65382fa1 Moved icons from drawable to drawable-mdpi. We don't use drawable anymore. 2015-05-08 23:22:52 -07:00
Albert Vaca
bf02f639b7 Unpair if something goes wrong while loading a remembered device 2015-05-08 23:20:23 -07:00
Albert Vaca Cintora
067f01134a Added readme file. 2015-05-08 23:20:14 -07:00
l10n daemon script
7e2df27adb SVN_SILENT made messages (after extraction) 2015-04-14 02:47:49 +00:00
Albert Vaca
45bbed6d72 Increased version number to release 2015-04-11 23:53:24 -07:00
Albert Vaca
42f2f425a1 Commented out sendIcons logic until we fix the incomplete file transfers. 2015-04-11 23:53:24 -07:00
Albert Vaca
801c7cbd45 Default priority is not enough to intercept SMS with some apps.
Trying raising it to 500 (maximum is 999).

BUG: 342215
2015-04-11 23:53:24 -07:00
Albert Vaca
366aaea282 Removed unused styles.xml 2015-04-11 23:53:23 -07:00
Albert Vaca
02f5ce2581 Using setSoTimeout instead of implementing the timeout ourselves 2015-04-11 23:53:23 -07:00
l10n daemon script
a360ca0a01 SVN_SILENT made messages (after extraction) 2015-04-12 02:27:37 +00:00
l10n daemon script
d356a9e964 SVN_SILENT made messages (after extraction) 2015-04-08 02:03:18 +00:00
l10n daemon script
e588428812 SVN_SILENT made messages (after extraction) 2015-04-07 02:32:08 +00:00
l10n daemon script
db0f6288ff SVN_SILENT made messages (after extraction) 2015-04-06 02:03:40 +00:00
Albert Vaca
86236169d1 Increase version to release 2015-04-04 18:20:57 -07:00
Albert Vaca
32d9f199ff Let's flush this socket just in case 2015-04-04 18:08:53 -07:00
Albert Vaca
1d51c8792d Do not disconnect the devices when refreshing the listeners
This caused the devices to flicker in the main activity
2015-04-04 17:09:38 -07:00
Albert Vaca
6124b9a206 Minor changes trying to debug discovery issue reported by Aleix on the list 2015-04-04 17:08:26 -07:00
Albert Vaca
c3ad265490 Fixed crash 2015-04-04 14:41:22 -07:00
Albert Vaca
9cf9f43118 Fixes some potential null pointer exceptions reported by Coverity 2015-04-04 14:29:20 -07:00
Albert Vaca
11012e21e5 Added a different notification message for failed file transfers 2015-04-04 14:29:16 -07:00
Albert Vaca
b7faa97292 Handle closing some resources that we were missing to close 2015-04-04 14:29:11 -07:00
Albert Vaca
cc17402609 Fixed NioSocketConnector being kept open after every connection received
And other fixes in the LanLinkProvider
2015-04-04 12:55:52 -07:00
Albert Vaca
a0b82d17b4 Added some logging to help debugging an issue, now commented for future use
Also we prepend KDE/ to these logs to ease filtering them
2015-04-04 11:37:12 -07:00
Albert Vaca
8550de5e7f Coding style 2015-04-04 10:43:49 -07:00
Albert Vaca
46c70639ac Only unpair when receiving unknown packages if I'm not requesting pairing
In case the other device thinks we are paired and answers my identity
packet with unexpected stuff.
2015-03-30 23:26:57 -07:00
l10n daemon script
fb2b1232fb SVN_SILENT made messages (after extraction) 2015-03-31 02:22:21 +00:00
l10n daemon script
c2011831a9 SVN_SILENT made messages (after extraction) 2015-03-30 02:06:46 +00:00
l10n daemon script
ac3ab375ab SVN_SILENT made messages (after extraction) 2015-03-21 02:14:46 +00:00
Albert Vaca
ab4a1079cc Increased version number to release 2015-03-15 17:52:25 -07:00
Albert Vaca
57871802d8 Only try to mount the root of the phone if we have read access to it
BUG: 336043
2015-03-15 17:52:25 -07:00
Albert Vaca
838be381c3 Establishing connection only worked one way (bug introduced in 459fe40) 2015-03-15 16:58:28 -07:00
l10n daemon script
53ad94ef32 SVN_SILENT made messages (after extraction) 2015-03-14 02:09:03 +00:00
119 changed files with 2050 additions and 843 deletions

View File

@@ -1,11 +1,11 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android" <manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="org.kde.kdeconnect_tp" package="org.kde.kdeconnect_tp"
android:versionCode="804" android:versionCode="808"
android:versionName="0.8d"> android:versionName="0.8h">
<uses-sdk android:minSdkVersion="9" <uses-sdk android:minSdkVersion="9"
android:targetSdkVersion="21" /> android:targetSdkVersion="22" />
<supports-screens <supports-screens
android:smallScreens="true" android:smallScreens="true"
@@ -32,6 +32,7 @@
android:allowBackup="true" android:allowBackup="true"
android:icon="@drawable/icon" android:icon="@drawable/icon"
android:label="KDE Connect" android:label="KDE Connect"
android:theme="@style/KdeConnectTheme"
> >
<service <service
@@ -40,7 +41,6 @@
</service> </service>
<activity <activity
android:theme="@style/Theme.AppCompat"
android:name="org.kde.kdeconnect.UserInterface.MainActivity" android:name="org.kde.kdeconnect.UserInterface.MainActivity"
android:label="KDE Connect" > android:label="KDE Connect" >
@@ -60,7 +60,6 @@
</activity> </activity>
<activity <activity
android:theme="@style/Theme.AppCompat"
android:name="org.kde.kdeconnect.UserInterface.DeviceActivity" android:name="org.kde.kdeconnect.UserInterface.DeviceActivity"
android:label="@string/device" android:label="@string/device"
android:parentActivityName="org.kde.kdeconnect.UserInterface.MainActivity" android:parentActivityName="org.kde.kdeconnect.UserInterface.MainActivity"
@@ -70,7 +69,6 @@
</activity> </activity>
<activity <activity
android:theme="@style/Theme.AppCompat"
android:name="org.kde.kdeconnect.UserInterface.PairActivity" android:name="org.kde.kdeconnect.UserInterface.PairActivity"
android:label="@string/pair_device" android:label="@string/pair_device"
android:parentActivityName="org.kde.kdeconnect.UserInterface.MainActivity" android:parentActivityName="org.kde.kdeconnect.UserInterface.MainActivity"
@@ -136,7 +134,6 @@
<!-- Plugin-related activities and services --> <!-- Plugin-related activities and services -->
<activity <activity
android:theme="@style/Theme.AppCompat"
android:name="org.kde.kdeconnect.Plugins.MprisPlugin.MprisActivity" android:name="org.kde.kdeconnect.Plugins.MprisPlugin.MprisActivity"
android:label="@string/remote_control" android:label="@string/remote_control"
android:parentActivityName="org.kde.kdeconnect.UserInterface.DeviceActivity" android:parentActivityName="org.kde.kdeconnect.UserInterface.DeviceActivity"
@@ -146,7 +143,6 @@
</activity> </activity>
<activity <activity
android:theme="@style/Theme.AppCompat"
android:name="org.kde.kdeconnect.Plugins.MousePadPlugin.MousePadActivity" android:name="org.kde.kdeconnect.Plugins.MousePadPlugin.MousePadActivity"
android:label="@string/remote_control" android:label="@string/remote_control"
android:windowSoftInputMode="stateHidden|adjustResize" android:windowSoftInputMode="stateHidden|adjustResize"
@@ -159,7 +155,6 @@
</activity> </activity>
<activity <activity
android:theme="@style/Theme.AppCompat"
android:name="org.kde.kdeconnect.Plugins.SharePlugin.ShareActivity" android:name="org.kde.kdeconnect.Plugins.SharePlugin.ShareActivity"
android:label="KDE Connect" android:label="KDE Connect"
> >
@@ -185,7 +180,6 @@
<activity <activity
android:name="org.kde.kdeconnect.Plugins.NotificationsPlugin.NotificationFilterActivity" android:name="org.kde.kdeconnect.Plugins.NotificationsPlugin.NotificationFilterActivity"
android:label="@string/title_activity_notification_filter" android:label="@string/title_activity_notification_filter"
android:theme="@style/Theme.AppCompat"
android:parentActivityName="org.kde.kdeconnect.UserInterface.PluginSettingsActivity" > android:parentActivityName="org.kde.kdeconnect.UserInterface.PluginSettingsActivity" >
<meta-data <meta-data
android:name="android.support.PARENT_ACTIVITY" android:name="android.support.PARENT_ACTIVITY"

25
README.md Normal file
View 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/).

View File

@@ -3,18 +3,18 @@ buildscript {
jcenter() jcenter()
} }
dependencies { dependencies {
classpath 'com.android.tools.build:gradle:1.0.+' classpath 'com.android.tools.build:gradle:1.1.0'
} }
} }
apply plugin: 'com.android.application' apply plugin: 'com.android.application'
android { android {
compileSdkVersion 21 compileSdkVersion 22
buildToolsVersion '21.1.2' buildToolsVersion '22.0.1'
defaultConfig { defaultConfig {
minSdkVersion 9 minSdkVersion 9
targetSdkVersion 21 targetSdkVersion 22
} }
sourceSets { sourceSets {
main { main {
@@ -24,19 +24,24 @@ android {
res.srcDirs = ['res'] res.srcDirs = ['res']
assets.srcDirs = ['assets'] assets.srcDirs = ['assets']
} }
androidTest {
java.srcDirs = ['tests']
}
} }
packagingOptions { packagingOptions {
exclude "META-INF/DEPENDENCIES" pickFirst "META-INF/DEPENDENCIES"
exclude "META-INF/NOTICE" pickFirst "META-INF/LICENSE"
exclude "META-INF/LICENSE" pickFirst "META-INF/NOTICE"
exclude "META-INF/LICENSE.txt"
exclude "META-INF/NOTICE.txt"
} }
lintOptions { lintOptions {
abortOnError false abortOnError false
checkReleaseBuilds false checkReleaseBuilds false
} }
buildTypes { buildTypes {
release {
minifyEnabled true
proguardFiles getDefaultProguardFile('proguard-android.txt'),'proguard-rules.pro'
}
} }
} }
@@ -44,11 +49,18 @@ dependencies {
repositories { repositories {
mavenCentral() mavenCentral()
} }
compile 'com.android.support:support-v4:21.0.3' compile 'com.android.support:support-v4:22.2.0'
compile 'com.android.support:appcompat-v7:21.0.3' compile 'com.android.support:appcompat-v7:22.2.0'
compile 'org.apache.mina:mina-core:2.0.9' compile 'org.apache.mina:mina-core:2.0.9'
compile 'org.apache.sshd:sshd-core:0.8.0' compile 'org.apache.sshd:sshd-core:0.8.0'
compile 'org.bouncycastle:bcprov-jdk16:1.46' 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') //compile fileTree(dir: 'libs', include: '*.jar')
} }

28
proguard-rules.pro vendored Normal file
View 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.**

Binary file not shown.

After

Width:  |  Height:  |  Size: 627 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 671 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 560 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 561 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 444 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 456 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 477 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 441 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.0 KiB

View File

Before

Width:  |  Height:  |  Size: 431 B

After

Width:  |  Height:  |  Size: 431 B

View File

Before

Width:  |  Height:  |  Size: 750 B

After

Width:  |  Height:  |  Size: 750 B

View File

Before

Width:  |  Height:  |  Size: 365 B

After

Width:  |  Height:  |  Size: 365 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 377 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 385 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 402 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 423 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 304 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 299 B

View File

Before

Width:  |  Height:  |  Size: 1.0 KiB

After

Width:  |  Height:  |  Size: 1.0 KiB

View File

Before

Width:  |  Height:  |  Size: 3.0 KiB

After

Width:  |  Height:  |  Size: 3.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 311 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 373 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 841 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 790 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 839 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 693 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 733 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 611 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 623 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 667 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 684 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 843 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 873 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 686 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 KiB

View File

@@ -10,14 +10,11 @@
<string name="pref_plugin_clipboard_desc">شارك محتوى الحافظة</string> <string name="pref_plugin_clipboard_desc">شارك محتوى الحافظة</string>
<string name="pref_plugin_mousepad">الدَّخل البعيد</string> <string name="pref_plugin_mousepad">الدَّخل البعيد</string>
<string name="pref_plugin_mousepad_desc">استخدم هاتفك كفأرة ولوحة مفاتيح</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_mpris_desc">تحكّم بالصّوت والصّورة من هاتفك</string>
<string name="pref_plugin_ping">وخزة</string> <string name="pref_plugin_ping">وخزة</string>
<string name="pref_plugin_ping_desc">أرسل واستقبل وخزات</string> <string name="pref_plugin_ping_desc">أرسل واستقبل وخزات</string>
<string name="pref_plugin_notifications">مزامنة الإخطارات</string> <string name="pref_plugin_notifications">مزامنة الإخطارات</string>
<string name="pref_plugin_notifications_desc">انفذ إلى إخطاراتك من أجهزة أخرى</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="plugin_not_available">هذه الميزة غير متوفّرة في إصدار أندرويد لديك</string>
<string name="device_list_empty">لا أجهزة</string> <string name="device_list_empty">لا أجهزة</string>
<string name="ok">حسنًا</string> <string name="ok">حسنًا</string>
@@ -25,8 +22,6 @@
<string name="open_settings">افتح الإعدادات</string> <string name="open_settings">افتح الإعدادات</string>
<string name="no_permissions">عليك إعطاء التّطبيق صلاحيّات للنّفاذ إلى الإخطارات</string> <string name="no_permissions">عليك إعطاء التّطبيق صلاحيّات للنّفاذ إلى الإخطارات</string>
<string name="send_ping">أرسل وخزة</string> <string name="send_ping">أرسل وخزة</string>
<string name="open_mpris_controls">افتح التّحكّم البعيد</string>
<string name="open_mousepad">افتح تحكّم لوحة اللمس</string>
<string-array name="mousepad_tap_entries"> <string-array name="mousepad_tap_entries">
<item/> <item/>
<item/> <item/>

View File

@@ -8,7 +8,6 @@
<string name="pref_plugin_sftp_desc">Позволява отдалечен достъп до файловата система на телефона</string> <string name="pref_plugin_sftp_desc">Позволява отдалечен достъп до файловата система на телефона</string>
<string name="pref_plugin_clipboard">Синхронизиране на буфера</string> <string name="pref_plugin_clipboard">Синхронизиране на буфера</string>
<string name="pref_plugin_clipboard_desc">Споделяне съдържанието на буфера</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_mpris_desc">Управление на звук/видео от телефона</string>
<string name="pref_plugin_ping">Пинг</string> <string name="pref_plugin_ping">Пинг</string>
<string name="pref_plugin_ping_desc">Изпращане и получаване на пинг</string> <string name="pref_plugin_ping_desc">Изпращане и получаване на пинг</string>
@@ -21,7 +20,6 @@
<string name="open_settings">Отваряне на настройките</string> <string name="open_settings">Отваряне на настройките</string>
<string name="no_permissions">Трябва да осигурите права за достъп до уведомленията</string> <string name="no_permissions">Трябва да осигурите права за достъп до уведомленията</string>
<string name="send_ping">Изпращане на пинг</string> <string name="send_ping">Изпращане на пинг</string>
<string name="open_mpris_controls">Отваряне на отдалечен контрол</string>
<string-array name="mousepad_tap_entries"> <string-array name="mousepad_tap_entries">
<item>Right click</item> <item>Right click</item>
<item>Middle click</item> <item>Middle click</item>

View File

@@ -10,14 +10,11 @@
<string name="pref_plugin_clipboard_desc">Podijeli sadržaj sandučića</string> <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">Daljinska kontrola ulaza</string>
<string name="pref_plugin_mousepad_desc">Koristi telofon kao miš i tastaturu</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_mpris_desc">Upravljajte zvukom/slikom sa vašeg telefona</string>
<string name="pref_plugin_ping">Ping</string> <string name="pref_plugin_ping">Ping</string>
<string name="pref_plugin_ping_desc">Šalji i primaj ping-ove</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">Sinhronizovano obavještenje</string>
<string name="pref_plugin_notifications_desc">Pristupite vašim notifikacijama sa drugog uređaja</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="plugin_not_available">Ovo svojstvo nije dostupno i vašoj Android verziji</string>
<string name="device_list_empty">Nema uređaja</string> <string name="device_list_empty">Nema uređaja</string>
<string name="ok">OK</string> <string name="ok">OK</string>
@@ -25,8 +22,6 @@
<string name="open_settings">Otvori postavke</string> <string name="open_settings">Otvori postavke</string>
<string name="no_permissions">Morate odobriti dopuštenje da pristupite notifikacijama</string> <string name="no_permissions">Morate odobriti dopuštenje da pristupite notifikacijama</string>
<string name="send_ping">Pošalji ping</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_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_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> <string name="mousepad_triple_tap_settings_title">Postavite akciju tapa sa tri prsta</string>

View File

@@ -10,14 +10,14 @@
<string name="pref_plugin_clipboard_desc">Comparteix el contingut del porta-retalls</string> <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">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_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_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">Ping</string>
<string name="pref_plugin_ping_desc">Envia i rep els pings</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">Sincronitza les notificacions</string>
<string name="pref_plugin_notifications_desc">Accedeix a les vostres notificacions des d\'altres dispositius</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">Comparteix i rep</string>
<string name="pref_plugin_sharereceiver_desc">Desa els fitxers entrants a l\'emmagatzematge del telèfon</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="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="device_list_empty">No hi ha cap dispositiu</string>
<string name="ok">D\'acord</string> <string name="ok">D\'acord</string>
@@ -25,8 +25,8 @@
<string name="open_settings">Obre l\'arranjament</string> <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="no_permissions">Us caldrà concedir permís per accedir a les notificacions</string>
<string name="send_ping">Envia un ping</string> <string name="send_ping">Envia un ping</string>
<string name="open_mpris_controls">Obre el comandament a distància</string> <string name="open_mpris_controls">Control multimèdia</string>
<string name="open_mousepad">Obre el control pel plafó tàctil</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_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_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> <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_title">S\'està enviant el fitxer a %1s</string>
<string name="outgoing_file_text">%1s</string> <string name="outgoing_file_text">%1s</string>
<string name="received_file_title">Fitxer rebut des de %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="received_file_text">Puntegeu per obrir «%1s»</string>
<string name="sent_file_title">Envia el fitxer a %1s</string> <string name="sent_file_title">Envia el fitxer a %1s</string>
<string name="sent_file_text">%1s</string> <string name="sent_file_text">%1s</string>

View File

@@ -10,14 +10,14 @@
<string name="pref_plugin_clipboard_desc">Sdílet obsah schránky</string> <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">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_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_mpris_desc">Ovládejte audio/video z vašeho telefonu</string>
<string name="pref_plugin_ping">Ping</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_ping_desc">Posílat a přijímat ping</string>
<string name="pref_plugin_notifications">Synchronizace upozornění</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_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">Sdílet s přijmnout</string>
<string name="pref_plugin_sharereceiver_desc">Ukládat příchozí soubory do úložiště telefonu</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="plugin_not_available">Tato vlastnost není pro vaši verzi Androidu platná</string>
<string name="device_list_empty">Žádná zařízení</string> <string name="device_list_empty">Žádná zařízení</string>
<string name="ok">OK</string> <string name="ok">OK</string>
@@ -25,8 +25,8 @@
<string name="open_settings">Otevřít nastavení</string> <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="no_permissions">Pro zpřístupnění upozornění potřebujete oprávnění</string>
<string name="send_ping">Poslat ping</string> <string name="send_ping">Poslat ping</string>
<string name="open_mpris_controls">Otevřít vzdálené ovládání</string> <string name="open_mpris_controls">Ovládání multimédií</string>
<string name="open_mousepad">Otevřít dotykové ovládání</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_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_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> <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_title">Odesílám soubor do %1s</string>
<string name="outgoing_file_text">%1s</string> <string name="outgoing_file_text">%1s</string>
<string name="received_file_title">Přijat soubor od %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="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_title">Soubor byl odeslán do %1s</string>
<string name="sent_file_text">%1s</string> <string name="sent_file_text">%1s</string>

View File

@@ -10,14 +10,11 @@
<string name="pref_plugin_clipboard_desc">Del indholdet af udklipsholderen</string> <string name="pref_plugin_clipboard_desc">Del indholdet af udklipsholderen</string>
<string name="pref_plugin_mousepad">Eksternt input</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_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_mpris_desc">Styr lyd og video fra din telefon</string>
<string name="pref_plugin_ping">Ping</string> <string name="pref_plugin_ping">Ping</string>
<string name="pref_plugin_ping_desc">Send og modtag 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">Synk. af bekendtgørelser</string>
<string name="pref_plugin_notifications_desc">Tilgå dine bekendtgørelser fra andre enheder</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="plugin_not_available">Denne funktion er ikke tilgængelig i din Android-version</string>
<string name="device_list_empty">Ingen enheder</string> <string name="device_list_empty">Ingen enheder</string>
<string name="ok">O.k.</string> <string name="ok">O.k.</string>
@@ -25,8 +22,6 @@
<string name="open_settings">Åbn indstillinger</string> <string name="open_settings">Åbn indstillinger</string>
<string name="no_permissions">Du skal give tilladelse for at tilgå bekendtgørelser</string> <string name="no_permissions">Du skal give tilladelse for at tilgå bekendtgørelser</string>
<string name="send_ping">Send ping</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_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_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> <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_title">Sender fil til %1s</string>
<string name="outgoing_file_text">%1s</string> <string name="outgoing_file_text">%1s</string>
<string name="received_file_title">Modtog fil fra %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="received_file_text">Tap for at åbne \"%1s\"</string>
<string name="sent_file_title">Fil sendt til %1s</string> <string name="sent_file_title">Fil sendt til %1s</string>
<string name="sent_file_text">%1s</string> <string name="sent_file_text">%1s</string>

View File

@@ -8,13 +8,12 @@
<string name="pref_plugin_sftp_desc">Erlaubt das Browsen des Dateisystems auf dem entfernten Handy</string> <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">Abgleich der Zwischenablage</string>
<string name="pref_plugin_clipboard_desc">Inhalt der Zwischenablage freigeben</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_mpris_desc">Audio und Video mit Ihrem Telefon steuern</string>
<string name="pref_plugin_ping">Ping</string> <string name="pref_plugin_ping">Ping</string>
<string name="pref_plugin_ping_desc">Senden und Empfangen von Pings</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">Benachrichtigungs-Abgleich</string>
<string name="pref_plugin_notifications_desc">Zugriff auf Ihre Benachrichtigungen von anderen Geräten</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="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="device_list_empty">Keine Geräte</string>
<string name="ok">OK</string> <string name="ok">OK</string>
@@ -22,8 +21,6 @@
<string name="open_settings">Einstellungen öffnen</string> <string name="open_settings">Einstellungen öffnen</string>
<string name="no_permissions">Sie müssen die Erlaubnis zum Zugriff auf Benachrichtigungen erteilen</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="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"> <string-array name="mousepad_tap_entries">
<item>Rechtsklick</item> <item>Rechtsklick</item>
<item>Mittelklick</item> <item>Mittelklick</item>
@@ -52,7 +49,13 @@
<string name="received_url_title">Verknüpfung von %1s erhalten</string> <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_title">Eingehende Datei von %1s</string>
<string name="incoming_file_text">%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="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="tap_to_answer">Tippen zum Antworten</string>
<string name="reconnect">Erneut verbinden</string> <string name="reconnect">Erneut verbinden</string>
<string name="right_click">Rechtsklick senden</string> <string name="right_click">Rechtsklick senden</string>
@@ -91,7 +94,9 @@
<string name="invalid_device_name">Ungültiger Gerätename</string> <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="shareplugin_text_saved">Text empfangen und in der Zwischenablage gespeichert</string>
<string name="custom_devices_settings">Benutzerdefinierte Geräteliste</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="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_internal_storage">Interner Speicher</string>
<string name="sftp_all_files">Alle Dateien</string> <string name="sftp_all_files">Alle Dateien</string>
<string name="sftp_sdcard_num">SD-Karte %d</string> <string name="sftp_sdcard_num">SD-Karte %d</string>
@@ -99,5 +104,6 @@
<string name="sftp_readonly">(Nur lesen)</string> <string name="sftp_readonly">(Nur lesen)</string>
<string name="sftp_camera">Kamerabilder</string> <string name="sftp_camera">Kamerabilder</string>
<string name="add_host">Rechner/IP hinzufügen</string> <string name="add_host">Rechner/IP hinzufügen</string>
<string name="add_host_hint">Rechnername oder IP</string>
<string name="mpris_player_on_device">%1$s auf %2$s</string> <string name="mpris_player_on_device">%1$s auf %2$s</string>
</resources> </resources>

View File

@@ -10,14 +10,11 @@
<string name="pref_plugin_clipboard_desc">Compartir el contenido del portapapeles</string> <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">Entrada remota</string>
<string name="pref_plugin_mousepad_desc">Usar su teléfono como ratón y teclado</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_mpris_desc">Controlar audio y vídeo desde el teléfono</string>
<string name="pref_plugin_ping">Ping</string> <string name="pref_plugin_ping">Ping</string>
<string name="pref_plugin_ping_desc">Enviar y recibir pings</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">Sincronizar notificaciones</string>
<string name="pref_plugin_notifications_desc">Acceder a las notificaciones desde otros dispositivos</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="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="device_list_empty">Ningún dispositivo</string>
<string name="ok">Aceptar</string> <string name="ok">Aceptar</string>
@@ -25,8 +22,6 @@
<string name="open_settings">Abrir preferencias</string> <string name="open_settings">Abrir preferencias</string>
<string name="no_permissions">Debe otorgar permiso para acceder a las notificaciones</string> <string name="no_permissions">Debe otorgar permiso para acceder a las notificaciones</string>
<string name="send_ping">Enviar ping</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_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_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> <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_title">Enviando archivo a %1s</string>
<string name="outgoing_file_text">%1s</string> <string name="outgoing_file_text">%1s</string>
<string name="received_file_title">Archivo recibido desde %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="received_file_text">Pulse para abrir «%1s»</string>
<string name="sent_file_title">Archivo enviado a %1s</string> <string name="sent_file_title">Archivo enviado a %1s</string>
<string name="sent_file_text">%1s</string> <string name="sent_file_text">%1s</string>

View File

@@ -10,14 +10,11 @@
<string name="pref_plugin_clipboard_desc">Jaa leikepöydän sisältö</string> <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">Kauko-ohjaus</string>
<string name="pref_plugin_mousepad_desc">Käytä puhelintasi hiirenä ja näppäimistönä</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_mpris_desc">Ohjaa ääntä ja videota puhelimestasi</string>
<string name="pref_plugin_ping">Tiedustelupaketti</string> <string name="pref_plugin_ping">Tiedustelupaketti</string>
<string name="pref_plugin_ping_desc">Lähetä ja vastaanota tiedustelupaketteja</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">Ilmoitusten synkronointi</string>
<string name="pref_plugin_notifications_desc">Näe ilmoituksesi muissa laitteissa</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="plugin_not_available">Piirre ei ole käytettävissä Android-versiossasi</string>
<string name="device_list_empty">Ei laitteita</string> <string name="device_list_empty">Ei laitteita</string>
<string name="ok">OK</string> <string name="ok">OK</string>
@@ -25,8 +22,6 @@
<string name="open_settings">Avaa asetukset</string> <string name="open_settings">Avaa asetukset</string>
<string name="no_permissions">Sinun on annettava lupa ilmoitusten näkemiseen</string> <string name="no_permissions">Sinun on annettava lupa ilmoitusten näkemiseen</string>
<string name="send_ping">Lähetä tiedustelupaketti</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_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_double_tap_settings_title">Aseta kahden sormen napautuksen toiminto</string>
<string name="mousepad_triple_tap_settings_title">Aseta kolmen 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_title">Lähetetään tiedostoa laitteeseen %1s</string>
<string name="outgoing_file_text">%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_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="received_file_text">Avaa ”%1s” napauttamalla</string>
<string name="sent_file_title">Tiedosto lähetetty laitteeseen %1s</string> <string name="sent_file_title">Tiedosto lähetetty laitteeseen %1s</string>
<string name="sent_file_text">%1s</string> <string name="sent_file_text">%1s</string>

View File

@@ -10,14 +10,11 @@
<string name="pref_plugin_clipboard_desc">Partage le contenu du presse-papiers</string> <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">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_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_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">Commande « Ping »</string>
<string name="pref_plugin_ping_desc">Envoie et reçoit des commandes « 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">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_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="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="device_list_empty">Pas de périphériques</string>
<string name="ok">Ok</string> <string name="ok">Ok</string>
@@ -25,8 +22,6 @@
<string name="open_settings">Accéder aux paramètres</string> <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="no_permissions">Vous devez accorder la permission d\'accéder aux notifications</string>
<string name="send_ping">Envoyer un « Ping »</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_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_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> <string name="mousepad_triple_tap_settings_title">Action pour l\'appui à trois doigts</string>

59
res/values-gl/strings.xml Normal file
View 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>

View File

@@ -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_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">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_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_mpris_desc">Hang vagy videó vezérlése a telefonról</string>
<string name="pref_plugin_ping">Ping</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_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">É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_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="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="device_list_empty">Nincsenek eszközök</string>
<string name="ok">OK</string> <string name="ok">OK</string>
@@ -23,8 +20,6 @@
<string name="open_settings">Beállítások megnyitása</string> <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="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="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"> <string-array name="mousepad_tap_entries">
<item/> <item/>
<item/> <item/>

View File

@@ -10,14 +10,11 @@
<string name="pref_plugin_clipboard_desc">Condividi il contenuto degli appunti</string> <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">Impulso remoto</string>
<string name="pref_plugin_mousepad_desc">Usa il tuo telefono come mouse e tastiera</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_mpris_desc">Controlla la riproduzione audio/video dal telefono</string>
<string name="pref_plugin_ping">Ping</string> <string name="pref_plugin_ping">Ping</string>
<string name="pref_plugin_ping_desc">Invia e ricevi 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">Sincronizzazione notifiche</string>
<string name="pref_plugin_notifications_desc">Consenti l\'accesso alle notifiche dagli altri dispositivi</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="plugin_not_available">Questa funzionalità non è disponibile sulla tua versione di Android</string>
<string name="device_list_empty">Nessun dispositivo</string> <string name="device_list_empty">Nessun dispositivo</string>
<string name="ok">OK</string> <string name="ok">OK</string>
@@ -25,8 +22,6 @@
<string name="open_settings">Apri impostazioni</string> <string name="open_settings">Apri impostazioni</string>
<string name="no_permissions">Devi concedere i permessi per l\'accesso alle notifiche</string> <string name="no_permissions">Devi concedere i permessi per l\'accesso alle notifiche</string>
<string name="send_ping">Invia ping</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_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_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> <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_title">Invio file a %1s</string>
<string name="outgoing_file_text">%1s</string> <string name="outgoing_file_text">%1s</string>
<string name="received_file_title">File ricevuto da %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="received_file_text">Tocca per aprire «%1s»</string>
<string name="sent_file_title">File inviato a %1s</string> <string name="sent_file_title">File inviato a %1s</string>
<string name="sent_file_text">%1s</string> <string name="sent_file_text">%1s</string>

View File

@@ -10,14 +10,11 @@
<string name="pref_plugin_clipboard_desc">클립보드 내용 동기화</string> <string name="pref_plugin_clipboard_desc">클립보드 내용 동기화</string>
<string name="pref_plugin_mousepad">원격 입력</string> <string name="pref_plugin_mousepad">원격 입력</string>
<string name="pref_plugin_mousepad_desc">내 장치를 마우스와 키보드로 사용하기</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_mpris_desc">휴대폰에서 오디오/비디오 제어</string>
<string name="pref_plugin_ping"></string> <string name="pref_plugin_ping"></string>
<string name="pref_plugin_ping_desc">핑 보내고 받기</string> <string name="pref_plugin_ping_desc">핑 보내고 받기</string>
<string name="pref_plugin_notifications">알림 동기화</string> <string name="pref_plugin_notifications">알림 동기화</string>
<string name="pref_plugin_notifications_desc">다른 장치에서 알림 보기</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="plugin_not_available">현재 안드로이드 버전에서 사용할 수 없습니다</string>
<string name="device_list_empty">장치 없음</string> <string name="device_list_empty">장치 없음</string>
<string name="ok">확인</string> <string name="ok">확인</string>
@@ -25,8 +22,6 @@
<string name="open_settings">설정 열기</string> <string name="open_settings">설정 열기</string>
<string name="no_permissions">알림 접근 권한을 허가해야 합니다</string> <string name="no_permissions">알림 접근 권한을 허가해야 합니다</string>
<string name="send_ping">핑 보내기</string> <string name="send_ping">핑 보내기</string>
<string name="open_mpris_controls">원격 제어 열기</string>
<string name="open_mousepad">터치패드 제어 열기</string>
<string-array name="mousepad_tap_entries"> <string-array name="mousepad_tap_entries">
<item/> <item/>
<item/> <item/>

View File

@@ -10,14 +10,14 @@
<string name="pref_plugin_clipboard_desc">De inhoud van het klembord delen</string> <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">Invoer op afstand</string>
<string name="pref_plugin_mousepad_desc">Uw telefoon gebruiken als een muis en toetsenbord</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_mpris_desc">Bedien de audio/video vanaf uw telefoon</string>
<string name="pref_plugin_ping">Ping</string> <string name="pref_plugin_ping">Ping</string>
<string name="pref_plugin_ping_desc">Pings verzenden en ontvangen</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">Synchronisatie van meldingen</string>
<string name="pref_plugin_notifications_desc">Bekijk uw meldingen van andere apparaten</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">Delen en Ontvangen</string>
<string name="pref_plugin_sharereceiver_desc">Inkomende bestanden opslaan naar de opslag van de telefoon</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="plugin_not_available">Deze functie is niet beschikbaar in uw versie van Android</string>
<string name="device_list_empty">Geen apparaten</string> <string name="device_list_empty">Geen apparaten</string>
<string name="ok">OK</string> <string name="ok">OK</string>
@@ -25,8 +25,8 @@
<string name="open_settings">Instellingen openen</string> <string name="open_settings">Instellingen openen</string>
<string name="no_permissions">U moet toestemming geven voor toegang tot meldingen</string> <string name="no_permissions">U moet toestemming geven voor toegang tot meldingen</string>
<string name="send_ping">Ping verzenden</string> <string name="send_ping">Ping verzenden</string>
<string name="open_mpris_controls">Afstandsbediening openen</string> <string name="open_mpris_controls">Bediening van multimedia</string>
<string name="open_mousepad">Afstandsbediening van touchpad openen</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_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_double_tap_settings_title">Tikactie met twee vingers instellen</string>
<string name="mousepad_triple_tap_settings_title">Tikactie met drie 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_title">Bezig bestand te verzenden naar %1s</string>
<string name="outgoing_file_text">%1s</string> <string name="outgoing_file_text">%1s</string>
<string name="received_file_title">Bestand ontvangen van %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="received_file_text">Tap om \'%1s\' te openen</string>
<string name="sent_file_title">Bestand verzonden naar %1s</string> <string name="sent_file_title">Bestand verzonden naar %1s</string>
<string name="sent_file_text">%1s</string> <string name="sent_file_text">%1s</string>

View File

@@ -10,14 +10,14 @@
<string name="pref_plugin_clipboard_desc">Udostępnij zawartość schowka</string> <string name="pref_plugin_clipboard_desc">Udostępnij zawartość schowka</string>
<string name="pref_plugin_mousepad">Zdalne sterowanie</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_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_mpris_desc">Steruj dźwiękiem/obrazem ze swojego telefonu</string>
<string name="pref_plugin_ping">Ping</string> <string name="pref_plugin_ping">Ping</string>
<string name="pref_plugin_ping_desc">Wysyłaj i otrzymuj pingi</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">Powiadomienia synchronizacji</string>
<string name="pref_plugin_notifications_desc">Uzyskaj dostęp do swoich powiadomień z innego urządzenia</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">Udostępniaj i otrzymuj</string>
<string name="pref_plugin_sharereceiver_desc">Zapisz przychodzące pliki do pamięci telefonu</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="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="device_list_empty">Brak urządzeń</string>
<string name="ok">OK</string> <string name="ok">OK</string>
@@ -25,8 +25,8 @@
<string name="open_settings">Otwórz ustawienia</string> <string name="open_settings">Otwórz ustawienia</string>
<string name="no_permissions">Musisz przydzielić uprawnienia, aby uzyskać dostęp do powiadomień</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="send_ping">Wyślij ping</string>
<string name="open_mpris_controls">Otwórz zdalne sterowanie</string> <string name="open_mpris_controls">Sterowanie multimediami</string>
<string name="open_mousepad">Otwórz sterowanie gładzikiem</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_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_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> <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_title">Wysyłanie pliku do %1s</string>
<string name="outgoing_file_text">%1s</string> <string name="outgoing_file_text">%1s</string>
<string name="received_file_title">Odebrano plik od %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="received_file_text">Znacznik do otwarcia \'%1s\'</string>
<string name="sent_file_title">Plik wysłano do %1s</string> <string name="sent_file_title">Plik wysłano do %1s</string>
<string name="sent_file_text">%1s</string> <string name="sent_file_text">%1s</string>

View File

@@ -10,14 +10,14 @@
<string name="pref_plugin_clipboard_desc">Compartilha o conteúdo da área de transferência</string> <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">Introdução de dados remota</string>
<string name="pref_plugin_mousepad_desc">Usar seu telefone como mouse ou teclado</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_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">Ping</string>
<string name="pref_plugin_ping_desc">Envia e recebe pings</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">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_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">Compartilhar e receber</string>
<string name="pref_plugin_sharereceiver_desc">Salvar os arquivos recebidos no armazenamento do celular</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="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="device_list_empty">Sem dispositivos</string>
<string name="ok">OK</string> <string name="ok">OK</string>
@@ -25,8 +25,8 @@
<string name="open_settings">Abrir configurações</string> <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="no_permissions">Você precisa conceder permissão para acessar as notificações</string>
<string name="send_ping">Enviar ping</string> <string name="send_ping">Enviar ping</string>
<string name="open_mpris_controls">Abra o controle remoto</string> <string name="open_mpris_controls">Controle multimídia</string>
<string name="open_mousepad">Abrir o controle do touchpad</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_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_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> <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_title">Enviando arquivo para %1s</string>
<string name="outgoing_file_text">%1s</string> <string name="outgoing_file_text">%1s</string>
<string name="received_file_title">Arquivo recebido de %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="received_file_text">Toque para abrir o \'%1s\'</string>
<string name="sent_file_title">Enviar arquivo para %1s</string> <string name="sent_file_title">Enviar arquivo para %1s</string>
<string name="sent_file_text">%1s</string> <string name="sent_file_text">%1s</string>

View File

@@ -10,14 +10,14 @@
<string name="pref_plugin_clipboard_desc">Partilhar o conteúdo da área de transferência</string> <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">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_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_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">Contacto</string>
<string name="pref_plugin_ping_desc">Enviar e receber pedidos de contacto (\'ping\')</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">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_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">Partilhar e receber</string>
<string name="pref_plugin_sharereceiver_desc">Gravar os ficheiros recebidos no armazenamento do telemóvel</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="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="device_list_empty">Sem dispositivos</string>
<string name="ok">OK</string> <string name="ok">OK</string>
@@ -25,8 +25,8 @@
<string name="open_settings">Abrir a configuração</string> <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="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="send_ping">Enviar um pedido de contacto</string>
<string name="open_mpris_controls">Abrir o comando à distância</string> <string name="open_mpris_controls">Comando multimédia</string>
<string name="open_mousepad">Abrir o controlo do painel do rato</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_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_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> <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_title">A enviar o ficheiro para o %1s</string>
<string name="outgoing_file_text">%1s</string> <string name="outgoing_file_text">%1s</string>
<string name="received_file_title">Ficheiro recebido de %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="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_title">O ficheiro foi enviado para %1s</string>
<string name="sent_file_text">%1s</string> <string name="sent_file_text">%1s</string>

View File

@@ -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_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">Sincronizare clipboard</string>
<string name="pref_plugin_clipboard_desc">Partajează conținutul clipboardului</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_mpris_desc">Controlați audio/video de pe telefon</string>
<string name="pref_plugin_ping">Ping</string> <string name="pref_plugin_ping">Ping</string>
<string name="pref_plugin_ping_desc">Trimite și primește ping-uri</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="open_settings">Deschide configurările</string>
<string name="no_permissions">Trebuie să acordați permisiunea pentru accesarea notificărilor</string> <string name="no_permissions">Trebuie să acordați permisiunea pentru accesarea notificărilor</string>
<string name="send_ping">Trimite ping</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"> <string-array name="mousepad_tap_entries">
<item>Right click</item> <item>Right click</item>
<item>Middle click</item> <item>Middle click</item>

View File

@@ -6,7 +6,6 @@
<string name="pref_plugin_battery_desc">Периодически сообщать о состоянии батареи</string> <string name="pref_plugin_battery_desc">Периодически сообщать о состоянии батареи</string>
<string name="pref_plugin_clipboard">Синхронизация буфера обмена</string> <string name="pref_plugin_clipboard">Синхронизация буфера обмена</string>
<string name="pref_plugin_clipboard_desc">Сделать содержимое буфера обмена общим</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_mpris_desc">Управление аудио/видео с устройства</string>
<string name="pref_plugin_ping">Пинг</string> <string name="pref_plugin_ping">Пинг</string>
<string name="pref_plugin_ping_desc">Посылать и получать пинги</string> <string name="pref_plugin_ping_desc">Посылать и получать пинги</string>
@@ -19,7 +18,6 @@
<string name="open_settings">Открыть настройки</string> <string name="open_settings">Открыть настройки</string>
<string name="no_permissions">Вы должны разрешить доступ к уведомлениям</string> <string name="no_permissions">Вы должны разрешить доступ к уведомлениям</string>
<string name="send_ping">Послать пинг</string> <string name="send_ping">Послать пинг</string>
<string name="open_mpris_controls">Открыть дистанционное управление</string>
<string-array name="mousepad_tap_entries"> <string-array name="mousepad_tap_entries">
<item>Right click</item> <item>Right click</item>
<item>Middle click</item> <item>Middle click</item>

View File

@@ -10,14 +10,11 @@
<string name="pref_plugin_clipboard_desc">Zdieľať obsah schránky</string> <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">Vzdialený vstup</string>
<string name="pref_plugin_mousepad_desc">Použiť váš telefón ako myš a klávesnicu</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_mpris_desc">Ovládať audio/video z vášho telefónu</string>
<string name="pref_plugin_ping">Ping</string> <string name="pref_plugin_ping">Ping</string>
<string name="pref_plugin_ping_desc">Poslať a prijať pingy</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">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_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="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="device_list_empty">Žiadne zariadenia</string>
<string name="ok">OK</string> <string name="ok">OK</string>
@@ -25,8 +22,7 @@
<string name="open_settings">Otvoriť nastavenia</string> <string name="open_settings">Otvoriť nastavenia</string>
<string name="no_permissions">Musíte povoliť oprávnenia na prístup k pripomienkam</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="send_ping">Poslať ping</string>
<string name="open_mpris_controls">Otvoriť diaľkové ovládanie</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="open_mousepad">Otvoriť ovládanie touchpadu</string>
<string name="mousepad_double_tap_settings_title">Nastaviť akciu dvoch prstov</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 name="mousepad_triple_tap_settings_title">Nastaviť akciu troch prstov</string>
<string-array name="mousepad_tap_entries"> <string-array name="mousepad_tap_entries">
@@ -58,10 +54,14 @@
<string name="received_url_text">Ťuknite na otvorenie \'%1s\'</string> <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_title">Prichádzajúci súbor od %s</string>
<string name="incoming_file_text">%1s</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="outgoing_file_text">%1s</string>
<string name="received_file_title">Prijatý súbor od %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="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_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="sent_file_failed_text">%1s</string>
<string name="tap_to_answer">Tapnite na odpoveď</string> <string name="tap_to_answer">Tapnite na odpoveď</string>
<string name="reconnect">Znovu pripojiť</string> <string name="reconnect">Znovu pripojiť</string>
@@ -83,6 +83,8 @@
<string name="mpris_next">Nasledovné</string> <string name="mpris_next">Nasledovné</string>
<string name="mpris_volume">Hlasitosť</string> <string name="mpris_volume">Hlasitosť</string>
<string name="mpris_settings">Multimediálne nastavenia</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"> <string-array name="mpris_time_entries">
<item>10 sekúnd</item> <item>10 sekúnd</item>
<item>20 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="custom_device_list">Pridať zariadenia podľa IP</string>
<string name="share_notification_preference">Hlučné pripomienky</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="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_internal_storage">Interné úložisko</string>
<string name="sftp_all_files">Všetky súbory</string> <string name="sftp_all_files">Všetky súbory</string>
<string name="sftp_sdcard_num">SD karta %d</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_readonly">(iba na čítanie)</string>
<string name="sftp_camera">Obrázky fotoaparátu</string> <string name="sftp_camera">Obrázky fotoaparátu</string>
<string name="add_host">Pridať hostiteľa/IP</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="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="custom_dev_list_help">Túto voľbu použite iba vtedy, ak vaše zariadenie nie je automaticky detekované. Zadajte IP adresu alebo názov hostiteľa nižšie a kliknite na tlačidlo na pridanie do zoznamu. Kliknite na existujúcu položku na odstránenie jej zo zoznamu.</string>
<string name="mpris_player_on_device">%1$s na %2$s</string> <string name="mpris_player_on_device">%1$s na %2$s</string>

View File

@@ -10,14 +10,14 @@
<string name="pref_plugin_clipboard_desc">Dela klippbordets innehåll</string> <string name="pref_plugin_clipboard_desc">Dela klippbordets innehåll</string>
<string name="pref_plugin_mousepad">Fjärrinmatning</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_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_mpris_desc">Styr ljud och video från telefonen</string>
<string name="pref_plugin_ping">Ping</string> <string name="pref_plugin_ping">Ping</string>
<string name="pref_plugin_ping_desc">Skicka och ta emot 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">Synkronisering av underrättelser</string>
<string name="pref_plugin_notifications_desc">Kom åt underrättelser från andra apparater</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">Dela och ta emot</string>
<string name="pref_plugin_sharereceiver_desc">Spara inkommande filer i telefonens minne</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="plugin_not_available">Funktionen är inte tillgänglig i Android-versionen</string>
<string name="device_list_empty">Inga apparater</string> <string name="device_list_empty">Inga apparater</string>
<string name="ok">Ok</string> <string name="ok">Ok</string>
@@ -25,8 +25,8 @@
<string name="open_settings">Öppna inställningarna</string> <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="no_permissions">Du måste ge rättighet att komma åt underrättelser</string>
<string name="send_ping">Skicka ping</string> <string name="send_ping">Skicka ping</string>
<string name="open_mpris_controls">Öppna fjärrkontroll</string> <string name="open_mpris_controls">Kontroll av multimedia</string>
<string name="open_mousepad">Öppna kontroll med tryckplatta</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_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_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> <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_title">Skickar fil till %1s</string>
<string name="outgoing_file_text">%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_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="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_title">Skickade fil till %1s</string>
<string name="sent_file_text">%1s</string> <string name="sent_file_text">%1s</string>

View File

@@ -10,14 +10,14 @@
<string name="pref_plugin_clipboard_desc">Спільне використання буфера обміну даними</string> <string name="pref_plugin_clipboard_desc">Спільне використання буфера обміну даними</string>
<string name="pref_plugin_mousepad">Дистанційне введення</string> <string name="pref_plugin_mousepad">Дистанційне введення</string>
<string name="pref_plugin_mousepad_desc">Скористайтеся телефоном як замінником миші і клавіатури</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_mpris_desc">Керування відтворенням звуку та відео з вашого телефону</string>
<string name="pref_plugin_ping">Підтримання зв’язку</string> <string name="pref_plugin_ping">Підтримання зв’язку</string>
<string name="pref_plugin_ping_desc">Надсилання і отримання сигналів підтримання зв’язку</string> <string name="pref_plugin_ping_desc">Надсилання і отримання сигналів підтримання зв’язку</string>
<string name="pref_plugin_notifications">Синхронізація сповіщень</string> <string name="pref_plugin_notifications">Синхронізація сповіщень</string>
<string name="pref_plugin_notifications_desc">Доступ до ваших сповіщень з інших пристроїв</string> <string name="pref_plugin_notifications_desc">Доступ до ваших сповіщень з інших пристроїв</string>
<string name="pref_plugin_sharereceiver">Отримувач спільних ресурсів</string> <string name="pref_plugin_sharereceiver">Надання і отримання</string>
<string name="pref_plugin_sharereceiver_desc">Зберігає вхідні файли на носій даних телефону</string> <string name="pref_plugin_sharereceiver_desc">Спільне використання файлів і адрес між пристроями</string>
<string name="plugin_not_available">Ця можливість є недоступною для вашої версії для Android</string> <string name="plugin_not_available">Ця можливість є недоступною для вашої версії для Android</string>
<string name="device_list_empty">Немає пристроїв</string> <string name="device_list_empty">Немає пристроїв</string>
<string name="ok">Гаразд</string> <string name="ok">Гаразд</string>
@@ -25,8 +25,8 @@
<string name="open_settings">Відкрити вікно параметрів</string> <string name="open_settings">Відкрити вікно параметрів</string>
<string name="no_permissions">Вам слід надати доступ до сповіщень</string> <string name="no_permissions">Вам слід надати доступ до сповіщень</string>
<string name="send_ping">Надіслати сигнал підтримання зв’язку</string> <string name="send_ping">Надіслати сигнал підтримання зв’язку</string>
<string name="open_mpris_controls">Відкрити дистанційне керування</string> <string name="open_mpris_controls">Керування відтворенням</string>
<string name="open_mousepad">Відкрити керування сенсорною панеллю</string> <string name="open_mousepad">Дистанційне введення</string>
<string name="mousepad_info">Проведіть по екрану пальцем, щоб пересунути вказівник миші. Дотик одним пальцем означатиме клацання, дотиком двома або трьома пальцями можна імітувати праву і середню кнопки. Для перетягування зі скиданням скористайтеся тривалим натисканням.</string> <string name="mousepad_info">Проведіть по екрану пальцем, щоб пересунути вказівник миші. Дотик одним пальцем означатиме клацання, дотиком двома або трьома пальцями можна імітувати праву і середню кнопки. Для перетягування зі скиданням скористайтеся тривалим натисканням.</string>
<string name="mousepad_double_tap_settings_title">Встановлення дії для торкання двома пальцями</string> <string name="mousepad_double_tap_settings_title">Встановлення дії для торкання двома пальцями</string>
<string name="mousepad_triple_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_title">Надсилаємо файл до %1s</string>
<string name="outgoing_file_text">%1s</string> <string name="outgoing_file_text">%1s</string>
<string name="received_file_title">Отримано файл з %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="received_file_text">Натисніть, щоб відкрити «%1s»</string>
<string name="sent_file_title">Файл надіслано до %1s</string> <string name="sent_file_title">Файл надіслано до %1s</string>
<string name="sent_file_text">%1s</string> <string name="sent_file_text">%1s</string>

View File

@@ -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>

View 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>

View File

@@ -11,14 +11,14 @@
<string name="pref_plugin_clipboard_desc">Share the clipboard content</string> <string name="pref_plugin_clipboard_desc">Share the clipboard content</string>
<string name="pref_plugin_mousepad">Remote input</string> <string name="pref_plugin_mousepad">Remote input</string>
<string name="pref_plugin_mousepad_desc">Use your phone as a mouse and keyboard</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_mpris_desc">Control audio/video from your phone</string>
<string name="pref_plugin_ping">Ping</string> <string name="pref_plugin_ping">Ping</string>
<string name="pref_plugin_ping_desc">Send and receive pings</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">Notification sync</string>
<string name="pref_plugin_notifications_desc">Access your notifications from other devices</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">Share and receive</string>
<string name="pref_plugin_sharereceiver_desc">Save incoming files to the phone storage</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="plugin_not_available">This feature is not available in your Android version</string>
<string name="device_list_empty">No devices</string> <string name="device_list_empty">No devices</string>
<string name="ok">OK</string> <string name="ok">OK</string>
@@ -26,8 +26,8 @@
<string name="open_settings">Open settings</string> <string name="open_settings">Open settings</string>
<string name="no_permissions">You need to grant permission to access notifications</string> <string name="no_permissions">You need to grant permission to access notifications</string>
<string name="send_ping">Send ping</string> <string name="send_ping">Send ping</string>
<string name="open_mpris_controls">Open remote control</string> <string name="open_mpris_controls">Multimedia control</string>
<string name="open_mousepad">Open touchpad 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_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_double_tap_settings_title">Set two finger tap action</string>
<string name="mousepad_triple_tap_settings_title">Set three 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_title">Sending file to %1s</string>
<string name="outgoing_file_text">%1s</string> <string name="outgoing_file_text">%1s</string>
<string name="received_file_title">Received file from %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="received_file_text">Tap to open \'%1s\'</string>
<string name="sent_file_title">Sent file to %1s</string> <string name="sent_file_title">Sent file to %1s</string>
<string name="sent_file_text">%1s</string> <string name="sent_file_text">%1s</string>

View File

@@ -1,20 +1,7 @@
<resources> <resources>
<!-- <style name="KdeConnectTheme" parent="Theme.AppCompat">
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>
<!-- Application theme. -->
<style name="AppTheme" parent="AppBaseTheme">
<!-- All customizations that are NOT specific to a particular API-level can go here. -->
</style> </style>
</resources> </resources>

View File

@@ -7,7 +7,7 @@
<EditTextPreference <EditTextPreference
android:key="device_name_preference" android:key="device_name_preference"
android:title="@string/device_name" android:title="@string/device_name"
android:summary="@string/device_name_preference_summary" android:summary=""
android:dialogTitle="@string/device_name" android:dialogTitle="@string/device_name"
android:singleLine="true" /> android:singleLine="true" />

View File

@@ -46,13 +46,13 @@ public abstract class BaseLinkProvider {
//These two should be called when the provider links to a new computer //These two should be called when the provider links to a new computer
protected void connectionAccepted(NetworkPackage identityPackage, BaseLink link) { protected void connectionAccepted(NetworkPackage identityPackage, BaseLink link) {
Log.i("LinkProvider", "connectionAccepted"); //Log.i("KDE/LinkProvider", "connectionAccepted");
for(ConnectionReceiver cr : connectionReceivers) { for(ConnectionReceiver cr : connectionReceivers) {
cr.onConnectionReceived(identityPackage, link); cr.onConnectionReceived(identityPackage, link);
} }
} }
protected void connectionLost(BaseLink link) { protected void connectionLost(BaseLink link) {
Log.i("LinkProvider", "connectionLost"); //Log.i("KDE/LinkProvider", "connectionLost");
for(ConnectionReceiver cr : connectionReceivers) { for(ConnectionReceiver cr : connectionReceivers) {
cr.onConnectionLost(link); cr.onConnectionLost(link);
} }

View File

@@ -47,8 +47,10 @@ public class LanLink extends BaseLink {
private IoSession session = null; private IoSession session = null;
public void disconnect() { public void disconnect() {
if (session == null) return; if (session == null) {
//Log.i("LanLink", "Disconnect: "+session.getRemoteAddress().toString()); Log.e("KDE/LanLink", "Not yet connected");
return;
}
session.close(true); session.close(true);
} }
@@ -60,7 +62,7 @@ public class LanLink extends BaseLink {
//Blocking, do not call from main thread //Blocking, do not call from main thread
private void sendPackageInternal(NetworkPackage np, final Device.SendPackageStatusCallback callback, PublicKey key) { private void sendPackageInternal(NetworkPackage np, final Device.SendPackageStatusCallback callback, PublicKey key) {
if (session == null) { if (session == null) {
Log.e("sendPackage", "Not yet connected"); Log.e("KDE/sendPackage", "Not yet connected");
callback.sendFailure(new NotYetConnectedException()); callback.sendFailure(new NotYetConnectedException());
return; return;
} }
@@ -87,7 +89,7 @@ public class LanLink extends BaseLink {
WriteFuture future = session.write(np.serialize()); WriteFuture future = session.write(np.serialize());
future.awaitUninterruptibly(); future.awaitUninterruptibly();
if (!future.isWritten()) { if (!future.isWritten()) {
Log.e("sendPackage", "!future.isWritten()"); Log.e("KDE/sendPackage", "!future.isWritten()");
callback.sendFailure(future.getException()); callback.sendFailure(future.getException());
return; return;
} }
@@ -97,19 +99,10 @@ public class LanLink extends BaseLink {
OutputStream socket = null; OutputStream socket = null;
try { try {
//Wait a maximum of 10 seconds for the other end to establish a connection with our socket, close it afterwards //Wait a maximum of 10 seconds for the other end to establish a connection with our socket, close it afterwards
Timer timeout = new Timer(); server.setSoTimeout(10*1000);
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);
socket = server.accept().getOutputStream(); 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]; byte[] buffer = new byte[4096];
int bytesRead; int bytesRead;
@@ -123,9 +116,11 @@ public class LanLink extends BaseLink {
callback.sendProgress((int)(progress / np.getPayloadSize())); 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) { } catch (Exception e) {
Log.e("sendPackage", "Exception: "+e); Log.e("KDE/sendPackage", "Exception: "+e);
callback.sendFailure(e); callback.sendFailure(e);
return; return;
} finally { } finally {
@@ -167,22 +162,24 @@ public class LanLink extends BaseLink {
np = np.decrypt(privateKey); np = np.decrypt(privateKey);
} catch(Exception e) { } catch(Exception e) {
e.printStackTrace(); 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()) { if (np.hasPayloadTransferInfo()) {
Socket socket = null;
try { try {
Socket socket = new Socket(); socket = new Socket();
int tcpPort = np.getPayloadTransferInfo().getInt("port"); int tcpPort = np.getPayloadTransferInfo().getInt("port");
InetSocketAddress address = (InetSocketAddress)session.getRemoteAddress(); InetSocketAddress address = (InetSocketAddress)session.getRemoteAddress();
socket.connect(new InetSocketAddress(address.getAddress(), tcpPort)); socket.connect(new InetSocketAddress(address.getAddress(), tcpPort));
np.setPayload(socket.getInputStream(), np.getPayloadSize()); np.setPayload(socket.getInputStream(), np.getPayloadSize());
} catch (Exception e) { } catch (Exception e) {
try { socket.close(); } catch(Exception ignored) { }
e.printStackTrace(); 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 = new ServerSocket();
candidateServer.bind(new InetSocketAddress(tcpPort)); candidateServer.bind(new InetSocketAddress(tcpPort));
success = true; success = true;
Log.i("LanLink", "Using port "+tcpPort); Log.i("KDE/LanLink", "Using port "+tcpPort);
} catch(IOException e) { } catch(IOException e) {
//Log.e("LanLink", "Exception openning serversocket: "+e); //Log.e("LanLink", "Exception openning serversocket: "+e);
tcpPort++; tcpPort++;
if (tcpPort >= 1764) { if (tcpPort >= 1764) {
Log.e("LanLink", "No more ports available"); Log.e("KDE/LanLink", "No more ports available");
throw e; throw e;
} }
} }

View File

@@ -21,7 +21,6 @@
package org.kde.kdeconnect.Backends.LanBackend; package org.kde.kdeconnect.Backends.LanBackend;
import android.content.Context; import android.content.Context;
import android.os.AsyncTask;
import android.preference.PreferenceManager; import android.preference.PreferenceManager;
import android.support.v4.util.LongSparseArray; import android.support.v4.util.LongSparseArray;
import android.util.Log; import android.util.Log;
@@ -47,9 +46,11 @@ import java.net.DatagramPacket;
import java.net.DatagramSocket; import java.net.DatagramSocket;
import java.net.InetAddress; import java.net.InetAddress;
import java.net.InetSocketAddress; import java.net.InetSocketAddress;
import java.net.SocketAddress;
import java.nio.charset.Charset; import java.nio.charset.Charset;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.HashMap; import java.util.HashMap;
import java.util.Set;
public class LanLinkProvider extends BaseLinkProvider { public class LanLinkProvider extends BaseLinkProvider {
@@ -59,6 +60,7 @@ public class LanLinkProvider extends BaseLinkProvider {
private final Context context; private final Context context;
private final HashMap<String, LanLink> visibleComputers = new HashMap<String, LanLink>(); private final HashMap<String, LanLink> visibleComputers = new HashMap<String, LanLink>();
private final LongSparseArray<LanLink> nioSessions = new LongSparseArray<LanLink>(); private final LongSparseArray<LanLink> nioSessions = new LongSparseArray<LanLink>();
private final LongSparseArray<NioSocketConnector> nioConnectors = new LongSparseArray<NioSocketConnector>();
private NioSocketAcceptor tcpAcceptor = null; private NioSocketAcceptor tcpAcceptor = null;
private NioDatagramAcceptor udpAcceptor = null; private NioDatagramAcceptor udpAcceptor = null;
@@ -66,29 +68,46 @@ public class LanLinkProvider extends BaseLinkProvider {
private final IoHandler tcpHandler = new IoHandlerAdapter() { private final IoHandler tcpHandler = new IoHandlerAdapter() {
@Override @Override
public void sessionClosed(IoSession session) throws Exception { public void sessionClosed(IoSession session) throws Exception {
try {
final LanLink brokenLink = nioSessions.get(session.getId()); long id = session.getId();
if (brokenLink != null) { final LanLink brokenLink = nioSessions.get(id);
nioSessions.remove(session.getId()); NioSocketConnector connector = nioConnectors.get(id);
brokenLink.disconnect(); if (connector != null) {
String deviceId = brokenLink.getDeviceId(); connector.dispose();
if (visibleComputers.get(deviceId) == brokenLink) { nioConnectors.remove(id);
visibleComputers.remove(deviceId);
} }
new Thread(new Runnable() { if (brokenLink != null) {
@Override nioSessions.remove(id);
public void run() { //Log.i("KDE/LanLinkProvider", "nioSessions.size(): " + nioSessions.size() + " (-)");
//Wait a bit before emiting connectionLost, in case the same device re-appears try {
try { brokenLink.disconnect();
Thread.sleep(200); } catch (Exception e) {
} catch (InterruptedException e) { } e.printStackTrace();
connectionLost(brokenLink); Log.e("KDE/LanLinkProvider", "Exception. Already disconnected?");
} }
}).start(); //Log.i("KDE/LanLinkProvider", "Disconnected!");
String deviceId = brokenLink.getDeviceId();
if (visibleComputers.get(deviceId) == brokenLink) {
visibleComputers.remove(deviceId);
}
new Thread(new Runnable() {
@Override
public void run() {
//Wait a bit before emiting connectionLost, in case the same device re-appears
try {
Thread.sleep(200);
} 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 @Override
@@ -100,7 +119,7 @@ public class LanLinkProvider extends BaseLinkProvider {
String theMessage = (String) message; String theMessage = (String) message;
if (theMessage.isEmpty()) { if (theMessage.isEmpty()) {
Log.e("LanLinkProvider","Empty package received"); Log.e("KDE/LanLinkProvider","Empty package received");
return; return;
} }
@@ -113,15 +132,16 @@ public class LanLinkProvider extends BaseLinkProvider {
return; 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); LanLink link = new LanLink(session, np.getString("deviceId"), LanLinkProvider.this);
nioSessions.put(session.getId(),link); nioSessions.put(session.getId(),link);
//Log.e("KDE/LanLinkProvider","nioSessions.size(): " + nioSessions.size());
addLink(np, link); addLink(np, link);
} else { } else {
LanLink prevLink = nioSessions.get(session.getId()); LanLink prevLink = nioSessions.get(session.getId());
if (prevLink == null) { if (prevLink == null) {
Log.e("LanLinkProvider","2 Expecting an identity package"); Log.e("KDE/LanLinkProvider","Expecting an identity package (A)");
} else { } else {
prevLink.injectNetworkPackage(np); prevLink.injectNetworkPackage(np);
} }
@@ -143,7 +163,7 @@ public class LanLinkProvider extends BaseLinkProvider {
final NetworkPackage identityPackage = NetworkPackage.unserialize(theMessage); final NetworkPackage identityPackage = NetworkPackage.unserialize(theMessage);
if (!identityPackage.getType().equals(NetworkPackage.PACKAGE_TYPE_IDENTITY)) { 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; return;
} else { } else {
String myId = NetworkPackage.createIdentityPackage(context).getString("deviceId"); 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(); final InetSocketAddress address = (InetSocketAddress) udpSession.getRemoteAddress();
@@ -162,44 +182,50 @@ public class LanLinkProvider extends BaseLinkProvider {
//TextLineCodecFactory will buffer incoming data and emit a message very time it finds a \n //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); TextLineCodecFactory textLineFactory = new TextLineCodecFactory(Charset.defaultCharset(), LineDelimiter.UNIX, LineDelimiter.UNIX);
textLineFactory.setDecoderMaxLineLength(512*1024); //Allow to receive up to 512kb of data textLineFactory.setDecoderMaxLineLength(512*1024); //Allow to receive up to 512kb of data
tcpAcceptor.getFilterChain().addLast("codec", new ProtocolCodecFilter(textLineFactory)); connector.getFilterChain().addLast("codec", new ProtocolCodecFilter(textLineFactory));
int tcpPort = identityPackage.getInt("tcpPort",port); 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>() { future.addListener(new IoFutureListener<IoFuture>() {
@Override @Override
public void operationComplete(IoFuture ioFuture) { public void operationComplete(IoFuture ioFuture) {
final IoSession session = ioFuture.getSession(); 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); final LanLink link = new LanLink(session, identityPackage.getString("deviceId"), LanLinkProvider.this);
new Thread(new Runnable() {
@Override
public void run() {
NetworkPackage np2 = NetworkPackage.createIdentityPackage(context);
link.sendPackage(np2,new Device.SendPackageStatusCallback() {
@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);
}
Log.i("LanLinkProvider", "Connection successful: " + session.isConnected()); @Override
protected void onFailure(Throwable e) {
new Thread(new Runnable() { Log.e("KDE/LanLinkProvider", "Connection failed: could not send identity package back");
@Override }
public void run() { });
NetworkPackage np2 = NetworkPackage.createIdentityPackage(context);
link.sendPackage(np2,new Device.SendPackageStatusCallback() {
@Override
protected void onSuccess() {
nioSessions.put(session.getId(), link);
addLink(identityPackage, link);
}
@Override
protected void onFailure(Throwable e) {
}
});
}
}).start();
}
}).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) { } catch (Exception e) {
Log.e("LanLinkProvider","Exception receiving udp package!!"); Log.e("KDE/LanLinkProvider","Exception receiving udp package!!");
e.printStackTrace(); e.printStackTrace();
} }
@@ -208,16 +234,16 @@ public class LanLinkProvider extends BaseLinkProvider {
private void addLink(NetworkPackage identityPackage, LanLink link) { private void addLink(NetworkPackage identityPackage, LanLink link) {
String deviceId = identityPackage.getString("deviceId"); String deviceId = identityPackage.getString("deviceId");
Log.i("LanLinkProvider","addLink to "+deviceId); Log.i("KDE/LanLinkProvider","addLink to "+deviceId);
LanLink oldLink = visibleComputers.get(deviceId); LanLink oldLink = visibleComputers.get(deviceId);
if (oldLink == link) { if (oldLink == link) {
Log.e("KDEConnect", "LanLinkProvider: oldLink == link. This should not happen!"); Log.e("KDE/LanLinkProvider", "oldLink == link. This should not happen!");
return; return;
} }
visibleComputers.put(deviceId, link); visibleComputers.put(deviceId, link);
connectionAccepted(identityPackage, link); connectionAccepted(identityPackage, link);
if (oldLink != null) { if (oldLink != null) {
Log.i("LanLinkProvider","Removing old connection to same device"); Log.i("KDE/LanLinkProvider","Removing old connection to same device");
oldLink.disconnect(); oldLink.disconnect();
connectionLost(oldLink); connectionLost(oldLink);
} }
@@ -232,13 +258,11 @@ public class LanLinkProvider extends BaseLinkProvider {
tcpAcceptor.setHandler(tcpHandler); tcpAcceptor.setHandler(tcpHandler);
tcpAcceptor.getSessionConfig().setKeepAlive(true); tcpAcceptor.getSessionConfig().setKeepAlive(true);
tcpAcceptor.getSessionConfig().setReuseAddress(true); tcpAcceptor.getSessionConfig().setReuseAddress(true);
tcpAcceptor.setCloseOnDeactivation(false);
//TextLineCodecFactory will buffer incoming data and emit a message very time it finds a \n //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); TextLineCodecFactory textLineFactory = new TextLineCodecFactory(Charset.defaultCharset(), LineDelimiter.UNIX, LineDelimiter.UNIX);
textLineFactory.setDecoderMaxLineLength(512*1024); //Allow to receive up to 512kb of data textLineFactory.setDecoderMaxLineLength(512*1024); //Allow to receive up to 512kb of data
tcpAcceptor.getFilterChain().addLast("codec", new ProtocolCodecFilter(textLineFactory)); tcpAcceptor.getFilterChain().addLast("codec", new ProtocolCodecFilter(textLineFactory));
udpAcceptor = new NioDatagramAcceptor(); udpAcceptor = new NioDatagramAcceptor();
udpAcceptor.getSessionConfig().setReuseAddress(true); //Share port if existing udpAcceptor.getSessionConfig().setReuseAddress(true); //Share port if existing
//TextLineCodecFactory will buffer incoming data and emit a message very time it finds a \n //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 //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); udpAcceptor.setHandler(udpHandler);
try { try {
udpAcceptor.bind(new InetSocketAddress(port)); udpAcceptor.bind(new InetSocketAddress(port));
} catch(Exception e) { } catch(Exception e) {
Log.e("LanLinkProvider", "Error: Could not bind udp socket"); Log.e("KDE/LanLinkProvider", "Error: Could not bind udp socket");
e.printStackTrace(); 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 //I'm on a new network, let's be polite and introduce myself
final int finalTcpPort = tcpPort; final int finalTcpPort = tcpPort;
new AsyncTask<Void,Void,Void>() { new Thread(new Runnable() {
@Override @Override
protected Void doInBackground(Void... voids) { public void run() {
String deviceListPrefs = PreferenceManager.getDefaultSharedPreferences(context).getString( String deviceListPrefs = PreferenceManager.getDefaultSharedPreferences(context).getString(
KEY_CUSTOM_DEVLIST_PREFERENCE, ""); KEY_CUSTOM_DEVLIST_PREFERENCE, "");
ArrayList<String> iplist = new ArrayList<String>(); ArrayList<String> iplist = new ArrayList<String>();
if (!deviceListPrefs.isEmpty()) { if (!deviceListPrefs.isEmpty()) {
iplist = CustomDevicesActivity.deserializeIpList(deviceListPrefs); iplist = CustomDevicesActivity.deserializeIpList(deviceListPrefs);
} }
iplist.add("255.255.255.255"); iplist.add("255.255.255.255"); //Default: broadcast.
for (String ipstr : iplist) {
try { NetworkPackage identity = NetworkPackage.createIdentityPackage(context);
InetAddress client = InetAddress.getByName(ipstr); identity.set("tcpPort", finalTcpPort);
NetworkPackage identity = NetworkPackage.createIdentityPackage(context); DatagramSocket socket = null;
identity.set("tcpPort", finalTcpPort); byte[] bytes = null;
byte[] b = identity.serialize().getBytes("UTF-8"); try {
DatagramPacket packet = new DatagramPacket(b, b.length, client, port); socket = new DatagramSocket();
DatagramSocket socket = new DatagramSocket(); socket.setReuseAddress(true);
socket.setReuseAddress(true); socket.setBroadcast(true);
socket.setBroadcast(true); bytes = identity.serialize().getBytes("UTF-8");
socket.send(packet); } catch (Exception e) {
//Log.i("LanLinkProvider","Udp identity package sent to address "+packet.getAddress()); e.printStackTrace();
} catch(Exception e) { Log.e("KDE/LanLinkProvider","Failed to create DatagramSocket");
e.printStackTrace(); }
Log.e("LanLinkProvider","Sending udp identity package failed. Invalid address? ("+ipstr+")");
if (bytes != null) {
//Log.e("KDE/LanLinkProvider","Sending packet to "+iplist.size()+" ips");
for (String ipstr : iplist) {
try {
InetAddress client = InetAddress.getByName(ipstr);
DatagramPacket packet = new DatagramPacket(bytes, bytes.length, client, port);
socket.send(packet);
//Log.i("KDE/LanLinkProvider","Udp identity package sent to address "+packet.getAddress());
} catch (Exception e) {
e.printStackTrace();
Log.e("KDE/LanLinkProvider", "Sending udp identity package failed. Invalid address? (" + ipstr + ")");
}
} }
} }
return null; socket.close();
} }
}).start();
}.execute();
} }
@Override @Override
public void onNetworkChange() { public void onNetworkChange() {
//Log.e("KDE/LanLinkProvider","onNetworkChange");
//FilesHelper.LogOpenFileCount();
//Keep existing connections open while unbinding the socket
tcpAcceptor.setCloseOnDeactivation(false);
onStop(); onStop();
tcpAcceptor.setCloseOnDeactivation(true);
//FilesHelper.LogOpenFileCount();
onStart(); onStart();
//FilesHelper.LogOpenFileCount();
} }
@Override @Override
@@ -327,14 +381,12 @@ public class LanLinkProvider extends BaseLinkProvider {
udpAcceptor.unbind(); udpAcceptor.unbind();
tcpAcceptor.unbind(); tcpAcceptor.unbind();
} }
/*
@Override
public int getPriority() {
return 1000;
}
*/
@Override @Override
public String getName() { public String getName() {
return "LanLinkProvider"; return "LanLinkProvider";
} }
} }

View File

@@ -105,17 +105,17 @@ public class BackgroundService extends Service {
@Override @Override
public void onConnectionReceived(final NetworkPackage identityPackage, final BaseLink link) { 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"); String deviceId = identityPackage.getString("deviceId");
Device device = devices.get(deviceId); Device device = devices.get(deviceId);
if (device != null) { if (device != null) {
Log.i("BackgroundService", "addLink, known device: " + deviceId); Log.i("KDE/BackgroundService", "addLink, known device: " + deviceId);
device.addLink(identityPackage, link); device.addLink(identityPackage, link);
} else { } else {
Log.i("BackgroundService", "addLink,unknown device: " + deviceId); Log.i("KDE/BackgroundService", "addLink,unknown device: " + deviceId);
device = new Device(BackgroundService.this, identityPackage, link); device = new Device(BackgroundService.this, identityPackage, link);
devices.put(deviceId, device); devices.put(deviceId, device);
device.addPairingCallback(devicePairingCallback); device.addPairingCallback(devicePairingCallback);
@@ -127,7 +127,7 @@ public class BackgroundService extends Service {
@Override @Override
public void onConnectionLost(BaseLink link) { public void onConnectionLost(BaseLink link) {
Device d = devices.get(link.getDeviceId()); Device d = devices.get(link.getDeviceId());
Log.i("onConnectionLost", "removeLink, deviceId: " + link.getDeviceId()); Log.i("KDE/onConnectionLost", "removeLink, deviceId: " + link.getDeviceId());
if (d != null) { if (d != null) {
d.removeLink(link); d.removeLink(link);
if (!d.isReachable() && !d.isPaired()) { if (!d.isReachable() && !d.isPaired()) {
@@ -136,7 +136,7 @@ public class BackgroundService extends Service {
d.removePairingCallback(devicePairingCallback); d.removePairingCallback(devicePairingCallback);
} }
} else { } 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(); if (deviceListChangedCallback != null) deviceListChangedCallback.onDeviceListChanged();
} }
@@ -147,34 +147,35 @@ public class BackgroundService extends Service {
} }
public void startDiscovery() { public void startDiscovery() {
Log.i("BackgroundService","StartDiscovery"); Log.i("KDE/BackgroundService","StartDiscovery");
for (BaseLinkProvider a : linkProviders) { for (BaseLinkProvider a : linkProviders) {
a.onStart(); a.onStart();
} }
} }
public void stopDiscovery() { public void stopDiscovery() {
Log.i("BackgroundService","StopDiscovery"); Log.i("KDE/BackgroundService","StopDiscovery");
for (BaseLinkProvider a : linkProviders) { for (BaseLinkProvider a : linkProviders) {
a.onStop(); a.onStop();
} }
} }
public void onNetworkChange() { public void onNetworkChange() {
Log.i("BackgroundService","OnNetworkChange"); Log.i("KDE/BackgroundService","OnNetworkChange");
for (BaseLinkProvider a : linkProviders) { for (BaseLinkProvider a : linkProviders) {
a.onNetworkChange(); a.onNetworkChange();
} }
} }
public void addConnectionListener(BaseLinkProvider.ConnectionReceiver cr) { public void addConnectionListener(BaseLinkProvider.ConnectionReceiver cr) {
Log.i("BackgroundService","Registering connection listener"); Log.i("KDE/BackgroundService","Registering connection listener");
for (BaseLinkProvider a : linkProviders) { for (BaseLinkProvider a : linkProviders) {
a.addConnectionReceiver(cr); a.addConnectionReceiver(cr);
} }
} }
public void removeConnectionListener(BaseLinkProvider.ConnectionReceiver cr) { public void removeConnectionListener(BaseLinkProvider.ConnectionReceiver cr) {
Log.i("KDE/BackgroundService","Removing connection listener");
for (BaseLinkProvider a : linkProviders) { for (BaseLinkProvider a : linkProviders) {
a.removeConnectionReceiver(cr); a.removeConnectionReceiver(cr);
} }
@@ -198,7 +199,7 @@ public class BackgroundService extends Service {
IntentFilter filter = new IntentFilter(Intent.ACTION_SCREEN_ON); IntentFilter filter = new IntentFilter(Intent.ACTION_SCREEN_ON);
registerReceiver(new KdeConnectBroadcastReceiver(), filter); registerReceiver(new KdeConnectBroadcastReceiver(), filter);
Log.i("BackgroundService","Service not started yet, initializing..."); Log.i("KDE/BackgroundService","Service not started yet, initializing...");
initializeRsaKeys(); initializeRsaKeys();
MainSettingsActivity.initializeDeviceName(this); MainSettingsActivity.initializeDeviceName(this);
@@ -223,7 +224,7 @@ public class BackgroundService extends Service {
keyPair = keyGen.genKeyPair(); keyPair = keyGen.genKeyPair();
} catch(Exception e) { } catch(Exception e) {
e.printStackTrace(); e.printStackTrace();
Log.e("initializeRsaKeys","Exception"); Log.e("KDE/initializeRsaKeys","Exception");
return; return;
} }
@@ -268,7 +269,7 @@ public class BackgroundService extends Service {
@Override @Override
public void onDestroy() { public void onDestroy() {
Log.i("BackgroundService", "Destroying"); Log.i("KDE/BackgroundService", "Destroying");
stopDiscovery(); stopDiscovery();
super.onDestroy(); super.onDestroy();
} }
@@ -305,14 +306,19 @@ public class BackgroundService extends Service {
RunCommand(c, null); RunCommand(c, null);
} }
public static void RunCommand(Context c, final InstanceCallback callback) { public static void RunCommand(final Context c, final InstanceCallback callback) {
if (callback != null) { new Thread(new Runnable() {
mutex.lock(); @Override
callbacks.add(callback); public void run() {
mutex.unlock(); if (callback != null) {
} mutex.lock();
Intent serviceIntent = new Intent(c, BackgroundService.class); callbacks.add(callback);
c.startService(serviceIntent); mutex.unlock();
}
Intent serviceIntent = new Intent(c, BackgroundService.class);
c.startService(serviceIntent);
}
}).start();
} }
} }

View File

@@ -27,6 +27,8 @@ import android.content.Context;
import android.content.Intent; import android.content.Intent;
import android.content.SharedPreferences; import android.content.SharedPreferences;
import android.content.res.Resources; import android.content.res.Resources;
import android.graphics.drawable.Drawable;
import android.os.Build;
import android.os.Handler; import android.os.Handler;
import android.os.Looper; import android.os.Looper;
import android.preference.PreferenceManager; import android.preference.PreferenceManager;
@@ -61,13 +63,32 @@ public class Device implements BaseLink.PackageReceiver {
private int notificationId; private int notificationId;
private int protocolVersion; private int protocolVersion;
private enum PairStatus { public enum PairStatus {
NotPaired, NotPaired,
Requested, Requested,
RequestedByPeer, RequestedByPeer,
Paired 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 { public interface PairingCallback {
abstract void incomingRequest(); abstract void incomingRequest();
abstract void pairingSuccessful(); abstract void pairingSuccessful();
@@ -75,6 +96,7 @@ public class Device implements BaseLink.PackageReceiver {
abstract void unpaired(); abstract void unpaired();
} }
private DeviceType deviceType;
private PairStatus pairStatus; private PairStatus pairStatus;
private ArrayList<PairingCallback> pairingCallback = new ArrayList<PairingCallback>(); private ArrayList<PairingCallback> pairingCallback = new ArrayList<PairingCallback>();
private Timer pairingTimer; 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.name = settings.getString("deviceName", context.getString(R.string.unknown_device));
this.pairStatus = PairStatus.Paired; this.pairStatus = PairStatus.Paired;
this.protocolVersion = NetworkPackage.ProtocolVersion; //We don't know it yet this.protocolVersion = NetworkPackage.ProtocolVersion; //We don't know it yet
this.deviceType = DeviceType.FromString(settings.getString("deviceType", "computer"));
try { try {
byte[] publicKeyBytes = Base64.decode(settings.getString("publicKey", ""), 0); byte[] publicKeyBytes = Base64.decode(settings.getString("publicKey", ""), 0);
publicKey = KeyFactory.getInstance("RSA").generatePublic(new X509EncodedKeySpec(publicKeyBytes)); publicKey = KeyFactory.getInstance("RSA").generatePublic(new X509EncodedKeySpec(publicKeyBytes));
} catch (Exception e) { } catch (Exception e) {
e.printStackTrace(); e.printStackTrace();
Log.e("Device","Exception"); unpair();
Log.e("KDE/Device","Exception");
} }
reloadPluginsFromSettings(); reloadPluginsFromSettings();
@@ -116,8 +140,9 @@ public class Device implements BaseLink.PackageReceiver {
this.context = context; this.context = context;
this.deviceId = np.getString("deviceId"); this.deviceId = np.getString("deviceId");
this.name = np.getString("deviceName", context.getString(R.string.unknown_device)); this.name = np.getString("deviceName", context.getString(R.string.unknown_device));
this.protocolVersion = np.getInt("protocolVersion");
this.pairStatus = PairStatus.NotPaired; this.pairStatus = PairStatus.NotPaired;
this.protocolVersion = np.getInt("protocolVersion");
this.deviceType = DeviceType.FromString(np.getString("deviceType", "computer"));
this.publicKey = null; this.publicKey = null;
settings = context.getSharedPreferences(deviceId, Context.MODE_PRIVATE); 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); 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() { public String getDeviceId() {
return deviceId; return deviceId;
} }
@@ -200,7 +238,7 @@ public class Device implements BaseLink.PackageReceiver {
for (PairingCallback cb : pairingCallback) { for (PairingCallback cb : pairingCallback) {
cb.pairingFailed(context.getString(R.string.error_timed_out)); 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; pairStatus = PairStatus.NotPaired;
} }
}, 30*1000); //Time to wait for the other to accept }, 30*1000); //Time to wait for the other to accept
@@ -212,7 +250,7 @@ public class Device implements BaseLink.PackageReceiver {
for (PairingCallback cb : pairingCallback) { for (PairingCallback cb : pairingCallback) {
cb.pairingFailed(context.getString(R.string.error_could_not_send_package)); 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; 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 //Store device information needed to create a Device object in a future
SharedPreferences.Editor editor = settings.edit(); SharedPreferences.Editor editor = settings.edit();
editor.putString("deviceName", getName()); editor.putString("deviceName", getName());
editor.putString("deviceType", deviceType.toString());
String encodedPublicKey = Base64.encodeToString(publicKey.getEncoded(), 0); String encodedPublicKey = Base64.encodeToString(publicKey.getEncoded(), 0);
editor.putString("publicKey", encodedPublicKey); editor.putString("publicKey", encodedPublicKey);
editor.apply(); editor.apply();
@@ -271,7 +310,7 @@ public class Device implements BaseLink.PackageReceiver {
public void acceptPairing() { 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 //Send our own public key
NetworkPackage np = NetworkPackage.createPublicKeyPackage(context); NetworkPackage np = NetworkPackage.createPublicKeyPackage(context);
@@ -294,7 +333,7 @@ public class Device implements BaseLink.PackageReceiver {
public void rejectPairing() { 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)"); //Log.e("Device","Unpairing (rejectPairing)");
pairStatus = PairStatus.NotPaired; pairStatus = PairStatus.NotPaired;
@@ -321,6 +360,7 @@ public class Device implements BaseLink.PackageReceiver {
} }
public void addLink(NetworkPackage identityPackage, BaseLink link) { public void addLink(NetworkPackage identityPackage, BaseLink link) {
//FilesHelper.LogOpenFileCount();
this.protocolVersion = identityPackage.getInt("protocolVersion"); this.protocolVersion = identityPackage.getInt("protocolVersion");
@@ -331,6 +371,10 @@ public class Device implements BaseLink.PackageReceiver {
editor.apply(); editor.apply();
} }
if (identityPackage.has("deviceType")) {
this.deviceType = DeviceType.FromString(identityPackage.getString("deviceType", "computer"));
}
links.add(link); links.add(link);
@@ -341,10 +385,10 @@ public class Device implements BaseLink.PackageReceiver {
link.setPrivateKey(privateKey); link.setPrivateKey(privateKey);
} catch (Exception e) { } catch (Exception e) {
e.printStackTrace(); 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>() { Collections.sort(links, new Comparator<BaseLink>() {
@@ -363,9 +407,11 @@ public class Device implements BaseLink.PackageReceiver {
} }
public void removeLink(BaseLink link) { public void removeLink(BaseLink link) {
//FilesHelper.LogOpenFileCount();
link.removePackageReceiver(this); link.removePackageReceiver(this);
links.remove(link); 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()) { if (links.isEmpty()) {
reloadPluginsFromSettings(); reloadPluginsFromSettings();
} }
@@ -376,7 +422,7 @@ public class Device implements BaseLink.PackageReceiver {
if (np.getType().equals(NetworkPackage.PACKAGE_TYPE_PAIR)) { if (np.getType().equals(NetworkPackage.PACKAGE_TYPE_PAIR)) {
Log.i("Device","Pair package"); Log.i("KDE/Device","Pair package");
boolean wantsPair = np.getBoolean("pair"); boolean wantsPair = np.getBoolean("pair");
@@ -401,7 +447,7 @@ public class Device implements BaseLink.PackageReceiver {
publicKey = KeyFactory.getInstance("RSA").generatePublic(new X509EncodedKeySpec(publicKeyBytes)); publicKey = KeyFactory.getInstance("RSA").generatePublic(new X509EncodedKeySpec(publicKeyBytes));
} catch(Exception e) { } catch(Exception e) {
e.printStackTrace(); e.printStackTrace();
Log.e("Device","Pairing exception: Received incorrect key"); Log.e("KDE/Device","Pairing exception: Received incorrect key");
for (PairingCallback cb : pairingCallback) { for (PairingCallback cb : pairingCallback) {
cb.pairingFailed(context.getString(R.string.error_invalid_key)); 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 if (pairStatus == PairStatus.Requested) { //We started pairing
Log.i("Pairing","Pair answer"); Log.i("KDE/Pairing","Pair answer");
if (pairingTimer != null) pairingTimer.cancel(); if (pairingTimer != null) pairingTimer.cancel();
@@ -418,7 +464,7 @@ public class Device implements BaseLink.PackageReceiver {
} else { } else {
Log.i("Pairing","Pair request"); Log.i("KDE/Pairing","Pair request");
Intent intent = new Intent(context, PairActivity.class); Intent intent = new Intent(context, PairActivity.class);
intent.putExtra("deviceId", deviceId); intent.putExtra("deviceId", deviceId);
@@ -439,7 +485,12 @@ public class Device implements BaseLink.PackageReceiver {
final NotificationManager notificationManager = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE); final NotificationManager notificationManager = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);
notificationId = (int)System.currentTimeMillis(); notificationId = (int)System.currentTimeMillis();
notificationManager.notify(notificationId, noti); 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(); if (pairingTimer != null) pairingTimer.cancel();
pairingTimer = new Timer(); pairingTimer = new Timer();
@@ -447,7 +498,7 @@ public class Device implements BaseLink.PackageReceiver {
pairingTimer.schedule(new TimerTask() { pairingTimer.schedule(new TimerTask() {
@Override @Override
public void run() { public void run() {
Log.e("Device","Unpairing (timeout B)"); Log.e("KDE/Device","Unpairing (timeout B)");
pairStatus = PairStatus.NotPaired; pairStatus = PairStatus.NotPaired;
notificationManager.cancel(notificationId); notificationManager.cancel(notificationId);
} }
@@ -457,7 +508,7 @@ public class Device implements BaseLink.PackageReceiver {
} }
} else { } else {
Log.i("Pairing","Unpair request"); Log.i("KDE/Pairing","Unpair request");
if (pairStatus == PairStatus.Requested) { if (pairStatus == PairStatus.Requested) {
pairingTimer.cancel(); pairingTimer.cancel();
@@ -470,27 +521,30 @@ public class Device implements BaseLink.PackageReceiver {
reloadPluginsFromSettings(); reloadPluginsFromSettings();
} }
//Log.e("Device","Unpairing (unpair request)");
pairStatus = PairStatus.NotPaired; pairStatus = PairStatus.NotPaired;
for (PairingCallback cb : pairingCallback) cb.unpaired(); for (PairingCallback cb : pairingCallback) cb.unpaired();
} }
} else if (!isPaired()) { } else if (isPaired()) {
unpair();
Log.e("onPackageReceived","Device not paired, ignoring package!");
} else {
for (Plugin plugin : plugins.values()) { for (Plugin plugin : plugins.values()) {
try { try {
plugin.onPackageReceived(np); plugin.onPackageReceived(np);
} catch (Exception e) { } catch (Exception e) {
e.printStackTrace(); 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) { public void sendFailure(Throwable e) {
if (e != null) { if (e != null) {
e.printStackTrace(); e.printStackTrace();
Log.e("sendPackage", "Exception: " + e.getMessage()); Log.e("KDE/sendPackage", "Exception: " + e.getMessage());
} else { } else {
Log.e("sendPackage", "Unknown (null) exception"); Log.e("KDE/sendPackage", "Unknown (null) exception");
} }
onFailure(e); 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 //Make a copy to avoid concurrent modification exception if the original list changes
ArrayList<BaseLink> mLinks = new ArrayList<BaseLink>(links); ArrayList<BaseLink> mLinks = new ArrayList<BaseLink>(links);
for (final BaseLink link : mLinks) { for (final BaseLink link : mLinks) {
if (link == null) continue; //Since we made a copy, maybe somebody destroyed the link in the meanwhile
if (useEncryption) { if (useEncryption) {
link.sendPackageEncrypted(np, callback, publicKey); link.sendPackageEncrypted(np, callback, publicKey);
} else { } else {
@@ -552,7 +607,7 @@ public class Device implements BaseLink.PackageReceiver {
} }
if (!callback.success) { 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(); backtrace.printStackTrace();
} }
@@ -565,29 +620,37 @@ public class Device implements BaseLink.PackageReceiver {
// Plugin-related functions // Plugin-related functions
// //
public Plugin getPlugin(String name) { public <T extends Plugin> T getPlugin(Class<T> pluginClass) {
return getPlugin(name, false); return (T)getPlugin(Plugin.getPluginKey(pluginClass));
} }
public Plugin getPlugin(String name, boolean includeFailed) { public <T extends Plugin> T getPlugin(Class<T> pluginClass, boolean includeFailed) {
Plugin plugin = plugins.get(name); 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) { if (includeFailed && plugin == null) {
plugin = failedPlugins.get(name); plugin = failedPlugins.get(pluginKey);
} }
return plugin; return plugin;
} }
private synchronized void addPlugin(final String name) { private synchronized void addPlugin(final String pluginKey) {
Plugin existing = plugins.get(name); Plugin existing = plugins.get(pluginKey);
if (existing != null) { if (existing != null) {
Log.w("addPlugin","plugin already present:" + name); Log.w("KDE/addPlugin","plugin already present:" + pluginKey);
return; return;
} }
final Plugin plugin = PluginFactory.instantiatePluginForDevice(context, name, this); final Plugin plugin = PluginFactory.instantiatePluginForDevice(context, pluginKey, this);
if (plugin == null) { if (plugin == null) {
Log.e("addPlugin","could not instantiate plugin: "+name); Log.e("KDE/addPlugin","could not instantiate plugin: "+pluginKey);
failedPlugins.put(name, plugin); failedPlugins.put(pluginKey, plugin);
return; return;
} }
@@ -601,17 +664,17 @@ public class Device implements BaseLink.PackageReceiver {
} catch (Exception e) { } catch (Exception e) {
success = false; success = false;
e.printStackTrace(); e.printStackTrace();
Log.e("addPlugin", "Exception loading plugin " + name); Log.e("KDE/addPlugin", "Exception loading plugin " + pluginKey);
} }
if (success) { if (success) {
//Log.e("addPlugin","added " + name); //Log.e("addPlugin","added " + pluginKey);
failedPlugins.remove(name); failedPlugins.remove(pluginKey);
plugins.put(name, plugin); plugins.put(pluginKey, plugin);
} else { } else {
Log.e("addPlugin", "plugin failed to load " + name); Log.e("KDE/addPlugin", "plugin failed to load " + pluginKey);
plugins.remove(name); plugins.remove(pluginKey);
failedPlugins.put(name, plugin); failedPlugins.put(pluginKey, plugin);
} }
for (PluginsChangedListener listener : pluginsChangedListeners) { 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 plugin = plugins.remove(pluginKey);
Plugin failedPlugin = failedPlugins.remove(name); Plugin failedPlugin = failedPlugins.remove(pluginKey);
if (plugin == null) { if (plugin == null) {
if (failedPlugin == null) { if (failedPlugin == null) {
@@ -638,10 +701,10 @@ public class Device implements BaseLink.PackageReceiver {
try { try {
plugin.onDestroy(); plugin.onDestroy();
//Log.e("removePlugin","removed " + name); //Log.e("removePlugin","removed " + pluginKey);
} catch (Exception e) { } catch (Exception e) {
e.printStackTrace(); 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) { for (PluginsChangedListener listener : pluginsChangedListeners) {
@@ -651,15 +714,15 @@ public class Device implements BaseLink.PackageReceiver {
return true; return true;
} }
public void setPluginEnabled(String pluginName, boolean value) { public void setPluginEnabled(String pluginKey, boolean value) {
settings.edit().putBoolean(pluginName,value).apply(); settings.edit().putBoolean(pluginKey,value).apply();
if (value && isPaired() && isReachable()) addPlugin(pluginName); if (value && isPaired() && isReachable()) addPlugin(pluginKey);
else removePlugin(pluginName); else removePlugin(pluginKey);
} }
public boolean isPluginEnabled(String pluginName) { public boolean isPluginEnabled(String pluginKey) {
boolean enabledByDefault = PluginFactory.getPluginInfo(context, pluginName).isEnabledByDefault(); boolean enabledByDefault = PluginFactory.getPluginInfo(context, pluginKey).isEnabledByDefault();
boolean enabled = settings.getBoolean(pluginName, enabledByDefault); boolean enabled = settings.getBoolean(pluginKey, enabledByDefault);
return enabled; return enabled;
} }
@@ -673,15 +736,15 @@ public class Device implements BaseLink.PackageReceiver {
Set<String> availablePlugins = PluginFactory.getAvailablePlugins(); Set<String> availablePlugins = PluginFactory.getAvailablePlugins();
for(String pluginName : availablePlugins) { for(String pluginKey : availablePlugins) {
boolean enabled = false; boolean enabled = false;
if (isPaired() && isReachable()) { if (isPaired() && isReachable()) {
enabled = isPluginEnabled(pluginName); enabled = isPluginEnabled(pluginKey);
} }
if (enabled) { if (enabled) {
addPlugin(pluginName); addPlugin(pluginKey);
} else { } else {
removePlugin(pluginName); removePlugin(pluginKey);
} }
} }

View File

@@ -23,6 +23,7 @@ package org.kde.kdeconnect.Helpers;
import android.content.res.Configuration; import android.content.res.Configuration;
import android.content.res.Resources; import android.content.res.Resources;
import android.os.Build; import android.os.Build;
import android.util.Log;
import java.util.HashMap; import java.util.HashMap;
@@ -335,16 +336,26 @@ public class DeviceHelper {
} }
public static String getDeviceName() { public static String getDeviceName() {
String deviceName = null;
String dictName = humanReadableNames.get(Build.MODEL.replace(' ','_')); try {
if (dictName != null) return dictName; String dictName = humanReadableNames.get(Build.MODEL.replace(' ', '_'));
if (dictName != null) {
if (Build.BRAND.equals("samsung") || Build.BRAND.equals("Samsung")) { deviceName = dictName;
return "Samsung" + Build.MODEL; } 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() { public static boolean isTablet() {

View File

@@ -20,8 +20,11 @@
package org.kde.kdeconnect.Helpers; package org.kde.kdeconnect.Helpers;
import android.util.Log;
import android.webkit.MimeTypeMap; import android.webkit.MimeTypeMap;
import java.io.File;
public class FilesHelper { public class FilesHelper {
public static String getFileExt(String fileName) { public static String getFileExt(String fileName) {
@@ -73,4 +76,11 @@ public class FilesHelper {
return toFileSystemSafeName(name, true, 255); 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());
}
} }

View File

@@ -81,7 +81,9 @@ public class StorageHelper {
if (storage.exists() && storage.isDirectory()) { if (storage.exists() && storage.isDirectory()) {
String mounts = null; String mounts = null;
try { 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); //Log.e("Mounts",mounts);
} catch(Exception e) { } catch(Exception e) {
e.printStackTrace(); e.printStackTrace();
@@ -90,7 +92,7 @@ public class StorageHelper {
File dirs[] = storage.listFiles(); File dirs[] = storage.listFiles();
for (File dir : dirs) { for (File dir : dirs) {
//Log.e("getStorageList", "path: "+dir.getAbsolutePath()); //Log.e("getStorageList", "path: "+dir.getAbsolutePath());
if (dir.isDirectory()) { if (dir.isDirectory() && dir.canRead() && dir.canExecute()) {
String path, path2; String path, path2;
path2 = dir.getAbsolutePath(); path2 = dir.getAbsolutePath();
try { try {
@@ -101,9 +103,10 @@ public class StorageHelper {
} }
if (!path.startsWith("/storage/emulated") || dirs.length == 1) { if (!path.startsWith("/storage/emulated") || dirs.length == 1) {
if (!paths.contains(path) && !paths.contains(path2)) { if (!paths.contains(path) && !paths.contains(path2)) {
if (mounts == null || mounts.contains(path) || mounts.contains(path2)) if (mounts == null || mounts.contains(path) || mounts.contains(path2)) {
list.add(0, new StorageInfo(path, false, true, cur_removable_number++)); list.add(0, new StorageInfo(path, false, true, cur_removable_number++));
paths.add(path); paths.add(path);
}
} }
} }
} }

View File

@@ -85,6 +85,10 @@ public class NetworkPackage {
return mType; return mType;
} }
public long getId() {
return mId;
}
//Most commons getters and setters defined for convenience //Most commons getters and setters defined for convenience
public String getString(String key) { return mBody.optString(key,""); } public String getString(String key) { return mBody.optString(key,""); }
public String getString(String key, String defaultValue) { return mBody.optString(key,defaultValue); } public String getString(String key, String defaultValue) { return mBody.optString(key,defaultValue); }

View File

@@ -20,20 +20,17 @@
package org.kde.kdeconnect.Plugins.BatteryPlugin; package org.kde.kdeconnect.Plugins.BatteryPlugin;
import android.app.Activity;
import android.app.AlertDialog;
import android.content.BroadcastReceiver; import android.content.BroadcastReceiver;
import android.content.Context; import android.content.Context;
import android.content.Intent; import android.content.Intent;
import android.content.IntentFilter; import android.content.IntentFilter;
import android.graphics.drawable.Drawable;
import android.os.BatteryManager; import android.os.BatteryManager;
import android.widget.Button;
import org.kde.kdeconnect.NetworkPackage; import org.kde.kdeconnect.NetworkPackage;
import org.kde.kdeconnect.Plugins.Plugin; import org.kde.kdeconnect.Plugins.Plugin;
import org.kde.kdeconnect_tp.R; import org.kde.kdeconnect_tp.R;
public class BatteryPlugin extends Plugin { public class BatteryPlugin extends Plugin {
// keep these fields in sync with kdeconnect-kded:BatteryPlugin.h:ThresholdBatteryEvent // keep these fields in sync with kdeconnect-kded:BatteryPlugin.h:ThresholdBatteryEvent
@@ -42,11 +39,6 @@ public class BatteryPlugin extends Plugin {
private NetworkPackage lastInfo = null; private NetworkPackage lastInfo = null;
@Override
public String getPluginName() {
return "plugin_battery";
}
@Override @Override
public String getDisplayName() { public String getDisplayName() {
return context.getResources().getString(R.string.pref_plugin_battery); 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); 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() { private final BroadcastReceiver receiver = new BroadcastReceiver() {
@Override @Override
public void onReceive(Context context, Intent batteryIntent) { public void onReceive(Context context, Intent batteryIntent) {
@@ -133,13 +110,4 @@ public class BatteryPlugin extends Plugin {
return true; return true;
} }
@Override
public AlertDialog getErrorDialog(Activity deviceActivity) {
return null;
}
@Override
public Button getInterfaceButton(Activity activity) {
return null;
}
} }

View File

@@ -31,10 +31,6 @@ import org.kde.kdeconnect_tp.R;
public class ClipboardPlugin extends Plugin { public class ClipboardPlugin extends Plugin {
@Override
public String getPluginName() {
return "plugin_clipboard";
}
@Override @Override
public String getDisplayName() { public String getDisplayName() {
return context.getResources().getString(R.string.pref_plugin_clipboard); return context.getResources().getString(R.string.pref_plugin_clipboard);

View File

@@ -176,7 +176,7 @@ public class KeyListenerView extends View {
@Override @Override
public void onServiceStart(BackgroundService service) { public void onServiceStart(BackgroundService service) {
Device device = service.getDevice(deviceId); Device device = service.getDevice(deviceId);
MousePadPlugin mousePadPlugin = (MousePadPlugin) device.getPlugin("plugin_mousepad"); MousePadPlugin mousePadPlugin = (MousePadPlugin) device.getPlugin(MousePadPlugin.class);
if (mousePadPlugin == null) return; if (mousePadPlugin == null) return;
mousePadPlugin.sendKeyboardPacket(np); mousePadPlugin.sendKeyboardPacket(np);
} }

View File

@@ -182,7 +182,7 @@ public class MousePadActivity extends ActionBarActivity implements GestureDetect
@Override @Override
public void onServiceStart(BackgroundService service) { public void onServiceStart(BackgroundService service) {
Device device = service.getDevice(deviceId); Device device = service.getDevice(deviceId);
MousePadPlugin mousePadPlugin = (MousePadPlugin)device.getPlugin("plugin_mousepad"); MousePadPlugin mousePadPlugin = device.getPlugin(MousePadPlugin.class);
if (mousePadPlugin == null) return; if (mousePadPlugin == null) return;
mousePadPlugin.sendMouseDelta(mCurrentX - mPrevX, mCurrentY - mPrevY); mousePadPlugin.sendMouseDelta(mCurrentX - mPrevX, mCurrentY - mPrevY);
mPrevX = mCurrentX; mPrevX = mCurrentX;
@@ -227,7 +227,7 @@ public class MousePadActivity extends ActionBarActivity implements GestureDetect
@Override @Override
public void onServiceStart(BackgroundService service) { public void onServiceStart(BackgroundService service) {
Device device = service.getDevice(deviceId); Device device = service.getDevice(deviceId);
MousePadPlugin mousePadPlugin = (MousePadPlugin)device.getPlugin("plugin_mousepad"); MousePadPlugin mousePadPlugin = device.getPlugin(MousePadPlugin.class);
if (mousePadPlugin == null) return; if (mousePadPlugin == null) return;
mousePadPlugin.sendScroll(0, scrollToSendY); mousePadPlugin.sendScroll(0, scrollToSendY);
} }
@@ -248,7 +248,7 @@ public class MousePadActivity extends ActionBarActivity implements GestureDetect
@Override @Override
public void onServiceStart(BackgroundService service) { public void onServiceStart(BackgroundService service) {
Device device = service.getDevice(deviceId); Device device = service.getDevice(deviceId);
MousePadPlugin mousePadPlugin = (MousePadPlugin)device.getPlugin("plugin_mousepad"); MousePadPlugin mousePadPlugin = device.getPlugin(MousePadPlugin.class);
if (mousePadPlugin == null) return; if (mousePadPlugin == null) return;
mousePadPlugin.sendSingleHold(); mousePadPlugin.sendSingleHold();
} }
@@ -266,7 +266,7 @@ public class MousePadActivity extends ActionBarActivity implements GestureDetect
@Override @Override
public void onServiceStart(BackgroundService service) { public void onServiceStart(BackgroundService service) {
Device device = service.getDevice(deviceId); Device device = service.getDevice(deviceId);
MousePadPlugin mousePadPlugin = (MousePadPlugin)device.getPlugin("plugin_mousepad"); MousePadPlugin mousePadPlugin = device.getPlugin(MousePadPlugin.class);
if (mousePadPlugin == null) return; if (mousePadPlugin == null) return;
mousePadPlugin.sendSingleClick(); mousePadPlugin.sendSingleClick();
} }
@@ -280,7 +280,7 @@ public class MousePadActivity extends ActionBarActivity implements GestureDetect
@Override @Override
public void onServiceStart(BackgroundService service) { public void onServiceStart(BackgroundService service) {
Device device = service.getDevice(deviceId); Device device = service.getDevice(deviceId);
MousePadPlugin mousePadPlugin = (MousePadPlugin)device.getPlugin("plugin_mousepad"); MousePadPlugin mousePadPlugin = device.getPlugin(MousePadPlugin.class);
if (mousePadPlugin == null) return; if (mousePadPlugin == null) return;
mousePadPlugin.sendDoubleClick(); mousePadPlugin.sendDoubleClick();
} }
@@ -327,7 +327,7 @@ public class MousePadActivity extends ActionBarActivity implements GestureDetect
@Override @Override
public void onServiceStart(BackgroundService service) { public void onServiceStart(BackgroundService service) {
Device device = service.getDevice(deviceId); Device device = service.getDevice(deviceId);
MousePadPlugin mousePadPlugin = (MousePadPlugin)device.getPlugin("plugin_mousepad"); MousePadPlugin mousePadPlugin = device.getPlugin(MousePadPlugin.class);
if (mousePadPlugin == null) return; if (mousePadPlugin == null) return;
mousePadPlugin.sendMiddleClick(); mousePadPlugin.sendMiddleClick();
} }
@@ -339,7 +339,7 @@ public class MousePadActivity extends ActionBarActivity implements GestureDetect
@Override @Override
public void onServiceStart(BackgroundService service) { public void onServiceStart(BackgroundService service) {
Device device = service.getDevice(deviceId); Device device = service.getDevice(deviceId);
MousePadPlugin mousePadPlugin = (MousePadPlugin) device.getPlugin("plugin_mousepad"); MousePadPlugin mousePadPlugin = device.getPlugin(MousePadPlugin.class);
if (mousePadPlugin == null) return; if (mousePadPlugin == null) return;
mousePadPlugin.sendRightClick(); mousePadPlugin.sendRightClick();
} }
@@ -350,7 +350,7 @@ public class MousePadActivity extends ActionBarActivity implements GestureDetect
@Override @Override
public void onServiceStart(BackgroundService service) { public void onServiceStart(BackgroundService service) {
Device device = service.getDevice(deviceId); Device device = service.getDevice(deviceId);
MousePadPlugin mousePadPlugin = (MousePadPlugin) device.getPlugin("plugin_mousepad"); MousePadPlugin mousePadPlugin = device.getPlugin(MousePadPlugin.class);
if (mousePadPlugin == null) return; if (mousePadPlugin == null) return;
mousePadPlugin.sendSingleHold(); mousePadPlugin.sendSingleHold();
} }

View File

@@ -21,11 +21,8 @@
package org.kde.kdeconnect.Plugins.MousePadPlugin; package org.kde.kdeconnect.Plugins.MousePadPlugin;
import android.app.Activity; import android.app.Activity;
import android.app.AlertDialog;
import android.content.Intent; import android.content.Intent;
import android.graphics.drawable.Drawable; import android.graphics.drawable.Drawable;
import android.view.View;
import android.widget.Button;
import org.kde.kdeconnect.NetworkPackage; import org.kde.kdeconnect.NetworkPackage;
import org.kde.kdeconnect.Plugins.Plugin; import org.kde.kdeconnect.Plugins.Plugin;
@@ -33,11 +30,6 @@ import org.kde.kdeconnect_tp.R;
public class MousePadPlugin extends Plugin { public class MousePadPlugin extends Plugin {
@Override
public String getPluginName() {
return "plugin_mousepad";
}
@Override @Override
public String getDisplayName() { public String getDisplayName() {
return context.getString(R.string.pref_plugin_mousepad); return context.getString(R.string.pref_plugin_mousepad);
@@ -50,12 +42,7 @@ public class MousePadPlugin extends Plugin {
@Override @Override
public Drawable getIcon() { public Drawable getIcon() {
return context.getResources().getDrawable(R.drawable.icon); return context.getResources().getDrawable(R.drawable.touchpad_plugin_action);
}
@Override
public boolean isEnabledByDefault() {
return true;
} }
@Override @Override
@@ -64,36 +51,20 @@ public class MousePadPlugin extends Plugin {
} }
@Override @Override
public boolean onCreate() { public boolean hasMainActivity() {
return true; return true;
} }
@Override @Override
public void onDestroy() { public void startMainActivity(Activity parentActivity) {
Intent intent = new Intent(parentActivity, MousePadActivity.class);
intent.putExtra("deviceId", device.getDeviceId());
parentActivity.startActivity(intent);
} }
@Override @Override
public boolean onPackageReceived(NetworkPackage np) { public String getActionName() {
return false; return context.getString(R.string.open_mousepad);
}
@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);
intent.putExtra("deviceId", device.getDeviceId());
activity.startActivity(intent);
}
});
return button;
} }
public void sendMouseDelta(float dx, float dy) { public void sendMouseDelta(float dx, float dy) {

View File

@@ -75,7 +75,7 @@ public class MprisActivity extends ActionBarActivity {
public void onServiceStart(BackgroundService service) { public void onServiceStart(BackgroundService service) {
final Device device = service.getDevice(deviceId); final Device device = service.getDevice(deviceId);
final MprisPlugin mpris = (MprisPlugin) device.getPlugin("plugin_mpris"); final MprisPlugin mpris = device.getPlugin(MprisPlugin.class);
if (mpris == null) { if (mpris == null) {
Log.e("MprisActivity", "device has no mpris plugin!"); Log.e("MprisActivity", "device has no mpris plugin!");
return; return;
@@ -246,7 +246,7 @@ public class MprisActivity extends ActionBarActivity {
@Override @Override
public void onServiceStart(BackgroundService service) { public void onServiceStart(BackgroundService service) {
Device device = service.getDevice(deviceId); Device device = service.getDevice(deviceId);
MprisPlugin mpris = (MprisPlugin) device.getPlugin("plugin_mpris"); MprisPlugin mpris = device.getPlugin(MprisPlugin.class);
if (mpris == null) return; if (mpris == null) return;
updateVolume(mpris, 5); updateVolume(mpris, 5);
} }
@@ -257,7 +257,7 @@ public class MprisActivity extends ActionBarActivity {
@Override @Override
public void onServiceStart(BackgroundService service) { public void onServiceStart(BackgroundService service) {
Device device = service.getDevice(deviceId); Device device = service.getDevice(deviceId);
MprisPlugin mpris = (MprisPlugin) device.getPlugin("plugin_mpris"); MprisPlugin mpris = device.getPlugin(MprisPlugin.class);
if (mpris == null) return; if (mpris == null) return;
updateVolume(mpris, -5); updateVolume(mpris, -5);
} }
@@ -309,7 +309,7 @@ public class MprisActivity extends ActionBarActivity {
@Override @Override
public void onServiceStart(BackgroundService service) { public void onServiceStart(BackgroundService service) {
Device device = service.getDevice(deviceId); Device device = service.getDevice(deviceId);
MprisPlugin mpris = (MprisPlugin)device.getPlugin("plugin_mpris"); MprisPlugin mpris = device.getPlugin(MprisPlugin.class);
if (mpris == null) return; if (mpris == null) return;
mpris.sendAction("PlayPause"); mpris.sendAction("PlayPause");
} }
@@ -324,7 +324,7 @@ public class MprisActivity extends ActionBarActivity {
@Override @Override
public void onServiceStart(BackgroundService service) { public void onServiceStart(BackgroundService service) {
Device device = service.getDevice(deviceId); Device device = service.getDevice(deviceId);
MprisPlugin mpris = (MprisPlugin)device.getPlugin("plugin_mpris"); MprisPlugin mpris = device.getPlugin(MprisPlugin.class);
if (mpris == null) return; if (mpris == null) return;
mpris.sendAction("Previous"); mpris.sendAction("Previous");
} }
@@ -339,7 +339,7 @@ public class MprisActivity extends ActionBarActivity {
@Override @Override
public void onServiceStart(BackgroundService service) { public void onServiceStart(BackgroundService service) {
Device device = service.getDevice(deviceId); Device device = service.getDevice(deviceId);
MprisPlugin mpris = (MprisPlugin)device.getPlugin("plugin_mpris"); MprisPlugin mpris = device.getPlugin(MprisPlugin.class);
if (mpris == null) return; if (mpris == null) return;
mpris.Seek(interval_time * -1); mpris.Seek(interval_time * -1);
} }
@@ -354,7 +354,7 @@ public class MprisActivity extends ActionBarActivity {
@Override @Override
public void onServiceStart(BackgroundService service) { public void onServiceStart(BackgroundService service) {
Device device = service.getDevice(deviceId); Device device = service.getDevice(deviceId);
MprisPlugin mpris = (MprisPlugin)device.getPlugin("plugin_mpris"); MprisPlugin mpris = device.getPlugin(MprisPlugin.class);
if (mpris == null) return; if (mpris == null) return;
mpris.Seek(interval_time); mpris.Seek(interval_time);
} }
@@ -369,7 +369,7 @@ public class MprisActivity extends ActionBarActivity {
@Override @Override
public void onServiceStart(BackgroundService service) { public void onServiceStart(BackgroundService service) {
Device device = service.getDevice(deviceId); Device device = service.getDevice(deviceId);
MprisPlugin mpris = (MprisPlugin)device.getPlugin("plugin_mpris"); MprisPlugin mpris = device.getPlugin(MprisPlugin.class);
if (mpris == null) return; if (mpris == null) return;
mpris.sendAction("Next"); mpris.sendAction("Next");
} }
@@ -392,7 +392,7 @@ public class MprisActivity extends ActionBarActivity {
@Override @Override
public void onServiceStart(BackgroundService service) { public void onServiceStart(BackgroundService service) {
Device device = service.getDevice(deviceId); Device device = service.getDevice(deviceId);
MprisPlugin mpris = (MprisPlugin) device.getPlugin("plugin_mpris"); MprisPlugin mpris = device.getPlugin(MprisPlugin.class);
if (mpris == null) return; if (mpris == null) return;
mpris.setVolume(seekBar.getProgress()); mpris.setVolume(seekBar.getProgress());
} }
@@ -409,7 +409,7 @@ public class MprisActivity extends ActionBarActivity {
@Override @Override
public void onServiceStart(BackgroundService service) { public void onServiceStart(BackgroundService service) {
Device device = service.getDevice(deviceId); Device device = service.getDevice(deviceId);
MprisPlugin mpris = (MprisPlugin) device.getPlugin("plugin_mpris"); MprisPlugin mpris = device.getPlugin(MprisPlugin.class);
if (mpris != null) { if (mpris != null) {
positionSeek.setProgress((int) (mpris.getPosition())); positionSeek.setProgress((int) (mpris.getPosition()));
} }
@@ -438,7 +438,7 @@ public class MprisActivity extends ActionBarActivity {
@Override @Override
public void onServiceStart(BackgroundService service) { public void onServiceStart(BackgroundService service) {
Device device = service.getDevice(deviceId); Device device = service.getDevice(deviceId);
MprisPlugin mpris = (MprisPlugin) device.getPlugin("plugin_mpris"); MprisPlugin mpris = device.getPlugin(MprisPlugin.class);
if (mpris != null) { if (mpris != null) {
mpris.setPosition(seekBar.getProgress()); mpris.setPosition(seekBar.getProgress());
} }

View File

@@ -21,14 +21,11 @@
package org.kde.kdeconnect.Plugins.MprisPlugin; package org.kde.kdeconnect.Plugins.MprisPlugin;
import android.app.Activity; import android.app.Activity;
import android.app.AlertDialog;
import android.content.Intent; import android.content.Intent;
import android.graphics.drawable.Drawable; import android.graphics.drawable.Drawable;
import android.os.Handler; import android.os.Handler;
import android.os.Message; import android.os.Message;
import android.util.Log; import android.util.Log;
import android.view.View;
import android.widget.Button;
import org.kde.kdeconnect.NetworkPackage; import org.kde.kdeconnect.NetworkPackage;
import org.kde.kdeconnect.Plugins.Plugin; import org.kde.kdeconnect.Plugins.Plugin;
@@ -51,11 +48,6 @@ public class MprisPlugin extends Plugin {
private ArrayList<String> playerList = new ArrayList<String>(); private ArrayList<String> playerList = new ArrayList<String>();
private HashMap<String,Handler> playerListUpdated = new HashMap<String,Handler>(); private HashMap<String,Handler> playerListUpdated = new HashMap<String,Handler>();
@Override
public String getPluginName() {
return "plugin_mpris";
}
@Override @Override
public String getDisplayName() { public String getDisplayName() {
return context.getResources().getString(R.string.pref_plugin_mpris); return context.getResources().getString(R.string.pref_plugin_mpris);
@@ -68,7 +60,7 @@ public class MprisPlugin extends Plugin {
@Override @Override
public Drawable getIcon() { public Drawable getIcon() {
return context.getResources().getDrawable(R.drawable.icon); return context.getResources().getDrawable(R.drawable.mpris_plugin_action);
} }
@Override @Override
@@ -76,11 +68,6 @@ public class MprisPlugin extends Plugin {
return true; return true;
} }
@Override
public boolean isEnabledByDefault() {
return true;
}
@Override @Override
public boolean onCreate() { public boolean onCreate() {
requestPlayerList(); requestPlayerList();
@@ -267,22 +254,20 @@ public class MprisPlugin extends Plugin {
} }
@Override @Override
public AlertDialog getErrorDialog(Activity deviceActivity) { public boolean hasMainActivity() {
return null; return true;
} }
@Override @Override
public Button getInterfaceButton(final Activity activity) { public void startMainActivity(Activity parentActivity) {
Button b = new Button(activity); Intent intent = new Intent(parentActivity, MprisActivity.class);
b.setText(R.string.open_mpris_controls); intent.putExtra("deviceId", device.getDeviceId());
b.setOnClickListener(new View.OnClickListener() { parentActivity.startActivity(intent);
@Override
public void onClick(View view) {
Intent intent = new Intent(activity, MprisActivity.class);
intent.putExtra("deviceId", device.getDeviceId());
activity.startActivity(intent);
}
});
return b;
} }
@Override
public String getActionName() {
return context.getString(R.string.open_mpris_controls);
}
} }

View File

@@ -64,13 +64,14 @@ public class NotificationFilterActivity extends ActionBarActivity {
res.moveToNext(); res.moveToNext();
i++; i++;
} }
res.close();
appDatabase.close(); appDatabase.close();
ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, ArrayAdapter<String> adapter = new ArrayAdapter<String>(this,
android.R.layout.simple_list_item_multiple_choice,android.R.id.text1, appName); android.R.layout.simple_list_item_multiple_choice,android.R.id.text1, appName);
listView.setAdapter(adapter); listView.setAdapter(adapter);
listView.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE); listView.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE);
for (i = 0 ; i < res.getCount(); i++){ for (i = 0 ; i < isFiltered.length; i++){
if (isFiltered[i]) { if (isFiltered[i]) {
listView.setItemChecked(i, true); listView.setItemChecked(i, true);
} }
@@ -85,6 +86,7 @@ public class NotificationFilterActivity extends ActionBarActivity {
appDatabase.close(); appDatabase.close();
} }
}); });
} }
// Delete apps from database which are uninstalled // Delete apps from database which are uninstalled
@@ -101,6 +103,7 @@ public class NotificationFilterActivity extends ActionBarActivity {
} }
res.moveToNext(); res.moveToNext();
} }
res.close();
} }
appDatabase.close(); appDatabase.close();

Some files were not shown because too many files have changed in this diff Show More