summaryrefslogtreecommitdiff
path: root/login/src/com/google/gct/login/Users.java
blob: eff21e3acfff205d9553382b3d123308ef1c16a2 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
/*
 * Copyright (C) 2014 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package com.google.gct.login;

import java.util.HashMap;
import java.util.Map;

/**
 * Manages the list of logged in users.
 */
public class Users {
  private final Map<String, User> allUsers = new HashMap<String, User>();
  private User activeUser;

  /**
   * Returns a copy of the map of the current logged in users.
   * @return Copy of current logged in users.
   */
  public Map<String, User> getAllUsers() {
    synchronized (this) {
      Map<String, User> clone = new HashMap<String, User>();
      clone.putAll(allUsers);
      return clone;
    }
  }

  /**
   * Completely overrides current map of logged in users with <code>users</code>.
   * @param users Map of users to set.
   */
  public void setAllUsers(Map<String, User> users) {
    synchronized (this) {
      allUsers.clear();
      allUsers.putAll(users);
    }
  }

  /**
   * Returns the active user.
   * @return the active user.
   */
  public User getActiveUser() {
    synchronized (this) {
      return activeUser;
    }
  }

  /**
   * 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.
   * @return Returns true if <code>userEmail</code> was successfully set as the active user.
   * Returns false, if <code>userEmail</code> is not a logged in user.
   */
  public boolean setActiveUser(String userEmail) {
    synchronized (this) {
      if(!allUsers.containsKey(userEmail)) {
        return false;
      }

      if(activeUser != null) {
        activeUser.setActive(false);
      }

      activeUser = allUsers.get(userEmail);
      activeUser.setActive(true);
      // TODO: Send message out of changed user
      return true;
    }
  }

  /**
   * Returns the number of logged in users.
   * @return Number of logged in users.
   */
  public int numberOfUsers() {
    synchronized (this) {
      return allUsers.size();
    }
  }

  /**
   * Returns true if there is an active user and false otherwise.
   * @return True if there is an active user and false otherwise.
   */
  public boolean isActiveUserAvailable() {
    synchronized (this) {
      return activeUser != null;
    }
  }

  /**
   * Adds a user to the list of current users.
   * The <code>user</code> becomes the active user.
   * @param user
   * @return
   */
  public boolean addUser(User user) {
    synchronized (this) {
      if(allUsers.containsKey(user.getEmail())) {
        return false;
      }

      allUsers.put(user.getEmail(), user);
      setActiveUser(user.getEmail());

      return true;
    }
  }

  /**
   * Remove <code>userEmail</code> from the list of logged in users if <code>userEmail</code> is
   * a logged in user. If <code>userEmail</code> is the active user, there would no longer be
   * an active user once <code>userEmail</code> is removed. Another user will have to explicitly
   * selected for there to be an active user again.
   * @param userEmail The user to be removed.
   * @return  True if <code>userEmail</code> was successfully removed from the list of
   * logged in users and false if <code>userEmail</code> is not a logged in user.
   */
  public boolean removeUser(String userEmail) {
    synchronized (this) {
      if(!allUsers.containsKey(userEmail)) {
        return false;
      }

      if(activeUser.getEmail().equals(userEmail)) {
        activeUser = null;
        // TODO: Send message out of changed user
      }

      allUsers.remove(userEmail);
      return true;
    }
  }

  /**
   * Clears the map of logged in users.
   */
  public void removeAllUsers(){
    synchronized (this) {
      allUsers.clear();
      activeUser = null;
      // TODO: Send message out of changed user
    }
  }
}