diff --git a/team#7-{9}/.gitignore b/team#7-{9}/.gitignore new file mode 100644 index 0000000..389efa4 --- /dev/null +++ b/team#7-{9}/.gitignore @@ -0,0 +1,48 @@ +# Miscellaneous +*.class +*.log +*.pyc +*.swp +.DS_Store +.atom/ +.buildlog/ +.history +.svn/ + +# IntelliJ related +*.iml +*.ipr +*.iws +.idea/ + +# The .vscode folder contains launch configuration and tasks you configure in +# VS Code which you may wish to be included in version control, so this line +# is commented out by default. +#.vscode/ + +# Flutter/Dart/Pub related +**/doc/api/ +**/ios/Flutter/.last_build_id +.dart_tool/ +.flutter-plugins +.flutter-plugins-dependencies +.packages +.pub-cache/ +.pub/ +/build/ + +# Web related +lib/generated_plugin_registrant.dart + +# Symbolication related +app.*.symbols + +# Obfuscation related +app.*.map.json + +# Android Studio will place build artifacts here +/android/app/debug +/android/app/profile +/android/app/release + +/lib/globals.dart \ No newline at end of file diff --git a/team#7-{9}/.metadata b/team#7-{9}/.metadata new file mode 100644 index 0000000..3fd46e6 --- /dev/null +++ b/team#7-{9}/.metadata @@ -0,0 +1,10 @@ +# This file tracks properties of this Flutter project. +# Used by Flutter tool to assess capabilities and perform upgrades etc. +# +# This file should be version controlled and should not be manually edited. + +version: + revision: 5d36f2e7f5387b6c751449258ade8e4e6edf99be + channel: beta + +project_type: app diff --git a/team#7-{9}/.vscode/launch.json b/team#7-{9}/.vscode/launch.json new file mode 100644 index 0000000..6316dfb --- /dev/null +++ b/team#7-{9}/.vscode/launch.json @@ -0,0 +1,13 @@ +{ + // Use IntelliSense to learn about possible attributes. + // Hover to view descriptions of existing attributes. + // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387 + "version": "0.2.0", + "configurations": [ + { + "name": "cf_pursuit", + "request": "launch", + "type": "dart" + } + ] +} \ No newline at end of file diff --git a/team#7-{9}/README.md b/team#7-{9}/README.md new file mode 100644 index 0000000..2ad9a88 --- /dev/null +++ b/team#7-{9}/README.md @@ -0,0 +1,48 @@ +# CF Pursuit + + +# About our Project: +CF Pursuit is an app that uses codeforces API to collect the user's data and show them in a very analytical and pictorial manner giving insight to self-improvement in the area of competitive programming. There are many unique and creative features for a competitive app which are discussed in detail below: + +### Features: + +| Feature Detail | Screenshot | +| ------- | :---: | +| __*Problem recommender*__ : A customized and dynamic set of problems with valid links different for every different users depending on their recent submissions and their respective tags.| | +|__*Customized ranklist*__ : Showing ranklist of users for recent 10 contests at a single time in order to provide ease for parallel comparisons.| | +|__*Profile viewer*__ : With a submission piechart as well as customized graph plot for ratings:chart_with_upwards_trend: of different years for good pictorial analysis.| | +|__*Mark future contests*__ : To show the upcoming contests of codeforces with their time and countdown with an amazing feature to mark it in the user's google calender to ensure that the user gets notified with an alarm 10-15 mins before the contests starts. | | + +____ + +# How to run:running: the app: + + + ``` + If it fails to install because of the mobile settings, try to reinstall it. + ``` + +

-OR-

+ + +# APIs used:key:: + + + +# Lets see what we developed:computer:: +

+

+ +____ + +# Team Details +

Team Name:

Donaghys

+

Participants:

diff --git a/team#7-{9}/android/.gitignore b/team#7-{9}/android/.gitignore new file mode 100644 index 0000000..0a741cb --- /dev/null +++ b/team#7-{9}/android/.gitignore @@ -0,0 +1,11 @@ +gradle-wrapper.jar +/.gradle +/captures/ +/gradlew +/gradlew.bat +/local.properties +GeneratedPluginRegistrant.java + +# Remember to never publicly share your keystore. +# See https://flutter.dev/docs/deployment/android#reference-the-keystore-from-the-app +key.properties diff --git a/team#7-{9}/android/app/build.gradle b/team#7-{9}/android/app/build.gradle new file mode 100644 index 0000000..63c48da --- /dev/null +++ b/team#7-{9}/android/app/build.gradle @@ -0,0 +1,71 @@ +def localProperties = new Properties() +def localPropertiesFile = rootProject.file('local.properties') +if (localPropertiesFile.exists()) { + localPropertiesFile.withReader('UTF-8') { reader -> + localProperties.load(reader) + } +} + +def flutterRoot = localProperties.getProperty('flutter.sdk') +if (flutterRoot == null) { + throw new GradleException("Flutter SDK not found. Define location with flutter.sdk in the local.properties file.") +} + +def flutterVersionCode = localProperties.getProperty('flutter.versionCode') +if (flutterVersionCode == null) { + flutterVersionCode = '1' +} + +def flutterVersionName = localProperties.getProperty('flutter.versionName') +if (flutterVersionName == null) { + flutterVersionName = '1.0' +} + +apply plugin: 'com.android.application' +apply plugin: 'com.google.gms.google-services' +apply plugin: 'kotlin-android' +apply from: "$flutterRoot/packages/flutter_tools/gradle/flutter.gradle" + def keystoreProperties = new Properties() + def keystorePropertiesFile = rootProject.file('key.properties') + if (keystorePropertiesFile.exists()) { + keystoreProperties.load(new FileInputStream(keystorePropertiesFile)) + } + +android { + compileSdkVersion 30 + + sourceSets { + main.java.srcDirs += 'src/main/kotlin' + } + + defaultConfig { + applicationId "com.example.cf_pursuit" + minSdkVersion 16 + targetSdkVersion 30 + versionCode flutterVersionCode.toInteger() + versionName flutterVersionName + } +signingConfigs { + release { + keyAlias keystoreProperties['keyAlias'] + keyPassword keystoreProperties['keyPassword'] + storeFile keystoreProperties['storeFile'] ? file(keystoreProperties['storeFile']) : null + storePassword keystoreProperties['storePassword'] + } + } + buildTypes { + release { + signingConfig signingConfigs.debug + } + } +} + +flutter { + source '../..' +} + +dependencies { + implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version" + implementation platform('com.google.firebase:firebase-bom:26.5.0') + implementation 'com.google.firebase:firebase-analytics' +} diff --git a/team#7-{9}/android/app/google-services.json b/team#7-{9}/android/app/google-services.json new file mode 100644 index 0000000..11651da --- /dev/null +++ b/team#7-{9}/android/app/google-services.json @@ -0,0 +1,47 @@ +{ + "project_info": { + "project_number": "82586800751", + "project_id": "cf-pursuit", + "storage_bucket": "cf-pursuit.appspot.com" + }, + "client": [ + { + "client_info": { + "mobilesdk_app_id": "1:82586800751:android:b0210ea7d282291197339a", + "android_client_info": { + "package_name": "com.example.cf_pursuit" + } + }, + "oauth_client": [ + { + "client_id": "82586800751-orjh1ua0qgaebkvuseh3gdet328cu2h1.apps.googleusercontent.com", + "client_type": 1, + "android_info": { + "package_name": "com.example.cf_pursuit", + "certificate_hash": "2fca51acf4fab53ebc1c765af8744dd704b3001a" + } + }, + { + "client_id": "82586800751-pohjad31a9rc2g0fpsknh86qrnk0ejtg.apps.googleusercontent.com", + "client_type": 3 + } + ], + "api_key": [ + { + "current_key": "AIzaSyA15PrZGcTcUiDZ6dZrKlpC5rT6yj0sjE0" + } + ], + "services": { + "appinvite_service": { + "other_platform_oauth_client": [ + { + "client_id": "82586800751-pohjad31a9rc2g0fpsknh86qrnk0ejtg.apps.googleusercontent.com", + "client_type": 3 + } + ] + } + } + } + ], + "configuration_version": "1" +} \ No newline at end of file diff --git a/team#7-{9}/android/app/src/debug/AndroidManifest.xml b/team#7-{9}/android/app/src/debug/AndroidManifest.xml new file mode 100644 index 0000000..2e9ea9f --- /dev/null +++ b/team#7-{9}/android/app/src/debug/AndroidManifest.xml @@ -0,0 +1,7 @@ + + + + diff --git a/team#7-{9}/android/app/src/main/AndroidManifest.xml b/team#7-{9}/android/app/src/main/AndroidManifest.xml new file mode 100644 index 0000000..a488abe --- /dev/null +++ b/team#7-{9}/android/app/src/main/AndroidManifest.xml @@ -0,0 +1,41 @@ + + + + + + + + + + + + + + + + diff --git a/team#7-{9}/android/app/src/main/kotlin/com/example/cf_pursuit/MainActivity.kt b/team#7-{9}/android/app/src/main/kotlin/com/example/cf_pursuit/MainActivity.kt new file mode 100644 index 0000000..404e016 --- /dev/null +++ b/team#7-{9}/android/app/src/main/kotlin/com/example/cf_pursuit/MainActivity.kt @@ -0,0 +1,6 @@ +package com.example.cf_pursuit + +import io.flutter.embedding.android.FlutterActivity + +class MainActivity: FlutterActivity() { +} diff --git a/team#7-{9}/android/app/src/main/res/drawable-v21/launch_background.xml b/team#7-{9}/android/app/src/main/res/drawable-v21/launch_background.xml new file mode 100644 index 0000000..f74085f --- /dev/null +++ b/team#7-{9}/android/app/src/main/res/drawable-v21/launch_background.xml @@ -0,0 +1,12 @@ + + + + + + + + diff --git a/team#7-{9}/android/app/src/main/res/drawable/launch_background.xml b/team#7-{9}/android/app/src/main/res/drawable/launch_background.xml new file mode 100644 index 0000000..304732f --- /dev/null +++ b/team#7-{9}/android/app/src/main/res/drawable/launch_background.xml @@ -0,0 +1,12 @@ + + + + + + + + diff --git a/team#7-{9}/android/app/src/main/res/mipmap-hdpi/ic_launcher.png b/team#7-{9}/android/app/src/main/res/mipmap-hdpi/ic_launcher.png new file mode 100644 index 0000000..db77bb4 Binary files /dev/null and b/team#7-{9}/android/app/src/main/res/mipmap-hdpi/ic_launcher.png differ diff --git a/team#7-{9}/android/app/src/main/res/mipmap-mdpi/ic_launcher.png b/team#7-{9}/android/app/src/main/res/mipmap-mdpi/ic_launcher.png new file mode 100644 index 0000000..17987b7 Binary files /dev/null and b/team#7-{9}/android/app/src/main/res/mipmap-mdpi/ic_launcher.png differ diff --git a/team#7-{9}/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png b/team#7-{9}/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png new file mode 100644 index 0000000..09d4391 Binary files /dev/null and b/team#7-{9}/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png differ diff --git a/team#7-{9}/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png b/team#7-{9}/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png new file mode 100644 index 0000000..d5f1c8d Binary files /dev/null and b/team#7-{9}/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png differ diff --git a/team#7-{9}/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png b/team#7-{9}/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png new file mode 100644 index 0000000..4d6372e Binary files /dev/null and b/team#7-{9}/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png differ diff --git a/team#7-{9}/android/app/src/main/res/values-night/styles.xml b/team#7-{9}/android/app/src/main/res/values-night/styles.xml new file mode 100644 index 0000000..449a9f9 --- /dev/null +++ b/team#7-{9}/android/app/src/main/res/values-night/styles.xml @@ -0,0 +1,18 @@ + + + + + + + diff --git a/team#7-{9}/android/app/src/main/res/values/styles.xml b/team#7-{9}/android/app/src/main/res/values/styles.xml new file mode 100644 index 0000000..d74aa35 --- /dev/null +++ b/team#7-{9}/android/app/src/main/res/values/styles.xml @@ -0,0 +1,18 @@ + + + + + + + diff --git a/team#7-{9}/android/app/src/profile/AndroidManifest.xml b/team#7-{9}/android/app/src/profile/AndroidManifest.xml new file mode 100644 index 0000000..2e9ea9f --- /dev/null +++ b/team#7-{9}/android/app/src/profile/AndroidManifest.xml @@ -0,0 +1,7 @@ + + + + diff --git a/team#7-{9}/android/build.gradle b/team#7-{9}/android/build.gradle new file mode 100644 index 0000000..04d0583 --- /dev/null +++ b/team#7-{9}/android/build.gradle @@ -0,0 +1,32 @@ +buildscript { + ext.kotlin_version = '1.3.50' + repositories { + google() + jcenter() + } + + dependencies { + classpath 'com.android.tools.build:gradle:4.0.1' + classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" + classpath 'com.google.gms:google-services:4.3.5' + } +} + +allprojects { + repositories { + google() + jcenter() + } +} + +rootProject.buildDir = '../build' +subprojects { + project.buildDir = "${rootProject.buildDir}/${project.name}" +} +subprojects { + project.evaluationDependsOn(':app') +} + +task clean(type: Delete) { + delete rootProject.buildDir +} diff --git a/team#7-{9}/android/gradle.properties b/team#7-{9}/android/gradle.properties new file mode 100644 index 0000000..94adc3a --- /dev/null +++ b/team#7-{9}/android/gradle.properties @@ -0,0 +1,3 @@ +org.gradle.jvmargs=-Xmx1536M +android.useAndroidX=true +android.enableJetifier=true diff --git a/team#7-{9}/android/gradle/wrapper/gradle-wrapper.properties b/team#7-{9}/android/gradle/wrapper/gradle-wrapper.properties new file mode 100644 index 0000000..bc6a58a --- /dev/null +++ b/team#7-{9}/android/gradle/wrapper/gradle-wrapper.properties @@ -0,0 +1,6 @@ +#Fri Jun 23 08:50:38 CEST 2017 +distributionBase=GRADLE_USER_HOME +distributionPath=wrapper/dists +zipStoreBase=GRADLE_USER_HOME +zipStorePath=wrapper/dists +distributionUrl=https\://services.gradle.org/distributions/gradle-6.7-all.zip diff --git a/team#7-{9}/android/settings.gradle b/team#7-{9}/android/settings.gradle new file mode 100644 index 0000000..44e62bc --- /dev/null +++ b/team#7-{9}/android/settings.gradle @@ -0,0 +1,11 @@ +include ':app' + +def localPropertiesFile = new File(rootProject.projectDir, "local.properties") +def properties = new Properties() + +assert localPropertiesFile.exists() +localPropertiesFile.withReader("UTF-8") { reader -> properties.load(reader) } + +def flutterSdkPath = properties.getProperty("flutter.sdk") +assert flutterSdkPath != null, "flutter.sdk not set in local.properties" +apply from: "$flutterSdkPath/packages/flutter_tools/gradle/app_plugin_loader.gradle" diff --git a/team#7-{9}/apks/apk/release/app-arm64-v8a-release.apk b/team#7-{9}/apks/apk/release/app-arm64-v8a-release.apk new file mode 100644 index 0000000..0896a6a Binary files /dev/null and b/team#7-{9}/apks/apk/release/app-arm64-v8a-release.apk differ diff --git a/team#7-{9}/apks/apk/release/app-armeabi-v7a-release.apk b/team#7-{9}/apks/apk/release/app-armeabi-v7a-release.apk new file mode 100644 index 0000000..5420006 Binary files /dev/null and b/team#7-{9}/apks/apk/release/app-armeabi-v7a-release.apk differ diff --git a/team#7-{9}/apks/apk/release/app-x86_64-release.apk b/team#7-{9}/apks/apk/release/app-x86_64-release.apk new file mode 100644 index 0000000..4f3174c Binary files /dev/null and b/team#7-{9}/apks/apk/release/app-x86_64-release.apk differ diff --git a/team#7-{9}/apks/apk/release/output-metadata.json b/team#7-{9}/apks/apk/release/output-metadata.json new file mode 100644 index 0000000..46247c1 --- /dev/null +++ b/team#7-{9}/apks/apk/release/output-metadata.json @@ -0,0 +1,53 @@ +{ + "version": 1, + "artifactType": { + "type": "APK", + "kind": "Directory" + }, + "applicationId": "com.example.cf_pursuit", + "variantName": "release", + "elements": [ + { + "type": "ONE_OF_MANY", + "filters": [ + { + "filterType": "ABI", + "value": "arm64-v8a" + } + ], + "properties": [], + "versionCode": 2001, + "versionName": "1.0.0", + "enabled": true, + "outputFile": "app-arm64-v8a-release.apk" + }, + { + "type": "ONE_OF_MANY", + "filters": [ + { + "filterType": "ABI", + "value": "x86_64" + } + ], + "properties": [], + "versionCode": 4001, + "versionName": "1.0.0", + "enabled": true, + "outputFile": "app-x86_64-release.apk" + }, + { + "type": "ONE_OF_MANY", + "filters": [ + { + "filterType": "ABI", + "value": "armeabi-v7a" + } + ], + "properties": [], + "versionCode": 1001, + "versionName": "1.0.0", + "enabled": true, + "outputFile": "app-armeabi-v7a-release.apk" + } + ] +} \ No newline at end of file diff --git a/team#7-{9}/apks/flutter-apk/app-arm64-v8a-release.apk b/team#7-{9}/apks/flutter-apk/app-arm64-v8a-release.apk new file mode 100644 index 0000000..0896a6a Binary files /dev/null and b/team#7-{9}/apks/flutter-apk/app-arm64-v8a-release.apk differ diff --git a/team#7-{9}/apks/flutter-apk/app-armeabi-v7a-release.apk b/team#7-{9}/apks/flutter-apk/app-armeabi-v7a-release.apk new file mode 100644 index 0000000..5420006 Binary files /dev/null and b/team#7-{9}/apks/flutter-apk/app-armeabi-v7a-release.apk differ diff --git a/team#7-{9}/apks/flutter-apk/app-x86_64-release.apk b/team#7-{9}/apks/flutter-apk/app-x86_64-release.apk new file mode 100644 index 0000000..4f3174c Binary files /dev/null and b/team#7-{9}/apks/flutter-apk/app-x86_64-release.apk differ diff --git a/team#7-{9}/apks/flutter-apk/app.apk b/team#7-{9}/apks/flutter-apk/app.apk new file mode 100644 index 0000000..5420006 Binary files /dev/null and b/team#7-{9}/apks/flutter-apk/app.apk differ diff --git a/team#7-{9}/apks/flutter-apk/app.apk.sha1 b/team#7-{9}/apks/flutter-apk/app.apk.sha1 new file mode 100644 index 0000000..582bba8 --- /dev/null +++ b/team#7-{9}/apks/flutter-apk/app.apk.sha1 @@ -0,0 +1 @@ +727b367d238be774b1815648b92b665c9493aa87 \ No newline at end of file diff --git a/team#7-{9}/integration_test/app_test.dart b/team#7-{9}/integration_test/app_test.dart new file mode 100644 index 0000000..d81d326 --- /dev/null +++ b/team#7-{9}/integration_test/app_test.dart @@ -0,0 +1,36 @@ +// This is a basic Flutter integration test. +// +// To perform an interaction with a widget in your test, use the WidgetTester +// utility that Flutter provides. For example, you can send tap and scroll +// gestures. You can also use WidgetTester to find child widgets in the widget +// tree, read text, and verify that the values of widget properties are correct. + +import 'package:flutter/material.dart'; +import 'package:flutter_test/flutter_test.dart'; +import 'package:integration_test/integration_test.dart'; + +import 'package:cf_pursuit/main.dart' as app; + +void main() => run(_testMain); + +void _testMain() { + testWidgets('Counter increments smoke test', (WidgetTester tester) async { + // Build our app and trigger a frame. + app.main(); + + // Trigger a frame. + await tester.pumpAndSettle(); + + // Verify that our counter starts at 0. + expect(find.text('0'), findsOneWidget); + expect(find.text('1'), findsNothing); + + // Tap the '+' icon and trigger a frame. + await tester.tap(find.byIcon(Icons.add)); + await tester.pump(); + + // Verify that our counter has incremented. + expect(find.text('0'), findsNothing); + expect(find.text('1'), findsOneWidget); + }); +} diff --git a/team#7-{9}/integration_test/driver.dart b/team#7-{9}/integration_test/driver.dart new file mode 100644 index 0000000..a03bca0 --- /dev/null +++ b/team#7-{9}/integration_test/driver.dart @@ -0,0 +1,8 @@ +// This file is provided as a convenience for running integration tests via the +// flutter drive command. +// +// flutter drive --driver integration_test/driver.dart --target integration_test/app_test.dart + +import 'package:integration_test/integration_test_driver.dart'; + +Future main() => integrationDriver(); diff --git a/team#7-{9}/ios/.gitignore b/team#7-{9}/ios/.gitignore new file mode 100644 index 0000000..0f1df0f --- /dev/null +++ b/team#7-{9}/ios/.gitignore @@ -0,0 +1,32 @@ +*.mode1v3 +*.mode2v3 +*.moved-aside +*.pbxuser +*.perspectivev3 +**/*sync/ +.sconsign.dblite +.tags* +**/.vagrant/ +**/DerivedData/ +Icon? +**/Pods/ +**/.symlinks/ +profile +xcuserdata +**/.generated/ +Flutter/App.framework +Flutter/Flutter.framework +Flutter/Flutter.podspec +Flutter/Generated.xcconfig +Flutter/app.flx +Flutter/app.zip +Flutter/flutter_assets/ +Flutter/flutter_export_environment.sh +ServiceDefinitions.json +Runner/GeneratedPluginRegistrant.* + +# Exceptions to above rules. +!default.mode1v3 +!default.mode2v3 +!default.pbxuser +!default.perspectivev3 diff --git a/team#7-{9}/ios/Flutter/AppFrameworkInfo.plist b/team#7-{9}/ios/Flutter/AppFrameworkInfo.plist new file mode 100644 index 0000000..9367d48 --- /dev/null +++ b/team#7-{9}/ios/Flutter/AppFrameworkInfo.plist @@ -0,0 +1,26 @@ + + + + + CFBundleDevelopmentRegion + en + CFBundleExecutable + App + CFBundleIdentifier + io.flutter.flutter.app + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + App + CFBundlePackageType + FMWK + CFBundleShortVersionString + 1.0 + CFBundleSignature + ???? + CFBundleVersion + 1.0 + MinimumOSVersion + 8.0 + + diff --git a/team#7-{9}/ios/Flutter/Debug.xcconfig b/team#7-{9}/ios/Flutter/Debug.xcconfig new file mode 100644 index 0000000..0b2d479 --- /dev/null +++ b/team#7-{9}/ios/Flutter/Debug.xcconfig @@ -0,0 +1 @@ +#include "Generated.xcconfig" diff --git a/team#7-{9}/ios/Flutter/Release.xcconfig b/team#7-{9}/ios/Flutter/Release.xcconfig new file mode 100644 index 0000000..0b2d479 --- /dev/null +++ b/team#7-{9}/ios/Flutter/Release.xcconfig @@ -0,0 +1 @@ +#include "Generated.xcconfig" diff --git a/team#7-{9}/ios/Runner.xcodeproj/project.pbxproj b/team#7-{9}/ios/Runner.xcodeproj/project.pbxproj new file mode 100644 index 0000000..a9cfc38 --- /dev/null +++ b/team#7-{9}/ios/Runner.xcodeproj/project.pbxproj @@ -0,0 +1,471 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 46; + objects = { + +/* Begin PBXBuildFile section */ + 1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */ = {isa = PBXBuildFile; fileRef = 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */; }; + 3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */ = {isa = PBXBuildFile; fileRef = 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */; }; + 74858FAF1ED2DC5600515810 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 74858FAE1ED2DC5600515810 /* AppDelegate.swift */; }; + 97C146FC1CF9000F007C117D /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FA1CF9000F007C117D /* Main.storyboard */; }; + 97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FD1CF9000F007C117D /* Assets.xcassets */; }; + 97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */; }; +/* End PBXBuildFile section */ + +/* Begin PBXCopyFilesBuildPhase section */ + 9705A1C41CF9048500538489 /* Embed Frameworks */ = { + isa = PBXCopyFilesBuildPhase; + buildActionMask = 2147483647; + dstPath = ""; + dstSubfolderSpec = 10; + files = ( + ); + name = "Embed Frameworks"; + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXCopyFilesBuildPhase section */ + +/* Begin PBXFileReference section */ + 1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = GeneratedPluginRegistrant.h; sourceTree = ""; }; + 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GeneratedPluginRegistrant.m; sourceTree = ""; }; + 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = AppFrameworkInfo.plist; path = Flutter/AppFrameworkInfo.plist; sourceTree = ""; }; + 74858FAD1ED2DC5600515810 /* Runner-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "Runner-Bridging-Header.h"; sourceTree = ""; }; + 74858FAE1ED2DC5600515810 /* AppDelegate.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; + 7AFA3C8E1D35360C0083082E /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = Release.xcconfig; path = Flutter/Release.xcconfig; sourceTree = ""; }; + 9740EEB21CF90195004384FC /* Debug.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Debug.xcconfig; path = Flutter/Debug.xcconfig; sourceTree = ""; }; + 9740EEB31CF90195004384FC /* Generated.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Generated.xcconfig; path = Flutter/Generated.xcconfig; sourceTree = ""; }; + 97C146EE1CF9000F007C117D /* Runner.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Runner.app; sourceTree = BUILT_PRODUCTS_DIR; }; + 97C146FB1CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; }; + 97C146FD1CF9000F007C117D /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; + 97C147001CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; }; + 97C147021CF9000F007C117D /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + 97C146EB1CF9000F007C117D /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + 9740EEB11CF90186004384FC /* Flutter */ = { + isa = PBXGroup; + children = ( + 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */, + 9740EEB21CF90195004384FC /* Debug.xcconfig */, + 7AFA3C8E1D35360C0083082E /* Release.xcconfig */, + 9740EEB31CF90195004384FC /* Generated.xcconfig */, + ); + name = Flutter; + sourceTree = ""; + }; + 97C146E51CF9000F007C117D = { + isa = PBXGroup; + children = ( + 9740EEB11CF90186004384FC /* Flutter */, + 97C146F01CF9000F007C117D /* Runner */, + 97C146EF1CF9000F007C117D /* Products */, + ); + sourceTree = ""; + }; + 97C146EF1CF9000F007C117D /* Products */ = { + isa = PBXGroup; + children = ( + 97C146EE1CF9000F007C117D /* Runner.app */, + ); + name = Products; + sourceTree = ""; + }; + 97C146F01CF9000F007C117D /* Runner */ = { + isa = PBXGroup; + children = ( + 97C146FA1CF9000F007C117D /* Main.storyboard */, + 97C146FD1CF9000F007C117D /* Assets.xcassets */, + 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */, + 97C147021CF9000F007C117D /* Info.plist */, + 1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */, + 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */, + 74858FAE1ED2DC5600515810 /* AppDelegate.swift */, + 74858FAD1ED2DC5600515810 /* Runner-Bridging-Header.h */, + ); + path = Runner; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXNativeTarget section */ + 97C146ED1CF9000F007C117D /* Runner */ = { + isa = PBXNativeTarget; + buildConfigurationList = 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */; + buildPhases = ( + 9740EEB61CF901F6004384FC /* Run Script */, + 97C146EA1CF9000F007C117D /* Sources */, + 97C146EB1CF9000F007C117D /* Frameworks */, + 97C146EC1CF9000F007C117D /* Resources */, + 9705A1C41CF9048500538489 /* Embed Frameworks */, + 3B06AD1E1E4923F5004D2608 /* Thin Binary */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = Runner; + productName = Runner; + productReference = 97C146EE1CF9000F007C117D /* Runner.app */; + productType = "com.apple.product-type.application"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + 97C146E61CF9000F007C117D /* Project object */ = { + isa = PBXProject; + attributes = { + LastUpgradeCheck = 1020; + ORGANIZATIONNAME = ""; + TargetAttributes = { + 97C146ED1CF9000F007C117D = { + CreatedOnToolsVersion = 7.3.1; + LastSwiftMigration = 1100; + }; + }; + }; + buildConfigurationList = 97C146E91CF9000F007C117D /* Build configuration list for PBXProject "Runner" */; + compatibilityVersion = "Xcode 9.3"; + developmentRegion = en; + hasScannedForEncodings = 0; + knownRegions = ( + en, + Base, + ); + mainGroup = 97C146E51CF9000F007C117D; + productRefGroup = 97C146EF1CF9000F007C117D /* Products */; + projectDirPath = ""; + projectRoot = ""; + targets = ( + 97C146ED1CF9000F007C117D /* Runner */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXResourcesBuildPhase section */ + 97C146EC1CF9000F007C117D /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */, + 3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */, + 97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */, + 97C146FC1CF9000F007C117D /* Main.storyboard in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXResourcesBuildPhase section */ + +/* Begin PBXShellScriptBuildPhase section */ + 3B06AD1E1E4923F5004D2608 /* Thin Binary */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputPaths = ( + ); + name = "Thin Binary"; + outputPaths = ( + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" embed_and_thin"; + }; + 9740EEB61CF901F6004384FC /* Run Script */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputPaths = ( + ); + name = "Run Script"; + outputPaths = ( + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" build"; + }; +/* End PBXShellScriptBuildPhase section */ + +/* Begin PBXSourcesBuildPhase section */ + 97C146EA1CF9000F007C117D /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 74858FAF1ED2DC5600515810 /* AppDelegate.swift in Sources */, + 1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin PBXVariantGroup section */ + 97C146FA1CF9000F007C117D /* Main.storyboard */ = { + isa = PBXVariantGroup; + children = ( + 97C146FB1CF9000F007C117D /* Base */, + ); + name = Main.storyboard; + sourceTree = ""; + }; + 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */ = { + isa = PBXVariantGroup; + children = ( + 97C147001CF9000F007C117D /* Base */, + ); + name = LaunchScreen.storyboard; + sourceTree = ""; + }; +/* End PBXVariantGroup section */ + +/* Begin XCBuildConfiguration section */ + 249021D3217E4FDB00AE95B9 /* Profile */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_NONNULL = YES; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + ENABLE_NS_ASSERTIONS = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_NO_COMMON_BLOCKS = YES; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 9.0; + MTL_ENABLE_DEBUG_INFO = NO; + SDKROOT = iphoneos; + SUPPORTED_PLATFORMS = iphoneos; + TARGETED_DEVICE_FAMILY = "1,2"; + VALIDATE_PRODUCT = YES; + }; + name = Profile; + }; + 249021D4217E4FDB00AE95B9 /* Profile */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CLANG_ENABLE_MODULES = YES; + CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)"; + ENABLE_BITCODE = NO; + INFOPLIST_FILE = Runner/Info.plist; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; + PRODUCT_BUNDLE_IDENTIFIER = com.example.cfPursuit; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; + SWIFT_VERSION = 5.0; + VERSIONING_SYSTEM = "apple-generic"; + }; + name = Profile; + }; + 97C147031CF9000F007C117D /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_NONNULL = YES; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = dwarf; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_TESTABILITY = YES; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_DYNAMIC_NO_PIC = NO; + GCC_NO_COMMON_BLOCKS = YES; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_PREPROCESSOR_DEFINITIONS = ( + "DEBUG=1", + "$(inherited)", + ); + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 9.0; + MTL_ENABLE_DEBUG_INFO = YES; + ONLY_ACTIVE_ARCH = YES; + SDKROOT = iphoneos; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = Debug; + }; + 97C147041CF9000F007C117D /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_NONNULL = YES; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + ENABLE_NS_ASSERTIONS = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_NO_COMMON_BLOCKS = YES; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 9.0; + MTL_ENABLE_DEBUG_INFO = NO; + SDKROOT = iphoneos; + SUPPORTED_PLATFORMS = iphoneos; + SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; + TARGETED_DEVICE_FAMILY = "1,2"; + VALIDATE_PRODUCT = YES; + }; + name = Release; + }; + 97C147061CF9000F007C117D /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 9740EEB21CF90195004384FC /* Debug.xcconfig */; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CLANG_ENABLE_MODULES = YES; + CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)"; + ENABLE_BITCODE = NO; + INFOPLIST_FILE = Runner/Info.plist; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; + PRODUCT_BUNDLE_IDENTIFIER = com.example.cfPursuit; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + SWIFT_VERSION = 5.0; + VERSIONING_SYSTEM = "apple-generic"; + }; + name = Debug; + }; + 97C147071CF9000F007C117D /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CLANG_ENABLE_MODULES = YES; + CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)"; + ENABLE_BITCODE = NO; + INFOPLIST_FILE = Runner/Info.plist; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; + PRODUCT_BUNDLE_IDENTIFIER = com.example.cfPursuit; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; + SWIFT_VERSION = 5.0; + VERSIONING_SYSTEM = "apple-generic"; + }; + name = Release; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + 97C146E91CF9000F007C117D /* Build configuration list for PBXProject "Runner" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 97C147031CF9000F007C117D /* Debug */, + 97C147041CF9000F007C117D /* Release */, + 249021D3217E4FDB00AE95B9 /* Profile */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 97C147061CF9000F007C117D /* Debug */, + 97C147071CF9000F007C117D /* Release */, + 249021D4217E4FDB00AE95B9 /* Profile */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; +/* End XCConfigurationList section */ + }; + rootObject = 97C146E61CF9000F007C117D /* Project object */; +} diff --git a/team#7-{9}/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/team#7-{9}/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata new file mode 100644 index 0000000..59c6d39 --- /dev/null +++ b/team#7-{9}/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/team#7-{9}/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/team#7-{9}/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 0000000..fc6bf80 --- /dev/null +++ b/team#7-{9}/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/team#7-{9}/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings b/team#7-{9}/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings new file mode 100644 index 0000000..af0309c --- /dev/null +++ b/team#7-{9}/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings @@ -0,0 +1,8 @@ + + + + + PreviewsEnabled + + + diff --git a/team#7-{9}/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/team#7-{9}/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme new file mode 100644 index 0000000..be0b92e --- /dev/null +++ b/team#7-{9}/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -0,0 +1,91 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/team#7-{9}/ios/Runner.xcworkspace/contents.xcworkspacedata b/team#7-{9}/ios/Runner.xcworkspace/contents.xcworkspacedata new file mode 100644 index 0000000..59c6d39 --- /dev/null +++ b/team#7-{9}/ios/Runner.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/team#7-{9}/ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/team#7-{9}/ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 0000000..fc6bf80 --- /dev/null +++ b/team#7-{9}/ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/team#7-{9}/ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings b/team#7-{9}/ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings new file mode 100644 index 0000000..af0309c --- /dev/null +++ b/team#7-{9}/ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings @@ -0,0 +1,8 @@ + + + + + PreviewsEnabled + + + diff --git a/team#7-{9}/ios/Runner/AppDelegate.swift b/team#7-{9}/ios/Runner/AppDelegate.swift new file mode 100644 index 0000000..3763683 --- /dev/null +++ b/team#7-{9}/ios/Runner/AppDelegate.swift @@ -0,0 +1,13 @@ +import UIKit +import Flutter + +@UIApplicationMain +@objc class AppDelegate: FlutterAppDelegate { + override func application( + _ application: UIApplication, + didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]? + ) -> Bool { + GeneratedPluginRegistrant.register(with: self) + return super.application(application, didFinishLaunchingWithOptions: launchOptions) + } +} diff --git a/team#7-{9}/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json b/team#7-{9}/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json new file mode 100644 index 0000000..1950fd8 --- /dev/null +++ b/team#7-{9}/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json @@ -0,0 +1,122 @@ +{ + "images" : [ + { + "size" : "20x20", + "idiom" : "iphone", + "filename" : "Icon-App-20x20@2x.png", + "scale" : "2x" + }, + { + "size" : "20x20", + "idiom" : "iphone", + "filename" : "Icon-App-20x20@3x.png", + "scale" : "3x" + }, + { + "size" : "29x29", + "idiom" : "iphone", + "filename" : "Icon-App-29x29@1x.png", + "scale" : "1x" + }, + { + "size" : "29x29", + "idiom" : "iphone", + "filename" : "Icon-App-29x29@2x.png", + "scale" : "2x" + }, + { + "size" : "29x29", + "idiom" : "iphone", + "filename" : "Icon-App-29x29@3x.png", + "scale" : "3x" + }, + { + "size" : "40x40", + "idiom" : "iphone", + "filename" : "Icon-App-40x40@2x.png", + "scale" : "2x" + }, + { + "size" : "40x40", + "idiom" : "iphone", + "filename" : "Icon-App-40x40@3x.png", + "scale" : "3x" + }, + { + "size" : "60x60", + "idiom" : "iphone", + "filename" : "Icon-App-60x60@2x.png", + "scale" : "2x" + }, + { + "size" : "60x60", + "idiom" : "iphone", + "filename" : "Icon-App-60x60@3x.png", + "scale" : "3x" + }, + { + "size" : "20x20", + "idiom" : "ipad", + "filename" : "Icon-App-20x20@1x.png", + "scale" : "1x" + }, + { + "size" : "20x20", + "idiom" : "ipad", + "filename" : "Icon-App-20x20@2x.png", + "scale" : "2x" + }, + { + "size" : "29x29", + "idiom" : "ipad", + "filename" : "Icon-App-29x29@1x.png", + "scale" : "1x" + }, + { + "size" : "29x29", + "idiom" : "ipad", + "filename" : "Icon-App-29x29@2x.png", + "scale" : "2x" + }, + { + "size" : "40x40", + "idiom" : "ipad", + "filename" : "Icon-App-40x40@1x.png", + "scale" : "1x" + }, + { + "size" : "40x40", + "idiom" : "ipad", + "filename" : "Icon-App-40x40@2x.png", + "scale" : "2x" + }, + { + "size" : "76x76", + "idiom" : "ipad", + "filename" : "Icon-App-76x76@1x.png", + "scale" : "1x" + }, + { + "size" : "76x76", + "idiom" : "ipad", + "filename" : "Icon-App-76x76@2x.png", + "scale" : "2x" + }, + { + "size" : "83.5x83.5", + "idiom" : "ipad", + "filename" : "Icon-App-83.5x83.5@2x.png", + "scale" : "2x" + }, + { + "size" : "1024x1024", + "idiom" : "ios-marketing", + "filename" : "Icon-App-1024x1024@1x.png", + "scale" : "1x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} diff --git a/team#7-{9}/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png b/team#7-{9}/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png new file mode 100644 index 0000000..dc9ada4 Binary files /dev/null and b/team#7-{9}/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png differ diff --git a/team#7-{9}/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png b/team#7-{9}/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png new file mode 100644 index 0000000..28c6bf0 Binary files /dev/null and b/team#7-{9}/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png differ diff --git a/team#7-{9}/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png b/team#7-{9}/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png new file mode 100644 index 0000000..2ccbfd9 Binary files /dev/null and b/team#7-{9}/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png differ diff --git a/team#7-{9}/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png b/team#7-{9}/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png new file mode 100644 index 0000000..f091b6b Binary files /dev/null and b/team#7-{9}/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png differ diff --git a/team#7-{9}/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png b/team#7-{9}/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png new file mode 100644 index 0000000..4cde121 Binary files /dev/null and b/team#7-{9}/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png differ diff --git a/team#7-{9}/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png b/team#7-{9}/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png new file mode 100644 index 0000000..d0ef06e Binary files /dev/null and b/team#7-{9}/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png differ diff --git a/team#7-{9}/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png b/team#7-{9}/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png new file mode 100644 index 0000000..dcdc230 Binary files /dev/null and b/team#7-{9}/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png differ diff --git a/team#7-{9}/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png b/team#7-{9}/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png new file mode 100644 index 0000000..2ccbfd9 Binary files /dev/null and b/team#7-{9}/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png differ diff --git a/team#7-{9}/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png b/team#7-{9}/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png new file mode 100644 index 0000000..c8f9ed8 Binary files /dev/null and b/team#7-{9}/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png differ diff --git a/team#7-{9}/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png b/team#7-{9}/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png new file mode 100644 index 0000000..a6d6b86 Binary files /dev/null and b/team#7-{9}/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png differ diff --git a/team#7-{9}/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png b/team#7-{9}/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png new file mode 100644 index 0000000..a6d6b86 Binary files /dev/null and b/team#7-{9}/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png differ diff --git a/team#7-{9}/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png b/team#7-{9}/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png new file mode 100644 index 0000000..75b2d16 Binary files /dev/null and b/team#7-{9}/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png differ diff --git a/team#7-{9}/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png b/team#7-{9}/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png new file mode 100644 index 0000000..c4df70d Binary files /dev/null and b/team#7-{9}/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png differ diff --git a/team#7-{9}/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png b/team#7-{9}/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png new file mode 100644 index 0000000..6a84f41 Binary files /dev/null and b/team#7-{9}/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png differ diff --git a/team#7-{9}/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png b/team#7-{9}/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png new file mode 100644 index 0000000..d0e1f58 Binary files /dev/null and b/team#7-{9}/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png differ diff --git a/team#7-{9}/ios/Runner/Assets.xcassets/LaunchImage.imageset/Contents.json b/team#7-{9}/ios/Runner/Assets.xcassets/LaunchImage.imageset/Contents.json new file mode 100644 index 0000000..d08a4de --- /dev/null +++ b/team#7-{9}/ios/Runner/Assets.xcassets/LaunchImage.imageset/Contents.json @@ -0,0 +1,23 @@ +{ + "images" : [ + { + "idiom" : "universal", + "filename" : "LaunchImage.png", + "scale" : "1x" + }, + { + "idiom" : "universal", + "filename" : "LaunchImage@2x.png", + "scale" : "2x" + }, + { + "idiom" : "universal", + "filename" : "LaunchImage@3x.png", + "scale" : "3x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} diff --git a/team#7-{9}/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png b/team#7-{9}/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png new file mode 100644 index 0000000..9da19ea Binary files /dev/null and b/team#7-{9}/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png differ diff --git a/team#7-{9}/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png b/team#7-{9}/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png new file mode 100644 index 0000000..9da19ea Binary files /dev/null and b/team#7-{9}/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png differ diff --git a/team#7-{9}/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png b/team#7-{9}/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png new file mode 100644 index 0000000..9da19ea Binary files /dev/null and b/team#7-{9}/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png differ diff --git a/team#7-{9}/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md b/team#7-{9}/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md new file mode 100644 index 0000000..65a94b5 --- /dev/null +++ b/team#7-{9}/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md @@ -0,0 +1,5 @@ +# Launch Screen Assets + +You can customize the launch screen with your own desired assets by replacing the image files in this directory. + +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. \ No newline at end of file diff --git a/team#7-{9}/ios/Runner/Base.lproj/LaunchScreen.storyboard b/team#7-{9}/ios/Runner/Base.lproj/LaunchScreen.storyboard new file mode 100644 index 0000000..497371e --- /dev/null +++ b/team#7-{9}/ios/Runner/Base.lproj/LaunchScreen.storyboard @@ -0,0 +1,37 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/team#7-{9}/ios/Runner/Base.lproj/Main.storyboard b/team#7-{9}/ios/Runner/Base.lproj/Main.storyboard new file mode 100644 index 0000000..bbb83ca --- /dev/null +++ b/team#7-{9}/ios/Runner/Base.lproj/Main.storyboard @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/team#7-{9}/ios/Runner/Info.plist b/team#7-{9}/ios/Runner/Info.plist new file mode 100644 index 0000000..c6a5687 --- /dev/null +++ b/team#7-{9}/ios/Runner/Info.plist @@ -0,0 +1,45 @@ + + + + + CFBundleDevelopmentRegion + $(DEVELOPMENT_LANGUAGE) + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIdentifier + $(PRODUCT_BUNDLE_IDENTIFIER) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + cf_pursuit + CFBundlePackageType + APPL + CFBundleShortVersionString + $(FLUTTER_BUILD_NAME) + CFBundleSignature + ???? + CFBundleVersion + $(FLUTTER_BUILD_NUMBER) + LSRequiresIPhoneOS + + UILaunchStoryboardName + LaunchScreen + UIMainStoryboardFile + Main + UISupportedInterfaceOrientations + + UIInterfaceOrientationPortrait + UIInterfaceOrientationLandscapeLeft + UIInterfaceOrientationLandscapeRight + + UISupportedInterfaceOrientations~ipad + + UIInterfaceOrientationPortrait + UIInterfaceOrientationPortraitUpsideDown + UIInterfaceOrientationLandscapeLeft + UIInterfaceOrientationLandscapeRight + + UIViewControllerBasedStatusBarAppearance + + + diff --git a/team#7-{9}/ios/Runner/Runner-Bridging-Header.h b/team#7-{9}/ios/Runner/Runner-Bridging-Header.h new file mode 100644 index 0000000..fae207f --- /dev/null +++ b/team#7-{9}/ios/Runner/Runner-Bridging-Header.h @@ -0,0 +1 @@ +#import "GeneratedPluginRegistrant.h" diff --git a/team#7-{9}/lib/globals.dart b/team#7-{9}/lib/globals.dart new file mode 100644 index 0000000..859d412 --- /dev/null +++ b/team#7-{9}/lib/globals.dart @@ -0,0 +1,19 @@ +import 'package:flutter/material.dart'; +import 'package:googleapis_auth/auth.dart'; + +const List colorList = [ + Color(0xff009797), + Colors.teal, + Color(0xff4cb6b6), + Color(0xff99d5d5) +]; + +List gradientColors = [ + const Color(0xff23b6e6), + const Color(0xff02d39a), +]; + +String googleOAuthId="82586800751-orjh1ua0qgaebkvuseh3gdet328cu2h1.apps.googleusercontent.com"; + ClientId clientID = ClientId( + "82586800751-orjh1ua0qgaebkvuseh3gdet328cu2h1.apps.googleusercontent.com", + null); diff --git a/team#7-{9}/lib/main.dart b/team#7-{9}/lib/main.dart new file mode 100644 index 0000000..f6e994d --- /dev/null +++ b/team#7-{9}/lib/main.dart @@ -0,0 +1,36 @@ +import 'package:cf_pursuit/screens/future_events.dart'; +import 'package:cf_pursuit/screens/landing_screen.dart'; +import 'package:cf_pursuit/screens/profile_screen.dart'; +import 'package:cf_pursuit/screens/rank_screen.dart'; +import 'package:cf_pursuit/screens/problem.dart'; +import 'package:cf_pursuit/screens/org_rank_screen.dart'; +import 'package:flutter/material.dart'; +import 'package:firebase_core/firebase_core.dart'; + +void main() { + WidgetsFlutterBinding.ensureInitialized(); + Firebase.initializeApp(); + runApp( + MyApp(), + ); +} + +class MyApp extends StatelessWidget { + @override + Widget build(BuildContext context) { + return MaterialApp( + title: 'CF Pursuit', + debugShowCheckedModeBanner: false, + theme: ThemeData(primarySwatch: Colors.teal, disabledColor: Colors.white), + // home:FutureEventsScreen(),//Test(),// LandingScreenMobile(), + home:LandingScreenMobile(), + routes: { + LandingScreenMobile.routeName: (context) => LandingScreenMobile(), + ProfileScreen.routeName: (context) => ProfileScreen(), + RankScreen.routeName: (context) => RankScreen(), + Problem.routeName:(context)=>Problem(), + FutureEventsScreen.routeName:(context)=>FutureEventsScreen(), + }, + ); + } +} diff --git a/team#7-{9}/lib/screens/future_events.dart b/team#7-{9}/lib/screens/future_events.dart new file mode 100644 index 0000000..7f9bc32 --- /dev/null +++ b/team#7-{9}/lib/screens/future_events.dart @@ -0,0 +1,162 @@ +import 'dart:convert'; + +import 'package:cf_pursuit/utils/gcalendar.dart'; +import 'package:cf_pursuit/utils/user_data.dart'; +import 'package:cf_pursuit/widgets/drawer.dart'; +import 'package:flutter/material.dart'; +import 'package:google_fonts/google_fonts.dart'; +import 'package:flutter_countdown_timer/flutter_countdown_timer.dart'; + +class FutureEventsScreen extends StatefulWidget { + static const routeName = '/futureEvents'; + @override + _FutureEventsScreenState createState() => _FutureEventsScreenState(); +} + +class _FutureEventsScreenState extends State { + UserData userData = UserData(); + // var futureContests; + bool isAdded = false; + @override + Widget build(BuildContext context) { + return Scaffold( + appBar: AppBar( + title: Text("Future Events"), + ), + drawer: appDrawer(context), + body: FutureBuilder( + future: UserData.futureContestData(), + builder: (context, futureContestDataSnap) { + if (futureContestDataSnap.hasData) { + Map futureContests = + json.decode(futureContestDataSnap.data.toString()) + as Map; + print(futureContests); + List l = futureContests["result"]; + final List futureEventsNamesList = []; + final List futureEventsTimesList = []; + final List timeLeft = []; + final List contestDuration = []; + l.forEach((element) { + if (element["phase"] == "BEFORE") { + futureEventsNamesList.insert( + futureEventsNamesList.length, element["name"]); + futureEventsTimesList.insert( + futureEventsTimesList.length, element["startTimeSeconds"]); + timeLeft.insert( + timeLeft.length, element["relativeTimeSeconds"]); + contestDuration.insert( + contestDuration.length, element["durationSeconds"]); + } + }); + print(futureEventsTimesList); + print(futureEventsNamesList); + print(timeLeft); + print(contestDuration); + return ListView.builder( + itemCount: futureEventsNamesList.length, + itemBuilder: (context, index) { + return Container( + height: MediaQuery.of(context).size.height * 0.21, + width: double.maxFinite, + padding: EdgeInsets.all(8), + child: Card( + elevation: 3, + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + FittedBox( + child: Container( + padding: EdgeInsets.symmetric( + vertical: 8, horizontal: 4), + // width: MediaQuery.of(context).size.width * 0.65, + child: Text( + futureEventsNamesList[index], + style: GoogleFonts.roboto( + fontSize: 20, + ), + ), + ), + ), + Container( + padding: EdgeInsets.only(left: 20), + child: RichText( + text: TextSpan( + text: "Date: ", + style: GoogleFonts.overpass( + fontWeight: FontWeight.bold, + fontSize: 18, + color: Colors.purple), + children: [ + TextSpan( + text: DateTime.fromMillisecondsSinceEpoch( + futureEventsTimesList[index] * 1000) + .toLocal() + .toString() + .substring(0, 10), + style: GoogleFonts.overpass( + fontSize: 18, color: Colors.grey), + ), + ], + ), + ), + ), + Expanded( + child: Container( + alignment: Alignment.bottomRight, + padding: EdgeInsets.only( + left: 20, bottom: 2, right: 5), + child: CountdownTimer( + endWidget: Center( + child: Text("Contest Ended"), + ), + textStyle: GoogleFonts.openSans( + fontSize: 18, + color: Colors.blue, + fontWeight: FontWeight.bold, + ), + endTime: + DateTime.now().millisecondsSinceEpoch + + timeLeft[index] * (-1000), + )), + ), + Expanded( + child: Container( + alignment: Alignment.bottomRight, + padding: EdgeInsets.only(top: 2, bottom: 5), + height: + MediaQuery.of(context).size.height * 0.027, + // width:MediaQuery.of(context).size.width*0.1, + child: ElevatedButton( + child: Text( + isAdded?"Contest Added!": "Add this event to calendar", + ), + onPressed: () { + GoogleCalendar googleCalendar = + GoogleCalendar(); + bool resultBool = googleCalendar.initialize( + futureEventsNamesList[index], + DateTime.fromMillisecondsSinceEpoch( + futureEventsTimesList[index] * 1000), + contestDuration[index].toInt()); + setState(() { + isAdded = resultBool; + }); + }, + ), + ), + ), + ], + ), + ), + ); + }); + } + return Center( + child: CircularProgressIndicator(), + ); + }, + ), + ); + } +} diff --git a/team#7-{9}/lib/screens/landing_screen.dart b/team#7-{9}/lib/screens/landing_screen.dart new file mode 100644 index 0000000..91cbd27 --- /dev/null +++ b/team#7-{9}/lib/screens/landing_screen.dart @@ -0,0 +1,287 @@ +import 'package:cf_pursuit/screens/problem.dart'; +import 'package:cf_pursuit/utils/user_data.dart'; +import 'package:cf_pursuit/screens/profile_screen.dart'; +import 'package:cf_pursuit/screens/rank_screen.dart'; +import 'package:flutter/material.dart'; +import 'package:google_fonts/google_fonts.dart'; +import '../widgets/header.dart'; + +String userNameGlobal; + +class LandingScreenMobile extends StatefulWidget { + static const routeName = "/landing"; + // static String name, institute; + + @override + _LandingScreenMobileState createState() => _LandingScreenMobileState(); +} + +class _LandingScreenMobileState extends State { + final FocusNode nameFieldNode = FocusNode(); + + final FocusNode instituteFieldNode = FocusNode(); + + final FocusNode nameSubmitNode = FocusNode(); + + final FocusNode instituteSubmitNode = FocusNode(); + + final ScrollController scrollController = ScrollController(); + + final nameFieldKey = GlobalKey(); + + final instituteFieldKey = GlobalKey(); + + final TextEditingController nameField = TextEditingController(); + + final TextEditingController instituteField = TextEditingController(); + static String institute = '', name = ''; + UserData userValidators = UserData(); + bool isValid = false; + bool isValidData = false; + // void _submitName(bool isValidData) { + // isValid = isValidData; + // print(isValidData); + // final isValidUsername = nameFieldKey.currentState.validate(); + // if (isValidUsername) { + // print(nameField.text); + // name = nameField.text; + // // print(LandingScreenMobile.name.toLowerCase()); + // // notifyListeners(); + // Navigator.of(context).pushNamed(ProfileScreen.routeName); + // } + // } + + // void _submitInstituteName() { + // final isValidInstitute = instituteFieldKey.currentState.validate(); + // if (isValidInstitute) { + // print(isValidInstitute); + // instituteFieldKey.currentState.save(); + // } + // } + + @override + Widget build(BuildContext context) { + double deviceHeight = MediaQuery.of(context).size.height, + deviceWidth = MediaQuery.of(context).size.width; + return Scaffold( + backgroundColor: Color.fromRGBO(34, 38, 76, 1), + body: SingleChildScrollView( + controller: scrollController, + child: Container( + height: deviceHeight * 0.98, + child: Column( + children: [ + WavyHeader(), + FittedBox( + child: Container( + padding: EdgeInsets.all(8), + child: Text( + "CF Pursuit", + // softWrap: true, + textAlign: TextAlign.center, + style: GoogleFonts.robotoSlab( + fontSize: 50.0, + fontWeight: FontWeight.w400, + color: Colors.white, + ), + ), + ), + ), + SizedBox( + height: deviceHeight * 0.052681, + ), + Container( + height: MediaQuery.of(context).size.height * 0.23, + child: Column( + // mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Padding( + padding: const EdgeInsets.all(8.0), + child: Form( + key: nameFieldKey, + child: TextFormField( + enableSuggestions: true, + maxLines: 1, + focusNode: nameFieldNode, + controller: nameField, + style: GoogleFonts.openSans(color: Colors.teal), + onTap: () { + FocusScopeNode currentFocus = + FocusScope.of(context); + if (!currentFocus.hasPrimaryFocus) { + currentFocus.unfocus(); + } + }, + decoration: InputDecoration( + labelText: "Username", + icon: Icon( + Icons.person, + color: nameFieldNode.hasFocus + ? Colors.teal + : Colors.white, + ), + filled: true, + labelStyle: GoogleFonts.roboto(color: Colors.white), + enabledBorder: OutlineInputBorder( + borderRadius: new BorderRadius.circular(25.0), + borderSide: new BorderSide( + color: Colors.white, + ), + ), + border: new OutlineInputBorder( + borderRadius: new BorderRadius.circular(25.0), + borderSide: new BorderSide( + color: nameFieldNode.hasFocus + ? Colors.teal + : Colors.white, + ), + ), + ), + validator: (val) { + if (val != null && val.length == 0) { + return "Username can't be of length 0"; + } + return isValidData == true + ? null + : "Invalid Username"; + }, + ), + ), + ), + SizedBox( + height: 10, + ), + ElevatedButton( + focusNode: nameSubmitNode, + style: ElevatedButton.styleFrom( + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(5), + ), + ), + onPressed: () async { + isValidData = await userValidators + .checkUser(nameField.text.toString()); + setState(() { + isValid = isValidData; + name = nameField.value.toString(); + }); + print(isValidData); + final isValidUsername = + nameFieldKey.currentState?.validate(); + if (isValidUsername ?? false) { + Problem.userr = nameField.text.toString(); + // Navigator.of(context) + // .pushNamed(ProfileScreen.routeName); + Navigator.pushNamed(context, ProfileScreen.routeName, + arguments: { + "name": nameField.text.toString(), + }); + nameField.clear(); + } + }, + child: Text( + "Submit", + style: TextStyle(fontSize: 20), + ), + ), + ], + ), + ), + FittedBox( + child: Container( + height: 70, + child: Text( + "-OR-", + style: + GoogleFonts.openSans(color: Colors.white, fontSize: 30), + ), + ), + ), + Column( + children: [ + Padding( + padding: const EdgeInsets.all(8.0), + child: Form( + key: instituteFieldKey, + child: TextFormField( + enableSuggestions: true, + maxLines: 1, + focusNode: instituteFieldNode, + controller: instituteField, + onTap: () { + FocusScopeNode currentFocus = FocusScope.of(context); + if (!currentFocus.hasPrimaryFocus) { + currentFocus.unfocus(); + } + }, + style: GoogleFonts.openSans(color: Colors.teal), + decoration: InputDecoration( + labelText: "Institution Name", + icon: Icon( + Icons.business, + color: instituteFieldNode.hasFocus + ? Colors.teal + : Colors.white, + ), + labelStyle: GoogleFonts.roboto(color: Colors.white), + enabledBorder: OutlineInputBorder( + borderRadius: new BorderRadius.circular(25.0), + borderSide: new BorderSide( + color: Colors.white, + ), + ), + border: new OutlineInputBorder( + borderRadius: new BorderRadius.circular(25.0), + borderSide: new BorderSide( + color: instituteFieldNode.hasFocus + ? Colors.teal + : Colors.white, + ), + ), + ), + validator: (val) { + if (val?.length == 0) { + return "Institute name can't be of length 0"; + } + return null; + }, + onSaved: (val) { + institute = instituteField.text; + print(val); + Navigator.of(context).pushNamed(RankScreen.routeName); + }, + ), + ), + ), + SizedBox( + height: 10, + ), + ElevatedButton( + // focusNode: instituteSubmitNode, + style: ElevatedButton.styleFrom( + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(5), + ), + ), + onPressed: () { + Navigator.pushNamed(context, RankScreen.routeName, + arguments: { + "insituteName": instituteField.text.toString(), + }); + instituteField.clear(); + // _submitInstituteName(); + }, + child: Text( + "See Ranklist", + style: TextStyle(fontSize: 20), + ), + ), + ], + ), + ], + ), + ), + ), + ); + } +} diff --git a/team#7-{9}/lib/screens/org_rank_screen.dart b/team#7-{9}/lib/screens/org_rank_screen.dart new file mode 100644 index 0000000..6dec90c --- /dev/null +++ b/team#7-{9}/lib/screens/org_rank_screen.dart @@ -0,0 +1,235 @@ +// import 'package:flutter/material.dart'; +// import "package:collection/collection.dart"; +// import 'dart:convert'; +// import 'package:url_launcher/url_launcher.dart'; + +// import 'dart:math'; +// import 'package:http/http.dart' as http; +// import 'package:horizontal_data_table/horizontal_data_table.dart'; + +// import 'package:cf_pursuit/utils/user_data.dart'; + +// class OrgRankScreen extends StatefulWidget { +// static const routeName = '/OrgrankScreen'; +// //////////////////// + +// @override +// _OrgRankScreenState createState() => _OrgRankScreenState(); +// } + +// class _OrgRankScreenState extends State { +// List data = []; +// List validOrg = []; +// var verify_map = {}; +// List fin_map = []; +// List Contestid = ['1485']; //dummy data +// @override +// HDTRefreshController _hdtRefreshController = HDTRefreshController(); + +// bool isAscending = true; +// final ScrollController listScoller = ScrollController(); + +// final ScrollController gridScoller = ScrollController(); + +// Future getRanks() async { +// data.clear(); +// validOrg.clear(); +// verify_map.clear(); +// fin_map.clear(); +// // UserData.rankinfo.clear(); + +// for (var cnt in Contestid) { +// print('hi'); +// var result = await http.get( +// 'https://codeforces.com/api/contest.standings?contestId=$cnt&from=1&count=200'); //testing + +// if (result.statusCode == 200) { +// //print('result'); +// var map = json.decode(result.body) as Map; +// //print('map==>'); +// // print(map['result']['rows']); +// map['result']['rows'].forEach((ele) { +// data.add({ +// 'handle': ele['party']['members'][0]['handle'], +// 'contestID': ele['party']['contestId'], +// 'rank': ele['rank'], +// }); + +// // print(ele['party']['members'][0]['handle']); +// // print(ele['party']['contestId']); +// // print(ele['rank']); +// // print('/////'); +// }); +// } else +// return Error(); +// } +// var new_map = groupBy(data, (obj) => obj['handle']).map((k, v) => MapEntry( +// k, +// v.map((item) { +// item.remove('handle'); +// return item; +// }).toList())); +// print("///"); +// // print(new_map); +// //new_map is important +// String st1 = ''; + +// for (var it in new_map.keys) { +// if (!(it == null)) st1 = st1 + ';' + it.toString(); +// } +// // print(st1); + +// var result1 = await http.get( +// 'https://codeforces.com/api/user.info?handles=' + st1.substring(1)); + +// if (result1.statusCode == 200) { +// verify_map = json.decode(result1.body) as Map; + +// verify_map['result'].forEach((ele) { +// if (ele['organization'] == null) //u can change the name +// validOrg.add(ele['handle']); +// }); +// print('hi........bro......oooooooo'); +// print(validOrg); + +// for (var name in validOrg) { +// fin_map.add({ +// 'handle': name, +// 'contestID': new_map[name][0]['contestID'], +// 'rank': new_map[name][0]['rank'], +// // 'stuff': new_map[name], +// }); +// } +// //imp.... +// return result1.body; +// //############################## +// } else +// return Error(); +// //////////// +// } + +// Widget build(BuildContext context) { +// return Container( +// child: FutureBuilder( +// future: getRanks(), +// builder: (context, snap) { +// if (snap.hasData) { +// print(fin_map); +// return Container( +// child: HorizontalDataTable( +// leftHandSideColumnWidth: 150, +// rightHandSideColumnWidth: 1000, +// isFixedHeader: true, +// headerWidgets: _getTitleWidget(), +// leftSideItemBuilder: (context, index) => FlatButton( +// color: index % 2 == 0 ? Colors.grey[200] : Colors.white, +// onPressed: () => Navigator.pushNamed( +// context, ProfileScreen.routeName, +// arguments: { +// "name": users[index].toString(), +// }), +// child: Container( +// child: Text( +// users[index].toString() ?? "", +// style: TextStyle(fontSize: 16), +// ), +// width: 300, +// height: 52, +// padding: EdgeInsets.fromLTRB(0, 0, 0, 0), +// alignment: Alignment.centerLeft, +// color: index % 2 == 0 ? Colors.grey[200] : Colors.white, +// ), +// ), //_generateFirstColumnRow, +// rightSideItemBuilder: _generateRightHandSideColumnRow, +// itemCount: users.length, // user.userInfo.length, +// rowSeparatorWidget: const Divider( +// color: Colors.black54, +// height: 1.0, +// thickness: 0.0, +// ), +// leftHandSideColBackgroundColor: Color(0xFFFFFFFF), +// rightHandSideColBackgroundColor: Color(0xFFFFFFFF), +// enablePullToRefresh: true, +// refreshIndicator: const WaterDropHeader(), +// refreshIndicatorHeight: 60, +// onRefresh: () async { +// //Do sth +// await Future.delayed(const Duration(milliseconds: 500)); +// _hdtRefreshController.refreshCompleted(); +// }, +// htdRefreshController: _hdtRefreshController, +// ), +// height: MediaQuery.of(context).size.height, +// ); +// } +// return Center(child: CircularProgressIndicator()); +// }, +// )); +// } + +// List _getTitleWidget() { +// return [ +// // Text("Username"), +// _getTitleItemWidget('UserName', 100), +// for (int i = 0; i < 10; i++) +// sortButtonTitleWidget(contests.length != 0 ? contests[i] : "ContestId"), +// ]; +// } + +// Widget sortButtonTitleWidget(String title) { +// return _getTitleItemWidget(title, 100); +// } + +// Widget _getTitleItemWidget(String label, double width) { +// return Container( +// child: Text( +// label, +// style: TextStyle( +// fontWeight: FontWeight.bold, +// fontSize: 16, +// ), +// ), +// width: width, +// height: 56, +// padding: EdgeInsets.fromLTRB(5, 0, 0, 0), +// alignment: Alignment.centerLeft, +// ); +// } + +// String getRankContestData(int index, int rowIndex) { +// String result = "-"; +// newMapp[users[index]].forEach((val) { +// // print(val["contestId"]); +// // print(val["rank"].toString()); +// if (val["contestId"] +// .toString() +// .compareTo(contests[rowIndex].toString()) == +// 0) //contests[index]) +// result = val["rank"].toString(); +// }); +// // print("iitut----------------------------->>$result"); +// return result; +// } + +// Widget _generateRightHandSideColumnRow(BuildContext context, int index) { +// return Row( +// children: [ +// for (int i = 0; i < 10; i++) +// Container( +// color: index % 2 == 0 ? Colors.grey[200] : Colors.white, +// child: Row( +// children: [ +// Text(newMapp.length != 0 +// ? getRankContestData(index, i) //[0]["rank"].toString() +// : ""), +// ], +// ), +// width: 100, +// height: 52, +// padding: EdgeInsets.fromLTRB(5, 0, 0, 0), +// alignment: Alignment.centerLeft, +// ), +// ], +// ); +// } +// } diff --git a/team#7-{9}/lib/screens/problem.dart b/team#7-{9}/lib/screens/problem.dart new file mode 100644 index 0000000..850834c --- /dev/null +++ b/team#7-{9}/lib/screens/problem.dart @@ -0,0 +1,213 @@ +import 'dart:convert'; +import 'package:cf_pursuit/widgets/drawer.dart'; +import 'package:flutter/gestures.dart'; +import 'package:flutter/material.dart'; +import 'package:google_fonts/google_fonts.dart'; +import 'package:url_launcher/url_launcher.dart'; +import 'dart:math'; +import 'package:http/http.dart' as http; + +class Problem extends StatelessWidget { + static const routeName = '/performance'; + + static String userr = ''; + + var rting = 0; + Set Tags = {}; + List prblms = []; + void prompt(String url) async { + print(url); + if (await canLaunch(url)) { + await launch(url); + } else { + throw 'Could not launch $url'; + } + } + + Future getTags(String handle) async { + var result = await http.get( + 'https://codeforces.com/api/user.status?handle=$handle&from=1&count=10'); + print('fyuuuuuuuuuuuuuuu11111111111111uuu'); + //'https://codeforces.com/api/contest.ratingChanges?contestId=$ID&from=1&count=10'); + if (result.statusCode == 200) { + var tg = json.decode(result.body) as Map; + print(tg); + // print('fyuuuuuuuuuuuuuuuuuu'); + // List rt=[]; + tg.forEach((key, value) { + print("key==>$value"); + if (!(value.toString() == 'OK')) { + // print("keyyyyyyyyyyyyyyyyyyyyyy==>$value"); + //############# + value.forEach((elem) { + print(elem['problem']['tags'].toString()); + if (!(elem['verdict'] == 'OK') && Tags.length < 100) { + Tags.addAll(elem['problem']['tags']); + + //////////////////////// + // for (var i in Tags) + // // { + // print(i); + // st = st + '&'+i.toString(); + } + + //} + }); + // for (int ii in value) { + // print('key====>' + value[0]['id'].toString()); + // if (!(value[ii]['verdict'] == 'OK') && Tags.length < 100) { + // Tags.addAll(value[ii]['problem']['tags']); + // } + // } + //); + + } + //rt.add(absolut(value['oldRating']-value['newRating'])); + }); + String st = ""; + var kk = 0; + List tgs = []; + for (var i in Tags) tgs.add(i); + Set Tagsnew = {}; + Tagsnew.add(tgs[Random().nextInt(tgs.length - 1)]); + Tagsnew.add(tgs[Random().nextInt(tgs.length - 1)]); + + for (var i in Tagsnew) { + //print("f-->"); + // print(i); + // if (kk < 2) { + st = st + ';' + i; + // kk++; + //} + } + print('https://codeforces.com/api/problemset.problems?tags=' + + st.substring(1)); + var result1 = await http.get( + 'https://codeforces.com/api/problemset.problems?tags=' + + st.substring(1)); + + if (result1.statusCode == 200) { + print("fgfff"); + var prb = json.decode(result1.body) as Map; + print("prrrrrrrr==>" + prb['result'].toString()); + String prlink = 'https://codeforces.com/contest/'; + prb['result'].forEach((key, ele) { + ele.forEach((elem) { + if (prblms.length <= 10 && !(elem['name'].toString() == 'null')) { + print("hettttttt"+elem['name'].toString()); + prblms.add({ + 'name': elem['name'].toString(), + 'link': prlink + + elem['contestId'].toString() + + '/problem/' + + elem['index'].toString() + }); + } + }); + ////////////########### + // prblms.add(prlink + + // ele['problems']['contestId'].toString() + + // '/problem/' + + // ele['problems']['index'].toString()); + }); + + // for (var pp in prblms) print(pp); + print(prblms.length); + return result1.body; + } else + return Error(); + + // return result.body; + } else + return Error(); + } + + @override + Widget build(BuildContext context) { + return Scaffold( + appBar: AppBar( + title: Text('Problems Recommender'), + ), + drawer: appDrawer(context), + body: FutureBuilder( + future: getTags(userr), + builder: (context, check) { + if (check.hasData) { + return Container( + child: Column( + children: [ + FittedBox( + child: Text("Recommended questions to do", + style: GoogleFonts.raleway( + fontSize: 18,fontWeight: FontWeight.w600, color: Colors.purple[900]))), + SizedBox( + height: 10, + ), + Container( + height: MediaQuery.of(context).size.height * 0.8, + child: ListView.builder( + itemCount: prblms.length, + itemBuilder: (BuildContext context, index) { + return Card( + elevation: 5, + child: Container( + height: 50, + color: index % 2 == 0 + ? Colors.grey[100] + : Colors.white, + child: InkWell( + // When the user taps the button, show a snackbar. + onTap: () { + prompt(prblms[index]['link']); + }, + child: Container( + padding: EdgeInsets.all(12.0), + child: Text(prblms[index]['name']), + ), + ), + // RichText( + // text: TextSpan(children: [ + // // TextSpan( + // // style: defaultText, + // // text: "To learn more " + // // ), + // TextSpan( + // style: GoogleFonts.roboto( + // fontSize: 18, + // color: Colors.grey[800]), + // text: prblms[index]['name'], + // recognizer: TapGestureRecognizer() + // ..onTap = () async { + // // var url = "https://www.youtube.com/channel/UCwxiHP2Ryd-aR0SWKjYguxw?view_as=subscriber"; + // var url = prblms[index]['link']; + + // print(url); + // if (await canLaunch(url)) { + // await launch(url); + // } else { + // throw 'Could not launch $url'; + // } + // }), + // ]), + // ), + // // Center( + // child: Text( + // prblms[index]['name'], + // style: GoogleFonts.roboto( + // fontSize: 18, color: Colors.grey[800]), + // ) + // ), + ), + ); + }, + ), + ), + ], + ), + ); + } + return Center(child: CircularProgressIndicator.adaptive()); + }), + ); + } +} diff --git a/team#7-{9}/lib/screens/profile_screen.dart b/team#7-{9}/lib/screens/profile_screen.dart new file mode 100644 index 0000000..b2a9275 --- /dev/null +++ b/team#7-{9}/lib/screens/profile_screen.dart @@ -0,0 +1,279 @@ +import 'dart:convert'; + +import 'package:cf_pursuit/screens/rating_chart.dart'; +import 'package:cf_pursuit/screens/submission_chart.dart'; +import 'package:cf_pursuit/utils/user_data.dart'; +import 'package:cf_pursuit/widgets/drawer.dart'; +import 'package:flutter/material.dart'; +import 'package:google_fonts/google_fonts.dart'; + +class ProfileScreen extends StatefulWidget { + static const routeName = '/profileScreen'; + @override + _ProfileScreenState createState() => _ProfileScreenState(); +} + +class _ProfileScreenState extends State { + UserData user = UserData(); + ScrollController _scrollController = ScrollController(); + String dropDownValue = ''; + String userName = ''; + @override + void initState() { + dropDownValue = DateTime.now().year.toString(); + super.initState(); + } + + @override + Widget build(BuildContext context) { + final Map data = + ModalRoute.of(context).settings.arguments as Map; + userName = data["name"].toString() ?? userName; + + Future userData; + return Scaffold( + appBar: AppBar( + title: Text( + userName, + ), + // automaticallyImplyLeading: false, + ), + drawer: appDrawer(context), + body: FutureBuilder( + future: UserData().getUserData(userName), + builder: (context, userData) { + if (userData.hasData) { + Map userMapData = + json.decode(userData.data.toString()) as Map; + print(userMapData); + return SingleChildScrollView( + controller: _scrollController, + child: Container( + child: Column( + mainAxisAlignment: MainAxisAlignment.spaceEvenly, + children: [ + Row( + mainAxisAlignment: MainAxisAlignment.start, + children: [ + Container( + padding: + EdgeInsets.symmetric(vertical: 15, horizontal: 8), + child: CircleAvatar( + radius: 60, + backgroundImage: userMapData["result"][0] + ["titlePhoto"] + .toString() != + "null" + ? NetworkImage( + "https:" + + userMapData["result"][0]["titlePhoto"] + .toString(), + ) + : NetworkImage( + "https://www.pavilionweb.com/wp-content/uploads/2017/03/man-300x300.png", + ), + ), + ), + Container( + padding: EdgeInsets.only(left: 16), + // width: + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + (userMapData["result"][0]["firstName"] == null ||userMapData["result"][0]["lastName"] == null) + ? data["name"].toString() ?? userName + : userMapData["result"][0]["firstName"] + + " " + + userMapData["result"][0]["lastName"], + style: GoogleFonts.openSans( + color: Colors.teal, fontSize: 23), + ), + if (userMapData["result"][0]["city"] != null) + Text( + userMapData["result"][0]["city"], + style: GoogleFonts.openSans( + color: Colors.teal, fontSize: 23), + ), + if (userMapData["result"][0]["country"] != null) + Text( + userMapData["result"][0]["country"], + style: GoogleFonts.openSans( + color: Colors.teal, fontSize: 23), + ), + ], + ), + ), + ], + ), + Container( + decoration: BoxDecoration( + borderRadius: BorderRadius.all(Radius.circular(30))), + height: 260, + width: double.maxFinite, + margin: EdgeInsets.symmetric(horizontal: 10), + child: Card( + elevation: 15, + child: Container( + decoration: BoxDecoration( + borderRadius: + BorderRadius.all(Radius.circular(30))), + child: Column( + crossAxisAlignment: CrossAxisAlignment.stretch, + mainAxisAlignment: MainAxisAlignment.spaceEvenly, + children: [ + Container( + width: double.maxFinite, + height: 30, + child: Center( + child: Text( + "Codeforces Handle Details", + style: GoogleFonts.roboto( + fontSize: 20, + color: Colors.black, + ), + textAlign: TextAlign.start, + ), + ), + color: Colors.grey[100], + ), + Card( + elevation: 8, + child: Column( + children: [ + Container( + padding: + EdgeInsets.symmetric(horizontal: 8), + height: 40, + width: 400, + child: RichText( + text: TextSpan( + text: "Current Rating: ", + style: GoogleFonts.overpass( + fontWeight: FontWeight.bold, + fontSize: 18, + color: Colors.blue), + children: [ + TextSpan( + text: userMapData["result"][0] + ["rating"] + .toString(), + style: GoogleFonts.overpass( + fontSize: 18, + color: Colors.red), + ), + ], + ), + ), + ), + Container( + padding: + EdgeInsets.symmetric(horizontal: 8), + height: 40, + width: 400, + child: RichText( + text: TextSpan( + text: "Current Rank: ", + style: GoogleFonts.overpass( + fontWeight: FontWeight.bold, + fontSize: 18, + color: Colors.blue), + children: [ + TextSpan( + text: userMapData["result"][0] + ["rank"] + .toString(), + style: GoogleFonts.overpass( + fontSize: 18, + color: Colors.red), + ), + ], + ), + ), + ), + ], + ), + ), + Divider(), + Card( + elevation: 8, + child: Column( + children: [ + Container( + padding: + EdgeInsets.symmetric(horizontal: 8), + height: 40, + width: 400, + child: RichText( + text: TextSpan( + text: "Maximum Rating: ", + style: GoogleFonts.overpass( + fontWeight: FontWeight.bold, + fontSize: 18, + color: Colors.blue), + children: [ + TextSpan( + text: userMapData["result"][0] + ["maxRating"] + .toString(), + style: GoogleFonts.overpass( + fontSize: 18, + color: Colors.red), + ), + ], + ), + ), + ), + Container( + padding: + EdgeInsets.symmetric(horizontal: 8), + height: 40, + width: 400, + child: RichText( + text: TextSpan( + text: "Maximum Rank: ", + style: GoogleFonts.overpass( + fontWeight: FontWeight.bold, + fontSize: 18, + color: Colors.blue), + children: [ + TextSpan( + text: userMapData["result"][0] + ["maxRank"] + .toString(), + style: GoogleFonts.overpass( + fontSize: 18, + color: Colors.red), + ), + ], + ), + ), + ), + ], + ), + ), + ]), + ), + ), + ), + SizedBox( + height: 40, + ), + Container( + child: RanksChart(userName), + ), + SizedBox( + height: 40, + ), + SubmissionChart(userName), + ], + ), + ), + ); + } + return Center(child: CircularProgressIndicator()); + }, + ), + ); + } +} diff --git a/team#7-{9}/lib/screens/rank_screen.dart b/team#7-{9}/lib/screens/rank_screen.dart new file mode 100644 index 0000000..6375cbb --- /dev/null +++ b/team#7-{9}/lib/screens/rank_screen.dart @@ -0,0 +1,330 @@ +import 'package:cf_pursuit/screens/profile_screen.dart'; +import 'package:cf_pursuit/widgets/drawer.dart'; +import 'package:flutter/material.dart'; +import "package:collection/collection.dart"; +import 'dart:convert'; +import 'package:horizontal_data_table/horizontal_data_table.dart'; + +import 'package:cf_pursuit/utils/user_data.dart'; + +class RankScreen extends StatefulWidget { + static const routeName = '/rankScreen'; + //var rankinfo = []; + + static const int sortStatus = 1; + + @override + _RankScreenState createState() => _RankScreenState(); +} + +class _RankScreenState extends State { + var userDBData = {}; + @override + void initState() { + // userDBData = UserData().getDBUserData(); + super.initState(); + } + + Map newMapp = {}; + + List rankingss = []; + + HDTRefreshController _hdtRefreshController = HDTRefreshController(); + + bool isAscending = true; + final ScrollController listScoller = ScrollController(); + + final ScrollController gridScoller = ScrollController(); + + Future getRanks(List userName) async { + UserData.rankinfo.clear(); + + // var contestData = await UserData.getPreContestData(); + // print(contestData.data); + // // if (contestDat.) { + // print(contestData.data); + // contests = contestData.data; + // var userssData = UserData().getDBUserData(); + // print("--------------------------->>>>>>>>>>>>"+userssData.toString()); + for (var i in userName) { + print(i.toString()); + + if (i == userName[userName.length - 1]) + return await UserData.getUserRankData(i, []); + else + await UserData.getUserRankData(i, []); + } + } + + // var data = [ + // { + // 'handle': 'valiant_vidit', + // 'contestId': [ + // '1360', + // '1361', + // '1362', + // ], + // }, + // { + // 'handle': 'vikrant3302', + // 'contestId': ['1361', '1362', '1363'], + // } + // ]; + var newMapps; + List users = []; + List userFromDb = []; + List contests = []; + @override + Widget build(BuildContext context) { + print("######"); + // var pk = groupBy(data, (obj) => obj['contestId']).map((k, v) => MapEntry( + // k, + // v.map((item) { + // item.remove('contestId'); + // return item; + // }).toList())); + // print("hellllllllllllooooooooo maoooonikkkkkkkkk"); + // print(pk); + // rankinfo.clear(); + // print(UserData.rankinfo); + return Scaffold( + appBar: AppBar( + title: Text('Rankings'), + ), + + drawer: appDrawer(context), + body: FutureBuilder( + future: UserData().getDBUserData(), + builder: (context, userDbDataShot) { + if (userDbDataShot.hasData) { + Map userDbData = + json.decode(userDbDataShot.data.toString()) + as Map; + print(userDbData); + userFromDb = userDbData.keys.toList(); + print(userFromDb); + return FutureBuilder( + future: UserData.getPreContestData(), + builder: (context, contestData) { + if (contestData.hasData) { + print(contestData.data); + contests = contestData.data; + return FutureBuilder( + future: getRanks(userFromDb),//['valiant_vidit', 'vikrant3302'] + builder: (context, rankinf) { + if (rankinf.hasData) { + // print("a12222222222"); + // print(rankinf.data); + var rr = UserData.rankinfo; + // print(rr); + newMapp = groupBy(rr, (obj) => obj['handle']) + .map((k, v) => MapEntry( + k, + v.map((item) { + item.remove('handle'); + return item; + }).toList())); + // rankinfo = UserData.rankinfo; + // print(newMapp["valiant_vidit"][0]["contestId"]); + // print("New Mapp-->"); + // print(newMapp); + + //#####>>>>>>>>>>>>>>>>>>>>>>>!!!!!!!!!!!! final map just above + /* + { + valiant_vidit: + [ + {contestId: 1473, rank: 9117}, {contestId: 1474, rank: 6339}, + {contestId: 1478, rank: 9134}, {contestId: 1476, rank: 2521}, + {contestId: 1481, rank: 2741}, {contestId: 1480, rank: 5225}, + {contestId: 1485, rank: 1577}, {contestId: 1487, rank: 2851}, + {contestId: 1490, rank: 1085}, {contestId: 1486, rank: 3771} + ] + + valiant_vidit: + [ + {contestId: 1473, rank: 9117}, {contestId: 1474, rank: 6339}, + {contestId: 1478, rank: 9134}, {contestId: 1476, rank: 2521}, + {contestId: 1481, rank: 2741}, {contestId: 1480, rank: 5225}, + {contestId: 1485, rank: 1577}, {contestId: 1487, rank: 2851}, + {contestId: 1490, rank: 1085}, {contestId: 1486, rank: 3771} + ] + + } + */ + ///...............................................\\\\ + List rankingss = []; + // List contst = ['1478', '1486']; + //this should be called. + for (var cnt in UserData.contst) { + // print('id==>> '+cnt.toString()); + newMapp.forEach((handle, value) { + value.forEach((element) { + // ignore: unrelated_type_equality_checks + if (element['contestId'].toString() == + cnt) //here 1478 replaced by contestarray!! + rankingss.add({ + 'handle': handle, + 'contestId': cnt.toString(), + 'rank': element['rank'].toString() + }); + // print(handle.toString()+"ams "+element['contestId'].toString()); + }); + }); + } + //final printing of things. + // print("object " + rankingss.length.toString()); + + //here in rankings--> username, contestId, name + // for (var ele in rankingss) { + // print(ele.toString()); + // } + //just take care here that finally all things in a newmapk are there for multiple users.!! +////...................................\\\\\\ + //222@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@// + + newMapps = rankingss; + print("NewMapps---11---------->"); + users = newMapp.keys.toList(); + print(newMapps); + print(users); + /////@@@@@@@@@///@@@@@@@///@@@@@@@@ + return Container( + child: HorizontalDataTable( + leftHandSideColumnWidth: 150, + rightHandSideColumnWidth: 1000, + isFixedHeader: true, + headerWidgets: _getTitleWidget(), + leftSideItemBuilder: (context, index) => + FlatButton( + color: index % 2 == 0 + ? Colors.grey[200] + : Colors.white, + onPressed: () => Navigator.pushNamed( + context, ProfileScreen.routeName, + arguments: { + "name": users[index].toString(), + }), + child: Container( + child: Text( + users[index].toString() ?? "", + style: TextStyle(fontSize: 16), + ), + width: 300, + height: 52, + padding: EdgeInsets.fromLTRB(0, 0, 0, 0), + alignment: Alignment.centerLeft, + color: index % 2 == 0 + ? Colors.grey[200] + : Colors.white, + ), + ), //_generateFirstColumnRow, + rightSideItemBuilder: + _generateRightHandSideColumnRow, + itemCount: + users.length, // user.userInfo.length, + rowSeparatorWidget: const Divider( + color: Colors.black54, + height: 1.0, + thickness: 0.0, + ), + leftHandSideColBackgroundColor: + Color(0xFFFFFFFF), + rightHandSideColBackgroundColor: + Color(0xFFFFFFFF), + enablePullToRefresh: true, + refreshIndicator: const WaterDropHeader(), + refreshIndicatorHeight: 60, + onRefresh: () async { + //Do sth + await Future.delayed( + const Duration(milliseconds: 500)); + _hdtRefreshController.refreshCompleted(); + }, + htdRefreshController: _hdtRefreshController, + ), + height: MediaQuery.of(context).size.height, + ); + } + return Center(child: CircularProgressIndicator()); + }, + ); + } + return Center( + child: CircularProgressIndicator(), + ); + }); + } + return Center( + child: CircularProgressIndicator(), + ); + })); + // } ); + } + + List _getTitleWidget() { + return [ + // Text("Username"), + _getTitleItemWidget('UserName', 100), + for (int i = 0; i < 10; i++) + sortButtonTitleWidget(contests.length != 0 ? contests[i] : "ContestId"), + ]; + } + + Widget sortButtonTitleWidget(String title) { + return _getTitleItemWidget(title, 100); + } + + Widget _getTitleItemWidget(String label, double width) { + return Container( + child: Text( + label, + style: TextStyle( + fontWeight: FontWeight.bold, + fontSize: 16, + ), + ), + width: width, + height: 56, + padding: EdgeInsets.fromLTRB(5, 0, 0, 0), + alignment: Alignment.centerLeft, + ); + } + + String getRankContestData(int index, int rowIndex) { + String result = "-"; + newMapp[users[index]].forEach((val) { + // print(val["contestId"]); + // print(val["rank"].toString()); + if (val["contestId"] + .toString() + .compareTo(contests[rowIndex].toString()) == + 0) //contests[index]) + result = val["rank"].toString(); + }); + // print("iitut----------------------------->>$result"); + return result; + } + + Widget _generateRightHandSideColumnRow(BuildContext context, int index) { + return Row( + children: [ + for (int i = 0; i < 10; i++) + Container( + color: index % 2 == 0 ? Colors.grey[200] : Colors.white, + child: Row( + children: [ + Text(newMapp.length != 0 + ? getRankContestData(index, i) //[0]["rank"].toString() + : ""), + ], + ), + width: 100, + height: 52, + padding: EdgeInsets.fromLTRB(5, 0, 0, 0), + alignment: Alignment.centerLeft, + ), + ], + ); + } +} diff --git a/team#7-{9}/lib/screens/rating_chart.dart b/team#7-{9}/lib/screens/rating_chart.dart new file mode 100644 index 0000000..5d1ff57 --- /dev/null +++ b/team#7-{9}/lib/screens/rating_chart.dart @@ -0,0 +1,184 @@ +import 'dart:convert'; + +import 'package:cf_pursuit/utils/user_data.dart'; +import 'package:cf_pursuit/widgets/rating_chart_widget.dart'; +import 'package:fl_chart/fl_chart.dart'; +import 'package:flutter/material.dart'; +import 'package:google_fonts/google_fonts.dart'; + +class RanksChart extends StatefulWidget { + final String userName; + RanksChart(this.userName); + @override + _RanksChartState createState() => _RanksChartState(); +} + +bool showAvg = false; + +class _RanksChartState extends State { + bool isShowingMainData = true; + ScrollController _listViewController = ScrollController(); + String dropDownValue = "2020"; //DateTime.now().year.toString(); + @override + void initState() { + super.initState(); + isShowingMainData = true; + // dropDownValue = DateTime.now().year.toString(); + // print(dropDownValue); + } + + int minYear = 2100; + @override + Widget build(BuildContext context) { + return FutureBuilder( + future: UserData().getUserRatingData(widget.userName), + builder: (context, ratingData) { + if (ratingData.hasData) { + Map userRatingData = + json.decode(ratingData.data.toString()) as Map; + Set yearSet = {}; + List ratingSpotsList = []; + userRatingData["result"].forEach((val) { + var ratingUpdateTimeSeconds = val["ratingUpdateTimeSeconds"]; + var date = new DateTime.fromMillisecondsSinceEpoch( + ratingUpdateTimeSeconds * 1000); + if (minYear > date.year) minYear = date.year; + double pointX = date.year.toDouble() * 10000 + + date.month.toDouble() * 100 + + date.day.toDouble(); + double pointY = val["newRating"] + .0; + yearSet.add(pointX.toString().substring(0, 4)); + // print(pointX); + if (dropDownValue.compareTo(date.year.toString()) == 0) { + ratingSpotsList.insert( + ratingSpotsList.length, FlSpot(pointX, pointY)); + } + }); + List yearsList = []; + for (int i = DateTime.now().year; i > minYear - 1; i--) { + yearsList.add(i.toString()); + } + print(yearSet.toString() + ratingSpotsList.length.toString()); + return Container( + child: Column( + children: [ + Row( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Text( + "Select Year: ", + style: TextStyle(fontSize: 18), + ), + DropdownButton( + value: dropDownValue, //..dropDownValue, + icon: Icon(Icons.arrow_downward), + iconSize: 22, + elevation: 16, + style: TextStyle(color: Colors.deepPurple, fontSize: 18), + underline: Container( + height: 2, + color: Colors.deepPurpleAccent, + ), + onChanged: (String newValue) { + setState(() { + dropDownValue = newValue; + }); + }, + items: yearsList + .map>((String value) { + return DropdownMenuItem( + value: value, + child: Text(value), + ); + }).toList(), + ), + ], + ), + Container( + // width: MediaQuery.of(context).size.width*300, + height: MediaQuery.of(context).size.height * 0.3, + padding:EdgeInsets.symmetric(horizontal:4), + child: ListView( + controller: _listViewController, + scrollDirection: Axis.horizontal, + children: [ + Container( + width: MediaQuery.of(context).size.width-16, + decoration: const BoxDecoration( + borderRadius: BorderRadius.all(Radius.circular(18)), + gradient: LinearGradient( + colors: //colorList, + [ + Color(0xff2c274c), + Color(0xff46426c), + ], + begin: Alignment.bottomCenter, + end: Alignment.topCenter, + ), + ), + child: Stack( + children: [ + Column( + crossAxisAlignment: CrossAxisAlignment.stretch, + children: [ + const SizedBox( + height: 10, + ), + Text( + 'Rating for $dropDownValue', + style: TextStyle( + color: Color(0xff827daa), + fontSize: 16, + ), + textAlign: TextAlign.center, + ), + const SizedBox( + height: 4, + ), + Expanded( + child: Padding( + padding: const EdgeInsets.only( + right: 16.0, left: 6.0), + child: (!(minYear.toString().compareTo( + dropDownValue + .toString()) > + 0) && + yearsList + .contains(dropDownValue) && + ratingSpotsList.isNotEmpty) + ? Builder( + builder: (context) => LineChart( + sampleData2(ratingSpotsList), + swapAnimationDuration: + const Duration( + milliseconds: 350), + ), + ) + : Center( + child: Text( + "No data Available for this year!!", + style: GoogleFonts.openSans( + fontSize: 20, + color: Colors.grey), + )), + ), + ), + const SizedBox( + height: 10, + ), + ], + ), + ], + ), + ), + ]), + ), + ], + ), + ); + } + return CircularProgressIndicator.adaptive(); + }, + ); + } +} diff --git a/team#7-{9}/lib/screens/submission_chart.dart b/team#7-{9}/lib/screens/submission_chart.dart new file mode 100644 index 0000000..f06283a --- /dev/null +++ b/team#7-{9}/lib/screens/submission_chart.dart @@ -0,0 +1,258 @@ +import 'dart:convert'; +import 'package:cf_pursuit/utils/user_data.dart'; +import 'package:fl_chart/fl_chart.dart'; +import 'package:flutter/material.dart'; + +class SubmissionChart extends StatefulWidget { + final String userName; + SubmissionChart(this.userName); + @override + _SubmissionChartState createState() => _SubmissionChartState(); +} + +class _SubmissionChartState extends State { + int touchedIndex; + + @override + Widget build(BuildContext context) { + return FutureBuilder( + future: UserData().getUserSubmissionData(widget.userName.toString()), + builder: (context, subData) { + if (subData.hasData) { + Map resultData = + json.decode(subData.data.toString()) as Map; + print(resultData); + final Map submissionData = {}; + final Map verdictData = {}; + int totalTags = 0, totalVerdicts = 0; + print("---->>>>>>>>>>>>>>>"); + print(resultData.toString()); + List r = resultData["result"]; + + r.forEach((element) { + // print(element["problem"]["tags"]); + List l = element["problem"]['tags']; + l.forEach((element2) { + if (submissionData.containsKey(element2)) { + submissionData[element2]++; + } else { + submissionData[element2] = 0; + } + totalTags++; + }); + if (verdictData.containsKey(element["verdict"])) { + verdictData[element["verdict"]]++; + } else { + verdictData[element["verdict"]] = 0; + } + totalVerdicts++; + }); + // print(submissionData); + // print(verdictData); + // print(totalVerdicts.toStringAsPrecision(3) + + // " " + + // totalTags.toStringAsPrecision(3)); + submissionData.forEach((key, value) { + submissionData[key] = (value / totalTags) * 100; + }); + verdictData.forEach((key, value) { + verdictData[key] = (value / totalVerdicts) * 100; + }); + + print(submissionData); + print(verdictData); + + return AspectRatio( + aspectRatio: 1.5, + child: Card( + elevation: 10, + color: Colors.white, + child: Column( + children: [ + Text( + "Submissions Chart:", + style: TextStyle(fontSize: 25), + ), + SizedBox( + height: 10, + ), + Row( + children: [ + const SizedBox( + height: 18, + ), + Flexible( + child: AspectRatio( + aspectRatio: 1, + child: PieChart( + PieChartData( + pieTouchData: PieTouchData( + touchCallback: (pieTouchResponse) { + setState(() { + if (pieTouchResponse.touchInput + is FlLongPressEnd || + pieTouchResponse.touchInput + is FlPanEnd) { + touchedIndex = -1; + } else { + touchedIndex = pieTouchResponse + .touchedSectionIndex; + } + }); + }), + borderData: FlBorderData( + show: false, + ), + sectionsSpace: 0, + centerSpaceRadius: 40, + sections: showingSections(verdictData)), + ), + ), + ), + Column( + // mainAxisSize: MainAxisSize.max, + mainAxisAlignment: MainAxisAlignment.end, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Container( + child: Row( + children: [ + Icon( + Icons.circle, + color: Colors.green[800], + ), + Text("Correct Answer"), + ], + ), + ), + Container( + child: Row( + children: [ + Icon( + Icons.circle, + color: Colors.red, + ), + Text("Wrong Answer"), + ], + ), + ), + Container( + child: Row( + children: [ + Icon( + Icons.circle, + color: Colors.amber, + ), + Text("TLE"), + ], + ), + ), + Container( + child: Row( + children: [ + Icon( + Icons.circle, + color: Colors.grey, + ), + Text("Compilation Error"), + ], + ), + ), + Container( + child: Row( + children: [ + Icon( + Icons.circle, + color: Colors.lightGreenAccent, + ), + Text("Challenged"), + ], + ), + ), + Container( + child: Row( + children: [ + Icon( + Icons.circle, + color: Colors.red[900], + ), + Text("Run Time Error"), + ], + ), + ), + Container( + child: Row( + children: [ + Icon( + Icons.circle, + color: Colors.blue[800], + ), + Text("Memory limit Exceed"), + ], + ), + ), + SizedBox( + height: 18, + ), + ], + ), + const SizedBox( + width: 28, + ), + ], + ), + ], + ), + ), + ); + } + return Center( + child: Padding( + padding: const EdgeInsets.all(8.0), + child: LinearProgressIndicator(), + ), + ); + }); + } + + List showingSections(Map list) { + // return List.generate(list.length, (i) { + // final isTouched = i == touchedIndex; + final double fontSize = 16; // isTouched ? 25 : 16; + final double radius = 60; // isTouched ? 60 : 50; + List result = []; + Color color; + list.forEach((key, value) { + if (key == "OK") { + color = Colors.green[800]; + } else if (key == "WRONG_ANSWER") { + color = Colors.red; + } else if (key == "TIME_LIMIT_EXCEEDED") { + color = Colors.amber; + } else if (key == "COMPILATION_ERROR") { + color = Colors.grey; + } else if (key == "CHALLENGED") { + color = Colors.lightGreenAccent; + } else if (key == "RUNTIME_ERROR") { + color = Colors.red[900]; + } else if (key == "MEMORY_LIMIT_EXCEEDED") { + color = Colors.blue[800]; + } + result.insert( + result.length, + PieChartSectionData( + color: color, + value: value, + title: "", + radius: radius, + titleStyle: TextStyle( + fontSize: fontSize, + fontWeight: FontWeight.bold, + color: Colors.teal, + ), + ), + ); + }); + return result; + } +} diff --git a/team#7-{9}/lib/utils/gcalendar.dart b/team#7-{9}/lib/utils/gcalendar.dart new file mode 100644 index 0000000..0f8409c --- /dev/null +++ b/team#7-{9}/lib/utils/gcalendar.dart @@ -0,0 +1,67 @@ +import 'dart:developer'; +import 'dart:io'; +import 'package:cf_pursuit/globals.dart'; +import "package:googleapis_auth/auth_io.dart"; +import 'package:googleapis/calendar/v3.dart'; +import 'package:url_launcher/url_launcher.dart'; + +class GoogleCalendar { + // String nameOfEvent; + // DateTime dateOfEvent; + // googleCalendar({this.nameOfEvent, this.dateOfEvent}); + static var _scopes = [CalendarApi.calendarScope]; + Event event; + var _credentials; + bool initialize( + String nameOfEvent, DateTime dateOfEvent, int durationSeconds) { + if (Platform.isAndroid) { + _credentials = new ClientId(googleOAuthId, ""); + } + event = Event(); + event.location = "online"; + event.summary = nameOfEvent; + EventDateTime start = new EventDateTime(); + start.dateTime = dateOfEvent.toLocal(); + start.timeZone = "GMT+05:30"; + event.start = start; + + EventDateTime end = new EventDateTime(); + end.timeZone = "GMT+05:30"; + end.dateTime = + dateOfEvent.add(Duration(seconds: durationSeconds)).toLocal(); + event.end = end; + return insertEvent(event); + } + + bool insertEvent(event) { + try { + clientViaUserConsent(_credentials, _scopes, prompt) + .then((AuthClient client) { + var calendar = CalendarApi(client); + String calendarId = "primary"; + calendar.events.insert(event, calendarId).then((value) { + print("ADDEDDD_________________${value.status}"); + if (value.status == "confirmed") { + log('Event added in google calendar'); + return true; + } else { + log("Unable to add event in google calendar"); + return false; + } + }); + }); + } catch (e) { + log('Error creating event $e'); + return false; + } + return false; + } + + void prompt(String url) async { + if (await canLaunch(url)) { + await launch(url); + } else { + throw 'Could not launch $url'; + } + } +} diff --git a/team#7-{9}/lib/utils/user_data.dart b/team#7-{9}/lib/utils/user_data.dart new file mode 100644 index 0000000..ecda323 --- /dev/null +++ b/team#7-{9}/lib/utils/user_data.dart @@ -0,0 +1,178 @@ +import 'dart:convert'; +import 'package:http/http.dart' as http; + +class UserData { + Map r = {}; + static List> rankinfo = []; + static List contst = []; + static Map newMappk; + + Future checkUser(String name) async { + print("-->"); + print(name); + var result = + await http.get("https://codeforces.com/api/user.info?handles=$name"); + if (result.statusCode == 200) { + r = json.decode(result.body) as Map; + // print(r.toString()); + // print("<__>" + r["result"][0]["handle"].toString()); + return r["result"][0]["handle"].toString() == "NULL" ? false : true; + } else { + return false; + } + } + + Future getUserData(String userName) async { + var result = await http + .get("https://codeforces.com/api/user.info?handles=$userName"); + submitUserData(userName); + if (result.statusCode == 200) { + print(result.toString()); + return result.body; + } else { + return "Error()"; + } + } + + Future submitUserData(String userName) async { + var result = await http.put( + "https://cf-pursuit-default-rtdb.firebaseio.com/users/$userName.json", + body: json.encode({ + "userName": userName, + "timestamp": DateTime.now().millisecondsSinceEpoch + })); + if (result.statusCode == 200) { + print("hurray!User details added successfully!!"); + } else { + print("nope,error in adding user to database"); + } + } + + Future getDBUserData() async { + var result = await http.get( + "https://cf-pursuit-default-rtdb.firebaseio.com/users.json", + ); + return result.body; + // if (result.statusCode == 200) { + // print("hurray!User details added successfully!!"); + // } else { + // print("nope,error in adding user to database"); + // } + } + + Future getUserRatingData(String userName) async { + var result = await http + .get("https://codeforces.com/api/user.rating?handle=$userName"); + if (result.statusCode == 200) { + // print(result.toString()); + return result.body; + } else { + return "Error()"; + } + } + + Future getUserSubmissionData(String userName) async { + var result = await http + .get("https://codeforces.com/api/user.status?handle=$userName"); + if (result.statusCode == 200) { + print(result.toString()); + return result.body; + } + } + + ////////////////// + static Future getUserRankData(String userName, var rankinf) async { + var result = await http + .get("https://codeforces.com/api/user.rating?handle=$userName"); + if (result.statusCode == 200) { + // List> da = []; + Map newMap = (json.decode(result.body)); + // da.add(dd); + // rankinfo.add({'handle':dd[0]['handle']}); + // rankinfo.clear(); + //check it brooooooooooooooooo + // List dt=[]; + // print(rankinfo); + //print("11111111111111111111111111111111111111111111111"); + + // Map newMap = groupBy(da, (obj) => obj['contestId']); + // Map newMap = dd; + for (var v in newMap.values) { + // print(v); + + // print('hiiiyyyyyyyyyyyyyyyyyyyyyyyy'); + if (v is List) { + int k = 0; + for (var j in v) { + if (++k > v.length - 10) { + //######################### + rankinfo.add({ + 'handle': j['handle'], + 'contestId': j['contestId'], + 'rank': j['rank'], + }); + // j.forEach((i, value) { + // print('index=$i, value=$value'); + // }); + // print("heeloooo12e25445"); + } + } + } + } + // print(rankinfo); + //print("11111111111111111111111111111111111111111111111"); + //#############3tryy... + // newMappk = groupBy(rankinfo, (obj) => obj['handle']); + // .map((k, v) => MapEntry( + // k, + // v.map((item) { + // item.remove('handle'); + // return item; + // }).toList())); + + return result.body; + } else { + return "Error()"; + } + } + + static Future getPreContestData() async { + contst.clear(); + var res = + await http.get("https://codeforces.com/api/contest.list?gym=false"); + if (res.statusCode == 200) { + Map nw = json.decode(res.body); + + nw.forEach((key, value) { + // print("hllllooo" + value.toString()); + if (value is List) + value.forEach((ele) { + if (ele['type'] == 'CF' && + ele['phase'] == 'FINISHED' && + contst.length != 11) contst.add(ele['id'].toString()); + // //for size....here now 10!! + }); + }); + // print(res.body); + // for (var ij in contst) { + // print("1___ " + ij); + // } + return contst; + // return res.body; + } else { + return "Error occured !!"; + } + } + + static Future futureContestData() async { + contst.clear(); + var res = + await http.get("https://codeforces.com/api/contest.list?gym=false"); + if (res.statusCode == 200) { + + return res.body; + } else { + return "!!Error occured !!"; + } + } +} diff --git a/team#7-{9}/lib/widgets/drawer.dart b/team#7-{9}/lib/widgets/drawer.dart new file mode 100644 index 0000000..0ac149c --- /dev/null +++ b/team#7-{9}/lib/widgets/drawer.dart @@ -0,0 +1,93 @@ +import 'package:cf_pursuit/screens/future_events.dart'; +import 'package:cf_pursuit/screens/landing_screen.dart'; +import 'package:cf_pursuit/screens/problem.dart'; +import 'package:cf_pursuit/screens/rank_screen.dart'; +import 'package:flutter/material.dart'; +import 'package:google_fonts/google_fonts.dart'; + +Widget appDrawer(BuildContext context) { + return Drawer( + child: Column( + children: [ + Container( + height: 150, + width: double.maxFinite, + padding: EdgeInsets.symmetric(vertical: 8, horizontal: 8), + margin: EdgeInsets.only(bottom: 10), + child: Align( + alignment: Alignment.bottomLeft, + child: Text( + "CF-Pursuit", + style: GoogleFonts.openSans(fontSize: 30, color: Colors.white), + ), + ), + decoration: BoxDecoration( + color: Colors.teal, + ), + ), + FlatButton( + onPressed: () { + Navigator.of(context).pop(); + Navigator.of(context).pushNamed(FutureEventsScreen.routeName); + // Navigator.of(context).pushNamed(ProfileScreen.routeName); + }, + child: Text( + "Mark Future Contests", + style: GoogleFonts.roboto(fontSize: 20), + ), + ), + Divider(), + + FlatButton( + onPressed: () { + Navigator.of(context).pop(); + Navigator.of(context).pushNamed(Problem.routeName); + }, + child: Text( + "Problem Recommender", + style: GoogleFonts.roboto(fontSize: 20), + ), + ), + Divider(), + FlatButton( + onPressed: () { + Navigator.of(context).pop(); + Navigator.of(context).pushNamed(RankScreen.routeName); + }, + child: Text( + "Ranklist", + style: GoogleFonts.roboto(fontSize: 20), + ), + ), + Divider(),FlatButton( + onPressed: () { + Navigator.of(context).pop(); + Navigator.of(context).pushNamed(LandingScreenMobile.routeName); + // Navigator.of(context).pushNamed(ProfileScreen.routeName); + }, + child: Text( + "View Profile", + style: GoogleFonts.roboto(fontSize: 20), + ), + ), + Divider(), + Expanded(child: Align( + alignment: Alignment.bottomCenter, + child: Card( + elevation: 15, + child: FlatButton( + onPressed: () { + Navigator.of(context).pop(); + Navigator.of(context).pushNamed(LandingScreenMobile.routeName); + }, + child: Text( + "Go to starting Page->", + style: GoogleFonts.roboto(fontSize: 20), + ), + ), + ), + ),) + ], + ), + ); +} diff --git a/team#7-{9}/lib/widgets/header.dart b/team#7-{9}/lib/widgets/header.dart new file mode 100644 index 0000000..3fc7ebe --- /dev/null +++ b/team#7-{9}/lib/widgets/header.dart @@ -0,0 +1,53 @@ +import 'package:flutter/material.dart'; +import 'package:cf_pursuit/globals.dart'; + +class WavyHeader extends StatelessWidget { + @override + Widget build(BuildContext context) { + return ClipPath( + child: Container( + height: MediaQuery.of(context).size.height * 0.223898, + decoration: BoxDecoration( + gradient: LinearGradient( + begin: Alignment.bottomLeft, + colors: colorList, + end: Alignment.topRight, + ), + ), + ), + clipper: BottomWave(MediaQuery.of(context).size.height, + MediaQuery.of(context).size.height), + ); + } +} + +class BottomWave extends CustomClipper { + double deviceHeight, deviceWidth; + BottomWave(this.deviceHeight, this.deviceWidth); + @override + bool shouldReclip(CustomClipper oldClipper) => false; + @override + Path getClip(Size size) { + var path = Path(); + path.lineTo(0.0, size.height - deviceHeight * 0.02634); + + var secondControlPoint = Offset(size.width / 4, size.height); + var secondEndPoint = + Offset(size.width / 2.25, size.height - deviceHeight * 0.046096); + path.quadraticBezierTo(secondControlPoint.dx, secondControlPoint.dy, + secondEndPoint.dx, secondEndPoint.dy); + + var firstControlPoint = Offset( + size.width - (size.width / 3.25), size.height - deviceHeight * 0.12775); + var firstEndPoint = + Offset(size.width, size.height - deviceHeight * 0.10536); + path.quadraticBezierTo(firstControlPoint.dx, firstControlPoint.dy, + firstEndPoint.dx, firstEndPoint.dy); + + path.lineTo(size.width, size.height - deviceHeight * 0.052681); + path.lineTo(size.width, 0.0); + path.close(); + + return path; + } +} diff --git a/team#7-{9}/lib/widgets/rating_chart_widget.dart b/team#7-{9}/lib/widgets/rating_chart_widget.dart new file mode 100644 index 0000000..5645a4c --- /dev/null +++ b/team#7-{9}/lib/widgets/rating_chart_widget.dart @@ -0,0 +1,159 @@ +import 'dart:math'; + +import "package:flutter/material.dart"; +import 'package:fl_chart/fl_chart.dart'; + +LineChartData sampleData2(List list) { + List sortedListX = []; + List sortedListY = []; + Set bottomTileData = {}; + list.forEach((element) { + sortedListX.insert(sortedListX.length, element.x); + sortedListY.insert(sortedListY.length, element.y); + }); + sortedListX.sort(); + sortedListY.sort(); + // sortedListX.forEach((val) => print(">>" + val.toString())); + // print("ooo"); + // sortedListY.forEach((val) => print(">>" + val.toString())); + // final double maxx = sortedListX[sortedListX.length - 1].toDouble(); + final double miny = sortedListY[0].toDouble(); + final double maxy = sortedListY[sortedListY.length - 1].toDouble(); + // final double minx = sortedListX[0].toDouble(); + final int maxxx = + (sortedListX[sortedListX.length - 1].toInt() ~/ 10000).toInt() + 1231; + return LineChartData( + lineTouchData: LineTouchData( + touchTooltipData: LineTouchTooltipData( + tooltipBgColor: Colors.blueGrey.withOpacity(0.8), + ), + touchCallback: (LineTouchResponse touchResponse) {}, + handleBuiltInTouches: false, + ), + + gridData: FlGridData( + show: true, + ), + + minY: miny <= 800 + ? 0 + : miny < 1500 + ? 800 + : miny < 3000 + ? 1500 + : miny < 4500 + ? 3000 + : 4500, + maxY: maxy + 200, // sortedListY[sortedListX.length - 1].toDouble()+200, + + titlesData: FlTitlesData( + bottomTitles: SideTitles( + showTitles: true, + reservedSize: 35, + rotateAngle: 40, + getTextStyles: (value) => const TextStyle( + color: Color(0xff72719b), + fontWeight: FontWeight.bold, + fontSize: 14, + ), + margin: 10, + getTitles: (value) { + if (value.toString().substring(4, 6).compareTo("12") <= 0 && + value.toString().substring(4, 6).compareTo("00") != 0 && + value.toString().substring(6).compareTo("31") <= 0 && + value.toString().substring(6).compareTo("00") != 0) { + // print(value); + + if (bottomTileData.contains(value.toString().substring(4, 6) + + "/" + + value.toString().substring(0, 4))) return ''; + bottomTileData.add(value.toString().substring(4, 6) + + "/" + + value.toString().substring(0, 4)); + // const String res=value.toString().substring(0,6); + return value.toString().substring(4, 6) + + "/" + + value.toString().substring(2, 4); + } + return ""; + }, + ), + leftTitles: SideTitles( + showTitles: true, + getTextStyles: (value) => const TextStyle( + color: Color(0xff75729e), + fontWeight: FontWeight.bold, + fontSize: 12, + ), + getTitles: (value) { + switch (value.toInt()) { + case 500: + return '500'; + case 1000: + return '1000'; + case 1250: + return '1250'; + case 1500: + return '1500'; + case 2000: + return '2000'; + case 2500: + return '2500'; + case 3000: + return '3000'; + case 4000: + return '4000'; + case 4500: + return '4500'; + } + return ''; + }, + margin: 8, + reservedSize: 30, + ), + ), + borderData: FlBorderData( + show: false, + border: const Border( + bottom: BorderSide( + color: Color(0xff4e4965), + width: 1, + ), + left: BorderSide( + color: Colors.transparent, + ), + right: BorderSide( + color: Colors.transparent, + ), + top: BorderSide( + color: Colors.transparent, + ), + ), + ), + // minX:202101,// lastContest.toDouble()-5.0, + // maxX: lastContest.toDouble(), + + lineBarsData: linesBarData2(list), + ); +} + +List linesBarData2(List list) { + return [ + LineChartBarData( + spots: list, + + isCurved: true, + curveSmoothness: 0, + colors: const [ + Colors.amberAccent, // Color(0x4427b6fc), + ], + barWidth: 2, + // show: false, + isStrokeCapRound: false, //true, + dotData: FlDotData(show: false), + belowBarData: BarAreaData( + show: false, + ), + ), + ]; +} diff --git a/team#7-{9}/pubspec.lock b/team#7-{9}/pubspec.lock new file mode 100644 index 0000000..c6942d3 --- /dev/null +++ b/team#7-{9}/pubspec.lock @@ -0,0 +1,706 @@ +# Generated by pub +# See https://dart.dev/tools/pub/glossary#lockfile +packages: + _discoveryapis_commons: + dependency: transitive + description: + name: _discoveryapis_commons + url: "https://pub.dartlang.org" + source: hosted + version: "0.2.1" + _fe_analyzer_shared: + dependency: transitive + description: + name: _fe_analyzer_shared + url: "https://pub.dartlang.org" + source: hosted + version: "12.0.0" + analyzer: + dependency: transitive + description: + name: analyzer + url: "https://pub.dartlang.org" + source: hosted + version: "0.40.6" + animated_text_kit: + dependency: "direct main" + description: + name: animated_text_kit + url: "https://pub.dartlang.org" + source: hosted + version: "3.1.1" + archive: + dependency: transitive + description: + name: archive + url: "https://pub.dartlang.org" + source: hosted + version: "2.0.13" + args: + dependency: transitive + description: + name: args + url: "https://pub.dartlang.org" + source: hosted + version: "1.6.0" + async: + dependency: transitive + description: + name: async + url: "https://pub.dartlang.org" + source: hosted + version: "2.5.0-nullsafety.3" + boolean_selector: + dependency: transitive + description: + name: boolean_selector + url: "https://pub.dartlang.org" + source: hosted + version: "2.1.0-nullsafety.3" + characters: + dependency: transitive + description: + name: characters + url: "https://pub.dartlang.org" + source: hosted + version: "1.1.0-nullsafety.5" + charcode: + dependency: transitive + description: + name: charcode + url: "https://pub.dartlang.org" + source: hosted + version: "1.2.0-nullsafety.3" + cli_util: + dependency: transitive + description: + name: cli_util + url: "https://pub.dartlang.org" + source: hosted + version: "0.2.0" + clock: + dependency: transitive + description: + name: clock + url: "https://pub.dartlang.org" + source: hosted + version: "1.1.0-nullsafety.3" + collection: + dependency: transitive + description: + name: collection + url: "https://pub.dartlang.org" + source: hosted + version: "1.15.0-nullsafety.5" + convert: + dependency: transitive + description: + name: convert + url: "https://pub.dartlang.org" + source: hosted + version: "2.1.1" + coverage: + dependency: transitive + description: + name: coverage + url: "https://pub.dartlang.org" + source: hosted + version: "0.14.2" + crypto: + dependency: transitive + description: + name: crypto + url: "https://pub.dartlang.org" + source: hosted + version: "2.1.5" + cupertino_icons: + dependency: "direct main" + description: + name: cupertino_icons + url: "https://pub.dartlang.org" + source: hosted + version: "1.0.2" + equatable: + dependency: transitive + description: + name: equatable + url: "https://pub.dartlang.org" + source: hosted + version: "1.2.6" + fake_async: + dependency: transitive + description: + name: fake_async + url: "https://pub.dartlang.org" + source: hosted + version: "1.2.0-nullsafety.3" + ffi: + dependency: transitive + description: + name: ffi + url: "https://pub.dartlang.org" + source: hosted + version: "0.1.3" + file: + dependency: transitive + description: + name: file + url: "https://pub.dartlang.org" + source: hosted + version: "6.0.0-nullsafety.4" + firebase: + dependency: transitive + description: + name: firebase + url: "https://pub.dartlang.org" + source: hosted + version: "7.3.3" + firebase_analytics: + dependency: "direct main" + description: + name: firebase_analytics + url: "https://pub.dartlang.org" + source: hosted + version: "7.0.1" + firebase_analytics_platform_interface: + dependency: transitive + description: + name: firebase_analytics_platform_interface + url: "https://pub.dartlang.org" + source: hosted + version: "1.0.3" + firebase_analytics_web: + dependency: transitive + description: + name: firebase_analytics_web + url: "https://pub.dartlang.org" + source: hosted + version: "0.1.1" + firebase_auth: + dependency: "direct main" + description: + name: firebase_auth + url: "https://pub.dartlang.org" + source: hosted + version: "0.20.0+1" + firebase_auth_platform_interface: + dependency: transitive + description: + name: firebase_auth_platform_interface + url: "https://pub.dartlang.org" + source: hosted + version: "3.0.1" + firebase_auth_web: + dependency: transitive + description: + name: firebase_auth_web + url: "https://pub.dartlang.org" + source: hosted + version: "0.3.2+6" + firebase_core: + dependency: transitive + description: + name: firebase_core + url: "https://pub.dartlang.org" + source: hosted + version: "0.7.0" + firebase_core_platform_interface: + dependency: transitive + description: + name: firebase_core_platform_interface + url: "https://pub.dartlang.org" + source: hosted + version: "3.0.1" + firebase_core_web: + dependency: transitive + description: + name: firebase_core_web + url: "https://pub.dartlang.org" + source: hosted + version: "0.2.1+3" + firebase_database: + dependency: "direct main" + description: + name: firebase_database + url: "https://pub.dartlang.org" + source: hosted + version: "6.0.0" + fl_chart: + dependency: "direct main" + description: + name: fl_chart + url: "https://pub.dartlang.org" + source: hosted + version: "0.12.3" + flutter: + dependency: "direct main" + description: flutter + source: sdk + version: "0.0.0" + flutter_countdown_timer: + dependency: "direct main" + description: + name: flutter_countdown_timer + url: "https://pub.dartlang.org" + source: hosted + version: "3.0.0" + flutter_driver: + dependency: transitive + description: flutter + source: sdk + version: "0.0.0" + flutter_test: + dependency: "direct dev" + description: flutter + source: sdk + version: "0.0.0" + flutter_web_plugins: + dependency: transitive + description: flutter + source: sdk + version: "0.0.0" + fuchsia_remote_debug_protocol: + dependency: transitive + description: flutter + source: sdk + version: "0.0.0" + glob: + dependency: transitive + description: + name: glob + url: "https://pub.dartlang.org" + source: hosted + version: "1.2.0" + google_fonts: + dependency: "direct main" + description: + name: google_fonts + url: "https://pub.dartlang.org" + source: hosted + version: "1.1.2" + googleapis: + dependency: "direct main" + description: + name: googleapis + url: "https://pub.dartlang.org" + source: hosted + version: "1.0.0" + googleapis_auth: + dependency: "direct main" + description: + name: googleapis_auth + url: "https://pub.dartlang.org" + source: hosted + version: "0.2.12+1" + horizontal_data_table: + dependency: "direct main" + description: + name: horizontal_data_table + url: "https://pub.dartlang.org" + source: hosted + version: "2.2.0" + http: + dependency: "direct main" + description: + name: http + url: "https://pub.dartlang.org" + source: hosted + version: "0.12.2" + http_parser: + dependency: transitive + description: + name: http_parser + url: "https://pub.dartlang.org" + source: hosted + version: "3.1.4" + integration_test: + dependency: "direct dev" + description: flutter + source: sdk + version: "0.9.2+2" + intl: + dependency: transitive + description: + name: intl + url: "https://pub.dartlang.org" + source: hosted + version: "0.16.1" + io: + dependency: transitive + description: + name: io + url: "https://pub.dartlang.org" + source: hosted + version: "0.3.4" + js: + dependency: transitive + description: + name: js + url: "https://pub.dartlang.org" + source: hosted + version: "0.6.3-nullsafety.3" + json_rpc_2: + dependency: transitive + description: + name: json_rpc_2 + url: "https://pub.dartlang.org" + source: hosted + version: "2.2.2" + json_table: + dependency: "direct main" + description: + name: json_table + url: "https://pub.dartlang.org" + source: hosted + version: "1.4.0" + json_utilities: + dependency: transitive + description: + name: json_utilities + url: "https://pub.dartlang.org" + source: hosted + version: "0.1.3" + logging: + dependency: transitive + description: + name: logging + url: "https://pub.dartlang.org" + source: hosted + version: "0.11.4" + matcher: + dependency: transitive + description: + name: matcher + url: "https://pub.dartlang.org" + source: hosted + version: "0.12.10-nullsafety.3" + meta: + dependency: transitive + description: + name: meta + url: "https://pub.dartlang.org" + source: hosted + version: "1.3.0-nullsafety.6" + nested: + dependency: transitive + description: + name: nested + url: "https://pub.dartlang.org" + source: hosted + version: "0.0.4" + node_interop: + dependency: transitive + description: + name: node_interop + url: "https://pub.dartlang.org" + source: hosted + version: "1.2.1" + node_io: + dependency: transitive + description: + name: node_io + url: "https://pub.dartlang.org" + source: hosted + version: "1.1.1" + package_config: + dependency: transitive + description: + name: package_config + url: "https://pub.dartlang.org" + source: hosted + version: "1.9.3" + path: + dependency: transitive + description: + name: path + url: "https://pub.dartlang.org" + source: hosted + version: "1.8.0-nullsafety.3" + path_drawing: + dependency: transitive + description: + name: path_drawing + url: "https://pub.dartlang.org" + source: hosted + version: "0.4.1+1" + path_parsing: + dependency: transitive + description: + name: path_parsing + url: "https://pub.dartlang.org" + source: hosted + version: "0.1.4" + path_provider: + dependency: transitive + description: + name: path_provider + url: "https://pub.dartlang.org" + source: hosted + version: "1.6.27" + path_provider_linux: + dependency: transitive + description: + name: path_provider_linux + url: "https://pub.dartlang.org" + source: hosted + version: "0.0.1+2" + path_provider_macos: + dependency: transitive + description: + name: path_provider_macos + url: "https://pub.dartlang.org" + source: hosted + version: "0.0.4+8" + path_provider_platform_interface: + dependency: transitive + description: + name: path_provider_platform_interface + url: "https://pub.dartlang.org" + source: hosted + version: "1.0.4" + path_provider_windows: + dependency: transitive + description: + name: path_provider_windows + url: "https://pub.dartlang.org" + source: hosted + version: "0.0.4+3" + pedantic: + dependency: transitive + description: + name: pedantic + url: "https://pub.dartlang.org" + source: hosted + version: "1.10.0-nullsafety.3" + platform: + dependency: transitive + description: + name: platform + url: "https://pub.dartlang.org" + source: hosted + version: "3.0.0-nullsafety.4" + plugin_platform_interface: + dependency: transitive + description: + name: plugin_platform_interface + url: "https://pub.dartlang.org" + source: hosted + version: "1.0.3" + pool: + dependency: transitive + description: + name: pool + url: "https://pub.dartlang.org" + source: hosted + version: "1.5.0-nullsafety.3" + process: + dependency: transitive + description: + name: process + url: "https://pub.dartlang.org" + source: hosted + version: "4.0.0-nullsafety.4" + provider: + dependency: "direct main" + description: + name: provider + url: "https://pub.dartlang.org" + source: hosted + version: "4.3.3" + pub_semver: + dependency: transitive + description: + name: pub_semver + url: "https://pub.dartlang.org" + source: hosted + version: "1.4.4" + quiver: + dependency: transitive + description: + name: quiver + url: "https://pub.dartlang.org" + source: hosted + version: "2.1.5" + sky_engine: + dependency: transitive + description: flutter + source: sdk + version: "0.0.99" + source_map_stack_trace: + dependency: transitive + description: + name: source_map_stack_trace + url: "https://pub.dartlang.org" + source: hosted + version: "2.1.0-nullsafety.4" + source_maps: + dependency: transitive + description: + name: source_maps + url: "https://pub.dartlang.org" + source: hosted + version: "0.10.10-nullsafety.3" + source_span: + dependency: transitive + description: + name: source_span + url: "https://pub.dartlang.org" + source: hosted + version: "1.8.0-nullsafety.4" + stack_trace: + dependency: transitive + description: + name: stack_trace + url: "https://pub.dartlang.org" + source: hosted + version: "1.10.0-nullsafety.6" + stream_channel: + dependency: transitive + description: + name: stream_channel + url: "https://pub.dartlang.org" + source: hosted + version: "2.1.0-nullsafety.3" + string_scanner: + dependency: transitive + description: + name: string_scanner + url: "https://pub.dartlang.org" + source: hosted + version: "1.1.0-nullsafety.3" + sync_http: + dependency: transitive + description: + name: sync_http + url: "https://pub.dartlang.org" + source: hosted + version: "0.2.0" + term_glyph: + dependency: transitive + description: + name: term_glyph + url: "https://pub.dartlang.org" + source: hosted + version: "1.2.0-nullsafety.3" + test_api: + dependency: transitive + description: + name: test_api + url: "https://pub.dartlang.org" + source: hosted + version: "0.2.19-nullsafety.6" + test_core: + dependency: transitive + description: + name: test_core + url: "https://pub.dartlang.org" + source: hosted + version: "0.3.12-nullsafety.9" + typed_data: + dependency: transitive + description: + name: typed_data + url: "https://pub.dartlang.org" + source: hosted + version: "1.3.0-nullsafety.5" + url_launcher: + dependency: "direct main" + description: + name: url_launcher + url: "https://pub.dartlang.org" + source: hosted + version: "5.7.10" + url_launcher_linux: + dependency: transitive + description: + name: url_launcher_linux + url: "https://pub.dartlang.org" + source: hosted + version: "0.0.1+4" + url_launcher_macos: + dependency: transitive + description: + name: url_launcher_macos + url: "https://pub.dartlang.org" + source: hosted + version: "0.0.1+9" + url_launcher_platform_interface: + dependency: transitive + description: + name: url_launcher_platform_interface + url: "https://pub.dartlang.org" + source: hosted + version: "1.0.9" + url_launcher_web: + dependency: transitive + description: + name: url_launcher_web + url: "https://pub.dartlang.org" + source: hosted + version: "0.1.5+3" + url_launcher_windows: + dependency: transitive + description: + name: url_launcher_windows + url: "https://pub.dartlang.org" + source: hosted + version: "0.0.1+3" + vector_math: + dependency: transitive + description: + name: vector_math + url: "https://pub.dartlang.org" + source: hosted + version: "2.1.0-nullsafety.5" + vm_service: + dependency: transitive + description: + name: vm_service + url: "https://pub.dartlang.org" + source: hosted + version: "5.5.0" + watcher: + dependency: transitive + description: + name: watcher + url: "https://pub.dartlang.org" + source: hosted + version: "0.9.7+15" + web_socket_channel: + dependency: transitive + description: + name: web_socket_channel + url: "https://pub.dartlang.org" + source: hosted + version: "1.1.0" + webdriver: + dependency: transitive + description: + name: webdriver + url: "https://pub.dartlang.org" + source: hosted + version: "2.1.2" + win32: + dependency: transitive + description: + name: win32 + url: "https://pub.dartlang.org" + source: hosted + version: "1.7.4+1" + xdg_directories: + dependency: transitive + description: + name: xdg_directories + url: "https://pub.dartlang.org" + source: hosted + version: "0.1.2" + yaml: + dependency: transitive + description: + name: yaml + url: "https://pub.dartlang.org" + source: hosted + version: "2.2.1" +sdks: + dart: ">=2.12.0-0.0 <3.0.0" + flutter: ">=1.22.0 <2.0.0" diff --git a/team#7-{9}/pubspec.yaml b/team#7-{9}/pubspec.yaml new file mode 100644 index 0000000..e18d3ee --- /dev/null +++ b/team#7-{9}/pubspec.yaml @@ -0,0 +1,92 @@ +name: cf_pursuit +description: A new Flutter project. + +# The following line prevents the package from being accidentally published to +# pub.dev using `pub publish`. This is preferred for private packages. +publish_to: 'none' # Remove this line if you wish to publish to pub.dev + +# The following defines the version and build number for your application. +# A version number is three numbers separated by dots, like 1.2.43 +# followed by an optional build number separated by a +. +# Both the version and the builder number may be overridden in flutter +# build by specifying --build-name and --build-number, respectively. +# In Android, build-name is used as versionName while build-number used as versionCode. +# Read more about Android versioning at https://developer.android.com/studio/publish/versioning +# In iOS, build-name is used as CFBundleShortVersionString while build-number used as CFBundleVersion. +# Read more about iOS versioning at +# https://developer.apple.com/library/archive/documentation/General/Reference/InfoPlistKeyReference/Articles/CoreFoundationKeys.html +version: 1.0.0+1 + +environment: + sdk: ">=2.7.0 <3.0.0" + +dependencies: + flutter: + sdk: flutter + + + # The following adds the Cupertino Icons font to your application. + # Use with the CupertinoIcons class for iOS style icons. + cupertino_icons: ^1.0.1 + google_fonts: ^1.1.2 + firebase_auth: ^0.20.0+1 + firebase_analytics: ^7.0.1 + animated_text_kit: ^3.1.1 + provider: ^4.3.3 + json_table: ^1.4.0 + http: ^0.12.2 + fl_chart: ^0.12.3 + firebase_database: ^6.0.0 + horizontal_data_table: ^2.2.0 + googleapis: ^1.0.0 + googleapis_auth: ^0.2.12+1 + url_launcher: ^5.7.10 + flutter_countdown_timer: ^3.0.0 + +dev_dependencies: + flutter_test: + sdk: flutter + integration_test: + sdk: flutter + +# For information on the generic Dart part of this file, see the +# following page: https://dart.dev/tools/pub/pubspec + +# The following section is specific to Flutter. +flutter: + + # The following line ensures that the Material Icons font is + # included with your application, so that you can use the icons in + # the material Icons class. + uses-material-design: true + + # To add assets to your application, add an assets section, like this: + # assets: + # - images/a_dot_burr.jpeg + # - images/a_dot_ham.jpeg + + # An image asset can refer to one or more resolution-specific "variants", see + # https://flutter.dev/assets-and-images/#resolution-aware. + + # For details regarding adding assets from package dependencies, see + # https://flutter.dev/assets-and-images/#from-packages + + # To add custom fonts to your application, add a fonts section here, + # in this "flutter" section. Each entry in this list should have a + # "family" key with the font family name, and a "fonts" key with a + # list giving the asset and other descriptors for the font. For + # example: + # fonts: + # - family: Schyler + # fonts: + # - asset: fonts/Schyler-Regular.ttf + # - asset: fonts/Schyler-Italic.ttf + # style: italic + # - family: Trajan Pro + # fonts: + # - asset: fonts/TrajanPro.ttf + # - asset: fonts/TrajanPro_Bold.ttf + # weight: 700 + # + # For details regarding fonts from package dependencies, + # see https://flutter.dev/custom-fonts/#from-packages diff --git a/team#7-{9}/test/widget_test.dart b/team#7-{9}/test/widget_test.dart new file mode 100644 index 0000000..36f1511 --- /dev/null +++ b/team#7-{9}/test/widget_test.dart @@ -0,0 +1,30 @@ +// This is a basic Flutter widget test. +// +// To perform an interaction with a widget in your test, use the WidgetTester +// utility that Flutter provides. For example, you can send tap and scroll +// gestures. You can also use WidgetTester to find child widgets in the widget +// tree, read text, and verify that the values of widget properties are correct. + +import 'package:flutter/material.dart'; +import 'package:flutter_test/flutter_test.dart'; + +import 'package:cf_pursuit/main.dart'; + +void main() { + testWidgets('Counter increments smoke test', (WidgetTester tester) async { + // Build our app and trigger a frame. + await tester.pumpWidget(MyApp()); + + // Verify that our counter starts at 0. + expect(find.text('0'), findsOneWidget); + expect(find.text('1'), findsNothing); + + // Tap the '+' icon and trigger a frame. + await tester.tap(find.byIcon(Icons.add)); + await tester.pump(); + + // Verify that our counter has incremented. + expect(find.text('0'), findsNothing); + expect(find.text('1'), findsOneWidget); + }); +} diff --git a/team#7-{9}/web/favicon.png b/team#7-{9}/web/favicon.png new file mode 100644 index 0000000..8aaa46a Binary files /dev/null and b/team#7-{9}/web/favicon.png differ diff --git a/team#7-{9}/web/icons/Icon-192.png b/team#7-{9}/web/icons/Icon-192.png new file mode 100644 index 0000000..b749bfe Binary files /dev/null and b/team#7-{9}/web/icons/Icon-192.png differ diff --git a/team#7-{9}/web/icons/Icon-512.png b/team#7-{9}/web/icons/Icon-512.png new file mode 100644 index 0000000..88cfd48 Binary files /dev/null and b/team#7-{9}/web/icons/Icon-512.png differ diff --git a/team#7-{9}/web/index.html b/team#7-{9}/web/index.html new file mode 100644 index 0000000..b2ef2f0 --- /dev/null +++ b/team#7-{9}/web/index.html @@ -0,0 +1,71 @@ + + + + + + + + + + + + + + + + + + + + + cf_pursuit + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/team#7-{9}/web/manifest.json b/team#7-{9}/web/manifest.json new file mode 100644 index 0000000..8754e75 --- /dev/null +++ b/team#7-{9}/web/manifest.json @@ -0,0 +1,23 @@ +{ + "name": "cf_pursuit", + "short_name": "cf_pursuit", + "start_url": ".", + "display": "standalone", + "background_color": "#0175C2", + "theme_color": "#0175C2", + "description": "A new Flutter project.", + "orientation": "portrait-primary", + "prefer_related_applications": false, + "icons": [ + { + "src": "icons/Icon-192.png", + "sizes": "192x192", + "type": "image/png" + }, + { + "src": "icons/Icon-512.png", + "sizes": "512x512", + "type": "image/png" + } + ] +}