-
Notifications
You must be signed in to change notification settings - Fork 2
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
```