From 41cf6b60d0db11f6c7d47da5b135e1278f954996 Mon Sep 17 00:00:00 2001 From: Sebastian Kaspari Date: Sun, 21 Mar 2010 19:57:30 +0100 Subject: [PATCH 01/20] permanent service with notification icon, stop service if not needed (work in progress) --- AndroidManifest.xml | 9 +- src/org/yaaic/Yaaic.java | 23 +++ src/org/yaaic/irc/IRCConnection.java | 6 +- src/org/yaaic/irc/IRCService.java | 173 ++++++++++++++++++- src/org/yaaic/view/ConversationActivity.java | 19 +- src/org/yaaic/view/ServersActivity.java | 22 +-- 6 files changed, 228 insertions(+), 24 deletions(-) diff --git a/AndroidManifest.xml b/AndroidManifest.xml index 50e1da6..8c26da2 100644 --- a/AndroidManifest.xml +++ b/AndroidManifest.xml @@ -22,11 +22,14 @@ along with Yaaic. If not, see . - + android:versionName="0.2"> + + android:label="@string/app_name" + android:launchMode="singleTask"> diff --git a/src/org/yaaic/Yaaic.java b/src/org/yaaic/Yaaic.java index 990d920..4f59a99 100644 --- a/src/org/yaaic/Yaaic.java +++ b/src/org/yaaic/Yaaic.java @@ -23,8 +23,13 @@ package org.yaaic; import java.util.ArrayList; import java.util.HashMap; +import org.yaaic.db.Database; +import org.yaaic.model.Broadcast; import org.yaaic.model.Server; +import android.content.Context; +import android.content.Intent; + /** * Global Master Class :) * @@ -35,6 +40,7 @@ public class Yaaic public static Yaaic instance; private HashMap servers; + private boolean serversLoaded = false; /** * Private constructor, you may want to use static getInstance() @@ -44,6 +50,23 @@ public class Yaaic servers = new HashMap(); } + /** + * Load servers from database + * + * @param context + */ + public void loadServers(Context context) + { + if (!serversLoaded) { + Database db = new Database(context); + servers = db.getServers(); + db.close(); + + //context.sendBroadcast(new Intent(Broadcast.SERVER_UPDATE)); + serversLoaded = true; + } + } + /** * Get global Yaaic instance * diff --git a/src/org/yaaic/irc/IRCConnection.java b/src/org/yaaic/irc/IRCConnection.java index 2115407..f80348f 100644 --- a/src/org/yaaic/irc/IRCConnection.java +++ b/src/org/yaaic/irc/IRCConnection.java @@ -1036,6 +1036,10 @@ public class IRCConnection extends PircBot @Override public void quitServer() { - quitServer("Yaaic - Yet another Android IRC client - http://www.yaaic.org"); + new Thread() { + public void run() { + quitServer("Yaaic - Yet another Android IRC client - http://www.yaaic.org"); + } + }.start(); } } diff --git a/src/org/yaaic/irc/IRCService.java b/src/org/yaaic/irc/IRCService.java index fb54c58..e4ea423 100644 --- a/src/org/yaaic/irc/IRCService.java +++ b/src/org/yaaic/irc/IRCService.java @@ -20,12 +20,20 @@ along with Yaaic. If not, see . */ package org.yaaic.irc; +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; +import java.util.ArrayList; import java.util.HashMap; +import java.util.Set; +import org.yaaic.R; import org.yaaic.Yaaic; -import org.yaaic.db.Database; -import org.yaaic.model.Broadcast; +import org.yaaic.model.Server; +import org.yaaic.view.ServersActivity; +import android.app.Notification; +import android.app.NotificationManager; +import android.app.PendingIntent; import android.app.Service; import android.content.Intent; import android.util.Log; @@ -42,6 +50,17 @@ public class IRCService extends Service private IRCBinder binder; private HashMap connections; + @SuppressWarnings("unchecked") + private static final Class[] mStartForegroundSignature = new Class[] { int.class, Notification.class }; + @SuppressWarnings("unchecked") + private static final Class[] mStopForegroundSignature = new Class[] { boolean.class }; + + private NotificationManager mNM; + private Method mStartForeground; + private Method mStopForeground; + private Object[] mStartForegroundArgs = new Object[2]; + private Object[] mStopForegroundArgs = new Object[1]; + /** * Create new service */ @@ -55,28 +74,127 @@ public class IRCService extends Service this.binder = new IRCBinder(this); } + /** + * On create + */ @Override public void onCreate() { - super.onCreate(); - - Log.d(TAG, "Loading servers from database"); + mNM = (NotificationManager) getSystemService(NOTIFICATION_SERVICE); + + try { + mStartForeground = getClass().getMethod("startForeground", mStartForegroundSignature); + mStopForeground = getClass().getMethod("stopForeground", mStopForegroundSignature); + } catch (NoSuchMethodException e) { + // Running on an older platform. + mStartForeground = mStopForeground = null; + } // Load servers from Database - Database db = new Database(this); + /* + Database db = new Database(this); Yaaic.getInstance().setServers(db.getServers()); db.close(); + */ // Broadcast changed server list - sendBroadcast(new Intent(Broadcast.SERVER_UPDATE)); + //sendBroadcast(new Intent(Broadcast.SERVER_UPDATE)); } + /** + * On start (will be called on pre-2.0 platform. On 2.0 or later onStartCommand() + * will be called) + */ @Override public void onStart(Intent intent, int startId) { - Log.d(TAG, "onStart()"); - super.onStart(intent, startId); + handleCommand(intent); } + + /** + * On start command (Android >= 2.0) + * + * @param intent + * @param flags + * @param startId + * @return + */ + public int onStartCommand(Intent intent, int flags, int startId) + { + handleCommand(intent); + + // We want this service to continue running until it is explicitly + // stopped, so return sticky. + //return START_STICKY; + return 1; + } + + + /** + * Handle command + * + * @param intent + */ + private void handleCommand(Intent intent) + { + // Set the icon, scrolling text and timestamp + Notification notification = new Notification(R.drawable.icon, "Mama", System.currentTimeMillis()); + + // The PendingIntent to launch our activity if the user selects this notification + PendingIntent contentIntent = PendingIntent.getActivity(this, 0, new Intent(this, ServersActivity.class), 0); + + // Set the info for the views that show in the notification panel. + notification.setLatestEventInfo(this, getText(R.string.app_name), "Papa", contentIntent); + + startForegroundCompat(R.string.app_name, notification); + } + + /** + * This is a wrapper around the new startForeground method, using the older + * APIs if it is not available. + */ + private void startForegroundCompat(int id, Notification notification) + { + // If we have the new startForeground API, then use it. + if (mStartForeground != null) { + mStartForegroundArgs[0] = Integer.valueOf(id); + mStartForegroundArgs[1] = notification; + try { + mStartForeground.invoke(this, mStartForegroundArgs); + } catch (InvocationTargetException e) { + // Should not happen. + } catch (IllegalAccessException e) { + // Should not happen. + } + } else { + // Fall back on the old API. + setForeground(true); + mNM.notify(id, notification); + } + } + + /** + * This is a wrapper around the new stopForeground method, using the older + * APIs if it is not available. + */ + private void stopForegroundCompat(int id) { + // If we have the new stopForeground API, then use it. + if (mStopForeground != null) { + mStopForegroundArgs[0] = Boolean.TRUE; + try { + mStopForeground.invoke(this, mStopForegroundArgs); + } catch (InvocationTargetException e) { + // Should not happen. + } catch (IllegalAccessException e) { + // Should not happen. + } + } else { + // Fall back on the old API. Note to cancel BEFORE changing the + // foreground state, since we could be killed at that point. + mNM.cancel(id); + setForeground(false); + } + } /** * Get connection for given server @@ -96,6 +214,43 @@ public class IRCService extends Service return connection; } + public void checkServiceStatus() + { + Log.d("Yaaic", "(1)"); + + boolean shutDown = true; + ArrayList mServers = Yaaic.getInstance().getServersAsArrayList(); + int mSize = mServers.size(); + Server server; + + Log.d("Yaaic", "(2)"); + + for (int i = 0; i < mSize; i++) { + Log.d("Yaaic", " (3)"); + server = mServers.get(i); + if (server.isDisconnected()) { + connections.remove(server.getId()); + } else { + shutDown = false; + } + } + + if (shutDown) { + stopSelf(); + } + } + + /** + * + */ + @Override + public void onDestroy() + { + // Make sure our notification is gone. + stopForegroundCompat(R.string.app_name); + } + + /** * On Activity binding to this service * diff --git a/src/org/yaaic/view/ConversationActivity.java b/src/org/yaaic/view/ConversationActivity.java index e8874b2..e44c0b1 100644 --- a/src/org/yaaic/view/ConversationActivity.java +++ b/src/org/yaaic/view/ConversationActivity.java @@ -98,7 +98,7 @@ public class ConversationActivity extends Activity implements ServiceConnection, ((TextView) findViewById(R.id.title)).setText(server.getTitle()); ((EditText) findViewById(R.id.input)).setOnKeyListener(this); - + deckAdapter = new DeckAdapter(); deck = (Gallery) findViewById(R.id.deck); deck.setOnItemSelectedListener(this); @@ -123,7 +123,9 @@ public class ConversationActivity extends Activity implements ServiceConnection, ((ImageView) findViewById(R.id.status)).setImageResource(server.getStatusIcon()); + // Start service Intent intent = new Intent(this, IRCService.class); + startService(intent); bindService(intent, this, 0); channelReceiver = new ConversationReceiver(server.getId(), this); @@ -145,6 +147,10 @@ public class ConversationActivity extends Activity implements ServiceConnection, while (conversation.hasBufferedMessages()) { if (conversation.getMessageListAdapter() != null) { conversation.getMessageListAdapter().addMessage(conversation.pollBufferedMessage()); + } else { + // There's no adapter... so let's remove the buffer + conversation.clearBuffer(); + Log.d("Yaaic", "No MessageListAdapter found - clear buffer"); } } } @@ -158,6 +164,15 @@ public class ConversationActivity extends Activity implements ServiceConnection, { super.onPause(); + binder.getService().checkServiceStatus(); + + /*if (!binder.getService().hasConnections()) { + Log.d("Yaaic", "Stopping service"); + //binder.getService().stopSelf(); + } else { + Log.d("Yaaic", "Unbinding service"); + }*/ + unbindService(this); unregisterReceiver(channelReceiver); unregisterReceiver(serverReceiver); @@ -209,10 +224,12 @@ public class ConversationActivity extends Activity implements ServiceConnection, switch (item.getItemId()) { case R.id.disconnect: binder.getService().getConnection(serverId).quitServer(); + server.setStatus(Status.DISCONNECTED); server.clearConversations(); setResult(RESULT_OK); finish(); break; + case R.id.join: startActivityForResult(new Intent(this, JoinActivity.class), 0); break; diff --git a/src/org/yaaic/view/ServersActivity.java b/src/org/yaaic/view/ServersActivity.java index 061500b..d7ee4471 100644 --- a/src/org/yaaic/view/ServersActivity.java +++ b/src/org/yaaic/view/ServersActivity.java @@ -60,7 +60,7 @@ import org.yaaic.receiver.ServerReceiver; public class ServersActivity extends ListActivity implements ServiceConnection, ServerListener, OnItemLongClickListener { public static final String TAG = "Yaaic/ServersActivity"; - private IRCBinder binder; + //private IRCBinder binder; private ServerReceiver receiver; private ServerListAdapter adapter; @@ -73,6 +73,8 @@ public class ServersActivity extends ListActivity implements ServiceConnection, super.onCreate(savedInstanceState); setContentView(R.layout.servers); + Yaaic.getInstance().loadServers(this); + adapter = new ServerListAdapter(); setListAdapter(adapter); @@ -89,9 +91,9 @@ public class ServersActivity extends ListActivity implements ServiceConnection, super.onResume(); // Start and connect to service - Intent intent = new Intent(this, IRCService.class); - startService(intent); - bindService(intent, this, 0); + //Intent intent = new Intent(this, IRCService.class); + //startService(intent); + //bindService(intent, this, 0); receiver = new ServerReceiver(this); registerReceiver(receiver, new IntentFilter(Broadcast.SERVER_UPDATE)); @@ -107,7 +109,7 @@ public class ServersActivity extends ListActivity implements ServiceConnection, { super.onPause(); - unbindService(this); + //unbindService(this); unregisterReceiver(receiver); } @@ -116,7 +118,7 @@ public class ServersActivity extends ListActivity implements ServiceConnection, */ public void onServiceConnected(ComponentName name, IBinder service) { - binder = (IRCBinder) service; + //binder = (IRCBinder) service; } /** @@ -124,7 +126,7 @@ public class ServersActivity extends ListActivity implements ServiceConnection, */ public void onServiceDisconnected(ComponentName name) { - binder = null; + //binder = null; } /** @@ -165,19 +167,19 @@ public class ServersActivity extends ListActivity implements ServiceConnection, public void onClick(DialogInterface dialog, int item) { switch (item) { case 0: // Connect - binder.connect(server); + //binder.connect(server); server.setStatus(Status.CONNECTING); adapter.notifyDataSetChanged(); break; case 1: // Disconnect server.clearConversations(); - binder.getService().getConnection(server.getId()).quitServer(); + //binder.getService().getConnection(server.getId()).quitServer(); break; case 2: // Edit editServer(server.getId()); break; case 3: // Delete - binder.getService().getConnection(server.getId()).quitServer(); + //binder.getService().getConnection(server.getId()).quitServer(); deleteServer(server.getId()); break; } From 6e2c8358693c25008fffcbe689cb9a11dbaa18cd Mon Sep 17 00:00:00 2001 From: Sebastian Kaspari Date: Wed, 24 Mar 2010 18:44:17 +0100 Subject: [PATCH 02/20] ConversationActivity: Small changes in onKeyDown() (also removed onBackPressed()) --- src/org/yaaic/view/ConversationActivity.java | 35 ++++++++------------ 1 file changed, 13 insertions(+), 22 deletions(-) diff --git a/src/org/yaaic/view/ConversationActivity.java b/src/org/yaaic/view/ConversationActivity.java index e8874b2..1fca762 100644 --- a/src/org/yaaic/view/ConversationActivity.java +++ b/src/org/yaaic/view/ConversationActivity.java @@ -271,7 +271,9 @@ public class ConversationActivity extends Activity implements ServiceConnection, deckAdapter.removeItem(target); if (deckAdapter.isSwitched()) { - onBackPressed(); + switcher.showNext(); + switcher.removeView(deckAdapter.getSwitchedView()); + deckAdapter.setSwitched(null, null); } } @@ -309,32 +311,21 @@ public class ConversationActivity extends Activity implements ServiceConnection, /** * On key down - * - * This is glue code to call onBackPressed() which - * will be automatically called by later android releases + * + * XXX: As we only track the back key: Android >= 2.0 will call a method called onBackPressed() */ @Override public boolean onKeyDown(int keyCode, KeyEvent event) { - if (keyCode == KeyEvent.KEYCODE_BACK) { - onBackPressed(); - return true; - } - return false; - } - - /** - * On back key pressed - */ - public void onBackPressed() - { - if (deckAdapter.isSwitched()) { - switcher.showNext(); - switcher.removeView(deckAdapter.getSwitchedView()); - deckAdapter.setSwitched(null, null); - } else { - finish(); + if (keyCode == KeyEvent.KEYCODE_BACK && event.getRepeatCount() == 0) { + if (deckAdapter.isSwitched()) { + switcher.showNext(); + switcher.removeView(deckAdapter.getSwitchedView()); + deckAdapter.setSwitched(null, null); + return true; + } } + return super.onKeyDown(keyCode, event); } /** From acb09a3b8acb0ac6b356f59ee69abab3e4244e9b Mon Sep 17 00:00:00 2001 From: Sebastian Kaspari Date: Wed, 24 Mar 2010 18:48:38 +0100 Subject: [PATCH 03/20] Moved activities to org.yaaic.activity package --- AndroidManifest.xml | 12 ++++++------ src/org/yaaic/{view => activity}/AboutActivity.java | 2 +- .../yaaic/{view => activity}/AddServerActivity.java | 2 +- .../{view => activity}/ConversationActivity.java | 3 ++- src/org/yaaic/{view => activity}/JoinActivity.java | 2 +- .../yaaic/{view => activity}/ServersActivity.java | 2 +- .../yaaic/{view => activity}/SettingsActivity.java | 2 +- 7 files changed, 13 insertions(+), 12 deletions(-) rename src/org/yaaic/{view => activity}/AboutActivity.java (97%) rename src/org/yaaic/{view => activity}/AddServerActivity.java (99%) rename src/org/yaaic/{view => activity}/ConversationActivity.java (99%) rename src/org/yaaic/{view => activity}/JoinActivity.java (98%) rename src/org/yaaic/{view => activity}/ServersActivity.java (99%) rename src/org/yaaic/{view => activity}/SettingsActivity.java (97%) diff --git a/AndroidManifest.xml b/AndroidManifest.xml index 50e1da6..b96ed87 100644 --- a/AndroidManifest.xml +++ b/AndroidManifest.xml @@ -25,7 +25,7 @@ along with Yaaic. If not, see . android:versionName="@string/app_version"> @@ -33,7 +33,7 @@ along with Yaaic. If not, see . @@ -43,20 +43,20 @@ along with Yaaic. If not, see . diff --git a/src/org/yaaic/view/AboutActivity.java b/src/org/yaaic/activity/AboutActivity.java similarity index 97% rename from src/org/yaaic/view/AboutActivity.java rename to src/org/yaaic/activity/AboutActivity.java index fb277e4..e9ef5d6 100644 --- a/src/org/yaaic/view/AboutActivity.java +++ b/src/org/yaaic/activity/AboutActivity.java @@ -18,7 +18,7 @@ GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Yaaic. If not, see . */ -package org.yaaic.view; +package org.yaaic.activity; import org.yaaic.R; diff --git a/src/org/yaaic/view/AddServerActivity.java b/src/org/yaaic/activity/AddServerActivity.java similarity index 99% rename from src/org/yaaic/view/AddServerActivity.java rename to src/org/yaaic/activity/AddServerActivity.java index ee85975..8d424ad 100644 --- a/src/org/yaaic/view/AddServerActivity.java +++ b/src/org/yaaic/activity/AddServerActivity.java @@ -18,7 +18,7 @@ GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Yaaic. If not, see . */ -package org.yaaic.view; +package org.yaaic.activity; import java.util.regex.Pattern; diff --git a/src/org/yaaic/view/ConversationActivity.java b/src/org/yaaic/activity/ConversationActivity.java similarity index 99% rename from src/org/yaaic/view/ConversationActivity.java rename to src/org/yaaic/activity/ConversationActivity.java index 1fca762..96bc67e 100644 --- a/src/org/yaaic/view/ConversationActivity.java +++ b/src/org/yaaic/activity/ConversationActivity.java @@ -18,7 +18,7 @@ GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Yaaic. If not, see . */ -package org.yaaic.view; +package org.yaaic.activity; import android.app.Activity; import android.content.ComponentName; @@ -62,6 +62,7 @@ import org.yaaic.model.Server; import org.yaaic.model.Status; import org.yaaic.receiver.ConversationReceiver; import org.yaaic.receiver.ServerReceiver; +import org.yaaic.view.MessageListView; /** * The server view with a scrollable list of all channels diff --git a/src/org/yaaic/view/JoinActivity.java b/src/org/yaaic/activity/JoinActivity.java similarity index 98% rename from src/org/yaaic/view/JoinActivity.java rename to src/org/yaaic/activity/JoinActivity.java index 9adb8d2..53bfd4e 100644 --- a/src/org/yaaic/view/JoinActivity.java +++ b/src/org/yaaic/activity/JoinActivity.java @@ -18,7 +18,7 @@ GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Yaaic. If not, see . */ -package org.yaaic.view; +package org.yaaic.activity; import org.yaaic.R; diff --git a/src/org/yaaic/view/ServersActivity.java b/src/org/yaaic/activity/ServersActivity.java similarity index 99% rename from src/org/yaaic/view/ServersActivity.java rename to src/org/yaaic/activity/ServersActivity.java index 061500b..d702dfe 100644 --- a/src/org/yaaic/view/ServersActivity.java +++ b/src/org/yaaic/activity/ServersActivity.java @@ -18,7 +18,7 @@ GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Yaaic. If not, see . */ -package org.yaaic.view; +package org.yaaic.activity; import android.app.AlertDialog; import android.app.ListActivity; diff --git a/src/org/yaaic/view/SettingsActivity.java b/src/org/yaaic/activity/SettingsActivity.java similarity index 97% rename from src/org/yaaic/view/SettingsActivity.java rename to src/org/yaaic/activity/SettingsActivity.java index f3151e9..9fe0e6c 100644 --- a/src/org/yaaic/view/SettingsActivity.java +++ b/src/org/yaaic/activity/SettingsActivity.java @@ -18,7 +18,7 @@ GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Yaaic. If not, see . */ -package org.yaaic.view; +package org.yaaic.activity; import org.yaaic.R; From 381601d52153e8fe8477f627b74448569af7129b Mon Sep 17 00:00:00 2001 From: Sebastian Kaspari Date: Wed, 24 Mar 2010 19:23:07 +0100 Subject: [PATCH 04/20] New helper: Broadcast.createServerIntent() --- src/org/yaaic/model/Broadcast.java | 20 ++++++++++++++++++-- 1 file changed, 18 insertions(+), 2 deletions(-) diff --git a/src/org/yaaic/model/Broadcast.java b/src/org/yaaic/model/Broadcast.java index 6f14ab7..7da5d2e 100644 --- a/src/org/yaaic/model/Broadcast.java +++ b/src/org/yaaic/model/Broadcast.java @@ -39,12 +39,12 @@ public abstract class Broadcast public static final String EXTRA_CONVERSATION = "conversation"; /** - * Create an intent for conversation broadcasting + * Create an Intent for conversation broadcasting * * @param broadcastType The type of the broadcast, some constant of Broadcast.* * @param serverId The id of the server * @param conversationName The unique name of the conversation - * @return + * @return The created Intent */ public static Intent createConversationIntent(String broadcastType, int serverId, String conversationName) { @@ -55,4 +55,20 @@ public abstract class Broadcast return intent; } + + /** + * Create an Intent for server broadcasting + * + * @param broadcastType The typo of the broadcast, some constant of Broadcast.* + * @param serverId The id of the server + * @return The created Intent + */ + public static Intent createServerIntent(String broadcastType, int serverId) + { + Intent intent = new Intent(broadcastType); + + intent.putExtra(Broadcast.EXTRA_SERVER, serverId); + + return intent; + } } From db06f5450dcb31328dfe278a9ace752e02a71524 Mon Sep 17 00:00:00 2001 From: Sebastian Kaspari Date: Wed, 24 Mar 2010 19:26:38 +0100 Subject: [PATCH 05/20] New class for bundle params (org.yaaic.model.Extra) --- src/org/yaaic/model/Extra.java | 32 ++++++++++++++++++++++++++++++++ 1 file changed, 32 insertions(+) create mode 100644 src/org/yaaic/model/Extra.java diff --git a/src/org/yaaic/model/Extra.java b/src/org/yaaic/model/Extra.java new file mode 100644 index 0000000..377de22 --- /dev/null +++ b/src/org/yaaic/model/Extra.java @@ -0,0 +1,32 @@ +/* +Yaaic - Yet Another Android IRC Client + +Copyright 2009-2010 Sebastian Kaspari + +This file is part of Yaaic. + +Yaaic 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. + +Yaaic 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 Yaaic. If not, see . +*/ +package org.yaaic.model; + +/** + * Helper class for constants used for bundle params (extras) + * + * @author Sebastian Kaspari + */ +public class Extra +{ + public static final String SERVER = "server"; + public static final String CONVERSATION = "conversation"; +} From 976ef4f598e0ea81d3a17da90ef0329a5708cdbd Mon Sep 17 00:00:00 2001 From: Sebastian Kaspari Date: Wed, 24 Mar 2010 19:27:32 +0100 Subject: [PATCH 06/20] Broadcast: Helper methods use Extra.* --- src/org/yaaic/model/Broadcast.java | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/src/org/yaaic/model/Broadcast.java b/src/org/yaaic/model/Broadcast.java index 7da5d2e..a215ab0 100644 --- a/src/org/yaaic/model/Broadcast.java +++ b/src/org/yaaic/model/Broadcast.java @@ -34,9 +34,6 @@ public abstract class Broadcast public static final String CONVERSATION_MESSAGE = "org.yaaic.conversation.message"; public static final String CONVERSATION_NEW = "org.yaaic.conversation.new"; public static final String CONVERSATION_REMOVE = "org.yaaic.conversation.remove"; - - public static final String EXTRA_SERVER = "server"; - public static final String EXTRA_CONVERSATION = "conversation"; /** * Create an Intent for conversation broadcasting @@ -50,8 +47,8 @@ public abstract class Broadcast { Intent intent = new Intent(broadcastType); - intent.putExtra(Broadcast.EXTRA_SERVER, serverId); - intent.putExtra(Broadcast.EXTRA_CONVERSATION, conversationName); + intent.putExtra(Extra.SERVER, serverId); + intent.putExtra(Extra.CONVERSATION, conversationName); return intent; } @@ -67,7 +64,7 @@ public abstract class Broadcast { Intent intent = new Intent(broadcastType); - intent.putExtra(Broadcast.EXTRA_SERVER, serverId); + intent.putExtra(Extra.SERVER, serverId); return intent; } From c66eeecb0b9dbc9faf81ab11699c47b3f7d0c5ea Mon Sep 17 00:00:00 2001 From: Sebastian Kaspari Date: Wed, 24 Mar 2010 19:31:59 +0100 Subject: [PATCH 07/20] CommandParser and CommandHandlers: Use Broadcast helper methods --- src/org/yaaic/command/CommandParser.java | 18 ++++++++++++------ .../yaaic/command/handler/CloseHandler.java | 8 +++++--- src/org/yaaic/command/handler/EchoHandler.java | 8 +++++--- src/org/yaaic/command/handler/MeHandler.java | 8 +++++--- .../yaaic/command/handler/NamesHandler.java | 8 +++++--- .../yaaic/command/handler/NoticeHandler.java | 8 +++++--- .../yaaic/command/handler/QueryHandler.java | 8 +++++--- 7 files changed, 42 insertions(+), 24 deletions(-) diff --git a/src/org/yaaic/command/CommandParser.java b/src/org/yaaic/command/CommandParser.java index c994c3a..4e10fc4 100644 --- a/src/org/yaaic/command/CommandParser.java +++ b/src/org/yaaic/command/CommandParser.java @@ -143,9 +143,12 @@ public class CommandParser Message usageMessage = new Message("Syntax: " + command.getUsage()); conversation.addMessage(usageMessage); - Intent intent = new Intent(Broadcast.CONVERSATION_MESSAGE); - intent.putExtra(Broadcast.EXTRA_SERVER, server.getId()); - intent.putExtra(Broadcast.EXTRA_CONVERSATION, conversation.getName()); + Intent intent = Broadcast.createConversationIntent( + Broadcast.CONVERSATION_MESSAGE, + server.getId(), + conversation.getName() + ); + service.sendBroadcast(intent); } } @@ -162,9 +165,12 @@ public class CommandParser message.setColor(Message.COLOR_RED); conversation.addMessage(message); - Intent intent = new Intent(Broadcast.CONVERSATION_MESSAGE); - intent.putExtra(Broadcast.EXTRA_SERVER, server.getId()); - intent.putExtra(Broadcast.EXTRA_CONVERSATION, conversation.getName()); + Intent intent = Broadcast.createConversationIntent( + Broadcast.CONVERSATION_MESSAGE, + server.getId(), + conversation.getName() + ); + service.sendBroadcast(intent); } } diff --git a/src/org/yaaic/command/handler/CloseHandler.java b/src/org/yaaic/command/handler/CloseHandler.java index 483efee..323fee7 100644 --- a/src/org/yaaic/command/handler/CloseHandler.java +++ b/src/org/yaaic/command/handler/CloseHandler.java @@ -55,9 +55,11 @@ public class CloseHandler extends BaseHandler if (conversation.getType() == Conversation.TYPE_QUERY) { server.removeConversation(conversation.getName()); - Intent intent = new Intent(Broadcast.CONVERSATION_REMOVE); - intent.putExtra(Broadcast.EXTRA_SERVER, server.getId()); - intent.putExtra(Broadcast.EXTRA_CONVERSATION, conversation.getName()); + Intent intent = Broadcast.createConversationIntent( + Broadcast.CONVERSATION_REMOVE, + server.getId(), + conversation.getName() + ); service.sendBroadcast(intent); } } diff --git a/src/org/yaaic/command/handler/EchoHandler.java b/src/org/yaaic/command/handler/EchoHandler.java index da70a63..007a1c1 100644 --- a/src/org/yaaic/command/handler/EchoHandler.java +++ b/src/org/yaaic/command/handler/EchoHandler.java @@ -47,9 +47,11 @@ public class EchoHandler extends BaseHandler Message message = new Message(BaseHandler.mergeParams(params)); conversation.addMessage(message); - Intent intent = new Intent(Broadcast.CONVERSATION_MESSAGE); - intent.putExtra(Broadcast.EXTRA_SERVER, server.getId()); - intent.putExtra(Broadcast.EXTRA_CONVERSATION, conversation.getName()); + Intent intent = Broadcast.createConversationIntent( + Broadcast.CONVERSATION_REMOVE, + server.getId(), + conversation.getName() + ); service.sendBroadcast(intent); } else { throw new CommandException("Text is missing"); diff --git a/src/org/yaaic/command/handler/MeHandler.java b/src/org/yaaic/command/handler/MeHandler.java index 6b1b914..2f1f5b4 100644 --- a/src/org/yaaic/command/handler/MeHandler.java +++ b/src/org/yaaic/command/handler/MeHandler.java @@ -56,9 +56,11 @@ public class MeHandler extends BaseHandler message.setIcon(R.drawable.action); server.getConversation(conversation.getName()).addMessage(message); - Intent intent = new Intent(Broadcast.CONVERSATION_MESSAGE); - intent.putExtra(Broadcast.EXTRA_SERVER, server.getId()); - intent.putExtra(Broadcast.EXTRA_CONVERSATION, conversation.getName()); + Intent intent = Broadcast.createConversationIntent( + Broadcast.CONVERSATION_REMOVE, + server.getId(), + conversation.getName() + ); service.sendBroadcast(intent); service.getConnection(server.getId()).sendAction(conversation.getName(), action); diff --git a/src/org/yaaic/command/handler/NamesHandler.java b/src/org/yaaic/command/handler/NamesHandler.java index 845e842..4d546ba 100644 --- a/src/org/yaaic/command/handler/NamesHandler.java +++ b/src/org/yaaic/command/handler/NamesHandler.java @@ -60,9 +60,11 @@ public class NamesHandler extends BaseHandler message.setColor(Message.COLOR_YELLOW); conversation.addMessage(message); - Intent intent = new Intent(Broadcast.CONVERSATION_MESSAGE); - intent.putExtra(Broadcast.EXTRA_SERVER, server.getId()); - intent.putExtra(Broadcast.EXTRA_CONVERSATION, conversation.getName()); + Intent intent = Broadcast.createConversationIntent( + Broadcast.CONVERSATION_REMOVE, + server.getId(), + conversation.getName() + ); service.sendBroadcast(intent); } diff --git a/src/org/yaaic/command/handler/NoticeHandler.java b/src/org/yaaic/command/handler/NoticeHandler.java index b9e20d9..82a91fb 100644 --- a/src/org/yaaic/command/handler/NoticeHandler.java +++ b/src/org/yaaic/command/handler/NoticeHandler.java @@ -53,9 +53,11 @@ public class NoticeHandler extends BaseHandler message.setIcon(R.drawable.info); conversation.addMessage(message); - Intent intent = new Intent(Broadcast.CONVERSATION_MESSAGE); - intent.putExtra(Broadcast.EXTRA_SERVER, server.getId()); - intent.putExtra(Broadcast.EXTRA_CONVERSATION, conversation.getName()); + Intent intent = Broadcast.createConversationIntent( + Broadcast.CONVERSATION_REMOVE, + server.getId(), + conversation.getName() + ); service.sendBroadcast(intent); service.getConnection(server.getId()).sendNotice(params[1], text); diff --git a/src/org/yaaic/command/handler/QueryHandler.java b/src/org/yaaic/command/handler/QueryHandler.java index 54407e3..96540ff 100644 --- a/src/org/yaaic/command/handler/QueryHandler.java +++ b/src/org/yaaic/command/handler/QueryHandler.java @@ -59,9 +59,11 @@ public class QueryHandler extends BaseHandler server.addConversationl(new Query(params[1])); - Intent intent = new Intent(Broadcast.CONVERSATION_NEW); - intent.putExtra(Broadcast.EXTRA_SERVER, server.getId()); - intent.putExtra(Broadcast.EXTRA_CONVERSATION, params[1]); + Intent intent = Broadcast.createConversationIntent( + Broadcast.CONVERSATION_REMOVE, + server.getId(), + conversation.getName() + ); service.sendBroadcast(intent); } else { throw new CommandException("Invalid number of params"); From b482afa305b3fbb68e948ad174e86dab974828a5 Mon Sep 17 00:00:00 2001 From: Sebastian Kaspari Date: Wed, 24 Mar 2010 19:35:46 +0100 Subject: [PATCH 08/20] Using Broadcast helpers... --- src/org/yaaic/activity/AddServerActivity.java | 6 +++--- src/org/yaaic/activity/ServersActivity.java | 3 ++- src/org/yaaic/irc/IRCBinder.java | 13 ++++++++----- src/org/yaaic/receiver/ConversationReceiver.java | 9 +++++---- 4 files changed, 18 insertions(+), 13 deletions(-) diff --git a/src/org/yaaic/activity/AddServerActivity.java b/src/org/yaaic/activity/AddServerActivity.java index 8d424ad..e25594d 100644 --- a/src/org/yaaic/activity/AddServerActivity.java +++ b/src/org/yaaic/activity/AddServerActivity.java @@ -35,7 +35,7 @@ import org.yaaic.R; import org.yaaic.Yaaic; import org.yaaic.db.Database; import org.yaaic.exception.ValidationException; -import org.yaaic.model.Broadcast; +import org.yaaic.model.Extra; import org.yaaic.model.Identity; import org.yaaic.model.Server; import org.yaaic.model.Status; @@ -64,10 +64,10 @@ public class AddServerActivity extends Activity implements OnClickListener ((Button) findViewById(R.id.cancel)).setOnClickListener(this); Bundle extras = getIntent().getExtras(); - if (extras != null && extras.containsKey(Broadcast.EXTRA_SERVER)) { + if (extras != null && extras.containsKey(Extra.SERVER)) { // Request to edit an existing server Database db = new Database(this); - this.server = db.getServerById(extras.getInt(Broadcast.EXTRA_SERVER)); + this.server = db.getServerById(extras.getInt(Extra.SERVER)); db.close(); // Set server values diff --git a/src/org/yaaic/activity/ServersActivity.java b/src/org/yaaic/activity/ServersActivity.java index d702dfe..7b9ea0f 100644 --- a/src/org/yaaic/activity/ServersActivity.java +++ b/src/org/yaaic/activity/ServersActivity.java @@ -48,6 +48,7 @@ import org.yaaic.irc.IRCService; import org.yaaic.layout.NonScalingBackgroundDrawable; import org.yaaic.listener.ServerListener; import org.yaaic.model.Broadcast; +import org.yaaic.model.Extra; import org.yaaic.model.Server; import org.yaaic.model.Status; import org.yaaic.receiver.ServerReceiver; @@ -202,7 +203,7 @@ public class ServersActivity extends ListActivity implements ServiceConnection, } else { Intent intent = new Intent(this, AddServerActivity.class); - intent.putExtra(Broadcast.EXTRA_SERVER, serverId); + intent.putExtra(Extra.SERVER, serverId); startActivityForResult(intent, 0); } } diff --git a/src/org/yaaic/irc/IRCBinder.java b/src/org/yaaic/irc/IRCBinder.java index b4f6061..b519bac 100644 --- a/src/org/yaaic/irc/IRCBinder.java +++ b/src/org/yaaic/irc/IRCBinder.java @@ -24,6 +24,7 @@ import org.jibble.pircbot.IrcException; import org.jibble.pircbot.NickAlreadyInUseException; import org.yaaic.R; import org.yaaic.model.Broadcast; +import org.yaaic.model.Extra; import org.yaaic.model.Message; import org.yaaic.model.Server; import org.yaaic.model.ServerInfo; @@ -83,8 +84,8 @@ public class IRCBinder extends Binder server.setStatus(Status.DISCONNECTED); - Intent sIntent = new Intent(Broadcast.SERVER_UPDATE); - sIntent.putExtra(Broadcast.EXTRA_SERVER, server.getId()); + + Intent sIntent = Broadcast.createServerIntent(Broadcast.SERVER_UPDATE, server.getId()); service.sendBroadcast(sIntent); IRCConnection connection = getService().getConnection(server.getId()); @@ -103,9 +104,11 @@ public class IRCBinder extends Binder message.setIcon(R.drawable.error); server.getConversation(ServerInfo.DEFAULT_NAME).addMessage(message); - Intent cIntent = new Intent(Broadcast.CONVERSATION_MESSAGE); - cIntent.putExtra(Broadcast.EXTRA_SERVER, server.getId()); - cIntent.putExtra(Broadcast.EXTRA_CONVERSATION, ServerInfo.DEFAULT_NAME); + Intent cIntent = Broadcast.createConversationIntent( + Extra.CONVERSATION, + server.getId(), + ServerInfo.DEFAULT_NAME + ); service.sendBroadcast(cIntent); } } diff --git a/src/org/yaaic/receiver/ConversationReceiver.java b/src/org/yaaic/receiver/ConversationReceiver.java index bad1d4c..6eeb9a0 100644 --- a/src/org/yaaic/receiver/ConversationReceiver.java +++ b/src/org/yaaic/receiver/ConversationReceiver.java @@ -26,6 +26,7 @@ import android.content.Intent; import org.yaaic.listener.ConversationListener; import org.yaaic.model.Broadcast; +import org.yaaic.model.Extra; /** * A channel receiver for receiving channel updates @@ -60,7 +61,7 @@ public class ConversationReceiver extends BroadcastReceiver @Override public void onReceive(Context context, Intent intent) { - int serverId = intent.getExtras().getInt(Broadcast.EXTRA_SERVER); + int serverId = intent.getExtras().getInt(Extra.SERVER); if (serverId != this.serverId) { return; } @@ -68,11 +69,11 @@ public class ConversationReceiver extends BroadcastReceiver String action = intent.getAction(); if (action.equals(Broadcast.CONVERSATION_MESSAGE)) { - listener.onConversationMessage(intent.getExtras().getString(Broadcast.EXTRA_CONVERSATION)); + listener.onConversationMessage(intent.getExtras().getString(Extra.CONVERSATION)); } else if (action.equals(Broadcast.CONVERSATION_NEW)) { - listener.onNewConversation(intent.getExtras().getString(Broadcast.EXTRA_CONVERSATION)); + listener.onNewConversation(intent.getExtras().getString(Extra.CONVERSATION)); } else if (action.equals(Broadcast.CONVERSATION_REMOVE)) { - listener.onRemoveConversation(intent.getExtras().getString(Broadcast.EXTRA_CONVERSATION)); + listener.onRemoveConversation(intent.getExtras().getString(Extra.CONVERSATION)); } } From 3fdd18337365a04c7647814de3c2c89c22fc9c66 Mon Sep 17 00:00:00 2001 From: Sebastian Kaspari Date: Wed, 24 Mar 2010 19:46:49 +0100 Subject: [PATCH 09/20] IRCConnection: Use Broadcast helpers (Should be reviewed) --- src/org/yaaic/irc/IRCConnection.java | 225 +++++++++++++++++---------- 1 file changed, 141 insertions(+), 84 deletions(-) diff --git a/src/org/yaaic/irc/IRCConnection.java b/src/org/yaaic/irc/IRCConnection.java index 2115407..7ffc76c 100644 --- a/src/org/yaaic/irc/IRCConnection.java +++ b/src/org/yaaic/irc/IRCConnection.java @@ -141,9 +141,12 @@ public class IRCConnection extends PircBot message.setColor(Message.COLOR_GREEN); server.getConversation(ServerInfo.DEFAULT_NAME).addMessage(message); - Intent intent = new Intent(Broadcast.CONVERSATION_MESSAGE); - intent.putExtra(Broadcast.EXTRA_SERVER, server.getId()); - intent.putExtra(Broadcast.EXTRA_CONVERSATION, ServerInfo.DEFAULT_NAME); + Intent intent = Broadcast.createConversationIntent( + Broadcast.CONVERSATION_MESSAGE, + server.getId(), + ServerInfo.DEFAULT_NAME + ); + service.sendBroadcast(intent); } @@ -174,24 +177,30 @@ public class IRCConnection extends PircBot conversation = new Query(sender); server.addConversationl(conversation); conversation.addMessage(message); - - Intent intent = new Intent(Broadcast.CONVERSATION_NEW); - intent.putExtra(Broadcast.EXTRA_CONVERSATION, sender); - intent.putExtra(Broadcast.EXTRA_SERVER, server.getId()); + + Intent intent = Broadcast.createConversationIntent( + Broadcast.CONVERSATION_NEW, + server.getId(), + sender + ); service.sendBroadcast(intent); } else { - Intent intent = new Intent(Broadcast.CONVERSATION_MESSAGE); - intent.putExtra(Broadcast.EXTRA_SERVER, server.getId()); - intent.putExtra(Broadcast.EXTRA_CONVERSATION, sender); + Intent intent = Broadcast.createConversationIntent( + Broadcast.CONVERSATION_MESSAGE, + server.getId(), + sender + ); service.sendBroadcast(intent); } } else { // A action in a channel server.getConversation(target).addMessage(message); - Intent intent = new Intent(Broadcast.CONVERSATION_MESSAGE); - intent.putExtra(Broadcast.EXTRA_SERVER, server.getId()); - intent.putExtra(Broadcast.EXTRA_CONVERSATION, target); + Intent intent = Broadcast.createConversationIntent( + Broadcast.CONVERSATION_MESSAGE, + server.getId(), + target + ); service.sendBroadcast(intent); } } @@ -218,9 +227,12 @@ public class IRCConnection extends PircBot message.setColor(Message.COLOR_BLUE); server.getConversation(target).addMessage(message); - Intent intent = new Intent(Broadcast.CONVERSATION_MESSAGE); - intent.putExtra(Broadcast.EXTRA_SERVER, server.getId()); - intent.putExtra(Broadcast.EXTRA_CONVERSATION, target); + Intent intent = Broadcast.createConversationIntent( + Broadcast.CONVERSATION_MESSAGE, + server.getId(), + target + ); + service.sendBroadcast(intent); } @@ -237,9 +249,12 @@ public class IRCConnection extends PircBot message.setIcon(R.drawable.voice); server.getConversation(target).addMessage(message); - Intent intent = new Intent(Broadcast.CONVERSATION_MESSAGE); - intent.putExtra(Broadcast.EXTRA_SERVER, server.getId()); - intent.putExtra(Broadcast.EXTRA_CONVERSATION, target); + Intent intent = Broadcast.createConversationIntent( + Broadcast.CONVERSATION_MESSAGE, + server.getId(), + target + ); + service.sendBroadcast(intent); } @@ -256,18 +271,22 @@ public class IRCConnection extends PircBot Message message = new Message(sourceNick + " invites you into " + target); server.getConversation(server.getSelectedConversation()).addMessage(message); - Intent intent = new Intent(Broadcast.CONVERSATION_MESSAGE); - intent.putExtra(Broadcast.EXTRA_SERVER, server.getId()); - intent.putExtra(Broadcast.EXTRA_CONVERSATION, server.getSelectedConversation()); + Intent intent = Broadcast.createConversationIntent( + Broadcast.CONVERSATION_MESSAGE, + server.getId(), + server.getSelectedConversation() + ); service.sendBroadcast(intent); } else { // Someone is invited Message message = new Message(sourceNick + " invites " + targetNick + " into " + target); server.getConversation(target).addMessage(message); - Intent intent = new Intent(Broadcast.CONVERSATION_MESSAGE); - intent.putExtra(Broadcast.EXTRA_SERVER, server.getId()); - intent.putExtra(Broadcast.EXTRA_CONVERSATION, target); + Intent intent = Broadcast.createConversationIntent( + Broadcast.CONVERSATION_MESSAGE, + server.getId(), + target + ); service.sendBroadcast(intent); } } @@ -284,9 +303,11 @@ public class IRCConnection extends PircBot // We joined a new channel server.addConversationl(new Channel(target)); - Intent intent = new Intent(Broadcast.CONVERSATION_NEW); - intent.putExtra(Broadcast.EXTRA_CONVERSATION, target); - intent.putExtra(Broadcast.EXTRA_SERVER, server.getId()); + Intent intent = Broadcast.createConversationIntent( + Broadcast.CONVERSATION_NEW, + server.getId(), + target + ); service.sendBroadcast(intent); } else { Message message = new Message(sender + " joins"); @@ -294,9 +315,11 @@ public class IRCConnection extends PircBot message.setColor(Message.COLOR_GREEN); server.getConversation(target).addMessage(message); - Intent intent = new Intent(Broadcast.CONVERSATION_MESSAGE); - intent.putExtra(Broadcast.EXTRA_SERVER, server.getId()); - intent.putExtra(Broadcast.EXTRA_CONVERSATION, target); + Intent intent = Broadcast.createConversationIntent( + Broadcast.CONVERSATION_MESSAGE, + server.getId(), + target + ); service.sendBroadcast(intent); } } @@ -313,18 +336,22 @@ public class IRCConnection extends PircBot // We are kicked server.removeConversation(target); - Intent intent = new Intent(Broadcast.CONVERSATION_REMOVE); - intent.putExtra(Broadcast.EXTRA_SERVER, server.getId()); - intent.putExtra(Broadcast.EXTRA_CONVERSATION, target); + Intent intent = Broadcast.createConversationIntent( + Broadcast.CONVERSATION_REMOVE, + server.getId(), + target + ); service.sendBroadcast(intent); } else { Message message = new Message(kickerNick + " kicks " + recipientNick); message.setColor(Message.COLOR_GREEN); server.getConversation(target).addMessage(message); - Intent intent = new Intent(Broadcast.CONVERSATION_MESSAGE); - intent.putExtra(Broadcast.EXTRA_SERVER, server.getId()); - intent.putExtra(Broadcast.EXTRA_CONVERSATION, target); + Intent intent = Broadcast.createConversationIntent( + Broadcast.CONVERSATION_MESSAGE, + server.getId(), + target + ); service.sendBroadcast(intent); } } @@ -349,9 +376,11 @@ public class IRCConnection extends PircBot server.getConversation(target).addMessage(message); - Intent intent = new Intent(Broadcast.CONVERSATION_MESSAGE); - intent.putExtra(Broadcast.EXTRA_SERVER, server.getId()); - intent.putExtra(Broadcast.EXTRA_CONVERSATION, target); + Intent intent = Broadcast.createConversationIntent( + Broadcast.CONVERSATION_MESSAGE, + server.getId(), + target + ); service.sendBroadcast(intent); } @@ -387,9 +416,11 @@ public class IRCConnection extends PircBot message.setColor(Message.COLOR_GREEN); server.getConversation(target).addMessage(message); - Intent intent = new Intent(Broadcast.CONVERSATION_MESSAGE); - intent.putExtra(Broadcast.EXTRA_SERVER, server.getId()); - intent.putExtra(Broadcast.EXTRA_CONVERSATION, target); + Intent intent = Broadcast.createConversationIntent( + Broadcast.CONVERSATION_MESSAGE, + server.getId(), + target + ); service.sendBroadcast(intent); } } @@ -417,9 +448,11 @@ public class IRCConnection extends PircBot message.setIcon(R.drawable.info); conversation.addMessage(message); - Intent intent = new Intent(Broadcast.CONVERSATION_MESSAGE); - intent.putExtra(Broadcast.EXTRA_SERVER, server.getId()); - intent.putExtra(Broadcast.EXTRA_CONVERSATION, conversation.getName()); + Intent intent = Broadcast.createConversationIntent( + Broadcast.CONVERSATION_MESSAGE, + server.getId(), + conversation.getName() + ); service.sendBroadcast(intent); } @@ -436,9 +469,11 @@ public class IRCConnection extends PircBot message.setIcon(R.drawable.op); server.getConversation(target).addMessage(message); - Intent intent = new Intent(Broadcast.CONVERSATION_MESSAGE); - intent.putExtra(Broadcast.EXTRA_SERVER, server.getId()); - intent.putExtra(Broadcast.EXTRA_CONVERSATION, target); + Intent intent = Broadcast.createConversationIntent( + Broadcast.CONVERSATION_MESSAGE, + server.getId(), + target + ); service.sendBroadcast(intent); } @@ -454,9 +489,11 @@ public class IRCConnection extends PircBot // We parted a channel server.removeConversation(target); - Intent intent = new Intent(Broadcast.CONVERSATION_REMOVE); - intent.putExtra(Broadcast.EXTRA_SERVER, server.getId()); - intent.putExtra(Broadcast.EXTRA_CONVERSATION, target); + Intent intent = Broadcast.createConversationIntent( + Broadcast.CONVERSATION_REMOVE, + server.getId(), + target + ); service.sendBroadcast(intent); } else { Message message = new Message(sender + " parts"); @@ -464,9 +501,11 @@ public class IRCConnection extends PircBot message.setIcon(R.drawable.part); server.getConversation(target).addMessage(message); - Intent intent = new Intent(Broadcast.CONVERSATION_MESSAGE); - intent.putExtra(Broadcast.EXTRA_SERVER, server.getId()); - intent.putExtra(Broadcast.EXTRA_CONVERSATION, target); + Intent intent = Broadcast.createConversationIntent( + Broadcast.CONVERSATION_MESSAGE, + server.getId(), + target + ); service.sendBroadcast(intent); } } @@ -496,16 +535,20 @@ public class IRCConnection extends PircBot conversation.addMessage(message); server.addConversationl(conversation); - Intent intent = new Intent(Broadcast.CONVERSATION_NEW); - intent.putExtra(Broadcast.EXTRA_CONVERSATION, sender); - intent.putExtra(Broadcast.EXTRA_SERVER, server.getId()); + Intent intent = Broadcast.createConversationIntent( + Broadcast.CONVERSATION_NEW, + server.getId(), + sender + ); service.sendBroadcast(intent); } else { conversation.addMessage(message); - Intent intent = new Intent(Broadcast.CONVERSATION_MESSAGE); - intent.putExtra(Broadcast.EXTRA_SERVER, server.getId()); - intent.putExtra(Broadcast.EXTRA_CONVERSATION, sender); + Intent intent = Broadcast.createConversationIntent( + Broadcast.CONVERSATION_MESSAGE, + server.getId(), + sender + ); service.sendBroadcast(intent); } } @@ -525,9 +568,11 @@ public class IRCConnection extends PircBot message.setIcon(R.drawable.quit); server.getConversation(target).addMessage(message); - Intent intent = new Intent(Broadcast.CONVERSATION_MESSAGE); - intent.putExtra(Broadcast.EXTRA_SERVER, server.getId()); - intent.putExtra(Broadcast.EXTRA_CONVERSATION, target); + Intent intent = Broadcast.createConversationIntent( + Broadcast.CONVERSATION_MESSAGE, + server.getId(), + target + ); service.sendBroadcast(intent); } @@ -540,9 +585,11 @@ public class IRCConnection extends PircBot message.setIcon(R.drawable.quit); conversation.addMessage(message); - Intent intent = new Intent(Broadcast.CONVERSATION_MESSAGE); - intent.putExtra(Broadcast.EXTRA_SERVER, server.getId()); - intent.putExtra(Broadcast.EXTRA_CONVERSATION, conversation.getName()); + Intent intent = Broadcast.createConversationIntent( + Broadcast.CONVERSATION_MESSAGE, + server.getId(), + conversation.getName() + ); service.sendBroadcast(intent); } @@ -575,9 +622,11 @@ public class IRCConnection extends PircBot // remember channel's topic ((Channel) server.getConversation(target)).setTopic(topic); - Intent intent = new Intent(Broadcast.CONVERSATION_MESSAGE); - intent.putExtra(Broadcast.EXTRA_SERVER, server.getId()); - intent.putExtra(Broadcast.EXTRA_CONVERSATION, target); + Intent intent = Broadcast.createConversationIntent( + Broadcast.CONVERSATION_MESSAGE, + server.getId(), + target + ); service.sendBroadcast(intent); } @@ -605,9 +654,11 @@ public class IRCConnection extends PircBot message.setColor(Message.COLOR_BLUE); server.getConversation(target).addMessage(message); - Intent intent = new Intent(Broadcast.CONVERSATION_MESSAGE); - intent.putExtra(Broadcast.EXTRA_SERVER, server.getId()); - intent.putExtra(Broadcast.EXTRA_CONVERSATION, target); + Intent intent = Broadcast.createConversationIntent( + Broadcast.CONVERSATION_MESSAGE, + server.getId(), + target + ); service.sendBroadcast(intent); } @@ -930,9 +981,11 @@ public class IRCConnection extends PircBot message.setColor(Message.COLOR_GREY); server.getConversation(ServerInfo.DEFAULT_NAME).addMessage(message); - Intent intent = new Intent(Broadcast.CONVERSATION_MESSAGE); - intent.putExtra(Broadcast.EXTRA_SERVER, server.getId()); - intent.putExtra(Broadcast.EXTRA_CONVERSATION, ServerInfo.DEFAULT_NAME); + Intent intent = Broadcast.createConversationIntent( + Broadcast.CONVERSATION_MESSAGE, + server.getId(), + ServerInfo.DEFAULT_NAME + ); service.sendBroadcast(intent); } @@ -968,9 +1021,11 @@ public class IRCConnection extends PircBot message.setColor(Message.COLOR_GREY); server.getConversation(ServerInfo.DEFAULT_NAME).addMessage(message); - Intent intent = new Intent(Broadcast.CONVERSATION_MESSAGE); - intent.putExtra(Broadcast.EXTRA_SERVER, server.getId()); - intent.putExtra(Broadcast.EXTRA_CONVERSATION, ServerInfo.DEFAULT_NAME); + Intent intent = Broadcast.createConversationIntent( + Broadcast.CONVERSATION_MESSAGE, + server.getId(), + ServerInfo.DEFAULT_NAME + ); service.sendBroadcast(intent); } @@ -981,8 +1036,8 @@ public class IRCConnection extends PircBot public void onDisconnect() { server.setStatus(Status.DISCONNECTED); - Intent sIntent = new Intent(Broadcast.SERVER_UPDATE); - sIntent.putExtra(Broadcast.EXTRA_SERVER, server.getId()); + + Intent sIntent = Broadcast.createServerIntent(Broadcast.SERVER_UPDATE, server.getId()); service.sendBroadcast(sIntent); Message message = new Message("Disconnected"); @@ -990,9 +1045,11 @@ public class IRCConnection extends PircBot message.setColor(Message.COLOR_RED); server.getConversation(ServerInfo.DEFAULT_NAME).addMessage(message); - Intent cIntent = new Intent(Broadcast.CONVERSATION_MESSAGE); - cIntent.putExtra(Broadcast.EXTRA_SERVER, server.getId()); - cIntent.putExtra(Broadcast.EXTRA_CONVERSATION, ServerInfo.DEFAULT_NAME); + Intent cIntent = Broadcast.createConversationIntent( + Broadcast.CONVERSATION_MESSAGE, + server.getId(), + ServerInfo.DEFAULT_NAME + ); service.sendBroadcast(cIntent); } From 507b3b422be8dd36bf5d31196821dacd4d934102 Mon Sep 17 00:00:00 2001 From: Sebastian Kaspari Date: Wed, 24 Mar 2010 21:06:23 +0100 Subject: [PATCH 10/20] CommandParser: Splitted handling of client/server/unknown commands --- src/org/yaaic/command/CommandParser.java | 151 +++++++++++++++-------- 1 file changed, 102 insertions(+), 49 deletions(-) diff --git a/src/org/yaaic/command/CommandParser.java b/src/org/yaaic/command/CommandParser.java index 4e10fc4..81b0f1f 100644 --- a/src/org/yaaic/command/CommandParser.java +++ b/src/org/yaaic/command/CommandParser.java @@ -108,14 +108,106 @@ public class CommandParser } /** - * Is the given command a valid command? + * Is the given command a valid client command? * - * @param command - * @return + * @param command The (client) command to check (/command) + * @return true if the command can be handled by the client, false otherwise */ - public boolean isCommand(String command) + public boolean isClientCommand(String command) { - return commands.containsKey(command); + return commands.containsKey(command.toLowerCase()); + } + + /** + * Is the given command a valid server command? + * + * @param command The (server) command to check (/command) + * @return true if the command can be handled by a server, false otherwise + */ + public boolean isServerCommand(String command) + { + // XXX: Implement white list + return true; + } + + /** + * Handle a client command + * + * @param type Type of the command (/type param1 param2 ..) + * @param params The parameters of the command (0 is the command itself) + * @param server The current server + * @param conversation The selected conversation + * @param service The service handling the connections + */ + public void handleClientCommand(String type, String[] params, Server server, Conversation conversation, IRCService service) + { + BaseHandler command = commands.get(type); + try { + command.execute(params, server, conversation, service); + } catch(CommandException e) { + // Command could not be executed + if (conversation != null) { + Message errorMessage = new Message(type + ": " + e.getMessage()); + errorMessage.setColor(Message.COLOR_RED); + conversation.addMessage(errorMessage); + + Message usageMessage = new Message("Syntax: " + command.getUsage()); + conversation.addMessage(usageMessage); + + Intent intent = Broadcast.createConversationIntent( + Broadcast.CONVERSATION_MESSAGE, + server.getId(), + conversation.getName() + ); + + service.sendBroadcast(intent); + } + } + } + + /** + * Handle a server command + * + * @param type Type of the command (/type param1 param2 ..) + * @param params The parameters of the command (0 is the command itself) + * @param server The current server + * @param conversation The selected conversation + * @param service The service handling the connections + */ + public void handleServerCommand(String type, String[] params, Server server, Conversation conversation, IRCService service) + { + if (params.length > 1) { + service.getConnection(server.getId()).sendRawLineViaQueue( + type.toUpperCase() + " " + BaseHandler.mergeParams(params) + ); + } else { + service.getConnection(server.getId()).sendRawLineViaQueue(type.toUpperCase()); + } + } + + /** + * Handle an unknown command + * + * @param type Type of the command (/type param1 param2 ..) + * @param server The current server + * @param conversation The selected conversation + * @param service The service handling the connections + */ + public void handleUnknownCommand(String type, Server server, Conversation conversation, IRCService service) + { + if (conversation != null) { + Message message = new Message("Unknown command: " + type); + message.setColor(Message.COLOR_RED); + conversation.addMessage(message); + + Intent intent = Broadcast.createConversationIntent( + Broadcast.CONVERSATION_MESSAGE, + server.getId(), + conversation.getName() + ); + + service.sendBroadcast(intent); + } } /** @@ -129,51 +221,12 @@ public class CommandParser String[] params = line.split(" "); String type = params[0]; - if (isCommand(type)) { - BaseHandler command = commands.get(type); - try { - command.execute(params, server, conversation, service); - } catch(CommandException e) { - // Wrong number of params - if (conversation != null) { - Message errorMessage = new Message(type + ": " + e.getMessage()); - errorMessage.setColor(Message.COLOR_RED); - conversation.addMessage(errorMessage); - - Message usageMessage = new Message("Syntax: " + command.getUsage()); - conversation.addMessage(usageMessage); - - Intent intent = Broadcast.createConversationIntent( - Broadcast.CONVERSATION_MESSAGE, - server.getId(), - conversation.getName() - ); - - service.sendBroadcast(intent); - } - } + if (isClientCommand(type)) { + handleClientCommand(type, params, server, conversation, service); + } else if (isServerCommand(type)) { + handleServerCommand(type, params, server, conversation, service); } else { - // Unknown command - if (params.length > 1) { - // Send command to server - service.getConnection(server.getId()).sendRawLineViaQueue( - params[0].toUpperCase() + " " + BaseHandler.mergeParams(params) - ); - } else { - if (conversation != null) { - Message message = new Message("Unknown command: " + type); - message.setColor(Message.COLOR_RED); - conversation.addMessage(message); - - Intent intent = Broadcast.createConversationIntent( - Broadcast.CONVERSATION_MESSAGE, - server.getId(), - conversation.getName() - ); - - service.sendBroadcast(intent); - } - } + handleUnknownCommand(type, server, conversation, service); } } } From 9efeb5b8af5f72d5906277550dbf50010dd8a67c Mon Sep 17 00:00:00 2001 From: Sebastian Kaspari Date: Wed, 24 Mar 2010 21:17:12 +0100 Subject: [PATCH 11/20] CommandParser: Implemented server commands whitelist --- src/org/yaaic/command/CommandParser.java | 22 ++++++++++++++++++---- 1 file changed, 18 insertions(+), 4 deletions(-) diff --git a/src/org/yaaic/command/CommandParser.java b/src/org/yaaic/command/CommandParser.java index 81b0f1f..b326ce0 100644 --- a/src/org/yaaic/command/CommandParser.java +++ b/src/org/yaaic/command/CommandParser.java @@ -22,6 +22,8 @@ package org.yaaic.command; import java.util.HashMap; +import android.content.Intent; + import org.yaaic.command.handler.CloseHandler; import org.yaaic.command.handler.DCCHandler; import org.yaaic.command.handler.DeopHandler; @@ -47,8 +49,6 @@ import org.yaaic.model.Conversation; import org.yaaic.model.Message; import org.yaaic.model.Server; -import android.content.Intent; - /** * Parser for commands * @@ -60,6 +60,14 @@ public class CommandParser private HashMap commands; private static CommandParser instance; + + private final static String[] serverCommands = { + "admin", "motd", "version", "away", "knock", "rules", + "vhost", "credits", "license", "setname", "watch", "pong", + "cycle", "links", "silence", "who", "dalinfo", "userhost", + "list", "stats", "whois", "invite", "lusers", "ping", + "time", "whowas", "ison", "map", + }; /** * Create a new CommandParser instance @@ -126,8 +134,14 @@ public class CommandParser */ public boolean isServerCommand(String command) { - // XXX: Implement white list - return true; + command = command.toLowerCase(); + for (String validCommand : serverCommands) { + if (validCommand.equals(command)) { + return true; + } + } + + return false; } /** From 13dde9ed0338b3efcb8b54b5e01584e242cea3aa Mon Sep 17 00:00:00 2001 From: Sebastian Kaspari Date: Wed, 24 Mar 2010 21:55:41 +0100 Subject: [PATCH 12/20] Imports --- src/org/yaaic/Yaaic.java | 2 -- src/org/yaaic/irc/IRCService.java | 1 - src/org/yaaic/view/ServersActivity.java | 2 -- 3 files changed, 5 deletions(-) diff --git a/src/org/yaaic/Yaaic.java b/src/org/yaaic/Yaaic.java index 4f59a99..f07bb94 100644 --- a/src/org/yaaic/Yaaic.java +++ b/src/org/yaaic/Yaaic.java @@ -24,11 +24,9 @@ import java.util.ArrayList; import java.util.HashMap; import org.yaaic.db.Database; -import org.yaaic.model.Broadcast; import org.yaaic.model.Server; import android.content.Context; -import android.content.Intent; /** * Global Master Class :) diff --git a/src/org/yaaic/irc/IRCService.java b/src/org/yaaic/irc/IRCService.java index e4ea423..ade4e74 100644 --- a/src/org/yaaic/irc/IRCService.java +++ b/src/org/yaaic/irc/IRCService.java @@ -24,7 +24,6 @@ import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import java.util.ArrayList; import java.util.HashMap; -import java.util.Set; import org.yaaic.R; import org.yaaic.Yaaic; diff --git a/src/org/yaaic/view/ServersActivity.java b/src/org/yaaic/view/ServersActivity.java index d7ee4471..3d7ad46 100644 --- a/src/org/yaaic/view/ServersActivity.java +++ b/src/org/yaaic/view/ServersActivity.java @@ -43,8 +43,6 @@ import org.yaaic.R; import org.yaaic.Yaaic; import org.yaaic.adapter.ServerListAdapter; import org.yaaic.db.Database; -import org.yaaic.irc.IRCBinder; -import org.yaaic.irc.IRCService; import org.yaaic.layout.NonScalingBackgroundDrawable; import org.yaaic.listener.ServerListener; import org.yaaic.model.Broadcast; From 4c5ba9a620b0ee1006ffa8a7adf0a3132ee08678 Mon Sep 17 00:00:00 2001 From: Sebastian Kaspari Date: Fri, 26 Mar 2010 19:03:43 +0100 Subject: [PATCH 13/20] NamesHandler: Use broadcast type: CONVERSATION_MESSAGE --- src/org/yaaic/command/handler/NamesHandler.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/org/yaaic/command/handler/NamesHandler.java b/src/org/yaaic/command/handler/NamesHandler.java index 4d546ba..4c94e3a 100644 --- a/src/org/yaaic/command/handler/NamesHandler.java +++ b/src/org/yaaic/command/handler/NamesHandler.java @@ -61,7 +61,7 @@ public class NamesHandler extends BaseHandler conversation.addMessage(message); Intent intent = Broadcast.createConversationIntent( - Broadcast.CONVERSATION_REMOVE, + Broadcast.CONVERSATION_MESSAGE, server.getId(), conversation.getName() ); From f25d68f101b8dc32ff1caca17ae0c4289a353aa7 Mon Sep 17 00:00:00 2001 From: Sebastian Kaspari Date: Fri, 26 Mar 2010 19:05:55 +0100 Subject: [PATCH 14/20] IRCBinder: Use broadcast type: CONVERSATION_MESSAGE --- src/org/yaaic/irc/IRCBinder.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/org/yaaic/irc/IRCBinder.java b/src/org/yaaic/irc/IRCBinder.java index b519bac..d8feead 100644 --- a/src/org/yaaic/irc/IRCBinder.java +++ b/src/org/yaaic/irc/IRCBinder.java @@ -105,7 +105,7 @@ public class IRCBinder extends Binder server.getConversation(ServerInfo.DEFAULT_NAME).addMessage(message); Intent cIntent = Broadcast.createConversationIntent( - Extra.CONVERSATION, + Broadcast.CONVERSATION_MESSAGE, server.getId(), ServerInfo.DEFAULT_NAME ); From e4db5e012f6bf59e4555376cf89f638776e025dd Mon Sep 17 00:00:00 2001 From: Sebastian Kaspari Date: Fri, 26 Mar 2010 19:06:59 +0100 Subject: [PATCH 15/20] EchoHandler: Use broadcast type: CONVERSATION_MESSAGE --- src/org/yaaic/command/handler/EchoHandler.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/org/yaaic/command/handler/EchoHandler.java b/src/org/yaaic/command/handler/EchoHandler.java index 007a1c1..d22558e 100644 --- a/src/org/yaaic/command/handler/EchoHandler.java +++ b/src/org/yaaic/command/handler/EchoHandler.java @@ -48,7 +48,7 @@ public class EchoHandler extends BaseHandler conversation.addMessage(message); Intent intent = Broadcast.createConversationIntent( - Broadcast.CONVERSATION_REMOVE, + Broadcast.CONVERSATION_MESSAGE, server.getId(), conversation.getName() ); From 9e3886394438b7b486ff18449697ba0f894b213d Mon Sep 17 00:00:00 2001 From: Sebastian Kaspari Date: Fri, 26 Mar 2010 19:07:31 +0100 Subject: [PATCH 16/20] MeHandler: Use broadcast type: CONVERSATION_MESSAGE --- src/org/yaaic/command/handler/MeHandler.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/org/yaaic/command/handler/MeHandler.java b/src/org/yaaic/command/handler/MeHandler.java index 2f1f5b4..8319f39 100644 --- a/src/org/yaaic/command/handler/MeHandler.java +++ b/src/org/yaaic/command/handler/MeHandler.java @@ -57,7 +57,7 @@ public class MeHandler extends BaseHandler server.getConversation(conversation.getName()).addMessage(message); Intent intent = Broadcast.createConversationIntent( - Broadcast.CONVERSATION_REMOVE, + Broadcast.CONVERSATION_MESSAGE, server.getId(), conversation.getName() ); From 782755465919dfa303f3e9a180722e96c97a595e Mon Sep 17 00:00:00 2001 From: Sebastian Kaspari Date: Fri, 26 Mar 2010 19:08:00 +0100 Subject: [PATCH 17/20] NoticeHandler: Use broadcast type: CONVERSATION_MESSAGE --- src/org/yaaic/command/handler/NoticeHandler.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/org/yaaic/command/handler/NoticeHandler.java b/src/org/yaaic/command/handler/NoticeHandler.java index 82a91fb..269bbda 100644 --- a/src/org/yaaic/command/handler/NoticeHandler.java +++ b/src/org/yaaic/command/handler/NoticeHandler.java @@ -54,7 +54,7 @@ public class NoticeHandler extends BaseHandler conversation.addMessage(message); Intent intent = Broadcast.createConversationIntent( - Broadcast.CONVERSATION_REMOVE, + Broadcast.CONVERSATION_MESSAGE, server.getId(), conversation.getName() ); From 2cf955ab8af0b3a439a1cd4a3dffcb3adc7cc6a7 Mon Sep 17 00:00:00 2001 From: Sebastian Kaspari Date: Fri, 26 Mar 2010 19:08:28 +0100 Subject: [PATCH 18/20] QueryHandler: Use broadcast type: CONVERSATION_MESSAGE --- src/org/yaaic/command/handler/QueryHandler.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/org/yaaic/command/handler/QueryHandler.java b/src/org/yaaic/command/handler/QueryHandler.java index 96540ff..3b9ccfd 100644 --- a/src/org/yaaic/command/handler/QueryHandler.java +++ b/src/org/yaaic/command/handler/QueryHandler.java @@ -60,7 +60,7 @@ public class QueryHandler extends BaseHandler server.addConversationl(new Query(params[1])); Intent intent = Broadcast.createConversationIntent( - Broadcast.CONVERSATION_REMOVE, + Broadcast.CONVERSATION_MESSAGE, server.getId(), conversation.getName() ); From f628af987b133199f56a3c89b13e74be7f76a5a7 Mon Sep 17 00:00:00 2001 From: Sebastian Kaspari Date: Sat, 27 Mar 2010 11:10:28 +0100 Subject: [PATCH 19/20] Imports --- src/org/yaaic/irc/IRCBinder.java | 1 - 1 file changed, 1 deletion(-) diff --git a/src/org/yaaic/irc/IRCBinder.java b/src/org/yaaic/irc/IRCBinder.java index d8feead..a4faf0f 100644 --- a/src/org/yaaic/irc/IRCBinder.java +++ b/src/org/yaaic/irc/IRCBinder.java @@ -24,7 +24,6 @@ import org.jibble.pircbot.IrcException; import org.jibble.pircbot.NickAlreadyInUseException; import org.yaaic.R; import org.yaaic.model.Broadcast; -import org.yaaic.model.Extra; import org.yaaic.model.Message; import org.yaaic.model.Server; import org.yaaic.model.ServerInfo; From 5fc8788a19abc675be9e7fa363361cefeaa7d980 Mon Sep 17 00:00:00 2001 From: Sebastian Kaspari Date: Mon, 29 Mar 2010 21:48:23 +0200 Subject: [PATCH 20/20] Persistent service if connected to a server --- src/org/yaaic/irc/IRCService.java | 56 +++++++++++++------- src/org/yaaic/view/ConversationActivity.java | 1 + src/org/yaaic/view/ServersActivity.java | 25 ++++----- 3 files changed, 50 insertions(+), 32 deletions(-) diff --git a/src/org/yaaic/irc/IRCService.java b/src/org/yaaic/irc/IRCService.java index ade4e74..f2a3140 100644 --- a/src/org/yaaic/irc/IRCService.java +++ b/src/org/yaaic/irc/IRCService.java @@ -27,6 +27,8 @@ import java.util.HashMap; import org.yaaic.R; import org.yaaic.Yaaic; +import org.yaaic.db.Database; +import org.yaaic.model.Broadcast; import org.yaaic.model.Server; import org.yaaic.view.ServersActivity; @@ -48,11 +50,15 @@ public class IRCService extends Service private IRCBinder binder; private HashMap connections; + private boolean foreground = false; @SuppressWarnings("unchecked") private static final Class[] mStartForegroundSignature = new Class[] { int.class, Notification.class }; @SuppressWarnings("unchecked") private static final Class[] mStopForegroundSignature = new Class[] { boolean.class }; + + public static final String ACTION_FOREGROUND = "org.yaaic.service.foreground"; + public static final String ACTION_BACKGROUND = "org.yaaic.service.background"; private NotificationManager mNM; private Method mStartForeground; @@ -90,14 +96,12 @@ public class IRCService extends Service } // Load servers from Database - /* Database db = new Database(this); Yaaic.getInstance().setServers(db.getServers()); db.close(); - */ // Broadcast changed server list - //sendBroadcast(new Intent(Broadcast.SERVER_UPDATE)); + sendBroadcast(new Intent(Broadcast.SERVER_UPDATE)); } /** @@ -107,6 +111,8 @@ public class IRCService extends Service @Override public void onStart(Intent intent, int startId) { + Log.d(TAG, "Service onStart()"); + handleCommand(intent); } @@ -120,6 +126,8 @@ public class IRCService extends Service */ public int onStartCommand(Intent intent, int flags, int startId) { + Log.d(TAG, "Service onStartCommand()"); + handleCommand(intent); // We want this service to continue running until it is explicitly @@ -136,17 +144,25 @@ public class IRCService extends Service */ private void handleCommand(Intent intent) { - // Set the icon, scrolling text and timestamp - Notification notification = new Notification(R.drawable.icon, "Mama", System.currentTimeMillis()); - - // The PendingIntent to launch our activity if the user selects this notification - PendingIntent contentIntent = PendingIntent.getActivity(this, 0, new Intent(this, ServersActivity.class), 0); - - // Set the info for the views that show in the notification panel. - notification.setLatestEventInfo(this, getText(R.string.app_name), "Papa", contentIntent); - - startForegroundCompat(R.string.app_name, notification); + if (ACTION_FOREGROUND.equals(intent.getAction())) { + foreground = true; + + // Set the icon, scrolling text and timestamp + Notification notification = new Notification(R.drawable.icon, "Connected", System.currentTimeMillis()); + + // The PendingIntent to launch our activity if the user selects this notification + PendingIntent contentIntent = PendingIntent.getActivity(this, 0, new Intent(this, ServersActivity.class), 0); + + // Set the info for the views that show in the notification panel. + notification.setLatestEventInfo(this, getText(R.string.app_name), "Connected", contentIntent); + + startForegroundCompat(R.string.app_name, notification); + } else if (ACTION_BACKGROUND.equals(intent.getAction()) && !foreground) { + stopForegroundCompat(R.string.app_name); + } } + + /** * This is a wrapper around the new startForeground method, using the older @@ -176,7 +192,8 @@ public class IRCService extends Service * This is a wrapper around the new stopForeground method, using the older * APIs if it is not available. */ - private void stopForegroundCompat(int id) { + private void stopForegroundCompat(int id) + { // If we have the new stopForeground API, then use it. if (mStopForeground != null) { mStopForegroundArgs[0] = Boolean.TRUE; @@ -213,19 +230,17 @@ public class IRCService extends Service return connection; } + /** + * Check status of service + */ public void checkServiceStatus() { - Log.d("Yaaic", "(1)"); - boolean shutDown = true; ArrayList mServers = Yaaic.getInstance().getServersAsArrayList(); int mSize = mServers.size(); Server server; - Log.d("Yaaic", "(2)"); - for (int i = 0; i < mSize; i++) { - Log.d("Yaaic", " (3)"); server = mServers.get(i); if (server.isDisconnected()) { connections.remove(server.getId()); @@ -235,12 +250,13 @@ public class IRCService extends Service } if (shutDown) { + foreground = false; stopSelf(); } } /** - * + * On Destroy */ @Override public void onDestroy() diff --git a/src/org/yaaic/view/ConversationActivity.java b/src/org/yaaic/view/ConversationActivity.java index e44c0b1..8eefdfc 100644 --- a/src/org/yaaic/view/ConversationActivity.java +++ b/src/org/yaaic/view/ConversationActivity.java @@ -125,6 +125,7 @@ public class ConversationActivity extends Activity implements ServiceConnection, // Start service Intent intent = new Intent(this, IRCService.class); + intent.setAction(IRCService.ACTION_FOREGROUND); startService(intent); bindService(intent, this, 0); diff --git a/src/org/yaaic/view/ServersActivity.java b/src/org/yaaic/view/ServersActivity.java index 3d7ad46..1d7d3b4 100644 --- a/src/org/yaaic/view/ServersActivity.java +++ b/src/org/yaaic/view/ServersActivity.java @@ -43,6 +43,8 @@ import org.yaaic.R; import org.yaaic.Yaaic; import org.yaaic.adapter.ServerListAdapter; import org.yaaic.db.Database; +import org.yaaic.irc.IRCBinder; +import org.yaaic.irc.IRCService; import org.yaaic.layout.NonScalingBackgroundDrawable; import org.yaaic.listener.ServerListener; import org.yaaic.model.Broadcast; @@ -58,7 +60,7 @@ import org.yaaic.receiver.ServerReceiver; public class ServersActivity extends ListActivity implements ServiceConnection, ServerListener, OnItemLongClickListener { public static final String TAG = "Yaaic/ServersActivity"; - //private IRCBinder binder; + private IRCBinder binder; private ServerReceiver receiver; private ServerListAdapter adapter; @@ -71,8 +73,6 @@ public class ServersActivity extends ListActivity implements ServiceConnection, super.onCreate(savedInstanceState); setContentView(R.layout.servers); - Yaaic.getInstance().loadServers(this); - adapter = new ServerListAdapter(); setListAdapter(adapter); @@ -89,9 +89,10 @@ public class ServersActivity extends ListActivity implements ServiceConnection, super.onResume(); // Start and connect to service - //Intent intent = new Intent(this, IRCService.class); - //startService(intent); - //bindService(intent, this, 0); + Intent intent = new Intent(this, IRCService.class); + intent.setAction(IRCService.ACTION_BACKGROUND); + startService(intent); + bindService(intent, this, 0); receiver = new ServerReceiver(this); registerReceiver(receiver, new IntentFilter(Broadcast.SERVER_UPDATE)); @@ -107,7 +108,7 @@ public class ServersActivity extends ListActivity implements ServiceConnection, { super.onPause(); - //unbindService(this); + unbindService(this); unregisterReceiver(receiver); } @@ -116,7 +117,7 @@ public class ServersActivity extends ListActivity implements ServiceConnection, */ public void onServiceConnected(ComponentName name, IBinder service) { - //binder = (IRCBinder) service; + binder = (IRCBinder) service; } /** @@ -124,7 +125,7 @@ public class ServersActivity extends ListActivity implements ServiceConnection, */ public void onServiceDisconnected(ComponentName name) { - //binder = null; + binder = null; } /** @@ -165,19 +166,19 @@ public class ServersActivity extends ListActivity implements ServiceConnection, public void onClick(DialogInterface dialog, int item) { switch (item) { case 0: // Connect - //binder.connect(server); + binder.connect(server); server.setStatus(Status.CONNECTING); adapter.notifyDataSetChanged(); break; case 1: // Disconnect server.clearConversations(); - //binder.getService().getConnection(server.getId()).quitServer(); + binder.getService().getConnection(server.getId()).quitServer(); break; case 2: // Edit editServer(server.getId()); break; case 3: // Delete - //binder.getService().getConnection(server.getId()).quitServer(); + binder.getService().getConnection(server.getId()).quitServer(); deleteServer(server.getId()); break; }