diff --git a/skins/base/views/molecules/voip/MCallAnswerTile.js b/skins/base/views/molecules/voip/MCallAnswerTile.js
new file mode 100644
index 00000000..2d0032ca
--- /dev/null
+++ b/skins/base/views/molecules/voip/MCallAnswerTile.js
@@ -0,0 +1,50 @@
+/*
+Copyright 2015 OpenMarket Ltd
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+
+'use strict';
+
+var React = require('react');
+var MatrixClientPeg = require("../../../../../src/MatrixClientPeg");
+var ComponentBroker = require('../../../../../src/ComponentBroker');
+var MCallAnswerTileController = require("../../../../../src/controllers/molecules/voip/MCallAnswerTile");
+var MessageTimestamp = ComponentBroker.get('atoms/MessageTimestamp');
+
+module.exports = React.createClass({
+ displayName: 'MCallAnswerTile',
+ mixins: [MCallAnswerTileController],
+
+ getAnswerText: function(event) {
+ var senderName = event.sender ? event.sender.name : "Someone";
+ return senderName + " answered the call.";
+ },
+
+ render: function() {
+ // XXX: for now, just cheekily borrow the css from message tile...
+ return (
+
+
+
+
+
+
+
+ {this.getAnswerText(this.props.mxEvent)}
+
+
+ );
+ },
+});
+
diff --git a/skins/base/views/molecules/voip/MCallHangupTile.js b/skins/base/views/molecules/voip/MCallHangupTile.js
new file mode 100644
index 00000000..8f249dfd
--- /dev/null
+++ b/skins/base/views/molecules/voip/MCallHangupTile.js
@@ -0,0 +1,50 @@
+/*
+Copyright 2015 OpenMarket Ltd
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+
+'use strict';
+
+var React = require('react');
+var MatrixClientPeg = require("../../../../../src/MatrixClientPeg");
+var ComponentBroker = require('../../../../../src/ComponentBroker');
+var MCallHangupTileController = require("../../../../../src/controllers/molecules/voip/MCallHangupTile");
+var MessageTimestamp = ComponentBroker.get('atoms/MessageTimestamp');
+
+module.exports = React.createClass({
+ displayName: 'MCallHangupTile',
+ mixins: [MCallHangupTileController],
+
+ getHangupText: function(event) {
+ var senderName = event.sender ? event.sender.name : "Someone";
+ return senderName + " hungup.";
+ },
+
+ render: function() {
+ // XXX: for now, just cheekily borrow the css from message tile...
+ return (
+
+
+
+
+
+
+
+ {this.getHangupText(this.props.mxEvent)}
+
+
+ );
+ },
+});
+
diff --git a/skins/base/views/molecules/voip/MCallInviteTile.js b/skins/base/views/molecules/voip/MCallInviteTile.js
new file mode 100644
index 00000000..b952a204
--- /dev/null
+++ b/skins/base/views/molecules/voip/MCallInviteTile.js
@@ -0,0 +1,56 @@
+/*
+Copyright 2015 OpenMarket Ltd
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+
+'use strict';
+
+var React = require('react');
+var MatrixClientPeg = require("../../../../../src/MatrixClientPeg");
+var ComponentBroker = require('../../../../../src/ComponentBroker');
+var MCallInviteTileController = require("../../../../../src/controllers/molecules/voip/MCallInviteTile");
+var MessageTimestamp = ComponentBroker.get('atoms/MessageTimestamp');
+
+module.exports = React.createClass({
+ displayName: 'MCallInviteTile',
+ mixins: [MCallInviteTileController],
+
+ getInviteText: function(event) {
+ var senderName = event.sender ? event.sender.name : "Someone";
+ // FIXME: Find a better way to determine this from the event?
+ var type = "voice";
+ if (event.getContent().offer &&
+ event.getContent().offer.sdp.indexOf('m=video') !== -1) {
+ type = "video";
+ }
+ return senderName + " placed a " + type + " call.";
+ },
+
+ render: function() {
+ // XXX: for now, just cheekily borrow the css from message tile...
+ return (
+
+
+
+
+
+
+
+ {this.getInviteText(this.props.mxEvent)}
+
+
+ );
+ },
+});
+
diff --git a/src/ComponentBroker.js b/src/ComponentBroker.js
index 80506ea5..59f88046 100644
--- a/src/ComponentBroker.js
+++ b/src/ComponentBroker.js
@@ -101,6 +101,9 @@ require('../skins/base/views/molecules/DirectoryMenu');
require('../skins/base/views/atoms/voip/VideoFeed');
require('../skins/base/views/molecules/voip/VideoView');
require('../skins/base/views/molecules/voip/CallView');
+require('../skins/base/views/molecules/voip/MCallInviteTile');
+require('../skins/base/views/molecules/voip/MCallAnswerTile');
+require('../skins/base/views/molecules/voip/MCallHangupTile');
}
diff --git a/src/controllers/molecules/voip/MCallAnswerTile.js b/src/controllers/molecules/voip/MCallAnswerTile.js
new file mode 100644
index 00000000..d0977e00
--- /dev/null
+++ b/src/controllers/molecules/voip/MCallAnswerTile.js
@@ -0,0 +1,20 @@
+/*
+Copyright 2015 OpenMarket Ltd
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+
+'use strict';
+
+module.exports = {
+};
diff --git a/src/controllers/molecules/voip/MCallHangupTile.js b/src/controllers/molecules/voip/MCallHangupTile.js
new file mode 100644
index 00000000..d0977e00
--- /dev/null
+++ b/src/controllers/molecules/voip/MCallHangupTile.js
@@ -0,0 +1,20 @@
+/*
+Copyright 2015 OpenMarket Ltd
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+
+'use strict';
+
+module.exports = {
+};
diff --git a/src/controllers/molecules/voip/MCallInviteTile.js b/src/controllers/molecules/voip/MCallInviteTile.js
new file mode 100644
index 00000000..d0977e00
--- /dev/null
+++ b/src/controllers/molecules/voip/MCallInviteTile.js
@@ -0,0 +1,20 @@
+/*
+Copyright 2015 OpenMarket Ltd
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+
+'use strict';
+
+module.exports = {
+};
diff --git a/src/controllers/organisms/RoomView.js b/src/controllers/organisms/RoomView.js
index cef2c3ac..9078d558 100644
--- a/src/controllers/organisms/RoomView.js
+++ b/src/controllers/organisms/RoomView.js
@@ -30,7 +30,10 @@ var ComponentBroker = require('../../ComponentBroker');
var tileTypes = {
'm.room.message': ComponentBroker.get('molecules/MessageTile'),
- 'm.room.member': ComponentBroker.get('molecules/MRoomMemberTile')
+ 'm.room.member': ComponentBroker.get('molecules/MRoomMemberTile'),
+ 'm.call.invite': ComponentBroker.get('molecules/voip/MCallInviteTile'),
+ 'm.call.answer': ComponentBroker.get('molecules/voip/MCallAnswerTile'),
+ 'm.call.hangup': ComponentBroker.get('molecules/voip/MCallHangupTile')
};
module.exports = {