Skip to content
This repository has been archived by the owner on Nov 19, 2023. It is now read-only.

Commit

Permalink
lightirc: From broadcasts to callbacks
Browse files Browse the repository at this point in the history
Switch from using the ugly broadcast/intent system to a much cleaner
callback system. Still not as pretty as I would like but deffo an
improvement.
  • Loading branch information
LalitMaganti committed Apr 2, 2013
1 parent 0c1633f commit aa488e2
Show file tree
Hide file tree
Showing 9 changed files with 289 additions and 183 deletions.
56 changes: 30 additions & 26 deletions src/com/fusionx/lightirc/activity/MainServerListActivity.java
Expand Up @@ -24,9 +24,9 @@
import com.fusionx.lightirc.R;
import com.fusionx.lightirc.activity.ServerSettingsActivity.BaseServerSettingFragment;
import com.fusionx.lightirc.adapters.LightPircBotXArrayAdapter;
import com.fusionx.lightirc.misc.IRCBinder;
import com.fusionx.lightirc.misc.LightPircBotX;
import com.fusionx.lightirc.services.IRCService;
import com.fusionx.lightirc.services.IRCService.IRCBinder;

import android.os.Bundle;
import android.os.IBinder;
Expand Down Expand Up @@ -56,41 +56,46 @@ protected void onCreate(final Bundle savedInstanceState) {

getListView().setLongClickable(true);
registerForContextMenu(getListView());

setListAdapter(new LightPircBotXArrayAdapter(this, getSetServerList()));
getSetServerList();
}

private LightPircBotX[] getSetServerList() {
private void getSetServerList() {
SharedPreferences settings = getSharedPreferences("main", 0);
boolean firstRun = settings.getBoolean("firstrun", true);
int noOfServers = settings.getInt("noOfServers", 0);
LightPircBotX[] values;
LightPircBotX[] values = null;
Editor e = settings.edit();

if (firstRun || noOfServers == 0) {
if (firstRun) {
LightPircBotX freenode = new LightPircBotX();
freenode.mURL = "irc.freenode.net";
freenode.mNick = "LightIRCUser";
freenode.setTitle("Freenode");
freenode.mAutoJoinChannels = new String[] { "#testingircandroid" };
values = new LightPircBotX[] { freenode };
noOfServers = 1;

for (String s : freenode.toHashMap().keySet()) {
e.putString("server_0_" + s, freenode.toHashMap().get(s));
}
e.putString("server_0_autoJoin_channel", "#testingircandroid");

e.putBoolean("firstrun", false);
e.putString("server_0_autoJoin_channel_0", "#testingircandroid");
e.putInt("server_0_autoJoin_no", 1);
} else {
e.putInt("noOfServers", 1);
e.commit();
} else if (noOfServers != 0) {
values = new LightPircBotX[noOfServers];
for (int i = 0; i < noOfServers; i++) {
values[i].mURL = settings.getString("server_" + i + "_url", "");
values[i].mUserName = settings.getString("server_" + i
LightPircBotX bot = new LightPircBotX();
bot.mURL = settings.getString("server_" + i + "_url", "");
bot.mUserName = settings.getString("server_" + i
+ "_userName", "");
values[i].mNick = settings.getString("server_" + i + "_nick",
bot.mNick = settings.getString("server_" + i + "_nick",
"");
values[i].mServerPassword = settings.getString("server_" + i
bot.mServerPassword = settings.getString("server_" + i
+ "_serverPassword", "");
values[i].setTitle(settings.getString(
bot.setTitle(settings.getString(
"server_" + i + "_title", ""));

String[] s = new String[settings.getInt("server_" + i
Expand All @@ -99,21 +104,20 @@ private LightPircBotX[] getSetServerList() {
s[j] = settings.getString("server_" + i
+ "_autoJoin_channel_" + j, "");
}
values[i].mAutoJoinChannels = s;
bot.mAutoJoinChannels = s;
values[i] = bot;
}
}

e.putBoolean("firstrun", true);
e.putInt("noOfServers", noOfServers);
e.commit();

serverList = values;

Intent service = new Intent(this, IRCService.class);
startService(service);
bindService(service, mConnection, 0);

return values;
if(values != null) {
serverList = values;

Intent service = new Intent(this, IRCService.class);
startService(service);
bindService(service, mConnection, 0);

setListAdapter(new LightPircBotXArrayAdapter(this, values));
}
}

private ServiceConnection mConnection = new ServiceConnection() {
Expand Down
Expand Up @@ -48,7 +48,7 @@ public View getView(int position, View convertView, ViewGroup parent) {

View rowView = inflater.inflate(R.layout.listlayout, parent, false);
TextView textView = (TextView) rowView.findViewById(R.id.text);
textView.setText(values[position].mURL);
textView.setText(values[position].getTitle());

return rowView;
}
Expand Down
5 changes: 5 additions & 0 deletions src/com/fusionx/lightirc/callbacks/ChannelCallbacks.java
@@ -0,0 +1,5 @@
package com.fusionx.lightirc.callbacks;

public interface ChannelCallbacks {
public void onChannelWriteNeeded(String message);
}
6 changes: 6 additions & 0 deletions src/com/fusionx/lightirc/callbacks/ServerCallbacks.java
@@ -0,0 +1,6 @@
package com.fusionx.lightirc.callbacks;

public interface ServerCallbacks {
public void onServerWriteNeeded(String message);
public void onNewChannelJoined(String channel, String nick, String buffer);
}
59 changes: 30 additions & 29 deletions src/com/fusionx/lightirc/fragments/ChannelFragment.java
Expand Up @@ -21,11 +21,11 @@

package com.fusionx.lightirc.fragments;

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.ComponentName;
import android.content.Intent;
import android.content.IntentFilter;
import android.content.ServiceConnection;
import android.os.Bundle;
import android.os.IBinder;
import android.view.KeyEvent;
import android.view.LayoutInflater;
import android.view.View;
Expand All @@ -35,8 +35,12 @@
import android.widget.TextView;

import com.fusionx.lightirc.R;
import com.fusionx.lightirc.callbacks.ChannelCallbacks;
import com.fusionx.lightirc.services.IRCService;
import com.fusionx.lightirc.services.IRCService.IRCBinder;

public class ChannelFragment extends IRCFragment implements OnKeyListener {
public class ChannelFragment extends IRCFragment implements OnKeyListener,
ChannelCallbacks {
String nick;
String serverName;

Expand All @@ -50,23 +54,31 @@ public View onCreateView(final LayoutInflater inflater,
nick = getArguments().getString("nick");
serverName = getArguments().getString("serverName");
String buffer = getArguments().getString("buffer");

if (buffer != null) {
writeRawToTextView(buffer, rootView);
} else {
writeToTextView(nick + " entered the room", rootView);
}

writeToTextView(buffer, rootView);

TextView textview = (TextView) rootView.findViewById(R.id.editText1);
textview.setOnKeyListener(this);

IntentFilter filter = new IntentFilter(
"com.fusionx.lightirc.MESSAGE_FROM_CHANNEL");
getActivity().registerReceiver(mChannelReciever, filter);
Intent service = new Intent(getActivity(), IRCService.class);
service.putExtra("channel", tabTitle);
getActivity().bindService(service, mConnection, 0);

return rootView;
}

private ServiceConnection mConnection = new ServiceConnection() {
@Override
public void onServiceConnected(ComponentName className, IBinder service) {
((IRCBinder) service).getService().setChannelCallbacks(
ChannelFragment.this, tabTitle);
}

@Override
public void onServiceDisconnected(ComponentName name) {
}
};

@Override
public boolean onKey(View v, int keyCode, KeyEvent event) {
EditText t = (EditText) v;
Expand All @@ -83,8 +95,6 @@ public boolean onKey(View v, int keyCode, KeyEvent event) {
intent.putExtra("message", t.getText().toString());
getActivity().sendBroadcast(intent);

writeToTextView(nick + ": " + t.getText().toString());

// Hacky way to clear but keep the focus on the EditText
t.getText().clear();
t.setSelection(0);
Expand All @@ -97,21 +107,12 @@ public boolean onKey(View v, int keyCode, KeyEvent event) {

@Override
public void onDestroy() {
getActivity().unregisterReceiver(mChannelReciever);
getActivity().unbindService(mConnection);
super.onDestroy();
}

BroadcastReceiver mChannelReciever = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
String channel = intent.getStringExtra("channel");
if (channel.equals(tabTitle)) {
if (intent.getAction().equals(
"com.fusionx.lightirc.MESSAGE_FROM_CHANNEL")) {
String message = intent.getStringExtra("message");
writeToTextView(message);
}
}
}
};
@Override
public void onChannelWriteNeeded(String message) {
writeToTextView(message);
}
}
14 changes: 3 additions & 11 deletions src/com/fusionx/lightirc/fragments/IRCFragment.java
Expand Up @@ -14,24 +14,16 @@ public String getTitle() {
return tabTitle;
}

protected void writeRawToTextView(String text) {
writeRawToTextView(text, getView());
protected void writeToTextView(String text) {
writeToTextView(text, getView());
}

protected void writeRawToTextView(String text, View rootView) {
protected void writeToTextView(String text, View rootView) {
final TextView textView = (TextView) rootView
.findViewById(R.id.textview);
final ScrollView scrollView = (ScrollView) rootView
.findViewById(R.id.scrollview);
textView.append(text);
scrollView.fullScroll(View.FOCUS_DOWN);
}

protected void writeToTextView(String text) {
writeRawToTextView(text + "\n");
}

protected void writeToTextView(String text, View rootView) {
writeRawToTextView(text + "\n", rootView);
}
}
68 changes: 27 additions & 41 deletions src/com/fusionx/lightirc/fragments/ServerFragment.java
Expand Up @@ -22,24 +22,22 @@
package com.fusionx.lightirc.fragments;

import com.fusionx.lightirc.R;
import com.fusionx.lightirc.misc.IRCBinder;
import com.fusionx.lightirc.misc.LightPircBotX;
import com.fusionx.lightirc.services.IRCService;
import com.fusionx.lightirc.services.IRCService.IRCBinder;
import com.fusionx.lightirc.activity.ServerChannelActivity;
import com.fusionx.lightirc.callbacks.ServerCallbacks;

import android.content.BroadcastReceiver;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.content.ServiceConnection;
import android.os.Bundle;
import android.os.IBinder;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;

public class ServerFragment extends IRCFragment {
public class ServerFragment extends IRCFragment implements ServerCallbacks {
String serverName;

@Override
Expand All @@ -51,6 +49,7 @@ public void onCreate(final Bundle savedInstanceState) {
((ServerChannelActivity) getActivity()).updateTabTitle(this, serverName);

Intent service = new Intent(getActivity(), IRCService.class);
service.putExtra("server", true);
getActivity().startService(service);
getActivity().bindService(service, mConnection, 0);

Expand All @@ -61,8 +60,9 @@ public void onCreate(final Bundle savedInstanceState) {
@Override
public void onServiceConnected(ComponentName className, IBinder service) {
LightPircBotX light = ((IRCBinder) service).getService().getBot(serverName);
((IRCBinder) service).getService().setServerCallbacks(ServerFragment.this);
if(light.mIsStarted) {
writeRawToTextView(light.mServerBuffer);
writeToTextView(light.mServerBuffer);
for(String s : light.mChannelBuffers.keySet()) {
ChannelFragment channel = new ChannelFragment();
Bundle bu = new Bundle();
Expand All @@ -79,7 +79,6 @@ public void onServiceConnected(ComponentName className, IBinder service) {
} else {
((IRCBinder) service).getService().connectToServer(serverName);
}
getActivity().unbindService(mConnection);
}

@Override
Expand All @@ -89,7 +88,7 @@ public void onServiceDisconnected(ComponentName name) {

@Override
public void onDestroy() {
getActivity().unregisterReceiver(mServerReciever);
getActivity().unbindService(mConnection);
super.onDestroy();
}

Expand All @@ -99,39 +98,26 @@ public View onCreateView(final LayoutInflater inflater,
final View rootView = inflater.inflate(R.layout.fragment_irc_channel,
container, false);

IntentFilter filter = new IntentFilter(
"com.fusionx.lightirc.JOIN_NEW_CHANNEL");
getActivity().registerReceiver(mServerReciever, filter);
filter = new IntentFilter("com.fusionx.lightirc.NOTICE_FROM_SERVER");
getActivity().registerReceiver(mServerReciever, filter);
filter = new IntentFilter("com.fusionx.lightirc.MOTD_FROM_SERVER");
getActivity().registerReceiver(mServerReciever, filter);

return rootView;
}

BroadcastReceiver mServerReciever = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
if (intent.getAction().equals(
"com.fusionx.lightirc.JOIN_NEW_CHANNEL")) {
String channelName = intent.getStringExtra("channel");
String nick = intent.getStringExtra("nick");

ChannelFragment channel = new ChannelFragment();
Bundle b = new Bundle();
b.putString("channel", channelName);
b.putString("nick", nick);
b.putString("serverName", serverName);
channel.setArguments(b);

int position = ((ServerChannelActivity) getActivity()).mSectionsPagerAdapter
.addView(channel);
((ServerChannelActivity) getActivity()).addTab(position);
} else {
String stringToWrite = intent.getStringExtra("stringToWrite");
writeToTextView(stringToWrite);
}
}
};
}
@Override
public void onServerWriteNeeded(String message) {
writeToTextView(message);
}

@Override
public void onNewChannelJoined(String channelName, String nick, String buffer) {
ChannelFragment channel = new ChannelFragment();
Bundle b = new Bundle();
b.putString("channel", channelName);
b.putString("nick", nick);
b.putString("serverName", serverName);
b.putString("buffer", buffer);
channel.setArguments(b);

int position = ((ServerChannelActivity) getActivity()).mSectionsPagerAdapter
.addView(channel);
((ServerChannelActivity) getActivity()).addTab(position);
}
}

0 comments on commit aa488e2

Please sign in to comment.