1
0
mirror of https://github.com/moparisthebest/Yaaic synced 2024-11-26 02:42:16 -05:00

Make reconnections actually work

At the moment, the reconnect feature is somewhat glitchy, popping up
multiple reconnect prompts even if a reconnection succeeds, and
occasionally causing crashes.  A successful reconnection results in the
conversation history being cleared, which is an annoying outcome when
connected over an unreliable network.

This patch does the following:

* Keep track of whether a reconnect dialog is active, to prevent
  multiple dialogs from opening.
* Introduce a new field to the Server object, mayReconnect, which is
  used to keep track of whether a reconnection should be attempted in
  the event of a disconnection.  It's set to "true" when we connect to a
  server, and "false" if the user asks for a disconnection.
* Prevent the clearing of active conversations and conversation history
  on disconnect, unless the user specifically asked for the disconnect.
* Keep the IRCService running even when no servers are connected, unless
  the user has disconnected from all servers herself.  This is needed
  for reliable auto-reconnects (see next patch), but has the side effect
  of keeping conversation history around even if the activity isn't open
  when a disconnect happens.
This commit is contained in:
Steven Luo 2011-06-29 01:19:02 -07:00 committed by Sebastian Kaspari
parent a69fafc4dd
commit e7651315df
5 changed files with 38 additions and 14 deletions

View File

@ -121,6 +121,8 @@ public class ConversationActivity extends Activity implements ServiceConnection,
private int historySize; private int historySize;
private boolean reconnectDialogActive = false;
OnKeyListener inputKeyListener = new OnKeyListener() { OnKeyListener inputKeyListener = new OnKeyListener() {
/** /**
* On key pressed (input line) * On key pressed (input line)
@ -392,6 +394,8 @@ public class ConversationActivity extends Activity implements ServiceConnection,
if (server.getStatus() == Status.PRE_CONNECTING && getIntent().hasExtra("connect")) { if (server.getStatus() == Status.PRE_CONNECTING && getIntent().hasExtra("connect")) {
server.setStatus(Status.CONNECTING); server.setStatus(Status.CONNECTING);
binder.connect(server); binder.connect(server);
} else {
onStatusUpdate();
} }
} }
@ -441,6 +445,7 @@ public class ConversationActivity extends Activity implements ServiceConnection,
switch (item.getItemId()) { switch (item.getItemId()) {
case R.id.disconnect: case R.id.disconnect:
server.setStatus(Status.DISCONNECTED); server.setStatus(Status.DISCONNECTED);
server.setMayReconnect(false);
binder.getService().getConnection(serverId).quitServer(); binder.getService().getConnection(serverId).quitServer();
server.clearConversations(); server.clearConversations();
setResult(RESULT_OK); setResult(RESULT_OK);
@ -604,10 +609,6 @@ public class ConversationActivity extends Activity implements ServiceConnection,
input.setEnabled(false); input.setEnabled(false);
if (server.getStatus() == Status.CONNECTING) { if (server.getStatus() == Status.CONNECTING) {
deckAdapter.clearConversations();
Conversation serverInfo = server.getConversation(ServerInfo.DEFAULT_NAME);
serverInfo.setHistorySize(historySize);
deckAdapter.addItem(serverInfo);
return; return;
} }
@ -616,27 +617,31 @@ public class ConversationActivity extends Activity implements ServiceConnection,
return; return;
} }
if (!binder.getService().getSettings().isReconnectEnabled()) { if (!binder.getService().getSettings().isReconnectEnabled() && !reconnectDialogActive) {
reconnectDialogActive = true;
AlertDialog.Builder builder = new AlertDialog.Builder(this); AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setMessage(getResources().getString(R.string.reconnect_after_disconnect, server.getTitle())) builder.setMessage(getResources().getString(R.string.reconnect_after_disconnect, server.getTitle()))
.setCancelable(false) .setCancelable(false)
.setPositiveButton("Yes", new DialogInterface.OnClickListener() { .setPositiveButton("Yes", new DialogInterface.OnClickListener() {
@Override @Override
public void onClick(DialogInterface dialog, int id) { public void onClick(DialogInterface dialog, int id) {
if (!server.isDisconnected()) {
reconnectDialogActive = false;
return;
}
binder.getService().getConnection(server.getId()).setAutojoinChannels( binder.getService().getConnection(server.getId()).setAutojoinChannels(
server.getCurrentChannelNames() server.getCurrentChannelNames()
); );
server.clearConversations(); server.setStatus(Status.CONNECTING);
deckAdapter.clearConversations();
Conversation serverInfo = server.getConversation(ServerInfo.DEFAULT_NAME);
serverInfo.setHistorySize(historySize);
deckAdapter.addItem(serverInfo);
binder.connect(server); binder.connect(server);
reconnectDialogActive = false;
} }
}) })
.setNegativeButton(getString(R.string.negative_button), new DialogInterface.OnClickListener() { .setNegativeButton(getString(R.string.negative_button), new DialogInterface.OnClickListener() {
@Override @Override
public void onClick(DialogInterface dialog, int id) { public void onClick(DialogInterface dialog, int id) {
server.setMayReconnect(false);
reconnectDialogActive = false;
dialog.cancel(); dialog.cancel();
} }
}); });

View File

@ -175,7 +175,7 @@ public class ServersActivity extends ListActivity implements ServiceConnection,
Intent intent = new Intent(this, ConversationActivity.class); Intent intent = new Intent(this, ConversationActivity.class);
if (server.getStatus() == Status.DISCONNECTED) { if (server.getStatus() == Status.DISCONNECTED && !server.mayReconnect()) {
server.setStatus(Status.PRE_CONNECTING); server.setStatus(Status.PRE_CONNECTING);
intent.putExtra("connect", true); intent.putExtra("connect", true);
} }
@ -220,6 +220,7 @@ public class ServersActivity extends ListActivity implements ServiceConnection,
case 1: // Disconnect case 1: // Disconnect
server.clearConversations(); server.clearConversations();
server.setStatus(Status.DISCONNECTED); server.setStatus(Status.DISCONNECTED);
server.setMayReconnect(false);
binder.getService().getConnection(server.getId()).quitServer(); binder.getService().getConnection(server.getId()).quitServer();
break; break;
case 2: // Edit case 2: // Edit
@ -292,6 +293,7 @@ public class ServersActivity extends ListActivity implements ServiceConnection,
for (Server server : mServers) { for (Server server : mServers) {
if (binder.getService().hasConnection(server.getId())) { if (binder.getService().hasConnection(server.getId())) {
server.setStatus(Status.DISCONNECTED); server.setStatus(Status.DISCONNECTED);
server.setMayReconnect(false);
binder.getService().getConnection(server.getId()).quitServer(); binder.getService().getConnection(server.getId()).quitServer();
} }
} }

View File

@ -140,6 +140,7 @@ public class IRCConnection extends PircBot
public void onConnect() public void onConnect()
{ {
server.setStatus(Status.CONNECTED); server.setStatus(Status.CONNECTED);
server.setMayReconnect(true);
service.sendBroadcast( service.sendBroadcast(
Broadcast.createServerIntent(Broadcast.SERVER_UPDATE, server.getId()) Broadcast.createServerIntent(Broadcast.SERVER_UPDATE, server.getId())
@ -372,7 +373,7 @@ public class IRCConnection extends PircBot
@Override @Override
protected void onJoin(String target, String sender, String login, String hostname) protected void onJoin(String target, String sender, String login, String hostname)
{ {
if (sender.equalsIgnoreCase(getNick())) { if (sender.equalsIgnoreCase(getNick()) && server.getConversation(target) == null) {
// We joined a new channel // We joined a new channel
Conversation conversation = new Channel(target); Conversation conversation = new Channel(target);
conversation.setHistorySize(service.getSettings().getHistorySize()); conversation.setHistorySize(service.getSettings().getHistorySize());
@ -1132,7 +1133,6 @@ public class IRCConnection extends PircBot
if (service.getSettings().isReconnectEnabled() && server.getStatus() != Status.DISCONNECTED) { if (service.getSettings().isReconnectEnabled() && server.getStatus() != Status.DISCONNECTED) {
setAutojoinChannels(server.getCurrentChannelNames()); setAutojoinChannels(server.getCurrentChannelNames());
server.clearConversations();
server.setStatus(Status.CONNECTING); server.setStatus(Status.CONNECTING);
service.connect(server); service.connect(server);
} else { } else {

View File

@ -485,7 +485,7 @@ public class IRCService extends Service
for (int i = 0; i < mSize; i++) { for (int i = 0; i < mSize; i++) {
server = mServers.get(i); server = mServers.get(i);
if (server.isDisconnected()) { if (server.isDisconnected() && !server.mayReconnect()) {
int serverId = server.getId(); int serverId = server.getId();
synchronized(this) { synchronized(this) {
IRCConnection connection = connections.get(serverId); IRCConnection connection = connections.get(serverId);

View File

@ -51,6 +51,7 @@ public class Server
private int status = Status.DISCONNECTED; private int status = Status.DISCONNECTED;
private String selected = ""; private String selected = "";
private boolean isForeground = false; private boolean isForeground = false;
private boolean mayReconnect = false;
/** /**
* Create a new server object * Create a new server object
@ -443,4 +444,20 @@ public class Server
{ {
this.isForeground = isForeground; this.isForeground = isForeground;
} }
/**
* Get whether a reconnect may be attempted if we're disconnected.
*/
public boolean mayReconnect()
{
return mayReconnect;
}
/**
* Set whether a reconnect may be attempted if we're disconnected.
*/
public void setMayReconnect(boolean mayReconnect)
{
this.mayReconnect = mayReconnect;
}
} }