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 1 commit
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