Skip to content

UML Diagram

mauliksamit edited this page Mar 31, 2025 · 43 revisions
classDiagram
    %% Use direction to organize the diagram
    direction TB
    
    %% Group 1: Model Classes
    %% Group 1: Model Classes
class MoodEvent {
    -String id
    -String title
    -Date timestamp
    -String reason
    -Map~String, Object~ geoInfo
    -DocumentReference participantRef
    -EmotionalState emotionalState
    -SocialSituation socialSituation
    -String trigger

    + MoodEvent()
    + MoodEvent(String title, String reason, EmotionalState emotionalState, DocumentReference participantRef)
    + Date getTimestamp()
    + void setTimestamp(Date timestamp)
    + String getTitle()
    + void setTitle(String title)
    + String getReason()
    + void setReason(String reason)
    + EmotionalState getEmotionalState()
    + void setEmotionalState(EmotionalState emotionalState)
    + String getId()
    + void setId(String id)
    + DocumentReference getParticipantRef()
    + void setParticipantRef(DocumentReference participantRef)
    + SocialSituation getSocialSituation()
    + void setSocialSituation(SocialSituation socialSituation)
    + String getAttachedImage()
    + void setAttachedImage(String attachedImage)
    + Map<String, Object> getGeoInfo()
    + void setGeoInfo(Map<String, Object> geoInfo)
    + String getTrigger()
    + void setTrigger(String trigger)
    + Map<String, Object> generateGeoInfo(Location location)
    + int compareTo(MoodEvent event)
}

class EmotionalState {
    <<enumeration>>
    NONE
    HAPPY
    SAD
    ANGRY
    ANXIOUS
    NEUTRAL
    CONFUSED
    FEARFUL
    SHAMEFUL
    SURPRISED
}

class SocialSituation {
    <<enumeration>>
    NONE
    ALONE
    WITH_ONE_OTHER_PERSON
    WITH_TWO_TO_SEVERAL_PEOPLE
    WITH_FAMILY
    WITH_FRIENDS
    WITH_COWORKERS
    WITH_STRANGERS

    +toString() String
    +capitalizeFully() String
}

class Participant {
    -String username
    -String email
    -String firstName
    -String lastName
    -String profilePicture
    -List~String~ followers
    -List~String~ following

    + Participant()
    + Participant(String username, String email, String firstName, String lastName)
    + String getUsername()
    + void setUsername(String username)
    + String getEmail()
    + void setEmail(String email)
    + String getFirstName()
    + void setFirstName(String firstName)
    + String getLastName()
    + void setLastName(String lastName)
    + List<String> getFollowers()
    + void setFollowers(List<String> followers)
    + List<String> getFollowing()
    + void setFollowing(List<String> following)
    + String getProfilePicture()
    + void setProfilePicture(String profilePicture)
}

class FollowRequest {
    -String fromUsername
    -String status
    -Timestamp timestamp

    +FollowRequest()
    +FollowRequest(String fromUsername)
    +String getFromUsername()
    +void setFromUsername(String fromUsername)
    +String getStatus()
    +void setStatus(String status)
    +RequestStatus getStatusEnum()
    +void setStatusEnum(RequestStatus status)
    +Timestamp getTimestamp()
    +void setTimestamp(Timestamp timestamp)
    +Map~String, Object~ toMap()
}

class FollowRequest.RequestStatus {
    <<enumeration>>
    PENDING
    ACCEPTED
    DECLINED

    +String getValue()
    +static RequestStatus fromString(String value)
}

class Comment {
    -String id
    -DocumentReference participantRef
    -Date timestamp
    -String text

    +Comment()
    +Comment(DocumentReference participantRef, String text)
    +String getId()
    +void setId(String id)
    +Date getTimestamp()
    +void setTimestamp(Date timestamp)
    +String getText()
    +void setText(String text)
    +DocumentReference getParticipantRef()
    +void setParticipantRef(DocumentReference participantRef)
    +int compareTo(Comment o)
    +String toString()
}

class Notification {
    -String type
    -String senderUsername
    -String recipientUsername
    -String title
    -String message
    -long timestamp
    -boolean read

    +Notification()
    +Notification(String type, String senderUsername, String recipientUsername, String title, String message, long timestamp, boolean read)
    +static Notification createFollowRequestNotification(String senderUsername, String recipientUsername)
    +Map~String, Object~ toMap()
    +String getType()
    +void setType(String type)
    +String getSenderUsername()
    +void setSenderUsername(String senderUsername)
    +String getRecipientUsername()
    +void setRecipientUsername(String recipientUsername)
    +String getTitle()
    +void setTitle(String title)
    +String getMessage()
    +void setMessage(String message)
    +long getTimestamp()
    +void setTimestamp(long timestamp)
    +boolean isRead()
    +void setRead(boolean read)
}

    %% Group 2: Repositories
    class MoodEventRepository {
        -FirebaseService firebaseService
        -String TAG
        +MoodEventRepository()
        -getMoodEventCollRef() CollectionReference
        +fetchEventsWithParticipantRef(DocumentReference participantRef, OnSuccessListener listener, OnFailureListener failureListener) void
        +listenForEventsWithParticipantRef(DocumentReference participantRef, OnSuccessListener listener, OnFailureListener failureListener) void
        +listenForEventsFromFollowing(String username, OnSuccessListener listener, OnFailureListener failureListener) void
        +addMoodEvent(MoodEvent moodEvent, OnSuccessListener listener, OnFailureListener failureListener) void
        +deleteMoodEvent(MoodEvent moodEvent, OnSuccessListener listener, OnFailureListener failureListener) void
        +updateMoodEvent(MoodEvent moodEvent, OnSuccessListener listener, OnFailureListener failureListener) void
    }

    class ParticipantRepository {
        -FirebaseService firebaseService
        +ParticipantRepository()
        -getParticipantCollRef() CollectionReference
        +fetchBaseParticipant(String username, OnSuccessListener listener, OnFailureListener failureListener) void
        +fetchParticipant(String username, OnSuccessListener listener, OnFailureListener failureListener) void
        +fetchParticipantByRef(DocumentReference participantRef, OnSuccessListener listener, OnFailureListener failureListener) void
        +getParticipantRef(String username) DocumentReference
        +fetchFollowersAndFollowing(Participant participant, OnSuccessListener listener, OnFailureListener failureListener) void
        +fetchFollowers(String username, OnSuccessListener listener, OnFailureListener failureListener) void
        +fetchFollowing(String username, OnSuccessListener listener, OnFailureListener failureListener) void
        +addParticipant(Participant participant, OnSuccessListener listener, OnFailureListener failureListener) void
        +addFollower(String username, String followerUsername, OnSuccessListener listener, OnFailureListener failureListener) void
        +addFollowing(String username, String followingUsername, OnSuccessListener listener, OnFailureListener failureListener) void
        +checkIfUsernameExists(String username, OnSuccessListener listener, OnFailureListener failureListener) void
        +checkIfAlreadyFollowed(String username, String followerUsername, OnSuccessListener listener, OnFailureListener failureListener) void
        +checkIfAlreadyFollowing(String username, String followingUsername, OnSuccessListener listener, OnFailureListener failureListener) void
    }
    class NotificationService {
    -static final String TAG
    -static final String COLLECTION_NOTIFICATIONS
    -static FirebaseService firebaseService

    -static synchronized FirebaseService getFirebaseService()
    +static void sendFollowRequestNotification(String senderUsername, String recipientUsername)
}

    %% Group 3: Services
    class FirebaseService {
        -Boolean ISINITIALIZED
        -FirebaseFirestore db
        +FirebaseService()
        +getDb() FirebaseFirestore
    }
    class FCMTokenManager {
        -static final String TAG
        -static final String COLLECTION_TOKENS
        -static FirebaseService firebaseService

        +static void saveTokenToFirestore(String username, String token)
        -static synchronized FirebaseService getFirebaseService()
    }

    class SentioFirebaseMessagingService {
        +void onMessageReceived(RemoteMessage message)
        +void onNewToken(String token)
        -void handleDataMessage(Map~String, String~ data)
        -void saveFCMTokenToFirestore(String token)
        -String getCurrentUsername()
    }

    %% Group 4: Adapters
    class MoodEventArrayAdapter {
    <<Abstract>>
    #Context context
    #ArrayList~MoodEvent~ events
    #FirebaseAuth mAuth
    #OnMoodEventClickListener clickListener
    +MoodEventArrayAdapter(Context context, ArrayList~MoodEvent~ events)
    +setOnMoodEventClickListener(OnMoodEventClickListener listener) void
}

class HomeMoodEventArrayAdapter {
    +HomeMoodEventArrayAdapter(Context context, ArrayList~MoodEvent~ events)
    +getView(int position, View convertView, ViewGroup parent) View
}

class HistoryMoodEventArrayAdapter {
    -Set~MoodEvent~ selectedEvents
    -String participantUsername
    +HistoryMoodEventArrayAdapter(Context context, ArrayList~MoodEvent~ events)
    +getView(int position, View convertView, ViewGroup parent) View
    +getSelectedEvents() Set~MoodEvent~
}

class EventDetailAdapter {
    -MoodEvent event
    -List~Comment~ comments
    -static ParticipantRepository participantRepository

    +EventDetailAdapter(MoodEvent, List<Comment>, ParticipantRepository)
    +int getItemCount()
    +int getItemViewType(int position)
    +void onBindViewHolder(RecyclerView.ViewHolder holder, int position)
    +RecyclerView.ViewHolder onCreateViewHolder(ViewGroup, int)
}

class FollowerAdapter {
    -List~Participant~ userList
    -OnUserInteractionListener listener
    -String listType

    +FollowerAdapter(List<Participant>, OnUserInteractionListener, String)
    +int getItemCount()
    +void onBindViewHolder(FollowerViewHolder, int)
    +FollowerViewHolder onCreateViewHolder(ViewGroup, int)
}

class FollowRequestAdapter {
    -List~FollowRequest~ requestsList
    -RequestActionListener listener
    -ParticipantRepository participantRepository

    +FollowRequestAdapter(List<FollowRequest>, RequestActionListener, ParticipantRepository)
    +int getItemCount()
    +void onBindViewHolder(RequestViewHolder, int)
    +RequestViewHolder onCreateViewHolder(ViewGroup, int)
}

class UserAdapter {
    -List~Participant~ userList
    -UserInteractionListener listener
    -ParticipantRepository participantRepository
    -String currentUsername
    -boolean showFollowButton

    +UserAdapter(List<Participant>, UserInteractionListener)
    +UserAdapter(List<Participant>, UserInteractionListener, boolean)
    +int getItemCount()
    +void onBindViewHolder(UserViewHolder, int)
    +UserViewHolder onCreateViewHolder(ViewGroup, int)
}

class OnMoodEventClickListener {
    <<interface>>
    +onMoodClickEvent(MoodEvent moodEvent) void
}

class OnUserInteractionListener {
    <<interface>>
    +onUserClick(Participant)
    +onRemoveClick(Participant, int)
}

class RequestActionListener {
    <<interface>>
    +onAccept(String, int)
    +onDecline(String, int)
}

class UserInteractionListener {
    <<interface>>
    +onFollowClick(Participant)
    +onUserClick(Participant)
}


    %% Group 5: Utils
    class EmotionUtils {
        -HashMap~EmotionalState, String~ emotionEmoticonMap
        +getEmoticon(EmotionalState emotion) String
        +getColorResource(EmotionalState emotion) int
    }

    class ImageHandler {
        +int MAXIMAGESIZE
        +float SCALEFACTOR
        +compressImageToBase64(Context context, Uri uri) String
        +compressBitmapToBase64(Bitmap bitmap) String
        -scaleBitmap(Bitmap bitmap) Bitmap
        +base64ToBitmap(String base64) Bitmap
    }

    class LocationHandler {
        -String TAG
        -LocationHandler instance
        -Context context
        -FusedLocationProviderClient fusedLocationProviderClient
        -Location lastLocation
        -LocationCallback locationCallback
        +getInstance(Context context) LocationHandler
        +requestLocationPermission(ActivityResultLauncher permissionLauncher) void
        +fetchUserLocation() void
        -requestLocationUpdates() void
        +getLastLocation() Location
        +stopLocationUpdates() void
    }

    class OnMoodEventClickListener {
        <<interface>>
        +onMoodClickEvent(MoodEvent moodEvent) void
    }
    class NotificationUtils {
        -static final String TAG
        -static final String CHANNEL_ID
        -static final String CHANNEL_NAME
        -static final String CHANNEL_DESCRIPTION
        -static final String EXTRA_NOTIFICATION_TYPE
        -static final String EXTRA_SENDER_USERNAME
        -static final String TYPE_FOLLOW_REQUEST

        +static void createNotificationChannels(Context context)
        +static void showNotification(Context context, String title, String message, PendingIntent pendingIntent, int notificationId)
   }

    class TimestampUtils {
        +static String transformTimestamp(Date timestamp)
   }

    %% Group 6: Activities
    class MainActivity {
    }

    class HomePage {
        -ActivityHomePageBinding binding
        -replaceFragment(Fragment fragment) void
        +selectHomeNavigation() void
    }

    class LoginPage {
        -LocationHandler locationHandler
        -ActivityResultLauncher~String~ locationPermissionLauncher
        -EditText emailEditText
        -EditText passwordEditText
        -FirebaseAuth mAuth
        -signInUser(String email, String password, OnSuccessListener listener, OnFailureListener failureListener) void
    }

    class SignupPage {
        -static final String TAG
        -static final int MIN_USERNAME_LENGTH
        -static final int MIN_PASSWORD_LENGTH
        -static final String USERNAME_PATTERN
        -EditText usernameEditText
        -EditText emailEditText
        -EditText passwordEditText
        -EditText firstNameEditText
        -EditText lastNameEditText
        -ProgressBar progressBar
        -Button signupButton
        -FirebaseAuth mAuth
        -ParticipantRepository participantRepository
        -initializeUI() void
        -setupListeners() void
        -attemptSignup() void
        -validateInputFields(String username, String email, String password, String firstName, String lastName) boolean
        -checkUsernameAvailability(String username, String email, String password, String firstName, String lastName) void
        -createUserAccount(String username, String email, String password, String firstName, String lastName) void
        -updateUserProfile(FirebaseUser user, String username, String firstName, String lastName, String email) void
        -saveUserToFirestore(String username, String email, String firstName, String lastName) void
        -saveToSharedPreferences(String username) void
        -goToHomePage() void
        -showLoading(boolean isLoading) void
    }

    %% Group 7: Fragments
    class HomeFragment {
        -ArrayList~MoodEvent~ moodEventArrayList
        -HomeMoodEventArrayAdapter moodEventArrayAdapter
        -MoodEventRepository moodEventRepository
        -FirebaseAuth mAuth
        -ListView moodEventListView
        -FloatingActionButton filterButton
        -ArrayList~MoodEvent~ allMoodEvents
        -boolean isFilteringByWeek
        -EmotionalState selectedEmotionalState
        -String searchKeyword
        -fetchMoodEvents() void
        -showMoodDetailsDialog(MoodEvent moodEvent) void
        -showFilterDialog() void
        -applyFilters() void
        -filterByRecentWeek(ArrayList~MoodEvent~ events) ArrayList~MoodEvent~
        -filterByEmotionalState(ArrayList~MoodEvent~ events, EmotionalState state) ArrayList~MoodEvent~
        -filterByKeyword(ArrayList~MoodEvent~ events, String keyword) ArrayList~MoodEvent~
        -resetFilters() void
    }

    class HistoryFragment {
        -ListView moodEventListView
        -ArrayList~MoodEvent~ moodEventArrayList
        -HistoryMoodEventArrayAdapter moodArrayAdapter
        -MoodEventRepository moodsRepo
        -ParticipantRepository userRepo
        -Set~MoodEvent~ selectedEvents
        -String username
        -DocumentReference participantRef
        -FloatingActionButton filterButton
        -ArrayList~MoodEvent~ allMoodEvents
        -boolean isFilteringByWeek
        -EmotionalState selectedEmotionalState
        -String searchKeyword
        -fetchParticipantAndLoadEvents() void
        -loadMoodEvents() void
        -showDeleteConfirmationDialog() void
        -deleteSelectedMoodEvents() void
        -showMoodDetailsDialog(MoodEvent moodEvent) void
        -showEditMoodDialog(MoodEvent moodEvent) void
        -showFilterDialog() void
        -applyFilters() void
        -filterByRecentWeek(ArrayList~MoodEvent~ events) ArrayList~MoodEvent~
        -filterByEmotionalState(ArrayList~MoodEvent~ events, EmotionalState state) ArrayList~MoodEvent~
        -filterByKeyword(ArrayList~MoodEvent~ events, String keyword) ArrayList~MoodEvent~
        -resetFilters() void
    }

    class ProfileFragment {
    -TextView usernameText
    -TextView followersCountText
    -TextView followingCountText
    -ImageView profileImageView
    -LinearLayout followersLayout
    -LinearLayout followingLayout
    -LinearLayout allRequestsLayout
    -RecyclerView requestsRecyclerView
    -View recentMoodEventView
    -TextView emptyRequestsText
    -TextView emptyMoodText
    -ImageView settingsButton
    -ParticipantRepository participantRepository
    -MoodEventRepository moodEventRepository
    -String currentUsername
    -ListenerRegistration participantListener
    -FollowRequestAdapter requestAdapter
    -List~FollowRequest~ requestsList
    -ArrayList~MoodEvent~ userMoodEvents
    +ProfileFragment()
    +static ProfileFragment newInstance()
    +onCreate(Bundle savedInstanceState) void
    +onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) View
    +onResume() void
    +onDestroy() void
    -setupFollowRequests() void
    -loadFollowRequests() void
    -updateRequestsVisibility() void
    -handleAcceptRequest(String requestorUsername, int position) void
    -handleDeclineRequest(String requestorUsername, int position) void
    -checkFollowRelationship(String requestorUsername) void
    -showFollowBackDialog(String username) void
    -sendFollowBackRequest(String username) void
    -loadRecentMoodEvent() void
    -updateRecentMoodEvent() void
    -navigateToEventDetail(MoodEvent moodEvent) void
    -setupParticipantListener() void
    -fetchParticipantData() void
    -updateUI(Participant participant) void
    -navigateToFollowersList(ParticipantRepository.ListType listType) void
    -navigateToFollowRequests() void
    -navigateToLogin() void
    }

    class SettingsFragment {
    -ImageButton profileChangeButton
    -ImageView sentioLogo
    -ParticipantRepository participantRepository
    -ImageView closeButton
    -String currentUsername
    -ActivityResultLauncher~Intent~ imagePickerLauncher
    -String imageBase64
    +onCreate(Bundle savedInstanceState) void
    +onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) View
    +onResume() void
    -loadProfilePicture() void
    -pickImage() void
    -registerImagePicker() void
    -updateProfilePicture(String base64Image) void
    +editName() void
    }
    class UserProfileFragment {
    -TextView usernameText
    -TextView followersCountText
    -TextView followingCountText
    -ImageView profileImageView
    -LinearLayout followersLayout
    -LinearLayout followingLayout
    -View recentMoodEventView
    -TextView emptyMoodText
    -TextView recentMoodHeader
    -Button followRequest
    -ParticipantRepository participantRepository
    -MoodEventRepository moodEventRepository
    -String currentUsername
    -String followedUsername
    -ListenerRegistration participantListener
    -ArrayList~MoodEvent~ userMoodEvents
    +UserProfileFragment()
    +static UserProfileFragment newInstance()
    +onCreate(Bundle savedInstanceState) void
    +onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) View
    +onResume() void
    +onDestroy() void
    -loadRecentMoodEvent() void
    -updateRecentMoodEvent() void
    -setupParticipantListener() void
    -fetchParticipantData() void
    -updateUI(Participant participant) void
    -navigateToFollowersList(ParticipantRepository.ListType listType) void
    -onFollowClickProfile(String username) void
    -updateFollowButtonState(String followedUser) void
    }

    class UserSearchFragment {
    -EditText searchEditText
    -RecyclerView userRecyclerView
    -ProgressBar progressBar
    -TextView emptyView
    -UserAdapter userAdapter
    -ParticipantRepository participantRepository
    -String currentUsername
    -List~Participant~ userList
    -AtomicBoolean isSearching
    -String usernameText
    -UserProfileFragment userProfileFragment
    +onCreate(Bundle savedInstanceState) void
    +onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) View
    +onPause() void
    -searchUsers(String query) void
    -updateEmptyView() void
    -onFollowClick(Participant participant) void
    -onUserClick(Participant participant) void
    -updateFollowButtonState(String username) void
    }
    
    class MapFragment {
        -FirebaseAuth mAuth
        -MoodEventRepository moodEventRepo
        -ParticipantRepository participantRepository
        -String username
        -GoogleMap mMap
        -Location userLocation
        -LatLng currentLocation
        -FloatingActionButton filterButton
        -boolean isFilteringByHistory
        -boolean isFilteringByFollow
        -boolean isFilteringByWeek
        -MoodEvent.EmotionalState selectedEmotionalState
        -String searchKeyword
        -ArrayList~MoodEvent~ moodEventsHistory
        -LocationHandler locationHandler
        -ActivityResultLauncher~String~ locationPermissionLauncher
        +MapFragment()
        +static MapFragment newInstance()
        +onCreate(Bundle savedInstanceState) void
        +onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) View
        +onMapReady(GoogleMap googleMap) void
        +onDestroyView() void
        +onAttach(Context context) void
        +onDetach() void
        -fetchSelfMoodEvents(OnSuccessListener~ArrayList~MoodEvent~~ onSuccessListener) void
        -fetchInRadiusMoodEventsFromFollowing(OnSuccessListener~Map~String, MoodEvent~~ onSuccessListener) void
        -doFetchInRadiusMoodEvents(Location currentLocation, OnSuccessListener~Map~String, MoodEvent~~ onSuccessListener) void
        -showFilterDialog() void
        -applyFilters(ArrayList~MoodEvent~ moodEvents) ArrayList~MoodEvent~
        -filterByRecentWeek(ArrayList~MoodEvent~ events) ArrayList~MoodEvent~
        -filterByEmotionalState(ArrayList~MoodEvent~ events, MoodEvent.EmotionalState state) ArrayList~MoodEvent~
        -filterByKeyword(ArrayList~MoodEvent~ events, String keyword) ArrayList~MoodEvent~
        -putMarkersOnMap(Map~String, MoodEvent~ eventsMap) void
        -putPersonalOnMap(ArrayList~MoodEvent~ eventsArray) void
        -putUserLocationOnMap() void
        -textAsBitmap(String text) Bitmap
    }

    class AddMoodEventFragment {
        -Spinner emotionalStateSpinner
        -Spinner socialSituationSpinner
        -EditText eventTitleEditText
        -EditText reasonEditText
        -EditText triggerEditText
        -CheckBox locationCheckbox
        -Button saveButton
        -MoodEventRepository moodEventRepository
        -ParticipantRepository participantRepository
        -LocationHandler locationHandler
        -ActivityResultLauncher~String~ requestPermissionLauncher
        -saveMoodEvent() void
        -getCurrentUsername() String
    } 

    class AnalyticsFragment {
        -List~MoodEvent~ moodEvents
        -TextView streakTextView
        -TextView longestStreakTextView
        -PieChart pieChart
        -BarChart barChart
        -LineChart lineChart
        -Map~String, Map~String, Integer~~ monthMoodMap
        -List~String~ sortedMonthKeys
        +AnalyticsFragment()
        +static AnalyticsFragment newInstance(List~MoodEvent~ events)
        +onCreate(Bundle savedInstanceState) void
        +onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) View
        -calculateStreak() void
        -calculateLongestStreak() void
        -drawPieChart() void
        -drawBarChart() void
        -drawLineChart() void
        -generatePieData() PieData
        -generateBarData() BarData
        -generateLineData() LineData
        -convertMonthKeysToMonthNames(String yearMonthKey) String
    }

    class EventDetail {
    -MoodEventRepository moodEventRepository
    -ParticipantRepository participantRepository
    -MoodEvent moodEvent
    -ImageView closeImage
    -RecyclerView eventRecyclerView
    -EventDetailAdapter eventDetailAdapter
    -FloatingActionButton addCommentButton
    +EventDetail()
    +static EventDetail newInstance(MoodEvent event)
    +onCreate(Bundle savedInstanceState) void
    +onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) View
    -launchAddCommentDialog() void
    -currentUserRef() DocumentReference
    -fetchComments() void
    }

    class FollowersListFragment {
    -String username
    -ParticipantRepository.ListType listType
    -TextView titleTextView
    -RecyclerView usersRecyclerView
    -EditText searchEditText
    -ProgressBar progressBar
    -TextView emptyView
    -List~Participant~ originalList
    -List~Participant~ filteredList
    -FollowerAdapter followerAdapter
    -ParticipantRepository participantRepository
    -UserProfileFragment userProfileFragment
    +FollowersListFragment()
    +static FollowersListFragment newInstance(String username, String type)
    +onCreate(Bundle savedInstanceState) void
    +onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) View
    -loadData() void
    -loadParticipants(List~String~ usernames) void
    -filterList(String query) void
    -updateEmptyView() void
    -onUserClick(Participant participant) void
    -onRemoveClick(Participant participant, int position) void
    -removeFollower(Participant participant, int position) void
    -unfollowUser(Participant participant, int position) void
    }

    class FollowRequestsFragment {
    -RecyclerView requestsRecyclerView
    -ProgressBar progressBar
    -TextView emptyView
    -FollowRequestAdapter requestAdapter
    -ParticipantRepository participantRepository
    -String currentUsername
    -List~FollowRequest~ requestsList
    +onCreate(Bundle savedInstanceState) void
    +onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) View
    -loadFollowRequests() void
    -updateEmptyView() void
    -onAccept(String requestorUsername, int position) void
    -onDecline(String requestorUsername, int position) void
    -checkFollowRelationship(String requestorUsername) void
    -sendFollowBackRequest(String username) void
     }


    %% Relationships - Organized by layers to reduce crossing lines
    %% Model relationships
    MoodEvent "1" --> "1" EmotionalState : has
    MoodEvent "1" --> "1" SocialSituation : has
    MoodEvent "1" o--> "0..*" Comment : has
    MoodEvent "1" --> "1" Participant : authored by

    Comment "0..*" --> "1" Participant : authored by

    Participant "1" o--> "0..*" FollowRequest : sends
    Participant "1" o--> "0..*" FollowRequest : receives
    FollowRequest "1" --> "1" Participant : fromUsername
    FollowRequest "1" --> "1" Participant : toUsername

    Participant "1" o--> "0..*" Notification : receives
    Notification "1" --> "1" Participant : senderUsername
    Notification "1" --> "1" Participant : recipientUsername
    HomeFragment "1" --> "0..*" Notification : observes
    

    %% Repository relationships
    MoodEventRepository "1" --> "0..*" MoodEvent : manages
    MoodEventRepository "1" ..> "1" FirebaseService : uses
    ParticipantRepository "1" --> "0..*" Participant : manages
    ParticipantRepository "1" ..> "1" FirebaseService : uses
    NotificationService "1" --> "0..*" Notification : creates
    NotificationService "1" ..> "1" FirebaseService : uses

    %% Adapter relationships
    
    MoodEventArrayAdapter "1" --> "0..*" MoodEvent : displays
    HomeMoodEventArrayAdapter <|-- MoodEventArrayAdapter : extends
    HomeMoodEventArrayAdapter "1" ..> "1" ParticipantRepository : uses
    HomeMoodEventArrayAdapter "1" ..> "1" EmotionUtils : uses
    HomeMoodEventArrayAdapter "1" ..> "1" ImageHandler : uses
    HistoryMoodEventArrayAdapter <|-- MoodEventArrayAdapter : extends
    HistoryMoodEventArrayAdapter "1" ..> "1" EmotionUtils : uses
    EventDetailAdapter "1" --> "1" MoodEvent : displays
    EventDetailAdapter "1" --> "0..*" Comment : displays
    EventDetailAdapter "1" ..> "1" ParticipantRepository : fetches
    EventDetailAdapter "1" ..> "1" EmotionUtils : uses
    EventDetailAdapter "1" ..> "1" ImageHandler : renders
    EventDetailAdapter "1" ..> "1" TimestampUtils : formats

    FollowerAdapter "1" --> "0..*" Participant : displays
    FollowerAdapter "1" ..> "1" ImageHandler : renders

    FollowRequestAdapter "1" --> "0..*" FollowRequest : displays
    FollowRequestAdapter "1" ..> "1" ParticipantRepository : fetches
    FollowRequestAdapter "1" ..> "1" ImageHandler : renders

    UserAdapter "1" --> "0..*" Participant : displays
    UserAdapter "1" ..> "1" ParticipantRepository : checks
    UserAdapter "1" ..> "1" FirebaseAuth : uses
    UserAdapter "1" ..> "1" ImageHandler : renders
    

    %% Utilities relationships
    
    EmotionUtils "1" --> "1" EmotionalState : maps to
    NotificationUtils "1" --> "0..*" Notification : displays
    NotificationUtils "1" ..> "1" HomePage : uses
    NotificationUtils "1" ..> "1" NotificationService : uses
    TimestampUtils "1" --> "0..*" Comment : formats    

    %% Firebase relationships

    FCMTokenManager "1" ..> "1" FirebaseService : uses
    SentioFirebaseMessagingService "1" ..> "1" NotificationUtils : sends noti
    SentioFirebaseMessagingService "1" ..> "1" FCMTokenManager : saves tokens
    SentioFirebaseMessagingService "1" --> "1" HomePage : navigates via intent



    %% Activity relationships
    MainActivity "1" --> "1" HomePage : navigates to
    MainActivity "1" --> "1" LoginPage : navigates to
    HomePage "1" --> "1" HomeFragment : navigates to
    HomePage "1" --> "1" MapFragment : navigates to
    HomePage "1" --> "1" AddMoodEventFragment : navigates to
    HomePage "1" --> "1" HistoryFragment : navigates to
    HomePage "1" --> "1" ProfileFragment : navigates to
    HomePage "1" --> "1" AnalyticsFragment : navigates to
    HomePage "1" --> "1" EventDetail : navigates to
    HomePage "1" --> "1" FollowersListFragment : navigates to
    HomePage "1" --> "1" FollowRequestsFragment : navigates to
    HomePage "1" --> "1" UserProfileFragment : navigates to
    HomePage "1" --> "1" UserSearchFragment : navigates to
    LoginPage "1" ..> "1" LocationHandler : uses
    SignupPage "1" ..> "1" ParticipantRepository : uses
    SignupPage "1" --> "1" Participant : creates

    %% Fragment relationships
    
    AddMoodEventFragment "1" ..> "1" MoodEventRepository : uses
    AddMoodEventFragment "1" ..> "1" ParticipantRepository : uses
    HistoryFragment "1" --> "1" HistoryMoodEventArrayAdapter : uses
    HistoryFragment "1" ..> "1" MoodEventRepository : uses
    HistoryFragment "1" ..> "1" ParticipantRepository : uses
    HistoryFragment "1" --> "0..*" MoodEvent : displays
    HomeFragment "1" --> "1" HomeMoodEventArrayAdapter : uses
    HomeFragment "1" ..> "1" MoodEventRepository : uses
    HomeFragment "1" --> "0..*" MoodEvent : displays
    ProfileFragment "1" --> "0..*" MoodEvent : displays
    ProfileFragment --> SettingsFragment : navigates to
    ProfileFragment "1" ..> "1" ParticipantRepository : uses
    ProfileFragment "1" ..> "1" MoodEventRepository : uses
    ProfileFragment "1" --> "0..*" FollowRequest : manages
    ProfileFragment "1" --> "1" FollowRequestAdapter : uses
    ProfileFragment "1" --> "1" Participant : displays
    ProfileFragment --> FollowersListFragment : navigates to
    ProfileFragment --> FollowRequestsFragment : navigates to
    ProfileFragment --> EventDetail : navigates to
    ProfileFragment "1" ..> "1" EmotionUtils : uses
    ProfileFragment "1" ..> "1" ImageHandler : uses
    ProfileFragment "1" ..> "1" TimestampUtils : uses
    ProfileFragment --> LoginPage : navigates to
    SettingsFragment "1" ..> "1" ParticipantRepository : uses
    SettingsFragment "1" ..> "1" ImageHandler : uses
    SettingsFragment "1" --> "1" Participant : updates
    SettingsFragment --> LoginPage : navigates to
    UserProfileFragment "1" ..> "1" ParticipantRepository : uses
    UserProfileFragment "1" ..> "1" MoodEventRepository : uses
    UserProfileFragment "1" --> "0..*" MoodEvent : displays
    UserProfileFragment "1" --> "1" Participant : displays
    UserProfileFragment --> FollowersListFragment : navigates to
    UserProfileFragment "1" ..> "1" EmotionUtils : uses
    UserProfileFragment "1" ..> "1" ImageHandler : uses
    UserProfileFragment "1" ..> "1" TimestampUtils : uses
    UserSearchFragment "1" ..> "1" ParticipantRepository : uses
    UserSearchFragment "1" --> "0..*" Participant : displays
    UserSearchFragment "1" --> "1" UserAdapter : uses
    UserSearchFragment --> UserProfileFragment : navigates to
    UserSearchFragment --> ProfileFragment : navigates to
    AnalyticsFragment "1" --> "0..*" MoodEvent : analyzes
    EventDetail "1" ..> "1" MoodEventRepository : uses
    EventDetail "1" ..> "1" ParticipantRepository : uses
    EventDetail "1" --> "1" MoodEvent : displays
    EventDetail "1" --> "1" EventDetailAdapter : uses
    EventDetail "1" --> "0..*" Comment : displays
    FollowersListFragment "1" ..> "1" ParticipantRepository : uses
    FollowersListFragment "1" --> "0..*" Participant : displays
    FollowersListFragment "1" --> "1" FollowerAdapter : uses
    FollowersListFragment --> UserProfileFragment : navigates to
    FollowRequestsFragment "1" ..> "1" ParticipantRepository : uses
    FollowRequestsFragment "1" --> "0..*" FollowRequest : manages
    FollowRequestsFragment "1" --> "1" FollowRequestAdapter : uses
    MapFragment "1" ..> "1" MoodEventRepository : uses
    MapFragment "1" ..> "1" ParticipantRepository : uses
    MapFragment "1" --> "0..*" MoodEvent : displays
    MapFragment "1" ..> "1" LocationHandler : uses
    MapFragment "1" ..> "1" EmotionUtils : uses
    
    
    
    ```
Loading
Clone this wiki locally