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.Drawable
import android.os.Build
import android.os.Handler
import android.os.IBinder
import android.os.Looper
import android.util.Log
import android.view.Gravity
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_NOT_FOCUSABLE
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.PopupMenu
import com.caverock.androidsvg.SVG
@ -39,6 +42,7 @@ class FloatingWindowService : Service(), View.OnTouchListener {
private var lastDownX = 0f
private var lastDownY = 0f
private var viewCreated = false;
private var keepScreenOn = KeepScreenOn.DURING_CONTROLLED
companion object {
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")
createView(windowManager)
handler.postDelayed(runnable, 1000)
Log.d(logTag, "onCreate success")
} catch (e: Exception) {
Log.d(logTag, "onCreate failed: $e")
}
}
override fun onDestroy() {
super.onDestroy()
if (viewCreated) {
windowManager.removeView(floatingView)
}
handler.removeCallbacks(runnable)
}
@SuppressLint("ClickableViewAccessibility")
private fun createView(windowManager: WindowManager) {
floatingView = ImageView(this)
@ -151,6 +164,15 @@ class FloatingWindowService : Service(), View.OnTouchListener {
layoutParams.x = lastLayoutX
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)
moveToScreenSide()
}
@ -200,12 +222,7 @@ class FloatingWindowService : Service(), View.OnTouchListener {
lastOrientation = resources.configuration.orientation
}
override fun onDestroy() {
super.onDestroy()
if (viewCreated) {
windowManager.removeView(floatingView)
}
}
private fun performClick() {
showPopupMenu()
@ -326,5 +343,36 @@ class FloatingWindowService : Service(), View.OnTouchListener {
private fun stopMainService() {
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 kOptionKeepScreenOn = "keep-screen-on";
const String kUrlActionClose = "close";
const String kTabLabelHomePage = "Home";

View File

@ -35,12 +35,41 @@ class SettingsPage extends StatefulWidget implements PageShape {
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 {
final _hasIgnoreBattery =
false; //androidVersion >= 26; // remove because not work on every device
var _ignoreBatteryOpt = false;
var _enableStartOnBoot = false;
var _floatingWindowDisabled = false;
var _keepScreenOn = KeepScreenOn.duringControlled; // relay on floating window
var _enableAbr = false;
var _denyLANDiscovery = false;
var _onlyWhiteList = false;
@ -96,6 +125,15 @@ class _SettingsState extends State<SettingsPage> with WidgetsBindingObserver {
_floatingWindowDisabled = floatingWindowDisabled;
}
final keepScreenOn = _floatingWindowDisabled
? KeepScreenOn.never
: optionToKeepScreenOn(
bind.mainGetLocalOption(key: kOptionKeepScreenOn));
if (keepScreenOn != _keepScreenOn) {
update = true;
_keepScreenOn = keepScreenOn;
}
final enableAbrRes = option2bool(
kOptionEnableAbr, await bind.mainGetOption(key: kOptionEnableAbr));
if (enableAbrRes != _enableAbr) {
@ -524,6 +562,29 @@ class _SettingsState extends State<SettingsPage> with WidgetsBindingObserver {
? null
: 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 settings = SettingsList(
sections: [
@ -947,7 +1008,7 @@ class _RadioEntry {
typedef _RadioEntryGetter = String Function();
typedef _RadioEntrySetter = Future<void> Function(String);
_getPopupDialogRadioEntry({
SettingsTile _getPopupDialogRadioEntry({
required String title,
required List<_RadioEntry> list,
required _RadioEntryGetter getter,
@ -1001,7 +1062,7 @@ _getPopupDialogRadioEntry({
return SettingsTile(
title: Text(translate(title)),
onPressed: (context) => showDialog(),
onPressed: asyncSetter == null ? null : (context) => showDialog(),
value: Padding(
padding: EdgeInsets.symmetric(vertical: 8),
child: Obx(() => Text(translate(valueText.value))),

View File

@ -4,6 +4,7 @@ import 'dart:convert';
import 'package:flutter/material.dart';
import 'package:flutter_hbb/consts.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/platform_model.dart';
import 'package:get/get.dart';
@ -421,7 +422,7 @@ class ServerModel with ChangeNotifier {
await bind.mainStartService();
updateClientState();
if (isAndroid) {
WakelockPlus.enable();
androidUpdatekeepScreenOn();
}
}
@ -514,6 +515,7 @@ class ServerModel with ChangeNotifier {
}
if (_clients.length != oldClientLenght) {
notifyListeners();
if (isAndroid) androidUpdatekeepScreenOn();
}
}
@ -548,6 +550,7 @@ class ServerModel with ChangeNotifier {
scrollToBottom();
notifyListeners();
if (isAndroid && !client.authorized) showLoginDialog(client);
if (isAndroid) androidUpdatekeepScreenOn();
} catch (e) {
debugPrint("Failed to call loginRequest,error:$e");
}
@ -668,6 +671,7 @@ class ServerModel with ChangeNotifier {
final index = _clients.indexOf(client);
tabController.remove(index);
_clients.remove(client);
if (isAndroid) androidUpdatekeepScreenOn();
}
}
@ -691,6 +695,7 @@ class ServerModel with ChangeNotifier {
if (desktopType == DesktopType.cm && _clients.isEmpty) {
hideCmWindow();
}
if (isAndroid) androidUpdatekeepScreenOn();
notifyListeners();
} catch (e) {
debugPrint("onClientRemove failed,error:$e");
@ -702,6 +707,7 @@ class ServerModel with ChangeNotifier {
_clients.map((client) => bind.cmCloseConnection(connId: client.id)));
_clients.clear();
tabController.state.value.tabs.clear();
if (isAndroid) androidUpdatekeepScreenOn();
}
void jumpTo(int id) {
@ -739,6 +745,27 @@ class ServerModel with ChangeNotifier {
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 {

View File

@ -2100,6 +2100,9 @@ pub mod keys {
pub const OPTION_FLOATING_WINDOW_TRANSPARENCY: &str = "floating-window-transparency";
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_PRE_ELEVATE_SERVICE: &str = "pre-elevate-service";
@ -2163,6 +2166,7 @@ pub mod keys {
OPTION_FLOATING_WINDOW_UNTOUCHABLE,
OPTION_FLOATING_WINDOW_TRANSPARENCY,
OPTION_FLOATING_WINDOW_SVG,
OPTION_KEEP_SCREEN_ON,
OPTION_DISABLE_GROUP_PANEL,
OPTION_PRE_ELEVATE_SERVICE,
];

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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