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

Compare commits

..

55 Commits

Author SHA1 Message Date
Albert Vaca
2862e5164e Oops 2014-10-14 01:31:51 -07:00
Albert Vaca
6fae1d350d Android Studio decided to change the order of some lines 2014-10-14 01:12:39 -07:00
Albert Vaca
647f71bf98 Removed incorrect translations to release 2014-10-13 21:56:21 -07:00
Albert Vaca
343b2ed5e8 Increased version number to release 2014-10-13 21:56:07 -07:00
l10n daemon script
eb7351a803 SVN_SILENT made messages (after extraction) 2014-10-14 02:00:37 +00:00
l10n daemon script
7e7d6c4d82 SVN_SILENT made messages (after extraction) 2014-10-13 01:59:04 +00:00
l10n daemon script
59d01763c7 SVN_SILENT made messages (after extraction) 2014-10-12 01:56:58 +00:00
Albert Vaca
5b2756b7f8 Added support for devices with more than one external storage
BUG: 336043
2014-10-10 15:49:27 -07:00
Albert Vaca
5912611aab Fixed onPluginsChanged not being always called after calling addPlugin 2014-10-10 12:38:11 -07:00
l10n daemon script
54d24848e5 SVN_SILENT made messages (after extraction) 2014-10-10 02:11:27 +00:00
l10n daemon script
638c9df328 SVN_SILENT made messages (after extraction) 2014-10-07 01:58:52 +00:00
Albert Vaca
9943c36877 Minor layout changes 2014-10-04 21:13:12 -07:00
Albert Vaca
03bcfecb88 Fixed previous commit to work on Android API < 19 2014-10-04 21:07:57 -07:00
Albert Vaca
1b4ade0ae1 MPRIS controls now adapt to tablet resolutions
BUG: 339684
2014-10-04 20:58:14 -07:00
l10n daemon script
b9890210ad SVN_SILENT made messages (after extraction) 2014-10-05 01:58:53 +00:00
l10n daemon script
1509bfaf6d SVN_SILENT made messages (after extraction) 2014-10-04 01:53:54 +00:00
Albert Vaca
a22ffd611a Simplified device activity layout to use a single ListView
This fixes some layout problems that prevented us of having the height of
the lists adapted automatically to the content and had to use fixed height.
2014-09-29 19:03:31 -07:00
Albert Vaca
adb88560b5 Minor changes 2014-09-29 19:03:31 -07:00
Albert Vaca
03ede77bd1 Highlight device when selected from the main activity list.
I had to include the style files, made with http://android-holo-colors.com
because, from kitkat on, the background color of highlighted elements is
gray instead of blue, but that's not reflected in the resources included
in the support library v7 appcompat jar, that are still blue.
2014-09-29 19:03:31 -07:00
Albert Vaca
6afbe93c2d Made error list header not selectable 2014-09-29 19:03:31 -07:00
l10n daemon script
dd4421dce2 SVN_SILENT made messages (after extraction) 2014-09-30 01:55:45 +00:00
Albert Vaca
262f811bba Implemented custom ping messages. 2014-09-26 20:45:28 -07:00
Albert Vaca
0b52cbe36f Fixed bug where plugin errors were not shown if all enabled plugins fail. 2014-09-26 20:45:28 -07:00
Albert Vaca
8542aaf4fa Fixed bug were list of enabled plugins didn't refresh itself.
Removed PreferenceListAdapter
2014-09-26 20:45:27 -07:00
l10n daemon script
c9d11f650c SVN_SILENT made messages (after extraction) 2014-09-27 02:00:12 +00:00
l10n daemon script
6c5ed3094b SVN_SILENT made messages (after extraction) 2014-09-26 02:01:30 +00:00
l10n daemon script
5aaec15e79 SVN_SILENT made messages (after extraction) 2014-09-24 01:50:30 +00:00
Albert Vaca
b0a632fe10 Fixed error list always empty the second time it is loaded. 2014-09-23 16:42:26 +02:00
Albert Vaca
4d1464484e Commented priority sort of links because we don't use it and causes crashes 2014-09-23 16:41:57 +02:00
Albert Vaca
d6cc84ccfb Fixed crash 2014-09-23 16:40:54 +02:00
Albert Vaca
624cee5d87 Workaround for bug where plugins are not loaded for a device 2014-09-23 16:40:34 +02:00
Albert Vaca
a8664d01ec Updated project files 2014-09-23 16:39:28 +02:00
l10n daemon script
bd68f71af6 SVN_SILENT made messages (after extraction) 2014-09-22 01:59:00 +00:00
Albert Vaca
8ec828d6e4 Reload plugins list when user gives permission to access notifications.
This way the error message disappears without having to reload the app.
2014-09-20 10:52:03 +02:00
Albert Vaca
a44d48d527 Separated arrays.xml and strings.xml were causing confusion to the script
that extracts the translations, because it expects a single output file.
2014-09-20 10:24:01 +02:00
Albert Vaca
804642c5fc Fixed bug causing some plugin settings having checkbox when they shouldn't
and viceversa.
2014-09-17 16:06:23 +02:00
Albert Vaca
8e0daa69cc Added preference to disable incoming file notification sound. 2014-09-17 16:05:54 +02:00
Albert Vaca
400b35216d Minor changes 2014-09-17 16:05:16 +02:00
Albert Vaca
4a5545529a Those static will never work
Because class statics are called the first time the class is instantiated.
2014-09-17 10:36:45 +02:00
Ronny Yabar Aizcorbe
b2fa8ab506 Plugin-specific settings
Added support for specific plugin settings.
Added interval time preference to fast forward or rewind a multimedia file
instead of hardcording the time.

REVIEW: 120005
2014-09-16 15:45:58 +02:00
l10n daemon script
b9a0b3d2f0 SVN_SILENT made messages (after extraction) 2014-09-11 01:59:39 +00:00
l10n daemon script
e8c6784ce0 SVN_SILENT made messages (after extraction) 2014-09-03 01:58:03 +00:00
l10n daemon script
e3b8bb5ffc SVN_SILENT made messages (after extraction) 2014-08-28 02:01:02 +00:00
l10n daemon script
103bc69347 SVN_SILENT made messages (after extraction) 2014-08-25 02:00:05 +00:00
l10n daemon script
2b45c82a2e SVN_SILENT made messages (after extraction) 2014-08-22 02:05:13 +00:00
l10n daemon script
0d3232a5a1 SVN_SILENT made messages (after extraction) 2014-08-20 01:58:04 +00:00
l10n daemon script
ed5ddc37c8 SVN_SILENT made messages (after extraction) 2014-08-18 02:03:00 +00:00
l10n daemon script
48bc56f52a SVN_SILENT made messages (after extraction) 2014-08-17 02:00:27 +00:00
l10n daemon script
5de10b05e7 SVN_SILENT made messages (after extraction) 2014-08-16 01:56:50 +00:00
Albert Vaca
1fe2590ec8 Changes to the detection of keyboard input.
Now it detects more special keys.
It does not detect modifiers anymore.
Moved to a view that keeps the focus and prevents focusing the back button.
Changed bitmasks for a hashmap to make it more readable with lots of keys.
Separated sendSpecialKey from sendKey for non-representable keys.

CCMAIL: saiarcot895@gmail.com
2014-08-14 21:50:19 +02:00
Saikrishna Arcot
d02684c714 Add support for using the keyboard.
This patch adds a menu entry to display the keyboard in the mousepad plugin
and allow the user to send keystrokes. Dead keys are not yet supported, and
behavior is unknown if entered.

REVIEW: 119255
2014-08-14 21:50:19 +02:00
Job Noorman
80ed8a58d5 Properly restore the selected MPRIS player after a plugin reconnect.
Whenever the link with a device goes down (the easiest way to test this is to
lock the phone's screen), the connection with the MPRIS plugin is
re-established when the link goes up again. This patch makes sure that the
currently selected player (the one stored on the MprisPlugin instance) is also
selected in the MprisActivity. Currently, the first player in the list is
always selected.

REVIEW: 119692
2014-08-13 22:52:52 +02:00
l10n daemon script
962501fe38 SVN_SILENT made messages (after extraction) 2014-08-07 01:48:38 +00:00
l10n daemon script
60c1e67e66 SVN_SILENT made messages (after extraction) 2014-07-25 02:14:34 +00:00
l10n daemon script
318b82941f SVN_SILENT made messages (after extraction) 2014-07-16 02:16:36 +00:00
93 changed files with 1371 additions and 305 deletions

View File

@@ -1,6 +1,6 @@
buildscript {
repositories {
mavenCentral()
jcenter()
}
dependencies {
classpath 'com.android.tools.build:gradle:0.12.+'
@@ -26,8 +26,6 @@ android {
lintOptions {
abortOnError false
}
productFlavors {
}
buildTypes {
}
}

View File

@@ -8,6 +8,7 @@
<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="TEST_SOURCE_GEN_TASK_NAME" value="generateDebugTestSources" />
<option name="ALLOW_USER_CONFIGURATION" value="false" />
<option name="MANIFEST_FILE_RELATIVE_PATH" value="/src/main/AndroidManifest.xml" />
<option name="RES_FOLDER_RELATIVE_PATH" value="/src/main/res" />
@@ -37,37 +38,55 @@
<sourceFolder url="file://$MODULE_DIR$/build/generated/res/rs/test/debug" type="java-test-resource" />
<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/debug/assets" type="java-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/main/res" type="java-resource" />
<sourceFolder url="file://$MODULE_DIR$/src/main/resources" type="java-resource" />
<sourceFolder url="file://$MODULE_DIR$/src/main/assets" 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/androidTest/res" type="java-test-resource" />
<sourceFolder url="file://$MODULE_DIR$/src/androidTest/resources" type="java-test-resource" />
<sourceFolder url="file://$MODULE_DIR$/src/androidTest/assets" type="java-test-resource" />
<sourceFolder url="file://$MODULE_DIR$/src/androidTest/aidl" isTestSource="true" />
<sourceFolder url="file://$MODULE_DIR$/src/androidTest/assets" isTestSource="true" />
<sourceFolder url="file://$MODULE_DIR$/src/androidTest/java" isTestSource="true" />
<sourceFolder url="file://$MODULE_DIR$/src/androidTest/jni" isTestSource="true" />
<sourceFolder url="file://$MODULE_DIR$/src/androidTest/rs" isTestSource="true" />
<excludeFolder url="file://$MODULE_DIR$/build/intermediates" />
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/assets" />
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/bundles" />
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/classes" />
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/coverage-instrumented-classes" />
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/dependency-cache" />
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/dex" />
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/dex-cache" />
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/incremental" />
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/jacoco" />
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/javaResources" />
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/libs" />
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/lint" />
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/manifests" />
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/ndk" />
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/pre-dexed" />
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/proguard" />
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/res" />
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/rs" />
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/symbols" />
<excludeFolder url="file://$MODULE_DIR$/build/outputs" />
</content>
<orderEntry type="jdk" jdkName="Android API 19 Platform" jdkType="Android SDK" />
<orderEntry type="sourceFolder" forTests="false" />
<orderEntry type="library" exported="" name="support-v4-19.1.0" level="project" />
<orderEntry type="library" exported="" name="sshd-core-0.8.0" level="project" />
<orderEntry type="library" exported="" name="bcprov-jdk16-1.45" level="project" />
<orderEntry type="library" exported="" name="appcompat-v7-19.1.0" level="project" />
<orderEntry type="library" exported="" name="mina-core-2.0.8" 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="appcompat-v7-19.1.0" level="project" />
<orderEntry type="library" exported="" name="support-v4-19.1.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" />
</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="720"
android:versionName="0.7.2">
android:versionCode="730"
android:versionName="0.7.3">
<uses-sdk android:minSdkVersion="9"
android:targetSdkVersion="19" />
@@ -88,6 +88,15 @@
android:value="org.kde.kdeconnect.UserInterface.DeviceActivity" />
</activity>
<activity
android:name="org.kde.kdeconnect.UserInterface.PluginSettingsActivity"
android:label="@string/mpris_settings"
android:parentActivityName="org.kde.kdeconnect.UserInterface.SettingsActivity"
>
<meta-data android:name="android.support.PARENT_ACTIVITY"
android:value="org.kde.kdeconnect.UserInterface.SettingsActivity" />
</activity>
<receiver android:name="org.kde.kdeconnect.KdeConnectBroadcastReceiver">
<intent-filter>
<action android:name="android.intent.action.PACKAGE_REPLACED" />

View File

@@ -43,7 +43,7 @@ public abstract class BaseLinkProvider {
public abstract void onStop();
public abstract void onNetworkChange();
public abstract int getPriority();
//public abstract int getPriority();
public abstract String getName();
}

View File

@@ -263,25 +263,21 @@ public class LanLinkProvider extends BaseLinkProvider {
@Override
public void onNetworkChange() {
onStop();
onStart();
}
@Override
public void onStop() {
udpAcceptor.unbind();
tcpAcceptor.unbind();
}
/*
@Override
public int getPriority() {
return 1000;
}
*/
@Override
public String getName() {
return "LanLinkProvider";

View File

@@ -20,22 +20,19 @@ public class LoopbackLinkProvider extends BaseLinkProvider {
@Override
public void onStop() {
}
@Override
public void onNetworkChange() {
NetworkPackage np = NetworkPackage.createIdentityPackage(context);
connectionAccepted(np, new LoopbackLink(this));
}
/*
@Override
public int getPriority() {
return 0;
}
*/
@Override
public String getName() {
return "LoopbackLinkProvider";

View File

@@ -272,7 +272,6 @@ public class BackgroundService extends Service {
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
//This will be called for each intent launch, even if the service is already started and it is reused
Log.i("BackgroundService","onStartCommand");
mutex.lock();
for (InstanceCallback c : callbacks) {
c.onServiceStart(this);

View File

@@ -321,12 +321,14 @@ public class Device implements BaseLink.PackageReceiver {
Log.i("Device","addLink "+link.getLinkProvider().getName()+" -> "+getName() + " active links: "+ links.size());
/*
Collections.sort(links, new Comparator<BaseLink>() {
@Override
public int compare(BaseLink o, BaseLink o2) {
return o2.getLinkProvider().getPriority() - o.getLinkProvider().getPriority();
}
});
*/
link.addPackageReceiver(this);
@@ -406,7 +408,7 @@ public class Device implements BaseLink.PackageReceiver {
.setTicker(res.getString(R.string.pair_requested))
.setSmallIcon(android.R.drawable.ic_menu_help)
.setAutoCancel(true)
.setDefaults(Notification.DEFAULT_SOUND)
.setDefaults(Notification.DEFAULT_ALL)
.build();
@@ -557,24 +559,25 @@ public class Device implements BaseLink.PackageReceiver {
@Override
public void run() {
boolean success;
try {
boolean success = plugin.onCreate();
if (!success) {
Log.e("addPlugin", "plugin failed to load " + name);
failedPlugins.put(name, plugin);
return;
}
success = plugin.onCreate();
} catch (Exception e) {
failedPlugins.put(name, plugin);
success = false;
e.printStackTrace();
Log.e("addPlugin", "Exception loading plugin " + name);
return;
}
//Log.e("addPlugin","added " + name);
failedPlugins.remove(name);
plugins.put(name, plugin);
if (success) {
//Log.e("addPlugin","added " + name);
failedPlugins.remove(name);
plugins.put(name, plugin);
} else {
Log.e("addPlugin", "plugin failed to load " + name);
plugins.remove(name);
failedPlugins.put(name, plugin);
}
for (PluginsChangedListener listener : pluginsChangedListeners) {
listener.onPluginsChanged(Device.this);
@@ -592,6 +595,7 @@ public class Device implements BaseLink.PackageReceiver {
if (plugin == null) {
if (failedPlugin == null) {
//Not found
return false;
}
plugin = failedPlugin;
@@ -599,20 +603,17 @@ public class Device implements BaseLink.PackageReceiver {
try {
plugin.onDestroy();
//Log.e("removePlugin","removed " + name);
} catch (Exception e) {
e.printStackTrace();
Log.e("removePlugin","Exception calling onDestroy for plugin "+name);
return false;
}
//Log.e("removePlugin","removed " + name);
for (PluginsChangedListener listener : pluginsChangedListeners) {
listener.onPluginsChanged(this);
}
return true;
}
public void setPluginEnabled(String pluginName, boolean value) {
@@ -627,6 +628,9 @@ public class Device implements BaseLink.PackageReceiver {
return enabled;
}
public boolean hasPluginsLoaded() {
return !plugins.isEmpty() || !failedPlugins.isEmpty();
}
public void reloadPluginsFromSettings() {
@@ -646,9 +650,7 @@ public class Device implements BaseLink.PackageReceiver {
}
}
for (PluginsChangedListener listener : pluginsChangedListeners) {
listener.onPluginsChanged(this);
}
//No need to call PluginsChangedListeners because addPlugin and removePlugin already do so
}
public HashMap<String,Plugin> getLoadedPlugins() {

View File

@@ -0,0 +1,101 @@
package org.kde.kdeconnect.Helpers;
import android.os.Environment;
import android.util.Log;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashSet;
import java.util.List;
import java.util.StringTokenizer;
//Code from http://stackoverflow.com/questions/9340332/how-can-i-get-the-list-of-mounted-external-storage-of-android-device/19982338#19982338
public class StorageHelper {
private static final String TAG = "StorageHelper";
public static class StorageInfo {
public final String path;
public final boolean readonly;
public final boolean removable;
public final int number;
StorageInfo(String path, boolean readonly, boolean removable, int number) {
this.path = path;
this.readonly = readonly;
this.removable = removable;
this.number = number;
}
}
public static List<StorageInfo> getStorageList() {
List<StorageInfo> list = new ArrayList<StorageInfo>();
String def_path = Environment.getExternalStorageDirectory().getPath();
boolean def_path_removable = Environment.isExternalStorageRemovable();
String def_path_state = Environment.getExternalStorageState();
boolean def_path_available = def_path_state.equals(Environment.MEDIA_MOUNTED)
|| def_path_state.equals(Environment.MEDIA_MOUNTED_READ_ONLY);
boolean def_path_readonly = Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED_READ_ONLY);
HashSet<String> paths = new HashSet<String>();
int cur_removable_number = 1;
if (def_path_available) {
paths.add(def_path);
list.add(0, new StorageInfo(def_path, def_path_readonly, def_path_removable, def_path_removable ? cur_removable_number++ : -1));
}
BufferedReader buf_reader = null;
try {
buf_reader = new BufferedReader(new FileReader("/proc/mounts"));
String line;
Log.d(TAG, "/proc/mounts");
while ((line = buf_reader.readLine()) != null) {
Log.d(TAG, line);
if (line.contains("vfat") || line.contains("/mnt")) {
StringTokenizer tokens = new StringTokenizer(line, " ");
String unused = tokens.nextToken(); //device
String mount_point = tokens.nextToken(); //mount point
if (paths.contains(mount_point)) {
continue;
}
unused = tokens.nextToken(); //file system
List<String> flags = Arrays.asList(tokens.nextToken().split(",")); //flags
boolean readonly = flags.contains("ro");
if (line.contains("/dev/block/vold")) {
if (!line.contains("/mnt/secure")
&& !line.contains("/mnt/asec")
&& !line.contains("/mnt/obb")
&& !line.contains("/dev/mapper")
&& !line.contains("tmpfs")) {
paths.add(mount_point);
list.add(new StorageInfo(mount_point, readonly, true, cur_removable_number++));
}
}
}
}
} catch (FileNotFoundException ex) {
ex.printStackTrace();
} catch (IOException ex) {
ex.printStackTrace();
} finally {
if (buf_reader != null) {
try {
buf_reader.close();
} catch (IOException ex) {}
}
}
return list;
}
}

View File

@@ -22,10 +22,6 @@ public class BatteryPlugin extends Plugin {
private NetworkPackage lastInfo = null;
/*static {
PluginFactory.registerPlugin(BatteryPlugin.class);
}*/
@Override
public String getPluginName() {
return "plugin_battery";
@@ -46,6 +42,11 @@ public class BatteryPlugin extends Plugin {
return context.getResources().getDrawable(R.drawable.icon);
}
@Override
public boolean hasSettings() {
return false;
}
@Override
public boolean isEnabledByDefault() {
return true;
@@ -113,7 +114,7 @@ public class BatteryPlugin extends Plugin {
}
@Override
public AlertDialog getErrorDialog(Context baseContext) {
public AlertDialog getErrorDialog(Activity deviceActivity) {
return null;
}

View File

@@ -12,10 +12,6 @@ import org.kde.kdeconnect_tp.R;
public class ClipboardPlugin extends Plugin {
/*static {
PluginFactory.registerPlugin(ClipboardPlugin.class);
}*/
@Override
public String getPluginName() {
return "plugin_clipboard";
@@ -35,6 +31,11 @@ public class ClipboardPlugin extends Plugin {
return context.getResources().getDrawable(R.drawable.icon);
}
@Override
public boolean hasSettings() {
return false;
}
@Override
public boolean isEnabledByDefault() {
//Disabled by default due to just one direction sync(incoming clipboard change) in early version of android.
@@ -67,7 +68,7 @@ public class ClipboardPlugin extends Plugin {
}
@Override
public AlertDialog getErrorDialog(Context baseContext) { return null; }
public AlertDialog getErrorDialog(Activity deviceActivity) { return null; }
@Override
public Button getInterfaceButton(Activity activity) {

View File

@@ -0,0 +1,95 @@
package org.kde.kdeconnect.Plugins.MousePadPlugin;
import android.content.Context;
import android.os.Build;
import android.util.AttributeSet;
import android.util.Log;
import android.view.KeyEvent;
import android.view.View;
import org.kde.kdeconnect.BackgroundService;
import org.kde.kdeconnect.Device;
import java.nio.ByteBuffer;
import java.util.HashMap;
public class KeyListenerView extends View {
private String deviceId;
private static HashMap<Integer, Integer> SpecialKeysMap = new HashMap<Integer, Integer>();
static {
int i = 0;
SpecialKeysMap.put(KeyEvent.KEYCODE_DEL, ++i); // 1
SpecialKeysMap.put(KeyEvent.KEYCODE_TAB, ++i); // 2
SpecialKeysMap.put(KeyEvent.KEYCODE_ENTER, ++i); // 3
SpecialKeysMap.put(KeyEvent.KEYCODE_DPAD_LEFT, ++i); // 4
SpecialKeysMap.put(KeyEvent.KEYCODE_DPAD_UP, ++i); // 5
SpecialKeysMap.put(KeyEvent.KEYCODE_DPAD_RIGHT, ++i); // 6
SpecialKeysMap.put(KeyEvent.KEYCODE_DPAD_DOWN, ++i); // 7
SpecialKeysMap.put(KeyEvent.KEYCODE_PAGE_UP, ++i); // 8
SpecialKeysMap.put(KeyEvent.KEYCODE_PAGE_DOWN, ++i); // 9
if (Build.VERSION.SDK_INT >= 11) {
SpecialKeysMap.put(KeyEvent.KEYCODE_MOVE_HOME, ++i); // 10
SpecialKeysMap.put(KeyEvent.KEYCODE_MOVE_END, ++i); // 11
SpecialKeysMap.put(KeyEvent.KEYCODE_NUMPAD_ENTER, ++i); // 12
SpecialKeysMap.put(KeyEvent.KEYCODE_FORWARD_DEL, ++i); // 13
SpecialKeysMap.put(KeyEvent.KEYCODE_ESCAPE, ++i); // 14
}
}
public void setDeviceId(String id) {
deviceId = id;
}
public KeyListenerView(Context context, AttributeSet set) {
super(context, set);
setFocusable(true);
setFocusableInTouchMode(true);
}
@Override
public boolean onCheckIsTextEditor() {
return true;
}
@Override
public boolean onKeyUp(int keyCode, KeyEvent event) {
char utfChar = (char)event.getUnicodeChar();
if (utfChar == 9 || utfChar == 10) utfChar = 0; //Workaround to send enter and tab as special keys instead of characters
if (utfChar != 0) {
final String utfString = new String(new char[]{utfChar});
BackgroundService.RunCommand(getContext(), new BackgroundService.InstanceCallback() {
@Override
public void onServiceStart(BackgroundService service) {
Device device = service.getDevice(deviceId);
MousePadPlugin mousePadPlugin = (MousePadPlugin)device.getPlugin("plugin_mousepad");
if (mousePadPlugin == null) return;
mousePadPlugin.sendKey(utfString);
}
});
} else {
if (!SpecialKeysMap.containsKey(keyCode)) {
return false;
}
final int specialKey = SpecialKeysMap.get(keyCode);
BackgroundService.RunCommand(getContext(), new BackgroundService.InstanceCallback() {
@Override
public void onServiceStart(BackgroundService service) {
Device device = service.getDevice(deviceId);
MousePadPlugin mousePadPlugin = (MousePadPlugin)device.getPlugin("plugin_mousepad");
if (mousePadPlugin == null) return;
mousePadPlugin.sendSpecialKey(specialKey);
}
});
}
return true;
}
}

View File

@@ -1,8 +1,10 @@
package org.kde.kdeconnect.Plugins.MousePadPlugin;
import android.app.Activity;
import android.content.Context;
import android.os.Bundle;
import android.view.GestureDetector;
import android.view.inputmethod.InputMethodManager;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
@@ -13,6 +15,9 @@ import org.kde.kdeconnect.Device;
import org.kde.kdeconnect_tp.R;
public class MousePadActivity extends Activity implements GestureDetector.OnGestureListener, GestureDetector.OnDoubleTapListener, MousePadGestureDetector.OnGestureListener {
String deviceId;
private final static float MinDistanceToSendScroll = 2.5f;
private float mPrevX;
@@ -21,23 +26,29 @@ public class MousePadActivity extends Activity implements GestureDetector.OnGest
private float mCurrentY;
boolean isScrolling = false;
float accumulatedDistanceY = 0;
private String deviceId;
private GestureDetector mDetector;
private MousePadGestureDetector mMousePadGestureDetector;
KeyListenerView keyListenerView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_mousepad);
deviceId = getIntent().getStringExtra("deviceId");
mDetector = new GestureDetector(this, this);
mMousePadGestureDetector = new MousePadGestureDetector(this, this);
mDetector.setOnDoubleTapListener(this);
keyListenerView = (KeyListenerView)findViewById(R.id.keyListener);
keyListenerView.setDeviceId(deviceId);
}
@Override
@@ -56,23 +67,27 @@ public class MousePadActivity extends Activity implements GestureDetector.OnGest
case R.id.menu_middle_click:
sendMiddleClick();
return true;
case R.id.menu_show_keyboard:
showKeyboard();
return true;
default:
return super.onOptionsItemSelected(item);
}
}
@Override
public boolean onTouchEvent(MotionEvent event) {
if (mMousePadGestureDetector.onTouchEvent(event)) {
return true;
}
if ( mDetector.onTouchEvent(event) ) {
return true;
}
int actionType = event.getAction();
final float x = event.getX();
final float y = event.getY();
if (isScrolling) {
if (actionType == MotionEvent.ACTION_UP) {
isScrolling = false;
@@ -81,21 +96,22 @@ public class MousePadActivity extends Activity implements GestureDetector.OnGest
}
}
switch (actionType) {
case MotionEvent.ACTION_DOWN:
mPrevX = x;
mPrevY = y;
mPrevX = event.getX();
mPrevY = event.getY();
break;
case MotionEvent.ACTION_MOVE:
mCurrentX = x;
mCurrentY = y;
mCurrentX = event.getX();
mCurrentY = event.getY();
BackgroundService.RunCommand(this, new BackgroundService.InstanceCallback() {
@Override
public void onServiceStart(BackgroundService service) {
Device device = service.getDevice(deviceId);
MousePadPlugin mousePadPlugin = (MousePadPlugin)device.getPlugin("plugin_mousepad");
if (mousePadPlugin == null) return;
mousePadPlugin.sendPoints(mCurrentX - mPrevX, mCurrentY - mPrevY);
mousePadPlugin.sendMouseDelta(mCurrentX - mPrevX, mCurrentY - mPrevY);
mPrevX = mCurrentX;
mPrevY = mCurrentY;
}
@@ -112,7 +128,7 @@ public class MousePadActivity extends Activity implements GestureDetector.OnGest
@Override
public void onShowPress(MotionEvent e) {
//From GestureDetector, left empty
}
@Override
@@ -152,7 +168,7 @@ public class MousePadActivity extends Activity implements GestureDetector.OnGest
@Override
public void onLongPress(MotionEvent e) {
//From GestureDetector, left empty
}
@Override
@@ -205,6 +221,7 @@ public class MousePadActivity extends Activity implements GestureDetector.OnGest
return true;
}
private void sendMiddleClick() {
BackgroundService.RunCommand(this, new BackgroundService.InstanceCallback() {
@Override
@@ -228,4 +245,11 @@ public class MousePadActivity extends Activity implements GestureDetector.OnGest
}
});
}
private void showKeyboard() {
InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
imm.showSoftInput(keyListenerView, InputMethodManager.SHOW_IMPLICIT);
}
}

View File

@@ -13,6 +13,7 @@ import org.kde.kdeconnect.Plugins.Plugin;
import org.kde.kdeconnect_tp.R;
public class MousePadPlugin extends Plugin {
@Override
public String getPluginName() {
return "plugin_mousepad";
@@ -38,6 +39,11 @@ public class MousePadPlugin extends Plugin {
return true;
}
@Override
public boolean hasSettings() {
return false;
}
@Override
public boolean onCreate() {
return true;
@@ -54,9 +60,24 @@ public class MousePadPlugin extends Plugin {
}
@Override
public AlertDialog getErrorDialog(Context baseContext) { return null; }
public AlertDialog getErrorDialog(Activity deviceActivity) { return null; }
public void sendPoints(float dx, float dy) {
@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) {
NetworkPackage np = new NetworkPackage(NetworkPackage.PACKAGE_TYPE_MOUSEPAD);
np.set("dx", dx);
np.set("dy", dy);
@@ -95,18 +116,16 @@ public class MousePadPlugin extends Plugin {
device.sendPackage(np);
}
@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 sendKey(String utfChar) {
NetworkPackage np = new NetworkPackage(NetworkPackage.PACKAGE_TYPE_MOUSEPAD);
np.set("key", utfChar);
device.sendPackage(np);
}
public void sendSpecialKey(int specialKey) {
NetworkPackage np = new NetworkPackage(NetworkPackage.PACKAGE_TYPE_MOUSEPAD);
np.set("specialKey", specialKey);
device.sendPackage(np);
}
}

View File

@@ -1,9 +1,11 @@
package org.kde.kdeconnect.Plugins.MprisPlugin;
import android.app.Activity;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.preference.PreferenceManager;
import android.util.Log;
import android.view.KeyEvent;
import android.view.View;
@@ -70,8 +72,6 @@ public class MprisActivity extends Activity {
});
mpris.setPlayerListUpdatedHandler(new Handler() {
boolean firstLoad = true;
@Override
public void handleMessage(Message msg) {
final ArrayList<String> playerList = mpris.getPlayerList();
@@ -107,17 +107,18 @@ public class MprisActivity extends Activity {
@Override
public void onNothingSelected(AdapterView<?> arg0) {
mpris.setPlayer(null);
}
});
// restore the selected player
int position = adapter.getPosition(mpris.getPlayer());
if (position >= 0) {
spinner.setSelection(position);
}
}
});
if (firstLoad) {
firstLoad = false;
if (playerList.size() > 0) {
mpris.setPlayer(playerList.get(0));
}
}
}
});
@@ -217,6 +218,11 @@ public class MprisActivity extends Activity {
deviceId = getIntent().getStringExtra("deviceId");
SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(this);
String interval_time_str = prefs.getString(getString(R.string.mpris_time_key),
getString(R.string.mpris_time_default));
final int interval_time = Integer.parseInt(interval_time_str);
BackgroundService.RunCommand(MprisActivity.this, new BackgroundService.InstanceCallback() {
@Override
public void onServiceStart(BackgroundService service) {
@@ -264,7 +270,7 @@ public class MprisActivity extends Activity {
Device device = service.getDevice(deviceId);
MprisPlugin mpris = (MprisPlugin)device.getPlugin("plugin_mpris");
if (mpris == null) return;
mpris.Seek(-10000000); // -10 seconds. TODO: plugin settings UI?
mpris.Seek(interval_time * -1);
}
});
}
@@ -279,7 +285,7 @@ public class MprisActivity extends Activity {
Device device = service.getDevice(deviceId);
MprisPlugin mpris = (MprisPlugin)device.getPlugin("plugin_mpris");
if (mpris == null) return;
mpris.Seek(10000000); // 10 seconds. TODO: plugin settings UI?
mpris.Seek(interval_time);
}
});
}

View File

@@ -30,10 +30,6 @@ public class MprisPlugin extends Plugin {
private String player = "";
private boolean playing = false;
/*static {
PluginFactory.registerPlugin(MprisPlugin.class);
}*/
@Override
public String getPluginName() {
return "plugin_mpris";
@@ -54,6 +50,11 @@ public class MprisPlugin extends Plugin {
return context.getResources().getDrawable(R.drawable.icon);
}
@Override
public boolean hasSettings() {
return true;
}
@Override
public boolean isEnabledByDefault() {
return true;
@@ -179,6 +180,10 @@ public class MprisPlugin extends Plugin {
requestPlayerStatus();
}
public String getPlayer() {
return player;
}
public int getVolume() {
return volume;
}
@@ -203,7 +208,7 @@ public class MprisPlugin extends Plugin {
}
@Override
public AlertDialog getErrorDialog(Context baseContext) {
public AlertDialog getErrorDialog(Activity deviceActivity) {
return null;
}

View File

@@ -17,14 +17,11 @@ import android.widget.Button;
import org.kde.kdeconnect.Helpers.AppsHelper;
import org.kde.kdeconnect.NetworkPackage;
import org.kde.kdeconnect.Plugins.Plugin;
import org.kde.kdeconnect.UserInterface.DeviceActivity;
import org.kde.kdeconnect_tp.R;
public class NotificationsPlugin extends Plugin implements NotificationReceiver.NotificationListener {
/*static {
PluginFactory.registerPlugin(NotificationsPlugin.class);
}*/
@Override
public String getPluginName() {
return "plugin_notifications";
@@ -45,6 +42,11 @@ public class NotificationsPlugin extends Plugin implements NotificationReceiver.
return context.getResources().getDrawable(R.drawable.icon);
}
@Override
public boolean hasSettings() {
return false;
}
@Override
public boolean isEnabledByDefault() {
return true;
@@ -318,10 +320,10 @@ public class NotificationsPlugin extends Plugin implements NotificationReceiver.
@Override
public AlertDialog getErrorDialog(final Context baseContext) {
public AlertDialog getErrorDialog(final Activity deviceActivity) {
if (Build.VERSION.SDK_INT < 18) {
return new AlertDialog.Builder(baseContext)
return new AlertDialog.Builder(deviceActivity)
.setTitle(R.string.pref_plugin_notifications)
.setMessage(R.string.plugin_not_available)
.setPositiveButton(R.string.ok, new DialogInterface.OnClickListener() {
@@ -332,14 +334,14 @@ public class NotificationsPlugin extends Plugin implements NotificationReceiver.
})
.create();
} else {
return new AlertDialog.Builder(baseContext)
return new AlertDialog.Builder(deviceActivity)
.setTitle(R.string.pref_plugin_notifications)
.setMessage(R.string.no_permissions)
.setPositiveButton(R.string.open_settings, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialogInterface, int i) {
Intent intent = new Intent("android.settings.ACTION_NOTIFICATION_LISTENER_SETTINGS");
baseContext.startActivity(intent);
deviceActivity.startActivityForResult(intent, DeviceActivity.RESULT_NEEDS_RELOAD);
}
})
.setNegativeButton(R.string.cancel,new DialogInterface.OnClickListener() {

View File

@@ -21,10 +21,6 @@ import org.kde.kdeconnect_tp.R;
public class PingPlugin extends Plugin {
/*static {
PluginFactory.registerPlugin(PingPlugin.class);
}*/
@Override
public String getPluginName() {
return "plugin_ping";
@@ -45,6 +41,11 @@ public class PingPlugin extends Plugin {
return context.getResources().getDrawable(R.drawable.icon);
}
@Override
public boolean hasSettings() {
return false;
}
@Override
public boolean isEnabledByDefault() {
return true;
@@ -75,18 +76,28 @@ public class PingPlugin extends Plugin {
PendingIntent.FLAG_UPDATE_CURRENT
);
int id;
String message;
if (np.has("message")) {
message = np.getString("message");
id = (int)System.currentTimeMillis();
} else {
message = "Ping!";
id = 42; //A unique id to create only one notification
}
Notification noti = new NotificationCompat.Builder(context)
.setContentTitle(device.getName())
.setContentText("Ping!")
.setContentText(message)
.setContentIntent(resultPendingIntent)
.setTicker("Ping!")
.setTicker(message)
.setSmallIcon(android.R.drawable.ic_dialog_alert)
.setAutoCancel(true)
.setDefaults(Notification.DEFAULT_SOUND)
.setDefaults(Notification.DEFAULT_ALL)
.build();
NotificationManager notificationManager = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);
notificationManager.notify(42 /*a unique id to create only one notification*/, noti);
notificationManager.notify(id, noti);
return true;
}
@@ -94,7 +105,7 @@ public class PingPlugin extends Plugin {
}
@Override
public AlertDialog getErrorDialog(Context baseContext) {
public AlertDialog getErrorDialog(Activity deviceActivity) {
return null;
}

View File

@@ -51,6 +51,12 @@ public abstract class Plugin {
*/
public abstract boolean isEnabledByDefault();
/**
* Return true if this plugin needs an specific UI settings.
*/
public abstract boolean hasSettings();
/**
* Initialize the listeners and structures in your plugin.
* Should return true if initialization was successful.
@@ -73,7 +79,7 @@ public abstract class Plugin {
* If onCreate returns false, should create a dialog explaining
* the problem (and how to fix it, if possible) to the user.
*/
public abstract AlertDialog getErrorDialog(Context baseContext);
public abstract AlertDialog getErrorDialog(Activity deviceActivity);
/**
* Creates a button that will be displayed in the user interface

View File

@@ -24,12 +24,14 @@ public class PluginFactory {
public static class PluginInfo {
public PluginInfo(String pluginName, String displayName, String description, Drawable icon, boolean enabledByDefault) {
public PluginInfo(String pluginName, String displayName, String description, Drawable icon,
boolean enabledByDefault, boolean hasSettings) {
this.pluginName = pluginName;
this.displayName = displayName;
this.description = description;
this.icon = icon;
this.enabledByDefault = enabledByDefault;
this.hasSettings = hasSettings;
}
public String getPluginName() {
@@ -48,6 +50,8 @@ public class PluginFactory {
return icon;
}
public boolean hasSettings() { return hasSettings; }
public boolean isEnabledByDefault() {
return enabledByDefault;
}
@@ -57,6 +61,7 @@ public class PluginFactory {
private final String description;
private final Drawable icon;
private final boolean enabledByDefault;
private final boolean hasSettings;
}
@@ -64,7 +69,7 @@ public class PluginFactory {
private static final Map<String, PluginInfo> availablePluginsInfo = new TreeMap<String, PluginInfo>();
static {
//TODO: Avoid this factory having to know every plugin
//TODO: Use reflection to find all subclasses of Plugin, instead of adding them manually
PluginFactory.registerPlugin(TelephonyPlugin.class);
PluginFactory.registerPlugin(PingPlugin.class);
PluginFactory.registerPlugin(MprisPlugin.class);
@@ -82,7 +87,8 @@ public class PluginFactory {
try {
Plugin p = ((Plugin)availablePlugins.get(pluginName).newInstance());
p.setContext(context, null);
info = new PluginInfo(pluginName, p.getDisplayName(), p.getDescription(), p.getIcon(), p.isEnabledByDefault());
info = new PluginInfo(pluginName, p.getDisplayName(), p.getDescription(), p.getIcon(),
p.isEnabledByDefault(), p.hasSettings());
availablePluginsInfo.put(pluginName, info); //Cache it
return info;
} catch(Exception e) {

View File

@@ -7,18 +7,19 @@ import android.graphics.drawable.Drawable;
import android.os.Environment;
import android.widget.Button;
import org.kde.kdeconnect.Helpers.StorageHelper;
import org.kde.kdeconnect.NetworkPackage;
import org.kde.kdeconnect.Plugins.Plugin;
import org.kde.kdeconnect_tp.R;
import java.io.File;
import java.util.ArrayList;
import java.util.List;
public class SftpPlugin extends Plugin {
private static final SimpleSftpServer server = new SimpleSftpServer();
/*static {
PluginFactory.registerPlugin(SftpPlugin.class);
}*/
@Override
public String getPluginName() {return "plugin_sftp";}
@@ -38,7 +39,12 @@ public class SftpPlugin extends Plugin {
}
@Override
public boolean isEnabledByDefault() {return true;}
public boolean hasSettings() {
return false;
}
@Override
public boolean isEnabledByDefault() { return true; }
@Override
public boolean onCreate() {
@@ -57,13 +63,56 @@ public class SftpPlugin extends Plugin {
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());
//Kept for compatibility, but new desktop clients will read "multiPaths" instead,
// that supports devices with more than one external storage
np2.set("path", Environment.getExternalStorageDirectory().getAbsolutePath());
List<StorageHelper.StorageInfo> storageList = StorageHelper.getStorageList();
ArrayList<String> paths = new ArrayList<String>();
ArrayList<String> pathNames = new ArrayList<String>();
for (StorageHelper.StorageInfo storage : storageList) {
paths.add(storage.path);
StringBuilder res = new StringBuilder();
if (storageList.size() > 1) {
if (!storage.removable) {
res.append(context.getString(R.string.sftp_internal_storage));
} else if (storage.number > 1) {
res.append(context.getString(R.string.sftp_sdcard_num, storage.number));
} else {
res.append(context.getString(R.string.sftp_sdcard));
}
} else {
res.append(context.getString(R.string.sftp_all_files));
}
if (storage.readonly) {
res.append(" ");
res.append(context.getString(R.string.sftp_readonly));
}
pathNames.add(res.toString());
}
//Shortcut for users that only want to browse camera pictures
String cameraDir = Environment.getExternalStorageDirectory().getAbsolutePath() + "/DCIM/Camera";
if (new File(cameraDir).exists()) {
paths.add(cameraDir);
pathNames.add(context.getString(R.string.sftp_camera));
}
np2.set("multiPaths", paths);
np2.set("pathNames", pathNames);
device.sendPackage(np2);
return true;
}
}
@@ -71,9 +120,9 @@ public class SftpPlugin extends Plugin {
}
@Override
public AlertDialog getErrorDialog(Context baseContext) {return null;}
public AlertDialog getErrorDialog(Activity deviceActivity) { return null; }
@Override
public Button getInterfaceButton(Activity activity) {return null;}
public Button getInterfaceButton(Activity activity) { return null; }
}

View File

@@ -8,10 +8,12 @@ import android.app.PendingIntent;
import android.content.ClipboardManager;
import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences;
import android.content.res.Resources;
import android.graphics.drawable.Drawable;
import android.net.Uri;
import android.os.Environment;
import android.preference.PreferenceManager;
import android.support.v4.app.NotificationCompat;
import android.support.v4.app.TaskStackBuilder;
import android.util.Log;
@@ -31,13 +33,9 @@ import java.io.OutputStream;
public class SharePlugin extends Plugin {
/*static {
PluginFactory.registerPlugin(PingPlugin.class);
}*/
@Override
public String getPluginName() {
return "share_ping";
return "plugin_share";
}
@Override
@@ -55,6 +53,11 @@ public class SharePlugin extends Plugin {
return context.getResources().getDrawable(R.drawable.icon);
}
@Override
public boolean hasSettings() {
return true;
}
@Override
public boolean isEnabledByDefault() {
return true;
@@ -109,6 +112,7 @@ public class SharePlugin extends Plugin {
.setSmallIcon(android.R.drawable.ic_dialog_alert)
.setAutoCancel(true)
.build();
NotificationManager notificationManager = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);
notificationManager.notify(notificationId, noti);
@@ -154,15 +158,23 @@ public class SharePlugin extends Plugin {
);
Resources res = context.getResources();
Notification noti = new NotificationCompat.Builder(context)
NotificationCompat.Builder builder = new NotificationCompat.Builder(context)
.setContentTitle(res.getString(R.string.received_file_title, device.getName()))
.setContentText(res.getString(R.string.received_file_text, filename))
.setContentIntent(resultPendingIntent)
.setTicker(res.getString(R.string.received_file_title, device.getName()))
.setSmallIcon(android.R.drawable.ic_dialog_alert)
.setAutoCancel(true)
.setDefaults(Notification.DEFAULT_SOUND)
.build();
.setAutoCancel(true);
SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context);
if (prefs.getBoolean("share_notification_preference", true)) {
builder.setDefaults(Notification.DEFAULT_ALL);
}
Notification noti = builder.build();
NotificationManager notificationManager = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);
notificationManager.notify(notificationId, noti);
@@ -213,7 +225,7 @@ public class SharePlugin extends Plugin {
.setTicker(res.getString(R.string.received_url_title, device.getName()))
.setSmallIcon(android.R.drawable.ic_dialog_alert)
.setAutoCancel(true)
.setDefaults(Notification.DEFAULT_SOUND)
.setDefaults(Notification.DEFAULT_ALL)
.build();
NotificationManager notificationManager = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);
@@ -233,7 +245,7 @@ public class SharePlugin extends Plugin {
}
@Override
public AlertDialog getErrorDialog(Context baseContext) {
public AlertDialog getErrorDialog(Activity deviceActivity) {
return null;
}

View File

@@ -19,10 +19,6 @@ import org.kde.kdeconnect_tp.R;
public class TelephonyPlugin extends Plugin {
/*static {
PluginFactory.registerPlugin(TelephonyPlugin.class);
}*/
@Override
public String getPluginName() {
return "plugin_telephony";
@@ -48,6 +44,11 @@ public class TelephonyPlugin extends Plugin {
return true;
}
@Override
public boolean hasSettings() {
return false;
}
private final BroadcastReceiver receiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
@@ -182,7 +183,7 @@ public class TelephonyPlugin extends Plugin {
}
@Override
public AlertDialog getErrorDialog(Context baseContext) {
public AlertDialog getErrorDialog(Activity deviceActivity) {
return null;
}

View File

@@ -1,5 +1,6 @@
package org.kde.kdeconnect.UserInterface;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.support.v7.app.ActionBar;
@@ -8,8 +9,6 @@ import android.util.Log;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.ListView;
import android.widget.TextView;
@@ -18,21 +17,26 @@ import org.kde.kdeconnect.BackgroundService;
import org.kde.kdeconnect.Device;
import org.kde.kdeconnect.Plugins.Plugin;
import org.kde.kdeconnect.UserInterface.List.ButtonItem;
import org.kde.kdeconnect.UserInterface.List.CustomItem;
import org.kde.kdeconnect.UserInterface.List.ListAdapter;
import org.kde.kdeconnect.UserInterface.List.SectionItem;
import org.kde.kdeconnect.UserInterface.List.SmallEntryItem;
import org.kde.kdeconnect.UserInterface.List.TextItem;
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 {
static private String deviceId; //Static because if we get here by using the back button in the action bar, the extra deviceId will not be set.
private Device device;
public static final int RESULT_NEEDS_RELOAD = Activity.RESULT_FIRST_USER;
TextView errorHeader;
private final Device.PluginsChangedListener pluginsChangedListener = new Device.PluginsChangedListener() {
@Override
public void onPluginsChanged(final Device device) {
@@ -42,45 +46,10 @@ public class DeviceActivity extends ActionBarActivity {
public void run() {
try {
//Errors list
final HashMap<String, Plugin> failedPlugins = device.getFailedPlugins();
final String[] ids = failedPlugins.keySet().toArray(new String[failedPlugins.size()]);
String[] names = new String[failedPlugins.size()];
for(int i = 0; i < ids.length; i++) {
Plugin p = failedPlugins.get(ids[i]);
names[i] = p.getDisplayName();
}
ListView errorList = (ListView)findViewById(R.id.errors_list);
if (!failedPlugins.isEmpty() && errorList.getHeaderViewsCount() == 0) {
TextView header = new TextView(DeviceActivity.this);
header.setPadding(0,24,0,0);
header.setText(getResources().getString(R.string.plugins_failed_to_load));
errorList.addHeaderView(header);
}
errorList.setAdapter(new ArrayAdapter<String>(DeviceActivity.this, android.R.layout.simple_list_item_1, names));
errorList.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> adapterView, View view, int position, long id) {
if (position == 0) return;
Plugin p = failedPlugins.get(ids[position - 1]); //Header is position 0, so we have to subtract one
p.getErrorDialog(DeviceActivity.this).show();
}
});
//Buttons list
ArrayList<ListAdapter.Item> items = new ArrayList<ListAdapter.Item>();
if (device.isReachable()) {
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));
}
}
} else {
if (!device.isReachable()) {
//Not reachable, show unpair button
Button b = new Button(DeviceActivity.this);
b.setText(R.string.device_menu_unpair);
b.setOnClickListener(new View.OnClickListener() {
@@ -92,10 +61,42 @@ public class DeviceActivity extends ActionBarActivity {
});
items.add(new TextItem(getString(R.string.device_not_reachable)));
items.add(new ButtonItem(b));
} else {
//Plugins button list
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));
}
}
//Failed plugins List
final Collection<Plugin> failed = device.getFailedPlugins().values();
if (!failed.isEmpty()) {
if (errorHeader == null) {
errorHeader = new TextView(DeviceActivity.this);
errorHeader.setPadding(0, 48, 0, 0);
errorHeader.setOnClickListener(null);
errorHeader.setOnLongClickListener(null);
errorHeader.setText(getResources().getString(R.string.plugins_failed_to_load));
}
items.add(new CustomItem(errorHeader));
for (final Plugin p : failed) {
items.add(new SmallEntryItem(p.getDisplayName(), new View.OnClickListener() {
@Override
public void onClick(View v) {
p.getErrorDialog(DeviceActivity.this).show();
}
}));
}
}
}
ListView buttonsList = (ListView)findViewById(R.id.buttons_list);
buttonsList.setAdapter(new ListAdapter(DeviceActivity.this, items));
ListAdapter adapter = new ListAdapter(DeviceActivity.this, items);
buttonsList.setAdapter(adapter);
} catch(ConcurrentModificationException e) {
Log.e("DeviceActivity", "ConcurrentModificationException");
@@ -129,6 +130,9 @@ public class DeviceActivity extends ActionBarActivity {
setTitle(device.getName());
device.addPluginsChangedListener(pluginsChangedListener);
pluginsChangedListener.onPluginsChanged(device);
if (!device.hasPluginsLoaded()) {
device.reloadPluginsFromSettings();
}
}
});
@@ -150,7 +154,7 @@ public class DeviceActivity extends ActionBarActivity {
public boolean onPrepareOptionsMenu(Menu menu) {
super.onPrepareOptionsMenu(menu);
menu.clear();
if (device.isPaired()) {
if (device != null && device.isPaired()) {
menu.add(R.string.device_menu_plugins).setOnMenuItemClickListener(new MenuItem.OnMenuItemClickListener() {
@Override
public boolean onMenuItemClick(MenuItem menuItem) {
@@ -172,6 +176,25 @@ public class DeviceActivity extends ActionBarActivity {
} else {
return false;
}
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
switch (requestCode)
{
case RESULT_NEEDS_RELOAD:
BackgroundService.RunCommand(DeviceActivity.this, new BackgroundService.InstanceCallback() {
@Override
public void onServiceStart(BackgroundService service) {
Device device = service.getDevice(deviceId);
device.reloadPluginsFromSettings();
}
});
break;
default:
super.onActivityResult(requestCode, resultCode, data);
}
}
}

View File

@@ -0,0 +1,20 @@
package org.kde.kdeconnect.UserInterface.List;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.Button;
public class CustomItem implements ListAdapter.Item {
private final View view;
public CustomItem(View v) {
this.view = v;
}
@Override
public View inflateView(LayoutInflater layoutInflater) {
return view;
}
}

View File

@@ -4,6 +4,7 @@ package org.kde.kdeconnect.UserInterface.List;
import android.app.Activity;
import android.content.Intent;
import android.view.LayoutInflater;
import android.view.MotionEvent;
import android.view.View;
import android.widget.TextView;
@@ -24,7 +25,10 @@ public class DeviceItem implements ListAdapter.Item {
@Override
public View inflateView(LayoutInflater layoutInflater) {
View v = layoutInflater.inflate(R.layout.list_item_entry, null);
final View v = layoutInflater.inflate(R.layout.list_item_entry, null);
//Highlight when selected effect
v.setBackgroundDrawable(layoutInflater.getContext().getResources().getDrawable(R.drawable.kitkatcompatselector_list_selector_holo_dark));
TextView titleView = (TextView)v.findViewById(R.id.list_item_entry_title);
if (titleView != null) titleView.setText(device.getName());

View File

@@ -9,11 +9,11 @@ import org.kde.kdeconnect_tp.R;
public class SectionItem implements ListAdapter.Item {
private final String title;
public boolean isEmpty;
public boolean isSectionEmpty;
public SectionItem(String title) {
this.title = title;
this.isEmpty = false;
this.isSectionEmpty = false;
}
@Override
@@ -21,14 +21,14 @@ public class SectionItem implements ListAdapter.Item {
View v = layoutInflater.inflate(R.layout.list_item_category, null);
//Make it not selectable
v.setOnClickListener(null);
v.setOnLongClickListener(null);
v.setLongClickable(false);
TextView sectionView = (TextView) v.findViewById(R.id.list_item_category_text);
sectionView.setText(title);
if (isEmpty) {
if (isSectionEmpty) {
v.findViewById(R.id.list_item_category_empty_placeholder).setVisibility(View.VISIBLE);
}

View File

@@ -0,0 +1,40 @@
package org.kde.kdeconnect.UserInterface.List;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
import org.kde.kdeconnect_tp.R;
public class SmallEntryItem implements ListAdapter.Item {
private final String title;
private final View.OnClickListener clickListener;
public SmallEntryItem(String title) {
this.title = title;
this.clickListener = null;
}
public SmallEntryItem(String title, View.OnClickListener clickListener) {
this.title = title;
this.clickListener = clickListener;
}
@Override
public View inflateView(LayoutInflater layoutInflater) {
View v = layoutInflater.inflate(android.R.layout.simple_list_item_1, null);
TextView titleView = (TextView)v.findViewById(android.R.id.text1);
if (titleView != null) titleView.setText(title);
if (clickListener != null) {
titleView.setOnClickListener(clickListener);
v.setBackgroundDrawable(layoutInflater.getContext().getResources().getDrawable(R.drawable.kitkatcompatselector_list_selector_holo_dark));
}
return v;
}
}

View File

@@ -104,36 +104,36 @@ public class MainActivity extends ActionBarActivity {
Resources res = getResources();
section = new SectionItem(res.getString(R.string.category_connected_devices));
section.isEmpty = true;
section.isSectionEmpty = true;
items.add(section);
for(Device d : devices) {
if (d.isReachable() && d.isPaired()) {
items.add(new DeviceItem(MainActivity.this, d));
section.isEmpty = false;
section.isSectionEmpty = false;
}
}
section = new SectionItem(res.getString(R.string.category_not_paired_devices));
section.isEmpty = true;
section.isSectionEmpty = true;
items.add(section);
for(Device d : devices) {
if (d.isReachable() && !d.isPaired()) {
items.add(new DeviceItem(MainActivity.this, d));
section.isEmpty = false;
section.isSectionEmpty = false;
}
}
section = new SectionItem(res.getString(R.string.category_remembered_devices));
section.isEmpty = true;
section.isSectionEmpty = true;
items.add(section);
for(Device d : devices) {
if (!d.isReachable() && d.isPaired()) {
items.add(new DeviceItem(MainActivity.this, d));
section.isEmpty = false;
section.isSectionEmpty = false;
}
}
if (section.isEmpty) {
items.remove(items.size()-1); //Remove section
if (section.isSectionEmpty) {
items.remove(items.size()-1); //Remove remembered devices section if empty
}
runOnUiThread(new Runnable() {

View File

@@ -0,0 +1,35 @@
package org.kde.kdeconnect.UserInterface;
import android.content.Context;
import android.content.res.TypedArray;
import android.util.AttributeSet;
import android.widget.ImageButton;
import android.widget.LinearLayout;
import org.kde.kdeconnect_tp.R;
public class MaxWidthImageButton extends ImageButton {
int mMaxWidth = Integer.MAX_VALUE;
public MaxWidthImageButton(Context context) {
super(context);
}
public MaxWidthImageButton(Context context, AttributeSet attrs) {
super(context, attrs);
TypedArray a = getContext().obtainStyledAttributes(attrs, R.styleable.MaxWidthImageButton);
mMaxWidth = a.getDimensionPixelSize(R.styleable.MaxWidthImageButton_maxWidth, Integer.MAX_VALUE);
}
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
if(getMeasuredWidth() > mMaxWidth){
setMeasuredDimension(mMaxWidth, getMeasuredHeight());
}
}
}

View File

@@ -0,0 +1,17 @@
package org.kde.kdeconnect.UserInterface;
import android.content.Intent;
import android.os.Bundle;
import android.preference.PreferenceActivity;
public class PluginSettingsActivity extends PreferenceActivity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
String resource_name = getIntent().getStringExtra(Intent.EXTRA_INTENT);
int resource_file = getResources().getIdentifier(resource_name, "xml", getPackageName());
addPreferencesFromResource(resource_file);
}
}

View File

@@ -1,27 +0,0 @@
package org.kde.kdeconnect.UserInterface;
import android.content.Context;
import android.preference.Preference;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import java.util.ArrayList;
public class PreferenceListAdapter extends ArrayAdapter<Preference> {
private final ArrayList<Preference> localList;
public PreferenceListAdapter(Context context, ArrayList<Preference> items) {
super(context,0, items);
localList = items;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
Preference preference = localList.get(position);
return preference.getView(convertView, parent);
}
}

View File

@@ -1,24 +1,29 @@
package org.kde.kdeconnect.UserInterface;
import android.app.ListActivity;
import android.content.Intent;
import android.os.Bundle;
import android.preference.CheckBoxPreference;
import android.preference.Preference;
import android.preference.PreferenceActivity;
import android.preference.PreferenceScreen;
import android.view.View;
import android.widget.AdapterView;
import org.kde.kdeconnect.BackgroundService;
import org.kde.kdeconnect.Device;
import org.kde.kdeconnect.Plugins.PluginFactory;
import org.kde.kdeconnect_tp.R;
import java.util.ArrayList;
import java.util.Set;
public class SettingsActivity extends ListActivity {
public class SettingsActivity extends PreferenceActivity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
final PreferenceScreen preferenceScreen = getPreferenceManager().createPreferenceScreen(this);
setPreferenceScreen(preferenceScreen);
final String deviceId = getIntent().getStringExtra("deviceId");
BackgroundService.RunCommand(getApplicationContext(), new BackgroundService.InstanceCallback() {
@@ -30,40 +35,49 @@ public class SettingsActivity extends ListActivity {
final ArrayList<Preference> preferences = new ArrayList<Preference>();
for (final String pluginName : plugins) {
CheckBoxPreference pref = new CheckBoxPreference(getBaseContext());
final CheckBoxPreference pref = new CheckBoxPreference(getBaseContext());
PluginFactory.PluginInfo info = PluginFactory.getPluginInfo(getBaseContext(), pluginName);
pref.setKey(pluginName);
pref.setTitle(info.getDisplayName());
pref.setSummary(info.getDescription());
pref.setChecked(device.isPluginEnabled(pluginName));
preferences.add(pref);
preferenceScreen.addPreference(pref);
if (info.hasSettings()) {
final Preference pluginPreference = new Preference(getBaseContext());
pluginPreference.setKey(pluginName + getString(R.string.plugin_settings_key));
pluginPreference.setTitle(info.getDisplayName());
pluginPreference.setSummary(R.string.plugin_settings);
preferences.add(pluginPreference);
preferenceScreen.addPreference(pluginPreference);
pluginPreference.setDependency(pref.getKey());
}
}
setListAdapter(new PreferenceListAdapter(SettingsActivity.this, preferences));
getListView().setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {
CheckBoxPreference pref = (CheckBoxPreference)preferences.get(i);
boolean enabled = device.isPluginEnabled(pref.getKey());
device.setPluginEnabled(pref.getKey(), !enabled);
pref.setChecked(!enabled);
getListAdapter().getView(i, view, null); //This will refresh the view (yes, this is the way to do it)
Preference pref = preferences.get(i);
if (pref.getDependency() == null) { //Is a plugin check
CheckBoxPreference check = (CheckBoxPreference)pref;
boolean enabled = device.isPluginEnabled(pref.getKey());
device.setPluginEnabled(pref.getKey(), !enabled);
check.setChecked(!enabled);
} else { //Is a plugin suboption
if (pref.isEnabled()) {
Intent intent = new Intent(SettingsActivity.this, PluginSettingsActivity.class);
intent.putExtra(Intent.EXTRA_INTENT, pref.getKey());
startActivity(intent);
}
}
}
});
getListView().setPadding(16,16,16,16);
}
});
}
}

View File

@@ -136,7 +136,8 @@ public class ShareToReceiver extends ActionBarActivity {
queuedSendUriList(device, uriList);
} catch (Exception e) {
Log.e(this.getClass().getName(), e.toString());
e.printStackTrace();
Log.e("ShareToReceiver", "Exception");
}
} else if (extras.containsKey(Intent.EXTRA_TEXT)) {

Binary file not shown.

After

Width:  |  Height:  |  Size: 115 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 139 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 115 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 115 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 189 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 110 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 117 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 110 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 110 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 172 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 121 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 154 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 121 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 121 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 190 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 133 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 158 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 133 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 133 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 273 B

View File

@@ -0,0 +1,20 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Copyright (C) 2008 The Android Open Source Project
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
-->
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_activated="true" android:drawable="@drawable/kitkatcompatselector_list_activated_holo" />
<item android:drawable="@android:color/transparent" />
</selector>

View File

@@ -0,0 +1,26 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Copyright (C) 2010 The Android Open Source Project
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
-->
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<!-- Even though these two point to the same resource, have two states so the drawable will invalidate itself when coming out of pressed state. -->
<item android:state_focused="true" android:state_enabled="false" android:state_pressed="true" android:drawable="@drawable/kitkatcompatselector_list_selector_disabled_holo_dark" />
<item android:state_focused="true" android:state_enabled="false" android:drawable="@drawable/kitkatcompatselector_list_selector_disabled_holo_dark" />
<item android:state_focused="true" android:state_pressed="true" android:drawable="@drawable/kitkatcompatselector_list_selector_background_transition_holo_dark" />
<item android:state_focused="false" android:state_pressed="true" android:drawable="@drawable/kitkatcompatselector_list_selector_background_transition_holo_dark" />
<item android:state_focused="true" android:drawable="@drawable/kitkatcompatselector_list_focused_holo" />
<item android:drawable="@android:color/transparent" />
</selector>

View File

@@ -0,0 +1,20 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Copyright (C) 2010 The Android Open Source Project
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
-->
<transition xmlns:android="http://schemas.android.com/apk/res/android">
<item android:drawable="@drawable/kitkatcompatselector_list_pressed_holo_dark" />
<item android:drawable="@drawable/kitkatcompatselector_list_longpressed_holo" />
</transition>

View File

@@ -0,0 +1,27 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Copyright (C) 2010 The Android Open Source Project
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
-->
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_window_focused="false" android:drawable="@android:color/transparent" />
<!-- Even though these two point to the same resource, have two states so the drawable will invalidate itself when coming out of pressed state. -->
<item android:state_focused="true" android:state_enabled="false" android:state_pressed="true" android:drawable="@drawable/kitkatcompatselector_list_selector_disabled_holo_dark" />
<item android:state_focused="true" android:state_enabled="false" android:drawable="@drawable/kitkatcompatselector_list_selector_disabled_holo_dark" />
<item android:state_focused="true" android:state_pressed="true" android:drawable="@drawable/kitkatcompatselector_list_selector_background_transition_holo_dark" />
<item android:state_focused="false" android:state_pressed="true" android:drawable="@drawable/kitkatcompatselector_list_selector_background_transition_holo_dark" />
<item android:state_focused="true" android:drawable="@drawable/kitkatcompatselector_list_focused_holo" />
</selector>

View File

@@ -1,26 +1,13 @@
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
<ListView xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/buttons_list"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
android:paddingBottom="@dimen/activity_vertical_margin"
android:fillViewport="true"
android:divider="@null"
tools:context=".MainActivity"
android:orientation="vertical">
<ListView
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:id="@+id/buttons_list"
android:layout_weight="1"
/>
<ListView
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:id="@+id/errors_list"
android:layout_weight="1"
/>
</LinearLayout>
/>

View File

@@ -15,4 +15,13 @@
android:layout_centerInParent="true"
android:padding="12dip" />
<view
android:layout_width="wrap_content"
android:layout_height="wrap_content"
class="org.kde.kdeconnect.Plugins.MousePadPlugin.KeyListenerView"
android:id="@+id/keyListener"
android:layout_alignParentTop="true"
android:layout_centerHorizontal="true"
android:layout_marginTop="58dp" />
</RelativeLayout>

View File

@@ -1,43 +1,52 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@+id/mpris_control_view"
android:gravity="center">
android:gravity="center"
android:paddingLeft="60dip"
android:paddingTop="5dip"
android:paddingRight="60dip"
android:paddingBottom="5dip">
<Spinner
android:layout_width="200dip"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/player_spinner"
android:layout_gravity="center"
/>
<TextView
android:layout_width="match_parent"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textAppearance="?android:attr/textAppearanceMedium"
android:id="@+id/now_playing_textview"
android:singleLine="true"
android:gravity="center"
android:padding="5dip"
android:padding="8dip"
android:layout_gravity="center"
/>
<ImageButton
android:layout_width="200dip"
<org.kde.kdeconnect.UserInterface.MaxWidthImageButton
android:layout_width="fill_parent"
android:layout_height="75dip"
app:maxWidth="300dip"
android:id="@+id/play_button"
android:src="@android:drawable/ic_media_play"
android:contentDescription="@string/mpris_play"
android:layout_gravity="center"
/>
android:layout_weight="0"
android:clickable="false"
android:adjustViewBounds="false"
android:baselineAlignBottom="true" />
<LinearLayout
android:orientation="horizontal"
android:layout_width="200dip"
android:layout_height="50dip"
android:layout_width="match_parent"
android:layout_height="60dip"
android:layout_gravity="center"
>
@@ -81,17 +90,18 @@
<LinearLayout
android:orientation="horizontal"
android:layout_width="200dip"
android:layout_width="match_parent"
android:layout_height="70dip"
android:id="@+id/volume_layout"
android:layout_gravity="center">
<ImageView
android:layout_width="50dip"
android:layout_height="50dip"
android:layout_width="30dip"
android:layout_height="30dip"
android:maxWidth="30dip"
android:layout_marginRight="10dip"
android:id="@+id/imageView"
android:layout_weight="1"
android:layout_weight="0"
android:layout_gravity="left|center_vertical"
android:contentDescription="@string/mpris_volume"
android:src="@drawable/ic_volume"
@@ -99,7 +109,7 @@
<SeekBar
android:layout_width="fill_parent"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/volume_seek"
android:layout_weight="1"

View File

@@ -9,4 +9,8 @@ xmlns:kdeconnect="http://schemas.android.com/apk/res-auto/android">
<item android:id="@+id/menu_middle_click"
android:title="@string/middle_click"
kdeconnect:showAsAction="never" />
</menu>
<item android:id="@+id/menu_show_keyboard"
android:title="@string/show_keyboard"
kdeconnect:showAsAction="never" />
</menu>

View File

@@ -60,11 +60,21 @@
<string name="mpris_ff">Превъртане напред</string>
<string name="mpris_next">Следващ</string>
<string name="mpris_volume">Сила на звука</string>
<string name="mpris_settings">Отдалечен мултимедиен контрол</string>
<string name="share_to">Споделяне...</string>
<string name="protocol_version_older">Това устройство използва стара версия на протокола</string>
<string name="protocol_version_newer">Това устройство използва по-нова версия на протокола</string>
<string name="general_settings">Общи настройки</string>
<string name="plugin_settings">Общи настройки</string>
<string name="device_name">Име на устройството</string>
<string name="device_name_preference_summary">%s</string>
<string name="invalid_device_name">Невалидно име на устройство</string>
<string name="share_notification_preference">Синхронизиране на уведомленията</string>
<string-array name="mpris_time_entries">
<item>10 seconds</item>
<item>20 seconds</item>
<item>30 seconds</item>
<item>1 minute</item>
<item>2 minutes</item>
</string-array>
</resources>

View File

@@ -5,4 +5,12 @@
<string name="pref_plugin_ping">Ping</string>
<string name="pref_plugin_ping_desc">Šalji i primaj ping-ove</string>
<string name="pref_plugin_notifications">Sinhronizovano obavještenje</string>
<string name="share_notification_preference">Sinhronizovano obavještenje</string>
<string-array name="mpris_time_entries">
<item>10 seconds</item>
<item>20 seconds</item>
<item>30 seconds</item>
<item>1 minute</item>
<item>2 minutes</item>
</string-array>
</resources>

View File

@@ -56,6 +56,7 @@
<string name="reconnect">Reconnecta</string>
<string name="right_click">Envia un clic del botó dret</string>
<string name="middle_click">Envia un clic del botó del mig</string>
<string name="show_keyboard">Mostra el teclat</string>
<string name="device_not_paired">El dispositiu no està aparellat</string>
<string name="request_pairing">Demana aparellar</string>
<string name="pairing_accept">Accepta</string>
@@ -70,12 +71,31 @@
<string name="mpris_ff">Avanç ràpid</string>
<string name="mpris_next">Següent</string>
<string name="mpris_volume">Volum</string>
<string name="mpris_settings">Arranjament multimèdia</string>
<string name="mpris_time_settings_title">Interval de temps</string>
<string name="mpris_time_settings_summary">Ajusta el temps per avançar o rebobinar un fitxer multimèdia.</string>
<string name="share_to">Comparteix amb...</string>
<string name="protocol_version_older">Aquest dispositiu usa una versió antiga del protocol</string>
<string name="protocol_version_newer">Aquest dispositiu usa una versió nova del protocol</string>
<string name="general_settings">Arranjament general</string>
<string name="plugin_settings">Arranjament</string>
<string name="device_name">Nom del dispositiu</string>
<string name="device_name_preference_summary">%s</string>
<string name="invalid_device_name">El nom del dispositiu no és vàlid</string>
<string name="shareplugin_text_saved">S\'ha rebut text i s\'ha desat al porta-retalls</string>
<string name="share_notification_preference">Rebombori de les notificacions</string>
<string name="share_notification_preference_summary">Vibra i reprodueix un so en rebre un fitxer</string>
<string name="sftp_internal_storage">Emmagatzematge intern</string>
<string name="sftp_all_files">Tots els fitxers</string>
<string name="sftp_sdcard_num">Targeta SD %d</string>
<string name="sftp_sdcard">Targeta SD</string>
<string name="sftp_readonly">(només de lectura)</string>
<string name="sftp_camera">Imatges de la càmera</string>
<string-array name="mpris_time_entries">
<item>10 segons</item>
<item>20 segons</item>
<item>30 segons</item>
<item>1 minut</item>
<item>2 minuts</item>
</string-array>
</resources>

View File

@@ -1,7 +1,7 @@
<?xml version='1.0' encoding='utf-8'?>
<resources>
<string name="pref_plugin_telephony">Oznamování telefonie</string>
<string name="pref_plugin_telephony_desc">Posílat upozorňování na SMS a hovory</string>
<string name="pref_plugin_telephony">Upozornění telefonie</string>
<string name="pref_plugin_telephony_desc">Posílat upozorní na SMS a hovory</string>
<string name="pref_plugin_battery">Hlášení baterie</string>
<string name="pref_plugin_battery_desc">Periodicky hlásit stav baterky</string>
<string name="pref_plugin_sftp">Přístup k souborovému systému</string>
@@ -14,7 +14,7 @@
<string name="pref_plugin_mpris_desc">Ovládejte audio/video z vašeho telefonu</string>
<string name="pref_plugin_ping">Ping</string>
<string name="pref_plugin_ping_desc">Posílat a přijímat ping</string>
<string name="pref_plugin_notifications">Synchronizace hláše</string>
<string name="pref_plugin_notifications">Synchronizace upozorně</string>
<string name="pref_plugin_notifications_desc">Zpřístupněte si upozornění z jiných zařízení</string>
<string name="pref_plugin_sharereceiver">Sdílet příjemce</string>
<string name="pref_plugin_sharereceiver_desc">Ukládat příchozí soubory do úložiště telefonu</string>
@@ -56,6 +56,7 @@
<string name="reconnect">Znovu připojit</string>
<string name="right_click">Poslat kliknutí pravým tlačítkem</string>
<string name="middle_click">Poslat kliknutí prostředním tlačítkem</string>
<string name="show_keyboard">Zobrazit klávesnici</string>
<string name="device_not_paired">Zařízení není spárované</string>
<string name="request_pairing">Vyžádat párování</string>
<string name="pairing_accept">Přijmout</string>
@@ -70,12 +71,31 @@
<string name="mpris_ff">Rychle vpřed</string>
<string name="mpris_next">Následující</string>
<string name="mpris_volume">Hlasitost</string>
<string name="mpris_settings">Nastavení multimédií</string>
<string name="mpris_time_settings_title">Časový interval</string>
<string name="mpris_time_settings_summary">Upravit čas pro rychlý posun multimediálním souborem vpřed a zpět.</string>
<string name="share_to">Sdílet s...</string>
<string name="protocol_version_older">Toto zařízení používá starou verzi protokolu</string>
<string name="protocol_version_newer">Toto zařízení používá novější verzi protokolu</string>
<string name="general_settings">Obecná nastavení</string>
<string name="plugin_settings">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>
<string name="shareplugin_text_saved">Přijatý text byl uložen do schránky</string>
<string name="share_notification_preference">Hlasitá upozornění</string>
<string name="share_notification_preference_summary">Vibrovat a přehrát melodii při přijímání souboru</string>
<string name="sftp_internal_storage">Interní úložiště</string>
<string name="sftp_all_files">Všechny soubory</string>
<string name="sftp_sdcard_num">SD karta %d</string>
<string name="sftp_sdcard">SD karta</string>
<string name="sftp_readonly">(pouze ke čtení)</string>
<string name="sftp_camera">Obrázky z fotoaparátu</string>
<string-array name="mpris_time_entries">
<item>10 sekund</item>
<item>20 sekund</item>
<item>30 sekund</item>
<item>1 minuta</item>
<item>2 minuty</item>
</string-array>
</resources>

View File

@@ -16,6 +16,8 @@
<string name="pref_plugin_ping_desc">Send og modtag ping</string>
<string name="pref_plugin_notifications">Synk. af bekendtgørelser</string>
<string name="pref_plugin_notifications_desc">Tilgå dine bekendtgørelser fra andre enheder</string>
<string name="pref_plugin_sharereceiver">Del modtager</string>
<string name="pref_plugin_sharereceiver_desc">Gem indkommende filer til telefonens lager</string>
<string name="plugin_not_available">Denne funktion er ikke tilgængelig i din Android-version</string>
<string name="device_list_empty">Ingen enheder</string>
<string name="ok">O.k.</string>
@@ -24,8 +26,8 @@
<string name="no_permissions">Du skal give tilladelse for at tilgå bekendtgørelser</string>
<string name="send_ping">Send ping</string>
<string name="open_mpris_controls">Åbn fjernbetjening</string>
<string name="open_mousepad">Åbn museplade-kontrol</string>
<string name="mousepad_info">Bevæg din tommelfinger på skærmen for at flytte musemarkøren</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</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>
@@ -44,10 +46,17 @@
<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="incoming_file_title">Parringsanmodning fra %1s</string>
<string name="incoming_file_text">%s</string>
<string name="received_url_title">Modtog link fra %1s</string>
<string name="received_url_text">Tap for at åbne \"%1s\"</string>
<string name="incoming_file_title">Indkommende fil fra %1s</string>
<string name="incoming_file_text">%1s</string>
<string name="received_file_title">Modtog fil fra %1s</string>
<string name="received_file_text">Tap for at åbne \"%1s\"</string>
<string name="tap_to_answer">Tap for at svare</string>
<string name="reconnect">Forbind igen</string>
<string name="right_click">Send højreklik</string>
<string name="middle_click">Send midterklik</string>
<string name="show_keyboard">Vis tastatur</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>
@@ -62,11 +71,22 @@
<string name="mpris_ff">Spol frem</string>
<string name="mpris_next">Næste</string>
<string name="mpris_volume">Lydstyrke</string>
<string name="mpris_settings">Fjernbetjening af multimedie</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="plugin_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>
<string name="shareplugin_text_saved">Modtog tekst, gemt til udklipsholder</string>
<string name="share_notification_preference">Synk. af bekendtgørelser</string>
<string-array name="mpris_time_entries">
<item>10 seconds</item>
<item>20 seconds</item>
<item>30 seconds</item>
<item>1 minute</item>
<item>2 minutes</item>
</string-array>
</resources>

View File

@@ -8,13 +8,14 @@
<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_mousepad">Fernbedienung</string>
<string name="pref_plugin_mousepad">Maus-Fernbedienung</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>
<string name="pref_plugin_notifications_desc">Zugriff auf Ihre Benachrichtigungen von anderen Geräten</string>
<string name="pref_plugin_sharereceiver_desc">Eingehende Dateien auf dem Telefonspeicher ablegen</string>
<string name="plugin_not_available">Diese Funktion ist in Ihrer Android-Version nicht verfügbar</string>
<string name="device_list_empty">Keine Geräte</string>
<string name="ok">OK</string>
@@ -23,14 +24,14 @@
<string name="no_permissions">Sie müssen die Erlaubnis zum Zugriff auf Benachrichtigungen erteilen</string>
<string name="send_ping">Ping senden</string>
<string name="open_mpris_controls">Fernbedienung öffnen</string>
<string name="open_mousepad">Fernbedienung öffnen</string>
<string name="open_mousepad">Touchpad-Steuerung ö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="device_not_reachable">Das Gerät ist nicht erreichbar</string>
<string name="device_not_reachable">Das angegeben Gerät ist nicht erreichbar</string>
<string name="unknown_device">Unbekanntes Gerät</string>
<string name="error_not_reachable">Das Gerät ist nicht erreichbar</string>
<string name="error_already_requested">Die Verbindung wurde bereits angefragt</string>
@@ -42,10 +43,15 @@
<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="incoming_file_title">Verbindungsanfrage von %1s</string>
<string name="incoming_file_text">%s</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_text">%1s</string>
<string name="received_file_title">Datei von %1s erhalten</string>
<string name="tap_to_answer">Tippen zum Antworten</string>
<string name="reconnect">Erneut verbinden</string>
<string name="right_click">Rechtsklick senden</string>
<string name="middle_click">Mittelklick senden</string>
<string name="show_keyboard">Tastatur anzeigen</string>
<string name="device_not_paired">Das Gerät ist nicht verbunden</string>
<string name="request_pairing">Verbindung angefordert</string>
<string name="pairing_accept">Annehmen</string>
@@ -60,11 +66,29 @@
<string name="mpris_ff">Vorlauf</string>
<string name="mpris_next">Weiter</string>
<string name="mpris_volume">Lautstärke</string>
<string name="mpris_settings">Multimedia-Einstellungen</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>
<string name="plugin_settings">Einstellungen</string>
<string name="device_name">Gerätename</string>
<string name="device_name_preference_summary">%s</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="share_notification_preference">Benachrichtigungs-Abgleich</string>
<string name="share_notification_preference_summary">Beim Empfang einer Datei vibrieren und einen Sound abspielen</string>
<string name="sftp_internal_storage">Interner Speicher</string>
<string name="sftp_all_files">Alle Dateien</string>
<string name="sftp_sdcard_num">SD-Karte %d</string>
<string name="sftp_sdcard">SD-Karte</string>
<string name="sftp_readonly">(Nur lesen)</string>
<string name="sftp_camera">Kamerabilder</string>
<string-array name="mpris_time_entries">
<item>10 Sekunden</item>
<item>20 Sekunden</item>
<item>30 Sekunden</item>
<item>1 Minute</item>
<item>2 Minuten</item>
</string-array>
</resources>

View File

@@ -5,17 +5,20 @@
<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_sftp_desc">Permite examinar 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_mousepad">Control remoto</string>
<string name="pref_plugin_mousepad">Control remoto del ratón</string>
<string name="pref_plugin_mousepad_desc">Controlar su ratón remotamente</string>
<string name="pref_plugin_mpris">Controles remotos multimedia</string>
<string name="pref_plugin_mpris_desc">Controlar audio y vídeo desde el teléfono</string>
<string name="pref_plugin_ping">Ping</string>
<string name="pref_plugin_ping_desc">Enviar y recibir pings</string>
<string name="pref_plugin_notifications">Sincronizar notificaciones</string>
<string name="pref_plugin_notifications_desc">Acceder a las notificaciones desde otros dispositivos</string>
<string name="plugin_not_available">Esta función no está disponible en su versión de Android</string>
<string name="pref_plugin_sharereceiver">Compartir receptor</string>
<string name="pref_plugin_sharereceiver_desc">Guardar archivos entrantes en el almacenamiento del teléfono</string>
<string name="plugin_not_available">Esta funcionalidad no está disponible en su versión de Android</string>
<string name="device_list_empty">Ningún dispositivo</string>
<string name="ok">Aceptar</string>
<string name="cancel">Cancelar</string>
@@ -23,7 +26,8 @@
<string name="no_permissions">Debe otorgar permiso para acceder a las notificaciones</string>
<string name="send_ping">Enviar ping</string>
<string name="open_mpris_controls">Abrir control remoto</string>
<string name="open_mousepad">Abrir control 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</string>
<string name="category_connected_devices">Dispositivos conectados</string>
<string name="category_not_paired_devices">Dispositivos no vinculados</string>
<string name="category_remembered_devices">Dispositivos recordados</string>
@@ -42,10 +46,17 @@
<string name="error_invalid_key">Se ha recibido una clave no valida</string>
<string name="pair_requested">Vinculación solicitada</string>
<string name="pairing_request_from">Solicitud de vinculación de %1s</string>
<string name="incoming_file_title">Solicitud de vinculación de %1s</string>
<string name="incoming_file_text">%s</string>
<string name="received_url_title">Enlace recibido desde %1s</string>
<string name="received_url_text">Pulse para abrir «%1s»</string>
<string name="incoming_file_title">Archivo entrante desde %1s</string>
<string name="incoming_file_text">%1s</string>
<string name="received_file_title">Archivo recibido desde %1s</string>
<string name="received_file_text">Pulse para abrir «%1s»</string>
<string name="tap_to_answer">Toque para responder</string>
<string name="reconnect">Reconectar</string>
<string name="right_click">Enviar clic derecho</string>
<string name="middle_click">Enviar clic del botón central</string>
<string name="show_keyboard">Mostrar teclado</string>
<string name="device_not_paired">Dispositivo no vinculado</string>
<string name="request_pairing">Solicitar vinculación</string>
<string name="pairing_accept">Aceptar</string>
@@ -60,11 +71,25 @@
<string name="mpris_ff">Avance rápido</string>
<string name="mpris_next">Siguiente</string>
<string name="mpris_volume">Volumen</string>
<string name="mpris_settings">Preferencias multimedia</string>
<string name="mpris_time_settings_title">Intervalo de tiempo</string>
<string name="mpris_time_settings_summary">Ajustar el tiempo a avanzar o rebobinar un archivo multimedia.</string>
<string name="share_to">Compartir con...</string>
<string name="protocol_version_older">Este dispositivo usa una versión antigua del protocolo</string>
<string name="protocol_version_newer">Este dispositivo usa una versión más reciente del protocolo</string>
<string name="general_settings">Preferencias generales</string>
<string name="plugin_settings">Preferencias</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>
<string name="invalid_device_name">Nombre de dispositivo no válido</string>
<string name="shareplugin_text_saved">Texto recibido y guardado en el portapapeles</string>
<string name="share_notification_preference">Notificaciones ruidosas</string>
<string name="share_notification_preference_summary">Vibrar y reproducir un sonido cuando se reciba un archivo</string>
<string-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>
</resources>

View File

@@ -48,6 +48,7 @@
<string name="incoming_file_text">%1s</string>
<string name="tap_to_answer">Vastaa napsauttamalla</string>
<string name="reconnect">Yhdistä uudelleen</string>
<string name="show_keyboard">Näytä näppäimistö</string>
<string name="device_not_paired">Ei laiteparia</string>
<string name="request_pairing">Pyydä paritusta</string>
<string name="pairing_accept">Hyväksy</string>
@@ -62,11 +63,21 @@
<string name="mpris_ff">Nopeasti eteenpäin</string>
<string name="mpris_next">Seuraava</string>
<string name="mpris_volume">Äänenvoimakkuus</string>
<string name="mpris_settings">Multimedia-asetukset</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="plugin_settings">Asetukset</string>
<string name="device_name">Laitenimi</string>
<string name="device_name_preference_summary">%s</string>
<string name="invalid_device_name">Virheellinen laitenimi</string>
<string name="share_notification_preference">Äänekkäät ilmoitukset</string>
<string-array name="mpris_time_entries">
<item>10 seconds</item>
<item>20 seconds</item>
<item>30 seconds</item>
<item>1 minute</item>
<item>2 minutes</item>
</string-array>
</resources>

View File

@@ -60,11 +60,21 @@
<string name="mpris_ff">Avance rapide</string>
<string name="mpris_next">Suivant</string>
<string name="mpris_volume">Volume</string>
<string name="mpris_settings">Contrôles distants multimédia</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="plugin_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>
<string name="share_notification_preference">Synchronisation des notifications</string>
<string-array name="mpris_time_entries">
<item>10 seconds</item>
<item>20 seconds</item>
<item>30 seconds</item>
<item>1 minute</item>
<item>2 minutes</item>
</string-array>
</resources>

View File

@@ -8,13 +8,16 @@
<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_mousepad">Távirányító</string>
<string name="pref_plugin_mousepad">Egér távirányító</string>
<string name="pref_plugin_mousepad_desc">Az egér vezérlése távolról</string>
<string name="pref_plugin_mpris">Multimedia távirányítók</string>
<string name="pref_plugin_mpris_desc">Hang vagy videó vezérlése a telefonról</string>
<string name="pref_plugin_ping">Ping</string>
<string name="pref_plugin_ping_desc">Pingek küldése és fogadása</string>
<string name="pref_plugin_notifications">Értesítés szinkronizáció</string>
<string name="pref_plugin_notifications_desc">Hozzáférés az értesítésekhez más eszközökről</string>
<string name="pref_plugin_sharereceiver">Megosztás vevő</string>
<string name="pref_plugin_sharereceiver_desc">Bejövő fájlok mentése a telefon háttértárára</string>
<string name="plugin_not_available">Ez a funkció nem érhető el az ön Android verziójában</string>
<string name="device_list_empty">Nincsenek eszközök</string>
<string name="ok">OK</string>
@@ -23,7 +26,8 @@
<string name="no_permissions">Jogot kell adnia az értesítésekhez való hozzáféréshez</string>
<string name="send_ping">Ping küldése</string>
<string name="open_mpris_controls">Távirányító megnyitása</string>
<string name="open_mousepad">Távirányító megnyitása</string>
<string name="open_mousepad">Érintőtábla vezérlő megnyitása</string>
<string name="mousepad_info">Mozgassa az ujját a képernyőn az egérkurzor mozgatásához</string>
<string name="category_connected_devices">Csatlakoztatott eszközök</string>
<string name="category_not_paired_devices">Nincsenek párosított eszközök</string>
<string name="category_remembered_devices">Megjegyzett eszközök</string>
@@ -42,10 +46,16 @@
<string name="error_invalid_key">Érvénytelen kulcs érkezett</string>
<string name="pair_requested">Párosítás kérve</string>
<string name="pairing_request_from">Párosítási kérés innen: %1s</string>
<string name="incoming_file_title">Párosítási kérés innen: %1s</string>
<string name="incoming_file_text">%s</string>
<string name="received_url_title">Hivatkozás érkezett innen: %1s</string>
<string name="received_url_text">Koppintson „%1s” megnyitásához</string>
<string name="incoming_file_title">Bejövő fájl innen: %1s</string>
<string name="incoming_file_text">%1s</string>
<string name="received_file_title">Fájl érkezett innen: %1s</string>
<string name="received_file_text">Koppintson „%1s” megnyitásához</string>
<string name="tap_to_answer">Érintse meg a válaszhoz</string>
<string name="reconnect">Újracsatlakozás</string>
<string name="right_click">Jobb kattintás küldése</string>
<string name="middle_click">Középső kattintás küldése</string>
<string name="device_not_paired">Az eszköz nincs párosítva</string>
<string name="request_pairing">Párosítás kérése</string>
<string name="pairing_accept">Elfogadás</string>
@@ -60,11 +70,22 @@
<string name="mpris_ff">Gyors előretekerés</string>
<string name="mpris_next">Következő</string>
<string name="mpris_volume">Hangerő</string>
<string name="mpris_settings">Multimedia távirányítók</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">Általános beállítások</string>
<string name="plugin_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>
<string name="shareplugin_text_saved">Szöveg érkezett, elmentve a vágólapra</string>
<string name="share_notification_preference">Értesítés szinkronizáció</string>
<string-array name="mpris_time_entries">
<item>10 seconds</item>
<item>20 seconds</item>
<item>30 seconds</item>
<item>1 minute</item>
<item>2 minutes</item>
</string-array>
</resources>

View File

@@ -58,11 +58,21 @@
<string name="mpris_ff">Avanti veloce</string>
<string name="mpris_next">Successivo</string>
<string name="mpris_volume">Volume</string>
<string name="mpris_settings">Telecomando multimediale</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="plugin_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>
<string name="share_notification_preference">Sincronizzazione notifiche</string>
<string-array name="mpris_time_entries">
<item>10 seconds</item>
<item>20 seconds</item>
<item>30 seconds</item>
<item>1 minute</item>
<item>2 minutes</item>
</string-array>
</resources>

View File

@@ -1,2 +1,10 @@
<?xml version='1.0' encoding='utf-8'?>
<resources/>
<resources>
<string-array name="mpris_time_entries">
<item>10 seconds</item>
<item>20 seconds</item>
<item>30 seconds</item>
<item>1 minute</item>
<item>2 minutes</item>
</string-array>
</resources>

View File

@@ -60,11 +60,21 @@
<string name="mpris_ff">빨리 감기</string>
<string name="mpris_next">다음</string>
<string name="mpris_volume">음량</string>
<string name="mpris_settings">멀티미디어 제어</string>
<string name="share_to">다음으로 공유...</string>
<string name="protocol_version_older">이 장치의 프로토콜 버전이 오래되었습니다</string>
<string name="protocol_version_newer">이 장치의 프로토콜 버전이 더 새롭습니다</string>
<string name="general_settings">일반 설정</string>
<string name="plugin_settings">일반 설정</string>
<string name="device_name">장치 이름</string>
<string name="device_name_preference_summary">%s</string>
<string name="invalid_device_name">잘못된 장치 이름</string>
<string name="share_notification_preference">알림 동기화</string>
<string-array name="mpris_time_entries">
<item>10 seconds</item>
<item>20 seconds</item>
<item>30 seconds</item>
<item>1 minute</item>
<item>2 minutes</item>
</string-array>
</resources>

View File

@@ -1,2 +1,10 @@
<?xml version='1.0' encoding='utf-8'?>
<resources/>
<resources>
<string-array name="mpris_time_entries">
<item>10 seconds</item>
<item>20 seconds</item>
<item>30 seconds</item>
<item>1 minute</item>
<item>2 minutes</item>
</string-array>
</resources>

View File

@@ -56,6 +56,7 @@
<string name="reconnect">Opnieuw verbinden</string>
<string name="right_click">Verstuur een rechter muisklik</string>
<string name="middle_click">Verstuur een middelste muisklik</string>
<string name="show_keyboard">Toetsenbord tonen</string>
<string name="device_not_paired">Apparaat is niet gepaard</string>
<string name="request_pairing">Verzoek voor maken van paar</string>
<string name="pairing_accept">Accepteren</string>
@@ -70,12 +71,31 @@
<string name="mpris_ff">Snel vooruit</string>
<string name="mpris_next">Volgende</string>
<string name="mpris_volume">Volume</string>
<string name="mpris_settings">Instellingen voor multimedia</string>
<string name="mpris_time_settings_title">Intervaltijd</string>
<string name="mpris_time_settings_summary">Pas de tijd aan om snel voorwaarts te gaan or terug te spoelen in een multimedia bestand.</string>
<string name="share_to">Delen met...</string>
<string name="protocol_version_older">Dit apparaat gebruikt een oude protocolversie</string>
<string name="protocol_version_newer">Dit apparaat gebruikt een nieuwere protocolversie</string>
<string name="general_settings">Algemene instellingen</string>
<string name="plugin_settings">Instellingen</string>
<string name="device_name">Apparaatnaam</string>
<string name="device_name_preference_summary">%s</string>
<string name="invalid_device_name">Ongeldige apparaatnaam</string>
<string name="shareplugin_text_saved">Oontvangen tekst, opgeslagen op klembord</string>
<string name="share_notification_preference">Luidruchtige meldingen</string>
<string name="share_notification_preference_summary">Vibreer en speel een geluidje bij ontvangen van een bestand</string>
<string name="sftp_internal_storage">Interne opslag</string>
<string name="sftp_all_files">Alle bestanden</string>
<string name="sftp_sdcard_num">SD-kaartje %d</string>
<string name="sftp_sdcard">SD-kaartje</string>
<string name="sftp_readonly">(alleen-lezen)</string>
<string name="sftp_camera">Afbeeldingen van camera</string>
<string-array name="mpris_time_entries">
<item>10 seconden</item>
<item>20 seconden</item>
<item>30 seconden</item>
<item>1 minuut</item>
<item>2 minuten</item>
</string-array>
</resources>

View File

@@ -56,6 +56,7 @@
<string name="reconnect">Połącz ponownie</string>
<string name="right_click">Wyślij naciskając prawym</string>
<string name="middle_click">Wyślij naciskając środkowym</string>
<string name="show_keyboard">Pokaż klawiaturę</string>
<string name="device_not_paired">Urządzenie niesparowane</string>
<string name="request_pairing">Zażądaj sparowania</string>
<string name="pairing_accept">Przyjmij</string>
@@ -70,12 +71,25 @@
<string name="mpris_ff">Przewiń do przodu</string>
<string name="mpris_next">Następny</string>
<string name="mpris_volume">Głośność</string>
<string name="mpris_settings">Ustawienia multimediów</string>
<string name="mpris_time_settings_title">Czas okresu</string>
<string name="mpris_time_settings_summary">Dostosuj czas do przewijania wprzód lub wstecz w pliku multimedialnym.</string>
<string name="share_to">Współdziel z...</string>
<string name="protocol_version_older">Urządzenie to używa starej wersji protokołu</string>
<string name="protocol_version_newer">Urządzenie to używa nowszej wersji protokołu</string>
<string name="general_settings">Ustawienia ogólne</string>
<string name="plugin_settings">Ustawienia</string>
<string name="device_name">Nazwa urządzenia</string>
<string name="device_name_preference_summary">%s</string>
<string name="invalid_device_name">Nieprawidłowa nazwa urządzenia</string>
<string name="shareplugin_text_saved">Otrzymano tekst, zapisano do schowka</string>
<string name="share_notification_preference">Hałaśliwe powiadomienia</string>
<string name="share_notification_preference_summary">Zadrżyj i odegraj dźwięk przy odebraniu pliku</string>
<string-array name="mpris_time_entries">
<item>10 sekund</item>
<item>20 sekund</item>
<item>30 sekund</item>
<item>1 minuta</item>
<item>2 minuty</item>
</string-array>
</resources>

View File

@@ -56,6 +56,7 @@
<string name="reconnect">Reconectar</string>
<string name="right_click">Enviar um Botão Direito</string>
<string name="middle_click">Enviar um Botão do Meio</string>
<string name="show_keyboard">Mostrar teclado</string>
<string name="device_not_paired">Dispositivo não emparelhado</string>
<string name="request_pairing">Solicitar emparelhamento</string>
<string name="pairing_accept">Aceitar</string>
@@ -70,12 +71,31 @@
<string name="mpris_ff">Avançar rapidamente</string>
<string name="mpris_next">Próximo</string>
<string name="mpris_volume">Volume</string>
<string name="mpris_settings">Configurações de multimídia</string>
<string name="mpris_time_settings_title">Intervalo de tempo</string>
<string name="mpris_time_settings_summary">Ajuste o tempo para avançar ou retroceder um arquivo multimídia.</string>
<string name="share_to">Compartilhar com...</string>
<string name="protocol_version_older">Este dispositivo usa uma versão antiga do protocolo</string>
<string name="protocol_version_newer">Este dispositivo usa uma versão mais recente do protocolo</string>
<string name="general_settings">Configurações gerais</string>
<string name="plugin_settings">Configurações</string>
<string name="device_name">Nome do dispositivo</string>
<string name="device_name_preference_summary">%s</string>
<string name="invalid_device_name">Nome do dispositivo inválido</string>
<string name="shareplugin_text_saved">Texto recebido e salvo na área de transferência</string>
<string name="share_notification_preference">Notificações barulhentas</string>
<string name="share_notification_preference_summary">Vibrar e tocar um som ao receber um arquivo</string>
<string name="sftp_internal_storage">Armazenamento interno</string>
<string name="sftp_all_files">Todos os arquivos</string>
<string name="sftp_sdcard_num">Cartão SD %d</string>
<string name="sftp_sdcard">Cartão SD</string>
<string name="sftp_readonly">(somente leitura)</string>
<string name="sftp_camera">Imagens da câmera</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>
</resources>

View File

@@ -56,6 +56,7 @@
<string name="reconnect">Ligar de Novo</string>
<string name="right_click">Enviar um Botão Direito</string>
<string name="middle_click">Enviar um Botão do Meio</string>
<string name="show_keyboard">Mostrar o Teclado</string>
<string name="device_not_paired">Dispositivo não emparelhado</string>
<string name="request_pairing">Pedir o emparelhamento</string>
<string name="pairing_accept">Aceitar</string>
@@ -70,12 +71,31 @@
<string name="mpris_ff">Avançar</string>
<string name="mpris_next">Seguinte</string>
<string name="mpris_volume">Volume</string>
<string name="mpris_settings">Configuração Multimédia</string>
<string name="mpris_time_settings_title">Tempo do Intervalo</string>
<string name="mpris_time_settings_summary">Ajusta o tempo de avanço ou de recuo de um ficheiro multimédia.</string>
<string name="share_to">Partilhar Com...</string>
<string name="protocol_version_older">Este dispositivo usa uma versão antiga do protocolo</string>
<string name="protocol_version_newer">Este dispositivo usa uma versão mais recente do protocolo</string>
<string name="general_settings">Configuração Geral</string>
<string name="plugin_settings">Configuração</string>
<string name="device_name">Nome do dispositivo</string>
<string name="device_name_preference_summary">%s</string>
<string name="invalid_device_name">Nome do dispositivo inválido</string>
<string name="shareplugin_text_saved">Texto recebido e guardado na área de transferência</string>
<string name="share_notification_preference">Notificações com ruído</string>
<string name="share_notification_preference_summary">Vibrar e tocar um som ao receber um ficheiro</string>
<string name="sftp_internal_storage">Armazenamento interno</string>
<string name="sftp_all_files">Todos os ficheiros</string>
<string name="sftp_sdcard_num">Cartão SD %d</string>
<string name="sftp_sdcard">Cartão SD</string>
<string name="sftp_readonly">(apenas para leitura)</string>
<string name="sftp_camera">Fotografias</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>
</resources>

View File

@@ -60,11 +60,21 @@
<string name="mpris_ff">Derulare rapidă înainte</string>
<string name="mpris_next">Următor</string>
<string name="mpris_volume">Volum</string>
<string name="mpris_settings">Controale multimedia distante</string>
<string name="share_to">Partajează cu...</string>
<string name="protocol_version_older">Acest dispozitiv folosește o versiune veche a protocolului</string>
<string name="protocol_version_newer">Acest dispozitiv folosește o versiune mai nouă a protocolului</string>
<string name="general_settings">Configurări generale</string>
<string name="plugin_settings">Configurări generale</string>
<string name="device_name">Denumire dispozitiv</string>
<string name="device_name_preference_summary">%s</string>
<string name="invalid_device_name">Denumire nevalidă a dispozitivului</string>
<string name="share_notification_preference">Sincronizare notificări</string>
<string-array name="mpris_time_entries">
<item>10 seconds</item>
<item>20 seconds</item>
<item>30 seconds</item>
<item>1 minute</item>
<item>2 minutes</item>
</string-array>
</resources>

View File

@@ -55,10 +55,20 @@
<string name="mpris_previous">Предыдущий</string>
<string name="mpris_next">Следующее</string>
<string name="mpris_volume">Громкость</string>
<string name="mpris_settings">ДУ для мультимедия</string>
<string name="share_to">Сделать общим с...</string>
<string name="protocol_version_older">Это устройство использует старую версию протокола</string>
<string name="protocol_version_newer">Это устройство использует более свежую версию протокола</string>
<string name="general_settings">Открыть настройки</string>
<string name="plugin_settings">Открыть настройки</string>
<string name="device_name">Устройство не спарено</string>
<string name="invalid_device_name">Недопустимый получатель ключа</string>
<string name="share_notification_preference">Синхронизация уведомлений</string>
<string-array name="mpris_time_entries">
<item>10 seconds</item>
<item>20 seconds</item>
<item>30 seconds</item>
<item>1 minute</item>
<item>2 minutes</item>
</string-array>
</resources>

View File

@@ -56,6 +56,7 @@
<string name="reconnect">Znovu pripojiť</string>
<string name="right_click">Poslať kliknutie pravým</string>
<string name="middle_click">Poslať kliknutie stredným</string>
<string name="show_keyboard">Zobraziť klávesnicu</string>
<string name="device_not_paired">Zariadenie nespárované</string>
<string name="request_pairing">Požiadavka na spárovanie</string>
<string name="pairing_accept">Prijať</string>
@@ -70,12 +71,31 @@
<string name="mpris_ff">Pretočiť dopredu</string>
<string name="mpris_next">Nasledovné</string>
<string name="mpris_volume">Hlasitosť</string>
<string name="mpris_settings">Multimediálne nastavenia</string>
<string name="mpris_time_settings_title">Časový interval</string>
<string name="mpris_time_settings_summary">Prispôsobiť čas na pretáčanie dopredu alebo späť pre multimediálne súbory.</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">Všeobecné nastavenia</string>
<string name="plugin_settings">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>
<string name="shareplugin_text_saved">Prijatý text, uložený do schránky</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="sftp_internal_storage">Interné úložisko</string>
<string name="sftp_all_files">Všetky súbory</string>
<string name="sftp_sdcard_num">SD karta %d</string>
<string name="sftp_sdcard">SD karta</string>
<string name="sftp_readonly">(iba na čítanie)</string>
<string name="sftp_camera">Obrázky fotoaparátu</string>
<string-array name="mpris_time_entries">
<item>10 sekúnd</item>
<item>20 sekúnd</item>
<item>30 sekúnd</item>
<item>1 minúta</item>
<item>2 minúty</item>
</string-array>
</resources>

View File

@@ -56,6 +56,7 @@
<string name="reconnect">Anslut igen</string>
<string name="right_click">Skicka högerklick</string>
<string name="middle_click">Skicka mittenklick</string>
<string name="show_keyboard">Visa tangentbord</string>
<string name="device_not_paired">Apparat inte ihopparad</string>
<string name="request_pairing">Begära ihopparning</string>
<string name="pairing_accept">Acceptera</string>
@@ -70,12 +71,31 @@
<string name="mpris_ff">Snabbspola framåt</string>
<string name="mpris_next">Nästa</string>
<string name="mpris_volume">Volym</string>
<string name="mpris_settings">Multimediainställningar</string>
<string name="mpris_time_settings_title">Intervalltid</string>
<string name="mpris_time_settings_summary">Justera tiden för att snabbspola framåt eller tillbaka en multimediafil.</string>
<string name="share_to">Dela med...</string>
<string name="protocol_version_older">Apparaten använder en gammal protokollversion</string>
<string name="protocol_version_newer">Apparaten använder en nyare protokollversion</string>
<string name="general_settings">Allmänna inställningar</string>
<string name="plugin_settings">Inställningar</string>
<string name="device_name">Apparatnamn</string>
<string name="device_name_preference_summary">%s</string>
<string name="invalid_device_name">Ogiltigt apparatnamn</string>
<string name="shareplugin_text_saved">Tog emot text, spara på klippbordet</string>
<string name="share_notification_preference">Ljudliga underrättelser</string>
<string name="share_notification_preference_summary">Vibrera och spela ett ljud när en fil tas emot</string>
<string name="sftp_internal_storage">Intern lagring</string>
<string name="sftp_all_files">Alla filer</string>
<string name="sftp_sdcard_num">SD-kort %d</string>
<string name="sftp_sdcard">SD-kort</string>
<string name="sftp_readonly">(skrivskyddat)</string>
<string name="sftp_camera">Kamerabilder</string>
<string-array name="mpris_time_entries">
<item>10 sekunder</item>
<item>20 sekunder</item>
<item>30 sekunder</item>
<item>1 minut</item>
<item>2 minuter</item>
</string-array>
</resources>

View File

@@ -56,6 +56,7 @@
<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>
@@ -70,12 +71,31 @@
<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 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="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="share_notification_preference">Звукові сповіщення</string>
<string name="share_notification_preference_summary">Вібрація і відтворення звуку у відповідь на отримання файла</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-array name="mpris_time_entries">
<item>10 секунд</item>
<item>20 секунд</item>
<item>30 секунд</item>
<item>1 хвилина</item>
<item>2 хвилини</item>
</string-array>
</resources>

View File

@@ -0,0 +1,14 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Generated with http://android-holo-colors.com -->
<resources xmlns:android="http://schemas.android.com/apk/res/android">
<style name="KitKatCompatSelector" parent="Theme.AppCompat">
<item name="android:listChoiceBackgroundIndicator">@drawable/kitkatcompatselector_list_selector_holo_dark</item>
<item name="android:activatedBackgroundIndicator">@drawable/kitkatcompatselector_activated_background_holo_dark</item>
</style>
</resources>

View File

@@ -0,0 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<declare-styleable name="MaxWidthImageButton">
<attr name="maxWidth" format="dimension" />
</declare-styleable>
</resources>

View File

@@ -0,0 +1,4 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<color name="kitkatcompatselector_color">#33b5e5</color>
</resources>

View File

@@ -57,6 +57,7 @@
<string name="reconnect">Reconnect</string>
<string name="right_click">Send Right Click</string>
<string name="middle_click">Send Middle Click</string>
<string name="show_keyboard">Show Keyboard</string>
<string name="device_not_paired">Device not paired</string>
<string name="request_pairing">Request pairing</string>
<string name="pairing_accept">Accept</string>
@@ -71,13 +72,44 @@
<string name="mpris_ff">Fast-forward</string>
<string name="mpris_next">Next</string>
<string name="mpris_volume">Volume</string>
<string name="mpris_settings">Multimedia Settings</string>
<string name="mpris_time_settings_title">Interval Time</string>
<string name="mpris_time_settings_summary">Adjust the time to fast forward or rewind a multimedia file.</string>
<string name="mpris_time_key" translatable="false">mpris_interval_time</string>
<string name="mpris_time_default" translatable="false">10000000</string>
<string name="share_to">Share To...</string>
<string name="protocol_version_older">This device uses an old protocol version</string>
<string name="protocol_version_newer">This device uses a newer protocol version</string>
<string name="general_settings">General Settings</string>
<string name="plugin_settings">Settings</string>
<string name="plugin_settings_key" translatable="false">_preferences</string>
<string name="device_name">Device name</string>
<string name="device_name_preference_summary">%s</string>
<string name="invalid_device_name">Invalid device name</string>
<string name="shareplugin_text_saved">Received text, saved to clipboard</string>
<string name="share_notification_preference">Noisy notifications</string>
<string name="share_notification_preference_summary">Vibrate and play a sound when receiving a file</string>
<string name="sftp_internal_storage">Internal storage</string>
<string name="sftp_all_files">All files</string>
<string name="sftp_sdcard_num">SD card %d</string>
<string name="sftp_sdcard">SD card</string>
<string name="sftp_readonly">(read only)</string>
<string name="sftp_camera">Camera pictures</string>
<string-array name="mpris_time_entries">
<item>10 seconds</item>
<item>20 seconds</item>
<item>30 seconds</item>
<item>1 minute</item>
<item>2 minutes</item>
</string-array>
<string-array name="mpris_time_entries_values" translatable="false">
<item>10000000</item>
<item>20000000</item>
<item>30000000</item>
<item>60000000</item>
<item>120000000</item>
</string-array>
</resources>

View File

@@ -0,0 +1,18 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Generated with http://android-holo-colors.com -->
<resources xmlns:android="http://schemas.android.com/apk/res/android">
<style name="ListViewKitKatCompatSelector" parent="android:Widget.ListView">
<item name="android:listSelector">@drawable/kitkatcompatselector_list_selector_holo_dark</item>
</style>
<style name="ListViewKitKatCompatSelector.White" parent="android:Widget.ListView.White">
<item name="android:listSelector">@drawable/kitkatcompatselector_list_selector_holo_dark</item>
</style>
<style name="SpinnerItemKitKatCompatSelector" parent="android:TextAppearance.Widget.TextView.SpinnerItem">
<item name="android:textColor">#ffffff</item>
</style>
</resources>

View File

@@ -0,0 +1,16 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Generated with http://android-holo-colors.com -->
<resources xmlns:android="http://schemas.android.com/apk/res/android">
<style name="KitKatCompatSelector" parent="Theme.AppCompat">
<item name="android:listViewStyle">@style/ListViewKitKatCompatSelector</item>
<item name="android:listViewWhiteStyle">@style/ListViewKitKatCompatSelector.White</item>
<item name="android:spinnerItemStyle">@style/SpinnerItemKitKatCompatSelector</item>
</style>
</resources>

View File

@@ -0,0 +1,15 @@
<?xml version="1.0" encoding="utf-8"?>
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
<ListPreference
android:id="@+id/mpris_time_preference"
android:key="@string/mpris_time_key"
android:title="@string/mpris_time_settings_title"
android:summary="@string/mpris_time_settings_summary"
android:entries="@array/mpris_time_entries"
android:entryValues="@array/mpris_time_entries_values"
android:defaultValue="@string/mpris_time_default" />
</PreferenceScreen>

View File

@@ -0,0 +1,13 @@
<?xml version="1.0" encoding="utf-8"?>
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
<CheckBoxPreference
android:id="@+id/share_notification_preference"
android:key="share_notification_preference"
android:title="@string/share_notification_preference"
android:summary="@string/share_notification_preference_summary"
android:defaultValue="true" />
</PreferenceScreen>