Compare commits
No commits in common. "master" and "v1.9.0" have entirely different histories.
31 changed files with 180 additions and 457 deletions
4
.github/workflows/main.yml
vendored
4
.github/workflows/main.yml
vendored
|
|
@ -1,6 +1,8 @@
|
|||
name: Android CI
|
||||
|
||||
on: push
|
||||
on:
|
||||
push:
|
||||
branches: [ master ]
|
||||
|
||||
jobs:
|
||||
build:
|
||||
|
|
|
|||
18
.idea/codeStyles/Project.xml
generated
18
.idea/codeStyles/Project.xml
generated
|
|
@ -4,6 +4,24 @@
|
|||
<JavaCodeStyleSettings>
|
||||
<option name="JD_P_AT_EMPTY_LINES" value="false" />
|
||||
</JavaCodeStyleSettings>
|
||||
<JetCodeStyleSettings>
|
||||
<option name="PACKAGES_TO_USE_STAR_IMPORTS">
|
||||
<value>
|
||||
<package name="java.util" alias="false" withSubpackages="false" />
|
||||
<package name="kotlinx.android.synthetic" alias="false" withSubpackages="true" />
|
||||
<package name="io.ktor" alias="false" withSubpackages="true" />
|
||||
</value>
|
||||
</option>
|
||||
<option name="PACKAGES_IMPORT_LAYOUT">
|
||||
<value>
|
||||
<package name="" alias="false" withSubpackages="true" />
|
||||
<package name="java" alias="false" withSubpackages="true" />
|
||||
<package name="javax" alias="false" withSubpackages="true" />
|
||||
<package name="kotlin" alias="false" withSubpackages="true" />
|
||||
<package name="" alias="true" withSubpackages="true" />
|
||||
</value>
|
||||
</option>
|
||||
</JetCodeStyleSettings>
|
||||
<codeStyleSettings language="ObjectiveC">
|
||||
<option name="RIGHT_MARGIN" value="120" />
|
||||
<option name="SOFT_MARGINS" value="80,100" />
|
||||
|
|
|
|||
|
|
@ -19,7 +19,7 @@ macro(avnc_check_submodule name)
|
|||
endmacro()
|
||||
|
||||
|
||||
# Required to enable SIMD support on ARM
|
||||
# Requred to enable SIMD support on ARM
|
||||
if (CMAKE_ANDROID_ARCH STREQUAL "arm64")
|
||||
set(CMAKE_ASM_FLAGS "${CMAKE_ASM_FLAGS} --target=aarch64-linux-android${ANDROID_NATIVE_API_LEVEL}")
|
||||
elseif (CMAKE_ANDROID_ARCH STREQUAL "arm")
|
||||
|
|
@ -53,7 +53,7 @@ set(AVNC_LIBSSL_SRC_DIR ${AVNC_EXTERN_DIR}/wolfssl)
|
|||
set(AVNC_LIBSSL_BUILD_DIR ${CMAKE_BINARY_DIR}/wolfssl)
|
||||
|
||||
# CMake support in wolfSSl is still under development, so we have to
|
||||
# manually set some flags to enable OpenSSL compatibility layer
|
||||
# manully set some flags to enable OpenSSL compatibility layer
|
||||
set(WOLFSSL_CRL yes)
|
||||
set(WOLFSSL_DES3 yes)
|
||||
add_definitions(-DOPENSSL_ALL -DOPENSSL_EXTRA -DHAVE_CRL -DHAVE_EX_DATA
|
||||
|
|
|
|||
|
|
@ -11,8 +11,8 @@ android {
|
|||
applicationId "com.gaurav.avnc"
|
||||
minSdkVersion 21
|
||||
targetSdkVersion 30
|
||||
versionCode 14
|
||||
versionName "1.9.2"
|
||||
versionCode 12
|
||||
versionName "1.9.0"
|
||||
|
||||
javaCompileOptions {
|
||||
annotationProcessorOptions {
|
||||
|
|
|
|||
|
|
@ -9,6 +9,7 @@
|
|||
package com.gaurav.avnc.ui.vnc
|
||||
|
||||
import android.content.Context
|
||||
import android.content.Intent
|
||||
import android.view.inputmethod.InputMethodManager
|
||||
import androidx.test.core.app.ActivityScenario
|
||||
import androidx.test.espresso.Espresso.onIdle
|
||||
|
|
@ -35,7 +36,8 @@ class VncActivityTest {
|
|||
testServer.start()
|
||||
|
||||
val profile = ServerProfile(host = testServer.host, port = testServer.port)
|
||||
val intent = createVncIntent(targetContext, profile)
|
||||
val intent = Intent(targetContext, VncActivity::class.java)
|
||||
.putExtra("com.gaurav.avnc.server_profile", profile)
|
||||
|
||||
ActivityScenario.launch<VncActivity>(intent).use {
|
||||
onView(withId(R.id.frame_view)).checkWillBeDisplayed() // Wait for connection
|
||||
|
|
|
|||
|
|
@ -13,9 +13,6 @@ import android.os.Build
|
|||
import android.view.*
|
||||
import com.gaurav.avnc.viewmodel.VncViewModel
|
||||
import com.gaurav.avnc.vnc.PointerButton
|
||||
import kotlin.math.PI
|
||||
import kotlin.math.abs
|
||||
import kotlin.math.atan2
|
||||
import kotlin.math.max
|
||||
|
||||
/**
|
||||
|
|
@ -173,13 +170,11 @@ class TouchHandler(private val viewModel: VncViewModel, private val dispatcher:
|
|||
private val gestureDetector = GestureDetector(viewModel.app, this)
|
||||
private val multiFingerTapDetector = MultiFingerTapDetector()
|
||||
private val dragDetector = DragDetector()
|
||||
private val swipeVsScale = SwipeVsScale()
|
||||
private val dragEnabled = viewModel.pref.input.gesture.dragEnabled
|
||||
private val swipeSensitivity = viewModel.pref.input.gesture.swipeSensitivity
|
||||
|
||||
|
||||
private fun handleGestureEvent(event: MotionEvent): Boolean {
|
||||
swipeVsScale.onTouchEvent(event)
|
||||
dragDetector.onTouchEvent(event)
|
||||
multiFingerTapDetector.onTouchEvent(event)
|
||||
scaleDetector.onTouchEvent(event)
|
||||
|
|
@ -189,8 +184,7 @@ class TouchHandler(private val viewModel: VncViewModel, private val dispatcher:
|
|||
override fun onScaleBegin(detector: ScaleGestureDetector) = true
|
||||
override fun onScaleEnd(detector: ScaleGestureDetector) {}
|
||||
override fun onScale(detector: ScaleGestureDetector): Boolean {
|
||||
if (swipeVsScale.shouldScale())
|
||||
dispatcher.onScale(detector.scaleFactor, detector.focusX, detector.focusY)
|
||||
dispatcher.onScale(detector.scaleFactor, detector.focusX, detector.focusY)
|
||||
return true
|
||||
}
|
||||
|
||||
|
|
@ -220,17 +214,15 @@ class TouchHandler(private val viewModel: VncViewModel, private val dispatcher:
|
|||
return true
|
||||
}
|
||||
|
||||
override fun onScroll(e1: MotionEvent?, e2: MotionEvent, dX: Float, dY: Float): Boolean {
|
||||
// As weird as it may be, e1 can be null on some devices
|
||||
val startPoint = e1?.point() ?: return false
|
||||
override fun onScroll(e1: MotionEvent, e2: MotionEvent, dX: Float, dY: Float): Boolean {
|
||||
val startPoint = e1.point()
|
||||
val currentPoint = e2.point()
|
||||
val normalizedDx = -dX * swipeSensitivity
|
||||
val normalizedDy = -dY * swipeSensitivity
|
||||
|
||||
when (e2.pointerCount) {
|
||||
1 -> dispatcher.onSwipe1(startPoint, currentPoint, normalizedDx, normalizedDy)
|
||||
2 -> if (swipeVsScale.shouldSwipe())
|
||||
dispatcher.onSwipe2(startPoint, currentPoint, normalizedDx, normalizedDy)
|
||||
2 -> dispatcher.onSwipe2(startPoint, currentPoint, normalizedDx, normalizedDy)
|
||||
}
|
||||
|
||||
multiFingerTapDetector.reset()
|
||||
|
|
@ -350,106 +342,4 @@ class TouchHandler(private val viewModel: VncViewModel, private val dispatcher:
|
|||
fingerCount = 0
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Swipe vs Scale detector.
|
||||
*
|
||||
* Many two-finger gestures are detected as both swipe & scale gestures because
|
||||
* [GestureDetector] & [ScaleGestureDetector] work independently. This works
|
||||
* very well when two-finger swipe pref is set to 'pan' (default value).
|
||||
* But when the pref is set to 'remote-scroll', this independent detection
|
||||
* becomes an issue. When user tries to scale, it frequently triggers remote
|
||||
* scrolling. And when user tries to scroll, it triggers scaling.
|
||||
*
|
||||
* This class tries to clearly differentiate between these two gestures.
|
||||
* It works by tracking the fingers, and calculating the angle between two paths.
|
||||
* Then [decide] between two gestures by comparing the angle to some thresholds.
|
||||
*
|
||||
* This class can mis-detect some gestures because fingers don't always move
|
||||
* perfectly, but it does provide huge improvement over existing situation.
|
||||
*/
|
||||
private inner class SwipeVsScale {
|
||||
private val enabled = viewModel.pref.input.gesture.swipe2 == "remote-scroll"
|
||||
private var detecting = false
|
||||
private var scaleDetected = false
|
||||
private var swipeDetected = false
|
||||
|
||||
private var f1Id = 0 // Finger 1
|
||||
private var f2Id = 0 // Finger 2
|
||||
private val f1Start = PointF()
|
||||
private val f2Start = PointF()
|
||||
private val f1Current = PointF()
|
||||
private val f2Current = PointF()
|
||||
|
||||
|
||||
fun onTouchEvent(e: MotionEvent) {
|
||||
if (!enabled)
|
||||
return
|
||||
|
||||
when (e.actionMasked) {
|
||||
MotionEvent.ACTION_DOWN,
|
||||
MotionEvent.ACTION_CANCEL,
|
||||
MotionEvent.ACTION_UP,
|
||||
MotionEvent.ACTION_POINTER_UP -> {
|
||||
detecting = false
|
||||
scaleDetected = false
|
||||
swipeDetected = false
|
||||
}
|
||||
|
||||
MotionEvent.ACTION_POINTER_DOWN -> {
|
||||
detecting = e.pointerCount == 2
|
||||
if (detecting) {
|
||||
f1Id = e.getPointerId(0)
|
||||
f2Id = e.getPointerId(1)
|
||||
f1Start.set(e.getX(f1Id), e.getY(f1Id))
|
||||
f2Start.set(e.getX(f2Id), e.getY(f2Id))
|
||||
f1Current.set(f1Start)
|
||||
f2Current.set(f2Start)
|
||||
}
|
||||
}
|
||||
|
||||
MotionEvent.ACTION_MOVE -> {
|
||||
if (detecting) {
|
||||
f1Current.set(e.getX(f1Id), e.getY(f1Id))
|
||||
f2Current.set(e.getX(f2Id), e.getY(f2Id))
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
fun shouldScale(): Boolean {
|
||||
decide()
|
||||
return !enabled || (detecting && scaleDetected)
|
||||
}
|
||||
|
||||
fun shouldSwipe(): Boolean {
|
||||
decide()
|
||||
return !enabled || (detecting && swipeDetected)
|
||||
}
|
||||
|
||||
/**
|
||||
* Decides if gesture can be considered a swipe/scale
|
||||
*/
|
||||
private fun decide() {
|
||||
if (!detecting)
|
||||
return
|
||||
|
||||
val t1 = theta(f1Start, f1Current)
|
||||
val t2 = theta(f2Start, f2Current)
|
||||
val diff = abs(t1 - t2)
|
||||
|
||||
scaleDetected = diff > 45
|
||||
swipeDetected = diff < 30
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the angle made by line [p1]->[p2] with the positive x-axis.
|
||||
* Returned angle will be in range [0, 360]
|
||||
*/
|
||||
private fun theta(p1: PointF, p2: PointF): Double {
|
||||
val theta = atan2(p2.y - p1.y, p2.x - p1.x)
|
||||
val degree = (theta / PI) * 180
|
||||
return (degree + 360) % 360 // Map [-180, 180] to [0, 360]
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -41,14 +41,10 @@ import java.lang.ref.WeakReference
|
|||
|
||||
private const val PROFILE_KEY = "com.gaurav.avnc.server_profile"
|
||||
|
||||
fun createVncIntent(context: Context, profile: ServerProfile): Intent {
|
||||
return Intent(context, VncActivity::class.java).apply {
|
||||
putExtra(PROFILE_KEY, profile)
|
||||
}
|
||||
}
|
||||
|
||||
fun startVncActivity(source: Activity, profile: ServerProfile) {
|
||||
source.startActivity(createVncIntent(source, profile))
|
||||
val intent = Intent(source, VncActivity::class.java)
|
||||
intent.putExtra(PROFILE_KEY, profile)
|
||||
source.startActivity(intent)
|
||||
}
|
||||
|
||||
fun startVncActivity(source: Activity, uri: VncUri) {
|
||||
|
|
@ -63,7 +59,7 @@ fun startVncActivity(source: Activity, uri: VncUri) {
|
|||
*/
|
||||
class VncActivity : AppCompatActivity() {
|
||||
|
||||
private lateinit var profile: ServerProfile
|
||||
private val profile by lazy { loadProfile() }
|
||||
val viewModel by viewModels<VncViewModel>()
|
||||
lateinit var binding: ActivityVncBinding
|
||||
private val dispatcher by lazy { Dispatcher(this) }
|
||||
|
|
@ -73,29 +69,27 @@ class VncActivity : AppCompatActivity() {
|
|||
|
||||
override fun onCreate(savedInstanceState: Bundle?) {
|
||||
super.onCreate(savedInstanceState)
|
||||
profile = loadProfile()
|
||||
viewModel.initConnection(profile)
|
||||
|
||||
//Main UI
|
||||
binding = DataBindingUtil.setContentView(this, R.layout.activity_vnc)
|
||||
binding.viewModel = viewModel
|
||||
binding.lifecycleOwner = this
|
||||
binding.frameView.initialize(this)
|
||||
viewModel.frameViewRef = WeakReference(binding.frameView)
|
||||
|
||||
setupLayout()
|
||||
setupDrawerLayout()
|
||||
|
||||
//Buttons
|
||||
binding.frameView.initialize(this)
|
||||
binding.retryConnectionBtn.setOnClickListener { retryConnection() }
|
||||
|
||||
//Drawers
|
||||
setupDrawerLayout()
|
||||
binding.keyboardBtn.setOnClickListener { showKeyboard(); closeDrawers() }
|
||||
binding.zoomResetBtn.setOnClickListener { viewModel.resetZoom(); closeDrawers() }
|
||||
binding.virtualKeysBtn.setOnClickListener { virtualKeys.show(); closeDrawers() }
|
||||
binding.retryConnectionBtn.setOnClickListener { retryConnection() }
|
||||
|
||||
//Observers
|
||||
//ViewModel setup
|
||||
viewModel.frameViewRef = WeakReference(binding.frameView)
|
||||
viewModel.credentialRequest.observe(this) { showCredentialDialog() }
|
||||
viewModel.sshHostKeyVerifyRequest.observe(this) { showHostKeyDialog() }
|
||||
viewModel.state.observe(this) { onClientStateChanged(it) }
|
||||
viewModel.initConnection(profile) //Should be called after observers has been setup
|
||||
}
|
||||
|
||||
override fun onResume() {
|
||||
|
|
@ -122,11 +116,14 @@ class VncActivity : AppCompatActivity() {
|
|||
|
||||
private fun loadProfile(): ServerProfile {
|
||||
val profile = intent.getParcelableExtra<ServerProfile>(PROFILE_KEY)
|
||||
check(profile != null) { "ServerProfile is missing from VncActivity Intent" }
|
||||
if (profile != null) {
|
||||
// Make a copy to avoid modifying intent's instance,
|
||||
// because we may need the original if we have to retry connection.
|
||||
return profile.copy()
|
||||
}
|
||||
|
||||
// Make a copy to avoid modifying intent's instance,
|
||||
// because we may need the original if we have to retry connection.
|
||||
return profile.copy()
|
||||
Log.e(javaClass.simpleName, "No connection information was passed through Intent.")
|
||||
return ServerProfile()
|
||||
}
|
||||
|
||||
private fun retryConnection() {
|
||||
|
|
@ -164,10 +161,10 @@ class VncActivity : AppCompatActivity() {
|
|||
viewModel.pref.runInfo.hasConnectedSuccessfully = true
|
||||
|
||||
// Highlight drawer for first time users
|
||||
binding.drawerLayout.openDrawer(binding.primaryToolbar)
|
||||
binding.drawerLayout.open()
|
||||
lifecycleScope.launchWhenCreated {
|
||||
delay(1500)
|
||||
binding.drawerLayout.closeDrawer(binding.primaryToolbar)
|
||||
binding.drawerLayout.close()
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -249,25 +246,6 @@ class VncActivity : AppCompatActivity() {
|
|||
|
||||
if (viewModel.pref.experimental.swipeCloseToolbar)
|
||||
Experimental.setupDrawerCloseOnScrimSwipe(binding.drawerLayout, gravityH)
|
||||
|
||||
//Add System Gesture exclusion rects to allow opening toolbar drawer by swiping from edge
|
||||
if (Build.VERSION.SDK_INT >= 29) {
|
||||
binding.primaryToolbar.addOnLayoutChangeListener { _, left, top, right, bottom, _, _, _, _ ->
|
||||
val root = binding.drawerLayout
|
||||
val rect = Rect(left, top, right, bottom)
|
||||
|
||||
if (left < 0) rect.offset(-left, 0)
|
||||
if (right > root.width) rect.offset(-(right - root.width), 0)
|
||||
|
||||
if (immersiveMode) {
|
||||
rect.top = 0
|
||||
rect.bottom = root.height
|
||||
}
|
||||
|
||||
//Set exclusion rects on root because toolbar may not be visible
|
||||
root.systemGestureExclusionRects = listOf(rect)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
|
@ -319,14 +297,8 @@ class VncActivity : AppCompatActivity() {
|
|||
|
||||
if (canEnter && Build.VERSION.SDK_INT >= 26) {
|
||||
|
||||
var w = viewModel.frameState.fbWidth
|
||||
var h = viewModel.frameState.fbHeight
|
||||
|
||||
// Android require aspect ratio to be less than 2.39
|
||||
w = w.coerceIn(1f, 2.3f * h)
|
||||
h = h.coerceIn(1f, 2.3f * w)
|
||||
|
||||
val aspectRatio = Rational(w.toInt(), h.toInt())
|
||||
val fs = viewModel.frameState
|
||||
val aspectRatio = Rational(fs.fbWidth.toInt(), fs.fbHeight.toInt())
|
||||
val param = PictureInPictureParams.Builder().setAspectRatio(aspectRatio).build()
|
||||
|
||||
try {
|
||||
|
|
|
|||
|
|
@ -10,7 +10,6 @@ package com.gaurav.avnc.ui.vnc.gl
|
|||
|
||||
import android.opengl.GLES20.*
|
||||
import android.util.Log
|
||||
import com.gaurav.avnc.BuildConfig
|
||||
|
||||
/**
|
||||
* Represents the GL program used for Frame rendering.
|
||||
|
|
@ -35,7 +34,6 @@ class FrameProgram {
|
|||
val uProjectionLocation = glGetUniformLocation(program, U_PROJECTION)
|
||||
val uTexUnitLocation = glGetUniformLocation(program, U_TEXTURE_UNIT)
|
||||
val textureId = createTexture()
|
||||
var validated = false
|
||||
|
||||
|
||||
fun setUniforms(projectionMatrix: FloatArray) {
|
||||
|
|
@ -56,19 +54,10 @@ class FrameProgram {
|
|||
glBindTexture(GL_TEXTURE_2D, texturesObjects[0])
|
||||
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR)
|
||||
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR)
|
||||
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE)
|
||||
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE)
|
||||
glBindTexture(GL_TEXTURE_2D, 0)
|
||||
return texturesObjects[0]
|
||||
}
|
||||
|
||||
fun validate() {
|
||||
if (BuildConfig.DEBUG && !validated) {
|
||||
ShaderCompiler.validateProgram(program)
|
||||
validated = true
|
||||
}
|
||||
}
|
||||
|
||||
fun useProgram() {
|
||||
glUseProgram(program)
|
||||
}
|
||||
|
|
|
|||
|
|
@ -91,8 +91,6 @@ class Renderer(val viewModel: VncViewModel) : GLSurfaceView.Renderer {
|
|||
|
||||
frame.updateFbSize(state.fbWidth, state.fbHeight)
|
||||
frame.bind(program)
|
||||
|
||||
program.validate()
|
||||
frame.draw()
|
||||
}
|
||||
}
|
||||
|
|
@ -10,6 +10,7 @@ package com.gaurav.avnc.ui.vnc.gl
|
|||
|
||||
import android.opengl.GLES20.*
|
||||
import android.util.Log
|
||||
import com.gaurav.avnc.BuildConfig
|
||||
|
||||
object ShaderCompiler {
|
||||
|
||||
|
|
@ -75,6 +76,9 @@ object ShaderCompiler {
|
|||
if (vertexShaderId == 0 || fragmentShaderId == 0)
|
||||
return 0
|
||||
|
||||
return linkProgram(vertexShaderId, fragmentShaderId)
|
||||
val programId = linkProgram(vertexShaderId, fragmentShaderId)
|
||||
if (BuildConfig.DEBUG)
|
||||
validateProgram(programId)
|
||||
return programId
|
||||
}
|
||||
}
|
||||
|
|
@ -15,13 +15,13 @@ object Shaders {
|
|||
//language=GLSL
|
||||
const val VERTEX_SHADER = """
|
||||
uniform mat4 u_Projection;
|
||||
attribute vec2 a_Position;
|
||||
attribute vec4 a_Position;
|
||||
attribute vec2 a_TextureCoordinates;
|
||||
varying vec2 v_TextureCoordinates;
|
||||
void main()
|
||||
{
|
||||
v_TextureCoordinates = a_TextureCoordinates;
|
||||
gl_Position = u_Projection * vec4(a_Position, 0, 1);
|
||||
gl_Position = u_Projection * a_Position;
|
||||
}"""
|
||||
|
||||
//language=GLSL
|
||||
|
|
|
|||
|
|
@ -75,7 +75,7 @@ class AppPreferences(context: Context) {
|
|||
|
||||
inner class Experimental {
|
||||
val swipeCloseToolbar; get() = prefs.getBoolean("experimental_vnc_toolbar_swipe_close", true)
|
||||
val immersiveMode; get() = prefs.getBoolean("viewer_immersive_mode", true)
|
||||
val immersiveMode; get() = prefs.getBoolean("viewer_immersive_mode", false)
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
|
|||
|
|
@ -92,7 +92,7 @@ class VncViewModel(app: Application) : BaseViewModel(app), VncClient.Observer {
|
|||
/**
|
||||
* [ServerProfile] used for current connection.
|
||||
*/
|
||||
var profile = ServerProfile(); private set
|
||||
var profile = ServerProfile()
|
||||
|
||||
/**
|
||||
* We have two places for connection state (both are synced):
|
||||
|
|
@ -167,14 +167,16 @@ class VncViewModel(app: Application) : BaseViewModel(app), VncClient.Observer {
|
|||
|
||||
/**
|
||||
* Initialize VNC connection using given profile.
|
||||
* It may be called multiple times due to activity restarts.
|
||||
* [initConnection] can be called multiple times due to activity restarts.
|
||||
*/
|
||||
fun initConnection(profile: ServerProfile) {
|
||||
if (state.value == State.Created) {
|
||||
state.value = State.Connecting
|
||||
this.profile = profile
|
||||
launchConnection()
|
||||
}
|
||||
if (state.value != State.Created)
|
||||
return
|
||||
|
||||
this.profile = profile
|
||||
state.value = State.Connecting
|
||||
|
||||
launchConnection()
|
||||
}
|
||||
|
||||
private fun launchConnection() {
|
||||
|
|
|
|||
|
|
@ -171,7 +171,7 @@ class VncClient(private val observer: Observer) {
|
|||
* @param x Horizontal pointer coordinate
|
||||
* @param y Vertical pointer coordinate
|
||||
*/
|
||||
fun moveClientPointer(x: Int, y: Int) {
|
||||
fun moveClientPointer(x: Int, y: Int) = executeSend {
|
||||
pointerX = x
|
||||
pointerY = y
|
||||
observer.onPointerMoved(x, y)
|
||||
|
|
|
|||
|
|
@ -144,6 +144,19 @@
|
|||
app:layout_constraintStart_toStartOf="parent"
|
||||
app:layout_constraintTop_toBottomOf="@id/use_repeater" />
|
||||
|
||||
|
||||
<!--Temporary message about moved option-->
|
||||
<TextView
|
||||
android:id="@+id/use_local_cursor"
|
||||
style="@style/FormField.EditText"
|
||||
android:drawablePadding="@dimen/padding_normal"
|
||||
android:paddingStart="@dimen/padding_small"
|
||||
android:paddingTop="0dp"
|
||||
android:text="@string/msg_hide_remote_pointer_option_moved"
|
||||
app:drawableStartCompat="@drawable/ic_info"
|
||||
app:layout_constraintStart_toStartOf="parent"
|
||||
app:layout_constraintTop_toBottomOf="@id/view_only" />
|
||||
|
||||
<!--Key Compatibility mode-->
|
||||
<CheckBox
|
||||
android:id="@+id/key_compat_mode"
|
||||
|
|
@ -152,7 +165,7 @@
|
|||
android:text="@string/title_key_compat_mode"
|
||||
app:layout_constraintEnd_toEndOf="parent"
|
||||
app:layout_constraintStart_toStartOf="parent"
|
||||
app:layout_constraintTop_toBottomOf="@id/view_only" />
|
||||
app:layout_constraintTop_toBottomOf="@id/use_local_cursor" />
|
||||
|
||||
<ImageButton
|
||||
android:id="@+id/key_compat_mode_help_btn"
|
||||
|
|
|
|||
|
|
@ -34,6 +34,8 @@
|
|||
<string name="msg_invalid_vnc_uri">Ungültige VNC-URI</string>
|
||||
<string name="msg_copied_to_clipboard">Kopiert</string>
|
||||
<string name="msg_key_compat_mode_help">Einige Server unterstützen Unicode-Zeichen nur teilweise. Legacy key events kann die Eingabe von nicht-englischem Text ermöglichen.</string>
|
||||
<string name="msg_hide_remote_pointer_option_moved">\'Ausblenden des entfernten Mauszeigers\' ist jetzt verfügbar unter
|
||||
\n\'Einstellungen → Eingabe → Maus\'</string>
|
||||
<string name="tip_empty_server_list">Die Serverliste ist leer.
|
||||
\nDrücke \'<b>+</b>\', um einen Server hinzuzufügen, oder
|
||||
\nnutze die Adresszeile oben, um direkt eine Verbindung aufzubauen.</string>
|
||||
|
|
@ -68,7 +70,7 @@
|
|||
<string name="pref_sort_server_list">Sortiere die gespeicherten Server nach ihren Namen</string>
|
||||
<string name="pref_gesture">Gesten</string>
|
||||
<string name="pref_swipe2">Wischen mit zwei Fingern</string>
|
||||
<string name="pref_drag">Ziehen (Drag and Drop)</string>
|
||||
<string name="pref_drag">Ziehen (gedrückt halten und wischen)</string>
|
||||
<string name="pref_mouse_passthrough">Maus-Passthrough</string>
|
||||
<string name="pref_mouse_passthrough_summary_off">Maus-Bewegungen für lokale Gesten verwenden</string>
|
||||
<string name="pref_hide_local_cursor">Lokalen Mauszeiger verstecken</string>
|
||||
|
|
@ -168,12 +170,4 @@
|
|||
<string name="pref_direct_touch">Direkte Touch-Umsetzung auf dem Server</string>
|
||||
<string name="pref_direct_touch_summary_on">Setze Aktionen direkt am Ort des Tippens um</string>
|
||||
<string name="pref_direct_touch_summary_off">Setze Aktionen an einem Mauszeiger um, ähnlich einem Touchpad</string>
|
||||
<string name="pref_orientation">Bildschirmausrichtung</string>
|
||||
<string name="pref_orientation_option_auto">Automatisch (nach Lagesensor)</string>
|
||||
<string name="pref_orientation_option_portrait">Hochformat</string>
|
||||
<string name="pref_orientation_option_landscape">Querformat</string>
|
||||
<string name="msg_drag_gesture_help">Der Ziehgeste eine Aktion zuzuweisen, wird die Erkennung von langem Drücken ändern:
|
||||
\n
|
||||
\n<b>Drücken-Halten-Loslassen</b> → Lange drücken
|
||||
\n<b>Drücken-Halten-Wischen</b> → Drag and Drop</string>
|
||||
</resources>
|
||||
|
|
@ -176,4 +176,6 @@
|
|||
<string name="desc_discovery_stop_btn">اکتشاف کارسازها را متوقّف کن</string>
|
||||
<string name="pref_discovery_autorun_summary">در حالی که در صفحهٔ اصلی هستید، کارسازها را کشف کنید</string>
|
||||
<string name="title_default_security">امنیت پیشگزیده</string>
|
||||
<string name="msg_hide_remote_pointer_option_moved">«پنهان کردن اشارهگر دوردست» حالا در مسیر
|
||||
\n«تنظیمات ← ورودی ← ماوس» در دسترس است</string>
|
||||
</resources>
|
||||
|
|
@ -167,6 +167,8 @@
|
|||
<string name="pref_mouse_back_action_middle">Clic molette</string>
|
||||
<string name="pref_mouse_back_action_right">Clic droit</string>
|
||||
<string name="title_default_security">Sécurité par défaut</string>
|
||||
<string name="msg_hide_remote_pointer_option_moved">« Masquer le pointeur distant » est désormais disponible dans
|
||||
\n« Paramètres → Saisie → Souris »</string>
|
||||
<string name="pref_swipe_sensitivity">Sensibilité du défilement</string>
|
||||
<string name="msg_drag_gesture_help">L\'affectation d\'une action à un geste de glissement modifiera la détection de l\'appui long :
|
||||
\n
|
||||
|
|
|
|||
|
|
@ -167,5 +167,7 @@
|
|||
<string name="pref_mouse_back_action_right">Høyreklikk</string>
|
||||
<string name="pref_mouse_back_action_middle">Midt-klikk</string>
|
||||
<string name="title_default_security">Forvalgt sikkerhet</string>
|
||||
<string name="msg_hide_remote_pointer_option_moved">«Skjul fjernpeker» er nå tilgjengelig i
|
||||
\n«Innstillinger → Inndata → Mus»</string>
|
||||
<string name="pref_swipe_sensitivity">Dragningssensitivitet</string>
|
||||
</resources>
|
||||
|
|
@ -141,6 +141,8 @@
|
|||
<string name="desc_back_btn">Wstecz</string>
|
||||
<string name="pref_mouse_passthrough">Przekazywanie myszy</string>
|
||||
<string name="pref_mouse_passthrough_summary_off">Używanie zdarzeń myszy do wykonywania gestów lokalnych</string>
|
||||
<string name="msg_hide_remote_pointer_option_moved">Opcja „Ukryj zdalny wskaźnik” jest teraz dostępna w
|
||||
\n„Ustawienia → Wejście → Mysz”</string>
|
||||
<string name="pref_gesture_action_remote_scroll">Przewiń zdalną zawartość</string>
|
||||
<string name="pref_mouse_back_action_middle">Kliknij środkowym przyciskiem</string>
|
||||
<string name="pref_vk_show_all">Pokaż wszystkie klawisze</string>
|
||||
|
|
@ -172,6 +174,4 @@
|
|||
<string name="pref_orientation_option_auto">Automatycznie</string>
|
||||
<string name="pref_orientation_option_portrait">Portret</string>
|
||||
<string name="pref_orientation_option_landscape">Krajobraz</string>
|
||||
<string name="desc_discovery_btn">Odnajduj serwery</string>
|
||||
<string name="msg_export_auth_required">Uwierzytelnij się, aby eksportować serwery</string>
|
||||
</resources>
|
||||
|
|
@ -6,11 +6,11 @@
|
|||
~
|
||||
~ See COPYING.txt for more details.
|
||||
--><resources>
|
||||
<string name="title_add_server_profile">Adicionar servidor</string>
|
||||
<string name="title_edit_server_profile">Editar servidor</string>
|
||||
<string name="title_add_server_profile">Adicionar um servidor</string>
|
||||
<string name="title_edit_server_profile">Edição do servidor</string>
|
||||
<string name="title_duplicate">Duplicar</string>
|
||||
<string name="title_edit">Editar</string>
|
||||
<string name="title_delete">Apagar</string>
|
||||
<string name="title_delete">Excluir</string>
|
||||
<string name="title_copy_host">Copiar host</string>
|
||||
<string name="title_copy_name">Copiar nome</string>
|
||||
<string name="title_advanced">Avançado</string>
|
||||
|
|
@ -18,27 +18,27 @@
|
|||
<string name="title_save">Salvar</string>
|
||||
<string name="title_undo">Desfazer</string>
|
||||
<string name="title_settings">Configurações</string>
|
||||
<string name="title_credentials_required">Autenticação</string>
|
||||
<string name="title_remember">Salvar</string>
|
||||
<string name="title_credentials_required">Credenciais necessárias</string>
|
||||
<string name="title_remember">Lembrar</string>
|
||||
<string name="title_export">Exportar</string>
|
||||
<string name="title_import">Importar</string>
|
||||
<string name="title_view_only_mode">Somente visualização</string>
|
||||
<string name="title_hide_remote_cursor">Esconder ponteiro remoto</string>
|
||||
<string name="title_key_compat_mode">Enviar eventos de teclado compatíveis</string>
|
||||
<string name="title_use_ssh_tunnel">Usar túnel SSH</string>
|
||||
<string name="title_unknown_ssh_host">Host SSH desconhecido</string>
|
||||
<string name="title_ssh_host_key_changed">Chave do host de SSH mudou</string>
|
||||
<string name="title_view_only_mode">Modo somente de visualização</string>
|
||||
<string name="title_hide_remote_cursor">Esconder cursor remoto</string>
|
||||
<string name="title_key_compat_mode">Modo de compatibilidade do teclado</string>
|
||||
<string name="title_use_ssh_tunnel">Usar túnel de SSH</string>
|
||||
<string name="title_unknown_ssh_host">Host de SSH desconhecido</string>
|
||||
<string name="title_ssh_host_key_changed">A chave do host foi alterada</string>
|
||||
<string name="title_continue">Continuar</string>
|
||||
<string name="title_delete_servers_before_import">Apagar os servidores atuais antes de importar</string>
|
||||
<string name="title_delete_servers_before_import">Excluir os servidores atuais antes de importar</string>
|
||||
<string name="title_password">Senha</string>
|
||||
<string name="title_use_repeater">Usar repetidor</string>
|
||||
<string name="title_private_key">Chave privada</string>
|
||||
<string name="title_change">Mudar</string>
|
||||
<string name="title_change">Alterar</string>
|
||||
<string name="title_about">Sobre</string>
|
||||
<string name="title_license">Licença</string>
|
||||
<string name="title_open_source_libraries">Bibliotecas de código livre</string>
|
||||
<string name="title_report_bug">Relatar um problema</string>
|
||||
<string name="title_github_repo">Código fonte</string>
|
||||
<string name="title_report_bug">Relatar um erro</string>
|
||||
<string name="title_github_repo">Repositório no Github</string>
|
||||
<string name="hint_urlbar">Conectar ao servidor</string>
|
||||
<string name="hint_server_name">Nome (ex. PC do trabalho)</string>
|
||||
<string name="hint_host">Host</string>
|
||||
|
|
@ -48,56 +48,50 @@
|
|||
<string name="hint_username">Nome de usuário</string>
|
||||
<string name="hint_password">Senha</string>
|
||||
<string name="hint_key_password">Senha chave</string>
|
||||
<string name="msg_about_app">Um cliente VNC rápido e seguro. Permite visualizar e controlar remotamente qualquer dispositivo que executa um servidor VNC.
|
||||
\n
|
||||
\n
|
||||
\nO AVNC é de código aberto e sob licença copyleft — feito com a ajuda de muitos colaboradores.</string>
|
||||
<string name="msg_about_app">O AVNC é um cliente VNC de software livre para Android. Permite o controle remoto de qualquer dispositivo que executa um servidor VNC.</string>
|
||||
<string name="msg_server_profile_added">Servidor adicionado</string>
|
||||
<string name="msg_server_profile_deleted">Servidor apagado</string>
|
||||
<string name="msg_pip_not_supported">Não suportado neste dispositivo</string>
|
||||
<string name="msg_loading">Carregando…</string>
|
||||
<string name="msg_imported">Importado</string>
|
||||
<string name="msg_exported">Exportado</string>
|
||||
<string name="msg_export_auth_required">Autenticar primeiro para poder exportar servidores</string>
|
||||
<string name="msg_server_profile_deleted">Servidor excluído</string>
|
||||
<string name="msg_pip_not_supported">O recurso de Picture-in-Picture não é suportado neste dispositivo</string>
|
||||
<string name="msg_loading">Carregando …</string>
|
||||
<string name="msg_imported">Importado com sucesso</string>
|
||||
<string name="msg_exported">Exportado com sucesso</string>
|
||||
<string name="msg_export_auth_required">É necessária a autenticação antes de exportar</string>
|
||||
<string name="msg_export_auth_missing">Seu dispositivo não está seguro. Ative o bloqueio da tela para permitir a autenticação antes de exportar.</string>
|
||||
<string name="msg_invalid_key_file">Arquivo de chave privada inválido</string>
|
||||
<string name="msg_invalid_vnc_uri">A URI do VNC inválida</string>
|
||||
<string name="msg_invalid_key_file">O arquivo não é uma chave privada válida</string>
|
||||
<string name="msg_invalid_vnc_uri">O URI do VNC inválido</string>
|
||||
<string name="msg_copied_to_clipboard">Copiado</string>
|
||||
<string name="msg_key_compat_mode_help">Alguns servidores têm suporte limitado ao Unicode. Os eventos de teclado legado podem ajudar a inserir texto não-inglês.</string>
|
||||
<string name="tip_empty_server_list">A lista de servidores está vazia.
|
||||
\nUse o botão \'<b>+</b>\' para adicionar um servidor, ou
|
||||
\nuse a barra de endereço na área superior para conectar diretamente.</string>
|
||||
<string name="tip_urlbar">Você pode digitar o endereço de IP, nome de host ou \'vnc://\' URI.</string>
|
||||
<string name="tip_discovery">A descoberta pode automaticamente encontrar os servidores suportados
|
||||
\nexecutados na sua rede.</string>
|
||||
<string name="msg_key_compat_mode_help">Alguns servidores não tem suporte a entrada direta do Unicode. O modo de compatibilidade tenta enviar eventos chave em formato legado. \n\nTente ativar/desativar isto, se você estiver tendo problemas inserindo alguns caracteres.</string>
|
||||
<string name="tip_empty_server_list">A lista de servidores está vazia.\nUse o botão \'<b>+</b>\' para adicionar um servidor, ou\nUse a barra do Url na parte superior para conectar-se diretamente a um servidor.</string>
|
||||
<string name="tip_urlbar">Você pode digitar o nome de host ou endereço de IP.\n\'vnc://\' URIs também são suportados.</string>
|
||||
<string name="tip_discovery">A descoberta pode encontrar automaticamente os servidores suportados\nexecutados na sua rede.</string>
|
||||
<!-- Accessibility descriptions -->
|
||||
<string name="desc_navigation_btn">Abrir aba de navegação</string>
|
||||
<string name="desc_settings_btn">Configurações</string>
|
||||
<string name="desc_navigation_btn">Abrir a aba de navegação</string>
|
||||
<string name="desc_settings_btn">Abrir configurações</string>
|
||||
<string name="desc_saved_servers_tab">Servidores salvos</string>
|
||||
<string name="desc_discovered_servers_tab">Servidores encontrados</string>
|
||||
<string name="desc_add_new_server_btn">Adicionar servidor</string>
|
||||
<string name="desc_save_discovered_server_btn">Salvar</string>
|
||||
<string name="desc_discovery_btn">Descobrir servidores</string>
|
||||
<string name="desc_add_new_server_btn">Adicionar um novo servidor</string>
|
||||
<string name="desc_save_discovered_server_btn">Salvar este servidor</string>
|
||||
<string name="desc_discovery_btn">Iniciar a descoberta de servidores</string>
|
||||
<string name="desc_discovery_running">Descobrindo servidores na sua rede</string>
|
||||
<string name="desc_keyboard_btn">Mostrar teclado</string>
|
||||
<string name="desc_virtual_keys_btn">Mostrar teclas virtuais</string>
|
||||
<string name="desc_reset_zoom_btn">Redefinir zoom</string>
|
||||
<string name="desc_retry_connection_btn">Tente novamente</string>
|
||||
<string name="desc_reset_zoom_btn">Resetar o zoom para 100%</string>
|
||||
<string name="desc_retry_connection_btn">Tente conectar novamente</string>
|
||||
<string name="desc_back_btn">Voltar</string>
|
||||
<string name="desc_clear_url_btn">Limpar</string>
|
||||
<string name="desc_server_url">Endereço do servidor</string>
|
||||
<string name="desc_help_btn">Ajuda</string>
|
||||
<string name="desc_discovered_list">Lista dos servidores descobertos automaticamente</string>
|
||||
<string name="desc_saved_servers_list">Lista dos servidores salvos</string>
|
||||
<string name="desc_clear_url_btn">Remover a URL</string>
|
||||
<string name="desc_server_url">Digite o endereço do servidor VNC</string>
|
||||
<string name="desc_help_btn">Mostrar ajuda</string>
|
||||
<string name="desc_discovered_list">Lista de servidores descobertos automaticamente</string>
|
||||
<string name="desc_saved_servers_list">Lista de servidores salvos</string>
|
||||
<!-- Preference -->
|
||||
<string name="pref_ui">Interface</string>
|
||||
<string name="pref_ui_summary">Aspecto</string>
|
||||
<string name="pref_viewer">Visualizador</string>
|
||||
<string name="pref_viewer_summary">Imagem em popup, zoom</string>
|
||||
<string name="pref_viewer_summary">Picture-in-picture, zoom</string>
|
||||
<string name="pref_input">Entrada</string>
|
||||
<string name="pref_input_summary">Gestos, mouse, teclas virtuais</string>
|
||||
<string name="pref_servers">Servidores</string>
|
||||
<string name="pref_server_summary">Autenticação, descoberta</string>
|
||||
<string name="pref_server_summary">Descoberta, Credenciais</string>
|
||||
<string name="pref_tools">Ferramentas</string>
|
||||
<string name="pref_tools_summary">Importar/Exportar, depuração</string>
|
||||
<string name="pref_experimental">Experimental</string>
|
||||
|
|
@ -113,8 +107,8 @@
|
|||
<string name="pref_gesture_action_remote_drag">Arrastar conteúdo remoto</string>
|
||||
<string name="pref_gesture_action_open_keyboard">Mostrar teclado</string>
|
||||
<string name="pref_theme">Tema</string>
|
||||
<string name="pref_prefer_advanced_editor">Abrir diretamente opções avançadas de servidor</string>
|
||||
<string name="pref_sort_server_list">Ordenar servidores salvos pelo nome</string>
|
||||
<string name="pref_prefer_advanced_editor">Preferência do editor avançado</string>
|
||||
<string name="pref_sort_server_list">Ordenar a lista de servidores</string>
|
||||
<string name="pref_gesture">Gestos</string>
|
||||
<string name="pref_single_tap">Toque único</string>
|
||||
<string name="pref_two_finger_tap">Toque com 2 dedos</string>
|
||||
|
|
@ -122,66 +116,57 @@
|
|||
<string name="pref_long_press">Toque longo</string>
|
||||
<string name="pref_swipe1">Deslize com 1 dedo</string>
|
||||
<string name="pref_swipe2">Deslize com 2 dedos</string>
|
||||
<string name="pref_drag">Arrastar</string>
|
||||
<string name="pref_drag">Arrastar (Toque longo depois deslizar)</string>
|
||||
<string name="pref_mouse">Mouse</string>
|
||||
<string name="pref_mouse_passthrough">Passagem do mouse</string>
|
||||
<string name="pref_mouse_passthrough_summary_off">Use eventos do mouse para gestos locais</string>
|
||||
<string name="pref_mouse_passthrough_summary_on">Enviar eventos do mouse diretamente para servidor</string>
|
||||
<string name="pref_mouse_passthrough_summary_off">Eventos do mouse são usados localmente para gestos</string>
|
||||
<string name="pref_mouse_passthrough_summary_on">Eventos do mouse são enviados diretamente para servidor</string>
|
||||
<string name="pref_vk">Teclas virtuais</string>
|
||||
<string name="pref_vk_show_all">Mostrar todas teclas</string>
|
||||
<string name="pref_vk_open_with_keyboard">Abrir com teclado</string>
|
||||
<string name="pref_vk_open_with_keyboard">Mostrar quando teclado está disponível</string>
|
||||
<string name="pref_km">Mapeamento de teclas</string>
|
||||
<string name="pref_km_right_alt_to_super">Right Alt → Super</string>
|
||||
<string name="pref_km_language_switch_to_super">Alteração de idioma → Super</string>
|
||||
<string name="pref_km_back_to_escape">Voltar → Escape</string>
|
||||
<string name="pref_km_back_to_escape_summary">Não afeta a barra de navegação</string>
|
||||
<string name="pref_fullscreen">Tela cheia</string>
|
||||
<string name="pref_enable_pip">Imagem em popup</string>
|
||||
<string name="pref_km_back_to_escape_summary">A barra de navegação não é afetada por isto</string>
|
||||
<string name="pref_fullscreen">Tela Cheia</string>
|
||||
<string name="pref_enable_pip">Picture-in-picture</string>
|
||||
<string name="pref_toolbar">Barra de ferramentas</string>
|
||||
<string name="pref_toolbar_alignment">Alinhamento</string>
|
||||
<string name="pref_zoom">Zoom</string>
|
||||
<string name="pref_zoom_min">Mínimo</string>
|
||||
<string name="pref_zoom_max">Máximo</string>
|
||||
<string name="pref_clipboard_sync">Sincronização do clipboard</string>
|
||||
<string name="pref_credential">Autenticação</string>
|
||||
<string name="pref_cred_autocomplete">Preenchimento automático</string>
|
||||
<string name="pref_cred_autocomplete_summary">Sugerir sessões salvas ao conectar para novos servidores</string>
|
||||
<string name="pref_zoom_min">Zoom mínimo</string>
|
||||
<string name="pref_zoom_max">Zoom máximo</string>
|
||||
<string name="pref_clipboard_sync">Sincronização do Clipboard</string>
|
||||
<string name="pref_credential">Credenciais</string>
|
||||
<string name="pref_cred_autocomplete">Ativar preenchimento automático</string>
|
||||
<string name="pref_cred_autocomplete_summary">Sugerir credenciais conhecidas ao conectar-se a um novo servidor</string>
|
||||
<string name="pref_discovery">Descoberta</string>
|
||||
<string name="pref_import_export">Importar/Exportar servidores</string>
|
||||
<string name="pref_debugging">Depuração</string>
|
||||
<string name="pref_logs">Registros</string>
|
||||
<string name="pref_keycode_map">Mapa de códigos de teclado</string>
|
||||
<string name="pref_experimental_toolbar_swipe_close">Deslize para fechar a barra de ferramentas</string>
|
||||
<string name="pref_experimental_toolbar_swipe_close_summary">Durante uma sessão remota, você pode deslizar para fechar a barra de ferramentas aberta neste momento</string>
|
||||
<string name="pref_theme_option_system">Sistema</string>
|
||||
<string name="pref_theme_option_dark">Escuro</string>
|
||||
<string name="pref_theme_option_light">Claro</string>
|
||||
<string name="pref_experimental_toolbar_swipe_close">Deslizar para fechar a barra de ferramentas</string>
|
||||
<string name="pref_experimental_toolbar_swipe_close_summary">Durante uma sessão remota, você pode deslizar para fechar a barra de ferramentas atualmente aberta</string>
|
||||
<string name="pref_theme_option_system">Seguir Tema do Sistema</string>
|
||||
<string name="pref_theme_option_dark">Modo Escuro</string>
|
||||
<string name="pref_theme_option_light">Modo Claro</string>
|
||||
<string name="pref_toolbar_alignment_option_start">Início</string>
|
||||
<string name="pref_toolbar_alignment_option_end">Final</string>
|
||||
<string name="pref_hide_local_cursor">Esconder ponteiro local</string>
|
||||
<string name="pref_hide_local_cursor">Ocultar Cursor do Android</string>
|
||||
<string name="title_clear">Limpar</string>
|
||||
<string name="pref_experimental_immersive_mode">Modo totalmente imersivo</string>
|
||||
<string name="pref_experimental_immersive_mode_summary">Oculta todas as barras do sistema em modo de tela cheia</string>
|
||||
<string name="msg_ptr_hiding_not_supported">Não suportado neste dispositivo</string>
|
||||
<string name="desc_discovery_stop_btn">Parar a descoberta de servidores</string>
|
||||
<string name="msg_ptr_hiding_not_supported">Ocultar cursor não é compatível com este dispositivo</string>
|
||||
<string name="desc_discovery_stop_btn">Parar de descobrir servidores</string>
|
||||
<string name="pref_direct_touch_summary_off">Faça ações no ponteiro</string>
|
||||
<string name="pref_mouse_back_action_default">Padrão</string>
|
||||
<string name="pref_mouse_back_action_right">Clique com botão direito</string>
|
||||
<string name="pref_mouse_back">Botão Voltar</string>
|
||||
<string name="pref_mouse_back_action_middle">Clique com botão do meio</string>
|
||||
<string name="pref_mouse_back_action_right">Clique com o botão direito</string>
|
||||
<string name="pref_mouse_back">Botão \"voltar</string>
|
||||
<string name="pref_mouse_back_action_middle">Clique do meio</string>
|
||||
<string name="pref_discovery_autorun">Execução automática</string>
|
||||
<string name="pref_discovery_autorun_summary">Descubra servidores enquanto estiver na página inicial</string>
|
||||
<string name="pref_rediscovery_indicator">Destaque servidores redescobertos</string>
|
||||
<string name="pref_direct_touch_summary_on">Faça ações no ponto de contato</string>
|
||||
<string name="pref_direct_touch">Toque direto</string>
|
||||
<string name="title_default_security">Segurança padrão</string>
|
||||
<string name="msg_drag_gesture_help">Ao atribuir ação de gesto de Arrastar você mudará Detecção de toque longo:
|
||||
\n
|
||||
\n<b>Toque-segure-solte</b> → Toque longo
|
||||
\n<b>Toque-segure-deslize</b> → Arrastar</string>
|
||||
<string name="pref_swipe_sensitivity">Sensibilidade de deslize</string>
|
||||
<string name="pref_orientation">Orientação da tela</string>
|
||||
<string name="pref_orientation_option_auto">Automática</string>
|
||||
<string name="pref_orientation_option_portrait">Vertical</string>
|
||||
<string name="pref_orientation_option_landscape">Horizontal</string>
|
||||
<string name="title_default_security">Segurança Padrão</string>
|
||||
</resources>
|
||||
|
|
@ -1,146 +1,2 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<resources>
|
||||
<string name="title_add_server_profile">Добавить сервер</string>
|
||||
<string name="title_edit_server_profile">Изменить сервер</string>
|
||||
<string name="title_duplicate">Создать копию</string>
|
||||
<string name="title_edit">Изменить</string>
|
||||
<string name="title_delete">Удалить</string>
|
||||
<string name="title_cancel">Отменить</string>
|
||||
<string name="title_save">Сохранить</string>
|
||||
<string name="title_settings">Настройки</string>
|
||||
<string name="title_credentials_required">Войти</string>
|
||||
<string name="title_export">Экспорт</string>
|
||||
<string name="title_import">Импорт</string>
|
||||
<string name="title_view_only_mode">Только просмотр</string>
|
||||
<string name="msg_invalid_key_file">недействительный файл приватного ключа</string>
|
||||
<string name="pref_servers">Серверы</string>
|
||||
<string name="pref_mouse">Мышь</string>
|
||||
<string name="title_default_security">Безопасность по-умолчанию</string>
|
||||
<string name="title_delete_servers_before_import">Удалите текущие серверы перед импортом</string>
|
||||
<string name="title_password">Пароль</string>
|
||||
<string name="title_change">Изменить</string>
|
||||
<string name="title_about">О программе</string>
|
||||
<string name="title_license">Лицензия</string>
|
||||
<string name="title_open_source_libraries">Библиотеки с открытым исходным кодом</string>
|
||||
<string name="title_github_repo">Исходный код</string>
|
||||
<string name="hint_urlbar">Подключится к серверу</string>
|
||||
<string name="hint_server_name">Имя (например: Рабочий ПК)</string>
|
||||
<string name="hint_host">Хост</string>
|
||||
<string name="hint_port">Порт</string>
|
||||
<string name="hint_server_id">Идентификатор сервера</string>
|
||||
<string name="msg_exported">Экспортировано</string>
|
||||
<string name="msg_export_auth_missing">Ваше устройство не защищено. Включите блокировку экрана для обеспечения возможности аутентификации перед экспортом.</string>
|
||||
<string name="msg_copied_to_clipboard">Скопировано</string>
|
||||
<string name="desc_saved_servers_tab">Сохранённые серверы</string>
|
||||
<string name="desc_discovered_servers_tab">Найденные серверы</string>
|
||||
<string name="desc_discovery_btn">Найти серверы</string>
|
||||
<string name="desc_discovery_running">Поиск серверов в вашей сети</string>
|
||||
<string name="desc_virtual_keys_btn">Показать виртуальные клавиши</string>
|
||||
<string name="desc_reset_zoom_btn">Сбросить масштабирование</string>
|
||||
<string name="desc_back_btn">Назад</string>
|
||||
<string name="desc_help_btn">Помощь</string>
|
||||
<string name="desc_discovered_list">Список автоматически найденных серверов</string>
|
||||
<string name="pref_ui_summary">Внешний вид</string>
|
||||
<string name="desc_retry_connection_btn">Повторить</string>
|
||||
<string name="pref_input">Ввод</string>
|
||||
<string name="pref_input_summary">Жесты, мышь, виртуальные клавиши</string>
|
||||
<string name="pref_server_summary">Вход, обнаружение</string>
|
||||
<string name="pref_tools">Инструменты</string>
|
||||
<string name="pref_tools_summary">Импорт/Экспорт, отладка</string>
|
||||
<string name="pref_gesture_action_left_click">Левая кнопка мыши</string>
|
||||
<string name="pref_gesture_action_middle_click">Средняя кнопка мыши</string>
|
||||
<string name="pref_gesture_action_remote_scroll">Прокручивать удалённое содержимое</string>
|
||||
<string name="pref_theme_option_system">Система</string>
|
||||
<string name="pref_gesture">Жесты</string>
|
||||
<string name="pref_double_tap">Двойное нажатие</string>
|
||||
<string name="pref_sort_server_list">Сортировать сохранённые серверы по имени</string>
|
||||
<string name="pref_single_tap">Одиночное нажатие</string>
|
||||
<string name="pref_discovery">Обнаружение</string>
|
||||
<string name="pref_discovery_autorun">Автозапуск</string>
|
||||
<string name="pref_experimental_toolbar_swipe_close_summary">Во время удалённой сессии, вы можете сделать свайп для закрытия открытой панели инструментов</string>
|
||||
<string name="pref_gesture_action_none">Нет</string>
|
||||
<string name="pref_gesture_action_right_click">Правая кнопка мыши</string>
|
||||
<string name="pref_gesture_action_double_click">Двойное нажатие</string>
|
||||
<string name="pref_vk_show_all">Показать все клавиши</string>
|
||||
<string name="pref_vk_open_with_keyboard">Открыть с клавиатурой</string>
|
||||
<string name="pref_km_language_switch_to_super">Переключение раскладки → Super</string>
|
||||
<string name="pref_toolbar_alignment_option_start">Начало</string>
|
||||
<string name="pref_toolbar">Панель инструментов</string>
|
||||
<string name="pref_toolbar_alignment_option_end">Конец</string>
|
||||
<string name="pref_zoom">Масштабирование</string>
|
||||
<string name="pref_import_export">Импортировать/Экспортировать серверы</string>
|
||||
<string name="pref_debugging">Отладка</string>
|
||||
<string name="title_report_bug">Сообщить об ошибке</string>
|
||||
<string name="msg_pip_not_supported">Не поддерживается на этом устройстве</string>
|
||||
<string name="msg_ptr_hiding_not_supported">Не поддерживается на этом устройстве</string>
|
||||
<string name="msg_loading">Загрузка…</string>
|
||||
<string name="msg_imported">Импортировано</string>
|
||||
<string name="tip_urlbar">Вы можете ввести IP адрес, имя хоста, или \'vnc://\' URI.</string>
|
||||
<string name="desc_add_new_server_btn">Добавить сервер</string>
|
||||
<string name="desc_save_discovered_server_btn">Сохранить</string>
|
||||
<string name="desc_discovery_stop_btn">остановить поиск серверов</string>
|
||||
<string name="desc_keyboard_btn">Открыть клавиатуру</string>
|
||||
<string name="desc_clear_url_btn">Очистить</string>
|
||||
<string name="desc_server_url">Адрес сервера</string>
|
||||
<string name="pref_viewer">Просмотр</string>
|
||||
<string name="pref_viewer_summary">Картинка-в-картинке, масштабирование</string>
|
||||
<string name="pref_experimental">Экспериментальные</string>
|
||||
<string name="pref_experimental_summary">Экспериментальные возможности</string>
|
||||
<string name="pref_gesture_action_move_pointer">Движение курсора</string>
|
||||
<string name="pref_gesture_action_remote_drag">Перетаскивать удалённое содержимое</string>
|
||||
<string name="pref_gesture_action_open_keyboard">Открыть клавиатуру</string>
|
||||
<string name="pref_theme_option_dark">Тёмная</string>
|
||||
<string name="pref_theme_option_light">Светлая</string>
|
||||
<string name="pref_prefer_advanced_editor">Напрямую открывать дополнительные настройки сервера</string>
|
||||
<string name="pref_long_press">Длительное нажатие</string>
|
||||
<string name="pref_swipe1">Свайп одним пальцем</string>
|
||||
<string name="pref_swipe2">Свайп двумя пальцами</string>
|
||||
<string name="pref_drag">Перетаскивание</string>
|
||||
<string name="pref_swipe_sensitivity">Чувствительность свайпа</string>
|
||||
<string name="pref_hide_local_cursor">Скрыть локальный курсор</string>
|
||||
<string name="pref_mouse_back">Кнопка \"назад\"</string>
|
||||
<string name="pref_mouse_back_action_default">По-умолчанию</string>
|
||||
<string name="pref_mouse_back_action_right">Правая кнопка мыши</string>
|
||||
<string name="pref_mouse_back_action_middle">Средняя кнопка мыши</string>
|
||||
<string name="pref_vk">Виртуальные клавиши</string>
|
||||
<string name="pref_km_right_alt_to_super">Правый Alt → Super</string>
|
||||
<string name="pref_zoom_min">Минимум</string>
|
||||
<string name="pref_cred_autocomplete">Авто-завершение</string>
|
||||
<string name="pref_zoom_max">Максимум</string>
|
||||
<string name="pref_orientation">Ориентация экрана</string>
|
||||
<string name="pref_orientation_option_auto">Автоматически</string>
|
||||
<string name="pref_orientation_option_portrait">Портретная</string>
|
||||
<string name="title_clear">Очистить</string>
|
||||
<string name="msg_server_profile_added">Сервер добавлен</string>
|
||||
<string name="msg_server_profile_deleted">Сервер удалён</string>
|
||||
<string name="pref_ui">Интерфейс</string>
|
||||
<string name="title_copy_host">Скопировать хост</string>
|
||||
<string name="title_use_ssh_tunnel">Использовать SSH туннель</string>
|
||||
<string name="title_unknown_ssh_host">Неизвестный SSH хост</string>
|
||||
<string name="title_ssh_host_key_changed">Ключ хоста SSH изменён</string>
|
||||
<string name="msg_about_app">Быстрый и защищённый VNC клиент. Удалённо просматривайте и управляйте любым устройством на котором запущен VNC сервер.
|
||||
\n
|
||||
\n
|
||||
\nAVNC это программное обеспечение с открытым исходным кодом - созданное при поддержке от большого количества участников.</string>
|
||||
<string name="tip_empty_server_list">Список серверов пуст.
|
||||
\nНажмите \'<b>+</b>\' для добавления сервера, или
|
||||
\nиспользуйте верхнюю адресную строку для прямого подключения.</string>
|
||||
<string name="pref_two_finger_tap">Нажатие двумя пальцами</string>
|
||||
<string name="pref_enable_pip">Картинка-в-картинке</string>
|
||||
<string name="title_copy_name">Скопировать имя</string>
|
||||
<string name="pref_logs">Логи</string>
|
||||
<string name="title_hide_remote_cursor">Скрыть удалённый курсор</string>
|
||||
<string name="title_continue">Продолжить</string>
|
||||
<string name="hint_username">Имя пользователя</string>
|
||||
<string name="desc_settings_btn">Настройки</string>
|
||||
<string name="desc_saved_servers_list">Список сохранённых серверов</string>
|
||||
<string name="hint_password">Пароль</string>
|
||||
<string name="pref_theme">Тема</string>
|
||||
<string name="pref_km">Назначения клавиш</string>
|
||||
<string name="pref_orientation_option_landscape">Ландшафтная</string>
|
||||
<string name="pref_fullscreen">Полноэкранный режим</string>
|
||||
<string name="pref_clipboard_sync">Синхронизация буфера обмена</string>
|
||||
<string name="pref_credential">Вход</string>
|
||||
<string name="pref_experimental_immersive_mode">Режим полного присутствия</string>
|
||||
<string name="pref_experimental_immersive_mode_summary">Скрывает все системные панели в полноэкранном режиме</string>
|
||||
</resources>
|
||||
<resources />
|
||||
|
|
@ -168,6 +168,8 @@
|
|||
<string name="pref_mouse_back_action_default">Öntanımlı</string>
|
||||
<string name="pref_swipe_sensitivity">Kaydırma hassasiyeti</string>
|
||||
<string name="title_default_security">Öntanımlı güvenlik</string>
|
||||
<string name="msg_hide_remote_pointer_option_moved">\'Uzak işaretçiyi gizle\' artık şurada bulunabilir:
|
||||
\n\'Ayarlar → Giriş → Fare\'</string>
|
||||
<string name="msg_drag_gesture_help">Sürükleme hareketine bir eylem atamak, Uzun basma algılamasını değiştirecektir:
|
||||
\n
|
||||
\n<b>Basılı tut ve bırak</b> → Uzun bas
|
||||
|
|
|
|||
|
|
@ -59,7 +59,7 @@
|
|||
<string name="pref_experimental_summary">Додаткові можливості</string>
|
||||
<string name="pref_gesture_action_left_click">Ліве клацання</string>
|
||||
<string name="pref_gesture_action_move_pointer">Перемістити вказівник</string>
|
||||
<string name="pref_clipboard_sync">Синхронізувати буфери обміну</string>
|
||||
<string name="pref_clipboard_sync">Синхронувати буфери обміну</string>
|
||||
<string name="pref_gesture_action_remote_scroll">Прокрутити віддалений вміст</string>
|
||||
<string name="pref_km_language_switch_to_super">Перемикання мови → Super</string>
|
||||
<string name="pref_toolbar_alignment_option_start">Початок</string>
|
||||
|
|
@ -168,6 +168,8 @@
|
|||
<string name="pref_mouse_back_action_middle">Клацання середньою кнопкою</string>
|
||||
<string name="pref_swipe_sensitivity">Чутливість ковзання</string>
|
||||
<string name="title_default_security">Типовий захист</string>
|
||||
<string name="msg_hide_remote_pointer_option_moved">\'Ховати віддалений вказівник\' тепер доступне в
|
||||
\n\'Налаштування → Введення → Миша\'</string>
|
||||
<string name="msg_drag_gesture_help">Присвоєння дії жесту Перетягування змінить виявлення довгого натискання:
|
||||
\n
|
||||
\n<b>Натиснути-утримувати-відпустити</b> → Довге натискання
|
||||
|
|
@ -175,5 +177,4 @@
|
|||
<string name="pref_orientation">Орієнтація екрана</string>
|
||||
<string name="pref_orientation_option_auto">Автоматична</string>
|
||||
<string name="pref_orientation_option_portrait">Портретна</string>
|
||||
<string name="pref_orientation_option_landscape">Альбомна</string>
|
||||
</resources>
|
||||
|
|
@ -87,7 +87,7 @@
|
|||
<string name="pref_long_press">长按</string>
|
||||
<string name="pref_swipe1">单指轻扫</string>
|
||||
<string name="pref_swipe2">双指轻扫</string>
|
||||
<string name="pref_drag">拖动</string>
|
||||
<string name="pref_drag">拖动(长按和轻扫)</string>
|
||||
<string name="pref_mouse">鼠标</string>
|
||||
<string name="pref_mouse_passthrough">鼠标直通</string>
|
||||
<string name="pref_mouse_passthrough_summary_on">将鼠标事件直接发送到服务器</string>
|
||||
|
|
@ -164,16 +164,10 @@
|
|||
<string name="pref_discovery_autorun_summary">在主页上时发现服务器</string>
|
||||
<string name="pref_experimental_toolbar_swipe_close">轻扫以关闭工具栏抽屉</string>
|
||||
<string name="title_default_security">默认安全度</string>
|
||||
<string name="msg_hide_remote_pointer_option_moved">“隐藏远程鼠标”已可从
|
||||
\n“设置→输入→鼠标”开启</string>
|
||||
<string name="pref_swipe_sensitivity">调节灵敏度</string>
|
||||
<string name="pref_km_language_switch_to_super">语言切换 → Super 键</string>
|
||||
<string name="pref_km_back_to_escape">退格键 → Esc 键</string>
|
||||
<string name="pref_km_right_alt_to_super">右 Alt 键 → Super (开始菜单)键</string>
|
||||
<string name="msg_drag_gesture_help">为拖动手势分配一个动作将改变长按检测:
|
||||
\n
|
||||
\n<b>按住释放</b> → 长按
|
||||
\n<b>按住滑动</b> → 拖动</string>
|
||||
<string name="pref_orientation">屏幕方向</string>
|
||||
<string name="pref_orientation_option_auto">自动</string>
|
||||
<string name="pref_orientation_option_portrait">竖屏</string>
|
||||
<string name="pref_orientation_option_landscape">横屏</string>
|
||||
</resources>
|
||||
|
|
@ -69,6 +69,7 @@
|
|||
<string name="msg_invalid_vnc_uri">Invalid VNC URI</string>
|
||||
<string name="msg_copied_to_clipboard">Copied</string>
|
||||
<string name="msg_key_compat_mode_help">Some servers have limited Unicode support. Legacy key events can help input non-English text.</string>
|
||||
<string name="msg_hide_remote_pointer_option_moved">\'Hide remote pointer\' is now available in \n\'Settings → Input → Mouse\'</string>
|
||||
<string name="msg_drag_gesture_help">Assigning an action to Drag gesture will change Long press detection:\n\n<b>Press-hold-release</b> → Long press\n<b>Press-hold-swipe</b> → Drag</string>
|
||||
<string name="tip_empty_server_list">Server list is empty.\nClick \'<b>+</b>\' to add a server, or\nuse the top address bar to connect directly.</string>
|
||||
<string name="tip_urlbar">You can enter IP address, hostname, or \'vnc://\' URI.</string>
|
||||
|
|
|
|||
|
|
@ -16,7 +16,7 @@
|
|||
app:title="@string/pref_experimental_toolbar_swipe_close" />
|
||||
|
||||
<SwitchPreference
|
||||
app:defaultValue="true"
|
||||
app:defaultValue="false"
|
||||
app:key="viewer_immersive_mode"
|
||||
app:summary="@string/pref_experimental_immersive_mode_summary"
|
||||
app:title="@string/pref_experimental_immersive_mode" />
|
||||
|
|
|
|||
|
|
@ -106,7 +106,7 @@
|
|||
app:title="@string/title_hide_remote_cursor" />
|
||||
|
||||
<ListPreference
|
||||
app:defaultValue="right-click"
|
||||
app:defaultValue="right"
|
||||
app:entries="@array/mouse_back_action_entries"
|
||||
app:entryValues="@array/mouse_back_action_values"
|
||||
app:key="mouse_back"
|
||||
|
|
|
|||
2
extern/wolfssl
vendored
2
extern/wolfssl
vendored
|
|
@ -1 +1 @@
|
|||
Subproject commit 57aac1c50b45275c7a99eca32ad985998b292dc8
|
||||
Subproject commit e722c15be860794179082a05d09e6a90dc77ccf0
|
||||
|
|
@ -1,3 +0,0 @@
|
|||
* Fixed black screen issue on some Tegra GPUs
|
||||
* Excluded viewer's toolbar area from system back gesture
|
||||
* New language: Russian
|
||||
|
|
@ -1,3 +0,0 @@
|
|||
* Small improvement in connection startup speed
|
||||
* Fixed a crash on first ever connection when toolbar was aligned to end
|
||||
* Fixed a crash when entering picture-in-picture for servers with large aspect ratio
|
||||
Loading…
Add table
Reference in a new issue