From 64d0fb17f76b269cddc0a8eb355da8eb8abdce0f Mon Sep 17 00:00:00 2001 From: 21pages Date: Fri, 7 Jun 2024 11:04:18 +0800 Subject: [PATCH] add floating window setting (#8279) * Set `disable-floating-window` in client ui, it shows enabled when option is enabled and has floating window permission. * Remove ignore battery setting because not work on every device. * When the phone orientation changes, make the Y coordinate change proportionally, when changing back, the floating window position is still the original one. * Add custom client option `floating-window-untouchable` to make the click event pass through the floating window automically. Set it untouchable automically when transparency is 0. * On my phone, floating window size 16 no works and 32 works, so keep the size range [32, 320] Signed-off-by: 21pages --- .../flutter_hbb/FloatingWindowService.kt | 37 ++++++++++++++---- .../com/carriez/flutter_hbb/MainActivity.kt | 8 +--- .../com/carriez/flutter_hbb/MainService.kt | 1 + flutter/lib/mobile/pages/settings_page.dart | 38 ++++++++++++++++++- libs/hbb_common/src/config.rs | 2 + src/lang/ar.rs | 2 + src/lang/bg.rs | 2 + src/lang/ca.rs | 2 + src/lang/cn.rs | 2 + src/lang/cs.rs | 2 + src/lang/da.rs | 2 + src/lang/de.rs | 2 + src/lang/el.rs | 2 + src/lang/en.rs | 1 + src/lang/eo.rs | 2 + src/lang/es.rs | 2 + src/lang/et.rs | 2 + src/lang/fa.rs | 2 + src/lang/fr.rs | 2 + src/lang/he.rs | 2 + src/lang/hr.rs | 2 + src/lang/hu.rs | 2 + src/lang/id.rs | 2 + src/lang/it.rs | 2 + src/lang/ja.rs | 2 + src/lang/ko.rs | 2 + src/lang/kz.rs | 2 + src/lang/lt.rs | 2 + src/lang/lv.rs | 2 + src/lang/nb.rs | 2 + src/lang/nl.rs | 2 + src/lang/pl.rs | 2 + src/lang/pt_PT.rs | 2 + src/lang/ptbr.rs | 2 + src/lang/ro.rs | 2 + src/lang/ru.rs | 2 + src/lang/sk.rs | 2 + src/lang/sl.rs | 2 + src/lang/sq.rs | 2 + src/lang/sr.rs | 2 + src/lang/sv.rs | 2 + src/lang/template.rs | 2 + src/lang/th.rs | 2 + src/lang/tr.rs | 2 + src/lang/tw.rs | 2 + src/lang/ua.rs | 2 + src/lang/vn.rs | 2 + 47 files changed, 155 insertions(+), 14 deletions(-) diff --git a/flutter/android/app/src/main/kotlin/com/carriez/flutter_hbb/FloatingWindowService.kt b/flutter/android/app/src/main/kotlin/com/carriez/flutter_hbb/FloatingWindowService.kt index 3e5a5faa4..a16e90e95 100644 --- a/flutter/android/app/src/main/kotlin/com/carriez/flutter_hbb/FloatingWindowService.kt +++ b/flutter/android/app/src/main/kotlin/com/carriez/flutter_hbb/FloatingWindowService.kt @@ -38,18 +38,21 @@ class FloatingWindowService : Service(), View.OnTouchListener { private var dragging = false private var lastDownX = 0f private var lastDownY = 0f + private var viewCreated = false; companion object { private val logTag = "floatingService" - private var firsCreate = true + private var firstCreate = true private var viewWidth = 120 private var viewHeight = 120 private const val MIN_VIEW_SIZE = 32 // size 0 does not help prevent the service from being killed private const val MAX_VIEW_SIZE = 320 + private var viewUntouchable = false private var viewTransparency = 1f // 0 means invisible but can help prevent the service from being killed private var customSvg = "" private var lastLayoutX = 0 private var lastLayoutY = 0 + private var lastOrientation = Configuration.ORIENTATION_UNDEFINED } override fun onBind(intent: Intent): IBinder? { @@ -60,8 +63,8 @@ class FloatingWindowService : Service(), View.OnTouchListener { super.onCreate() windowManager = getSystemService(WINDOW_SERVICE) as WindowManager try { - if (firsCreate) { - firsCreate = false + if (firstCreate) { + firstCreate = false onFirstCreate(windowManager) } Log.d(logTag, "floating window size: $viewWidth x $viewHeight, transparency: $viewTransparency, lastLayoutX: $lastLayoutX, lastLayoutY: $lastLayoutY, customSvg: $customSvg") @@ -75,6 +78,7 @@ class FloatingWindowService : Service(), View.OnTouchListener { @SuppressLint("ClickableViewAccessibility") private fun createView(windowManager: WindowManager) { floatingView = ImageView(this) + viewCreated = true originalDrawable = resources.getDrawable(R.drawable.floating_window, null) if (customSvg.isNotEmpty()) { try { @@ -131,7 +135,10 @@ class FloatingWindowService : Service(), View.OnTouchListener { floatingView.setOnTouchListener(this) floatingView.alpha = viewTransparency * 1f - val flags = FLAG_LAYOUT_IN_SCREEN or FLAG_NOT_TOUCH_MODAL or FLAG_NOT_FOCUSABLE + var flags = FLAG_LAYOUT_IN_SCREEN or FLAG_NOT_TOUCH_MODAL or FLAG_NOT_FOCUSABLE + if (viewUntouchable || viewTransparency == 0f) { + flags = flags or WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE + } layoutParams = WindowManager.LayoutParams( viewWidth / 2, viewHeight, @@ -166,6 +173,8 @@ class FloatingWindowService : Service(), View.OnTouchListener { } } } + // untouchable + viewUntouchable = FFI.getLocalOption("floating-window-untouchable") == "Y" // transparency FFI.getLocalOption("floating-window-transparency").let { if (it.isNotEmpty()) { @@ -188,11 +197,14 @@ class FloatingWindowService : Service(), View.OnTouchListener { // position lastLayoutX = 0 lastLayoutY = (wh.second - viewHeight) / 2 + lastOrientation = resources.configuration.orientation } override fun onDestroy() { super.onDestroy() - windowManager.removeView(floatingView) + if (viewCreated) { + windowManager.removeView(floatingView) + } } private fun performClick() { @@ -200,7 +212,6 @@ class FloatingWindowService : Service(), View.OnTouchListener { } override fun onTouch(view: View?, event: MotionEvent?): Boolean { - if (viewTransparency == 0f) return false when (event?.action) { MotionEvent.ACTION_DOWN -> { dragging = false @@ -257,7 +268,19 @@ class FloatingWindowService : Service(), View.OnTouchListener { override fun onConfigurationChanged(newConfig: Configuration) { super.onConfigurationChanged(newConfig) - moveToScreenSide(true) + if (newConfig.orientation != lastOrientation) { + lastOrientation = newConfig.orientation + val wh = getScreenSize(windowManager) + Log.d(logTag, "orientation: $lastOrientation, screen size: ${wh.first} x ${wh.second}") + val newW = wh.first + val newH = wh.second + if (newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE || newConfig.orientation == Configuration.ORIENTATION_PORTRAIT) { + // Proportional change + layoutParams.x = (layoutParams.x.toFloat() / newH.toFloat() * newW.toFloat()).toInt() + layoutParams.y = (layoutParams.y.toFloat() / newW.toFloat() * newH.toFloat()).toInt() + } + moveToScreenSide() + } } private fun showPopupMenu() { diff --git a/flutter/android/app/src/main/kotlin/com/carriez/flutter_hbb/MainActivity.kt b/flutter/android/app/src/main/kotlin/com/carriez/flutter_hbb/MainActivity.kt index 34a8cd763..b7050d8a4 100644 --- a/flutter/android/app/src/main/kotlin/com/carriez/flutter_hbb/MainActivity.kt +++ b/flutter/android/app/src/main/kotlin/com/carriez/flutter_hbb/MainActivity.kt @@ -365,14 +365,10 @@ class MainActivity : FlutterActivity() { } } - private var disableFloatingWindow: Boolean? = null override fun onStop() { super.onStop() - if (disableFloatingWindow == null) { - disableFloatingWindow = FFI.getLocalOption("disable-floating-window") == "Y" - Log.d(logTag, "disableFloatingWindow: $disableFloatingWindow") - } - if (disableFloatingWindow != true && MainService.isReady) { + val disableFloatingWindow = FFI.getLocalOption("disable-floating-window") == "Y" + if (!disableFloatingWindow && MainService.isReady) { startService(Intent(this, FloatingWindowService::class.java)) } } diff --git a/flutter/android/app/src/main/kotlin/com/carriez/flutter_hbb/MainService.kt b/flutter/android/app/src/main/kotlin/com/carriez/flutter_hbb/MainService.kt index 2a66896fe..57b97b7c2 100644 --- a/flutter/android/app/src/main/kotlin/com/carriez/flutter_hbb/MainService.kt +++ b/flutter/android/app/src/main/kotlin/com/carriez/flutter_hbb/MainService.kt @@ -247,6 +247,7 @@ class MainService : Service() { override fun onDestroy() { checkMediaPermission() + stopService(Intent(this, FloatingWindowService::class.java)) super.onDestroy() } diff --git a/flutter/lib/mobile/pages/settings_page.dart b/flutter/lib/mobile/pages/settings_page.dart index e0fe16cca..418bd78c6 100644 --- a/flutter/lib/mobile/pages/settings_page.dart +++ b/flutter/lib/mobile/pages/settings_page.dart @@ -36,9 +36,11 @@ class SettingsPage extends StatefulWidget implements PageShape { const url = 'https://rustdesk.com/'; class _SettingsState extends State with WidgetsBindingObserver { - final _hasIgnoreBattery = androidVersion >= 26; + final _hasIgnoreBattery = + false; //androidVersion >= 26; // remove because not work on every device var _ignoreBatteryOpt = false; var _enableStartOnBoot = false; + var _floatingWindowDisabled = false; var _enableAbr = false; var _denyLANDiscovery = false; var _onlyWhiteList = false; @@ -86,6 +88,14 @@ class _SettingsState extends State with WidgetsBindingObserver { _enableStartOnBoot = enableStartOnBoot; } + var floatingWindowDisabled = + bind.mainGetLocalOption(key: kOptionDisableFloatingWindow) == "Y" || + !await AndroidPermissionManager.check(kSystemAlertWindow); + if (floatingWindowDisabled != _floatingWindowDisabled) { + update = true; + _floatingWindowDisabled = floatingWindowDisabled; + } + final enableAbrRes = option2bool( kOptionEnableAbr, await bind.mainGetOption(key: kOptionEnableAbr)); if (enableAbrRes != _enableAbr) { @@ -493,6 +503,32 @@ class _SettingsState extends State with WidgetsBindingObserver { gFFI.invokeMethod(AndroidChannel.kSetStartOnBootOpt, toValue); })); + onFloatingWindowChanged(bool toValue) async { + if (toValue) { + if (!await AndroidPermissionManager.check(kSystemAlertWindow)) { + if (!await AndroidPermissionManager.request(kSystemAlertWindow)) { + return; + } + } + } + final disable = !toValue; + bind.mainSetLocalOption( + key: kOptionDisableFloatingWindow, + value: disable ? 'Y' : defaultOptionNo); + setState(() => _floatingWindowDisabled = disable); + } + + enhancementsTiles.add(SettingsTile.switchTile( + initialValue: !_floatingWindowDisabled, + title: Column(crossAxisAlignment: CrossAxisAlignment.start, children: [ + Text(translate('Floating window')), + Text('* ${translate('floating_window_tip')}', + style: Theme.of(context).textTheme.bodySmall), + ]), + onToggle: bind.mainIsOptionFixed(key: kOptionDisableFloatingWindow) + ? null + : onFloatingWindowChanged)); + final disabledSettings = bind.isDisableSettings(); final settings = SettingsList( sections: [ diff --git a/libs/hbb_common/src/config.rs b/libs/hbb_common/src/config.rs index f717ba0a2..bfce3b52e 100644 --- a/libs/hbb_common/src/config.rs +++ b/libs/hbb_common/src/config.rs @@ -2096,6 +2096,7 @@ pub mod keys { // android floating window options pub const OPTION_DISABLE_FLOATING_WINDOW: &str = "disable-floating-window"; pub const OPTION_FLOATING_WINDOW_SIZE: &str = "floating-window-size"; + pub const OPTION_FLOATING_WINDOW_UNTOUCHABLE: &str = "floating-window-untouchable"; pub const OPTION_FLOATING_WINDOW_TRANSPARENCY: &str = "floating-window-transparency"; pub const OPTION_FLOATING_WINDOW_SVG: &str = "floating-window-svg"; @@ -2156,6 +2157,7 @@ pub mod keys { OPTION_FLUTTER_CURRENT_AB_NAME, OPTION_DISABLE_FLOATING_WINDOW, OPTION_FLOATING_WINDOW_SIZE, + OPTION_FLOATING_WINDOW_UNTOUCHABLE, OPTION_FLOATING_WINDOW_TRANSPARENCY, OPTION_FLOATING_WINDOW_SVG, ]; diff --git a/src/lang/ar.rs b/src/lang/ar.rs index 79af7728c..35ebdf332 100644 --- a/src/lang/ar.rs +++ b/src/lang/ar.rs @@ -615,5 +615,7 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("android_new_voice_call_tip", ""), ("texture_render_tip", ""), ("Use texture rendering", ""), + ("Floating window", ""), + ("floating_window_tip", ""), ].iter().cloned().collect(); } diff --git a/src/lang/bg.rs b/src/lang/bg.rs index 5cdfccaa1..7fb752ca6 100644 --- a/src/lang/bg.rs +++ b/src/lang/bg.rs @@ -615,5 +615,7 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("android_new_voice_call_tip", ""), ("texture_render_tip", ""), ("Use texture rendering", ""), + ("Floating window", ""), + ("floating_window_tip", ""), ].iter().cloned().collect(); } diff --git a/src/lang/ca.rs b/src/lang/ca.rs index baef93c71..24ac26296 100644 --- a/src/lang/ca.rs +++ b/src/lang/ca.rs @@ -615,5 +615,7 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("android_new_voice_call_tip", ""), ("texture_render_tip", ""), ("Use texture rendering", ""), + ("Floating window", ""), + ("floating_window_tip", ""), ].iter().cloned().collect(); } diff --git a/src/lang/cn.rs b/src/lang/cn.rs index 70d7f073f..2763e53ce 100644 --- a/src/lang/cn.rs +++ b/src/lang/cn.rs @@ -615,5 +615,7 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("android_new_voice_call_tip", "收到新的语音呼叫请求。如果您接受,音频将切换为语音通信。"), ("texture_render_tip", "使用纹理渲染,使图片更加流畅。 如果您遭遇渲染问题,可尝试关闭此选项。"), ("Use texture rendering", "使用纹理渲染"), + ("Floating window", "悬浮窗"), + ("floating_window_tip", "有助于保持RustDesk后台服务"), ].iter().cloned().collect(); } diff --git a/src/lang/cs.rs b/src/lang/cs.rs index a2a834c8f..98ccf6fd6 100644 --- a/src/lang/cs.rs +++ b/src/lang/cs.rs @@ -615,5 +615,7 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("android_new_voice_call_tip", "Byl přijat nový požadavek na hlasové volání. Pokud hovor přijmete, přepne se zvuk na hlasovou komunikaci."), ("texture_render_tip", "Použít vykreslování textur, aby byly obrázky hladší."), ("Use texture rendering", "Použít vykreslování textur"), + ("Floating window", ""), + ("floating_window_tip", ""), ].iter().cloned().collect(); } diff --git a/src/lang/da.rs b/src/lang/da.rs index c68df391c..5c21fe99e 100644 --- a/src/lang/da.rs +++ b/src/lang/da.rs @@ -615,5 +615,7 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("android_new_voice_call_tip", ""), ("texture_render_tip", ""), ("Use texture rendering", ""), + ("Floating window", ""), + ("floating_window_tip", ""), ].iter().cloned().collect(); } diff --git a/src/lang/de.rs b/src/lang/de.rs index 2bcd8457e..53870f5d4 100644 --- a/src/lang/de.rs +++ b/src/lang/de.rs @@ -615,5 +615,7 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("android_new_voice_call_tip", "Eine neue Sprachanrufanfrage wurde empfangen. Wenn Sie die Anfrage annehmen, wird der Ton auf Sprachkommunikation umgeschaltet."), ("texture_render_tip", "Verwenden Sie Textur-Rendering, um die Bilder glatter zu machen."), ("Use texture rendering", "Textur-Rendering verwenden"), + ("Floating window", ""), + ("floating_window_tip", ""), ].iter().cloned().collect(); } diff --git a/src/lang/el.rs b/src/lang/el.rs index f1a2ad736..1f9244bb4 100644 --- a/src/lang/el.rs +++ b/src/lang/el.rs @@ -615,5 +615,7 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("android_new_voice_call_tip", ""), ("texture_render_tip", ""), ("Use texture rendering", ""), + ("Floating window", ""), + ("floating_window_tip", ""), ].iter().cloned().collect(); } diff --git a/src/lang/en.rs b/src/lang/en.rs index 21e7e1a2c..d8aa388ec 100644 --- a/src/lang/en.rs +++ b/src/lang/en.rs @@ -229,5 +229,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("confirm_clear_Wayland_screen_selection_tip", "Are you sure to clear the Wayland screen selection?"), ("android_new_voice_call_tip", "A new voice call request was received. If you accept, the audio will switch to voice communication."), ("texture_render_tip", "Use texture rendering to make the pictures smoother. You could try disabling this option if you encounter rendering issues."), + ("floating_window_tip", "It helps to keep RustDesk background service"), ].iter().cloned().collect(); } diff --git a/src/lang/eo.rs b/src/lang/eo.rs index e4376565a..df8fc4558 100644 --- a/src/lang/eo.rs +++ b/src/lang/eo.rs @@ -615,5 +615,7 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("android_new_voice_call_tip", ""), ("texture_render_tip", ""), ("Use texture rendering", ""), + ("Floating window", ""), + ("floating_window_tip", ""), ].iter().cloned().collect(); } diff --git a/src/lang/es.rs b/src/lang/es.rs index 8b75bb2be..fd691a087 100644 --- a/src/lang/es.rs +++ b/src/lang/es.rs @@ -615,5 +615,7 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("android_new_voice_call_tip", "Se ha recibido una nueva solicitud de llamada de voz. Si aceptas el audio cambiará a comunicación de voz."), ("texture_render_tip", "Usar renderizado de texturas para hacer las imágenes más suaves."), ("Use texture rendering", "Usar renderizado de texturas"), + ("Floating window", ""), + ("floating_window_tip", ""), ].iter().cloned().collect(); } diff --git a/src/lang/et.rs b/src/lang/et.rs index 3c4786900..d81976a9b 100644 --- a/src/lang/et.rs +++ b/src/lang/et.rs @@ -615,5 +615,7 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("android_new_voice_call_tip", ""), ("texture_render_tip", ""), ("Use texture rendering", ""), + ("Floating window", ""), + ("floating_window_tip", ""), ].iter().cloned().collect(); } diff --git a/src/lang/fa.rs b/src/lang/fa.rs index 2ebec3f38..4b9152a88 100644 --- a/src/lang/fa.rs +++ b/src/lang/fa.rs @@ -615,5 +615,7 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("android_new_voice_call_tip", "یک درخواست تماس صوتی جدید دریافت شد. اگر بپذیرید، صدا به ارتباط صوتی تغییر خواهد کرد."), ("texture_render_tip", ""), ("Use texture rendering", ""), + ("Floating window", ""), + ("floating_window_tip", ""), ].iter().cloned().collect(); } diff --git a/src/lang/fr.rs b/src/lang/fr.rs index 931f6ccbf..d8580188e 100644 --- a/src/lang/fr.rs +++ b/src/lang/fr.rs @@ -615,5 +615,7 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("android_new_voice_call_tip", "Une nouvelle demande d’appel vocal a été reçue. Si vous acceptez, l’audio passera à la communication vocale."), ("texture_render_tip", "Utilisez le rendu des textures pour rendre les images plus fluides."), ("Use texture rendering", "Utiliser le rendu de texture"), + ("Floating window", ""), + ("floating_window_tip", ""), ].iter().cloned().collect(); } diff --git a/src/lang/he.rs b/src/lang/he.rs index 911960e11..7b41ac6e5 100644 --- a/src/lang/he.rs +++ b/src/lang/he.rs @@ -615,5 +615,7 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("android_new_voice_call_tip", ""), ("texture_render_tip", ""), ("Use texture rendering", ""), + ("Floating window", ""), + ("floating_window_tip", ""), ].iter().cloned().collect(); } diff --git a/src/lang/hr.rs b/src/lang/hr.rs index 5d1fff798..7df05e518 100644 --- a/src/lang/hr.rs +++ b/src/lang/hr.rs @@ -615,5 +615,7 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("android_new_voice_call_tip", ""), ("texture_render_tip", ""), ("Use texture rendering", ""), + ("Floating window", ""), + ("floating_window_tip", ""), ].iter().cloned().collect(); } diff --git a/src/lang/hu.rs b/src/lang/hu.rs index 1f5899919..e505fb015 100644 --- a/src/lang/hu.rs +++ b/src/lang/hu.rs @@ -615,5 +615,7 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("android_new_voice_call_tip", ""), ("texture_render_tip", ""), ("Use texture rendering", ""), + ("Floating window", ""), + ("floating_window_tip", ""), ].iter().cloned().collect(); } diff --git a/src/lang/id.rs b/src/lang/id.rs index fe85beb70..c7eab6322 100644 --- a/src/lang/id.rs +++ b/src/lang/id.rs @@ -615,5 +615,7 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("android_new_voice_call_tip", ""), ("texture_render_tip", ""), ("Use texture rendering", ""), + ("Floating window", ""), + ("floating_window_tip", ""), ].iter().cloned().collect(); } diff --git a/src/lang/it.rs b/src/lang/it.rs index 6b6bb1cf7..33a58d33f 100644 --- a/src/lang/it.rs +++ b/src/lang/it.rs @@ -615,5 +615,7 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("android_new_voice_call_tip", "È stata ricevuta una nuova richiesta di chiamata vocale. Se accetti, l'audio passerà alla comunicazione vocale."), ("texture_render_tip", "Usa il rendering texture per rendere le immagini più fluide. Se riscontri problemi di rendering prova a disabilitare questa opzione."), ("Use texture rendering", "Usa rendering texture"), + ("Floating window", ""), + ("floating_window_tip", ""), ].iter().cloned().collect(); } diff --git a/src/lang/ja.rs b/src/lang/ja.rs index 27115c308..32272835c 100644 --- a/src/lang/ja.rs +++ b/src/lang/ja.rs @@ -615,5 +615,7 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("android_new_voice_call_tip", ""), ("texture_render_tip", ""), ("Use texture rendering", ""), + ("Floating window", ""), + ("floating_window_tip", ""), ].iter().cloned().collect(); } diff --git a/src/lang/ko.rs b/src/lang/ko.rs index a35bbcbcb..a52c147ed 100644 --- a/src/lang/ko.rs +++ b/src/lang/ko.rs @@ -615,5 +615,7 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("android_new_voice_call_tip", ""), ("texture_render_tip", ""), ("Use texture rendering", ""), + ("Floating window", ""), + ("floating_window_tip", ""), ].iter().cloned().collect(); } diff --git a/src/lang/kz.rs b/src/lang/kz.rs index b93558eb1..f8f864e57 100644 --- a/src/lang/kz.rs +++ b/src/lang/kz.rs @@ -615,5 +615,7 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("android_new_voice_call_tip", ""), ("texture_render_tip", ""), ("Use texture rendering", ""), + ("Floating window", ""), + ("floating_window_tip", ""), ].iter().cloned().collect(); } diff --git a/src/lang/lt.rs b/src/lang/lt.rs index 44bcafb82..034388273 100644 --- a/src/lang/lt.rs +++ b/src/lang/lt.rs @@ -615,5 +615,7 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("android_new_voice_call_tip", ""), ("texture_render_tip", ""), ("Use texture rendering", ""), + ("Floating window", ""), + ("floating_window_tip", ""), ].iter().cloned().collect(); } diff --git a/src/lang/lv.rs b/src/lang/lv.rs index b9727d015..409a678d9 100644 --- a/src/lang/lv.rs +++ b/src/lang/lv.rs @@ -615,5 +615,7 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("android_new_voice_call_tip", "Tika saņemts jauns balss zvana pieprasījums. Ja piekrītat, audio pārslēgsies uz balss saziņu."), ("texture_render_tip", "Izmantojiet tekstūras renderēšanu, lai attēli būtu vienmērīgāki. Varat mēģināt atspējot šo opciju, ja rodas renderēšanas problēmas."), ("Use texture rendering", "Izmantot tekstūras renderēšanu"), + ("Floating window", ""), + ("floating_window_tip", ""), ].iter().cloned().collect(); } diff --git a/src/lang/nb.rs b/src/lang/nb.rs index 7428c2cae..90d9666fc 100644 --- a/src/lang/nb.rs +++ b/src/lang/nb.rs @@ -615,5 +615,7 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("android_new_voice_call_tip", ""), ("texture_render_tip", ""), ("Use texture rendering", ""), + ("Floating window", ""), + ("floating_window_tip", ""), ].iter().cloned().collect(); } diff --git a/src/lang/nl.rs b/src/lang/nl.rs index aba74d435..aaf6b1308 100644 --- a/src/lang/nl.rs +++ b/src/lang/nl.rs @@ -615,5 +615,7 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("android_new_voice_call_tip", "Er is een nieuwe spraakoproep ontvangen. Als u het aanvaardt, schakelt de audio over naar spraakcommunicatie."), ("texture_render_tip", "Pas textuurrendering toe om afbeeldingen vloeiender te maken."), ("Use texture rendering", "Textuurrendering gebruiken"), + ("Floating window", ""), + ("floating_window_tip", ""), ].iter().cloned().collect(); } diff --git a/src/lang/pl.rs b/src/lang/pl.rs index 3334d1619..d0cd3a7d9 100644 --- a/src/lang/pl.rs +++ b/src/lang/pl.rs @@ -615,5 +615,7 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("android_new_voice_call_tip", ""), ("texture_render_tip", ""), ("Use texture rendering", ""), + ("Floating window", ""), + ("floating_window_tip", ""), ].iter().cloned().collect(); } diff --git a/src/lang/pt_PT.rs b/src/lang/pt_PT.rs index 86c98df45..11b974547 100644 --- a/src/lang/pt_PT.rs +++ b/src/lang/pt_PT.rs @@ -615,5 +615,7 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("android_new_voice_call_tip", ""), ("texture_render_tip", ""), ("Use texture rendering", ""), + ("Floating window", ""), + ("floating_window_tip", ""), ].iter().cloned().collect(); } diff --git a/src/lang/ptbr.rs b/src/lang/ptbr.rs index 667528c5d..8a654340c 100644 --- a/src/lang/ptbr.rs +++ b/src/lang/ptbr.rs @@ -615,5 +615,7 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("android_new_voice_call_tip", ""), ("texture_render_tip", ""), ("Use texture rendering", ""), + ("Floating window", ""), + ("floating_window_tip", ""), ].iter().cloned().collect(); } diff --git a/src/lang/ro.rs b/src/lang/ro.rs index f17d93b39..4e2998dc8 100644 --- a/src/lang/ro.rs +++ b/src/lang/ro.rs @@ -615,5 +615,7 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("android_new_voice_call_tip", ""), ("texture_render_tip", ""), ("Use texture rendering", ""), + ("Floating window", ""), + ("floating_window_tip", ""), ].iter().cloned().collect(); } diff --git a/src/lang/ru.rs b/src/lang/ru.rs index 5991a5d36..deecd4c31 100644 --- a/src/lang/ru.rs +++ b/src/lang/ru.rs @@ -615,5 +615,7 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("android_new_voice_call_tip", "Получен новый запрос на голосовой вызов. Если вы его примите, звук переключится на голосовую связь."), ("texture_render_tip", "Использовать визуализацию текстур, чтобы сделать изображения более плавными."), ("Use texture rendering", "Визуализация текстур"), + ("Floating window", ""), + ("floating_window_tip", ""), ].iter().cloned().collect(); } diff --git a/src/lang/sk.rs b/src/lang/sk.rs index 5fcdc588c..f79b69895 100644 --- a/src/lang/sk.rs +++ b/src/lang/sk.rs @@ -615,5 +615,7 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("android_new_voice_call_tip", "Bola prijatá nová žiadosť o hlasový hovor. Ak ho prijmete, zvuk sa prepne na hlasovú komunikáciu."), ("texture_render_tip", "Použiť vykresľovanie textúr, aby boli obrázky hladšie."), ("Use texture rendering", "Použiť vykresľovanie textúr"), + ("Floating window", ""), + ("floating_window_tip", ""), ].iter().cloned().collect(); } diff --git a/src/lang/sl.rs b/src/lang/sl.rs index f6c9581f2..1401a2279 100755 --- a/src/lang/sl.rs +++ b/src/lang/sl.rs @@ -615,5 +615,7 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("android_new_voice_call_tip", ""), ("texture_render_tip", ""), ("Use texture rendering", ""), + ("Floating window", ""), + ("floating_window_tip", ""), ].iter().cloned().collect(); } diff --git a/src/lang/sq.rs b/src/lang/sq.rs index 33dfc62d7..740579e7c 100644 --- a/src/lang/sq.rs +++ b/src/lang/sq.rs @@ -615,5 +615,7 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("android_new_voice_call_tip", ""), ("texture_render_tip", ""), ("Use texture rendering", ""), + ("Floating window", ""), + ("floating_window_tip", ""), ].iter().cloned().collect(); } diff --git a/src/lang/sr.rs b/src/lang/sr.rs index fbfb461c1..079f5ec33 100644 --- a/src/lang/sr.rs +++ b/src/lang/sr.rs @@ -615,5 +615,7 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("android_new_voice_call_tip", ""), ("texture_render_tip", ""), ("Use texture rendering", ""), + ("Floating window", ""), + ("floating_window_tip", ""), ].iter().cloned().collect(); } diff --git a/src/lang/sv.rs b/src/lang/sv.rs index f47da81dd..7cbd89036 100644 --- a/src/lang/sv.rs +++ b/src/lang/sv.rs @@ -615,5 +615,7 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("android_new_voice_call_tip", ""), ("texture_render_tip", ""), ("Use texture rendering", ""), + ("Floating window", ""), + ("floating_window_tip", ""), ].iter().cloned().collect(); } diff --git a/src/lang/template.rs b/src/lang/template.rs index 4f702fc79..757e94173 100644 --- a/src/lang/template.rs +++ b/src/lang/template.rs @@ -615,5 +615,7 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("android_new_voice_call_tip", ""), ("texture_render_tip", ""), ("Use texture rendering", ""), + ("Floating window", ""), + ("floating_window_tip", ""), ].iter().cloned().collect(); } diff --git a/src/lang/th.rs b/src/lang/th.rs index c74b1c4dc..99caddf59 100644 --- a/src/lang/th.rs +++ b/src/lang/th.rs @@ -615,5 +615,7 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("android_new_voice_call_tip", ""), ("texture_render_tip", ""), ("Use texture rendering", ""), + ("Floating window", ""), + ("floating_window_tip", ""), ].iter().cloned().collect(); } diff --git a/src/lang/tr.rs b/src/lang/tr.rs index 0dced6a43..853719828 100644 --- a/src/lang/tr.rs +++ b/src/lang/tr.rs @@ -615,5 +615,7 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("android_new_voice_call_tip", ""), ("texture_render_tip", ""), ("Use texture rendering", ""), + ("Floating window", ""), + ("floating_window_tip", ""), ].iter().cloned().collect(); } diff --git a/src/lang/tw.rs b/src/lang/tw.rs index 6d9d7a6f2..f85bbc72d 100644 --- a/src/lang/tw.rs +++ b/src/lang/tw.rs @@ -615,5 +615,7 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("android_new_voice_call_tip", "收到新的語音通話請求。如果您接受,音訊將切換為語音通訊。"), ("texture_render_tip", "使用紋理渲染,讓圖片更加順暢。 如果您遭遇渲染問題,可嘗試關閉此選項。"), ("Use texture rendering", "使用紋理渲染"), + ("Floating window", ""), + ("floating_window_tip", ""), ].iter().cloned().collect(); } diff --git a/src/lang/ua.rs b/src/lang/ua.rs index 8a835f78c..3e564e108 100644 --- a/src/lang/ua.rs +++ b/src/lang/ua.rs @@ -615,5 +615,7 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("android_new_voice_call_tip", "Отримано новий запит на голосовий дзвінок. Якщо ви приймете його, аудіо перемкнеться на голосовий звʼязок."), ("texture_render_tip", "Використовувати візуалізацію текстур для покращення плавності зображень."), ("Use texture rendering", "Використовувати візуалізацію текстур"), + ("Floating window", ""), + ("floating_window_tip", ""), ].iter().cloned().collect(); } diff --git a/src/lang/vn.rs b/src/lang/vn.rs index 6cf389a3f..3e4b887f8 100644 --- a/src/lang/vn.rs +++ b/src/lang/vn.rs @@ -615,5 +615,7 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("android_new_voice_call_tip", ""), ("texture_render_tip", ""), ("Use texture rendering", ""), + ("Floating window", ""), + ("floating_window_tip", ""), ].iter().cloned().collect(); }