Skip to content

Commit

Permalink
Refactor, cleanup and optimization of UserCollection
Browse files Browse the repository at this point in the history
  • Loading branch information
mollerse committed Jul 8, 2012
1 parent bfe1c01 commit 47c6d95
Show file tree
Hide file tree
Showing 4 changed files with 153 additions and 126 deletions.
10 changes: 5 additions & 5 deletions src/com/iskrembilen/quasseldroid/IrcMode.java
Expand Up @@ -14,12 +14,12 @@ public enum IrcMode {
* Declare in order of rank, this way values() will naturally * Declare in order of rank, this way values() will naturally
* return the different modes based on rank * return the different modes based on rank
*/ */
OWNER ("Owner","q", "(s)", R.drawable.irc_operator), OWNER ("Owner","q", "s", R.drawable.irc_operator),
ADMIN ("Admin","a", "(s)", R.drawable.irc_operator), ADMIN ("Admin","a", "s", R.drawable.irc_operator),
OPERATOR ("Operator","o", "(s)", R.drawable.irc_operator), OPERATOR ("Operator","o", "s", R.drawable.irc_operator),
HALF_OPERATOR ("Half-Op","h", "(s)", R.drawable.irc_voice), HALF_OPERATOR ("Half-Op","h", "s", R.drawable.irc_voice),
VOICE ("Voiced","v", "", R.drawable.irc_voice), VOICE ("Voiced","v", "", R.drawable.irc_voice),
USER ("User","", "(s)", R.drawable.im_user); //This will work as a catch-all for unknown modes USER ("User","", "s", R.drawable.im_user); //This will work as a catch-all for unknown modes


public final String modeName; public final String modeName;
public final String shortModeName; public final String shortModeName;
Expand Down
4 changes: 2 additions & 2 deletions src/com/iskrembilen/quasseldroid/Network.java
Expand Up @@ -171,7 +171,7 @@ public void onUserQuit(String nick) {
if(user.nick.equals(nick)) { if(user.nick.equals(nick)) {
for(Buffer buffer : buffers.getRawBufferList()) { for(Buffer buffer : buffers.getRawBufferList()) {
if(user.channels.contains(buffer.getInfo().name)) { if(user.channels.contains(buffer.getInfo().name)) {
buffer.getUsers().removeUserWithNick(nick); buffer.getUsers().removeUserByNick(nick);
} }
} }
userList.remove(user); userList.remove(user);
Expand All @@ -191,7 +191,7 @@ public void onUserParted(String nick, String bufferName) {
} }
for(Buffer buffer : buffers.getRawBufferList()) { for(Buffer buffer : buffers.getRawBufferList()) {
if(buffer.getInfo().name.equalsIgnoreCase(bufferName)) { if(buffer.getInfo().name.equalsIgnoreCase(bufferName)) {
buffer.getUsers().removeUserWithNick(nick); buffer.getUsers().removeUserByNick(nick);
if(nick.equalsIgnoreCase(getNick())) { if(nick.equalsIgnoreCase(getNick())) {
buffer.setActive(false); buffer.setActive(false);
} }
Expand Down
263 changes: 145 additions & 118 deletions src/com/iskrembilen/quasseldroid/UserCollection.java
Expand Up @@ -20,102 +20,187 @@ public UserCollection() {
} }
} }


public void removeUserWithNick(String nick) { public void addUser(IrcUser user, String modes) {
for(IrcMode mode: IrcMode.values()){
if(modes.contains(mode.shortModeName)){
try{
addUserToModeList(mode, user);
//Log.e(TAG, "Mode "+mode.modeName+" added to user "+user.nick+".");
} catch (IllegalArgumentException e){
Log.e(TAG, e.getMessage());
}
}
}
updateUniqueUsersSortedByMode();
notifyObservers(R.id.BUFFERUPDATE_USERSCHANGED);
user.addObserver(this);

}

public void addUsers(ArrayList<Pair<IrcUser, String>> usersWithModes) {
for(Pair<IrcUser, String> user: usersWithModes) {
for(IrcMode mode: IrcMode.values()){
if(user.second.contains(mode.shortModeName)){
try{
addUserToModeList(mode, user.first);
//Log.e(TAG, "Mode "+mode.modeName+" added to user "+user.first.nick+".");
} catch (IllegalArgumentException e){
//Log.e(TAG, e.getMessage());
}
}
}
user.first.addObserver(this);
}
updateUniqueUsersSortedByMode();
notifyObservers(R.id.BUFFERUPDATE_USERSCHANGED);
}

private void addUserToModeList(IrcMode mode, IrcUser user) {
if(users.get(mode).contains(user)){
throw new IllegalArgumentException("User "+user.nick+" is already in this list.");
}else{
users.get(mode).add(user);
Collections.sort(users.get(mode));
this.setChanged();
}
}

public void removeUser(IrcUser user) {
for(IrcMode mode: IrcMode.values()){ for(IrcMode mode: IrcMode.values()){
try{ try{
removeUserWithNickFromModeList(mode, nick); removeUserFromModeList(mode, user);
//Log.e(TAG, "Mode "+mode.modeName+" was removed from user "+nick+"."); //Log.e(TAG, "Mode "+mode.modeName+" was removed from user "+nick+".");
} catch(IllegalArgumentException e) { } catch(IllegalArgumentException e) {
//Log.e(TAG, e.getMessage()); //Log.e(TAG, e.getMessage());
} }
} }
findUniqueUsersSortedByMode();
notifyObservers(R.id.BUFFERUPDATE_USERSCHANGED); notifyObservers(R.id.BUFFERUPDATE_USERSCHANGED);
} }


private void removeUserWithNickFromModeList(IrcMode mode, String nick) { public void removeUsers(ArrayList<IrcUser> users) {
boolean found = false; for(IrcUser user: users){
IrcUser userToRemove = null; for(IrcMode mode: IrcMode.values()){
for(IrcUser user : users.get(mode)) { try{
if(user.nick.equals(nick) && users.get(mode).contains(user)) { removeUserFromModeList(mode, user);
found = true; //Log.e(TAG, "Mode "+mode.modeName+" was removed from user "+nick+".");
userToRemove = user; } catch(IllegalArgumentException e) {
break; //Log.e(TAG, e.getMessage());
}
} }
} }
if(found) { notifyObservers(R.id.BUFFERUPDATE_USERSCHANGED);
users.get(mode).remove(userToRemove); }
uniqueUsers.get(mode).remove(userToRemove);
this.setChanged(); public void removeUserByNick(String nick) {
for(IrcMode mode: IrcMode.values()){
try{
for(IrcUser user: users.get(mode)){
if(user.nick.equals(nick)){
removeUserFromModeList(mode, user);
//Log.e(TAG, "Mode "+mode.modeName+" was removed from user "+nick+".");
break;
}
}
} catch(IllegalArgumentException e) {
//Log.e(TAG, e.getMessage());
}
} }
notifyObservers(R.id.BUFFERUPDATE_USERSCHANGED);
} }


private void removeUserFromModeList(List<IrcUser> list, IrcUser user){ public void removeUsersByNick(ArrayList<String> nicks) {
if(list.remove(user)){ for(String nick: nicks){
for(IrcMode mode: IrcMode.values()){
try{
for(IrcUser user: users.get(mode)){
if(user.nick.equals(nick)){
removeUserFromModeList(mode, user);
//Log.e(TAG, "Mode "+mode.modeName+" was removed from user "+nick+".");
break;
}
}
} catch(IllegalArgumentException e) {
//Log.e(TAG, e.getMessage());
}
}
}
notifyObservers(R.id.BUFFERUPDATE_USERSCHANGED);

}

private void removeUserFromModeList(IrcMode mode, IrcUser user){
if(users.get(mode).remove(user)){
uniqueUsers.get(mode).remove(user);
this.setChanged(); this.setChanged();
}else{ }else{
throw new IllegalArgumentException("User "+user.nick+" was not found."); throw new IllegalArgumentException("User "+user.nick+" was not found.");
} }
} }
public void addUser(IrcUser user, String modes) {
for(IrcMode mode: IrcMode.values()){ public void addModeToUser(IrcUser user, String mode) {
if(modes.contains(mode.shortModeName)){ for(IrcMode ircMode: IrcMode.values()){
if(mode.equals(ircMode.shortModeName)){
try{ try{
addUserToModeList(users.get(mode), user); addUserToModeList(ircMode, user);
//Log.e(TAG, "Mode "+mode.modeName+" added to user "+user.nick+"."); //Log.e(TAG, "Mode " + ircMode.modeName + " added to user " + user.nick);
break;
} catch (IllegalArgumentException e){ } catch (IllegalArgumentException e){
Log.e(TAG, e.getMessage()); //Log.e(TAG, e.getMessage());
} }
} }
} }
findUniqueUsersSortedByMode(); updateUniqueUsersSortedByMode();
notifyObservers(R.id.BUFFERUPDATE_USERSCHANGED); notifyObservers(R.id.BUFFERUPDATE_USERSCHANGED);
user.addObserver(this);

} }
public void addUsers(ArrayList<Pair<IrcUser, String>> usersToAdd) {
for(Pair<IrcUser, String> user: usersToAdd) { public void removeModeFromUser(IrcUser user, String mode) {
for(IrcMode mode: IrcMode.values()){ if(mode.equals("")){
if(user.second.contains(mode.shortModeName)){ throw new IllegalArgumentException("Cannot remove empty mode from user.");
try{ }
addUserToModeList(users.get(mode), user.first); for(IrcMode ircMode: IrcMode.values()){
//Log.e(TAG, "Mode "+mode.modeName+" added to user "+user.first.nick+"."); if(mode.equals(ircMode.shortModeName)){
} catch (IllegalArgumentException e){ try{
Log.e(TAG, e.getMessage()); removeUserFromModeList(ircMode,user);
} //Log.e(TAG, "Mode " + ircMode.modeName + " removed from user " + user.nick+".");
break;

} catch (IllegalArgumentException e){
//Log.e(TAG, e.getMessage());
} }
} }
user.first.addObserver(this);
} }
findUniqueUsersSortedByMode(); updateUniqueUsersSortedByMode();
notifyObservers(R.id.BUFFERUPDATE_USERSCHANGED); notifyObservers(R.id.BUFFERUPDATE_USERSCHANGED);
} }


private void addUserToModeList(List<IrcUser> list, IrcUser user) { public ArrayList<IrcUser> getUniqueUsers(){
if(list.contains(user)){ /*
throw new IllegalArgumentException("User "+user.nick+" is already in this list."); * Because IrcMode.values() starts at the first declaration and moves down,
}else{ * we can be sure that users get added to the list with the highest ranking mode first.
list.add(user); */
Collections.sort(list); ArrayList<IrcUser> uniqueUsers = new ArrayList<IrcUser>();
this.setChanged(); for(IrcMode mode: IrcMode.values()){
for(IrcUser user: users.get(mode)){
if(!uniqueUsers.contains(user)){
uniqueUsers.add(user);
}
}
} }
return uniqueUsers;
} }


public Map<IrcMode,ArrayList<IrcUser>> getUsers() { public ArrayList<IrcUser> getUniqueUsersWithMode(IrcMode mode) {
return users; return uniqueUsers.get(mode);
}

public ArrayList<IrcUser> getUsersWithMode(IrcMode mode){
return users.get(mode);
} }


private void findUniqueUsersSortedByMode(){ private void updateUniqueUsersSortedByMode(){
/* /*
* Because IrcMode.values() starts at the first declaration and moves down, * Because IrcMode.values() starts at the first declaration and moves down,
* we can be sure that users get added to the list with the highest ranking mode first. * we can be sure that users get added to the list with the highest ranking mode first.
*/ */
for(IrcMode mode: IrcMode.values()){ for(IrcMode mode: IrcMode.values()){
for(IrcUser user: users.get(mode)){ for(IrcUser user: users.get(mode)){
//Log.e(TAG, "Checking user "+user.nick+" for mode "+mode.modeName+".");
if(!isIrcUserAlreadyAddedWithAHigherRankingMode(mode, user)){ if(!isIrcUserAlreadyAddedWithAHigherRankingMode(mode, user)){
//Log.e(TAG, "Adding unique user "+user.nick+" with mode "+mode.modeName+"."); //Log.e(TAG, "Adding unique user "+user.nick+" with mode "+mode.modeName+".");
uniqueUsers.get(mode).add(user); uniqueUsers.get(mode).add(user);
Expand All @@ -133,9 +218,13 @@ private boolean isIrcUserAlreadyAddedWithAHigherRankingMode(IrcMode currentMode,
found = true; found = true;
break; break;
} }
if(mode==currentMode){
break;
}
} }
return found; return found;
} }

private void removeUserFromLowerRankingMode(IrcMode hasMode, IrcUser user) { private void removeUserFromLowerRankingMode(IrcMode hasMode, IrcUser user) {
boolean lowerRank = false; boolean lowerRank = false;
for(IrcMode mode: IrcMode.values()) { for(IrcMode mode: IrcMode.values()) {
Expand All @@ -148,78 +237,16 @@ private void removeUserFromLowerRankingMode(IrcMode hasMode, IrcUser user) {
} }
} }


public ArrayList<IrcUser> getUniqueUsers(){
/*
* Because IrcMode.values() starts at the first declaration and moves down,
* we can be sure that users get added to the list with the highest ranking mode first.
*/
ArrayList<IrcUser> uniqueUsers = new ArrayList<IrcUser>();
for(IrcMode mode: IrcMode.values()){
for(IrcUser user: users.get(mode)){
if(!uniqueUsers.contains(user)){
uniqueUsers.add(user);
}
}
}
return uniqueUsers;
}

public ArrayList<IrcUser> getUniqueUsersWithMode(IrcMode mode) {
return uniqueUsers.get(mode);
}

public int getUserCount() {
//All users have the mode IrcMode.USER
return users.get(IrcMode.USER).size();
}

@Override @Override
public void update(Observable observable, Object data) { public void update(Observable observable, Object data) {
for(IrcMode mode: IrcMode.values()){ for(IrcMode mode: IrcMode.values()){
if(users.get(mode).contains(observable)){ if(users.get(mode).contains(observable)){
Collections.sort(users.get(mode)); Collections.sort(users.get(mode));
if(uniqueUsers.get(mode).contains(observable))Collections.sort(uniqueUsers.get(mode));
this.setChanged(); this.setChanged();
} }
} }
findUniqueUsersSortedByMode();
notifyObservers(R.id.BUFFERUPDATE_USERSCHANGED); notifyObservers(R.id.BUFFERUPDATE_USERSCHANGED);


} }

public void addUserMode(IrcUser user, String mode) {
for(IrcMode ircMode: IrcMode.values()){
if(mode.equals(ircMode.shortModeName)){
try{
addUserToModeList(users.get(ircMode), user);
//Log.e(TAG, "Mode " + ircMode.modeName + " added to user " + user.nick);
break;
} catch (IllegalArgumentException e){
Log.e(TAG, e.getMessage());
}
}
}
findUniqueUsersSortedByMode();
notifyObservers(R.id.BUFFERUPDATE_USERSCHANGED);
}

public void removeModeFromUser(IrcUser user, String mode) {
if(mode.equals("")){
throw new IllegalArgumentException("Cannot remove empty mode from user.");
}
for(IrcMode ircMode: IrcMode.values()){
if(mode.equals(ircMode.shortModeName)){
try{
removeUserFromModeList(users.get(ircMode),user);
uniqueUsers.get(ircMode).remove(user);
//Log.e(TAG, "Mode " + ircMode.modeName + " removed from user " + user.nick+".");
break;

} catch (IllegalArgumentException e){
//Log.e(TAG, e.getMessage());
}
}
}
findUniqueUsersSortedByMode();
notifyObservers(R.id.BUFFERUPDATE_USERSCHANGED);
}
} }
Expand Up @@ -794,7 +794,7 @@ public void handleMessage(Message msg) {
user = networks.getNetworkById(msg.arg1).getUserByNick(bundle.getString("nick")); user = networks.getNetworkById(msg.arg1).getUserByNick(bundle.getString("nick"));
for(Buffer buf : networks.getNetworkById(msg.arg1).getBuffers().getRawBufferList()) { for(Buffer buf : networks.getNetworkById(msg.arg1).getBuffers().getRawBufferList()) {
if(buf.getInfo().name.equals(bufferName)) { if(buf.getInfo().name.equals(bufferName)) {
buf.getUsers().addUserMode(user, bundle.getString("mode")); buf.getUsers().addModeToUser(user, bundle.getString("mode"));
break; break;
} }
} }
Expand Down

0 comments on commit 47c6d95

Please sign in to comment.