Record and display videos

Summary:
This diff adds one more section in the Support Screen V2. This section records and displays the emulator screen. Right now the videos are stored at the very same location where our currently recorded videos are stored. For displaying them on UI I have used `react-player` dependency.

For the upload bit:

I will see how the exisiting e2e tests upload videos and if we can use their approach. Or else we can just upload videos on everstore and export its handle as part of flipper trace. The last resort can be to base64 encode it along with the trace.

Reviewed By: mweststrate

Differential Revision: D18460779

fbshipit-source-id: 8ddd51f59e5237a1a80f05bf90dfc3bead651143
This commit is contained in:
Pritesh Nandgaonkar
2019-11-14 06:26:42 -08:00
committed by Facebook Github Bot
parent d2ab55a6f8
commit 8afc1b67f3
4 changed files with 112 additions and 1 deletions

View File

@@ -0,0 +1,90 @@
/**
* Copyright (c) Facebook, Inc. and its affiliates.
*
* This source code is licensed under the MIT license found in the
* LICENSE file in the root directory of this source tree.
*
* @format
*/
import React, {Component} from 'react';
import BaseDevice from '../devices/BaseDevice';
import {Button} from 'flipper';
import path from 'path';
import os from 'os';
type OwnProps = {
recordingFinished: (path: string | null) => void;
};
type StateFromProps = {
selectedDevice: BaseDevice | null | undefined;
};
type DispatchFromProps = {};
type State = {
recording: boolean;
recordingEnabled: boolean;
};
type Props = OwnProps & StateFromProps & DispatchFromProps;
export default class VideoRecordingButton extends Component<Props, State> {
state: State = {
recording: false,
recordingEnabled: true,
};
startRecording = async () => {
const {selectedDevice} = this.props;
if (!selectedDevice) {
return;
}
const flipperDirectory = path.join(os.homedir(), '.flipper');
const fileName = `screencap-${new Date()
.toISOString()
.replace(/:/g, '')}.mp4`;
const videoPath = path.join(flipperDirectory, fileName);
await selectedDevice.startScreenCapture(videoPath);
this.setState({
recording: true,
});
};
stopRecording = async () => {
const {selectedDevice} = this.props;
if (!selectedDevice) {
return;
}
const path = await selectedDevice.stopScreenCapture();
this.setState({
recording: false,
});
this.props.recordingFinished(path);
};
onRecordingClicked = () => {
if (this.state.recording) {
this.stopRecording();
} else {
this.startRecording();
}
};
render() {
const {recordingEnabled} = this.state;
const {selectedDevice} = this.props;
return (
<Button
compact={true}
onClick={this.onRecordingClicked}
pulse={this.state.recording}
selected={this.state.recording}
title="Make Screen Recording"
disabled={!selectedDevice || !recordingEnabled}
type="primary">
{this.state.recording ? 'Recording...' : 'Start Recording'}
</Button>
);
}
}