Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
9 changes: 5 additions & 4 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,15 +2,16 @@

<div align="center">

# GroupMeet

![Round]("./project/images/WordMark-Dark.png")

[![Report Issue on Jira](https://img.shields.io/badge/Report%20Issues-Jira-0052CC?style=flat&logo=jira-software)](https://temple-cis-projects-in-cs.atlassian.net/jira/software/c/projects/DT/issues) [![Deploy Docs](https://github.com/ApplebaumIan/tu-cis-4398-docs-template/actions/workflows/deploy.yml/badge.svg)](https://github.com/ApplebaumIan/tu-cis-4398-docs-template/actions/workflows/deploy.yml) [![Documentation Website Link](https://img.shields.io/badge/-Documentation%20Website-brightgreen)](https://capstone-projects-2023-spring.github.io/project-groupmeet/)

</div>

<h2> Project Abstract </h2>

This document proposes a multi-platform mobile application called "GroupMeet" that creates an environment for students and social groups to easily organize each other's schedules for availability and share contact information. In academic group projects, students will be able to easily begin communications with each other and synchronize with each other's schedules to become more successful in their academic endeavors. In social groups, friends can now easily coordinate each other's busy lives and adjust accordingly to spontaneous events. With this application, there is little need for one particular individual to take charge; the responsibility lies on the application itself.
This document proposes a multi-platform mobile application called "Round" that creates an environment for students and social groups to easily organize each other's schedules for availability and share contact information. In academic group projects, students will be able to easily begin communications with each other and synchronize with each other's schedules to become more successful in their academic endeavors. In social groups, friends can now easily coordinate each other's busy lives and adjust accordingly to spontaneous events. With this application, there is little need for one particular individual to take charge; the responsibility lies on the application itself.

<h2> Collaborators </h2>
<table>
Expand Down Expand Up @@ -117,15 +118,15 @@ When the application is needed, the user will have to create an instance that ge

<h2> Conceptual Design </h2>

IGroupMeet's programming environment will be in Dart using the Flutter framework. This will allow the application to be developed for both iOS and Android devices simultaneously. This is to ensure that the only requirement to use our application is owning a smartphone so that the most users can be reached and assisted with GroupMeet. As for hosting of the application, there is currently an attempt to acquire the necessary physical hardware, however this is a situation that can be circumnavigated. The backend will be utilizing a known cloud service such as AWS or Firebase.
Round's programming environment will be in Dart using the Flutter framework. This will allow the application to be developed for both iOS and Android devices simultaneously. This is to ensure that the only requirement to use our application is owning a smartphone so that the most users can be reached and assisted with Round. As for hosting of the application, there is currently an attempt to acquire the necessary physical hardware, however this is a situation that can be circumnavigated. The backend will be utilizing a known cloud service such as AWS or Firebase.

<h2> Background </h2>

Throughout one's academic career, it has been shown time and time again that one of the most consistently troublesome procedures experienced is getting assigned a group project and getting the flow of communication going. While this particular task can be daunting on it's own, it can become an even more daunting task when there are inevitable schedule conflicts. Even outside of the academic life, these same scheduling conflicts can be found during the coordination of recreational events with friends and family. The seemingly simple task of "kicking back with the friends" risks becoming a logistical nightmare.

In the two scenarios above, the task of trying to find a block of time that works for everyone tends to be a very daunting one. Additionally, this particular task tends to be assigned to one unlucky individual. It can be assumed with a wide margin of certainty that if one with this assignment had the ability to make a task that can seem impossible at times, possible, they would be interested in resources that would aid in this daunting assignment.

Similar products to GroupMeet include official calendars with calendar sync integration like Google Calendars, or Calendar ([https://www.calendar.com/](https://www.calendar.com/)) which has dynamic scheduling integration. However, many of the latter's features are locked behind a paywall. This creates a very unfortunate problem where paying for a "premium" feature is just not convenient enough for short-term use. Additionally, combining calendars typically tends to mean the event details are shared in some shape or form, implying that all who have their calendars integrated in a setting previously mentioned risk having other friends and associates aware of exactly what is occurring at any point in one's personal life. This is a scenario that should be avoided as much as possible, as the sharing of personal or public information should be completely at ones own discretion rather than as a necessity to set up a meeting time for a task. GroupMeet aspires to make calendar sync integration an easy and seamless process with privacy in mind.
Similar products to Round include official calendars with calendar sync integration like Google Calendars, or Calendar ([https://www.calendar.com/](https://www.calendar.com/)) which has dynamic scheduling integration. However, many of the latter's features are locked behind a paywall. This creates a very unfortunate problem where paying for a "premium" feature is just not convenient enough for short-term use. Additionally, combining calendars typically tends to mean the event details are shared in some shape or form, implying that all who have their calendars integrated in a setting previously mentioned risk having other friends and associates aware of exactly what is occurring at any point in one's personal life. This is a scenario that should be avoided as much as possible, as the sharing of personal or public information should be completely at ones own discretion rather than as a necessity to set up a meeting time for a task. Round aspires to make calendar sync integration an easy and seamless process with privacy in mind.

<h2> Required Resources </h2>

Expand Down
92 changes: 83 additions & 9 deletions project/lib/home.dart
Original file line number Diff line number Diff line change
@@ -1,14 +1,34 @@
import 'dart:collection';

import 'package:firebase_auth/firebase_auth.dart';
import 'package:firebase_database/firebase_database.dart';
import 'package:firebase_database/firebase_database.dart';
import 'package:flutter/widgets.dart';
import 'package:flutter_platform_widgets/flutter_platform_widgets.dart';
import 'package:groupmeet/new_group_creation.dart';
import 'package:groupmeet/theme.dart';
import 'code_reception.dart';
import 'group_creation.dart';
import 'settings.dart';

class HomeScreen extends StatelessWidget {
const HomeScreen({super.key, required String title});
class Group {
Color color;
String emoji;
String name;

Group(this.color, this.emoji, this.name);
}

class HomeScreen extends StatefulWidget {
@override
_HomeScreen createState() => _HomeScreen();
}

class _HomeScreen extends State<HomeScreen> {

get title => null;
List<Group> displayedGroups = [];

bool observing = false;

// TODO: Cross-Platform working QR Screen
void showQR(context) {
Expand All @@ -24,7 +44,7 @@ class HomeScreen extends StatelessWidget {
Navigator.of(context).push(
platformPageRoute(
context: context,
builder: (context) => const GroupCreation(title: "Group Creation")),
builder: (context) => NewGroupCreation()),
);
}

Expand All @@ -41,8 +61,62 @@ class HomeScreen extends StatelessWidget {
print("Tapped group $group");
}

void observeGroups() {
if (observing) {
return;
}

String? userID = FirebaseAuth.instance.currentUser?.uid;

if (userID == null) {
// TODO: Alert saying not logged in yet?
print("Not logged in");
}

FirebaseDatabase.instance.ref("users/${userID!}/groupIds").onValue.listen((event) async {
if (event.snapshot.value == null) {
return;
}

print(event.snapshot.value);

Iterable<Object?> groups = (event.snapshot.value as Map<Object?, Object?>).keys;

List<Group> newGroups = [];

for (Object? groupID in groups) {
String groupIDCasted = groupID as String;
final groupInfo = await FirebaseDatabase.instance.ref("groups/$groupIDCasted/").get();

if (!groupInfo.exists) {
continue;
}
print(groupInfo.value);

Map<Object?, Object?> vals = groupInfo.value as Map<Object?, Object?>;

int color = vals['color'] as int;
String emoji = vals['emoji'] as String;
String name = vals['name'] as String;

print(color);
print(emoji);
print(name);

newGroups.add(Group(Color(color), emoji, name));
}

setState(() => displayedGroups = newGroups);
});

observing = true;
}

@override
Widget build(BuildContext context) {

observeGroups();

double screenWidth = MediaQuery.of(context).size.width;
double screenHeight = MediaQuery.of(context).size.height;

Expand All @@ -60,7 +134,7 @@ class HomeScreen extends StatelessWidget {
top: 48 + MediaQuery.of(context).viewPadding.top + 8 + 8),
crossAxisCount: 2,
mainAxisSpacing: 0,
children: List.generate(3, (index) {
children: List.generate(displayedGroups.length, (index) {
return GestureDetector(
onTap: () => selectedGroup(index),
child: Column(
Expand All @@ -70,12 +144,12 @@ class HomeScreen extends StatelessWidget {
alignment: Alignment.center,
children: [
ColorFiltered(
colorFilter: const ColorFilter.mode(
roundPurple, BlendMode.srcIn),
colorFilter: ColorFilter.mode(
displayedGroups[index].color, BlendMode.srcIn),
child: Image.asset("images/GroupRound.png",
width: 120, height: 120, isAntiAlias: true),
),
PlatformText("🖥️️",
PlatformText(displayedGroups[index].emoji,
style: const TextStyle(
fontSize: 40,
fontWeight: FontWeight.bold,
Expand All @@ -85,7 +159,7 @@ class HomeScreen extends StatelessWidget {
Padding(
padding: const EdgeInsets.fromLTRB(8, 0, 8, 0),
child: PlatformText(
"STEM Baddies",
displayedGroups[index].name,
style: const TextStyle(
fontWeight: FontWeight.w600, fontSize: 14),
textAlign: TextAlign.center,
Expand Down
9 changes: 7 additions & 2 deletions project/lib/main.dart
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ import 'package:groupmeet/theme.dart';
import 'package:firebase_auth/firebase_auth.dart';

import 'home.dart';
import 'new_group_creation.dart';

// Initialize the app and run it.
Future<void> main() async {
Expand Down Expand Up @@ -64,7 +65,7 @@ class MyApp extends StatelessWidget {
User? user = FirebaseAuth.instance.currentUser;

if (user != null) {
firstStop = const HomeScreen(title: 'Home');
firstStop = HomeScreen();
} else {
firstStop = Explainer(pageNo: 0);
}
Expand All @@ -76,7 +77,11 @@ class MyApp extends StatelessWidget {
material: (context, platform) =>
MaterialAppData(theme: materialTheme, color: roundPurple),
cupertino: (context, platform) =>
CupertinoAppData(theme: cupertinoTheme, color: roundPurple),
CupertinoAppData(theme: cupertinoTheme, color: roundPurple, localizationsDelegates: [
DefaultCupertinoLocalizations.delegate,
DefaultMaterialLocalizations.delegate,
DefaultWidgetsLocalizations.delegate,
]),
home: firstStop, //Explainer(pageNo: 0),
title: "Round",
color: roundPurple);
Expand Down
Loading