2
0
mirror of https://github.com/KDE/kdeconnect-android synced 2025-08-31 22:25:08 +00:00

Compare commits

..

54 Commits
v0.4 ... v0.6

Author SHA1 Message Date
Albert Vaca
231433737e Increased version number to release 2014-03-02 20:17:27 +01:00
l10n daemon script
49360816a3 SVN_SILENT made messages (after extraction) 2014-02-24 01:51:22 +00:00
Albert Vaca
dd364bd562 New icon by Malcer <malcer@gmx.com> 2014-02-19 21:20:15 +01:00
Albert Vaca
809f37a541 More project changes 2014-02-19 17:03:47 +01:00
Albert Vaca
36c3df7a07 Version should be 0.5 instead of 0.6! 2014-02-19 16:33:08 +01:00
l10n daemon script
34aec7120e SVN_SILENT made messages (after extraction) 2014-02-19 02:37:41 +00:00
l10n daemon script
0a494b002d SVN_SILENT made messages (after extraction) 2014-02-18 01:46:47 +00:00
l10n daemon script
7298247dfc SVN_SILENT made messages (after extraction) 2014-02-17 02:14:15 +00:00
l10n daemon script
72a97d9e1c SVN_SILENT made messages (after extraction) 2014-02-16 03:52:01 +00:00
l10n daemon script
7cc80baf16 SVN_SILENT made messages (after extraction) 2014-02-15 01:46:20 +00:00
Albert Vaca
0600b1ee2e Oops, duplicate library 2014-02-14 20:11:22 +01:00
Albert Vaca
2f0059938d Increased version number to tag and release 2014-02-14 17:08:30 +01:00
Albert Vaca
a023316609 Renamed sftp plugin to "filesystem browser" 2014-02-14 17:08:30 +01:00
Albert Vaca
d94ed56c4e oops 2014-02-14 17:08:30 +01:00
Samoilenko Yuri
15a11cce02 Publick key auth for sftp plugin 2014-02-14 17:08:07 +01:00
Albert Vaca
36530b9580 Prefer IPv4 over IPv6 2014-02-14 17:07:42 +01:00
Samoilenko Yuri
f54acd7308 fix 2014-02-14 17:07:42 +01:00
Samoilenko Yuri
cfe9ccdc31 WORKAROUND new gradle android plugin bug 2014-02-14 17:07:42 +01:00
Samoilenko Yuri
52c7581f42 moved to updated gradle and Android Studio 2014-02-14 17:07:12 +01:00
Albert Vaca
a57dc71ad1 Libs are now included from Maven repo 2014-02-14 17:05:31 +01:00
Samoilenko Yuri
77d06cfe77 sftp implementations splits from sftpplugin 2014-02-14 17:04:36 +01:00
Samoilenko Yuri
13a7c1e5fe first draft SFTP implementation 2014-02-14 17:04:30 +01:00
l10n daemon script
5ccf215a54 SVN_SILENT made messages (after extraction) 2014-02-06 01:38:48 +00:00
l10n daemon script
fddf3c64b5 SVN_SILENT made messages (after extraction) 2014-02-01 01:41:08 +00:00
l10n daemon script
fb02b9bdf1 SVN_SILENT made messages (after extraction) 2014-01-29 01:40:11 +00:00
l10n daemon script
8453156d16 SVN_SILENT made messages (after extraction) 2014-01-23 01:37:44 +00:00
Albert Vaca
9bbe2908ed We will only sync actual notifications from now on
BUG: 325668
2014-01-10 19:29:50 +01:00
Albert Vaca
fb843f8789 Notifications with FLAG_FOREGROUND_SERVICE are not shown anymore
Actually, they are not 'notifications'.
2014-01-10 18:00:26 +01:00
Albert Vaca
c85619dfd2 Phone number shown next to contact name for calls/sms
BUG: 328197
2014-01-10 17:59:50 +01:00
Albert Vaca
de9f78adf3 Gradle upgrade to make Android Studio 4.2 happy 2014-01-10 17:07:00 +01:00
Samoilenko Yuri
9021ab9454 Partial impl of clipboard sync in early Android
Syncronization works only in one direction - incoming
2014-01-08 02:17:37 +04:00
Samoilenko Yuri
10210b3972 Fixed Ping notification on old phones
On old phones(LG P698) notification does not shown ultil all
fields are filles correctly: setContentIntent.
Added pendingIntent to notification as describved into official documentation for Notifications, to
fit support library requirements.
2014-01-08 01:20:24 +04:00
l10n daemon script
f83b9cbe0c SVN_SILENT made messages (after extraction) 2013-12-29 01:40:33 +00:00
l10n daemon script
7d821e7c88 SVN_SILENT made messages (after extraction) 2013-12-10 01:38:14 +00:00
l10n daemon script
02070343fe SVN_SILENT made messages (after extraction) 2013-11-28 01:42:19 +00:00
l10n daemon script
416a000dd3 SVN_SILENT made messages (after extraction) 2013-11-25 01:41:50 +00:00
Albert Vaca
a15cad9ec5 Increased version number to release 2013-11-24 17:49:15 +01:00
l10n daemon script
e98100f5f0 SVN_SILENT made messages (after extraction) 2013-11-24 01:37:28 +00:00
Albert Vaca
d19e7d2052 Missing permission (how could this work before?) 2013-11-23 01:49:34 +01:00
Albert Vaca
4e02c674f8 Still trying to fix the concurrency exception
I hope this doesn't cause infinite recursion.
2013-11-23 01:49:34 +01:00
Albert Vaca
6aa49757fc Fixed bug retrieving incorrect file sizes for file transfers
For some reason querying the content provider returns a different size than
using File.length()
2013-11-23 01:49:33 +01:00
Albert Vaca
3c10312d15 More Android Studio nonsensical project changes 2013-11-23 01:49:33 +01:00
l10n daemon script
26e3363b30 SVN_SILENT made messages (after extraction) 2013-11-19 01:37:14 +00:00
l10n daemon script
4033233ec1 SVN_SILENT made messages (after extraction) 2013-11-18 01:45:52 +00:00
Albert Vaca
34e53576e1 Trying to fix a concurrency exception 2013-11-15 15:31:38 +01:00
Albert Vaca
a15d76c588 Android Studio keeps changing the project files... 2013-11-14 18:41:35 +01:00
Albert Vaca
1acea73383 The battery percentage for low battery level is now signaled by the device
BatteryPlugin is now subscribed to the BATTERY_LOW event

REVIEW: 113838
2013-11-14 18:24:44 +01:00
Albert Vaca
6c8fdb0be7 Increased version number to release 2013-11-14 18:20:57 +01:00
l10n daemon script
749170a29c SVN_SILENT made messages (after extraction) 2013-11-14 01:36:45 +00:00
l10n daemon script
81b08cf89f SVN_SILENT made messages (after extraction) 2013-11-11 01:40:35 +00:00
Albert Vaca
786ea7658f Fixed bugs in NotificationsPlugin
Already existing notifications were not retrieved
Notifications without tickerText were crashing the plugin
2013-11-06 21:15:49 +01:00
Albert Vaca
996516ec88 Fixed a bug while pairing
Timeout was being fired after the pairing was done
Added lots of Log.e for debugging, now commented
2013-11-06 21:13:37 +01:00
Albert Vaca
a36e4a0c88 Added deviceType to the identity packages
This will tell if we are a phone, tablet, laptop or desktop
2013-11-06 19:06:18 +01:00
l10n daemon script
e08de81c73 SVN_SILENT made messages (after extraction) 2013-11-05 01:33:50 +00:00
50 changed files with 1845 additions and 142 deletions

View File

@@ -3,7 +3,7 @@ buildscript {
mavenCentral()
}
dependencies {
classpath 'com.android.tools.build:gradle:0.6.+'
classpath 'com.android.tools.build:gradle:0.7.+'
}
}
@@ -17,6 +17,13 @@ android {
minSdkVersion 9
targetSdkVersion 19
}
packagingOptions {
exclude "META-INF/DEPENDENCIES"
exclude "META-INF/NOTICE"
exclude "META-INF/LICENSE"
exclude "META-INF/LICENSE.txt"
exclude "META-INF/NOTICE.txt"
}
}
dependencies {
@@ -26,4 +33,8 @@ dependencies {
compile "com.android.support:support-v4:19.0.+"
compile "com.android.support:appcompat-v7:19.0.+"
compile "org.apache.mina:mina-core:2.0.+"
compile 'org.bouncycastle:bcprov-jdk16:1.45'
compile 'org.apache.sshd:sshd-core:0.8.0'
compile 'tomcat:tomcat-apr:5.5.+'
//compile fileTree(dir: 'libs', include: '*.jar')
}

View File

@@ -1,6 +1,6 @@
#Tue Oct 29 15:58:14 CET 2013
#Sun Jan 12 12:44:14 MSK 2014
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
distributionUrl=http\://services.gradle.org/distributions/gradle-1.8-all.zip
distributionUrl=http\://services.gradle.org/distributions/gradle-1.9-all.zip

1067
icon.svg Normal file

File diff suppressed because it is too large Load Diff

After

Width:  |  Height:  |  Size: 35 KiB

View File

@@ -1,12 +1,12 @@
<?xml version="1.0" encoding="UTF-8"?>
<module external.linked.project.path="$MODULE_DIR$" external.root.project.path="$MODULE_DIR$" external.system.id="GRADLE" type="JAVA_MODULE" version="4">
<module external.linked.project.path="$MODULE_DIR$" external.root.project.path="$MODULE_DIR$" external.system.id="GRADLE" external.system.module.group="" external.system.module.version="unspecified" type="JAVA_MODULE" version="4">
<component name="FacetManager">
<facet type="android" name="Android">
<configuration>
<option name="SELECTED_BUILD_VARIANT" value="Debug" />
<option name="SELECTED_BUILD_VARIANT" value="debug" />
<option name="ASSEMBLE_TASK_NAME" value="assembleDebug" />
<option name="COMPILE_JAVA_TASK_NAME" value="compileDebug" />
<option name="ASSEMBLE_TEST_TASK_NAME" value="assembleTest" />
<option name="COMPILE_JAVA_TASK_NAME" value="compileDebugJava" />
<option name="ASSEMBLE_TEST_TASK_NAME" value="assembleDebugTest" />
<option name="SOURCE_GEN_TASK_NAME" value="generateDebugSources" />
<option name="ALLOW_USER_CONFIGURATION" value="false" />
<option name="MANIFEST_FILE_RELATIVE_PATH" value="/src/main/AndroidManifest.xml" />
@@ -25,37 +25,37 @@
<output url="file://$MODULE_DIR$/build/classes/debug" />
<exclude-output />
<content url="file://$MODULE_DIR$">
<sourceFolder url="file://$MODULE_DIR$/build/source/r/debug" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/build/source/aidl/debug" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/build/source/rs/debug" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/build/source/buildConfig/debug" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/build/res/rs/debug" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/build/source/r/test" isTestSource="true" />
<sourceFolder url="file://$MODULE_DIR$/build/source/aidl/test" isTestSource="true" />
<sourceFolder url="file://$MODULE_DIR$/build/source/rs/test" isTestSource="true" />
<sourceFolder url="file://$MODULE_DIR$/build/source/buildConfig/test" isTestSource="true" />
<sourceFolder url="file://$MODULE_DIR$/build/res/rs/test" isTestSource="true" />
<sourceFolder url="file://$MODULE_DIR$/build/source/r/debug" isTestSource="false" generated="true" />
<sourceFolder url="file://$MODULE_DIR$/build/source/aidl/debug" isTestSource="false" generated="true" />
<sourceFolder url="file://$MODULE_DIR$/build/source/buildConfig/debug" isTestSource="false" generated="true" />
<sourceFolder url="file://$MODULE_DIR$/build/source/rs/debug" isTestSource="false" generated="true" />
<sourceFolder url="file://$MODULE_DIR$/build/res/rs/debug" type="java-resource" />
<sourceFolder url="file://$MODULE_DIR$/build/source/r/test/debug" isTestSource="true" generated="true" />
<sourceFolder url="file://$MODULE_DIR$/build/source/aidl/test/debug" isTestSource="true" generated="true" />
<sourceFolder url="file://$MODULE_DIR$/build/source/buildConfig/test/debug" isTestSource="true" generated="true" />
<sourceFolder url="file://$MODULE_DIR$/build/source/rs/test/debug" isTestSource="true" generated="true" />
<sourceFolder url="file://$MODULE_DIR$/build/res/rs/test/debug" type="java-test-resource" />
<sourceFolder url="file://$MODULE_DIR$/src/debug/aidl" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/src/debug/assets" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/src/debug/java" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/src/debug/jni" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/src/debug/rs" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/src/debug/res" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/src/debug/resources" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/src/debug/res" type="java-resource" />
<sourceFolder url="file://$MODULE_DIR$/src/debug/resources" type="java-resource" />
<sourceFolder url="file://$MODULE_DIR$/src/main/aidl" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/src/main/assets" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/src/main/java" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/src/main/jni" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/src/main/rs" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/src/main/res" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/src/main/resources" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/src/main/res" type="java-resource" />
<sourceFolder url="file://$MODULE_DIR$/src/main/resources" type="java-resource" />
<sourceFolder url="file://$MODULE_DIR$/src/instrumentTest/aidl" isTestSource="true" />
<sourceFolder url="file://$MODULE_DIR$/src/instrumentTest/assets" isTestSource="true" />
<sourceFolder url="file://$MODULE_DIR$/src/instrumentTest/java" isTestSource="true" />
<sourceFolder url="file://$MODULE_DIR$/src/instrumentTest/jni" isTestSource="true" />
<sourceFolder url="file://$MODULE_DIR$/src/instrumentTest/rs" isTestSource="true" />
<sourceFolder url="file://$MODULE_DIR$/src/instrumentTest/res" isTestSource="true" />
<sourceFolder url="file://$MODULE_DIR$/src/instrumentTest/resources" isTestSource="true" />
<sourceFolder url="file://$MODULE_DIR$/src/instrumentTest/res" type="java-test-resource" />
<sourceFolder url="file://$MODULE_DIR$/src/instrumentTest/resources" type="java-test-resource" />
<excludeFolder url="file://$MODULE_DIR$/.git" />
<excludeFolder url="file://$MODULE_DIR$/.gradle" />
<excludeFolder url="file://$MODULE_DIR$/.idea" />
@@ -67,15 +67,19 @@
<excludeFolder url="file://$MODULE_DIR$/build/incremental" />
<excludeFolder url="file://$MODULE_DIR$/build/libs" />
<excludeFolder url="file://$MODULE_DIR$/build/manifests" />
<excludeFolder url="file://$MODULE_DIR$/build/res" />
<excludeFolder url="file://$MODULE_DIR$/build/symbols" />
<excludeFolder url="file://$MODULE_DIR$/build/tmp" />
</content>
<orderEntry type="jdk" jdkName="Android API 19 Platform" jdkType="Android SDK" />
<orderEntry type="sourceFolder" forTests="false" />
<orderEntry type="library" exported="" name="sshd-core-0.8.0" level="project" />
<orderEntry type="library" exported="" name="appcompat-v7-19.0.1" level="project" />
<orderEntry type="library" exported="" name="tomcat-apr-5.5.15" level="project" />
<orderEntry type="library" exported="" name="slf4j-api-1.6.6" level="project" />
<orderEntry type="library" exported="" name="support-v4-19.0.0" level="project" />
<orderEntry type="library" exported="" name="bcprov-jdk16-1.45" level="project" />
<orderEntry type="library" exported="" name="mina-core-2.0.7" level="project" />
<orderEntry type="library" exported="" name="ComAndroidSupportAppcompatV71900.aar" level="project" />
<orderEntry type="library" exported="" name="support-v4-19.0.1" level="project" />
</component>
</module>

View File

@@ -1,8 +1,8 @@
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="org.kde.kdeconnect_tp"
android:versionCode="9"
android:versionName="0.4">
android:versionCode="14"
android:versionName="0.6">
<uses-sdk android:minSdkVersion="9"
android:targetSdkVersion="18" />
@@ -25,11 +25,14 @@
<uses-permission android:name="android.permission.BATTERY_STATS" />
<uses-permission android:name="android.permission.RECEIVE_SMS" android:required="false" />
<uses-permission android:name="android.permission.READ_CONTACTS" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<application
android:allowBackup="true"
android:icon="@drawable/icon"
android:label="KDE Connect"
android:debuggable="false"
>
<service

View File

@@ -58,11 +58,15 @@ public class LanLinkProvider extends BaseLinkProvider {
super.messageReceived(session, message);
//Log.e("LanLinkProvider","Incoming package, address: "+session.getRemoteAddress()).toString());
//Log.e("LanLinkProvider","Received:"+message);
String theMessage = (String) message;
NetworkPackage np = NetworkPackage.unserialize(theMessage);
if (theMessage.isEmpty()) {
Log.e("LanLinkProvider","Empty package received");
return;
}
LanLink prevLink = nioSessions.get(session.getId());
NetworkPackage np = NetworkPackage.unserialize(theMessage);
if (np.getType().equals(NetworkPackage.PACKAGE_TYPE_IDENTITY)) {
@@ -77,6 +81,7 @@ public class LanLinkProvider extends BaseLinkProvider {
nioSessions.put(session.getId(),link);
addLink(np, link);
} else {
LanLink prevLink = nioSessions.get(session.getId());
if (prevLink == null) {
Log.e("LanLinkProvider","2 Expecting an identity package");
} else {

View File

@@ -50,9 +50,11 @@ public class BackgroundService extends Service {
};
private void loadRememberedDevicesFromSettings() {
//Log.e("BackgroundService", "Loading remembered trusted devices");
SharedPreferences preferences = getSharedPreferences("trusted_devices", Context.MODE_PRIVATE);
Set<String> trustedDevices = preferences.getAll().keySet();
for(String deviceId : trustedDevices) {
//Log.e("BackgroundService", "Loading device "+deviceId);
if (preferences.getBoolean(deviceId, false)) {
Device device = new Device(this, deviceId);
devices.put(deviceId,device);
@@ -110,6 +112,7 @@ public class BackgroundService extends Service {
if (d != null) {
d.removeLink(link);
if (!d.isReachable() && !d.isPaired()) {
//Log.e("onConnectionLost","Removing connection device because it was not paired");
devices.remove(link.getDeviceId());
d.removePairingCallback(devicePairingCallback);
}

View File

@@ -39,7 +39,7 @@ public class Device implements BaseLink.PackageReceiver {
private String deviceId;
private String name;
private PublicKey publicKey;
public PublicKey publicKey;
private int notificationId;
private int protocolVersion;
@@ -175,6 +175,7 @@ public class Device implements BaseLink.PackageReceiver {
@Override
public void sendSuccessful() {
if (pairingTimer != null) pairingTimer.cancel();
pairingTimer = new Timer();
pairingTimer.schedule(new TimerTask() {
@Override
@@ -182,9 +183,10 @@ public class Device implements BaseLink.PackageReceiver {
for (PairingCallback cb : pairingCallback) {
cb.pairingFailed(context.getString(R.string.error_timed_out));
}
Log.e("Device","Unpairing (timeout A)");
pairStatus = PairStatus.NotPaired;
}
}, 30*1000);
}, 30*1000); //Time to wait for the other to accept
pairStatus = PairStatus.Requested;
}
@@ -193,6 +195,7 @@ public class Device implements BaseLink.PackageReceiver {
for (PairingCallback cb : pairingCallback) {
cb.pairingFailed(context.getString(R.string.error_could_not_send_package));
}
Log.e("Device","Unpairing (sendFailed A)");
pairStatus = PairStatus.NotPaired;
}
@@ -208,6 +211,7 @@ public class Device implements BaseLink.PackageReceiver {
if (!isPaired()) return;
//Log.e("Device","Unpairing (unpair)");
pairStatus = PairStatus.NotPaired;
SharedPreferences preferences = context.getSharedPreferences("trusted_devices", Context.MODE_PRIVATE);
@@ -225,16 +229,20 @@ public class Device implements BaseLink.PackageReceiver {
private void pairingDone() {
//Log.e("Device", "Storing as trusted, deviceId: "+deviceId);
if (pairingTimer != null) pairingTimer.cancel();
pairStatus = PairStatus.Paired;
//Store as trusted device
String encodedPublicKey = Base64.encodeToString(publicKey.getEncoded(), 0);
SharedPreferences preferences = context.getSharedPreferences("trusted_devices", Context.MODE_PRIVATE);
preferences.edit().putBoolean(deviceId,true).commit();
//Store device information needed to create a Device object in a future
SharedPreferences.Editor editor = settings.edit();
editor.putString("deviceName", getName());
String encodedPublicKey = Base64.encodeToString(publicKey.getEncoded(), 0);
editor.putString("publicKey", encodedPublicKey);
editor.commit();
@@ -259,6 +267,7 @@ public class Device implements BaseLink.PackageReceiver {
}
@Override
public void sendFailed() {
Log.e("Device","Unpairing (sendFailed B)");
pairStatus = PairStatus.NotPaired;
for (PairingCallback cb : pairingCallback) {
cb.pairingFailed(context.getString(R.string.error_not_reachable));
@@ -272,6 +281,7 @@ public class Device implements BaseLink.PackageReceiver {
Log.i("Device","Rejected pair request started by the other device");
//Log.e("Device","Unpairing (rejectPairing)");
pairStatus = PairStatus.NotPaired;
NetworkPackage np = new NetworkPackage(NetworkPackage.PACKAGE_TYPE_PAIR);
@@ -347,8 +357,9 @@ public class Device implements BaseLink.PackageReceiver {
if (wantsPair == isPaired()) {
if (pairStatus == PairStatus.Requested) {
//Log.e("Device","Unpairing (pair rejected)");
pairStatus = PairStatus.NotPaired;
pairingTimer.cancel();
if (pairingTimer != null) pairingTimer.cancel();
for (PairingCallback cb : pairingCallback) {
cb.pairingFailed(context.getString(R.string.error_canceled_by_other_peer));
}
@@ -376,7 +387,7 @@ public class Device implements BaseLink.PackageReceiver {
Log.i("Pairing","Pair answer");
pairingTimer.cancel();
if (pairingTimer != null) pairingTimer.cancel();
pairingDone();
@@ -405,15 +416,17 @@ public class Device implements BaseLink.PackageReceiver {
notificationId = (int)System.currentTimeMillis();
notificationManager.notify(notificationId, noti);
if (pairingTimer != null) pairingTimer.cancel();
pairingTimer = new Timer();
pairingTimer.schedule(new TimerTask() {
@Override
public void run() {
Log.e("Device","Unpairing (timeout B)");
pairStatus = PairStatus.NotPaired;
notificationManager.cancel(notificationId);
}
}, 25*1000); //Time to show notification
}, 25*1000); //Time to show notification, waiting for user to accept (peer will timeout in 30 seconds)
pairStatus = PairStatus.RequestedByPeer;
for (PairingCallback cb : pairingCallback) cb.incomingRequest();
@@ -432,6 +445,7 @@ public class Device implements BaseLink.PackageReceiver {
reloadPluginsFromSettings();
}
//Log.e("Device","Unpairing (unpair request)");
pairStatus = PairStatus.NotPaired;
for (PairingCallback cb : pairingCallback) cb.unpaired();
@@ -515,7 +529,7 @@ public class Device implements BaseLink.PackageReceiver {
return plugins.get(name);
}
private void addPlugin(final String name) {
private synchronized void addPlugin(final String name) {
Plugin existing = plugins.get(name);
if (existing != null) {
Log.w("addPlugin","plugin already present:" + name);
@@ -561,7 +575,7 @@ public class Device implements BaseLink.PackageReceiver {
}
private boolean removePlugin(String name) {
private synchronized boolean removePlugin(String name) {
Plugin plugin = plugins.remove(name);
Plugin failedPlugin = failedPlugins.remove(name);

View File

@@ -36,7 +36,7 @@ public class ContactsHelper {
String name = cursor.getString(nameIndex);
//Log.e("PhoneNumberLookup", "success: " + name);
cursor.close();
return name;
return name + " (" + number + ")";
}
}

View File

@@ -1,10 +1,12 @@
package org.kde.kdeconnect;
package org.kde.kdeconnect.Helpers;
import android.content.res.Configuration;
import android.content.res.Resources;
import android.os.Build;
import java.util.HashMap;
public class HumanDeviceNames {
public class DeviceHelper {
//from https://github.com/meetup/android-device-names
//Converted to java using:
@@ -167,4 +169,11 @@ public class HumanDeviceNames {
}
public static boolean isTablet() {
Configuration config = Resources.getSystem().getConfiguration();
//This assumes that the values for the screen sizes are consecutive, so XXLARGE > XLARGE > LARGE
boolean isLarge = ((config.screenLayout & Configuration.SCREENLAYOUT_SIZE_MASK) >= Configuration.SCREENLAYOUT_SIZE_LARGE);
return isLarge;
}
}

View File

@@ -10,13 +10,11 @@ import android.util.Log;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import org.kde.kdeconnect.Helpers.DeviceHelper;
import org.kde.kdeconnect.UserInterface.MainSettingsActivity;
import org.kde.kdeconnect_tp.R;
import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.nio.charset.Charset;
import java.security.PrivateKey;
import java.security.PublicKey;
@@ -28,12 +26,14 @@ public class NetworkPackage {
public final static int ProtocolVersion = 5;
//TODO: Move these to their respective plugins
public final static String PACKAGE_TYPE_IDENTITY = "kdeconnect.identity";
public final static String PACKAGE_TYPE_PAIR = "kdeconnect.pair";
public final static String PACKAGE_TYPE_ENCRYPTED = "kdeconnect.encrypted";
public final static String PACKAGE_TYPE_PING = "kdeconnect.ping";
public final static String PACKAGE_TYPE_TELEPHONY = "kdeconnect.telephony";
public final static String PACKAGE_TYPE_BATTERY = "kdeconnect.battery";
public final static String PACKAGE_TYPE_SFTP = "kdeconnect.sftp";
public final static String PACKAGE_TYPE_NOTIFICATION = "kdeconnect.notification";
public final static String PACKAGE_TYPE_CLIPBOARD = "kdeconnect.clipboard";
public final static String PACKAGE_TYPE_MPRIS = "kdeconnect.mpris";
@@ -222,15 +222,19 @@ public class NetworkPackage {
np.mBody.put("deviceName",
PreferenceManager.getDefaultSharedPreferences(context).getString(
MainSettingsActivity.KEY_DEVICE_NAME_PREFERENCE,
HumanDeviceNames.getDeviceName()));
DeviceHelper.getDeviceName()));
np.mBody.put("protocolVersion", NetworkPackage.ProtocolVersion);
} catch (JSONException e) {
np.mBody.put("deviceType", DeviceHelper.isTablet()? "tablet" : "phone");
} catch (Exception e) {
e.printStackTrace();
Log.e("NetworkPacakge","Exception on createIdentityPackage");
}
return np;
}
static public NetworkPackage createPublicKeyPackage(Context context) {
NetworkPackage np = new NetworkPackage(NetworkPackage.PACKAGE_TYPE_PAIR);

View File

@@ -17,9 +17,11 @@ import org.kde.kdeconnect_tp.R;
public class BatteryPlugin extends Plugin {
private NetworkPackage lastPackage = null;
// keep these fields in sync with kdeconnect-kded:BatteryPlugin.h:ThresholdBatteryEvent
private static final int THRESHOLD_EVENT_NONE= 0;
private static final int THRESHOLD_EVENT_BATTERY_LOW = 1;
private IntentFilter filter = new IntentFilter(Intent.ACTION_BATTERY_CHANGED);
NetworkPackage lastInfo = null;
/*static {
PluginFactory.registerPlugin(BatteryPlugin.class);
@@ -50,36 +52,36 @@ public class BatteryPlugin extends Plugin {
return true;
}
private BroadcastReceiver receiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
public void onReceive(Context context, Intent batteryIntent) {
Log.i("BatteryPlugin", "Battery event");
Intent batteryChargeIntent = context.registerReceiver(null, new IntentFilter(Intent.ACTION_BATTERY_CHANGED));
int level = batteryChargeIntent.getIntExtra(BatteryManager.EXTRA_LEVEL, -1);
int scale = batteryChargeIntent.getIntExtra(BatteryManager.EXTRA_SCALE, 1);
int currentCharge = level*100 / scale;
boolean isCharging = (0 != batteryChargeIntent.getIntExtra(BatteryManager.EXTRA_PLUGGED, 0));
boolean lowBattery = Intent.ACTION_BATTERY_LOW.equals(batteryIntent.getAction());
int thresholdEvent = lowBattery? THRESHOLD_EVENT_BATTERY_LOW : THRESHOLD_EVENT_NONE;
boolean isCharging = (0 != intent.getIntExtra(BatteryManager.EXTRA_PLUGGED, 0));
int currentCharge = 100;
int status = intent.getIntExtra(BatteryManager.EXTRA_STATUS, -1);
if (status != BatteryManager.BATTERY_STATUS_FULL) {
Intent batteryStatus = context.registerReceiver(null, filter);
int level = batteryStatus.getIntExtra(BatteryManager.EXTRA_LEVEL, -1);
int scale = batteryStatus.getIntExtra(BatteryManager.EXTRA_SCALE, -1);
currentCharge = level*100 / scale;
}
//Only notify if change is meaningful enough
if (lastPackage == null
|| (
isCharging != lastPackage.getBoolean("isCharging")
|| currentCharge != lastPackage.getInt("currentCharge")
)
if (lastInfo != null
&& isCharging != lastInfo.getBoolean("isCharging")
&& currentCharge != lastInfo.getInt("currentCharge")
&& thresholdEvent != lastInfo.getInt("thresholdEvent")
) {
//Do not send again if nothing has changed
return;
} else {
NetworkPackage np = new NetworkPackage(NetworkPackage.PACKAGE_TYPE_BATTERY);
np.set("isCharging", isCharging);
np.set("currentCharge", currentCharge);
np.set("isCharging", isCharging);
np.set("thresholdEvent", thresholdEvent);
device.sendPackage(np);
lastPackage = np;
lastInfo = np;
}
}
@@ -87,12 +89,14 @@ public class BatteryPlugin extends Plugin {
@Override
public boolean onCreate() {
context.registerReceiver(receiver, filter);
context.registerReceiver(receiver, new IntentFilter(Intent.ACTION_BATTERY_CHANGED));
context.registerReceiver(receiver, new IntentFilter(Intent.ACTION_BATTERY_LOW));
return true;
}
@Override
public void onDestroy() {
//It's okay to call this only once, even though we registered it for two filters
context.unregisterReceiver(receiver);
}
@@ -101,8 +105,8 @@ public class BatteryPlugin extends Plugin {
if (!np.getType().equals(NetworkPackage.PACKAGE_TYPE_BATTERY)) return false;
if (np.getBoolean("request")) {
if (lastPackage != null) {
device.sendPackage(lastPackage);
if (lastInfo != null) {
device.sendPackage(lastInfo);
}
}

View File

@@ -10,12 +10,18 @@ import org.kde.kdeconnect.NetworkPackage;
public class ClipboardListener {
private Context context;
private String currentContent;
private ClipboardManager cm = null;
ClipboardManager.OnPrimaryClipChangedListener listener;
ClipboardListener(final Context context, final Device device) {
ClipboardListener(final Context ctx, final Device device) {
context = ctx;
if(android.os.Build.VERSION.SDK_INT < 11) {
return;
}
cm = (ClipboardManager)context.getSystemService(Context.CLIPBOARD_SERVICE);
listener = new ClipboardManager.OnPrimaryClipChangedListener() {
@Override
@@ -41,12 +47,24 @@ public class ClipboardListener {
}
public void stop() {
if(android.os.Build.VERSION.SDK_INT < 11) {
return;
}
cm.removePrimaryClipChangedListener(listener);
}
@SuppressWarnings("deprecation")
public void setText(String text) {
currentContent = text;
cm.setText(text);
if(android.os.Build.VERSION.SDK_INT < 11) {
android.text.ClipboardManager clipboard = (android.text.ClipboardManager) context.getSystemService(Context.CLIPBOARD_SERVICE);
clipboard.setText(text);
}
else
{
cm.setText(text);
}
}
}

View File

@@ -5,7 +5,6 @@ import android.app.AlertDialog;
import android.content.Context;
import android.content.DialogInterface;
import android.graphics.drawable.Drawable;
import android.os.Build;
import android.widget.Button;
import org.kde.kdeconnect.NetworkPackage;
@@ -39,31 +38,21 @@ public class ClipboardPlugin extends Plugin {
@Override
public boolean isEnabledByDefault() {
return (Build.VERSION.SDK_INT >= 11);
//Disabled by default due to just one direction sync(incoming clipboard change) in early version of android.
return (android.os.Build.VERSION.SDK_INT >= 11);
}
private ClipboardListener listener;
@Override
public boolean onCreate() {
if (Build.VERSION.SDK_INT < 11) {
return false;
}
listener = new ClipboardListener(context, device);
return true;
}
@Override
public void onDestroy() {
if (Build.VERSION.SDK_INT < 11) return;
listener.stop();
}
@Override
@@ -76,7 +65,6 @@ public class ClipboardPlugin extends Plugin {
String content = np.getString("content");
listener.setText(content);
return true;
}
@Override

View File

@@ -27,7 +27,7 @@ public class NotificationReceiver extends NotificationListenerService {
@Override
public void onNotificationPosted(StatusBarNotification statusBarNotification) {
Log.i("NotificationReceiver.onNotificationPosted","listeners: " + listeners.size());
//Log.e("NotificationReceiver.onNotificationPosted","listeners: " + listeners.size());
for(NotificationListener listener : listeners) {
listener.onNotificationPosted(statusBarNotification);
}
@@ -49,7 +49,7 @@ public class NotificationReceiver extends NotificationListenerService {
//This will be called for each intent launch, even if the service is already started and is reused
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
Log.i("NotificationReceiver", "onStartCommand");
//Log.e("NotificationReceiver", "onStartCommand");
for (InstanceCallback c : callbacks) {
c.onServiceStart(this);
}

View File

@@ -126,12 +126,10 @@ public class NotificationsPlugin extends Plugin implements NotificationReceiver.
public void onServiceStart(NotificationReceiver service) {
try {
service.addListener(NotificationsPlugin.this);
/*
StatusBarNotification[] notifications = service.getActiveNotifications();
for (StatusBarNotification notification : notifications) {
onNotificationPosted(notification);
sendNotification(notification, true);
}
*/
} catch(Exception e) {
e.printStackTrace();
Log.e("NotificationsPlugin","Exception");
@@ -178,6 +176,13 @@ public class NotificationsPlugin extends Plugin implements NotificationReceiver.
public void sendNotification(StatusBarNotification statusBarNotification, boolean requestAnswer) {
Notification notification = statusBarNotification.getNotification();
if ((notification.flags & Notification.FLAG_FOREGROUND_SERVICE) != 0
|| (notification.flags & Notification.FLAG_ONGOING_EVENT) != 0 ) {
//This is not a notification!
return;
}
NotificationId id = NotificationId.fromNotification(statusBarNotification);
NetworkPackage np = new NetworkPackage(NetworkPackage.PACKAGE_TYPE_NOTIFICATION);
@@ -204,7 +209,7 @@ public class NotificationsPlugin extends Plugin implements NotificationReceiver.
np.set("id", id.serialize());
np.set("appName", appName == null? packageName : appName);
np.set("isClearable", statusBarNotification.isClearable());
np.set("ticker", notification.tickerText.toString());
np.set("ticker", (notification != null && notification.tickerText != null)? notification.tickerText.toString() : "");
np.set("time", Long.toString(statusBarNotification.getPostTime()));
if (requestAnswer) np.set("requestAnswer", true);

View File

@@ -4,14 +4,18 @@ import android.app.Activity;
import android.app.AlertDialog;
import android.app.Notification;
import android.app.NotificationManager;
import android.app.PendingIntent;
import android.content.Context;
import android.content.Intent;
import android.graphics.drawable.Drawable;
import android.support.v4.app.NotificationCompat;
import android.support.v4.app.TaskStackBuilder;
import android.view.View;
import android.widget.Button;
import org.kde.kdeconnect.NetworkPackage;
import org.kde.kdeconnect.Plugins.Plugin;
import org.kde.kdeconnect.UserInterface.MainActivity;
import org.kde.kdeconnect_tp.R;
@@ -63,9 +67,18 @@ public class PingPlugin extends Plugin {
if (np.getType().equals(NetworkPackage.PACKAGE_TYPE_PING)) {
//Log.e("PingPackageReceiver", "was a ping!");
TaskStackBuilder stackBuilder = TaskStackBuilder.create(context);
stackBuilder.addParentStack(MainActivity.class);
stackBuilder.addNextIntent(new Intent(context, MainActivity.class));
PendingIntent resultPendingIntent = stackBuilder.getPendingIntent(
0,
PendingIntent.FLAG_UPDATE_CURRENT
);
Notification noti = new NotificationCompat.Builder(context)
.setContentTitle(device.getName())
.setContentText("Ping!")
.setContentIntent(resultPendingIntent)
.setTicker("Ping!")
.setSmallIcon(android.R.drawable.ic_dialog_alert)
.setAutoCancel(true)

View File

@@ -7,6 +7,7 @@ import android.util.Log;
import org.kde.kdeconnect.Device;
import org.kde.kdeconnect.Plugins.BatteryPlugin.BatteryPlugin;
import org.kde.kdeconnect.Plugins.SftpPlugin.SftpPlugin;
import org.kde.kdeconnect.Plugins.ClibpoardPlugin.ClipboardPlugin;
import org.kde.kdeconnect.Plugins.MprisPlugin.MprisPlugin;
import org.kde.kdeconnect.Plugins.NotificationsPlugin.NotificationsPlugin;
@@ -67,6 +68,7 @@ public class PluginFactory {
PluginFactory.registerPlugin(MprisPlugin.class);
PluginFactory.registerPlugin(ClipboardPlugin.class);
PluginFactory.registerPlugin(BatteryPlugin.class);
PluginFactory.registerPlugin(SftpPlugin.class);
PluginFactory.registerPlugin(NotificationsPlugin.class);
}

View File

@@ -0,0 +1,210 @@
package org.kde.kdeconnect.Plugins.SftpPlugin;
import android.content.Context;
import android.util.Log;
import org.apache.http.conn.util.InetAddressUtils;
import org.apache.sshd.SshServer;
import org.apache.sshd.common.NamedFactory;
import org.apache.sshd.common.Session;
import org.apache.sshd.server.Command;
import org.apache.sshd.server.FileSystemFactory;
import org.apache.sshd.server.FileSystemView;
import org.apache.sshd.server.PasswordAuthenticator;
import org.apache.sshd.server.PublickeyAuthenticator;
import org.apache.sshd.server.SshFile;
import org.apache.sshd.server.command.ScpCommandFactory;
import org.apache.sshd.server.filesystem.NativeFileSystemView;
import org.apache.sshd.server.filesystem.NativeSshFile;
import org.apache.sshd.server.keyprovider.SimpleGeneratorHostKeyProvider;
import org.apache.sshd.server.session.ServerSession;
import org.apache.sshd.server.sftp.SftpSubsystem;
import org.kde.kdeconnect.Device;
import java.io.File;
import java.net.InetAddress;
import java.net.NetworkInterface;
import java.net.SocketException;
import java.security.PublicKey;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Enumeration;
import java.util.List;
class SimplePasswordAuthenticator implements PasswordAuthenticator {
public void setUser(String user) {this.user = user;}
public String getUser() {return this.user;}
public void setPassword(String password) {this.password = password;}
public String getPassword() {return this.password;}
@Override
public boolean authenticate(String user, String password, ServerSession session) {
return user.equals(this.user) && password.equals(this.password);
}
private String user;
private String password;
}
class SimplePublicKeyAuthenticator implements PublickeyAuthenticator {
private List<PublicKey> keys = new ArrayList<PublicKey>();
public void addKey(PublicKey key) {
keys.add(key);
}
@Override
public boolean authenticate(String user, PublicKey key, ServerSession session) {
for (PublicKey k : keys) {
if (key.equals(k)) {
return true;
}
}
return false;
}
}
class SimpleSftpServer {
private static final int STARTPORT = 1739;
private static final int ENDPORT = 1764;
private static final String USER = "kdeconnect";
public static int port = -1;
private static boolean started = false;
public final SimplePasswordAuthenticator passwordAuth = new SimplePasswordAuthenticator();
public final SimplePublicKeyAuthenticator keyAuth = new SimplePublicKeyAuthenticator();
private final SshServer sshd = SshServer.setUpDefaultServer();
public void init(Context ctx, Device device) {
passwordAuth.setUser(USER);
keyAuth.addKey(device.publicKey);
sshd.setKeyPairProvider(new SimpleGeneratorHostKeyProvider(ctx.getFilesDir() + "/sftpd.ser"));
//sshd.setFileSystemFactory(new NativeFileSystemFactory());
sshd.setFileSystemFactory(new SecureFileSystemFactory());
//sshd.setShellFactory(new ProcessShellFactory(new String[] { "/bin/sh", "-i", "-l" }));
sshd.setCommandFactory(new ScpCommandFactory());
sshd.setSubsystemFactories(Arrays.<NamedFactory<Command>>asList(new SftpSubsystem.Factory()));
sshd.setPasswordAuthenticator(passwordAuth);
sshd.setPublickeyAuthenticator(keyAuth);
}
public boolean start() {
if (!started) {
String password = Long.toHexString(Double.doubleToLongBits(Math.random()));
passwordAuth.setPassword(password);
port = STARTPORT;
while(!started) {
try {
sshd.setPort(port);
sshd.start();
started = true;
} catch(Exception e) {
port++;
if (port >= ENDPORT) {
port = -1;
Log.e("SftpServer", "No more ports available");
return false;
}
}
}
}
return true;
}
public void stop() {
try {
started = false;
sshd.stop();
} catch (InterruptedException e) {
}
}
public String getLocalIpAddress() {
String ip6 = null;
try {
for (Enumeration<NetworkInterface> en = NetworkInterface.getNetworkInterfaces(); en.hasMoreElements();) {
NetworkInterface intf = en.nextElement();
for (Enumeration<InetAddress> enumIpAddr = intf.getInetAddresses(); enumIpAddr.hasMoreElements();) {
InetAddress inetAddress = enumIpAddr.nextElement();
if (!inetAddress.isLoopbackAddress()) {
String address = inetAddress.getHostAddress();
if (InetAddressUtils.isIPv4Address(address)) { //Prefer IPv4 over IPv6, because sshfs doesn't seem to like IPv6
return address;
} else {
ip6 = address;
}
}
}
}
} catch (SocketException ex) {
}
return ip6;
}
}
class SecureFileSystemFactory implements FileSystemFactory {
public SecureFileSystemFactory() {}
@Override
public FileSystemView createFileSystemView(final Session username) {
final String base = "/";
return new SecureFileSystemView(base, username.getUsername());
}
}
class SecureFileSystemView extends NativeFileSystemView {
// the first and the last character will always be '/'
// It is always with respect to the root directory.
private String currDir = "/";
private String rootDir = "/";
private String userName;
private boolean caseInsensitive = false;
//
public SecureFileSystemView(final String rootDir, final String userName) {
super(userName);
this.rootDir = NativeSshFile.normalizeSeparateChar(rootDir);
this.userName = userName;
}
//
@Override
public SshFile getFile(final String file) {
return getFile(currDir, file);
}
@Override
public SshFile getFile(final SshFile baseDir, final String file) {
return getFile(baseDir.getAbsolutePath(), file);
}
//
protected SshFile getFile(final String dir, final String file) {
// get actual file object
String physicalName = NativeSshFile.getPhysicalName("/", dir, file, caseInsensitive);
File fileObj = new File(rootDir, physicalName); // chroot
// strip the root directory and return
String userFileName = physicalName.substring("/".length() - 1);
return new SecureSshFile(this, userFileName, fileObj, userName);
}
}
class SecureSshFile extends NativeSshFile {
//
public SecureSshFile(final SecureFileSystemView view, final String fileName, final File file, final String userName) {
super(fileName, file, userName);
}
}

View File

@@ -0,0 +1,79 @@
package org.kde.kdeconnect.Plugins.SftpPlugin;
import android.app.Activity;
import android.app.AlertDialog;
import android.content.Context;
import android.graphics.drawable.Drawable;
import android.os.Environment;
import android.widget.Button;
import org.kde.kdeconnect.NetworkPackage;
import org.kde.kdeconnect.Plugins.Plugin;
import org.kde.kdeconnect_tp.R;
public class SftpPlugin extends Plugin {
private static final SimpleSftpServer server = new SimpleSftpServer();
/*static {
PluginFactory.registerPlugin(SftpPlugin.class);
}*/
@Override
public String getPluginName() {return "plugin_sftp";}
@Override
public String getDisplayName() {
return context.getResources().getString(R.string.pref_plugin_sftp);
}
@Override
public String getDescription() {
return context.getResources().getString(R.string.pref_plugin_sftp_desc);
}
@Override
public Drawable getIcon() {
return context.getResources().getDrawable(R.drawable.icon);
}
@Override
public boolean isEnabledByDefault() {return true;}
@Override
public boolean onCreate() {
server.init(context, device);
return true;
}
@Override
public void onDestroy() {
server.stop();
}
@Override
public boolean onPackageReceived(NetworkPackage np) {
if (!np.getType().equals(NetworkPackage.PACKAGE_TYPE_SFTP)) return false;
if (np.getBoolean("startBrowsing")) {
if (server.start()) {
NetworkPackage np2 = new NetworkPackage(NetworkPackage.PACKAGE_TYPE_SFTP);
np2.set("ip", server.getLocalIpAddress());
np2.set("port", server.port);
np2.set("user", server.passwordAuth.getUser());
np2.set("password", server.passwordAuth.getPassword());
np2.set("path", Environment.getExternalStorageDirectory().getAbsolutePath());
device.sendPackage(np2);
return true;
}
}
return false;
}
@Override
public AlertDialog getErrorDialog(Context baseContext) {return null;}
@Override
public Button getInterfaceButton(Activity activity) {return null;}
}

View File

@@ -96,6 +96,8 @@ public class TelephonyPlugin extends Plugin {
public void callBroadcastReceived(int state, String phoneNumber) {
//Log.e("TelephonyPlugin", "callBroadcastReceived");
NetworkPackage np = new NetworkPackage(NetworkPackage.PACKAGE_TYPE_TELEPHONY);
if (phoneNumber != null) {
phoneNumber = ContactsHelper.phoneNumberLookup(context,phoneNumber);
@@ -162,6 +164,7 @@ public class TelephonyPlugin extends Plugin {
@Override
public boolean onCreate() {
//Log.e("TelephonyPlugin", "onCreate");
IntentFilter filter = new IntentFilter("android.provider.Telephony.SMS_RECEIVED");
filter.addAction(TelephonyManager.ACTION_PHONE_STATE_CHANGED);
context.registerReceiver(receiver, filter);

View File

@@ -24,6 +24,7 @@ import org.kde.kdeconnect_tp.R;
import java.util.ArrayList;
import java.util.Collection;
import java.util.ConcurrentModificationException;
import java.util.HashMap;
public class DeviceActivity extends ActionBarActivity {
@@ -63,18 +64,25 @@ public class DeviceActivity extends ActionBarActivity {
}
});
//Buttons list
ArrayList<ListAdapter.Item> items = new ArrayList<ListAdapter.Item>();
final Collection<Plugin> plugins = device.getLoadedPlugins().values();
for (Plugin p : plugins) {
Button b = p.getInterfaceButton(DeviceActivity.this);
if (b != null) {
items.add(new SectionItem(p.getDisplayName()));
items.add(new ButtonItem(b));
try {
//Buttons list
ArrayList<ListAdapter.Item> items = new ArrayList<ListAdapter.Item>();
final Collection<Plugin> plugins = device.getLoadedPlugins().values();
for (Plugin p : plugins) {
Button b = p.getInterfaceButton(DeviceActivity.this);
if (b != null) {
items.add(new SectionItem(p.getDisplayName()));
items.add(new ButtonItem(b));
}
}
ListView buttonsList = (ListView)findViewById(R.id.buttons_list);
buttonsList.setAdapter(new ListAdapter(DeviceActivity.this, items));
} catch(ConcurrentModificationException e) {
Log.e("DeviceActivity", "ConcurrentModificationException");
this.run(); //Try again
}
ListView buttonsList = (ListView)findViewById(R.id.buttons_list);
buttonsList.setAdapter(new ListAdapter(DeviceActivity.this, items));
}
});

View File

@@ -13,7 +13,7 @@ import android.preference.PreferenceManager;
import android.util.Log;
import android.widget.Toast;
import org.kde.kdeconnect.HumanDeviceNames;
import org.kde.kdeconnect.Helpers.DeviceHelper;
import org.kde.kdeconnect_tp.R;
public class MainSettingsActivity extends PreferenceActivity{
@@ -79,7 +79,7 @@ public class MainSettingsActivity extends PreferenceActivity{
Log.i("MainSettingsActivity", "New device name: " + deviceName);
PreferenceManager.getDefaultSharedPreferences(context).edit().putString(
KEY_DEVICE_NAME_PREFERENCE,
HumanDeviceNames.getDeviceName()).commit();
DeviceHelper.getDeviceName()).commit();
}
}

View File

@@ -180,6 +180,9 @@ public class ShareToReceiver extends ActionBarActivity {
if (uri.getScheme().equals("file")) {
// file:// is a non media uri, so we cannot query the ContentProvider
np.set("filename", uri.getLastPathSegment());
try {
size = (int)new File(uri.getPath()).length();
np.setPayload(inputStream, size);
@@ -187,35 +190,23 @@ public class ShareToReceiver extends ActionBarActivity {
e.printStackTrace();
Log.e("ShareToReceiver", "Could not obtain file size");
}
try{
np.set("filename", uri.getLastPathSegment());
} catch (Exception e) {
e.printStackTrace();
Log.e("ShareToReceiver", "Could not obtain file name");
}
}else{
// Probably a content:// uri, so we query the Media content provider
String[] proj = { MediaStore.MediaColumns.DATA, MediaStore.MediaColumns.SIZE, MediaStore.MediaColumns.DISPLAY_NAME };
Cursor cursor = managedQuery(uri, proj, null, null, null);
try {
int column_index = cursor.getColumnIndexOrThrow(MediaStore.MediaColumns.SIZE);
cursor.moveToFirst();
size = cursor.getInt(column_index);
} catch(Exception e) {
e.printStackTrace();
Log.e("ShareToReceiver", "Could not obtain file size");
}
//Log.e("ShareToReceiver", "Size "+size);
np.setPayload(inputStream, size);
Cursor cursor = null;
try {
String[] proj = { MediaStore.MediaColumns.DATA, MediaStore.MediaColumns.SIZE, MediaStore.MediaColumns.DISPLAY_NAME };
cursor = getContentResolver().query(uri, proj, null, null, null);
int column_index = cursor.getColumnIndexOrThrow(MediaStore.MediaColumns.DATA);
cursor.moveToFirst();
String path = cursor.getString(column_index);
np.set("filename", Uri.parse(path).getLastPathSegment());
np.set("size", (int)new File(path).length());
} catch(Exception _) {
Log.e("ShareToReceiver", "Could not resolve media to a file, trying to get info as media");
try {
int column_index = cursor.getColumnIndexOrThrow(MediaStore.MediaColumns.DISPLAY_NAME);
cursor.moveToFirst();
@@ -225,9 +216,22 @@ public class ShareToReceiver extends ActionBarActivity {
e.printStackTrace();
Log.e("ShareToReceiver", "Could not obtain file name");
}
try {
int column_index = cursor.getColumnIndexOrThrow(MediaStore.MediaColumns.SIZE);
cursor.moveToFirst();
//For some reason this size can differ from the actual file size!
size = cursor.getInt(column_index);
} catch(Exception e) {
e.printStackTrace();
Log.e("ShareToReceiver", "Could not obtain file size");
}
} finally {
cursor.close();
}
cursor.close();
np.setPayload(inputStream, size);
}
device.sendPackage(np, new Device.SendPackageFinishedCallback() {

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 42 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 750 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 365 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.0 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 6.7 KiB

After

Width:  |  Height:  |  Size: 3.0 KiB

View File

@@ -0,0 +1,8 @@
<?xml version='1.0' encoding='utf-8'?>
<resources>
<string name="pref_plugin_battery">Baterijski izvještaj</string>
<string name="pref_plugin_battery_desc">Periodično javi baterijski status</string>
<string name="pref_plugin_ping">Ping</string>
<string name="pref_plugin_ping_desc">Šalji i primaj ping-ove</string>
<string name="pref_plugin_notifications">Sinhronizovano obavještenje</string>
</resources>

View File

@@ -12,6 +12,7 @@
<string name="category_not_paired_devices">Nespárovaná zařízení</string>
<string name="category_remembered_devices">Zapamatovaná zařízení</string>
<string name="device_menu_plugins">Vyberte moduly</string>
<string name="unknown_device">Neznámé zařízení</string>
<string name="error_timed_out">Čas vypršel</string>
<string name="error_canceled_by_user">Přerušeno uživatelem</string>
<string name="reconnect">Znovu připojit</string>
@@ -21,8 +22,12 @@
<string name="remote_control">Vzdálené ovládání</string>
<string name="mpris_play">Přehrát</string>
<string name="mpris_previous">Předchozí</string>
<string name="mpris_rew">Přetočit zpět</string>
<string name="mpris_ff">Rychle vpřed</string>
<string name="mpris_next">Následující</string>
<string name="mpris_volume">Hlasitost</string>
<string name="general_settings">Otevřít nastavení</string>
<string name="device_name">Zařízení</string>
<string name="general_settings">Obecná nastavení</string>
<string name="device_name">Název zařízení</string>
<string name="device_name_preference_summary">%s</string>
<string name="invalid_device_name">Neplatný název zařízení</string>
</resources>

View File

@@ -0,0 +1,65 @@
<?xml version='1.0' encoding='utf-8'?>
<resources>
<string name="pref_plugin_telephony">Telefonibekendtgørelse</string>
<string name="pref_plugin_telephony_desc">Send bekendtgørelser om SMS\'er og opkald</string>
<string name="pref_plugin_battery">Batterirapport</string>
<string name="pref_plugin_battery_desc">Rapportér batteristatus periodisk</string>
<string name="pref_plugin_sftp">Filsystem-expose</string>
<string name="pref_plugin_sftp_desc">Muliggør at gennemsøge telefonens filsystem eksternt</string>
<string name="pref_plugin_clipboard">Synk. af udklipsholder</string>
<string name="pref_plugin_clipboard_desc">Del indholdet af udklipsholderen</string>
<string name="pref_plugin_mpris">Fjernbetjening af multimedie</string>
<string name="pref_plugin_mpris_desc">Styr lyd og video fra din telefon</string>
<string name="pref_plugin_ping">Ping</string>
<string name="pref_plugin_ping_desc">Send og modtag ping</string>
<string name="pref_plugin_notifications">Synk. af bekendtgørelser</string>
<string name="pref_plugin_notifications_desc">Tilgå dine bekendtgørelser fra andre enheder</string>
<string name="plugin_not_available">Denne funktion er ikke tilgængelig i din Android-version</string>
<string name="device_list_empty">Ingen enheder</string>
<string name="ok">O.k.</string>
<string name="cancel">Annullér</string>
<string name="open_settings">Åbn indstillinger</string>
<string name="no_permissions">Du skal give tilladelse for at tilgå bekendtgørelser</string>
<string name="send_ping">Send ping</string>
<string name="open_mpris_controls">Åbn fjernbetjening</string>
<string name="category_connected_devices">Forbundne enheder</string>
<string name="category_not_paired_devices">Ikke parrede enheder</string>
<string name="category_remembered_devices">Huskede enheder</string>
<string name="plugins_failed_to_load">Plugins kunne ikke indlæses (tap for mere info):</string>
<string name="device_menu_plugins">Vælg plugins</string>
<string name="device_menu_unpair">Fjern parring</string>
<string name="unknown_device">Ukendt enhed</string>
<string name="error_not_reachable">Enheden kan ikke nås</string>
<string name="error_already_requested">Allerede anmodet om parring</string>
<string name="error_already_paired">Enhed allerede parret</string>
<string name="error_could_not_send_package">Kunne ikke sende pakke</string>
<string name="error_timed_out">Tidsudløb</string>
<string name="error_canceled_by_user">Annulleret af brugeren</string>
<string name="error_canceled_by_other_peer">Annulleret af modpart</string>
<string name="error_invalid_key">Ugyldige nøgle modtaget</string>
<string name="pair_requested">Anmodet om parring</string>
<string name="pairing_request_from">Parringsanmodning fra %1s</string>
<string name="tap_to_answer">Tap for at svare</string>
<string name="reconnect">Forbind igen</string>
<string name="device_not_paired">Enhed ikke parret</string>
<string name="request_pairing">Anmod om parring</string>
<string name="pairing_accept">Acceptér</string>
<string name="pairing_reject">Afvis</string>
<string name="device">Enhed</string>
<string name="pair_device">Par med enhed</string>
<string name="remote_control">Fjernbetjening</string>
<string name="settings">Indstilling af KDE Connect</string>
<string name="mpris_play">Afspil</string>
<string name="mpris_previous">Forrige</string>
<string name="mpris_rew">Spol tilbage</string>
<string name="mpris_ff">Spol frem</string>
<string name="mpris_next">Næste</string>
<string name="mpris_volume">Lydstyrke</string>
<string name="share_to">Del på...</string>
<string name="protocol_version_older">Denne enhed bruger en gammel protokolversion</string>
<string name="protocol_version_newer">Denne enhed bruger en nyere protokolversion</string>
<string name="general_settings">Generelle indstillinger</string>
<string name="device_name">Enhedsnavn</string>
<string name="device_name_preference_summary">%s</string>
<string name="invalid_device_name">Ugyldigt enhedsnavn</string>
</resources>

View File

@@ -4,9 +4,12 @@
<string name="pref_plugin_telephony_desc">Benachrichtigungen über SMS und Anrufe senden</string>
<string name="pref_plugin_battery">Akkubericht</string>
<string name="pref_plugin_battery_desc">Akkustatus periodisch berichten</string>
<string name="pref_plugin_sftp">Dateisystem zeigen</string>
<string name="pref_plugin_sftp_desc">Erlaubt das Browsen des Dateisystems auf dem entfernten Handy</string>
<string name="pref_plugin_clipboard">Abgleich der Zwischenablage</string>
<string name="pref_plugin_clipboard_desc">Inhalt der Zwischenablage freigeben</string>
<string name="pref_plugin_mpris">Multimedia-Fernbedienungen</string>
<string name="pref_plugin_mpris_desc">Audio und Video mit Ihrem Telefon steuern</string>
<string name="pref_plugin_ping">Ping</string>
<string name="pref_plugin_ping_desc">Senden und Empfangen von Pings</string>
<string name="pref_plugin_notifications">Benachrichtigungs-Abgleich</string>
@@ -16,10 +19,13 @@
<string name="ok">OK</string>
<string name="cancel">Abbrechen</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="send_ping">Ping senden</string>
<string name="open_mpris_controls">Fernbedienung öffnen</string>
<string name="category_connected_devices">Verbundene Geräte</string>
<string name="category_not_paired_devices">Keine angeschlossenen Geräte</string>
<string name="category_remembered_devices">Gemerkte Geräte</string>
<string name="plugins_failed_to_load">Laden der Module fehlgeschlagen, tippen Sie für weitere Details:</string>
<string name="device_menu_plugins">Module auswählen</string>
<string name="device_menu_unpair">Verbindung trennen</string>
<string name="unknown_device">Unbekanntes Gerät</string>
@@ -33,6 +39,7 @@
<string name="error_invalid_key">Ungültiger Schlüssel empfangen</string>
<string name="pair_requested">Verbindung angefordert</string>
<string name="pairing_request_from">Verbindungsanfrage von %1s</string>
<string name="tap_to_answer">Tippen zum Antworten</string>
<string name="reconnect">Erneut verbinden</string>
<string name="device_not_paired">Das Gerät ist nicht verbunden</string>
<string name="request_pairing">Verbindung angefordert</string>
@@ -44,8 +51,11 @@
<string name="settings">KDE-Verbindungseinstellungen</string>
<string name="mpris_play">Wiedergabe</string>
<string name="mpris_previous">Zurück</string>
<string name="mpris_rew">Schneller Rücklauf</string>
<string name="mpris_ff">Vorlauf</string>
<string name="mpris_next">Weiter</string>
<string name="mpris_volume">Lautstärke</string>
<string name="share_to">Freigeben für ...</string>
<string name="protocol_version_older">Dieses Gerät verwendet ein alte Protokollversion</string>
<string name="protocol_version_newer">Dieses Gerät verwendet ein neuere Protokollversion</string>
<string name="general_settings">Allgemeine Einstellungen</string>

View File

@@ -4,6 +4,8 @@
<string name="pref_plugin_telephony_desc">Enviar notificaciones de SMS y llamadas</string>
<string name="pref_plugin_battery">Informe de la batería</string>
<string name="pref_plugin_battery_desc">Informar periódicamente del estado de la batería</string>
<string name="pref_plugin_sftp">Revelar el sistema de archivos</string>
<string name="pref_plugin_sftp_desc">Permite explorar de forma remota el sistema de archivos del teléfono</string>
<string name="pref_plugin_clipboard">Sincronización del portapapeles</string>
<string name="pref_plugin_clipboard_desc">Compartir el contenido del portapapeles</string>
<string name="pref_plugin_mpris">Controles remotos multimedia</string>
@@ -49,12 +51,15 @@
<string name="settings">Preferencias de KDE Connect</string>
<string name="mpris_play">Reproducir</string>
<string name="mpris_previous">Anterior</string>
<string name="mpris_rew">Rebobinar</string>
<string name="mpris_ff">Avance rápido</string>
<string name="mpris_next">Siguiente</string>
<string name="mpris_volume">Volumen</string>
<string name="share_to">Compartir con...</string>
<string name="protocol_version_older">Este dispositivo usa una versión antigua del protocolo</string>
<string name="protocol_version_newer">Este dispositivo usa una versión más reciente del protocolo</string>
<string name="general_settings">Abrir preferencias</string>
<string name="device_name">Dispositivo no vinculado</string>
<string name="invalid_device_name">Se ha recibido una clave no valida</string>
<string name="general_settings">Preferencias generales</string>
<string name="device_name">Nombre de dispositivo</string>
<string name="device_name_preference_summary">%s</string>
<string name="invalid_device_name">Nombre de dispositivo no valido</string>
</resources>

View File

@@ -0,0 +1,63 @@
<?xml version='1.0' encoding='utf-8'?>
<resources>
<string name="pref_plugin_telephony">Puhelinilmoitukset</string>
<string name="pref_plugin_telephony_desc">Lähetä ilmoitukset tekstiviesteistä ja puheluista</string>
<string name="pref_plugin_battery">Akkuraportti</string>
<string name="pref_plugin_battery_desc">Raportoi akun tila säännöllisesti</string>
<string name="pref_plugin_clipboard">Leikepöydän synkronointi</string>
<string name="pref_plugin_clipboard_desc">Jaa leikepöydän sisältö</string>
<string name="pref_plugin_mpris">Multimediakauko-ohjaimet</string>
<string name="pref_plugin_mpris_desc">Ohjaa ääntä ja videota puhelimestasi</string>
<string name="pref_plugin_ping">Tiedustelupaketti</string>
<string name="pref_plugin_ping_desc">Lähetä ja vastaanota tiedustelupaketteja</string>
<string name="pref_plugin_notifications">Ilmoitusten synkronointi</string>
<string name="pref_plugin_notifications_desc">Näe ilmoituksesi muissa laitteissa</string>
<string name="plugin_not_available">Piirre ei ole käytettävissä Android-versiossasi</string>
<string name="device_list_empty">Ei laitteita</string>
<string name="ok">OK</string>
<string name="cancel">Peru</string>
<string name="open_settings">Avaa asetukset</string>
<string name="no_permissions">Sinun on annettava lupa ilmoitusten näkemiseen</string>
<string name="send_ping">Lähetä tiedustelupaketti</string>
<string name="open_mpris_controls">Avaa kauko-ohjain</string>
<string name="category_connected_devices">Yhdistetyt laitteet</string>
<string name="category_not_paired_devices">Ei laitepareja</string>
<string name="category_remembered_devices">Muistetut laitteet</string>
<string name="plugins_failed_to_load">Liitännäisten lataus epäonnistui (lisätietoa napsauttamalla):</string>
<string name="device_menu_plugins">Valitse liitännäiset</string>
<string name="device_menu_unpair">Irrota paritus</string>
<string name="unknown_device">Tuntematon laite</string>
<string name="error_not_reachable">Laite tavoittamattomissa</string>
<string name="error_already_requested">Paritusta on jo pyydetty</string>
<string name="error_already_paired">Laitepari on jo muodostettu</string>
<string name="error_could_not_send_package">Ei voitu lähettää pakettia</string>
<string name="error_timed_out">Aikakatkaisu</string>
<string name="error_canceled_by_user">Käyttäjä perui</string>
<string name="error_canceled_by_other_peer">Vertaiskäyttäjä perui</string>
<string name="error_invalid_key">Vastaanotettiin väärä avain</string>
<string name="pair_requested">Parituspyyntö</string>
<string name="pairing_request_from">Parituspyyntö kohteesta %1s</string>
<string name="tap_to_answer">Vastaa napsauttamalla</string>
<string name="reconnect">Yhdistä uudelleen</string>
<string name="device_not_paired">Ei laiteparia</string>
<string name="request_pairing">Pyydä paritusta</string>
<string name="pairing_accept">Hyväksy</string>
<string name="pairing_reject">Hylkää</string>
<string name="device">Laite</string>
<string name="pair_device">Parita laite</string>
<string name="remote_control">Kauko-ohjain</string>
<string name="settings">KDE Connectin asetukset</string>
<string name="mpris_play">Toista</string>
<string name="mpris_previous">Edellinen</string>
<string name="mpris_rew">Kelaa takaisin</string>
<string name="mpris_ff">Nopeasti eteenpäin</string>
<string name="mpris_next">Seuraava</string>
<string name="mpris_volume">Äänenvoimakkuus</string>
<string name="share_to">Jaa…</string>
<string name="protocol_version_older">Laite käyttää vanha yhteyskäytäntöversiota</string>
<string name="protocol_version_newer">Laite käyttää uudempaa yhteyskäytäntöversiota</string>
<string name="general_settings">Yleisasetukset</string>
<string name="device_name">Laitenimi</string>
<string name="device_name_preference_summary">%s</string>
<string name="invalid_device_name">Virheellinen laitenimi</string>
</resources>

View File

@@ -8,7 +8,7 @@
<string name="pref_plugin_clipboard_desc">Partage le contenu du presse-papiers</string>
<string name="pref_plugin_mpris">Contrôles distants multimédia</string>
<string name="pref_plugin_mpris_desc">Contrôle l\'audio / la vidéo depuis votre téléphone</string>
<string name="pref_plugin_ping">Commande « Ping »</string>
<string name="pref_plugin_ping">Commande « Ping »</string>
<string name="pref_plugin_ping_desc">Envoie et reçoit des commandes « Ping »</string>
<string name="pref_plugin_notifications">Synchronisation des notifications</string>
<string name="pref_plugin_notifications_desc">Accédez à vos notifications depuis d\'autres périphériques</string>
@@ -49,9 +49,15 @@
<string name="settings">Paramètres de connexion de KDE</string>
<string name="mpris_play">Lire</string>
<string name="mpris_previous">Précédent</string>
<string name="mpris_rew">Retour rapide</string>
<string name="mpris_ff">Avance rapide</string>
<string name="mpris_next">Suivant</string>
<string name="mpris_volume">Volume</string>
<string name="general_settings">Accéder aux paramètres</string>
<string name="device_name">Périphérique non apparié</string>
<string name="invalid_device_name">Clé reçue non valable</string>
<string name="share_to">Partager vers...</string>
<string name="protocol_version_older">Le périphérique utilise une version ancienne du protocole</string>
<string name="protocol_version_newer">Le périphérique utilise une version plus récente du protocole</string>
<string name="general_settings">Paramètres généraux</string>
<string name="device_name">Nom du périphérique</string>
<string name="device_name_preference_summary">%s</string>
<string name="invalid_device_name">Nom de périphérique non valable</string>
</resources>

View File

@@ -4,6 +4,8 @@
<string name="pref_plugin_telephony_desc">Értesítés küldése SMS-hez és hívásokhoz</string>
<string name="pref_plugin_battery">Akkumulátor jelentés</string>
<string name="pref_plugin_battery_desc">Akkumulátorállapot időszakos jelentése</string>
<string name="pref_plugin_sftp">Fájlrendszer kifejtés</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_desc">A vágólap tartalmának megosztása</string>
<string name="pref_plugin_mpris">Multimedia távirányítók</string>
@@ -49,12 +51,15 @@
<string name="settings">KDE csatlakozás beállítások</string>
<string name="mpris_play">Lejátszás</string>
<string name="mpris_previous">Előző</string>
<string name="mpris_rew">Visszatekerés</string>
<string name="mpris_ff">Gyors előretekerés</string>
<string name="mpris_next">Következő</string>
<string name="mpris_volume">Hangerő</string>
<string name="share_to">Megosztás…</string>
<string name="protocol_version_older">Ez az eszköz egy régi protokollverziót használ</string>
<string name="protocol_version_newer">Ez az eszköz egy újabb protokollverziót használ</string>
<string name="general_settings">Beállítások megnyitása</string>
<string name="device_name">Az eszköz nincs párosítva</string>
<string name="invalid_device_name">Érvénytelen kulcs érkezett</string>
<string name="general_settings">Általános beállítások</string>
<string name="device_name">Eszköznév</string>
<string name="device_name_preference_summary">%s</string>
<string name="invalid_device_name">Érvénytelen eszköznév</string>
</resources>

View File

@@ -0,0 +1,63 @@
<?xml version='1.0' encoding='utf-8'?>
<resources>
<string name="pref_plugin_telephony">Notifiche telefoniche</string>
<string name="pref_plugin_telephony_desc">Invia notifiche di SMS e chiamate</string>
<string name="pref_plugin_battery">Livello batteria</string>
<string name="pref_plugin_battery_desc">Comunica periodicamente lo stato della batteria</string>
<string name="pref_plugin_clipboard">Sincronizzazione appunti</string>
<string name="pref_plugin_clipboard_desc">Condividi il contenuto degli appunti</string>
<string name="pref_plugin_mpris">Telecomando multimediale</string>
<string name="pref_plugin_mpris_desc">Controlla la riproduzione audio/video dal telefono</string>
<string name="pref_plugin_ping">Ping</string>
<string name="pref_plugin_ping_desc">Invia e ricevi ping</string>
<string name="pref_plugin_notifications">Sincronizzazione notifiche</string>
<string name="pref_plugin_notifications_desc">Consenti l\'accesso alle notifiche dagli altri dispositivi</string>
<string name="plugin_not_available">Questa funzionalità non è disponibile sulla tua versione di Android</string>
<string name="device_list_empty">Nessun dispositivo</string>
<string name="ok">OK</string>
<string name="cancel">Annulla</string>
<string name="open_settings">Apri impostazioni</string>
<string name="no_permissions">Devi garantire a KDE Connect l\'accesso alle notifiche</string>
<string name="send_ping">Invia ping</string>
<string name="open_mpris_controls">Apri il telecomando multimediale</string>
<string name="category_connected_devices">Dispositivi connessi</string>
<string name="category_not_paired_devices">Dispositivi non associati</string>
<string name="category_remembered_devices">Dispositivi memorizzati</string>
<string name="plugins_failed_to_load">Alcune estensioni non si sono avviate correttamente (tocca per maggiori informazioni):</string>
<string name="device_menu_plugins">Estensioni</string>
<string name="device_menu_unpair">Disassocia</string>
<string name="unknown_device">Dispositivo sconosciuto</string>
<string name="error_not_reachable">Dispositivo fuori portata</string>
<string name="error_already_requested">Richiesta già inviata</string>
<string name="error_already_paired">Dispositivo già associato</string>
<string name="error_could_not_send_package">Impossibile inviare i dati</string>
<string name="error_timed_out">Richiesta scaduta</string>
<string name="error_canceled_by_user">Richiesta annullata dall\'utente</string>
<string name="error_canceled_by_other_peer">Richiesta annullata dal dispositivo remoto</string>
<string name="error_invalid_key">Ricevuta chiave non valida</string>
<string name="pair_requested">Richiesta di associazione</string>
<string name="pairing_request_from">Richiesta associazione da %1s</string>
<string name="tap_to_answer">Tocca per rispondere</string>
<string name="reconnect">Riconnetti</string>
<string name="device_not_paired">Dispositivo non associato</string>
<string name="request_pairing">Richiedi associazione</string>
<string name="pairing_accept">Accetta</string>
<string name="pairing_reject">Rifiuta</string>
<string name="device">Dispositivo</string>
<string name="pair_device">Associa dispositivo</string>
<string name="remote_control">Telecomando</string>
<string name="settings">Impostazioni</string>
<string name="mpris_play">Riproduci</string>
<string name="mpris_previous">Precedente</string>
<string name="mpris_rew">Riavvolgi</string>
<string name="mpris_ff">Avanti veloce</string>
<string name="mpris_next">Successivo</string>
<string name="mpris_volume">Volume</string>
<string name="share_to">Condividi…</string>
<string name="protocol_version_older">Questo dispositivo usa una vecchia versione del protocollo di rete</string>
<string name="protocol_version_newer">Questo dispositivo usa una nuova versione del protocollo di rete</string>
<string name="general_settings">Impostazioni generali</string>
<string name="device_name">Nome dispositivo</string>
<string name="device_name_preference_summary">%s</string>
<string name="invalid_device_name">Nome non valido</string>
</resources>

View File

@@ -0,0 +1,2 @@
<?xml version='1.0' encoding='utf-8'?>
<resources/>

View File

@@ -4,6 +4,8 @@
<string name="pref_plugin_telephony_desc">Stuur meldingen voor SMS en oproepen</string>
<string name="pref_plugin_battery">Batterijrapportage</string>
<string name="pref_plugin_battery_desc">Rapporteer periodiek de status van de batterij</string>
<string name="pref_plugin_sftp">Bestandssysteem blootstellen</string>
<string name="pref_plugin_sftp_desc">Het bladeren in het bestandssysteem op afstand in de telefoon toestaan</string>
<string name="pref_plugin_clipboard">Klembordsynchronisatie</string>
<string name="pref_plugin_clipboard_desc">De inhoud van het klembord delen</string>
<string name="pref_plugin_mpris">Afstandsbediening van multimedia</string>

View File

@@ -4,6 +4,8 @@
<string name="pref_plugin_telephony_desc">Envia notificações de SMS e chamadas</string>
<string name="pref_plugin_battery">Relatório da bateria</string>
<string name="pref_plugin_battery_desc">Informa o status da bateria periodicamente</string>
<string name="pref_plugin_sftp">Exposição do sistema de arquivos</string>
<string name="pref_plugin_sftp_desc">Permite navegar remotamente pelo sistema de arquivos telefone</string>
<string name="pref_plugin_clipboard">Sincronizar á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_mpris">Controle remoto multimídia</string>

View File

@@ -4,6 +4,8 @@
<string name="pref_plugin_telephony_desc">Enviar notificações para os SMS\'s e chamadas</string>
<string name="pref_plugin_battery">Relatório da bateria</string>
<string name="pref_plugin_battery_desc">Comunicar periodicamente o estado da bateria</string>
<string name="pref_plugin_sftp">Exposição do sistema de ficheiros</string>
<string name="pref_plugin_sftp_desc">Permite navegar pelo sistema de ficheiros remoto do telefone</string>
<string name="pref_plugin_clipboard">Sincronização 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_mpris">Comando à distância multimédia</string>

View File

@@ -4,6 +4,8 @@
<string name="pref_plugin_telephony_desc">Poslať pripomienky pre SMS a hovory</string>
<string name="pref_plugin_battery">Oznam o batérii</string>
<string name="pref_plugin_battery_desc">Periodicky oznamovať stav batérie</string>
<string name="pref_plugin_sftp">Odhaliť súborový systém</string>
<string name="pref_plugin_sftp_desc">Umožní prístup na súborový systém telefónu vzdialene</string>
<string name="pref_plugin_clipboard">Synchronizácia schránky</string>
<string name="pref_plugin_clipboard_desc">Zdieľať obsah schránky</string>
<string name="pref_plugin_mpris">Multimediálne diaľkové ovládače</string>
@@ -49,12 +51,15 @@
<string name="settings">Nastavenia KDE Connect</string>
<string name="mpris_play">Prehrať</string>
<string name="mpris_previous">Predošlé</string>
<string name="mpris_rew">Pretočiť dozadu</string>
<string name="mpris_ff">Pretočiť dopredu</string>
<string name="mpris_next">Nasledovné</string>
<string name="mpris_volume">Hlasitosť</string>
<string name="share_to">Zdieľať pre...</string>
<string name="protocol_version_older">Toto zariadenie používa starú verziu protokolu</string>
<string name="protocol_version_newer">Toto zariadenie používa novšiu verziu protokolu</string>
<string name="general_settings">Otvoriť nastavenia</string>
<string name="device_name">Zariadenie nespárované</string>
<string name="invalid_device_name">Získaný nesprávny kľúč</string>
<string name="general_settings">Všeobecné nastavenia</string>
<string name="device_name">Názov zariadenia</string>
<string name="device_name_preference_summary">%s</string>
<string name="invalid_device_name">Neplatný názov zariadenia</string>
</resources>

View File

@@ -4,6 +4,8 @@
<string name="pref_plugin_telephony_desc">Skicka underrättelser för SMS och samtal</string>
<string name="pref_plugin_battery">Batterirapport</string>
<string name="pref_plugin_battery_desc">Rapportera periodiskt batteriets status</string>
<string name="pref_plugin_sftp">Exponera filsystem</string>
<string name="pref_plugin_sftp_desc">Gör det möjligt att bläddra i telefonens filsystem från annan enhet</string>
<string name="pref_plugin_clipboard">Synkronisera klippbord</string>
<string name="pref_plugin_clipboard_desc">Dela klippbordets innehåll</string>
<string name="pref_plugin_mpris">Fjärrkontroll av multimedia</string>

View File

@@ -4,6 +4,8 @@
<string name="pref_plugin_telephony_desc">Надсилання сповіщень щодо SMS та дзвінків</string>
<string name="pref_plugin_battery">Звіт щодо заряду</string>
<string name="pref_plugin_battery_desc">Періодична інформація щодо стану акумулятора</string>
<string name="pref_plugin_sftp">Показ файлової системи</string>
<string name="pref_plugin_sftp_desc">Надає змогу віддалено переглядати файлову систему телефону</string>
<string name="pref_plugin_clipboard">Синхронізація буфера</string>
<string name="pref_plugin_clipboard_desc">Спільне використання буфера обміну даними</string>
<string name="pref_plugin_mpris">Дистанційне керування відтворенням</string>

View File

@@ -5,6 +5,8 @@
<string name="pref_plugin_telephony_desc">Send notifications for SMS and calls</string>
<string name="pref_plugin_battery">Battery report</string>
<string name="pref_plugin_battery_desc">Periodically report battery status</string>
<string name="pref_plugin_sftp">Filesystem expose</string>
<string name="pref_plugin_sftp_desc">Allows to browse the phone\'s filesystem remotely</string>
<string name="pref_plugin_clipboard">Clipboard sync</string>
<string name="pref_plugin_clipboard_desc">Share the clipboard content</string>
<string name="pref_plugin_mpris">Multimedia remote controls</string>