Fix logout - Logs all users out when you logout.

Change-Id: I377c216bdbf106d911fe1f03755f033d8b48305d
diff --git a/src/com/google/gct/login/CredentialedUserRoster.java b/src/com/google/gct/login/CredentialedUserRoster.java
index d8936fb..21aa574 100644
--- a/src/com/google/gct/login/CredentialedUserRoster.java
+++ b/src/com/google/gct/login/CredentialedUserRoster.java
@@ -163,6 +163,18 @@
   }
 
   /**
+   * Removes all logged in users. There is no active user after this.
+   */
+  public void removeAllUsers() {
+    synchronized (this) {
+      myAllUsers.clear();
+      myActiveUser = null;
+      GoogleLoginPrefs.removeAllUsers();
+      notifyLoginStatusChange();
+    }
+  }
+
+  /**
    * Register a specified {@link GoogleLoginListener} to be notified of changes to the
    * logged-in state.
    *
diff --git a/src/com/google/gct/login/GoogleLogin.java b/src/com/google/gct/login/GoogleLogin.java
index 1a1bcd3..e7969ed 100644
--- a/src/com/google/gct/login/GoogleLogin.java
+++ b/src/com/google/gct/login/GoogleLogin.java
@@ -383,8 +383,9 @@
   }
 
   /**
-   * Logs the user out. Pops up a question dialog asking if the user really
-   * wants to quit.
+   * Logs out the active user by popping up a question dialog asking if the active user really
+   * wants to quit. If the active user chooses to sign out, signs out the active user and all other
+   * signed in users.
    *
    * @return true if the user logged out, false otherwise
    */
@@ -394,16 +395,16 @@
       return false;
     }
 
-    boolean loggedOut =  activeUser.getGoogleLoginState().logOut();
+    boolean loggedOut = activeUser.getGoogleLoginState().logOut();
     if(loggedOut) {
-      users.removeUser(activeUser.getEmail());
+      logOutAllUsers();
     }
 
     return loggedOut;
   }
 
   /**
-   * Logs the user out.
+   * Logs out the active user and all other signed in users.
    *
    * @param showPrompt if true, opens a prompt asking if the user really wants
    *          to log out. If false, the user is logged out
@@ -415,7 +416,13 @@
     if (activeUser == null) {
       return false;
     }
-    return activeUser.getGoogleLoginState().logOut(showPrompt);
+
+    boolean loggedOut = activeUser.getGoogleLoginState().logOut(showPrompt);
+    if(loggedOut) {
+      logOutAllUsers();
+    }
+
+    return loggedOut;
   }
 
   /**
@@ -434,16 +441,6 @@
   }
 
   /**
-   * Logs out the active user.
-   */
-  // TODO: Hook this into the shutdown process of IntelliJ
-  public void stop() {
-    if (GoogleLoginPrefs.getLogoutOnExitPref()) {
-      logOut(false);
-    }
-  }
-
-  /**
    * Sets the active user to <code>userEmail</code> if <code>userEmail</code> is a logged
    * in user.
    * @param userEmail The user to be set as active.
@@ -484,6 +481,16 @@
   }
 
   /**
+   * Logs out all signed in users without popping up logout confirmation message.
+   */
+  private void logOutAllUsers() {
+    for (CredentialedUser aUser : users.getAllUsers().values()) {
+      aUser.getGoogleLoginState().logOut(false /* showPrompt */);
+    }
+    users.removeAllUsers();
+  }
+
+  /**
    * Gets all the implementations of  {@link GoogleLoginListener} and registers them to
    * <code>state</code>.
    */
@@ -638,15 +645,7 @@
     public boolean askYesOrNo(String title, String message) {
       String updatedMessage = message;
       if (message.equals("Are you sure you want to sign out?")) {
-        updatedMessage = "Are you sure you want to sign out";
-        CredentialedUser activeUser = getActiveUser();
-        if (activeUser != null && !Strings.isNullOrEmpty(activeUser.getName())) {
-          updatedMessage += (" " + activeUser.getName());
-        }
-        if (activeUser != null && !Strings.isNullOrEmpty(activeUser.getEmail())) {
-          updatedMessage += (" (" + activeUser.getEmail() + ")");
-        }
-        updatedMessage += "?";
+        updatedMessage += " This will sign out all logged in users.";
       }
       return (Messages.showYesNoDialog(updatedMessage, title, GoogleLoginIcons.GOOGLE_FAVICON) == Messages.YES);
     }
diff --git a/src/com/google/gct/login/GoogleLoginPrefs.java b/src/com/google/gct/login/GoogleLoginPrefs.java
index 0c9afd0..46bad4e 100644
--- a/src/com/google/gct/login/GoogleLoginPrefs.java
+++ b/src/com/google/gct/login/GoogleLoginPrefs.java
@@ -183,6 +183,16 @@
   }
 
   /**
+   * Clears all persistently stored users. There is no active user after this.
+   */
+  public static void removeAllUsers() {
+    Preferences prefs = getPrefs();
+    prefs.remove(USERS);
+    prefs.remove(ACTIVE_USER);
+    flushPrefs(prefs);
+  }
+
+  /**
    * Retrieves the persistently stored active user.
    * @return the stored active user.
    */
diff --git a/testSrc/com/google/gct/login/CredentialedUserRosterTest.java b/testSrc/com/google/gct/login/CredentialedUserRosterTest.java
index 471409b..23a2c7f 100644
--- a/testSrc/com/google/gct/login/CredentialedUserRosterTest.java
+++ b/testSrc/com/google/gct/login/CredentialedUserRosterTest.java
@@ -238,4 +238,23 @@
     Assert.assertTrue(setUsers.containsKey(user2.getEmail()));
     Assert.assertTrue(setUsers.containsKey(user3.getEmail()));
   }
+
+  /**
+   * Tests {@link com.google.gct.login.CredentialedUserRoster#removeAllUsers()}
+   */
+  public void testRemoveAllUsers() {
+    Assert.assertEquals(0, users.numberOfUsers());
+
+    users.addUser(user1);
+    users.removeAllUsers();
+    Assert.assertEquals(0, users.numberOfUsers());
+    Assert.assertEquals(null, users.getActiveUser());
+
+    users.addUser(user1);
+    users.addUser(user2);
+    users.addUser(user3);
+    users.removeAllUsers();
+    Assert.assertEquals(0, users.numberOfUsers());
+    Assert.assertEquals(null, users.getActiveUser());
+  }
 }