/* * RAD IRC Client: an IRC client for Android * Copyright (C) 2012 Reddit Android Developers and contributors * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * This program 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 General Public License for more details. * You should have received a copy of the GNU General Public License * along with this program. If not, see <http://www.gnu.org/licenses/>. */ package com.redditandroiddevelopers.ircclient; import java.io.IOException; import java.text.SimpleDateFormat; import java.util.Calendar; import org.jibble.pircbot.IrcException; import org.jibble.pircbot.NickAlreadyInUseException; import com.redditandroiddevelopers.ircclient.messages.*; import android.os.Bundle; import android.os.Handler; import android.os.Message; import android.support.v4.app.Fragment; import android.text.Html; import android.view.KeyEvent; import android.view.LayoutInflater; import android.view.View; import android.view.View.OnKeyListener; import android.view.ViewGroup; import android.widget.EditText; import android.widget.ScrollView; import android.widget.TextView; public class ChannelFragment extends Fragment { private TextView mChatContents; private EditText mChatInput; private IRCClient ircClient; private ScrollView scroller; private String channel; private String nick; private Handler handler; private String serverStr; private Thread thread; private String userName; private String userPass; public ChannelFragment(IRCClient ircClient, String serverStr, String userNick, String userName, String userPass, String channel) { this.ircClient = ircClient; this.serverStr = serverStr; this.nick = userNick; this.channel = channel; this.userName = userName; this.userPass = userPass; } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View base = inflater.inflate(R.layout.chat_fragment, container, false); mChatContents = (TextView) base.findViewById(R.id.chat); mChatInput = (EditText) base.findViewById(R.id.edit); scroller = (ScrollView) base.findViewById(R.id.scroller); configureMessageHandler(); if(ircClient==null) { ircClient = new IRCClient(nick,handler); } if(!ircClient.isConnected()) { ircClient.setLoginPublic(userName); connect(); ircClient.identify(userPass); } mChatInput.setOnKeyListener(new OnKeyListener() { @Override public boolean onKey(View v, int keyCode, KeyEvent event) { if ((event.getAction() == KeyEvent.ACTION_DOWN) && (keyCode == KeyEvent.KEYCODE_ENTER)) { String inputText = mChatInput.getText().toString(); if (inputText.equals("/disconnect") || inputText == "/disconnect") { ircClient.quitServer("I work when i want. You're not the boss of me."); } else if (inputText.matches("^/nick .*")) { nick=ircClient.getNick(); String [] args = inputText.split(" "); String newNick = args[1]; ircClient.changeNick(newNick); boolean changeNickSuccessful = !(nick.equals(newNick)); // TODO: Not functioning properly if (!changeNickSuccessful) { showError(newNick +" already in use."); } nick=ircClient.getNick(); } else if (inputText.matches("^/join .*")) { String[] args = inputText.split(" "); String newChannel = args[1]; ircClient.joinChannel(newChannel); channel = newChannel; } else { if (inputText == "" || (inputText.equals("")) || inputText == null) { showError("Invalid input"); } else { sendMessage(inputText); } } mChatInput.setText(""); return true; } return false; }}); return base; } private void connect() { showNotification("Connecting to server...", "connect"); if(thread == null) { thread = new Thread(new Runnable() { @Override public void run() { try { connect(serverStr); } catch (NickAlreadyInUseException e) { showError("Nick is already in use"); } catch (IOException e) { showError("Unknown IOException"); } catch (IrcException e) { showError("IRC Exception"); } catch (Exception e) { showError(e.toString()); } ircClient.joinChannel(channel); } }); thread.start(); } scrollToBottom(); } private void configureMessageHandler() { handler = new Handler() { public void handleMessage(Message msg) { if (msg.obj instanceof ChatMessage) { ChatMessage chatMessage = (ChatMessage)msg.obj; getNewMessage(chatMessage.channel,chatMessage.sender,chatMessage.login,chatMessage.hostname,chatMessage.message); } else if (msg.obj instanceof NotificationMessage) { NotificationMessage notificationMessage = (NotificationMessage)msg.obj; showNotification(notificationMessage.notificationMsg, notificationMessage.type); } } }; } private void connect(String server) throws NickAlreadyInUseException, IOException, IrcException { ircClient.setVerbose(true); ircClient.connect(server); } private void scrollToBottom() { scroller.smoothScrollTo(0, mChatContents.getBottom()); } private void sendMessage(CharSequence msg) { Calendar currentDate = Calendar.getInstance(); SimpleDateFormat formatter = new SimpleDateFormat("hh:mm:ss"); ircClient.sendMessage(channel, msg.toString()); mChatContents.append(Html.fromHtml("<br>("+ formatter.format(currentDate.getTime()) +") <font color=red><b>"+ircClient.getNick()+"</b></font>: " + msg)); scrollToBottom(); } private void getNewMessage(String channel, String sender, String login, String hostname, String message) { Calendar currentDate = Calendar.getInstance(); SimpleDateFormat formatter = new SimpleDateFormat("hh:mm:ss"); mChatContents.append(Html.fromHtml("<br>(" + formatter.format(currentDate.getTime()) + ") <font color=red>" + sender + "</font>: " + message)); scrollToBottom(); } private void showError(String errorMsg) { mChatContents.append(Html.fromHtml("<br><i><font color=red>ERROR: " + errorMsg +"</font></i>")); scrollToBottom(); } private void showNotification(String notificationMsg, String type) { if(type.equalsIgnoreCase("join")) mChatContents.append(Html.fromHtml("<br><i><font color=green>* " + notificationMsg +"</font></i>")); else if(type.equalsIgnoreCase("connect")) mChatContents.append(Html.fromHtml("<br><i><font color=green>* " + notificationMsg +"</font></i>")); else if(type.equalsIgnoreCase("topic")) mChatContents.append(Html.fromHtml("<br><i><font color=green>* " + notificationMsg +"</font></i>")); else if(type.equalsIgnoreCase("disconnect")) mChatContents.append(Html.fromHtml("<br><i><font color=red>* " + notificationMsg +"</font></i>")); else if(type.equalsIgnoreCase("quit")) mChatContents.append(Html.fromHtml("<br><i><font color=#700000>* " + notificationMsg +"</font></i>")); else if(type.equalsIgnoreCase("parted")) mChatContents.append(Html.fromHtml("<br><i><font color=#700000>* " + notificationMsg +"</font></i>")); else if(type.equalsIgnoreCase("nickchange")) mChatContents.append(Html.fromHtml("<br><i><font color=#0066CC>* " + notificationMsg +"</font></i>")); else mChatContents.append(Html.fromHtml("<br><i><font color=green>* " + notificationMsg +"</font></i>")); scrollToBottom(); } }