├── .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 | ![Red](https://placehold.it/15/FFC107/000000?text=+) 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 | ![Green](https://placehold.it/15/0047B3/000000?text=+) 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 | ![Blue](https://placehold.it/15/A72828/000000?text=+) 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 | ![Friday Application Preview](friday_application_preview.png) 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 | --------------------------------------------------------------------------------