Skip to content
This repository has been archived by the owner on Sep 11, 2024. It is now read-only.

Allow call and broadcast PiP at the same time #9829

Merged
merged 4 commits into from
Dec 28, 2022
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 5 additions & 1 deletion res/css/views/voip/_LegacyCallPreview.pcss
Original file line number Diff line number Diff line change
Expand Up @@ -15,8 +15,12 @@ limitations under the License.
*/

.mx_LegacyCallPreview {
position: fixed;
align-items: flex-end;
display: flex;
flex-direction: column;
gap: $spacing-16;
left: 0;
position: fixed;
top: 0;

pointer-events: initial; /* restore pointer events so the user can leave/interact */
Expand Down
14 changes: 9 additions & 5 deletions src/components/views/voip/PictureInPictureDragger.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -47,7 +47,7 @@ interface IChildrenOptions {

interface IProps {
className?: string;
children: CreatePipChildren;
children: Array<CreatePipChildren>;
draggable: boolean;
onDoubleClick?: () => void;
onMove?: () => void;
Expand Down Expand Up @@ -208,17 +208,21 @@ export default class PictureInPictureDragger extends React.Component<IProps> {
transform: `translateX(${this.translationX}px) translateY(${this.translationY}px)`,
};

const children = this.props.children.map((create: CreatePipChildren) => {
return create({
onStartMoving: this.onStartMoving,
onResize: this.onResize,
});
});

return (
<aside
className={this.props.className}
style={style}
ref={this.callViewWrapper}
onDoubleClick={this.props.onDoubleClick}
>
{this.props.children({
onStartMoving: this.onStartMoving,
onResize: this.onResize,
})}
{children}
</aside>
);
}
Expand Down
26 changes: 11 additions & 15 deletions src/components/views/voip/PipView.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -373,32 +373,28 @@ class PipView extends React.Component<IProps, IState> {

public render() {
const pipMode = true;
let pipContent: CreatePipChildren | null = null;

if (this.props.voiceBroadcastPlayback) {
pipContent = this.createVoiceBroadcastPlaybackPipContent(this.props.voiceBroadcastPlayback);
}

if (this.props.voiceBroadcastPreRecording) {
pipContent = this.createVoiceBroadcastPreRecordingPipContent(this.props.voiceBroadcastPreRecording);
}
let pipContent: Array<CreatePipChildren> = [];

if (this.props.voiceBroadcastRecording) {
pipContent = this.createVoiceBroadcastRecordingPipContent(this.props.voiceBroadcastRecording);
pipContent = [this.createVoiceBroadcastRecordingPipContent(this.props.voiceBroadcastRecording)];
} else if (this.props.voiceBroadcastPreRecording) {
pipContent = [this.createVoiceBroadcastPreRecordingPipContent(this.props.voiceBroadcastPreRecording)];
} else if (this.props.voiceBroadcastPlayback) {
pipContent = [this.createVoiceBroadcastPlaybackPipContent(this.props.voiceBroadcastPlayback)];
}

if (this.state.primaryCall) {
// get a ref to call inside the current scope
const call = this.state.primaryCall;
pipContent = ({ onStartMoving, onResize }) => (
pipContent.push(({ onStartMoving, onResize }) => (
<LegacyCallView
onMouseDownOnHeader={onStartMoving}
call={call}
secondaryCall={this.state.secondaryCall}
pipMode={pipMode}
onResize={onResize}
/>
);
));
}

if (this.state.showWidgetInPip) {
Expand All @@ -412,7 +408,7 @@ class PipView extends React.Component<IProps, IState> {
const viewingCallRoom = this.state.viewedRoomId === roomId;
const isCall = CallStore.instance.getActiveCall(roomId) !== null;

pipContent = ({ onStartMoving }) => (
pipContent.push(({ onStartMoving }) => (
<div className={pipViewClasses}>
<LegacyCallViewHeader
onPipMouseDown={(event) => {
Expand All @@ -432,10 +428,10 @@ class PipView extends React.Component<IProps, IState> {
movePersistedElement={this.movePersistedElement}
/>
</div>
);
));
}

if (!!pipContent) {
if (pipContent.length) {
return (
<PictureInPictureDragger
className="mx_LegacyCallPreview"
Expand Down
40 changes: 28 additions & 12 deletions test/components/views/voip/PictureInPictureDragger-test.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -24,18 +24,22 @@ import PictureInPictureDragger, {
describe("PictureInPictureDragger", () => {
let renderResult: RenderResult;

const mkContent1: CreatePipChildren = () => {
return <div>content 1</div>;
};

const mkContent2: CreatePipChildren = () => {
return (
<div>
content 2<br />
content 2.2
</div>
);
};
const mkContent1: Array<CreatePipChildren> = [
() => {
return <div>content 1</div>;
},
];

const mkContent2: Array<CreatePipChildren> = [
() => {
return (
<div>
content 2<br />
content 2.2
</div>
);
},
];

describe("when rendering the dragger with PiP content 1", () => {
beforeEach(() => {
Expand Down Expand Up @@ -66,4 +70,16 @@ describe("PictureInPictureDragger", () => {
});
});
});

describe("when rendering the dragger with PiP content 1 and 2", () => {
beforeEach(() => {
renderResult = render(
<PictureInPictureDragger draggable={true}>{[...mkContent1, ...mkContent2]}</PictureInPictureDragger>,
);
});

it("should render both contents", () => {
expect(renderResult.container).toMatchSnapshot();
});
});
});
11 changes: 10 additions & 1 deletion test/components/views/voip/PipView-test.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -279,9 +279,18 @@ describe("PipView", () => {
});

it("should render the voice broadcast recording PiP", () => {
// check for the „Live“ badge
// check for the „Live“ badge to be present
expect(screen.queryByText("Live")).toBeInTheDocument();
});

it("and a call it should show both, the call and the recording", async () => {
await withCall(async () => {
// Broadcast: Check for the „Live“ badge to be present
expect(screen.queryByText("Live")).toBeInTheDocument();
// Call: Check for the „Fill screen“ button to be present
expect(screen.queryByLabelText("Fill screen")).toBeInTheDocument();
});
});
});

describe("when there is a voice broadcast playback and pre-recording", () => {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,22 @@
// Jest Snapshot v1, https://goo.gl/fbAQLP

exports[`PictureInPictureDragger when rendering the dragger with PiP content 1 and 2 should render both contents 1`] = `
<div>
<aside
style="transform: translateX(680px) translateY(478px);"
>
<div>
content 1
</div>
<div>
content 2
<br />
content 2.2
</div>
</aside>
</div>
`;

exports[`PictureInPictureDragger when rendering the dragger with PiP content 1 and rendering PiP content 2 should update the PiP content 1`] = `
<div>
<aside
Expand Down