android keep screen on option (#8344)

* android keep screen on option

Keep screen on option relays on floating window.

Three options: Never, During controlled(default), During service is on

Signed-off-by: 21pages <sunboeasy@gmail.com>

* When rustdesk is in forground, be consistent with the settings

Signed-off-by: 21pages <sunboeasy@gmail.com>

---------

Signed-off-by: 21pages <sunboeasy@gmail.com>
This commit is contained in:
21pages 2024-06-13 18:30:29 +08:00 committed by GitHub
parent bc875a35b0
commit ab451b9056
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
46 changed files with 315 additions and 9 deletions

View File

@ -11,7 +11,9 @@ import android.graphics.PixelFormat
import android.graphics.drawable.BitmapDrawable import android.graphics.drawable.BitmapDrawable
import android.graphics.drawable.Drawable import android.graphics.drawable.Drawable
import android.os.Build import android.os.Build
import android.os.Handler
import android.os.IBinder import android.os.IBinder
import android.os.Looper
import android.util.Log import android.util.Log
import android.view.Gravity import android.view.Gravity
import android.view.MotionEvent import android.view.MotionEvent
@ -20,6 +22,7 @@ import android.view.WindowManager
import android.view.WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN import android.view.WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN
import android.view.WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE import android.view.WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE
import android.view.WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL import android.view.WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL
import android.view.WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON
import android.widget.ImageView import android.widget.ImageView
import android.widget.PopupMenu import android.widget.PopupMenu
import com.caverock.androidsvg.SVG import com.caverock.androidsvg.SVG
@ -39,6 +42,7 @@ class FloatingWindowService : Service(), View.OnTouchListener {
private var lastDownX = 0f private var lastDownX = 0f
private var lastDownY = 0f private var lastDownY = 0f
private var viewCreated = false; private var viewCreated = false;
private var keepScreenOn = KeepScreenOn.DURING_CONTROLLED
companion object { companion object {
private val logTag = "floatingService" private val logTag = "floatingService"
@ -69,12 +73,21 @@ class FloatingWindowService : Service(), View.OnTouchListener {
} }
Log.d(logTag, "floating window size: $viewWidth x $viewHeight, transparency: $viewTransparency, lastLayoutX: $lastLayoutX, lastLayoutY: $lastLayoutY, customSvg: $customSvg") Log.d(logTag, "floating window size: $viewWidth x $viewHeight, transparency: $viewTransparency, lastLayoutX: $lastLayoutX, lastLayoutY: $lastLayoutY, customSvg: $customSvg")
createView(windowManager) createView(windowManager)
handler.postDelayed(runnable, 1000)
Log.d(logTag, "onCreate success") Log.d(logTag, "onCreate success")
} catch (e: Exception) { } catch (e: Exception) {
Log.d(logTag, "onCreate failed: $e") Log.d(logTag, "onCreate failed: $e")
} }
} }
override fun onDestroy() {
super.onDestroy()
if (viewCreated) {
windowManager.removeView(floatingView)
}
handler.removeCallbacks(runnable)
}
@SuppressLint("ClickableViewAccessibility") @SuppressLint("ClickableViewAccessibility")
private fun createView(windowManager: WindowManager) { private fun createView(windowManager: WindowManager) {
floatingView = ImageView(this) floatingView = ImageView(this)
@ -151,6 +164,15 @@ class FloatingWindowService : Service(), View.OnTouchListener {
layoutParams.x = lastLayoutX layoutParams.x = lastLayoutX
layoutParams.y = lastLayoutY layoutParams.y = lastLayoutY
val keepScreenOnOption = FFI.getLocalOption("keep-screen-on").lowercase()
keepScreenOn = when (keepScreenOnOption) {
"never" -> KeepScreenOn.NEVER
"service-on" -> KeepScreenOn.SERVICE_ON
else -> KeepScreenOn.DURING_CONTROLLED
}
Log.d(logTag, "keepScreenOn option: $keepScreenOnOption, value: $keepScreenOn")
updateKeepScreenOnLayoutParams()
windowManager.addView(floatingView, layoutParams) windowManager.addView(floatingView, layoutParams)
moveToScreenSide() moveToScreenSide()
} }
@ -200,12 +222,7 @@ class FloatingWindowService : Service(), View.OnTouchListener {
lastOrientation = resources.configuration.orientation lastOrientation = resources.configuration.orientation
} }
override fun onDestroy() {
super.onDestroy()
if (viewCreated) {
windowManager.removeView(floatingView)
}
}
private fun performClick() { private fun performClick() {
showPopupMenu() showPopupMenu()
@ -326,5 +343,36 @@ class FloatingWindowService : Service(), View.OnTouchListener {
private fun stopMainService() { private fun stopMainService() {
MainActivity.flutterMethodChannel?.invokeMethod("stop_service", null) MainActivity.flutterMethodChannel?.invokeMethod("stop_service", null)
} }
enum class KeepScreenOn {
NEVER,
DURING_CONTROLLED,
SERVICE_ON,
}
private val handler = Handler(Looper.getMainLooper())
private val runnable = object : Runnable {
override fun run() {
if (updateKeepScreenOnLayoutParams()) {
windowManager.updateViewLayout(floatingView, layoutParams)
}
handler.postDelayed(this, 1000) // 1000 milliseconds = 1 second
}
}
private fun updateKeepScreenOnLayoutParams(): Boolean {
val oldOn = layoutParams.flags and FLAG_KEEP_SCREEN_ON != 0
val newOn = keepScreenOn == KeepScreenOn.SERVICE_ON || (keepScreenOn == KeepScreenOn.DURING_CONTROLLED && MainService.isStart)
if (oldOn != newOn) {
Log.d(logTag, "change keep screen on to $newOn")
if (newOn) {
layoutParams.flags = layoutParams.flags or FLAG_KEEP_SCREEN_ON
} else {
layoutParams.flags = layoutParams.flags and FLAG_KEEP_SCREEN_ON.inv()
}
return true
}
return false
}
} }

View File

@ -139,6 +139,8 @@ const String kOptionToggleViewOnly = "view-only";
const String kOptionDisableFloatingWindow = "disable-floating-window"; const String kOptionDisableFloatingWindow = "disable-floating-window";
const String kOptionKeepScreenOn = "keep-screen-on";
const String kUrlActionClose = "close"; const String kUrlActionClose = "close";
const String kTabLabelHomePage = "Home"; const String kTabLabelHomePage = "Home";

View File

@ -35,12 +35,41 @@ class SettingsPage extends StatefulWidget implements PageShape {
const url = 'https://rustdesk.com/'; const url = 'https://rustdesk.com/';
enum KeepScreenOn {
never,
duringControlled,
serviceOn,
}
String _keepScreenOnToOption(KeepScreenOn value) {
switch (value) {
case KeepScreenOn.never:
return 'never';
case KeepScreenOn.duringControlled:
return 'during-controlled';
case KeepScreenOn.serviceOn:
return 'service-on';
}
}
KeepScreenOn optionToKeepScreenOn(String value) {
switch (value) {
case 'never':
return KeepScreenOn.never;
case 'service-on':
return KeepScreenOn.serviceOn;
default:
return KeepScreenOn.duringControlled;
}
}
class _SettingsState extends State<SettingsPage> with WidgetsBindingObserver { class _SettingsState extends State<SettingsPage> with WidgetsBindingObserver {
final _hasIgnoreBattery = final _hasIgnoreBattery =
false; //androidVersion >= 26; // remove because not work on every device false; //androidVersion >= 26; // remove because not work on every device
var _ignoreBatteryOpt = false; var _ignoreBatteryOpt = false;
var _enableStartOnBoot = false; var _enableStartOnBoot = false;
var _floatingWindowDisabled = false; var _floatingWindowDisabled = false;
var _keepScreenOn = KeepScreenOn.duringControlled; // relay on floating window
var _enableAbr = false; var _enableAbr = false;
var _denyLANDiscovery = false; var _denyLANDiscovery = false;
var _onlyWhiteList = false; var _onlyWhiteList = false;
@ -96,6 +125,15 @@ class _SettingsState extends State<SettingsPage> with WidgetsBindingObserver {
_floatingWindowDisabled = floatingWindowDisabled; _floatingWindowDisabled = floatingWindowDisabled;
} }
final keepScreenOn = _floatingWindowDisabled
? KeepScreenOn.never
: optionToKeepScreenOn(
bind.mainGetLocalOption(key: kOptionKeepScreenOn));
if (keepScreenOn != _keepScreenOn) {
update = true;
_keepScreenOn = keepScreenOn;
}
final enableAbrRes = option2bool( final enableAbrRes = option2bool(
kOptionEnableAbr, await bind.mainGetOption(key: kOptionEnableAbr)); kOptionEnableAbr, await bind.mainGetOption(key: kOptionEnableAbr));
if (enableAbrRes != _enableAbr) { if (enableAbrRes != _enableAbr) {
@ -524,6 +562,29 @@ class _SettingsState extends State<SettingsPage> with WidgetsBindingObserver {
? null ? null
: onFloatingWindowChanged)); : onFloatingWindowChanged));
enhancementsTiles.add(_getPopupDialogRadioEntry(
title: 'Keep screen on',
list: [
_RadioEntry('Never', _keepScreenOnToOption(KeepScreenOn.never)),
_RadioEntry('During controlled',
_keepScreenOnToOption(KeepScreenOn.duringControlled)),
_RadioEntry('During service is on',
_keepScreenOnToOption(KeepScreenOn.serviceOn)),
],
getter: () => _keepScreenOnToOption(_floatingWindowDisabled
? KeepScreenOn.never
: optionToKeepScreenOn(
bind.mainGetLocalOption(key: kOptionKeepScreenOn))),
asyncSetter: isOptionFixed(kOptionKeepScreenOn) || _floatingWindowDisabled
? null
: (value) async {
await bind.mainSetLocalOption(
key: kOptionKeepScreenOn, value: value);
setState(() => _keepScreenOn = optionToKeepScreenOn(value));
gFFI.serverModel.androidUpdatekeepScreenOn();
},
));
final disabledSettings = bind.isDisableSettings(); final disabledSettings = bind.isDisableSettings();
final settings = SettingsList( final settings = SettingsList(
sections: [ sections: [
@ -947,7 +1008,7 @@ class _RadioEntry {
typedef _RadioEntryGetter = String Function(); typedef _RadioEntryGetter = String Function();
typedef _RadioEntrySetter = Future<void> Function(String); typedef _RadioEntrySetter = Future<void> Function(String);
_getPopupDialogRadioEntry({ SettingsTile _getPopupDialogRadioEntry({
required String title, required String title,
required List<_RadioEntry> list, required List<_RadioEntry> list,
required _RadioEntryGetter getter, required _RadioEntryGetter getter,
@ -1001,7 +1062,7 @@ _getPopupDialogRadioEntry({
return SettingsTile( return SettingsTile(
title: Text(translate(title)), title: Text(translate(title)),
onPressed: (context) => showDialog(), onPressed: asyncSetter == null ? null : (context) => showDialog(),
value: Padding( value: Padding(
padding: EdgeInsets.symmetric(vertical: 8), padding: EdgeInsets.symmetric(vertical: 8),
child: Obx(() => Text(translate(valueText.value))), child: Obx(() => Text(translate(valueText.value))),

View File

@ -4,6 +4,7 @@ import 'dart:convert';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter_hbb/consts.dart'; import 'package:flutter_hbb/consts.dart';
import 'package:flutter_hbb/main.dart'; import 'package:flutter_hbb/main.dart';
import 'package:flutter_hbb/mobile/pages/settings_page.dart';
import 'package:flutter_hbb/models/chat_model.dart'; import 'package:flutter_hbb/models/chat_model.dart';
import 'package:flutter_hbb/models/platform_model.dart'; import 'package:flutter_hbb/models/platform_model.dart';
import 'package:get/get.dart'; import 'package:get/get.dart';
@ -421,7 +422,7 @@ class ServerModel with ChangeNotifier {
await bind.mainStartService(); await bind.mainStartService();
updateClientState(); updateClientState();
if (isAndroid) { if (isAndroid) {
WakelockPlus.enable(); androidUpdatekeepScreenOn();
} }
} }
@ -514,6 +515,7 @@ class ServerModel with ChangeNotifier {
} }
if (_clients.length != oldClientLenght) { if (_clients.length != oldClientLenght) {
notifyListeners(); notifyListeners();
if (isAndroid) androidUpdatekeepScreenOn();
} }
} }
@ -548,6 +550,7 @@ class ServerModel with ChangeNotifier {
scrollToBottom(); scrollToBottom();
notifyListeners(); notifyListeners();
if (isAndroid && !client.authorized) showLoginDialog(client); if (isAndroid && !client.authorized) showLoginDialog(client);
if (isAndroid) androidUpdatekeepScreenOn();
} catch (e) { } catch (e) {
debugPrint("Failed to call loginRequest,error:$e"); debugPrint("Failed to call loginRequest,error:$e");
} }
@ -668,6 +671,7 @@ class ServerModel with ChangeNotifier {
final index = _clients.indexOf(client); final index = _clients.indexOf(client);
tabController.remove(index); tabController.remove(index);
_clients.remove(client); _clients.remove(client);
if (isAndroid) androidUpdatekeepScreenOn();
} }
} }
@ -691,6 +695,7 @@ class ServerModel with ChangeNotifier {
if (desktopType == DesktopType.cm && _clients.isEmpty) { if (desktopType == DesktopType.cm && _clients.isEmpty) {
hideCmWindow(); hideCmWindow();
} }
if (isAndroid) androidUpdatekeepScreenOn();
notifyListeners(); notifyListeners();
} catch (e) { } catch (e) {
debugPrint("onClientRemove failed,error:$e"); debugPrint("onClientRemove failed,error:$e");
@ -702,6 +707,7 @@ class ServerModel with ChangeNotifier {
_clients.map((client) => bind.cmCloseConnection(connId: client.id))); _clients.map((client) => bind.cmCloseConnection(connId: client.id)));
_clients.clear(); _clients.clear();
tabController.state.value.tabs.clear(); tabController.state.value.tabs.clear();
if (isAndroid) androidUpdatekeepScreenOn();
} }
void jumpTo(int id) { void jumpTo(int id) {
@ -739,6 +745,27 @@ class ServerModel with ChangeNotifier {
debugPrint("updateVoiceCallState failed: $e"); debugPrint("updateVoiceCallState failed: $e");
} }
} }
void androidUpdatekeepScreenOn() async {
if (!isAndroid) return;
var floatingWindowDisabled =
bind.mainGetLocalOption(key: kOptionDisableFloatingWindow) == "Y" ||
!await AndroidPermissionManager.check(kSystemAlertWindow);
final keepScreenOn = floatingWindowDisabled
? KeepScreenOn.never
: optionToKeepScreenOn(
bind.mainGetLocalOption(key: kOptionKeepScreenOn));
final on = ((keepScreenOn == KeepScreenOn.serviceOn) && _isStart) ||
(keepScreenOn == KeepScreenOn.duringControlled &&
_clients.map((e) => !e.disconnected).isNotEmpty);
if (on != await WakelockPlus.enabled) {
if (on) {
WakelockPlus.enable();
} else {
WakelockPlus.disable();
}
}
}
} }
enum ClientType { enum ClientType {

View File

@ -2100,6 +2100,9 @@ pub mod keys {
pub const OPTION_FLOATING_WINDOW_TRANSPARENCY: &str = "floating-window-transparency"; pub const OPTION_FLOATING_WINDOW_TRANSPARENCY: &str = "floating-window-transparency";
pub const OPTION_FLOATING_WINDOW_SVG: &str = "floating-window-svg"; pub const OPTION_FLOATING_WINDOW_SVG: &str = "floating-window-svg";
// android keep screen on
pub const OPTION_KEEP_SCREEN_ON: &str = "keep-screen-on";
pub const OPTION_DISABLE_GROUP_PANEL: &str = "disable-group-panel"; pub const OPTION_DISABLE_GROUP_PANEL: &str = "disable-group-panel";
pub const OPTION_PRE_ELEVATE_SERVICE: &str = "pre-elevate-service"; pub const OPTION_PRE_ELEVATE_SERVICE: &str = "pre-elevate-service";
@ -2163,6 +2166,7 @@ pub mod keys {
OPTION_FLOATING_WINDOW_UNTOUCHABLE, OPTION_FLOATING_WINDOW_UNTOUCHABLE,
OPTION_FLOATING_WINDOW_TRANSPARENCY, OPTION_FLOATING_WINDOW_TRANSPARENCY,
OPTION_FLOATING_WINDOW_SVG, OPTION_FLOATING_WINDOW_SVG,
OPTION_KEEP_SCREEN_ON,
OPTION_DISABLE_GROUP_PANEL, OPTION_DISABLE_GROUP_PANEL,
OPTION_PRE_ELEVATE_SERVICE, OPTION_PRE_ELEVATE_SERVICE,
]; ];

View File

@ -617,5 +617,9 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
("Use texture rendering", ""), ("Use texture rendering", ""),
("Floating window", ""), ("Floating window", ""),
("floating_window_tip", ""), ("floating_window_tip", ""),
("Keep screen on", ""),
("Never", ""),
("During controlled", ""),
("During service is on", ""),
].iter().cloned().collect(); ].iter().cloned().collect();
} }

View File

@ -617,5 +617,9 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
("Use texture rendering", ""), ("Use texture rendering", ""),
("Floating window", ""), ("Floating window", ""),
("floating_window_tip", ""), ("floating_window_tip", ""),
("Keep screen on", ""),
("Never", ""),
("During controlled", ""),
("During service is on", ""),
].iter().cloned().collect(); ].iter().cloned().collect();
} }

View File

@ -617,5 +617,9 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
("Use texture rendering", ""), ("Use texture rendering", ""),
("Floating window", ""), ("Floating window", ""),
("floating_window_tip", ""), ("floating_window_tip", ""),
("Keep screen on", ""),
("Never", ""),
("During controlled", ""),
("During service is on", ""),
].iter().cloned().collect(); ].iter().cloned().collect();
} }

View File

@ -617,5 +617,9 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
("Use texture rendering", "使用纹理渲染"), ("Use texture rendering", "使用纹理渲染"),
("Floating window", "悬浮窗"), ("Floating window", "悬浮窗"),
("floating_window_tip", "有助于保持RustDesk后台服务"), ("floating_window_tip", "有助于保持RustDesk后台服务"),
("Keep screen on", "保持屏幕开启"),
("Never", "从不"),
("During controlled", "被控期间"),
("During service is on", "服务开启期间"),
].iter().cloned().collect(); ].iter().cloned().collect();
} }

View File

@ -617,5 +617,9 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
("Use texture rendering", "Použít vykreslování textur"), ("Use texture rendering", "Použít vykreslování textur"),
("Floating window", "Plovoucí okno"), ("Floating window", "Plovoucí okno"),
("floating_window_tip", "Pomáhá udržovat službu RustDesk na pozadí"), ("floating_window_tip", "Pomáhá udržovat službu RustDesk na pozadí"),
("Keep screen on", ""),
("Never", ""),
("During controlled", ""),
("During service is on", ""),
].iter().cloned().collect(); ].iter().cloned().collect();
} }

View File

@ -617,5 +617,9 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
("Use texture rendering", ""), ("Use texture rendering", ""),
("Floating window", ""), ("Floating window", ""),
("floating_window_tip", ""), ("floating_window_tip", ""),
("Keep screen on", ""),
("Never", ""),
("During controlled", ""),
("During service is on", ""),
].iter().cloned().collect(); ].iter().cloned().collect();
} }

View File

@ -617,5 +617,9 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
("Use texture rendering", "Textur-Rendering verwenden"), ("Use texture rendering", "Textur-Rendering verwenden"),
("Floating window", "Schwebendes Fenster"), ("Floating window", "Schwebendes Fenster"),
("floating_window_tip", "Es hilft dabei, RustDesk im Hintergrund auszuführen."), ("floating_window_tip", "Es hilft dabei, RustDesk im Hintergrund auszuführen."),
("Keep screen on", ""),
("Never", ""),
("During controlled", ""),
("During service is on", ""),
].iter().cloned().collect(); ].iter().cloned().collect();
} }

View File

@ -617,5 +617,9 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
("Use texture rendering", ""), ("Use texture rendering", ""),
("Floating window", ""), ("Floating window", ""),
("floating_window_tip", ""), ("floating_window_tip", ""),
("Keep screen on", ""),
("Never", ""),
("During controlled", ""),
("During service is on", ""),
].iter().cloned().collect(); ].iter().cloned().collect();
} }

View File

@ -617,5 +617,9 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
("Use texture rendering", ""), ("Use texture rendering", ""),
("Floating window", ""), ("Floating window", ""),
("floating_window_tip", ""), ("floating_window_tip", ""),
("Keep screen on", ""),
("Never", ""),
("During controlled", ""),
("During service is on", ""),
].iter().cloned().collect(); ].iter().cloned().collect();
} }

View File

@ -617,5 +617,9 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
("Use texture rendering", "Usar renderizado de texturas"), ("Use texture rendering", "Usar renderizado de texturas"),
("Floating window", ""), ("Floating window", ""),
("floating_window_tip", ""), ("floating_window_tip", ""),
("Keep screen on", ""),
("Never", ""),
("During controlled", ""),
("During service is on", ""),
].iter().cloned().collect(); ].iter().cloned().collect();
} }

View File

@ -617,5 +617,9 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
("Use texture rendering", ""), ("Use texture rendering", ""),
("Floating window", ""), ("Floating window", ""),
("floating_window_tip", ""), ("floating_window_tip", ""),
("Keep screen on", ""),
("Never", ""),
("During controlled", ""),
("During service is on", ""),
].iter().cloned().collect(); ].iter().cloned().collect();
} }

View File

@ -617,5 +617,9 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
("Use texture rendering", ""), ("Use texture rendering", ""),
("Floating window", ""), ("Floating window", ""),
("floating_window_tip", ""), ("floating_window_tip", ""),
("Keep screen on", ""),
("Never", ""),
("During controlled", ""),
("During service is on", ""),
].iter().cloned().collect(); ].iter().cloned().collect();
} }

View File

@ -617,5 +617,9 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
("Use texture rendering", "Utiliser le rendu de texture"), ("Use texture rendering", "Utiliser le rendu de texture"),
("Floating window", ""), ("Floating window", ""),
("floating_window_tip", ""), ("floating_window_tip", ""),
("Keep screen on", ""),
("Never", ""),
("During controlled", ""),
("During service is on", ""),
].iter().cloned().collect(); ].iter().cloned().collect();
} }

View File

@ -617,5 +617,9 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
("Use texture rendering", ""), ("Use texture rendering", ""),
("Floating window", ""), ("Floating window", ""),
("floating_window_tip", ""), ("floating_window_tip", ""),
("Keep screen on", ""),
("Never", ""),
("During controlled", ""),
("During service is on", ""),
].iter().cloned().collect(); ].iter().cloned().collect();
} }

View File

@ -617,5 +617,9 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
("Use texture rendering", ""), ("Use texture rendering", ""),
("Floating window", ""), ("Floating window", ""),
("floating_window_tip", ""), ("floating_window_tip", ""),
("Keep screen on", ""),
("Never", ""),
("During controlled", ""),
("During service is on", ""),
].iter().cloned().collect(); ].iter().cloned().collect();
} }

View File

@ -617,5 +617,9 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
("Use texture rendering", ""), ("Use texture rendering", ""),
("Floating window", ""), ("Floating window", ""),
("floating_window_tip", ""), ("floating_window_tip", ""),
("Keep screen on", ""),
("Never", ""),
("During controlled", ""),
("During service is on", ""),
].iter().cloned().collect(); ].iter().cloned().collect();
} }

View File

@ -617,5 +617,9 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
("Use texture rendering", ""), ("Use texture rendering", ""),
("Floating window", ""), ("Floating window", ""),
("floating_window_tip", ""), ("floating_window_tip", ""),
("Keep screen on", ""),
("Never", ""),
("During controlled", ""),
("During service is on", ""),
].iter().cloned().collect(); ].iter().cloned().collect();
} }

View File

@ -617,5 +617,9 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
("Use texture rendering", "Usa rendering texture"), ("Use texture rendering", "Usa rendering texture"),
("Floating window", "Finestra galleggiante"), ("Floating window", "Finestra galleggiante"),
("floating_window_tip", "Aiuta a mantenere il servizio di RustDesk in background"), ("floating_window_tip", "Aiuta a mantenere il servizio di RustDesk in background"),
("Keep screen on", ""),
("Never", ""),
("During controlled", ""),
("During service is on", ""),
].iter().cloned().collect(); ].iter().cloned().collect();
} }

View File

@ -617,5 +617,9 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
("Use texture rendering", ""), ("Use texture rendering", ""),
("Floating window", ""), ("Floating window", ""),
("floating_window_tip", ""), ("floating_window_tip", ""),
("Keep screen on", ""),
("Never", ""),
("During controlled", ""),
("During service is on", ""),
].iter().cloned().collect(); ].iter().cloned().collect();
} }

View File

@ -617,5 +617,9 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
("Use texture rendering", ""), ("Use texture rendering", ""),
("Floating window", ""), ("Floating window", ""),
("floating_window_tip", ""), ("floating_window_tip", ""),
("Keep screen on", ""),
("Never", ""),
("During controlled", ""),
("During service is on", ""),
].iter().cloned().collect(); ].iter().cloned().collect();
} }

View File

@ -617,5 +617,9 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
("Use texture rendering", ""), ("Use texture rendering", ""),
("Floating window", ""), ("Floating window", ""),
("floating_window_tip", ""), ("floating_window_tip", ""),
("Keep screen on", ""),
("Never", ""),
("During controlled", ""),
("During service is on", ""),
].iter().cloned().collect(); ].iter().cloned().collect();
} }

View File

@ -617,5 +617,9 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
("Use texture rendering", ""), ("Use texture rendering", ""),
("Floating window", ""), ("Floating window", ""),
("floating_window_tip", ""), ("floating_window_tip", ""),
("Keep screen on", ""),
("Never", ""),
("During controlled", ""),
("During service is on", ""),
].iter().cloned().collect(); ].iter().cloned().collect();
} }

View File

@ -617,5 +617,9 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
("Use texture rendering", "Izmantot tekstūras renderēšanu"), ("Use texture rendering", "Izmantot tekstūras renderēšanu"),
("Floating window", "Peldošs logs"), ("Floating window", "Peldošs logs"),
("floating_window_tip", "Tas palīdz uzturēt RustDesk fona servisu"), ("floating_window_tip", "Tas palīdz uzturēt RustDesk fona servisu"),
("Keep screen on", ""),
("Never", ""),
("During controlled", ""),
("During service is on", ""),
].iter().cloned().collect(); ].iter().cloned().collect();
} }

View File

@ -617,5 +617,9 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
("Use texture rendering", ""), ("Use texture rendering", ""),
("Floating window", ""), ("Floating window", ""),
("floating_window_tip", ""), ("floating_window_tip", ""),
("Keep screen on", ""),
("Never", ""),
("During controlled", ""),
("During service is on", ""),
].iter().cloned().collect(); ].iter().cloned().collect();
} }

View File

@ -617,5 +617,9 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
("Use texture rendering", "Textuurrendering gebruiken"), ("Use texture rendering", "Textuurrendering gebruiken"),
("Floating window", ""), ("Floating window", ""),
("floating_window_tip", ""), ("floating_window_tip", ""),
("Keep screen on", ""),
("Never", ""),
("During controlled", ""),
("During service is on", ""),
].iter().cloned().collect(); ].iter().cloned().collect();
} }

View File

@ -617,5 +617,9 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
("Use texture rendering", ""), ("Use texture rendering", ""),
("Floating window", ""), ("Floating window", ""),
("floating_window_tip", ""), ("floating_window_tip", ""),
("Keep screen on", ""),
("Never", ""),
("During controlled", ""),
("During service is on", ""),
].iter().cloned().collect(); ].iter().cloned().collect();
} }

View File

@ -617,5 +617,9 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
("Use texture rendering", ""), ("Use texture rendering", ""),
("Floating window", ""), ("Floating window", ""),
("floating_window_tip", ""), ("floating_window_tip", ""),
("Keep screen on", ""),
("Never", ""),
("During controlled", ""),
("During service is on", ""),
].iter().cloned().collect(); ].iter().cloned().collect();
} }

View File

@ -617,5 +617,9 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
("Use texture rendering", ""), ("Use texture rendering", ""),
("Floating window", ""), ("Floating window", ""),
("floating_window_tip", ""), ("floating_window_tip", ""),
("Keep screen on", ""),
("Never", ""),
("During controlled", ""),
("During service is on", ""),
].iter().cloned().collect(); ].iter().cloned().collect();
} }

View File

@ -617,5 +617,9 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
("Use texture rendering", ""), ("Use texture rendering", ""),
("Floating window", ""), ("Floating window", ""),
("floating_window_tip", ""), ("floating_window_tip", ""),
("Keep screen on", ""),
("Never", ""),
("During controlled", ""),
("During service is on", ""),
].iter().cloned().collect(); ].iter().cloned().collect();
} }

View File

@ -617,5 +617,9 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
("Use texture rendering", "Визуализация текстур"), ("Use texture rendering", "Визуализация текстур"),
("Floating window", "Плавающее окно"), ("Floating window", "Плавающее окно"),
("floating_window_tip", "Помогает поддерживать фоновую службу RustDesk"), ("floating_window_tip", "Помогает поддерживать фоновую службу RustDesk"),
("Keep screen on", ""),
("Never", ""),
("During controlled", ""),
("During service is on", ""),
].iter().cloned().collect(); ].iter().cloned().collect();
} }

View File

@ -617,5 +617,9 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
("Use texture rendering", "Použiť vykresľovanie textúr"), ("Use texture rendering", "Použiť vykresľovanie textúr"),
("Floating window", "Plávajúce okno"), ("Floating window", "Plávajúce okno"),
("floating_window_tip", "Pomáha udržiavať službu RustDesk na pozadí"), ("floating_window_tip", "Pomáha udržiavať službu RustDesk na pozadí"),
("Keep screen on", ""),
("Never", ""),
("During controlled", ""),
("During service is on", ""),
].iter().cloned().collect(); ].iter().cloned().collect();
} }

View File

@ -617,5 +617,9 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
("Use texture rendering", ""), ("Use texture rendering", ""),
("Floating window", ""), ("Floating window", ""),
("floating_window_tip", ""), ("floating_window_tip", ""),
("Keep screen on", ""),
("Never", ""),
("During controlled", ""),
("During service is on", ""),
].iter().cloned().collect(); ].iter().cloned().collect();
} }

View File

@ -617,5 +617,9 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
("Use texture rendering", ""), ("Use texture rendering", ""),
("Floating window", ""), ("Floating window", ""),
("floating_window_tip", ""), ("floating_window_tip", ""),
("Keep screen on", ""),
("Never", ""),
("During controlled", ""),
("During service is on", ""),
].iter().cloned().collect(); ].iter().cloned().collect();
} }

View File

@ -617,5 +617,9 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
("Use texture rendering", ""), ("Use texture rendering", ""),
("Floating window", ""), ("Floating window", ""),
("floating_window_tip", ""), ("floating_window_tip", ""),
("Keep screen on", ""),
("Never", ""),
("During controlled", ""),
("During service is on", ""),
].iter().cloned().collect(); ].iter().cloned().collect();
} }

View File

@ -617,5 +617,9 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
("Use texture rendering", ""), ("Use texture rendering", ""),
("Floating window", ""), ("Floating window", ""),
("floating_window_tip", ""), ("floating_window_tip", ""),
("Keep screen on", ""),
("Never", ""),
("During controlled", ""),
("During service is on", ""),
].iter().cloned().collect(); ].iter().cloned().collect();
} }

View File

@ -617,5 +617,9 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
("Use texture rendering", ""), ("Use texture rendering", ""),
("Floating window", ""), ("Floating window", ""),
("floating_window_tip", ""), ("floating_window_tip", ""),
("Keep screen on", ""),
("Never", ""),
("During controlled", ""),
("During service is on", ""),
].iter().cloned().collect(); ].iter().cloned().collect();
} }

View File

@ -617,5 +617,9 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
("Use texture rendering", ""), ("Use texture rendering", ""),
("Floating window", ""), ("Floating window", ""),
("floating_window_tip", ""), ("floating_window_tip", ""),
("Keep screen on", ""),
("Never", ""),
("During controlled", ""),
("During service is on", ""),
].iter().cloned().collect(); ].iter().cloned().collect();
} }

View File

@ -617,5 +617,9 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
("Use texture rendering", ""), ("Use texture rendering", ""),
("Floating window", ""), ("Floating window", ""),
("floating_window_tip", ""), ("floating_window_tip", ""),
("Keep screen on", ""),
("Never", ""),
("During controlled", ""),
("During service is on", ""),
].iter().cloned().collect(); ].iter().cloned().collect();
} }

View File

@ -617,5 +617,9 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
("Use texture rendering", "使用紋理渲染"), ("Use texture rendering", "使用紋理渲染"),
("Floating window", ""), ("Floating window", ""),
("floating_window_tip", ""), ("floating_window_tip", ""),
("Keep screen on", ""),
("Never", ""),
("During controlled", ""),
("During service is on", ""),
].iter().cloned().collect(); ].iter().cloned().collect();
} }

View File

@ -617,5 +617,9 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
("Use texture rendering", "Використовувати візуалізацію текстур"), ("Use texture rendering", "Використовувати візуалізацію текстур"),
("Floating window", "Рухоме вікно"), ("Floating window", "Рухоме вікно"),
("floating_window_tip", "Допомагає зберегти фонову службу Rustdesk"), ("floating_window_tip", "Допомагає зберегти фонову службу Rustdesk"),
("Keep screen on", ""),
("Never", ""),
("During controlled", ""),
("During service is on", ""),
].iter().cloned().collect(); ].iter().cloned().collect();
} }

View File

@ -617,5 +617,9 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
("Use texture rendering", ""), ("Use texture rendering", ""),
("Floating window", ""), ("Floating window", ""),
("floating_window_tip", ""), ("floating_window_tip", ""),
("Keep screen on", ""),
("Never", ""),
("During controlled", ""),
("During service is on", ""),
].iter().cloned().collect(); ].iter().cloned().collect();
} }