Merge pull request #1803 from Heap-Hop/master

feat: Android session record
This commit is contained in:
RustDesk
2022-10-25 11:00:08 +08:00
committed by GitHub
8 changed files with 105 additions and 12 deletions

View File

@@ -7,7 +7,7 @@ buildscript {
}
dependencies {
classpath 'com.android.tools.build:gradle:7.3.0'
classpath 'com.android.tools.build:gradle:7.0.0'
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
classpath 'com.google.gms:google-services:4.3.14'
}

View File

@@ -582,13 +582,35 @@ class _RemotePageState extends State<RemotePage> {
value: 'block-input'));
}
}
if (gFFI.ffiModel.permissions["restart"] != false &&
if (perms["restart"] != false &&
(pi.platform == "Linux" ||
pi.platform == "Windows" ||
pi.platform == "Mac OS")) {
more.add(PopupMenuItem<String>(
child: Text(translate('Restart Remote Device')), value: 'restart'));
}
// Currently only support VP9
if (gFFI.recordingModel.start ||
(perms["recording"] != false &&
gFFI.qualityMonitorModel.data.codecFormat == "VP9")) {
more.add(PopupMenuItem<String>(
child: Row(
children: [
Text(translate(gFFI.recordingModel.start
? 'Stop session recording'
: 'Start session recording')),
Padding(
padding: EdgeInsets.only(left: 12),
child: Icon(
gFFI.recordingModel.start
? Icons.pause_circle_filled
: Icons.videocam_outlined,
color: MyTheme.accent),
)
],
),
value: 'record'));
}
() async {
var value = await showMenu(
context: context,
@@ -630,6 +652,8 @@ class _RemotePageState extends State<RemotePage> {
gFFI.cursorModel.reset();
} else if (value == 'restart') {
showRestartRemoteDevice(pi, widget.id, gFFI.dialogManager);
} else if (value == 'record') {
gFFI.recordingModel.toggle();
}
}();
}

View File

@@ -36,6 +36,8 @@ var _enableAbr = false;
var _denyLANDiscovery = false;
var _onlyWhiteList = false;
var _enableDirectIPAccess = false;
var _enableRecordSession = false;
var _autoRecordIncomingSession = false;
var _localIP = "";
var _directAccessPort = "";
@@ -78,6 +80,21 @@ class _SettingsState extends State<SettingsPage> with WidgetsBindingObserver {
_enableDirectIPAccess = enableDirectIPAccess;
}
final enableRecordSession = option2bool('enable-record-session',
await bind.mainGetOption(key: 'enable-record-session'));
if (enableRecordSession != _enableRecordSession) {
update = true;
_enableRecordSession = enableRecordSession;
}
final autoRecordIncomingSession = option2bool(
'allow-auto-record-incoming',
await bind.mainGetOption(key: 'allow-auto-record-incoming'));
if (autoRecordIncomingSession != _autoRecordIncomingSession) {
update = true;
_autoRecordIncomingSession = autoRecordIncomingSession;
}
final localIP = await bind.mainGetOption(key: 'local-ip-addr');
if (localIP != _localIP) {
update = true;
@@ -178,6 +195,19 @@ class _SettingsState extends State<SettingsPage> with WidgetsBindingObserver {
});
},
),
SettingsTile.switchTile(
title: Text(translate('Enable Recording Session')),
initialValue: _enableRecordSession,
onToggle: (v) async {
await bind.mainSetOption(
key: "enable-record-session", value: v ? "" : "N");
final newValue =
await bind.mainGetOption(key: "enable-record-session") != "N";
setState(() {
_enableRecordSession = newValue;
});
},
),
SettingsTile.switchTile(
title: Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
@@ -299,6 +329,33 @@ class _SettingsState extends State<SettingsPage> with WidgetsBindingObserver {
},
)
]),
SettingsSection(
title: Text(translate("Recording")),
tiles: [
SettingsTile.switchTile(
title: Text(translate('Automatically record incoming sessions')),
leading: Icon(Icons.videocam),
description: FutureBuilder(
builder: (ctx, data) => Offstage(
offstage: !data.hasData,
child: Text("${translate("Directory")}: ${data.data}")),
future: bind.mainDefaultVideoSaveDirectory()),
initialValue: _autoRecordIncomingSession,
onToggle: (v) async {
await bind.mainSetOption(
key: "allow-auto-record-incoming",
value: bool2option("allow-auto-record-incoming", v));
final newValue = option2bool(
'allow-auto-record-incoming',
await bind.mainGetOption(
key: 'allow-auto-record-incoming'));
setState(() {
_autoRecordIncomingSession = newValue;
});
},
),
],
),
SettingsSection(
title: Text(translate("Share Screen")),
tiles: shareScreenTiles,

View File

@@ -515,7 +515,7 @@ class FileModel extends ChangeNotifier {
items.items.forEach((from) async {
_jobId++;
await bind.sessionSendFiles(
id: await bind.mainGetLastRemoteId(),
id: '${parent.target?.id}',
actId: _jobId,
path: from.path,
to: PathUtil.join(toPath, from.name, isWindows),

View File

@@ -231,7 +231,8 @@ class FfiModel with ChangeNotifier {
} else if (type == 'input-password') {
enterPasswordDialog(id, dialogManager);
} else if (type == 'restarting') {
showMsgBox(id, type, title, text, link, false, dialogManager, hasCancel: false);
showMsgBox(id, type, title, text, link, false, dialogManager,
hasCancel: false);
} else {
var hasRetry = evt['hasRetry'] == 'true';
showMsgBox(id, type, title, text, link, hasRetry, dialogManager);
@@ -1003,16 +1004,16 @@ class RecordingModel with ChangeNotifier {
get start => _start;
onSwitchDisplay() {
if (!isDesktop || !_start) return;
if (isIOS || !_start) return;
var id = parent.target?.id;
int? width = parent.target?.canvasModel.getDisplayWidth();
int? height = parent.target?.canvasModel.getDisplayWidth();
int? height = parent.target?.canvasModel.getDisplayHeight();
if (id == null || width == null || height == null) return;
bind.sessionRecordScreen(id: id, start: true, width: width, height: height);
}
toggle() {
if (!isDesktop) return;
if (isIOS) return;
var id = parent.target?.id;
if (id == null) return;
_start = !_start;
@@ -1025,7 +1026,7 @@ class RecordingModel with ChangeNotifier {
}
onClose() {
if (!isDesktop) return;
if (isIOS) return;
var id = parent.target?.id;
if (id == null) return;
_start = false;