You are on page 1of 76

willkommen

Introduction to the joyn Innovation Challenge Workshop


Graham Trickey, GSMA

joyn Innovation Challenge Workshop Agenda


Time Description 09:00-10:00 Registration and Networking Breakfast Introduction to the 10:00-10:15 joyn Innovation Challenge Workshop 10:15-10:45 joyn Innovation Accelerator Platform Getting started with RCS APIs Hello World example Available RCS APIs and ideas for their use Using the RCS APIs from Web Apps Example Apps and Deutsche Telekom status joyn Innovation Challenge Networking and light buffet lunch Speaker All Graham Trickey GSMA Brent Newsome, NewPace Jose Recio , Solaiemes

10:45-11:00

Steve Doyle GSMA


Natasha Rooney GSMA Marco Roeder Deutsche Telekom Bob Lovett GSMA All

11:00-11:30 11:30-11:45 11:45-12:00 12:00-13:00

Rich Communications
RCS: new cross-operator standardized communication services specification : customer-facing brand to identify and promote RCS services

IM text chat

File transfer share files

Initial Set of Services

one to one

one to many

Send and receive any type of file

Rich Call share the moment


LIVE LIVE

Capability Discovery

Sharing Picture / Video (from camera or gallery) during a call

See communications options of your peers

What is so special about


High implementation momentum

Natively integrated by OEMs in device UI communication flows Maximum attainable service penetration feature phones & smartphones including open market devices Automatic service discovery - customers discover new services in the right place, in the right context Dynamic capability discovery only relevant & available services offered Interworking across operators and device boundaries resulting from rigorous IOT and accreditation Just like voice and SMS operator delivered reliability, security, privacy and customer service

Its just there!

It just works!

Wide ecosystem support

Nine handset manufacturers have provided future commitment to RCS

At least 20 RCS compatible handset models from seven manufacturers are expected by early 2013 Downloadable clients available for Android and iOS GSMA selected WIT Software to supply a generic client

Create the platform for innovation

RCS is a starting point for innovation and evolution Expose RCS APIs and 3rd party web and app developers will
drive RCS innovation and adoption extend the reach of RCS services to new user segments create new monetisation opportunities and business models

RCS enabled multiplayer gaming Add video to customer care calls

Group collaboration

Add chat capabilities to apps without having to maintain a communication service back-end

joyn Innovation Accelerator Platform

joyn Innovation Accelerator Platform


Brent Newsome, NewPace

Mobile, Software and Rich Communication Solutions www.newpace.com

Fully hosted RCS-e service Operated by Newpace Pay as you grow Model No IMS or CAPEX required Continuous Software Updates Full RCS-e Application Server Deployed in Operators Network Purchased on a license basis With or without IMS
RCS developer platform Ideal for client and OMA API testing & integration Monthly subscription fee Accelerates interop testing

rcsConnect Key Features


RCS-e Mandated Features
Capabilities Discovery

Integration without IMS


P-CSCF Interface

Instant Messaging (1 to 1 Chat and Group Chat)


File & Image Transfer

Web APIs for Authentication & Provisioning


Charging Detail Records

Store & Forward Instant Messaging

Pre-Paid & PostPaid Billing Authorization


Customer Service & Reporting Interfaces

Video Sharing HTTP Configuration Server

Multi-Device Support

Robust OAM&P interfaces

RCS Network APIs

Fully Compatible with GSMA Accredited Clients

What About RCS Clients?


NewPace is not developing its own RCS clients/joyn App
We have an ecosystem of client partners for our customers including:

And others not yet publicly announced.

NewPace will work with any chosen client provider (OEM or downloadable) to ensure that our infrastructure is interoperable with their client at no cost to the operator. Partners cover the entire range of devices including Android, IOS, Symbian, Windows 7, web based clients, etc.

RCS Network API


Operators can offer web developers and application developers controlled access to the RCS infrastructure through REST APIs Extends the reach of RCS beyond simple messaging allowing for many new applications NewPace has partnered with Solaiemes to provide the RCS Network API functionality to mobile operators

www.newpace.com/rcs

joyn Innovation Accelerator Platform


Jose Recio, Solaiemes

Monetizing joyn with the API. Involving 3rd parties in the joyn business model
Jose Recio

Less Philosophical

Provide enterprise and public sector with mobile multimedia services that really help them with their daily chores Give operators weapons to find use cases where OTT can not reach (yet):

Based on phone numbers, existing agendas Universal: not linked to specific handset models, no app Ubiquitous: accessible from any screen ($$ even with no SIM card) Enterprise - Customer communication: enterprise happy to pay to get the problem solved Value added services: customers customed to pay (till 1 per SMS). Perhaps the trend for RCS-e: much more services but cheaper, addressing the long tail.

We provide the tools so operator can engage innovation out there without losing control

Our Vision: RCS-e as a Platform


RCS-e

= OTT chat clone? Only if kept caged and chained Telco added value: beyond person-to-person, exploring A2P & P2A Object communications OTT not doing that (yet)

Whats missing?
Open

enablers to innovation engine. APIs as tools so tinkerers can tinker.

Operators:

able to open developer accounts by the millions. start quickly, with no telco expertise required.

Developers:

Credit:: www.freedigitalphotos.net

Towards the Service Store

Service Store vs App Store

No fragmentation, totally portable across platforms


Telco playing leading role, articulating ecosystem & fair revenue sharing with developers

Device/OS manufactures leading role

Telco leading role

APIs: Putem on the UNI !!!

Reuse provisioning, policy, security, firewall, accounting, billing, rating, Totally independent from the core. No impact on redesigns, upgrades, changes of vendors. Naturally cloudy. Same platform serves different OpCos, even with mismatching service characteristics. Put the same trust in your developer as in other customers. Very easy to use: modelled from OTT APIs, no telco expertise needed. Could be deployed without lengthy carrier approval process. It works !!! www.rcse.tv

RCS-e/joyn UNI 3rd API Exposure


telco
Friendly Telco Border

FTB
RCS-e Solution Gateway

RCS-e Core

SIP
REST API MSRP

Rich messaging access to internet tools

IMS
Instant Messaging AS

RCS-e LiveServe

internet
CRM
3rd party services

RTP/ RTCP

SBC

IMS Core, RCS servers, RCS-e clients DO NOT need any modification

UNI

Ok, but what can be done with the joyn API?

API to create services. Example: airline customer care


Send a boarding pass to a customer by the airline (push)

Screen captures from Summit Tech client for this demo proof of concept

API to create services. Example: telco customer care

Screen captures from Summit Tech client for this demo proof of concept

http://www.youtube.com/watch?v=vn1hqFmN4Q4

API to create clients: Web Client for PC & Smartphone

http://www.youtube.com/watch?v=iNyh3KN57S8

API to create clients: Smart TV app client


TV smart APP joyn client

http://www.youtube.com/watch?v=hTevrcYeKh0

Thanks
Find more about us at

http://www.youtube.com /solaiemes

Developing for RCS


Steve Doyle, GSMA

RCS Development Overview


RESTful APIs JSON over HTTP Usable in


Client apps e.g. iOS, android Server apps e.g. Java Client/ server web apps e.g. PHP, Ruby, Python

No specific need for SDKs as standard language/ libraries commonly available

Available APIs

Register/ Unregister with RCS Core

Notification channels
Address book management

one2one Instant Messaging (IM)


File transfer Group chat User capabilities

RCS Gateway Architecture

Developer Portal

UNI

RCS Core
IMS SBC

Internet

Server Based Application Provider

Instant Messaging AS

RCS API Gateway


SIP MSRP

RTP/ RTCP

Resources

Developer

portal

https://rcs.oneapi-gw.gsma.com

Getting

started guide and other resources

https://rcs.oneapi-gw.gsma.com/resources

Android

sample app

https://github.com/s1doy/RCS-android-demo

Developer registration

Register developer account


Create partner Create project

Get application credentials Confirms API endpoints

Register mobile test accounts

Hello World from the command line

cURL can be used to invoke RCS APIs directly from the command line Combination of HTTP GET, POST, PUT, DELETE operations Demonstration

Register two test users into the RCS gateway Add an address book entry Subscribe both users for chat message notifications Send a message Receive notifications including the message contents

Register Users

Purpose : log the user in to the RCS core


Request (POST)
curl -d "" --basic --user "+15554000001:3Kvm4\"DD" "http://api.oneapigw.gsma.com/register/0.1/%2B15554000001/sessions"
curl -d "" --basic --user "+15554000002:3Kvm4\"DD" "http://api.oneapigw.gsma.com/register/0.1/%2B15554000002/sessions"

Response
HTTP status code 204 (No Content)

Add address book entry


Purpose : create an address book contact so that other RCS APIs can be used
Request (PUT)
curl -d "{\"contact\":{ \"contactId\":\"tel:+15554000002\"}}" -X PUT --basic --user "+15554000001:3Kvm4\"DD" "http://api.oneapigw.gsma.com/addressbook/0.1/%2B15554000001/contacts/tel%3A%2B15554000002 "

Response
HTTP status code 201 (Created)
{"contact": {"resourceURL":"http://api.oneapigw.gsma.com/addressbook/0.1/+15554000001/contacts/tel:+15554000002","contactI d":"tel:+15554000002"}}

RCS Notifications

Applications do not poll the RCS gateway for individual events these are provided through a combined notification channel Application polls notification channel - supports LongPolling

Immediate return if notifications are available Or block until notification available (approx 20 seconds)

Application subscribes to relevant notifications

Address book changes IM session invitations, messages, delivery reports etc. File Transfer Group chat invitations, messages

Create notification channel


Purpose : RCS gateway creates channel to receive notifications
Request (POST)
curl -d "{\"notificationChannel\":{\"channelType\":\"LongPolling\"}}" --basic --user "+15554000001:3Kvm4\"DD" http://api.oneapigw.gsma.com/notificationchannel/0.1/%2B15554000001/channels

Response
HTTP status code 201 (Created)
{"notificationChannel": {"channelType":"LongPolling","channelLifetime":0,"channelData":{"channelURL":"http://api.o neapi-gw.gsma.com/cometoma/rcsboxnotifieroma/NotificationsCometHandler?username=%2B15554000001","maxNotifications":4 0},"callbackURL":"http://api.oneapi-gw.gsma.com/cometoma/rcsboxnotifieroma/NotificationsCometHandler?username=%2B15554000001","resourceURL":"http ://api.oneapi-gw.gsma.com/notificationchannel/0.1/+15554000001/channels/35"}}

Subscribe to chat notifications


Purpose : RCS gateway creates subscription to use notifications channel for chat notifications
Request (POST)
curl -d "{\"chatNotificationSubscription\":{ \"callbackReference\":{\"notifyURL\":\"http://api.oneapigw.gsma.com/cometoma/rcsboxnotifieroma/NotificationsCometHandler?username=%2B15554000001\",\"callbackData\":\"+155540 00001\"}, \"duration\":900}}" --basic --user "+15554000001:3Kvm4\"DD" "http://api.oneapigw.gsma.com/chat/0.1/%2B15554000001/subscriptions"

Response
HTTP status code 200 (OK)
{"chatNotificationSubscription": {"resourceURL":"http://api.oneapigw.gsma.com/chat/0.1/+15554000001/subscriptions/+15554000001","duration":900,"callbackRefer ence": {"callbackData":"+15554000001","notificationFormat":"JSON","notifyURL":"http://api.oneapigw.gsma.com/cometoma/rcsboxnotifieroma/NotificationsCometHandler?username=%2B15554000001"}}}

Send chat message (adhoc)


Purpose : RCS gateway creates an adhoc session and sends a message to a contact
Request (POST)
curl -d "{\"chatMessage\":{\"text\":\"hello\",\"reportRequest\":\"Displayed\"}}" --basic --user "+15554000001:3Kvm4\"DD" "http://api.oneapigw.gsma.com/chat/0.1/%2B15554000001/oneToOne/tel%3A%2B15554000002/adhoc/mes sages"

Response
HTTP status code 201 (Created)
{"resourceReference": {"resourceURL":"http://api.oneapigw.gsma.com/chat/0.1/+15554000001/oneToOne/tel:+15554000002/adhoc/messages/1351 330731649--94557218/status"}}

Receive chat session invitation


Purpose : Application polls RCS gateway for notifications (recipient)
Request (POST)
curl -d "" "http://api.oneapi-gw.gsma.com/cometoma/rcsboxnotifieroma/NotificationsCometHandler?username=%2B15554000002"

Response
HTTP status code 201 (Created)
{"originatorAddress":"tel:+15554000001", "subject":"hello","callbackData":"+15554000002","link": [{"rel":"ParticipantSessionStatus","href": "http://api.oneapigw.gsma.com/chat/0.1/%2B15554000002/oneToOne/tel%3A%2B15554000001/adhoc/statu s"},{"rel":"ChatSessionInformation","href": "http://api.oneapigw.gsma.com/chat/0.1/%2B15554000002/oneToOne/tel%3A%2B15554000001/adhoc"}],"tP articipantName":"+15554000002","sessionId":"adhoc"}}]}

Accept chat session invitation

Purpose : Application tells RCS gateway the recipient accepts the chat session invite
Request (PUT)
curl -d "{\"participantSessionStatus\":{\"status\":\"Connected\"}}" --basic --user "+15554000002:3Kvm4\"DD" -X PUT "http://api.oneapigw.gsma.com/chat/0.1/%2B15554000002/oneToOne/tel%3A%2B1555400000 1/adhoc/status"

Response
HTTP status code 204 (No Content)

Receive chat message


Purpose : Application polls RCS gateway for notifications (recipient)
Request (POST)
curl -d "" "http://api.oneapi-gw.gsma.com/cometoma/rcsboxnotifieroma/NotificationsCometHandler?username=%2B15554000002"

Response
HTTP status code 201 (Created)
{"notificationList":[{"messageNotification": {"callbackData":"+15554000002","link": [{"rel":"MessageStatusReport","href":"http://api.oneapigw.gsma.com/chat/0.1/+15554000002/oneToOne/tel:+15554000001/adhoc/messages/1351 330731649--94557218/status"}],"dateTime":"2012-1027T09:38:51Z","chatMessage":{"text":"hello"},"sessionId":"adhoc","messageId":"135133073 1649--94557218","senderAddress":"tel:+15554000001"}}]}

RCS Android Sample App

Open

source android book

application
Address

Add, delete, update

Instant

messaging

Send, receive, delivery status, composing indicator

Register User (android)


Request (POST)
AsyncHttpClient client = new AsyncHttpClient(); AuthScope authscope=new AuthScope(ServiceURL.serverName, ServiceURL.serverPort, AuthScope.ANY_REALM); client.setBasicAuth(username, SplashActivity.appCredentialPassword, authscope); final String url=ServiceURL.registerURL(username); client.post(url, new RCSJsonHttpResponseHandler() { @Override public void onSuccess(String response, int responseCode) { if (responseCode==204) { } else if (responseCode==401) { } } });

Add Contact (android)


Request (PUT)
JSONObject contact=new JSONObject(); contact.put("contactId", contactUri); AsyncHttpClient client = new AsyncHttpClient(); AuthScope authscope=new AuthScope(ServiceURL.serverName, ServiceURL.serverPort, AuthScope.ANY_REALM); client.setBasicAuth(SplashActivity.userId, SplashActivity.appCredentialPassword, authscope);

String jsonData="{\"contact\":"+contact.toString()+"}; StringEntity requestData=new StringEntity(jsonData); client.put(_instance.getApplication().getApplicationContext(), addurl, requestData, "application/json", new RCSJsonHttpResponseHandler() { public void onSuccess(JSONObject response, int errorCode) { if (errorCode==201 || errorCode==200) { closeHandler.sendEmptyMessage(0); } else { Message msg=new Message(); msg.what=errorCode; errorHandler.sendMessage(msg); } } });

Send chat message (android)


Request (POST)
JSONObject chatMessageJSON=new JSONObject(); chatMessageJSON.put("reportRequest", "Sent"); chatMessageJSON.put("text", message); String jsonData="{\"chatMessage\":+chatMessageJSON.toString()+"}"; AsyncHttpClient client = new AsyncHttpClient(); AuthScope authscope=new AuthScope(ServiceURL.serverName, ServiceURL.serverPort, AuthScope.ANY_REALM); client.setBasicAuth(SplashActivity.userId, SplashActivity.appCredentialPassword, authscope); StringEntity requestData=new StringEntity(jsonData); client.post(_instance.getApplication().getApplicationContext(), url, requestData, "application/json", new RCSJsonHttpResponseHandler() { public void onSuccess(JSONObject response, int errorCode){ JSONObject resourceReference=Utils.getJSONObject(response, "resourceReference"); String resourceURL=Utils.getJSONStringElement(resourceReference, "resourceURL"); String messageId=Utils.getMessageIdFromResourceURL(resourceURL, destinationUri); if (errorCode==201) { ContactStateManager.setMessageIdForSentMessage(messageInternalId, messageId,resourceURL); ContactStateManager.updateStatusFor(messageId, ChatMessage.MESSAGE_STATUS_SENT); messageHandler.sendEmptyMessage(0); } } });

Create notification channel (android)


Request (POST)
final String url=ServiceURL.createNotificationChannelURL(userId); String jsonData="{\"notificationChannel\": { \"channelData\": { \"maxNotifications\": 100 }, \"applicationTag\": \"GSMA RCS Demo\", "\"channelLifetime\": 0, \"channelType\": \"LongPolling\"}}"; StringEntity requestData=new StringEntity(jsonData); client.post(_instance.getApplication().getApplicationContext(), url, requestData, "application/json", new RCSJsonHttpResponseHandler() { public void onSuccess(JSONObject response, int statusCode) { if (statusCode==201) { JSONObject notificationChannel= Utils.getJSONObject(response, "notificationChannel"); notificationChannelResourceURL= Utils.getJSONStringElement( notificationChannel, "resourceURL"); String callbackURL=Utils.getJSONStringElement(notificationChannel, "callbackURL"); subscribeToAddressBookNotifications(callbackURL); subscribeToSessionNotifications(callbackURL); subscribeToChatNotifications(callbackURL); } } });

Accepting a chat session invitation (android)


Request (PUT)
JSONObject chatSessionInvitationNotification=Utils.getJSONObject(notification, "chatSessionInvitationNotification"); JSONArray link=Utils.getJSONArray(chatSessionInvitationNotification, "link"); for (int li=0; li<link.length(); li++) { JSONObject litem=link.getJSONObject(li); String rel=Utils.getJSONStringElement(litem, "rel"); String href=Utils.getJSONStringElement(litem, "href"); if ("ParticipantSessionStatus".equals(rel) && href!=null) { AsyncHttpClient acceptClient = new AsyncHttpClient(); AuthScope authscope=new AuthScope(ServiceURL.serverName, ServiceURL.serverPort, AuthScope.ANY_REALM); acceptClient.setBasicAuth(SplashActivity.userId, SplashActivity.appCredentialPassword, authscope); StringEntity requestData = new StringEntity("{\"participantSessionStatus\":{\"status\":\"Connected\"}}"); acceptClient.put(_instance.getApplication().getApplicationContext(), href, requestData, "application/json", new RCSJsonHttpResponseHandler() { public void onSuccess(String response, int errorCode) { } public void onFailure(Throwable e, JSONObject response, int errorCode) { } });

}
}

Handling a received IM message (android)


Request (PUT)
JSONObject messageNotification=Utils.getJSONObject(notification, "messageNotification"); if (Utils.getJSONObject(messageNotification, "chatMessage")!=null) { JSONObject chatMessage=Utils.getJSONObject(messageNotification, "chatMessage"); String senderAddress=Utils.getJSONStringElement(messageNotification, "senderAddress"); String messageId=Utils.getJSONStringElement(messageNotification, "messageId"); String sessionId=Utils.getJSONStringElement(messageNotification, "sessionId"); String messageText=Utils.getJSONStringElement(chatMessage, "text"); String dateTime=Utils.getJSONStringElement(messageNotification, "dateTime");

ChatMessage received=new ChatMessage(); received.setMessageText(messageText); received.setMessageDirection(ChatMessage.MESSAGE_RECEIVED); received.setMessageTime(Utils.convertTransferDateToDisplayString(dateTime)); received.setStatus(ChatMessage. MESSAGE_STATUS_RECEIVED); }

Help!
JoynIC_Developer_Support@gsm.org

RCS Web Client


Natasha Rooney, GSMA

What & Why


Why? Desktop connection to RCS clients running on mobile devices Can work with other web techologies Show how easy it really is! What? Web Application Create a web client using the RCS Solution Gateway OMA APIs HTML5

HTML / CSS / JavaScript

jQuery Ajax calls no page refresh.

Tackling Access Control

Ajax calls to another domain can trigger:

XMLHttpRequest cannot load X. Origin is not allowed by AccessControl-Allow-Origin.


Urgh. Can happen with any set of APIs To combat, we're running a local PHP proxy Added benefit: handle some logic server side using the PHP, less pressure on the JavaScript

Architecture flow simple API query


HTML
Click send HTML button
<input type="submit" value="Send/>

JavaScript
Grabs data, sends ajax query
jQuery.ajax(params);

PHP

Get variables using $POST


$contactID = $_POST['contactID'];

Query REST API

var allContacts = returnedValues;

$request = new RestRequest(params);

<div>Text here</div>

Store data in variable to process and print to screen

Echos returned data


echo $request->getResponseBody();

View data

Quick note on Polling

APIs will give you a comet URL to poll

But Cant handle polling in same way as native client


So POST request with empty data field to comet URL Inside JavaScript setInterval() function Every 3 seconds

jQuery Ajax Call


http://api.jquery.com/jQuery.ajax/ var queryresult = jQuery.ajax({ url: theurl, //your php url data: dataforajax, //data array type: 'post', success: function(output) { console.log(Success); } }).responseText;;

return queryresult;

After creating basic functionality

Create a rich experience using other web technologies, e.g. Other APIs RSS Frameworks and Libraries In our app: Simple weather API using /weather shortcode

RCS APIs & Web Technologies Richer experience for user Easy to get started - simple HTML5 code with PHP backend Link with any user using apps based on RCS OMA APIs over any device

Demo
Demo Github repo: https://github.com/nrooney/rcs_oma

Natasha Rooney @thisNatasha nrooney@gsm.org

Example Apps @ Deutsche Telekom Status


Marco Rder, Deutsche Telekom

Relevance of joyn Network API


APIs

are an essential part of the joyn

idea
Make

joyn better through external innovation usage

More Build

a service ecosystem for a great user experience

Goal of joyn API Project @ Deutsche Telekom


API

usage as simple as possible business models

Compelling Fully

based on OMA standard

Cross-Operator Launch

close to the start of the actual service

Example Use Cases


CRM Sharing White-Label Chat

Your app

Your app
powered by

joyn Customer

joyn Customer

Send your customers messages, files see their issue via video

Communicate from within your app - e.g. share pictures

Build your own chat community*

* targeted feature

Deutsche Telekom Roadmap


Network API Development* Live System Integration Closed group of developers

Fully open

Pilot Launch H1/2013

Full Launch H2/2013

While we are working please use the Innovation Accelerator!


* powered by Solaiemes technology

Demo Services
Currently
Stocks

four demo services implemented for internal usage:


Wikipedia
Google

Maps Weather
Implemented

within days

Where can I get this? Developer Garden

Developer Garden is DTs API portal and component market place If you want to be informed about Joyn API news @ Deutsche Telekom, please register at www.developergarden.com

Contact
Further Questions?

Marco Rder

Project Lead joyn APIs


Deutsche Telekom AG

marco.roeder@telekom.de

joyn Innovation Challenge


Bob Lovett, GSMA

joyn Innovation Challenge


An initiative by the GSMA to encourage innovation based on joyn Designed to stimulate mobile and web app developers and technology innovators to

build on the core capabilities of joyn explore ideas for new and attractive services

Developers use the joyn Innovation Accelerator to develop and test their ideas on a live network A developer competition the joyn Innovation Challenge competition will offer a showcase for your innovations

joyn Innovation Challenge Award for the winning idea Best innovations demonstrated at the largest mobile event in the world the Mobile World Congress 2013, in Barcelona Entry to the competition is free A shop window to the worlds mobile operators

Want to win the award? Enter the competition


Developers encouraged to enter their innovations into the competition Easy and free to enter

Register on the joyn Innovation Challenge website Describe your idea Use the Innovation Accelerator and get developing Shortlisted entries invited to a live judging event in London, January 2013 Winning idea and best of the rest eligible for showcasing on the GSMAs Pavilion at MWC 2013, February 2013

Why enter?
Visibility, status and possible monetisation opportunities Your opportunity to expose your ideas to the worlds leading operators and telecommunication equipment vendors Prize award ceremony at MWC 2013

Check out the details on the website


http://www.gsma.com/rcs/joyninnovationchallenge

All the competition info in one place


Entry and registration Eligibility information Judging process

Access the Innovation Accelerator portal Develop ideas Key dates if you want to enter the competition:

Entries close Dec 12th Judging info by Jan 7th 2013

www.gsma.com/rcs/joyninnovationchallenge

Networking and Light Buffet Lunch

You might also like