├── .all-contributorsrc
├── .github
├── FUNDING.yml
├── ISSUE_TEMPLATE
│ ├── bug.yaml
│ ├── documentation.yaml
│ └── feature.yaml
├── dependabot.yml
├── pull_request_template.md
└── workflows
│ ├── CI.yml
│ ├── auto-comment.yml
│ ├── codeql.yml
│ ├── dart.yml
│ ├── issue-assign.yml
│ ├── issue.yml
│ ├── lint.yml
│ └── release.yml
├── .gitignore
├── .metadata
├── CODE_OF_CONDUCT.md
├── CONTRIBUTING.md
├── Dockerfile
├── LICENSE
├── README.md
├── WikiPagesREADME.md
├── android
├── .gitignore
├── .project
├── .settings
│ └── org.eclipse.buildship.core.prefs
├── app
│ ├── build.gradle
│ ├── google-services.json
│ └── src
│ │ ├── debug
│ │ └── AndroidManifest.xml
│ │ ├── main
│ │ ├── AndroidManifest.xml
│ │ ├── java
│ │ │ └── io
│ │ │ │ └── flutter
│ │ │ │ └── app
│ │ │ │ └── FlutterMultiDexApplication.java
│ │ ├── kotlin
│ │ │ └── com
│ │ │ │ └── example
│ │ │ │ └── class_manager
│ │ │ │ └── MainActivity.kt
│ │ └── res
│ │ │ ├── drawable-v21
│ │ │ └── launch_background.xml
│ │ │ ├── drawable
│ │ │ ├── launch_background.xml
│ │ │ └── launch_image.png
│ │ │ ├── mipmap-hdpi
│ │ │ ├── ic_launcher.png
│ │ │ └── launcher_icon.png
│ │ │ ├── mipmap-mdpi
│ │ │ ├── ic_launcher.png
│ │ │ └── launcher_icon.png
│ │ │ ├── mipmap-xhdpi
│ │ │ ├── ic_launcher.png
│ │ │ └── launcher_icon.png
│ │ │ ├── mipmap-xxhdpi
│ │ │ ├── ic_launcher.png
│ │ │ └── launcher_icon.png
│ │ │ ├── mipmap-xxxhdpi
│ │ │ ├── ic_launcher.png
│ │ │ └── launcher_icon.png
│ │ │ ├── values-night
│ │ │ └── styles.xml
│ │ │ └── values
│ │ │ ├── colors.xml
│ │ │ ├── strings.xml
│ │ │ └── styles.xml
│ │ └── profile
│ │ └── AndroidManifest.xml
├── build.gradle
├── gradle.properties
├── gradle
│ └── wrapper
│ │ └── gradle-wrapper.properties
├── settings.gradle
└── settings_aar.gradle
├── assets
├── icons
│ ├── grad_cap.svg
│ ├── homework.svg
│ ├── house.svg
│ ├── icon.png
│ ├── read_book.svg
│ ├── settings.svg
│ ├── test.svg
│ └── user.svg
└── images
│ ├── fbook.png
│ ├── google.png
│ ├── phone.png
│ ├── profile_pic.jpg
│ ├── slider1.png
│ ├── slider2.png
│ └── slider3.png
├── design-assets
├── Color scheme
│ └── color_design.md
├── Figma (Adding more graphics)
│ ├── Frame 1.png
│ ├── Frame 2.png
│ ├── Frame 3.png
│ ├── Frame 4.png
│ ├── Frame 5.png
│ ├── Frame 6.png
│ ├── Friday-Figma.mp4
│ └── Readme.md
└── graphics
│ ├── .picasa.ini
│ ├── app-icon.png
│ ├── feature-graphic.png
│ ├── friday_application_preview
│ ├── README.md
│ ├── friday_application_preview.png
│ ├── play_store_screenshots
│ │ ├── alerts_section.png
│ │ ├── classes_section.png
│ │ ├── home_section.png
│ │ ├── homework_section.png
│ │ ├── profile_section.png
│ │ └── sign_up_section.jpeg
│ └── play_store_screenshots_framed
│ │ ├── alerts_section_framed.png
│ │ ├── classes_section_framed.png
│ │ ├── home_section_framed.png
│ │ ├── homework_section_framed.png
│ │ ├── profile_section_framed.png
│ │ └── sign_up_section_framed.png
│ ├── phone-ss-1.png
│ ├── phone-ss-2.png
│ ├── phone-ss-3.png
│ └── phone-ss-4.png
├── ios
├── .gitignore
├── Flutter
│ ├── AppFrameworkInfo.plist
│ ├── Debug.xcconfig
│ └── Release.xcconfig
├── Podfile
├── Podfile.lock
├── Runner.xcodeproj
│ ├── project.pbxproj
│ ├── project.xcworkspace
│ │ ├── contents.xcworkspacedata
│ │ └── xcshareddata
│ │ │ ├── IDEWorkspaceChecks.plist
│ │ │ └── WorkspaceSettings.xcsettings
│ └── xcshareddata
│ │ └── xcschemes
│ │ └── Runner.xcscheme
├── Runner.xcworkspace
│ ├── contents.xcworkspacedata
│ └── xcshareddata
│ │ ├── IDEWorkspaceChecks.plist
│ │ └── WorkspaceSettings.xcsettings
├── Runner
│ ├── AppDelegate.swift
│ ├── Assets.xcassets
│ │ ├── AppIcon.appiconset
│ │ │ ├── Contents.json
│ │ │ ├── Icon-App-1024x1024@1x.png
│ │ │ ├── Icon-App-20x20@1x.png
│ │ │ ├── Icon-App-20x20@2x.png
│ │ │ ├── Icon-App-20x20@3x.png
│ │ │ ├── Icon-App-29x29@1x.png
│ │ │ ├── Icon-App-29x29@2x.png
│ │ │ ├── Icon-App-29x29@3x.png
│ │ │ ├── Icon-App-40x40@1x.png
│ │ │ ├── Icon-App-40x40@2x.png
│ │ │ ├── Icon-App-40x40@3x.png
│ │ │ ├── Icon-App-60x60@2x.png
│ │ │ ├── Icon-App-60x60@3x.png
│ │ │ ├── Icon-App-76x76@1x.png
│ │ │ ├── Icon-App-76x76@2x.png
│ │ │ └── Icon-App-83.5x83.5@2x.png
│ │ └── LaunchImage.imageset
│ │ │ ├── Contents.json
│ │ │ ├── LaunchImage.png
│ │ │ ├── LaunchImage@2x.png
│ │ │ ├── LaunchImage@3x.png
│ │ │ └── README.md
│ ├── Base.lproj
│ │ ├── LaunchScreen.storyboard
│ │ └── Main.storyboard
│ ├── GoogleService-Info.plist
│ ├── Info.plist
│ └── Runner-Bridging-Header.h
└── firebase_app_id_file.json
├── lib
├── constants.dart
├── feedback.dart
├── firebase_options.dart
├── l10n
│ ├── app_en.arb
│ ├── app_gu.arb
│ ├── app_hi.arb
│ ├── app_mr.arb
│ └── app_ru.arb
├── localizationTexts
│ ├── defaulttexts.dart
│ ├── gujarati.dart
│ ├── hindi.dart
│ ├── kannada.dart
│ ├── marathi.dart
│ └── russian.dart
├── main.dart
├── models
│ ├── alert.dart
│ ├── classes.dart
│ ├── homework.dart
│ └── users.dart
├── onboarding
│ └── introslider.dart
├── screens
│ ├── alert_screen.dart
│ ├── app_info_screen.dart
│ ├── chat_screen.dart
│ ├── classes_screen.dart
│ ├── contact_us_screen.dart
│ ├── faqs_screen.dart
│ ├── favourites_screen.dart
│ ├── help_screen.dart
│ ├── home_screen.dart
│ ├── homework_screen.dart
│ ├── loading_screen.dart
│ ├── login_page.dart
│ ├── new_group_screen.dart
│ ├── onboarding_page.dart
│ ├── phone_verification_screen.dart
│ ├── profile_screen.dart
│ ├── settings_screen.dart
│ ├── signup_additional_details_screen.dart
│ ├── signup_page.dart
│ ├── splash.dart
│ ├── theme_screen.dart
│ ├── themes.dart
│ ├── verify_code_screen.dart
│ └── welcome_screen.dart
├── services
│ ├── auth_error_msg_toast.dart
│ ├── authentication.dart
│ ├── chats_db.dart
│ ├── classes_db_services.dart
│ ├── facebookAuthentication.dart
│ ├── googleAuthentication.dart
│ ├── phone_number_verification_db.dart
│ ├── theme_provider.dart
│ ├── user_db_services.dart
│ └── user_info_services.dart
├── utils
│ ├── bottom_navbar_tabs.dart
│ └── notifications.dart
└── widgets
│ ├── animated_nav_bar.dart
│ ├── auth_handling_widget.dart
│ ├── auth_input_form_field.dart
│ ├── bottom_navigation.dart
│ ├── build_classes.dart
│ ├── countdown_painter.dart
│ ├── header.dart
│ ├── login_form.dart
│ ├── onboarding_canvas_design.dart
│ ├── recents_alerts copy.dart
│ ├── recents_alerts.dart
│ ├── recents_homeworks.dart
│ ├── reset_password.dart
│ ├── round_button.dart
│ ├── signup_form_additional_details.dart
│ ├── signup_form_essential_details.dart
│ └── splash_animation.dart
├── privacy-policy.md
├── pubspec.lock
├── pubspec.yaml
└── test
└── widget_test.dart
/.all-contributorsrc:
--------------------------------------------------------------------------------
1 | {
2 | "files": [
3 | "README.md"
4 | ],
5 | "imageSize": 100,
6 | "commit": false,
7 | "contributors": [
8 | {
9 | "login": "infiniteoverflow",
10 | "name": "Aswin Gopinathan",
11 | "avatar_url": "https://avatars1.githubusercontent.com/u/40236624?v=4",
12 | "profile": "https://github.com/infiniteoverflow",
13 | "contributions": [
14 | "bug",
15 | "code"
16 | ]
17 | },
18 | {
19 | "login": "purnima143",
20 | "name": "Purnima Sharma",
21 | "avatar_url": "https://avatars1.githubusercontent.com/u/57852378?v=4",
22 | "profile": "https://github.com/purnima143",
23 | "contributions": [
24 | "design"
25 | ]
26 | },
27 | {
28 | "login": "HimeshNayak",
29 | "name": "Himesh Nayak",
30 | "avatar_url": "https://avatars2.githubusercontent.com/u/30944790?v=4",
31 | "profile": "https://github.com/HimeshNayak",
32 | "contributions": [
33 | "code"
34 | ]
35 | },
36 | {
37 | "login": "hareshnayak",
38 | "name": "Haresh Nayak",
39 | "avatar_url": "https://avatars1.githubusercontent.com/u/61956975?v=4",
40 | "profile": "https://github.com/hareshnayak",
41 | "contributions": [
42 | "bug",
43 | "code"
44 | ]
45 | },
46 | {
47 | "login": "Imadarshsri",
48 | "name": "Adarsh Srivastava",
49 | "avatar_url": "https://avatars1.githubusercontent.com/u/45717875?v=4",
50 | "profile": "https://github.com/Imadarshsri",
51 | "contributions": [
52 | "code"
53 | ]
54 | },
55 | {
56 | "login": "ajay963",
57 | "name": "Ajay Manjhi",
58 | "avatar_url": "https://avatars.githubusercontent.com/u/43930202?v=4",
59 | "profile": "https://github.com/ajay963",
60 | "contributions": [
61 | "code"
62 | ]
63 | },
64 | {
65 | "login": "mysterio0801",
66 | "name": "Vrishabh Agamya",
67 | "avatar_url": "https://avatars.githubusercontent.com/u/54456976?v=4",
68 | "profile": "http://www.linkedin.com/in/mysterio0801",
69 | "contributions": [
70 | "code"
71 | ]
72 | },
73 | {
74 | "login": "mohitsoni-dev",
75 | "name": "Mohit Soni",
76 | "avatar_url": "https://avatars.githubusercontent.com/u/59525097?v=4",
77 | "profile": "https://github.com/mohitsoni-dev",
78 | "contributions": [
79 | "code"
80 | ]
81 | },
82 | {
83 | "login": "namancoder",
84 | "name": "Naman Gupta",
85 | "avatar_url": "https://avatars.githubusercontent.com/u/49373509?v=4",
86 | "profile": "https://github.com/namancoder",
87 | "contributions": [
88 | "code"
89 | ]
90 | },
91 | {
92 | "login": "D-Ajay-Kumar",
93 | "name": "D-Ajay-Kumar",
94 | "avatar_url": "https://avatars.githubusercontent.com/u/56850266?v=4",
95 | "profile": "https://github.com/D-Ajay-Kumar",
96 | "contributions": [
97 | "code"
98 | ]
99 | },
100 | {
101 | "login": "SamarpanCoder2002",
102 | "name": "Samarpan Dasgupta",
103 | "avatar_url": "https://avatars.githubusercontent.com/u/66327336?v=4",
104 | "profile": "https://www.linkedin.com/in/samarpan-dasgupta-4aa1061b0/",
105 | "contributions": [
106 | "code"
107 | ]
108 | },
109 | {
110 | "login": "ishanailwal",
111 | "name": "Isha Nailwal",
112 | "avatar_url": "https://avatars.githubusercontent.com/u/56601364?v=4",
113 | "profile": "https://github.com/ishanailwal",
114 | "contributions": [
115 | "code"
116 | ]
117 | }
118 | ],
119 | "contributorsPerLine": 7,
120 | "projectName": "Friday",
121 | "projectOwner": "avinashkranjan",
122 | "repoType": "github",
123 | "repoHost": "https://github.com",
124 | "skipCi": true
125 | }
126 |
--------------------------------------------------------------------------------
/.github/FUNDING.yml:
--------------------------------------------------------------------------------
1 | # These are supported funding model platforms
2 |
3 | github: avinashkranjan
4 |
--------------------------------------------------------------------------------
/.github/ISSUE_TEMPLATE/bug.yaml:
--------------------------------------------------------------------------------
1 | name: "🐞 Bug Report"
2 | description: "Create a report to help us improve"
3 | title: "[BUG]"
4 | labels: [Bug, Needs Triage]
5 | body:
6 | - type: checkboxes
7 | attributes:
8 | label: "Is there an existing issue for this?"
9 | description: "Please search to see if an issue already exists for the bug you encountered."
10 | options:
11 | - label: "I have searched the existing issues"
12 | required: true
13 | - type: textarea
14 | attributes:
15 | label: "What happened?"
16 | description: "A concise description of what you're experiencing."
17 | validations:
18 | required: true
19 | - type: textarea
20 | attributes:
21 | label: "Add ScreenShots"
22 | description: "Add sufficient SS to explain your issue."
23 | validations:
24 | required: true
25 | - type: dropdown
26 | id: browsers
27 | attributes:
28 | label: "What browser are you seeing the problem on?"
29 | multiple: true
30 | options:
31 | - "Firefox"
32 | - "Chrome"
33 | - "Microsoft Edge"
34 | - "Safari"
35 | - "Arc"
36 | - type: checkboxes
37 | attributes:
38 | label: "Record"
39 | options:
40 | - label: "I agree to follow this project's Code of Conduct"
41 | required: true
42 | - label: "I'm a GSSOC'23 contributor"
43 | - label: "I want to work on this issue"
44 |
--------------------------------------------------------------------------------
/.github/ISSUE_TEMPLATE/documentation.yaml:
--------------------------------------------------------------------------------
1 | name: "📑 Documentation Update"
2 | description: "Improve Documentation"
3 | title: "[DOC]"
4 | labels: [DOC, Needs Triage]
5 | body:
6 |
7 | - type: textarea
8 | attributes:
9 | label: "What's wrong with the existing documentation"
10 | description: "Which things we need to add or delete"
11 | validations:
12 | required: true
13 | - type: textarea
14 | attributes:
15 | label: "Add ScreenShots"
16 | description: "Add sufficient SS to explain your issue."
17 | validations:
18 | required: true
19 |
20 | - type: checkboxes
21 | attributes:
22 | label: "Record"
23 | options:
24 | - label: "I agree to follow this project's Code of Conduct"
25 | required: true
26 | - label: "I'm a GSSOC'23 contributor"
27 | - label: "I want to work on this issue"
28 |
--------------------------------------------------------------------------------
/.github/ISSUE_TEMPLATE/feature.yaml:
--------------------------------------------------------------------------------
1 | name: "✨ Feature Request"
2 | description: "Suggest an idea for this project "
3 | title: "[Feat]"
4 | labels: [Feat, Needs Triage]
5 | body:
6 |
7 | - type: textarea
8 | attributes:
9 | label: "Describe the feature"
10 | description:
11 | validations:
12 | required: true
13 | - type: textarea
14 | attributes:
15 | label: "Add ScreenShots"
16 | description: "Add sufficient SS to explain your issue."
17 | validations:
18 | required: true
19 |
20 | - type: checkboxes
21 | attributes:
22 | label: "Record"
23 | options:
24 | - label: "I agree to follow this project's Code of Conduct"
25 | required: true
26 | - label: "I'm a GSSOC'23 contributor"
27 | - label: "I want to work on this issue"
28 |
--------------------------------------------------------------------------------
/.github/dependabot.yml:
--------------------------------------------------------------------------------
1 | version: 2
2 | updates:
3 | - package-ecosystem: 'npm'
4 | directory: '/'
5 | schedule:
6 | interval: 'daily'
--------------------------------------------------------------------------------
/.github/pull_request_template.md:
--------------------------------------------------------------------------------
1 |
6 |
7 | # Description
8 |
9 | Please include a summary of the change and which issue is fixed. List any dependencies that are required for this change.
10 |
11 | ## Fixes #(issue_no)
12 |
13 | Replace `issue_no` with the issue number which is fixed in this PR
14 |
15 | ## Have you read the [Contributing Guidelines on Pull Requests](https://github.com/avinashkranjan/Friday/blob/master/CONTRIBUTING.md)?
16 |
17 | - [ ] Yes
18 | - [ ] No
19 |
20 | ## Type of change
21 |
22 | _Please delete options that are not relevant._
23 |
24 | - [ ] Bug fix (non-breaking change which fixes an issue)
25 | - [ ] New feature (non-breaking change which adds functionality)
26 | - [ ] Breaking change (fix or feature that would cause existing functionality to not work as expected)
27 |
28 | ## Checklist:
29 |
30 | - [ ] My code follows the style guidelines(Clean Code) of this project
31 | - [ ] I have performed a self-review of my own code
32 | - [ ] My changes generate no new warnings
33 | - [ ] I have added tests/screenshots(if any) that prove my fix is effective or that my feature works.
34 |
--------------------------------------------------------------------------------
/.github/workflows/CI.yml:
--------------------------------------------------------------------------------
1 | name: Build and Deploy
2 |
3 | on:
4 | push:
5 | branches:
6 | - develop
7 | pull_request:
8 | branches:
9 | - develop
10 |
11 | jobs:
12 | build-and-deploy:
13 | runs-on: ubuntu-latest
14 | steps:
15 | - uses: actions/checkout@v2
16 |
17 | - name: Set up Flutter
18 | uses: subosito/flutter-action@v2
19 | with:
20 | flutter-version: '2.x' # Replace with the desired Flutter version
21 |
22 | - name: Install Dependencies
23 | run: flutter pub get
24 |
25 | - name: Build Android
26 | run: flutter build apk
27 |
28 | - name: Build iOS
29 | run: flutter build ios
30 |
31 | # Add more steps for other build targets (web, macOS, etc.) if needed
32 |
33 | - name: Archive Artifacts
34 | uses: actions/upload-artifact@v2
35 | with:
36 | name: Build Artifacts
37 | path: |
38 | build/app/outputs/apk/release/app-release.apk
39 | build/ios/archive/Runner.xcarchive
40 |
41 | # Add deployment steps here (e.g., upload artifacts, deploy to app store, etc.)
42 |
43 |
--------------------------------------------------------------------------------
/.github/workflows/auto-comment.yml:
--------------------------------------------------------------------------------
1 | name: Auto Comment
2 | on:
3 | issues:
4 | types:
5 | - opened
6 | - closed
7 | - assigned
8 | pull_request:
9 | types:
10 | - opened
11 | - closed
12 |
13 | jobs:
14 | run:
15 | runs-on: ubuntu-latest
16 | steps:
17 | - name: Auto Comment on Issues Opened
18 | uses: wow-actions/auto-comment@v1
19 | with:
20 | GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
21 | issuesOpened: |
22 | Hey @{{ author }},
23 |
24 | Thank you for raising an issue. We will investigate into the matter and get back to you as soon as possible.
25 |
26 | Please make sure you have given us as much context as possible.
27 |
28 | - name: Auto Comment on Issues Closed
29 | uses: wow-actions/auto-comment@v1
30 | with:
31 | GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
32 | issuesClosed: |
33 | Hey @{{ author }}, This issue is closed.
34 |
35 | - name: Auto Comment on Pull Request Merged
36 | uses: wow-actions/auto-comment@v1
37 | with:
38 | GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
39 | pullRequestMerged: |
40 | Hey, @{{ author }} Thank you for the valuable contribution!
41 |
42 | - name: Auto Comment on Pull Request Opened
43 | uses: wow-actions/auto-comment@v1
44 | with:
45 | GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
46 | pullRequestOpened: |
47 | Hey @{{ author }},
48 |
49 | Thank you for raising your pull request and contributing to our Community 🎉
50 |
51 | Please make sure you have followed our contributing guidelines. We will review it as soon as possible.
52 |
53 | - name: Auto Comment on Issues Assigned
54 | uses: wow-actions/auto-comment@v1
55 | with:
56 | GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
57 | issuesAssigned: |
58 | Hey @{{ author }}, thank you for raising an issue. I have assigned the issue to you. You can now start working on it. If you encounter any problems, feel free to connect with us.
59 |
--------------------------------------------------------------------------------
/.github/workflows/codeql.yml:
--------------------------------------------------------------------------------
1 | name: "CodeQL"
2 |
3 | on:
4 | push:
5 | branches: [ "main" ]
6 | pull_request:
7 | branches: [ "main" ]
8 | schedule:
9 | - cron: '43 3 * * 6'
10 |
11 | jobs:
12 | analyze:
13 | name: Analyze
14 | runs-on: ${{ (matrix.language == 'swift' && 'macos-latest') || 'ubuntu-latest' }}
15 | timeout-minutes: ${{ (matrix.language == 'swift' && 120) || 360 }}
16 | permissions:
17 | actions: read
18 | contents: read
19 | security-events: write
20 |
21 | strategy:
22 | fail-fast: false
23 | matrix:
24 | language: [ 'dart' ]
25 |
26 | steps:
27 | - name: Checkout repository
28 | uses: actions/checkout@v3
29 |
30 | - name: Initialize CodeQL
31 | uses: github/codeql-action/init@v2
32 | with:
33 | languages: ${{ matrix.language }}
34 |
35 | - name: Autobuild
36 | uses: github/codeql-action/autobuild@v2
37 |
38 | # Additional step for Dart analysis
39 | - name: Install Dart SDK
40 | uses: dart-lang/setup-dart@v1
41 |
42 | # Add any pre-build steps specific to your Flutter project if necessary
43 | # For example, running `flutter pub get` to get dependencies
44 | # - name: Flutter pub get
45 | # run: flutter pub get
46 |
47 | # Add your Flutter/Dart build step if needed
48 | # - name: Flutter build
49 | # run: flutter build apk --release
50 |
51 | - name: Perform CodeQL Analysis
52 | uses: github/codeql-action/analyze@v2
53 | with:
54 | # Update this to match your Flutter project's (Friday) source folder
55 | # For example, if your Dart code is inside the 'lib' folder, use: - languages: dart/lib
56 | # or if you have both Dart and Flutter code, use: - languages: dart/lib,flutter
57 | languages: dart/path/to/your/source/folder
58 |
59 | # Optionally, you can include specific queries or query packs for Dart
60 | # queries: security-extended,security-and-quality
--------------------------------------------------------------------------------
/.github/workflows/dart.yml:
--------------------------------------------------------------------------------
1 | # This workflow uses actions that are not certified by GitHub.
2 | # They are provided by a third-party and are governed by
3 | # separate terms of service, privacy policy, and support
4 | # documentation.
5 |
6 | name: Dart
7 |
8 | on:
9 | push:
10 | branches: [ master ]
11 | pull_request:
12 | branches: [ master ]
13 |
14 | jobs:
15 | build:
16 | runs-on: ubuntu-latest
17 |
18 | steps:
19 | - uses: actions/checkout@v2
20 |
21 | # Note: This workflow uses the latest stable version of the Dart SDK.
22 | # You can specify other versions if desired, see documentation here:
23 | # https://github.com/dart-lang/setup-dart/blob/main/README.md
24 | # - uses: dart-lang/setup-dart@v1
25 | - uses: dart-lang/setup-dart@9a04e6d73cca37bd455e0608d7e5092f881fd603
26 |
27 | - name: Install dependencies
28 | run: dart pub get
29 |
30 | # Uncomment this step to verify the use of 'dart format' on each commit.
31 | # - name: Verify formatting
32 | # run: dart format --output=none --set-exit-if-changed .
33 |
34 | # Consider passing '--fatal-infos' for slightly stricter analysis.
35 | - name: Analyze project source
36 | run: dart analyze
37 |
38 | # Your project will need to have tests in test/ and a dependency on
39 | # package:test for this step to succeed. Note that Flutter projects will
40 | # want to change this to 'flutter test'.
41 | - name: Run tests
42 | run: dart test
43 |
--------------------------------------------------------------------------------
/.github/workflows/issue-assign.yml:
--------------------------------------------------------------------------------
1 | name: Auto Assign
2 |
3 | on:
4 | issue_comment:
5 | types: [created]
6 |
7 | jobs:
8 | assign_issues:
9 | if: >
10 | (github.event_name == 'issue_comment' && (
11 | startsWith(github.event.comment.body, '/assign') ||
12 | startsWith(github.event.comment.body, '/unassign') ||
13 | contains(github.event.comment.body, 'assign to me') ||
14 | contains(github.event.comment.body, 'please assign me this') ||
15 | contains(github.event.comment.body, 'assign this to me') ||
16 | contains(github.event.comment.body, 'assign this issue to me') ||
17 | contains(github.event.comment.body, 'I can try fixing this') ||
18 | contains(github.event.comment.body, 'i am interested in doing this') ||
19 | contains(github.event.comment.body, 'I am interested in contributing'))) || github.event_name == 'schedule' || github.event_name == 'workflow_dispatch'
20 | runs-on: ubuntu-latest
21 | steps:
22 | - name: Check for issue assignees
23 | uses: actions/github-script@v4
24 | with:
25 | github-token: ${{ secrets.GITHUB_TOKEN }}
26 | script: |
27 | const issueNumber = context.payload.issue.number;
28 | if (issueNumber) {
29 | const commenter = context.payload.comment.user.login;
30 | const config = {
31 | owner: 'avinashkranjan',
32 | repo: 'Friday',
33 | issue_number: issueNumber,
34 | assignees: [commenter]
35 | };
36 | return github.issues.addAssignees(config);
37 | } else {
38 | return true;
39 | }
40 |
--------------------------------------------------------------------------------
/.github/workflows/issue.yml:
--------------------------------------------------------------------------------
1 | name: Labeling new issue
2 | on:
3 | issues:
4 | types: ['opened']
5 | jobs:
6 | build:
7 | runs-on: ubuntu-latest
8 | steps:
9 | - uses: Renato66/auto-label@master
10 | with:
11 | repo-token: ${{ secrets.GITHUB_TOKEN }}
12 | labels-synonyms: '{"GSSOC21":["gssoc","gssoc21","GSSOC21","GSSOC"]}'
13 |
14 |
--------------------------------------------------------------------------------
/.github/workflows/lint.yml:
--------------------------------------------------------------------------------
1 | name: Prettier Code Formatting
2 |
3 | on:
4 | push:
5 | branches:
6 | - main
7 | - develop
8 | pull_request:
9 | branches:
10 | - main
11 | - develop
12 |
13 | jobs:
14 | prettier-lint:
15 | runs-on: ubuntu-latest
16 | steps:
17 | - name: Checkout repository
18 | uses: actions/checkout@v3
19 |
20 | - name: Run prettier
21 | run: |
22 | npx prettier --check .
23 | prettier_exit_code=$?
24 | if [ $prettier_exit_code -ne 0 ]; then
25 | echo "Prettier check failed. Please run 'npx prettier --write .' to fix formatting issues."
26 | exit 1
27 | fi
28 |
--------------------------------------------------------------------------------
/.github/workflows/release.yml:
--------------------------------------------------------------------------------
1 | name: Changelog
2 | on:
3 | push:
4 | branches:
5 | - main
6 |
7 | jobs:
8 | changelog:
9 | runs-on: ubuntu-latest
10 |
11 | steps:
12 | - uses: actions/checkout@v2
13 |
14 | - name: Conventional Changelog Action
15 | id: changelog
16 | uses: TriPSs/conventional-changelog-action@v3
17 | with:
18 | github-token: ${{ secrets.GITHUB_TOKEN }}
19 | output-file: "false"
20 |
21 | - name: Create Release
22 | uses: actions/create-release@v1
23 | if: ${{ steps.changelog.outputs.skipped == 'false' }}
24 | env:
25 | GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
26 | with:
27 | tag_name: ${{ steps.changelog.outputs.tag }}
28 | release_name: ${{ steps.changelog.outputs.tag }}
29 | body: ${{ steps.changelog.outputs.clean_changelog }}
30 |
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 | # Miscellaneous
2 | *.class
3 | *.log
4 | *.pyc
5 | *.swp
6 | .DS_Store
7 | .atom/
8 | .buildlog/
9 | .history
10 | .svn/
11 |
12 | # IntelliJ related
13 | *.iml
14 | *.ipr
15 | *.iws
16 | .idea/
17 |
18 | # The .vscode folder contains launch configuration and tasks you configure in
19 | # VS Code which you may wish to be included in version control, so this line
20 | # is commented out by default.
21 | .vscode/
22 |
23 | # Flutter/Dart/Pub related
24 | **/doc/api/
25 | **/ios/Flutter/.last_build_id
26 | .dart_tool/
27 | .flutter-plugins
28 | .flutter-plugins-dependencies
29 | .packages
30 | .pub-cache/
31 | .pub/
32 | /build/
33 | .fvm
34 |
35 | # Web related
36 | lib/generated_plugin_registrant.dart
37 |
38 | # Symbolication related
39 | app.*.symbols
40 |
41 | # Obfuscation related
42 | app.*.map.json
43 |
44 | # Exceptions to above rules.
45 | !/packages/flutter_tools/test/data/dart_dependencies_test/**/.packages
46 |
47 | # Demo Video
48 | Friday.mp4
49 |
50 | # remove node_modules
51 | node_modules/
--------------------------------------------------------------------------------
/.metadata:
--------------------------------------------------------------------------------
1 | # This file tracks properties of this Flutter project.
2 | # Used by Flutter tool to assess capabilities and perform upgrades etc.
3 | #
4 | # This file should be version controlled and should not be manually edited.
5 |
6 | version:
7 | revision: fba99f6cf9a14512e461e3122c8ddfaa25394e89
8 | channel: stable
9 |
10 | project_type: app
11 |
--------------------------------------------------------------------------------
/CODE_OF_CONDUCT.md:
--------------------------------------------------------------------------------
1 | # Contributor Covenant Code of Conduct
2 |
3 | ## Our Pledge
4 |
5 | In the interest of fostering an open and welcoming environment, we as
6 | contributors and maintainers pledge to making participation in our project and
7 | our community a harassment-free experience for everyone, regardless of age, body
8 | size, disability, ethnicity, sex characteristics, gender identity and expression,
9 | level of experience, education, socio-economic status, nationality, personal
10 | appearance, race, religion, or sexual identity and orientation.
11 |
12 | ## Our Standards
13 |
14 | Examples of behavior that contributes to creating a positive environment
15 | include:
16 |
17 | * Using welcoming and inclusive language
18 | * Being respectful of differing viewpoints and experiences
19 | * Gracefully accepting constructive criticism
20 | * Focusing on what is best for the community
21 | * Showing empathy towards other community members
22 |
23 | Examples of unacceptable behavior by participants include:
24 |
25 | * The use of sexualized language or imagery and unwelcome sexual attention or
26 | advances
27 | * Trolling, insulting/derogatory comments, and personal or political attacks
28 | * Public or private harassment
29 | * Publishing others' private information, such as a physical or electronic
30 | address, without explicit permission
31 | * Other conduct which could reasonably be considered inappropriate in a
32 | professional setting
33 |
34 | ## Our Responsibilities
35 |
36 | Project maintainers are responsible for clarifying the standards of acceptable
37 | behavior and are expected to take appropriate and fair corrective action in
38 | response to any instances of unacceptable behavior.
39 |
40 | Project maintainers have the right and responsibility to remove, edit, or
41 | reject comments, commits, code, wiki edits, issues, and other contributions
42 | that are not aligned to this Code of Conduct, or to ban temporarily or
43 | permanently any contributor for other behaviors that they deem inappropriate,
44 | threatening, offensive, or harmful.
45 |
46 | ## Scope
47 |
48 | This Code of Conduct applies both within project spaces and in public spaces
49 | when an individual is representing the project or its community. Examples of
50 | representing a project or community include using an official project e-mail
51 | address, posting via an official social media account, or acting as an appointed
52 | representative at an online or offline event. Representation of a project may be
53 | further defined and clarified by project maintainers.
54 |
55 | ## Enforcement
56 |
57 | Instances of abusive, harassing, or otherwise unacceptable behavior may be
58 | reported by contacting the project team at ranjan.avinash@hotmail.com. All
59 | complaints will be reviewed and investigated and will result in a response that
60 | is deemed necessary and appropriate to the circumstances. The project team is
61 | obligated to maintain confidentiality with regard to the reporter of an incident.
62 | Further details of specific enforcement policies may be posted separately.
63 |
64 | Project maintainers who do not follow or enforce the Code of Conduct in good
65 | faith may face temporary or permanent repercussions as determined by other
66 | members of the project's leadership.
67 |
68 | ## Attribution
69 |
70 | This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4,
71 | available at https://www.contributor-covenant.org/version/1/4/code-of-conduct.html
72 |
73 | [homepage]: https://www.contributor-covenant.org
74 |
75 | For answers to common questions about this code of conduct, see
76 | https://www.contributor-covenant.org/faq
77 |
--------------------------------------------------------------------------------
/CONTRIBUTING.md:
--------------------------------------------------------------------------------
1 | # Contributing Guidelines ✅
2 |
3 | This documentation contains a set of guidelines to help you during the contribution process.
4 | We are happy to welcome all the contributions from anyone willing to improve/add new scripts to this project. Thank you for helping out and remember,
5 | **no contribution is too small.**
6 |
7 | ## Submitting Contributions 👩💻👨💻
8 |
9 | Below you will find the process and workflow used to review and merge your changes.
10 |
11 | ## Step 1 : Find an issue
12 |
13 | - Take a look at the Existing Issues or create your **own** Issues!
14 | - Wait for the Issue to be assigned to you after which you can start working on it.
15 | - Note : Every change in this project should/must have an associated issue.
16 |
17 | ## Step 2 : Fork the Project
18 |
19 | - Fork this Repository. This will create a Local Copy of this Repository on your Github Profile. Keep a reference to the original project in `upstream` remote.
20 |
21 | ```
22 | git clone https://github.com//Friday
23 | cd Friday
24 | git remote add upstream https://github.com/avinashkranjan/Friday
25 | ```
26 |
27 | - If you have already forked the project, update your copy before working.
28 |
29 | ```
30 | git remote update
31 | git checkout
32 | git rebase upstream/
33 | ```
34 |
35 | ## Step 3 : Branch
36 |
37 | Create a new branch. Use its name to identify the issue your addressing.
38 |
39 | ```
40 | # It will create a new branch with name Branch_Name and switch to that branch
41 | $ git checkout -b branch_name
42 | ```
43 |
44 | ## Step 4 : Work on the issue assigned
45 |
46 | - Work on the issue(s) assigned to you.
47 | - Add all the files/folders needed.
48 | - After you've made changes or made your contribution to the project add changes to the branch you've just created by:
49 |
50 | ```
51 | # To add all new files to branch Branch_Name
52 | $ git add .
53 | ```
54 |
55 | ## Step 5 : Commit
56 |
57 | - To commit give a descriptive message for the convenience of reveiwer by:
58 |
59 | ```
60 | # This message get associated with all files you have changed
61 | $ git commit -m 'message
62 | ```
63 |
64 | - **NOTE**: A PR should have only one commit. Multiple commits should be squashed.
65 |
66 | ## Step 6 : Work Remotely
67 |
68 | - Now you are ready to your work to the remote repository.
69 | - Push your work to your remote repository.
70 |
71 | - When your work is ready and complies with the project conventions, upload your changes to your fork:
72 |
73 | ```
74 | # To push your work to your remote repository
75 | $ git push -u origin Branch_Name
76 | ```
77 |
78 | ## Step 7 : Pull Request
79 |
80 | - Go to your repository in browser and click on compare and pull requests.
81 | - Add a title and description to your pull request that explains your contribution.
82 |
83 | - Voila! Your Pull Request has been submitted and will be reviewed by the moderators and merged.🥳
84 |
85 | ## Need more help?🤔
86 |
87 | You can refer to the following articles on basics of Git and Github and also contact the Project Mentors, in case you are stuck:
88 |
89 | - [Forking a Repo](https://help.github.com/en/github/getting-started-with-github/fork-a-repo)
90 | - [Cloning a Repo](https://docs.github.com/en/repositories/creating-and-managing-repositories/cloning-a-repository)
91 | - [How to create a Pull Request](https://opensource.com/article/19/7/create-pull-request-github)
92 | - [Getting started with Git and GitHub](https://towardsdatascience.com/getting-started-with-git-and-github-6fcd0f2d4ac6)
93 | - [Learn GitHub from Scratch](https://lab.github.com/githubtraining/introduction-to-github)
94 |
95 | ## Tip from us😇
96 |
97 | Learning and understanding takes time, so don't worry if things seem challenging at first. So, do not worry at all. We know **you have got this**!💪
98 |
--------------------------------------------------------------------------------
/Dockerfile:
--------------------------------------------------------------------------------
1 | # Start with a base image
2 | FROM openjdk:8-jdk
3 |
4 | # Set environment variables
5 | ENV ANDROID_COMPILE_SDK=29
6 | ENV ANDROID_BUILD_TOOLS=29.0.3
7 | ENV ANDROID_SDK_TOOLS=6858069
8 |
9 | # Install dependencies
10 | RUN apt-get --quiet update --yes
11 | RUN apt-get --quiet install --yes wget tar unzip lib32stdc++6 lib32z1
12 |
13 | # Download and install Android SDK
14 | RUN wget --quiet --output-document=android-sdk.zip https://dl.google.com/android/repository/commandlinetools-linux-${ANDROID_SDK_TOOLS}_latest.zip
15 | RUN unzip -d android-sdk-linux android-sdk.zip
16 | RUN echo "y" | android-sdk-linux/tools/bin/sdkmanager --sdk_root=android-sdk-linux --install "platforms;android-${ANDROID_COMPILE_SDK}" "build-tools;${ANDROID_BUILD_TOOLS}"
17 | ENV ANDROID_HOME=/android-sdk-linux
18 |
19 | # Add Flutter SDK to the path
20 | ENV FLUTTER_HOME=/flutter
21 | ENV PATH=$PATH:${FLUTTER_HOME}/bin:${FLUTTER_HOME}/bin/cache/dart-sdk/bin
22 |
23 | # Download and install Flutter SDK
24 | RUN git clone --branch stable https://github.com/flutter/flutter.git ${FLUTTER_HOME}
25 | RUN flutter doctor
26 |
27 | # Install Figma CLI
28 | RUN apt-get --quiet install --yes npm
29 | RUN npm install --global figma-cli
30 |
31 | # Set up workspace
32 | WORKDIR /app
33 |
34 | # Copy the project files
35 | COPY . .
36 |
37 | # Install project dependencies
38 | RUN flutter pub get
39 |
40 | # Build the Android APK
41 | RUN flutter build apk
42 |
43 | # Start the app
44 | CMD ["flutter", "run", "--release"]
45 |
--------------------------------------------------------------------------------
/LICENSE:
--------------------------------------------------------------------------------
1 | MIT License
2 |
3 | Copyright (c) 2020 Avinash Kr. Ranjan
4 |
5 | Permission is hereby granted, free of charge, to any person obtaining a copy
6 | of this software and associated documentation files (the "Software"), to deal
7 | in the Software without restriction, including without limitation the rights
8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9 | copies of the Software, and to permit persons to whom the Software is
10 | furnished to do so, subject to the following conditions:
11 |
12 | The above copyright notice and this permission notice shall be included in all
13 | copies or substantial portions of the Software.
14 |
15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21 | SOFTWARE.
22 |
--------------------------------------------------------------------------------
/WikiPagesREADME.md:
--------------------------------------------------------------------------------
1 | Welcome Developers
2 |
3 | 💙 Introducing Our New Project 💙
4 | 🎓 Friday
5 |
6 | Your Personal Class Assistant, It'll never let you miss another assignment deadline or any upcoming test.
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 | 📢 About the Project
15 |
16 | #### This is an Educational project which helps the student to make discipline about their study and get Familiar With Online Study With Proper Schedule.
17 |
18 |
19 |
20 | 🎯 Purpose of This Project
21 |
22 | #### Since after the pandemic almost everything has been moved on virtual world So has Education. All our classes have been moved online and with that all our ***_assignments_***, ***_test_***, ***_exams_***, ***_Viva_*** are being held on the online platform as well, With so many assignments deadlines, upcoming exams dates, and being busy with our life we forget the deadlines and exam dates on most occasion. I don't know how many of you but it happens to me frequently. So I came up with this app which once fed with all the required data it'll remind you of the ***_assignment deadlines_***, ***_upcoming exams_***, ***_unfinished homework_***. So, you can plan your schedule accordingly.
23 |
24 |
25 |
26 | 🚀 App Current Features
27 |
28 |
29 | #### 1. You can Make Separate Account to Maintain Your Activity through Different options(e.g. Email and Password Authentication, Google Sign-in, Facebook Sign-in)
30 |
31 | #### 2. Navigate to the Different Pages to Notice Your Different Activity
32 |
33 | #### 3. Store Information About Your Assignment, Online Class Schedule
34 |
35 | #### 4. Track Your Performance
36 |
37 | #### 5. Remainning Time to Attend Class
38 |
39 |
40 |
41 |
42 |
43 | 🔰 Issues It Can Solve
44 |
45 |
46 |
47 | #### 1. Meeting Attending Link Store With Proper Frame.
48 |
49 | #### 2. Automatic Class Attend at the Scheduled Time(If Meeting Link Present)
50 |
51 | #### 3. Store Notes or Assignment with Proper Format
52 |
53 |
📌 More Features Will Introduce Soon 📌
54 |
55 |
56 |
57 | Show 💘 by Starring this Repo
--------------------------------------------------------------------------------
/android/.gitignore:
--------------------------------------------------------------------------------
1 | gradle-wrapper.jar
2 | /.gradle
3 | /captures/
4 | /gradlew
5 | /gradlew.bat
6 | /local.properties
7 | GeneratedPluginRegistrant.java
8 |
9 | # Remember to never publicly share your keystore.
10 | # See https://flutter.dev/docs/deployment/android#reference-the-keystore-from-the-app
11 | key.properties
12 | app/upload-keystore.jks
--------------------------------------------------------------------------------
/android/.project:
--------------------------------------------------------------------------------
1 |
2 |
3 | android
4 | Project android created by Buildship.
5 |
6 |
7 |
8 |
9 | org.eclipse.buildship.core.gradleprojectbuilder
10 |
11 |
12 |
13 |
14 |
15 | org.eclipse.buildship.core.gradleprojectnature
16 |
17 |
18 |
19 | 1687201458134
20 |
21 | 30
22 |
23 | org.eclipse.core.resources.regexFilterMatcher
24 | node_modules|\.git|__CREATED_BY_JAVA_LANGUAGE_SERVER__
25 |
26 |
27 |
28 |
29 |
--------------------------------------------------------------------------------
/android/.settings/org.eclipse.buildship.core.prefs:
--------------------------------------------------------------------------------
1 | arguments=--init-script /var/folders/xv/0gfqfnr17bdcwbbnbb0gm0rr0000gn/T/d146c9752a26f79b52047fb6dc6ed385d064e120494f96f08ca63a317c41f94c.gradle --init-script /var/folders/xv/0gfqfnr17bdcwbbnbb0gm0rr0000gn/T/52cde0cfcf3e28b8b7510e992210d9614505e0911af0c190bd590d7158574963.gradle
2 | auto.sync=false
3 | build.scans.enabled=false
4 | connection.gradle.distribution=GRADLE_DISTRIBUTION(VERSION(7.4.2))
5 | connection.project.dir=
6 | eclipse.preferences.version=1
7 | gradle.user.home=
8 | java.home=/Library/Java/JavaVirtualMachines/zulu-11.jdk/Contents/Home
9 | jvm.arguments=
10 | offline.mode=false
11 | override.workspace.settings=true
12 | show.console.view=true
13 | show.executions.view=true
14 |
--------------------------------------------------------------------------------
/android/app/build.gradle:
--------------------------------------------------------------------------------
1 | def localProperties = new Properties()
2 | def localPropertiesFile = rootProject.file('local.properties')
3 | if (localPropertiesFile.exists()) {
4 | localPropertiesFile.withReader('UTF-8') { reader ->
5 | localProperties.load(reader)
6 | }
7 | }
8 |
9 | def flutterRoot = localProperties.getProperty('flutter.sdk')
10 | if (flutterRoot == null) {
11 | throw new FileNotFoundException("Flutter SDK not found. Define location with flutter.sdk in the local.properties file.")
12 | }
13 |
14 | def flutterVersionCode = localProperties.getProperty('flutter.versionCode')
15 | if (flutterVersionCode == null) {
16 | flutterVersionCode = '1'
17 | }
18 |
19 | def flutterVersionName = localProperties.getProperty('flutter.versionName')
20 | if (flutterVersionName == null) {
21 | flutterVersionName = '1.0'
22 | }
23 |
24 | apply plugin: 'com.android.application'
25 | apply plugin: 'com.google.gms.google-services'
26 | apply plugin: 'kotlin-android'
27 | apply from: "$flutterRoot/packages/flutter_tools/gradle/flutter.gradle"
28 |
29 | def keystoreProperties = new Properties()
30 | def keystorePropertiesFile = rootProject.file('key.properties')
31 | if (keystorePropertiesFile.exists()) {
32 | keystoreProperties.load(new FileInputStream(keystorePropertiesFile))
33 | }
34 |
35 | android {
36 | compileSdkVersion flutter.compileSdkVersion
37 |
38 | sourceSets {
39 | main.java.srcDirs += 'src/main/kotlin'
40 | }
41 |
42 | lintOptions {
43 | disable 'InvalidPackage'
44 | }
45 |
46 | defaultConfig {
47 | // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html).
48 | applicationId "com.avinashkranjan.friday"
49 | minSdkVersion 21
50 | targetSdkVersion flutter.targetSdkVersion
51 | versionCode flutterVersionCode.toInteger()
52 | versionName flutterVersionName
53 | multiDexEnabled true
54 | }
55 |
56 | signingConfigs {
57 | release {
58 | keyAlias keystoreProperties['keyAlias']
59 | keyPassword keystoreProperties['keyPassword']
60 | storeFile keystoreProperties['storeFile'] ? file(keystoreProperties['storeFile']) : null
61 | storePassword keystoreProperties['storePassword']
62 | }
63 | }
64 | buildTypes {
65 | release {
66 | signingConfig signingConfigs.release
67 | }
68 | }
69 |
70 | }
71 |
72 | flutter {
73 | source '../..'
74 | }
75 |
76 | dependencies {
77 | // Importing the Firebase BoM
78 | // Using Firebase BoM, declaration of dependencies of the Firebase product is needed without specifying their specific versions
79 | implementation platform('com.google.firebase:firebase-bom:26.2.0')
80 | // Declaring the dependency for the Firebase SDK for Google Analytics
81 | implementation 'com.google.firebase:firebase-analytics'
82 | // Declaring the dependencies for Firebase Authentication
83 | implementation 'com.google.firebase:firebase-auth'
84 | implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version"
85 | // For Facebook Authentication
86 | implementation 'com.facebook.android:facebook-android-sdk:5.15.3'
87 | }
88 |
--------------------------------------------------------------------------------
/android/app/google-services.json:
--------------------------------------------------------------------------------
1 | {
2 | "project_info": {
3 | "project_number": "1045472240686",
4 | "project_id": "friday-683ad",
5 | "storage_bucket": "friday-683ad.appspot.com"
6 | },
7 | "client": [
8 | {
9 | "client_info": {
10 | "mobilesdk_app_id": "1:1045472240686:android:30a67f49892fee138febbf",
11 | "android_client_info": {
12 | "package_name": "com.avinashkranjan.friday"
13 | }
14 | },
15 | "oauth_client": [
16 | {
17 | "client_id": "1045472240686-kb4dutm11oj1kvv64440ruu28u624lk0.apps.googleusercontent.com",
18 | "client_type": 3
19 | }
20 | ],
21 | "api_key": [
22 | {
23 | "current_key": "AIzaSyAUIjZBBzAPZ83p1yDPCOAra-ErOs9K2ls"
24 | }
25 | ],
26 | "services": {
27 | "appinvite_service": {
28 | "other_platform_oauth_client": [
29 | {
30 | "client_id": "1045472240686-kb4dutm11oj1kvv64440ruu28u624lk0.apps.googleusercontent.com",
31 | "client_type": 3
32 | },
33 | {
34 | "client_id": "1045472240686-6hi7tgkpuq1860ntv6ungfqv4f8pop23.apps.googleusercontent.com",
35 | "client_type": 2,
36 | "ios_info": {
37 | "bundle_id": "io.flutter.flutter.app"
38 | }
39 | }
40 | ]
41 | }
42 | }
43 | },
44 | {
45 | "client_info": {
46 | "mobilesdk_app_id": "1:1045472240686:android:03a08917e27637088febbf",
47 | "android_client_info": {
48 | "package_name": "com.example.class_manager"
49 | }
50 | },
51 | "oauth_client": [
52 | {
53 | "client_id": "1045472240686-q3fnk5dg2ra4lg4u3ufqe2pkj74gm6st.apps.googleusercontent.com",
54 | "client_type": 1,
55 | "android_info": {
56 | "package_name": "com.example.class_manager",
57 | "certificate_hash": "1196d792aca8f2486fc068a03f5abda9d0d0fe50"
58 | }
59 | },
60 | {
61 | "client_id": "1045472240686-u6nq1paekv6a6jd10h813g2rqkfn977b.apps.googleusercontent.com",
62 | "client_type": 1,
63 | "android_info": {
64 | "package_name": "com.example.class_manager",
65 | "certificate_hash": "026591a5ef09087a8f36e0991636e4bd40bfd9f2"
66 | }
67 | },
68 | {
69 | "client_id": "1045472240686-kb4dutm11oj1kvv64440ruu28u624lk0.apps.googleusercontent.com",
70 | "client_type": 3
71 | }
72 | ],
73 | "api_key": [
74 | {
75 | "current_key": "AIzaSyAUIjZBBzAPZ83p1yDPCOAra-ErOs9K2ls"
76 | }
77 | ],
78 | "services": {
79 | "appinvite_service": {
80 | "other_platform_oauth_client": [
81 | {
82 | "client_id": "1045472240686-kb4dutm11oj1kvv64440ruu28u624lk0.apps.googleusercontent.com",
83 | "client_type": 3
84 | },
85 | {
86 | "client_id": "1045472240686-6hi7tgkpuq1860ntv6ungfqv4f8pop23.apps.googleusercontent.com",
87 | "client_type": 2,
88 | "ios_info": {
89 | "bundle_id": "io.flutter.flutter.app"
90 | }
91 | }
92 | ]
93 | }
94 | }
95 | }
96 | ],
97 | "configuration_version": "1"
98 | }
--------------------------------------------------------------------------------
/android/app/src/debug/AndroidManifest.xml:
--------------------------------------------------------------------------------
1 |
3 |
6 |
7 |
8 |
--------------------------------------------------------------------------------
/android/app/src/main/AndroidManifest.xml:
--------------------------------------------------------------------------------
1 |
4 |
9 |
10 |
11 |
17 |
25 |
29 |
33 |
38 |
39 |
40 |
41 |
42 |
43 |
45 |
47 |
48 |
52 |
55 |
56 |
57 |
58 |
59 |
60 |
61 |
62 |
63 |
66 |
67 |
68 |
--------------------------------------------------------------------------------
/android/app/src/main/java/io/flutter/app/FlutterMultiDexApplication.java:
--------------------------------------------------------------------------------
1 | // Generated file.
2 | //
3 | // If you wish to remove Flutter's multidex support, delete this entire file.
4 | //
5 | // Modifications to this file should be done in a copy under a different name
6 | // as this file may be regenerated.
7 |
8 | package io.flutter.app;
9 |
10 | import android.app.Application;
11 | import android.content.Context;
12 | import androidx.annotation.CallSuper;
13 | import androidx.multidex.MultiDex;
14 |
15 | /**
16 | * Extension of {@link android.app.Application}, adding multidex support.
17 | */
18 | public class FlutterMultiDexApplication extends Application {
19 | @Override
20 | @CallSuper
21 | protected void attachBaseContext(Context base) {
22 | super.attachBaseContext(base);
23 | MultiDex.install(this);
24 | }
25 | }
26 |
--------------------------------------------------------------------------------
/android/app/src/main/kotlin/com/example/class_manager/MainActivity.kt:
--------------------------------------------------------------------------------
1 | package com.example.friday
2 |
3 | import io.flutter.embedding.android.FlutterActivity
4 |
5 | class MainActivity: FlutterActivity() {
6 | }
7 |
--------------------------------------------------------------------------------
/android/app/src/main/res/drawable-v21/launch_background.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
12 |
13 |
--------------------------------------------------------------------------------
/android/app/src/main/res/drawable/launch_background.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 | -
8 |
11 |
12 |
13 |
--------------------------------------------------------------------------------
/android/app/src/main/res/drawable/launch_image.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/avinashkranjan/Friday/6f54113d46877db92193ea6cbeae97528eed0e60/android/app/src/main/res/drawable/launch_image.png
--------------------------------------------------------------------------------
/android/app/src/main/res/mipmap-hdpi/ic_launcher.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/avinashkranjan/Friday/6f54113d46877db92193ea6cbeae97528eed0e60/android/app/src/main/res/mipmap-hdpi/ic_launcher.png
--------------------------------------------------------------------------------
/android/app/src/main/res/mipmap-hdpi/launcher_icon.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/avinashkranjan/Friday/6f54113d46877db92193ea6cbeae97528eed0e60/android/app/src/main/res/mipmap-hdpi/launcher_icon.png
--------------------------------------------------------------------------------
/android/app/src/main/res/mipmap-mdpi/ic_launcher.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/avinashkranjan/Friday/6f54113d46877db92193ea6cbeae97528eed0e60/android/app/src/main/res/mipmap-mdpi/ic_launcher.png
--------------------------------------------------------------------------------
/android/app/src/main/res/mipmap-mdpi/launcher_icon.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/avinashkranjan/Friday/6f54113d46877db92193ea6cbeae97528eed0e60/android/app/src/main/res/mipmap-mdpi/launcher_icon.png
--------------------------------------------------------------------------------
/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/avinashkranjan/Friday/6f54113d46877db92193ea6cbeae97528eed0e60/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png
--------------------------------------------------------------------------------
/android/app/src/main/res/mipmap-xhdpi/launcher_icon.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/avinashkranjan/Friday/6f54113d46877db92193ea6cbeae97528eed0e60/android/app/src/main/res/mipmap-xhdpi/launcher_icon.png
--------------------------------------------------------------------------------
/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/avinashkranjan/Friday/6f54113d46877db92193ea6cbeae97528eed0e60/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png
--------------------------------------------------------------------------------
/android/app/src/main/res/mipmap-xxhdpi/launcher_icon.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/avinashkranjan/Friday/6f54113d46877db92193ea6cbeae97528eed0e60/android/app/src/main/res/mipmap-xxhdpi/launcher_icon.png
--------------------------------------------------------------------------------
/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/avinashkranjan/Friday/6f54113d46877db92193ea6cbeae97528eed0e60/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png
--------------------------------------------------------------------------------
/android/app/src/main/res/mipmap-xxxhdpi/launcher_icon.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/avinashkranjan/Friday/6f54113d46877db92193ea6cbeae97528eed0e60/android/app/src/main/res/mipmap-xxxhdpi/launcher_icon.png
--------------------------------------------------------------------------------
/android/app/src/main/res/values-night/styles.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
9 |
15 |
18 |
19 |
--------------------------------------------------------------------------------
/android/app/src/main/res/values/colors.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 | #12171D
4 |
5 |
--------------------------------------------------------------------------------
/android/app/src/main/res/values/strings.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 | friday
4 |
5 |
6 | 280965223417108
7 |
8 |
12 | fb280965223417108
13 |
14 |
--------------------------------------------------------------------------------
/android/app/src/main/res/values/styles.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
9 |
15 |
18 |
19 |
--------------------------------------------------------------------------------
/android/app/src/profile/AndroidManifest.xml:
--------------------------------------------------------------------------------
1 |
3 |
6 |
7 |
8 |
--------------------------------------------------------------------------------
/android/build.gradle:
--------------------------------------------------------------------------------
1 | buildscript {
2 | ext.kotlin_version = '1.7.10'
3 | repositories {
4 | google()
5 | jcenter()
6 | mavenCentral()
7 | }
8 |
9 | dependencies {
10 | // Google Services Dependency
11 | classpath 'com.google.gms:google-services:4.3.5'
12 | classpath 'com.android.tools.build:gradle:7.3.0'
13 | classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
14 | }
15 | }
16 |
17 | allprojects {
18 | repositories {
19 | google()
20 | jcenter()
21 | }
22 | }
23 |
24 | rootProject.buildDir = '../build'
25 | subprojects {
26 | project.buildDir = "${rootProject.buildDir}/${project.name}"
27 | }
28 | subprojects {
29 | project.evaluationDependsOn(':app')
30 | }
31 |
32 | tasks.register("clean", Delete) {
33 | delete rootProject.buildDir
34 | }
35 |
--------------------------------------------------------------------------------
/android/gradle.properties:
--------------------------------------------------------------------------------
1 | org.gradle.jvmargs=-Xmx1536M
2 | android.enableR8=true
3 | android.useAndroidX=true
4 | android.enableJetifier=true
5 |
--------------------------------------------------------------------------------
/android/gradle/wrapper/gradle-wrapper.properties:
--------------------------------------------------------------------------------
1 | #Sat Jul 08 17:16:41 IST 2023
2 | distributionBase=GRADLE_USER_HOME
3 | distributionUrl=https\://services.gradle.org/distributions/gradle-7.4.2-bin.zip
4 | distributionPath=wrapper/dists
5 | zipStorePath=wrapper/dists
6 | zipStoreBase=GRADLE_USER_HOME
7 |
--------------------------------------------------------------------------------
/android/settings.gradle:
--------------------------------------------------------------------------------
1 | include ':app'
2 |
3 | def localPropertiesFile = new File(rootProject.projectDir, "local.properties")
4 | def properties = new Properties()
5 |
6 | assert localPropertiesFile.exists()
7 | localPropertiesFile.withReader("UTF-8") { reader -> properties.load(reader) }
8 |
9 | def flutterSdkPath = properties.getProperty("flutter.sdk")
10 | assert flutterSdkPath != null, "flutter.sdk not set in local.properties"
11 | apply from: "$flutterSdkPath/packages/flutter_tools/gradle/app_plugin_loader.gradle"
12 |
--------------------------------------------------------------------------------
/android/settings_aar.gradle:
--------------------------------------------------------------------------------
1 | include ':app'
2 |
--------------------------------------------------------------------------------
/assets/icons/homework.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/assets/icons/house.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/assets/icons/icon.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/avinashkranjan/Friday/6f54113d46877db92193ea6cbeae97528eed0e60/assets/icons/icon.png
--------------------------------------------------------------------------------
/assets/icons/read_book.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/assets/icons/test.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/assets/icons/user.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/assets/images/fbook.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/avinashkranjan/Friday/6f54113d46877db92193ea6cbeae97528eed0e60/assets/images/fbook.png
--------------------------------------------------------------------------------
/assets/images/google.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/avinashkranjan/Friday/6f54113d46877db92193ea6cbeae97528eed0e60/assets/images/google.png
--------------------------------------------------------------------------------
/assets/images/phone.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/avinashkranjan/Friday/6f54113d46877db92193ea6cbeae97528eed0e60/assets/images/phone.png
--------------------------------------------------------------------------------
/assets/images/profile_pic.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/avinashkranjan/Friday/6f54113d46877db92193ea6cbeae97528eed0e60/assets/images/profile_pic.jpg
--------------------------------------------------------------------------------
/assets/images/slider1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/avinashkranjan/Friday/6f54113d46877db92193ea6cbeae97528eed0e60/assets/images/slider1.png
--------------------------------------------------------------------------------
/assets/images/slider2.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/avinashkranjan/Friday/6f54113d46877db92193ea6cbeae97528eed0e60/assets/images/slider2.png
--------------------------------------------------------------------------------
/assets/images/slider3.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/avinashkranjan/Friday/6f54113d46877db92193ea6cbeae97528eed0e60/assets/images/slider3.png
--------------------------------------------------------------------------------
/design-assets/Color scheme/color_design.md:
--------------------------------------------------------------------------------
1 | #new color scheme added for friday app
2 |
3 | https://docs.google.com/document/d/14mxkLvEQ7iCi1eaOutgqBEQKfqL-S4gP9fH5wItE5UU/edit?usp=sharing
4 |
5 | ---
6 |
7 | In the friday application color scheme used can be:
8 |
9 | # Red:
10 |
11 |  This vibrant red color is used to highlight important elements and create a sense of urgency within the application. It is typically used for error messages or critical notifications.
12 |
13 | # Green:
14 |
15 |  The soothing green color is used to indicate success or positive actions. It is commonly used for confirming successful operations, indicating progress, or displaying success messages.
16 |
17 | # Blue:
18 |
19 |  The calming blue color is used for primary elements and navigation within the application. It provides a sense of trust, stability, and reliability. It is often used for primary buttons, links, or important headings.
20 |
21 | These colors are carefully chosen to create a visually appealing and intuitive user experience. They help in conveying meaning, drawing attention to key elements, and providing visual cues for users while interacting with the application.
22 |
23 | ---
24 |
25 |
26 |
--------------------------------------------------------------------------------
/design-assets/Figma (Adding more graphics)/Frame 1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/avinashkranjan/Friday/6f54113d46877db92193ea6cbeae97528eed0e60/design-assets/Figma (Adding more graphics)/Frame 1.png
--------------------------------------------------------------------------------
/design-assets/Figma (Adding more graphics)/Frame 2.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/avinashkranjan/Friday/6f54113d46877db92193ea6cbeae97528eed0e60/design-assets/Figma (Adding more graphics)/Frame 2.png
--------------------------------------------------------------------------------
/design-assets/Figma (Adding more graphics)/Frame 3.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/avinashkranjan/Friday/6f54113d46877db92193ea6cbeae97528eed0e60/design-assets/Figma (Adding more graphics)/Frame 3.png
--------------------------------------------------------------------------------
/design-assets/Figma (Adding more graphics)/Frame 4.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/avinashkranjan/Friday/6f54113d46877db92193ea6cbeae97528eed0e60/design-assets/Figma (Adding more graphics)/Frame 4.png
--------------------------------------------------------------------------------
/design-assets/Figma (Adding more graphics)/Frame 5.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/avinashkranjan/Friday/6f54113d46877db92193ea6cbeae97528eed0e60/design-assets/Figma (Adding more graphics)/Frame 5.png
--------------------------------------------------------------------------------
/design-assets/Figma (Adding more graphics)/Frame 6.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/avinashkranjan/Friday/6f54113d46877db92193ea6cbeae97528eed0e60/design-assets/Figma (Adding more graphics)/Frame 6.png
--------------------------------------------------------------------------------
/design-assets/Figma (Adding more graphics)/Friday-Figma.mp4:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/avinashkranjan/Friday/6f54113d46877db92193ea6cbeae97528eed0e60/design-assets/Figma (Adding more graphics)/Friday-Figma.mp4
--------------------------------------------------------------------------------
/design-assets/Figma (Adding more graphics)/Readme.md:
--------------------------------------------------------------------------------
1 | Changed the Ui an Ux of the app.
2 | Figma url:-
3 | https://www.figma.com/file/Vual4XIKyWfTLSwOmGv1AZ/Friday?type=design&node-id=0-1&t=gHlXBbljW0LNKZKp-0
4 |
--------------------------------------------------------------------------------
/design-assets/graphics/.picasa.ini:
--------------------------------------------------------------------------------
1 | [feature-graphic.jpeg]
2 | backuphash=48668
3 |
--------------------------------------------------------------------------------
/design-assets/graphics/app-icon.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/avinashkranjan/Friday/6f54113d46877db92193ea6cbeae97528eed0e60/design-assets/graphics/app-icon.png
--------------------------------------------------------------------------------
/design-assets/graphics/feature-graphic.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/avinashkranjan/Friday/6f54113d46877db92193ea6cbeae97528eed0e60/design-assets/graphics/feature-graphic.png
--------------------------------------------------------------------------------
/design-assets/graphics/friday_application_preview/README.md:
--------------------------------------------------------------------------------
1 | # Friday Application Preview
2 |
3 | ## Screenshot of the application
4 | - The screenshots of the application are in this [folder](play_store_screenshots)
5 | - The screenshots are taken directly from the launched app on the play store
6 | - The screenshots should ideally be taken using a pixel device or an iOS device
7 |
8 | ## Framing of the applicatio
9 | - The framed screenshots of the application are in this [folder](play_store_screenshots_framed).
10 | - A [great website](https://mockuphone.com/) for framing the applications. Available both for iOS and Android devices
11 | - Google's own [device generator website](https://developer.android.com/distribute/marketing-tools/device-art-generator)
12 |
13 | ## Design file of the application
14 | - The design is done using Canva
15 | - Here is the [project](https://www.canva.com/design/DAFkLrryw1M/Brawk_1GNAHtBeZ0mL8Mog/edit?utm_content=DAFkLrryw1M&utm_campaign=designshare&utm_medium=link2&utm_source=sharebutton)
16 |
17 | ## Application Preview
18 | 
19 |
20 |
--------------------------------------------------------------------------------
/design-assets/graphics/friday_application_preview/friday_application_preview.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/avinashkranjan/Friday/6f54113d46877db92193ea6cbeae97528eed0e60/design-assets/graphics/friday_application_preview/friday_application_preview.png
--------------------------------------------------------------------------------
/design-assets/graphics/friday_application_preview/play_store_screenshots/alerts_section.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/avinashkranjan/Friday/6f54113d46877db92193ea6cbeae97528eed0e60/design-assets/graphics/friday_application_preview/play_store_screenshots/alerts_section.png
--------------------------------------------------------------------------------
/design-assets/graphics/friday_application_preview/play_store_screenshots/classes_section.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/avinashkranjan/Friday/6f54113d46877db92193ea6cbeae97528eed0e60/design-assets/graphics/friday_application_preview/play_store_screenshots/classes_section.png
--------------------------------------------------------------------------------
/design-assets/graphics/friday_application_preview/play_store_screenshots/home_section.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/avinashkranjan/Friday/6f54113d46877db92193ea6cbeae97528eed0e60/design-assets/graphics/friday_application_preview/play_store_screenshots/home_section.png
--------------------------------------------------------------------------------
/design-assets/graphics/friday_application_preview/play_store_screenshots/homework_section.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/avinashkranjan/Friday/6f54113d46877db92193ea6cbeae97528eed0e60/design-assets/graphics/friday_application_preview/play_store_screenshots/homework_section.png
--------------------------------------------------------------------------------
/design-assets/graphics/friday_application_preview/play_store_screenshots/profile_section.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/avinashkranjan/Friday/6f54113d46877db92193ea6cbeae97528eed0e60/design-assets/graphics/friday_application_preview/play_store_screenshots/profile_section.png
--------------------------------------------------------------------------------
/design-assets/graphics/friday_application_preview/play_store_screenshots/sign_up_section.jpeg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/avinashkranjan/Friday/6f54113d46877db92193ea6cbeae97528eed0e60/design-assets/graphics/friday_application_preview/play_store_screenshots/sign_up_section.jpeg
--------------------------------------------------------------------------------
/design-assets/graphics/friday_application_preview/play_store_screenshots_framed/alerts_section_framed.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/avinashkranjan/Friday/6f54113d46877db92193ea6cbeae97528eed0e60/design-assets/graphics/friday_application_preview/play_store_screenshots_framed/alerts_section_framed.png
--------------------------------------------------------------------------------
/design-assets/graphics/friday_application_preview/play_store_screenshots_framed/classes_section_framed.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/avinashkranjan/Friday/6f54113d46877db92193ea6cbeae97528eed0e60/design-assets/graphics/friday_application_preview/play_store_screenshots_framed/classes_section_framed.png
--------------------------------------------------------------------------------
/design-assets/graphics/friday_application_preview/play_store_screenshots_framed/home_section_framed.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/avinashkranjan/Friday/6f54113d46877db92193ea6cbeae97528eed0e60/design-assets/graphics/friday_application_preview/play_store_screenshots_framed/home_section_framed.png
--------------------------------------------------------------------------------
/design-assets/graphics/friday_application_preview/play_store_screenshots_framed/homework_section_framed.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/avinashkranjan/Friday/6f54113d46877db92193ea6cbeae97528eed0e60/design-assets/graphics/friday_application_preview/play_store_screenshots_framed/homework_section_framed.png
--------------------------------------------------------------------------------
/design-assets/graphics/friday_application_preview/play_store_screenshots_framed/profile_section_framed.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/avinashkranjan/Friday/6f54113d46877db92193ea6cbeae97528eed0e60/design-assets/graphics/friday_application_preview/play_store_screenshots_framed/profile_section_framed.png
--------------------------------------------------------------------------------
/design-assets/graphics/friday_application_preview/play_store_screenshots_framed/sign_up_section_framed.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/avinashkranjan/Friday/6f54113d46877db92193ea6cbeae97528eed0e60/design-assets/graphics/friday_application_preview/play_store_screenshots_framed/sign_up_section_framed.png
--------------------------------------------------------------------------------
/design-assets/graphics/phone-ss-1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/avinashkranjan/Friday/6f54113d46877db92193ea6cbeae97528eed0e60/design-assets/graphics/phone-ss-1.png
--------------------------------------------------------------------------------
/design-assets/graphics/phone-ss-2.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/avinashkranjan/Friday/6f54113d46877db92193ea6cbeae97528eed0e60/design-assets/graphics/phone-ss-2.png
--------------------------------------------------------------------------------
/design-assets/graphics/phone-ss-3.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/avinashkranjan/Friday/6f54113d46877db92193ea6cbeae97528eed0e60/design-assets/graphics/phone-ss-3.png
--------------------------------------------------------------------------------
/design-assets/graphics/phone-ss-4.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/avinashkranjan/Friday/6f54113d46877db92193ea6cbeae97528eed0e60/design-assets/graphics/phone-ss-4.png
--------------------------------------------------------------------------------
/ios/.gitignore:
--------------------------------------------------------------------------------
1 | *.mode1v3
2 | *.mode2v3
3 | *.moved-aside
4 | *.pbxuser
5 | *.perspectivev3
6 | **/*sync/
7 | .sconsign.dblite
8 | .tags*
9 | **/.vagrant/
10 | **/DerivedData/
11 | Icon?
12 | **/Pods/
13 | **/.symlinks/
14 | profile
15 | xcuserdata
16 | **/.generated/
17 | Flutter/App.framework
18 | Flutter/Flutter.framework
19 | Flutter/Flutter.podspec
20 | Flutter/Generated.xcconfig
21 | Flutter/app.flx
22 | Flutter/app.zip
23 | Flutter/flutter_assets/
24 | Flutter/flutter_export_environment.sh
25 | ServiceDefinitions.json
26 | Runner/GeneratedPluginRegistrant.*
27 |
28 | # Exceptions to above rules.
29 | !default.mode1v3
30 | !default.mode2v3
31 | !default.pbxuser
32 | !default.perspectivev3
33 |
--------------------------------------------------------------------------------
/ios/Flutter/AppFrameworkInfo.plist:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | CFBundleDevelopmentRegion
6 | $(DEVELOPMENT_LANGUAGE)
7 | CFBundleExecutable
8 | App
9 | CFBundleIdentifier
10 | io.flutter.flutter.app
11 | CFBundleInfoDictionaryVersion
12 | 6.0
13 | CFBundleName
14 | App
15 | CFBundlePackageType
16 | FMWK
17 | CFBundleShortVersionString
18 | 1.0
19 | CFBundleSignature
20 | ????
21 | CFBundleVersion
22 | 1.0
23 | MinimumOSVersion
24 | 11.0
25 |
26 |
27 |
--------------------------------------------------------------------------------
/ios/Flutter/Debug.xcconfig:
--------------------------------------------------------------------------------
1 | #include? "Pods/Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"
2 | #include "Generated.xcconfig"
3 |
--------------------------------------------------------------------------------
/ios/Flutter/Release.xcconfig:
--------------------------------------------------------------------------------
1 | #include? "Pods/Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"
2 | #include "Generated.xcconfig"
3 |
--------------------------------------------------------------------------------
/ios/Podfile:
--------------------------------------------------------------------------------
1 | # Uncomment this line to define a global platform for your project
2 | # platform :ios, '11.0'
3 |
4 | # CocoaPods analytics sends network stats synchronously affecting flutter build latency.
5 | ENV['COCOAPODS_DISABLE_STATS'] = 'true'
6 |
7 | project 'Runner', {
8 | 'Debug' => :debug,
9 | 'Profile' => :release,
10 | 'Release' => :release,
11 | }
12 |
13 | def flutter_root
14 | generated_xcode_build_settings_path = File.expand_path(File.join('..', 'Flutter', 'Generated.xcconfig'), __FILE__)
15 | unless File.exist?(generated_xcode_build_settings_path)
16 | raise "#{generated_xcode_build_settings_path} must exist. If you're running pod install manually, make sure flutter pub get is executed first"
17 | end
18 |
19 | File.foreach(generated_xcode_build_settings_path) do |line|
20 | matches = line.match(/FLUTTER_ROOT\=(.*)/)
21 | return matches[1].strip if matches
22 | end
23 | raise "FLUTTER_ROOT not found in #{generated_xcode_build_settings_path}. Try deleting Generated.xcconfig, then run flutter pub get"
24 | end
25 |
26 | require File.expand_path(File.join('packages', 'flutter_tools', 'bin', 'podhelper'), flutter_root)
27 |
28 | flutter_ios_podfile_setup
29 |
30 | target 'Runner' do
31 | pod 'FirebaseFirestore', :git => 'https://github.com/invertase/firestore-ios-sdk-frameworks.git', :tag => '8.15.0'
32 |
33 | use_frameworks!
34 | use_modular_headers!
35 |
36 | flutter_install_all_ios_pods File.dirname(File.realpath(__FILE__))
37 |
38 | end
39 |
40 | post_install do |installer|
41 | installer.pods_project.targets.each do |target|
42 | flutter_additional_ios_build_settings(target)
43 | end
44 | end
45 |
--------------------------------------------------------------------------------
/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata:
--------------------------------------------------------------------------------
1 |
2 |
4 |
6 |
7 |
8 |
--------------------------------------------------------------------------------
/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | IDEDidComputeMac32BitWarning
6 |
7 |
8 |
9 |
--------------------------------------------------------------------------------
/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | PreviewsEnabled
6 |
7 |
8 |
9 |
--------------------------------------------------------------------------------
/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme:
--------------------------------------------------------------------------------
1 |
2 |
5 |
8 |
9 |
15 |
21 |
22 |
23 |
24 |
25 |
30 |
31 |
32 |
33 |
39 |
40 |
41 |
42 |
43 |
44 |
54 |
56 |
62 |
63 |
64 |
65 |
66 |
67 |
73 |
75 |
81 |
82 |
83 |
84 |
86 |
87 |
90 |
91 |
92 |
--------------------------------------------------------------------------------
/ios/Runner.xcworkspace/contents.xcworkspacedata:
--------------------------------------------------------------------------------
1 |
2 |
4 |
6 |
7 |
9 |
10 |
11 |
--------------------------------------------------------------------------------
/ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | IDEDidComputeMac32BitWarning
6 |
7 |
8 |
9 |
--------------------------------------------------------------------------------
/ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | PreviewsEnabled
6 |
7 |
8 |
9 |
--------------------------------------------------------------------------------
/ios/Runner/AppDelegate.swift:
--------------------------------------------------------------------------------
1 | import UIKit
2 | import Flutter
3 | import Firebase
4 |
5 | @UIApplicationMain
6 | @objc class AppDelegate: FlutterAppDelegate {
7 | override func application(
8 | _ application: UIApplication,
9 | didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?
10 | ) -> Bool {
11 | FirebaseApp.configure();
12 | GeneratedPluginRegistrant.register(with: self)
13 | return super.application(application, didFinishLaunchingWithOptions: launchOptions)
14 | }
15 | }
16 |
--------------------------------------------------------------------------------
/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images" : [
3 | {
4 | "size" : "20x20",
5 | "idiom" : "iphone",
6 | "filename" : "Icon-App-20x20@2x.png",
7 | "scale" : "2x"
8 | },
9 | {
10 | "size" : "20x20",
11 | "idiom" : "iphone",
12 | "filename" : "Icon-App-20x20@3x.png",
13 | "scale" : "3x"
14 | },
15 | {
16 | "size" : "29x29",
17 | "idiom" : "iphone",
18 | "filename" : "Icon-App-29x29@1x.png",
19 | "scale" : "1x"
20 | },
21 | {
22 | "size" : "29x29",
23 | "idiom" : "iphone",
24 | "filename" : "Icon-App-29x29@2x.png",
25 | "scale" : "2x"
26 | },
27 | {
28 | "size" : "29x29",
29 | "idiom" : "iphone",
30 | "filename" : "Icon-App-29x29@3x.png",
31 | "scale" : "3x"
32 | },
33 | {
34 | "size" : "40x40",
35 | "idiom" : "iphone",
36 | "filename" : "Icon-App-40x40@2x.png",
37 | "scale" : "2x"
38 | },
39 | {
40 | "size" : "40x40",
41 | "idiom" : "iphone",
42 | "filename" : "Icon-App-40x40@3x.png",
43 | "scale" : "3x"
44 | },
45 | {
46 | "size" : "60x60",
47 | "idiom" : "iphone",
48 | "filename" : "Icon-App-60x60@2x.png",
49 | "scale" : "2x"
50 | },
51 | {
52 | "size" : "60x60",
53 | "idiom" : "iphone",
54 | "filename" : "Icon-App-60x60@3x.png",
55 | "scale" : "3x"
56 | },
57 | {
58 | "size" : "20x20",
59 | "idiom" : "ipad",
60 | "filename" : "Icon-App-20x20@1x.png",
61 | "scale" : "1x"
62 | },
63 | {
64 | "size" : "20x20",
65 | "idiom" : "ipad",
66 | "filename" : "Icon-App-20x20@2x.png",
67 | "scale" : "2x"
68 | },
69 | {
70 | "size" : "29x29",
71 | "idiom" : "ipad",
72 | "filename" : "Icon-App-29x29@1x.png",
73 | "scale" : "1x"
74 | },
75 | {
76 | "size" : "29x29",
77 | "idiom" : "ipad",
78 | "filename" : "Icon-App-29x29@2x.png",
79 | "scale" : "2x"
80 | },
81 | {
82 | "size" : "40x40",
83 | "idiom" : "ipad",
84 | "filename" : "Icon-App-40x40@1x.png",
85 | "scale" : "1x"
86 | },
87 | {
88 | "size" : "40x40",
89 | "idiom" : "ipad",
90 | "filename" : "Icon-App-40x40@2x.png",
91 | "scale" : "2x"
92 | },
93 | {
94 | "size" : "76x76",
95 | "idiom" : "ipad",
96 | "filename" : "Icon-App-76x76@1x.png",
97 | "scale" : "1x"
98 | },
99 | {
100 | "size" : "76x76",
101 | "idiom" : "ipad",
102 | "filename" : "Icon-App-76x76@2x.png",
103 | "scale" : "2x"
104 | },
105 | {
106 | "size" : "83.5x83.5",
107 | "idiom" : "ipad",
108 | "filename" : "Icon-App-83.5x83.5@2x.png",
109 | "scale" : "2x"
110 | },
111 | {
112 | "size" : "1024x1024",
113 | "idiom" : "ios-marketing",
114 | "filename" : "Icon-App-1024x1024@1x.png",
115 | "scale" : "1x"
116 | }
117 | ],
118 | "info" : {
119 | "version" : 1,
120 | "author" : "xcode"
121 | }
122 | }
123 |
--------------------------------------------------------------------------------
/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/avinashkranjan/Friday/6f54113d46877db92193ea6cbeae97528eed0e60/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png
--------------------------------------------------------------------------------
/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/avinashkranjan/Friday/6f54113d46877db92193ea6cbeae97528eed0e60/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png
--------------------------------------------------------------------------------
/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/avinashkranjan/Friday/6f54113d46877db92193ea6cbeae97528eed0e60/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png
--------------------------------------------------------------------------------
/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/avinashkranjan/Friday/6f54113d46877db92193ea6cbeae97528eed0e60/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png
--------------------------------------------------------------------------------
/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/avinashkranjan/Friday/6f54113d46877db92193ea6cbeae97528eed0e60/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png
--------------------------------------------------------------------------------
/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/avinashkranjan/Friday/6f54113d46877db92193ea6cbeae97528eed0e60/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png
--------------------------------------------------------------------------------
/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/avinashkranjan/Friday/6f54113d46877db92193ea6cbeae97528eed0e60/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png
--------------------------------------------------------------------------------
/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/avinashkranjan/Friday/6f54113d46877db92193ea6cbeae97528eed0e60/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png
--------------------------------------------------------------------------------
/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/avinashkranjan/Friday/6f54113d46877db92193ea6cbeae97528eed0e60/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png
--------------------------------------------------------------------------------
/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/avinashkranjan/Friday/6f54113d46877db92193ea6cbeae97528eed0e60/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png
--------------------------------------------------------------------------------
/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/avinashkranjan/Friday/6f54113d46877db92193ea6cbeae97528eed0e60/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png
--------------------------------------------------------------------------------
/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/avinashkranjan/Friday/6f54113d46877db92193ea6cbeae97528eed0e60/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png
--------------------------------------------------------------------------------
/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/avinashkranjan/Friday/6f54113d46877db92193ea6cbeae97528eed0e60/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png
--------------------------------------------------------------------------------
/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/avinashkranjan/Friday/6f54113d46877db92193ea6cbeae97528eed0e60/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png
--------------------------------------------------------------------------------
/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/avinashkranjan/Friday/6f54113d46877db92193ea6cbeae97528eed0e60/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png
--------------------------------------------------------------------------------
/ios/Runner/Assets.xcassets/LaunchImage.imageset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images" : [
3 | {
4 | "idiom" : "universal",
5 | "filename" : "LaunchImage.png",
6 | "scale" : "1x"
7 | },
8 | {
9 | "idiom" : "universal",
10 | "filename" : "LaunchImage@2x.png",
11 | "scale" : "2x"
12 | },
13 | {
14 | "idiom" : "universal",
15 | "filename" : "LaunchImage@3x.png",
16 | "scale" : "3x"
17 | }
18 | ],
19 | "info" : {
20 | "version" : 1,
21 | "author" : "xcode"
22 | }
23 | }
24 |
--------------------------------------------------------------------------------
/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/avinashkranjan/Friday/6f54113d46877db92193ea6cbeae97528eed0e60/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png
--------------------------------------------------------------------------------
/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/avinashkranjan/Friday/6f54113d46877db92193ea6cbeae97528eed0e60/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png
--------------------------------------------------------------------------------
/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/avinashkranjan/Friday/6f54113d46877db92193ea6cbeae97528eed0e60/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png
--------------------------------------------------------------------------------
/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md:
--------------------------------------------------------------------------------
1 | # Launch Screen Assets
2 |
3 | You can customize the launch screen with your own desired assets by replacing the image files in this directory.
4 |
5 | You can also do it by opening your Flutter project's Xcode project with `open ios/Runner.xcworkspace`, selecting `Runner/Assets.xcassets` in the Project Navigator and dropping in the desired images.
--------------------------------------------------------------------------------
/ios/Runner/Base.lproj/LaunchScreen.storyboard:
--------------------------------------------------------------------------------
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 |
--------------------------------------------------------------------------------
/ios/Runner/Base.lproj/Main.storyboard:
--------------------------------------------------------------------------------
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 |
--------------------------------------------------------------------------------
/ios/Runner/GoogleService-Info.plist:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | CLIENT_ID
6 | 1045472240686-nlbmr04bf5iq3c2r6qqiagu9s8i54pfm.apps.googleusercontent.com
7 | REVERSED_CLIENT_ID
8 | com.googleusercontent.apps.1045472240686-nlbmr04bf5iq3c2r6qqiagu9s8i54pfm
9 | API_KEY
10 | AIzaSyCQzb8FYxi0tSHoK4YQa63ZcLAwzomyAy0
11 | GCM_SENDER_ID
12 | 1045472240686
13 | PLIST_VERSION
14 | 1
15 | BUNDLE_ID
16 | com.example.Automation
17 | PROJECT_ID
18 | friday-683ad
19 | STORAGE_BUCKET
20 | friday-683ad.appspot.com
21 | IS_ADS_ENABLED
22 |
23 | IS_ANALYTICS_ENABLED
24 |
25 | IS_APPINVITE_ENABLED
26 |
27 | IS_GCM_ENABLED
28 |
29 | IS_SIGNIN_ENABLED
30 |
31 | GOOGLE_APP_ID
32 | 1:1045472240686:ios:8029da3d7f8b62f98febbf
33 |
34 |
--------------------------------------------------------------------------------
/ios/Runner/Info.plist:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 | NSPhotoLibraryUsageDescription
7 | Access gallery to pick image
8 | NSCameraUsageDescription
9 | Access camera to take image
10 | NSMicrophoneUsageDescription
11 | Access microphone to take audio
12 |
13 | CFBundleDevelopmentRegion
14 | $(DEVELOPMENT_LANGUAGE)
15 | CFBundleExecutable
16 | $(EXECUTABLE_NAME)
17 | CFBundleIdentifier
18 | $(PRODUCT_BUNDLE_IDENTIFIER)
19 | CFBundleInfoDictionaryVersion
20 | 6.0
21 | CFBundleName
22 | Friday
23 | CFBundlePackageType
24 | APPL
25 | CFBundleShortVersionString
26 | $(FLUTTER_BUILD_NAME)
27 | CFBundleSignature
28 | ????
29 | CFBundleVersion
30 | $(FLUTTER_BUILD_NUMBER)
31 | LSRequiresIPhoneOS
32 |
33 | UILaunchStoryboardName
34 | LaunchScreen
35 | UIMainStoryboardFile
36 | Main
37 | UISupportedInterfaceOrientations
38 |
39 | UIInterfaceOrientationPortrait
40 | UIInterfaceOrientationLandscapeLeft
41 | UIInterfaceOrientationLandscapeRight
42 |
43 | UISupportedInterfaceOrientations~ipad
44 |
45 | UIInterfaceOrientationPortrait
46 | UIInterfaceOrientationPortraitUpsideDown
47 | UIInterfaceOrientationLandscapeLeft
48 | UIInterfaceOrientationLandscapeRight
49 |
50 | UIViewControllerBasedStatusBarAppearance
51 |
52 | CADisableMinimumFrameDurationOnPhone
53 |
54 | UIApplicationSupportsIndirectInputEvents
55 |
56 |
57 |
58 |
--------------------------------------------------------------------------------
/ios/Runner/Runner-Bridging-Header.h:
--------------------------------------------------------------------------------
1 | #import "GeneratedPluginRegistrant.h"
2 |
--------------------------------------------------------------------------------
/ios/firebase_app_id_file.json:
--------------------------------------------------------------------------------
1 | {
2 | "file_generated_by": "FlutterFire CLI",
3 | "purpose": "FirebaseAppID & ProjectID for this Firebase app in this directory",
4 | "GOOGLE_APP_ID": "1:1045472240686:ios:c37220ac9abcc6da8febbf",
5 | "FIREBASE_PROJECT_ID": "friday-683ad",
6 | "GCM_SENDER_ID": "1045472240686"
7 | }
--------------------------------------------------------------------------------
/lib/constants.dart:
--------------------------------------------------------------------------------
1 | import 'package:flutter/material.dart';
2 |
3 | const kCardColor = Color(0xFF282B30);
4 | const kHourColor = Color(0xFFF5C35A);
5 | const kBGColor = Color(0xFF343537);
6 |
7 | const kTextColor = Color(0xFF6C7174);
8 |
9 | const kCalendarDay = TextStyle(
10 | color: kTextColor,
11 | fontSize: 16.0,
12 | );
13 |
14 | const kInputTextStyle = TextStyle(
15 | color: Colors.white70,
16 | );
17 |
18 | // Authentication Constants
19 | const kAuthThemeColor = Colors.deepPurpleAccent;
20 | const int MIN_PASSWORD_LENGTH = 8;
21 | //For canvas designs
22 | const double smallestCircleRadius = 13,
23 | mediumCircleRadius = 20,
24 | largestCircleRadius = 30;
25 |
26 | // Profile Constants
27 | const double profilePictureDiameter = 120;
28 |
29 | // Firestore Constants
30 |
31 | const String usersCollection = "users";
32 |
33 | UnderlineInputBorder _inputBorderStyle = const UnderlineInputBorder(
34 | borderSide: BorderSide(
35 | color: Colors.white70,
36 | ),
37 | );
38 |
39 | InputDecoration dropdownDecoration = InputDecoration(
40 | isDense: true,
41 | labelText: "College",
42 | border: _inputBorderStyle,
43 | focusedBorder: _inputBorderStyle,
44 | enabledBorder: _inputBorderStyle,
45 | focusedErrorBorder: _inputBorderStyle,
46 | focusColor: Colors.white,
47 | hintStyle: kInputTextStyle,
48 | labelStyle: kInputTextStyle,
49 | );
50 |
--------------------------------------------------------------------------------
/lib/feedback.dart:
--------------------------------------------------------------------------------
1 | import 'package:flutter/material.dart';
2 | import 'package:shared_preferences/shared_preferences.dart';
3 |
4 | class FeedbackPage extends StatefulWidget {
5 | @override
6 | _FeedbackPageState createState() => _FeedbackPageState();
7 | }
8 |
9 | class _FeedbackPageState extends State {
10 | TextEditingController _commentController = TextEditingController();
11 | double rating = 0.0;
12 | bool alreadyRated = false;
13 |
14 | @override
15 | void initState() {
16 | super.initState();
17 | _checkIfAlreadyRated();
18 | }
19 |
20 | void _checkIfAlreadyRated() async {
21 | SharedPreferences prefs = await SharedPreferences.getInstance();
22 | bool alreadyRated = prefs.getBool('already_rated') ?? false;
23 | setState(() {
24 | alreadyRated = alreadyRated;
25 | });
26 | }
27 |
28 | void _submitFeedback() {
29 | // Submit the feedback to your backend service or database
30 | // String comment = _commentController.text;
31 | // Store the feedback and rating
32 |
33 | // Update the alreadyRated flag
34 | SharedPreferences.getInstance().then((prefs) {
35 | prefs.setBool('already_rated', true);
36 | });
37 |
38 | // Show a confirmation dialog
39 | showDialog(
40 | context: context,
41 | builder: (context) => AlertDialog(
42 | title: const Text('Thank you for your feedback!'),
43 | content: const Text('Your feedback has been submitted successfully.'),
44 | actions: [
45 | TextButton(
46 | onPressed: () => Navigator.pop(context),
47 | child: const Text('Close'),
48 | ),
49 | ],
50 | ),
51 | );
52 | }
53 |
54 | @override
55 | Widget build(BuildContext context) {
56 | return Scaffold(
57 | appBar: AppBar(
58 | title: const Text('Feedback'),
59 | ),
60 | body: Padding(
61 | padding: const EdgeInsets.all(16.0),
62 | child: Column(
63 | children: [
64 | TextField(
65 | controller: _commentController,
66 | decoration: const InputDecoration(
67 | labelText: 'Comment',
68 | ),
69 | ),
70 | const SizedBox(height: 16.0),
71 | RatingBar(
72 | onRatingChanged: (rating) {
73 | setState(() {
74 | rating = rating;
75 | });
76 | },
77 | ),
78 | const SizedBox(height: 16.0),
79 | ElevatedButton(
80 | onPressed: _submitFeedback,
81 | child: const Text('Submit'),
82 | ),
83 | ],
84 | ),
85 | ),
86 | );
87 | }
88 | }
89 |
90 | class RatingBar extends StatefulWidget {
91 | final Function(double) onRatingChanged;
92 |
93 | RatingBar({required this.onRatingChanged});
94 |
95 | @override
96 | _RatingBarState createState() => _RatingBarState();
97 | }
98 |
99 | class _RatingBarState extends State {
100 | double _rating = 0.0;
101 |
102 | Widget _buildStar(int index) {
103 | IconData iconData = index <= _rating ? Icons.star : Icons.star_border;
104 | return GestureDetector(
105 | onTap: () {
106 | setState(() {
107 | _rating = index.toDouble();
108 | widget.onRatingChanged(_rating);
109 | });
110 | },
111 | child: Icon(iconData),
112 | );
113 | }
114 |
115 | @override
116 | Widget build(BuildContext context) {
117 | return Row(
118 | children: List.generate(5, (index) => _buildStar(index + 1)),
119 | );
120 | }
121 | }
122 |
--------------------------------------------------------------------------------
/lib/firebase_options.dart:
--------------------------------------------------------------------------------
1 | // File generated by FlutterFire CLI.
2 | // ignore_for_file: lines_longer_than_80_chars, avoid_classes_with_only_static_members
3 | import 'package:firebase_core/firebase_core.dart' show FirebaseOptions;
4 | import 'package:flutter/foundation.dart'
5 | show defaultTargetPlatform, kIsWeb, TargetPlatform;
6 |
7 | /// Default [FirebaseOptions] for use with your Firebase apps.
8 | ///
9 | /// Example:
10 | /// ```dart
11 | /// import 'firebase_options.dart';
12 | /// // ...
13 | /// await Firebase.initializeApp(
14 | /// options: DefaultFirebaseOptions.currentPlatform,
15 | /// );
16 | /// ```
17 | class DefaultFirebaseOptions {
18 | static FirebaseOptions get currentPlatform {
19 | if (kIsWeb) {
20 | throw UnsupportedError(
21 | 'DefaultFirebaseOptions have not been configured for web - '
22 | 'you can reconfigure this by running the FlutterFire CLI again.',
23 | );
24 | }
25 | switch (defaultTargetPlatform) {
26 | case TargetPlatform.android:
27 | return android;
28 | case TargetPlatform.iOS:
29 | return ios;
30 | case TargetPlatform.macOS:
31 | throw UnsupportedError(
32 | 'DefaultFirebaseOptions have not been configured for macos - '
33 | 'you can reconfigure this by running the FlutterFire CLI again.',
34 | );
35 | case TargetPlatform.windows:
36 | throw UnsupportedError(
37 | 'DefaultFirebaseOptions have not been configured for windows - '
38 | 'you can reconfigure this by running the FlutterFire CLI again.',
39 | );
40 | case TargetPlatform.linux:
41 | throw UnsupportedError(
42 | 'DefaultFirebaseOptions have not been configured for linux - '
43 | 'you can reconfigure this by running the FlutterFire CLI again.',
44 | );
45 | default:
46 | throw UnsupportedError(
47 | 'DefaultFirebaseOptions are not supported for this platform.',
48 | );
49 | }
50 | }
51 |
52 | static const FirebaseOptions android = FirebaseOptions(
53 | apiKey: 'AIzaSyAUIjZBBzAPZ83p1yDPCOAra-ErOs9K2ls',
54 | appId: '1:1045472240686:android:30a67f49892fee138febbf',
55 | messagingSenderId: '1045472240686',
56 | projectId: 'friday-683ad',
57 | storageBucket: 'friday-683ad.appspot.com',
58 | );
59 |
60 | static const FirebaseOptions ios = FirebaseOptions(
61 | apiKey: 'AIzaSyCQzb8FYxi0tSHoK4YQa63ZcLAwzomyAy0',
62 | appId: '1:1045472240686:ios:c37220ac9abcc6da8febbf',
63 | messagingSenderId: '1045472240686',
64 | projectId: 'friday-683ad',
65 | storageBucket: 'friday-683ad.appspot.com',
66 | androidClientId: '1045472240686-q3fnk5dg2ra4lg4u3ufqe2pkj74gm6st.apps.googleusercontent.com',
67 | iosClientId: '1045472240686-m2blkie00hbu64eq9lujisane5l9ihef.apps.googleusercontent.com',
68 | iosBundleId: 'com.avinashkranjan.friday',
69 | );
70 | }
71 |
--------------------------------------------------------------------------------
/lib/l10n/app_en.arb:
--------------------------------------------------------------------------------
1 | {
2 |
3 | "friday": "Friday",
4 | "@friday": {
5 | "description": "App's name"
6 | },
7 | "hellosir": "Hello, Sir!",
8 | "recentalerts": "Recent Alerts",
9 | "viewall": "View all",
10 | "seefavourites": "SEE FAVOURITES",
11 | "search": "search",
12 | "recenthomework": "Recent Homework",
13 | "favourites": "Favourites",
14 | "clearallfavourites": "CLEAR ALL FAVOURITES",
15 | "hoursleft": "hours left",
16 | "addnewclass": "Add New Class",
17 | "mode": "Mode",
18 | "teachername": "Teacher Name",
19 | "date": "Date",
20 | "time": "Time",
21 | "joinlink": "Join Link",
22 | "subject": "वSubject",
23 | "save": "Save",
24 | "yourprofile": "Your Profile",
25 | "loading": "Loading...",
26 | "email": "Email",
27 | "bio": "Bio",
28 | "college": "College",
29 | "course": "Course",
30 | "departmentmajor": "Department/Major",
31 | "currentacademicyear": "Current Academic Year",
32 | "gender": "Gender",
33 | "age": "Age",
34 | "settings": "Settings",
35 | "common": "Common",
36 | "language": "Language",
37 | "lightmode": "Light Mode",
38 | "notifications": "Notifications",
39 | "notificationsdesc": "Turn your app notifications on or off",
40 | "help": "Help",
41 | "helpdesc": "See our help modules for queries",
42 | "faqs": "FAQs",
43 | "faqsdesc": "Basic usage guidelines",
44 | "supportdevelopment": "Support Development",
45 | "supportdevelopmentdesc": "See latest issues and contribute to the project!"
46 |
47 | }
--------------------------------------------------------------------------------
/lib/l10n/app_gu.arb:
--------------------------------------------------------------------------------
1 | {
2 | "friday": "શુક્રવાર",
3 | "hellosir": "નમસ્તે મહોદય!",
4 | "recentalerts": "આખરી ચેતવણીઓ",
5 | "viewall": "બધા જુઓ",
6 | "seefavourites": "પ્રિયતમો જુઓ",
7 | "search": "શોધો",
8 | "recenthomework": "આખરી હોમવર્ક",
9 | "favourites": "પ્રિયતમ",
10 | "clearallfavourites": "બધા પ્રિયતમો સાફ કરો",
11 | "hoursleft": "બાકી રહેલા કલાક",
12 | "addnewclass": "નવી શ્રેણી ઉમેરો",
13 | "mode": "પ્રકાર",
14 | "teachername": "શિક્ષકનું નામ",
15 | "date": "તારીખ",
16 | "time": "સમય",
17 | "joinlink": "લિંક થી જોડાઓ",
18 | "subject": "વિષય",
19 | "save": "સાચવો",
20 | "yourprofile": "તમારી પ્રોફાઇલ",
21 | "loading": "લોડ થાય છે...",
22 | "email": "ઇમેઇલ",
23 | "bio": "બાયો",
24 | "college": "કોલેજ",
25 | "course": "કોર્સનો પ્રકાર",
26 | "departmentmajor": "વિભાગ",
27 | "currentacademicyear": "વર્તમાન શૈક્ષણિક વર્ષ",
28 | "gender": "લિંગ",
29 | "age": "ઉંમર",
30 | "logout": "લૉગઆઉટ",
31 | "settings": "સેટિંગ્સ",
32 | "common": "સામાન્ય",
33 | "language": "ભાષા",
34 | "lightmode": "પ્રકાશ મોડ",
35 | "notifications": "સૂચનાઓ",
36 | "notificationsdesc": "એપની નોટિફિકેશન્સ ચાલુ કરો અથવા બંધ કરો",
37 | "help": "મદદ",
38 | "helpdesc": "પ્રશ્નો માટે અમારી સહાયતા મોડ્યુલ જુઓ",
39 | "faqs": "સામાન્ય પ્રશ્નો",
40 | "faqsdesc": "મૂળ ઉપયોગ નમ્ના માર્ગદર્શનો",
41 | "supportdevelopment": "એપનું વિકાસ સમર્થન આપો",
42 | "supportdevelopmentdesc": "સમસ્યાઓનું સમાધાન આપો, બગની રિપોર્ટ આપો, અને આવી સમસ્યાઓ સમાધાન કરો|"
43 | }
44 |
--------------------------------------------------------------------------------
/lib/l10n/app_hi.arb:
--------------------------------------------------------------------------------
1 | {
2 | "friday": "शुक्रवार",
3 | "hellosir": "नमस्ते महोदय!",
4 | "recentalerts": "हालिया अलर्ट",
5 | "viewall": "सभी देखें",
6 | "seefavourites": "पसंदीदा देखें",
7 | "search": "खोजो",
8 | "recenthomework": "हालिया होमवर्क",
9 | "favourites": "पसंदीदा",
10 | "clearallfavourites": "सभी पसंदीदा साफ़ करें",
11 | "hoursleft": "घंटे बाकी है",
12 | "addnewclass": "नई कक्षा जोड़ें",
13 | "mode": "प्रकार",
14 | "teachername": "शिक्षक का नाम",
15 | "date": "तारीख",
16 | "time": "समय",
17 | "joinlink": "लिंक से जुड़ें",
18 | "subject": "विषय",
19 | "save": "इसे जोड़ें",
20 | "yourprofile": "आपकी प्रोफ़ाइल",
21 | "loading": "लोड हो रहा है...",
22 | "email": "ईमेल",
23 | "bio": "बायो",
24 | "college": "कॉलेज",
25 | "course": "पाठ्यक्रम प्रकार",
26 | "departmentmajor": "विभाग",
27 | "currentacademicyear": "वर्तमान शैक्षणिक वर्ष",
28 | "gender": "लिंग",
29 | "age": "आयु",
30 | "logout": "लॉग आउट",
31 | "settings": "सेटिंग",
32 | "common": "सामान्य",
33 | "language": "भाषा",
34 | "lightmode": "प्रकाश मोड",
35 | "notifications": "सूचनाएं",
36 | "notificationsdesc": "ऐप के नोटिफिकेशन को चालू या बंद करें",
37 | "help": "मदद",
38 | "helpdesc": "प्रश्नों के लिए हमारे सहायता मॉड्यूल देखें",
39 | "faqs": "सामान्य प्रश्न",
40 | "faqsdesc": "बुनियादी उपयोग दिशानिर्देश",
41 | "supportdevelopment": "ऐप के विकास का समर्थन करें",
42 | "supportdevelopmentdesc": "समस्याओं का समाधान करें, बग की रिपोर्ट करें, इत्यादि|"
43 | }
--------------------------------------------------------------------------------
/lib/l10n/app_mr.arb:
--------------------------------------------------------------------------------
1 | {
2 | "friday": "शुक्रवार",
3 | "hellosir": "नमस्ते महोदय!",
4 | "recentalerts": "अलर्ट्सच्या आधीन",
5 | "viewall": "सर्व पहा",
6 | "seefavourites": "पसंदीदा पहा",
7 | "search": "शोधा",
8 | "recenthomework": "अलीकडील होमवर्क",
9 | "favourites": "पसंदीदा",
10 | "clearallfavourites": "सर्व पसंदीदा साफ करा",
11 | "hoursleft": "उर्फ शिल्लक वाटतात",
12 | "addnewclass": "नवीन वर्ग जोडा",
13 | "mode": "प्रकार",
14 | "teachername": "शिक्षकाचे नाव",
15 | "date": "तारीख",
16 | "time": "वेळ",
17 | "joinlink": "संलग्न करा",
18 | "subject": "विषय",
19 | "save": "जतन करा",
20 | "yourprofile": "तुमची प्रोफाइल",
21 | "loading": "लोड होत आहे...",
22 | "email": "ईमेल",
23 | "bio": "बायो",
24 | "college": "कॉलेज",
25 | "course": "कोर्स प्रकार",
26 | "departmentmajor": "विभाग",
27 | "currentacademicyear": "सध्याचा शैक्षणिक वर्ष",
28 | "gender": "लिंग",
29 | "age": "वय",
30 | "logout": "लॉग आऊट",
31 | "settings": "सेटिंग्स",
32 | "common": "सामान्य",
33 | "language": "भाषा",
34 | "lightmode": "प्रकाश मोड",
35 | "notifications": "सूचना",
36 | "notificationsdesc": "ऐपची सूचना सुरू किंवा बंद करा",
37 | "help": "मदत",
38 | "helpdesc": "तुमच्या प्रश्नांसाठी आमच्या सहाय्यक मॉड्यूल पहा",
39 | "faqs": "सामान्य प्रश्ने",
40 | "faqsdesc": "मौलिक वापराच्या मार्गदर्शन",
41 | "supportdevelopment": "ऐपचे विकास समर्थन करा",
42 | "supportdevelopmentdesc": "समस्या परिहार करा, बगची माहिती द्या, इत्यादी|"
43 | }
44 |
--------------------------------------------------------------------------------
/lib/l10n/app_ru.arb:
--------------------------------------------------------------------------------
1 | {
2 | "friday": "Пятница",
3 | "hellosir": "Пятница!",
4 | "recentalerts": "последние оповещения",
5 | "viewall": "Посмотреть все",
6 | "seefavourites": "ПОСМОТРЕТЬ ИЗБРАННОЕ",
7 | "search": "поиск",
8 | "recenthomework": "Недавнее домашнее задание",
9 | "favourites": "Избранное",
10 | "clearallfavourites": "УДАЛИТЬ ВСЕ ИЗБРАННОЕ",
11 | "hoursleft": "часов осталось",
12 | "addnewclass": "Добавить новый класс",
13 | "mode": "Режим",
14 | "teachername": "Имя учителя",
15 | "date": "Дата",
16 | "time": "Время",
17 | "joinlink": "Присоединиться по ссылке",
18 | "subject": "Предмет",
19 | "save": "Сохранять",
20 | "yourprofile": "Ваш профиль",
21 | "loading": "Загрузка...",
22 | "email": "Электронная почта",
23 | "bio": "Био",
24 | "college": "Колледж",
25 | "course": "Курс",
26 | "departmentmajor": "Департамент/майор",
27 | "currentacademicyear": "Текущий учебный год",
28 | "gender": "Пол",
29 | "age": "Возраст",
30 | "settings": "Настройки",
31 | "common": "Общий",
32 | "language": "Язык",
33 | "lightmode": "Легкий режим",
34 | "notifications": "Уведомления",
35 | "notificationsdesc": "Включите или отключите уведомления вашего приложения",
36 | "help": "Помощь",
37 | "helpdesc": "См. наши справочные модули для запросов",
38 | "faqs": "Часто задаваемые вопросы",
39 | "faqsdesc": "Основные рекомендации по использованию",
40 | "supportdevelopment": "Поддержка развития",
41 | "supportdevelopmentdesc": "Смотрите последние выпуски и внесите свой вклад в проект!"
42 | }
--------------------------------------------------------------------------------
/lib/localizationTexts/defaulttexts.dart:
--------------------------------------------------------------------------------
1 | class LocalizationsTexts {
2 | static var friday = "Friday";
3 |
4 | static var hellosir = "Hello, Sir!";
5 |
6 | static var recentalerts = "Recent Alerts";
7 |
8 | static var viewall = "View all";
9 |
10 | static var seefavourites = "SEE FAVOURITES";
11 |
12 | static var search = "search";
13 |
14 | static var recenthomework = "Recent Homework";
15 |
16 | static var favourites = "Favourites";
17 |
18 | static var clearallfavourites = "CLEAR ALL FAVOURITES";
19 |
20 | static var hoursleft = "hours left";
21 |
22 | static var addnewclass = "Add New Class";
23 |
24 | static var mode = "Mode";
25 |
26 | static var teachername = "Teacher Name";
27 |
28 | static var date = "Date";
29 |
30 | static var time = "Time";
31 |
32 | static var joinlink = "Join Link";
33 |
34 | static var subject = "Subject";
35 |
36 | static var save = "Save";
37 |
38 | static var yourprofile = "Your Profile";
39 |
40 | static var loading = "Loading...";
41 |
42 | static var email = "Email";
43 |
44 | static var bio = "Bio";
45 |
46 | static var college = "College";
47 |
48 | static var course = "Course";
49 |
50 | static var departmentmajor = "Department/Major";
51 |
52 | static var currentacademicyear = "Current Academic Year";
53 |
54 | static var gender = "Gender";
55 |
56 | static var age = "Age";
57 |
58 | static var settings = "Settings";
59 |
60 | static var common = "Common";
61 |
62 | static var language = "Language";
63 |
64 | static var lightmode = "Light Mode";
65 |
66 | static var notifications = "Notifications";
67 |
68 | static var notificationsdesc = "Turn your app notifications on or off";
69 |
70 | static var help = "Help";
71 |
72 | static var helpdesc = "See our help modules for queries";
73 |
74 | static var faqs = "FAQs";
75 |
76 | static var faqsdesc = "Basic usage guidelines";
77 |
78 | static var supportdevelopment = "Support Development";
79 |
80 | static var supportdevelopmentdesc =
81 | "See latest issues and contribute to the project!";
82 | }
83 |
--------------------------------------------------------------------------------
/lib/localizationTexts/gujarati.dart:
--------------------------------------------------------------------------------
1 | class GujaratiTexts {
2 | String get friday => 'શુક્રવાર';
3 |
4 | String get hellosir => 'નમસ્તે મહોદય!';
5 |
6 | String get recentalerts => 'આખરી ચેતવણીઓ';
7 |
8 | String get viewall => 'બધું જુઓ';
9 |
10 | String get seefavourites => 'પ્રિયતમો જુઓ';
11 |
12 | String get search => 'શોધો';
13 |
14 | String get recenthomework => 'આખરી હોમવર્ક';
15 |
16 | String get favourites => 'પ્રિયતમ';
17 |
18 | String get clearallfavourites => 'બધા પ્રિયતમો સાફ કરો';
19 |
20 | String get hoursleft => 'અવશેષ કરેલા કલાક';
21 |
22 | String get addnewclass => 'નવી શ્રેણી ઉમેરો';
23 |
24 | String get mode => 'પ્રકાર';
25 |
26 | String get teachername => 'શિક્ષકનું નામ';
27 |
28 | String get date => 'તારીખ';
29 |
30 | String get time => 'સમય';
31 |
32 | String get joinlink => 'લિંક થી જોડાઓ';
33 |
34 | String get subject => 'વિષય';
35 |
36 | String get save => 'સાચવો';
37 |
38 | String get yourprofile => 'તમારી પ્રોફાઇલ';
39 |
40 | String get loading => 'લોડ થાય છે...';
41 |
42 | String get email => 'ઇમેઇલ';
43 |
44 | String get bio => 'જીવનવર્ણન';
45 |
46 | String get college => 'કોલેજ';
47 |
48 | String get course => 'કોર્સનો પ્રકાર';
49 |
50 | String get departmentmajor => 'વિભાગ';
51 |
52 | String get currentacademicyear => 'વર્તમાન શૈક્ષણિક વર્ષ';
53 |
54 | String get gender => 'લિંગ';
55 |
56 | String get age => 'ઉંમર';
57 |
58 | String get settings => 'સેટિંગ્સ';
59 |
60 | String get common => 'સામાન્ય';
61 |
62 | String get language => 'ભાષા';
63 |
64 | String get lightmode => 'આલોક સ્થિતિ';
65 |
66 | String get notifications => 'સૂચનાઓ';
67 |
68 | String get notificationsdesc => 'એપની સૂચનાઓને ચાલુ અથવા બંધ કરો';
69 |
70 | String get help => 'મદદ';
71 |
72 | String get helpdesc => 'પ્રશ્નો માટે અમારી સહાયતા મોડ્યુલ જુઓ';
73 |
74 | String get faqs => 'સામાન્ય પ્રશ્નો';
75 |
76 | String get faqsdesc => 'મૂળ ઉપયોગ માર્ગદર્શનો';
77 |
78 | String get supportdevelopment => 'એપની વિકાસ સમર્થન કરો';
79 |
80 | String get supportdevelopmentdesc =>
81 | 'સમસ્યાઓને સમાધાન કરો, બગની રિપોર્ટ કરો, અને આદિ|';
82 | }
83 |
--------------------------------------------------------------------------------
/lib/localizationTexts/hindi.dart:
--------------------------------------------------------------------------------
1 | class HindiTexts {
2 | String get friday => 'शुक्रवार';
3 |
4 | String get hellosir => 'नमस्ते महोदय!';
5 |
6 | String get recentalerts => 'हालिया अलर्ट';
7 |
8 | String get viewall => 'सभी देखें';
9 |
10 | String get seefavourites => 'पसंदीदा देखें';
11 |
12 | String get search => 'खोजो';
13 |
14 | String get recenthomework => 'हालिया होमवर्क';
15 |
16 | String get favourites => 'पसंदीदा';
17 |
18 | String get clearallfavourites => 'सभी पसंदीदा साफ़ करें';
19 |
20 | String get hoursleft => 'घंटे बाकी है';
21 |
22 | String get addnewclass => 'नई कक्षा जोड़ें';
23 |
24 | String get mode => 'प्रकार';
25 |
26 | String get teachername => 'शिक्षक का नाम';
27 |
28 | String get date => 'तारीख';
29 |
30 | String get time => 'समय';
31 |
32 | String get joinlink => 'लिंक से जुड़ें';
33 |
34 | String get subject => 'विषय';
35 |
36 | String get save => 'इसे जोड़ें';
37 |
38 | String get yourprofile => 'आपकी प्रोफ़ाइल';
39 |
40 | String get loading => 'लोड हो रहा है...';
41 |
42 | String get email => 'ईमेल';
43 |
44 | String get bio => 'बायो';
45 |
46 | String get college => 'कॉलेज';
47 |
48 | String get course => 'पाठ्यक्रम प्रकार';
49 |
50 | String get departmentmajor => 'विभाग';
51 |
52 | String get currentacademicyear => 'वर्तमान शैक्षणिक वर्ष';
53 |
54 | String get gender => 'लिंग';
55 |
56 | String get age => 'आयु';
57 |
58 | String get settings => 'सेटिंग';
59 |
60 | String get common => 'सामान्य';
61 |
62 | String get language => 'भाषा';
63 |
64 | String get lightmode => 'प्रकाश मोड';
65 |
66 | String get notifications => 'सूचनाएं';
67 |
68 | String get notificationsdesc => 'ऐप के नोटिफिकेशन को चालू या बंद करें';
69 |
70 | String get help => 'मदद';
71 |
72 | String get helpdesc => 'प्रश्नों के लिए हमारे सहायता मॉड्यूल देखें';
73 |
74 | String get faqs => 'सामान्य प्रश्न';
75 |
76 | String get faqsdesc => 'बुनियादी उपयोग दिशानिर्देश';
77 |
78 | String get supportdevelopment => 'ऐप के विकास का समर्थन करें';
79 |
80 | String get supportdevelopmentdesc =>
81 | 'समस्याओं का समाधान करें, बग की रिपोर्ट करें, इत्यादि|';
82 | }
83 |
--------------------------------------------------------------------------------
/lib/localizationTexts/kannada.dart:
--------------------------------------------------------------------------------
1 | class KannadaTexts {
2 | String get friday => 'ಶುಕ್ರವಾರ';
3 |
4 | String get hellosir => 'ನಮಸ್ಕಾರ ಸರ್!';
5 |
6 | String get recentalerts => 'ಇತ್ತಿಹಾಸ ಚೀಟಿಗಳು';
7 |
8 | String get viewall => 'ಎಲ್ಲವನ್ನು ವೀಕ್ಷಿಸಿ';
9 |
10 | String get seefavourites => 'ಪ್ರಿಯಪ್ರಿಯಗಳನ್ನು ವೀಕ್ಷಿಸಿ';
11 |
12 | String get search => 'ಹುಡುಕಿ';
13 |
14 | String get recenthomework => 'ಇತ್ತಿಹಾಸ ಮನೆಕಾರ್ಯ';
15 |
16 | String get favourites => 'ಪ್ರಿಯಪ್ರಿಯಗಳು';
17 |
18 | String get clearallfavourites => 'ಎಲ್ಲವನ್ನು ಸ್ವಚ್ಛಗೊಳಿಸಿ';
19 |
20 | String get hoursleft => 'ಉಳಿದ ಗಂಟೆಗಳು';
21 |
22 | String get addnewclass => 'ಹೊಸ ವರ್ಗವನ್ನು ಸೇರಿಸಿ';
23 |
24 | String get mode => 'ಮೋಡ್';
25 |
26 | String get teachername => 'ಶಿಕ್ಷಕರ ಹೆಸರು';
27 |
28 | String get date => 'ದಿನಾಂಕ';
29 |
30 | String get time => 'ಸಮಯ';
31 |
32 | String get joinlink => 'ಲಿಂಕ್ಗೆ ಸೇರಿರಿ';
33 |
34 | String get subject => 'ವಿಷಯ';
35 |
36 | String get save => 'ಸೇರಿಸಿ';
37 |
38 | String get yourprofile => 'ನಿಮ್ಮ ಪ್ರೊಫೈಲ್';
39 |
40 | String get loading => 'ಲೋಡ್ ಆಗುತ್ತಿದೆ...';
41 |
42 | String get email => 'ಇಮೇಲ್';
43 |
44 | String get bio => 'ಜೀವನಚರಿತ್ರೆ';
45 |
46 | String get college => 'ಕಾಲೇಜು';
47 |
48 | String get course => 'ಕೋರ್ಸ್ ರೀತಿ';
49 |
50 | String get departmentmajor => 'ವಿಭಾಗ';
51 |
52 | String get currentacademicyear => 'ಪ್ರಸ್ತುತ ಶಿಕ್ಷಣ ವರ್ಷ';
53 |
54 | String get gender => 'ಲಿಂಗ';
55 |
56 | String get age => 'ವಯಸ್ಸು';
57 |
58 | String get settings => 'ಸೆಟ್ಟಿಂಗ್ಗಳು';
59 |
60 | String get common => 'ಸಾಮಾನ್ಯ';
61 |
62 | String get language => 'ಭಾಷೆ';
63 |
64 | String get lightmode => 'ಬೆಳಕು ಮೋಡ್';
65 |
66 | String get notifications => 'ಅಧಿಸೂಚನೆಗಳು';
67 |
68 | String get notificationsdesc => 'ಆ್ಯಪ್ನ ಅಧಿಸೂಚನೆಗಳನ್ನು ಆನ್/ಆಫ್ ಮಾಡಿ';
69 |
70 | String get help => 'ಸಹಾಯ';
71 |
72 | String get helpdesc => 'ಪ್ರಶ್ನೆಗಳಿಗೆ ನಮ್ಮ ಸಹಾಯ ಮಾಡೂಲ್ಗಳನ್ನು ವೀಕ್ಷಿಸಿ';
73 |
74 | String get faqs => 'ಸಾಮಾನ್ಯ ಪ್ರಶ್ನೆಗಳು';
75 |
76 | String get faqsdesc => 'ಬುನಿಯಾದ ಬಳಕೆ ಮಾರ್ಗದರ್ಶಿಗಳು';
77 |
78 | String get supportdevelopment => 'ಆ್ಯಪ್ನ ಅಭಿವೃದ್ಧಿಯನ್ನು ಬೆಂಬಲಿಸಿ';
79 |
80 | String get supportdevelopmentdesc =>
81 | 'ಸಮಸ್ಯೆಗಳನ್ನು ಪರಿಹರಿಸಿ, ಬಗ್ ಅನ್ನು ಅಂಕಿತ ಮಾಡಿ, ಇತ್ಯಾದಿ|';
82 | }
83 |
--------------------------------------------------------------------------------
/lib/localizationTexts/marathi.dart:
--------------------------------------------------------------------------------
1 | class MarathiTexts {
2 | String get friday => 'शुक्रवार';
3 |
4 | String get hellosir => 'नमस्ते महोदय!';
5 |
6 | String get recentalerts => 'हालच्या सूचना';
7 |
8 | String get viewall => 'सर्व पहा';
9 |
10 | String get seefavourites => 'पसंदीदा पहा';
11 |
12 | String get search => 'शोधा';
13 |
14 | String get recenthomework => 'हालच्या होमवर्क';
15 |
16 | String get favourites => 'पसंदीदा';
17 |
18 | String get clearallfavourites => 'सर्व पसंदीदा साफ करा';
19 |
20 | String get hoursleft => 'शिल्लक वेळ';
21 |
22 | String get addnewclass => 'नविन वर्ग जोडा';
23 |
24 | String get mode => 'प्रकार';
25 |
26 | String get teachername => 'शिक्षकाचे नाव';
27 |
28 | String get date => 'तारीख';
29 |
30 | String get time => 'वेळ';
31 |
32 | String get joinlink => 'लिंकद्वारे सामील व्हा';
33 |
34 | String get subject => 'विषय';
35 |
36 | String get save => 'जतन करा';
37 |
38 | String get yourprofile => 'तुमची प्रोफाइल';
39 |
40 | String get loading => 'लोड होत आहे...';
41 |
42 | String get email => 'ईमेल';
43 |
44 | String get bio => 'बायो';
45 |
46 | String get college => 'कॉलेज';
47 |
48 | String get course => 'पाठ्यक्रम प्रकार';
49 |
50 | String get departmentmajor => 'विभाग';
51 |
52 | String get currentacademicyear => 'चाललेला शैक्षणिक वर्ष';
53 |
54 | String get gender => 'लिंग';
55 |
56 | String get age => 'वय';
57 |
58 | String get settings => 'सेटिंग्ज';
59 |
60 | String get common => 'सामान्य';
61 |
62 | String get language => 'भाषा';
63 |
64 | String get lightmode => 'प्रकाश मोड';
65 |
66 | String get notifications => 'सूचना';
67 |
68 | String get notificationsdesc => 'ऐपच्या सूचना सुरू किंवा बंद करा';
69 |
70 | String get help => 'मदत';
71 |
72 | String get helpdesc => 'प्रश्नांसाठी आमच्या सहाय्यक मॉड्यूल पहा';
73 |
74 | String get faqs => 'सामान्य प्रश्ने';
75 |
76 | String get faqsdesc => 'मौलिक वापराच्या मार्गदर्शने';
77 |
78 | String get supportdevelopment => 'ऐपच्या विकासाचा समर्थन करा';
79 |
80 | String get supportdevelopmentdesc =>
81 | 'समस्या परिहार करा, बगची माहिती द्या, इत्यादी|';
82 | }
83 |
--------------------------------------------------------------------------------
/lib/localizationTexts/russian.dart:
--------------------------------------------------------------------------------
1 | class RussianTexts {
2 | String get friday => 'Пятница';
3 |
4 | String get hellosir => 'Пятница!';
5 |
6 | String get recentalerts => 'последние оповещения';
7 |
8 | String get viewall => 'Посмотреть все';
9 |
10 | String get seefavourites => 'ПОСМОТРЕТЬ ИЗБРАННОЕ';
11 |
12 | String get search => 'поиск';
13 |
14 | String get recenthomework => 'Недавнее домашнее задание';
15 |
16 | String get favourites => 'Избранное';
17 |
18 | String get clearallfavourites => 'УДАЛИТЬ ВСЕ ИЗБРАННОЕ';
19 |
20 | String get hoursleft => 'часов осталось';
21 |
22 | String get addnewclass => 'Добавить новый класс';
23 |
24 | String get mode => 'Режим';
25 |
26 | String get teachername => 'Имя учителя';
27 |
28 | String get date => 'Дата';
29 |
30 | String get time => 'Время';
31 |
32 | String get joinlink => 'Присоединиться по ссылке';
33 |
34 | String get subject => 'Предмет';
35 |
36 | String get save => 'Сохранять';
37 |
38 | String get yourprofile => 'Ваш профиль';
39 |
40 | String get loading => 'Загрузка...';
41 |
42 | String get email => 'Электронная почта';
43 |
44 | String get bio => 'Био';
45 |
46 | String get college => 'Колледж';
47 |
48 | String get course => 'Курс';
49 |
50 | String get departmentmajor => 'Департамент/майор';
51 |
52 | String get currentacademicyear => 'Текущий учебный год';
53 |
54 | String get gender => 'Пол';
55 |
56 | String get age => 'Возраст';
57 |
58 | String get settings => 'Настройки';
59 |
60 | String get common => 'Общий';
61 |
62 | String get language => 'Язык';
63 |
64 | String get lightmode => 'Легкий режим';
65 |
66 | String get notifications => 'Уведомления';
67 |
68 | String get notificationsdesc =>
69 | 'Включите или отключите уведомления вашего приложения';
70 |
71 | String get help => 'Помощь';
72 |
73 | String get helpdesc => 'См. наши справочные модули для запросов';
74 |
75 | String get faqs => 'Часто задаваемые вопросы';
76 |
77 | String get faqsdesc => 'Основные рекомендации по использованию';
78 |
79 | String get supportdevelopment => 'Поддержка развития';
80 |
81 | String get supportdevelopmentdesc =>
82 | 'Смотрите последние выпуски и внесите свой вклад в проект!';
83 | }
84 |
--------------------------------------------------------------------------------
/lib/models/alert.dart:
--------------------------------------------------------------------------------
1 | class Alert {
2 | final String title;
3 | final String subject;
4 | final DateTime time;
5 |
6 | Alert({ required this.title, required this.subject, required this.time});
7 | }
8 |
9 | List recentAlerts = [
10 | Alert(
11 | title: "Math Test",
12 | subject: "Trigonometry",
13 | time: DateTime.parse("2020-10-11 12:30:00"),
14 | ),
15 | Alert(
16 | title: "Physics Test",
17 | subject: "Gravitation",
18 | time: DateTime.parse("2020-10-12 14:30:00"),
19 | ),
20 | ];
21 |
--------------------------------------------------------------------------------
/lib/models/classes.dart:
--------------------------------------------------------------------------------
1 | class Classes {
2 | final String subject;
3 | final String type;
4 | final String teacherName;
5 | final String joinLink;
6 | final DateTime time;
7 | bool isPassed = false;
8 | bool isHappening = false;
9 |
10 | Classes({
11 | required this.subject,
12 | required this.type,
13 | required this.teacherName,
14 | required this.joinLink,
15 | required this.time,
16 | });
17 |
18 | factory Classes.fromMap(Map snapshot) => Classes(
19 | subject: snapshot['subject'],
20 | type: snapshot['type'],
21 | teacherName: snapshot['teacherName'],
22 | joinLink: snapshot['joinLink'],
23 | time: (snapshot['time'] != null)
24 | ? DateTime.parse(snapshot['time'])
25 | : DateTime.now(),
26 | );
27 |
28 | toMap() => {
29 | 'subject': subject,
30 | 'type': type,
31 | 'teacherName': teacherName,
32 | 'joinLink': joinLink,
33 | 'time': time,
34 | };
35 | }
36 |
37 | List classes = [
38 | Classes(
39 | subject: "Math",
40 | type: "Online Class",
41 | teacherName: "Julie Raybon",
42 | joinLink: "https://example.com",
43 | time: DateTime.parse("2020-06-04 10:30:00"),
44 | ),
45 | Classes(
46 | subject: "Physics",
47 | type: "Online Class",
48 | teacherName: "Robert Murray",
49 | joinLink: "https://example.com",
50 | time: DateTime.parse("2020-06-04 14:30:00"),
51 | ),
52 | Classes(
53 | subject: "German",
54 | type: "Online Class",
55 | teacherName: "Mary Peterson",
56 | joinLink: "https://example.com",
57 | time: DateTime.parse("2020-06-06 06:30:00"),
58 | ),
59 | Classes(
60 | subject: "History",
61 | type: "Online Class",
62 | teacherName: "Jim Brooke",
63 | joinLink: "https://example.com",
64 | time: DateTime.parse("2020-06-06 07:30:00"),
65 | ),
66 | ];
67 |
--------------------------------------------------------------------------------
/lib/models/homework.dart:
--------------------------------------------------------------------------------
1 | import 'package:cloud_firestore/cloud_firestore.dart';
2 |
3 | class Homework {
4 | final String title;
5 | final DateTime dueTime;
6 | bool isDone = false;
7 |
8 | Homework({required this.title, required this.dueTime});
9 | }
10 |
11 | // List recentHomeworks = [
12 | // Homework(
13 | // title: "Planimetric Exercises",
14 | // dueTime: DateTime.parse("2020-06-08 10:30:00"),
15 | // ),
16 | // Homework(
17 | // title: "Visicosity Exercises",
18 | // dueTime: DateTime.parse("2020-06-09 14:30:00"),
19 | // ),
20 | // ];
21 |
22 | Future> getHomeworkList() async {
23 | List homeworkMap = [];
24 | await FirebaseFirestore.instance
25 | .collection('homework')
26 | .doc('dummyCollege')
27 | .get()
28 | .then((data) {
29 | homeworkMap = data.data()!['homework'];
30 | });
31 | return homeworkMap;
32 | }
33 |
--------------------------------------------------------------------------------
/lib/models/users.dart:
--------------------------------------------------------------------------------
1 | import 'package:cloud_firestore/cloud_firestore.dart';
2 |
3 | enum Gender { Male, Female, Other }
4 |
5 | enum Mode { Online, Offline }
6 |
7 | class Users {
8 | final String uid;
9 | String name;
10 | String email;
11 | String profilePictureUrl;
12 | String university;
13 | String course;
14 | String department;
15 | int age;
16 | int year;
17 | Gender gender;
18 |
19 | Users({
20 | required this.uid,
21 | required this.name,
22 | required this.email,
23 | this.profilePictureUrl = "",
24 | required this.university,
25 | required this.course,
26 | required this.department,
27 | required this.age,
28 | required this.year,
29 | required this.gender,
30 | });
31 |
32 | set bio(String bio) {}
33 |
34 | void setEssentialDetails(String name, String email) {
35 | this.name = name;
36 | this.email = email;
37 | }
38 |
39 | void setAdditionalDetails(
40 | String course,
41 | String department,
42 | String university,
43 | int year,
44 | Gender gender,
45 | int age, [
46 | String profilePictureUrl = "",
47 | ]) {
48 | this.course = course;
49 | this.department = department;
50 | this.university = university;
51 | this.year = year;
52 | this.gender = gender;
53 | this.age = age;
54 | this.profilePictureUrl = profilePictureUrl;
55 | }
56 |
57 | factory Users.fromJson(DocumentSnapshot snapshot) {
58 | Map? json = snapshot.data() as Map?;
59 | Gender gender = stringToEnum(json?["gender"] as String);
60 | return new Users(
61 | uid: snapshot.id,
62 | name: json?["name"] as String? ?? "",
63 | email: json?["email"] as String? ?? "",
64 | profilePictureUrl: json?["profilePictureUrl"] as String? ?? "",
65 | university: json?["university"] as String? ?? "",
66 | course: json?["course"] as String? ?? "",
67 | year: json?["year"] as int? ?? 0,
68 | department: json?["department"] as String? ?? "",
69 | age: json?["age"] as int? ?? 0,
70 | gender: gender,
71 | );
72 | }
73 |
74 | Map toJson() {
75 | String gen = enumToString(gender);
76 | return {
77 | "name": name,
78 | "email": email,
79 | "profilePictureUrl": profilePictureUrl,
80 | "university": university,
81 | "course": course,
82 | "year": year,
83 | "department": department,
84 | "age": age,
85 | "gender": gen,
86 | "classes": {},
87 | };
88 | }
89 | }
90 |
91 | // Function to convert Gender enum to String
92 | String enumToString(Gender gender) {
93 | switch (gender) {
94 | case Gender.Male:
95 | return "Male";
96 |
97 | case Gender.Female:
98 | return "Female";
99 |
100 | default:
101 | return "Other";
102 | }
103 | }
104 |
105 | // Function to convert Mode enum to String
106 | String modeEnumToString(Mode currMode) {
107 | switch (currMode) {
108 | case Mode.Online:
109 | return "Online";
110 |
111 | default:
112 | return "Offline";
113 | }
114 | }
115 |
116 | // Function to convert Gender string to enum
117 | Gender stringToEnum(String gen) {
118 | switch (gen) {
119 | case "Male":
120 | return Gender.Male;
121 |
122 | case "Female":
123 | return Gender.Female;
124 |
125 | default:
126 | return Gender.Other;
127 | }
128 | }
129 |
--------------------------------------------------------------------------------
/lib/screens/alert_screen.dart:
--------------------------------------------------------------------------------
1 | import 'package:flutter/material.dart';
2 | import 'package:flutter_gen/gen_l10n/app_localizations.dart';
3 | import 'package:friday/widgets/recents_alerts.dart';
4 |
5 | class AlertScreen extends StatefulWidget {
6 | @override
7 | _AlertScreenState createState() => _AlertScreenState();
8 | }
9 |
10 | class _AlertScreenState extends State {
11 | @override
12 | Widget build(BuildContext context) {
13 | return Scaffold(
14 | backgroundColor:
15 | Theme.of(context).colorScheme.background.withOpacity(0.8),
16 | body: SafeArea(
17 | child: SingleChildScrollView(
18 | child: Column(
19 | children: [
20 | SizedBox(height: 30.0),
21 | Text(
22 | AppLocalizations.of(context)?.recentalerts ?? "",
23 | style: TextStyle(
24 | color: Colors.white,
25 | fontSize: 30.0,
26 | fontWeight: FontWeight.bold,
27 | ),
28 | ),
29 | SizedBox(height: 30.0),
30 | Container(
31 | padding: EdgeInsets.all(35.0),
32 | height: MediaQuery.of(context).size.height - 123,
33 | decoration: BoxDecoration(
34 | color: Theme.of(context).primaryColor,
35 | borderRadius: BorderRadius.only(
36 | topLeft: Radius.circular(50.0),
37 | topRight: Radius.circular(50.0),
38 | ),
39 | ),
40 | child: RecentsAlerts(),
41 | ),
42 | ],
43 | ),
44 | ),
45 | ),
46 | );
47 | }
48 | }
49 |
--------------------------------------------------------------------------------
/lib/screens/app_info_screen.dart:
--------------------------------------------------------------------------------
1 | import 'package:flutter/material.dart';
2 | import 'package:provider/provider.dart';
3 |
4 | import '../services/user_info_services.dart';
5 |
6 | class AppInfoScreen extends StatelessWidget {
7 | @override
8 | Widget build(BuildContext context) {
9 | return Scaffold(
10 | appBar: AppBar(
11 | elevation: 0,
12 | backgroundColor: Colors.transparent,
13 | centerTitle: true,
14 | ),
15 | backgroundColor:
16 | Theme.of(context).colorScheme.background.withOpacity(0.8),
17 | body: SingleChildScrollView(
18 | physics: AlwaysScrollableScrollPhysics(parent: BouncingScrollPhysics()),
19 | child: Consumer(
20 | builder: (context, userInfo, _) {
21 | return Stack(alignment: Alignment.center, children: [
22 | Column(children: [
23 | SizedBox(
24 | height: 30,
25 | ),
26 | Text(
27 | "App Info",
28 | style: TextStyle(
29 | color: Colors.white,
30 | fontSize: 30.0,
31 | fontWeight: FontWeight.bold,
32 | ),
33 | ),
34 | SizedBox(height: 0.12 * MediaQuery.of(context).size.height),
35 | Container(
36 | margin: EdgeInsets.fromLTRB(15, 15, 15, 60),
37 | padding: EdgeInsets.all(30),
38 | decoration: BoxDecoration(
39 | color: Theme.of(context).primaryColor,
40 | borderRadius: BorderRadius.only(
41 | topLeft: Radius.circular(40),
42 | topRight: Radius.circular(40),
43 | ),
44 | ),
45 | width: double.infinity,
46 | child: SizedBox(
47 | height: MediaQuery.of(context).size.height,
48 | width: MediaQuery.of(context).size.width,
49 | child: Column(
50 | mainAxisAlignment: MainAxisAlignment.start,
51 | children: [
52 | Text(
53 | 'Friday',
54 | style: TextStyle(
55 | fontSize: 24,
56 | fontWeight: FontWeight.bold,
57 | color: Theme.of(context).secondaryHeaderColor),
58 | ),
59 | SizedBox(height: 16),
60 | Text(
61 | 'Version 1.0.0',
62 | style: TextStyle(
63 | fontSize: 18,
64 | color: Theme.of(context).secondaryHeaderColor),
65 | ),
66 | SizedBox(height: 8),
67 | Text(
68 | 'Developer: Avinash Ranjan',
69 | style: TextStyle(
70 | fontSize: 18,
71 | color: Theme.of(context).secondaryHeaderColor),
72 | ),
73 | SizedBox(height: 8),
74 | Text(
75 | 'Email: ranjan.avinash@hotmail.com',
76 | style: TextStyle(
77 | fontSize: 18,
78 | color: Theme.of(context).secondaryHeaderColor),
79 | ),
80 | ],
81 | ),
82 | ),
83 | )
84 | ])
85 | ]);
86 | },
87 | ),
88 | ),
89 | );
90 | }
91 | }
92 |
--------------------------------------------------------------------------------
/lib/screens/chat_screen.dart:
--------------------------------------------------------------------------------
1 | import 'package:flutter/material.dart';
2 | import 'new_group_screen.dart';
3 |
4 | class ChatScreen extends StatelessWidget {
5 | @override
6 | Widget build(BuildContext context) {
7 | return Scaffold(
8 | appBar: AppBar(
9 | title: Text('Chats'),
10 | backgroundColor: Color(0xFF651FFF),
11 | ),
12 | body: Container(
13 | padding: EdgeInsets.all(16.0),
14 | child: InkWell(
15 | onTap: () {
16 | Navigator.push(
17 | context,
18 | MaterialPageRoute(builder: (context) => NewGroupScreen()),
19 | );
20 | },
21 | child: Row(
22 | children: [
23 | CircleAvatar(
24 | backgroundColor: Color(0xFF651FFF),
25 | child: Icon(
26 | Icons.group,
27 | color: Colors.white,
28 | ),
29 | ),
30 | SizedBox(width: 8.0),
31 | Text(
32 | 'New Groups',
33 | style: TextStyle(fontSize: 20),
34 | ),
35 | ],
36 | ),
37 | ),
38 | ),
39 | );
40 | }
41 | }
42 |
--------------------------------------------------------------------------------
/lib/screens/help_screen.dart:
--------------------------------------------------------------------------------
1 | import 'package:flutter/material.dart';
2 | import 'package:provider/provider.dart';
3 |
4 | import '../models/users.dart';
5 | import '../services/user_info_services.dart';
6 | import 'app_info_screen.dart';
7 | import 'contact_us_screen.dart';
8 |
9 | class HelpScreen extends StatelessWidget {
10 | @override
11 | Widget build(BuildContext context) {
12 | return Scaffold(
13 | appBar: AppBar(
14 | elevation: 0,
15 | backgroundColor: Colors.transparent,
16 | centerTitle: true,
17 | ),
18 | backgroundColor:
19 | Theme.of(context).colorScheme.background.withOpacity(0.8),
20 | body: SingleChildScrollView(
21 | physics: AlwaysScrollableScrollPhysics(parent: BouncingScrollPhysics()),
22 | child: Consumer(
23 | builder: (context, userInfo, _) {
24 | // ignore: unused_local_variable
25 | Users _user;
26 | if (userInfo.hasData) _user = userInfo.user!;
27 | return Stack(alignment: Alignment.center, children: [
28 | Column(children: [
29 | SizedBox(
30 | height: 30,
31 | ),
32 | Text(
33 | "Help Section",
34 | style: TextStyle(
35 | color: Colors.white,
36 | fontSize: 30.0,
37 | fontWeight: FontWeight.bold,
38 | ),
39 | ),
40 | SizedBox(height: 0.12 * MediaQuery.of(context).size.height),
41 | Container(
42 | margin: EdgeInsets.fromLTRB(15, 15, 15, 60),
43 | padding: EdgeInsets.all(30),
44 | decoration: BoxDecoration(
45 | color: Theme.of(context).primaryColor,
46 | borderRadius: BorderRadius.only(
47 | topLeft: Radius.circular(40),
48 | topRight: Radius.circular(40),
49 | ),
50 | ),
51 | width: double.infinity,
52 | child: SizedBox(
53 | height: MediaQuery.of(context).size.height,
54 | width: MediaQuery.of(context).size.width,
55 | child: ListView(
56 | children: [
57 | ListTile(
58 | leading: Icon(
59 | Icons.contact_mail,
60 | color: Colors.white,
61 | ),
62 | title: Text(
63 | 'Contact Us',
64 | style: TextStyle(
65 | color: Colors.white,
66 | fontWeight: FontWeight.bold),
67 | ),
68 | onTap: () {
69 | Navigator.push(
70 | context,
71 | MaterialPageRoute(
72 | builder: (context) => ContactUsScreen(),
73 | ),
74 | );
75 | },
76 | ),
77 | ListTile(
78 | leading: Icon(
79 | Icons.info,
80 | color: Colors.white,
81 | ),
82 | title: Text(
83 | 'App Info',
84 | style: TextStyle(
85 | color: Colors.white,
86 | fontWeight: FontWeight.bold),
87 | ),
88 | onTap: () {
89 | Navigator.push(
90 | context,
91 | MaterialPageRoute(
92 | builder: (context) => AppInfoScreen(),
93 | ),
94 | );
95 | },
96 | ),
97 | ],
98 | ),
99 | ))
100 | ])
101 | ]);
102 | },
103 | ),
104 | ),
105 | );
106 | }
107 | }
108 |
--------------------------------------------------------------------------------
/lib/screens/homework_screen.dart:
--------------------------------------------------------------------------------
1 | import 'package:flutter/material.dart';
2 | import 'package:flutter_gen/gen_l10n/app_localizations.dart';
3 | import 'package:friday/widgets/recents_homeworks.dart';
4 |
5 | class HomeworkScreen extends StatefulWidget {
6 | @override
7 | _HomeworkScreenState createState() => _HomeworkScreenState();
8 | }
9 |
10 | class _HomeworkScreenState extends State {
11 | @override
12 | Widget build(BuildContext context) {
13 | return Scaffold(
14 | backgroundColor:
15 | Theme.of(context).colorScheme.background.withOpacity(0.8),
16 | body: SafeArea(
17 | child: SingleChildScrollView(
18 | child: Column(
19 | children: [
20 | SizedBox(height: 30.0),
21 | Text(
22 | AppLocalizations.of(context)?.recenthomework ?? "",
23 | style: TextStyle(
24 | color: Colors.white,
25 | fontSize: 30.0,
26 | fontWeight: FontWeight.bold,
27 | ),
28 | ),
29 | SizedBox(height: 30.0),
30 | Container(
31 | padding: EdgeInsets.all(35.0),
32 | height: MediaQuery.of(context).size.height - 123,
33 | decoration: BoxDecoration(
34 | color: Theme.of(context).primaryColor,
35 | borderRadius: BorderRadius.only(
36 | topLeft: Radius.circular(50.0),
37 | topRight: Radius.circular(50.0),
38 | ),
39 | ),
40 | child: RecentHomeworks(),
41 | ),
42 | ],
43 | ),
44 | ),
45 | ),
46 | );
47 | }
48 | }
49 |
--------------------------------------------------------------------------------
/lib/screens/login_page.dart:
--------------------------------------------------------------------------------
1 | import 'package:firebase_auth/firebase_auth.dart';
2 | import 'package:flutter/material.dart';
3 |
4 | ///Project Local Imports
5 | import 'package:friday/widgets/login_form.dart';
6 | import 'package:friday/widgets/onboarding_canvas_design.dart';
7 |
8 | class LoginPage extends StatefulWidget {
9 | @override
10 | _LoginPageState createState() => _LoginPageState();
11 | }
12 |
13 | class _LoginPageState extends State {
14 | late GlobalKey _scaffoldKey;
15 | @override
16 | void initState() {
17 | _scaffoldKey = new GlobalKey();
18 | FirebaseAuth.instance.signOut();
19 | super.initState();
20 | }
21 |
22 | @override
23 | Widget build(BuildContext context) {
24 | return Scaffold(
25 | backgroundColor: Theme.of(context).colorScheme.background,
26 | key: _scaffoldKey,
27 | body: SafeArea(
28 | child: Stack(
29 | children: [
30 | CustomPaint(
31 | child: Container(),
32 | painter: CanvasDesign(context: context),
33 | ),
34 | LoginForm(),
35 | ],
36 | ),
37 | ),
38 | );
39 | }
40 | }
41 |
--------------------------------------------------------------------------------
/lib/screens/new_group_screen.dart:
--------------------------------------------------------------------------------
1 | import 'package:flutter/material.dart';
2 |
3 | class NewGroupScreen extends StatelessWidget {
4 | @override
5 | Widget build(BuildContext context) {
6 | return Scaffold(
7 | appBar: AppBar(
8 | title: Text('New Groups'),
9 | backgroundColor: Color(0xFF651FFF),
10 | ),
11 | body: Container(
12 | padding: EdgeInsets.all(16.0),
13 | child: Column(
14 | children: [
15 | TextField(
16 | decoration: InputDecoration(
17 | labelText: 'Search by ID',
18 | prefixIcon: Icon(Icons.search),
19 | ),
20 | ),
21 | // Add more widgets for the new group screen as needed
22 | ],
23 | ),
24 | ),
25 | );
26 | }
27 | }
--------------------------------------------------------------------------------
/lib/screens/phone_verification_screen.dart:
--------------------------------------------------------------------------------
1 | import 'package:flutter/material.dart';
2 | import 'package:friday/screens/verify_code_screen.dart';
3 | import 'package:friday/services/phone_number_verification_db.dart';
4 |
5 | class PhoneVerificationScreen extends StatefulWidget {
6 | @override
7 | _PhoneVerificationScreenState createState() => _PhoneVerificationScreenState();
8 | }
9 |
10 | class _PhoneVerificationScreenState extends State {
11 | TextEditingController _phoneNumberController = TextEditingController();
12 | PhoneNumberVerificationDb _phoneNumberVerificationDb = PhoneNumberVerificationDb(verificationCallback: null);
13 |
14 | @override
15 | Widget build(BuildContext context) {
16 | return Scaffold(
17 | appBar: AppBar(
18 | title: Text('Phone Verification'),
19 | ),
20 | body: Center(
21 | child: Padding(
22 | padding: const EdgeInsets.all(16.0),
23 | child: Column(
24 | mainAxisAlignment: MainAxisAlignment.center,
25 | children: [
26 | Text(
27 | 'Mobile Number',
28 | style: TextStyle(
29 | fontSize: 16,
30 | fontWeight: FontWeight.bold,
31 | ),
32 | ),
33 | SizedBox(height: 16),
34 | TextField(
35 | controller: _phoneNumberController,
36 | decoration: InputDecoration(
37 | hintText: 'Enter your mobile number',
38 | border: OutlineInputBorder(),
39 | ),
40 | ),
41 | SizedBox(height: 16),
42 | ElevatedButton(
43 | onPressed: () async {
44 | String phoneNumber = _phoneNumberController.text;
45 |
46 | // Verify phone number and send OTP
47 | await _phoneNumberVerificationDb.verifyPhoneNumber(phoneNumber, null);
48 |
49 | // Navigate to the Verify Code screen
50 | Navigator.push(
51 | context,
52 | MaterialPageRoute(
53 | builder: (context) => VerifyCodeScreen(
54 | phoneNumber: phoneNumber,
55 | phoneNumberVerificationDb: _phoneNumberVerificationDb,
56 | ),
57 | ),
58 | );
59 | },
60 | child: Text('Send'),
61 | ),
62 | ],
63 | ),
64 | ),
65 | ),
66 | );
67 | }
68 | }
69 |
--------------------------------------------------------------------------------
/lib/screens/signup_additional_details_screen.dart:
--------------------------------------------------------------------------------
1 | import 'package:flutter/material.dart';
2 |
3 | ///Project Local Imports
4 | import 'package:friday/widgets/onboarding_canvas_design.dart';
5 | import 'package:friday/widgets/signup_form_additional_details.dart';
6 |
7 | class SignUpAdditionalDetails extends StatefulWidget {
8 | SignUpAdditionalDetails();
9 |
10 | @override
11 | _SignUpAdditionalDetailsState createState() =>
12 | _SignUpAdditionalDetailsState();
13 | }
14 |
15 | class _SignUpAdditionalDetailsState extends State {
16 | late GlobalKey _scaffoldKey;
17 |
18 | @override
19 | void initState() {
20 | _scaffoldKey = new GlobalKey();
21 | super.initState();
22 | }
23 |
24 | @override
25 | Widget build(BuildContext context) {
26 | return Scaffold(
27 | backgroundColor: Theme.of(context).colorScheme.background,
28 | key: _scaffoldKey,
29 | body: SafeArea(
30 | child: Stack(
31 | children: [
32 | CustomPaint(
33 | child: Container(),
34 | painter: CanvasDesign(context: context),
35 | ),
36 | SignUpFormAdditionalDetails(),
37 | ],
38 | ),
39 | ),
40 | );
41 | }
42 | }
43 |
--------------------------------------------------------------------------------
/lib/screens/signup_page.dart:
--------------------------------------------------------------------------------
1 | import 'package:flutter/material.dart';
2 |
3 | ///Project Local Imports
4 | import 'package:friday/widgets/signup_form_essential_details.dart';
5 | import 'package:friday/widgets/onboarding_canvas_design.dart';
6 |
7 | class SignUpPage extends StatefulWidget {
8 | @override
9 | _SignUpPageState createState() => _SignUpPageState();
10 | }
11 |
12 | class _SignUpPageState extends State {
13 | late GlobalKey _scaffoldKey;
14 | @override
15 | void initState() {
16 | _scaffoldKey = new GlobalKey();
17 | super.initState();
18 | }
19 |
20 | @override
21 | Widget build(BuildContext context) {
22 | return Scaffold(
23 | backgroundColor: Theme.of(context).colorScheme.background,
24 | key: _scaffoldKey,
25 | body: SafeArea(
26 | child: Stack(
27 | children: [
28 | CustomPaint(
29 | child: Container(),
30 | painter: CanvasDesign(context: context),
31 | ),
32 | SignUpFormEssentialDetails(),
33 | ],
34 | ),
35 | ),
36 | );
37 | }
38 | }
39 |
--------------------------------------------------------------------------------
/lib/screens/splash.dart:
--------------------------------------------------------------------------------
1 | import 'package:flutter/material.dart';
2 |
3 | import '../widgets/onboarding_canvas_design.dart';
4 | import '../widgets/splash_animation.dart';
5 |
6 | class SplashScreen extends StatefulWidget {
7 | const SplashScreen({required Key key}) : super(key: key);
8 |
9 | @override
10 | State createState() => _SplashScreenState();
11 | }
12 |
13 | class _SplashScreenState extends State
14 | with SingleTickerProviderStateMixin {
15 | late AnimationController _controller;
16 |
17 | @override
18 | void dispose() {
19 | _controller.dispose();
20 | super.dispose();
21 | }
22 |
23 | @override
24 | void initState() {
25 | super.initState();
26 |
27 | _controller =
28 | AnimationController(vsync: this, duration: const Duration(seconds: 2))
29 | ..forward();
30 | }
31 |
32 | @override
33 | Widget build(BuildContext context) {
34 | final splashController = SplashAnimation(_controller);
35 | return Scaffold(
36 | backgroundColor: Theme.of(context).colorScheme.background,
37 | body: SafeArea(
38 | child: Container(
39 | height: MediaQuery.of(context).size.height,
40 | child: Stack(
41 | children: [
42 | CustomPaint(
43 | child: Container(),
44 | painter: CanvasDesign(context: context),
45 | ),
46 | Center(
47 | child: ScaleTransition(
48 | scale: splashController.scale,
49 | child: Image.asset("assets/icons/icon.png"),
50 | ),
51 | ),
52 | ],
53 | ),
54 | ),
55 | ),
56 | );
57 | }
58 | }
59 |
--------------------------------------------------------------------------------
/lib/screens/theme_screen.dart:
--------------------------------------------------------------------------------
1 | import 'package:flutter/material.dart';
2 | import 'themes.dart';
3 |
4 | class ThemeScreen extends StatefulWidget {
5 | @override
6 | _ThemeScreenState createState() => _ThemeScreenState();
7 | }
8 |
9 | class _ThemeScreenState extends State {
10 | ThemeData? _currentTheme;
11 |
12 | @override
13 | void initState() {
14 | super.initState();
15 | _currentTheme = ThemeMode.system == ThemeMode.light ? lightTheme : darkTheme;
16 | }
17 |
18 | void _setTheme(ThemeData? theme) {
19 | if (theme != null) {
20 | setState(() {
21 | _currentTheme = theme;
22 | });
23 | }
24 | }
25 |
26 | @override
27 | Widget build(BuildContext context) {
28 | return MaterialApp(
29 | theme: _currentTheme,
30 | home: Scaffold(
31 | appBar: AppBar(
32 | title: Text('Theme Switcher'),
33 | ),
34 | body: Column(
35 | crossAxisAlignment: CrossAxisAlignment.start,
36 | children: [
37 | ListTile(
38 | title: Text('Light Theme'),
39 | leading: Radio(
40 | value: lightTheme,
41 | groupValue: _currentTheme,
42 | onChanged: _setTheme,
43 | ),
44 | ),
45 | Divider(),
46 | ListTile(
47 | title: Text('Dark Theme'),
48 | leading: Radio(
49 | value: darkTheme,
50 | groupValue: _currentTheme,
51 | onChanged: _setTheme,
52 | ),
53 | ),
54 | ],
55 | ),
56 | ),
57 | );
58 | }
59 | }
60 |
--------------------------------------------------------------------------------
/lib/screens/themes.dart:
--------------------------------------------------------------------------------
1 | import 'package:flutter/material.dart';
2 |
3 | final lightTheme = ThemeData(
4 | colorScheme: ColorScheme.fromSwatch()
5 | .copyWith(secondary: Colors.white)
6 | .copyWith(primary: Colors.black),
7 | );
8 |
9 | final darkTheme = ThemeData(
10 | primaryColor: Color(0xFF202328),
11 | visualDensity: VisualDensity.adaptivePlatformDensity,
12 | colorScheme: ColorScheme.fromSwatch()
13 | .copyWith(secondary: Color(0xFF651FFF))
14 | .copyWith(background: Color(0xFF12171D)),
15 | );
16 |
--------------------------------------------------------------------------------
/lib/screens/verify_code_screen.dart:
--------------------------------------------------------------------------------
1 | import 'package:flutter/material.dart';
2 | import 'package:friday/services/phone_number_verification_db.dart';
3 |
4 | class VerifyCodeScreen extends StatelessWidget {
5 | final String phoneNumber;
6 | final PhoneNumberVerificationDb phoneNumberVerificationDb;
7 |
8 | VerifyCodeScreen({
9 | required this.phoneNumber,
10 | required this.phoneNumberVerificationDb,
11 | });
12 |
13 | get verifyCodeScreenCallback => null;
14 |
15 | @override
16 | Widget build(BuildContext context) {
17 | String verificationCode = '';
18 |
19 | void handleVerification() async {
20 | try {
21 | await phoneNumberVerificationDb.verifyCode(phoneNumber, verificationCode);
22 | Navigator.push(
23 | context,
24 | phoneNumberVerificationDb.verifyPhoneNumber(phoneNumber, verifyCodeScreenCallback) as Route
25 | );
26 | } catch (e) {
27 | // Handle verification code submission failure
28 | print('Verification Code Submission Failed: ${e.toString()}');
29 | }
30 | }
31 |
32 | return Scaffold(
33 | appBar: AppBar(
34 | title: Text('Verify Code'),
35 | ),
36 | body: Center(
37 | child: Padding(
38 | padding: const EdgeInsets.all(16.0),
39 | child: Column(
40 | mainAxisAlignment: MainAxisAlignment.center,
41 | children: [
42 | Text(
43 | 'Verification Code',
44 | style: TextStyle(
45 | fontSize: 16,
46 | fontWeight: FontWeight.bold,
47 | ),
48 | ),
49 | SizedBox(height: 16),
50 | Text(
51 | 'Code will be sent to $phoneNumber',
52 | style: TextStyle(
53 | fontSize: 16,
54 | ),
55 | ),
56 | SizedBox(height: 16),
57 | TextField(
58 | onChanged: (value) {
59 | verificationCode = value;
60 | },
61 | decoration: InputDecoration(
62 | hintText: 'Enter verification code',
63 | border: OutlineInputBorder(),
64 | ),
65 | ),
66 | SizedBox(height: 16),
67 | ElevatedButton(
68 | onPressed: () {
69 | handleVerification();
70 | },
71 | child: Text('Verify'),
72 | ),
73 | ],
74 | ),
75 | ),
76 | ),
77 | );
78 | }
79 | }
80 |
--------------------------------------------------------------------------------
/lib/services/auth_error_msg_toast.dart:
--------------------------------------------------------------------------------
1 | import 'package:flutter/material.dart';
2 | import 'package:fluttertoast/fluttertoast.dart';
3 |
4 | void showErrToast(String errorMsg, FToast errToast) {
5 | // ignore: unnecessary_null_comparison
6 | if (errorMsg == null) return;
7 | Widget toast = Container(
8 | padding: const EdgeInsets.symmetric(horizontal: 15.0, vertical: 10.0),
9 | decoration: BoxDecoration(
10 | borderRadius: BorderRadius.circular(5.0),
11 | color: Colors.transparent,
12 | ),
13 | child: Text(
14 | errorMsg,
15 | style: TextStyle(color: Colors.red),
16 | ),
17 | );
18 |
19 | errToast.showToast(
20 | child: toast,
21 | gravity: ToastGravity.BOTTOM,
22 | toastDuration: Duration(seconds: 2),
23 | );
24 | }
25 |
--------------------------------------------------------------------------------
/lib/services/chats_db.dart:
--------------------------------------------------------------------------------
1 | import 'package:cloud_firestore/cloud_firestore.dart';
2 |
3 | // Function to create a new group
4 | Future createGroup(String groupName, String userId) async {
5 | CollectionReference groupsRef =
6 | FirebaseFirestore.instance.collection('groups');
7 |
8 | DocumentReference groupDocRef = await groupsRef.add({
9 | 'name': groupName,
10 | 'users': [userId],
11 | 'createdAt': FieldValue.serverTimestamp(),
12 | });
13 |
14 | return groupDocRef.id;
15 | }
16 |
17 | // Function to send a message in a group chat
18 | Future sendMessage(
19 | String groupId, String senderId, String message) async {
20 | CollectionReference messagesRef = FirebaseFirestore.instance
21 | .collection('groups')
22 | .doc(groupId)
23 | .collection('messages');
24 |
25 | await messagesRef.add({
26 | 'senderId': senderId,
27 | 'message': message,
28 | 'timestamp': FieldValue.serverTimestamp(),
29 | });
30 | }
31 |
32 | // Function to fetch group messages
33 | Stream> getGroupMessages(String groupId) {
34 | CollectionReference messagesRef = FirebaseFirestore.instance
35 | .collection('groups')
36 | .doc(groupId)
37 | .collection('messages');
38 |
39 | return messagesRef.orderBy('timestamp').snapshots();
40 | }
41 |
42 | // Function to search for users by ID and perform additional actions
43 | Future searchUsersByIdAndPerformActions(
44 | String userId, String groupId, String message) async {
45 | QuerySnapshot snapshot = await FirebaseFirestore.instance
46 | .collection('users')
47 | .where('userId', isEqualTo: userId)
48 | .get();
49 |
50 | if (snapshot.docs.isNotEmpty) {
51 | // DocumentSnapshot userSnapshot = snapshot.docs.first;
52 | // String userName = userSnapshot['name'];
53 |
54 | // Create a new group
55 | createGroup(groupId, userId).then((groupId) {
56 | print('Group created with ID: $groupId');
57 |
58 | // Send a message in the group
59 | sendMessage(groupId, userId, message).then((_) {
60 | print('Message sent successfully');
61 |
62 | // Get group messages
63 | Stream>>? messagesStream =
64 | getGroupMessages(groupId)
65 | as Stream>>?;
66 | messagesStream?.listen((QuerySnapshot> snapshot) {
67 | List>> messageDocs =
68 | snapshot.docs;
69 |
70 | for (var messageDoc in messageDocs) {
71 | String senderId = messageDoc['senderId'];
72 | String message = messageDoc['message'];
73 |
74 | print('[$senderId]: $message');
75 | }
76 | });
77 | }).catchError((error) {
78 | print('Failed to send message: $error');
79 | });
80 | }).catchError((error) {
81 | print('Failed to create group: $error');
82 | });
83 | } else {
84 | print('User not found');
85 | }
86 | }
87 |
88 | // Usage example
89 | void exampleUsage() {
90 | searchUsersByIdAndPerformActions('user123', 'group456', 'Hello everyone!');
91 | }
92 |
--------------------------------------------------------------------------------
/lib/services/facebookAuthentication.dart:
--------------------------------------------------------------------------------
1 | import 'package:flutter_login_facebook/flutter_login_facebook.dart';
2 | import 'package:friday/screens/signup_additional_details_screen.dart';
3 | import 'package:friday/services/user_info_services.dart';
4 | import 'package:friday/widgets/bottom_navigation.dart';
5 | import 'package:firebase_auth/firebase_auth.dart';
6 | import 'package:flutter/material.dart';
7 | import 'package:cloud_firestore/cloud_firestore.dart';
8 | import 'dart:async';
9 |
10 | import 'package:provider/provider.dart';
11 |
12 | class FacebookAuth {
13 | late FacebookLogin facebookSignIn;
14 | BuildContext _context;
15 |
16 | FacebookAuth(this._context) {
17 | facebookSignIn = new FacebookLogin();
18 | }
19 |
20 | void logInViaFacebook() async {
21 | // Log In Via Fb Registered Email
22 | final FacebookLoginResult result = await facebookSignIn.logIn(permissions: [
23 | FacebookPermission.publicProfile,
24 | FacebookPermission.email
25 | ]);
26 |
27 | try {
28 | // For Firebase Authentication With Facebook
29 | final credential =
30 | FacebookAuthProvider.credential(result.accessToken!.token);
31 | final fbUser =
32 | await FirebaseAuth.instance.signInWithCredential(credential);
33 | print("Facebook Authentication Successful");
34 | print(fbUser.additionalUserInfo);
35 |
36 | // Data Fetch From Firestore to verify
37 | FirebaseFirestore.instance
38 | .collection('users')
39 | .where('email', isEqualTo: fbUser.user?.email)
40 | .get()
41 | .then((querySnapShot) {
42 | if (querySnapShot.docs.isEmpty) {
43 | // Set essential details to [UserInfoServices]
44 | final displayName = fbUser.user?.displayName ?? '';
45 | final email = fbUser.user?.email ?? '';
46 |
47 | if (displayName.isNotEmpty && email.isNotEmpty) {
48 | Provider.of(this._context, listen: false)
49 | .setEssentialDetailsOfUser(displayName, email);
50 | }
51 | // Navigate to Additional Details Form
52 | Navigator.push(this._context,
53 | MaterialPageRoute(builder: (_) => SignUpAdditionalDetails()));
54 | } else {
55 | // Navigate to the Bottom Navigation Page
56 | Navigator.push(this._context,
57 | MaterialPageRoute(builder: (_) => BottomNavigation()));
58 |
59 | // Log-in Successful Notification
60 | messageShow(this._context, "Logged In", "Enjoy this app");
61 | }
62 | });
63 | } catch (e) {
64 | messageShow(this._context, "Log In Error",
65 | "Log-in not Completed or\nEmail of this Account Already Present With Other Credentials");
66 | }
67 | }
68 |
69 | Future logOut() async {
70 | try {
71 | await facebookSignIn.logOut();
72 | print("Logged out");
73 | return true;
74 | } catch (e) {
75 | return false;
76 | }
77 | }
78 | }
79 |
80 | Future messageShow(
81 | BuildContext _context, String _title, String _content) {
82 | return showDialog(
83 | context: _context,
84 | builder: (context) {
85 | return AlertDialog(
86 | backgroundColor: Colors.black38,
87 | title: Text(
88 | _title,
89 | style: TextStyle(color: Colors.white),
90 | ),
91 | content: Text(
92 | _content,
93 | style: TextStyle(color: Colors.white),
94 | ),
95 | );
96 | });
97 | }
98 |
--------------------------------------------------------------------------------
/lib/services/googleAuthentication.dart:
--------------------------------------------------------------------------------
1 | import 'package:friday/screens/signup_additional_details_screen.dart';
2 | import 'package:friday/widgets/bottom_navigation.dart';
3 | import 'package:cloud_firestore/cloud_firestore.dart';
4 | import 'package:firebase_auth/firebase_auth.dart';
5 | import 'package:google_sign_in/google_sign_in.dart';
6 | import 'package:flutter/material.dart';
7 | import 'package:provider/provider.dart';
8 | import 'package:friday/services/user_info_services.dart';
9 |
10 | class GoogleAuthenticate {
11 | var googleSignIn;
12 | BuildContext _context;
13 |
14 | GoogleAuthenticate(this._context) {
15 | googleSignIn = GoogleSignIn();
16 | }
17 |
18 | Future loginViaGoogle() async {
19 | try {
20 | if (!await googleSignIn.isSignedIn()) {
21 | // Checking If Already Sign In With Google
22 | final user = await googleSignIn.signIn();
23 | if (user == null) {
24 | print("Google Sign In Not Completed");
25 | } else {
26 | final googleAuth = await user.authentication;
27 |
28 | final credential = GoogleAuthProvider.credential(
29 | accessToken: googleAuth.accessToken,
30 | idToken: googleAuth.idToken,
31 | );
32 |
33 | var registeredUser =
34 | await FirebaseAuth.instance.signInWithCredential(credential);
35 |
36 | print("Log In Successful ${registeredUser.user!.displayName}");
37 |
38 | // Data Fetch From Firestore to verify
39 | FirebaseFirestore.instance
40 | .collection('users')
41 | .where('email', isEqualTo: registeredUser.user!.email)
42 | .get()
43 | .then((querySnapShot) {
44 | if (querySnapShot.docs.isEmpty) {
45 | // Set essential details to [UserInfoServices]
46 | Provider.of(this._context, listen: false)
47 | .setEssentialDetailsOfUser(registeredUser.user?.displayName ?? '',
48 | registeredUser.user?.email ??'');
49 |
50 | // Navigate to Additional Details Form
51 | Navigator.push(this._context,
52 | MaterialPageRoute(builder: (_) => SignUpAdditionalDetails()));
53 | } else {
54 | // Navigate to the Bottom Navigation Page
55 | Navigator.push(this._context,
56 | MaterialPageRoute(builder: (_) => BottomNavigation()));
57 |
58 | // Log-in Successful Notification
59 | messageShow(this._context, "Logged In", "Enjoy this app");
60 | }
61 | });
62 | }
63 | } else {
64 | print("Already Signed In");
65 | Navigator.push(this._context,
66 | MaterialPageRoute(builder: (_) => BottomNavigation()));
67 | }
68 | } catch (e) {
69 | messageShow(this._context, "Log In Error",
70 | "Log-in not Completed or\nEmail of this Account Already Present With Other Credentials");
71 | }
72 | }
73 |
74 | Future logOut() async {
75 | try {
76 | googleSignIn.disconnect();
77 | googleSignIn.signOut();
78 | FirebaseAuth.instance.signOut();
79 | return true;
80 | } catch (e) {
81 | return false;
82 | }
83 | }
84 | }
85 |
86 | Future messageShow(
87 | BuildContext _context, String _title, String _content) {
88 | return showDialog(
89 | context: _context,
90 | builder: (context) {
91 | return AlertDialog(
92 | backgroundColor: Colors.black38,
93 | title: Text(
94 | _title,
95 | style: TextStyle(color: Colors.white),
96 | ),
97 | content: Text(
98 | _content,
99 | style: TextStyle(color: Colors.white),
100 | ),
101 | );
102 | });
103 | }
104 |
--------------------------------------------------------------------------------
/lib/services/phone_number_verification_db.dart:
--------------------------------------------------------------------------------
1 | import 'package:firebase_auth/firebase_auth.dart';
2 |
3 | class PhoneNumberVerificationDb {
4 | final FirebaseAuth _auth = FirebaseAuth.instance;
5 |
6 | var verificationCallback;
7 |
8 | PhoneNumberVerificationDb({required this.verificationCallback});
9 |
10 | Future verifyPhoneNumber(
11 | String phoneNumber, verifyCodeScreenCallback) async {
12 | await _auth.verifyPhoneNumber(
13 | phoneNumber: phoneNumber,
14 | verificationCompleted: (PhoneAuthCredential credential) async {
15 | await _signInWithCredential(credential);
16 | },
17 | verificationFailed: (FirebaseAuthException e) {
18 | print('Verification Failed: ${e.message}');
19 | },
20 | codeSent: (String verificationId, int? resendToken) {
21 | print('Verification Code Sent to $phoneNumber');
22 | // ignore: unnecessary_statements
23 | (String verificationId, int? resendToken) {
24 | print('Verification Code Sent to $phoneNumber');
25 | };
26 | },
27 | codeAutoRetrievalTimeout: (String verificationId) {
28 | print('Code Auto Retrieval Timeout');
29 | },
30 | );
31 | }
32 |
33 | Future verifyCode(String verificationId, String smsCode) async {
34 | PhoneAuthCredential credential = PhoneAuthProvider.credential(
35 | verificationId: verificationId,
36 | smsCode: smsCode,
37 | );
38 |
39 | await _signInWithCredential(credential);
40 | }
41 |
42 | Future _signInWithCredential(PhoneAuthCredential credential) async {
43 | try {
44 | final UserCredential userCredential =
45 | await _auth.signInWithCredential(credential);
46 | final User? user = userCredential.user;
47 | if (user != null) {
48 | print('Phone Number Verified: ${user.phoneNumber}');
49 | // Handle phone number verification success
50 | } else {
51 | print('Phone Number Verification Failed: User is null');
52 | // Handle phone number verification failure
53 | }
54 | } catch (e) {
55 | print('Phone Number Verification Failed: ${e.toString()}');
56 | // Handle phone number verification failure
57 | }
58 | }
59 | }
60 |
--------------------------------------------------------------------------------
/lib/services/theme_provider.dart:
--------------------------------------------------------------------------------
1 | import 'package:flutter/material.dart';
2 |
3 | import '../screens/themes.dart';
4 |
5 | class ThemeProvider extends ChangeNotifier {
6 | ThemeData? currentTheme;
7 |
8 | setLightMode() {
9 | currentTheme = lightTheme;
10 | notifyListeners();
11 | }
12 |
13 | setDarkmode() {
14 | currentTheme = darkTheme;
15 | notifyListeners();
16 | }
17 | }
18 |
--------------------------------------------------------------------------------
/lib/services/user_db_services.dart:
--------------------------------------------------------------------------------
1 | import 'package:friday/constants.dart';
2 | import 'package:friday/models/users.dart';
3 | import 'package:friday/services/user_info_services.dart';
4 | import 'package:cloud_firestore/cloud_firestore.dart';
5 | import 'package:firebase_auth/firebase_auth.dart';
6 | import 'package:flutter/cupertino.dart';
7 | import 'package:provider/provider.dart';
8 |
9 | class UserDBServices {
10 | // Adds a `User` to [usersCollection] Collection
11 | static Future addUser(Users _user) async {
12 | FirebaseFirestore firestoreDB = FirebaseFirestore.instance;
13 | User? _currUser = FirebaseAuth.instance.currentUser;
14 |
15 | assert(_currUser is User);
16 | // Adds a user using `uid` of Firebase_auth as primary key
17 | await firestoreDB
18 | .collection(usersCollection)
19 | .doc(_currUser?.uid)
20 | .set(_user.toJson(), SetOptions(merge: true));
21 | }
22 |
23 | static Future updateProfilePictureUrl(
24 | String uid, String profilePictureUrl) async {
25 | FirebaseFirestore firestoreDB = FirebaseFirestore.instance;
26 |
27 | await firestoreDB.collection(usersCollection).doc(uid).update(
28 | {
29 | 'profilePictureUrl': profilePictureUrl,
30 | },
31 | );
32 | }
33 |
34 | static Future updateName(String uid, String name) async {
35 | FirebaseFirestore firestoreDB = FirebaseFirestore.instance;
36 |
37 | await firestoreDB.collection(usersCollection).doc(uid).update(
38 | {
39 | 'name': name,
40 | },
41 | );
42 | }
43 |
44 | static Future updateAge(String uid, int age) async {
45 | FirebaseFirestore firestoreDB = FirebaseFirestore.instance;
46 |
47 | await firestoreDB.collection(usersCollection).doc(uid).update(
48 | {
49 | 'age': age,
50 | },
51 | );
52 | }
53 |
54 | // Fetches User Data from Collection
55 | static Future fetchUserData(BuildContext context) async {
56 | FirebaseFirestore firestoreDB = FirebaseFirestore.instance;
57 | User? _currUser = FirebaseAuth.instance.currentUser;
58 | assert(_currUser is User);
59 |
60 | DocumentSnapshot? userSnap;
61 | try {
62 | userSnap = await firestoreDB
63 | .collection(usersCollection)
64 | .doc(_currUser?.uid)
65 | .get();
66 | } catch (e) {
67 | print("Error while fetching data: ${e.toString()}");
68 | }
69 | if (userSnap == null || !userSnap.exists) {
70 | // Create User
71 | return false;
72 | } else {
73 | Users user = Users.fromJson(userSnap);
74 | Provider.of(context, listen: false).setUser(user);
75 | return true;
76 | }
77 | }
78 |
79 | /// Updates User Details
80 | static Future updateUserData(Users _user) async {
81 | await addUser(_user);
82 | }
83 |
84 | // Delete User from Database
85 | static Future deleteUser(Users _user) async {
86 | FirebaseFirestore firestoreDB = FirebaseFirestore.instance;
87 | User? _currUser = FirebaseAuth.instance.currentUser;
88 | assert(_currUser is User);
89 |
90 | await firestoreDB.collection(usersCollection).doc(_currUser?.uid).delete();
91 | }
92 |
93 | static updateBio(Users currentUser) {}
94 | }
95 |
--------------------------------------------------------------------------------
/lib/services/user_info_services.dart:
--------------------------------------------------------------------------------
1 | import 'package:friday/models/users.dart';
2 | import 'package:friday/services/user_db_services.dart';
3 | import 'package:flutter/material.dart';
4 |
5 | class UserInfoServices extends ChangeNotifier {
6 | Users? _user;
7 | bool hasData = false;
8 |
9 | Users? get user => _user;
10 | Future fetchUserDetailsFromDatabase(BuildContext context) async {
11 | bool isUserExists = await UserDBServices.fetchUserData(context);
12 | if (!isUserExists) {
13 | print("user details not present in firestore");
14 | }
15 | notifyListeners();
16 | return isUserExists;
17 | }
18 |
19 | Future addUserToDatabase() async {
20 | if (_user != null) {
21 | await UserDBServices.addUser(_user!);
22 | notifyListeners();
23 | }
24 | }
25 |
26 | Future upateProfilePictureUrl() async {
27 | if (_user != null) {
28 | await UserDBServices.updateProfilePictureUrl(
29 | _user!.uid, _user!.profilePictureUrl);
30 | // notifyListeners();
31 | }
32 | }
33 |
34 | void setUser(Users user) {
35 | this._user = user;
36 | this.hasData = true;
37 | notifyListeners();
38 | }
39 |
40 | void setEssentialDetailsOfUser(String name, String email) {
41 | if (_user != null) {
42 | _user!.setEssentialDetails(name, email);
43 | }
44 | }
45 |
46 | void setAdditionalDetailsOfUser(String _course, String _dept, String _college,
47 | int _year, Gender _gender, int _age,
48 | [String? _profilePicUrl]) {
49 | if (_user != null) {
50 | this
51 | ._user!
52 | .setAdditionalDetails(_course, _dept, _college, _year, _gender, _age);
53 | notifyListeners();
54 | }
55 | }
56 | }
57 |
--------------------------------------------------------------------------------
/lib/utils/bottom_navbar_tabs.dart:
--------------------------------------------------------------------------------
1 | import 'package:flutter/foundation.dart';
2 |
3 | List> bottomNavBarData = const [
4 |
5 | {'svg': "assets/icons/house.svg", 'title': "Home"},
6 | {'svg': "assets/icons/read_book.svg", 'title': "Classes"},
7 | {'svg': "assets/icons/homework.svg", 'title': "Homework"},
8 | {'svg': "assets/icons/test.svg", 'title': "Alerts"},
9 | {'svg': "assets/icons/user.svg", 'title': "Profile"},
10 | {'svg': "assets/icons/settings.svg", 'title': "Settings"},
11 |
12 |
13 | ];
14 |
15 | class BottomNavigationBarProvider extends ChangeNotifier {
16 | int currentIndex = 0;
17 |
18 | getCurrentIndex({required int index}) {
19 | currentIndex = index;
20 | notifyListeners();
21 | }
22 |
23 | resetCurrentIndex() {
24 | currentIndex = 0;
25 | notifyListeners();
26 | }
27 | }
28 |
--------------------------------------------------------------------------------
/lib/utils/notifications.dart:
--------------------------------------------------------------------------------
1 | import 'package:flutter_local_notifications/flutter_local_notifications.dart';
2 |
3 | class NotificationService {
4 | final FlutterLocalNotificationsPlugin notificationsPlugin =
5 | FlutterLocalNotificationsPlugin();
6 |
7 | Future initNotification() async {
8 | AndroidInitializationSettings initializationSettingsAndroid =
9 | const AndroidInitializationSettings('launch_image');
10 |
11 | var initializationSettingsIOS = DarwinInitializationSettings(
12 | requestAlertPermission: true,
13 | requestBadgePermission: true,
14 | requestSoundPermission: true,
15 | onDidReceiveLocalNotification:
16 | (int id, String? title, String? body, String? payload) async {});
17 |
18 | var initializationSettings = InitializationSettings(
19 | android: initializationSettingsAndroid, iOS: initializationSettingsIOS);
20 | await notificationsPlugin.initialize(initializationSettings,
21 | onDidReceiveNotificationResponse:
22 | (NotificationResponse notificationResponse) async {});
23 | }
24 |
25 | notificationDetails() {
26 | return const NotificationDetails(
27 | android: AndroidNotificationDetails('channelId', 'channelName',
28 | importance: Importance.max),
29 | iOS: DarwinNotificationDetails());
30 | }
31 |
32 | Future showNotification(
33 | {int id = 0, String? title, String? body, String? payLoad}) async {
34 | return notificationsPlugin.show(
35 | id, title, body, await notificationDetails());
36 | }
37 | }
38 |
39 |
--------------------------------------------------------------------------------
/lib/widgets/auth_handling_widget.dart:
--------------------------------------------------------------------------------
1 | import 'package:friday/screens/loading_screen.dart';
2 | import 'package:friday/screens/signup_additional_details_screen.dart';
3 | import 'package:friday/services/user_info_services.dart';
4 | import 'package:flutter/material.dart';
5 | import 'package:provider/provider.dart';
6 |
7 | import 'package:friday/widgets/bottom_navigation.dart';
8 |
9 | class AuthHandlingWidget extends StatefulWidget {
10 | final String name, email;
11 |
12 | const AuthHandlingWidget({required Key key, required this.name, required this.email}) : super(key: key);
13 | @override
14 | _AuthHandlingWidgetState createState() => _AuthHandlingWidgetState();
15 | }
16 |
17 | class _AuthHandlingWidgetState extends State {
18 | Future? checkingUserDetails;
19 | @override
20 | void initState() {
21 | super.initState();
22 | checkingUserDetails = Provider.of(context, listen: false)
23 | .fetchUserDetailsFromDatabase(context);
24 | }
25 |
26 | @override
27 | Widget build(BuildContext context) {
28 | return FutureBuilder(
29 | future: checkingUserDetails,
30 | builder: (ctx, AsyncSnapshot isUserExists) {
31 | if (isUserExists.connectionState == ConnectionState.done) {
32 | if (isUserExists.data != null && !isUserExists.data!) {
33 | Provider.of(ctx, listen: false)
34 | .setEssentialDetailsOfUser(widget.name, widget.email);
35 | return SignUpAdditionalDetails();
36 | } else {
37 | return BottomNavigation();
38 | }
39 | } else {
40 | return LoadingScreen();
41 | }
42 | },
43 | );
44 | }
45 | }
46 |
--------------------------------------------------------------------------------
/lib/widgets/auth_input_form_field.dart:
--------------------------------------------------------------------------------
1 | import 'package:flutter/material.dart';
2 | import 'package:friday/constants.dart';
3 |
4 | class AuthInputField extends StatefulWidget {
5 | final Widget? suffixIcon;
6 | final bool obscureText;
7 | final String labelText, hintText;
8 | final TextInputAction textInputAction;
9 | final TextEditingController controller;
10 | final String? Function(String?)? validator;
11 | final TextInputType textInputType;
12 | AuthInputField({
13 | this.textInputType = TextInputType.text,
14 | required this.controller,
15 | required this.labelText,
16 | this.obscureText = false,
17 | required this.hintText,
18 | required this.textInputAction,
19 | this.suffixIcon,
20 | @required this.validator,
21 | });
22 | @override
23 | _AuthInputFieldState createState() => _AuthInputFieldState();
24 | }
25 |
26 | class _AuthInputFieldState extends State {
27 | UnderlineInputBorder _inputBorderStyle = const UnderlineInputBorder(
28 | borderSide: BorderSide(
29 | color: Colors.white70,
30 | ),
31 | );
32 |
33 | @override
34 | Widget build(BuildContext context) {
35 | return TextFormField(
36 | keyboardType: widget.textInputType,
37 | controller: widget.controller,
38 | obscureText: widget.obscureText,
39 | cursorColor: Colors.white,
40 | textInputAction: widget.textInputAction,
41 | style: TextStyle(color: Colors.white),
42 | decoration: InputDecoration(
43 | isDense: true,
44 | hintText: widget.hintText,
45 | labelText: widget.labelText,
46 | suffixIcon: widget.suffixIcon,
47 | border: _inputBorderStyle,
48 | focusedBorder: _inputBorderStyle,
49 | enabledBorder: _inputBorderStyle,
50 | focusedErrorBorder: _inputBorderStyle,
51 | focusColor: Colors.white,
52 | hintStyle: kInputTextStyle,
53 | labelStyle: kInputTextStyle,
54 | ),
55 | validator: widget.validator,
56 | );
57 | }
58 | }
59 |
--------------------------------------------------------------------------------
/lib/widgets/bottom_navigation.dart:
--------------------------------------------------------------------------------
1 | import 'package:friday/utils/bottom_navbar_tabs.dart';
2 | import 'package:flutter/material.dart';
3 | import 'package:provider/provider.dart';
4 |
5 | /// Project Imports
6 | import '../screens/home_screen.dart';
7 | import '../screens/profile_screen.dart';
8 | import '../screens/classes_screen.dart';
9 | import '../screens/homework_screen.dart';
10 | import '../screens/alert_screen.dart';
11 | import '../screens/settings_screen.dart';
12 | import '../widgets/animated_nav_bar.dart';
13 |
14 | class BottomNavigation extends StatefulWidget {
15 | @override
16 | _BottomNavigationState createState() => _BottomNavigationState();
17 | }
18 |
19 | class _BottomNavigationState extends State {
20 | int selectedTab = 0;
21 | late Widget currentPage;
22 | late List _pages;
23 | late HomeScreen _homeScreen;
24 | late HomeworkScreen _homeworkScreen;
25 | late AlertScreen _alertScreen;
26 | late ClassesScreen _classesScreen;
27 | late ProfileScreen _profileScreen;
28 | late SettingsScreen _settingsScreen;
29 | final PageController _pageController = PageController(initialPage: 0);
30 |
31 | _setCurrentPage({required int index}) {
32 | setState(() {
33 | selectedTab = index;
34 | _pageController.jumpToPage(index);
35 | print('Widget rebuilt $index');
36 | });
37 | }
38 |
39 | @override
40 | void initState() {
41 | super.initState();
42 | _homeScreen = HomeScreen(
43 | openHomeworkPage: openHomeworkPage,
44 | openSettingsPage: () {},
45 | );
46 | _classesScreen = ClassesScreen();
47 | _homeworkScreen = HomeworkScreen();
48 | _alertScreen = AlertScreen();
49 | _profileScreen = ProfileScreen();
50 | _settingsScreen = SettingsScreen();
51 | _pages = [
52 | _homeScreen,
53 | _classesScreen,
54 | _homeworkScreen,
55 | _alertScreen, //TODO: Chats Page
56 | _profileScreen,
57 | _settingsScreen
58 | ];
59 | currentPage = _homeScreen;
60 | }
61 |
62 | void openHomeworkPage() {
63 | setState(() {
64 | selectedTab = 2;
65 | currentPage = _pages[2];
66 | });
67 | }
68 |
69 | @override
70 | Widget build(BuildContext context) {
71 | final navBar = Provider.of(context);
72 | return Scaffold(
73 | backgroundColor: Theme.of(context).colorScheme.background,
74 | body: Stack(
75 | children: [
76 | PageView(
77 | physics: BouncingScrollPhysics(),
78 | controller: _pageController,
79 | onPageChanged: (int idx) {
80 | setState(() {
81 | // _selectedTab = idx;
82 | _setCurrentPage(index: idx);
83 | navBar.getCurrentIndex(index: idx);
84 | // print(_selectedTab);
85 | // _currentPage = _pages[idx];
86 | });
87 | },
88 | children: _pages,
89 | ),
90 | CustomBottomNavigator(
91 | // selectedTab: navBar.currentIndex,
92 | selectedTab: selectedTab,
93 | onPressed: (int idx) {
94 | _setCurrentPage(index: idx);
95 | currentPage = _pages[idx];
96 | print(selectedTab);
97 | // _selectedTab = idx;
98 | },
99 | )
100 | ],
101 | ),
102 | );
103 | }
104 | }
105 |
106 | class CustomBottomNavigator extends StatelessWidget {
107 | final int selectedTab;
108 | final void Function(int) onPressed;
109 | CustomBottomNavigator({
110 | required this.selectedTab,
111 | required this.onPressed,
112 | });
113 | @override
114 | Widget build(BuildContext context) {
115 | return Positioned(
116 | bottom: 0.0,
117 | left: 0.0,
118 | right: 0.0,
119 | child: Container(
120 | decoration: BoxDecoration(
121 | color: Theme.of(context).colorScheme.background,
122 | borderRadius: BorderRadius.only(
123 | topLeft: Radius.circular(30.0),
124 | topRight: Radius.circular(30.0),
125 | ),
126 | ),
127 | padding: EdgeInsets.symmetric(
128 | vertical: 10,
129 | ),
130 | child: Column(
131 | children: [
132 | BottomNavBar(
133 | key: UniqueKey(),
134 | selectedIdx: selectedTab,
135 | selectedColor: Colors.white,
136 | unselectedColor: Colors.grey,
137 | itemPadding: EdgeInsets.all(10),
138 | onPressed: onPressed,
139 | ),
140 | ],
141 | ),
142 | ),
143 | );
144 | }
145 | }
146 |
--------------------------------------------------------------------------------
/lib/widgets/countdown_painter.dart:
--------------------------------------------------------------------------------
1 | import 'dart:math';
2 |
3 | import 'package:flutter/cupertino.dart';
4 |
5 | class CountdownPainter extends CustomPainter {
6 | final Color bgColor;
7 | final Color lineColor;
8 | final double percent;
9 | final double width;
10 |
11 | CountdownPainter({
12 | required this.bgColor,
13 | required this.lineColor,
14 | required this.percent,
15 | required this.width,
16 | });
17 |
18 | @override
19 | void paint(Canvas canvas, Size size) {
20 | final Paint bgLine = Paint()
21 | ..color = bgColor
22 | ..strokeCap = StrokeCap.round
23 | ..style = PaintingStyle.stroke
24 | ..strokeWidth = width;
25 |
26 | final Paint completeLine = Paint()
27 | ..color = lineColor
28 | ..strokeCap = StrokeCap.round
29 | ..style = PaintingStyle.stroke
30 | ..strokeWidth = width;
31 |
32 | final Offset center = Offset(size.width / 2, size.height / 2);
33 | final double radius = min(size.width / 2, size.height / 2);
34 |
35 | final double sweepAngle = 2 * pi * percent;
36 |
37 | canvas.drawCircle(center, radius, bgLine);
38 | canvas.drawArc(Rect.fromCircle(center: center, radius: radius), -pi / 2,
39 | sweepAngle, false, completeLine);
40 | }
41 |
42 | @override
43 | bool shouldRepaint(CustomPainter oldDelegate) {
44 | return true;
45 | }
46 | }
47 |
--------------------------------------------------------------------------------
/lib/widgets/header.dart:
--------------------------------------------------------------------------------
1 | import 'package:flutter/material.dart';
2 | import 'package:flutter_gen/gen_l10n/app_localizations.dart';
3 | import 'package:flutter_svg/flutter_svg.dart';
4 | import 'package:friday/services/user_info_services.dart';
5 | import 'package:provider/provider.dart';
6 |
7 | class Header extends StatelessWidget {
8 | @override
9 | Widget build(BuildContext context) {
10 | return Padding(
11 | padding: EdgeInsets.fromLTRB(30.0, 50.0, 30.0, 30.0),
12 | child: Row(
13 | mainAxisAlignment: MainAxisAlignment.spaceAround,
14 | children: [
15 | Flexible(
16 | child: SvgPicture.asset(
17 | "assets/icons/grad_cap.svg",
18 | height: 70.0,
19 | ),
20 | ),
21 | Consumer(
22 | builder: (ctx, _userInfo, _) {
23 | return Row(
24 | children: [
25 | FittedBox(
26 | fit: BoxFit.fitWidth,
27 | child: Text(
28 | _userInfo.user != null
29 | ? "Hello, " + _userInfo.user!.name.split(" ")[0]
30 | : AppLocalizations.of(context)?.hellosir ?? "",
31 | style: TextStyle(
32 | color: Colors.white,
33 | fontSize: 25.0,
34 | fontWeight: FontWeight.w400,
35 | fontStyle: FontStyle.italic,
36 | ),
37 | ),
38 | ),
39 | SizedBox(
40 | width: 10.0,
41 | ),
42 | CircleAvatar(
43 | radius: 25.0,
44 | backgroundImage: _userInfo.user != null &&
45 | _userInfo.user!.profilePictureUrl.isNotEmpty
46 | ? NetworkImage(_userInfo.user!.profilePictureUrl)
47 | : AssetImage("assets/images/profile_pic.jpg")
48 | as ImageProvider,
49 | ),
50 | ],
51 | );
52 | },
53 | ),
54 | ],
55 | ),
56 | );
57 | }
58 | }
59 |
--------------------------------------------------------------------------------
/lib/widgets/onboarding_canvas_design.dart:
--------------------------------------------------------------------------------
1 | import 'package:flutter/material.dart';
2 | import 'package:friday/constants.dart';
3 |
4 | class CanvasDesign extends CustomPainter {
5 | final BuildContext context;
6 | CanvasDesign({required this.context});
7 |
8 | @override
9 | void paint(Canvas canvas, Size size) {
10 | Offset smallestCircleCenter = Offset(size.width * .93, size.height * 0.035),
11 | mediumCircleCenter = Offset(size.width * .85, size.height * 0.12),
12 | largestCircleCenter = Offset(size.width * .7, size.height * 0.05);
13 |
14 | final paint = Paint()
15 | ..color = Theme.of(context).colorScheme.secondary.withGreen(100)
16 | ..style = PaintingStyle.fill;
17 |
18 | final sideCurve = new Path()
19 | ..moveTo(size.width * .45, 0)
20 | ..quadraticBezierTo(
21 | size.width * .6,
22 | size.height * 0.15,
23 | 0,
24 | size.height * .22,
25 | )
26 | ..lineTo(0, 0)
27 | ..close();
28 | // Closed Curve
29 | canvas.drawPath(sideCurve, paint);
30 | // Circles
31 | //smallest
32 | canvas.drawCircle(smallestCircleCenter, smallestCircleRadius, paint);
33 | //medium
34 | canvas.drawCircle(mediumCircleCenter, mediumCircleRadius, paint);
35 | //largest
36 | canvas.drawCircle(largestCircleCenter, largestCircleRadius, paint);
37 | }
38 |
39 | @override
40 | bool shouldRepaint(covariant CustomPainter oldDelegate) {
41 | return false;
42 | }
43 | }
44 |
--------------------------------------------------------------------------------
/lib/widgets/round_button.dart:
--------------------------------------------------------------------------------
1 | import 'package:flutter/material.dart';
2 |
3 | class RoundButton extends StatelessWidget {
4 | const RoundButton(
5 | {required this.color,
6 | required this.onPressed,
7 | required this.text,
8 | required this.textColor});
9 | final Color color;
10 | final String text;
11 | final VoidCallback onPressed;
12 | final Color textColor;
13 |
14 | @override
15 | Widget build(BuildContext context) {
16 | return ElevatedButton(
17 | style: ElevatedButton.styleFrom(
18 | padding: EdgeInsets.symmetric(vertical: 15, horizontal: 40),
19 | backgroundColor: color,
20 | shape: RoundedRectangleBorder(
21 | borderRadius: BorderRadiusDirectional.circular(30)),
22 | ),
23 | onPressed: onPressed,
24 | child: Container(
25 | alignment: Alignment.center,
26 | width: MediaQuery.of(context).size.width * 0.6,
27 | child: Text(
28 | text,
29 | style: TextStyle(
30 | fontSize: 20,
31 | color: textColor,
32 | ),
33 | ),
34 | ),
35 | );
36 | }
37 | }
38 |
--------------------------------------------------------------------------------
/lib/widgets/splash_animation.dart:
--------------------------------------------------------------------------------
1 | import 'package:flutter/material.dart';
2 |
3 | class SplashAnimation {
4 | SplashAnimation(this.controller)
5 | : scale = Tween(begin: 0.7, end: 0.9).animate(controller);
6 |
7 | final AnimationController controller;
8 | final Animation scale;
9 | }
10 |
--------------------------------------------------------------------------------
/privacy-policy.md:
--------------------------------------------------------------------------------
1 | Privacy Policy
2 | ----------------
3 |
4 | ### Introduction
5 | Our privacy policy will help you understand what information we collect at Friday, how Friday uses it, and what choices you have.
6 | Friday built the Friday app as a free app. This SERVICE is provided by Friday at no cost and is intended for use as is.
7 | If you choose to use our Service, then you agree to the collection and use of information in relation with this policy. The Personal Information that we collect are used for providing and improving the Service. We will not use or share your information with anyone except as described in this Privacy Policy.
8 | The terms used in this Privacy Policy have the same meanings as in our Terms and Conditions, which is accessible in our website, unless otherwise defined in this Privacy Policy.
9 |
10 | ### Information Collection and Use
11 | For a better experience while using our Service, we may require you to provide us with certain personally identifiable information, including but not limited to users name, email address, gender, location, pictures. The information that we request will be retained by us and used as described in this privacy policy.
12 | The app does use third party services that may collect information used to identify you.
13 |
14 | ### Cookies
15 | Cookies are files with small amount of data that is commonly used an anonymous unique identifier. These are sent to your browser from the website that you visit and are stored on your devices’s internal memory.
16 |
17 | This Services does not uses these “cookies” explicitly. However, the app may use third party code and libraries that use “cookies” to collection information and to improve their services. You have the option to either accept or refuse these cookies, and know when a cookie is being sent to your device. If you choose to refuse our cookies, you may not be able to use some portions of this Service.
18 |
19 | ### Location Information
20 | Some of the services may use location information transmitted from users' mobile phones. We only use this information within the scope necessary for the designated service.
21 |
22 | ### Device Information
23 | We collect information from your device in some cases. The information will be utilized for the provision of better service and to prevent fraudulent acts. Additionally, such information will not include that which will identify the individual user.
24 |
25 | ### Service Providers
26 | We may employ third-party companies and individuals due to the following reasons:
27 | * To facilitate our Service;
28 | * To provide the Service on our behalf;
29 | * To perform Service-related services; or
30 | * To assist us in analyzing how our Service is used.
31 |
32 | We want to inform users of this Service that these third parties have access to your Personal Information. The reason is to perform the tasks assigned to them on our behalf. However, they are obligated not to disclose or use the information for any other purpose.
33 |
34 | ### Security
35 | We value your trust in providing us your Personal Information, thus we are striving to use commercially acceptable means of protecting it. But remember that no method of transmission over the internet, or method of electronic storage is 100% secure and reliable, and we cannot guarantee its absolute security.
36 |
37 | ### Children’s Privacy
38 | This Services do not address anyone under the age of 13. We do not knowingly collect personal identifiable information from children under 13. In the case we discover that a child under 13 has provided us with personal information, we immediately delete this from our servers. If you are a parent or guardian and you are aware that your child has provided us with personal information, please contact us so that we will be able to do necessary actions.
39 |
40 | ### Changes to This Privacy Policy
41 | We may update our Privacy Policy from time to time. Thus, you are advised to review this page periodically for any changes. We will notify you of any changes by posting the new Privacy Policy on this page. These changes are effective immediately, after they are posted on this page.
42 |
43 | ### Contact Us
44 | If you have any questions or suggestions about our Privacy Policy, do not hesitate to contact us.
45 | Contact Information:
46 | Email: ranjan.avinash@hotmail.com
47 |
--------------------------------------------------------------------------------
/pubspec.yaml:
--------------------------------------------------------------------------------
1 | name: friday
2 | description: Your Personal Class Manager Assistant, It'll never let you miss another assignment deadline or upcoming test.
3 |
4 | publish_to: "none"
5 |
6 | version: 1.0.0+1
7 |
8 | environment:
9 | sdk: ">=2.12.0 <4.0.0"
10 |
11 | dependencies:
12 | flutter:
13 | sdk: flutter
14 | flutter_localizations:
15 | sdk: flutter
16 |
17 | intl: ^0.18.1
18 | provider:
19 | fluttertoast:
20 | flutter_svg:
21 | cupertino_icons:
22 | cloud_firestore:
23 | firebase_auth:
24 | email_validator:
25 | google_sign_in:
26 | uuid:
27 | url_launcher:
28 | firebase_storage:
29 | path_provider:
30 | date_time_picker_selector:
31 | table_calendar:
32 | flutter_login_facebook:
33 | flutter_icons_null_safety:
34 | firebase_core:
35 | image_picker:
36 | introduction_screen:
37 | is_first_run:
38 | shared_preferences:
39 | # charts_flutter:
40 | d_chart:
41 | community_charts_common: ^1.0.2
42 | community_charts_flutter: ^1.0.2
43 | share_plus:
44 | flutter_share:
45 | settings_ui:
46 | external_app_launcher:
47 | open_url:
48 |
49 | http: ^0.13.6
50 |
51 | flutter_local_notifications: ^15.1.0+1
52 |
53 |
54 | dev_dependencies:
55 | flutter_test:
56 | sdk: flutter
57 | flutter_launcher_icons: ^0.13.1
58 |
59 |
60 | flutter_icons:
61 | android: true
62 | ios: true
63 | image_path: "assets/icons/icon.png"
64 |
65 | flutter:
66 | uses-material-design: true
67 | generate: true
68 |
69 |
70 | assets:
71 | - assets/icons/
72 | - assets/images/
73 |
--------------------------------------------------------------------------------
/test/widget_test.dart:
--------------------------------------------------------------------------------
1 | // This is a basic Flutter widget test.
2 | //
3 | // To perform an interaction with a widget in your test, use the WidgetTester
4 | // utility that Flutter provides. For example, you can send tap and scroll
5 | // gestures. You can also use WidgetTester to find child widgets in the widget
6 | // tree, read text, and verify that the values of widget properties are correct.
7 |
8 | import 'package:flutter/material.dart';
9 | import 'package:flutter_test/flutter_test.dart';
10 |
11 | import 'package:friday/main.dart';
12 |
13 | void main() {
14 | testWidgets('Counter increments smoke test', (WidgetTester tester) async {
15 | // Build our app and trigger a frame.
16 | await tester.pumpWidget(MyApp());
17 |
18 | // Verify that our counter starts at 0.
19 | expect(find.text('0'), findsOneWidget);
20 | expect(find.text('1'), findsNothing);
21 |
22 | // Tap the '+' icon and trigger a frame.
23 | await tester.tap(find.byIcon(Icons.add));
24 | await tester.pump();
25 |
26 | // Verify that our counter has incremented.
27 | expect(find.text('0'), findsNothing);
28 | expect(find.text('1'), findsOneWidget);
29 | });
30 | }
31 |
--------------------------------------------------------------------------------