mirror of
https://github.com/KDE/kdeconnect-android
synced 2025-09-01 06:35:09 +00:00
Compare commits
153 Commits
Author | SHA1 | Date | |
---|---|---|---|
|
a0636de6c7 | ||
|
e45262d8e6 | ||
|
74ecab507b | ||
|
34c80314ed | ||
|
7ddb647aa1 | ||
|
8b064f9b77 | ||
|
0728f2d8d2 | ||
|
49478a13d3 | ||
|
bd8a1c9610 | ||
|
5c38de03ba | ||
|
48092f93bc | ||
|
f20fef2459 | ||
|
9b637eb386 | ||
|
67944c075c | ||
|
e4021b4bce | ||
|
080f511cce | ||
|
7331bd5392 | ||
|
f58b6c5c39 | ||
|
5808676cd0 | ||
|
0fc5d09078 | ||
|
b92271105a | ||
|
be34aa6f72 | ||
|
c0301eaed1 | ||
|
bfbe6b55ec | ||
|
d58dd649e0 | ||
|
18a524971b | ||
|
d3ad014e21 | ||
|
fcfdec14fb | ||
|
d443a0d58d | ||
|
5dac72264f | ||
|
9f55fd4448 | ||
|
c16c2ee494 | ||
|
c4ad758110 | ||
|
e3ca5aca57 | ||
|
cff55ab8dd | ||
|
e716205a48 | ||
|
daa0676cbe | ||
|
e2e7b6fead | ||
|
977b2f9957 | ||
|
23337fb2f4 | ||
|
5e0ae437bb | ||
|
51b5989183 | ||
|
2c4274ed2a | ||
|
7e935a495e | ||
|
06a73ca856 | ||
|
753b61860e | ||
|
15773445cc | ||
|
f75ad76e78 | ||
|
5a299376e3 | ||
|
6bdd815c17 | ||
|
c6514ab577 | ||
|
4d8e7cadde | ||
|
e7651ec9bc | ||
|
ee1562050c | ||
|
e9d96e90a0 | ||
|
a3b768fdf8 | ||
|
27e2a3a31d | ||
|
92dcec7883 | ||
|
4a678330a5 | ||
|
55259ed154 | ||
|
2c23b92bdd | ||
|
b81d3a82e5 | ||
|
61c1629ff0 | ||
|
36f592a665 | ||
|
2b934af3fa | ||
|
34cad4c117 | ||
|
d7f3931eeb | ||
|
0a225d3217 | ||
|
e5e0b6dad6 | ||
|
e3f0572b9d | ||
|
06bce217ac | ||
|
e1f418e597 | ||
|
fb97bb5dbb | ||
|
0d69c0b96c | ||
|
3dc171632c | ||
|
4c5114388a | ||
|
546613f4b8 | ||
|
4fe2b1b601 | ||
|
0b85d80634 | ||
|
0ca20767c7 | ||
|
519cfd8253 | ||
|
c09b310c6b | ||
|
c88a9df295 | ||
|
564251e3cb | ||
|
b99082ef00 | ||
|
6d8faa7c48 | ||
|
f2ef2e9047 | ||
|
45a5385ee5 | ||
|
386c3cec21 | ||
|
54be4a1a99 | ||
|
9f3b75b748 | ||
|
b1e3113343 | ||
|
2ee3c543f5 | ||
|
6a43975951 | ||
|
8e28580e93 | ||
|
10f94781c3 | ||
|
2f4dcd1448 | ||
|
acbea545d0 | ||
|
aa69b67cfe | ||
|
9c19fd9b41 | ||
|
bb1f79b5e6 | ||
|
f7c78eeb8c | ||
|
510028d738 | ||
|
b3d91e083a | ||
|
e37aa08dac | ||
|
ad801f1db8 | ||
|
235e49c80f | ||
|
d4f35d8bd6 | ||
|
5cf11c0e75 | ||
|
ef55d6d783 | ||
|
f66263d05c | ||
|
c292639d36 | ||
|
01a8b84087 | ||
|
ffea85c740 | ||
|
f6df98d648 | ||
|
7f0c849fb0 | ||
|
5e37ffe7cd | ||
|
5907517d91 | ||
|
63d452908f | ||
|
ccda9d468b | ||
|
c3d02adaa4 | ||
|
733dd604ba | ||
|
f93a0e366f | ||
|
aa735c22b2 | ||
|
c78077a416 | ||
|
da074f9413 | ||
|
4a0c53610f | ||
|
aa25372e91 | ||
|
125dd14b18 | ||
|
1448814ed7 | ||
|
6f81c67632 | ||
|
7f8f1bee30 | ||
|
1d5c280401 | ||
|
432294c64c | ||
|
d16293cca5 | ||
|
dd5fb954bc | ||
|
b1c6df405c | ||
|
418e1841f3 | ||
|
f2064aaef8 | ||
|
d1b892f368 | ||
|
b5a1424206 | ||
|
b367e5d38e | ||
|
a2ccafbdf8 | ||
|
da55b11c22 | ||
|
cf968a70ea | ||
|
7b78a4c78a | ||
|
9fcda1ec6f | ||
|
e359d59bdd | ||
|
ce7105ef89 | ||
|
540c0a4a24 | ||
|
c28dd3606e | ||
|
bc2bb0cc7e | ||
|
0ae7055711 |
@@ -1,8 +1,9 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
xmlns:tools="http://schemas.android.com/tools"
|
||||
package="org.kde.kdeconnect_tp"
|
||||
android:versionCode="11310"
|
||||
android:versionName="1.13.1">
|
||||
android:versionCode="11421"
|
||||
android:versionName="1.14.2">
|
||||
|
||||
<supports-screens
|
||||
android:anyDensity="true"
|
||||
@@ -15,6 +16,7 @@
|
||||
android:name="android.hardware.telephony"
|
||||
android:required="false" />
|
||||
|
||||
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
|
||||
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
|
||||
<uses-permission android:name="android.permission.INTERNET" />
|
||||
<!-- <uses-permission android:name="android.permission.BLUETOOTH" /> -->
|
||||
@@ -28,11 +30,13 @@
|
||||
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
|
||||
<uses-permission android:name="android.permission.DOWNLOAD_WITHOUT_NOTIFICATION" />
|
||||
<uses-permission android:name="android.permission.FOREGROUND_SERVICE" />
|
||||
<uses-permission android:name="android.permission.READ_CALL_LOG"/>
|
||||
<uses-permission android:name="android.permission.READ_CALL_LOG" />
|
||||
<uses-permission android:name="android.permission.RECEIVE_SMS" />
|
||||
<uses-permission android:name="android.permission.SEND_SMS" />
|
||||
<uses-permission android:name="android.permission.READ_SMS" />
|
||||
<uses-permission android:name="android.permission.REQUEST_INSTALL_PACKAGES" />
|
||||
<uses-permission android:name="android.permission.USE_FULL_SCREEN_INTENT" />
|
||||
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
|
||||
|
||||
<application
|
||||
android:icon="@drawable/icon"
|
||||
@@ -40,7 +44,8 @@
|
||||
android:supportsRtl="true"
|
||||
android:allowBackup="false"
|
||||
android:networkSecurityConfig="@xml/network_security_config"
|
||||
android:theme="@style/KdeConnectTheme">
|
||||
android:theme="@style/KdeConnectTheme"
|
||||
android:name="org.kde.kdeconnect.MyApplication">
|
||||
<service
|
||||
android:name="org.kde.kdeconnect.BackgroundService"
|
||||
android:enabled="true" />
|
||||
@@ -101,6 +106,9 @@
|
||||
android:path="/"
|
||||
android:scheme="package" />
|
||||
</intent-filter>
|
||||
<intent-filter>
|
||||
<action android:name="android.intent.action.MY_PACKAGE_REPLACED"/>
|
||||
</intent-filter>
|
||||
<intent-filter>
|
||||
<action android:name="android.intent.action.BOOT_COMPLETED" />
|
||||
</intent-filter>
|
||||
@@ -119,8 +127,19 @@
|
||||
android:label="@string/findmyphone_title"
|
||||
android:launchMode="singleInstance" />
|
||||
|
||||
<receiver android:name="org.kde.kdeconnect.Plugins.FindMyPhonePlugin.FindMyPhoneReceiver">
|
||||
<intent-filter>
|
||||
<action android:name="org.kde.kdeconnect.Plugins.FindMyPhonePlugin.foundIt" />
|
||||
</intent-filter>
|
||||
</receiver>
|
||||
|
||||
<!-- Plugin-related activities and services -->
|
||||
|
||||
<activity
|
||||
android:name="org.kde.kdeconnect.Plugins.ClibpoardPlugin.ClipboardFloatingActivity"
|
||||
android:theme="@style/Theme.Transparent"
|
||||
android:excludeFromRecents="true"/>
|
||||
|
||||
<activity
|
||||
android:name="org.kde.kdeconnect.Plugins.MprisPlugin.MprisActivity"
|
||||
android:label="@string/open_mpris_controls"
|
||||
@@ -187,6 +206,16 @@
|
||||
android:scheme="kdeconnect" />
|
||||
</intent-filter>
|
||||
</activity>
|
||||
<activity
|
||||
android:name="org.kde.kdeconnect.Plugins.BigscreenPlugin.BigscreenActivity"
|
||||
android:configChanges="orientation|keyboardHidden|screenSize"
|
||||
android:label="@string/pref_plugin_bigscreen"
|
||||
android:parentActivityName="org.kde.kdeconnect.UserInterface.MainActivity"
|
||||
android:windowSoftInputMode="stateHidden|adjustResize">
|
||||
<meta-data
|
||||
android:name="android.support.PARENT_ACTIVITY"
|
||||
android:value="org.kde.kdeconnect.UserInterface.MainActivity" />
|
||||
</activity>
|
||||
<activity
|
||||
android:name="org.kde.kdeconnect.Plugins.MousePadPlugin.MousePadActivity"
|
||||
android:label="@string/pref_plugin_mousepad"
|
||||
@@ -267,8 +296,19 @@
|
||||
android:name="android.support.PARENT_ACTIVITY"
|
||||
android:value="org.kde.kdeconnect.UserInterface.PluginSettingsActivity" />
|
||||
</activity>
|
||||
|
||||
<activity android:name="org.kde.kdeconnect.Plugins.PhotoPlugin.PhotoActivity" />
|
||||
|
||||
<activity
|
||||
android:name="org.kde.kdeconnect.UserInterface.TrustedNetworksActivity"
|
||||
android:label="@string/trusted_networks"
|
||||
android:parentActivityName="org.kde.kdeconnect.UserInterface.MainActivity">
|
||||
<meta-data
|
||||
android:name="android.support.PARENT_ACTIVITY"
|
||||
android:value="org.kde.kdeconnect.UserInterface.MainActivity" />
|
||||
</activity>
|
||||
|
||||
|
||||
</application>
|
||||
|
||||
</manifest>
|
@@ -23,6 +23,8 @@ You can install this app from the [Play Store](https://play.google.com/store/app
|
||||
|
||||
A lot of useful information, including how to get started working on KDE Connect and how to connect with the current developers, is on our [KDE Community Wiki page](https://community.kde.org/KDEConnect)
|
||||
|
||||
For bug reporting, please use [KDE's Bugzilla](https://bugs.kde.org). Please do not use the issue tracker in GitLab since we want to keep everything in one place.
|
||||
|
||||
To contribute patches, use [KDE Connect's Gitlab](https://invent.kde.org/kde/kdeconnect-android/).
|
||||
On Gitlab (as well as on our [old Phabricator](https://phabricator.kde.org/tag/kde_connect/)) you can find a task list with stuff to do and links to other relevant resources.
|
||||
It is a good idea to also subscribe to the [KDE Connect mailing list](https://mail.kde.org/mailman/listinfo/kdeconnect).
|
||||
|
35
build.gradle
35
build.gradle
@@ -6,15 +6,16 @@ buildscript {
|
||||
google()
|
||||
}
|
||||
dependencies {
|
||||
classpath 'com.android.tools.build:gradle:3.4.2'
|
||||
classpath 'com.android.tools.build:gradle:3.6.1'
|
||||
}
|
||||
}
|
||||
|
||||
android {
|
||||
compileSdkVersion 28
|
||||
compileSdkVersion 29
|
||||
defaultConfig {
|
||||
minSdkVersion 14
|
||||
targetSdkVersion 28
|
||||
targetSdkVersion 29
|
||||
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
|
||||
}
|
||||
dexOptions {
|
||||
javaMaxHeapSize "2g"
|
||||
@@ -54,14 +55,13 @@ android {
|
||||
}
|
||||
buildTypes {
|
||||
debug {
|
||||
minifyEnabled false
|
||||
useProguard false
|
||||
minifyEnabled true
|
||||
signingConfig signingConfigs.debug
|
||||
}
|
||||
release { //keep on 'release' for faster builds, set to 'all' when testing to make sure proguard is not deleting important stuff
|
||||
// keep minifyEnabled false above for faster builds; set to 'true'
|
||||
// when testing to make sure ProGuard/R8 is not deleting important stuff
|
||||
release {
|
||||
minifyEnabled true
|
||||
useProguard true
|
||||
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -81,18 +81,25 @@ dependencies {
|
||||
implementation 'androidx.media:media:1.1.0'
|
||||
implementation 'androidx.appcompat:appcompat:1.1.0'
|
||||
implementation 'androidx.preference:preference:1.1.0'
|
||||
implementation 'androidx.recyclerview:recyclerview:1.0.0'
|
||||
implementation 'com.google.android.material:material:1.0.0'
|
||||
implementation 'androidx.recyclerview:recyclerview:1.1.0'
|
||||
implementation 'androidx.swiperefreshlayout:swiperefreshlayout:1.0.0'
|
||||
implementation 'androidx.documentfile:documentfile:1.0.1'
|
||||
implementation 'androidx.lifecycle:lifecycle-runtime:2.2.0'
|
||||
implementation "androidx.lifecycle:lifecycle-extensions:2.2.0"
|
||||
implementation 'androidx.lifecycle:lifecycle-common-java8:2.2.0'
|
||||
implementation 'androidx.gridlayout:gridlayout:1.0.0'
|
||||
implementation 'com.google.android.material:material:1.1.0'
|
||||
implementation 'com.jakewharton:disklrucache:2.0.2' //For caching album art bitmaps
|
||||
implementation 'com.jaredrummler:android-device-names:1.1.9' //To get a human-friendly device name
|
||||
|
||||
implementation 'org.apache.sshd:sshd-core:0.14.0'
|
||||
implementation 'org.apache.mina:mina-core:2.0.19' //For some reason, makes sshd-core:0.14.0 work without NIO, which isn't available until Android 8+
|
||||
implementation 'org.apache.mina:mina-core:2.0.19' //For some reason, makes sshd-core:0.14.0 work without NIO, which isn't available until Android 8 (api 26)
|
||||
|
||||
//implementation('com.github.bright:slf4android:0.1.6') { transitive = true } // For org.apache.sshd debugging
|
||||
implementation 'com.madgag.spongycastle:bcpkix-jdk15on:1.58.0.0' //For SSL certificate generation
|
||||
|
||||
implementation 'com.jakewharton:butterknife:10.0.0'
|
||||
//noinspection AnnotationProcessorOnCompilePath - c.f. https://issuetracker.google.com/issues/140881211
|
||||
implementation 'com.jakewharton:butterknife:10.2.1'
|
||||
annotationProcessor 'com.jakewharton:butterknife-compiler:10.0.0'
|
||||
|
||||
implementation 'org.atteo.classindex:classindex:3.6'
|
||||
@@ -106,3 +113,7 @@ dependencies {
|
||||
testImplementation 'org.mockito:mockito-core:2.23.0'
|
||||
testImplementation 'org.skyscreamer:jsonassert:1.3.0'
|
||||
}
|
||||
|
||||
repositories {
|
||||
google()
|
||||
}
|
||||
|
@@ -1,2 +1,11 @@
|
||||
android.enableJetifier=true
|
||||
android.useAndroidX=true
|
||||
android.useAndroidX=true
|
||||
###
|
||||
# This 'android.enableR8' property only matters when the current
|
||||
# build variant has 'minifyEnabled true'.
|
||||
#
|
||||
# Set this to false to use ProGuard.
|
||||
# Set this to true to use R8.
|
||||
#
|
||||
# Default: true
|
||||
android.enableR8=false
|
||||
|
BIN
gradle/wrapper/gradle-wrapper.jar
vendored
BIN
gradle/wrapper/gradle-wrapper.jar
vendored
Binary file not shown.
4
gradle/wrapper/gradle-wrapper.properties
vendored
4
gradle/wrapper/gradle-wrapper.properties
vendored
@@ -1,6 +1,6 @@
|
||||
#Wed May 01 14:24:13 CEST 2019
|
||||
#Fri Mar 27 09:59:30 CET 2020
|
||||
distributionBase=GRADLE_USER_HOME
|
||||
distributionPath=wrapper/dists
|
||||
zipStoreBase=GRADLE_USER_HOME
|
||||
zipStorePath=wrapper/dists
|
||||
distributionUrl=https\://services.gradle.org/distributions/gradle-5.1.1-all.zip
|
||||
distributionUrl=https\://services.gradle.org/distributions/gradle-5.6.4-all.zip
|
||||
|
116
gradlew
vendored
116
gradlew
vendored
@@ -1,4 +1,20 @@
|
||||
#!/usr/bin/env bash
|
||||
#!/usr/bin/env sh
|
||||
|
||||
#
|
||||
# Copyright 2015 the original author or authors.
|
||||
#
|
||||
# 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.
|
||||
#
|
||||
|
||||
##############################################################################
|
||||
##
|
||||
@@ -6,42 +22,6 @@
|
||||
##
|
||||
##############################################################################
|
||||
|
||||
# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
|
||||
DEFAULT_JVM_OPTS=""
|
||||
|
||||
APP_NAME="Gradle"
|
||||
APP_BASE_NAME=`basename "$0"`
|
||||
|
||||
# Use the maximum available, or set MAX_FD != -1 to use that value.
|
||||
MAX_FD="maximum"
|
||||
|
||||
warn ( ) {
|
||||
echo "$*"
|
||||
}
|
||||
|
||||
die ( ) {
|
||||
echo
|
||||
echo "$*"
|
||||
echo
|
||||
exit 1
|
||||
}
|
||||
|
||||
# OS specific support (must be 'true' or 'false').
|
||||
cygwin=false
|
||||
msys=false
|
||||
darwin=false
|
||||
case "`uname`" in
|
||||
CYGWIN* )
|
||||
cygwin=true
|
||||
;;
|
||||
Darwin* )
|
||||
darwin=true
|
||||
;;
|
||||
MINGW* )
|
||||
msys=true
|
||||
;;
|
||||
esac
|
||||
|
||||
# Attempt to set APP_HOME
|
||||
# Resolve links: $0 may be a link
|
||||
PRG="$0"
|
||||
@@ -60,6 +40,46 @@ cd "`dirname \"$PRG\"`/" >/dev/null
|
||||
APP_HOME="`pwd -P`"
|
||||
cd "$SAVED" >/dev/null
|
||||
|
||||
APP_NAME="Gradle"
|
||||
APP_BASE_NAME=`basename "$0"`
|
||||
|
||||
# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
|
||||
DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"'
|
||||
|
||||
# Use the maximum available, or set MAX_FD != -1 to use that value.
|
||||
MAX_FD="maximum"
|
||||
|
||||
warn () {
|
||||
echo "$*"
|
||||
}
|
||||
|
||||
die () {
|
||||
echo
|
||||
echo "$*"
|
||||
echo
|
||||
exit 1
|
||||
}
|
||||
|
||||
# OS specific support (must be 'true' or 'false').
|
||||
cygwin=false
|
||||
msys=false
|
||||
darwin=false
|
||||
nonstop=false
|
||||
case "`uname`" in
|
||||
CYGWIN* )
|
||||
cygwin=true
|
||||
;;
|
||||
Darwin* )
|
||||
darwin=true
|
||||
;;
|
||||
MINGW* )
|
||||
msys=true
|
||||
;;
|
||||
NONSTOP* )
|
||||
nonstop=true
|
||||
;;
|
||||
esac
|
||||
|
||||
CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar
|
||||
|
||||
# Determine the Java command to use to start the JVM.
|
||||
@@ -85,7 +105,7 @@ location of your Java installation."
|
||||
fi
|
||||
|
||||
# Increase the maximum file descriptors if we can.
|
||||
if [ "$cygwin" = "false" -a "$darwin" = "false" ] ; then
|
||||
if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then
|
||||
MAX_FD_LIMIT=`ulimit -H -n`
|
||||
if [ $? -eq 0 ] ; then
|
||||
if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then
|
||||
@@ -150,11 +170,19 @@ if $cygwin ; then
|
||||
esac
|
||||
fi
|
||||
|
||||
# Split up the JVM_OPTS And GRADLE_OPTS values into an array, following the shell quoting and substitution rules
|
||||
function splitJvmOpts() {
|
||||
JVM_OPTS=("$@")
|
||||
# Escape application args
|
||||
save () {
|
||||
for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done
|
||||
echo " "
|
||||
}
|
||||
eval splitJvmOpts $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS
|
||||
JVM_OPTS[${#JVM_OPTS[*]}]="-Dorg.gradle.appname=$APP_BASE_NAME"
|
||||
APP_ARGS=$(save "$@")
|
||||
|
||||
exec "$JAVACMD" "${JVM_OPTS[@]}" -classpath "$CLASSPATH" org.gradle.wrapper.GradleWrapperMain "$@"
|
||||
# Collect all arguments for the java command, following the shell quoting and substitution rules
|
||||
eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS"
|
||||
|
||||
# by default we should be in the correct project dir, but when run from Finder on Mac, the cwd is wrong
|
||||
if [ "$(uname)" = "Darwin" ] && [ "$HOME" = "$PWD" ]; then
|
||||
cd "$(dirname "$0")"
|
||||
fi
|
||||
|
||||
exec "$JAVACMD" "$@"
|
||||
|
30
gradlew.bat
vendored
30
gradlew.bat
vendored
@@ -1,3 +1,19 @@
|
||||
@rem
|
||||
@rem Copyright 2015 the original author or authors.
|
||||
@rem
|
||||
@rem Licensed under the Apache License, Version 2.0 (the "License");
|
||||
@rem you may not use this file except in compliance with the License.
|
||||
@rem You may obtain a copy of the License at
|
||||
@rem
|
||||
@rem http://www.apache.org/licenses/LICENSE-2.0
|
||||
@rem
|
||||
@rem Unless required by applicable law or agreed to in writing, software
|
||||
@rem distributed under the License is distributed on an "AS IS" BASIS,
|
||||
@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
@rem See the License for the specific language governing permissions and
|
||||
@rem limitations under the License.
|
||||
@rem
|
||||
|
||||
@if "%DEBUG%" == "" @echo off
|
||||
@rem ##########################################################################
|
||||
@rem
|
||||
@@ -8,14 +24,14 @@
|
||||
@rem Set local scope for the variables with windows NT shell
|
||||
if "%OS%"=="Windows_NT" setlocal
|
||||
|
||||
@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
|
||||
set DEFAULT_JVM_OPTS=
|
||||
|
||||
set DIRNAME=%~dp0
|
||||
if "%DIRNAME%" == "" set DIRNAME=.
|
||||
set APP_BASE_NAME=%~n0
|
||||
set APP_HOME=%DIRNAME%
|
||||
|
||||
@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
|
||||
set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m"
|
||||
|
||||
@rem Find java.exe
|
||||
if defined JAVA_HOME goto findJavaFromJavaHome
|
||||
|
||||
@@ -46,10 +62,9 @@ echo location of your Java installation.
|
||||
goto fail
|
||||
|
||||
:init
|
||||
@rem Get command-line arguments, handling Windowz variants
|
||||
@rem Get command-line arguments, handling Windows variants
|
||||
|
||||
if not "%OS%" == "Windows_NT" goto win9xME_args
|
||||
if "%@eval[2+2]" == "4" goto 4NT_args
|
||||
|
||||
:win9xME_args
|
||||
@rem Slurp the command line arguments.
|
||||
@@ -60,11 +75,6 @@ set _SKIP=2
|
||||
if "x%~1" == "x" goto execute
|
||||
|
||||
set CMD_LINE_ARGS=%*
|
||||
goto execute
|
||||
|
||||
:4NT_args
|
||||
@rem Get arguments from the 4NT Shell from JP Software
|
||||
set CMD_LINE_ARGS=%$
|
||||
|
||||
:execute
|
||||
@rem Setup the command line
|
||||
|
9
res/drawable/ic_arrow_back_black_24dp.xml
Normal file
9
res/drawable/ic_arrow_back_black_24dp.xml
Normal file
@@ -0,0 +1,9 @@
|
||||
<vector xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:width="24dp"
|
||||
android:height="24dp"
|
||||
android:viewportWidth="24.0"
|
||||
android:viewportHeight="24.0">
|
||||
<path
|
||||
android:fillColor="#FF000000"
|
||||
android:pathData="M20,11H7.83l5.59,-5.59L12,4l-8,8 8,8 1.41,-1.41L7.83,13H20v-2z"/>
|
||||
</vector>
|
9
res/drawable/ic_arrow_black.xml
Normal file
9
res/drawable/ic_arrow_black.xml
Normal file
@@ -0,0 +1,9 @@
|
||||
<vector xmlns:android="http://schemas.android.com/apk/res/android" xmlns:aapt="http://schemas.android.com/aapt"
|
||||
android:viewportWidth="32"
|
||||
android:viewportHeight="32"
|
||||
android:width="32dp"
|
||||
android:height="32dp">
|
||||
<path
|
||||
android:pathData="M8.990234 5c-0.5522847 0 -1 0.4477153 -1 1 0 0.5522847 0.4477153 1 1 1 0.5522847 0 1 -0.4477153 1 -1 0 -0.5522847 -0.4477153 -1 -1 -1zm2 4L11 29 16.841796 21.769531 26 21Z"
|
||||
android:fillColor="#FF000000" />
|
||||
</vector>
|
9
res/drawable/ic_arrow_downward_black_24dp.xml
Normal file
9
res/drawable/ic_arrow_downward_black_24dp.xml
Normal file
@@ -0,0 +1,9 @@
|
||||
<vector xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:width="24dp"
|
||||
android:height="24dp"
|
||||
android:viewportWidth="24.0"
|
||||
android:viewportHeight="24.0">
|
||||
<path
|
||||
android:pathData="M20,12l-1.41,-1.41L13,16.17V4h-2v12.17l-5.58,-5.59L4,12l8,8 8,-8z"
|
||||
android:fillColor="#010101"/>
|
||||
</vector>
|
9
res/drawable/ic_arrow_forward_black_24dp.xml
Normal file
9
res/drawable/ic_arrow_forward_black_24dp.xml
Normal file
@@ -0,0 +1,9 @@
|
||||
<vector xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:width="24dp"
|
||||
android:height="24dp"
|
||||
android:viewportWidth="24.0"
|
||||
android:viewportHeight="24.0">
|
||||
<path
|
||||
android:fillColor="#FF000000"
|
||||
android:pathData="M12,4l-1.41,1.41L16.17,11H4v2h12.17l-5.58,5.59L12,20l8,-8z"/>
|
||||
</vector>
|
9
res/drawable/ic_arrow_upward_black_24dp.xml
Normal file
9
res/drawable/ic_arrow_upward_black_24dp.xml
Normal file
@@ -0,0 +1,9 @@
|
||||
<vector xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:width="24dp"
|
||||
android:height="24dp"
|
||||
android:viewportWidth="24.0"
|
||||
android:viewportHeight="24.0">
|
||||
<path
|
||||
android:fillColor="#FF000000"
|
||||
android:pathData="M4,12l1.41,1.41L11,7.83V20h2V7.83l5.58,5.59L20,12l-8,-8 -8,8z"/>
|
||||
</vector>
|
9
res/drawable/ic_home_black_24dp.xml
Normal file
9
res/drawable/ic_home_black_24dp.xml
Normal file
@@ -0,0 +1,9 @@
|
||||
<vector xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:width="24dp"
|
||||
android:height="24dp"
|
||||
android:viewportWidth="24.0"
|
||||
android:viewportHeight="24.0">
|
||||
<path
|
||||
android:fillColor="#FF000000"
|
||||
android:pathData="M10,20v-6h4v6h5v-8h3L12,3 2,12h3v8z"/>
|
||||
</vector>
|
9
res/drawable/ic_keyboard_return_black_24dp.xml
Normal file
9
res/drawable/ic_keyboard_return_black_24dp.xml
Normal file
@@ -0,0 +1,9 @@
|
||||
<vector xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:width="24dp"
|
||||
android:height="24dp"
|
||||
android:viewportWidth="24.0"
|
||||
android:viewportHeight="24.0">
|
||||
<path
|
||||
android:fillColor="#FF000000"
|
||||
android:pathData="M19,7v4H5.83l3.58,-3.59L8,6l-6,6 6,6 1.41,-1.41L5.83,13H21V7z"/>
|
||||
</vector>
|
9
res/drawable/ic_warning.xml
Normal file
9
res/drawable/ic_warning.xml
Normal file
@@ -0,0 +1,9 @@
|
||||
<vector xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:width="24dp"
|
||||
android:height="24dp"
|
||||
android:viewportWidth="24.0"
|
||||
android:viewportHeight="24.0">
|
||||
<path
|
||||
android:fillColor="#FFFFFFFF"
|
||||
android:pathData="M1,21h22L12,2 1,21zM13,18h-2v-2h2v2zM13,14h-2v-4h2v4z"/>
|
||||
</vector>
|
67
res/layout/activity_bigscreen.xml
Normal file
67
res/layout/activity_bigscreen.xml
Normal file
@@ -0,0 +1,67 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<androidx.gridlayout.widget.GridLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
xmlns:grid="http://schemas.android.com/apk/res-auto"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent"
|
||||
grid:useDefaultMargins="true">
|
||||
|
||||
<ImageButton
|
||||
android:id="@+id/home_button"
|
||||
grid:layout_column="0"
|
||||
grid:layout_row="0"
|
||||
grid:layout_columnWeight="1"
|
||||
grid:layout_rowWeight="1"
|
||||
android:contentDescription="@string/bigscreen_home"
|
||||
android:src="@drawable/ic_home_black_24dp"
|
||||
android:theme="@style/DisableableButton" />
|
||||
|
||||
<ImageButton
|
||||
android:id="@+id/up_button"
|
||||
grid:layout_column="1"
|
||||
grid:layout_row="0"
|
||||
grid:layout_columnWeight="1"
|
||||
grid:layout_rowWeight="1"
|
||||
android:contentDescription="@string/bigscreen_up"
|
||||
android:src="@drawable/ic_arrow_upward_black_24dp"
|
||||
android:theme="@style/DisableableButton" />
|
||||
|
||||
<ImageButton
|
||||
android:id="@+id/left_button"
|
||||
grid:layout_column="0"
|
||||
grid:layout_row="1"
|
||||
grid:layout_columnWeight="1"
|
||||
grid:layout_rowWeight="1"
|
||||
android:contentDescription="@string/bigscreen_left"
|
||||
android:src="@drawable/ic_arrow_back_black_24dp"
|
||||
android:theme="@style/DisableableButton" />
|
||||
|
||||
<ImageButton
|
||||
android:id="@+id/select_button"
|
||||
grid:layout_column="1"
|
||||
grid:layout_row="1"
|
||||
grid:layout_columnWeight="1"
|
||||
grid:layout_rowWeight="1"
|
||||
android:contentDescription="@string/bigscreen_select"
|
||||
android:src="@drawable/ic_keyboard_return_black_24dp"
|
||||
android:theme="@style/DisableableButton" />
|
||||
|
||||
<ImageButton
|
||||
android:id="@+id/right_button"
|
||||
grid:layout_column="2"
|
||||
grid:layout_row="1"
|
||||
grid:layout_columnWeight="1"
|
||||
grid:layout_rowWeight="1"
|
||||
android:contentDescription="@string/bigscreen_right"
|
||||
android:src="@drawable/ic_arrow_forward_black_24dp"
|
||||
android:theme="@style/DisableableButton" />
|
||||
|
||||
<ImageButton
|
||||
android:id="@+id/down_button"
|
||||
grid:layout_column="1"
|
||||
grid:layout_row="2"
|
||||
grid:layout_columnWeight="1"
|
||||
grid:layout_rowWeight="1"
|
||||
android:contentDescription="@string/bigscreen_down"
|
||||
android:src="@drawable/ic_arrow_downward_black_24dp"
|
||||
android:theme="@style/DisableableButton" />
|
||||
</androidx.gridlayout.widget.GridLayout>
|
12
res/layout/activity_clipboard_floating.xml
Normal file
12
res/layout/activity_clipboard_floating.xml
Normal file
@@ -0,0 +1,12 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:orientation="vertical" android:layout_width="match_parent"
|
||||
android:layout_height="match_parent">
|
||||
|
||||
<Button
|
||||
android:id="@+id/floating_button"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:alpha="0"
|
||||
android:text="@string/pref_plugin_clipboard" />
|
||||
</LinearLayout>
|
@@ -26,7 +26,7 @@
|
||||
|
||||
<com.google.android.material.floatingactionbutton.FloatingActionButton
|
||||
android:id="@+id/floatingActionButton"
|
||||
style="@style/Widget.MaterialComponents.FloatingActionButton"
|
||||
style="@style/KdeConnectThemeBase"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_gravity="bottom|end"
|
||||
|
@@ -100,7 +100,6 @@
|
||||
android:contentDescription="@string/mpris_next"
|
||||
android:src="@drawable/ic_next_black"
|
||||
android:theme="@style/DisableableButton" />
|
||||
|
||||
</LinearLayout>
|
||||
|
||||
<LinearLayout
|
||||
|
16
res/layout/pairing_explanation_not_trusted.xml
Normal file
16
res/layout/pairing_explanation_not_trusted.xml
Normal file
@@ -0,0 +1,16 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<TextView
|
||||
xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:background="?attr/selectableItemBackground"
|
||||
android:drawablePadding="8dp"
|
||||
android:paddingTop="16dp"
|
||||
android:paddingBottom="12dp"
|
||||
android:text="@string/on_non_trusted_message"
|
||||
android:drawableStart="@drawable/ic_warning"
|
||||
android:drawableTint="?attr/colorControlNormal"
|
||||
android:clickable="false"
|
||||
>
|
||||
|
||||
</TextView>
|
38
res/layout/trusted_network_list.xml
Normal file
38
res/layout/trusted_network_list.xml
Normal file
@@ -0,0 +1,38 @@
|
||||
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent"
|
||||
android:orientation="vertical"
|
||||
android:paddingBottom="@dimen/activity_vertical_margin"
|
||||
android:paddingLeft="@dimen/activity_horizontal_margin"
|
||||
android:paddingRight="@dimen/activity_horizontal_margin"
|
||||
android:paddingTop="@dimen/activity_vertical_margin">
|
||||
|
||||
|
||||
<CheckBox
|
||||
android:text="@string/allow_all_networks_text"
|
||||
android:layout_width="match_parent"
|
||||
android:checked="true"
|
||||
android:layout_height="wrap_content"
|
||||
android:id="@+id/trust_all_networks_checkBox"/>
|
||||
|
||||
<TextView
|
||||
android:id="@+id/trusted_network_list_empty"
|
||||
android:layout_width="fill_parent"
|
||||
android:layout_height="100dp"
|
||||
android:text="@string/empty_trusted_networks_list_text"
|
||||
android:gravity="center" />
|
||||
|
||||
<ListView
|
||||
android:id="@android:id/list"
|
||||
android:layout_width="fill_parent"
|
||||
android:layout_height="0dp"
|
||||
android:layout_weight="1"/>
|
||||
|
||||
|
||||
<Button
|
||||
android:id="@android:id/button1"
|
||||
android:layout_width="fill_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:visibility="gone" />
|
||||
|
||||
</LinearLayout>
|
@@ -14,4 +14,10 @@
|
||||
android:title="@string/custom_device_list"
|
||||
kdeconnect:showAsAction="never" />
|
||||
|
||||
<item
|
||||
android:id="@+id/menu_trusted_networks"
|
||||
android:orderInCategory="900"
|
||||
android:title="@string/trusted_networks"
|
||||
kdeconnect:showAsAction="never" />
|
||||
|
||||
</menu>
|
||||
|
@@ -123,7 +123,6 @@
|
||||
<string name="findmyphone_title">جِد جهازي</string>
|
||||
<string name="findmyphone_title_tablet">جِد جهازي اللوحيّ</string>
|
||||
<string name="findmyphone_description">يرّن هذا الجهاز لتجده</string>
|
||||
<string name="findmyphone_found">وُجد</string>
|
||||
<string name="open">افتح</string>
|
||||
<string name="close">أغلق</string>
|
||||
</resources>
|
||||
|
@@ -1,7 +1,7 @@
|
||||
<?xml version='1.0' encoding='utf-8'?>
|
||||
<resources>
|
||||
<string name="kde_connect">KDE Connect</string>
|
||||
<string name="foreground_notification_no_devices">Nun se coneutó con dengún preséu</string>
|
||||
<string name="foreground_notification_no_devices">Nun se coneutó con nengún preséu</string>
|
||||
<string name="foreground_notification_devices">Coneutóse con %s</string>
|
||||
<string name="pref_plugin_telephony">Avisador telefónicu</string>
|
||||
<string name="pref_plugin_telephony_desc">Unvia avisos de les llamaes entrantes</string>
|
||||
@@ -19,6 +19,7 @@
|
||||
<string name="pref_plugin_runcommand_desc">Aiciona comandos remotos dende\'l preséu</string>
|
||||
<string name="pref_plugin_contacts">Sincronizador de contautos</string>
|
||||
<string name="pref_plugin_contacts_desc">Permite la sincronización de la llista telefónica del teléfonu</string>
|
||||
<string name="pref_plugin_ping">Ping</string>
|
||||
<string name="pref_plugin_ping_desc">Unviu y receición de pings</string>
|
||||
<string name="pref_plugin_notifications">Sincronización d\'avisos</string>
|
||||
<string name="pref_plugin_notifications_desc">Accede a los avisos n\'otros preseos</string>
|
||||
@@ -33,7 +34,7 @@
|
||||
<string name="no_permissions_remotekeyboard">Pa recibir calcos de tecles precises activar el tecláu remotu de KDE Connect</string>
|
||||
<string name="send_ping">Unviar un ping</string>
|
||||
<string name="open_mpris_controls">Mandu multimedia</string>
|
||||
<string name="remotekeyboard_editing_only_title">Remanar les tecles remotes namái al editar</string>
|
||||
<string name="remotekeyboard_editing_only_title">Remanar les tecles remotes namás al editar</string>
|
||||
<string name="open_mousepad">Entrada remota</string>
|
||||
<string name="mousepad_info">Movi un deu pela pantalla pa mover el mur. Con un toque faes un clic esquierdu y teniendo primío faes l\'aición d\'arrastrar y soltar, col toque de dos deos simules un clic drechu y col toque de tres simules un clic col botón d\'en mediu del mur. Esliza dos deos pela pantalla pa desplazate.</string>
|
||||
<string name="mousepad_double_tap_settings_title">Aición al tocar con dos deos</string>
|
||||
@@ -108,6 +109,7 @@
|
||||
</plurals>
|
||||
<string name="received_file_text">Toca p\'abrir «%1s»</string>
|
||||
<string name="cannot_create_file">Nun pue crease\'l ficheru %s</string>
|
||||
<string name="tap_to_answer">Toca pa responder</string>
|
||||
<string name="right_click">Unviar un clic drechu</string>
|
||||
<string name="middle_click">Unviar un clic d\'en mediu</string>
|
||||
<string name="show_keyboard">Amosar el tecláu</string>
|
||||
@@ -127,7 +129,7 @@
|
||||
<item>2 minutos</item>
|
||||
</string-array>
|
||||
<string name="mpris_notification_settings_summary">Permite\'l control de reproductores multimedia ensin abrir KDE Connect</string>
|
||||
<string name="share_to">Compartir con...</string>
|
||||
<string name="share_to">Compartir con…</string>
|
||||
<string name="protocol_version_newer">Esti preséu una versión nueva del protocolu</string>
|
||||
<string name="plugin_settings_with_name">%s</string>
|
||||
<string name="custom_devices_settings">Llista de preseos personalizada</string>
|
||||
@@ -136,7 +138,7 @@
|
||||
<string name="custom_device_list_help">Si\'l preséu nun se deteuta automáticamente, pues amestar la so direición IP o nome d\'agospiu calcando nel botón flotante d\'aición</string>
|
||||
<string name="undo">Desfacer</string>
|
||||
<string name="share_notification_preference">Avisos sonoros</string>
|
||||
<string name="share_notification_preference_summary">Vibra y reproduz un soníu al recibir un ficheru</string>
|
||||
<string name="share_notification_preference_summary">Fai que\'l teléfonu vibre y reproduza un soníu al recibir un ficheru</string>
|
||||
<string name="share_destination_customize">Personalizar el direutoriu de destín</string>
|
||||
<string name="share_destination_customize_summary_disabled">Los ficheros recibíos van apaecer en Descargues</string>
|
||||
<string name="share_destination_customize_summary_enabled">Los ficheros van atroxase nel direutoriu d\'embaxo</string>
|
||||
@@ -144,6 +146,7 @@
|
||||
<string name="title_activity_notification_filter">Peñera d\'avisos</string>
|
||||
<string name="filter_apps_info">Van sincronizase los avisos de les aplicaciones esbillaes.</string>
|
||||
<string name="sftp_sdcard">Tarxeta SD</string>
|
||||
<string name="sftp_readonly">(namás llectura)</string>
|
||||
<string name="add_device_dialog_title">Amiestu d\'un preséu</string>
|
||||
<string name="add_device_hint">Nome d\'agospiu o direición IP</string>
|
||||
<string name="sftp_preference_configured_storage_locations">Allugamientos d\'almacenamientu configuraos</string>
|
||||
@@ -155,6 +158,7 @@
|
||||
<string name="sftp_storage_preference_display_name">Nome</string>
|
||||
<string name="sftp_storage_preference_display_name_already_used">Esti nome yá ta usándose</string>
|
||||
<string name="sftp_storage_preference_display_name_cannot_be_empty">El nome nun pue tar baleru</string>
|
||||
<string name="sftp_action_mode_menu_delete">Desaniciar</string>
|
||||
<string name="sftp_no_storage_locations_configured">Nun se configuraron allugamientos d\'almacenamientu</string>
|
||||
<string name="sftp_saf_permission_explanation">P\'acceder remotamente a los ficheros tienes de configurar allugamientos d\'almacenamientu</string>
|
||||
<string name="no_players_connected">Nun s\'alcontraron reproductores</string>
|
||||
@@ -164,8 +168,10 @@
|
||||
<string name="device_rename_title">Renomáu del preséu</string>
|
||||
<string name="device_rename_confirm">Renomar</string>
|
||||
<string name="refresh">Refrescar</string>
|
||||
<string name="no_wifi">Nun tas coneutáu a una rede Wi-Fi polo que nun vas ser a ver dengún preséu. Calca equí p\'activar el Wi-Fi.</string>
|
||||
<string name="no_file_browser">Nun hai dengún restolador de ficheros instaláu.</string>
|
||||
<string name="unreachable_description">Esti preséu empareyáu nun ye algamable. Asegúrate de que ta coneutáu a la mesma rede que tu.</string>
|
||||
<string name="no_wifi">Nun tas coneutáu a una rede Wi-Fi polo que nun vas ser a ver nengún preséu. Calca equí p\'activar el Wi-Fi.</string>
|
||||
<string name="on_non_trusted_message">Nun tas nuna rede d\'enfotu. Desactivóse la descubrición automática.</string>
|
||||
<string name="no_file_browser">Nun hai nengún restolador de ficheros instaláu.</string>
|
||||
<string name="pref_plugin_telepathy">Unviu de SMS</string>
|
||||
<string name="pref_plugin_telepathy_desc">Unvia SMS dende l\'ordenador</string>
|
||||
<string name="findmyphone_description">Fai qu\'esti preséu suene pa que pueas alcontralu</string>
|
||||
@@ -181,10 +187,13 @@
|
||||
<string name="addcommand_explanation">Nun hai comandos rexistraos.</string>
|
||||
<string name="addcommand_explanation2">Pues amestar más nos axustes de KDE Connect del ordenador</string>
|
||||
<string name="add_command_description">Pues amestar más comandos nel ordenador</string>
|
||||
<string name="pref_plugin_mprisreceiver">Mandu pa reproductores multimedia</string>
|
||||
<string name="pref_plugin_mprisreceiver_desc">Controla los reproductores multimedia d\'esti preséu dende otru</string>
|
||||
<string name="notification_channel_default">Otros avisos</string>
|
||||
<string name="notification_channel_persistent">Indicador permanente</string>
|
||||
<string name="notification_channel_media_control">Mandu multimedia</string>
|
||||
<string name="notification_channel_filetransfer">Tresferencia de ficheros</string>
|
||||
<string name="copy_url_to_clipboard">Copiar la URL al cartafueyu</string>
|
||||
<string name="clipboard_toast">Copióse al cartafueyu</string>
|
||||
<string name="runcommand_noruncommandplugin">Esti preséu nun tien activáu\'l plugin Execución de comandos</string>
|
||||
<string name="pref_plugin_findremotedevice_desc">Fai que\'l preséu remotu suene</string>
|
||||
@@ -205,7 +214,15 @@
|
||||
<string name="block_contents">Bloquiar el conteníu de los avisos</string>
|
||||
<string name="block_images">Bloquiar les imáxenes de los avisos</string>
|
||||
<string name="notification_channel_receivenotification">Avisos d\'otros preseos</string>
|
||||
<string name="plugin_photo_desc">Llanza l\'aplicación de la cámarra p\'acenciellar la fechura y tresferencia de semeyes</string>
|
||||
<string name="no_app_for_opening">Nun alcontró denguna aplicación afayadiza p\'abrir esti ficheru.</string>
|
||||
<string name="take_picture">Llanzamientu de la cámara</string>
|
||||
<string name="plugin_photo_desc">Llanza l\'aplicación de la cámara p\'acenciellar la fechura y tresferencia de semeyes</string>
|
||||
<string name="no_app_for_opening">Nun alcontró nenguna aplicación afayadiza p\'abrir esti ficheru.</string>
|
||||
<string name="remote_keyboard_service">Tecláu remotu de KDE Connect</string>
|
||||
<string name="trusted_networks">Redes d\'enfotu</string>
|
||||
<string name="trusted_networks_desc">Torga la descubrición automática en redes conocíes</string>
|
||||
<string name="empty_trusted_networks_list_text">Entá nun amestesti nenguna rede d\'enfotu</string>
|
||||
<string name="allow_all_networks_text">Permitir toes</string>
|
||||
<string name="location_permission_needed_title">Ríquese un permisu</string>
|
||||
<string name="location_permission_needed_desc">Android rique\'l permisu Allugamientu pa indentificar redes Wi-Fi</string>
|
||||
<string name="clipboard_android_x_incompat">Android 10 quitó l\'accesu al cartafueyu en toles aplicaciones. Esti plugin va desactivase.</string>
|
||||
</resources>
|
||||
|
@@ -30,9 +30,10 @@
|
||||
<string name="pref_plugin_receive_notifications">Rep les notificacions</string>
|
||||
<string name="pref_plugin_receive_notifications_desc">Rep notificacions des d\'altres dispositius i mostrar-los a l\'Android</string>
|
||||
<string name="pref_plugin_sharereceiver">Comparteix i rep</string>
|
||||
<string name="pref_plugin_sharereceiver_desc">Comparteix els fitxers i els URL entre els dispositius</string>
|
||||
<string name="pref_plugin_sharereceiver_desc">Comparteix els fitxers i URL entre els dispositius</string>
|
||||
<string name="device_list_empty">No hi ha cap dispositiu</string>
|
||||
<string name="ok">D\'acord</string>
|
||||
<string name="sad_ok">D\'acord :(</string>
|
||||
<string name="cancel">Cancel·la</string>
|
||||
<string name="open_settings">Obre l\'arranjament</string>
|
||||
<string name="no_permissions">Us caldrà concedir permís per accedir a les notificacions</string>
|
||||
@@ -122,7 +123,8 @@
|
||||
<item quantity="one">Ha fallat en enviar el fitxer a %1$s</item>
|
||||
<item quantity="other">Ha fallat en enviar %2$d de %3$d fitxers a %1$s</item>
|
||||
</plurals>
|
||||
<string name="received_file_text">Puntegeu per obrir «%1s»</string>
|
||||
<string name="tap_to_open">Toqueu per obrir</string>
|
||||
<string name="received_file_text">Toqueu per obrir «%1s»</string>
|
||||
<string name="cannot_create_file">No s\'ha pogut crear el fitxer %s</string>
|
||||
<string name="tap_to_answer">Puntegeu per a respondre</string>
|
||||
<string name="right_click">Envia un clic del botó dret</string>
|
||||
@@ -197,7 +199,7 @@
|
||||
<string name="sftp_no_storage_locations_configured">No s\'ha configurat cap ubicació d\'emmagatzematge</string>
|
||||
<string name="sftp_saf_permission_explanation">Per accedir remotament als fitxer cal configurar les ubicacions d\'emmagatzematge</string>
|
||||
<string name="no_players_connected">No s\'ha trobat cap reproductor</string>
|
||||
<string name="send_files">Envia els fitxers</string>
|
||||
<string name="send_files">Envia fitxers</string>
|
||||
<string name="pairing_title">Dispositius del KDE Connect</string>
|
||||
<string name="pairing_description">Els altres dispositius que executin el KDE Connect a la mateixa xarxa han d\'aparèixer aquí.</string>
|
||||
<string name="device_rename_title">Reanomena el dispositiu</string>
|
||||
@@ -205,6 +207,7 @@
|
||||
<string name="refresh">Refresca</string>
|
||||
<string name="unreachable_description">Aquest dispositiu aparellat no és accessible. Assegureu-vos que està connectat a la mateixa xarxa.</string>
|
||||
<string name="no_wifi">No esteu connectat a una xarxa Wi-Fi, per tant, no podreu veure cap dispositiu. Feu clic aquí per activar la Wi-Fi.</string>
|
||||
<string name="on_non_trusted_message">No és una xarxa de confiança: el descobriment automàtic està desactivat.</string>
|
||||
<string name="no_file_browser">No hi ha instal·lat cap explorador de fitxers.</string>
|
||||
<string name="pref_plugin_telepathy">Envia un SMS</string>
|
||||
<string name="pref_plugin_telepathy_desc">Envia missatges de text des de l\'escriptori</string>
|
||||
@@ -212,7 +215,7 @@
|
||||
<string name="findmyphone_title_tablet">Troba la meva tauleta</string>
|
||||
<string name="findmyphone_title_tv">Troba la meva TV</string>
|
||||
<string name="findmyphone_description">Fa sonar aquest dispositiu perquè el pugueu trobar</string>
|
||||
<string name="findmyphone_found">L\'he trobat</string>
|
||||
<string name="findmyphone_found">S\'ha trobat</string>
|
||||
<string name="open">Obre</string>
|
||||
<string name="close">Tanca</string>
|
||||
<string name="plugins_need_permission">Alguns connectors necessiten permisos per a funcionar (puntegeu per a més informació):</string>
|
||||
@@ -243,6 +246,7 @@
|
||||
<string name="notification_channel_persistent">Indicador de persistent</string>
|
||||
<string name="notification_channel_media_control">Control multimèdia</string>
|
||||
<string name="notification_channel_filetransfer">Transferència de fitxers</string>
|
||||
<string name="notification_channel_high_priority">Prioritat alta</string>
|
||||
<string name="mpris_stop">Atura el reproductor actual</string>
|
||||
<string name="copy_url_to_clipboard">Copia l\'URL al porta-retalls</string>
|
||||
<string name="clipboard_toast">Copiat al porta-retalls</string>
|
||||
@@ -276,4 +280,22 @@
|
||||
<string name="no_app_for_opening">No s\'ha trobat cap aplicació adequada per obrir aquest fitxer</string>
|
||||
<string name="remote_keyboard_service">Teclat remot del KDE Connect</string>
|
||||
<string name="presenter_pointer">Apuntador</string>
|
||||
<string name="trusted_networks">Xarxes de confiança</string>
|
||||
<string name="trusted_networks_desc">Restringeix el descobriment automàtic a les xarxes conegudes</string>
|
||||
<string name="add_trusted_network">Afegeix %1s</string>
|
||||
<string name="empty_trusted_networks_list_text">Encara no heu afegit cap xarxa de confiança</string>
|
||||
<string name="allow_all_networks_text">Permet totes</string>
|
||||
<string name="location_permission_needed_title">Es requereix permís</string>
|
||||
<string name="location_permission_needed_desc">L\'Android requereix el permís d\'ubicació per identificar la xarxa WiFi</string>
|
||||
<string name="clipboard_android_x_incompat">L\'Android 10 ha tret l\'accés al porta-retalls a totes les aplicacions. Aquest connector estarà inhabilitat.</string>
|
||||
<string name="mpris_open_url">Continua reproduint aquí</string>
|
||||
<string name="cant_open_url">No s\'ha pogut obrir l\'URL per a continuar reproduint</string>
|
||||
<string name="bigscreen_home">Inici</string>
|
||||
<string name="bigscreen_up">Dalt</string>
|
||||
<string name="bigscreen_left">Esquerra</string>
|
||||
<string name="bigscreen_select">Selecció</string>
|
||||
<string name="bigscreen_right">Dreta</string>
|
||||
<string name="bigscreen_down">Baix</string>
|
||||
<string name="pref_plugin_bigscreen">Pantalla gran remota</string>
|
||||
<string name="pref_plugin_bigscreen_desc">Useu el dispositiu com a remot per a la Pantalla gran del Plasma</string>
|
||||
</resources>
|
||||
|
@@ -27,16 +27,17 @@
|
||||
<string name="pref_plugin_ping_desc">Posílat a přijímat ping</string>
|
||||
<string name="pref_plugin_notifications">Synchronizace upozornění</string>
|
||||
<string name="pref_plugin_notifications_desc">Zpřístupněte si upozornění z jiných zařízení</string>
|
||||
<string name="pref_plugin_receive_notifications">Přijímat oznámení</string>
|
||||
<string name="pref_plugin_receive_notifications_desc">Přijímat oznámení z jiného zařízení a zobrazovat je v Androidu</string>
|
||||
<string name="pref_plugin_receive_notifications">Přijímat upozornění</string>
|
||||
<string name="pref_plugin_receive_notifications_desc">Přijímat upozornění z jiného zařízení a zobrazovat je v Androidu</string>
|
||||
<string name="pref_plugin_sharereceiver">Sdílet a přijmout</string>
|
||||
<string name="pref_plugin_sharereceiver_desc">Sdílet soubory a odkazy mezi zařízeními</string>
|
||||
<string name="device_list_empty">Žádná zařízení</string>
|
||||
<string name="ok">OK</string>
|
||||
<string name="sad_ok">OK :(</string>
|
||||
<string name="cancel">Zrušit</string>
|
||||
<string name="open_settings">Otevřít nastavení</string>
|
||||
<string name="no_permissions">Pro zpřístupnění upozornění potřebujete oprávnění</string>
|
||||
<string name="no_permission_mprisreceiver">Abyste byli schopni ovládat vaše přehrávače médií, musíte udělit přístup k oznámením</string>
|
||||
<string name="no_permission_mprisreceiver">Abyste byli schopni ovládat vaše přehrávače médií, musíte udělit přístup k upozorněním</string>
|
||||
<string name="no_permissions_remotekeyboard">Pro zachytávání stisků kláves je potřeba aktivovat vzdálenou klávesnici KDE Connect</string>
|
||||
<string name="send_ping">Poslat ping</string>
|
||||
<string name="open_mpris_controls">Ovládání multimédií</string>
|
||||
@@ -221,6 +222,7 @@
|
||||
<string name="refresh">Obnovit</string>
|
||||
<string name="unreachable_description">Toto spárované zařízení je nedosažitelné. Ujistěte se, že běží ve stejné síti.</string>
|
||||
<string name="no_wifi">Nejste připojeni k síti WiFi, takže nemůžete vidět žádná zařízení. Pro zapnutí WiFi klikněte zde.</string>
|
||||
<string name="on_non_trusted_message">Síť není důvěryhodná. Automatické hledání bylo vypnuto.</string>
|
||||
<string name="no_file_browser">Není nainstalován žádný prohlížeč souborů.</string>
|
||||
<string name="pref_plugin_telepathy">Poslat SMS</string>
|
||||
<string name="pref_plugin_telepathy_desc">Posílejte zprávy ze své pracovní plochy</string>
|
||||
@@ -254,10 +256,12 @@
|
||||
<string name="addcommand_explanation2">Nové příkazy můžete přidat v nastavení systému KDE Connect</string>
|
||||
<string name="add_command_description">V pracovním prostředí můžete přidat příkazy</string>
|
||||
<string name="pref_plugin_mprisreceiver">Ovládání přehrávače médií</string>
|
||||
<string name="notification_channel_default">Ostatní oznámení</string>
|
||||
<string name="pref_plugin_mprisreceiver_desc">Ovládejte přehrávače médií na vašem telefonu z jiného zařízení</string>
|
||||
<string name="notification_channel_default">Ostatní upozornění</string>
|
||||
<string name="notification_channel_persistent">Stálý ukazatel</string>
|
||||
<string name="notification_channel_media_control">Ovládání médií</string>
|
||||
<string name="notification_channel_filetransfer">Přenos souboru</string>
|
||||
<string name="notification_channel_high_priority">Vysoká priorita</string>
|
||||
<string name="mpris_stop">Zastavit současný přehrávač</string>
|
||||
<string name="copy_url_to_clipboard">Kopírovat URL do schránky</string>
|
||||
<string name="clipboard_toast">Zkopírováno do schránky</string>
|
||||
@@ -283,12 +287,22 @@
|
||||
<string name="extra_options">Další možnosti</string>
|
||||
<string name="privacy_options">Možnosti soukromí</string>
|
||||
<string name="set_privacy_options">Nastavte své možnosti soukromí</string>
|
||||
<string name="block_contents">Blokovat obsah oznámení</string>
|
||||
<string name="block_contents">Blokovat obsah upozornění</string>
|
||||
<string name="block_images">Blokovat obrázky z upozornění</string>
|
||||
<string name="notification_channel_receivenotification">Oznamování z ostatních zařízení</string>
|
||||
<string name="notification_channel_receivenotification">Upozornění z ostatních zařízení</string>
|
||||
<string name="take_picture">Spustit fotoaparát</string>
|
||||
<string name="plugin_photo_desc">Spusťte aplikaci fotoaparátu pro snadné zachytávání s přenos obrázků</string>
|
||||
<string name="no_app_for_opening">Pro otevření tohoto souboru nebyla nalezena vhodná aplikace</string>
|
||||
<string name="remote_keyboard_service">Vzdálená klávesnice pro KDE Connect</string>
|
||||
<string name="presenter_pointer">Ukazatel</string>
|
||||
<string name="trusted_networks">Důvěryhodné sítě</string>
|
||||
<string name="trusted_networks_desc">Omezit automatické hledání na známé sítě</string>
|
||||
<string name="add_trusted_network">Přidat %1s</string>
|
||||
<string name="empty_trusted_networks_list_text">Nepřidali jste žádné důvěryhodné sítě</string>
|
||||
<string name="allow_all_networks_text">Povolit všechny</string>
|
||||
<string name="location_permission_needed_title">Získán přístup</string>
|
||||
<string name="location_permission_needed_desc">Pro identifikaci sítě WiFi Android vyžaduje oprávnění zjistit polohu</string>
|
||||
<string name="clipboard_android_x_incompat">Android 10 odstranit přístup ke schránce pro všechny aplikace. Tento modul bude zakázán.</string>
|
||||
<string name="mpris_open_url">Pokračovat v přehrávání zde</string>
|
||||
<string name="cant_open_url">Nelze otevřít URL pro pokračování v přehrávání</string>
|
||||
</resources>
|
||||
|
@@ -133,7 +133,6 @@
|
||||
<string name="findmyphone_title">Find min telefon</string>
|
||||
<string name="findmyphone_title_tablet">Find min tablet</string>
|
||||
<string name="findmyphone_description">Ringer til denne enhed, så du kan finde den.</string>
|
||||
<string name="findmyphone_found">Fundet</string>
|
||||
<string name="open">Åbn</string>
|
||||
<string name="close">Luk</string>
|
||||
<string name="plugins_need_permission">Nogle plugins kræver tilladelser for at virke (tap for mere info):</string>
|
||||
|
@@ -1,6 +1,6 @@
|
||||
<?xml version='1.0' encoding='utf-8'?>
|
||||
<resources>
|
||||
<string name="kde_connect">KDE-Connect</string>
|
||||
<string name="kde_connect">KDE Connect</string>
|
||||
<string name="foreground_notification_no_devices">Keine bestehenden Verbindungen</string>
|
||||
<string name="foreground_notification_devices">Verbunden mit %s</string>
|
||||
<string name="pref_plugin_telephony">Telefon-Integration</string>
|
||||
@@ -85,7 +85,7 @@
|
||||
<string name="error_canceled_by_user">Abbruch durch Benutzer</string>
|
||||
<string name="error_canceled_by_other_peer">Abbruch durch Gegenstelle</string>
|
||||
<string name="encryption_info_title">Verschlüsselungsinformationen</string>
|
||||
<string name="encryption_info_msg_no_ssl">Das andere Gerät verwendet eine ältere Version von KDE-Connect. Daher muss eine veraltete Verschlüsselungsmethode verwendet werden</string>
|
||||
<string name="encryption_info_msg_no_ssl">Das andere Gerät verwendet eine ältere Version von KDE Connect. Daher muss eine veraltete Verschlüsselungsmethode verwendet werden</string>
|
||||
<string name="my_device_fingerprint">Der SHA1-Fingerabdruck Ihres Gerätezertifikats lautet:</string>
|
||||
<string name="remote_device_fingerprint">Der SHA1-Fingerabdruck des Gerätezertifikats der Gegenstelle lautet:</string>
|
||||
<string name="pair_requested">Verbindung angefordert</string>
|
||||
@@ -150,7 +150,7 @@
|
||||
<item>2 Minuten</item>
|
||||
</string-array>
|
||||
<string name="mpris_notification_settings_title">Benachrichtigung zur Medienkontrolle anzeigen</string>
|
||||
<string name="mpris_notification_settings_summary">Die Steuerung der Medienwiedergabe auch dann erlauben wenn KDE-Connect nicht geöffnet ist</string>
|
||||
<string name="mpris_notification_settings_summary">Die Steuerung der Medienwiedergabe auch dann erlauben wenn KDE Connect nicht geöffnet ist</string>
|
||||
<string name="share_to">Freigeben für ...</string>
|
||||
<string name="protocol_version_newer">Dieses Gerät verwendet eine neuere Protokollversion</string>
|
||||
<string name="plugin_settings_with_name">%s-Einstellungen</string>
|
||||
@@ -199,7 +199,7 @@
|
||||
<string name="no_players_connected">Keine Medienspieler gefunden</string>
|
||||
<string name="send_files">Dateien senden</string>
|
||||
<string name="pairing_title">KDE-Connect-Geräte</string>
|
||||
<string name="pairing_description">Andere Geräte im selben Netzwerk, auf denen KDE-Connect läuft, sollten hier angezeigt werden</string>
|
||||
<string name="pairing_description">Andere Geräte im selben Netzwerk, auf denen KDE Connect läuft, sollten hier angezeigt werden</string>
|
||||
<string name="device_rename_title">Geräte umbenennen</string>
|
||||
<string name="device_rename_confirm">Umbenennen</string>
|
||||
<string name="refresh">Aktualisieren</string>
|
||||
@@ -235,13 +235,15 @@
|
||||
<string name="presenter_lock_tip">Sie können Ihr Gerät sperren und mit Hilfe der Lauter-/Leiser-Taste zur vorherigen/nächsten Folie wechseln</string>
|
||||
<string name="add_command">Einen Befehl hinzufügen</string>
|
||||
<string name="addcommand_explanation">Es sind keine Befehle vorhanden</string>
|
||||
<string name="addcommand_explanation2">Sie können neue Befehle in den Systemeinstellungen für KDE-Connect hinzufügen</string>
|
||||
<string name="addcommand_explanation2">Sie können neue Befehle in den Systemeinstellungen für KDE Connect hinzufügen</string>
|
||||
<string name="add_command_description">Sie können neue Befehle auf der Arbeitsfläche hinzufügen</string>
|
||||
<string name="pref_plugin_mprisreceiver">Steuerung der Medienwiedergabe</string>
|
||||
<string name="pref_plugin_mprisreceiver_desc">Ein verbundenes Gerät zum Steuern der lokalen Medienwiedergabe verwenden</string>
|
||||
<string name="notification_channel_default">Andere Benachrichtigungen</string>
|
||||
<string name="notification_channel_persistent">Dauerhafte Benachrichtigung</string>
|
||||
<string name="notification_channel_media_control">Medienkontrolle</string>
|
||||
<string name="notification_channel_filetransfer">Dateiübertragung</string>
|
||||
<string name="notification_channel_high_priority">Hohe Priorität</string>
|
||||
<string name="mpris_stop">Die aktuelle Medienwiedergabe beenden</string>
|
||||
<string name="copy_url_to_clipboard">Adresse in die Zwischenablage kopieren</string>
|
||||
<string name="clipboard_toast">In die Zwischenablage kopiert</string>
|
||||
@@ -273,6 +275,9 @@
|
||||
<string name="take_picture">Kamera starten</string>
|
||||
<string name="plugin_photo_desc">Die Kamera starten um das Erstellen und Übertragen von Bildern zu vereinfachen</string>
|
||||
<string name="no_app_for_opening">Es wurde keine passende App zum Öffnen dieser Datei gefunden</string>
|
||||
<string name="remote_keyboard_service">Entfernte Tastatur für KDE-Connect</string>
|
||||
<string name="remote_keyboard_service">Entfernte Tastatur für KDE Connect</string>
|
||||
<string name="presenter_pointer">Laserpointer</string>
|
||||
<string name="trusted_networks">Vertrauenswürdiges Netzwerk</string>
|
||||
<string name="add_trusted_network">%1s hinzufügen</string>
|
||||
<string name="location_permission_needed_title">Berechtigung erforderlich</string>
|
||||
</resources>
|
||||
|
@@ -133,7 +133,6 @@
|
||||
<string name="findmyphone_title">Αναζήτηση του κινητού μου</string>
|
||||
<string name="findmyphone_title_tablet">Εύρεση της ταμπλέτας μου</string>
|
||||
<string name="findmyphone_description">Καλεί αυτή τη συσκευή ώστε να την εντοπίσετε</string>
|
||||
<string name="findmyphone_found">Βρέθηκε</string>
|
||||
<string name="open">Άνοιγμα</string>
|
||||
<string name="close">Κλείσιμο</string>
|
||||
<string name="plugins_need_permission">Κάποια πρόσθετα απαιτούν δικαιώματα για να λειτουργήσουν (χτυπήστε για περισσότερες πληροφορίες):</string>
|
||||
|
@@ -33,6 +33,7 @@
|
||||
<string name="pref_plugin_sharereceiver_desc">Share files and URLs between devices</string>
|
||||
<string name="device_list_empty">No devices</string>
|
||||
<string name="ok">OK</string>
|
||||
<string name="sad_ok">OK :(</string>
|
||||
<string name="cancel">Cancel</string>
|
||||
<string name="open_settings">Open settings</string>
|
||||
<string name="no_permissions">You need to grant permission to access notifications</string>
|
||||
@@ -205,6 +206,7 @@
|
||||
<string name="refresh">Refresh</string>
|
||||
<string name="unreachable_description">This paired device is not reachable. Make sure it is connected to your same network.</string>
|
||||
<string name="no_wifi">You\'re not connected to a Wi-Fi network, so you may not be able to see any devices. Click here to enable Wi-Fi.</string>
|
||||
<string name="on_non_trusted_message">Not on a trusted network: autodiscovery is disabled.</string>
|
||||
<string name="no_file_browser">There are no file browsers installed.</string>
|
||||
<string name="pref_plugin_telepathy">Send SMS</string>
|
||||
<string name="pref_plugin_telepathy_desc">Send text messages from your desktop</string>
|
||||
@@ -212,7 +214,7 @@
|
||||
<string name="findmyphone_title_tablet">Find my tablet</string>
|
||||
<string name="findmyphone_title_tv">Find my TV</string>
|
||||
<string name="findmyphone_description">Rings this device so you can find it</string>
|
||||
<string name="findmyphone_found">Found</string>
|
||||
<string name="findmyphone_found">Found it</string>
|
||||
<string name="open">Open</string>
|
||||
<string name="close">Close</string>
|
||||
<string name="plugins_need_permission">Some Plugins need permissions to work (tap for more info):</string>
|
||||
@@ -238,10 +240,12 @@
|
||||
<string name="addcommand_explanation2">You can add new commands in the KDE Connect System Settings</string>
|
||||
<string name="add_command_description">You can add commands on the desktop</string>
|
||||
<string name="pref_plugin_mprisreceiver">Media Player Control</string>
|
||||
<string name="pref_plugin_mprisreceiver_desc">Control your phone\'s media players from another device</string>
|
||||
<string name="notification_channel_default">Other notifications</string>
|
||||
<string name="notification_channel_persistent">Persistent indicator</string>
|
||||
<string name="notification_channel_media_control">Media control</string>
|
||||
<string name="notification_channel_filetransfer">File transfer</string>
|
||||
<string name="notification_channel_high_priority">High priority</string>
|
||||
<string name="mpris_stop">Stop the current player</string>
|
||||
<string name="copy_url_to_clipboard">Copy URL to clipboard</string>
|
||||
<string name="clipboard_toast">Copied to clipboard</string>
|
||||
@@ -275,4 +279,22 @@
|
||||
<string name="no_app_for_opening">No suitable app found to open this file</string>
|
||||
<string name="remote_keyboard_service">KDE Connect Remote Keyboard</string>
|
||||
<string name="presenter_pointer">Pointer</string>
|
||||
<string name="trusted_networks">Trusted networks</string>
|
||||
<string name="trusted_networks_desc">Restrict autodiscovery to known networks</string>
|
||||
<string name="add_trusted_network">Add %1s</string>
|
||||
<string name="empty_trusted_networks_list_text">You have not added any trusted network yet</string>
|
||||
<string name="allow_all_networks_text">Allow all</string>
|
||||
<string name="location_permission_needed_title">Permission required</string>
|
||||
<string name="location_permission_needed_desc">Android requires the Location permission to identify your WiFi network</string>
|
||||
<string name="clipboard_android_x_incompat">Android 10 has removed clipboard access to all apps. This plugin will be disabled.</string>
|
||||
<string name="mpris_open_url">Continue playing here</string>
|
||||
<string name="cant_open_url">Cannot open URL to continue playing</string>
|
||||
<string name="bigscreen_home">Home</string>
|
||||
<string name="bigscreen_up">Up</string>
|
||||
<string name="bigscreen_left">Left</string>
|
||||
<string name="bigscreen_select">Select</string>
|
||||
<string name="bigscreen_right">Right</string>
|
||||
<string name="bigscreen_down">Down</string>
|
||||
<string name="pref_plugin_bigscreen">Bigscreen remote</string>
|
||||
<string name="pref_plugin_bigscreen_desc">Use your device as a remote for Plasma Bigscreen</string>
|
||||
</resources>
|
||||
|
@@ -33,6 +33,7 @@
|
||||
<string name="pref_plugin_sharereceiver_desc">Compartir archivos y URL entre dispositivos</string>
|
||||
<string name="device_list_empty">Ningún dispositivo</string>
|
||||
<string name="ok">Aceptar</string>
|
||||
<string name="sad_ok">OK :(</string>
|
||||
<string name="cancel">Cancelar</string>
|
||||
<string name="open_settings">Abrir preferencias</string>
|
||||
<string name="no_permissions">Debe otorgar permisos para acceder a las notificaciones</string>
|
||||
@@ -205,6 +206,7 @@
|
||||
<string name="refresh">Actualizar</string>
|
||||
<string name="unreachable_description">Este dispositivo vinculado no está disponible. Asegúrese que está conectado a su misma red.</string>
|
||||
<string name="no_wifi">No está conectado a una red Wi-Fi, por lo que puede que no vea ningún dispositivo. Pulse aquí para activar el Wi-Fi.</string>
|
||||
<string name="on_non_trusted_message">No se encuentra en una red confiable: el auto-descubrimiento está desactivado.</string>
|
||||
<string name="no_file_browser">No hay navegadores de archivos instalados.</string>
|
||||
<string name="pref_plugin_telepathy">Enviar SMS</string>
|
||||
<string name="pref_plugin_telepathy_desc">Enviar mensajes de texto desde su escritorio</string>
|
||||
@@ -238,10 +240,12 @@
|
||||
<string name="addcommand_explanation2">Puede añadir nuevas órdenes en las preferencias del sistema de KDE Connect</string>
|
||||
<string name="add_command_description">Puede añadir órdenes en su escritorio</string>
|
||||
<string name="pref_plugin_mprisreceiver">Control del reproductor de medios</string>
|
||||
<string name="pref_plugin_mprisreceiver_desc">Controle los reproductores de medios de su teléfono desde otro dispositivo</string>
|
||||
<string name="notification_channel_default">Otras notificaciones</string>
|
||||
<string name="notification_channel_persistent">Indicador persistente</string>
|
||||
<string name="notification_channel_media_control">Control multimedia</string>
|
||||
<string name="notification_channel_filetransfer">Transferencia de archivo</string>
|
||||
<string name="notification_channel_high_priority">Alta prioridad</string>
|
||||
<string name="mpris_stop">Parar el reproductor actual</string>
|
||||
<string name="copy_url_to_clipboard">Copiar URL al portapapeles</string>
|
||||
<string name="clipboard_toast">Copiado en el portapapeles</string>
|
||||
@@ -275,4 +279,22 @@
|
||||
<string name="no_app_for_opening">No se encontró ninguna aplicación adecuada para abrir este archivo</string>
|
||||
<string name="remote_keyboard_service">Teclado remoto de KDE Connect</string>
|
||||
<string name="presenter_pointer">Puntero</string>
|
||||
<string name="trusted_networks">Redes confiables</string>
|
||||
<string name="trusted_networks_desc">Restringir el auto-descubrimiento para redes conocidas</string>
|
||||
<string name="add_trusted_network">Añadir %1s</string>
|
||||
<string name="empty_trusted_networks_list_text">No ha añadido ninguna red confiable de momento</string>
|
||||
<string name="allow_all_networks_text">Permitir todas</string>
|
||||
<string name="location_permission_needed_title">Permisos requeridos</string>
|
||||
<string name="location_permission_needed_desc">Android necesita el permiso de localización para identificar su red WiFi</string>
|
||||
<string name="clipboard_android_x_incompat">Android 10 ha eliminado el acceso al portapapeles para todas las aplicaciones. Este complemento se desactivará.</string>
|
||||
<string name="mpris_open_url">Continuar reproduciendo aquí</string>
|
||||
<string name="cant_open_url">No se pudo abrir la URL para continuar reproduciendo</string>
|
||||
<string name="bigscreen_home">Inicio</string>
|
||||
<string name="bigscreen_up">Arriba</string>
|
||||
<string name="bigscreen_left">Izquierda</string>
|
||||
<string name="bigscreen_select">Seleccionar</string>
|
||||
<string name="bigscreen_right">Derecha</string>
|
||||
<string name="bigscreen_down">Abajo</string>
|
||||
<string name="pref_plugin_bigscreen">Bigscreen remoto</string>
|
||||
<string name="pref_plugin_bigscreen_desc">Use su dispositivo como mando remoto para Plasma Bigscreen</string>
|
||||
</resources>
|
||||
|
@@ -1,6 +1,10 @@
|
||||
<?xml version='1.0' encoding='utf-8'?>
|
||||
<resources>
|
||||
<string name="kde_connect">KDE Connect</string>
|
||||
<string name="foreground_notification_no_devices">Pole ühendatud ühegi seadmega</string>
|
||||
<string name="foreground_notification_devices">Ühendatud seadmega: %s</string>
|
||||
<string name="pref_plugin_telephony">Telefoni märguanded</string>
|
||||
<string name="pref_plugin_telephony_desc">Sisenevate kõnede märguannete saatmine</string>
|
||||
<string name="pref_plugin_battery">Aku aruanne</string>
|
||||
<string name="pref_plugin_battery_desc">Perioodiline aku olekust teavitamine</string>
|
||||
<string name="pref_plugin_sftp">Failisüsteemi sirvimine</string>
|
||||
@@ -9,10 +13,16 @@
|
||||
<string name="pref_plugin_clipboard_desc">Lõikepuhvri sisu jagamine</string>
|
||||
<string name="pref_plugin_mousepad">Kaugsisestus</string>
|
||||
<string name="pref_plugin_mousepad_desc">Telefoni või tahvli kasutamine puuteplaadi ja klaviatuurina</string>
|
||||
<string name="pref_plugin_presenter">Kaugslaidiseanss</string>
|
||||
<string name="pref_plugin_presenter_desc">Seadme kasutamine esitluse slaidide vahetamiseks</string>
|
||||
<string name="pref_plugin_remotekeyboard">Kaugklahvivajutuste vastuvõtmine</string>
|
||||
<string name="pref_plugin_remotekeyboard_desc">Kaugseadmete klahvivajutuste vastuvõtmine</string>
|
||||
<string name="pref_plugin_mpris">Multimeedia juhtimine</string>
|
||||
<string name="pref_plugin_mpris_desc">Meediamängija kaugjuhtimise võimaldamine</string>
|
||||
<string name="pref_plugin_runcommand">Käsu käivitamine</string>
|
||||
<string name="pref_plugin_runcommand_desc">Telefonist või tahvlist kaugkäskude käivitamine</string>
|
||||
<string name="pref_plugin_contacts">Kontaktide sünkroonimine</string>
|
||||
<string name="pref_plugin_contacts_desc">Võimaldab sünkroonida seadme kontaktiloendit</string>
|
||||
<string name="pref_plugin_ping">Ping</string>
|
||||
<string name="pref_plugin_ping_desc">Pingide saatmine ja vastuvõtmine</string>
|
||||
<string name="pref_plugin_notifications">Märguannete sünkroonimine</string>
|
||||
@@ -23,15 +33,24 @@
|
||||
<string name="pref_plugin_sharereceiver_desc">Failide ja URL-ide jagamine seadmete vahel</string>
|
||||
<string name="device_list_empty">Seadmed puuduvad</string>
|
||||
<string name="ok">OK</string>
|
||||
<string name="sad_ok">OK :(</string>
|
||||
<string name="cancel">Loobu</string>
|
||||
<string name="open_settings">Ava seadistused</string>
|
||||
<string name="no_permissions">Märguannete nägemiseks tuleb anda vastavad õigused</string>
|
||||
<string name="no_permission_mprisreceiver">Meediamängija juhtimiseks tuleb lubada juurdepääs märguannetele</string>
|
||||
<string name="no_permissions_remotekeyboard">Klahvivajutuste vastuvõtmiseks tuleb aktiveerida KDE Connecti kaugklaviatuur</string>
|
||||
<string name="send_ping">Saada ping</string>
|
||||
<string name="open_mpris_controls">Multimeedia juhtimine</string>
|
||||
<string name="remotekeyboard_editing_only_title">Kaugklahvide käitlemine ainult redigeerimisel</string>
|
||||
<string name="remotekeyboard_not_connected">Aktiivne kaugklaviatuuri ühendus puudub, pane see paika KDE Connectis</string>
|
||||
<string name="remotekeyboard_connected">Kaugklaviatuuri ühendus on aktiivne</string>
|
||||
<string name="remotekeyboard_multiple_connections">Kaugklaviatuuri ühendusi on üle ühe, palun vali seade, mida seadistada</string>
|
||||
<string name="open_mousepad">Kaugsisestus</string>
|
||||
<string name="mousepad_info">Hiirekursori liigutamiseks liiguta sõrme ekraanil. Koputa klõpsamiseks ja kasuta kaht või kolme sõrme parema ja keskmise nupu jaoks. Kahe sõrmega saab kerida. Pika vajutusega saab lohistada.</string>
|
||||
<string name="mousepad_double_tap_settings_title">Kahe sõrmega koputamise toimingu määramine</string>
|
||||
<string name="mousepad_triple_tap_settings_title">Kolme sõrmega koputamise toimingu määramine</string>
|
||||
<string name="mousepad_sensitivity_settings_title">Puutepadja tundlikkuse määramine</string>
|
||||
<string name="mousepad_acceleration_profile_settings_title">Osutusseadme kiirenduse määramine</string>
|
||||
<string name="mousepad_scroll_direction_title">Vastupidi kerimise suund</string>
|
||||
<string-array name="mousepad_tap_entries">
|
||||
<item>Paremklõps</item>
|
||||
@@ -46,12 +65,12 @@
|
||||
<item>Kõige kiirem</item>
|
||||
</string-array>
|
||||
<string-array name="mousepad_acceleration_profile_entries">
|
||||
<item>No Acceleration</item>
|
||||
<item>Weakest</item>
|
||||
<item>Weaker</item>
|
||||
<item>Medium</item>
|
||||
<item>Stronger</item>
|
||||
<item>Strongest</item>
|
||||
<item>Kiirendus puudub</item>
|
||||
<item>Kõige nõrgem</item>
|
||||
<item>Nõrgem</item>
|
||||
<item>Keskmine</item>
|
||||
<item>Tugev</item>
|
||||
<item>Kõige tugevam</item>
|
||||
</string-array>
|
||||
<string name="category_connected_devices">Ühendatud seadmed</string>
|
||||
<string name="category_not_paired_devices">Saadaolevad seadmed</string>
|
||||
@@ -72,7 +91,41 @@
|
||||
<string name="remote_device_fingerprint">Kaugseadme sertifikaadi SHA1 sõrmejälg on:</string>
|
||||
<string name="pair_requested">Paardumise soov</string>
|
||||
<string name="pairing_request_from">Paardumise soov seadmest %1s</string>
|
||||
<plurals name="incoming_file_title">
|
||||
<item quantity="one">Saadi %1$d fail seadmest %2$s</item>
|
||||
<item quantity="other">Saadi %1$d faili seadmest %2$s</item>
|
||||
</plurals>
|
||||
<plurals name="incoming_files_text">
|
||||
<item quantity="one">File: %1s</item>
|
||||
<item quantity="other">(Fail %2$d / %3$d) : %1$s</item>
|
||||
</plurals>
|
||||
<plurals name="outgoing_file_title">
|
||||
<item quantity="one">Saadeti %1$d fail seadmesse %2$s</item>
|
||||
<item quantity="other">Saadeti %1$d faili seadmesse %2$s</item>
|
||||
</plurals>
|
||||
<plurals name="outgoing_files_text">
|
||||
<item quantity="one">Fail: %1$s</item>
|
||||
<item quantity="other">(Fail %2$d / %3$d) : %1$s</item>
|
||||
</plurals>
|
||||
<plurals name="received_files_title">
|
||||
<item quantity="one">Saadi fail %1$s</item>
|
||||
<item quantity="other">Saadi %2$d faili seadmest %1$s</item>
|
||||
</plurals>
|
||||
<plurals name="received_files_fail_title">
|
||||
<item quantity="one">Faili saamine seadmest %1$s nurjus</item>
|
||||
<item quantity="other">%2$d faili saamine %3$d failist seadmest %1$s nurjus</item>
|
||||
</plurals>
|
||||
<plurals name="sent_files_title">
|
||||
<item quantity="one">Fail saadeti seadmesse %1$s</item>
|
||||
<item quantity="other">%2$d faili saadeti seadmesse %1$s</item>
|
||||
</plurals>
|
||||
<plurals name="send_files_fail_title">
|
||||
<item quantity="one">Faili saatmine seadmesse %1$s nurjus</item>
|
||||
<item quantity="other">%2$d faili saamine %3$d failist seadmesse %1$s nurjus</item>
|
||||
</plurals>
|
||||
<string name="tap_to_open">Koputa avamiseks</string>
|
||||
<string name="received_file_text">Koputa \"%1s\" avamiseks</string>
|
||||
<string name="cannot_create_file">Faili %s loomine nurjus</string>
|
||||
<string name="tap_to_answer">Koputa vastamiseks</string>
|
||||
<string name="right_click">Saada paremklõps</string>
|
||||
<string name="middle_click">Saada keskklõps</string>
|
||||
@@ -81,13 +134,16 @@
|
||||
<string name="request_pairing">Soovi paardumist</string>
|
||||
<string name="pairing_accept">Nõustu</string>
|
||||
<string name="pairing_reject">Keeldu</string>
|
||||
<string name="settings">Seadistused</string>
|
||||
<string name="mpris_play">Esita</string>
|
||||
<string name="mpris_pause">Paus</string>
|
||||
<string name="mpris_previous">Eelmine</string>
|
||||
<string name="mpris_rew">Keri tagasi</string>
|
||||
<string name="mpris_ff">Kiiresti edasi</string>
|
||||
<string name="mpris_next">Järgmine</string>
|
||||
<string name="mpris_volume">Helitugevus</string>
|
||||
<string name="mpris_time_settings_title">Edasi-tagasikerimise nupud</string>
|
||||
<string name="mpris_time_settings_summary">Kiire edasi-tagasikerimise aja kohandamine vajutamisel</string>
|
||||
<string-array name="mpris_time_entries">
|
||||
<item>10 sekundit</item>
|
||||
<item>20 sekundit</item>
|
||||
@@ -95,39 +151,151 @@
|
||||
<item>1 minut</item>
|
||||
<item>2 minutit</item>
|
||||
</string-array>
|
||||
<string name="mpris_notification_settings_title">Meedia juhtimise märguannete näitamine</string>
|
||||
<string name="mpris_notification_settings_summary">Meediamängija juhtimise võimaldamine ilma KDE Connecti avamata</string>
|
||||
<string name="share_to">Jaga ...</string>
|
||||
<string name="protocol_version_newer">See seade kasutab uuemat protokolli versiooni</string>
|
||||
<string name="plugin_settings_with_name">%s seadistused</string>
|
||||
<string name="invalid_device_name">Vigane seadme nimi</string>
|
||||
<string name="shareplugin_text_saved">Saadi tekst, salvestati lõikepuhvrisse</string>
|
||||
<string name="custom_devices_settings">Kohandatud seadmete loend</string>
|
||||
<string name="custom_device_list">Lisa seadmeid IP järgi</string>
|
||||
<string name="custom_device_deleted">Kohandatud seade kustutati</string>
|
||||
<string name="custom_device_list_help">Kui sinu seadet automaatselt ei tuvastatud, võib lisada selle IP-aadressi või masinanime nupule klõpsates</string>
|
||||
<string name="custom_device_fab_hint">Lisa seade</string>
|
||||
<string name="undo">Võta tagasi</string>
|
||||
<string name="share_notification_preference">Mürarikkad märguanded</string>
|
||||
<string name="share_notification_preference_summary">Vibreerimine ja heli esitamine faili saamisel</string>
|
||||
<string name="share_destination_customize">Sihtkataloogi kohandamine</string>
|
||||
<string name="share_destination_customize_summary_disabled">Saadud failid salvestatakse kataloogi Allalaaditud</string>
|
||||
<string name="share_destination_customize_summary_enabled">Failid salvestatakse allmääratud kataloogi</string>
|
||||
<string name="share_destination_folder_preference">Sihtkataloog</string>
|
||||
<string name="share">Jaga</string>
|
||||
<string name="share_received_file">Jaga \"%s\"</string>
|
||||
<string name="title_activity_notification_filter">Märguannete filter</string>
|
||||
<string name="filter_apps_info">Valitud rakenduste märguanded sünkroonitakse</string>
|
||||
<string name="sftp_sdcard_num">SD-kaart %d</string>
|
||||
<string name="sftp_sdcard">SD-kaart</string>
|
||||
<string name="sftp_readonly">(kirjutuskaitstud)</string>
|
||||
<string name="sftp_camera">Kaamera pildid</string>
|
||||
<string name="add_device_dialog_title">Seadme lisamine</string>
|
||||
<string name="add_device_hint">Masinanimi või IP-aadress</string>
|
||||
<string name="sftp_preference_detected_sdcards">Tuvastatud SD-kaardid</string>
|
||||
<string name="sftp_preference_edit_sdcard_title">SD-kaardi muutmine</string>
|
||||
<string name="sftp_preference_configured_storage_locations">Seadistatud salvestuskohad</string>
|
||||
<string name="sftp_preference_add_storage_location_title">Salvestuskoha lisamine</string>
|
||||
<string name="sftp_preference_edit_storage_location">Salvestuskoha muutmine</string>
|
||||
<string name="sftp_preference_add_camera_shortcut">Lisa kaamerakausta kiirviit</string>
|
||||
<string name="sftp_preference_add_camera_shortcut_summary_on">Kaamerakausta kiirviida lisamine</string>
|
||||
<string name="sftp_preference_add_camera_shortcut_summary_off">Kaamerakausta kiirviita ei lisata</string>
|
||||
<string name="sftp_storage_preference_storage_location">Salvestuskoht</string>
|
||||
<string name="sftp_storage_preference_storage_location_already_configured">See asukoht on juba seadistatud</string>
|
||||
<string name="sftp_storage_preference_click_to_select">"klõpsa valimiseks "</string>
|
||||
<string name="sftp_storage_preference_display_name">Näidatav nimi</string>
|
||||
<string name="sftp_storage_preference_display_name_already_used">See nimi on juba kasutusel</string>
|
||||
<string name="sftp_storage_preference_display_name_cannot_be_empty">Näidatav nimi ei tohi olla andmata</string>
|
||||
<string name="sftp_action_mode_menu_delete">Kustuta</string>
|
||||
<string name="sftp_no_sdcard_detected">Ühtegi SD-kaarti ei leitud</string>
|
||||
<string name="sftp_no_storage_locations_configured">Ühtegi salvestuskohta pole seadistatud</string>
|
||||
<string name="sftp_saf_permission_explanation">Ligipääsuks failidele eemalt tuleb seadistada salvestuskohad</string>
|
||||
<string name="no_players_connected">Ühtegi mängijat ei leitud</string>
|
||||
<string name="send_files">Saada faile</string>
|
||||
<string name="pairing_title">KDE Connecti seadmed</string>
|
||||
<string name="pairing_description">Siin näeb teisi seadmeid samas võrgus, kus töötab KDE Connect</string>
|
||||
<string name="device_rename_title">Muuda seadme nime</string>
|
||||
<string name="device_rename_confirm">Muuda nime</string>
|
||||
<string name="device_rename_title">Seadme nime muutmine</string>
|
||||
<string name="device_rename_confirm">Nime muutmine</string>
|
||||
<string name="refresh">Värskenda</string>
|
||||
<string name="unreachable_description">See paardunud seade pole saadaval. Kontrolli, kas see on ikka ühendatud sinuga samasse võrku.</string>
|
||||
<string name="no_wifi">Sul puudub ühendus Wi-Fi võrguga, mistõttu sa ei näe ühtegi seadet. Klõpsa siia Wi-Fi sisselülitamiseks.</string>
|
||||
<string name="on_non_trusted_message">See ei ole usaldusväärne võrk: automaatne tuvastamine on keelatud.</string>
|
||||
<string name="no_file_browser">Ühtegi failisirvijat pole paigaldatud</string>
|
||||
<string name="pref_plugin_telepathy">Saada SMS</string>
|
||||
<string name="pref_plugin_telepathy_desc">Tekstisõnumite saatmine oma töölaualt</string>
|
||||
<string name="findmyphone_title">Leia mu telefon</string>
|
||||
<string name="findmyphone_title_tablet">Leia mu tahvel</string>
|
||||
<string name="findmyphone_title_tv">Leia mu teler</string>
|
||||
<string name="findmyphone_description">Seadmele helistamine, et see üles leida</string>
|
||||
<string name="findmyphone_found">Leitud</string>
|
||||
<string name="open">Ava</string>
|
||||
<string name="close">Sulge</string>
|
||||
<string name="plugins_need_permission">Mõned pluginad vajavad töötamiseks õigusi (koputa rohkema teabe saamiseks);</string>
|
||||
<string name="permission_explanation">See plugin vajab töötamiseks õigusi</string>
|
||||
<string name="optional_permission_explanation">Kõigi funktsioonide lubamiseks tuleb sul anda lisaõigusi</string>
|
||||
<string name="plugins_need_optional_permission">Mõne plugina osa omadusi on keelatud õiguste puudumise tõttu (koputa rohkema teabe saamiseks):</string>
|
||||
<string name="share_optional_permission_explanation">Failide jagamiseks telefoni ja töölau vahel tuleb anda telefonile ligipääs</string>
|
||||
<string name="telepathy_permission_explanation">SMS-ide lugemiseks ja kirjutamiseks töölaual tuleb anda õigused SMS-ile</string>
|
||||
<string name="telephony_permission_explanation">Kõnede nägemiseks töölaual tuleb anda õigused telefonikõnede logile ja telefoni olekule</string>
|
||||
<string name="telephony_optional_permission_explanation">Telefoninumbri asemel kontakti nime nägemiseks tuleb anda õigused telefoni kontaktidele</string>
|
||||
<string name="contacts_permission_explanation">Oma kontaktide jagamiseks töölauaga tuleb anda õigused kontaktidele</string>
|
||||
<string name="select_ringtone">Vali helin</string>
|
||||
<string name="telephony_pref_blocked_title">Blokitud numbrid</string>
|
||||
<string name="telephony_pref_blocked_dialog_desc">Neilt numbritelt tulevaid kõnesid ja SMS-e ei näidata. Palun pane iga number kirja eraldi reale</string>
|
||||
<string name="mpris_coverart_description">Aktiivse meedia kaanepilt</string>
|
||||
<string name="device_icon_description">Seadme ikoon</string>
|
||||
<string name="settings_icon_description">Seadistuste ikoon</string>
|
||||
<string name="presenter_fullscreen">Täisekraan</string>
|
||||
<string name="presenter_exit">Välju esitlusest</string>
|
||||
<string name="presenter_lock_tip">Seade on võimalik lukku panna ning liikuda eelmisele/järgmisele slaidile helitugevuse klahvidega</string>
|
||||
<string name="add_command">Lisa käsk</string>
|
||||
<string name="addcommand_explanation">Ühtegi käsku pole registreeritud</string>
|
||||
<string name="addcommand_explanation2">Uusi käske saab lisada Süsteemi seadistustes KDE Connecti all</string>
|
||||
<string name="add_command_description">Käske saab lisada töölaual</string>
|
||||
<string name="pref_plugin_mprisreceiver">Meediafailide mängija juhtimine</string>
|
||||
<string name="pref_plugin_mprisreceiver_desc">Telefoni meediamängijate juhtimine teisest seadmest</string>
|
||||
<string name="notification_channel_default">Muud märguanded</string>
|
||||
<string name="notification_channel_persistent">Püsiindikaator</string>
|
||||
<string name="notification_channel_media_control">Meedia juhtimine</string>
|
||||
<string name="notification_channel_filetransfer">Failiülekanne</string>
|
||||
<string name="notification_channel_high_priority">Kõrge prioriteediga</string>
|
||||
<string name="mpris_stop">Peata aktiivne mängija</string>
|
||||
<string name="copy_url_to_clipboard">Kopeeri URL lõikepuhvrisse</string>
|
||||
<string name="clipboard_toast">Kopeeriti lõikepuhvrisse</string>
|
||||
<string name="runcommand_notreachable">Seade pole saadaval</string>
|
||||
<string name="runcommand_notpaired">Seade pole paaritatud</string>
|
||||
<string name="runcommand_nosuchdevice">Sellist seadet ei ole</string>
|
||||
<string name="runcommand_noruncommandplugin">Sel seadmel ei ole käsu käivitamise plugin sisse lülitatud</string>
|
||||
<string name="pref_plugin_findremotedevice">Kaugseadme leidmine</string>
|
||||
<string name="pref_plugin_findremotedevice_desc">Helistamine kaugseadmesse</string>
|
||||
<string name="ring">Helista</string>
|
||||
<string name="pref_plugin_systemvolume">Süsteemi helitugevus</string>
|
||||
<string name="pref_plugin_systemvolume_desc">Kaugseadme helitugevuse juhtimine</string>
|
||||
<string name="mute">Tumm</string>
|
||||
<string name="all">Kõik</string>
|
||||
<string name="devices">Seadmed</string>
|
||||
<string name="settings_rename">Seadme nimi</string>
|
||||
<string name="settings_dark_mode">Tume teema</string>
|
||||
<string name="settings_more_settings_title">Rohkem seadistusi</string>
|
||||
<string name="settings_more_settings_text">Seadmekaupa seadistusi leiab seadme \"Pluginate seadistuste \" all.</string>
|
||||
<string name="setting_persistent_notification">Püsimärguannete näitamine</string>
|
||||
<string name="setting_persistent_notification_oreo">Püsimärguanded</string>
|
||||
<string name="setting_persistent_notification_description">Koputa märguannete seadistuste lubamiseks/keelamiseks</string>
|
||||
<string name="extra_options">Erivalikud</string>
|
||||
<string name="privacy_options">Privaatsuse valikud</string>
|
||||
<string name="set_privacy_options">Privaatsusvalikute määramine</string>
|
||||
<string name="block_contents">Märguannete sisu blokkimine</string>
|
||||
<string name="block_images">Märguannete piltide blokkimine</string>
|
||||
<string name="notification_channel_receivenotification">Märguanded teistest seadmetest</string>
|
||||
<string name="take_picture">Käivita kaamera</string>
|
||||
<string name="plugin_photo_desc">Kaamerarakenduse käivitamine piltide tegemiseks ja ülekandmiseks</string>
|
||||
<string name="no_app_for_opening">Selle faili avamiseks ei leitud sobivat rakendust</string>
|
||||
<string name="remote_keyboard_service">KDE Connecti kaugklaviatuur</string>
|
||||
<string name="presenter_pointer">Osutusseade</string>
|
||||
<string name="trusted_networks">Usaldusväärsed võrgud</string>
|
||||
<string name="trusted_networks_desc">Automaatset tuvastamist kasutatakse ainult tuntud võrkudes</string>
|
||||
<string name="add_trusted_network">Lisa %1s</string>
|
||||
<string name="empty_trusted_networks_list_text">Sa ei ole veel lisanud ühtegi usaldusväärset võrku</string>
|
||||
<string name="allow_all_networks_text">Luba kõik</string>
|
||||
<string name="location_permission_needed_title">Õigusenõue</string>
|
||||
<string name="location_permission_needed_desc">Android nõuab asukohaõigust sinu WiFi-võrgu tuvastamiseks</string>
|
||||
<string name="clipboard_android_x_incompat">Android 10 eemaldas lõikepuhvri kasutamise võimaluse kõigilt rakendustelt. See plugin enam ei tööta.</string>
|
||||
<string name="mpris_open_url">Jätka esitamist siin</string>
|
||||
<string name="cant_open_url">URL-i avamine esitamise jätkamiseks nurjus</string>
|
||||
<string name="bigscreen_home">Kodu</string>
|
||||
<string name="bigscreen_up">Ülal</string>
|
||||
<string name="bigscreen_left">Vasakul</string>
|
||||
<string name="bigscreen_select">Vali</string>
|
||||
<string name="bigscreen_right">Paremal</string>
|
||||
<string name="bigscreen_down">All</string>
|
||||
<string name="pref_plugin_bigscreen">Kaugsuurekraan</string>
|
||||
<string name="pref_plugin_bigscreen_desc">Oma seadme kasutamine Plasma kaugsuurekraanina</string>
|
||||
</resources>
|
||||
|
@@ -11,13 +11,14 @@
|
||||
<string name="pref_plugin_sftp_desc">Gailu honen fitxategi-sistema urrunetik arakatzea ahalbidetzen du</string>
|
||||
<string name="pref_plugin_clipboard">Arbelaren sinkronizazioa</string>
|
||||
<string name="pref_plugin_clipboard_desc">Partekatu arbelaren edukia</string>
|
||||
<string name="pref_plugin_mousepad">Urruneko sarrera</string>
|
||||
<string name="pref_plugin_mousepad">Urrutiko sarrera</string>
|
||||
<string name="pref_plugin_mousepad_desc">Erabili zure telefonoa edo tableta ukimen-sagu eta teklatu gisa</string>
|
||||
<string name="pref_plugin_presenter">Diapositiba emanaldietarako telekomandoa</string>
|
||||
<string name="pref_plugin_presenter_desc">Erabili zure gailua aurkezpen bateko diapositibak aldatzeko</string>
|
||||
<string name="pref_plugin_remotekeyboard">Jaso urruneko tekla-sakatzeak</string>
|
||||
<string name="pref_plugin_remotekeyboard_desc">Jaso tekla-sakatze gertaerak urruneko gailuetatik</string>
|
||||
<string name="pref_plugin_mpris">Multimedia kontrolak</string>
|
||||
<string name="pref_plugin_mpris_desc">Zure media jotzailearen urruneko kontrola ematen dizu</string>
|
||||
<string name="pref_plugin_mpris_desc">Zure euskarri-jotzailearen urruneko kontrola ematen dizu</string>
|
||||
<string name="pref_plugin_runcommand">Exekutatu agindua</string>
|
||||
<string name="pref_plugin_runcommand_desc">Abiarazi urruneko aginduak zure telefono edo tabletatik</string>
|
||||
<string name="pref_plugin_contacts">Kontaktuen sinkronizatzailea</string>
|
||||
@@ -36,6 +37,7 @@
|
||||
<string name="open_settings">Ireki ezarpenak</string>
|
||||
<string name="no_permissions">Jakinarazpenak atzitzeko baimena eman behar duzu</string>
|
||||
<string name="no_permission_mprisreceiver">Zure euskarri-jotzaileak kontrolatu ahal izateko jakinarazpenetara atzipena eman behar diozu</string>
|
||||
<string name="no_permissions_remotekeyboard">Sakatzeak jasotzeko KDE Connecten urruneko teklatua aktibatu behar duzu</string>
|
||||
<string name="send_ping">Bidali ping</string>
|
||||
<string name="open_mpris_controls">Multimedia kontrola</string>
|
||||
<string name="remotekeyboard_editing_only_title">Erabili urruneko teklak editatzean besterik ez</string>
|
||||
@@ -96,6 +98,14 @@
|
||||
<item quantity="one">Fitxategia: %1s</item>
|
||||
<item quantity="other">(%3$d(e)tik %2$d fitxategia) : %1$s</item>
|
||||
</plurals>
|
||||
<plurals name="outgoing_file_title">
|
||||
<item quantity="one">"%2$s(r)i %1$d fitxategi bidaltzea"</item>
|
||||
<item quantity="other">"%2$s(r)i %1$d fitxategi bidaltzea"</item>
|
||||
</plurals>
|
||||
<plurals name="outgoing_files_text">
|
||||
<item quantity="one">Fitxategia: %1$s</item>
|
||||
<item quantity="other">(%3$d(e)tik %2$d. fitxategia) : %1$s</item>
|
||||
</plurals>
|
||||
<plurals name="received_files_title">
|
||||
<item quantity="one">Fitxategi bat jaso da %1$s-tik</item>
|
||||
<item quantity="other">%2$d fitxategi jaso dira %1$s-tik</item>
|
||||
@@ -104,6 +114,14 @@
|
||||
<item quantity="one">Huts egin du fitxategi bat %1$s-tik jasotzeak</item>
|
||||
<item quantity="other">Huts egin du %2$d/%3$d fitxategi %1$s-tik jasotzeak</item>
|
||||
</plurals>
|
||||
<plurals name="sent_files_title">
|
||||
<item quantity="one">Fitxategia %1$s(e)ra bidali da</item>
|
||||
<item quantity="other">%2$d fitxategi %1$s(e)ra bidali dira</item>
|
||||
</plurals>
|
||||
<plurals name="send_files_fail_title">
|
||||
<item quantity="one">Huts egin du fitxategia %1$s(e)ra bidaltzea</item>
|
||||
<item quantity="other">"Huts egin du %3$d(e)tik %2$d fitxategi %1$s(e)ra bidaltzea"</item>
|
||||
</plurals>
|
||||
<string name="received_file_text">Tak egin \'%1s\' irekitzeko</string>
|
||||
<string name="cannot_create_file">Ezin da sortu %s fitxategia</string>
|
||||
<string name="tap_to_answer">Tak egin erantzuteko</string>
|
||||
@@ -140,6 +158,10 @@
|
||||
<string name="shareplugin_text_saved">Testua jaso da, arbelean kopiatu da</string>
|
||||
<string name="custom_devices_settings">Gailuen zerrenda pertsonalizatua</string>
|
||||
<string name="custom_device_list">Gehitu gailuak IP bidez</string>
|
||||
<string name="custom_device_deleted">Norberak finkatutako gailua ezabatu da</string>
|
||||
<string name="custom_device_list_help">Zure gailua ez bada automatikoki detektatzen bere IP helbidea edo ostalari-izena gehitu dezakezu ekintza botoi mugikorrean klik eginez</string>
|
||||
<string name="custom_device_fab_hint">Gehitu gailu bat</string>
|
||||
<string name="undo">Desegin</string>
|
||||
<string name="share_notification_preference">Jakinarazpen zaratatsuak</string>
|
||||
<string name="share_notification_preference_summary">Bibratu eta jo soinua fitxategia jasotzean</string>
|
||||
<string name="share_destination_customize">Pertsonalizatu direktorio xedea</string>
|
||||
@@ -154,7 +176,27 @@
|
||||
<string name="sftp_sdcard">SD txartela</string>
|
||||
<string name="sftp_readonly">(irakurri soilik)</string>
|
||||
<string name="sftp_camera">Kamerako irudiak</string>
|
||||
<string name="no_players_connected">Ez da jokalaririk aurkitu</string>
|
||||
<string name="add_device_dialog_title">Gehitu gailua</string>
|
||||
<string name="add_device_hint">Ostalari-izena edo IP helbidea</string>
|
||||
<string name="sftp_preference_detected_sdcards">Detektatutako SD txartelak</string>
|
||||
<string name="sftp_preference_edit_sdcard_title">Editatu SD txartela</string>
|
||||
<string name="sftp_preference_configured_storage_locations">Konfiguratutako biltegiratze kokalekuak</string>
|
||||
<string name="sftp_preference_add_storage_location_title">Gehitu biltegiratze kokalekua</string>
|
||||
<string name="sftp_preference_edit_storage_location">Editatu biltegiratze kokalekua</string>
|
||||
<string name="sftp_preference_add_camera_shortcut">Gehitu kamera karpetaren lasterbidea</string>
|
||||
<string name="sftp_preference_add_camera_shortcut_summary_on">Gehitu lasterbide bat kamera karpetara</string>
|
||||
<string name="sftp_preference_add_camera_shortcut_summary_off">Ez gehitu lasterbide bat kamera karpetara</string>
|
||||
<string name="sftp_storage_preference_storage_location">Biltegiratze kokalekua</string>
|
||||
<string name="sftp_storage_preference_storage_location_already_configured">Kokaleku hau jada konfiguratuta dago</string>
|
||||
<string name="sftp_storage_preference_click_to_select">klik egin aukeratzeko</string>
|
||||
<string name="sftp_storage_preference_display_name">Azaltzeko izena</string>
|
||||
<string name="sftp_storage_preference_display_name_already_used">Azaltzeko izen hau jada erabilita dago</string>
|
||||
<string name="sftp_storage_preference_display_name_cannot_be_empty">Azaltzeko izena ezin da hutsik egon</string>
|
||||
<string name="sftp_action_mode_menu_delete">Ezabatu</string>
|
||||
<string name="sftp_no_sdcard_detected">Ez da SD txartelik detektatu</string>
|
||||
<string name="sftp_no_storage_locations_configured">Ez da biltegiratze kokalekurik konfiguratu</string>
|
||||
<string name="sftp_saf_permission_explanation">Fitxategiak urrunetik atzitzeko biltegiratze kokalekuak konfiguratu behar dituzu</string>
|
||||
<string name="no_players_connected">Ez da jotzailerik aurkitu</string>
|
||||
<string name="send_files">Bidali fitxategiak</string>
|
||||
<string name="pairing_title">KDE Connect gailuak</string>
|
||||
<string name="pairing_description">KDE Connect darabilten sareko beste gailuak hemen agertu beharko lirateke.</string>
|
||||
@@ -162,6 +204,7 @@
|
||||
<string name="device_rename_confirm">Aldatu izena</string>
|
||||
<string name="refresh">Freskatu</string>
|
||||
<string name="unreachable_description">Parekatutako gailu hau ez dago eskuragarri. Egiaztatu sare berera konektatuta dagoela.</string>
|
||||
<string name="no_wifi">Ez zaude Wi-Fi sare batera konektatuta, baliteke gailurik ez ikustea. Egin klik hemen Wi-Fia gaitzeko.</string>
|
||||
<string name="no_file_browser">Ez dago fitxategi arakatzailerik instalatuta.</string>
|
||||
<string name="pref_plugin_telepathy">Bidali SMSa</string>
|
||||
<string name="pref_plugin_telepathy_desc">Bidali testu-mezuak zure mahaigainetik</string>
|
||||
@@ -169,7 +212,6 @@
|
||||
<string name="findmyphone_title_tablet">Bilatu nire tableta</string>
|
||||
<string name="findmyphone_title_tv">Aurkitu nire TB</string>
|
||||
<string name="findmyphone_description">Gailuaren dei-doinua jotzen du aurki dezazun</string>
|
||||
<string name="findmyphone_found">Aurkituta</string>
|
||||
<string name="open">Ireki</string>
|
||||
<string name="close">Itxi</string>
|
||||
<string name="plugins_need_permission">Plugin batzuek jarduteko baimenak behar dituzte (tak egin informazio gehiagorako):</string>
|
||||
@@ -178,6 +220,7 @@
|
||||
<string name="plugins_need_optional_permission">Plugin batzuek desgaitutako eginbideak dituzte baimenak faltan dituztelako (tak egin informazio gehiagorako):</string>
|
||||
<string name="share_optional_permission_explanation">Zure telefonoa eta mahaigainaren artean fitxategiak partekatzeko telefonoaren biltegiratzea atzitzeko baimena eman behar duzu</string>
|
||||
<string name="telepathy_permission_explanation">SMSak zure mahaigainetik bidali ahal izateko, SMSak erabiltzeko baimena eman behar duzu</string>
|
||||
<string name="telephony_permission_explanation">Telefono deiak zure mahaigainetik ikusteko, telefono deien egunkarira eta telefonoaren egoerara baimena eman behar duzu</string>
|
||||
<string name="telephony_optional_permission_explanation">Telefono zenbakiaren ordez kontaktuaren izena ikusteko telefonoko kontaktuak atzitzeko baimena eman behar duzu</string>
|
||||
<string name="contacts_permission_explanation">Zure kontaktuen liburuak mahaigainarekin partekatzeko, kontaktuetara baimena eman behar duzu</string>
|
||||
<string name="select_ringtone">Hautatu dei-tonu bat</string>
|
||||
@@ -188,11 +231,13 @@
|
||||
<string name="settings_icon_description">Ezarpenen ikonoa</string>
|
||||
<string name="presenter_fullscreen">Pantaila-betea</string>
|
||||
<string name="presenter_exit">Irten aurkezpenetik</string>
|
||||
<string name="presenter_lock_tip">Zure gailua giltzatu dezakezu eta bolumen teklak botoi gisa erabili aurreko/hurrengo diapositibara joateko</string>
|
||||
<string name="add_command">Gehitu komando bat</string>
|
||||
<string name="addcommand_explanation">Ez dago komandorik erregistraturik</string>
|
||||
<string name="addcommand_explanation2">Komando berriak gehitu ditzakezu KDE Connect sistemaren ezarpenetan</string>
|
||||
<string name="add_command_description">Komandoak gehitu ditzakezu mahaigainean</string>
|
||||
<string name="pref_plugin_mprisreceiver">Euskarri-jotzailearen kontrola</string>
|
||||
<string name="pref_plugin_mprisreceiver_desc">Kontrolatu zure telefonoaren euskarri-jotzaileak beste gailu batetik</string>
|
||||
<string name="notification_channel_default">Beste jakinarazpen batzuk</string>
|
||||
<string name="notification_channel_persistent">Adierazle iraunkorra</string>
|
||||
<string name="notification_channel_media_control">Euskarrien kontrola</string>
|
||||
@@ -217,10 +262,17 @@
|
||||
<string name="settings_more_settings_title">Ezarpen gehiago</string>
|
||||
<string name="settings_more_settings_text">Gailu-bakoitzeko ezarpenak aurki daitezke \'Pluginen ezarpenak\' barruan.</string>
|
||||
<string name="setting_persistent_notification">Erakutsi jakinarazpen iraunkorra</string>
|
||||
<string name="setting_persistent_notification_oreo">Jakinarazpen iraunkorra</string>
|
||||
<string name="setting_persistent_notification_description">Sakatu gaitzeko/desgaitzeko jakinarazpen ezarpenetan</string>
|
||||
<string name="extra_options">Aukera gehigarriak</string>
|
||||
<string name="privacy_options">Pribatutasun aukerak</string>
|
||||
<string name="set_privacy_options">Ezarri zure pribatutasun aukerak</string>
|
||||
<string name="block_contents">Oztopatu jakinarazpenen edukiak</string>
|
||||
<string name="block_images">Oztopatu jakinarazpenen irudiak</string>
|
||||
<string name="notification_channel_receivenotification">Beste gailu batzuen jakinarazpenak</string>
|
||||
<string name="take_picture">Abiarazi kamera</string>
|
||||
<string name="plugin_photo_desc">Abiarazi kamerako aplikazioa argazkiak hartzeko eta transferitzeko</string>
|
||||
<string name="no_app_for_opening">Ez da fitxategi hau irekitzeko aplikazio egokirik aurkitu</string>
|
||||
<string name="remote_keyboard_service">KDE Connect urruneko teklatua</string>
|
||||
<string name="presenter_pointer">Erakuslea</string>
|
||||
</resources>
|
||||
|
@@ -211,7 +211,6 @@
|
||||
<string name="findmyphone_title_tablet">Löydä tablettini</string>
|
||||
<string name="findmyphone_title_tv">Etsi televeisioni</string>
|
||||
<string name="findmyphone_description">Laittaa laitteen soimaan, jotta voit löytää sen.</string>
|
||||
<string name="findmyphone_found">Löytyi</string>
|
||||
<string name="open">Avaa</string>
|
||||
<string name="close">Sulje</string>
|
||||
<string name="plugins_need_permission">Jotkin liitännäiset vaativat toimiakseen lisäkäyttöoikeuksia (lisätietoa napsauttamalla):</string>
|
||||
|
@@ -33,6 +33,7 @@
|
||||
<string name="pref_plugin_sharereceiver_desc">Partagez des URLs et des fichiers entre périphériques</string>
|
||||
<string name="device_list_empty">Pas de périphériques</string>
|
||||
<string name="ok">Ok</string>
|
||||
<string name="sad_ok">Ok :(</string>
|
||||
<string name="cancel">Annuler</string>
|
||||
<string name="open_settings">Accéder aux paramètres</string>
|
||||
<string name="no_permissions">Vous devez accorder la permission d\'accéder aux notifications</string>
|
||||
@@ -205,6 +206,7 @@
|
||||
<string name="refresh">Mettre à jour</string>
|
||||
<string name="unreachable_description">Ce périphérique associé n\'est pas accessible. Assurez-vous qu\'il est bien connecté au même réseau.</string>
|
||||
<string name="no_wifi">Vous n\'êtes connecté à aucun réseau Wi-Fi, il est possible que vous ne puissiez afficher aucun appareil. Cliquez ici pour activer le Wi-Fi.</string>
|
||||
<string name="on_non_trusted_message">Le réseau n\'est pas un réseau de confiance : découverte automatique désactivée.</string>
|
||||
<string name="no_file_browser">Aucun navigateur de fichiers installé.</string>
|
||||
<string name="pref_plugin_telepathy">Envoyer un SMS</string>
|
||||
<string name="pref_plugin_telepathy_desc">Envoyer des SMS depuis votre bureau</string>
|
||||
@@ -238,10 +240,12 @@
|
||||
<string name="addcommand_explanation2">Vous pouvez ajouter de nouvelles commandes dans la configuration système de KDE Connect</string>
|
||||
<string name="add_command_description">Vous pouvez ajouter des commandes sur votre ordinateur</string>
|
||||
<string name="pref_plugin_mprisreceiver">Contrôle du lecteur multimédia</string>
|
||||
<string name="pref_plugin_mprisreceiver_desc">Contrôlez les lecteurs multimédia de votre téléphone depuis un autre appareil</string>
|
||||
<string name="notification_channel_default">Autres notifications</string>
|
||||
<string name="notification_channel_persistent">Indicateur persistant</string>
|
||||
<string name="notification_channel_media_control">Contrôle multimédia</string>
|
||||
<string name="notification_channel_filetransfer">Transfert de fichiers</string>
|
||||
<string name="notification_channel_high_priority">Haute priorité</string>
|
||||
<string name="mpris_stop">Arrêter le lecteur actuel</string>
|
||||
<string name="copy_url_to_clipboard">Copier l\'URL dans le presse-papiers</string>
|
||||
<string name="clipboard_toast">Copié dans le presse-papier</string>
|
||||
@@ -275,4 +279,22 @@
|
||||
<string name="no_app_for_opening">Aucune application adaptée trouvée pour ouvrir ce fichier.</string>
|
||||
<string name="remote_keyboard_service">Clavier à distance KDE Connect</string>
|
||||
<string name="presenter_pointer">Pointeur</string>
|
||||
<string name="trusted_networks">Réseaux de confiance</string>
|
||||
<string name="trusted_networks_desc">Restreindre la découverte automatique aux réseaux connus</string>
|
||||
<string name="add_trusted_network">Ajouter %1s</string>
|
||||
<string name="empty_trusted_networks_list_text">Vous n\'avez pas encore ajouté de réseau de confiance</string>
|
||||
<string name="allow_all_networks_text">Tout autoriser</string>
|
||||
<string name="location_permission_needed_title">Permissions requises</string>
|
||||
<string name="location_permission_needed_desc">Android requiert la permission de géolocalisation pour identifier votre réseau Wifi</string>
|
||||
<string name="clipboard_android_x_incompat">Android 10 a supprimé l\'accès des applications au presse-papier. Ce module externe sera désactivé.</string>
|
||||
<string name="mpris_open_url">Continuer la lecture ici</string>
|
||||
<string name="cant_open_url">Impossible d\'ouvrir l\'URL pour continuer la lecture</string>
|
||||
<string name="bigscreen_home">Accueil</string>
|
||||
<string name="bigscreen_up">Vers le haut</string>
|
||||
<string name="bigscreen_left">Vers la gauche</string>
|
||||
<string name="bigscreen_select">Sélectionner</string>
|
||||
<string name="bigscreen_right">Vers la droite</string>
|
||||
<string name="bigscreen_down">Vers le bas</string>
|
||||
<string name="pref_plugin_bigscreen">Télécommande Bigscreen</string>
|
||||
<string name="pref_plugin_bigscreen_desc">Utiliser votre périphérique comme télécommande pour Plasma Bigscreen</string>
|
||||
</resources>
|
||||
|
@@ -212,7 +212,6 @@
|
||||
<string name="findmyphone_title_tablet">Atopar a tableta</string>
|
||||
<string name="findmyphone_title_tv">Atopar o meu televisor</string>
|
||||
<string name="findmyphone_description">Reproduce un son de chamada no dispositivo para que poida atopalo.</string>
|
||||
<string name="findmyphone_found">Atopado</string>
|
||||
<string name="open">Abrir</string>
|
||||
<string name="close">Pechar</string>
|
||||
<string name="plugins_need_permission">Algúns complementos necesitan permisos para funcionar (toque para máis información):</string>
|
||||
@@ -238,6 +237,7 @@
|
||||
<string name="addcommand_explanation2">Pode engadir novas ordes desde a configuración do sistema de KDE Connect.</string>
|
||||
<string name="add_command_description">Pode engadir ordes no escritorio.</string>
|
||||
<string name="pref_plugin_mprisreceiver">Control do reprodutor de multimedia</string>
|
||||
<string name="pref_plugin_mprisreceiver_desc">Controlar os reprodutores do seu móbil desde outro dispositivo</string>
|
||||
<string name="notification_channel_default">Outras notificacións</string>
|
||||
<string name="notification_channel_persistent">Indicador persistente</string>
|
||||
<string name="notification_channel_media_control">Control de reprodución</string>
|
||||
|
@@ -133,7 +133,6 @@
|
||||
<string name="findmyphone_title">מצא את הפלאפון שלי</string>
|
||||
<string name="findmyphone_title_tablet">מצא את הטבלט שלי</string>
|
||||
<string name="findmyphone_description">מפעיל רעש במכשיר כדי שתוכל למצוא אותו.</string>
|
||||
<string name="findmyphone_found">נמצא</string>
|
||||
<string name="open">פתח</string>
|
||||
<string name="close">סגור</string>
|
||||
</resources>
|
||||
|
@@ -3,7 +3,7 @@
|
||||
<string name="kde_connect">KDE Connect</string>
|
||||
<string name="foreground_notification_no_devices">Belum terkoneksi ke perangkat apa pun</string>
|
||||
<string name="foreground_notification_devices">Terkoneksi ke: %s</string>
|
||||
<string name="pref_plugin_telephony">Penotifikasi telepon</string>
|
||||
<string name="pref_plugin_telephony">Penotifikasi ponsel</string>
|
||||
<string name="pref_plugin_telephony_desc">Kirim notifikasi untuk panggilan yang masuk</string>
|
||||
<string name="pref_plugin_battery">Laporan baterai</string>
|
||||
<string name="pref_plugin_battery_desc">Status baterai laporkan secara berkala</string>
|
||||
@@ -12,14 +12,14 @@
|
||||
<string name="pref_plugin_clipboard">Sinkron clipboard</string>
|
||||
<string name="pref_plugin_clipboard_desc">Berbagi konten papan-klip</string>
|
||||
<string name="pref_plugin_mousepad">Input jarak jauh</string>
|
||||
<string name="pref_plugin_mousepad_desc">Gunakan telepon atau tabletmu sebagai touchpad dan keyboard</string>
|
||||
<string name="pref_plugin_mousepad_desc">Gunakan ponsel atau tabletmu sebagai touchpad dan keyboard</string>
|
||||
<string name="pref_plugin_presenter_desc">Gunakan perangkatmu untuk mengubah slide dalam sebuah presentasi</string>
|
||||
<string name="pref_plugin_remotekeyboard">Terima penekanan tuts jarak jauh</string>
|
||||
<string name="pref_plugin_remotekeyboard_desc">Terima peristiwa tekan-tuts dari perangkat jarak jauh</string>
|
||||
<string name="pref_plugin_mpris">Kendalikan multimedia</string>
|
||||
<string name="pref_plugin_mpris_desc">Menyediakan sebuah kendali jarak jauh untuk pemutar mediamu</string>
|
||||
<string name="pref_plugin_runcommand">Jalankan Perintah</string>
|
||||
<string name="pref_plugin_runcommand_desc">Pemicu perintah jarak jauh dari telepon dan tablet-mu</string>
|
||||
<string name="pref_plugin_runcommand_desc">Pemicu perintah jarak jauh dari ponsel dan tablet-mu</string>
|
||||
<string name="pref_plugin_contacts">Penyinkron Kontak</string>
|
||||
<string name="pref_plugin_contacts_desc">Bolehkan menyinkronkan buku kontak pada perangkat</string>
|
||||
<string name="pref_plugin_ping">Ping</string>
|
||||
@@ -160,11 +160,10 @@
|
||||
<string name="no_file_browser">Tidak adanya penelusur file yang terinstal.</string>
|
||||
<string name="pref_plugin_telepathy">Kirim SMS</string>
|
||||
<string name="pref_plugin_telepathy_desc">Kirim teks perpesanan dari desktopmu</string>
|
||||
<string name="findmyphone_title">Temukan teleponku</string>
|
||||
<string name="findmyphone_title">Temukan ponselku</string>
|
||||
<string name="findmyphone_title_tablet">Temukan tabletku</string>
|
||||
<string name="findmyphone_title_tv">Temukan TV-ku</string>
|
||||
<string name="findmyphone_description">Deringkan perangkat ini sehingga kamu bisa menemukannya</string>
|
||||
<string name="findmyphone_found">Ketemu</string>
|
||||
<string name="open">Buka</string>
|
||||
<string name="close">Tutup</string>
|
||||
<string name="plugins_need_permission">Beberapa plugin perlu perizinan untuk kerja (ketuk untuk info selebihnya):</string>
|
||||
@@ -173,7 +172,8 @@
|
||||
<string name="plugins_need_optional_permission">Beberapa plugin yang memiliki fitur dinonfungsikan karena kurangnya perizinan (ketuk untuk info selebihnya):</string>
|
||||
<string name="share_optional_permission_explanation">Untuk membagikan file antara teleponmu dan desktopmu kamu harus memberikan akses ke penyimpanan teleponmu</string>
|
||||
<string name="telepathy_permission_explanation">Untuk membaca dan menulis SMS dari desktopmu kamu harus memberikan perizinan untuk SMS</string>
|
||||
<string name="telephony_optional_permission_explanation">Untuk melihat nama kontak alih-alih nomor telepon, kamu harus memberikan akses ke kontak telepon</string>
|
||||
<string name="telephony_permission_explanation">Untuk melihat panggilan ponsel pada desktop kamu harus memberikan perizinan untuk log panggilan ponsel dan keadaan ponsel</string>
|
||||
<string name="telephony_optional_permission_explanation">Untuk melihat nama kontak alih-alih nomor ponsel, kamu harus memberikan akses ke kontak ponsel</string>
|
||||
<string name="contacts_permission_explanation">Untuk membagikan buku kontak dengan desktopmu, kamu harus memberikan perizinan kontak</string>
|
||||
<string name="select_ringtone">Pilih sebuah ringtone</string>
|
||||
<string name="telephony_pref_blocked_title">Nomor yang diblokir</string>
|
||||
@@ -186,4 +186,9 @@
|
||||
<string name="addcommand_explanation2">"Kamu bisa menambahkan perintah baru dalam System Settings KDE Connect "</string>
|
||||
<string name="add_command_description">Kamu bisa menambahkan perintah pada desktop</string>
|
||||
<string name="pref_plugin_mprisreceiver">Kendali Pemutar Media</string>
|
||||
<string name="pref_plugin_mprisreceiver_desc">Kendalikan pemutar media ponselmu dari perangkat lainnya</string>
|
||||
<string name="devices">Perangkat</string>
|
||||
<string name="settings_rename">Nama perangkat</string>
|
||||
<string name="settings_dark_mode">Tema gelap</string>
|
||||
<string name="settings_more_settings_title">Pengaturan selebihnya</string>
|
||||
</resources>
|
||||
|
@@ -33,6 +33,7 @@
|
||||
<string name="pref_plugin_sharereceiver_desc">Condividi file e URL tra i dispositivi</string>
|
||||
<string name="device_list_empty">Nessun dispositivo</string>
|
||||
<string name="ok">OK</string>
|
||||
<string name="sad_ok">OK :(</string>
|
||||
<string name="cancel">Annulla</string>
|
||||
<string name="open_settings">Apri impostazioni</string>
|
||||
<string name="no_permissions">Devi concedere i permessi per l\'accesso alle notifiche</string>
|
||||
@@ -205,6 +206,7 @@
|
||||
<string name="refresh">Aggiorna</string>
|
||||
<string name="unreachable_description">Questo dispositivo associato non è raggiungibile. Assicurati che sia connesso alla tua stessa rete.</string>
|
||||
<string name="no_wifi">Non sei connesso a una rete Wi-Fi, per cui non sarai in grado di vedere alcun dispositivo. Fai clic qui per abilitare il Wi-Fi.</string>
|
||||
<string name="on_non_trusted_message">Non in una rete affidabile: il rilevamento automatico è disabilitato.</string>
|
||||
<string name="no_file_browser">Non ci sono navigatori di file installati.</string>
|
||||
<string name="pref_plugin_telepathy">Invia SMS</string>
|
||||
<string name="pref_plugin_telepathy_desc">Invia messaggi di testo dal tuo desktop</string>
|
||||
@@ -238,10 +240,12 @@
|
||||
<string name="addcommand_explanation2">Puoi aggiungere nuovi comandi nelle impostazioni di sistema di KDE Connect</string>
|
||||
<string name="add_command_description">Puoi aggiungere comandi sul desktop</string>
|
||||
<string name="pref_plugin_mprisreceiver">Controllo lettore multimediale</string>
|
||||
<string name="pref_plugin_mprisreceiver_desc">Controlla i lettori multimediali del tuo telefono da un altro dispositivo</string>
|
||||
<string name="notification_channel_default">Altre notifiche</string>
|
||||
<string name="notification_channel_persistent">Indicatore persistente</string>
|
||||
<string name="notification_channel_media_control">Controllo multimediale</string>
|
||||
<string name="notification_channel_filetransfer">Trasferimento file</string>
|
||||
<string name="notification_channel_high_priority">Priorità alta</string>
|
||||
<string name="mpris_stop">Ferma il lettore attuale</string>
|
||||
<string name="copy_url_to_clipboard">Copia l\'URL negli appunti</string>
|
||||
<string name="clipboard_toast">Copiato negli appunti</string>
|
||||
@@ -275,4 +279,22 @@
|
||||
<string name="no_app_for_opening">Nessuna applicazione appropriata trovata per aprire questo file</string>
|
||||
<string name="remote_keyboard_service">Tastiera remota di KDE Connect</string>
|
||||
<string name="presenter_pointer">Puntatore</string>
|
||||
<string name="trusted_networks">Reti affidabili</string>
|
||||
<string name="trusted_networks_desc">Limita il rilevamento automatico alle reti conosciute</string>
|
||||
<string name="add_trusted_network">Aggiungi %1s</string>
|
||||
<string name="empty_trusted_networks_list_text">Non hai aggiunto ancora alcuna rete affidabile</string>
|
||||
<string name="allow_all_networks_text">Consenti tutte</string>
|
||||
<string name="location_permission_needed_title">Permesso richiesto</string>
|
||||
<string name="location_permission_needed_desc">Android richiede il permesso Posizione per identificare la tua rete WiFi</string>
|
||||
<string name="clipboard_android_x_incompat">Android 10 ha rimosso l\'accesso agli appunti a tutte le applicazioni. Questa estensione sarà disabilitata.</string>
|
||||
<string name="mpris_open_url">Continua qui la riproduzione</string>
|
||||
<string name="cant_open_url">Impossibile aprire l\'URL per continuare la riproduzione</string>
|
||||
<string name="bigscreen_home">Inizio</string>
|
||||
<string name="bigscreen_up">Su</string>
|
||||
<string name="bigscreen_left">Sinistra</string>
|
||||
<string name="bigscreen_select">Seleziona</string>
|
||||
<string name="bigscreen_right">A destra</string>
|
||||
<string name="bigscreen_down">Giù</string>
|
||||
<string name="pref_plugin_bigscreen">Telecomando Bigscreen</string>
|
||||
<string name="pref_plugin_bigscreen_desc">Utilizza il tuo dispositivo come telecomando per Plasma Bigscreen</string>
|
||||
</resources>
|
||||
|
@@ -204,7 +204,6 @@
|
||||
<string name="findmyphone_title_tablet">タブレットを捜索</string>
|
||||
<string name="findmyphone_title_tv">TV を捜索</string>
|
||||
<string name="findmyphone_description">このデバイスを鳴らすことで捜索できます</string>
|
||||
<string name="findmyphone_found">発見</string>
|
||||
<string name="open">開く</string>
|
||||
<string name="close">閉じる</string>
|
||||
<string name="plugins_need_permission">いくつかのプラグインが機能するには権限が必要です (タップして詳細情報を表示):</string>
|
||||
|
@@ -33,6 +33,7 @@
|
||||
<string name="pref_plugin_sharereceiver_desc">장치끼리 파일과 URL 공유</string>
|
||||
<string name="device_list_empty">장치 없음</string>
|
||||
<string name="ok">확인</string>
|
||||
<string name="sad_ok">확인 :(</string>
|
||||
<string name="cancel">취소</string>
|
||||
<string name="open_settings">설정 열기</string>
|
||||
<string name="no_permissions">알림 접근 권한이 필요합니다</string>
|
||||
@@ -147,7 +148,7 @@
|
||||
<string name="protocol_version_newer">이 장치의 프로토콜 버전이 더 새롭습니다</string>
|
||||
<string name="plugin_settings_with_name">%s 설정</string>
|
||||
<string name="invalid_device_name">잘못된 장치 이름</string>
|
||||
<string name="shareplugin_text_saved">텍스트 수신, 클립보드로 복사됨</string>
|
||||
<string name="shareplugin_text_saved">텍스트 수신, 클립보드에 복사됨</string>
|
||||
<string name="custom_devices_settings">사용자 정의 장치 목록</string>
|
||||
<string name="custom_device_list">IP로 장치 추가</string>
|
||||
<string name="custom_device_deleted">사용자 정의 장치 삭제됨</string>
|
||||
@@ -197,6 +198,7 @@
|
||||
<string name="refresh">새로 고침</string>
|
||||
<string name="unreachable_description">이 연결된 장치에 접근할 수 없습니다. 같은 네트워크에 있는지 확인하십시오.</string>
|
||||
<string name="no_wifi">Wi-Fi 네트워크에 연결된 것 같지 않습니다. 다른 장치를 볼 수 없습니다. 여기를 누르면 Wi-Fi를 활성화합니다.</string>
|
||||
<string name="on_non_trusted_message">신뢰할 수 없는 네트워크: 자동 발견을 비활성화했습니다.</string>
|
||||
<string name="no_file_browser">설치된 파일 탐색기가 없습니다.</string>
|
||||
<string name="pref_plugin_telepathy">SMS 보내기</string>
|
||||
<string name="pref_plugin_telepathy_desc">데스크톱에서 문자 메시지 보내기</string>
|
||||
@@ -230,13 +232,15 @@
|
||||
<string name="addcommand_explanation2">시스템 설정의 KDE Connect에서 새로운 명령을 추가할 수 있습니다</string>
|
||||
<string name="add_command_description">데스크톱에서 명령을 추가할 수 있습니다</string>
|
||||
<string name="pref_plugin_mprisreceiver">미디어 재생기 제어</string>
|
||||
<string name="pref_plugin_mprisreceiver_desc">다른 장치에서 휴대폰의 미디어 재생기 제어</string>
|
||||
<string name="notification_channel_default">기타 알림</string>
|
||||
<string name="notification_channel_persistent">항상 표시된 표시기</string>
|
||||
<string name="notification_channel_media_control">미디어 제어</string>
|
||||
<string name="notification_channel_filetransfer">파일 전송</string>
|
||||
<string name="notification_channel_high_priority">높은 우선 순위</string>
|
||||
<string name="mpris_stop">현재 재생기 정지</string>
|
||||
<string name="copy_url_to_clipboard">클립보드로 URL 복사</string>
|
||||
<string name="clipboard_toast">클립보드로 복사됨</string>
|
||||
<string name="clipboard_toast">클립보드에 복사됨</string>
|
||||
<string name="runcommand_notreachable">장치에 접근할 수 없음</string>
|
||||
<string name="runcommand_notpaired">장치가 연결되지 않음</string>
|
||||
<string name="runcommand_nosuchdevice">장치가 없음</string>
|
||||
@@ -267,4 +271,22 @@
|
||||
<string name="no_app_for_opening">이 파일을 열 수 있는 앱을 찾을 수 없음</string>
|
||||
<string name="remote_keyboard_service">KDE Connect 원격 키보드</string>
|
||||
<string name="presenter_pointer">포인터</string>
|
||||
<string name="trusted_networks">신뢰할 수 있는 네트워크</string>
|
||||
<string name="trusted_networks_desc">신뢰할 수 있는 네트워크에서만 자동 발견 사용</string>
|
||||
<string name="add_trusted_network">%1s 추가</string>
|
||||
<string name="empty_trusted_networks_list_text">신뢰할 수 있는 네트워크를 추가하지 않았습니다</string>
|
||||
<string name="allow_all_networks_text">모두 허용</string>
|
||||
<string name="location_permission_needed_title">권한이 필요함</string>
|
||||
<string name="location_permission_needed_desc">안드로이드에서 Wi-Fi 네트워크를 식별하려면 위치 권한이 필요합니다</string>
|
||||
<string name="clipboard_android_x_incompat">안드로이드 10부터는 앱에서 클립보드에 접근할 수 없습니다. 이 플러그인이 비활성화되었습니다.</string>
|
||||
<string name="mpris_open_url">여기에서 계속 재생</string>
|
||||
<string name="cant_open_url">계속 재생할 URL을 열 수 없음</string>
|
||||
<string name="bigscreen_home">홈</string>
|
||||
<string name="bigscreen_up">위</string>
|
||||
<string name="bigscreen_left">왼쪽</string>
|
||||
<string name="bigscreen_select">선택</string>
|
||||
<string name="bigscreen_right">오른쪽</string>
|
||||
<string name="bigscreen_down">아래</string>
|
||||
<string name="pref_plugin_bigscreen">큰 화면 리모콘</string>
|
||||
<string name="pref_plugin_bigscreen_desc">내 장치를 Plasma 큰 화면의 리모콘으로 사용</string>
|
||||
</resources>
|
||||
|
@@ -33,8 +33,9 @@
|
||||
<string name="pref_plugin_sharereceiver_desc">Bendrinti failus ir URL adresus tarp įrenginių</string>
|
||||
<string name="device_list_empty">Jokių įrenginių</string>
|
||||
<string name="ok">Gerai</string>
|
||||
<string name="sad_ok">Gerai :(</string>
|
||||
<string name="cancel">Atsisakyti</string>
|
||||
<string name="open_settings">Atverti nustatymus</string>
|
||||
<string name="open_settings">Atverti nuostatas</string>
|
||||
<string name="no_permissions">Norėdami gauti prieigą prie pranešimų, turite suteikti leidimą</string>
|
||||
<string name="no_permission_mprisreceiver">Norėdami valdyti savo medijos leistuves, turite suteikti prieigą prie pranešimų</string>
|
||||
<string name="no_permissions_remotekeyboard">Norėdami gauti klavišų paspaudimus, turite aktyvuoti KDE Connect nuotolinę klaviatūrą</string>
|
||||
@@ -74,7 +75,7 @@
|
||||
<string name="category_connected_devices">Prijungti įrenginiai</string>
|
||||
<string name="category_not_paired_devices">Prieinami įrenginiai</string>
|
||||
<string name="category_remembered_devices">Įsiminti įrenginiai</string>
|
||||
<string name="device_menu_plugins">Priedo nuostatos</string>
|
||||
<string name="device_menu_plugins">Papildinio nuostatos</string>
|
||||
<string name="device_menu_unpair">Panaikinti suporavimą</string>
|
||||
<string name="pair_new_device">Suporuoti naują įrenginį</string>
|
||||
<string name="unknown_device">Nežinomas įrenginys</string>
|
||||
@@ -148,7 +149,7 @@
|
||||
<string name="request_pairing">Užklausti suporuoti</string>
|
||||
<string name="pairing_accept">Priimti</string>
|
||||
<string name="pairing_reject">Atmesti</string>
|
||||
<string name="settings">Nustatyti</string>
|
||||
<string name="settings">Nuostatos</string>
|
||||
<string name="mpris_play">Atkurti</string>
|
||||
<string name="mpris_pause">Pristabdyti</string>
|
||||
<string name="mpris_previous">Ankstesnis</string>
|
||||
@@ -220,6 +221,8 @@
|
||||
<string name="device_rename_confirm">Pervadinti</string>
|
||||
<string name="refresh">Įkelti iš naujo</string>
|
||||
<string name="unreachable_description">Šis suporuotas įrenginys nepasiekiamas. Įsitikinkite, kad jis yra prijungtas prie to paties tinklo.</string>
|
||||
<string name="no_wifi">Nesate prisijungę prie belaidžio (Wi-Fi) tinklo, taigi, galite nematyti jokių įrenginių. Spustelėkite čia, norėdami įjungti belaidį (Wi-Fi).</string>
|
||||
<string name="on_non_trusted_message">Nepatikimas tinklas: automatinis aptikimas yra išjungtas.</string>
|
||||
<string name="no_file_browser">Nėra įdiegta jokių failų tvarkytuvių.</string>
|
||||
<string name="pref_plugin_telepathy">Siųsti SMS žinutę</string>
|
||||
<string name="pref_plugin_telepathy_desc">Siųsti tekstines žinutes iš savo darbalaukio</string>
|
||||
@@ -227,13 +230,13 @@
|
||||
<string name="findmyphone_title_tablet">Rasti planšetę</string>
|
||||
<string name="findmyphone_title_tv">Rasti televizorių</string>
|
||||
<string name="findmyphone_description">Skambina į šį įrenginį, kad galėtumėte jį rasti</string>
|
||||
<string name="findmyphone_found">Rastas</string>
|
||||
<string name="findmyphone_found">Radau</string>
|
||||
<string name="open">Atverti</string>
|
||||
<string name="close">Užverti</string>
|
||||
<string name="plugins_need_permission">Kai kurie priedai tam, kad veiktų, reikalauja leidimų (bakstelėkite išsamesnei informacijai):</string>
|
||||
<string name="permission_explanation">Šis priedas tam, kad veiktų, reikalauja leidimų</string>
|
||||
<string name="plugins_need_permission">Kai kurie papildiniai tam, kad veiktų, reikalauja leidimų (bakstelėkite išsamesnei informacijai):</string>
|
||||
<string name="permission_explanation">Šis papildinys tam, kad veiktų, reikalauja leidimų</string>
|
||||
<string name="optional_permission_explanation">Norėdami įjungti visas funkcijas, turite suteikti papildomus leidimus</string>
|
||||
<string name="plugins_need_optional_permission">Kai kurių priedų ypatybės, dėl leidimų trūkumo, buvo išjungtos (bakstelėkite išsamesnei informacijai):</string>
|
||||
<string name="plugins_need_optional_permission">Kai kurių papildinių ypatybės, dėl leidimų trūkumo, buvo išjungtos (bakstelėkite išsamesnei informacijai):</string>
|
||||
<string name="share_optional_permission_explanation">Norėdami bendrinti failus tarp savo telefono ir savo darbalaukio, turite suteikti prieigą prie telefono saugyklos</string>
|
||||
<string name="telepathy_permission_explanation">Norėdami skaityti ir rašyti SMS žinutes iš savo darbalaukio, turite suteikti prieigą prie SMS žinučių</string>
|
||||
<string name="telephony_permission_explanation">Norėdami matyti telefono skambučius darbalaukyje, turite suteikti prieigą prie telefono skambučių žurnalo ir telefono būsenos</string>
|
||||
@@ -243,27 +246,29 @@
|
||||
<string name="telephony_pref_blocked_title">Užblokuoti numeriai</string>
|
||||
<string name="telephony_pref_blocked_dialog_desc">Nerodyti skambučių ir SMS žinučių iš šių numerių. Nurodykite kiekvienoje eilutėje po vieną</string>
|
||||
<string name="mpris_coverart_description">Dabartinės įvairialypės terpės iliustracija</string>
|
||||
<string name="device_icon_description">Įrenginio ženkliukas</string>
|
||||
<string name="settings_icon_description">Nustatymų ženkliukas</string>
|
||||
<string name="device_icon_description">Įrenginio piktograma</string>
|
||||
<string name="settings_icon_description">Nuostatų piktograma</string>
|
||||
<string name="presenter_fullscreen">Visas ekranas</string>
|
||||
<string name="presenter_exit">Išeiti iš pristatymo</string>
|
||||
<string name="presenter_lock_tip">Galite užrakinti savo įrenginį ir perėjimui prie kitos/ankstesnės skaidrės naudoti garsumo mygtukus</string>
|
||||
<string name="add_command">Pridėti komandą</string>
|
||||
<string name="addcommand_explanation">Nėra registruota jokių komandų</string>
|
||||
<string name="addcommand_explanation2">Galite pridėti naujas komandas KDE Connect sistemos nustatymuose</string>
|
||||
<string name="addcommand_explanation2">Galite pridėti naujas komandas KDE Connect sistemos nuostatose</string>
|
||||
<string name="add_command_description">Galite pridėti komandas darbalaukyje</string>
|
||||
<string name="pref_plugin_mprisreceiver">Medijos leistuvės valdymas</string>
|
||||
<string name="pref_plugin_mprisreceiver_desc">Valdyti savo telefono medijos leistuves iš kito įrenginio</string>
|
||||
<string name="notification_channel_default">Kiti pranešimai</string>
|
||||
<string name="notification_channel_persistent">Pastovus indikatorius</string>
|
||||
<string name="notification_channel_media_control">Įvairialypės terpės valdymas</string>
|
||||
<string name="notification_channel_filetransfer">Failų persiuntimas</string>
|
||||
<string name="notification_channel_high_priority">Didelė pirmenybė</string>
|
||||
<string name="mpris_stop">Stabdyti dabartinę leistuvę</string>
|
||||
<string name="copy_url_to_clipboard">Kopijuoti URL į iškarpinę</string>
|
||||
<string name="clipboard_toast">Nukopijuota į iškarpinę</string>
|
||||
<string name="runcommand_notreachable">Device is not reachable</string>
|
||||
<string name="runcommand_notpaired">Device is not paired</string>
|
||||
<string name="runcommand_nosuchdevice">Nėra tokio įrenginio</string>
|
||||
<string name="runcommand_noruncommandplugin">Šis įrenginys neturi įjungto priedo Vykdyti komandą</string>
|
||||
<string name="runcommand_noruncommandplugin">Šis įrenginys neturi įjungto papildinio Vykdyti komandą</string>
|
||||
<string name="pref_plugin_findremotedevice">Rasti nuotolinį įrenginį</string>
|
||||
<string name="pref_plugin_findremotedevice_desc">Skambinti į nuotolinį įrenginį</string>
|
||||
<string name="ring">Skambinti</string>
|
||||
@@ -274,11 +279,11 @@
|
||||
<string name="devices">Įrenginiai</string>
|
||||
<string name="settings_rename">Įrenginio pavadinimas</string>
|
||||
<string name="settings_dark_mode">Tamsus apipavidalinimas</string>
|
||||
<string name="settings_more_settings_title">Daugiau nustatymų</string>
|
||||
<string name="settings_more_settings_text">Nustatymus kiekvienam atskiram įrenginiui galima rasti įrenginyje \"Priedo nustatymuose\".</string>
|
||||
<string name="settings_more_settings_title">Daugiau nuostatų</string>
|
||||
<string name="settings_more_settings_text">Nuostatas kiekvienam atskiram įrenginiui galima rasti įrenginyje \"Papildinio nuostatose\".</string>
|
||||
<string name="setting_persistent_notification">Rodyti pastovų pranešimą</string>
|
||||
<string name="setting_persistent_notification_oreo">Pastovus pranešimas</string>
|
||||
<string name="setting_persistent_notification_description">Bakstelėkite, norėdami įjungti/išjungti Pranešimų nustatymuose</string>
|
||||
<string name="setting_persistent_notification_description">Bakstelėkite, norėdami įjungti/išjungti Pranešimų nuostatose</string>
|
||||
<string name="extra_options">Papildomos parinktys</string>
|
||||
<string name="privacy_options">Privatumo parinktys</string>
|
||||
<string name="set_privacy_options">Nustatyti savo privatumo parinktis</string>
|
||||
@@ -290,4 +295,22 @@
|
||||
<string name="no_app_for_opening">Šio failo atvėrimui nerasta jokios tinkamos programėlės</string>
|
||||
<string name="remote_keyboard_service">KDE Connect nuotolinė klaviatūra</string>
|
||||
<string name="presenter_pointer">Rodyklė</string>
|
||||
<string name="trusted_networks">Patikimi tinklai</string>
|
||||
<string name="trusted_networks_desc">Apriboti automatinį aptikimą iki žinomų tinklų</string>
|
||||
<string name="add_trusted_network">Pridėti %1s</string>
|
||||
<string name="empty_trusted_networks_list_text">Kol kas nesate pridėję jokių patikimų tinklų</string>
|
||||
<string name="allow_all_networks_text">Leisti visus</string>
|
||||
<string name="location_permission_needed_title">Reikalingas leidimas</string>
|
||||
<string name="location_permission_needed_desc">Android reikalauja Vietos leidimo, kad atpažintų jūsų belaidį (WiFi) tinklą</string>
|
||||
<string name="clipboard_android_x_incompat">Android 10 pašalino iškarpinės prieigą prie visų programėlių. Šis papildinys bus išjungtas.</string>
|
||||
<string name="mpris_open_url">Tęsti atkūrimą čia</string>
|
||||
<string name="cant_open_url">Nepavyksta atverti URL, kad būtų tęsiamas atkūrimas</string>
|
||||
<string name="bigscreen_home">Pradžia</string>
|
||||
<string name="bigscreen_up">Aukštyn</string>
|
||||
<string name="bigscreen_left">Kairėn</string>
|
||||
<string name="bigscreen_select">Pasirinkti</string>
|
||||
<string name="bigscreen_right">Dešinėn</string>
|
||||
<string name="bigscreen_down">Žemyn</string>
|
||||
<string name="pref_plugin_bigscreen">Bigscreen nuotolinis pultas</string>
|
||||
<string name="pref_plugin_bigscreen_desc">Naudoti savo įrenginį kaip Plasma Bigscreen nuotolinį pultą</string>
|
||||
</resources>
|
||||
|
@@ -33,6 +33,7 @@
|
||||
<string name="pref_plugin_sharereceiver_desc">Bestanden en URL\'s delen tussen apparaten</string>
|
||||
<string name="device_list_empty">Geen apparaten</string>
|
||||
<string name="ok">OK</string>
|
||||
<string name="sad_ok">OK :(</string>
|
||||
<string name="cancel">Annuleren</string>
|
||||
<string name="open_settings">Instellingen openen</string>
|
||||
<string name="no_permissions">U moet toestemming geven voor toegang tot meldingen</string>
|
||||
@@ -122,6 +123,7 @@
|
||||
<item quantity="one">Verzenden van bestand naar %1$s is mislukt</item>
|
||||
<item quantity="other">Verzenden van %2$d van %3$d bestanden naar %1$s is mislukt</item>
|
||||
</plurals>
|
||||
<string name="tap_to_open">Tik om te openen</string>
|
||||
<string name="received_file_text">Tap om \'%1s\' te openen</string>
|
||||
<string name="cannot_create_file">Kan bestand %s niet aanmaken</string>
|
||||
<string name="tap_to_answer">Tap om te antwoorden</string>
|
||||
@@ -205,6 +207,7 @@
|
||||
<string name="refresh">Vernieuwen</string>
|
||||
<string name="unreachable_description">Dit gepaarde apparaat is niet bereikbaar. Ga na dat het is verbonden met uw zelfde netwerk.</string>
|
||||
<string name="no_wifi">U bent niet verbonden met een Wi-Fi-netwerk, u zou dus niet in staat kunnen zijn om apparaten te zien. Klik hier om Wi-Fi in te schakelen.</string>
|
||||
<string name="on_non_trusted_message">Niet op een vertrouwd netwerk: automatisch ontdekken is uitgeschakeld.</string>
|
||||
<string name="no_file_browser">Er zijn geen bestandsbrowsers geïnstalleerd.</string>
|
||||
<string name="pref_plugin_telepathy">SMS verzenden</string>
|
||||
<string name="pref_plugin_telepathy_desc">Stuur tekstberichten van uw bureaublad</string>
|
||||
@@ -243,6 +246,7 @@
|
||||
<string name="notification_channel_persistent">Blijvende indicator</string>
|
||||
<string name="notification_channel_media_control">Besturing van media</string>
|
||||
<string name="notification_channel_filetransfer">Bestandsoverdracht</string>
|
||||
<string name="notification_channel_high_priority">Hoge prioriteit</string>
|
||||
<string name="mpris_stop">Stop de huidige speler</string>
|
||||
<string name="copy_url_to_clipboard">URL-adres kopiëren naar klembord</string>
|
||||
<string name="clipboard_toast">Gekopieerd naar klembord</string>
|
||||
@@ -259,7 +263,7 @@
|
||||
<string name="all">Alles</string>
|
||||
<string name="devices">Apparaten</string>
|
||||
<string name="settings_rename">Apparaatnaam</string>
|
||||
<string name="settings_dark_mode">Donker themea</string>
|
||||
<string name="settings_dark_mode">Donker thema</string>
|
||||
<string name="settings_more_settings_title">Meer instellingen</string>
|
||||
<string name="settings_more_settings_text">Instellingen per apparaat kunnen gevonden worden onder \'Plug-in-instellingen\' vanuit een apparaat.</string>
|
||||
<string name="setting_persistent_notification">Blijvende melding tonen</string>
|
||||
@@ -276,4 +280,22 @@
|
||||
<string name="no_app_for_opening">Geen geschikte toepassing gevonden om dit bestand te openen</string>
|
||||
<string name="remote_keyboard_service">KDE Connect Toetsenbord op afstand</string>
|
||||
<string name="presenter_pointer">Aanwijzer</string>
|
||||
<string name="trusted_networks">Vertrouwde netwerken</string>
|
||||
<string name="trusted_networks_desc">Automatisch ontdekken beperken tot bekende netwerken</string>
|
||||
<string name="add_trusted_network">%1s toevoegen</string>
|
||||
<string name="empty_trusted_networks_list_text">U hebt nog geen vertrouwd netwerk toegevoegd</string>
|
||||
<string name="allow_all_networks_text">Allen toestaan</string>
|
||||
<string name="location_permission_needed_title">Toestemming vereist</string>
|
||||
<string name="location_permission_needed_desc">Android vereist de toestemming voor locatie om uw WiFi-netwerk te identificeren</string>
|
||||
<string name="clipboard_android_x_incompat">Android 10 heeft toegang tot het klembord naar alle toepassingen verwijderd. Deze plug-in zal uitgeschakeld worden.</string>
|
||||
<string name="mpris_open_url">Hier doorgaan met afspelen</string>
|
||||
<string name="cant_open_url">Kan URL niet openen om door te gaan met afspelen</string>
|
||||
<string name="bigscreen_home">Home</string>
|
||||
<string name="bigscreen_up">Omhoog</string>
|
||||
<string name="bigscreen_left">Links</string>
|
||||
<string name="bigscreen_select">Selecteren</string>
|
||||
<string name="bigscreen_right">Rechts</string>
|
||||
<string name="bigscreen_down">Omlaag</string>
|
||||
<string name="pref_plugin_bigscreen">Bigscreen op afstand</string>
|
||||
<string name="pref_plugin_bigscreen_desc">Gebruik uw apparaat als een Bigscreen op afstand</string>
|
||||
</resources>
|
||||
|
@@ -33,6 +33,7 @@
|
||||
<string name="pref_plugin_sharereceiver_desc">Del filer og nettadresser mellom einingar</string>
|
||||
<string name="device_list_empty">Ingen einingar</string>
|
||||
<string name="ok">OK</string>
|
||||
<string name="sad_ok">OK :(</string>
|
||||
<string name="cancel">Avbryt</string>
|
||||
<string name="open_settings">Opna innstillingar</string>
|
||||
<string name="no_permissions">Du må gje tilgang til lesing av varslingar</string>
|
||||
@@ -205,6 +206,7 @@
|
||||
<string name="refresh">Oppdater</string>
|
||||
<string name="unreachable_description">Får ikkje kontakt med den para eininga. Sjå til at ho er kopla til same nettverk.</string>
|
||||
<string name="no_wifi">Du er ikkje kopla til eit Wi-Fi-nettverk, så du vil ikkje kunna sjå nokon einingar. Trykk her for å slå på Wi-Fi.</string>
|
||||
<string name="on_non_trusted_message">Ikkje på eit tiltrudd nettverk: autooppdaging er slått av.</string>
|
||||
<string name="no_file_browser">Ingen filhandsamarar er installerte.</string>
|
||||
<string name="pref_plugin_telepathy">Send SMS</string>
|
||||
<string name="pref_plugin_telepathy_desc">Send tekstmeldingar frå datamaskina</string>
|
||||
@@ -212,7 +214,7 @@
|
||||
<string name="findmyphone_title_tablet">Finn nettbrettet mitt</string>
|
||||
<string name="findmyphone_title_tv">Finn TV-en min</string>
|
||||
<string name="findmyphone_description">Spel av lydsignal på eininga, slik at du lett kan finna ho</string>
|
||||
<string name="findmyphone_found">Funnen</string>
|
||||
<string name="findmyphone_found">Fann han</string>
|
||||
<string name="open">Opna</string>
|
||||
<string name="close">Lukk</string>
|
||||
<string name="plugins_need_permission">Nokre av tillegga treng utvida løyva for å fungera (trykk på dei for meir informasjon):</string>
|
||||
@@ -238,10 +240,12 @@
|
||||
<string name="addcommand_explanation2">Du kan leggja til nye kommandoar i systeminnstillingane til KDE Connect</string>
|
||||
<string name="add_command_description">Du kan leggja til kommandoar på skrivebordet</string>
|
||||
<string name="pref_plugin_mprisreceiver">Mediespelarkontrollar</string>
|
||||
<string name="pref_plugin_mprisreceiver_desc">Kontroller mediespelarar på telefonen din frå ei anna eining</string>
|
||||
<string name="notification_channel_default">Andre varslingar</string>
|
||||
<string name="notification_channel_persistent">Evigvarande varslingar</string>
|
||||
<string name="notification_channel_media_control">Mediestyring</string>
|
||||
<string name="notification_channel_filetransfer">Filoverføring</string>
|
||||
<string name="notification_channel_high_priority">Høg prioritet</string>
|
||||
<string name="mpris_stop">Stopp gjeldande avspelar</string>
|
||||
<string name="copy_url_to_clipboard">Kopier adresse til utklippstavla</string>
|
||||
<string name="clipboard_toast">Kopiert til utklippstavla</string>
|
||||
@@ -275,4 +279,22 @@
|
||||
<string name="no_app_for_opening">Fann ikkje nokon app som kan opna denne fila</string>
|
||||
<string name="remote_keyboard_service">KDE Connect fjerntastatur</string>
|
||||
<string name="presenter_pointer">Peikar</string>
|
||||
<string name="trusted_networks">Tiltrudde nettverk</string>
|
||||
<string name="trusted_networks_desc">Avgrens autooppdaging til kjende nettverk</string>
|
||||
<string name="add_trusted_network">Legg til %1s</string>
|
||||
<string name="empty_trusted_networks_list_text">Du har ikkje lagt til eit tiltrudd nettverk enno</string>
|
||||
<string name="allow_all_networks_text">Tillat alle</string>
|
||||
<string name="location_permission_needed_title">Krev utvida løyve</string>
|
||||
<string name="location_permission_needed_desc">Tilgang til geografisk plassering må vera påslått for identifisering av Wi-Fi-nettverket</string>
|
||||
<string name="clipboard_android_x_incompat">Android 10 har fjerna tilgang til utklippstavla for alle program. Programtillegget vert derfor slått av.</string>
|
||||
<string name="mpris_open_url">Hald fram avspeling her</string>
|
||||
<string name="cant_open_url">Kan ikkje opna adressa for framhald av avspeling</string>
|
||||
<string name="bigscreen_home">Heim</string>
|
||||
<string name="bigscreen_up">Opp</string>
|
||||
<string name="bigscreen_left">Venstre</string>
|
||||
<string name="bigscreen_select">Vel</string>
|
||||
<string name="bigscreen_right">Høgre</string>
|
||||
<string name="bigscreen_down">Ned</string>
|
||||
<string name="pref_plugin_bigscreen">Bigscreen-fjernkontroll</string>
|
||||
<string name="pref_plugin_bigscreen_desc">Bruk eininga som fjernkontroll for Plasma Bigscreen</string>
|
||||
</resources>
|
||||
|
@@ -11,9 +11,9 @@
|
||||
<string name="pref_plugin_sftp_desc">Daje dostęp do plików innemu urządzeniu</string>
|
||||
<string name="pref_plugin_clipboard">Synchronizacja schowka</string>
|
||||
<string name="pref_plugin_clipboard_desc">Udostępnia zawartość schowka</string>
|
||||
<string name="pref_plugin_mousepad">Zdalne sterowanie</string>
|
||||
<string name="pref_plugin_mousepad_desc">Wykorzystuje ekran jako mysz i klawiaturę</string>
|
||||
<string name="pref_plugin_presenter">Sterowanie pokazem przeźroczy</string>
|
||||
<string name="pref_plugin_mousepad">Sterowanie z urządzenia przenośnego</string>
|
||||
<string name="pref_plugin_mousepad_desc">Telefon lub tablet służy jako gładzik i klawiatura</string>
|
||||
<string name="pref_plugin_presenter">Sterowanie prezentacją</string>
|
||||
<string name="pref_plugin_presenter_desc">Przełącza przeźrocza przy użyciu telefonu</string>
|
||||
<string name="pref_plugin_remotekeyboard">Odbieranie zdalnych naciśnięć klawiszy</string>
|
||||
<string name="pref_plugin_remotekeyboard_desc">Odbiera naciśnięcia klawiszy z innego urządzenia</string>
|
||||
@@ -29,11 +29,11 @@
|
||||
<string name="pref_plugin_notifications_desc">Wysyła powiadomienia na inne urządzenia</string>
|
||||
<string name="pref_plugin_receive_notifications">Odbieranie powiadomień</string>
|
||||
<string name="pref_plugin_receive_notifications_desc">Odbiera powiadomienia z innych urządzeń</string>
|
||||
<string name="pref_plugin_sharereceiver">Udostępnianie i odbieranie</string>
|
||||
<string name="pref_plugin_sharereceiver_desc">Współdzieli pliki i adresy URL pomiędzy urządzeniami</string>
|
||||
<string name="pref_plugin_sharereceiver">Udostępnianie i pobieranie</string>
|
||||
<string name="pref_plugin_sharereceiver_desc">Udostępnia pliki i adresy URL pomiędzy urządzeniami</string>
|
||||
<string name="device_list_empty">Brak urządzeń</string>
|
||||
<string name="ok">OK</string>
|
||||
<string name="cancel">Zaniechaj</string>
|
||||
<string name="cancel">Anuluj</string>
|
||||
<string name="open_settings">Otwórz ustawienia</string>
|
||||
<string name="no_permissions">Aby uzyskać dostęp do powiadomień, należy przydzielić uprawnienia</string>
|
||||
<string name="no_permission_mprisreceiver">Aby móc sterować odtwarzaczami multimedialnymi, należy udzielić dostępu powiadomieniom</string>
|
||||
@@ -127,9 +127,9 @@
|
||||
<item quantity="other"/>
|
||||
</plurals>
|
||||
<plurals name="sent_files_title">
|
||||
<item quantity="one">Wyślij plik do %1$s</item>
|
||||
<item quantity="few">Wyślij %2$d pliki do %1$s</item>
|
||||
<item quantity="many">Wyślij %2$d plików do %1$s</item>
|
||||
<item quantity="one">Wysłano plik do %1$s</item>
|
||||
<item quantity="few">Wysłano %2$d pliki do %1$s</item>
|
||||
<item quantity="many">Wysłano %2$d plików do %1$s</item>
|
||||
<item quantity="other"/>
|
||||
</plurals>
|
||||
<plurals name="send_files_fail_title">
|
||||
@@ -213,7 +213,7 @@
|
||||
<string name="sftp_no_storage_locations_configured">Nie ustawiono miejsc w pamięci</string>
|
||||
<string name="sftp_saf_permission_explanation">Aby przeglądać pliki zdalnie, należy ustawić miejsca w pamięci</string>
|
||||
<string name="no_players_connected">Nie znaleziono żadnego odtwarzacza</string>
|
||||
<string name="send_files">Wyślij pliki</string>
|
||||
<string name="send_files">Wysyłanie plików</string>
|
||||
<string name="pairing_title">Urządzenia KDE Connect</string>
|
||||
<string name="pairing_description">Tu powinny pojawić się urządzenia podłączone do tej samej sieci i które także mają uruchomione KDE Connect.</string>
|
||||
<string name="device_rename_title">Zmień nazwę urządzenia</string>
|
||||
@@ -223,12 +223,11 @@
|
||||
<string name="no_wifi">Brak połączenia z siecią Wi-Fi, więc może nie być widać urządzeń. Naciśnij tutaj, aby włączyć Wi-Fi.</string>
|
||||
<string name="no_file_browser">Nie wgrano żadnych przeglądarek plików.</string>
|
||||
<string name="pref_plugin_telepathy">Wysyłanie SMSów</string>
|
||||
<string name="pref_plugin_telepathy_desc">Wysyła wiadomość tekstową z komputera</string>
|
||||
<string name="findmyphone_title">Znajdź mój telefon</string>
|
||||
<string name="findmyphone_title_tablet">Znajdź mój tablet</string>
|
||||
<string name="findmyphone_title_tv">Znajdź mój telewizor</string>
|
||||
<string name="findmyphone_description">Dzwoni na dane urządzenie, tak abyś mógł je znaleźć.</string>
|
||||
<string name="findmyphone_found">Znaleziony</string>
|
||||
<string name="pref_plugin_telepathy_desc">Wysyła wiadomości tekstowe z komputera</string>
|
||||
<string name="findmyphone_title">Poszukiwania telefonu</string>
|
||||
<string name="findmyphone_title_tablet">Poszukiwania tabletu</string>
|
||||
<string name="findmyphone_title_tv">Poszukiwania telewizora</string>
|
||||
<string name="findmyphone_description">Dzwoni na dane urządzenie, aby można je odnaleźć.</string>
|
||||
<string name="open">Otwórz</string>
|
||||
<string name="close">Zamknij</string>
|
||||
<string name="plugins_need_permission">Niektóre wtyczki wymagają uprawnień do swojego działania (stuknij, aby dowiedzieć się więcej)</string>
|
||||
@@ -254,6 +253,7 @@
|
||||
<string name="addcommand_explanation2">Nowe polecenie można dodać w ustawieniach systemowych KDE Connect</string>
|
||||
<string name="add_command_description">Możesz dodawać polecenia na pulpicie</string>
|
||||
<string name="pref_plugin_mprisreceiver">Sterowanie odtwarzaczem mediów</string>
|
||||
<string name="pref_plugin_mprisreceiver_desc">Sterowanie odtwarzaczami multimedialnymi z innego urządzenia</string>
|
||||
<string name="notification_channel_default">Inne powiadomienia</string>
|
||||
<string name="notification_channel_persistent">Nieznikający wskaźnik</string>
|
||||
<string name="notification_channel_media_control">Sterowanie multimediami</string>
|
||||
@@ -265,8 +265,8 @@
|
||||
<string name="runcommand_notpaired">Urządzenie jest niesparowane</string>
|
||||
<string name="runcommand_nosuchdevice">Nie ma takiego urządzenia</string>
|
||||
<string name="runcommand_noruncommandplugin">To urządzenie nie ma włączonej wtyczki wykonywania poleceń</string>
|
||||
<string name="pref_plugin_findremotedevice">Znajdź swoje urządzenie zdalne</string>
|
||||
<string name="pref_plugin_findremotedevice_desc">Zadzwoń na urządzenie zdalne</string>
|
||||
<string name="pref_plugin_findremotedevice">Poszukiwania urządzenia przenośnego</string>
|
||||
<string name="pref_plugin_findremotedevice_desc">Dzwoni na urządzenie przenośne</string>
|
||||
<string name="ring">Zadzwoń</string>
|
||||
<string name="pref_plugin_systemvolume">Głośność systemowa</string>
|
||||
<string name="pref_plugin_systemvolume_desc">Sterowanie głośnością systemu zdalnego urządzenia</string>
|
||||
|
@@ -33,6 +33,7 @@
|
||||
<string name="pref_plugin_sharereceiver_desc">Compartilha arquivos e URLs entre os dispositivos</string>
|
||||
<string name="device_list_empty">Sem dispositivos</string>
|
||||
<string name="ok">OK</string>
|
||||
<string name="sad_ok">OK :(</string>
|
||||
<string name="cancel">Cancelar</string>
|
||||
<string name="open_settings">Abrir configurações</string>
|
||||
<string name="no_permissions">Você precisa conceder permissão para acessar as notificações</string>
|
||||
@@ -205,6 +206,7 @@
|
||||
<string name="refresh">Atualizar</string>
|
||||
<string name="unreachable_description">Este dispositivo emparelhado não está acessível. Certifique-se de que está conectado à mesma rede que você.</string>
|
||||
<string name="no_wifi">Você não está conectado a nenhuma rede Wi-Fi, então não conseguirá ver nenhum dispositivo. Clique aqui para ativar o Wi-Fi.</string>
|
||||
<string name="on_non_trusted_message">Não é uma rede confiável: a descoberta automática está desativada.</string>
|
||||
<string name="no_file_browser">Não há gerenciadores de arquivos instalados.</string>
|
||||
<string name="pref_plugin_telepathy">Enviar SMS</string>
|
||||
<string name="pref_plugin_telepathy_desc">Envia mensagens de texto do seu Desktop</string>
|
||||
@@ -238,10 +240,12 @@
|
||||
<string name="addcommand_explanation2">Você pode adicionar novos comandos nas Configurações do Sistema KDE Connect</string>
|
||||
<string name="add_command_description">Você pode adicionar comandos no ambiente de trabalho</string>
|
||||
<string name="pref_plugin_mprisreceiver">Controle do reprodutor de mídia</string>
|
||||
<string name="pref_plugin_mprisreceiver_desc">Controle os reprodutores de mídias do seu celular a partir de outro dispositivo</string>
|
||||
<string name="notification_channel_default">Outras notificações</string>
|
||||
<string name="notification_channel_persistent">Indicador persistente</string>
|
||||
<string name="notification_channel_media_control">Controle multimídia</string>
|
||||
<string name="notification_channel_filetransfer">Transferência de arquivo</string>
|
||||
<string name="notification_channel_high_priority">Prioridade alta</string>
|
||||
<string name="mpris_stop">Parar o reprodutor atual</string>
|
||||
<string name="copy_url_to_clipboard">Copiar URL para a área de transferência</string>
|
||||
<string name="clipboard_toast">Copiado para a área de transferência</string>
|
||||
@@ -275,4 +279,22 @@
|
||||
<string name="no_app_for_opening">Não foi encontrado nenhum aplicativo adequado para abrir este arquivo</string>
|
||||
<string name="remote_keyboard_service">Teclado Remoto do KDE Connect</string>
|
||||
<string name="presenter_pointer">Ponteiro</string>
|
||||
<string name="trusted_networks">Redes confiáveis</string>
|
||||
<string name="trusted_networks_desc">Restringir a descoberta automática a redes conhecidas</string>
|
||||
<string name="add_trusted_network">Adicionar à %1s</string>
|
||||
<string name="empty_trusted_networks_list_text">Você ainda não adicionou nenhuma rede confiável</string>
|
||||
<string name="allow_all_networks_text">Permitir tudo</string>
|
||||
<string name="location_permission_needed_title">É necessário ter permissão</string>
|
||||
<string name="location_permission_needed_desc">O Android precisa da permissão de Localização para identificar a sua rede Wi-Fi</string>
|
||||
<string name="clipboard_android_x_incompat">O Android 10 removeu o acesso à área de transferência para todos os aplicativos. Este plugin ficará desativado.</string>
|
||||
<string name="mpris_open_url">Continuar tocando aqui</string>
|
||||
<string name="cant_open_url">Não foi possível abrir a URL para continuar tocando</string>
|
||||
<string name="bigscreen_home">Início</string>
|
||||
<string name="bigscreen_up">Para cima</string>
|
||||
<string name="bigscreen_left">Esquerda</string>
|
||||
<string name="bigscreen_select">Selecionar</string>
|
||||
<string name="bigscreen_right">Direita</string>
|
||||
<string name="bigscreen_down">Para baixo</string>
|
||||
<string name="pref_plugin_bigscreen">Controle remoto do Bigscreen</string>
|
||||
<string name="pref_plugin_bigscreen_desc">Use seu dispositivo como um controle remoto para o Plasma Bigscreen</string>
|
||||
</resources>
|
||||
|
@@ -33,6 +33,7 @@
|
||||
<string name="pref_plugin_sharereceiver_desc">Partilhar ficheiros e URL\'s entre dispositivos</string>
|
||||
<string name="device_list_empty">Sem dispositivos</string>
|
||||
<string name="ok">OK</string>
|
||||
<string name="sad_ok">OK :(</string>
|
||||
<string name="cancel">Cancelar</string>
|
||||
<string name="open_settings">Abrir a configuração</string>
|
||||
<string name="no_permissions">Precisa de dar permissões de acesso às notificações</string>
|
||||
@@ -205,6 +206,7 @@
|
||||
<string name="refresh">Actualizar</string>
|
||||
<string name="unreachable_description">Este dispositivo emparelhado não está acessível. Certifique-se que está ligado à mesma rede que você.</string>
|
||||
<string name="no_wifi">Não está ligado a nenhuma rede Wi-Fi, pelo que poderá não conseguir ver nenhuns dispositivos. Carregue aqui para activar o Wi-Fi.</string>
|
||||
<string name="on_non_trusted_message">Não é uma rede fidedigna: a descoberta automática está desactivada.</string>
|
||||
<string name="no_file_browser">Não existem gestores de ficheiros instalados.</string>
|
||||
<string name="pref_plugin_telepathy">Enviar um SMS</string>
|
||||
<string name="pref_plugin_telepathy_desc">Enviar mensagens de texto a partir do seu ambiente de trabalho</string>
|
||||
@@ -212,7 +214,7 @@
|
||||
<string name="findmyphone_title_tablet">Descobrir o meu \'tablet\'</string>
|
||||
<string name="findmyphone_title_tv">Descobrir a minha TV</string>
|
||||
<string name="findmyphone_description">Toca este dispositivo para que o possa encontrar</string>
|
||||
<string name="findmyphone_found">Encontrado</string>
|
||||
<string name="findmyphone_found">Encontrei</string>
|
||||
<string name="open">Abrir</string>
|
||||
<string name="close">Fechar</string>
|
||||
<string name="plugins_need_permission">Alguns \'plugins\' precisam de permissões para funcionar (toque para mais informações):</string>
|
||||
@@ -243,6 +245,7 @@
|
||||
<string name="notification_channel_persistent">Indicador persistente</string>
|
||||
<string name="notification_channel_media_control">Comando multimédia</string>
|
||||
<string name="notification_channel_filetransfer">Transferência de ficheiros</string>
|
||||
<string name="notification_channel_high_priority">Alta prioridade</string>
|
||||
<string name="mpris_stop">Parar o leitor actual</string>
|
||||
<string name="copy_url_to_clipboard">Copiar o URL para a área de transferência</string>
|
||||
<string name="clipboard_toast">Copiado para a área de transferência</string>
|
||||
@@ -276,4 +279,22 @@
|
||||
<string name="no_app_for_opening">Não existe nenhuma aplicação adequada para abrir este ficheiro</string>
|
||||
<string name="remote_keyboard_service">Teclado Remoto do KDE Connect</string>
|
||||
<string name="presenter_pointer">Cursor</string>
|
||||
<string name="trusted_networks">Redes fidedignas</string>
|
||||
<string name="trusted_networks_desc">Restringir a descoberta automática às redes desconhecidas</string>
|
||||
<string name="add_trusted_network">Adicionar a %1s</string>
|
||||
<string name="empty_trusted_networks_list_text">Ainda não adicionou nenhuma rede fidedigna</string>
|
||||
<string name="allow_all_networks_text">Permitir tudo</string>
|
||||
<string name="location_permission_needed_title">É necessária a permissão</string>
|
||||
<string name="location_permission_needed_desc">O Android precisa da permissão de Localização para identificar a sua rede WiFi</string>
|
||||
<string name="clipboard_android_x_incompat">O Android 10 removeu o acesso à área de transferência para todas as aplicações. Este \'plugin\' ficará desactivado.</string>
|
||||
<string name="mpris_open_url">Continuar a tocar aqui</string>
|
||||
<string name="cant_open_url">Não é possível abrir o URL para continuar a tocar</string>
|
||||
<string name="bigscreen_home">Início</string>
|
||||
<string name="bigscreen_up">Cima</string>
|
||||
<string name="bigscreen_left">Esquerda</string>
|
||||
<string name="bigscreen_select">Seleccionar</string>
|
||||
<string name="bigscreen_right">Direita</string>
|
||||
<string name="bigscreen_down">Baixo</string>
|
||||
<string name="pref_plugin_bigscreen">Comando à distância do ecrã grande</string>
|
||||
<string name="pref_plugin_bigscreen_desc">Use o seu dispositivo como um comando à distância para o Plasma em Ecrã Grande</string>
|
||||
</resources>
|
||||
|
@@ -33,6 +33,7 @@
|
||||
<string name="pref_plugin_sharereceiver_desc">Пересылка файлов и адресов URL между устройствами</string>
|
||||
<string name="device_list_empty">Нет устройств</string>
|
||||
<string name="ok">ОК</string>
|
||||
<string name="sad_ok">ОК :(</string>
|
||||
<string name="cancel">Отмена</string>
|
||||
<string name="open_settings">Настроить</string>
|
||||
<string name="no_permissions">Нужно разрешить доступ к уведомлениям</string>
|
||||
@@ -220,6 +221,8 @@
|
||||
<string name="device_rename_confirm">Переименовать</string>
|
||||
<string name="refresh">Обновить</string>
|
||||
<string name="unreachable_description">Это сопряжённое устройство недоступно. Проверьте, что оно подключено к той же локальной сети.</string>
|
||||
<string name="no_wifi">Другие устройства недоступны, так как вы не подключены к сети Wi-Fi. Нажмите здесь для включения Wi-Fi.</string>
|
||||
<string name="on_non_trusted_message">Автоматическое обнаружение отключено, так как вы подключены к недоверенной сети.</string>
|
||||
<string name="no_file_browser">Не удалось открыть диалог выбора файла.</string>
|
||||
<string name="pref_plugin_telepathy">Отправка SMS</string>
|
||||
<string name="pref_plugin_telepathy_desc">Отправка SMS-сообщений с вашего компьютера</string>
|
||||
@@ -253,10 +256,12 @@
|
||||
<string name="addcommand_explanation2">Вы можете добавить новые команды в «Параметрах системы» в разделе «KDE Connect».</string>
|
||||
<string name="add_command_description">Команды возможно добавлять с ПК</string>
|
||||
<string name="pref_plugin_mprisreceiver">Управление мультимедиа</string>
|
||||
<string name="pref_plugin_mprisreceiver_desc">Управление воспроизведением на телефоне с другого устройства</string>
|
||||
<string name="notification_channel_default">Прочие уведомления</string>
|
||||
<string name="notification_channel_persistent">Постоянный индикатор</string>
|
||||
<string name="notification_channel_media_control">Управление воспроизведением</string>
|
||||
<string name="notification_channel_filetransfer">Передача файлов</string>
|
||||
<string name="notification_channel_high_priority">Высокий приоритет</string>
|
||||
<string name="mpris_stop">Остановить воспроизведение</string>
|
||||
<string name="copy_url_to_clipboard">Копировать URL в буфер обмена</string>
|
||||
<string name="clipboard_toast">Скопировано в буфер обмена</string>
|
||||
@@ -290,4 +295,12 @@
|
||||
<string name="no_app_for_opening">Для этого файла нет приложений, способных его открыть</string>
|
||||
<string name="remote_keyboard_service">Удалённая клавиатура KDE Connect</string>
|
||||
<string name="presenter_pointer">Указатель</string>
|
||||
<string name="trusted_networks">Доверенные сети</string>
|
||||
<string name="trusted_networks_desc">Не использовать автоматическое обнаружение в недоверенных сетях</string>
|
||||
<string name="add_trusted_network">Добавить %1s</string>
|
||||
<string name="empty_trusted_networks_list_text">Пока нет ни одной доверенной сети</string>
|
||||
<string name="allow_all_networks_text">Разрешить во всех сетях</string>
|
||||
<string name="location_permission_needed_title">Требуется разрешение</string>
|
||||
<string name="location_permission_needed_desc">Для получения сведений о Wi-Fi подключении на ОС Android требуются разрешение доступа к службе определения местоположения</string>
|
||||
<string name="clipboard_android_x_incompat">В ОС Android версии 10 для всех приложений был запрещён доступ к буферу. Этот подключаемый модуль будет отключён.</string>
|
||||
</resources>
|
||||
|
@@ -3,65 +3,66 @@
|
||||
<string name="kde_connect">KDE Connect</string>
|
||||
<string name="foreground_notification_no_devices">Nepripojené k žiadnemu zariadeniu</string>
|
||||
<string name="foreground_notification_devices">Pripojené k: %s</string>
|
||||
<string name="pref_plugin_telephony">Telefónny notifikátor</string>
|
||||
<string name="pref_plugin_telephony_desc">Poslať oznámenia pre prichádzajúce hovory</string>
|
||||
<string name="pref_plugin_battery">Oznam o batérii</string>
|
||||
<string name="pref_plugin_battery_desc">Periodicky oznamovať stav batérie</string>
|
||||
<string name="pref_plugin_sftp">Odhaliť súborový systém</string>
|
||||
<string name="pref_plugin_sftp_desc">Umožní prehliadač súborový systém zariadenia vzdialene</string>
|
||||
<string name="pref_plugin_telephony">Nástroj na upozornenie telefonátov</string>
|
||||
<string name="pref_plugin_telephony_desc">Odošle upozornenia na prichádzajúce hovory</string>
|
||||
<string name="pref_plugin_battery">Hlásenia batérie</string>
|
||||
<string name="pref_plugin_battery_desc">Pravidelne hlási stav batérie</string>
|
||||
<string name="pref_plugin_sftp">Odhalenie súborového systému</string>
|
||||
<string name="pref_plugin_sftp_desc">Umožní vzdialené prehliadanie súborového systému zariadenia</string>
|
||||
<string name="pref_plugin_clipboard">Synchronizácia schránky</string>
|
||||
<string name="pref_plugin_clipboard_desc">Zdieľať obsah schránky</string>
|
||||
<string name="pref_plugin_clipboard_desc">Zdieľa obsah schránky</string>
|
||||
<string name="pref_plugin_mousepad">Vzdialený vstup</string>
|
||||
<string name="pref_plugin_mousepad_desc">Použiť váš telefón alebo tablet ako touchpad a klávesnicu</string>
|
||||
<string name="pref_plugin_mousepad_desc">Použije váš telefón alebo tablet ako touchpad a klávesnicu</string>
|
||||
<string name="pref_plugin_presenter">Diaľkový ovládač prezentácie</string>
|
||||
<string name="pref_plugin_presenter_desc">Používajte vaše zariadenie na posúvanie stránok prezentácie</string>
|
||||
<string name="pref_plugin_remotekeyboard">Prijímať vzdialené stlačenia klávesov</string>
|
||||
<string name="pref_plugin_remotekeyboard_desc">Prjímať udalosti stlačenia kláves z diaľkových zariadení</string>
|
||||
<string name="pref_plugin_presenter_desc">Použije vaše zariadenie na zmenu snímok prezentácie</string>
|
||||
<string name="pref_plugin_remotekeyboard">Prijímanie vzdialených stlačení klávesov</string>
|
||||
<string name="pref_plugin_remotekeyboard_desc">Prijme udalosti stlačenia klávesov z diaľkových zariadení</string>
|
||||
<string name="pref_plugin_mpris">Multimediálne ovládače</string>
|
||||
<string name="pref_plugin_mpris_desc">Poskytuje vzdialené ovládanie pre váš prehrávač médií</string>
|
||||
<string name="pref_plugin_runcommand">Spustiť príkaz</string>
|
||||
<string name="pref_plugin_runcommand_desc">Vyvolať vzdialené príkazy z vášho mobilu alebo tabletu</string>
|
||||
<string name="pref_plugin_contacts">Synchronizér kontaktov</string>
|
||||
<string name="pref_plugin_contacts_desc">Povoliť synchronizáciu kontaktov zo zariadenia</string>
|
||||
<string name="pref_plugin_mpris_desc">Poskytuje diaľkové ovládanie pre váš prehrávač médií</string>
|
||||
<string name="pref_plugin_runcommand">Spustenie príkazu</string>
|
||||
<string name="pref_plugin_runcommand_desc">Vyvolá vzdialené príkazy z vášho telefónu alebo tabletu</string>
|
||||
<string name="pref_plugin_contacts">Nástroj na synchronizáciu kontaktov</string>
|
||||
<string name="pref_plugin_contacts_desc">Umožní synchronizáciu adresára kontaktov zariadenia</string>
|
||||
<string name="pref_plugin_ping">Ping</string>
|
||||
<string name="pref_plugin_ping_desc">Poslať a prijať pingy</string>
|
||||
<string name="pref_plugin_notifications">Synchronizácia pripomienok</string>
|
||||
<string name="pref_plugin_notifications_desc">Prístup k vašim pripomienkam z iných zariadení</string>
|
||||
<string name="pref_plugin_receive_notifications">Prijať upozornenia</string>
|
||||
<string name="pref_plugin_receive_notifications_desc">Prístup k pripomienkam z iných zariadení a zobrazenie ich na Androide</string>
|
||||
<string name="pref_plugin_sharereceiver">Zdieľať a prijať</string>
|
||||
<string name="pref_plugin_sharereceiver_desc">Zdieľať súbory a medzi zariadeniami</string>
|
||||
<string name="pref_plugin_ping_desc">Odošle a prijme signály ping</string>
|
||||
<string name="pref_plugin_notifications">Synchronizácia upozornení</string>
|
||||
<string name="pref_plugin_notifications_desc">Umožní prístup k vašim upozorneniam iných zariadení</string>
|
||||
<string name="pref_plugin_receive_notifications">Prijímanie upozornení</string>
|
||||
<string name="pref_plugin_receive_notifications_desc">Prijme upozornenia z iného zariadenia a zobrazí ich v systéme Android</string>
|
||||
<string name="pref_plugin_sharereceiver">Zdieľanie a prijímanie</string>
|
||||
<string name="pref_plugin_sharereceiver_desc">Zdieľa súbory a URL medzi zariadeniami</string>
|
||||
<string name="device_list_empty">Žiadne zariadenia</string>
|
||||
<string name="ok">OK</string>
|
||||
<string name="sad_ok">OK :(</string>
|
||||
<string name="cancel">Zrušiť</string>
|
||||
<string name="open_settings">Otvoriť nastavenia</string>
|
||||
<string name="no_permissions">Musíte povoliť oprávnenia na prístup k pripomienkam</string>
|
||||
<string name="no_permission_mprisreceiver">Aby ste mohli ovládať prehrávače médií musíte udeliť oprávnenie pristupovať k oznámeniam.</string>
|
||||
<string name="no_permissions_remotekeyboard">Ak chcete prijímať stlačenia klávesov, musíte aktivovať KDE Connect Vzdialená Klávesnica</string>
|
||||
<string name="send_ping">Poslať ping</string>
|
||||
<string name="no_permissions">Musíte udeliť oprávnenia na prístup k upozorneniam</string>
|
||||
<string name="no_permission_mprisreceiver">Aby ste mohli ovládať multimediálne prehrávače, musíte udeliť prístup k upozorneniam</string>
|
||||
<string name="no_permissions_remotekeyboard">Na prijímanie stlačenia klávesov, musíte aktivovať vzdialenú klávesnicu aplikácie KDE Connect</string>
|
||||
<string name="send_ping">Odoslať ping</string>
|
||||
<string name="open_mpris_controls">Multimediálny ovládač</string>
|
||||
<string name="remotekeyboard_editing_only_title">Spracovať vzdialené klávesy iba počas upravovania</string>
|
||||
<string name="remotekeyboard_not_connected">Nie je dostupné žiadne aktívne pripojenie ku klávesnici, nastavte ho v kdeconnect</string>
|
||||
<string name="remotekeyboard_connected">Pripojenie ku vzdialenej klávesnici je aktívne</string>
|
||||
<string name="remotekeyboard_multiple_connections">Je dostupných viac vzdialených klávesníc, vyberte jednu na nastavenie</string>
|
||||
<string name="remotekeyboard_not_connected">Nie je žiadne aktívne pripojenie k vzdialenej klávesnici. Vytvorte nejaké v aplikácii kdeconnect</string>
|
||||
<string name="remotekeyboard_connected">Pripojenie k vzdialenej klávesnici je aktívne</string>
|
||||
<string name="remotekeyboard_multiple_connections">Je dostupných viac pripojení k vzdialeným klávesniciam, vyberte zariadenie na nastavenie</string>
|
||||
<string name="open_mousepad">Vzdialený vstup</string>
|
||||
<string name="mousepad_info">Posúvajte prst na obrazovke na posun kurzora. Ťuknutie vyvolá klik a použite dva/tri prsty pre pravé a stredné tlačidlo. Použite dva prsty na posúvanie. Použite dlhé stlačenie pre drag and drop.</string>
|
||||
<string name="mousepad_double_tap_settings_title">Nastaviť akciu dvoch prstov</string>
|
||||
<string name="mousepad_triple_tap_settings_title">Nastaviť akciu troch prstov</string>
|
||||
<string name="mousepad_info">Posúvajte prst na obrazovke pre pohyb kurzorom. Ťuknutím kliknete a použitím dvoch/troch prstov stlačíte pravé a stredné tlačidlo. Použitím dvoch prstov rolujete. Použite dlhého stlačenia vykonáte ťahanie a spustenie.</string>
|
||||
<string name="mousepad_double_tap_settings_title">Nastaviť akciu po ťuknutí dvoma prstami</string>
|
||||
<string name="mousepad_triple_tap_settings_title">Nastaviť akciu po ťuknutí troma prstami</string>
|
||||
<string name="mousepad_sensitivity_settings_title">Nastaviť citlivosť touchpadu</string>
|
||||
<string name="mousepad_acceleration_profile_settings_title">Nastaviť zrýchlenie ukazovateľa</string>
|
||||
<string name="mousepad_scroll_direction_title">Obrátený smer rolovania</string>
|
||||
<string name="mousepad_scroll_direction_title">Obrátiť smer rolovania</string>
|
||||
<string-array name="mousepad_tap_entries">
|
||||
<item>Kliknutie pravým tlačidlom</item>
|
||||
<item>Stredný klik</item>
|
||||
<item>Nič</item>
|
||||
<item>Kliknutie stredným tlačidlom</item>
|
||||
<item>Žiadna</item>
|
||||
</string-array>
|
||||
<string-array name="mousepad_sensitivity_entries">
|
||||
<item>Najpomalšie</item>
|
||||
<item>Nad najpomalším</item>
|
||||
<item>Predvolené</item>
|
||||
<item>Nad priemerným</item>
|
||||
<item>Najrýchlejšie</item>
|
||||
<item>Najpomalšia</item>
|
||||
<item>Pomalá</item>
|
||||
<item>Predvolená</item>
|
||||
<item>Rýchla</item>
|
||||
<item>Najrýchlejšia</item>
|
||||
</string-array>
|
||||
<string-array name="mousepad_acceleration_profile_entries">
|
||||
<item>Žiadne zrýchlenie</item>
|
||||
@@ -74,26 +75,26 @@
|
||||
<string name="category_connected_devices">Pripojené zariadenia</string>
|
||||
<string name="category_not_paired_devices">Dostupné zariadenia</string>
|
||||
<string name="category_remembered_devices">Zapamätané zariadenia</string>
|
||||
<string name="device_menu_plugins">Nastavenia pluginu</string>
|
||||
<string name="device_menu_unpair">Odpárovať</string>
|
||||
<string name="device_menu_plugins">Nastavenia zás. modulu</string>
|
||||
<string name="device_menu_unpair">Zrušiť párovanie</string>
|
||||
<string name="pair_new_device">Spárovať nové zariadenie</string>
|
||||
<string name="unknown_device">Neznáme zariadenie</string>
|
||||
<string name="error_not_reachable">Zariadenie nedostupné</string>
|
||||
<string name="error_already_paired">Zariadenie už spárované</string>
|
||||
<string name="error_could_not_send_package">Nemôžem poslať balík</string>
|
||||
<string name="error_not_reachable">Zariadenie nie je dosiahnuteľné</string>
|
||||
<string name="error_already_paired">Zariadenie je už spárované</string>
|
||||
<string name="error_could_not_send_package">Nepodarilo sa odoslať balík</string>
|
||||
<string name="error_timed_out">Čas vypršal</string>
|
||||
<string name="error_canceled_by_user">Zrušené používateľom</string>
|
||||
<string name="error_canceled_by_other_peer">Zrušené iným klientom</string>
|
||||
<string name="encryption_info_title">Informácia o šifrovaní</string>
|
||||
<string name="encryption_info_msg_no_ssl">Ďalšie zariadenie nepoužíva aktuálnu verziu KDE Connect, používam klasickú metódu šifrovania.</string>
|
||||
<string name="my_device_fingerprint">Odtlačok SHA1 vášho certifikátu zariadenia je:</string>
|
||||
<string name="remote_device_fingerprint">Odtlačok SHA1 vzdialeného certifikátu zariadenia je:</string>
|
||||
<string name="error_canceled_by_other_peer">Zrušené druhým účastníkom</string>
|
||||
<string name="encryption_info_title">Informácie o šifrovaní</string>
|
||||
<string name="encryption_info_msg_no_ssl">Druhé zariadenie nepoužíva najnovšiu verziu aplikácie KDE Connect. Použije sa zastaralý spôsob šifrovania.</string>
|
||||
<string name="my_device_fingerprint">Odtlačok SHA1 certifikátu vášho zariadenia je:</string>
|
||||
<string name="remote_device_fingerprint">Odtlačok SHA1 certifikátu vzdialeného zariadenia je:</string>
|
||||
<string name="pair_requested">Spárovanie vyžiadané</string>
|
||||
<string name="pairing_request_from">Požiadavka na spárovanie od %1s</string>
|
||||
<string name="pairing_request_from">Požiadavka na spárovanie zo zariadenia %1s</string>
|
||||
<plurals name="incoming_file_title">
|
||||
<item quantity="one">Prijímam %1$d súbor z %2$s</item>
|
||||
<item quantity="few">Prijímam %1$d súbory z %2$s</item>
|
||||
<item quantity="many">Prijímam %1$d súborov z %2$s</item>
|
||||
<item quantity="one">Prijíma sa %1$d súbor z %2$s</item>
|
||||
<item quantity="few">Prijímajú sa %1$d súbory z %2$s</item>
|
||||
<item quantity="many">Prijíma sa %1$d súborov z %2$s</item>
|
||||
<item quantity="other"/>
|
||||
</plurals>
|
||||
<plurals name="incoming_files_text">
|
||||
@@ -103,9 +104,9 @@
|
||||
<item quantity="other"/>
|
||||
</plurals>
|
||||
<plurals name="outgoing_file_title">
|
||||
<item quantity="one">Posielam %1$d súbor do %2$s</item>
|
||||
<item quantity="few">Posielam %1$d súbory do %2$s</item>
|
||||
<item quantity="many">Posielam %1$d súborov do %2$s</item>
|
||||
<item quantity="one">Odosiela sa %1$d súbor do zariadenia %2$s</item>
|
||||
<item quantity="few">Odosielajú sa %1$d súbory do zariadenia %2$s</item>
|
||||
<item quantity="many">Odosiela sa %1$d súborov do zariadenia %2$s</item>
|
||||
<item quantity="other"/>
|
||||
</plurals>
|
||||
<plurals name="outgoing_files_text">
|
||||
@@ -115,37 +116,37 @@
|
||||
<item quantity="other"/>
|
||||
</plurals>
|
||||
<plurals name="received_files_title">
|
||||
<item quantity="one">Prijatý súbor od %1$s</item>
|
||||
<item quantity="few">Prijaté %2$d súbory od %1$s</item>
|
||||
<item quantity="many">Prijatých %2$d súborov od %1$s</item>
|
||||
<item quantity="one">Prijatý súbor zo zariadenia %1$s</item>
|
||||
<item quantity="few">Prijaté %2$d súbory zo zariadenia %1$s</item>
|
||||
<item quantity="many">Prijatých %2$d súborov zo zariadenia %1$s</item>
|
||||
<item quantity="other"/>
|
||||
</plurals>
|
||||
<plurals name="received_files_fail_title">
|
||||
<item quantity="one">Zlyhalo prijatie súboru od %1$s</item>
|
||||
<item quantity="few">Zlyhalo prijatie %2$d z %3$d súborov od %1$s</item>
|
||||
<item quantity="many">Zlyhalo prijatie %2$d z %3$d súborov od %1$s</item>
|
||||
<item quantity="one">Zlyhalo prijatie súboru zo zariadenia %1$s</item>
|
||||
<item quantity="few">Zlyhalo prijatie %2$d súborov z %3$d zo zariadenia %1$s</item>
|
||||
<item quantity="many">Zlyhalo prijatie %2$d súborov z %3$d zo zariadenia %1$s</item>
|
||||
<item quantity="other"/>
|
||||
</plurals>
|
||||
<plurals name="sent_files_title">
|
||||
<item quantity="one">Poslať súbor do %1$s</item>
|
||||
<item quantity="few">Poslať %2$d súbory do %1$s</item>
|
||||
<item quantity="many">Poslať %2$d súborov do %1$s</item>
|
||||
<item quantity="one">Odoslaný súbor do zariadenia %1$s</item>
|
||||
<item quantity="few">Odoslané %2$d súbory do zariadenia %1$s</item>
|
||||
<item quantity="many">Odoslaných %2$d súborov do zariadenia %1$s</item>
|
||||
<item quantity="other"/>
|
||||
</plurals>
|
||||
<plurals name="send_files_fail_title">
|
||||
<item quantity="one">Zlyhalo odoslanie súboru do %1$s</item>
|
||||
<item quantity="few">Zlyhalo odoslanie %2$d z %3$d súborov do %1$s</item>
|
||||
<item quantity="many">Zlyhalo odoslanie %2$d z %3$d súborov do %1$s</item>
|
||||
<item quantity="one">Zlyhalo odoslanie súboru do zariadenia %1$s</item>
|
||||
<item quantity="few">Zlyhalo odoslanie %2$d súborov z %3$d do zariadenia %1$s</item>
|
||||
<item quantity="many">Zlyhalo odoslanie %2$d súborov z %3$d do zariadenia %1$s</item>
|
||||
<item quantity="other"/>
|
||||
</plurals>
|
||||
<string name="received_file_text">Ťuknite na otvorenie \'%1s\'</string>
|
||||
<string name="cannot_create_file">Nomožno vytvoriť súbor %s</string>
|
||||
<string name="tap_to_answer">Tapnite na odpoveď</string>
|
||||
<string name="right_click">Poslať kliknutie pravým</string>
|
||||
<string name="middle_click">Poslať kliknutie stredným</string>
|
||||
<string name="received_file_text">Ťuknutím otvoríte súbor \"%1s\"</string>
|
||||
<string name="cannot_create_file">Nedá sa vytvoriť súbor %s</string>
|
||||
<string name="tap_to_answer">Ťuknutím odpoviete</string>
|
||||
<string name="right_click">Odoslať kliknutie pravým tlačidlom</string>
|
||||
<string name="middle_click">Odoslať kliknutie stredným tlačidlom</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="device_not_paired">Zariadenie nie je spárované</string>
|
||||
<string name="request_pairing">Požiadať o spárovanie</string>
|
||||
<string name="pairing_accept">Prijať</string>
|
||||
<string name="pairing_reject">Odmietnuť</string>
|
||||
<string name="settings">Nastavenia</string>
|
||||
@@ -156,8 +157,8 @@
|
||||
<string name="mpris_ff">Pretočiť dopredu</string>
|
||||
<string name="mpris_next">Nasledovné</string>
|
||||
<string name="mpris_volume">Hlasitosť</string>
|
||||
<string name="mpris_time_settings_title">Tlačidlá dopredu/pretočiť</string>
|
||||
<string name="mpris_time_settings_summary">Prispôsobiť čas na pretáčanie dopredu alebo dozadu pri stlačení</string>
|
||||
<string name="mpris_time_settings_title">Tlačidlá pretočenia dopredu/dozadu</string>
|
||||
<string name="mpris_time_settings_summary">Upraviť čas pretáčania dopredu/dozadu po stlačení tlačidla</string>
|
||||
<string-array name="mpris_time_entries">
|
||||
<item>10 sekúnd</item>
|
||||
<item>20 sekúnd</item>
|
||||
@@ -165,130 +166,151 @@
|
||||
<item>1 minúta</item>
|
||||
<item>2 minúty</item>
|
||||
</string-array>
|
||||
<string name="mpris_notification_settings_title">Zobraziť oznámenie ovládania médií</string>
|
||||
<string name="mpris_notification_settings_summary">Povoliť ovládanie vaších prehrávačov médií bez otvárania KDE Connect</string>
|
||||
<string name="mpris_notification_settings_title">Zobraziť upozornenie ovládania médií</string>
|
||||
<string name="mpris_notification_settings_summary">Umožní ovládanie vašich multimediálnych prehrávačov bez otvorenia aplikácie KDE Connect</string>
|
||||
<string name="share_to">Zdieľať do...</string>
|
||||
<string name="protocol_version_newer">Toto zariadenie používa novšiu verziu protokolu</string>
|
||||
<string name="plugin_settings_with_name">%s nastavenia</string>
|
||||
<string name="plugin_settings_with_name">Nastavenia modulu %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="custom_devices_settings">Zoznam vlastných zariadení</string>
|
||||
<string name="custom_device_list">Pridať zariadenia podľa IP</string>
|
||||
<string name="custom_device_deleted">Odstránené vlastné zariadenie</string>
|
||||
<string name="custom_device_list_help">Ak vaše zariadenie nie je automaticky zistené, môžete pridať jeho IP adresu alebo názov hostiteľa kliknutím na plávajúce tlačidlo</string>
|
||||
<string name="custom_device_list">Pridať zariadenia podľa adries IP</string>
|
||||
<string name="custom_device_deleted">Vlastné zariadenie odstránené</string>
|
||||
<string name="custom_device_list_help">Ak vaše zariadenie nie je automaticky zistené, môžete pridať jeho adresu IP alebo názov hostiteľa kliknutím na plávajúce tlačidlo</string>
|
||||
<string name="custom_device_fab_hint">Pridať zariadenie</string>
|
||||
<string name="undo">Vrátiť</string>
|
||||
<string name="share_notification_preference">Hlučné pripomienky</string>
|
||||
<string name="undo">Vrátiť späť</string>
|
||||
<string name="share_notification_preference">Hlučné upozornenia</string>
|
||||
<string name="share_notification_preference_summary">Vibrovať a prehrať zvuk pri prijatí súboru</string>
|
||||
<string name="share_destination_customize">Prispôsobiť cieľový priečinok</string>
|
||||
<string name="share_destination_customize_summary_disabled">Prijaté súbory sa objavia v priečinku Stiahnuté</string>
|
||||
<string name="share_destination_customize_summary_enabled">Súbory budú uložené v priečinku nižšie</string>
|
||||
<string name="share_destination_folder_preference">Cieľový priečinok</string>
|
||||
<string name="share">Zdieľať</string>
|
||||
<string name="share_received_file">Zdiaľať \"%s\"</string>
|
||||
<string name="share_received_file">Zdieľať súbor \"%s\"</string>
|
||||
<string name="title_activity_notification_filter">Filter upozornení</string>
|
||||
<string name="filter_apps_info">Upozornenia budú synchronizované pre vybrané aplikácie.</string>
|
||||
<string name="sftp_sdcard_num">SD karta %d</string>
|
||||
<string name="sftp_sdcard">SD karta</string>
|
||||
<string name="filter_apps_info">Pre vybrané aplikácie budú synchronizované upozornenia.</string>
|
||||
<string name="sftp_sdcard_num">Karta SD %d</string>
|
||||
<string name="sftp_sdcard">Karta SD</string>
|
||||
<string name="sftp_readonly">(iba na čítanie)</string>
|
||||
<string name="sftp_camera">Obrázky fotoaparátu</string>
|
||||
<string name="add_device_dialog_title">Pridať zariadenie</string>
|
||||
<string name="add_device_hint">Hostiteľ alebo IP adresa</string>
|
||||
<string name="sftp_preference_detected_sdcards">Rozpoznané SD karty</string>
|
||||
<string name="sftp_preference_edit_sdcard_title">Upraviť SD kartu</string>
|
||||
<string name="sftp_preference_configured_storage_locations">Nastavené umiestnenia úložiska</string>
|
||||
<string name="add_device_dialog_title">Pridanie zariadenia</string>
|
||||
<string name="add_device_hint">Názov hostiteľa alebo adresa IP</string>
|
||||
<string name="sftp_preference_detected_sdcards">Rozpoznané karty SD</string>
|
||||
<string name="sftp_preference_edit_sdcard_title">Upraviť kartu SD</string>
|
||||
<string name="sftp_preference_configured_storage_locations">Nastavené umiestnenia úložísk</string>
|
||||
<string name="sftp_preference_add_storage_location_title">Pridať umiestnenie úložiska</string>
|
||||
<string name="sftp_preference_edit_storage_location">Upraviť umiestnenie úložiska</string>
|
||||
<string name="sftp_preference_add_camera_shortcut">Pridať skratku na priečinok s fotkami</string>
|
||||
<string name="sftp_preference_add_camera_shortcut_summary_on">Pridať skratku na priečinok s fotkami</string>
|
||||
<string name="sftp_preference_add_camera_shortcut_summary_off">Nepridávať skratku na priečinok s fotkami</string>
|
||||
<string name="sftp_storage_preference_storage_location">umiestnenie úložiska</string>
|
||||
<string name="sftp_storage_preference_storage_location_already_configured">toto umiestnenie už bolo nastavené</string>
|
||||
<string name="sftp_storage_preference_click_to_select">kliknite na výber</string>
|
||||
<string name="sftp_storage_preference_display_name">Zobraziť meno</string>
|
||||
<string name="sftp_preference_add_camera_shortcut">Pridať odkaz na priečinok fotoaparátu</string>
|
||||
<string name="sftp_preference_add_camera_shortcut_summary_on">Pridá odkaz na priečinok fotoaparátu</string>
|
||||
<string name="sftp_preference_add_camera_shortcut_summary_off">Nepridá odkaz na priečinok fotoaparátu</string>
|
||||
<string name="sftp_storage_preference_storage_location">Umiestnenie úložiska</string>
|
||||
<string name="sftp_storage_preference_storage_location_already_configured">Toto umiestnenie už bolo nastavené</string>
|
||||
<string name="sftp_storage_preference_click_to_select">Kliknutím vyberiete</string>
|
||||
<string name="sftp_storage_preference_display_name">Zobraziť názov</string>
|
||||
<string name="sftp_storage_preference_display_name_already_used">Tento zobrazovaný názov už je použitý</string>
|
||||
<string name="sftp_storage_preference_display_name_cannot_be_empty">Zobrazovaný názov nemôže byť prázdny</string>
|
||||
<string name="sftp_action_mode_menu_delete">Vymazať</string>
|
||||
<string name="sftp_no_sdcard_detected">Nebola rozpoznaná žiadna SD karta</string>
|
||||
<string name="sftp_no_storage_locations_configured">Žiadne umiestnenia úložiska nastavené</string>
|
||||
<string name="sftp_saf_permission_explanation">Na vzdialený prístup k súborom musíte nastaviť umiestnenia úložiska</string>
|
||||
<string name="sftp_action_mode_menu_delete">Odstrániť</string>
|
||||
<string name="sftp_no_sdcard_detected">Nebola rozpoznaná žiadna karta SD</string>
|
||||
<string name="sftp_no_storage_locations_configured">Nie sú nastavené žiadne umiestnenia úložísk</string>
|
||||
<string name="sftp_saf_permission_explanation">Na vzdialený prístup k súborom musíte nastaviť umiestnenia úložísk</string>
|
||||
<string name="no_players_connected">Nenašli sa žiadne prehrávače</string>
|
||||
<string name="send_files">Odoslať súbory</string>
|
||||
<string name="pairing_title">KDE Connect zariadenia</string>
|
||||
<string name="pairing_description">Iné zariadenie so spusteným KDE Connect v rovnakej sieti by sa tu mali objaviť.</string>
|
||||
<string name="device_rename_title">Premenovať zariadenie</string>
|
||||
<string name="pairing_title">Zariadenia aplikácie KDE Connect</string>
|
||||
<string name="pairing_description">Tu by sa mali objaviť iné zariadenie so spustenou aplikáciou KDE Connect v rovnakej sieti.</string>
|
||||
<string name="device_rename_title">Premenovanie zariadenia</string>
|
||||
<string name="device_rename_confirm">Premenovať</string>
|
||||
<string name="refresh">Obnoviť</string>
|
||||
<string name="unreachable_description">Toto spárované zariadenie nie je dosiahnuteľné. Prosím, uistite sa, že je pripojené do rovnakej siete.</string>
|
||||
<string name="unreachable_description">Toto spárované zariadenie nie je dosiahnuteľné. Prosím, uistite sa, že je pripojené k rovnakej sieti ako vy.</string>
|
||||
<string name="no_wifi">Nie ste pripojení k sieti Wi-Fi, takže pravdepodobne nebudete môcť vidieť žiadne zariadenia. Kliknutím sem povolíte pripojenie Wi-Fi.</string>
|
||||
<string name="on_non_trusted_message">Pripojené k nedôveryhodnej sieti: automatické objavovanie je zakázané.</string>
|
||||
<string name="no_file_browser">Nie sú nainštalované žiadne prehliadače.</string>
|
||||
<string name="pref_plugin_telepathy">Poslať SMS</string>
|
||||
<string name="pref_plugin_telepathy_desc">Posielať textové správy z vášho počítača</string>
|
||||
<string name="pref_plugin_telepathy">Odoslať SMS</string>
|
||||
<string name="pref_plugin_telepathy_desc">Odosielanie textových správ z vášho počítača</string>
|
||||
<string name="findmyphone_title">Nájsť môj telefón</string>
|
||||
<string name="findmyphone_title_tablet">Nájsť môj tablet</string>
|
||||
<string name="findmyphone_title_tv">Nájsť môj TV</string>
|
||||
<string name="findmyphone_description">Prezvoní vaše zariadenie, aby ste ho našli</string>
|
||||
<string name="findmyphone_title_tv">Nájsť môj televízor</string>
|
||||
<string name="findmyphone_description">Prezvoní toto zariadenie, aby ste ho mohli nájsť</string>
|
||||
<string name="findmyphone_found">Nájdené</string>
|
||||
<string name="open">Otvoriť</string>
|
||||
<string name="close">Zavrieť</string>
|
||||
<string name="plugins_need_permission">Niektoré Pluginy potrebujú oprávnenia aby fungovali (ťuknite pre viac info):</string>
|
||||
<string name="permission_explanation">Tento plugin potrebuje oprávnenia aby fungoval</string>
|
||||
<string name="optional_permission_explanation">Musíte povoliť oprávnenia na povolenie všetkých funkcií</string>
|
||||
<string name="plugins_need_optional_permission">Niektoré pluginy majú zakázané funkcie pre nedostatok opránení (ťuknite pre viac info):</string>
|
||||
<string name="share_optional_permission_explanation">Na zdieľanie súborov medzi vašim telefónom a počítačom potrebujete dať prístup k úložisku telefónu</string>
|
||||
<string name="telepathy_permission_explanation">Na čítanie a písanie SMS z vašeho počítača, potrebujete dať oprávnienie na SMS</string>
|
||||
<string name="telephony_permission_explanation">Aby ste videli telefónne hovory z počítača, potrebujete dať oprávnenie na zoznamy hovorov a stav telefónu</string>
|
||||
<string name="telephony_optional_permission_explanation">Aby ste videli meno kontaktu namiesto čísla, potrebujete dať oprávnenie na telefónne kontakty</string>
|
||||
<string name="contacts_permission_explanation">Na zdieľanie kontaktov s počítačom, potrebujete dať oprávnenie na kontakty</string>
|
||||
<string name="select_ringtone">Nastaviť tón zvonenia</string>
|
||||
<string name="plugins_need_permission">Niektoré zásuvné moduly vyžadujú oprávnenia, aby mohli fungovať (ťuknutím získate viac informácií):</string>
|
||||
<string name="permission_explanation">Tento zásuvný modul vyžaduje oprávnenie, aby mohol fungovať</string>
|
||||
<string name="optional_permission_explanation">Musíte udeliť oprávnenia navyše, aby boli povolené všetky funkcie</string>
|
||||
<string name="plugins_need_optional_permission">Niektoré zásuvné moduly majú zakázané funkcie, pretože im chýbajú oprávnenia (ťuknutím získate viac informácií):</string>
|
||||
<string name="share_optional_permission_explanation">Na zdieľanie súborov medzi vašim telefónom a počítačom, musíte udeliť prístup k úložisku telefónu</string>
|
||||
<string name="telepathy_permission_explanation">Na čítanie a písanie SMS z vášho počítača, musíte udeliť oprávnenie k správam SMS</string>
|
||||
<string name="telephony_permission_explanation">Na prezeranie telefónnych hovorov z vášho počítača, musíte udeliť oprávnenie k záznamom hovorov a stavu telefónu</string>
|
||||
<string name="telephony_optional_permission_explanation">Na prezeranie mien kontaktov namiesto telefónnych čísel, musíte udeliť prístup k telefónnym kontaktom</string>
|
||||
<string name="contacts_permission_explanation">Na zdieľanie vášho adresára kontaktov s počítačom, musíte udeliť oprávnenie ku kontaktom</string>
|
||||
<string name="select_ringtone">Vybrať zvonenie</string>
|
||||
<string name="telephony_pref_blocked_title">Blokované čísla</string>
|
||||
<string name="telephony_pref_blocked_dialog_desc">Nezobrazovať hovory a SMS z týchto čísel. Prosím upresnite jedno číslo na riadok</string>
|
||||
<string name="mpris_coverart_description">Obal aktuáneho média</string>
|
||||
<string name="telephony_pref_blocked_dialog_desc">Z týchto čísel sa nebudú zobrazovať hovori ani správy SMS. Prosím, určte jedno číslo na riadok</string>
|
||||
<string name="mpris_coverart_description">Obrázok obalu aktuálneho média</string>
|
||||
<string name="device_icon_description">Ikona zariadenia</string>
|
||||
<string name="settings_icon_description">Ikona Nastavení</string>
|
||||
<string name="presenter_fullscreen">Celá obrazovka</string>
|
||||
<string name="settings_icon_description">Ikona nastavení</string>
|
||||
<string name="presenter_fullscreen">Na celú obrazovku</string>
|
||||
<string name="presenter_exit">Ukončiť prezentáciu</string>
|
||||
<string name="presenter_lock_tip">Môžete zamknúť vaše zariadenie a používať tlačidlá hlasitosti na prechod medzi snímkami</string>
|
||||
<string name="presenter_lock_tip">Môžete uzamknúť vaše zariadenie a použiť klávesy hlasitosti na prechod na predchádzajúci a nasledujúci snímok</string>
|
||||
<string name="add_command">Pridať príkaz</string>
|
||||
<string name="addcommand_explanation">Nie sú registrované žiadne príkazy</string>
|
||||
<string name="addcommand_explanation2">Môžete pridať nové príkazy v KDE Connect systémových nastaveniach</string>
|
||||
<string name="addcommand_explanation2">Môžete pridať nové príkazy v systémových nastaveniach aplikácie KDE Connect</string>
|
||||
<string name="add_command_description">Môžete pridať príkazy na počítači</string>
|
||||
<string name="pref_plugin_mprisreceiver">Multimediálny ovládač</string>
|
||||
<string name="pref_plugin_mprisreceiver_desc">Ovláda multimediálne prehrávače vášho telefónu z iného zariadenia</string>
|
||||
<string name="notification_channel_default">Ostatné upozornenia</string>
|
||||
<string name="notification_channel_persistent">Trvalý indikátor</string>
|
||||
<string name="notification_channel_media_control">Multimediálny ovládač</string>
|
||||
<string name="notification_channel_filetransfer">Prenos súborov</string>
|
||||
<string name="notification_channel_high_priority">Vysoká priorita</string>
|
||||
<string name="mpris_stop">Zastaviť aktuálny prehrávač</string>
|
||||
<string name="copy_url_to_clipboard">Kopírovať adresu do schránky</string>
|
||||
<string name="copy_url_to_clipboard">Kopírovať URL do schránky</string>
|
||||
<string name="clipboard_toast">Uložené do schránky</string>
|
||||
<string name="runcommand_notreachable">Zariadenie nedostupné</string>
|
||||
<string name="runcommand_notpaired">Zariadenie nespárované</string>
|
||||
<string name="runcommand_nosuchdevice">Zadané zariadenie neexistuje</string>
|
||||
<string name="runcommand_noruncommandplugin">Toto zariadenie nemá povolený plugin na Spustenie príkazu</string>
|
||||
<string name="pref_plugin_findremotedevice">Nájsť vzdialené zariadenie</string>
|
||||
<string name="pref_plugin_findremotedevice_desc">Zazvoniť na vzdialenom zariadení</string>
|
||||
<string name="runcommand_notreachable">Zariadenie nie je dosiahnuteľné</string>
|
||||
<string name="runcommand_notpaired">Zariadenie nie je spárované</string>
|
||||
<string name="runcommand_nosuchdevice">Neexistuje žiadne zariadenie</string>
|
||||
<string name="runcommand_noruncommandplugin">Toto zariadenie nemá povolený zásuvný modul spustenia príkazu</string>
|
||||
<string name="pref_plugin_findremotedevice">Nájdenie vzdialeného zariadenia</string>
|
||||
<string name="pref_plugin_findremotedevice_desc">Zazvoní na vašom vzdialenom zariadení</string>
|
||||
<string name="ring">Zazvoniť</string>
|
||||
<string name="pref_plugin_systemvolume">Systémová hlasitosť</string>
|
||||
<string name="pref_plugin_systemvolume_desc">Ovládať systémovú hlasitosť vzdialeného zariadenia</string>
|
||||
<string name="pref_plugin_systemvolume_desc">Ovláda systémovú hlasitosť vzdialeného zariadenia</string>
|
||||
<string name="mute">Stlmiť</string>
|
||||
<string name="all">Všetko</string>
|
||||
<string name="devices">Zariadenia</string>
|
||||
<string name="settings_rename">Názov zariadenia</string>
|
||||
<string name="settings_dark_mode">Tmavá téma</string>
|
||||
<string name="settings_dark_mode">Tmavý motív</string>
|
||||
<string name="settings_more_settings_title">Viac nastavení</string>
|
||||
<string name="settings_more_settings_text">Nstavenia pre konkrétne zariadenia sú dostupné v \"Nastaveniach pluginu\" na zariadení.</string>
|
||||
<string name="settings_more_settings_text">Nastavenia zariadenia môžete nájsť v ponuke \"Nastavenia zás. modulov\" pri každom zariadení</string>
|
||||
<string name="setting_persistent_notification">Zobrazovať trvalé oznámenie</string>
|
||||
<string name="setting_persistent_notification_oreo">Trvalé oznámenie</string>
|
||||
<string name="setting_persistent_notification_description">Ťuknite na zapnutie/vypnutie v Nastaveniach oznámení</string>
|
||||
<string name="extra_options">Ďalšie možnosti</string>
|
||||
<string name="privacy_options">Možnosti súkromia</string>
|
||||
<string name="set_privacy_options">Nastavte vaše súkromie</string>
|
||||
<string name="block_contents">Blokovať obsah oznámení</string>
|
||||
<string name="block_images">Blokovať obrázky v oznámeniach</string>
|
||||
<string name="notification_channel_receivenotification">Oznámenia iných zariadení</string>
|
||||
<string name="take_picture">Spustiť fotoaparát</string>
|
||||
<string name="plugin_photo_desc">Spustiť aplikáciu fotoaparátu na uľahčenie snímania a prenosu obrázkov</string>
|
||||
<string name="setting_persistent_notification_description">Ťuknutím povolíte/zakážete nastavenia v upozornení</string>
|
||||
<string name="extra_options">Voľby navyše</string>
|
||||
<string name="privacy_options">Voľby súkromia</string>
|
||||
<string name="set_privacy_options">Nastavte voľby vášho súkromia</string>
|
||||
<string name="block_contents">Blokovať obsah upozornení</string>
|
||||
<string name="block_images">Blokovať obrázky v upozorneniach</string>
|
||||
<string name="notification_channel_receivenotification">Upozornenia z iných zariadení</string>
|
||||
<string name="take_picture">Spustenie fotoaparátu</string>
|
||||
<string name="plugin_photo_desc">Spustí aplikáciu fotoaparátu na uľahčenie zachytenia a prenosu obrázkov</string>
|
||||
<string name="no_app_for_opening">Nenašla sa vhodná aplikácia na otvorenie tohto súboru</string>
|
||||
<string name="remote_keyboard_service">KDE Connect Vzdialená Klávesnica</string>
|
||||
<string name="presenter_pointer">Ukazovateľ</string>
|
||||
<string name="trusted_networks">Dôveryhodné siete</string>
|
||||
<string name="trusted_networks_desc">Obmedzí automatické objavovanie iba na známe siete</string>
|
||||
<string name="add_trusted_network">Pridať sieť %1s</string>
|
||||
<string name="empty_trusted_networks_list_text">Zatiaľ ste nepridali žiadnu dôveryhodnú sieť</string>
|
||||
<string name="allow_all_networks_text">Povoliť všetky</string>
|
||||
<string name="location_permission_needed_title">Potrebné oprávnenia</string>
|
||||
<string name="location_permission_needed_desc">Systém Android vyžaduje oprávnenia k umiestneniu kvôli identifikácie vašej siete WiFi</string>
|
||||
<string name="clipboard_android_x_incompat">V systéme Android 10 je odstránený prístup k schránke pre všetky aplikácie. Tento zásuvný modul bude zakázaný.</string>
|
||||
<string name="mpris_open_url">Pokračovať v prehrávaní tu</string>
|
||||
<string name="cant_open_url">Nedá sa otvoriť URL pre pokračovanie v prehrávaní</string>
|
||||
<string name="bigscreen_home">Domov</string>
|
||||
<string name="bigscreen_up">Hore</string>
|
||||
<string name="bigscreen_left">Doľava</string>
|
||||
<string name="bigscreen_select">Vybrať</string>
|
||||
<string name="bigscreen_right">Doprava</string>
|
||||
<string name="bigscreen_down">Dole</string>
|
||||
<string name="pref_plugin_bigscreen">Diaľkové ovládanie obrazovky Bigscreen</string>
|
||||
<string name="pref_plugin_bigscreen_desc">Použije vaše zariadenie ako diaľkové ovládanie obrazovky Plasma Bigscreen</string>
|
||||
</resources>
|
||||
|
@@ -33,6 +33,7 @@
|
||||
<string name="pref_plugin_sharereceiver_desc">Dela filer och webbadresser mellan apparater</string>
|
||||
<string name="device_list_empty">Inga apparater</string>
|
||||
<string name="ok">Ok</string>
|
||||
<string name="sad_ok">Ok</string>
|
||||
<string name="cancel">Avbryt</string>
|
||||
<string name="open_settings">Öppna inställningarna</string>
|
||||
<string name="no_permissions">Du måste ge rättighet att komma åt underrättelser</string>
|
||||
@@ -205,6 +206,7 @@
|
||||
<string name="refresh">Uppdatera</string>
|
||||
<string name="unreachable_description">Den här ihopparade apparaten kan inte nås. Försäkra dig om att den är ansluten till samma nätverk.</string>
|
||||
<string name="no_wifi">Du är inte ansluten till ett WIFI-nätverk, så du kanske inte kan se alla apparater. Klicka här för att aktivera WIFI.</string>
|
||||
<string name="on_non_trusted_message">Använder inte ett pålitligt nätverk: automatisk upptäckt är inaktiverad.</string>
|
||||
<string name="no_file_browser">Det finns inga filbläddrare installerade.</string>
|
||||
<string name="pref_plugin_telepathy">Skicka SMS</string>
|
||||
<string name="pref_plugin_telepathy_desc">Skicka textmeddelanden från skrivbordet</string>
|
||||
@@ -243,6 +245,7 @@
|
||||
<string name="notification_channel_persistent">Permanent indikering</string>
|
||||
<string name="notification_channel_media_control">Kontroll av media</string>
|
||||
<string name="notification_channel_filetransfer">Filöverföring</string>
|
||||
<string name="notification_channel_high_priority">Hög prioritet</string>
|
||||
<string name="mpris_stop">Stoppa aktuell spelare</string>
|
||||
<string name="copy_url_to_clipboard">Kopiera webbadress till klippbordet</string>
|
||||
<string name="clipboard_toast">Kopierad till klippbordet</string>
|
||||
@@ -276,4 +279,22 @@
|
||||
<string name="no_app_for_opening">Inget lämpligt program hittades för att öppna filen</string>
|
||||
<string name="remote_keyboard_service">KDE-anslut fjärrtangentbord</string>
|
||||
<string name="presenter_pointer">Pekare</string>
|
||||
<string name="trusted_networks">Pålitliga nätverk</string>
|
||||
<string name="trusted_networks_desc">Begränsar automatisk upptäckt till kända nätverk</string>
|
||||
<string name="add_trusted_network">Lägg till %1s</string>
|
||||
<string name="empty_trusted_networks_list_text">Du har inte lagt till några pålitliga nätverk ännu</string>
|
||||
<string name="allow_all_networks_text">Tillåt alla</string>
|
||||
<string name="location_permission_needed_title">Rättighet krävs</string>
|
||||
<string name="location_permission_needed_desc">Android kräver platsrättigheter för att identifiera WIFI-nätverk</string>
|
||||
<string name="clipboard_android_x_incompat">Android 10 har tagit bort åtkomst till klippbordet för alla applikationer. Det här insticksprogrammet kommer att inaktiveras.</string>
|
||||
<string name="mpris_open_url">Fortsätt spela här</string>
|
||||
<string name="cant_open_url">Kan inte öppna webbadress för att sluta spela</string>
|
||||
<string name="bigscreen_home">Hem</string>
|
||||
<string name="bigscreen_up">Uppåt</string>
|
||||
<string name="bigscreen_left">Vänster</string>
|
||||
<string name="bigscreen_select">Markera</string>
|
||||
<string name="bigscreen_right">Höger</string>
|
||||
<string name="bigscreen_down">Neråt</string>
|
||||
<string name="pref_plugin_bigscreen">Fjärrkontroll för storskärm</string>
|
||||
<string name="pref_plugin_bigscreen_desc">Använd apparaten som en fjärrkontroll för Plasma storskärm</string>
|
||||
</resources>
|
||||
|
@@ -211,7 +211,6 @@
|
||||
<string name="findmyphone_title_tablet">Tabletimi bul</string>
|
||||
<string name="findmyphone_title_tv">TV\'mi bul</string>
|
||||
<string name="findmyphone_description">Aygıtı bulmak için onu çaldır</string>
|
||||
<string name="findmyphone_found">Bulundu</string>
|
||||
<string name="open">Aç</string>
|
||||
<string name="close">Kapat</string>
|
||||
<string name="plugins_need_permission">Bazı Eklentiler çalışmak için izne ihtiyaç duyar (daha fazla bilgi için dokunun):</string>
|
||||
|
@@ -33,6 +33,7 @@
|
||||
<string name="pref_plugin_sharereceiver_desc">Спільне використання файлів і адрес між пристроями</string>
|
||||
<string name="device_list_empty">Немає пристроїв</string>
|
||||
<string name="ok">Гаразд</string>
|
||||
<string name="sad_ok">Гаразд :(</string>
|
||||
<string name="cancel">Скасувати</string>
|
||||
<string name="open_settings">Відкрити вікно параметрів</string>
|
||||
<string name="no_permissions">Вам слід надати доступ до сповіщень</string>
|
||||
@@ -138,6 +139,7 @@
|
||||
<item quantity="many">Не вдалося надіслати %2$d з %3$d файлів до %1$s</item>
|
||||
<item quantity="other">Не вдалося надіслати файл до %1$s</item>
|
||||
</plurals>
|
||||
<string name="tap_to_open">Натисніть, щоб відкрити</string>
|
||||
<string name="received_file_text">Натисніть, щоб відкрити «%1s»</string>
|
||||
<string name="cannot_create_file">Не вдалося створити файл %s</string>
|
||||
<string name="tap_to_answer">Натисніть, щоб відповісти</string>
|
||||
@@ -221,6 +223,7 @@
|
||||
<string name="refresh">Оновити</string>
|
||||
<string name="unreachable_description">Цей пов’язаний пристрій недоступний. Переконайтеся, що його з’єднано з вашою мережею.</string>
|
||||
<string name="no_wifi">Ваш комп\'ютер не з\'єднано із мережею Wi-Fi, отже перегляд пристроїв у мережі неможливий. Натисніть тут, щоб увімкнути Wi-Fi.</string>
|
||||
<string name="on_non_trusted_message">Не є надійною мережею: автовиявлення вимкнено.</string>
|
||||
<string name="no_file_browser">Програм для навігації файловою системою не встановлено.</string>
|
||||
<string name="pref_plugin_telepathy">Надіслати SMS</string>
|
||||
<string name="pref_plugin_telepathy_desc">Надсилати текстові повідомлення з вашої робочої станції</string>
|
||||
@@ -259,6 +262,7 @@
|
||||
<string name="notification_channel_persistent">Постійний індикатор</string>
|
||||
<string name="notification_channel_media_control">Керування відтворенням</string>
|
||||
<string name="notification_channel_filetransfer">Передавання файлів</string>
|
||||
<string name="notification_channel_high_priority">Високий пріоритет</string>
|
||||
<string name="mpris_stop">Зупинити відтворення у поточному програвачі</string>
|
||||
<string name="copy_url_to_clipboard">Скопіювати адресу до буфера</string>
|
||||
<string name="clipboard_toast">Скопійовано до буфера</string>
|
||||
@@ -292,4 +296,22 @@
|
||||
<string name="no_app_for_opening">Не знайдено відповідної програми для відкриття цього файла</string>
|
||||
<string name="remote_keyboard_service">Віддалена клавіатура KDE Connect</string>
|
||||
<string name="presenter_pointer">Указка</string>
|
||||
<string name="trusted_networks">Надійні мережі</string>
|
||||
<string name="trusted_networks_desc">Обмежити автовиявлення відомими мережами</string>
|
||||
<string name="add_trusted_network">Додати %1s</string>
|
||||
<string name="empty_trusted_networks_list_text">Вами ще не додано надійних мереж</string>
|
||||
<string name="allow_all_networks_text">Дозволити всі</string>
|
||||
<string name="location_permission_needed_title">Потрібні права доступу</string>
|
||||
<string name="location_permission_needed_desc">Android потрібні права доступу до даних місця перебування для ідентифікації вашої мережі WiFi</string>
|
||||
<string name="clipboard_android_x_incompat">У Android 10 вилучено доступ до буфера даних для усіх програм. Цей додаток буде вимкнено.</string>
|
||||
<string name="mpris_open_url">Продовжити відтворення тут</string>
|
||||
<string name="cant_open_url">Не вдалося відкрити адресу для продовження відтворення</string>
|
||||
<string name="bigscreen_home">Домівка</string>
|
||||
<string name="bigscreen_up">Вгору</string>
|
||||
<string name="bigscreen_left">Ліворуч</string>
|
||||
<string name="bigscreen_select">Вибрати</string>
|
||||
<string name="bigscreen_right">Праворуч</string>
|
||||
<string name="bigscreen_down">Вниз</string>
|
||||
<string name="pref_plugin_bigscreen">Керування великим екраном</string>
|
||||
<string name="pref_plugin_bigscreen_desc">Скористайтеся вашим пристроєм як дистанційним керуванням для великого екрана Плазми</string>
|
||||
</resources>
|
||||
|
@@ -7,6 +7,7 @@
|
||||
<style name="KdeConnectTheme.Dark.NoActionBar" parent="KdeConnectThemeBase.Dark.NoActionBar">
|
||||
<item name="android:windowTranslucentStatus">true</item>
|
||||
<item name="android:colorEdgeEffect">@color/darkGrey</item>
|
||||
<item name="android:navigationBarColor">@android:color/black</item>
|
||||
</style>
|
||||
|
||||
</resources>
|
@@ -197,6 +197,7 @@
|
||||
<string name="refresh">刷新</string>
|
||||
<string name="unreachable_description">此配对设备不可达。请确认它已经连接到与您相同的网络。</string>
|
||||
<string name="no_wifi">您未连接到 Wi-Fi 网络,所以您可能无法看到任何设备。点击此处启用 Wi-Fi。</string>
|
||||
<string name="on_non_trusted_message">不在信任的网络上:自动发现已被禁用。</string>
|
||||
<string name="no_file_browser">未安装文件浏览器</string>
|
||||
<string name="pref_plugin_telepathy">发送短消息</string>
|
||||
<string name="pref_plugin_telepathy_desc">从桌面发送短消息</string>
|
||||
@@ -204,7 +205,7 @@
|
||||
<string name="findmyphone_title_tablet">找到我的平板电脑</string>
|
||||
<string name="findmyphone_title_tv">查找我的电视</string>
|
||||
<string name="findmyphone_description">让设备响铃从而找到它</string>
|
||||
<string name="findmyphone_found">找到</string>
|
||||
<string name="findmyphone_found">已发现</string>
|
||||
<string name="open">打开</string>
|
||||
<string name="close">关闭</string>
|
||||
<string name="plugins_need_permission">某些插件需要权限才能工作 (点击以获取更多信息):</string>
|
||||
@@ -230,10 +231,12 @@
|
||||
<string name="addcommand_explanation2">您可以在 KDE Connect 系统设置中添加新命令</string>
|
||||
<string name="add_command_description">您可以在桌面添加新命令</string>
|
||||
<string name="pref_plugin_mprisreceiver">控制媒体播放器</string>
|
||||
<string name="pref_plugin_mprisreceiver_desc">从其他设备控制您的手机的播放器</string>
|
||||
<string name="notification_channel_default">其他通知</string>
|
||||
<string name="notification_channel_persistent">持久性通知</string>
|
||||
<string name="notification_channel_media_control">媒体控制</string>
|
||||
<string name="notification_channel_filetransfer">文件传送</string>
|
||||
<string name="notification_channel_high_priority">高优先级</string>
|
||||
<string name="mpris_stop">停止但前播放器</string>
|
||||
<string name="copy_url_to_clipboard">复制 URL 到剪贴板</string>
|
||||
<string name="clipboard_toast">已复制到剪贴板</string>
|
||||
@@ -267,4 +270,11 @@
|
||||
<string name="no_app_for_opening">没有找到合适的应用程序打开此文件</string>
|
||||
<string name="remote_keyboard_service">KDE Connect 远程键盘</string>
|
||||
<string name="presenter_pointer">指针</string>
|
||||
<string name="trusted_networks">信任的网络</string>
|
||||
<string name="trusted_networks_desc">限制只在已知网络中启用自动发现</string>
|
||||
<string name="add_trusted_network">添加 %1s</string>
|
||||
<string name="empty_trusted_networks_list_text">您还没有添加任何可信的网络</string>
|
||||
<string name="allow_all_networks_text">允许所有</string>
|
||||
<string name="location_permission_needed_title">需要权限</string>
|
||||
<string name="location_permission_needed_desc">Android 需要位置权限才能识别您的 WiFi 网络</string>
|
||||
</resources>
|
||||
|
@@ -33,6 +33,7 @@
|
||||
<string name="pref_plugin_sharereceiver_desc">在兩個裝置當中互相分享URL網址與檔案</string>
|
||||
<string name="device_list_empty">沒有裝置</string>
|
||||
<string name="ok">確認</string>
|
||||
<string name="sad_ok">好吧 :(</string>
|
||||
<string name="cancel">取消</string>
|
||||
<string name="open_settings">開啟設定</string>
|
||||
<string name="no_permissions">您需要授予存取通知的權限</string>
|
||||
@@ -45,7 +46,7 @@
|
||||
<string name="remotekeyboard_connected">遠端鍵盤連線為啟用狀態</string>
|
||||
<string name="remotekeyboard_multiple_connections">這裡有兩個以上的遠端鍵盤連結,選擇一個裝置以設定。</string>
|
||||
<string name="open_mousepad">遠端輸入</string>
|
||||
<string name="mousepad_info">在您的智慧型手機的螢幕上移動手指頭,用來控制電腦螢幕的鼠標。按一下表示滑鼠的左鍵,使用兩隻/三隻手指頭按一下來表示滑鼠的右鍵/中鍵。使用兩隻手指頭捲動。長按則表示要拖拉。</string>
|
||||
<string name="mousepad_info">在您的智慧型手機的螢幕上移動手指頭,用來控制電腦螢幕的游標。按一下表示滑鼠的左鍵,使用兩隻/三隻手指頭按一下來表示滑鼠的右鍵/中鍵。使用兩隻手指頭捲動。長按則表示要拖拉。</string>
|
||||
<string name="mousepad_double_tap_settings_title">設定兩隻手指頭按一下的動作</string>
|
||||
<string name="mousepad_triple_tap_settings_title">設定三隻手指頭按一下的動作</string>
|
||||
<string name="mousepad_sensitivity_settings_title">設定觸碰板的靈敏度</string>
|
||||
@@ -122,8 +123,8 @@
|
||||
<string name="show_keyboard">顯示鍵盤</string>
|
||||
<string name="device_not_paired">裝置未配對</string>
|
||||
<string name="request_pairing">請求配對</string>
|
||||
<string name="pairing_accept">同意</string>
|
||||
<string name="pairing_reject">回絕</string>
|
||||
<string name="pairing_accept">接受</string>
|
||||
<string name="pairing_reject">拒絕</string>
|
||||
<string name="settings">設定</string>
|
||||
<string name="mpris_play">播放</string>
|
||||
<string name="mpris_pause">暫停</string>
|
||||
@@ -197,6 +198,7 @@
|
||||
<string name="refresh">重新整理</string>
|
||||
<string name="unreachable_description">無法連結此配對裝置。請確保它連結到與您相同的網域。</string>
|
||||
<string name="no_wifi">您尚未連線至 Wi-Fi 網路,因此您可能無法看到任何裝置。按一下這裡啟用 Wi-Fi。</string>
|
||||
<string name="on_non_trusted_message">不在信任網路:自動探索已停用。</string>
|
||||
<string name="no_file_browser">沒有安裝此檔案的瀏覽程式</string>
|
||||
<string name="pref_plugin_telepathy">傳送簡訊</string>
|
||||
<string name="pref_plugin_telepathy_desc">傳送文字簡訊到您的電腦桌面</string>
|
||||
@@ -204,7 +206,7 @@
|
||||
<string name="findmyphone_title_tablet">尋找我的平板</string>
|
||||
<string name="findmyphone_title_tv">尋找我的電視</string>
|
||||
<string name="findmyphone_description">讓這個裝置發出聲響讓您能找到它</string>
|
||||
<string name="findmyphone_found">找到</string>
|
||||
<string name="findmyphone_found">找到裝置</string>
|
||||
<string name="open">開啟</string>
|
||||
<string name="close">關閉</string>
|
||||
<string name="plugins_need_permission">部份的外掛程式需要權限才能運作(按一下以取得更多資訊)</string>
|
||||
@@ -230,10 +232,12 @@
|
||||
<string name="addcommand_explanation2">您現在可以在 KDE 連線系統設定增加新的指令</string>
|
||||
<string name="add_command_description">您可以在電腦上增加指令</string>
|
||||
<string name="pref_plugin_mprisreceiver">控制媒體播放器</string>
|
||||
<string name="pref_plugin_mprisreceiver_desc">從另外一個裝置操控您手機的媒體播放器</string>
|
||||
<string name="notification_channel_default">其他通知</string>
|
||||
<string name="notification_channel_persistent">一致化指示器</string>
|
||||
<string name="notification_channel_media_control">多媒體控制</string>
|
||||
<string name="notification_channel_filetransfer">檔案傳輸</string>
|
||||
<string name="notification_channel_high_priority">高優先度</string>
|
||||
<string name="mpris_stop">停止目前播放器</string>
|
||||
<string name="copy_url_to_clipboard">複製 URL 至剪貼簿</string>
|
||||
<string name="clipboard_toast">已複製到剪貼簿</string>
|
||||
@@ -267,4 +271,22 @@
|
||||
<string name="no_app_for_opening">找不到適合用來開啟此檔案的應用程式</string>
|
||||
<string name="remote_keyboard_service">KDE 連線遠端鍵盤</string>
|
||||
<string name="presenter_pointer">指標裝置</string>
|
||||
<string name="trusted_networks">信任網路</string>
|
||||
<string name="trusted_networks_desc">限制只對已知網路自動探索</string>
|
||||
<string name="add_trusted_network">加入 %1s</string>
|
||||
<string name="empty_trusted_networks_list_text">您尚未加入任何信任網路</string>
|
||||
<string name="allow_all_networks_text">全部允許</string>
|
||||
<string name="location_permission_needed_title">需要權限</string>
|
||||
<string name="location_permission_needed_desc">Android 需要「位置」權限才能識別你的 Wi-Fi 網路</string>
|
||||
<string name="clipboard_android_x_incompat">Android 10 已移除所有應用程式的剪貼簿存取權限。此外掛程式將停用。</string>
|
||||
<string name="mpris_open_url">繼續在此播放</string>
|
||||
<string name="cant_open_url">無法開啟 URL 以繼續播放</string>
|
||||
<string name="bigscreen_home">首頁</string>
|
||||
<string name="bigscreen_up">上</string>
|
||||
<string name="bigscreen_left">左</string>
|
||||
<string name="bigscreen_select">選擇</string>
|
||||
<string name="bigscreen_right">右</string>
|
||||
<string name="bigscreen_down">下</string>
|
||||
<string name="pref_plugin_bigscreen">Bigscreen 遠端</string>
|
||||
<string name="pref_plugin_bigscreen_desc">將您的裝置用作 Plasma Bigscreen 的遠端</string>
|
||||
</resources>
|
||||
|
@@ -9,6 +9,7 @@
|
||||
<string name="kde_connect">KDE Connect</string>
|
||||
<string name="foreground_notification_no_devices">Not connected to any device</string>
|
||||
<string name="foreground_notification_devices">Connected to: %s</string>
|
||||
<string name="foreground_notification_send_clipboard">Send Clipboard</string>
|
||||
<string name="pref_plugin_telephony">Telephony notifier</string>
|
||||
<string name="pref_plugin_telephony_desc">Send notifications for incoming calls</string>
|
||||
<string name="pref_plugin_battery">Battery report</string>
|
||||
@@ -17,6 +18,7 @@
|
||||
<string name="pref_plugin_sftp_desc">Allows to browse this device\'s filesystem remotely</string>
|
||||
<string name="pref_plugin_clipboard">Clipboard sync</string>
|
||||
<string name="pref_plugin_clipboard_desc">Share the clipboard content</string>
|
||||
<string name="pref_plugin_clipboard_sent">Clipboard Sent</string>
|
||||
<string name="pref_plugin_mousepad">Remote input</string>
|
||||
<string name="pref_plugin_mousepad_desc">Use your phone or tablet as a touchpad and keyboard</string>
|
||||
<string name="pref_plugin_presenter">Slideshow remote</string>
|
||||
@@ -39,6 +41,7 @@
|
||||
<string name="pref_plugin_sharereceiver_desc">Share files and URLs between devices</string>
|
||||
<string name="device_list_empty">No devices</string>
|
||||
<string name="ok">OK</string>
|
||||
<string name="sad_ok">OK :(</string>
|
||||
<string name="cancel">Cancel</string>
|
||||
<string name="open_settings">Open settings</string>
|
||||
<string name="no_permissions">You need to grant permission to access notifications</string>
|
||||
@@ -158,6 +161,7 @@
|
||||
<item quantity="one">Failed sending file to %1$s</item>
|
||||
<item quantity="other">Failed sending %2$d of %3$d files to %1$s</item>
|
||||
</plurals>
|
||||
<string name="tap_to_open">Tap to open</string>
|
||||
<string name="received_file_text">Tap to open \'%1s\'</string>
|
||||
<string name="cannot_create_file">Cannot create file %s</string>
|
||||
<string name="tap_to_answer">Tap to answer</string>
|
||||
@@ -257,6 +261,7 @@
|
||||
<string name="refresh">Refresh</string>
|
||||
<string name="unreachable_description">This paired device is not reachable. Make sure it is connected to your same network.</string>
|
||||
<string name="no_wifi">You\'re not connected to a Wi-Fi network, so you may not be able to see any devices. Click here to enable Wi-Fi.</string>
|
||||
<string name="on_non_trusted_message">Not on a trusted network: autodiscovery is disabled.</string>
|
||||
<string name="no_file_browser">There are no file browsers installed.</string>
|
||||
<string name="pref_plugin_telepathy">Send SMS</string>
|
||||
<string name="pref_plugin_telepathy_desc">Send text messages from your desktop</string>
|
||||
@@ -264,7 +269,7 @@
|
||||
<string name="findmyphone_title_tablet">Find my tablet</string>
|
||||
<string name="findmyphone_title_tv">Find my TV</string>
|
||||
<string name="findmyphone_description">Rings this device so you can find it</string>
|
||||
<string name="findmyphone_found">Found</string>
|
||||
<string name="findmyphone_found">Found it</string>
|
||||
|
||||
<string name="open">Open</string>
|
||||
<string name="close">Close</string>
|
||||
@@ -300,6 +305,7 @@
|
||||
<string name="notification_channel_persistent">Persistent indicator</string>
|
||||
<string name="notification_channel_media_control">Media control</string>
|
||||
<string name="notification_channel_filetransfer">File transfer</string>
|
||||
<string name="notification_channel_high_priority">High priority</string>
|
||||
|
||||
<string name="mpris_stop">Stop the current player</string>
|
||||
<string name="copy_url_to_clipboard">Copy URL to clipboard</string>
|
||||
@@ -337,8 +343,29 @@
|
||||
<string name="plugin_photo_desc">Launch the camera app to ease taking and transferring pictures</string>
|
||||
|
||||
<string name="findmyphone_preference_key_ringtone" translatable="false">findmyphone_ringtone</string>
|
||||
|
||||
<string name="no_app_for_opening">No suitable app found to open this file</string>
|
||||
<string name="remote_keyboard_service">KDE Connect Remote Keyboard</string>
|
||||
<string name="presenter_pointer">Pointer</string>
|
||||
|
||||
<string name="trusted_networks">Trusted networks</string>
|
||||
<string name="trusted_networks_desc">Restrict autodiscovery to known networks</string>
|
||||
<string name="add_trusted_network">Add %1s</string>
|
||||
<string name="empty_trusted_networks_list_text">You haven\'t added any trusted network yet</string>
|
||||
<string name="allow_all_networks_text">Allow all</string>
|
||||
|
||||
<string name="location_permission_needed_title">Permission required</string>
|
||||
<string name="location_permission_needed_desc">Android requires the Location permission to identify your WiFi network</string>
|
||||
<string name="clipboard_android_x_incompat">Android 10 has removed clipboard access to all apps. This plugin will be disabled.</string>
|
||||
<string name="mpris_open_url">Continue playing here</string>
|
||||
<string name="cant_open_url">Can\'t open URL to continue playing</string>
|
||||
|
||||
<string name="bigscreen_home">Home</string>
|
||||
<string name="bigscreen_up">Up</string>
|
||||
<string name="bigscreen_left">Left</string>
|
||||
<string name="bigscreen_select">Select</string>
|
||||
<string name="bigscreen_right">Right</string>
|
||||
<string name="bigscreen_down">Down</string>
|
||||
<string name="pref_plugin_bigscreen">Bigscreen remote</string>
|
||||
<string name="pref_plugin_bigscreen_desc">Use your device as a remote for Plasma Bigscreen</string>
|
||||
</resources>
|
||||
|
@@ -6,8 +6,10 @@
|
||||
|
||||
<!-- KdeConnectThemeBase styles must only be defined in the main res/values/ folder -->
|
||||
<style name="KdeConnectThemeBase.Dark" parent="Theme.MaterialComponents">
|
||||
<item name="colorPrimary">@color/darkGrey</item>
|
||||
<item name="colorPrimary">@color/primary</item>
|
||||
<item name="colorPrimaryDark">@color/darkStatusBarBackground</item>
|
||||
<item name="colorSecondary">@color/primary</item>
|
||||
<item name="colorOnSecondary">@android:color/black</item>
|
||||
<item name="colorAccent">@color/accent</item>
|
||||
<item name="android:windowBackground">@android:color/black</item>
|
||||
<item name="toolbarStyle">@style/KdeConnectTheme.Toolbar.Dark</item>
|
||||
|
@@ -9,6 +9,8 @@
|
||||
<!-- The three colors used by system widgets, according to https://chris.banes.me/2014/10/17/appcompat-v21/ -->
|
||||
<item name="colorPrimary">@color/primary</item>
|
||||
<item name="colorPrimaryDark">@color/primaryDark</item>
|
||||
<item name="colorSecondary">@color/primary</item>
|
||||
<item name="colorOnSecondary">@android:color/white</item>
|
||||
<item name="colorAccent">@color/accent</item>
|
||||
<item name="toolbarStyle">@style/KdeConnectTheme.Toolbar</item>
|
||||
<item name="popupTheme">@style/ThemeOverlay.AppCompat.Light</item>
|
||||
@@ -47,4 +49,12 @@
|
||||
<style name="ActionModeStyle" parent="Widget.AppCompat.ActionMode">
|
||||
<item name="background">@color/primaryDark</item>
|
||||
</style>
|
||||
<style name="Theme.Transparent" parent="@style/Theme.AppCompat.NoActionBar">
|
||||
<item name="android:windowIsTranslucent">true</item>
|
||||
<item name="android:windowBackground">@android:color/transparent</item>
|
||||
<item name="android:windowContentOverlay">@null</item>
|
||||
<item name="android:windowNoTitle">true</item>
|
||||
<item name="android:windowIsFloating">true</item>
|
||||
<item name="android:backgroundDimEnabled">false</item>
|
||||
</style>
|
||||
</resources>
|
||||
|
@@ -42,6 +42,7 @@ import java.net.Socket;
|
||||
import java.net.SocketTimeoutException;
|
||||
import java.nio.channels.NotYetConnectedException;
|
||||
|
||||
import javax.net.ssl.SSLHandshakeException;
|
||||
import javax.net.ssl.SSLSocket;
|
||||
|
||||
import androidx.annotation.WorkerThread;
|
||||
@@ -210,6 +211,11 @@ public class LanLink extends BaseLink {
|
||||
}
|
||||
outputStream.flush();
|
||||
Log.i("KDE/LanLink", "Finished sending payload ("+progress+" bytes written)");
|
||||
} catch(SSLHandshakeException e) {
|
||||
// The exception can be due to several causes. "Connection closed by peer" seems to be a common one.
|
||||
// If we could distinguish different cases we could react differently for some of them, but I haven't found how.
|
||||
Log.e("sendPacket","Payload SSLSocket failed");
|
||||
e.printStackTrace();
|
||||
} finally {
|
||||
try { server.close(); } catch (Exception ignored) { }
|
||||
try { payloadSocket.close(); } catch (Exception ignored) { }
|
||||
|
@@ -33,6 +33,7 @@ import org.kde.kdeconnect.Device;
|
||||
import org.kde.kdeconnect.Helpers.DeviceHelper;
|
||||
import org.kde.kdeconnect.Helpers.SecurityHelpers.SslHelper;
|
||||
import org.kde.kdeconnect.Helpers.StringsHelper;
|
||||
import org.kde.kdeconnect.Helpers.TrustedNetworkHelper;
|
||||
import org.kde.kdeconnect.NetworkPacket;
|
||||
import org.kde.kdeconnect.UserInterface.CustomDevicesActivity;
|
||||
|
||||
@@ -76,6 +77,9 @@ public class LanLinkProvider extends BaseLinkProvider implements LanLink.LinkDis
|
||||
private ServerSocket tcpServer;
|
||||
private DatagramSocket udpServer;
|
||||
|
||||
private long lastBroadcast = 0;
|
||||
private final static long delayBetweenBroadcasts = 500;
|
||||
|
||||
private boolean listening = false;
|
||||
|
||||
// To prevent infinte loop between Android < IceCream because both device can only broadcast identity package but cannot connect via TCP
|
||||
@@ -355,10 +359,25 @@ public class LanLinkProvider extends BaseLinkProvider implements LanLink.LinkDis
|
||||
}
|
||||
|
||||
private void broadcastUdpPacket() {
|
||||
if (System.currentTimeMillis() < lastBroadcast + delayBetweenBroadcasts) {
|
||||
Log.i("LanLinkProvider", "broadcastUdpPacket: relax cowboy");
|
||||
return;
|
||||
}
|
||||
lastBroadcast = System.currentTimeMillis();
|
||||
|
||||
new Thread(() -> {
|
||||
ArrayList<String> iplist = CustomDevicesActivity
|
||||
.getCustomDeviceList(PreferenceManager.getDefaultSharedPreferences(context));
|
||||
iplist.add("255.255.255.255"); //Default: broadcast.
|
||||
|
||||
if (TrustedNetworkHelper.isTrustedNetwork(context)) {
|
||||
iplist.add("255.255.255.255"); //Default: broadcast.
|
||||
} else {
|
||||
Log.i("LanLinkProvider", "Current network isn't trusted, not broadcasting");
|
||||
}
|
||||
|
||||
if (iplist.isEmpty()) {
|
||||
return;
|
||||
}
|
||||
|
||||
NetworkPacket identity = NetworkPacket.createIdentityPacket(context);
|
||||
int port = (tcpServer == null || !tcpServer.isBound()) ? MIN_PORT : tcpServer.getLocalPort();
|
||||
|
@@ -32,29 +32,35 @@ import android.net.ConnectivityManager;
|
||||
import android.os.Binder;
|
||||
import android.os.Build;
|
||||
import android.os.IBinder;
|
||||
import android.preference.PreferenceManager;
|
||||
import android.text.TextUtils;
|
||||
import android.util.Log;
|
||||
|
||||
import androidx.core.app.NotificationCompat;
|
||||
|
||||
import org.kde.kdeconnect.Backends.BaseLink;
|
||||
import org.kde.kdeconnect.Backends.BaseLinkProvider;
|
||||
import org.kde.kdeconnect.Backends.LanBackend.LanLinkProvider;
|
||||
import org.kde.kdeconnect.Helpers.NotificationHelper;
|
||||
import org.kde.kdeconnect.Helpers.SecurityHelpers.RsaHelper;
|
||||
import org.kde.kdeconnect.Helpers.SecurityHelpers.SslHelper;
|
||||
import org.kde.kdeconnect.Plugins.ClibpoardPlugin.ClipboardFloatingActivity;
|
||||
import org.kde.kdeconnect.Plugins.Plugin;
|
||||
import org.kde.kdeconnect.Plugins.PluginFactory;
|
||||
import org.kde.kdeconnect.Plugins.RunCommandPlugin.RunCommandActivity;
|
||||
import org.kde.kdeconnect.Plugins.RunCommandPlugin.RunCommandPlugin;
|
||||
import org.kde.kdeconnect.Plugins.SharePlugin.SendFileActivity;
|
||||
import org.kde.kdeconnect.UserInterface.MainActivity;
|
||||
import org.kde.kdeconnect_tp.R;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.HashSet;
|
||||
import java.util.Iterator;
|
||||
import java.util.Set;
|
||||
import java.util.concurrent.ConcurrentHashMap;
|
||||
import java.util.concurrent.locks.Lock;
|
||||
import java.util.concurrent.locks.ReentrantLock;
|
||||
|
||||
import androidx.core.app.NotificationCompat;
|
||||
|
||||
//import org.kde.kdeconnect.Backends.BluetoothBackend.BluetoothLinkProvider;
|
||||
|
||||
public class BackgroundService extends Service {
|
||||
@@ -274,6 +280,7 @@ public class BackgroundService extends Service {
|
||||
initializeSecurityParameters();
|
||||
NotificationHelper.initializeChannels(this);
|
||||
loadRememberedDevicesFromSettings();
|
||||
migratePluginSettings();
|
||||
registerLinkProviders();
|
||||
|
||||
//Link Providers need to be already registered
|
||||
@@ -284,6 +291,29 @@ public class BackgroundService extends Service {
|
||||
}
|
||||
}
|
||||
|
||||
private void migratePluginSettings() {
|
||||
SharedPreferences globalPrefs = PreferenceManager.getDefaultSharedPreferences(this);
|
||||
|
||||
for (String pluginKey : PluginFactory.getAvailablePlugins()) {
|
||||
if (PluginFactory.getPluginInfo(pluginKey).supportsDeviceSpecificSettings()) {
|
||||
Iterator<Device> it = devices.values().iterator();
|
||||
|
||||
while (it.hasNext()) {
|
||||
Device device = it.next();
|
||||
Plugin plugin = PluginFactory.instantiatePluginForDevice(getBaseContext(), pluginKey, device);
|
||||
|
||||
if (plugin == null) {
|
||||
continue;
|
||||
}
|
||||
|
||||
plugin.copyGlobalToDeviceSpecificSettings(globalPrefs);
|
||||
if (!it.hasNext()) {
|
||||
plugin.removeSettings(globalPrefs);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public void changePersistentNotificationVisibility(boolean visible) {
|
||||
NotificationManager nm = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
|
||||
@@ -311,24 +341,53 @@ public class BackgroundService extends Service {
|
||||
.setAutoCancel(false);
|
||||
notification.setGroup("BackgroundService");
|
||||
|
||||
ArrayList<String> connectedDevices = new ArrayList<>();
|
||||
for (Device device : getDevices().values()) {
|
||||
if (device.isReachable() && device.isPaired()) {
|
||||
connectedDevices.add(device.getName());
|
||||
}
|
||||
}
|
||||
|
||||
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.O) {
|
||||
//Pre-oreo, the notification will have an empty title line without this
|
||||
notification.setContentTitle(getString(R.string.kde_connect));
|
||||
}
|
||||
|
||||
ArrayList<String> connectedDevices = new ArrayList<>();
|
||||
ArrayList<String> connectedDeviceIds = new ArrayList<>();
|
||||
for (Device device : getDevices().values()) {
|
||||
if (device.isReachable() && device.isPaired()) {
|
||||
connectedDeviceIds.add(device.getDeviceId());
|
||||
connectedDevices.add(device.getName());
|
||||
}
|
||||
}
|
||||
|
||||
if (connectedDevices.isEmpty()) {
|
||||
notification.setContentText(getString(R.string.foreground_notification_no_devices));
|
||||
} else {
|
||||
notification.setContentText(getString(R.string.foreground_notification_devices, TextUtils.join(", ", connectedDevices)));
|
||||
}
|
||||
|
||||
// Adding an action button to send clipboard manually in Android 10 and later.
|
||||
if (Build.VERSION.SDK_INT > Build.VERSION_CODES.P) {
|
||||
Intent sendClipboard = new Intent(this, ClipboardFloatingActivity.class);
|
||||
sendClipboard.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK | Intent.FLAG_ACTIVITY_NEW_TASK);
|
||||
sendClipboard.putExtra("connectedDeviceIds", connectedDeviceIds);
|
||||
PendingIntent sendPendingClipboard = PendingIntent.getActivity(this, 3, sendClipboard, PendingIntent.FLAG_UPDATE_CURRENT);
|
||||
notification.addAction(0, getString(R.string.foreground_notification_send_clipboard), sendPendingClipboard);
|
||||
}
|
||||
|
||||
if (connectedDeviceIds.size() == 1) {
|
||||
// Adding two action buttons only when there is a single device connected.
|
||||
// Setting up Send File Intent.
|
||||
Intent sendFile = new Intent(this, SendFileActivity.class);
|
||||
sendFile.putExtra("deviceId", connectedDeviceIds.get(0));
|
||||
PendingIntent sendPendingFile = PendingIntent.getActivity(this, 1, sendFile, PendingIntent.FLAG_UPDATE_CURRENT);
|
||||
notification.addAction(0, getString(R.string.send_files), sendPendingFile);
|
||||
|
||||
// Checking if there are registered commands and adding the button.
|
||||
Device device = getDevice(connectedDeviceIds.get(0));
|
||||
RunCommandPlugin plugin = (RunCommandPlugin) device.getPlugin("RunCommandPlugin");
|
||||
if (plugin != null && !plugin.getCommandList().isEmpty()) {
|
||||
Intent runCommand = new Intent(this, RunCommandActivity.class);
|
||||
runCommand.putExtra("deviceId", connectedDeviceIds.get(0));
|
||||
PendingIntent runPendingCommand = PendingIntent.getActivity(this, 2, runCommand, PendingIntent.FLAG_UPDATE_CURRENT);
|
||||
notification.addAction(0, getString(R.string.pref_plugin_runcommand), runPendingCommand);
|
||||
}
|
||||
}
|
||||
}
|
||||
return notification.build();
|
||||
}
|
||||
|
||||
|
@@ -33,6 +33,12 @@ import android.preference.PreferenceManager;
|
||||
import android.util.Base64;
|
||||
import android.util.Log;
|
||||
|
||||
import androidx.annotation.AnyThread;
|
||||
import androidx.annotation.Nullable;
|
||||
import androidx.annotation.WorkerThread;
|
||||
import androidx.core.app.NotificationCompat;
|
||||
import androidx.core.content.ContextCompat;
|
||||
|
||||
import org.kde.kdeconnect.Backends.BaseLink;
|
||||
import org.kde.kdeconnect.Backends.BasePairingHandler;
|
||||
import org.kde.kdeconnect.Helpers.NotificationHelper;
|
||||
@@ -57,11 +63,6 @@ import java.util.Vector;
|
||||
import java.util.concurrent.ConcurrentHashMap;
|
||||
import java.util.concurrent.CopyOnWriteArrayList;
|
||||
|
||||
import androidx.annotation.AnyThread;
|
||||
import androidx.annotation.WorkerThread;
|
||||
import androidx.core.app.NotificationCompat;
|
||||
import androidx.core.content.ContextCompat;
|
||||
|
||||
public class Device implements BaseLink.PacketReceiver {
|
||||
|
||||
private final Context context;
|
||||
@@ -534,8 +535,10 @@ public class Device implements BaseLink.PacketReceiver {
|
||||
Log.i("KDE/Device", "removeLink: " + link.getLinkProvider().getName() + " -> " + getName() + " active links: " + links.size());
|
||||
if (links.isEmpty()) {
|
||||
reloadPluginsFromSettings();
|
||||
packetQueue.disconnected();
|
||||
packetQueue = null;
|
||||
if (packetQueue != null) {
|
||||
packetQueue.disconnected();
|
||||
packetQueue = null;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -710,11 +713,13 @@ public class Device implements BaseLink.PacketReceiver {
|
||||
// Plugin-related functions
|
||||
//
|
||||
|
||||
@Nullable
|
||||
public <T extends Plugin> T getPlugin(Class<T> pluginClass) {
|
||||
Plugin plugin = getPlugin(Plugin.getPluginKey(pluginClass));
|
||||
return (T) plugin;
|
||||
}
|
||||
|
||||
@Nullable
|
||||
public Plugin getPlugin(String pluginKey) {
|
||||
return plugins.get(pluginKey);
|
||||
}
|
||||
|
@@ -33,8 +33,8 @@ import android.util.Base64OutputStream;
|
||||
import android.util.Log;
|
||||
|
||||
import androidx.annotation.NonNull;
|
||||
import androidx.annotation.Nullable;
|
||||
import androidx.annotation.RequiresApi;
|
||||
import androidx.collection.LongSparseArray;
|
||||
|
||||
import java.io.BufferedReader;
|
||||
import java.io.ByteArrayOutputStream;
|
||||
@@ -52,6 +52,7 @@ import java.util.Set;
|
||||
|
||||
public class ContactsHelper {
|
||||
|
||||
static final String LOG_TAG = "ContactsHelper";
|
||||
|
||||
/**
|
||||
* Lookup the name and photoID of a contact given a phone number
|
||||
@@ -103,7 +104,7 @@ public class ContactsHelper {
|
||||
}
|
||||
return encodedPhoto.toString();
|
||||
} catch (Exception ex) {
|
||||
Log.e("ContactsHelper", ex.toString());
|
||||
Log.e(LOG_TAG, ex.toString());
|
||||
return "";
|
||||
}
|
||||
}
|
||||
@@ -140,7 +141,7 @@ public class ContactsHelper {
|
||||
} else {
|
||||
// Something went wrong with this contact
|
||||
// If you are experiencing this, please open a bug report indicating how you got here
|
||||
Log.e("ContactsHelper", "Got a contact which does not have a LOOKUP_KEY");
|
||||
Log.e(LOG_TAG, "Got a contact which does not have a LOOKUP_KEY");
|
||||
continue;
|
||||
}
|
||||
|
||||
@@ -155,59 +156,7 @@ public class ContactsHelper {
|
||||
}
|
||||
|
||||
/**
|
||||
* Get VCards using the batch database query which requires Android API 21
|
||||
*
|
||||
* @param context android.content.Context running the request
|
||||
* @param IDs collection of raw contact IDs to look up
|
||||
* @param lookupKeys
|
||||
* @return Mapping of raw contact IDs to corresponding VCard
|
||||
*/
|
||||
@SuppressWarnings("ALL") // Since this method is busted anyway
|
||||
@RequiresApi(Build.VERSION_CODES.LOLLIPOP)
|
||||
@Deprecated
|
||||
protected static Map<Long, VCardBuilder> getVCardsFast(Context context, Collection<Long> IDs, Map<Long, String> lookupKeys) {
|
||||
LongSparseArray<VCardBuilder> toReturn = new LongSparseArray<>();
|
||||
StringBuilder keys = new StringBuilder();
|
||||
|
||||
List<Long> orderedIDs = new ArrayList<>(IDs);
|
||||
|
||||
for (Long ID : orderedIDs) {
|
||||
String key = lookupKeys.get(ID);
|
||||
keys.append(key);
|
||||
keys.append(':');
|
||||
}
|
||||
|
||||
// Remove trailing ':'
|
||||
keys.deleteCharAt(keys.length() - 1);
|
||||
|
||||
Uri vcardURI = Uri.withAppendedPath(
|
||||
ContactsContract.Contacts.CONTENT_MULTI_VCARD_URI,
|
||||
Uri.encode(keys.toString()));
|
||||
|
||||
;
|
||||
StringBuilder vcardJumble = new StringBuilder();
|
||||
try (InputStream input = context.getContentResolver().openInputStream(vcardURI)) {
|
||||
BufferedReader bufferedInput = new BufferedReader(new InputStreamReader(input));
|
||||
String line;
|
||||
while ((line = bufferedInput.readLine()) != null) {
|
||||
vcardJumble.append(line).append('\n');
|
||||
}
|
||||
} catch (IOException e) {
|
||||
// If you are experiencing this, please open a bug report indicating how you got here
|
||||
Log.e("Contacts", "Exception while fetching vcards", e);
|
||||
}
|
||||
|
||||
// At this point we are screwed:
|
||||
// There is no way to figure out, given the lookup we just made, which VCard belonges
|
||||
// to which ID. They appear to be in the same order as the request was made, but this
|
||||
// is (provably) unreliable. I am leaving this code in case it is useful, but unless
|
||||
// Android improves their API there is nothing we can do with it
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get VCards using serial database lookups. This is tragically slow, but the faster method using
|
||||
* Get VCards using serial database lookups. This is tragically slow, so call only when needed.
|
||||
*
|
||||
* There is a faster API specified using ContactsContract.Contacts.CONTENT_MULTI_VCARD_URI,
|
||||
* but there does not seem to be a way to figure out which ID resulted in which VCard using that API
|
||||
@@ -263,97 +212,110 @@ public class ContactsHelper {
|
||||
}
|
||||
|
||||
/**
|
||||
* Return a mapping of contact IDs to a map of the requested data from the Contacts database
|
||||
* <p>
|
||||
* If for some reason there is no row associated with the contact ID in the database,
|
||||
* there will not be a corresponding field in the returned map
|
||||
* Get the last-modified timestamp for every contact in the database
|
||||
*
|
||||
* @param context android.content.Context running the request
|
||||
* @param IDs collection of contact uIDs to look up
|
||||
* @param contactsProjection List of column names to extract, defined in ContactsContract.Contacts
|
||||
* @param context android.content.Context running the request
|
||||
* @return Mapping of contact uID to last-modified timestamp
|
||||
*/
|
||||
@RequiresApi(api = Build.VERSION_CODES.JELLY_BEAN_MR2) // Need API 18 for contact timestamps
|
||||
public static Map<uID, Long> getAllContactTimestamps(Context context) {
|
||||
String[] projection = { uID.COLUMN, ContactsContract.Contacts.CONTACT_LAST_UPDATED_TIMESTAMP };
|
||||
|
||||
Map<uID, Map<String, String>> databaseValues = accessContactsDatabase(context, projection, null, null, null);
|
||||
|
||||
Map<uID, Long> timestamps = new HashMap<>();
|
||||
for (uID contactID : databaseValues.keySet()) {
|
||||
Map<String, String> data = databaseValues.get(contactID);
|
||||
timestamps.put(
|
||||
contactID,
|
||||
Long.parseLong(data.get(ContactsContract.Contacts.CONTACT_LAST_UPDATED_TIMESTAMP))
|
||||
);
|
||||
}
|
||||
|
||||
return timestamps;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the last-modified timestamp for the specified contact
|
||||
*
|
||||
* @param context android.content.Context running the request
|
||||
* @param contactID Contact uID to read
|
||||
* @throws ContactNotFoundException If the given ID for some reason does not match a contact
|
||||
* @return Last-modified timestamp of the contact
|
||||
*/
|
||||
@RequiresApi(api = Build.VERSION_CODES.JELLY_BEAN_MR2) // Need API 18 for contact timestamps
|
||||
public static Long getContactTimestamp(Context context, uID contactID) throws ContactNotFoundException {
|
||||
String[] projection = { uID.COLUMN, ContactsContract.Contacts.CONTACT_LAST_UPDATED_TIMESTAMP };
|
||||
String selection = uID.COLUMN + " = ?";
|
||||
String[] selectionArgs = { contactID.toString() };
|
||||
|
||||
Map<uID, Map<String, String>> databaseValue = accessContactsDatabase(context, projection, selection, selectionArgs, null);
|
||||
|
||||
if (databaseValue.size() == 0) {
|
||||
throw new ContactNotFoundException("Querying for contact with id " + contactID + " returned no results.");
|
||||
}
|
||||
|
||||
if (databaseValue.size() != 1) {
|
||||
Log.w(LOG_TAG, "Received an improper number of return values from the database in getContactTimestamp: " + databaseValue.size());
|
||||
}
|
||||
|
||||
Long timestamp = Long.parseLong(databaseValue.get(contactID).get(ContactsContract.Contacts.CONTACT_LAST_UPDATED_TIMESTAMP));
|
||||
|
||||
return timestamp;
|
||||
}
|
||||
|
||||
/**
|
||||
* Return a mapping of contact IDs to a map of the requested data from the Contacts database.
|
||||
*
|
||||
* @param context android.content.Context running the request
|
||||
* @param projection List of column names to extract, defined in ContactsContract.Contacts. Must contain uID.COLUMN
|
||||
* @param selection Parameterizable filter to use with the ContentResolver query. May be null.
|
||||
* @param selectionArgs Parameters for selection. May be null.
|
||||
* @param sortOrder Sort order to request from the ContentResolver query. May be null.
|
||||
* @return mapping of contact uIDs to desired values, which are a mapping of column names to the data contained there
|
||||
*/
|
||||
@TargetApi(Build.VERSION_CODES.HONEYCOMB) // Needed for Cursor.getType(..)
|
||||
public static Map<uID, Map<String, Object>> getColumnsFromContactsForIDs(Context context, Collection<uID> IDs, String[] contactsProjection) {
|
||||
HashMap<uID, Map<String, Object>> toReturn = new HashMap<>();
|
||||
|
||||
if (IDs.isEmpty()) {
|
||||
return toReturn;
|
||||
}
|
||||
|
||||
private static Map<uID, Map<String, String>> accessContactsDatabase(
|
||||
@NonNull Context context,
|
||||
@NonNull String[] projection,
|
||||
@Nullable String selection,
|
||||
@Nullable String[] selectionArgs,
|
||||
@Nullable String sortOrder
|
||||
) {
|
||||
Uri contactsUri = ContactsContract.Contacts.CONTENT_URI;
|
||||
|
||||
// Regardless of whether it was requested, we need to look up the uID column
|
||||
Set<String> lookupProjection = new HashSet<>(Arrays.asList(contactsProjection));
|
||||
lookupProjection.add(uID.COLUMN);
|
||||
|
||||
// We need a selection which looks like "<column> IN(?,?,...?)" with one ? per ID
|
||||
StringBuilder contactsSelection = new StringBuilder(uID.COLUMN);
|
||||
contactsSelection.append(" IN(");
|
||||
|
||||
for (int i = 0; i < IDs.size(); i++) {
|
||||
contactsSelection.append("?,");
|
||||
}
|
||||
// Remove trailing comma
|
||||
contactsSelection.deleteCharAt(contactsSelection.length() - 1);
|
||||
contactsSelection.append(")");
|
||||
|
||||
// We need selection arguments as simply a String representation of each ID
|
||||
List<String> contactsArgs = new ArrayList<>();
|
||||
for (uID ID : IDs) {
|
||||
contactsArgs.add(ID.toString());
|
||||
}
|
||||
HashMap<uID, Map<String, String>> toReturn = new HashMap<>();
|
||||
|
||||
try (Cursor contactsCursor = context.getContentResolver().query(
|
||||
contactsUri,
|
||||
lookupProjection.toArray(new String[0]),
|
||||
contactsSelection.toString(),
|
||||
contactsArgs.toArray(new String[0]),
|
||||
null
|
||||
projection,
|
||||
selection,
|
||||
selectionArgs,
|
||||
sortOrder
|
||||
)) {
|
||||
if (contactsCursor != null && contactsCursor.moveToFirst()) {
|
||||
do {
|
||||
Map<String, Object> requestedData = new HashMap<>();
|
||||
Map<String, String> requestedData = new HashMap<>();
|
||||
|
||||
int lookupKeyIdx = contactsCursor.getColumnIndexOrThrow(uID.COLUMN);
|
||||
String lookupKey = contactsCursor.getString(lookupKeyIdx);
|
||||
int uIDIndex = contactsCursor.getColumnIndexOrThrow(uID.COLUMN);
|
||||
uID uID = new uID(contactsCursor.getString(uIDIndex));
|
||||
|
||||
// For each column, collect the data from that column
|
||||
for (String column : contactsProjection) {
|
||||
for (String column : projection) {
|
||||
int index = contactsCursor.getColumnIndex(column);
|
||||
// Since we might be getting various kinds of data, Object is the best we can do
|
||||
Object data;
|
||||
int type;
|
||||
String data;
|
||||
if (index == -1) {
|
||||
// This contact didn't have the requested column? Something is very wrong.
|
||||
// If you are experiencing this, please open a bug report indicating how you got here
|
||||
Log.e("ContactsHelper", "Got a contact which does not have a requested column");
|
||||
Log.e(LOG_TAG, "Got a contact which does not have a requested column");
|
||||
continue;
|
||||
}
|
||||
|
||||
type = contactsCursor.getType(index);
|
||||
switch (type) {
|
||||
case Cursor.FIELD_TYPE_INTEGER:
|
||||
data = contactsCursor.getInt(index);
|
||||
break;
|
||||
case Cursor.FIELD_TYPE_FLOAT:
|
||||
data = contactsCursor.getFloat(index);
|
||||
break;
|
||||
case Cursor.FIELD_TYPE_STRING:
|
||||
data = contactsCursor.getString(index);
|
||||
break;
|
||||
case Cursor.FIELD_TYPE_BLOB:
|
||||
data = contactsCursor.getBlob(index);
|
||||
break;
|
||||
default:
|
||||
Log.e("ContactsHelper", "Got an undefined type of column " + column);
|
||||
continue;
|
||||
}
|
||||
data = contactsCursor.getString(index);
|
||||
|
||||
requestedData.put(column, data);
|
||||
}
|
||||
|
||||
toReturn.put(new uID(lookupKey), requestedData);
|
||||
toReturn.put(uID, requestedData);
|
||||
} while (contactsCursor.moveToNext());
|
||||
}
|
||||
}
|
||||
@@ -443,4 +405,17 @@ public class ContactsHelper {
|
||||
return contactLookupKey.equals(other);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Exception to indicate that a specified contact was not found
|
||||
*/
|
||||
public static class ContactNotFoundException extends Exception {
|
||||
public ContactNotFoundException(uID contactID) {
|
||||
super("Unable to find contact with ID " + contactID);
|
||||
}
|
||||
|
||||
public ContactNotFoundException(String message) {
|
||||
super(message);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@@ -162,7 +162,7 @@ public class FilesHelper {
|
||||
// situations were we don't know the size (for instance, if the file is
|
||||
// not local to the device)
|
||||
if (!cursor.isNull(sizeColumnIndex)) {
|
||||
size = cursor.getInt(sizeColumnIndex);
|
||||
size = cursor.getLong(sizeColumnIndex);
|
||||
}
|
||||
|
||||
lastModified = getLastModifiedTime(context, uri);
|
||||
|
64
src/org/kde/kdeconnect/Helpers/IntentHelper.java
Normal file
64
src/org/kde/kdeconnect/Helpers/IntentHelper.java
Normal file
@@ -0,0 +1,64 @@
|
||||
/*
|
||||
* Copyright 2020 Vincent Blücher <vincent.bluecher@gmail.com>
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU General Public License as
|
||||
* published by the Free Software Foundation; either version 2 of
|
||||
* the License or (at your option) version 3 or any later version
|
||||
* accepted by the membership of KDE e.V. (or its successor approved
|
||||
* by the membership of KDE e.V.), which shall act as a proxy
|
||||
* defined in Section 14 of version 3 of the license.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
package org.kde.kdeconnect.Helpers;
|
||||
|
||||
import android.app.Activity;
|
||||
import android.app.Notification;
|
||||
import android.app.PendingIntent;
|
||||
import android.content.Context;
|
||||
import android.content.Intent;
|
||||
import android.os.Build;
|
||||
|
||||
import org.kde.kdeconnect.MyApplication;
|
||||
import org.kde.kdeconnect_tp.R;
|
||||
|
||||
import androidx.core.app.NotificationCompat;
|
||||
import androidx.core.app.NotificationManagerCompat;
|
||||
|
||||
public class IntentHelper {
|
||||
|
||||
/**
|
||||
* On API 29+: post a high priority notification which starts the given Intent when clicked
|
||||
* On API <=28: launch a given Intent directly since no background restrictions apply on these platforms.
|
||||
* @param context the Context from which the Intent is started
|
||||
* @param intent the Intent to be started
|
||||
* @param title a title which is shown in the notification on Android 10+
|
||||
*/
|
||||
public static void startActivityFromBackground(Context context, Intent intent, String title) {
|
||||
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q && !MyApplication.isInForeground()) {
|
||||
PendingIntent pendingIntent = PendingIntent.getActivity(context, 0, intent, PendingIntent.FLAG_ONE_SHOT);
|
||||
Notification notification = new NotificationCompat
|
||||
.Builder(context, NotificationHelper.Channels.HIGHPRIORITY)
|
||||
.setContentIntent(pendingIntent)
|
||||
.setFullScreenIntent(pendingIntent, true)
|
||||
.setContentTitle(title)
|
||||
.setContentText(context.getString(R.string.tap_to_open))
|
||||
.setSmallIcon(R.drawable.ic_notification)
|
||||
.setPriority(NotificationCompat.PRIORITY_HIGH)
|
||||
.setAutoCancel(true)
|
||||
.build();
|
||||
int id = (int) System.currentTimeMillis();
|
||||
NotificationManagerCompat.from(context).notify(id, notification);
|
||||
} else {
|
||||
context.startActivity(intent);
|
||||
}
|
||||
}
|
||||
}
|
@@ -18,6 +18,7 @@ public class NotificationHelper {
|
||||
public final static String MEDIA_CONTROL = "media_control";
|
||||
public final static String FILETRANSFER = "filetransfer";
|
||||
public final static String RECEIVENOTIFICATION = "receive";
|
||||
public final static String HIGHPRIORITY = "highpriority";
|
||||
}
|
||||
|
||||
public static void notifyCompat(NotificationManager notificationManager, int notificationId, Notification notification) {
|
||||
@@ -80,6 +81,8 @@ public class NotificationHelper {
|
||||
NotificationManager.IMPORTANCE_DEFAULT)
|
||||
);
|
||||
|
||||
NotificationChannel highPriority = new NotificationChannel(Channels.HIGHPRIORITY, context.getString(R.string.notification_channel_high_priority), NotificationManager.IMPORTANCE_HIGH);
|
||||
manager.createNotificationChannel(highPriority);
|
||||
}
|
||||
|
||||
|
||||
|
@@ -43,12 +43,16 @@ import java.io.InputStream;
|
||||
import java.io.InputStreamReader;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Arrays;
|
||||
import java.util.Collection;
|
||||
import java.util.Collections;
|
||||
import java.util.HashMap;
|
||||
import java.util.HashSet;
|
||||
import java.util.LinkedHashSet;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.Set;
|
||||
import java.util.SortedMap;
|
||||
import java.util.TreeMap;
|
||||
import java.util.concurrent.locks.Condition;
|
||||
import java.util.concurrent.locks.Lock;
|
||||
import java.util.concurrent.locks.ReentrantLock;
|
||||
@@ -61,41 +65,18 @@ import androidx.annotation.RequiresApi;
|
||||
public class SMSHelper {
|
||||
|
||||
/**
|
||||
* Get the base address for the SMS content
|
||||
* <p>
|
||||
* If we want to support API < 19, it seems to be possible to read via this query
|
||||
* This is highly undocumented and very likely varies between vendors but appears to work
|
||||
* Get a URI for querying SMS messages
|
||||
*/
|
||||
private static Uri getSMSURIBad() {
|
||||
return Uri.parse("content://sms/");
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the base address for the SMS content
|
||||
* <p>
|
||||
* Use the new API way which should work on any phone API >= 19
|
||||
*/
|
||||
@RequiresApi(Build.VERSION_CODES.KITKAT)
|
||||
private static Uri getSMSURIGood() {
|
||||
private static Uri getSMSUri() {
|
||||
// This constant was introduces with API 19 (KitKat)
|
||||
// The value it represents was used in older Android versions so it *should* work but
|
||||
// might vary between vendors.
|
||||
return Telephony.Sms.CONTENT_URI;
|
||||
}
|
||||
|
||||
private static Uri getSMSUri() {
|
||||
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
|
||||
return getSMSURIGood();
|
||||
} else {
|
||||
return getSMSURIBad();
|
||||
}
|
||||
}
|
||||
|
||||
private static Uri getMMSUri() {
|
||||
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
|
||||
return Telephony.Mms.CONTENT_URI;
|
||||
} else {
|
||||
// Same as with getSMSUriBad, this is unsafe if the manufacturer did their own thing
|
||||
// before this was part of the API
|
||||
return Uri.parse("content://mms/");
|
||||
}
|
||||
// Same warning as getSMSUri: This constant was introduced with API 19
|
||||
return Telephony.Mms.CONTENT_URI;
|
||||
}
|
||||
|
||||
private static Uri getMMSPartUri() {
|
||||
@@ -114,8 +95,7 @@ public class SMSHelper {
|
||||
// By my understanding, "simple=true" means we can't support multi-target messages.
|
||||
// Go complain to Samsung about their annoying OS changes!
|
||||
if ("Samsung".equalsIgnoreCase(Build.MANUFACTURER)) {
|
||||
Log.i("SMSHelper", "Samsung compatibility mode enabled. This may cause some features to not work properly.");
|
||||
return Uri.parse("content://mms-sms/conversations?simple=true");
|
||||
Log.i("SMSHelper", "This appears to be a Samsung device. This may cause some features to not work properly.");
|
||||
}
|
||||
|
||||
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
|
||||
@@ -152,15 +132,85 @@ public class SMSHelper {
|
||||
*
|
||||
* @param context android.content.Context running the request
|
||||
* @param threadID Thread to look up
|
||||
* @param numberToGet Number of messages to return. Pass null for "all"
|
||||
* @return List of all messages in the thread
|
||||
*/
|
||||
public static @NonNull List<Message> getMessagesInThread(
|
||||
@NonNull Context context,
|
||||
@NonNull ThreadID threadID
|
||||
@NonNull ThreadID threadID,
|
||||
@Nullable Long numberToGet
|
||||
) {
|
||||
Uri uri = Uri.withAppendedPath(getConversationUri(), threadID.toString());
|
||||
|
||||
return getMessages(uri, context, null, null, null, null);
|
||||
return getMessages(uri, context, null, null, null, numberToGet);
|
||||
}
|
||||
|
||||
/**
|
||||
* Get some messages in the given thread which have timestamp equal to or after the given timestamp
|
||||
*
|
||||
* @param context android.content.Context running the request
|
||||
* @param threadID Thread to look up
|
||||
* @param startTimestamp Beginning of the range to return
|
||||
* @param numberToGet Number of messages to return. Pass null for "all"
|
||||
* @return Some messages in the requested conversation
|
||||
*/
|
||||
@SuppressLint("NewApi")
|
||||
public static @NonNull List<Message> getMessagesInRange(
|
||||
@NonNull Context context,
|
||||
@NonNull ThreadID threadID,
|
||||
@NonNull Long startTimestamp,
|
||||
@Nullable Long numberToGet
|
||||
) {
|
||||
// The stickiness with this is that Android's MMS database has its timestamp in epoch *seconds*
|
||||
// while the SMS database uses epoch *milliseconds*.
|
||||
// I can think of no way around this other than manually querying each one with a different
|
||||
// "WHERE" statement.
|
||||
Uri smsUri = getSMSUri();
|
||||
Uri mmsUri = getMMSUri();
|
||||
|
||||
List<String> allSmsColumns = new ArrayList<>(Arrays.asList(Message.smsColumns));
|
||||
List<String> allMmsColumns = new ArrayList<>(Arrays.asList(Message.mmsColumns));
|
||||
|
||||
if (getSubscriptionIdSupport(smsUri, context)) {
|
||||
allSmsColumns.addAll(Arrays.asList(Message.multiSIMColumns));
|
||||
}
|
||||
|
||||
if (getSubscriptionIdSupport(mmsUri, context)) {
|
||||
allMmsColumns.addAll(Arrays.asList(Message.multiSIMColumns));
|
||||
}
|
||||
|
||||
String selection = Message.THREAD_ID + " = ? AND ? >= " + Message.DATE;
|
||||
|
||||
String[] smsSelectionArgs = new String[] { threadID.toString(), startTimestamp.toString() };
|
||||
String[] mmsSelectionArgs = new String[] { threadID.toString(), Long.toString(startTimestamp / 1000) };
|
||||
|
||||
String sortOrder = Message.DATE + " DESC";
|
||||
|
||||
List<Message> allMessages = getMessages(smsUri, context, allSmsColumns, selection, smsSelectionArgs, sortOrder, numberToGet);
|
||||
allMessages.addAll(getMessages(mmsUri, context, allMmsColumns, selection, mmsSelectionArgs, sortOrder, numberToGet));
|
||||
|
||||
// Need to now only return the requested number of messages:
|
||||
// Suppose we were requested to return N values and suppose a user sends only one MMS per
|
||||
// week and N SMS per day. We have requested the same N for each, so if we just return everything
|
||||
// we would return some very old MMS messages which would be very confusing.
|
||||
SortedMap<Long, Collection<Message>> sortedMessages = new TreeMap<>((lhs, rhs) -> Long.compare(rhs, lhs));
|
||||
for (Message message : allMessages) {
|
||||
Collection<Message> existingMessages = sortedMessages.getOrDefault(message.date, new ArrayList<>());
|
||||
assert existingMessages != null;
|
||||
existingMessages.add(message);
|
||||
sortedMessages.put(message.date, existingMessages);
|
||||
}
|
||||
|
||||
List<Message> toReturn = new ArrayList<>(allMessages.size());
|
||||
|
||||
for (Collection<Message> messages : sortedMessages.values()) {
|
||||
toReturn.addAll(messages);
|
||||
if (numberToGet != null && toReturn.size() >= numberToGet) {
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
return toReturn;
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -187,11 +237,47 @@ public class SMSHelper {
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Checks if device supports `Telephony.Sms.SUBSCRIPTION_ID` column in database with URI `uri`
|
||||
*
|
||||
* @param uri Uri indicating the messages database to check
|
||||
* @param context android.content.Context running the request.
|
||||
*/
|
||||
private static boolean getSubscriptionIdSupport(@NonNull Uri uri, @NonNull Context context) {
|
||||
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP_MR1) {
|
||||
return false;
|
||||
}
|
||||
// Some (Xiaomi) devices running >= Android Lollipop (SDK 22+) don't support
|
||||
// `Telephony.Sms.SUBSCRIPTION_ID`, so additional check is needed.
|
||||
// It may be possible to use "sim_id" instead of "sub_id" on these devices
|
||||
// https://stackoverflow.com/a/38152331/6509200
|
||||
try (Cursor availableColumnsCursor = context.getContentResolver().query(
|
||||
uri,
|
||||
new String[] {Telephony.Sms.SUBSCRIPTION_ID},
|
||||
null,
|
||||
null,
|
||||
null)
|
||||
) {
|
||||
if (availableColumnsCursor != null) {
|
||||
return true; // if we got the cursor, the query shouldn't fail
|
||||
}
|
||||
return false;
|
||||
} catch (SQLiteException e) {
|
||||
// With uri content://mms-sms/conversations this query throws an exception if sub_id is not supported
|
||||
String errMessage = e.getMessage();
|
||||
if (errMessage != null && errMessage.contains(Telephony.Sms.SUBSCRIPTION_ID)) {
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets messages which match the selection
|
||||
*
|
||||
* @param uri Uri indicating the messages database to read
|
||||
* @param context android.content.Context running the request.
|
||||
* @param fetchColumns List of columns to fetch
|
||||
* @param selection Parameterizable filter to use with the ContentResolver query. May be null.
|
||||
* @param selectionArgs Parameters for selection. May be null.
|
||||
* @param sortOrder Sort ordering passed to Android's content resolver. May be null for unspecified
|
||||
@@ -201,6 +287,7 @@ public class SMSHelper {
|
||||
private static @NonNull List<Message> getMessages(
|
||||
@NonNull Uri uri,
|
||||
@NonNull Context context,
|
||||
@NonNull Collection<String> fetchColumns,
|
||||
@Nullable String selection,
|
||||
@Nullable String[] selectionArgs,
|
||||
@Nullable String sortOrder,
|
||||
@@ -212,23 +299,9 @@ public class SMSHelper {
|
||||
// of any MMSes
|
||||
List<String> userPhoneNumbers = TelephonyHelper.getAllPhoneNumbers(context);
|
||||
|
||||
Set<String> allColumns = new HashSet<>();
|
||||
allColumns.addAll(Arrays.asList(Message.smsColumns));
|
||||
allColumns.addAll(Arrays.asList(Message.mmsColumns));
|
||||
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP_MR1) {
|
||||
allColumns.addAll(Arrays.asList(Message.multiSIMColumns));
|
||||
}
|
||||
|
||||
if (!uri.equals(getConversationUri())) {
|
||||
// See https://issuetracker.google.com/issues/134592631
|
||||
allColumns.add(getTransportTypeDiscriminatorColumn());
|
||||
}
|
||||
|
||||
String[] fetchColumns = {};
|
||||
fetchColumns = allColumns.toArray(fetchColumns);
|
||||
try (Cursor myCursor = context.getContentResolver().query(
|
||||
uri,
|
||||
fetchColumns,
|
||||
fetchColumns.toArray(new String[]{}),
|
||||
selection,
|
||||
selectionArgs,
|
||||
sortOrder)
|
||||
@@ -270,19 +343,25 @@ public class SMSHelper {
|
||||
messageInfo.put(colName, body);
|
||||
}
|
||||
|
||||
Message message;
|
||||
if (transportType == TransportType.SMS) {
|
||||
message = parseSMS(context, messageInfo);
|
||||
} else if (transportType == TransportType.MMS) {
|
||||
message = parseMMS(context, messageInfo, userPhoneNumbers);
|
||||
} else {
|
||||
// As we can see, all possible transportTypes are covered, but the compiler
|
||||
// requires this line anyway
|
||||
throw new UnsupportedOperationException("Unknown TransportType encountered");
|
||||
}
|
||||
try {
|
||||
Message message;
|
||||
if (transportType == TransportType.SMS) {
|
||||
message = parseSMS(context, messageInfo);
|
||||
} else if (transportType == TransportType.MMS) {
|
||||
message = parseMMS(context, messageInfo, userPhoneNumbers);
|
||||
} else {
|
||||
// As we can see, all possible transportTypes are covered, but the compiler
|
||||
// requires this line anyway
|
||||
throw new UnsupportedOperationException("Unknown TransportType encountered");
|
||||
}
|
||||
|
||||
toReturn.add(message);
|
||||
} while ((numberToGet == null || toReturn.size() != numberToGet) && myCursor.moveToNext());
|
||||
toReturn.add(message);
|
||||
} catch (Exception e) {
|
||||
// Swallow exceptions in case we get an error reading one message so that we
|
||||
// might be able to read some of them
|
||||
Log.e("SMSHelper", "Got an error reading a message of type " + transportType, e);
|
||||
}
|
||||
} while ((numberToGet == null || toReturn.size() < numberToGet) && myCursor.moveToNext());
|
||||
}
|
||||
} catch (SQLiteException e) {
|
||||
String[] unfilteredColumns = {};
|
||||
@@ -297,9 +376,45 @@ public class SMSHelper {
|
||||
throw new MessageAccessException(unfilteredColumns, uri, e);
|
||||
}
|
||||
}
|
||||
|
||||
return toReturn;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets messages which match the selection
|
||||
*
|
||||
* @param uri Uri indicating the messages database to read
|
||||
* @param context android.content.Context running the request.
|
||||
* @param selection Parameterizable filter to use with the ContentResolver query. May be null.
|
||||
* @param selectionArgs Parameters for selection. May be null.
|
||||
* @param sortOrder Sort ordering passed to Android's content resolver. May be null for unspecified
|
||||
* @param numberToGet Number of things to get from the result. Pass null to get all
|
||||
* @return Returns List<Message> of all messages in the return set, either in the order of sortOrder or in an unspecified order
|
||||
*/
|
||||
@SuppressLint("NewApi")
|
||||
private static @NonNull List<Message> getMessages(
|
||||
@NonNull Uri uri,
|
||||
@NonNull Context context,
|
||||
@Nullable String selection,
|
||||
@Nullable String[] selectionArgs,
|
||||
@Nullable String sortOrder,
|
||||
@Nullable Long numberToGet
|
||||
) {
|
||||
Set<String> allColumns = new HashSet<>();
|
||||
allColumns.addAll(Arrays.asList(Message.smsColumns));
|
||||
allColumns.addAll(Arrays.asList(Message.mmsColumns));
|
||||
if (getSubscriptionIdSupport(uri, context)) {
|
||||
allColumns.addAll(Arrays.asList(Message.multiSIMColumns));
|
||||
}
|
||||
|
||||
if (!uri.equals(getConversationUri())) {
|
||||
// See https://issuetracker.google.com/issues/134592631
|
||||
allColumns.add(getTransportTypeDiscriminatorColumn());
|
||||
}
|
||||
|
||||
return getMessages(uri, context, allColumns, selection, selectionArgs, sortOrder, numberToGet);
|
||||
}
|
||||
|
||||
/**
|
||||
* Get all messages matching the passed filter. See documentation for Android's ContentResolver
|
||||
*
|
||||
@@ -372,7 +487,8 @@ public class SMSHelper {
|
||||
int read = Integer.parseInt(messageInfo.get(Message.READ));
|
||||
@NonNull ThreadID threadID = new ThreadID(Long.parseLong(messageInfo.get(Message.THREAD_ID)));
|
||||
long uID = Long.parseLong(messageInfo.get(Message.U_ID));
|
||||
int subscriptionID = Integer.parseInt(messageInfo.get(Message.SUBSCRIPTION_ID));
|
||||
int subscriptionID = messageInfo.get(Message.SUBSCRIPTION_ID) != null ?
|
||||
Integer.parseInt(messageInfo.get(Message.SUBSCRIPTION_ID)) : 0;
|
||||
|
||||
return new Message(
|
||||
address,
|
||||
@@ -404,7 +520,8 @@ public class SMSHelper {
|
||||
int read = Integer.parseInt(messageInfo.get(Message.READ));
|
||||
@NonNull ThreadID threadID = new ThreadID(Long.parseLong(messageInfo.get(Message.THREAD_ID)));
|
||||
long uID = Long.parseLong(messageInfo.get(Message.U_ID));
|
||||
int subscriptionID = Integer.parseInt(messageInfo.get(Message.SUBSCRIPTION_ID));
|
||||
int subscriptionID = messageInfo.get(Message.SUBSCRIPTION_ID) != null ?
|
||||
Integer.parseInt(messageInfo.get(Message.SUBSCRIPTION_ID)) : 0;
|
||||
|
||||
String[] columns = {
|
||||
Telephony.Mms.Part._ID, // The content ID of this part
|
||||
@@ -473,8 +590,6 @@ public class SMSHelper {
|
||||
// telco service messages) where it is not (only 1 long in that case, just the "sender")
|
||||
|
||||
if (addresses.size() >= 2) {
|
||||
// TODO: Handle addresses for multi-target MMS
|
||||
// Probably we will need to figure out the user's address at this point and strip it out of the list
|
||||
event = addEventFlag(event, Message.EVENT_MULTI_TARGET);
|
||||
}
|
||||
|
||||
@@ -500,6 +615,8 @@ public class SMSHelper {
|
||||
* Get the address(es) of an MMS message
|
||||
* Original implementation from https://stackoverflow.com/a/6446831/3723163
|
||||
*
|
||||
* The message at the first position of the list should be the sender of the message
|
||||
*
|
||||
* @param messageID ID of this message in the MMS database for looking up the remaining info
|
||||
* @param userPhoneNumbers List of phone numbers which should be removed from the list of addresses
|
||||
*/
|
||||
@@ -519,7 +636,8 @@ public class SMSHelper {
|
||||
String selection = Telephony.Mms.Addr.MSG_ID + " = ?";
|
||||
String[] selectionArgs = {messageID.toString()};
|
||||
|
||||
List<Address> addresses = new ArrayList<>();
|
||||
// Keep an ordered set rather than a list because Android sometimes throws duplicates at us
|
||||
Set<Address> addresses = new LinkedHashSet<>();
|
||||
|
||||
try (Cursor addrCursor = context.getContentResolver().query(
|
||||
uri,
|
||||
@@ -668,6 +786,11 @@ public class SMSHelper {
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public int hashCode() {
|
||||
return this.address.hashCode();
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
|
@@ -22,6 +22,8 @@ package org.kde.kdeconnect.Helpers.SecurityHelpers;
|
||||
|
||||
import android.content.Context;
|
||||
import android.content.SharedPreferences;
|
||||
import android.content.res.Configuration;
|
||||
import android.content.res.Resources;
|
||||
import android.os.Build;
|
||||
import android.preference.PreferenceManager;
|
||||
import android.util.Base64;
|
||||
@@ -57,6 +59,7 @@ import java.util.ArrayList;
|
||||
import java.util.Calendar;
|
||||
import java.util.Date;
|
||||
import java.util.Formatter;
|
||||
import java.util.Locale;
|
||||
|
||||
import javax.net.ssl.KeyManagerFactory;
|
||||
import javax.net.ssl.SSLContext;
|
||||
@@ -115,6 +118,10 @@ public class SslHelper {
|
||||
if (needsToGenerateCertificate) {
|
||||
Log.i("KDE/SslHelper", "Generating a certificate");
|
||||
try {
|
||||
//Fix for https://issuetracker.google.com/issues/37095309
|
||||
Locale initialLocale = Locale.getDefault();
|
||||
setLocale(Locale.ENGLISH, context);
|
||||
|
||||
X500NameBuilder nameBuilder = new X500NameBuilder(BCStyle.INSTANCE);
|
||||
nameBuilder.addRDN(BCStyle.CN, deviceId);
|
||||
nameBuilder.addRDN(BCStyle.OU, "KDE Connect");
|
||||
@@ -138,12 +145,22 @@ public class SslHelper {
|
||||
SharedPreferences.Editor edit = settings.edit();
|
||||
edit.putString("certificate", Base64.encodeToString(certificate.getEncoded(), 0));
|
||||
edit.apply();
|
||||
|
||||
setLocale(initialLocale, context);
|
||||
} catch (Exception e) {
|
||||
Log.e("KDE/initialiseCert", "Exception", e);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private static void setLocale(Locale locale, Context context) {
|
||||
Locale.setDefault(locale);
|
||||
Resources resources = context.getResources();
|
||||
Configuration config = resources.getConfiguration();
|
||||
config.locale = locale;
|
||||
resources.updateConfiguration(config, resources.getDisplayMetrics());
|
||||
}
|
||||
|
||||
public static boolean isCertificateStored(Context context, String deviceId) {
|
||||
SharedPreferences devicePreferences = context.getSharedPreferences(deviceId, Context.MODE_PRIVATE);
|
||||
String cert = devicePreferences.getString("certificate", "");
|
||||
|
93
src/org/kde/kdeconnect/Helpers/TrustedNetworkHelper.java
Normal file
93
src/org/kde/kdeconnect/Helpers/TrustedNetworkHelper.java
Normal file
@@ -0,0 +1,93 @@
|
||||
package org.kde.kdeconnect.Helpers;
|
||||
|
||||
import java.util.Arrays;
|
||||
import java.util.Collections;
|
||||
import java.util.List;
|
||||
|
||||
import android.Manifest;
|
||||
import android.content.Context;
|
||||
import android.content.pm.PackageManager;
|
||||
import android.net.wifi.SupplicantState;
|
||||
import android.net.wifi.WifiInfo;
|
||||
import android.net.wifi.WifiManager;
|
||||
import android.preference.PreferenceManager;
|
||||
import android.text.TextUtils;
|
||||
import android.util.Log;
|
||||
|
||||
import androidx.core.content.ContextCompat;
|
||||
|
||||
import org.kde.kdeconnect.UserInterface.PermissionsAlertDialogFragment;
|
||||
import org.kde.kdeconnect_tp.R;
|
||||
|
||||
public class TrustedNetworkHelper {
|
||||
|
||||
private static final String KEY_CUSTOM_TRUSTED_NETWORKS = "trusted_network_preference";
|
||||
private static final String KEY_CUSTOM_TRUST_ALL_NETWORKS = "trust_all_network_preference";
|
||||
private static final String NETWORK_SSID_DELIMITER = "#_#";
|
||||
private static final String NOT_AVAILABLE_SSID_RESULT = "<unknown ssid>";
|
||||
|
||||
|
||||
private final Context context;
|
||||
|
||||
public TrustedNetworkHelper(Context context) {
|
||||
this.context = context;
|
||||
}
|
||||
|
||||
public List<String> read() {
|
||||
String serializeTrustedNetwork = PreferenceManager.getDefaultSharedPreferences(context).getString(
|
||||
KEY_CUSTOM_TRUSTED_NETWORKS, "");
|
||||
if (serializeTrustedNetwork.isEmpty())
|
||||
return Collections.emptyList();
|
||||
return Arrays.asList(serializeTrustedNetwork.split(NETWORK_SSID_DELIMITER));
|
||||
}
|
||||
|
||||
public void update(List<String> trustedNetworks) {
|
||||
String serialized = TextUtils.join(NETWORK_SSID_DELIMITER, trustedNetworks);
|
||||
PreferenceManager.getDefaultSharedPreferences(context).edit().putString(
|
||||
KEY_CUSTOM_TRUSTED_NETWORKS, serialized).apply();
|
||||
}
|
||||
|
||||
public boolean allAllowed() {
|
||||
if (!hasPermissions()) {
|
||||
return true;
|
||||
}
|
||||
return PreferenceManager
|
||||
.getDefaultSharedPreferences(context)
|
||||
.getBoolean(KEY_CUSTOM_TRUST_ALL_NETWORKS, Boolean.TRUE);
|
||||
}
|
||||
|
||||
public void allAllowed(boolean isChecked) {
|
||||
PreferenceManager
|
||||
.getDefaultSharedPreferences(context)
|
||||
.edit()
|
||||
.putBoolean(KEY_CUSTOM_TRUST_ALL_NETWORKS, isChecked)
|
||||
.apply();
|
||||
}
|
||||
|
||||
public boolean hasPermissions() {
|
||||
int result = ContextCompat.checkSelfPermission(context, Manifest.permission.ACCESS_COARSE_LOCATION);
|
||||
return (result == PackageManager.PERMISSION_GRANTED);
|
||||
}
|
||||
|
||||
public String currentSSID() {
|
||||
WifiManager wifiManager = (WifiManager) context.getApplicationContext().getSystemService(Context.WIFI_SERVICE);
|
||||
if (wifiManager == null) return "";
|
||||
WifiInfo wifiInfo = wifiManager.getConnectionInfo();
|
||||
if (wifiInfo.getSupplicantState() != SupplicantState.COMPLETED) {
|
||||
return "";
|
||||
}
|
||||
String ssid = wifiInfo.getSSID();
|
||||
if (ssid.equalsIgnoreCase(NOT_AVAILABLE_SSID_RESULT)){
|
||||
return "";
|
||||
}
|
||||
return ssid;
|
||||
}
|
||||
|
||||
public static boolean isTrustedNetwork(Context context) {
|
||||
TrustedNetworkHelper trustedNetworkHelper = new TrustedNetworkHelper(context);
|
||||
if (trustedNetworkHelper.allAllowed()){
|
||||
return true;
|
||||
}
|
||||
return trustedNetworkHelper.read().contains(trustedNetworkHelper.currentSSID());
|
||||
}
|
||||
}
|
145
src/org/kde/kdeconnect/Helpers/VideoUrlsHelper.java
Normal file
145
src/org/kde/kdeconnect/Helpers/VideoUrlsHelper.java
Normal file
@@ -0,0 +1,145 @@
|
||||
package org.kde.kdeconnect.Helpers;
|
||||
|
||||
import java.net.MalformedURLException;
|
||||
import java.net.URL;
|
||||
import java.util.Locale;
|
||||
|
||||
public class VideoUrlsHelper {
|
||||
private static final int SECONDS_IN_MINUTE = 60;
|
||||
private static final int MINUTES_IN_HOUR = 60;
|
||||
private static final int SECONDS_IN_HOUR = SECONDS_IN_MINUTE * MINUTES_IN_HOUR;
|
||||
|
||||
public static URL formatUriWithSeek(String address, long position)
|
||||
throws MalformedURLException {
|
||||
URL url = new URL(address);
|
||||
position /= 1000; // Convert ms to seconds
|
||||
if (position <= 0) {
|
||||
return url; // nothing to do
|
||||
}
|
||||
String host = url.getHost().toLowerCase();
|
||||
|
||||
// Most common settings as defaults:
|
||||
String parameter = "t="; // Characters before timestamp
|
||||
String timestamp = Long.toString(position); // Timestamp itself
|
||||
String trailer = ""; // Characters after timestamp
|
||||
// true - search/add to query URL part (between ? and # signs),
|
||||
// false - search/add timestamp to ref (anchor) URL part (after # sign),
|
||||
boolean inQuery = true;
|
||||
// true - We know how to format URL with seek timestamp, false - not
|
||||
boolean seekUrl = false;
|
||||
|
||||
// Override defaults if necessary
|
||||
if (host.contains("youtube.com")
|
||||
|| host.contains("youtu.be")
|
||||
|| host.contains("pornhub.com")) {
|
||||
seekUrl = true;
|
||||
url = stripTimestampS(url, parameter, trailer, inQuery);
|
||||
} else if (host.contains("vimeo.com")) {
|
||||
seekUrl = true;
|
||||
trailer = "s";
|
||||
url = stripTimestampS(url, parameter, trailer, inQuery);
|
||||
} else if (host.contains("dailymotion.com")) {
|
||||
seekUrl = true;
|
||||
parameter = "start=";
|
||||
url = stripTimestampS(url, parameter, trailer, inQuery);
|
||||
} else if (host.contains("twitch.tv")) {
|
||||
seekUrl = true;
|
||||
timestamp = formatTimestampHMS(position, true);
|
||||
url = stripTimestampHMS(url, parameter, trailer, inQuery);
|
||||
}
|
||||
|
||||
if (seekUrl) {
|
||||
url = formatUrlWithSeek(url, timestamp, parameter, trailer, inQuery);
|
||||
}
|
||||
return url;
|
||||
}
|
||||
|
||||
// Returns timestamp in 1h2m34s or 01h02m34s (according to padWithZeroes)
|
||||
private static String formatTimestampHMS(long seconds, boolean padWithZeroes) {
|
||||
if (seconds == 0) {
|
||||
return "0s";
|
||||
}
|
||||
|
||||
int sec = (int) (seconds % SECONDS_IN_MINUTE);
|
||||
int min = (int) ((seconds / SECONDS_IN_MINUTE) % MINUTES_IN_HOUR);
|
||||
int hour = (int) (seconds / SECONDS_IN_HOUR);
|
||||
|
||||
String hours = hour > 0 ? hour + "h" : "";
|
||||
String mins = min > 0 || hour > 0 ? min + "m" : "";
|
||||
String secs = sec + "s";
|
||||
|
||||
String value;
|
||||
if (padWithZeroes) {
|
||||
String hoursPad = hour > 9 ? "" : "0";
|
||||
String minsPad = min > 9 ? "" : "0";
|
||||
String secsPad = sec > 9 ? "" : "0";
|
||||
value = hoursPad + hours + minsPad + mins + secsPad + secs;
|
||||
} else {
|
||||
value = hours + mins + secs;
|
||||
}
|
||||
return value;
|
||||
|
||||
}
|
||||
|
||||
// Remove timestamp in 01h02m34s or 1h2m34s or 02m34s or 2m34s or 01s or 1s format.
|
||||
// Can also nandle rimestamps in 1234s format if called with 's' trailer
|
||||
private static URL stripTimestampHMS(URL url, String parameter, String trailer, boolean inQuery)
|
||||
throws MalformedURLException {
|
||||
String regex = parameter + "([\\d]+[hH])?([\\d]+[mM])?[\\d]+[sS]" + trailer + "&?";
|
||||
return stripTimestampCommon(url, inQuery, regex);
|
||||
}
|
||||
|
||||
|
||||
// Remove timestamp in 1234 format
|
||||
private static URL stripTimestampS(URL url, String parameter, String trailer, boolean inQuery)
|
||||
throws MalformedURLException {
|
||||
String regex = parameter + "[\\d]+" + trailer + "&?";
|
||||
return stripTimestampCommon(url, inQuery, regex);
|
||||
}
|
||||
|
||||
private static URL stripTimestampCommon(URL url, boolean inQuery, String regex)
|
||||
throws MalformedURLException {
|
||||
String value;
|
||||
if (inQuery) {
|
||||
value = url.getQuery();
|
||||
} else {
|
||||
value = url.getRef();
|
||||
}
|
||||
if (value == null) {
|
||||
return url;
|
||||
}
|
||||
String newValue = value.replaceAll(regex, "");
|
||||
String replaced = url.toString().replaceFirst(value, newValue);
|
||||
if (inQuery && replaced.endsWith("&")) {
|
||||
replaced = replaced.substring(0, replaced.length() - 1);
|
||||
}
|
||||
return new URL(replaced);
|
||||
}
|
||||
|
||||
private static URL formatUrlWithSeek(URL url, String position, String parameter, String trailer,
|
||||
boolean inQuery) throws MalformedURLException {
|
||||
String value;
|
||||
String separator;
|
||||
String newValue;
|
||||
if (inQuery) {
|
||||
value = url.getQuery();
|
||||
separator = "?";
|
||||
} else {
|
||||
value = url.getRef();
|
||||
separator = "#";
|
||||
}
|
||||
if (value == null) {
|
||||
newValue = String.format(Locale.getDefault(), "%s%s%s%s%s",
|
||||
url.toString(), separator, parameter, position, trailer);
|
||||
return new URL(newValue);
|
||||
}
|
||||
if (inQuery) {
|
||||
newValue = String.format(Locale.getDefault(), "%s&%s%s%s",
|
||||
value, parameter, position, trailer);
|
||||
} else {
|
||||
newValue = String.format(Locale.getDefault(), "%s%s%s",
|
||||
parameter, position, trailer);
|
||||
}
|
||||
return new URL(url.toString().replaceFirst(value, newValue));
|
||||
}
|
||||
}
|
@@ -37,6 +37,12 @@ public class KdeConnectBroadcastReceiver extends BroadcastReceiver {
|
||||
String action = intent.getAction();
|
||||
|
||||
switch (action) {
|
||||
case Intent.ACTION_MY_PACKAGE_REPLACED:
|
||||
Log.i("KdeConnect", "MyUpdateReceiver");
|
||||
BackgroundService.RunCommand(context, service -> {
|
||||
|
||||
});
|
||||
break;
|
||||
case Intent.ACTION_PACKAGE_REPLACED:
|
||||
Log.i("KdeConnect", "UpdateReceiver");
|
||||
if (!intent.getData().getSchemeSpecificPart().equals(context.getPackageName())) {
|
||||
|
41
src/org/kde/kdeconnect/MyApplication.java
Normal file
41
src/org/kde/kdeconnect/MyApplication.java
Normal file
@@ -0,0 +1,41 @@
|
||||
package org.kde.kdeconnect;
|
||||
|
||||
import android.app.Application;
|
||||
|
||||
import androidx.annotation.NonNull;
|
||||
import androidx.lifecycle.DefaultLifecycleObserver;
|
||||
import androidx.lifecycle.LifecycleOwner;
|
||||
import androidx.lifecycle.ProcessLifecycleOwner;
|
||||
|
||||
public class MyApplication extends Application {
|
||||
private static class LifecycleObserver implements DefaultLifecycleObserver {
|
||||
private boolean inForeground = false;
|
||||
|
||||
@Override
|
||||
public void onStart(@NonNull LifecycleOwner owner) {
|
||||
inForeground = true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onStop(@NonNull LifecycleOwner owner) {
|
||||
inForeground = false;
|
||||
}
|
||||
|
||||
boolean isInForeground() {
|
||||
return inForeground;
|
||||
}
|
||||
}
|
||||
|
||||
private static final LifecycleObserver foregroundTracker = new LifecycleObserver();
|
||||
|
||||
@Override
|
||||
public void onCreate() {
|
||||
super.onCreate();
|
||||
|
||||
ProcessLifecycleOwner.get().getLifecycle().addObserver(foregroundTracker);
|
||||
}
|
||||
|
||||
public static boolean isInForeground() {
|
||||
return foregroundTracker.isInForeground();
|
||||
}
|
||||
}
|
@@ -108,6 +108,13 @@ public class NetworkPacket {
|
||||
return mBody.optInt(key, defaultValue);
|
||||
}
|
||||
|
||||
public void set(String key, int value) {
|
||||
try {
|
||||
mBody.put(key, value);
|
||||
} catch (Exception ignored) {
|
||||
}
|
||||
}
|
||||
|
||||
public long getLong(String key) {
|
||||
return mBody.optLong(key, -1);
|
||||
}
|
||||
@@ -116,7 +123,7 @@ public class NetworkPacket {
|
||||
return mBody.optLong(key, defaultValue);
|
||||
}
|
||||
|
||||
public void set(String key, int value) {
|
||||
public void set(String key, long value) {
|
||||
try {
|
||||
mBody.put(key, value);
|
||||
} catch (Exception ignored) {
|
||||
|
@@ -85,7 +85,8 @@ public class BatteryPlugin extends Plugin {
|
||||
IntentFilter intentFilter = new IntentFilter();
|
||||
intentFilter.addAction(Intent.ACTION_BATTERY_CHANGED);
|
||||
intentFilter.addAction(Intent.ACTION_BATTERY_LOW);
|
||||
context.registerReceiver(receiver, intentFilter);
|
||||
Intent currentState = context.registerReceiver(receiver, intentFilter);
|
||||
receiver.onReceive(context, currentState);
|
||||
return true;
|
||||
}
|
||||
|
||||
|
@@ -0,0 +1,53 @@
|
||||
/*
|
||||
* Copyright 2014 Ahmed I. Khalil <ahmedibrahimkhali@gmail.com>
|
||||
* Copyright 2020 Sylvia van Os <sylvia@hackerchick.me>
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU General Public License as
|
||||
* published by the Free Software Foundation; either version 2 of
|
||||
* the License or (at your option) version 3 or any later version
|
||||
* accepted by the membership of KDE e.V. (or its successor approved
|
||||
* by the membership of KDE e.V.), which shall act as a proxy
|
||||
* defined in Section 14 of version 3 of the license.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
package org.kde.kdeconnect.Plugins.BigscreenPlugin;
|
||||
|
||||
import android.os.Bundle;
|
||||
|
||||
import org.kde.kdeconnect.BackgroundService;
|
||||
import org.kde.kdeconnect.UserInterface.ThemeUtil;
|
||||
import org.kde.kdeconnect_tp.R;
|
||||
|
||||
import androidx.appcompat.app.AppCompatActivity;
|
||||
|
||||
public class BigscreenActivity extends AppCompatActivity {
|
||||
|
||||
@Override
|
||||
protected void onCreate(Bundle savedInstanceState) {
|
||||
super.onCreate(savedInstanceState);
|
||||
ThemeUtil.setUserPreferredTheme(this);
|
||||
|
||||
setContentView(R.layout.activity_bigscreen);
|
||||
|
||||
final String deviceId = getIntent().getStringExtra("deviceId");
|
||||
|
||||
BackgroundService.RunWithPlugin(this, deviceId, org.kde.kdeconnect.Plugins.BigscreenPlugin.BigscreenPlugin.class, plugin -> runOnUiThread(() -> {
|
||||
findViewById(R.id.left_button).setOnClickListener(v -> plugin.sendLeft());
|
||||
findViewById(R.id.right_button).setOnClickListener(v -> plugin.sendRight());
|
||||
findViewById(R.id.up_button).setOnClickListener(v -> plugin.sendUp());
|
||||
findViewById(R.id.down_button).setOnClickListener(v -> plugin.sendDown());
|
||||
findViewById(R.id.select_button).setOnClickListener(v -> plugin.sendSelect());
|
||||
findViewById(R.id.home_button).setOnClickListener(v -> plugin.sendHome());
|
||||
}));
|
||||
}
|
||||
}
|
||||
|
@@ -0,0 +1,130 @@
|
||||
/*
|
||||
* Copyright 2014 Ahmed I. Khalil <ahmedibrahimkhali@gmail.com>
|
||||
* Copyright 2020 Sylvia van Os <sylvia@hackerchick.me>
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU General Public License as
|
||||
* published by the Free Software Foundation; either version 2 of
|
||||
* the License or (at your option) version 3 or any later version
|
||||
* accepted by the membership of KDE e.V. (or its successor approved
|
||||
* by the membership of KDE e.V.), which shall act as a proxy
|
||||
* defined in Section 14 of version 3 of the license.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
package org.kde.kdeconnect.Plugins.BigscreenPlugin;
|
||||
|
||||
|
||||
import android.app.Activity;
|
||||
import android.content.Intent;
|
||||
import android.graphics.drawable.Drawable;
|
||||
import android.view.KeyEvent;
|
||||
|
||||
import org.kde.kdeconnect.NetworkPacket;
|
||||
import org.kde.kdeconnect.Plugins.Plugin;
|
||||
import org.kde.kdeconnect.Plugins.PluginFactory;
|
||||
import org.kde.kdeconnect_tp.R;
|
||||
|
||||
import androidx.core.content.ContextCompat;
|
||||
|
||||
import static org.kde.kdeconnect.Plugins.MousePadPlugin.KeyListenerView.SpecialKeysMap;
|
||||
|
||||
@PluginFactory.LoadablePlugin
|
||||
public class BigscreenPlugin extends Plugin {
|
||||
|
||||
private final static String PACKET_TYPE_MOUSEPAD_REQUEST = "kdeconnect.mousepad.request";
|
||||
|
||||
@Override
|
||||
public String getDisplayName() {
|
||||
return context.getString(R.string.pref_plugin_bigscreen);
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getDescription() {
|
||||
return context.getString(R.string.pref_plugin_bigscreen_desc);
|
||||
}
|
||||
|
||||
@Override
|
||||
public Drawable getIcon() {
|
||||
return ContextCompat.getDrawable(context, R.drawable.ic_presenter);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isEnabledByDefault() {
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean hasSettings() {
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean hasMainActivity() {
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void startMainActivity(Activity parentActivity) {
|
||||
Intent intent = new Intent(parentActivity, BigscreenActivity.class);
|
||||
intent.putExtra("deviceId", device.getDeviceId());
|
||||
parentActivity.startActivity(intent);
|
||||
}
|
||||
|
||||
@Override
|
||||
public String[] getSupportedPacketTypes() { return new String[0]; }
|
||||
|
||||
@Override
|
||||
public String[] getOutgoingPacketTypes() {
|
||||
return new String[]{PACKET_TYPE_MOUSEPAD_REQUEST};
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getActionName() {
|
||||
return context.getString(R.string.pref_plugin_bigscreen);
|
||||
}
|
||||
|
||||
public void sendLeft() {
|
||||
NetworkPacket np = new NetworkPacket(PACKET_TYPE_MOUSEPAD_REQUEST);
|
||||
np.set("specialKey", SpecialKeysMap.get(KeyEvent.KEYCODE_DPAD_LEFT));
|
||||
device.sendPacket(np);
|
||||
}
|
||||
|
||||
public void sendRight() {
|
||||
NetworkPacket np = new NetworkPacket(PACKET_TYPE_MOUSEPAD_REQUEST);
|
||||
np.set("specialKey", SpecialKeysMap.get(KeyEvent.KEYCODE_DPAD_RIGHT));
|
||||
device.sendPacket(np);
|
||||
}
|
||||
|
||||
public void sendUp() {
|
||||
NetworkPacket np = new NetworkPacket(PACKET_TYPE_MOUSEPAD_REQUEST);
|
||||
np.set("specialKey", SpecialKeysMap.get(KeyEvent.KEYCODE_DPAD_UP));
|
||||
device.sendPacket(np);
|
||||
}
|
||||
|
||||
public void sendDown() {
|
||||
NetworkPacket np = new NetworkPacket(PACKET_TYPE_MOUSEPAD_REQUEST);
|
||||
np.set("specialKey", SpecialKeysMap.get(KeyEvent.KEYCODE_DPAD_DOWN));
|
||||
device.sendPacket(np);
|
||||
}
|
||||
|
||||
public void sendSelect() {
|
||||
NetworkPacket np = new NetworkPacket(PACKET_TYPE_MOUSEPAD_REQUEST);
|
||||
np.set("specialKey", SpecialKeysMap.get(KeyEvent.KEYCODE_ENTER));
|
||||
device.sendPacket(np);
|
||||
}
|
||||
|
||||
public void sendHome() {
|
||||
NetworkPacket np = new NetworkPacket(PACKET_TYPE_MOUSEPAD_REQUEST);
|
||||
np.set("alt", true);
|
||||
np.set("specialKey", SpecialKeysMap.get(KeyEvent.KEYCODE_F4));
|
||||
device.sendPacket(np);
|
||||
}
|
||||
}
|
@@ -0,0 +1,94 @@
|
||||
/*
|
||||
* Copyright 2020 Anjani Kumar <anjanik012@gmail.com>
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU General Public License as
|
||||
* published by the Free Software Foundation; either version 2 of
|
||||
* the License or (at your option) version 3 or any later version
|
||||
* accepted by the membership of KDE e.V. (or its successor approved
|
||||
* by the membership of KDE e.V.), which shall act as a proxy
|
||||
* defined in Section 14 of version 3 of the license.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
package org.kde.kdeconnect.Plugins.ClibpoardPlugin;
|
||||
|
||||
import androidx.appcompat.app.AppCompatActivity;
|
||||
|
||||
import android.content.ClipData;
|
||||
import android.content.ClipboardManager;
|
||||
import android.content.Context;
|
||||
import android.os.Bundle;
|
||||
import android.view.WindowManager;
|
||||
import android.widget.Toast;
|
||||
|
||||
import org.kde.kdeconnect.BackgroundService;
|
||||
import org.kde.kdeconnect.Device;
|
||||
import org.kde.kdeconnect_tp.R;
|
||||
|
||||
import java.util.ArrayList;
|
||||
|
||||
/*
|
||||
An activity to access the clipboard on Android 10 and later by raising over other apps.
|
||||
This is invisible and doesn't require any interaction from the user.
|
||||
This should be called when a change in clipboard is detected. This can be done by manually
|
||||
when user wants to send the clipboard or by reading system log files which requires a special
|
||||
privileged permission android.permission.READ_LOGS.
|
||||
https://developer.android.com/reference/android/Manifest.permission#READ_LOGS
|
||||
This permission can be gained by only from the adb by the user.
|
||||
https://www.reddit.com/r/AndroidBusters/comments/fh60lt/how_to_solve_a_problem_with_the_clipboard_on/
|
||||
|
||||
Currently this activity is bering triggered from a button in Foreground Notification.
|
||||
* */
|
||||
public class ClipboardFloatingActivity extends AppCompatActivity {
|
||||
|
||||
private ArrayList<Device> connectedDevices = new ArrayList<>();
|
||||
|
||||
@Override
|
||||
public void onWindowFocusChanged(boolean hasFocus) {
|
||||
super.onWindowFocusChanged(hasFocus);
|
||||
if (hasFocus) {
|
||||
// We are now sure that clipboard can be accessed from here.
|
||||
ClipboardManager clipboardManager = (ClipboardManager) getSystemService(Context.CLIPBOARD_SERVICE);
|
||||
ClipData.Item item;
|
||||
if (clipboardManager.hasPrimaryClip()) {
|
||||
item = clipboardManager.getPrimaryClip().getItemAt(0);
|
||||
String content = item.coerceToText(this).toString();
|
||||
for (Device device : connectedDevices) {
|
||||
ClipboardPlugin clipboardPlugin = (ClipboardPlugin) device.getPlugin("ClipboardPlugin");
|
||||
if (clipboardPlugin != null) {
|
||||
clipboardPlugin.propagateClipboard(content);
|
||||
}
|
||||
}
|
||||
Toast.makeText(this, R.string.pref_plugin_clipboard_sent, Toast.LENGTH_SHORT).show();
|
||||
}
|
||||
finish();
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void onCreate(Bundle savedInstanceState) {
|
||||
super.onCreate(savedInstanceState);
|
||||
setContentView(R.layout.activity_clipboard_floating);
|
||||
WindowManager.LayoutParams wlp = getWindow().getAttributes();
|
||||
wlp.dimAmount = 0;
|
||||
wlp.flags = WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS |
|
||||
WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL;
|
||||
|
||||
getWindow().setAttributes(wlp);
|
||||
ArrayList<String> connectedDeviceIds = getIntent().getStringArrayListExtra("connectedDeviceIds");
|
||||
if (connectedDeviceIds != null) {
|
||||
for (String deviceId : connectedDeviceIds) {
|
||||
connectedDevices.add(BackgroundService.getInstance().getDevice(deviceId));
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@@ -51,6 +51,7 @@ public class ClipboardListener {
|
||||
public static ClipboardListener instance(Context context) {
|
||||
if (_instance == null) {
|
||||
_instance = new ClipboardListener(context);
|
||||
// FIXME: The _instance we return won't be completely initialized yet since initialization happens on a new thread (why?)
|
||||
}
|
||||
return _instance;
|
||||
}
|
||||
@@ -102,9 +103,11 @@ public class ClipboardListener {
|
||||
|
||||
@SuppressWarnings("deprecation")
|
||||
public void setText(String text) {
|
||||
updateTimestamp = System.currentTimeMillis();
|
||||
currentContent = text;
|
||||
cm.setText(text);
|
||||
if (cm != null) {
|
||||
updateTimestamp = System.currentTimeMillis();
|
||||
currentContent = text;
|
||||
cm.setText(text);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
@@ -20,6 +20,8 @@
|
||||
|
||||
package org.kde.kdeconnect.Plugins.ClibpoardPlugin;
|
||||
|
||||
|
||||
|
||||
import org.kde.kdeconnect.NetworkPacket;
|
||||
import org.kde.kdeconnect.Plugins.Plugin;
|
||||
import org.kde.kdeconnect.Plugins.PluginFactory;
|
||||
@@ -85,7 +87,7 @@ public class ClipboardPlugin extends Plugin {
|
||||
|
||||
private final ClipboardListener.ClipboardObserver observer = this::propagateClipboard;
|
||||
|
||||
private void propagateClipboard(String content) {
|
||||
void propagateClipboard(String content) {
|
||||
NetworkPacket np = new NetworkPacket(ClipboardPlugin.PACKET_TYPE_CLIPBOARD);
|
||||
np.set("content", content);
|
||||
device.sendPacket(np);
|
||||
@@ -100,6 +102,7 @@ public class ClipboardPlugin extends Plugin {
|
||||
device.sendPacket(np);
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public boolean onCreate() {
|
||||
ClipboardListener.instance(context).registerObserver(observer);
|
||||
|
@@ -26,12 +26,12 @@ package org.kde.kdeconnect.Plugins.ContactsPlugin;
|
||||
import android.Manifest;
|
||||
import android.annotation.TargetApi;
|
||||
import android.os.Build;
|
||||
import android.provider.ContactsContract;
|
||||
import android.util.Log;
|
||||
|
||||
import org.kde.kdeconnect.Helpers.ContactsHelper;
|
||||
import org.kde.kdeconnect.Helpers.ContactsHelper.VCardBuilder;
|
||||
import org.kde.kdeconnect.Helpers.ContactsHelper.uID;
|
||||
import org.kde.kdeconnect.Helpers.ContactsHelper.ContactNotFoundException;
|
||||
import org.kde.kdeconnect.NetworkPacket;
|
||||
import org.kde.kdeconnect.Plugins.Plugin;
|
||||
import org.kde.kdeconnect.Plugins.PluginFactory;
|
||||
@@ -141,9 +141,10 @@ public class ContactsPlugin extends Plugin {
|
||||
*
|
||||
* @param vcard vcard to apply metadata to
|
||||
* @param uID uID to which the vcard corresponds
|
||||
* @throws ContactNotFoundException If the given ID for some reason does not match a contact
|
||||
* @return The same VCard as was passed in, but now with KDE Connect-specific fields
|
||||
*/
|
||||
private VCardBuilder addVCardMetadata(VCardBuilder vcard, uID uID) {
|
||||
private VCardBuilder addVCardMetadata(VCardBuilder vcard, uID uID) throws ContactNotFoundException {
|
||||
// Append the device ID line
|
||||
// Unclear if the deviceID forms a valid name per the vcard spec. Worry about that later..
|
||||
vcard.appendLine("X-KDECONNECT-ID-DEV-" + device.getDeviceId(),
|
||||
@@ -151,16 +152,9 @@ public class ContactsPlugin extends Plugin {
|
||||
|
||||
// Build the timestamp line
|
||||
// Maybe one day this should be changed into the vcard-standard REV key
|
||||
List<uID> uIDs = new ArrayList<>();
|
||||
uIDs.add(uID);
|
||||
|
||||
final String[] contactsProjection = new String[]{
|
||||
ContactsContract.Contacts.CONTACT_LAST_UPDATED_TIMESTAMP
|
||||
};
|
||||
|
||||
Map<uID, Map<String, Object>> timestamp = ContactsHelper.getColumnsFromContactsForIDs(context, uIDs, contactsProjection);
|
||||
Long timestamp = ContactsHelper.getContactTimestamp(context, uID);
|
||||
vcard.appendLine("X-KDECONNECT-TIMESTAMP",
|
||||
timestamp.get(uID).get(ContactsContract.Contacts.CONTACT_LAST_UPDATED_TIMESTAMP).toString());
|
||||
timestamp.toString());
|
||||
|
||||
return vcard;
|
||||
}
|
||||
@@ -178,26 +172,19 @@ public class ContactsPlugin extends Plugin {
|
||||
private boolean handleRequestAllUIDsTimestamps(@SuppressWarnings("unused") NetworkPacket np) {
|
||||
NetworkPacket reply = new NetworkPacket(PACKET_TYPE_CONTACTS_RESPONSE_UIDS_TIMESTAMPS);
|
||||
|
||||
List<uID> uIDs = ContactsHelper.getAllContactContactIDs(context);
|
||||
Map<uID, Long> uIDsToTimestamps = ContactsHelper.getAllContactTimestamps(context);
|
||||
|
||||
List<String> uIDsAsStrings = new ArrayList<>(uIDs.size());
|
||||
int contactCount = uIDsToTimestamps.size();
|
||||
|
||||
for (uID uID : uIDs) {
|
||||
uIDsAsStrings.add(uID.toString());
|
||||
List<String> uIDs = new ArrayList<>(contactCount);
|
||||
|
||||
for (uID contactID : uIDsToTimestamps.keySet()) {
|
||||
Long timestamp = uIDsToTimestamps.get(contactID);
|
||||
reply.set(contactID.toString(), timestamp);
|
||||
uIDs.add(contactID.toString());
|
||||
}
|
||||
|
||||
final String[] contactsProjection = new String[]{
|
||||
ContactsContract.Contacts.CONTACT_LAST_UPDATED_TIMESTAMP
|
||||
};
|
||||
|
||||
reply.set("uids", uIDsAsStrings);
|
||||
|
||||
// Add last-modified timestamps
|
||||
Map<uID, Map<String, Object>> uIDsToTimestamps = ContactsHelper.getColumnsFromContactsForIDs(context, uIDs, contactsProjection);
|
||||
for (uID ID : uIDsToTimestamps.keySet()) {
|
||||
Map<String, Object> data = uIDsToTimestamps.get(ID);
|
||||
reply.set(ID.toString(), (Integer) data.get(ContactsContract.Contacts.CONTACT_LAST_UPDATED_TIMESTAMP));
|
||||
}
|
||||
reply.set("uids", uIDs);
|
||||
|
||||
device.sendPacket(reply);
|
||||
|
||||
@@ -230,12 +217,17 @@ public class ContactsPlugin extends Plugin {
|
||||
for (uID uID : uIDsToVCards.keySet()) {
|
||||
VCardBuilder vcard = uIDsToVCards.get(uID);
|
||||
|
||||
vcard = this.addVCardMetadata(vcard, uID);
|
||||
try {
|
||||
vcard = this.addVCardMetadata(vcard, uID);
|
||||
|
||||
// Store this as a valid uID
|
||||
uIDsAsStrings.add(uID.toString());
|
||||
// Add the uid -> vcard pairing to the packet
|
||||
reply.set(uID.toString(), vcard.toString());
|
||||
// Store this as a valid uID
|
||||
uIDsAsStrings.add(uID.toString());
|
||||
// Add the uid -> vcard pairing to the packet
|
||||
reply.set(uID.toString(), vcard.toString());
|
||||
|
||||
} catch (ContactsHelper.ContactNotFoundException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
|
||||
// Add the valid uIDs to the packet
|
||||
|
@@ -19,47 +19,37 @@
|
||||
*/
|
||||
package org.kde.kdeconnect.Plugins.FindMyPhonePlugin;
|
||||
|
||||
import android.app.Activity;
|
||||
import android.content.Context;
|
||||
import android.content.Intent;
|
||||
import android.content.SharedPreferences;
|
||||
import android.media.AudioManager;
|
||||
import android.media.MediaPlayer;
|
||||
import android.net.Uri;
|
||||
import android.os.Bundle;
|
||||
import android.preference.PreferenceManager;
|
||||
import android.provider.Settings;
|
||||
import android.util.Log;
|
||||
import android.view.Window;
|
||||
import android.view.WindowManager;
|
||||
|
||||
import androidx.appcompat.app.AppCompatActivity;
|
||||
|
||||
import org.kde.kdeconnect.BackgroundService;
|
||||
import org.kde.kdeconnect.UserInterface.ThemeUtil;
|
||||
import org.kde.kdeconnect_tp.R;
|
||||
|
||||
public class FindMyPhoneActivity extends Activity {
|
||||
public class FindMyPhoneActivity extends AppCompatActivity {
|
||||
static final String EXTRA_DEVICE_ID = "deviceId";
|
||||
|
||||
private MediaPlayer mediaPlayer;
|
||||
private int previousVolume;
|
||||
private AudioManager audioManager;
|
||||
|
||||
@Override
|
||||
protected void onNewIntent(Intent intent) {
|
||||
super.onNewIntent(intent);
|
||||
|
||||
if (mediaPlayer != null) {
|
||||
// If this activity was already open and we received the ring packet again, just finish it
|
||||
finish();
|
||||
}
|
||||
// otherwise the activity will become active again
|
||||
}
|
||||
private String deviceId;
|
||||
private FindMyPhonePlugin plugin;
|
||||
|
||||
@Override
|
||||
protected void onCreate(Bundle savedInstanceState) {
|
||||
super.onCreate(savedInstanceState);
|
||||
|
||||
ThemeUtil.setUserPreferredTheme(this);
|
||||
setContentView(R.layout.activity_find_my_phone);
|
||||
|
||||
audioManager = (AudioManager) getSystemService(Context.AUDIO_SERVICE);
|
||||
if (!getIntent().hasExtra(EXTRA_DEVICE_ID)) {
|
||||
Log.e("FindMyPhoneActivity", "You must include the deviceId for which this activity is started as an intent EXTRA");
|
||||
finish();
|
||||
}
|
||||
|
||||
deviceId = getIntent().getStringExtra(EXTRA_DEVICE_ID);
|
||||
plugin = BackgroundService.getInstance().getDevice(deviceId).getPlugin(FindMyPhonePlugin.class);
|
||||
|
||||
Window window = this.getWindow();
|
||||
window.addFlags(WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD |
|
||||
@@ -72,42 +62,19 @@ public class FindMyPhoneActivity extends Activity {
|
||||
@Override
|
||||
protected void onStart() {
|
||||
super.onStart();
|
||||
|
||||
try {
|
||||
// Make sure we are heard even when the phone is silent, restore original volume later
|
||||
previousVolume = audioManager.getStreamVolume(AudioManager.STREAM_ALARM);
|
||||
audioManager.setStreamVolume(AudioManager.STREAM_ALARM, audioManager.getStreamMaxVolume(AudioManager.STREAM_ALARM), 0);
|
||||
|
||||
SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(this);
|
||||
Uri ringtone;
|
||||
String ringtoneString = prefs.getString(getString(R.string.findmyphone_preference_key_ringtone), "");
|
||||
if (ringtoneString.isEmpty()) {
|
||||
ringtone = Settings.System.DEFAULT_RINGTONE_URI;
|
||||
} else {
|
||||
ringtone = Uri.parse(ringtoneString);
|
||||
}
|
||||
|
||||
mediaPlayer = new MediaPlayer();
|
||||
mediaPlayer.setDataSource(this, ringtone);
|
||||
mediaPlayer.setAudioStreamType(AudioManager.STREAM_ALARM);
|
||||
mediaPlayer.setLooping(true);
|
||||
mediaPlayer.prepare();
|
||||
mediaPlayer.start();
|
||||
|
||||
} catch (Exception e) {
|
||||
Log.e("FindMyPhoneActivity", "Exception", e);
|
||||
}
|
||||
|
||||
/*
|
||||
For whatever reason when Android launches this activity as a SystemAlertWindow it calls:
|
||||
onCreate(), onStart(), onResume(), onStop(), onStart(), onResume().
|
||||
When using BackgroundService.RunWithPlugin we get into concurrency problems and sometimes no sound will be played
|
||||
*/
|
||||
plugin.startPlaying();
|
||||
plugin.hideNotification();
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void onStop() {
|
||||
super.onStop();
|
||||
|
||||
if (mediaPlayer != null) {
|
||||
mediaPlayer.stop();
|
||||
}
|
||||
audioManager.setStreamVolume(AudioManager.STREAM_ALARM, previousVolume, 0);
|
||||
plugin.stopPlaying();
|
||||
}
|
||||
|
||||
}
|
||||
|
@@ -21,20 +21,45 @@
|
||||
package org.kde.kdeconnect.Plugins.FindMyPhonePlugin;
|
||||
|
||||
import android.app.Activity;
|
||||
import android.app.NotificationManager;
|
||||
import android.app.PendingIntent;
|
||||
import android.content.Context;
|
||||
import android.content.Intent;
|
||||
import android.content.SharedPreferences;
|
||||
import android.media.AudioManager;
|
||||
import android.media.MediaPlayer;
|
||||
import android.net.Uri;
|
||||
import android.os.Build;
|
||||
import android.os.PowerManager;
|
||||
import android.preference.PreferenceManager;
|
||||
import android.provider.Settings;
|
||||
import android.util.Log;
|
||||
|
||||
import androidx.annotation.RequiresApi;
|
||||
import androidx.core.app.NotificationCompat;
|
||||
|
||||
import org.kde.kdeconnect.Helpers.DeviceHelper;
|
||||
import org.kde.kdeconnect.Helpers.NotificationHelper;
|
||||
import org.kde.kdeconnect.MyApplication;
|
||||
import org.kde.kdeconnect.NetworkPacket;
|
||||
import org.kde.kdeconnect.Plugins.Plugin;
|
||||
import org.kde.kdeconnect.Plugins.PluginFactory;
|
||||
import org.kde.kdeconnect.UserInterface.PluginSettingsFragment;
|
||||
import org.kde.kdeconnect_tp.R;
|
||||
|
||||
import java.io.IOException;
|
||||
|
||||
@PluginFactory.LoadablePlugin
|
||||
public class FindMyPhonePlugin extends Plugin {
|
||||
|
||||
public final static String PACKET_TYPE_FINDMYPHONE_REQUEST = "kdeconnect.findmyphone.request";
|
||||
|
||||
private NotificationManager notificationManager;
|
||||
private int notificationId;
|
||||
private AudioManager audioManager;
|
||||
private MediaPlayer mediaPlayer;
|
||||
private int previousVolume = -1;
|
||||
private PowerManager powerManager;
|
||||
|
||||
@Override
|
||||
public String getDisplayName() {
|
||||
switch (DeviceHelper.getDeviceType(context)) {
|
||||
@@ -55,13 +80,132 @@ public class FindMyPhonePlugin extends Plugin {
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean onPacketReceived(NetworkPacket np) {
|
||||
public boolean onCreate() {
|
||||
notificationManager = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);
|
||||
notificationId = (int) System.currentTimeMillis();
|
||||
audioManager = (AudioManager) context.getSystemService(Context.AUDIO_SERVICE);
|
||||
powerManager = (PowerManager) context.getSystemService(Context.POWER_SERVICE);
|
||||
|
||||
SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context);
|
||||
Uri ringtone;
|
||||
String ringtoneString = prefs.getString(context.getString(R.string.findmyphone_preference_key_ringtone), "");
|
||||
if (ringtoneString.isEmpty()) {
|
||||
ringtone = Settings.System.DEFAULT_RINGTONE_URI;
|
||||
} else {
|
||||
ringtone = Uri.parse(ringtoneString);
|
||||
}
|
||||
|
||||
try {
|
||||
mediaPlayer = new MediaPlayer();
|
||||
mediaPlayer.setDataSource(context, ringtone);
|
||||
//TODO: Deprecated use setAudioAttributes for API > 21
|
||||
mediaPlayer.setAudioStreamType(AudioManager.STREAM_ALARM);
|
||||
mediaPlayer.setLooping(true);
|
||||
mediaPlayer.prepare();
|
||||
} catch (Exception e) {
|
||||
Log.e("FindMyPhoneActivity", "Exception", e);
|
||||
return false;
|
||||
}
|
||||
|
||||
Intent intent = new Intent(context, FindMyPhoneActivity.class);
|
||||
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
|
||||
context.startActivity(intent);
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onDestroy() {
|
||||
if (mediaPlayer.isPlaying()) {
|
||||
stopPlaying();
|
||||
}
|
||||
audioManager = null;
|
||||
mediaPlayer.release();
|
||||
mediaPlayer = null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean onPacketReceived(NetworkPacket np) {
|
||||
if (Build.VERSION.SDK_INT < 29 || MyApplication.isInForeground()) {
|
||||
Intent intent = new Intent(context, FindMyPhoneActivity.class);
|
||||
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
|
||||
intent.putExtra(FindMyPhoneActivity.EXTRA_DEVICE_ID, device.getDeviceId());
|
||||
context.startActivity(intent);
|
||||
} else {
|
||||
if (powerManager.isInteractive()) {
|
||||
startPlaying();
|
||||
showBroadcastNotification();
|
||||
} else {
|
||||
showActivityNotification();
|
||||
}
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
@RequiresApi(16)
|
||||
private void showBroadcastNotification() {
|
||||
Intent intent = new Intent(context, FindMyPhoneReceiver.class);
|
||||
intent.addFlags(Intent.FLAG_RECEIVER_FOREGROUND);
|
||||
intent.setAction(FindMyPhoneReceiver.ACTION_FOUND_IT);
|
||||
intent.putExtra(FindMyPhoneReceiver.EXTRA_DEVICE_ID, device.getDeviceId());
|
||||
|
||||
PendingIntent pendingIntent = PendingIntent.getBroadcast(context, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT);
|
||||
|
||||
createNotification(pendingIntent);
|
||||
}
|
||||
|
||||
private void showActivityNotification() {
|
||||
Intent intent = new Intent(context, FindMyPhoneActivity.class);
|
||||
intent.putExtra(FindMyPhoneActivity.EXTRA_DEVICE_ID, device.getDeviceId());
|
||||
|
||||
PendingIntent pi = PendingIntent.getActivity(context, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT);
|
||||
createNotification(pi);
|
||||
}
|
||||
|
||||
private void createNotification(PendingIntent pendingIntent) {
|
||||
NotificationCompat.Builder notification = new NotificationCompat.Builder(context, NotificationHelper.Channels.HIGHPRIORITY);
|
||||
notification
|
||||
.setSmallIcon(R.drawable.ic_notification)
|
||||
.setOngoing(false)
|
||||
.setFullScreenIntent(pendingIntent, true)
|
||||
.setPriority(NotificationCompat.PRIORITY_HIGH)
|
||||
.setAutoCancel(true)
|
||||
.setContentTitle(context.getString(R.string.findmyphone_found));
|
||||
notification.setGroup("BackgroundService");
|
||||
|
||||
notificationManager.notify(notificationId, notification.build());
|
||||
}
|
||||
|
||||
void startPlaying() {
|
||||
if (mediaPlayer != null && !mediaPlayer.isPlaying()) {
|
||||
// Make sure we are heard even when the phone is silent, restore original volume later
|
||||
previousVolume = audioManager.getStreamVolume(AudioManager.STREAM_ALARM);
|
||||
audioManager.setStreamVolume(AudioManager.STREAM_ALARM, audioManager.getStreamMaxVolume(AudioManager.STREAM_ALARM), 0);
|
||||
|
||||
mediaPlayer.start();
|
||||
}
|
||||
}
|
||||
|
||||
void hideNotification() {
|
||||
notificationManager.cancel(notificationId);
|
||||
}
|
||||
|
||||
void stopPlaying() {
|
||||
if (audioManager == null) {
|
||||
// The Plugin was destroyed (probably the device disconnected)
|
||||
return;
|
||||
}
|
||||
|
||||
if (previousVolume != -1) {
|
||||
audioManager.setStreamVolume(AudioManager.STREAM_ALARM, previousVolume, 0);
|
||||
}
|
||||
mediaPlayer.stop();
|
||||
try {
|
||||
mediaPlayer.prepare();
|
||||
} catch (IOException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
|
||||
boolean isPlaying() {
|
||||
return mediaPlayer.isPlaying();
|
||||
}
|
||||
|
||||
@Override
|
||||
|
@@ -0,0 +1,35 @@
|
||||
package org.kde.kdeconnect.Plugins.FindMyPhonePlugin;
|
||||
|
||||
import android.content.BroadcastReceiver;
|
||||
import android.content.Context;
|
||||
import android.content.Intent;
|
||||
import android.util.Log;
|
||||
|
||||
import org.kde.kdeconnect.BackgroundService;
|
||||
|
||||
public class FindMyPhoneReceiver extends BroadcastReceiver {
|
||||
final static String ACTION_FOUND_IT = "org.kde.kdeconnect.Plugins.FindMyPhonePlugin.foundIt";
|
||||
final static String EXTRA_DEVICE_ID = "deviceId";
|
||||
|
||||
@Override
|
||||
public void onReceive(Context context, Intent intent) {
|
||||
switch (intent.getAction()) {
|
||||
case ACTION_FOUND_IT:
|
||||
foundIt(context, intent);
|
||||
break;
|
||||
default:
|
||||
Log.d("ShareBroadcastReceiver", "Unhandled Action received: " + intent.getAction());
|
||||
}
|
||||
}
|
||||
|
||||
private void foundIt(Context context, Intent intent) {
|
||||
if (!intent.hasExtra(EXTRA_DEVICE_ID)) {
|
||||
Log.e("FindMyPhoneReceiver", "foundIt() - deviceId extra is not present, ignoring");
|
||||
return;
|
||||
}
|
||||
|
||||
String deviceId = intent.getStringExtra(EXTRA_DEVICE_ID);
|
||||
|
||||
BackgroundService.RunWithPlugin(context, deviceId, FindMyPhonePlugin.class, FindMyPhonePlugin::stopPlaying);
|
||||
}
|
||||
}
|
@@ -20,14 +20,21 @@
|
||||
|
||||
package org.kde.kdeconnect.Plugins.MprisPlugin;
|
||||
|
||||
import android.app.Activity;
|
||||
import android.content.ActivityNotFoundException;
|
||||
import android.content.Intent;
|
||||
import android.content.SharedPreferences;
|
||||
import android.graphics.Bitmap;
|
||||
import android.graphics.drawable.Drawable;
|
||||
import android.net.Uri;
|
||||
import android.os.Bundle;
|
||||
import android.os.Handler;
|
||||
import android.os.Message;
|
||||
import android.preference.PreferenceManager;
|
||||
import android.view.KeyEvent;
|
||||
import android.view.Menu;
|
||||
import android.view.MenuInflater;
|
||||
import android.view.MenuItem;
|
||||
import android.view.View;
|
||||
import android.widget.AdapterView;
|
||||
import android.widget.ArrayAdapter;
|
||||
@@ -37,15 +44,18 @@ import android.widget.LinearLayout;
|
||||
import android.widget.SeekBar;
|
||||
import android.widget.Spinner;
|
||||
import android.widget.TextView;
|
||||
import android.widget.Toast;
|
||||
|
||||
import org.kde.kdeconnect.Backends.BaseLink;
|
||||
import org.kde.kdeconnect.Backends.BaseLinkProvider;
|
||||
import org.kde.kdeconnect.BackgroundService;
|
||||
import org.kde.kdeconnect.Helpers.VideoUrlsHelper;
|
||||
import org.kde.kdeconnect.NetworkPacket;
|
||||
import org.kde.kdeconnect.Plugins.SystemvolumePlugin.SystemvolumeFragment;
|
||||
import org.kde.kdeconnect.UserInterface.ThemeUtil;
|
||||
import org.kde.kdeconnect_tp.R;
|
||||
|
||||
import java.net.MalformedURLException;
|
||||
import java.util.List;
|
||||
|
||||
import androidx.annotation.NonNull;
|
||||
@@ -289,6 +299,8 @@ public class MprisActivity extends AppCompatActivity {
|
||||
rewButton.setVisibility(playerStatus.isSeekAllowed() ? View.VISIBLE : View.GONE);
|
||||
ffButton.setVisibility(playerStatus.isSeekAllowed() ? View.VISIBLE : View.GONE);
|
||||
|
||||
invalidateOptionsMenu();
|
||||
|
||||
//Show and hide previous/next buttons simultaneously
|
||||
if (playerStatus.isGoPreviousAllowed() || playerStatus.isGoNextAllowed()) {
|
||||
prevButton.setVisibility(View.VISIBLE);
|
||||
@@ -367,8 +379,15 @@ public class MprisActivity extends AppCompatActivity {
|
||||
setContentView(R.layout.activity_mpris);
|
||||
ButterKnife.bind(this);
|
||||
|
||||
final String targetPlayerName = getIntent().getStringExtra("player");
|
||||
String targetPlayerName = getIntent().getStringExtra("player");
|
||||
getIntent().removeExtra("player");
|
||||
|
||||
if (targetPlayerName == null || targetPlayerName.isEmpty()) {
|
||||
if (savedInstanceState != null) {
|
||||
targetPlayerName = savedInstanceState.getString("targetPlayer");
|
||||
}
|
||||
}
|
||||
|
||||
deviceId = getIntent().getStringExtra("deviceId");
|
||||
|
||||
SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(this);
|
||||
@@ -445,4 +464,39 @@ public class MprisActivity extends AppCompatActivity {
|
||||
nowPlayingText.setSelected(true);
|
||||
}
|
||||
|
||||
|
||||
final static int MENU_OPEN_URL = Menu.FIRST;
|
||||
|
||||
public boolean onPrepareOptionsMenu(Menu menu) {
|
||||
menu.clear();
|
||||
if(targetPlayer != null && !"".equals(targetPlayer.getUrl())) {
|
||||
menu.add(0, MENU_OPEN_URL, Menu.NONE, R.string.mpris_open_url);
|
||||
}
|
||||
return super.onPrepareOptionsMenu(menu);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean onOptionsItemSelected(MenuItem item) {
|
||||
if (targetPlayer != null && item.getItemId() == MENU_OPEN_URL) {
|
||||
try {
|
||||
String url = VideoUrlsHelper.formatUriWithSeek(targetPlayer.getUrl(), targetPlayer.getPosition()).toString();
|
||||
Intent browserIntent = new Intent(Intent.ACTION_VIEW, Uri.parse(url));
|
||||
startActivity(browserIntent);
|
||||
targetPlayer.pause();
|
||||
return true;
|
||||
} catch (MalformedURLException | ActivityNotFoundException e) {
|
||||
e.printStackTrace();
|
||||
Toast.makeText(getApplicationContext(), getString(R.string.cant_open_url), Toast.LENGTH_LONG).show();
|
||||
}
|
||||
}
|
||||
return super.onOptionsItemSelected(item);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void onSaveInstanceState(@NonNull Bundle outState) {
|
||||
if (targetPlayer != null) {
|
||||
outState.putString("targetPlayer", targetPlayer.getPlayer());
|
||||
}
|
||||
super.onSaveInstanceState(outState);
|
||||
}
|
||||
}
|
||||
|
@@ -116,6 +116,11 @@ public class MprisMediaSession implements SharedPreferences.OnSharedPreferenceCh
|
||||
public void onStop() {
|
||||
notificationPlayer.stop();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onSeekTo(long pos) {
|
||||
notificationPlayer.setPosition((int) pos);
|
||||
}
|
||||
};
|
||||
|
||||
/**
|
||||
@@ -425,6 +430,12 @@ public class MprisMediaSession implements SharedPreferences.OnSharedPreferenceCh
|
||||
playbackActions |= PlaybackStateCompat.ACTION_SKIP_TO_NEXT;
|
||||
++numActions;
|
||||
}
|
||||
// Documentation says that this was added in Lollipop (21) but it seems to cause crashes on < Pie (28)
|
||||
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) {
|
||||
if (notificationPlayer.isSeekAllowed()) {
|
||||
playbackActions |= PlaybackStateCompat.ACTION_SEEK_TO;
|
||||
}
|
||||
}
|
||||
playbackState.setActions(playbackActions);
|
||||
mediaSession.setPlaybackState(playbackState.build());
|
||||
|
||||
@@ -484,7 +495,7 @@ public class MprisMediaSession implements SharedPreferences.OnSharedPreferenceCh
|
||||
@RequiresApi(api = Build.VERSION_CODES.JELLY_BEAN_MR2)
|
||||
@Override
|
||||
public void onNotificationPosted(StatusBarNotification n) {
|
||||
if (n.getPackageName().equals("com.spotify.music")) {
|
||||
if ("com.spotify.music".equals(n.getPackageName())) {
|
||||
spotifyRunning = true;
|
||||
updateMediaNotification();
|
||||
}
|
||||
@@ -493,7 +504,7 @@ public class MprisMediaSession implements SharedPreferences.OnSharedPreferenceCh
|
||||
@RequiresApi(api = Build.VERSION_CODES.JELLY_BEAN_MR2)
|
||||
@Override
|
||||
public void onNotificationRemoved(StatusBarNotification n) {
|
||||
if (n.getPackageName().equals("com.spotify.music")) {
|
||||
if ("com.spotify.music".equals(n.getPackageName())) {
|
||||
spotifyRunning = false;
|
||||
updateMediaNotification();
|
||||
}
|
||||
@@ -503,7 +514,7 @@ public class MprisMediaSession implements SharedPreferences.OnSharedPreferenceCh
|
||||
@Override
|
||||
public void onListenerConnected(NotificationReceiver service) {
|
||||
for (StatusBarNotification n : service.getActiveNotifications()) {
|
||||
if (n.getPackageName().equals("com.spotify.music")) {
|
||||
if ("com.spotify.music".equals(n.getPackageName())) {
|
||||
spotifyRunning = true;
|
||||
updateMediaNotification();
|
||||
}
|
||||
|
@@ -28,6 +28,8 @@ import android.os.Handler;
|
||||
import android.os.Message;
|
||||
import android.util.Log;
|
||||
|
||||
import androidx.core.content.ContextCompat;
|
||||
|
||||
import org.kde.kdeconnect.NetworkPacket;
|
||||
import org.kde.kdeconnect.Plugins.Plugin;
|
||||
import org.kde.kdeconnect.Plugins.PluginFactory;
|
||||
@@ -40,8 +42,7 @@ import java.util.Collections;
|
||||
import java.util.HashMap;
|
||||
import java.util.Iterator;
|
||||
import java.util.List;
|
||||
|
||||
import androidx.core.content.ContextCompat;
|
||||
import java.util.concurrent.ConcurrentHashMap;
|
||||
|
||||
@PluginFactory.LoadablePlugin
|
||||
public class MprisPlugin extends Plugin {
|
||||
@@ -53,6 +54,7 @@ public class MprisPlugin extends Plugin {
|
||||
private String artist = "";
|
||||
private String album = "";
|
||||
private String albumArtUrl = "";
|
||||
private String url = "";
|
||||
private int volume = 50;
|
||||
private long length = -1;
|
||||
private long lastPosition = 0;
|
||||
@@ -136,6 +138,11 @@ public class MprisPlugin extends Plugin {
|
||||
return AlbumArtCache.getAlbumArt(albumArtUrl, MprisPlugin.this, player);
|
||||
}
|
||||
|
||||
//@NonNull
|
||||
public String getUrl() {
|
||||
return url;
|
||||
}
|
||||
|
||||
public boolean isSetVolumeAllowed() {
|
||||
return !isSpotify();
|
||||
}
|
||||
@@ -207,10 +214,9 @@ public class MprisPlugin extends Plugin {
|
||||
private final static String PACKET_TYPE_MPRIS = "kdeconnect.mpris";
|
||||
private final static String PACKET_TYPE_MPRIS_REQUEST = "kdeconnect.mpris.request";
|
||||
|
||||
private final HashMap<String, MprisPlayer> players = new HashMap<>();
|
||||
private final ConcurrentHashMap<String, MprisPlayer> players = new ConcurrentHashMap<>();
|
||||
private boolean supportAlbumArtPayload = false;
|
||||
private final HashMap<String, Handler> playerStatusUpdated = new HashMap<>();
|
||||
|
||||
private final HashMap<String, Handler> playerListUpdated = new HashMap<>();
|
||||
|
||||
@Override
|
||||
@@ -282,6 +288,7 @@ public class MprisPlugin extends Plugin {
|
||||
playerStatus.title = np.getString("title", playerStatus.title);
|
||||
playerStatus.artist = np.getString("artist", playerStatus.artist);
|
||||
playerStatus.album = np.getString("album", playerStatus.album);
|
||||
playerStatus.url = np.getString("url", playerStatus.url);
|
||||
playerStatus.volume = np.getInt("volume", playerStatus.volume);
|
||||
playerStatus.length = np.getLong("length", playerStatus.length);
|
||||
if (np.has("pos")) {
|
||||
@@ -401,6 +408,9 @@ public class MprisPlugin extends Plugin {
|
||||
}
|
||||
|
||||
public MprisPlayer getPlayerStatus(String player) {
|
||||
if (player == null) {
|
||||
return null;
|
||||
}
|
||||
return players.get(player);
|
||||
}
|
||||
|
||||
@@ -423,6 +433,9 @@ public class MprisPlugin extends Plugin {
|
||||
}
|
||||
|
||||
boolean hasPlayer(MprisPlayer player) {
|
||||
if (player == null) {
|
||||
return false;
|
||||
}
|
||||
return players.containsValue(player);
|
||||
}
|
||||
|
||||
|
@@ -35,7 +35,7 @@ import org.kde.kdeconnect.NetworkPacket;
|
||||
import org.kde.kdeconnect.Plugins.NotificationsPlugin.NotificationReceiver;
|
||||
import org.kde.kdeconnect.Plugins.Plugin;
|
||||
import org.kde.kdeconnect.Plugins.PluginFactory;
|
||||
import org.kde.kdeconnect.UserInterface.AlertDialogFragment;
|
||||
import org.kde.kdeconnect.UserInterface.MainActivity;
|
||||
import org.kde.kdeconnect.UserInterface.StartActivityAlertDialogFragment;
|
||||
import org.kde.kdeconnect_tp.R;
|
||||
|
||||
@@ -44,6 +44,7 @@ import java.util.List;
|
||||
|
||||
import androidx.annotation.Nullable;
|
||||
import androidx.annotation.RequiresApi;
|
||||
import androidx.fragment.app.DialogFragment;
|
||||
|
||||
@PluginFactory.LoadablePlugin
|
||||
@RequiresApi(api = Build.VERSION_CODES.LOLLIPOP_MR1)
|
||||
@@ -245,7 +246,7 @@ public class MprisReceiverPlugin extends Plugin {
|
||||
}
|
||||
|
||||
@Override
|
||||
public AlertDialogFragment getPermissionExplanationDialog(int requestCode) {
|
||||
public DialogFragment getPermissionExplanationDialog() {
|
||||
return new StartActivityAlertDialogFragment.Builder()
|
||||
.setTitle(R.string.pref_plugin_mpris)
|
||||
.setMessage(R.string.no_permission_mprisreceiver)
|
||||
@@ -253,7 +254,7 @@ public class MprisReceiverPlugin extends Plugin {
|
||||
.setNegativeButton(R.string.cancel)
|
||||
.setIntentAction("android.settings.ACTION_NOTIFICATION_LISTENER_SETTINGS")
|
||||
.setStartForResult(true)
|
||||
.setRequestCode(requestCode)
|
||||
.setRequestCode(MainActivity.RESULT_NEEDS_RELOAD)
|
||||
.create();
|
||||
}
|
||||
|
||||
|
@@ -199,7 +199,7 @@ public class NotificationFilterActivity extends AppCompatActivity {
|
||||
compoundButton.isChecked()));
|
||||
|
||||
ad.cancel();
|
||||
myBuilder.create().show();
|
||||
myBuilder.show();
|
||||
break;
|
||||
}
|
||||
});
|
||||
|
@@ -47,13 +47,14 @@ import androidx.annotation.NonNull;
|
||||
import androidx.annotation.Nullable;
|
||||
import androidx.annotation.RequiresApi;
|
||||
import androidx.core.app.NotificationCompat;
|
||||
import androidx.fragment.app.DialogFragment;
|
||||
|
||||
import org.json.JSONArray;
|
||||
import org.kde.kdeconnect.Helpers.AppsHelper;
|
||||
import org.kde.kdeconnect.NetworkPacket;
|
||||
import org.kde.kdeconnect.Plugins.Plugin;
|
||||
import org.kde.kdeconnect.Plugins.PluginFactory;
|
||||
import org.kde.kdeconnect.UserInterface.AlertDialogFragment;
|
||||
import org.kde.kdeconnect.UserInterface.MainActivity;
|
||||
import org.kde.kdeconnect.UserInterface.PluginSettingsFragment;
|
||||
import org.kde.kdeconnect.UserInterface.StartActivityAlertDialogFragment;
|
||||
import org.kde.kdeconnect_tp.R;
|
||||
@@ -184,7 +185,8 @@ public class NotificationsPlugin extends Plugin implements NotificationReceiver.
|
||||
if ((notification.flags & Notification.FLAG_FOREGROUND_SERVICE) != 0
|
||||
|| (notification.flags & Notification.FLAG_ONGOING_EVENT) != 0
|
||||
|| (notification.flags & Notification.FLAG_LOCAL_ONLY) != 0
|
||||
|| (notification.flags & NotificationCompat.FLAG_GROUP_SUMMARY) != 0) //The notification that groups other notifications
|
||||
|| (notification.flags & NotificationCompat.FLAG_GROUP_SUMMARY) != 0 //The notification that groups other notifications
|
||||
)
|
||||
{
|
||||
//This is not a notification we want!
|
||||
return;
|
||||
@@ -237,6 +239,7 @@ public class NotificationsPlugin extends Plugin implements NotificationReceiver.
|
||||
np.set("actions", extractActions(notification, key));
|
||||
|
||||
np.set("id", key);
|
||||
np.set("onlyOnce", (notification.flags & NotificationCompat.FLAG_ONLY_ALERT_ONCE) != 0);
|
||||
np.set("isClearable", statusBarNotification.isClearable());
|
||||
np.set("appName", appName == null ? packageName : appName);
|
||||
np.set("time", Long.toString(statusBarNotification.getPostTime()));
|
||||
@@ -369,7 +372,7 @@ public class NotificationsPlugin extends Plugin implements NotificationReceiver.
|
||||
for (Parcelable p : ms) {
|
||||
Bundle m = (Bundle) p;
|
||||
|
||||
if (isGroupConversation) {
|
||||
if (isGroupConversation && m.containsKey("sender")) {
|
||||
messagesBuilder.append(m.get("sender"));
|
||||
messagesBuilder.append(": ");
|
||||
}
|
||||
@@ -565,7 +568,7 @@ public class NotificationsPlugin extends Plugin implements NotificationReceiver.
|
||||
}
|
||||
|
||||
@Override
|
||||
public AlertDialogFragment getPermissionExplanationDialog(int requestCode) {
|
||||
public DialogFragment getPermissionExplanationDialog() {
|
||||
return new StartActivityAlertDialogFragment.Builder()
|
||||
.setTitle(R.string.pref_plugin_notifications)
|
||||
.setMessage(R.string.no_permissions)
|
||||
@@ -573,7 +576,7 @@ public class NotificationsPlugin extends Plugin implements NotificationReceiver.
|
||||
.setNegativeButton(R.string.cancel)
|
||||
.setIntentAction("android.settings.ACTION_NOTIFICATION_LISTENER_SETTINGS")
|
||||
.setStartForResult(true)
|
||||
.setRequestCode(requestCode)
|
||||
.setRequestCode(MainActivity.RESULT_NEEDS_RELOAD)
|
||||
.create();
|
||||
}
|
||||
|
||||
|
@@ -19,14 +19,11 @@ import androidx.core.content.FileProvider;
|
||||
public class PhotoActivity extends AppCompatActivity {
|
||||
|
||||
private Uri photoURI;
|
||||
private PhotoPlugin plugin;
|
||||
|
||||
@Override
|
||||
protected void onStart() {
|
||||
super.onStart();
|
||||
|
||||
BackgroundService.RunWithPlugin(this, getIntent().getStringExtra("deviceId"), PhotoPlugin.class, plugin -> this.plugin = plugin);
|
||||
|
||||
Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
|
||||
if (takePictureIntent.resolveActivity(getPackageManager()) != null) {
|
||||
File photoFile = null;
|
||||
@@ -61,12 +58,13 @@ public class PhotoActivity extends AppCompatActivity {
|
||||
@Override
|
||||
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
|
||||
super.onActivityResult(requestCode, resultCode, data);
|
||||
|
||||
if (resultCode == -1) {
|
||||
plugin.sendPhoto(photoURI);
|
||||
} else {
|
||||
plugin.sendCancel();
|
||||
}
|
||||
BackgroundService.RunWithPlugin(this, getIntent().getStringExtra("deviceId"), PhotoPlugin.class, plugin -> {
|
||||
if (resultCode == -1) {
|
||||
plugin.sendPhoto(photoURI);
|
||||
} else {
|
||||
plugin.sendCancel();
|
||||
}
|
||||
});
|
||||
finish();
|
||||
}
|
||||
}
|
||||
|
@@ -22,29 +22,56 @@ package org.kde.kdeconnect.Plugins;
|
||||
|
||||
import android.app.Activity;
|
||||
import android.content.Context;
|
||||
import android.content.SharedPreferences;
|
||||
import android.content.pm.PackageManager;
|
||||
import android.graphics.drawable.Drawable;
|
||||
import android.os.Build;
|
||||
|
||||
import androidx.annotation.NonNull;
|
||||
import androidx.annotation.Nullable;
|
||||
import androidx.annotation.StringRes;
|
||||
import androidx.core.content.ContextCompat;
|
||||
import androidx.fragment.app.DialogFragment;
|
||||
|
||||
import org.kde.kdeconnect.Device;
|
||||
import org.kde.kdeconnect.NetworkPacket;
|
||||
import org.kde.kdeconnect.UserInterface.AlertDialogFragment;
|
||||
import org.kde.kdeconnect.UserInterface.MainActivity;
|
||||
import org.kde.kdeconnect.UserInterface.PermissionsAlertDialogFragment;
|
||||
import org.kde.kdeconnect.UserInterface.PluginSettingsFragment;
|
||||
import org.kde.kdeconnect_tp.R;
|
||||
|
||||
import androidx.annotation.StringRes;
|
||||
import androidx.core.content.ContextCompat;
|
||||
|
||||
public abstract class Plugin {
|
||||
protected Device device;
|
||||
protected Context context;
|
||||
protected int permissionExplanation = R.string.permission_explanation;
|
||||
protected int optionalPermissionExplanation = R.string.optional_permission_explanation;
|
||||
@Nullable
|
||||
protected SharedPreferences preferences;
|
||||
|
||||
public final void setContext(Context context, Device device) {
|
||||
public final void setContext(@NonNull Context context, @Nullable Device device) {
|
||||
this.device = device;
|
||||
this.context = context;
|
||||
|
||||
if (device != null) {
|
||||
this.preferences = this.context.getSharedPreferences(this.getSharedPreferencesName(), Context.MODE_PRIVATE);
|
||||
}
|
||||
}
|
||||
|
||||
public String getSharedPreferencesName() {
|
||||
if (device == null) {
|
||||
throw new RuntimeException("You have to call setContext() before you can call getSharedPreferencesName()");
|
||||
}
|
||||
|
||||
if (this.supportsDeviceSpecificSettings())
|
||||
return this.device.getDeviceId() + "_" + this.getPluginKey() + "_preferences";
|
||||
else
|
||||
return this.getPluginKey() + "_preferences";
|
||||
}
|
||||
|
||||
@Nullable
|
||||
public SharedPreferences getPreferences() {
|
||||
return this.preferences;
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -119,6 +146,30 @@ public abstract class Plugin {
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* Called to find out if a plugin supports device specific settings.
|
||||
* If you return true your PluginSettingsFragment will use the device
|
||||
* specific SharedPreferences to store the settings.
|
||||
*
|
||||
* @return true if this plugin supports device specific settings
|
||||
*/
|
||||
public boolean supportsDeviceSpecificSettings() { return false; }
|
||||
|
||||
/**
|
||||
* Called when it's time to move the plugin settings from the global preferences
|
||||
* to device specific preferences
|
||||
*
|
||||
* @param globalSharedPreferences The global Preferences to copy the settings from
|
||||
*/
|
||||
public void copyGlobalToDeviceSpecificSettings(SharedPreferences globalSharedPreferences) {}
|
||||
|
||||
/**
|
||||
* Called when the plugin should remove it's settings from the provided ShardPreferences
|
||||
*
|
||||
* @param sharedPreferences The SharedPreferences to remove the settings from
|
||||
*/
|
||||
public void removeSettings(SharedPreferences sharedPreferences) {}
|
||||
|
||||
/**
|
||||
* If hasSettings returns true, this will be called when the user
|
||||
* wants to access this plugin's preferences. The default implementation
|
||||
@@ -207,14 +258,14 @@ public abstract class Plugin {
|
||||
return true;
|
||||
}
|
||||
|
||||
private PermissionsAlertDialogFragment requestPermissionDialog(final String[] permissions, @StringRes int reason, int requestCode) {
|
||||
private PermissionsAlertDialogFragment requestPermissionDialog(final String[] permissions, @StringRes int reason) {
|
||||
return new PermissionsAlertDialogFragment.Builder()
|
||||
.setTitle(getDisplayName())
|
||||
.setMessage(reason)
|
||||
.setPositiveButton(R.string.ok)
|
||||
.setNegativeButton(R.string.cancel)
|
||||
.setPermissions(permissions)
|
||||
.setRequestCode(requestCode)
|
||||
.setRequestCode(MainActivity.RESULT_NEEDS_RELOAD)
|
||||
.create();
|
||||
}
|
||||
|
||||
@@ -223,12 +274,12 @@ public abstract class Plugin {
|
||||
* the problem (and how to fix it, if possible) to the user.
|
||||
*/
|
||||
|
||||
public AlertDialogFragment getPermissionExplanationDialog(int requestCode) {
|
||||
return requestPermissionDialog(getRequiredPermissions(), permissionExplanation, requestCode);
|
||||
public DialogFragment getPermissionExplanationDialog() {
|
||||
return requestPermissionDialog(getRequiredPermissions(), permissionExplanation);
|
||||
}
|
||||
|
||||
public AlertDialogFragment getOptionalPermissionExplanationDialog(int requestCode) {
|
||||
return requestPermissionDialog(getOptionalPermissions(), optionalPermissionExplanation, requestCode);
|
||||
public AlertDialogFragment getOptionalPermissionExplanationDialog() {
|
||||
return requestPermissionDialog(getOptionalPermissions(), optionalPermissionExplanation);
|
||||
}
|
||||
|
||||
public boolean checkRequiredPermissions() {
|
||||
@@ -242,5 +293,4 @@ public abstract class Plugin {
|
||||
public int getMinSdk() {
|
||||
return Build.VERSION_CODES.BASE;
|
||||
}
|
||||
|
||||
}
|
||||
|
@@ -42,14 +42,15 @@ public class PluginFactory {
|
||||
public static class PluginInfo {
|
||||
|
||||
PluginInfo(String displayName, String description, Drawable icon,
|
||||
boolean enabledByDefault, boolean hasSettings, boolean listenToUnpaired,
|
||||
String[] supportedPacketTypes, String[] outgoingPacketTypes,
|
||||
boolean enabledByDefault, boolean hasSettings, boolean supportsDeviceSpecificSettings,
|
||||
boolean listenToUnpaired, String[] supportedPacketTypes, String[] outgoingPacketTypes,
|
||||
Class<? extends Plugin> instantiableClass) {
|
||||
this.displayName = displayName;
|
||||
this.description = description;
|
||||
this.icon = icon;
|
||||
this.enabledByDefault = enabledByDefault;
|
||||
this.hasSettings = hasSettings;
|
||||
this.supportsDeviceSpecificSettings = supportsDeviceSpecificSettings;
|
||||
this.listenToUnpaired = listenToUnpaired;
|
||||
HashSet<String> incoming = new HashSet<>();
|
||||
if (supportedPacketTypes != null) Collections.addAll(incoming, supportedPacketTypes);
|
||||
@@ -76,6 +77,8 @@ public class PluginFactory {
|
||||
return hasSettings;
|
||||
}
|
||||
|
||||
public boolean supportsDeviceSpecificSettings() { return supportsDeviceSpecificSettings; }
|
||||
|
||||
public boolean isEnabledByDefault() {
|
||||
return enabledByDefault;
|
||||
}
|
||||
@@ -101,6 +104,7 @@ public class PluginFactory {
|
||||
private final Drawable icon;
|
||||
private final boolean enabledByDefault;
|
||||
private final boolean hasSettings;
|
||||
private final boolean supportsDeviceSpecificSettings;
|
||||
private final boolean listenToUnpaired;
|
||||
private final Set<String> supportedPacketTypes;
|
||||
private final Set<String> outgoingPacketTypes;
|
||||
@@ -120,8 +124,9 @@ public class PluginFactory {
|
||||
Plugin p = ((Plugin) pluginClass.newInstance());
|
||||
p.setContext(context, null);
|
||||
PluginInfo info = new PluginInfo(p.getDisplayName(), p.getDescription(), p.getIcon(),
|
||||
p.isEnabledByDefault(), p.hasSettings(), p.listensToUnpairedDevices(),
|
||||
p.getSupportedPacketTypes(), p.getOutgoingPacketTypes(), p.getClass());
|
||||
p.isEnabledByDefault(), p.hasSettings(), p.supportsDeviceSpecificSettings(),
|
||||
p.listensToUnpairedDevices(), p.getSupportedPacketTypes(),
|
||||
p.getOutgoingPacketTypes(), p.getClass());
|
||||
pluginInfo.put(p.getPluginKey(), info);
|
||||
}
|
||||
} catch (Exception e) {
|
||||
|
44
src/org/kde/kdeconnect/Plugins/README.txt
Normal file
44
src/org/kde/kdeconnect/Plugins/README.txt
Normal file
@@ -0,0 +1,44 @@
|
||||
Writing a plugin for KDE Connect
|
||||
=================================
|
||||
|
||||
For Android (this project):
|
||||
-----------------------------------------
|
||||
|
||||
1. Change directory to src/org/kde/kdeconnect/Plugins.
|
||||
2. Copy "PingPlugin" under a different name ("FindMyPhonePlugin" in this example).
|
||||
1. Enter the new "FindMyPhonePlugin" directory.
|
||||
4. Rename "PingPlugin.java" to "FindMyPhonePlugin.java"
|
||||
5. Edit it. Replace (case sensitive) "Ping" with "FindMyPhone", "ping" with "findmyphone", "PING" with "FINDMYPHONE"
|
||||
and "plugin_ping" with "plugin_findmyphone".
|
||||
6. Open res/values/strings.xml. Find and copy the lines "pref_plugin_ping_desc" and "pref_plugin_ping" replacing "ping"
|
||||
with "findmyphone" and edit the plugin name and description between <string> </string>).
|
||||
7. Open src/org/kde/kdeconnect/Plugins/PluginFactory.java.
|
||||
A. Copy "import … PingPlugin" line with replacing "PingPlugin" with "FindMyPhonePlugin".
|
||||
B. Copy "PluginFactory.registerPlugin(PingPlugin.class);" line with replacing "PingPlugin" with "FindMyPhonePlugin".
|
||||
8. Open src/org/kde/kdeconnect/NetworkPacket.java. Copy a "public final static String PACKET_TYPE_PING = …" line
|
||||
replacing "PING" with the packet type you will be using (should match the desktop client).
|
||||
9. Now you have an empty skeleton to implement your new plugin logic.
|
||||
|
||||
For the desktop client (project kdeconnect-kde):
|
||||
--------------------------------------
|
||||
|
||||
1. Enter the "plugins" directory.
|
||||
2. Copy the "ping" under a different name ("findmyphone" in this example).
|
||||
3. Add "add_subdirectory(findmyphone)" to CMakeLists.txt after the others "add_subdirectory".
|
||||
1. Enter the new "findmyphone" directory.
|
||||
5. Edit CMakeLists.txt by replacing "ping" with "findmyphone".
|
||||
6. Rename other files in this directory by replacing "ping" with "findmyphone"
|
||||
7. Write a description of your plugin into "README"
|
||||
8. Edit findmyphoneplugin.cpp and findmyphoneplugin.h.
|
||||
A. Change license header.
|
||||
B. Replace (case sensitive) "ping" with "findmyphone", "PingPlugin" with "FindMyPhonePlugin" and "PING" with "FINDMYPHONE".
|
||||
9. Edit kdeconnect_findmyphone.desktop file:
|
||||
A. Replace "ping" with "findmyphone".
|
||||
B. Change name, description, icon, author, email, version, website, license info.
|
||||
C. Remove all the translations
|
||||
D. Set X-KDEConnect-SupportedPacketType and X-KDEConnect-OutgoingPacketType to the packet type your plugin will receive
|
||||
and send, respectively. In this example this is "kdeconnect.findmyphone". Make sure that this matches what is defined in
|
||||
the findmyplugin.h file (in the line "#define PACKET_TYPE_..."), and also in Android.
|
||||
10. Now you have an empty skeleton to implement your new plugin logic.
|
||||
|
||||
|
@@ -35,7 +35,7 @@ import android.view.inputmethod.InputConnection;
|
||||
import org.kde.kdeconnect.NetworkPacket;
|
||||
import org.kde.kdeconnect.Plugins.Plugin;
|
||||
import org.kde.kdeconnect.Plugins.PluginFactory;
|
||||
import org.kde.kdeconnect.UserInterface.AlertDialogFragment;
|
||||
import org.kde.kdeconnect.UserInterface.MainActivity;
|
||||
import org.kde.kdeconnect.UserInterface.StartActivityAlertDialogFragment;
|
||||
import org.kde.kdeconnect_tp.R;
|
||||
|
||||
@@ -44,6 +44,7 @@ import java.util.concurrent.locks.ReentrantLock;
|
||||
|
||||
import androidx.core.content.ContextCompat;
|
||||
import androidx.core.util.Pair;
|
||||
import androidx.fragment.app.DialogFragment;
|
||||
|
||||
@PluginFactory.LoadablePlugin
|
||||
public class RemoteKeyboardPlugin extends Plugin {
|
||||
@@ -403,7 +404,7 @@ public class RemoteKeyboardPlugin extends Plugin {
|
||||
}
|
||||
|
||||
@Override
|
||||
public AlertDialogFragment getPermissionExplanationDialog(int requestCode) {
|
||||
public DialogFragment getPermissionExplanationDialog() {
|
||||
return new StartActivityAlertDialogFragment.Builder()
|
||||
.setTitle(R.string.pref_plugin_remotekeyboard)
|
||||
.setMessage(R.string.no_permissions_remotekeyboard)
|
||||
@@ -411,7 +412,7 @@ public class RemoteKeyboardPlugin extends Plugin {
|
||||
.setNegativeButton(R.string.cancel)
|
||||
.setIntentAction(Settings.ACTION_INPUT_METHOD_SETTINGS)
|
||||
.setStartForResult(true)
|
||||
.setRequestCode(requestCode)
|
||||
.setRequestCode(MainActivity.RESULT_NEEDS_RELOAD)
|
||||
.create();
|
||||
}
|
||||
}
|
||||
|
@@ -107,7 +107,11 @@ public class RunCommandActivity extends AppCompatActivity {
|
||||
|
||||
deviceId = getIntent().getStringExtra("deviceId");
|
||||
|
||||
boolean canAddCommands = BackgroundService.getInstance().getDevice(deviceId).getPlugin(RunCommandPlugin.class).canAddCommand();
|
||||
boolean canAddCommands = false;
|
||||
try {
|
||||
canAddCommands = BackgroundService.getInstance().getDevice(deviceId).getPlugin(RunCommandPlugin.class).canAddCommand();
|
||||
} catch (Exception ignore) {
|
||||
}
|
||||
|
||||
FloatingActionButton addCommandButton = findViewById(R.id.add_command_button);
|
||||
if (canAddCommands) {
|
||||
@@ -118,14 +122,12 @@ public class RunCommandActivity extends AppCompatActivity {
|
||||
|
||||
addCommandButton.setOnClickListener(v -> BackgroundService.RunWithPlugin(RunCommandActivity.this, deviceId, RunCommandPlugin.class, plugin -> {
|
||||
plugin.sendSetupPacket();
|
||||
AlertDialog dialog = new AlertDialog.Builder(RunCommandActivity.this)
|
||||
new AlertDialog.Builder(RunCommandActivity.this)
|
||||
.setTitle(R.string.add_command)
|
||||
.setMessage(R.string.add_command_description)
|
||||
.setPositiveButton(R.string.ok, null)
|
||||
.create();
|
||||
dialog.show();
|
||||
.show();
|
||||
}));
|
||||
|
||||
updateView();
|
||||
}
|
||||
|
||||
|
@@ -8,6 +8,8 @@ import android.widget.RemoteViewsService;
|
||||
|
||||
import org.kde.kdeconnect_tp.R;
|
||||
|
||||
import java.util.ArrayList;
|
||||
|
||||
|
||||
class RunCommandWidgetDataProvider implements RemoteViewsService.RemoteViewsFactory {
|
||||
|
||||
@@ -74,10 +76,15 @@ class RunCommandWidgetDataProvider implements RemoteViewsService.RemoteViewsFact
|
||||
|
||||
@Override
|
||||
public long getItemId(int i) {
|
||||
if (RunCommandWidget.getCurrentDevice() != null)
|
||||
return RunCommandWidget.getCurrentDevice().getPlugin(RunCommandPlugin.class).getCommandItems().get(i).getKey().hashCode();
|
||||
|
||||
return 0;
|
||||
int id = 0;
|
||||
if (RunCommandWidget.getCurrentDevice() != null) {
|
||||
RunCommandPlugin plugin = RunCommandWidget.getCurrentDevice().getPlugin(RunCommandPlugin.class);
|
||||
if (plugin != null) {
|
||||
ArrayList<CommandEntry> items = plugin.getCommandItems();
|
||||
id = items.get(i).getKey().hashCode();
|
||||
}
|
||||
}
|
||||
return id;
|
||||
}
|
||||
|
||||
@Override
|
||||
|
@@ -126,7 +126,8 @@ public class SMSPlugin extends Plugin {
|
||||
* The body should look like so:
|
||||
* { "sendSms": true,
|
||||
* "phoneNumber": "542904563213",
|
||||
* "messageBody": "Hi mom!"
|
||||
* "messageBody": "Hi mom!",
|
||||
* "sub_id": "3859358340534"
|
||||
* }
|
||||
*/
|
||||
private final static String PACKET_TYPE_SMS_REQUEST = "kdeconnect.sms.request";
|
||||
@@ -141,9 +142,12 @@ public class SMSPlugin extends Plugin {
|
||||
/**
|
||||
* Packet sent to request all the messages in a particular conversation
|
||||
* <p>
|
||||
* The body should contain the key "threadID" mapping to the threadID (as a string) being requested
|
||||
* For example:
|
||||
* { "threadID": 203 }
|
||||
* The following fields are available:
|
||||
* "threadID": <long> // (Required) ThreadID to request
|
||||
* "rangeStartTimestamp": <long> // (Optional) Millisecond epoch timestamp indicating the start of the range from which to return messages
|
||||
* "numberToRequest": <long> // (Optional) Number of messages to return, starting from rangeStartTimestamp.
|
||||
* // May return fewer than expected if there are not enough or more than expected if many
|
||||
* // messages have the same timestamp.
|
||||
*/
|
||||
private final static String PACKET_TYPE_SMS_REQUEST_CONVERSATION = "kdeconnect.sms.request_conversation";
|
||||
|
||||
@@ -336,9 +340,11 @@ public class SMSPlugin extends Plugin {
|
||||
if (np.getBoolean("sendSms")) {
|
||||
String phoneNo = np.getString("phoneNumber");
|
||||
String sms = np.getString("messageBody");
|
||||
long subID = np.getLong("subID", -1);
|
||||
|
||||
try {
|
||||
SmsManager smsManager = SmsManager.getDefault();
|
||||
SmsManager smsManager = subID == -1? SmsManager.getDefault() :
|
||||
SmsManager.getSmsManagerForSubscriptionId((int) subID);
|
||||
ArrayList<String> parts = smsManager.divideMessage(sms);
|
||||
|
||||
// If this message turns out to fit in a single SMS, sendMultipartTextMessage
|
||||
@@ -412,7 +418,19 @@ public class SMSPlugin extends Plugin {
|
||||
private boolean handleRequestConversation(NetworkPacket packet) {
|
||||
SMSHelper.ThreadID threadID = new SMSHelper.ThreadID(packet.getLong("threadID"));
|
||||
|
||||
List<SMSHelper.Message> conversation = SMSHelper.getMessagesInThread(this.context, threadID);
|
||||
Long rangeStartTimestamp = packet.getLong("rangeStartTimestamp", -1);
|
||||
Long numberToGet = packet.getLong("numberToRequest", -1);
|
||||
|
||||
if (numberToGet < 0) {
|
||||
numberToGet = null;
|
||||
}
|
||||
|
||||
List<SMSHelper.Message> conversation;
|
||||
if (rangeStartTimestamp < 0) {
|
||||
conversation = SMSHelper.getMessagesInThread(this.context, threadID, numberToGet);
|
||||
} else {
|
||||
conversation = SMSHelper.getMessagesInRange(this.context, threadID, rangeStartTimestamp, numberToGet);
|
||||
}
|
||||
|
||||
NetworkPacket reply = constructBulkMessagePacket(conversation);
|
||||
|
||||
|
@@ -27,6 +27,8 @@ import android.net.Uri;
|
||||
import android.os.Build;
|
||||
import android.util.Log;
|
||||
|
||||
import androidx.annotation.NonNull;
|
||||
|
||||
import org.json.JSONException;
|
||||
import org.json.JSONObject;
|
||||
import org.kde.kdeconnect.NetworkPacket;
|
||||
@@ -43,19 +45,16 @@ import java.util.Collections;
|
||||
import java.util.Iterator;
|
||||
import java.util.List;
|
||||
|
||||
import androidx.annotation.NonNull;
|
||||
import androidx.preference.PreferenceManager;
|
||||
|
||||
@PluginFactory.LoadablePlugin
|
||||
public class SftpPlugin extends Plugin implements SharedPreferences.OnSharedPreferenceChangeListener {
|
||||
|
||||
private final static String PACKET_TYPE_SFTP = "kdeconnect.sftp";
|
||||
private final static String PACKET_TYPE_SFTP_REQUEST = "kdeconnect.sftp.request";
|
||||
|
||||
private static final SimpleSftpServer server = new SimpleSftpServer();
|
||||
static int PREFERENCE_KEY_STORAGE_INFO_LIST = R.string.sftp_preference_key_storage_info_list;
|
||||
private static int PREFERENCE_KEY_ADD_CAMERA_SHORTCUT = R.string.sftp_preference_key_add_camera_shortcut;
|
||||
|
||||
private String KeyStorageInfoList;
|
||||
private String KeyAddCameraShortcut;
|
||||
private static final SimpleSftpServer server = new SimpleSftpServer();
|
||||
|
||||
@Override
|
||||
public String getDisplayName() {
|
||||
@@ -69,14 +68,11 @@ public class SftpPlugin extends Plugin implements SharedPreferences.OnSharedPref
|
||||
|
||||
@Override
|
||||
public boolean onCreate() {
|
||||
KeyStorageInfoList = context.getString(R.string.sftp_preference_key_storage_info_list);
|
||||
KeyAddCameraShortcut = context.getString(R.string.sftp_preference_key_add_camera_shortcut);
|
||||
|
||||
try {
|
||||
server.init(context, device);
|
||||
|
||||
if (Build.VERSION.SDK_INT <= Build.VERSION_CODES.KITKAT) {
|
||||
return SftpSettingsFragment.getStorageInfoList(context).size() != 0;
|
||||
return SftpSettingsFragment.getStorageInfoList(context, this).size() != 0;
|
||||
}
|
||||
|
||||
return true;
|
||||
@@ -89,14 +85,14 @@ public class SftpPlugin extends Plugin implements SharedPreferences.OnSharedPref
|
||||
@Override
|
||||
public boolean checkOptionalPermissions() {
|
||||
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
|
||||
return SftpSettingsFragment.getStorageInfoList(context).size() != 0;
|
||||
return SftpSettingsFragment.getStorageInfoList(context, this).size() != 0;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public AlertDialogFragment getOptionalPermissionExplanationDialog(int requestCode) {
|
||||
public AlertDialogFragment getOptionalPermissionExplanationDialog() {
|
||||
return new DeviceSettingsAlertDialogFragment.Builder()
|
||||
.setTitle(getDisplayName())
|
||||
.setMessage(R.string.sftp_saf_permission_explanation)
|
||||
@@ -110,7 +106,9 @@ public class SftpPlugin extends Plugin implements SharedPreferences.OnSharedPref
|
||||
@Override
|
||||
public void onDestroy() {
|
||||
server.stop();
|
||||
PreferenceManager.getDefaultSharedPreferences(context).unregisterOnSharedPreferenceChangeListener(this);
|
||||
if (preferences != null) {
|
||||
preferences.unregisterOnSharedPreferenceChangeListener(this);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -119,7 +117,7 @@ public class SftpPlugin extends Plugin implements SharedPreferences.OnSharedPref
|
||||
ArrayList<String> paths = new ArrayList<>();
|
||||
ArrayList<String> pathNames = new ArrayList<>();
|
||||
|
||||
List<StorageInfo> storageInfoList = SftpSettingsFragment.getStorageInfoList(context);
|
||||
List<StorageInfo> storageInfoList = SftpSettingsFragment.getStorageInfoList(context, this);
|
||||
Collections.sort(storageInfoList, new StorageInfo.UriNameComparator());
|
||||
|
||||
if (storageInfoList.size() > 0) {
|
||||
@@ -141,7 +139,9 @@ public class SftpPlugin extends Plugin implements SharedPreferences.OnSharedPref
|
||||
removeChildren(storageInfoList);
|
||||
|
||||
if (server.start(storageInfoList)) {
|
||||
PreferenceManager.getDefaultSharedPreferences(context).registerOnSharedPreferenceChangeListener(this);
|
||||
if (preferences != null) {
|
||||
preferences.registerOnSharedPreferenceChangeListener(this);
|
||||
}
|
||||
|
||||
NetworkPacket np2 = new NetworkPacket(PACKET_TYPE_SFTP);
|
||||
|
||||
@@ -170,11 +170,13 @@ public class SftpPlugin extends Plugin implements SharedPreferences.OnSharedPref
|
||||
private void getPathsAndNamesForStorageInfoList(List<String> paths, List<String> pathNames, List<StorageInfo> storageInfoList) {
|
||||
StorageInfo prevInfo = null;
|
||||
StringBuilder pathBuilder = new StringBuilder();
|
||||
SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context);
|
||||
|
||||
boolean addCameraShortcuts = false;
|
||||
|
||||
if (Build.VERSION.SDK_INT <= Build.VERSION_CODES.KITKAT) {
|
||||
addCameraShortcuts = prefs.getBoolean(context.getString(R.string.sftp_preference_key_add_camera_shortcut), true);
|
||||
if (preferences != null) {
|
||||
addCameraShortcuts = preferences.getBoolean(context.getString(PREFERENCE_KEY_ADD_CAMERA_SHORTCUT), true);
|
||||
}
|
||||
}
|
||||
|
||||
for (StorageInfo curInfo : storageInfoList) {
|
||||
@@ -245,6 +247,33 @@ public class SftpPlugin extends Plugin implements SharedPreferences.OnSharedPref
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean supportsDeviceSpecificSettings() { return true; }
|
||||
|
||||
@Override
|
||||
public void copyGlobalToDeviceSpecificSettings(SharedPreferences globalSharedPreferences) {
|
||||
String KeyStorageInfoList = context.getString(PREFERENCE_KEY_STORAGE_INFO_LIST);
|
||||
String KeyAddCameraShortcut = context.getString(PREFERENCE_KEY_ADD_CAMERA_SHORTCUT);
|
||||
|
||||
if (this.preferences != null &&
|
||||
(!this.preferences.contains(KeyStorageInfoList) || !this.preferences.contains(KeyAddCameraShortcut))) {
|
||||
this.preferences
|
||||
.edit()
|
||||
.putString(KeyStorageInfoList, globalSharedPreferences.getString(KeyStorageInfoList, "[]"))
|
||||
.putBoolean(KeyAddCameraShortcut, globalSharedPreferences.getBoolean(KeyAddCameraShortcut, true))
|
||||
.apply();
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void removeSettings(SharedPreferences sharedPreferences) {
|
||||
sharedPreferences
|
||||
.edit()
|
||||
.remove(context.getString(PREFERENCE_KEY_STORAGE_INFO_LIST))
|
||||
.remove(context.getString(PREFERENCE_KEY_ADD_CAMERA_SHORTCUT))
|
||||
.apply();
|
||||
}
|
||||
|
||||
@Override
|
||||
public PluginSettingsFragment getSettingsFragment(Activity activity) {
|
||||
return SftpSettingsFragment.newInstance(getPluginKey());
|
||||
@@ -252,7 +281,8 @@ public class SftpPlugin extends Plugin implements SharedPreferences.OnSharedPref
|
||||
|
||||
@Override
|
||||
public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) {
|
||||
if (key.equals(KeyStorageInfoList) || key.equals(KeyAddCameraShortcut)) {
|
||||
if (key.equals(context.getString(PREFERENCE_KEY_STORAGE_INFO_LIST)) ||
|
||||
key.equals(context.getString(PREFERENCE_KEY_ADD_CAMERA_SHORTCUT))) {
|
||||
//TODO: There used to be a way to request an un-mount (see desktop SftpPlugin's Mounter::onPackageReceived) but that is not handled anymore by the SftpPlugin on KDE.
|
||||
if (server.isStarted()) {
|
||||
server.stop();
|
||||
|
@@ -36,12 +36,21 @@ import android.view.Menu;
|
||||
import android.view.MenuInflater;
|
||||
import android.view.MenuItem;
|
||||
|
||||
import androidx.annotation.NonNull;
|
||||
import androidx.appcompat.view.ActionMode;
|
||||
import androidx.fragment.app.Fragment;
|
||||
import androidx.preference.Preference;
|
||||
import androidx.preference.PreferenceCategory;
|
||||
import androidx.preference.PreferenceScreen;
|
||||
import androidx.recyclerview.widget.RecyclerView;
|
||||
|
||||
import org.json.JSONArray;
|
||||
import org.json.JSONException;
|
||||
import org.json.JSONObject;
|
||||
import org.kde.kdeconnect.BackgroundService;
|
||||
import org.kde.kdeconnect.Device;
|
||||
import org.kde.kdeconnect.Helpers.StorageHelper;
|
||||
import org.kde.kdeconnect.Plugins.Plugin;
|
||||
import org.kde.kdeconnect.UserInterface.PluginSettingsActivity;
|
||||
import org.kde.kdeconnect.UserInterface.PluginSettingsFragment;
|
||||
import org.kde.kdeconnect_tp.R;
|
||||
@@ -52,15 +61,6 @@ import java.util.Collections;
|
||||
import java.util.List;
|
||||
import java.util.ListIterator;
|
||||
|
||||
import androidx.annotation.NonNull;
|
||||
import androidx.appcompat.view.ActionMode;
|
||||
import androidx.fragment.app.Fragment;
|
||||
import androidx.preference.Preference;
|
||||
import androidx.preference.PreferenceCategory;
|
||||
import androidx.preference.PreferenceManager;
|
||||
import androidx.preference.PreferenceScreen;
|
||||
import androidx.recyclerview.widget.RecyclerView;
|
||||
|
||||
//TODO: Is it possible on API 19 to select a directory and then have write permission for everything beneath it
|
||||
//TODO: Is it necessary to check if uri permissions are still in place? If it is make the user aware of the fact (red text or something)
|
||||
public class SftpSettingsFragment
|
||||
@@ -116,10 +116,10 @@ public class SftpSettingsFragment
|
||||
|
||||
int sdkInt = Build.VERSION.SDK_INT;
|
||||
|
||||
storageInfoList = getStorageInfoList(requireContext());
|
||||
storageInfoList = getStorageInfoList(requireContext(), plugin);
|
||||
|
||||
PreferenceScreen preferenceScreen = getPreferenceScreen();
|
||||
preferenceCategory = (PreferenceCategory) preferenceScreen
|
||||
preferenceCategory = preferenceScreen
|
||||
.findPreference(getString(R.string.sftp_preference_key_preference_category));
|
||||
|
||||
if (sdkInt <= 19) {
|
||||
@@ -245,30 +245,30 @@ public class SftpSettingsFragment
|
||||
}
|
||||
|
||||
private void saveStorageInfoList() {
|
||||
SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(requireContext());
|
||||
SharedPreferences preferences = this.plugin.getPreferences();
|
||||
|
||||
JSONArray jsonArray = new JSONArray();
|
||||
|
||||
try {
|
||||
for (SftpPlugin.StorageInfo storageInfo : storageInfoList) {
|
||||
for (SftpPlugin.StorageInfo storageInfo : this.storageInfoList) {
|
||||
jsonArray.put(storageInfo.toJSON());
|
||||
}
|
||||
} catch (JSONException ignored) {}
|
||||
|
||||
preferences
|
||||
.edit()
|
||||
.putString(requireContext().getString(R.string.sftp_preference_key_storage_info_list), jsonArray.toString())
|
||||
.putString(requireContext().getString(SftpPlugin.PREFERENCE_KEY_STORAGE_INFO_LIST), jsonArray.toString())
|
||||
.apply();
|
||||
}
|
||||
|
||||
@NonNull
|
||||
static List<SftpPlugin.StorageInfo> getStorageInfoList(@NonNull Context context) {
|
||||
static List<SftpPlugin.StorageInfo> getStorageInfoList(@NonNull Context context, @NonNull Plugin plugin) {
|
||||
ArrayList<SftpPlugin.StorageInfo> storageInfoList = new ArrayList<>();
|
||||
|
||||
SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(context);
|
||||
SharedPreferences deviceSettings = plugin.getPreferences();
|
||||
|
||||
String jsonString = preferences
|
||||
.getString(context.getString(R.string.sftp_preference_key_storage_info_list), "[]");
|
||||
String jsonString = deviceSettings
|
||||
.getString(context.getString(SftpPlugin.PREFERENCE_KEY_STORAGE_INFO_LIST), "[]");
|
||||
|
||||
try {
|
||||
JSONArray jsonArray = new JSONArray(jsonString);
|
||||
@@ -404,7 +404,9 @@ public class SftpSettingsFragment
|
||||
|
||||
private void handleChangedStorageInfoList() {
|
||||
|
||||
actionMode.finish(); // In case we are in selection mode, finish it
|
||||
if (actionMode != null) {
|
||||
actionMode.finish(); // In case we are in selection mode, finish it
|
||||
}
|
||||
|
||||
saveStorageInfoList();
|
||||
|
||||
@@ -412,11 +414,19 @@ public class SftpSettingsFragment
|
||||
|
||||
addStoragePreferences(preferenceCategory);
|
||||
|
||||
Device device = getDeviceOrThrow();
|
||||
|
||||
device.reloadPluginsFromSettings();
|
||||
}
|
||||
|
||||
private Device getDeviceOrThrow() {
|
||||
Device device = BackgroundService.getInstance().getDevice(getDeviceId());
|
||||
|
||||
if (device != null) {
|
||||
device.reloadPluginsFromSettings();
|
||||
if (device == null) {
|
||||
throw new RuntimeException("SftpSettingsFragment.getDeviceOrThrow(): No device with id: " + getDeviceId());
|
||||
}
|
||||
|
||||
return device;
|
||||
}
|
||||
|
||||
@Override
|
||||
|
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user