com.calclab.emite.example.pingpong.client.logic.PongInviteRoomPresenter.java Source code

Java tutorial

Introduction

Here is the source code for com.calclab.emite.example.pingpong.client.logic.PongInviteRoomPresenter.java

Source

/*
 * ((e)) emite: A pure Google Web Toolkit XMPP library
 * Copyright (c) 2008-2011 The Emite development team
 * 
 * This file is part of Emite.
 *
 * Emite is free software: you can redistribute it and/or modify
 * it under the terms of the GNU Lesser General Public License as
 * published by the Free Software Foundation, either version 3
 * of the License, or (at your option) any later version.
 *
 * Emite is distributed in the hope that it will be useful, but
 * WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU Lesser General Public License for more details.
 * 
 * You should have received a copy of the GNU Lesser General Public
 * License along with Emite.  If not, see <http://www.gnu.org/licenses/>.
 */

package com.calclab.emite.example.pingpong.client.logic;

import com.calclab.emite.core.client.events.StateChangedEvent;
import com.calclab.emite.core.client.events.StateChangedHandler;
import com.calclab.emite.core.client.xmpp.stanzas.Message;
import com.calclab.emite.im.client.chat.Chat;
import com.calclab.emite.im.client.chat.ChatStates;
import com.calclab.emite.im.client.chat.events.ChatChangedEvent;
import com.calclab.emite.im.client.chat.events.ChatChangedHandler;
import com.calclab.emite.xep.muc.client.Room;
import com.calclab.emite.xep.muc.client.RoomInvitation;
import com.calclab.emite.xep.muc.client.RoomManager;
import com.calclab.emite.xep.muc.client.events.RoomInvitationEvent;
import com.calclab.emite.xep.muc.client.events.RoomInvitationHandler;
import com.calclab.emite.xep.muc.client.subject.RoomSubject;
import com.calclab.emite.xep.muc.client.subject.RoomSubjectChangedEvent;
import com.calclab.emite.xep.muc.client.subject.RoomSubjectChangedHandler;
import com.calclab.emite.example.pingpong.client.PingPongDisplay;
import com.calclab.emite.example.pingpong.client.PingPongDisplay.Style;
import com.calclab.emite.example.pingpong.client.StartablePresenter;
import com.calclab.emite.example.pingpong.client.events.ChatManagerEventsSupervisor;
import com.calclab.emite.example.pingpong.client.events.RoomManagerEventsSupervisor;
import com.google.gwt.user.client.Timer;
import com.google.inject.Inject;

public class PongInviteRoomPresenter implements StartablePresenter {

    private final PingPongDisplay display;
    private int time;
    private int pongs;
    private final RoomManager roomManager;

    @Inject
    public PongInviteRoomPresenter(final RoomManager roomManager, final PingPongDisplay display) {
        this.roomManager = roomManager;
        this.display = display;
        time = 5000;
        pongs = 0;
    }

    @Override
    public void start() {
        display.printHeader("This is pong invite room example", Style.title);
        display.print("You need to open the ping invite room example page", Style.important);

        new ChatManagerEventsSupervisor(roomManager, display);
        new RoomManagerEventsSupervisor(roomManager, display);

        // Accept the room invitations we receive
        roomManager.addRoomInvitationReceivedHandler(new RoomInvitationHandler() {
            @Override
            public void onRoomInvitation(final RoomInvitationEvent event) {
                final RoomInvitation invitation = event.getRoomInvitation();
                display.print("Room invitation received: " + invitation.getReason() + " - "
                        + invitation.getInvitor() + " to " + invitation.getRoomURI(), Style.important);
                display.print("We accept the invitation", Style.important);
                roomManager.acceptRoomInvitation(invitation);
            }
        });

        // When a room is opened (by the acceptRoomInvitation method) we stay
        // for a while and then go out
        roomManager.addChatChangedHandler(new ChatChangedHandler() {
            @Override
            public void onChatChanged(final ChatChangedEvent event) {
                if (event.isCreated()) {
                    manageNewRoom(roomManager, (Room) event.getChat());
                }
            }
        });

    }

    private void closeRoom(final RoomManager manager, final Chat room) {
        new Timer() {
            @Override
            public void run() {
                display.print("We close the room: " + room.getURI(), Style.important);
                time += 2000;
                manager.close(room);
            }

        }.schedule(time);
    }

    private void manageNewRoom(final RoomManager manager, final Room room) {
        display.print("Room created: " + room.getURI(), Style.info);
        room.addChatStateChangedHandler(true, new StateChangedHandler() {
            @Override
            public void onStateChanged(final StateChangedEvent event) {
                if (event.is(ChatStates.ready)) {
                    display.print("We entered the room: " + room.getURI(), Style.info);
                    pongs++;
                    room.send(new Message("Pong " + pongs));
                    closeRoom(manager, room);
                }
            }
        });

        RoomSubject.addRoomSubjectChangedHandler(room, new RoomSubjectChangedHandler() {
            @Override
            public void onSubjectChanged(final RoomSubjectChangedEvent event) {
                display.print("Subject changed: " + event.getSubject() + "(" + event.getOccupantUri() + ")",
                        Style.important);
            }
        });

    }

}