├── .gitignore ├── .gitmodules ├── ISSUE_TEMPLATE.md ├── LICENSE ├── README.md ├── app ├── .gitignore ├── .metadata ├── LICENSE ├── README.md ├── android │ ├── app │ │ ├── build.gradle │ │ ├── proguard-rules.pro │ │ └── src │ │ │ └── main │ │ │ ├── AndroidManifest.xml │ │ │ ├── kotlin │ │ │ └── om │ │ │ │ └── dena │ │ │ │ └── techcon │ │ │ │ └── app │ │ │ │ └── MainActivity.kt │ │ │ └── res │ │ │ ├── COPYRIGHT.txt │ │ │ ├── drawable-hdpi │ │ │ └── ic_launcher_foreground.png │ │ │ ├── drawable-mdpi │ │ │ └── ic_launcher_foreground.png │ │ │ ├── drawable-xhdpi │ │ │ └── ic_launcher_foreground.png │ │ │ ├── drawable-xxhdpi │ │ │ └── ic_launcher_foreground.png │ │ │ ├── drawable-xxxhdpi │ │ │ └── ic_launcher_foreground.png │ │ │ ├── drawable │ │ │ ├── ic_small_icon.xml │ │ │ └── launch_background.xml │ │ │ ├── mipmap-anydpi-v26 │ │ │ └── ic_launcher.xml │ │ │ ├── mipmap-hdpi │ │ │ ├── ic_launcher.png │ │ │ └── logo_shift_up.png │ │ │ ├── mipmap-mdpi │ │ │ ├── ic_launcher.png │ │ │ └── logo_shift_up.png │ │ │ ├── mipmap-xhdpi │ │ │ ├── ic_launcher.png │ │ │ └── logo_shift_up.png │ │ │ ├── mipmap-xxhdpi │ │ │ ├── ic_launcher.png │ │ │ └── logo_shift_up.png │ │ │ ├── mipmap-xxxhdpi │ │ │ ├── ic_launcher.png │ │ │ └── logo_shift_up.png │ │ │ └── values │ │ │ ├── colors.xml │ │ │ ├── strings.xml │ │ │ └── styles.xml │ ├── build.gradle │ ├── gradle.properties │ ├── gradle │ │ └── wrapper │ │ │ └── gradle-wrapper.properties │ └── settings.gradle ├── assets │ ├── COPYRIGHT.txt │ ├── animations │ │ └── Logo.flr │ ├── fonts │ │ ├── Montserrat-Bold.ttf │ │ ├── Montserrat-Italic.ttf │ │ ├── Montserrat-Medium.ttf │ │ ├── Montserrat-Regular.ttf │ │ └── OFL.txt │ ├── images │ │ ├── app_Icon_ios.png │ │ ├── app_icon_android.png │ │ ├── ic_launcher.png │ │ ├── img_energy_drink.png │ │ ├── logo.png │ │ ├── logo_shift_up.png │ │ ├── message.png │ │ └── stage_map.png │ └── locales │ │ └── messages.json ├── flutter_launcher_icons.yaml ├── ios │ ├── Flutter │ │ ├── AppFrameworkInfo.plist │ │ ├── Debug.xcconfig │ │ └── Release.xcconfig │ ├── Podfile │ ├── Runner.xcodeproj │ │ ├── project.pbxproj │ │ ├── project.xcworkspace │ │ │ └── contents.xcworkspacedata │ │ └── xcshareddata │ │ │ └── xcschemes │ │ │ └── Runner.xcscheme │ ├── Runner.xcworkspace │ │ ├── contents.xcworkspacedata │ │ └── xcshareddata │ │ │ ├── IDEWorkspaceChecks.plist │ │ │ └── WorkspaceSettings.xcsettings │ └── Runner │ │ ├── AppDelegate.swift │ │ ├── Assets.xcassets │ │ ├── AppIcon.appiconset │ │ │ ├── Contents.json │ │ │ ├── Icon-App-1024x1024@1x.png │ │ │ ├── Icon-App-20x20@1x.png │ │ │ ├── Icon-App-20x20@2x.png │ │ │ ├── Icon-App-20x20@3x.png │ │ │ ├── Icon-App-29x29@1x.png │ │ │ ├── Icon-App-29x29@2x.png │ │ │ ├── Icon-App-29x29@3x.png │ │ │ ├── Icon-App-40x40@1x.png │ │ │ ├── Icon-App-40x40@2x.png │ │ │ ├── Icon-App-40x40@3x.png │ │ │ ├── Icon-App-60x60@2x.png │ │ │ ├── Icon-App-60x60@3x.png │ │ │ ├── Icon-App-76x76@1x.png │ │ │ ├── Icon-App-76x76@2x.png │ │ │ └── Icon-App-83.5x83.5@2x.png │ │ ├── COPYRIGHT.txt │ │ └── LaunchImage.imageset │ │ │ ├── Contents.json │ │ │ ├── README.md │ │ │ ├── logo_shift_up-1.png │ │ │ ├── logo_shift_up@2x.png │ │ │ └── logo_shift_up@3x.png │ │ ├── Base.lproj │ │ ├── LaunchScreen.storyboard │ │ └── Main.storyboard │ │ ├── Info.plist │ │ ├── Runner-Bridging-Header.h │ │ └── Runner.entitlements ├── lib │ ├── features │ │ ├── about.dart │ │ ├── code_of_conduct.dart │ │ ├── enquete.dart │ │ ├── home.dart │ │ ├── map.dart │ │ ├── menu.dart │ │ ├── session.dart │ │ ├── sessions.dart │ │ ├── splash.dart │ │ ├── ui │ │ │ └── LinkTextSpan.dart │ │ └── widget │ │ │ ├── backdrop.dart │ │ │ ├── front_layer_title.dart │ │ │ └── loading_indicator.dart │ ├── keys.dart │ ├── localizations.dart │ ├── main.dart │ ├── routes.dart │ └── theme.dart └── pubspec.yaml ├── architecture ├── .gitignore ├── .metadata ├── CHANGELOG.md ├── LICENSE ├── README.md ├── lib │ ├── actions.dart │ ├── active_tab.dart │ ├── app_tab.dart │ ├── middleware.dart │ ├── reducer.dart │ └── state.dart └── pubspec.yaml ├── commons ├── .gitignore ├── .metadata ├── CHANGELOG.md ├── LICENSE ├── README.md ├── lib │ ├── commons.dart │ ├── lang │ │ ├── objects.dart │ │ └── strings.dart │ ├── pair.dart │ ├── preconditions.dart │ └── util │ │ ├── date_util.dart │ │ └── uuid.dart ├── pubspec.yaml └── test │ ├── commons_test.dart │ ├── lang │ ├── objects_test.dart │ └── strings_test.dart │ └── util │ └── date_util_test.dart ├── hosting ├── .gitignore ├── LICENSE ├── README.md ├── json.schemas │ ├── schema_business.json │ ├── schema_person.json │ └── schema_sessions.json └── public │ ├── 404.html │ ├── 503.html │ ├── image │ ├── img_person.png │ └── stage_map.png │ ├── index.html │ ├── json │ └── sessions.json │ └── maintenance.html ├── repository ├── .gitignore ├── .metadata ├── CHANGELOG.md ├── LICENSE ├── README.md ├── lib │ ├── entity │ │ ├── business.dart │ │ ├── business.g.dart │ │ ├── category.dart │ │ ├── category.g.dart │ │ ├── person.dart │ │ ├── person.g.dart │ │ ├── service.dart │ │ ├── service.g.dart │ │ ├── session.dart │ │ ├── session.g.dart │ │ ├── sns.dart │ │ └── sns.g.dart │ └── repository.dart └── pubspec.yaml ├── repository_cache ├── .gitignore ├── .metadata ├── CHANGELOG.md ├── LICENSE ├── README.md ├── android │ ├── .gitignore │ ├── build.gradle │ ├── gradle.properties │ ├── settings.gradle │ └── src │ │ └── main │ │ ├── AndroidManifest.xml │ │ └── kotlin │ │ └── com │ │ └── dena │ │ └── techcon │ │ └── app │ │ └── repositorycache │ │ └── RepositoryCachePlugin.kt ├── ios │ ├── .gitignore │ ├── Assets │ │ └── .gitkeep │ ├── Classes │ │ ├── RepositoryCachePlugin.h │ │ ├── RepositoryCachePlugin.m │ │ └── SwiftRepositoryCachePlugin.swift │ └── repository_cache.podspec ├── lib │ └── repository_cache.dart └── pubspec.yaml ├── repository_local ├── .gitignore ├── .metadata ├── CHANGELOG.md ├── LICENSE ├── README.md ├── lib │ ├── assets.dart │ └── repository_local.dart └── pubspec.yaml └── screenshots ├── 00_screenshots.png ├── 01_launch.png ├── 02_splash.png ├── 03_schedule.png ├── 04_about.png ├── 05_enquete.png └── COPYRIGHT.txt /.gitignore: -------------------------------------------------------------------------------- 1 | # Miscellaneous 2 | *.class 3 | *.lock 4 | *.log 5 | *.pyc 6 | *.swp 7 | .DS_Store 8 | .atom/ 9 | .buildlog/ 10 | .history 11 | .svn/ 12 | 13 | # IntelliJ related 14 | *.iml 15 | *.ipr 16 | *.iws 17 | .idea/ 18 | 19 | # Visual Studio Code related 20 | .vscode/ 21 | 22 | # Flutter/Dart/Pub related 23 | **/doc/api/ 24 | .dart_tool/ 25 | .flutter-plugins 26 | .packages 27 | .pub-cache/ 28 | .pub/ 29 | build/ 30 | 31 | # Android related 32 | **/android/**/gradle-wrapper.jar 33 | **/android/.gradle 34 | **/android/captures/ 35 | **/android/gradlew 36 | **/android/gradlew.bat 37 | **/android/local.properties 38 | **/android/**/GeneratedPluginRegistrant.java 39 | 40 | # iOS/XCode related 41 | **/ios/**/*.mode1v3 42 | **/ios/**/*.mode2v3 43 | **/ios/**/*.moved-aside 44 | **/ios/**/*.pbxuser 45 | **/ios/**/*.perspectivev3 46 | **/ios/**/*sync/ 47 | **/ios/**/.sconsign.dblite 48 | **/ios/**/.tags* 49 | **/ios/**/.vagrant/ 50 | **/ios/**/DerivedData/ 51 | **/ios/**/Icon? 52 | **/ios/**/Pods/ 53 | **/ios/**/.symlinks/ 54 | **/ios/**/profile 55 | **/ios/**/xcuserdata 56 | **/ios/.generated/ 57 | **/ios/Flutter/App.framework 58 | **/ios/Flutter/Flutter.framework 59 | **/ios/Flutter/Generated.xcconfig 60 | **/ios/Flutter/app.flx 61 | **/ios/Flutter/app.zip 62 | **/ios/Flutter/flutter_assets/ 63 | **/ios/ServiceDefinitions.json 64 | **/ios/Runner/GeneratedPluginRegistrant.* 65 | **/ios/vendor/ 66 | **/ios/.bundle/ 67 | 68 | # Exceptions to above rules. 69 | !**/ios/**/default.mode1v3 70 | !**/ios/**/default.mode2v3 71 | !**/ios/**/default.pbxuser 72 | !**/ios/**/default.perspectivev3 73 | !/packages/flutter_tools/test/data/dart_dependencies_test/**/.packages 74 | 75 | plugins/ 76 | **/.env* -------------------------------------------------------------------------------- /.gitmodules: -------------------------------------------------------------------------------- 1 | [submodule "plugins"] 2 | path = plugins 3 | url = https://github.com/flutter/plugins.git 4 | -------------------------------------------------------------------------------- /ISSUE_TEMPLATE.md: -------------------------------------------------------------------------------- 1 | # OS(iOS or Android) 2 | 3 | # 端末名(Pixel/iPhoneXS) 4 | 5 | # 再現手順 6 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | Copyright (c) 2019 DeNA Co., Ltd. 2 | 3 | Permission is hereby granted, free of charge, to any person obtaining a copy 4 | of this software and associated documentation files (the "Software"), to deal 5 | in the Software without restriction, including without limitation the rights 6 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 7 | copies of the Software, and to permit persons to whom the Software is 8 | furnished to do so, subject to the following conditions: 9 | 10 | The above copyright notice and this permission notice shall be included in 11 | all copies or substantial portions of the Software. 12 | 13 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 14 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 15 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 16 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 17 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 18 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 19 | THE SOFTWARE. -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | TechCon App 2 | ================ 3 | 4 | # Introduction 5 | 6 | We will release the source code by modifying a part of DeNA TechCon App. 7 | 8 | ### screenshots 9 | ![screenshots](https://user-images.githubusercontent.com/291993/54334442-64e8ce80-4669-11e9-8572-663d8242396f.png) 10 | 11 | # Technology and Architecture 12 | 13 | - Flutter is Build beautiful native apps on iOS and Android from a single codebase 14 | - Build UI with Material Design 15 | - Use Firebase services 16 | - Messaging 17 | - Crashlytics 18 | - Analytics *Disabled by default as we have not implemented the consent process 19 | - Use Google Map *Android only 20 | - Programing with Redux framework and modularized 21 | 22 | # Modules (File and Directory) 23 | 24 | ``` 25 | root 26 | ├── app --- Main application module 27 | ├── architecture --- Redux architecture layer module 28 | ├── commons --- Utils module 29 | ├── repository --- Repository definition (Interface and Entity) module 30 | ├── repository_local --- Static data repository module 31 | ├── repository_cache --- Cacheable remote repository module 32 | │ 33 | ├── plugins --- The latest Flutter plugins directory. To use the latest version of Google Map Plugin not yet published to Dart Pub. 34 | │ 35 | └── hosting --- Directory of Web hosting resouce and json schema settings to vscode 36 | ``` 37 | 38 | # Get started 39 | 40 | 1. Get this application from git 41 | 42 | `git clone https://github.com/DeNA/techcon_app.git` 43 | 44 | 2. Get plugins with git submodule 45 | 46 | `git submodule add https://github.com/flutter/plugins.git` 47 | 48 | *To use the latest version of Google Map Plugin not yet published to Dart Pub. 49 | 50 | 3. [Add Firebase to your Flutter app  \|  Firebase](https://firebase.google.com/docs/flutter/setup) 51 | 52 | - Step 1: Set up your environment 53 | - Step 2: Create a Firebase project 54 | - Step 3: Configure your app to use Firebase 55 | - Step 4: Add FlutterFire plugins 56 | 57 | 4. Set up [google\_maps\_flutter \| Flutter Package](https://pub.dartlang.org/packages/google_maps_flutter) 58 | 59 | # CAUTION 60 | 61 | **"app/assets/", "app/android/app/res/", "app/ios/Runner/Assets.xcassets/" and "screenshots" folders contains works that each owner provides under the respective license.** 62 | -------------------------------------------------------------------------------- /app/.gitignore: -------------------------------------------------------------------------------- 1 | # Miscellaneous 2 | *.class 3 | *.lock 4 | *.log 5 | *.pyc 6 | *.swp 7 | .DS_Store 8 | .atom/ 9 | .buildlog/ 10 | .history 11 | .svn/ 12 | 13 | # IntelliJ related 14 | *.iml 15 | *.ipr 16 | *.iws 17 | .idea/ 18 | 19 | # Visual Studio Code related 20 | .vscode/ 21 | 22 | # Flutter/Dart/Pub related 23 | **/doc/api/ 24 | .dart_tool/ 25 | .flutter-plugins 26 | .packages 27 | .pub-cache/ 28 | .pub/ 29 | build/ 30 | 31 | # Android related 32 | **/android/**/gradle-wrapper.jar 33 | **/android/.gradle 34 | **/android/captures/ 35 | **/android/gradlew 36 | **/android/gradlew.bat 37 | **/android/local.properties 38 | **/android/**/GeneratedPluginRegistrant.java 39 | 40 | # iOS/XCode related 41 | **/ios/**/*.mode1v3 42 | **/ios/**/*.mode2v3 43 | **/ios/**/*.moved-aside 44 | **/ios/**/*.pbxuser 45 | **/ios/**/*.perspectivev3 46 | **/ios/**/*sync/ 47 | **/ios/**/.sconsign.dblite 48 | **/ios/**/.tags* 49 | **/ios/**/.vagrant/ 50 | **/ios/**/DerivedData/ 51 | **/ios/**/Icon? 52 | **/ios/**/Pods/ 53 | **/ios/**/.symlinks/ 54 | **/ios/**/profile 55 | **/ios/**/xcuserdata 56 | **/ios/.generated/ 57 | **/ios/Flutter/App.framework 58 | **/ios/Flutter/Flutter.framework 59 | **/ios/Flutter/Generated.xcconfig 60 | **/ios/Flutter/app.flx 61 | **/ios/Flutter/app.zip 62 | **/ios/Flutter/flutter_assets/ 63 | **/ios/ServiceDefinitions.json 64 | **/ios/Runner/GeneratedPluginRegistrant.* 65 | 66 | **/ios/*.dSYM.zip 67 | **/ios/*.ipa 68 | 69 | # Exceptions to above rules. 70 | !**/ios/**/default.mode1v3 71 | !**/ios/**/default.mode2v3 72 | !**/ios/**/default.pbxuser 73 | !**/ios/**/default.perspectivev3 74 | !/packages/flutter_tools/test/data/dart_dependencies_test/**/.packages 75 | 76 | **/**/fastlane/report.xml -------------------------------------------------------------------------------- /app/.metadata: -------------------------------------------------------------------------------- 1 | # This file tracks properties of this Flutter project. 2 | # Used by Flutter tool to assess capabilities and perform upgrades etc. 3 | # 4 | # This file should be version controlled and should not be manually edited. 5 | 6 | version: 7 | revision: 5391447fae6209bb21a89e6a5a6583cac1af9b4b 8 | channel: beta 9 | 10 | project_type: app 11 | -------------------------------------------------------------------------------- /app/LICENSE: -------------------------------------------------------------------------------- 1 | Copyright (c) 2019 DeNA Co., Ltd. 2 | 3 | Permission is hereby granted, free of charge, to any person obtaining a copy 4 | of this software and associated documentation files (the "Software"), to deal 5 | in the Software without restriction, including without limitation the rights 6 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 7 | copies of the Software, and to permit persons to whom the Software is 8 | furnished to do so, subject to the following conditions: 9 | 10 | The above copyright notice and this permission notice shall be included in 11 | all copies or substantial portions of the Software. 12 | 13 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 14 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 15 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 16 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 17 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 18 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 19 | THE SOFTWARE. -------------------------------------------------------------------------------- /app/README.md: -------------------------------------------------------------------------------- 1 | # app 2 | 3 | A Flutter application project for TechCon. 4 | 5 | ### Flutter Launcher Icons 6 | 7 | 1. Setup the config file (flutter_launcher_icons.yaml) 8 | ``` 9 | dev_dependencies: 10 | flutter_launcher_icons: "^0.7.0" 11 | 12 | flutter_icons: 13 | android: true 14 | ios: true 15 | image_path_ios: "assets/images/app_icon_ios.png" 16 | image_path_android: "assets/images/app_icon_android.png" 17 | adaptive_icon_background: "#ffffff" 18 | adaptive_icon_foreground: "assets/images/ic_launcher.png" 19 | ``` 20 | 21 | 2. Update launcher base icon files 22 | ``` 23 | assets/images/App_Icon.png 24 | assets/images/ic_launcher.png 25 | ``` 26 | 27 | 3. Run the package on command line 28 | ``` 29 | flutter packages get 30 | flutter packages pub run flutter_launcher_icons:main 31 | ``` 32 | -------------------------------------------------------------------------------- /app/android/app/build.gradle: -------------------------------------------------------------------------------- 1 | def localProperties = new Properties() 2 | def localPropertiesFile = rootProject.file('local.properties') 3 | if (localPropertiesFile.exists()) { 4 | localPropertiesFile.withReader('UTF-8') { reader -> 5 | localProperties.load(reader) 6 | } 7 | } 8 | 9 | def flutterRoot = localProperties.getProperty('flutter.sdk') 10 | if (flutterRoot == null) { 11 | throw new GradleException("Flutter SDK not found. Define location with flutter.sdk in the local.properties file.") 12 | } 13 | 14 | def flutterVersionCode = localProperties.getProperty('flutter.versionCode') 15 | if (flutterVersionCode == null) { 16 | flutterVersionCode = '1' 17 | } 18 | 19 | def flutterVersionName = localProperties.getProperty('flutter.versionName') 20 | if (flutterVersionName == null) { 21 | flutterVersionName = '1.0' 22 | } 23 | 24 | apply plugin: 'com.android.application' 25 | apply plugin: 'kotlin-android' 26 | apply from: "$flutterRoot/packages/flutter_tools/gradle/flutter.gradle" 27 | apply plugin: 'io.fabric' 28 | 29 | android { 30 | compileSdkVersion 27 31 | 32 | sourceSets { 33 | main.java.srcDirs += 'src/main/kotlin' 34 | } 35 | 36 | lintOptions { 37 | disable 'InvalidPackage' 38 | } 39 | 40 | defaultConfig { 41 | // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). 42 | applicationId "com.example.techcon.app.demo" 43 | minSdkVersion 21 44 | targetSdkVersion 27 45 | multiDexEnabled true 46 | versionCode flutterVersionCode.toInteger() 47 | versionName flutterVersionName 48 | testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" 49 | } 50 | 51 | buildTypes { 52 | release { 53 | // TODO: Add your own signing config for the release build. 54 | // Signing with the debug keys for now, so `flutter run --release` works. 55 | signingConfig signingConfigs.debug 56 | 57 | minifyEnabled true 58 | useProguard true 59 | 60 | proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' 61 | 62 | } 63 | } 64 | 65 | flavorDimensions "target" 66 | 67 | productFlavors { 68 | dev { 69 | dimension "target" 70 | applicationIdSuffix ".dev" 71 | versionNameSuffix "-dev" 72 | } 73 | prod { 74 | dimension "target" 75 | } 76 | } 77 | } 78 | 79 | flutter { 80 | source '../..' 81 | } 82 | 83 | dependencies { 84 | implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version" 85 | testImplementation 'junit:junit:4.12' 86 | androidTestImplementation 'com.android.support.test:runner:1.0.2' 87 | androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2' 88 | } 89 | 90 | apply plugin: 'com.google.gms.google-services' 91 | -------------------------------------------------------------------------------- /app/android/app/proguard-rules.pro: -------------------------------------------------------------------------------- 1 | #Flutter Wrapper 2 | -keep class io.flutter.app.** { *; } 3 | -keep class io.flutter.plugin.** { *; } 4 | -keep class io.flutter.util.** { *; } 5 | -keep class io.flutter.view.** { *; } 6 | -keep class io.flutter.** { *; } 7 | -keep class io.flutter.plugins.** { *; } 8 | -------------------------------------------------------------------------------- /app/android/app/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 3 | 4 | 8 | 9 | 10 | 15 | 19 | 21 | 24 | 27 | 34 | 38 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | -------------------------------------------------------------------------------- /app/android/app/src/main/kotlin/om/dena/techcon/app/MainActivity.kt: -------------------------------------------------------------------------------- 1 | package om.dena.techcon.app 2 | 3 | import android.os.Bundle 4 | 5 | import io.flutter.app.FlutterActivity 6 | import io.flutter.plugins.GeneratedPluginRegistrant 7 | 8 | class MainActivity: FlutterActivity() { 9 | override fun onCreate(savedInstanceState: Bundle?) { 10 | super.onCreate(savedInstanceState) 11 | GeneratedPluginRegistrant.registerWith(this) 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /app/android/app/src/main/res/COPYRIGHT.txt: -------------------------------------------------------------------------------- 1 | The copyright of the images and the flr file contained in this folder and 2 | its subordinates is as follows: 3 | 4 | Copyright (C) 2019 DeNA Co., Ltd. All rights Reserved. 5 | 6 | 7 | ANY INCLUDED IMAGES ARE PROVIDED FOR TESTING PURPOSES ONLY. 8 | NO FURTHER USE OR DISTRIBUTION OF THESE IMAGES IS ALLOWED. 9 | -------------------------------------------------------------------------------- /app/android/app/src/main/res/drawable-hdpi/ic_launcher_foreground.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DeNA/techcon_app/8a38010cf0e8d0f19267049ecb27bf1429d6cd30/app/android/app/src/main/res/drawable-hdpi/ic_launcher_foreground.png -------------------------------------------------------------------------------- /app/android/app/src/main/res/drawable-mdpi/ic_launcher_foreground.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DeNA/techcon_app/8a38010cf0e8d0f19267049ecb27bf1429d6cd30/app/android/app/src/main/res/drawable-mdpi/ic_launcher_foreground.png -------------------------------------------------------------------------------- /app/android/app/src/main/res/drawable-xhdpi/ic_launcher_foreground.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DeNA/techcon_app/8a38010cf0e8d0f19267049ecb27bf1429d6cd30/app/android/app/src/main/res/drawable-xhdpi/ic_launcher_foreground.png -------------------------------------------------------------------------------- /app/android/app/src/main/res/drawable-xxhdpi/ic_launcher_foreground.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DeNA/techcon_app/8a38010cf0e8d0f19267049ecb27bf1429d6cd30/app/android/app/src/main/res/drawable-xxhdpi/ic_launcher_foreground.png -------------------------------------------------------------------------------- /app/android/app/src/main/res/drawable-xxxhdpi/ic_launcher_foreground.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DeNA/techcon_app/8a38010cf0e8d0f19267049ecb27bf1429d6cd30/app/android/app/src/main/res/drawable-xxxhdpi/ic_launcher_foreground.png -------------------------------------------------------------------------------- /app/android/app/src/main/res/drawable/ic_small_icon.xml: -------------------------------------------------------------------------------- 1 | 6 | 12 | 18 | 24 | 30 | 36 | 42 | 48 | 54 | 60 | 66 | 72 | 78 | 84 | 90 | 96 | 102 | 108 | 114 | 120 | 126 | 132 | 138 | 144 | 150 | 156 | 162 | 168 | 169 | -------------------------------------------------------------------------------- /app/android/app/src/main/res/drawable/launch_background.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 11 | 12 | 13 | -------------------------------------------------------------------------------- /app/android/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /app/android/app/src/main/res/mipmap-hdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DeNA/techcon_app/8a38010cf0e8d0f19267049ecb27bf1429d6cd30/app/android/app/src/main/res/mipmap-hdpi/ic_launcher.png -------------------------------------------------------------------------------- /app/android/app/src/main/res/mipmap-hdpi/logo_shift_up.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DeNA/techcon_app/8a38010cf0e8d0f19267049ecb27bf1429d6cd30/app/android/app/src/main/res/mipmap-hdpi/logo_shift_up.png -------------------------------------------------------------------------------- /app/android/app/src/main/res/mipmap-mdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DeNA/techcon_app/8a38010cf0e8d0f19267049ecb27bf1429d6cd30/app/android/app/src/main/res/mipmap-mdpi/ic_launcher.png -------------------------------------------------------------------------------- /app/android/app/src/main/res/mipmap-mdpi/logo_shift_up.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DeNA/techcon_app/8a38010cf0e8d0f19267049ecb27bf1429d6cd30/app/android/app/src/main/res/mipmap-mdpi/logo_shift_up.png -------------------------------------------------------------------------------- /app/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DeNA/techcon_app/8a38010cf0e8d0f19267049ecb27bf1429d6cd30/app/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png -------------------------------------------------------------------------------- /app/android/app/src/main/res/mipmap-xhdpi/logo_shift_up.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DeNA/techcon_app/8a38010cf0e8d0f19267049ecb27bf1429d6cd30/app/android/app/src/main/res/mipmap-xhdpi/logo_shift_up.png -------------------------------------------------------------------------------- /app/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DeNA/techcon_app/8a38010cf0e8d0f19267049ecb27bf1429d6cd30/app/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png -------------------------------------------------------------------------------- /app/android/app/src/main/res/mipmap-xxhdpi/logo_shift_up.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DeNA/techcon_app/8a38010cf0e8d0f19267049ecb27bf1429d6cd30/app/android/app/src/main/res/mipmap-xxhdpi/logo_shift_up.png -------------------------------------------------------------------------------- /app/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DeNA/techcon_app/8a38010cf0e8d0f19267049ecb27bf1429d6cd30/app/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png -------------------------------------------------------------------------------- /app/android/app/src/main/res/mipmap-xxxhdpi/logo_shift_up.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DeNA/techcon_app/8a38010cf0e8d0f19267049ecb27bf1429d6cd30/app/android/app/src/main/res/mipmap-xxxhdpi/logo_shift_up.png -------------------------------------------------------------------------------- /app/android/app/src/main/res/values/colors.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | #ffffff 4 | -------------------------------------------------------------------------------- /app/android/app/src/main/res/values/strings.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | TechCon 4 | -------------------------------------------------------------------------------- /app/android/app/src/main/res/values/styles.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 8 | 9 | -------------------------------------------------------------------------------- /app/android/build.gradle: -------------------------------------------------------------------------------- 1 | buildscript { 2 | ext.kotlin_version = '1.2.71' 3 | repositories { 4 | google() 5 | jcenter() 6 | maven { 7 | url 'https://maven.fabric.io/public' 8 | } 9 | } 10 | 11 | dependencies { 12 | classpath 'com.android.tools.build:gradle:3.2.1' 13 | classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" 14 | classpath 'com.google.gms:google-services:4.2.0' 15 | classpath 'io.fabric.tools:gradle:1.26.1' 16 | } 17 | } 18 | 19 | allprojects { 20 | repositories { 21 | google() 22 | jcenter() 23 | maven { 24 | url 'https://maven.google.com/' 25 | } 26 | } 27 | } 28 | 29 | rootProject.buildDir = '../build' 30 | subprojects { 31 | project.buildDir = "${rootProject.buildDir}/${project.name}" 32 | } 33 | subprojects { 34 | project.evaluationDependsOn(':app') 35 | } 36 | 37 | task clean(type: Delete) { 38 | delete rootProject.buildDir 39 | } 40 | -------------------------------------------------------------------------------- /app/android/gradle.properties: -------------------------------------------------------------------------------- 1 | org.gradle.jvmargs=-Xmx1536M 2 | -------------------------------------------------------------------------------- /app/android/gradle/wrapper/gradle-wrapper.properties: -------------------------------------------------------------------------------- 1 | #Fri Jun 23 08:50:38 CEST 2017 2 | distributionBase=GRADLE_USER_HOME 3 | distributionPath=wrapper/dists 4 | zipStoreBase=GRADLE_USER_HOME 5 | zipStorePath=wrapper/dists 6 | distributionUrl=https\://services.gradle.org/distributions/gradle-4.10.2-all.zip 7 | -------------------------------------------------------------------------------- /app/android/settings.gradle: -------------------------------------------------------------------------------- 1 | include ':app' 2 | 3 | def flutterProjectRoot = rootProject.projectDir.parentFile.toPath() 4 | 5 | def plugins = new Properties() 6 | def pluginsFile = new File(flutterProjectRoot.toFile(), '.flutter-plugins') 7 | if (pluginsFile.exists()) { 8 | pluginsFile.withReader('UTF-8') { reader -> plugins.load(reader) } 9 | } 10 | 11 | plugins.each { name, path -> 12 | def pluginDirectory = flutterProjectRoot.resolve(path).resolve('android').toFile() 13 | include ":$name" 14 | project(":$name").projectDir = pluginDirectory 15 | } 16 | -------------------------------------------------------------------------------- /app/assets/COPYRIGHT.txt: -------------------------------------------------------------------------------- 1 | The copyright of the images and the flr file contained in this folder and 2 | its subordinates is as follows: 3 | 4 | Copyright (C) 2019 DeNA Co., Ltd. All rights Reserved. 5 | 6 | 7 | ANY INCLUDED IMAGES ARE PROVIDED FOR TESTING PURPOSES ONLY. 8 | NO FURTHER USE OR DISTRIBUTION OF THESE IMAGES IS ALLOWED. 9 | -------------------------------------------------------------------------------- /app/assets/fonts/Montserrat-Bold.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DeNA/techcon_app/8a38010cf0e8d0f19267049ecb27bf1429d6cd30/app/assets/fonts/Montserrat-Bold.ttf -------------------------------------------------------------------------------- /app/assets/fonts/Montserrat-Italic.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DeNA/techcon_app/8a38010cf0e8d0f19267049ecb27bf1429d6cd30/app/assets/fonts/Montserrat-Italic.ttf -------------------------------------------------------------------------------- /app/assets/fonts/Montserrat-Medium.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DeNA/techcon_app/8a38010cf0e8d0f19267049ecb27bf1429d6cd30/app/assets/fonts/Montserrat-Medium.ttf -------------------------------------------------------------------------------- /app/assets/fonts/Montserrat-Regular.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DeNA/techcon_app/8a38010cf0e8d0f19267049ecb27bf1429d6cd30/app/assets/fonts/Montserrat-Regular.ttf -------------------------------------------------------------------------------- /app/assets/fonts/OFL.txt: -------------------------------------------------------------------------------- 1 | Copyright 2011 The Montserrat Project Authors (https://github.com/JulietaUla/Montserrat) 2 | 3 | This Font Software is licensed under the SIL Open Font License, Version 1.1. 4 | This license is copied below, and is also available with a FAQ at: 5 | http://scripts.sil.org/OFL 6 | 7 | 8 | ----------------------------------------------------------- 9 | SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007 10 | ----------------------------------------------------------- 11 | 12 | PREAMBLE 13 | The goals of the Open Font License (OFL) are to stimulate worldwide 14 | development of collaborative font projects, to support the font creation 15 | efforts of academic and linguistic communities, and to provide a free and 16 | open framework in which fonts may be shared and improved in partnership 17 | with others. 18 | 19 | The OFL allows the licensed fonts to be used, studied, modified and 20 | redistributed freely as long as they are not sold by themselves. The 21 | fonts, including any derivative works, can be bundled, embedded, 22 | redistributed and/or sold with any software provided that any reserved 23 | names are not used by derivative works. The fonts and derivatives, 24 | however, cannot be released under any other type of license. The 25 | requirement for fonts to remain under this license does not apply 26 | to any document created using the fonts or their derivatives. 27 | 28 | DEFINITIONS 29 | "Font Software" refers to the set of files released by the Copyright 30 | Holder(s) under this license and clearly marked as such. This may 31 | include source files, build scripts and documentation. 32 | 33 | "Reserved Font Name" refers to any names specified as such after the 34 | copyright statement(s). 35 | 36 | "Original Version" refers to the collection of Font Software components as 37 | distributed by the Copyright Holder(s). 38 | 39 | "Modified Version" refers to any derivative made by adding to, deleting, 40 | or substituting -- in part or in whole -- any of the components of the 41 | Original Version, by changing formats or by porting the Font Software to a 42 | new environment. 43 | 44 | "Author" refers to any designer, engineer, programmer, technical 45 | writer or other person who contributed to the Font Software. 46 | 47 | PERMISSION & CONDITIONS 48 | Permission is hereby granted, free of charge, to any person obtaining 49 | a copy of the Font Software, to use, study, copy, merge, embed, modify, 50 | redistribute, and sell modified and unmodified copies of the Font 51 | Software, subject to the following conditions: 52 | 53 | 1) Neither the Font Software nor any of its individual components, 54 | in Original or Modified Versions, may be sold by itself. 55 | 56 | 2) Original or Modified Versions of the Font Software may be bundled, 57 | redistributed and/or sold with any software, provided that each copy 58 | contains the above copyright notice and this license. These can be 59 | included either as stand-alone text files, human-readable headers or 60 | in the appropriate machine-readable metadata fields within text or 61 | binary files as long as those fields can be easily viewed by the user. 62 | 63 | 3) No Modified Version of the Font Software may use the Reserved Font 64 | Name(s) unless explicit written permission is granted by the corresponding 65 | Copyright Holder. This restriction only applies to the primary font name as 66 | presented to the users. 67 | 68 | 4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font 69 | Software shall not be used to promote, endorse or advertise any 70 | Modified Version, except to acknowledge the contribution(s) of the 71 | Copyright Holder(s) and the Author(s) or with their explicit written 72 | permission. 73 | 74 | 5) The Font Software, modified or unmodified, in part or in whole, 75 | must be distributed entirely under this license, and must not be 76 | distributed under any other license. The requirement for fonts to 77 | remain under this license does not apply to any document created 78 | using the Font Software. 79 | 80 | TERMINATION 81 | This license becomes null and void if any of the above conditions are 82 | not met. 83 | 84 | DISCLAIMER 85 | THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 86 | EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF 87 | MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT 88 | OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE 89 | COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, 90 | INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL 91 | DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 92 | FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM 93 | OTHER DEALINGS IN THE FONT SOFTWARE. 94 | -------------------------------------------------------------------------------- /app/assets/images/app_Icon_ios.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DeNA/techcon_app/8a38010cf0e8d0f19267049ecb27bf1429d6cd30/app/assets/images/app_Icon_ios.png -------------------------------------------------------------------------------- /app/assets/images/app_icon_android.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DeNA/techcon_app/8a38010cf0e8d0f19267049ecb27bf1429d6cd30/app/assets/images/app_icon_android.png -------------------------------------------------------------------------------- /app/assets/images/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DeNA/techcon_app/8a38010cf0e8d0f19267049ecb27bf1429d6cd30/app/assets/images/ic_launcher.png -------------------------------------------------------------------------------- /app/assets/images/img_energy_drink.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DeNA/techcon_app/8a38010cf0e8d0f19267049ecb27bf1429d6cd30/app/assets/images/img_energy_drink.png -------------------------------------------------------------------------------- /app/assets/images/logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DeNA/techcon_app/8a38010cf0e8d0f19267049ecb27bf1429d6cd30/app/assets/images/logo.png -------------------------------------------------------------------------------- /app/assets/images/logo_shift_up.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DeNA/techcon_app/8a38010cf0e8d0f19267049ecb27bf1429d6cd30/app/assets/images/logo_shift_up.png -------------------------------------------------------------------------------- /app/assets/images/message.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DeNA/techcon_app/8a38010cf0e8d0f19267049ecb27bf1429d6cd30/app/assets/images/message.png -------------------------------------------------------------------------------- /app/assets/images/stage_map.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DeNA/techcon_app/8a38010cf0e8d0f19267049ecb27bf1429d6cd30/app/assets/images/stage_map.png -------------------------------------------------------------------------------- /app/assets/locales/messages.json: -------------------------------------------------------------------------------- 1 | { 2 | "title_app": "TechCon 2019", 3 | "menu": "MENU", 4 | "schedule": "SCHEDULE", 5 | "about": "ABOUT", 6 | "map": "MAP", 7 | "enquete": "ENQUETE", 8 | "floor_map": "FLOOR MAP", 9 | "session": "SESSION", 10 | "session_detail": "SESSION DETAIL", 11 | "title": "TITLE", 12 | "licenses": "Licenses", 13 | "speaker": "SPEAKER", 14 | "stage_a": "A Stage", 15 | "stage_b": "B Stage", 16 | "stage_c": "C Stage", 17 | "stage_d": "D Stage", 18 | "message": "MESSAGE", 19 | "message_headline": "技術の力で事業の未来をリードする", 20 | "message_description": "DeNAでは、ゲームやエンタメだけでなく、Eコマース、ソーシャルLIVE、ヘルスケア、オートモーティブ、そして横浜DeNAベイスターズのようなスポーツなど、様々な事業を行っています。\n\nまた、技術の力で事業の未来をリードするため、様々なチャレンジも行っています。\n\nDeNA TechCon はこれらのチャレンジの中から、技術的に特に面白いものを厳選して皆さんにお披露目するお祭りです。", 21 | "message_theme_1": "今年のテーマは「", 22 | "message_theme_2": "SHIFT UP", 23 | "message_theme_3": "」です。", 24 | "message_last": "『面白かったー!』と思っていただく工夫を凝らしてお待ちしてますので、みなさまぜひお越しください!", 25 | "message_enquete_title": "アンケートに答えて\nエナジードリンクをGETしよう!", 26 | "message_enquete_detail": "DeNA TechCon 2019 に参加された感想をぜひお聞かせください。\n\n以下の「アンケートはこちらから」ボタンをタップすると、オンラインアンケートへジャンプします。\nアンケートに回答後、完了画面を受付にてご提示いただいた方には、エナジードリンク1本をお渡しいたします。", 27 | "message_enquete_drink_1":"エナジードリンク引き換え開始時間", 28 | "message_enquete_drink_2":"14:00 -", 29 | "message_enquete_drink_3":"※14:00以前に完了画面をお見せいただいてもエナジードリンクはお渡しいたしかねますので、ご了承ください。", 30 | "enquete_button": "アンケートはこちらから", 31 | "code_of_conduct" : "CODE OF CONDUCT", 32 | "code_of_conduct_description": "DeNA TechCon 2019 は、主にIT業界における技術発展・情報共有・交流・コラボレーションを目的とするカンファレンスです。 我々(DeNA TechCon 2019 運営)はすべての参加者が歓迎され、楽しんで頂くために、スタッフ・登壇者・観客を含むすべての参加者の皆様に、本行動規範に則って参加いただくようにお願いしております。\n\n・DeNA TechCon 2019 では、性別、性的指向、障害の有無、外見、身体の大きさ、人種、宗教にかかわりなく、全員がハラスメント行為なくカンファレンスに参加し、体験できる環境の提供に最善を尽くします。\n\n・私たち主催者は、カンファレンス参加者によるハラスメント行為を一切許容しません。性的な言葉や映像表現を使うことはカンファレンス会場およびカンファレンスに関連するいかなる場でも不適切であり、その適用範囲は発表やトークの内容、ワークショップ、関連パーティー、Twitterやその他のオンラインメディアでの発言を含みます。これらのルールを破った参加者は、主催者の判断によって、カンファレンス内での行動を制限されたり、カンファレンスから退席するよう求められることがあります。場合によっては法的機関への相談など、適切と思われる対応をおこないます。\n\n・もしあなた、ないしは他の参加者がハラスメント行為を受けた場合、お近くの DeNA TechCon 2019 スタッフにご相談ください。お知らせ頂いた内容は法的な情報開示の必要性がある場合を除いて、あなたの同意がないかぎり匿名で扱いますのでご安心ください。", 33 | "code_of_conduct_appendix_1_1": "※本文章は", 34 | "code_of_conduct_appendix_1_2": "builderscon Code of Conduct", 35 | "code_of_conduct_appendix_1_3": "として公開された文章を元に改変しています。", 36 | "code_of_conduct_appendix_2_1": "※本文章は", 37 | "code_of_conduct_appendix_2_2": "Creative Commons Zero ライセンス", 38 | "code_of_conduct_appendix_2_3": "で公開されています。", 39 | "twitter_label": "Twitter:", 40 | "twitter_tag_label": "公式ハッシュタグ:", 41 | "access": "ACCESS", 42 | "open_map": "マップを開く", 43 | "access_map": "ACCESS MAP", 44 | "building": "渋谷ヒカリエ ホールA/B", 45 | "address": "〒150-8510\n東京都渋谷区渋谷2-21-1 渋谷ヒカリエ 9F", 46 | "public_transportation_1" : "東急東横線・田園都市線、東京メトロ半蔵門線・副都心線「渋谷駅」15番出口と直結。", 47 | "public_transportation_2" : "JR線、東京メトロ銀座線、京王井の頭線「渋谷駅」と2F連絡通路で直結。", 48 | "licenses": "OSS LICENSES", 49 | "rights_attribution_maps":"地図データ©2019 Google, ZENRIN", 50 | "terms_maps": "利用規約", 51 | "legalnotices_maps": "法的通知" 52 | } -------------------------------------------------------------------------------- /app/flutter_launcher_icons.yaml: -------------------------------------------------------------------------------- 1 | dev_dependencies: 2 | flutter_launcher_icons: ^0.7.0 3 | 4 | flutter_icons: 5 | android: true 6 | ios: true 7 | image_path_ios: "assets/images/app_icon_ios.png" 8 | image_path_android: "assets/images/app_icon_android.png" 9 | adaptive_icon_background: "#ffffff" 10 | adaptive_icon_foreground: "assets/images/ic_launcher.png" 11 | -------------------------------------------------------------------------------- /app/ios/Flutter/AppFrameworkInfo.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | en 7 | CFBundleExecutable 8 | App 9 | CFBundleIdentifier 10 | io.flutter.flutter.app 11 | CFBundleInfoDictionaryVersion 12 | 6.0 13 | CFBundleName 14 | App 15 | CFBundlePackageType 16 | FMWK 17 | CFBundleShortVersionString 18 | 1.0 19 | CFBundleSignature 20 | ???? 21 | CFBundleVersion 22 | 1.0 23 | MinimumOSVersion 24 | 8.0 25 | 26 | 27 | -------------------------------------------------------------------------------- /app/ios/Flutter/Debug.xcconfig: -------------------------------------------------------------------------------- 1 | #include "Pods/Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig" 2 | #include "Generated.xcconfig" 3 | -------------------------------------------------------------------------------- /app/ios/Flutter/Release.xcconfig: -------------------------------------------------------------------------------- 1 | #include "Pods/Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig" 2 | #include "Generated.xcconfig" 3 | -------------------------------------------------------------------------------- /app/ios/Podfile: -------------------------------------------------------------------------------- 1 | # Uncomment this line to define a global platform for your project 2 | # platform :ios, '9.0' 3 | 4 | # CocoaPods analytics sends network stats synchronously affecting flutter build latency. 5 | ENV['COCOAPODS_DISABLE_STATS'] = 'true' 6 | 7 | project 'Runner', { 8 | 'Debug' => :debug, 9 | 'Profile' => :release, 10 | 'Release' => :release, 11 | } 12 | 13 | def parse_KV_file(file, separator='=') 14 | file_abs_path = File.expand_path(file) 15 | if !File.exists? file_abs_path 16 | return []; 17 | end 18 | pods_ary = [] 19 | skip_line_start_symbols = ["#", "/"] 20 | File.foreach(file_abs_path) { |line| 21 | next if skip_line_start_symbols.any? { |symbol| line =~ /^\s*#{symbol}/ } 22 | plugin = line.split(pattern=separator) 23 | if plugin.length == 2 24 | podname = plugin[0].strip() 25 | path = plugin[1].strip() 26 | podpath = File.expand_path("#{path}", file_abs_path) 27 | pods_ary.push({:name => podname, :path => podpath}); 28 | else 29 | puts "Invalid plugin specification: #{line}" 30 | end 31 | } 32 | return pods_ary 33 | end 34 | 35 | target 'Runner' do 36 | use_frameworks! 37 | 38 | # Prepare symlinks folder. We use symlinks to avoid having Podfile.lock 39 | # referring to absolute paths on developers' machines. 40 | system('rm -rf .symlinks') 41 | system('mkdir -p .symlinks/plugins') 42 | 43 | # Flutter Pods 44 | generated_xcode_build_settings = parse_KV_file('./Flutter/Generated.xcconfig') 45 | if generated_xcode_build_settings.empty? 46 | puts "Generated.xcconfig must exist. If you're running pod install manually, make sure flutter packages get is executed first." 47 | end 48 | generated_xcode_build_settings.map { |p| 49 | if p[:name] == 'FLUTTER_FRAMEWORK_DIR' 50 | symlink = File.join('.symlinks', 'flutter') 51 | File.symlink(File.dirname(p[:path]), symlink) 52 | pod 'Flutter', :path => File.join(symlink, File.basename(p[:path])) 53 | end 54 | } 55 | 56 | # Plugin Pods 57 | plugin_pods = parse_KV_file('../.flutter-plugins') 58 | plugin_pods.map { |p| 59 | symlink = File.join('.symlinks', 'plugins', p[:name]) 60 | File.symlink(p[:path], symlink) 61 | pod p[:name], :path => File.join(symlink, 'ios') 62 | } 63 | end 64 | 65 | post_install do |installer| 66 | installer.pods_project.targets.each do |target| 67 | target.build_configurations.each do |config| 68 | config.build_settings['ENABLE_BITCODE'] = 'NO' 69 | end 70 | end 71 | end 72 | -------------------------------------------------------------------------------- /app/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /app/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme: -------------------------------------------------------------------------------- 1 | 2 | 5 | 8 | 9 | 15 | 21 | 22 | 23 | 24 | 25 | 30 | 31 | 32 | 33 | 39 | 40 | 41 | 42 | 43 | 44 | 54 | 56 | 62 | 63 | 64 | 65 | 66 | 67 | 73 | 75 | 81 | 82 | 83 | 84 | 86 | 87 | 90 | 91 | 92 | -------------------------------------------------------------------------------- /app/ios/Runner.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /app/ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | IDEDidComputeMac32BitWarning 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /app/ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | BuildSystemType 6 | Original 7 | 8 | 9 | -------------------------------------------------------------------------------- /app/ios/Runner/AppDelegate.swift: -------------------------------------------------------------------------------- 1 | import UIKit 2 | import Flutter 3 | import GoogleMaps 4 | 5 | @UIApplicationMain 6 | @objc class AppDelegate: FlutterAppDelegate { 7 | override func application( 8 | _ application: UIApplication, 9 | didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]? 10 | ) -> Bool { 11 | GMSServices.provideAPIKey("YOUR KEY HERE") 12 | GeneratedPluginRegistrant.register(with: self) 13 | return super.application(application, didFinishLaunchingWithOptions: launchOptions) 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /app/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "size" : "20x20", 5 | "idiom" : "iphone", 6 | "filename" : "Icon-App-20x20@2x.png", 7 | "scale" : "2x" 8 | }, 9 | { 10 | "size" : "20x20", 11 | "idiom" : "iphone", 12 | "filename" : "Icon-App-20x20@3x.png", 13 | "scale" : "3x" 14 | }, 15 | { 16 | "size" : "29x29", 17 | "idiom" : "iphone", 18 | "filename" : "Icon-App-29x29@1x.png", 19 | "scale" : "1x" 20 | }, 21 | { 22 | "size" : "29x29", 23 | "idiom" : "iphone", 24 | "filename" : "Icon-App-29x29@2x.png", 25 | "scale" : "2x" 26 | }, 27 | { 28 | "size" : "29x29", 29 | "idiom" : "iphone", 30 | "filename" : "Icon-App-29x29@3x.png", 31 | "scale" : "3x" 32 | }, 33 | { 34 | "size" : "40x40", 35 | "idiom" : "iphone", 36 | "filename" : "Icon-App-40x40@2x.png", 37 | "scale" : "2x" 38 | }, 39 | { 40 | "size" : "40x40", 41 | "idiom" : "iphone", 42 | "filename" : "Icon-App-40x40@3x.png", 43 | "scale" : "3x" 44 | }, 45 | { 46 | "size" : "60x60", 47 | "idiom" : "iphone", 48 | "filename" : "Icon-App-60x60@2x.png", 49 | "scale" : "2x" 50 | }, 51 | { 52 | "size" : "60x60", 53 | "idiom" : "iphone", 54 | "filename" : "Icon-App-60x60@3x.png", 55 | "scale" : "3x" 56 | }, 57 | { 58 | "size" : "20x20", 59 | "idiom" : "ipad", 60 | "filename" : "Icon-App-20x20@1x.png", 61 | "scale" : "1x" 62 | }, 63 | { 64 | "size" : "20x20", 65 | "idiom" : "ipad", 66 | "filename" : "Icon-App-20x20@2x.png", 67 | "scale" : "2x" 68 | }, 69 | { 70 | "size" : "29x29", 71 | "idiom" : "ipad", 72 | "filename" : "Icon-App-29x29@1x.png", 73 | "scale" : "1x" 74 | }, 75 | { 76 | "size" : "29x29", 77 | "idiom" : "ipad", 78 | "filename" : "Icon-App-29x29@2x.png", 79 | "scale" : "2x" 80 | }, 81 | { 82 | "size" : "40x40", 83 | "idiom" : "ipad", 84 | "filename" : "Icon-App-40x40@1x.png", 85 | "scale" : "1x" 86 | }, 87 | { 88 | "size" : "40x40", 89 | "idiom" : "ipad", 90 | "filename" : "Icon-App-40x40@2x.png", 91 | "scale" : "2x" 92 | }, 93 | { 94 | "size" : "76x76", 95 | "idiom" : "ipad", 96 | "filename" : "Icon-App-76x76@1x.png", 97 | "scale" : "1x" 98 | }, 99 | { 100 | "size" : "76x76", 101 | "idiom" : "ipad", 102 | "filename" : "Icon-App-76x76@2x.png", 103 | "scale" : "2x" 104 | }, 105 | { 106 | "size" : "83.5x83.5", 107 | "idiom" : "ipad", 108 | "filename" : "Icon-App-83.5x83.5@2x.png", 109 | "scale" : "2x" 110 | }, 111 | { 112 | "size" : "1024x1024", 113 | "idiom" : "ios-marketing", 114 | "filename" : "Icon-App-1024x1024@1x.png", 115 | "scale" : "1x" 116 | } 117 | ], 118 | "info" : { 119 | "version" : 1, 120 | "author" : "xcode" 121 | } 122 | } 123 | -------------------------------------------------------------------------------- /app/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DeNA/techcon_app/8a38010cf0e8d0f19267049ecb27bf1429d6cd30/app/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png -------------------------------------------------------------------------------- /app/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DeNA/techcon_app/8a38010cf0e8d0f19267049ecb27bf1429d6cd30/app/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png -------------------------------------------------------------------------------- /app/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DeNA/techcon_app/8a38010cf0e8d0f19267049ecb27bf1429d6cd30/app/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png -------------------------------------------------------------------------------- /app/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DeNA/techcon_app/8a38010cf0e8d0f19267049ecb27bf1429d6cd30/app/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png -------------------------------------------------------------------------------- /app/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DeNA/techcon_app/8a38010cf0e8d0f19267049ecb27bf1429d6cd30/app/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png -------------------------------------------------------------------------------- /app/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DeNA/techcon_app/8a38010cf0e8d0f19267049ecb27bf1429d6cd30/app/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png -------------------------------------------------------------------------------- /app/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DeNA/techcon_app/8a38010cf0e8d0f19267049ecb27bf1429d6cd30/app/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png -------------------------------------------------------------------------------- /app/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DeNA/techcon_app/8a38010cf0e8d0f19267049ecb27bf1429d6cd30/app/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png -------------------------------------------------------------------------------- /app/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DeNA/techcon_app/8a38010cf0e8d0f19267049ecb27bf1429d6cd30/app/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png -------------------------------------------------------------------------------- /app/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DeNA/techcon_app/8a38010cf0e8d0f19267049ecb27bf1429d6cd30/app/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png -------------------------------------------------------------------------------- /app/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DeNA/techcon_app/8a38010cf0e8d0f19267049ecb27bf1429d6cd30/app/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png -------------------------------------------------------------------------------- /app/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DeNA/techcon_app/8a38010cf0e8d0f19267049ecb27bf1429d6cd30/app/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png -------------------------------------------------------------------------------- /app/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DeNA/techcon_app/8a38010cf0e8d0f19267049ecb27bf1429d6cd30/app/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png -------------------------------------------------------------------------------- /app/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DeNA/techcon_app/8a38010cf0e8d0f19267049ecb27bf1429d6cd30/app/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png -------------------------------------------------------------------------------- /app/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DeNA/techcon_app/8a38010cf0e8d0f19267049ecb27bf1429d6cd30/app/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png -------------------------------------------------------------------------------- /app/ios/Runner/Assets.xcassets/COPYRIGHT.txt: -------------------------------------------------------------------------------- 1 | The copyright of the images and the flr file contained in this folder and 2 | its subordinates is as follows: 3 | 4 | Copyright (C) 2019 DeNA Co., Ltd. All rights Reserved. 5 | 6 | 7 | ANY INCLUDED IMAGES ARE PROVIDED FOR TESTING PURPOSES ONLY. 8 | NO FURTHER USE OR DISTRIBUTION OF THESE IMAGES IS ALLOWED. 9 | -------------------------------------------------------------------------------- /app/ios/Runner/Assets.xcassets/LaunchImage.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "filename" : "logo_shift_up-1.png", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "filename" : "logo_shift_up@2x.png", 11 | "scale" : "2x" 12 | }, 13 | { 14 | "idiom" : "universal", 15 | "filename" : "logo_shift_up@3x.png", 16 | "scale" : "3x" 17 | } 18 | ], 19 | "info" : { 20 | "version" : 1, 21 | "author" : "xcode" 22 | } 23 | } -------------------------------------------------------------------------------- /app/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md: -------------------------------------------------------------------------------- 1 | # Launch Screen Assets 2 | 3 | You can customize the launch screen with your own desired assets by replacing the image files in this directory. 4 | 5 | You can also do it by opening your Flutter project's Xcode project with `open ios/Runner.xcworkspace`, selecting `Runner/Assets.xcassets` in the Project Navigator and dropping in the desired images. -------------------------------------------------------------------------------- /app/ios/Runner/Assets.xcassets/LaunchImage.imageset/logo_shift_up-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DeNA/techcon_app/8a38010cf0e8d0f19267049ecb27bf1429d6cd30/app/ios/Runner/Assets.xcassets/LaunchImage.imageset/logo_shift_up-1.png -------------------------------------------------------------------------------- /app/ios/Runner/Assets.xcassets/LaunchImage.imageset/logo_shift_up@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DeNA/techcon_app/8a38010cf0e8d0f19267049ecb27bf1429d6cd30/app/ios/Runner/Assets.xcassets/LaunchImage.imageset/logo_shift_up@2x.png -------------------------------------------------------------------------------- /app/ios/Runner/Assets.xcassets/LaunchImage.imageset/logo_shift_up@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DeNA/techcon_app/8a38010cf0e8d0f19267049ecb27bf1429d6cd30/app/ios/Runner/Assets.xcassets/LaunchImage.imageset/logo_shift_up@3x.png -------------------------------------------------------------------------------- /app/ios/Runner/Base.lproj/LaunchScreen.storyboard: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | -------------------------------------------------------------------------------- /app/ios/Runner/Base.lproj/Main.storyboard: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | -------------------------------------------------------------------------------- /app/ios/Runner/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | en 7 | CFBundleDisplayName 8 | TechCon 9 | CFBundleExecutable 10 | $(EXECUTABLE_NAME) 11 | CFBundleIdentifier 12 | $(PRODUCT_BUNDLE_IDENTIFIER) 13 | CFBundleInfoDictionaryVersion 14 | 6.0 15 | CFBundleName 16 | app 17 | CFBundlePackageType 18 | APPL 19 | CFBundleShortVersionString 20 | $(FLUTTER_BUILD_NAME) 21 | CFBundleSignature 22 | ???? 23 | CFBundleVersion 24 | $(FLUTTER_BUILD_NUMBER) 25 | FIREBASE_ANALYTICS_COLLECTION_ENABLED 26 | 27 | LSRequiresIPhoneOS 28 | 29 | UILaunchStoryboardName 30 | LaunchScreen 31 | UIMainStoryboardFile 32 | Main 33 | UISupportedInterfaceOrientations 34 | 35 | UIInterfaceOrientationPortrait 36 | 37 | UISupportedInterfaceOrientations~ipad 38 | 39 | UIInterfaceOrientationPortrait 40 | UIInterfaceOrientationPortraitUpsideDown 41 | UIInterfaceOrientationLandscapeLeft 42 | UIInterfaceOrientationLandscapeRight 43 | 44 | UIViewControllerBasedStatusBarAppearance 45 | 46 | io.flutter.embedded_views_preview 47 | YES 48 | 49 | 50 | -------------------------------------------------------------------------------- /app/ios/Runner/Runner-Bridging-Header.h: -------------------------------------------------------------------------------- 1 | #import "GeneratedPluginRegistrant.h" -------------------------------------------------------------------------------- /app/ios/Runner/Runner.entitlements: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | aps-environment 6 | development 7 | 8 | 9 | -------------------------------------------------------------------------------- /app/lib/features/code_of_conduct.dart: -------------------------------------------------------------------------------- 1 | /// Copyright (c) 2019 DeNA Co., Ltd. 2 | /// Licensed under the MIT License 3 | 4 | import 'package:app/features/ui/LinkTextSpan.dart'; 5 | import 'package:app/localizations.dart'; 6 | import 'package:app/theme.dart'; 7 | import 'package:flutter/material.dart'; 8 | 9 | String urlCoC = 10 | "https://docs.google.com/document/d/16VhNCZBWWwjQQXkSXfg6evR1frdHHbHb7g-m80xSrgA/edit"; 11 | String urlCC = "https://creativecommons.org/publicdomain/zero/1.0/"; 12 | 13 | class CodeOfConductPage extends StatelessWidget { 14 | @override 15 | Widget build(BuildContext context) { 16 | return Scaffold( 17 | appBar: AppBar( 18 | elevation: 0.0, 19 | title: Text(AppLocalizations.of(context).text("code_of_conduct")), 20 | ), 21 | backgroundColor: kPrimaryColor, 22 | body: Container( 23 | decoration: BoxDecoration( 24 | color: kPrimaryBackgroundColor, 25 | borderRadius: BorderRadius.only( 26 | topLeft: Radius.circular(16.0), topRight: Radius.circular(16.0)), 27 | ), 28 | padding: EdgeInsets.all(16.0), 29 | child: ListView( 30 | children: [ 31 | SizedBox(height: 8.0), 32 | Text( 33 | AppLocalizations.of(context).text("code_of_conduct_description"), 34 | ), 35 | SizedBox(height: 8.0), 36 | RichText( 37 | text: TextSpan( 38 | children: [ 39 | TextSpan( 40 | style: Theme.of(context).textTheme.body1, 41 | text: AppLocalizations.of(context) 42 | .text("code_of_conduct_appendix_1_1"), 43 | ), 44 | LinkTextSpan( 45 | style: Theme.of(context).textTheme.body1.copyWith( 46 | color: Theme.of(context).accentColor, 47 | decoration: TextDecoration.underline), 48 | url: urlCoC, 49 | text: AppLocalizations.of(context) 50 | .text("code_of_conduct_appendix_1_2"), 51 | ), 52 | TextSpan( 53 | style: Theme.of(context).textTheme.body1, 54 | text: AppLocalizations.of(context) 55 | .text("code_of_conduct_appendix_1_3"), 56 | ), 57 | ], 58 | ), 59 | ), 60 | RichText( 61 | text: TextSpan( 62 | children: [ 63 | TextSpan( 64 | style: Theme.of(context).textTheme.body1, 65 | text: AppLocalizations.of(context) 66 | .text("code_of_conduct_appendix_2_1"), 67 | ), 68 | LinkTextSpan( 69 | style: Theme.of(context).textTheme.body1.copyWith( 70 | color: Theme.of(context).accentColor, 71 | decoration: TextDecoration.underline), 72 | url: urlCC, 73 | text: AppLocalizations.of(context) 74 | .text("code_of_conduct_appendix_2_2"), 75 | ), 76 | TextSpan( 77 | style: Theme.of(context).textTheme.body1, 78 | text: AppLocalizations.of(context) 79 | .text("code_of_conduct_appendix_2_3"), 80 | ), 81 | ], 82 | ), 83 | ) 84 | ], 85 | ), 86 | ), 87 | ); 88 | } 89 | } 90 | -------------------------------------------------------------------------------- /app/lib/features/enquete.dart: -------------------------------------------------------------------------------- 1 | /// Copyright (c) 2019 DeNA Co., Ltd. 2 | /// Licensed under the MIT License 3 | 4 | import 'package:app/localizations.dart'; 5 | import 'package:app/theme.dart'; 6 | import 'package:flutter/material.dart'; 7 | import 'package:url_launcher/url_launcher.dart'; 8 | 9 | class EnquetePage extends StatelessWidget { 10 | @override 11 | Widget build(BuildContext context) { 12 | return Scaffold( 13 | body: SingleChildScrollView( 14 | child: Container( 15 | margin: EdgeInsets.fromLTRB(16.0, 16.0, 16.0, 40.0), 16 | child: Column( 17 | children: [ 18 | Container( 19 | child: Text( 20 | AppLocalizations.of(context).text("enquete"), 21 | style: Theme.of(context) 22 | .textTheme 23 | .subhead, 24 | textAlign: TextAlign.left, 25 | ), 26 | alignment: Alignment(-1.0, 0), 27 | ), 28 | SizedBox(height: 40), 29 | Image.asset( 30 | "assets/images/logo.png", 31 | fit: BoxFit.fill, 32 | width: 267.0, 33 | height: 58.0, 34 | ), 35 | SizedBox(height: 16), 36 | Text( 37 | AppLocalizations.of(context).text("message_enquete_title"), 38 | style: Theme.of(context) 39 | .textTheme 40 | .body2 41 | .copyWith(fontWeight: FontWeight.bold, fontSize: 20), 42 | textAlign: TextAlign.center, 43 | ), 44 | SizedBox(height: 40), 45 | Text( 46 | AppLocalizations.of(context).text("message_enquete_detail"), 47 | ), 48 | SizedBox(height: 40), 49 | messageButton(context), 50 | SizedBox(height: 40), 51 | Container( 52 | padding: EdgeInsets.all(16.0), 53 | decoration: BoxDecoration( 54 | color: kSecondaryBackgroundColor, 55 | borderRadius: BorderRadius.all(Radius.circular(8.0)), 56 | ), 57 | child: Column( 58 | children: [ 59 | Image.asset( 60 | "assets/images/img_energy_drink.png", 61 | fit: BoxFit.fill, 62 | width: 26.0, 63 | height: 64.0, 64 | ), 65 | SizedBox(height: 16.0), 66 | Text( 67 | AppLocalizations.of(context).text("message_enquete_drink_1"), 68 | style: Theme.of(context) 69 | .textTheme 70 | .body2 71 | .copyWith(fontWeight: FontWeight.bold), 72 | ), 73 | SizedBox(height: 8.0), 74 | Row( 75 | mainAxisAlignment: MainAxisAlignment.center, 76 | children: [ 77 | Icon( 78 | Icons.access_time, 79 | color: kTextMainColor, 80 | ), 81 | SizedBox(width: 12.0), 82 | Text( 83 | AppLocalizations.of(context).text("message_enquete_drink_2"), 84 | style: Theme.of(context) 85 | .textTheme 86 | .body2 87 | .copyWith(fontWeight: FontWeight.bold, fontSize: 18.0), 88 | ), 89 | ], 90 | ), 91 | SizedBox(height: 16.0), 92 | Text( 93 | AppLocalizations.of(context).text("message_enquete_drink_3"), 94 | ), 95 | ], 96 | ), 97 | ), 98 | ], 99 | ), 100 | ), 101 | ), 102 | ); 103 | } 104 | 105 | Widget messageButton(BuildContext context) { 106 | return Container( 107 | margin: EdgeInsets.symmetric( 108 | horizontal: MediaQuery.of(context).size.width / 6.0), 109 | child: OutlineButton( 110 | borderSide: BorderSide(color: kPrimaryColor), 111 | shape: RoundedRectangleBorder( 112 | borderRadius: BorderRadius.all(Radius.circular(50.0)), 113 | ), 114 | child: Text( 115 | AppLocalizations.of(context).text("enquete_button"), 116 | style: Theme.of(context) 117 | .textTheme 118 | .button 119 | .copyWith(color: Theme.of(context).accentColor), 120 | ), 121 | onPressed: _launchUrl, 122 | ), 123 | ); 124 | } 125 | 126 | _launchUrl() async { 127 | const url = 'https://questant.jp/q/5HKXUV46'; 128 | if (await canLaunch(url)) { 129 | await launch(url); 130 | } else { 131 | throw 'Could not launch $url'; 132 | } 133 | } 134 | } -------------------------------------------------------------------------------- /app/lib/features/home.dart: -------------------------------------------------------------------------------- 1 | /// Copyright (c) 2019 DeNA Co., Ltd. 2 | /// Licensed under the MIT License 3 | 4 | import 'package:app/features/about.dart'; 5 | import 'package:app/features/enquete.dart'; 6 | import 'package:app/features/map.dart'; 7 | import 'package:app/features/menu.dart'; 8 | import 'package:app/features/sessions.dart'; 9 | import 'package:app/features/widget/backdrop.dart'; 10 | import 'package:app/localizations.dart'; 11 | import 'package:firebase_analytics/firebase_analytics.dart'; 12 | import 'package:firebase_analytics/observer.dart'; 13 | import 'package:flutter/material.dart'; 14 | import 'package:flutter_redux/flutter_redux.dart'; 15 | import 'package:architecture/actions.dart'; 16 | import 'package:architecture/active_tab.dart'; 17 | import 'package:architecture/app_tab.dart'; 18 | import 'package:architecture/state.dart'; 19 | import 'package:firebase_messaging/firebase_messaging.dart'; 20 | 21 | class HomePage extends StatelessWidget { 22 | final FirebaseAnalytics analytics; 23 | final FirebaseAnalyticsObserver observer; 24 | final FirebaseMessaging messaging; 25 | 26 | const HomePage({Key key, this.analytics, this.observer, this.messaging}) : super(key: key); 27 | 28 | @override 29 | Widget build(BuildContext context) { 30 | messaging.configure(); 31 | messaging.requestNotificationPermissions( 32 | const IosNotificationSettings(sound:true, badge: true, alert: true) 33 | ); 34 | 35 | return StoreBuilder( 36 | // onInit: (store) => store.dispatch(UpdateTabAction(AppTab.sessions)), 37 | builder: (context, store) { 38 | return ActiveTab( 39 | builder: (BuildContext context, AppTab activeTab) { 40 | return Backdrop( 41 | currentTab: activeTab, 42 | frontLayer: _createTab(activeTab, analytics, observer), 43 | backLayer: MenuPage( 44 | currentTab: activeTab, 45 | onTabTap: (tab) => store.dispatch(UpdateTabAction(tab)), 46 | ), 47 | frontTitle: Text(AppLocalizations.of(context).text("title_app")), 48 | backTitle: Text(AppLocalizations.of(context).text("menu")), 49 | ); 50 | }, 51 | ); 52 | }, 53 | ); 54 | } 55 | 56 | Widget _createTab(AppTab activeTab, FirebaseAnalytics analytics, 57 | FirebaseAnalyticsObserver observer) { 58 | switch (activeTab) { 59 | case AppTab.sessions: 60 | return SessionsPage(analytics: analytics, observer: observer); 61 | case AppTab.map: 62 | return MapPage(); 63 | case AppTab.about: 64 | return AboutPage(analytics: analytics, observer: observer); 65 | case AppTab.enquete: 66 | return EnquetePage(); 67 | default: 68 | return SessionsPage(analytics: analytics, observer: observer); 69 | } 70 | } 71 | 72 | } 73 | -------------------------------------------------------------------------------- /app/lib/features/map.dart: -------------------------------------------------------------------------------- 1 | /// Copyright (c) 2019 DeNA Co., Ltd. 2 | /// Licensed under the MIT License 3 | 4 | import 'package:app/features/widget/loading_indicator.dart'; 5 | import 'package:app/localizations.dart'; 6 | import 'package:flutter/material.dart'; 7 | import 'package:flutter_advanced_networkimage/flutter_advanced_networkimage.dart'; 8 | import 'package:flutter_advanced_networkimage/transition_to_image.dart'; 9 | 10 | class MapPage extends StatelessWidget { 11 | @override 12 | Widget build(BuildContext context) { 13 | return Scaffold( 14 | body: SingleChildScrollView( 15 | padding: EdgeInsets.all(16.0), 16 | child: Column( 17 | crossAxisAlignment: CrossAxisAlignment.start, 18 | children: [ 19 | Text( 20 | AppLocalizations.of(context).text("floor_map"), 21 | style: Theme.of(context).textTheme.subhead, 22 | ), 23 | SizedBox(height: 26.0), 24 | // TIPS: When Airplane mode, raise FlutterException: SocketException: Failed host lookup: 'com-dena-techcon.firebaseapp.com' (OS Error: No address associated with hostname, errno = 7) 25 | // child: Image.network("https://com-dena-techcon.firebaseapp.com/image/stage_map.png") 26 | // TIPS: When Airplane mode, raise FlutterException "Couldn't download or retreive file.". errorWidget does not work ... !? 27 | // child: CachedNetworkImage( 28 | // imageUrl: "https://com-dena-techcon.firebaseapp.com/image/stage_map.png", 29 | // placeholder: LoadingIndicator(), 30 | // fit: BoxFit.cover, 31 | // errorWidget: Icon(Icons.broken_image, color: Colors.grey, size: 48.0), 32 | // ), 33 | TransitionToImage( 34 | image: AdvancedNetworkImage( 35 | 'https://com-dena-techcon.firebaseapp.com/image/stage_map.png', 36 | loadFailedCallback: () { 37 | debugPrint('Could not get map image'); 38 | }, 39 | ), 40 | fit: BoxFit.fitWidth, 41 | loadingWidget: LoadingIndicator(), 42 | placeholder: Icon( 43 | Icons.broken_image, 44 | color: Colors.grey, 45 | size: 48.0, 46 | ), 47 | ), 48 | ], 49 | ), 50 | ), 51 | ); 52 | } 53 | } 54 | -------------------------------------------------------------------------------- /app/lib/features/menu.dart: -------------------------------------------------------------------------------- 1 | /// Copyright (c) 2019 DeNA Co., Ltd. 2 | /// Licensed under the MIT License 3 | 4 | import 'package:app/theme.dart'; 5 | import 'package:architecture/app_tab.dart'; 6 | import 'package:flutter/material.dart'; 7 | 8 | class MenuPage extends StatelessWidget { 9 | final AppTab currentTab; 10 | final ValueChanged onTabTap; 11 | 12 | const MenuPage({Key key, this.currentTab, this.onTabTap}) 13 | : assert(currentTab != null), 14 | assert(onTabTap != null), 15 | super(key: key); 16 | 17 | @override 18 | Widget build(BuildContext context) { 19 | List _tabs = [AppTab.sessions, AppTab.about, AppTab.map, AppTab.enquete]; 20 | 21 | return Container( 22 | alignment: Alignment.center, 23 | color: Theme.of(context).primaryColor, 24 | padding: EdgeInsets.all(8.0), 25 | child: ListView( 26 | children: 27 | _tabs.map((AppTab tab) => _buildMenuItem(tab, context)).toList(), 28 | ), 29 | ); 30 | } 31 | 32 | Widget _buildMenuItem(AppTab tab, BuildContext context) { 33 | final menuString = tab.toString().replaceAll('AppTab.', '').toUpperCase(); 34 | final ThemeData theme = Theme.of(context); 35 | return GestureDetector( 36 | child: tab == currentTab 37 | ? Container( 38 | width: 328.0, 39 | height: 48.0, 40 | margin: EdgeInsets.fromLTRB(16, 16, 16, 0), 41 | child: Material( 42 | color: Color.fromRGBO(255, 255, 255, 0.1), 43 | child: InkWell( 44 | highlightColor: Color.fromRGBO(255, 255, 255, 0.1), 45 | splashColor: Color.fromRGBO(255, 255, 255, 0.1), 46 | onTap: () => onTabTap(tab), 47 | child: Center( 48 | child: Text( 49 | menuString, 50 | style: theme.textTheme.body1.copyWith( 51 | color: kPrimaryTextColor, 52 | fontSize: 20, 53 | ), 54 | textAlign: TextAlign.center, 55 | ), 56 | ), 57 | ), 58 | ), 59 | ) : Container( 60 | width: 328.0, 61 | height: 48.0, 62 | margin: EdgeInsets.fromLTRB(16, 16, 16, 0), 63 | child: Material( 64 | color: Color.fromRGBO(255, 255, 255, 0.1), 65 | child: InkWell( 66 | highlightColor: Color.fromRGBO(255, 255, 255, 0.1), 67 | splashColor: Color.fromRGBO(255, 255, 255, 0.1), 68 | onTap: () => onTabTap(tab), 69 | child: Center( 70 | child: Text( 71 | menuString, 72 | style: theme.textTheme.body2.copyWith( 73 | color: kPrimaryTextColor.withAlpha(0x66), 74 | fontSize: 20, 75 | ), 76 | textAlign: TextAlign.center, 77 | ), 78 | ), 79 | ), 80 | ), 81 | ), 82 | ); 83 | } 84 | } 85 | -------------------------------------------------------------------------------- /app/lib/features/session.dart: -------------------------------------------------------------------------------- 1 | /// Copyright (c) 2019 DeNA Co., Ltd. 2 | /// Licensed under the MIT License 3 | 4 | import 'package:app/features/widget/loading_indicator.dart'; 5 | import 'package:app/localizations.dart'; 6 | import 'package:app/theme.dart'; 7 | import 'package:cached_network_image/cached_network_image.dart'; 8 | import 'package:commons/commons.dart'; 9 | import 'package:flutter/material.dart'; 10 | import 'package:flutter_advanced_networkimage/flutter_advanced_networkimage.dart'; 11 | import 'package:flutter_advanced_networkimage/transition_to_image.dart'; 12 | import 'package:repository/entity/business.dart'; 13 | import 'package:repository/entity/person.dart'; 14 | import 'package:repository/entity/session.dart'; 15 | import 'package:repository/entity/sns.dart'; 16 | import 'package:url_launcher/url_launcher.dart'; 17 | import 'package:app/features/ui/LinkTextSpan.dart'; 18 | 19 | class SessionPage extends StatelessWidget { 20 | final Session session; 21 | 22 | const SessionPage({Key key, this.session}) : super(key: key); 23 | 24 | @override 25 | Widget build(BuildContext context) { 26 | debugPrint("$session"); 27 | 28 | return Scaffold( 29 | appBar: AppBar( 30 | elevation: 0.0, 31 | title: Text(AppLocalizations.of(context).text("session_detail")), 32 | ), 33 | backgroundColor: kPrimaryColor, 34 | body: Container( 35 | decoration: BoxDecoration( 36 | color: kPrimaryBackgroundColor, 37 | borderRadius: BorderRadius.only( 38 | topLeft: Radius.circular(16.0), topRight: Radius.circular(16.0)), 39 | ), 40 | child: Container( 41 | child: ListView( 42 | padding: EdgeInsets.all(16.0), 43 | children: List() 44 | ..add(Text( 45 | AppLocalizations.of(context).text("title"), 46 | style: Theme.of(context).textTheme.subhead, 47 | )) 48 | ..add(SizedBox(height: 8.0)) 49 | ..addAll(buildTitle(context, session.business)) 50 | ..add(SizedBox(height: 40.0)) 51 | ..add(Text( 52 | AppLocalizations.of(context).text("speaker"), 53 | style: Theme.of(context).textTheme.subhead, 54 | )) 55 | ..add(SizedBox(height: 16.0)) 56 | ..addAll(buildPersons(context, session.persons)), 57 | ), 58 | ), 59 | ), 60 | ); 61 | } 62 | 63 | List buildTitle(BuildContext context, Business business) { 64 | String stageSchedule = "${business.stage} ${business.startAt} - ${business.endAt}"; 65 | return [ 66 | Text( 67 | business.title, 68 | style: Theme.of(context).textTheme.title, 69 | ), 70 | SizedBox(height: 24.0), 71 | Text(stageSchedule), 72 | SizedBox(height: 16.0), 73 | business.category == null 74 | ? Container() 75 | : Container( 76 | padding: EdgeInsets.fromLTRB(16.0, 8.0, 16.0, 8.0), 77 | decoration: BoxDecoration( 78 | color: kSecondaryBackgroundColor, 79 | borderRadius: BorderRadius.all(Radius.circular(8.0)), 80 | ), 81 | child: Column( 82 | children: [ 83 | Row( 84 | children: [ 85 | SizedBox( 86 | height: 36.0, 87 | width: 36.0, 88 | child: TransitionToImage( 89 | image: AdvancedNetworkImage( 90 | business.category.icon, 91 | loadFailedCallback: () { 92 | debugPrint('Could not get ${business.category.icon}'); 93 | }, 94 | ), 95 | fit: BoxFit.scaleDown, 96 | loadingWidget: LoadingIndicator(), 97 | placeholder: Icon( 98 | Icons.category, 99 | color: Colors.grey, 100 | ), 101 | ), 102 | ), 103 | SizedBox(width: 8.0), 104 | Text(business.category.text), 105 | ], 106 | ), 107 | ListView.builder( 108 | shrinkWrap: true, 109 | physics: NeverScrollableScrollPhysics(), 110 | itemCount: (business.services != null) ? business.services.length : 0, 111 | itemBuilder: (context, int index) { 112 | return Container( 113 | margin: EdgeInsets.only(top: 8.0), 114 | child: RichText( 115 | text: LinkTextSpan( 116 | style: Theme.of(context).textTheme.body1.copyWith( 117 | color: Theme.of(context).accentColor, 118 | fontSize: 16.0, 119 | ), 120 | url: business.services[index].url, 121 | text: business.services[index].name, 122 | ), 123 | ), 124 | ); 125 | }, 126 | ), 127 | ] 128 | ), 129 | ), 130 | SizedBox(height: 31.0), 131 | Text( 132 | business.text, 133 | style: Theme.of(context).textTheme.body1.copyWith(fontSize: 16.0), 134 | ), 135 | SizedBox(height: 16.0), 136 | Wrap( 137 | spacing: 8.0, 138 | children: business.tags 139 | .map((tag) => Text( 140 | tag, 141 | style: Theme.of(context) 142 | .textTheme 143 | .body1 144 | .copyWith(color: kTextSubColor), 145 | )) 146 | .toList()) 147 | ]; 148 | } 149 | 150 | List buildPersons(BuildContext context, List persons) { 151 | return session.persons 152 | .map((person) => buildPerson(context, person)) 153 | .toList(); 154 | } 155 | 156 | Widget buildPerson(BuildContext context, Person person) { 157 | return Container( 158 | padding: EdgeInsets.symmetric(vertical: 8.0), 159 | child: Column( 160 | mainAxisAlignment: MainAxisAlignment.start, 161 | crossAxisAlignment: CrossAxisAlignment.stretch, 162 | children: [ 163 | Row( 164 | mainAxisAlignment: MainAxisAlignment.start, 165 | children: [ 166 | Container( 167 | width: 80.0, 168 | height: 80.0, 169 | child: Strings.isNullOrEmpty(person.imageUrl) 170 | ? FittedBox( 171 | child: Icon( 172 | Icons.person, 173 | color: Colors.grey, 174 | ), 175 | fit: BoxFit.fill, 176 | ) 177 | : TransitionToImage( 178 | image: AdvancedNetworkImage( 179 | person.imageUrl, 180 | loadFailedCallback: () { 181 | debugPrint('Could not get ${person.imageUrl}'); 182 | }, 183 | ), 184 | fit: BoxFit.contain, 185 | loadingWidget: LoadingIndicator(), 186 | placeholder: Icon( 187 | Icons.person, 188 | color: Colors.grey, 189 | ), 190 | ), 191 | ), 192 | Expanded( 193 | child: Container( 194 | padding: EdgeInsets.only(left: 16.0), 195 | child: Column( 196 | crossAxisAlignment: CrossAxisAlignment.start, 197 | children: [ 198 | Padding( 199 | padding: EdgeInsets.only(left: 6.0), 200 | child: Text( 201 | person.name, 202 | style: Theme.of(context).textTheme.title, 203 | ), 204 | ), 205 | buildSns(person.sns), 206 | ], 207 | ), 208 | ), 209 | ), 210 | ], 211 | ), 212 | SizedBox(height: 16.0), 213 | Container( 214 | decoration: BoxDecoration( 215 | color: kSecondaryBackgroundColor, 216 | borderRadius: BorderRadius.all(Radius.circular(8.0)), 217 | ), 218 | padding: EdgeInsets.all(8.0), 219 | child: Text(person.profile), 220 | ), 221 | SizedBox(height: 16.0), 222 | ], 223 | ), 224 | ); 225 | } 226 | 227 | Widget buildSns(List snses) { 228 | if (snses == null) return Container(); 229 | return Row( 230 | mainAxisAlignment: MainAxisAlignment.start, 231 | children: snses 232 | .map( 233 | (sns) => SizedBox( 234 | child: IconButton( 235 | icon: TransitionToImage( 236 | image: AdvancedNetworkImage( 237 | sns.icon, 238 | loadFailedCallback: () { 239 | debugPrint('Could not get ${sns.icon}'); 240 | }, 241 | ), 242 | fit: BoxFit.contain, 243 | loadingWidget: LoadingIndicator(), 244 | placeholder: Icon(Icons.link), 245 | ), 246 | onPressed: () async { 247 | if (await canLaunch(sns.url)) { 248 | launch(sns.url, forceSafariVC: false); 249 | } else { 250 | debugPrint('Could not launch $sns.url'); 251 | } 252 | }, 253 | ), 254 | ), 255 | ) 256 | .toList(), 257 | ); 258 | } 259 | 260 | _launchUrl(String url) async { 261 | if (await canLaunch(url)) { 262 | await launch(url); 263 | } else { 264 | throw 'Could not launch $url'; 265 | } 266 | } 267 | } 268 | -------------------------------------------------------------------------------- /app/lib/features/splash.dart: -------------------------------------------------------------------------------- 1 | /// Copyright (c) 2019 DeNA Co., Ltd. 2 | /// Licensed under the MIT License 3 | 4 | import 'package:app/routes.dart'; 5 | import 'package:flutter/material.dart'; 6 | import 'package:flare_flutter/flare_actor.dart'; 7 | import 'package:shared_preferences/shared_preferences.dart'; 8 | 9 | class Splash extends StatelessWidget { 10 | @override 11 | Widget build(BuildContext context) { 12 | // Flare Animation Name 13 | String _animationName = "Logo"; 14 | return Scaffold( 15 | body: GestureDetector( 16 | onTap: () { 17 | _checkSkipAnimation(context); 18 | }, 19 | child: Center( 20 | child: FlareActor( 21 | "assets/animations/Logo.flr", 22 | animation: _animationName, 23 | fit: BoxFit.contain, 24 | callback: (string) { 25 | debugPrint("FlareCompleted:$string"); 26 | Navigator.of(context).pushReplacementNamed(AppRoutes.home); 27 | _setPrefs(true); 28 | }, 29 | ), 30 | ), 31 | ), 32 | ); 33 | } 34 | 35 | Future _checkSkipAnimation(BuildContext context) async { 36 | SharedPreferences prefs = await SharedPreferences.getInstance(); 37 | bool canSkipAnimation = prefs.getBool('can_skip_animation'); 38 | if (canSkipAnimation == null) { 39 | canSkipAnimation = false; 40 | } 41 | if (canSkipAnimation) { 42 | Navigator.of(context).pushReplacementNamed(AppRoutes.home); 43 | } 44 | } 45 | 46 | _setPrefs(bool canSkipAnimation) async { 47 | SharedPreferences prefs = await SharedPreferences.getInstance(); 48 | prefs.setBool('can_skip_animation', canSkipAnimation); 49 | } 50 | } 51 | -------------------------------------------------------------------------------- /app/lib/features/ui/LinkTextSpan.dart: -------------------------------------------------------------------------------- 1 | /// Copyright (c) 2019 DeNA Co., Ltd. 2 | /// Licensed under the MIT License 3 | 4 | import 'package:flutter/gestures.dart'; 5 | import 'package:flutter/material.dart'; 6 | import 'package:url_launcher/url_launcher.dart'; 7 | 8 | class LinkTextSpan extends TextSpan { 9 | 10 | // Beware! 11 | // 12 | // This class is only safe because the TapGestureRecognizer is not 13 | // given a deadline and therefore never allocates any resources. 14 | // 15 | // In any other situation -- setting a deadline, using any of the less trivial 16 | // recognizers, etc -- you would have to manage the gesture recognizer's 17 | // lifetime and call dispose() when the TextSpan was no longer being rendered. 18 | // 19 | // Since TextSpan itself is @immutable, this means that you would have to 20 | // manage the recognizer from outside the TextSpan, e.g. in the State of a 21 | // stateful widget that then hands the recognizer to the TextSpan. 22 | 23 | LinkTextSpan({ TextStyle style, String url, String text }) : super( 24 | style: style, 25 | text: text ?? url, 26 | recognizer: TapGestureRecognizer()..onTap = () async { 27 | if (await canLaunch(url)) { 28 | launch(url, forceSafariVC: false); 29 | } else { 30 | debugPrint('Could not launch $url'); 31 | } 32 | } 33 | ); 34 | } -------------------------------------------------------------------------------- /app/lib/features/widget/backdrop.dart: -------------------------------------------------------------------------------- 1 | import 'dart:io'; 2 | 3 | import 'package:flutter/material.dart'; 4 | import 'package:meta/meta.dart'; 5 | import 'package:architecture/app_tab.dart'; 6 | 7 | const double _kFlingVelocity = 2.0; 8 | 9 | class _FrontLayer extends StatelessWidget { 10 | const _FrontLayer({ 11 | Key key, 12 | this.onTap, 13 | this.child, 14 | }) : super(key: key); 15 | 16 | final VoidCallback onTap; 17 | final Widget child; 18 | 19 | @override 20 | Widget build(BuildContext context) { 21 | return Material( 22 | elevation: 16.0, 23 | shape: RoundedRectangleBorder( 24 | borderRadius: BorderRadius.only( 25 | topLeft: Radius.circular(16.0), topRight: Radius.circular(16.0)), 26 | ), 27 | child: Column( 28 | crossAxisAlignment: CrossAxisAlignment.stretch, 29 | children: [ 30 | GestureDetector( 31 | behavior: HitTestBehavior.opaque, 32 | onTap: onTap, 33 | child: Container( 34 | height: 16.0, 35 | alignment: AlignmentDirectional.centerStart, 36 | ), 37 | ), 38 | Expanded( 39 | child: child, 40 | ), 41 | ], 42 | ), 43 | ); 44 | } 45 | } 46 | 47 | class _BackdropTitle extends AnimatedWidget { 48 | final Function onPress; 49 | final Widget frontTitle; 50 | final Widget backTitle; 51 | 52 | const _BackdropTitle({ 53 | Key key, 54 | Listenable listenable, 55 | this.onPress, 56 | @required this.frontTitle, 57 | @required this.backTitle, 58 | }) : assert(frontTitle != null), 59 | assert(backTitle != null), 60 | super(key: key, listenable: listenable); 61 | 62 | @override 63 | Widget build(BuildContext context) { 64 | final Animation animation = this.listenable; 65 | 66 | return DefaultTextStyle( 67 | style: Theme.of(context).primaryTextTheme.title, 68 | softWrap: false, 69 | overflow: TextOverflow.ellipsis, 70 | child: Stack( 71 | children: [ 72 | Opacity( 73 | opacity: CurvedAnimation( 74 | parent: ReverseAnimation(animation), 75 | curve: Interval(0.5, 1.0), 76 | ).value, 77 | // XXX: workaround for centering offsets for iOS 78 | child: Platform.isIOS 79 | ? Container( 80 | child: backTitle, 81 | padding: EdgeInsets.only(left: 32.0), 82 | ) 83 | : backTitle, 84 | ), 85 | Opacity( 86 | opacity: CurvedAnimation( 87 | parent: animation, 88 | curve: Interval(0.5, 1.0), 89 | ).value, 90 | child: frontTitle, 91 | ), 92 | ], 93 | ), 94 | ); 95 | } 96 | } 97 | 98 | /// Builds a Backdrop. 99 | /// 100 | /// A Backdrop widget has two layers, front and back. The front layer is shown 101 | /// by default, and slides down to show the back layer, from which a user 102 | /// can make a selection. The user can also configure the titles for when the 103 | /// front or back layer is showing. 104 | class Backdrop extends StatefulWidget { 105 | final AppTab currentTab; 106 | final Widget frontLayer; 107 | final Widget backLayer; 108 | final Widget frontTitle; 109 | final Widget backTitle; 110 | 111 | const Backdrop({ 112 | @required this.currentTab, 113 | @required this.frontLayer, 114 | @required this.backLayer, 115 | @required this.frontTitle, 116 | @required this.backTitle, 117 | }) : assert(currentTab != null), 118 | assert(frontLayer != null), 119 | assert(backLayer != null), 120 | assert(frontTitle != null), 121 | assert(backTitle != null); 122 | 123 | @override 124 | _BackdropState createState() => _BackdropState(); 125 | } 126 | 127 | class _BackdropState extends State 128 | with SingleTickerProviderStateMixin { 129 | final GlobalKey _backdropKey = GlobalKey(debugLabel: 'Backdrop'); 130 | AnimationController _controller; 131 | 132 | @override 133 | void initState() { 134 | super.initState(); 135 | _controller = AnimationController( 136 | duration: Duration(milliseconds: 300), 137 | value: 1.0, 138 | vsync: this, 139 | ); 140 | } 141 | 142 | @override 143 | void didUpdateWidget(Backdrop old) { 144 | super.didUpdateWidget(old); 145 | 146 | if (widget.currentTab != old.currentTab) { 147 | _toggleBackdropLayerVisibility(); 148 | } else if (!_frontLayerVisible) { 149 | _controller.fling(velocity: _kFlingVelocity); 150 | } 151 | } 152 | 153 | @override 154 | void dispose() { 155 | _controller.dispose(); 156 | super.dispose(); 157 | } 158 | 159 | bool get _frontLayerVisible { 160 | final AnimationStatus status = _controller.status; 161 | return status == AnimationStatus.completed || 162 | status == AnimationStatus.forward; 163 | } 164 | 165 | void _toggleBackdropLayerVisibility() { 166 | _controller.fling( 167 | velocity: _frontLayerVisible ? -_kFlingVelocity : _kFlingVelocity, 168 | ); 169 | } 170 | 171 | Widget _buildStack(BuildContext context, BoxConstraints constraints) { 172 | // XXX: workaround for Semi-modal style 173 | // const double layerTitleHeight = 48.0; 174 | double layerTitleHeight = constraints.biggest.height - 280.0; 175 | final Size layerSize = constraints.biggest; 176 | final double layerTop = layerSize.height - layerTitleHeight; 177 | 178 | debugPrint('layerTop:${layerTop}'); 179 | debugPrint('layerSize.height:${layerSize.height}'); 180 | debugPrint('layerTop - layerSize.height:${layerTop - layerSize.height}'); 181 | 182 | Animation layerAnimation = RelativeRectTween( 183 | begin: RelativeRect.fromLTRB( 184 | 0.0, layerTop, 0.0, layerTop - layerSize.height), 185 | end: RelativeRect.fromLTRB(0.0, 0.0, 0.0, 0.0), 186 | ).animate(_controller.view); 187 | 188 | return Stack( 189 | key: _backdropKey, 190 | children: [ 191 | ExcludeSemantics( 192 | child: widget.backLayer, 193 | excluding: _frontLayerVisible, 194 | ), 195 | PositionedTransition( 196 | rect: layerAnimation, 197 | child: _FrontLayer( 198 | onTap: _toggleBackdropLayerVisibility, 199 | child: widget.frontLayer, 200 | ), 201 | ), 202 | ], 203 | ); 204 | } 205 | 206 | @override 207 | Widget build(BuildContext context) { 208 | var appBar = AppBar( 209 | elevation: 0.0, 210 | titleSpacing: 0.0, 211 | leading: IconButton( 212 | icon: AnimatedIcon( 213 | icon: AnimatedIcons.close_menu, 214 | progress: _controller.view, 215 | ), 216 | onPressed: _toggleBackdropLayerVisibility, 217 | ), 218 | title: _BackdropTitle( 219 | listenable: _controller.view, 220 | onPress: _toggleBackdropLayerVisibility, 221 | frontTitle: widget.frontTitle, 222 | backTitle: widget.backTitle, 223 | ), 224 | ); 225 | return Scaffold( 226 | appBar: appBar, 227 | body: LayoutBuilder( 228 | builder: _buildStack, 229 | ), 230 | ); 231 | } 232 | } 233 | -------------------------------------------------------------------------------- /app/lib/features/widget/front_layer_title.dart: -------------------------------------------------------------------------------- 1 | /// Copyright (c) 2019 DeNA Co., Ltd. 2 | /// Licensed under the MIT License 3 | 4 | import 'package:app/theme.dart'; 5 | import 'package:flutter/material.dart'; 6 | 7 | class FrontLayerTitle extends StatelessWidget { 8 | final String title; 9 | 10 | FrontLayerTitle({Key key, @required this.title}) 11 | : assert(title != null), 12 | super(key: key); 13 | 14 | @override 15 | Widget build(BuildContext context) { 16 | return Container( 17 | padding: EdgeInsets.only(left: 16.0, bottom: 16.0), 18 | alignment: Alignment.centerLeft, 19 | child: Text( 20 | title, 21 | style: Theme.of(context).textTheme.subhead, 22 | ), 23 | ); 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /app/lib/features/widget/loading_indicator.dart: -------------------------------------------------------------------------------- 1 | /// Copyright (c) 2019 DeNA Co., Ltd. 2 | /// Licensed under the MIT License 3 | 4 | import 'package:flutter/cupertino.dart'; 5 | import 'package:flutter/material.dart'; 6 | 7 | class LoadingIndicator extends StatelessWidget { 8 | LoadingIndicator({Key key}) : super(key: key); 9 | 10 | @override 11 | Widget build(BuildContext context) { 12 | bool isIOS = Theme.of(context).platform == TargetPlatform.iOS; 13 | return Center( 14 | child: isIOS ? CupertinoActivityIndicator() : CircularProgressIndicator() 15 | ); 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /app/lib/keys.dart: -------------------------------------------------------------------------------- 1 | /// Copyright (c) 2019 DeNA Co., Ltd. 2 | /// Licensed under the MIT License 3 | 4 | import 'package:flutter/material.dart'; 5 | 6 | class AppKeys { 7 | // Pages 8 | static final homePage = const Key('_homePage_'); 9 | static final sessionsPage = const Key('_sessionsPage_'); 10 | static final sessionPage = const Key('_sessionPage_'); 11 | static final stagesPage = const Key('_stagesPage_'); 12 | static final personPage = const Key('_personPage_'); 13 | static final aboutPage = const Key('_aboutPage_'); 14 | 15 | // Tabs 16 | static final tabs = const Key('_tabs_'); 17 | static final topTab = const Key('_topTab_'); 18 | static final sessionsTab = const Key('_sessionsTab_'); 19 | static final stagesTab= const Key('_stagesTab_'); 20 | static final mapTab = const Key('_mapTab_'); 21 | 22 | } -------------------------------------------------------------------------------- /app/lib/localizations.dart: -------------------------------------------------------------------------------- 1 | /// Copyright (c) 2019 DeNA Co., Ltd. 2 | /// Licensed under the MIT License 3 | 4 | import 'dart:convert'; 5 | 6 | import 'package:flutter/foundation.dart'; 7 | import 'package:flutter/material.dart'; 8 | import 'package:flutter/services.dart' show rootBundle; 9 | 10 | class AppLocalizationsDelegate extends LocalizationsDelegate { 11 | AppLocalizationsDelegate(); 12 | 13 | @override 14 | bool isSupported(Locale locale) => 15 | ['en', 'ja'].contains(locale.languageCode); 16 | 17 | @override 18 | Future load(Locale locale) { 19 | // return SynchronousFuture(AppLocalizations(locale)); 20 | return AppLocalizations.load(locale); 21 | } 22 | 23 | @override 24 | bool shouldReload(AppLocalizationsDelegate old) => false; 25 | } 26 | 27 | class AppLocalizations { 28 | final Locale locale; 29 | static Map _localisedValues; 30 | 31 | AppLocalizations(this.locale); 32 | 33 | static Future load(Locale locale) async { 34 | AppLocalizations appTranslations = AppLocalizations(locale); 35 | String jsonContent; 36 | try { 37 | jsonContent = await rootBundle.loadString("assets/locales/messages_${locale.languageCode}.json", cache: false); 38 | } catch (e) { 39 | jsonContent = await rootBundle.loadString("assets/locales/messages.json", cache: false); 40 | } 41 | _localisedValues = json.decode(jsonContent); 42 | return appTranslations; 43 | } 44 | 45 | get currentLocale => locale; 46 | 47 | static AppLocalizations of(BuildContext context) { 48 | return Localizations.of(context, AppLocalizations); 49 | } 50 | 51 | String text(String key) { 52 | // workaround 53 | if (_localisedValues == null) { 54 | return "$key not found"; 55 | } 56 | return _localisedValues[key] ?? "$key not found"; 57 | } 58 | 59 | // static Map> _localizedValues = { 60 | // 'en': { 61 | // 'title': 'DeNA TechCon', 62 | // }, 63 | // 'ja': { 64 | // 'title': "DeNA TechCon", 65 | // }, 66 | // }; 67 | // 68 | // String get title { 69 | // return _localizedValues[locale.languageCode]['title']; 70 | // } 71 | } 72 | -------------------------------------------------------------------------------- /app/lib/main.dart: -------------------------------------------------------------------------------- 1 | /// Copyright (c) 2019 DeNA Co., Ltd. 2 | /// Licensed under the MIT License 3 | 4 | import 'dart:async'; 5 | 6 | import 'package:app/features/about.dart'; 7 | import 'package:app/features/code_of_conduct.dart'; 8 | import 'package:app/features/home.dart'; 9 | import 'package:app/features/splash.dart'; 10 | import 'package:app/localizations.dart'; 11 | import 'package:app/routes.dart'; 12 | import 'package:app/theme.dart'; 13 | import 'package:flutter/material.dart'; 14 | import 'package:flutter_crashlytics/flutter_crashlytics.dart'; 15 | import 'package:firebase_analytics/firebase_analytics.dart'; 16 | import 'package:firebase_analytics/observer.dart'; 17 | import 'package:architecture/state.dart'; 18 | import 'package:architecture/middleware.dart'; 19 | import 'package:architecture/reducer.dart'; 20 | import 'package:redux/redux.dart'; 21 | import 'package:flutter_redux/flutter_redux.dart'; 22 | import 'package:flutter_localizations/flutter_localizations.dart'; 23 | import 'package:repository_cache/repository_cache.dart'; 24 | import 'package:firebase_messaging/firebase_messaging.dart'; 25 | import 'package:repository_local/repository_local.dart'; 26 | 27 | Future main() async { 28 | // debugPaintSizeEnabled = true; 29 | // debugPaintBaselinesEnabled = true; 30 | 31 | // flutter_crashlytics | Flutter Package https://pub.dartlang.org/packages/flutter_crashlytics 32 | bool isInDebugMode = false; 33 | 34 | FlutterError.onError = (FlutterErrorDetails details) { 35 | if (isInDebugMode) { 36 | // In development mode simply print to console. 37 | FlutterError.dumpErrorToConsole(details); 38 | } else { 39 | // In production mode report to the application zone to report to 40 | // Crashlytics. 41 | Zone.current.handleUncaughtError(details.exception, details.stack); 42 | } 43 | }; 44 | 45 | await FlutterCrashlytics().initialize(); 46 | 47 | runZoned>(() async { 48 | runApp(App()); 49 | }, onError: (error, stackTrace) async { 50 | // Whenever an error occurs, call the `reportCrash` function. This will send 51 | // Dart errors to our dev console or Crashlytics depending on the environment. 52 | await FlutterCrashlytics().reportCrash(error, stackTrace, forceCrash: true); 53 | }); 54 | } 55 | 56 | class App extends StatelessWidget { 57 | static FirebaseAnalytics analytics = FirebaseAnalytics(); 58 | static FirebaseAnalyticsObserver observer = 59 | FirebaseAnalyticsObserver(analytics: analytics); 60 | static FirebaseMessaging messaging = FirebaseMessaging(); 61 | 62 | final Store store = Store( 63 | appReducer, 64 | initialState: AppState.initial(), 65 | middleware: createStoreMiddleware(RepositoryLocal()), 66 | ); 67 | 68 | @override 69 | Widget build(BuildContext context) { 70 | return StoreProvider( 71 | store: store, 72 | child: MaterialApp( 73 | localizationsDelegates: [ 74 | // ... app-specific localization delegate[s] here 75 | AppLocalizationsDelegate(), 76 | GlobalMaterialLocalizations.delegate, 77 | GlobalWidgetsLocalizations.delegate, 78 | ], 79 | supportedLocales: [ 80 | Locale('en', 'US'), // English 81 | Locale('ja', 'JP'), // Japanese 82 | ], 83 | theme: AppTheme.theme, 84 | navigatorObservers: [observer], 85 | routes: { 86 | AppRoutes.splash: (_) => Splash(), 87 | AppRoutes.home: (_) => HomePage( 88 | analytics: analytics, observer: observer, messaging: messaging), 89 | AppRoutes.about: (_) => AboutPage(), 90 | AppRoutes.codeOfConduct: (_) => CodeOfConductPage(), 91 | }, 92 | builder: (context, child) { 93 | // Disable larger font because the layout collapses. 94 | // - Android: Settings -> Display-> Font Size 95 | // - iOS: Settings -> General -> Accessibility -> Larger Text 96 | return MediaQuery( 97 | child: child, 98 | data: MediaQuery.of(context).copyWith(textScaleFactor: 1.0), 99 | ); 100 | }, 101 | ), 102 | ); 103 | } 104 | } 105 | -------------------------------------------------------------------------------- /app/lib/routes.dart: -------------------------------------------------------------------------------- 1 | /// Copyright (c) 2019 DeNA Co., Ltd. 2 | /// Licensed under the MIT License 3 | 4 | class AppRoutes { 5 | static final splash = "/"; 6 | static final home = "/home"; 7 | static final sessions = "/sessions"; 8 | static final about = "/about"; 9 | static final codeOfConduct = "/code_of_conduct"; 10 | static final license = "/license"; 11 | } 12 | -------------------------------------------------------------------------------- /app/lib/theme.dart: -------------------------------------------------------------------------------- 1 | /// Copyright (c) 2019 DeNA Co., Ltd. 2 | /// Licensed under the MIT License 3 | 4 | import 'package:flutter/material.dart'; 5 | 6 | const kPrimaryColor = Color(0xFF0092CA); 7 | const kPrimaryTextColor = Colors.white; 8 | const kPrimaryBackgroundColor = Colors.white; 9 | const kSecondaryBackgroundColor = Color(0xFFF5F5F5); 10 | 11 | const kTextMainColor = Color(0xFF5B6E75); 12 | const kTextSubColor = Color.fromRGBO(91, 110, 117, 0.7); 13 | const kTextTitleColor = Color.fromRGBO(91, 110, 117, 0.7); 14 | 15 | // Timetable color 16 | const kTimetableHeaderBackgroundColor = Color(0xFFEDF2F4); 17 | const kTimetableBorderColor = Color(0xFFE0EAEE); 18 | 19 | class AppTheme { 20 | static get theme { 21 | final originalTextTheme = ThemeData.light().textTheme.apply( 22 | fontFamily: 'Montserrat', 23 | bodyColor: kTextMainColor, 24 | displayColor: kTextMainColor); 25 | 26 | return new ThemeData.light().copyWith( 27 | primaryColor: kPrimaryColor, 28 | accentColor: kPrimaryColor, 29 | 30 | primaryTextTheme: originalTextTheme.copyWith( 31 | title: originalTextTheme.title 32 | .copyWith(fontSize: 18.0, color: kPrimaryTextColor)), 33 | 34 | textTheme: originalTextTheme.copyWith( 35 | title: originalTextTheme.title, 36 | subhead: originalTextTheme.subhead.copyWith(color: kTextSubColor), 37 | body1: originalTextTheme.body1, 38 | body2: originalTextTheme.body2, 39 | caption: originalTextTheme.caption.copyWith(color: kTextSubColor), 40 | ), 41 | 42 | ); 43 | } 44 | } 45 | -------------------------------------------------------------------------------- /app/pubspec.yaml: -------------------------------------------------------------------------------- 1 | name: app 2 | description: DeNA TechCon App 3 | 4 | # The following defines the version and build number for your application. 5 | # A version number is three numbers separated by dots, like 1.2.43 6 | # followed by an optional build number separated by a +. 7 | # Both the version and the builder number may be overridden in flutter 8 | # build by specifying --build-name and --build-number, respectively. 9 | # Read more about versioning at semver.org. 10 | version: 1.0.2+7 11 | 12 | environment: 13 | sdk: ">=2.0.0-dev.68.0 <3.0.0" 14 | 15 | dependencies: 16 | flutter: 17 | sdk: flutter 18 | flutter_localizations: 19 | sdk: flutter 20 | 21 | cupertino_icons: ^0.1.2 22 | 23 | url_launcher: ^4.1.0+1 24 | cached_network_image: ^0.5.1 25 | flutter_advanced_networkimage: ^0.4.0-alpha 26 | 27 | # google_maps_flutter: ^0.0.3+3 28 | google_maps_flutter: 29 | path: ../plugins/packages/google_maps_flutter/ 30 | 31 | package_info: ^0.3.2 32 | flare_flutter: 33 | 34 | firebase_messaging: ^2.1.0 35 | firebase_analytics: ^1.0.6 36 | flutter_crashlytics: ^0.1.1 37 | 38 | shared_preferences: ^0.4.3 39 | 40 | commons: 41 | path: ../commons 42 | architecture: 43 | path: ../architecture 44 | repository_local: 45 | path: ../repository_local 46 | repository_cache: 47 | path: ../repository_cache 48 | repository: 49 | path: ../repository 50 | 51 | dev_dependencies: 52 | flutter_test: 53 | sdk: flutter 54 | 55 | # TIPS: Because it causes an error in LicensePage, disable it when not using it. 56 | # flutter_launcher_icons: ^0.7.0 57 | 58 | flutter: 59 | uses-material-design: true 60 | 61 | assets: 62 | - assets/images/ic_launcher.png 63 | - assets/images/stage_map.png 64 | - assets/images/message.png 65 | - assets/images/logo_shift_up.png 66 | - assets/images/logo.png 67 | - assets/images/img_energy_drink.png 68 | 69 | - assets/animations/Logo.flr 70 | 71 | - assets/locales/messages.json 72 | 73 | fonts: 74 | - family: Montserrat 75 | fonts: 76 | - asset: assets/fonts/Montserrat-Regular.ttf 77 | - asset: assets/fonts/Montserrat-Medium.ttf 78 | weight: 500 79 | # - asset: assets/fonts/Montserrat-Bold.ttf 80 | # weight: 700 81 | # - asset: assets/fonts/Montserrat-Italic.ttf 82 | # style: italic 83 | 84 | -------------------------------------------------------------------------------- /architecture/.gitignore: -------------------------------------------------------------------------------- 1 | .DS_Store 2 | .dart_tool/ 3 | 4 | .packages 5 | .pub/ 6 | 7 | build/ 8 | ios/.generated/ 9 | ios/Flutter/Generated.xcconfig 10 | ios/Runner/GeneratedPluginRegistrant.* 11 | -------------------------------------------------------------------------------- /architecture/.metadata: -------------------------------------------------------------------------------- 1 | # This file tracks properties of this Flutter project. 2 | # Used by Flutter tool to assess capabilities and perform upgrades etc. 3 | # 4 | # This file should be version controlled and should not be manually edited. 5 | 6 | version: 7 | revision: 5391447fae6209bb21a89e6a5a6583cac1af9b4b 8 | channel: beta 9 | 10 | project_type: package 11 | -------------------------------------------------------------------------------- /architecture/CHANGELOG.md: -------------------------------------------------------------------------------- 1 | ## [0.0.1] - TODO: Add release date. 2 | 3 | * TODO: Describe initial release. 4 | -------------------------------------------------------------------------------- /architecture/LICENSE: -------------------------------------------------------------------------------- 1 | Copyright (c) 2019 DeNA Co., Ltd. 2 | 3 | Permission is hereby granted, free of charge, to any person obtaining a copy 4 | of this software and associated documentation files (the "Software"), to deal 5 | in the Software without restriction, including without limitation the rights 6 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 7 | copies of the Software, and to permit persons to whom the Software is 8 | furnished to do so, subject to the following conditions: 9 | 10 | The above copyright notice and this permission notice shall be included in 11 | all copies or substantial portions of the Software. 12 | 13 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 14 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 15 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 16 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 17 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 18 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 19 | THE SOFTWARE. -------------------------------------------------------------------------------- /architecture/README.md: -------------------------------------------------------------------------------- 1 | # framework 2 | 3 | A Framework Flutter project. 4 | 5 | ## Getting Started 6 | 7 | This project is a starting point for a Dart 8 | [package](https://flutter.io/developing-packages/), 9 | a library module containing code that can be shared easily across 10 | multiple Flutter or Dart projects. 11 | 12 | For help getting started with Flutter, view our 13 | [online documentation](https://flutter.io/docs), which offers tutorials, 14 | samples, guidance on mobile development, and a full API reference. 15 | -------------------------------------------------------------------------------- /architecture/lib/actions.dart: -------------------------------------------------------------------------------- 1 | /// Copyright (c) 2019 DeNA Co., Ltd. 2 | /// Licensed under the MIT License 3 | 4 | import 'package:architecture/app_tab.dart'; 5 | import 'package:repository/entity/session.dart'; 6 | 7 | class LoadingAction {} 8 | 9 | class ErrorAction {} 10 | 11 | class SessionsLoadAction {} 12 | 13 | class SessionsLoadedAction { 14 | final List sessions; 15 | 16 | SessionsLoadedAction(this.sessions); 17 | } 18 | 19 | class SessionDetailAction { 20 | final Session session; 21 | 22 | SessionDetailAction(this.session); 23 | } 24 | 25 | class SelectBottomNavigationViewAction { 26 | final int index; 27 | 28 | SelectBottomNavigationViewAction(this.index); 29 | } 30 | 31 | class UpdateTabAction { 32 | final AppTab newTab; 33 | 34 | UpdateTabAction(this.newTab); 35 | 36 | @override 37 | String toString() { 38 | return 'UpdateTabAction{newTab: $newTab}'; 39 | } 40 | } 41 | -------------------------------------------------------------------------------- /architecture/lib/active_tab.dart: -------------------------------------------------------------------------------- 1 | /// Copyright (c) 2019 DeNA Co., Ltd. 2 | /// Licensed under the MIT License 3 | 4 | import 'package:flutter/material.dart'; 5 | import 'package:flutter_redux/flutter_redux.dart'; 6 | import 'package:architecture/app_tab.dart'; 7 | import 'package:architecture/state.dart'; 8 | import 'package:redux/redux.dart'; 9 | 10 | class ActiveTab extends StatelessWidget { 11 | final ViewModelBuilder builder; 12 | 13 | ActiveTab({Key key, @required this.builder}) : super(key: key); 14 | 15 | @override 16 | Widget build(BuildContext context) { 17 | return StoreConnector( 18 | distinct: true, 19 | converter: (Store store) => store.state.activeTab, 20 | builder: builder, 21 | ); 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /architecture/lib/app_tab.dart: -------------------------------------------------------------------------------- 1 | /// Copyright (c) 2019 DeNA Co., Ltd. 2 | /// Licensed under the MIT License 3 | 4 | enum AppTab { top, sessions, stages, persons, map, about, enquete } 5 | -------------------------------------------------------------------------------- /architecture/lib/middleware.dart: -------------------------------------------------------------------------------- 1 | /// Copyright (c) 2019 DeNA Co., Ltd. 2 | /// Licensed under the MIT License 3 | 4 | import 'package:architecture/actions.dart'; 5 | import 'package:architecture/state.dart'; 6 | import 'package:redux/redux.dart'; 7 | 8 | import 'package:repository/repository.dart'; 9 | 10 | Repository _repository; 11 | 12 | List> createStoreMiddleware(Repository repository) { 13 | _repository = repository; 14 | return [ 15 | TypedMiddleware(_load), 16 | ]; 17 | } 18 | 19 | // Sessions Load 20 | Future _load(Store store, action, NextDispatcher next) async { 21 | print('AppState.isLoading=${store.state.isLoading}'); 22 | // Dispatch a LoadingAction to show a loading spinner 23 | store.dispatch(LoadingAction()); 24 | 25 | // get session 26 | print('Loading Sessions'); 27 | var sessions = await _repository.getSessionList(); 28 | store.dispatch(SessionsLoadedAction(sessions)); 29 | print('Loaded Sessions'); 30 | 31 | next(action); 32 | print('AppState.isLoading=${store.state.isLoading}'); 33 | } 34 | -------------------------------------------------------------------------------- /architecture/lib/reducer.dart: -------------------------------------------------------------------------------- 1 | /// Copyright (c) 2019 DeNA Co., Ltd. 2 | /// Licensed under the MIT License 3 | 4 | import 'package:architecture/actions.dart'; 5 | import 'package:architecture/state.dart'; 6 | import 'package:redux/redux.dart'; 7 | 8 | 9 | /// Reducer 10 | final appReducer = combineReducers([ 11 | TypedReducer(_onLoading), 12 | TypedReducer(_onError), 13 | TypedReducer(_onLoadSessions), 14 | TypedReducer(_onLoadedSessions), 15 | TypedReducer(_onUpdateTab), 16 | ]); 17 | 18 | AppState _onLoading(AppState state, LoadingAction action) => state.copyWith(isLoading: true); 19 | 20 | AppState _onError(AppState state, ErrorAction action) => AppState.error(state); 21 | 22 | // XXX: Stateをそのまま返す... 変更が無いなら不要か? 23 | AppState _onLoadSessions(AppState state, SessionsLoadAction action) => state; 24 | 25 | AppState _onLoadedSessions(AppState state, SessionsLoadedAction action) => state.copyWith(isLoading: false, sessions: action.sessions); 26 | 27 | AppState _onUpdateTab(AppState state, UpdateTabAction action)=> state.copyWith(activeTab: action.newTab); 28 | 29 | // TODO: Define reducer by combining many smaller reducers into one! 30 | //AppState appReducer(AppState state, action) { 31 | // return new AppState( 32 | // isLoading: loadingReducer(state.isLoading, action), 33 | // sessions: sessionsReducer(state.sessions, action), 34 | // activeFilter: visibilityReducer(state.activeFilter, action), 35 | // activeTab: tabsReducer(state.activeTab, action), 36 | // ); 37 | //} 38 | 39 | -------------------------------------------------------------------------------- /architecture/lib/state.dart: -------------------------------------------------------------------------------- 1 | /// Copyright (c) 2019 DeNA Co., Ltd. 2 | /// Licensed under the MIT License 3 | 4 | import 'package:architecture/app_tab.dart'; 5 | import 'package:repository/entity/session.dart'; 6 | import 'package:meta/meta.dart'; 7 | 8 | @immutable 9 | class AppState { 10 | final bool isLoading; 11 | final bool hasError; 12 | final AppTab activeTab; 13 | final List sessions; 14 | 15 | AppState( 16 | {this.activeTab, 17 | this.isLoading = false, 18 | this.hasError = false, 19 | this.sessions}); 20 | 21 | // factory AppState.initial() => 22 | // AppState(isLoading: true, sessions: List.unmodifiable([])); 23 | factory AppState.initial() => 24 | AppState(isLoading: true, activeTab: AppTab.sessions); 25 | 26 | // factory AppState.loading() => AppState(isLoading: true); 27 | 28 | factory AppState.error(AppState state) => 29 | state.copyWith(isLoading: false, hasError: true); 30 | 31 | AppState copyWith({ 32 | bool isLoading, 33 | bool hasError, 34 | AppTab activeTab, 35 | List sessions, 36 | }) { 37 | return AppState( 38 | isLoading: isLoading ?? this.isLoading, 39 | hasError: hasError ?? this.hasError, 40 | activeTab: activeTab ?? this.activeTab, 41 | sessions: sessions ?? this.sessions, 42 | ); 43 | } 44 | } 45 | -------------------------------------------------------------------------------- /architecture/pubspec.yaml: -------------------------------------------------------------------------------- 1 | name: architecture 2 | description: A architecture Flutter project. 3 | version: 0.0.1 4 | author: 5 | homepage: 6 | 7 | environment: 8 | sdk: ">=2.0.0-dev.68.0 <3.0.0" 9 | 10 | dependencies: 11 | flutter: 12 | sdk: flutter 13 | 14 | flutter_redux: ^0.5.2 15 | 16 | repository: 17 | path: ../repository 18 | 19 | dev_dependencies: 20 | flutter_test: 21 | sdk: flutter 22 | 23 | # For information on the generic Dart part of this file, see the 24 | # following page: https://www.dartlang.org/tools/pub/pubspec 25 | 26 | # The following section is specific to Flutter. 27 | flutter: 28 | 29 | # To add assets to your package, add an assets section, like this: 30 | # assets: 31 | # - images/a_dot_burr.jpeg 32 | # - images/a_dot_ham.jpeg 33 | # 34 | # For details regarding assets in packages, see 35 | # https://flutter.io/assets-and-images/#from-packages 36 | # 37 | # An image asset can refer to one or more resolution-specific "variants", see 38 | # https://flutter.io/assets-and-images/#resolution-aware. 39 | 40 | # To add custom fonts to your package, add a fonts section here, 41 | # in this "flutter" section. Each entry in this list should have a 42 | # "family" key with the font family name, and a "fonts" key with a 43 | # list giving the asset and other descriptors for the font. For 44 | # example: 45 | # fonts: 46 | # - family: Schyler 47 | # fonts: 48 | # - asset: fonts/Schyler-Regular.ttf 49 | # - asset: fonts/Schyler-Italic.ttf 50 | # style: italic 51 | # - family: Trajan Pro 52 | # fonts: 53 | # - asset: fonts/TrajanPro.ttf 54 | # - asset: fonts/TrajanPro_Bold.ttf 55 | # weight: 700 56 | # 57 | # For details regarding fonts in packages, see 58 | # https://flutter.io/custom-fonts/#from-packages 59 | -------------------------------------------------------------------------------- /commons/.gitignore: -------------------------------------------------------------------------------- 1 | .DS_Store 2 | .dart_tool/ 3 | 4 | .packages 5 | .pub/ 6 | 7 | build/ 8 | ios/.generated/ 9 | ios/Flutter/Generated.xcconfig 10 | ios/Runner/GeneratedPluginRegistrant.* 11 | -------------------------------------------------------------------------------- /commons/.metadata: -------------------------------------------------------------------------------- 1 | # This file tracks properties of this Flutter project. 2 | # Used by Flutter tool to assess capabilities and perform upgrades etc. 3 | # 4 | # This file should be version controlled and should not be manually edited. 5 | 6 | version: 7 | revision: 5391447fae6209bb21a89e6a5a6583cac1af9b4b 8 | channel: beta 9 | 10 | project_type: package 11 | -------------------------------------------------------------------------------- /commons/CHANGELOG.md: -------------------------------------------------------------------------------- 1 | ## [0.0.1] - TODO: Add release date. 2 | 3 | * TODO: Describe initial release. 4 | -------------------------------------------------------------------------------- /commons/LICENSE: -------------------------------------------------------------------------------- 1 | Copyright (c) 2018 DeNA Co., Ltd. 2 | 3 | Permission is hereby granted, free of charge, to any person obtaining a copy 4 | of this software and associated documentation files (the "Software"), to deal 5 | in the Software without restriction, including without limitation the rights 6 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 7 | copies of the Software, and to permit persons to whom the Software is 8 | furnished to do so, subject to the following conditions: 9 | 10 | The above copyright notice and this permission notice shall be included in 11 | all copies or substantial portions of the Software. 12 | 13 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 14 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 15 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 16 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 17 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 18 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 19 | THE SOFTWARE. -------------------------------------------------------------------------------- /commons/README.md: -------------------------------------------------------------------------------- 1 | # commons 2 | 3 | A commons package. 4 | -------------------------------------------------------------------------------- /commons/lib/commons.dart: -------------------------------------------------------------------------------- 1 | /// Copyright (c) 2019 DeNA Co., Ltd. 2 | /// Licensed under the MIT License 3 | 4 | library commons; 5 | 6 | import 'dart:math'; 7 | 8 | part "preconditions.dart"; 9 | part "pair.dart"; 10 | part "lang/strings.dart"; 11 | part "lang/objects.dart"; 12 | part "util/date_util.dart"; 13 | part "util/uuid.dart"; 14 | -------------------------------------------------------------------------------- /commons/lib/lang/objects.dart: -------------------------------------------------------------------------------- 1 | /// Copyright (c) 2019 DeNA Co., Ltd. 2 | /// Licensed under the MIT License 3 | 4 | part of commons; 5 | 6 | class Objects { 7 | _Objects() {} 8 | 9 | /** 10 | * Returns the first non-null argument. If both arguments are null, an [ArgumentError] is thrown. 11 | */ 12 | static firstNonNull(first, second) { 13 | if (first != null) { 14 | return first; 15 | } else if (second != null) { 16 | return second; 17 | } 18 | 19 | throw new ArgumentError("Both arguments were null."); 20 | } 21 | 22 | /** 23 | * Invokes a function and returns null if the function would result in [NoSuchMethodError] due to a null value. 24 | * This function can be used to execute a function chain without needing to check for nulls. For example: 25 | * 26 | * var list = null; 27 | * nullSafeInvoke(() => list.reversed.isEmpty); //returns null 28 | * 29 | * NOTE: This function works by catching [NoSuchMethodError] errors because they are thrown when a method is called on a null 30 | * object. This means that these errors will not be thrown or propagate if they occur. 31 | */ 32 | static nullSafeInvoke(Function f) { 33 | try { 34 | return f(); 35 | } on NoSuchMethodError catch(e) { 36 | return null; 37 | } 38 | return null; 39 | } 40 | 41 | /** 42 | * Determines whether [object] is a primitive type. 43 | * 44 | * Primitive types detected by this function are: [null], [num] (including [int] and [double]), [String], and [bool]. 45 | */ 46 | static bool isPrimitive(object) { 47 | return identical(object, null) || object is num || object is String || 48 | identical(object, true) || identical(object, false); 49 | } 50 | } -------------------------------------------------------------------------------- /commons/lib/lang/strings.dart: -------------------------------------------------------------------------------- 1 | /// Copyright (c) 2019 DeNA Co., Ltd. 2 | /// Licensed under the MIT License 3 | 4 | part of commons; 5 | 6 | class Strings { 7 | _Strings() {} 8 | 9 | /** 10 | * Returns true if [value] is null or empty, false otherwise. 11 | */ 12 | static bool isNullOrEmpty(String value) { 13 | if (value == null || value == "") { 14 | return true; 15 | } 16 | return false; 17 | } 18 | 19 | /** 20 | * Returns [value] if it's not null, or an empty string if it is. 21 | */ 22 | static String nonNullOrEmpty(String value) { 23 | if (value == null) { 24 | return ""; 25 | } 26 | return value; 27 | } 28 | 29 | /** 30 | * Returns [value] if it's not empty, or null if it is. 31 | */ 32 | static String nonEmptyOrNull(String value) { 33 | if (value != "") { 34 | return value; 35 | } 36 | return null; 37 | } 38 | 39 | /** 40 | * Returns a new string where the last occurence of [from] in this string is replaced with [to]. 41 | * 42 | * If [from] does not match any part of the string, then the original string is returned unmodified. 43 | */ 44 | static String replaceLast(String source, Pattern from, String to) { 45 | if (source == null) { 46 | throw new ArgumentError("source String cannot be null"); 47 | } 48 | if (from == null) { 49 | throw new ArgumentError("from Pattern cannot be null"); 50 | } 51 | if (to == null) { 52 | throw new ArgumentError("to String cannot be null"); 53 | } 54 | 55 | Iterable matches = from.allMatches(source); 56 | 57 | if (matches.isEmpty) { 58 | return source; 59 | } 60 | 61 | Match match = matches.last; 62 | String matchedString = match.group(match.groupCount); 63 | 64 | int lastIndex = source.lastIndexOf(matchedString); 65 | if (lastIndex == -1) { 66 | return source; 67 | } 68 | 69 | String firstPart = source.substring(0, lastIndex); 70 | String secondPart = source.substring(lastIndex + matchedString.length, source.length); 71 | return "$firstPart$to$secondPart"; 72 | } 73 | } -------------------------------------------------------------------------------- /commons/lib/pair.dart: -------------------------------------------------------------------------------- 1 | /// Copyright (c) 2019 DeNA Co., Ltd. 2 | /// Licensed under the MIT License 3 | 4 | part of commons; 5 | 6 | /// Represents a pair. 7 | class Pair { 8 | /// Returns the first item of the pair 9 | final T1 first; 10 | 11 | /// Returns the second item of the pair 12 | final T2 second; 13 | 14 | /// Creates a new pair value with the specified items. 15 | const Pair(this.first, this.second); 16 | 17 | /// Returns a pair with the first item set to the specified value. 18 | Pair withItem1(T1 v) { 19 | return new Pair(v, second); 20 | } 21 | 22 | /// Returns a pair with the second item set to the specified value. 23 | Pair withItem2(T2 v) { 24 | return new Pair(first, v); 25 | } 26 | 27 | @override 28 | String toString() { 29 | return 'Pair{item1: $first, item2: $second}'; 30 | } 31 | 32 | @override 33 | bool operator ==(Object other) => 34 | identical(this, other) || 35 | other is Pair && 36 | runtimeType == other.runtimeType && 37 | first == other.first && 38 | second == other.second; 39 | 40 | @override 41 | int get hashCode => 42 | first.hashCode ^ 43 | second.hashCode; 44 | 45 | } -------------------------------------------------------------------------------- /commons/lib/preconditions.dart: -------------------------------------------------------------------------------- 1 | /// Copyright (c) 2019 DeNA Co., Ltd. 2 | /// Licensed under the MIT License 3 | 4 | part of commons; 5 | 6 | checkNotNull(value, [String message]) { 7 | if (value == null) { 8 | if (message != null) { 9 | throw new ArgumentError(message); 10 | } 11 | throw new ArgumentError(); 12 | } 13 | return value; 14 | } 15 | 16 | void checkArgument(bool expression, [String message]) { 17 | checkNotNull(expression, "Expression cannot be null"); 18 | if (!expression) { 19 | if (message != null) { 20 | throw new ArgumentError(message); 21 | } 22 | throw new ArgumentError(); 23 | } 24 | } -------------------------------------------------------------------------------- /commons/lib/util/date_util.dart: -------------------------------------------------------------------------------- 1 | /// Copyright (c) 2019 DeNA Co., Ltd. 2 | /// Licensed under the MIT License 3 | 4 | part of commons; 5 | 6 | class DateUtils { 7 | _DateUtils() {} 8 | 9 | static DateTime trimTime(DateTime dt) { 10 | if(dt.isUtc) { 11 | return new DateTime.utc(dt.year, dt.month, dt.day); 12 | } else { 13 | return new DateTime(dt.year, dt.month, dt.day); 14 | } 15 | } 16 | 17 | static var _daysInMonth = const [0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]; 18 | 19 | static bool _isLeapYear(int value) => 20 | value % 400 == 0 || (value % 4 == 0 && value % 100 != 0); 21 | 22 | static int daysInMonth(int year, int month) { 23 | var result = _daysInMonth[month]; 24 | if (month == 2 && _isLeapYear(year)) result++; 25 | return result; 26 | } 27 | 28 | static DateTime addMonths(DateTime dt, int value) { 29 | var r = value % 12; 30 | var q = (value - r) ~/ 12; 31 | var newYear = dt.year + q; 32 | var newMonth = dt.month + r; 33 | if (newMonth > 12) { 34 | newYear++; 35 | newMonth -= 12; 36 | } 37 | var newDay = min(dt.day, daysInMonth(newYear, newMonth)); 38 | if (dt.isUtc) { 39 | return new DateTime.utc(newYear, newMonth, newDay, dt.hour, dt.minute, 40 | dt.second, dt.millisecond, dt.microsecond); 41 | } else { 42 | return new DateTime(newYear, newMonth, newDay, dt.hour, dt.minute, 43 | dt.second, dt.millisecond, dt.microsecond); 44 | } 45 | } 46 | 47 | static DateTime firstDayOfWeek(DateTime dt, int weekday) { 48 | int offsetWeekday = DateTime.sunday == weekday ? 0 : 1; 49 | int offset = -(dt.weekday == weekday ? 0 : dt.weekday - offsetWeekday); 50 | return dt.add(new Duration(days: offset)); 51 | } 52 | 53 | static DateTime firstDayOfMonth(DateTime dt) { 54 | if (dt.isUtc) { 55 | return new DateTime.utc(dt.year, dt.month, 1, dt.hour, dt.minute, 56 | dt.second, dt.millisecond, dt.microsecond); 57 | } else { 58 | return new DateTime(dt.year, dt.month, 1, dt.hour, dt.minute, 59 | dt.second, dt.millisecond, dt.microsecond); 60 | } 61 | } 62 | 63 | 64 | // [ PHP ] ある月の第 3 日曜のような条件から日付を導出する – 行け!偏差値40プログラマー http://hensa40.cutegirl.jp/archives/1517 65 | static DateTime dayOfWeekInMonth(int year, int month, int times, int weekday) { 66 | // 指定年月の1日の日付 67 | var dt = new DateTime(year, month, 1); 68 | // 指定週の日 (1週目->1,2週目->8,3週目->15,4週目->22,4週目->29) 69 | var day = (times - 1) * 7 + 1; 70 | // 指定年月の1日の曜日と指定曜日の差 71 | var offset = weekday - dt.weekday; 72 | // 日を補正 73 | if (offset < 0) { 74 | day += offset + 7; 75 | } else { 76 | day += offset; 77 | } 78 | // 該当の日付 79 | var dayOfWeekInMonth = new DateTime(year, month, day); 80 | 81 | // 翌年/翌月の場合はnullを返す 82 | if (dayOfWeekInMonth.year > year || dayOfWeekInMonth.month > month) { 83 | return null; 84 | } 85 | 86 | return dayOfWeekInMonth; 87 | } 88 | 89 | } 90 | -------------------------------------------------------------------------------- /commons/lib/util/uuid.dart: -------------------------------------------------------------------------------- 1 | /// Copyright (c) 2019 DeNA Co., Ltd. 2 | /// Licensed under the MIT License 3 | 4 | part of commons; 5 | 6 | /// A UUID generator, useful for generating unique IDs for your Todos. 7 | /// Shamelessly extracted from the Flutter source code. 8 | /// 9 | /// This will generate unique IDs in the format: 10 | /// 11 | /// f47ac10b-58cc-4372-a567-0e02b2c3d479 12 | /// 13 | /// ### Example 14 | /// 15 | /// final String id = Uuid().generateV4(); 16 | class Uuid { 17 | final Random _random = Random(); 18 | 19 | /// Generate a version 4 (random) uuid. This is a uuid scheme that only uses 20 | /// random numbers as the source of the generated uuid. 21 | String generateV4() { 22 | // Generate xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx / 8-4-4-4-12. 23 | final int special = 8 + _random.nextInt(4); 24 | 25 | return '${_bitsDigits(16, 4)}${_bitsDigits(16, 4)}-' 26 | '${_bitsDigits(16, 4)}-' 27 | '4${_bitsDigits(12, 3)}-' 28 | '${_printDigits(special, 1)}${_bitsDigits(12, 3)}-' 29 | '${_bitsDigits(16, 4)}${_bitsDigits(16, 4)}${_bitsDigits(16, 4)}'; 30 | } 31 | 32 | String _bitsDigits(int bitCount, int digitCount) => 33 | _printDigits(_generateBits(bitCount), digitCount); 34 | 35 | int _generateBits(int bitCount) => _random.nextInt(1 << bitCount); 36 | 37 | String _printDigits(int value, int count) => 38 | value.toRadixString(16).padLeft(count, '0'); 39 | } -------------------------------------------------------------------------------- /commons/pubspec.yaml: -------------------------------------------------------------------------------- 1 | name: commons 2 | description: Commons Flutter project. 3 | version: 0.0.1 4 | author: 5 | homepage: 6 | 7 | environment: 8 | sdk: ">=2.0.0-dev.68.0 <3.0.0" 9 | 10 | dependencies: 11 | 12 | dev_dependencies: 13 | test: ^1.3.0 14 | -------------------------------------------------------------------------------- /commons/test/commons_test.dart: -------------------------------------------------------------------------------- 1 | /// Copyright (c) 2019 DeNA Co., Ltd. 2 | /// Licensed under the MIT License 3 | 4 | import 'package:commons/commons.dart'; 5 | import "package:test/test.dart"; 6 | 7 | void main() { 8 | group("checkNotNull", () { 9 | test("returns passed in value if it is not null", () { 10 | Object obj = new Object(); 11 | expect(checkNotNull(obj), same(obj)); 12 | }); 13 | 14 | test("throws error with no message when value is null and message is not provided", () { 15 | expect(() => checkNotNull(null), throwsA((ArgumentError e) => e.message == null)); 16 | }); 17 | 18 | test("throws error with custom message when value is null and custom message is provided", () { 19 | expect(() => checkNotNull(null, "a custom message"), throwsA((ArgumentError e) => e.message == "a custom message")); 20 | }); 21 | }); 22 | 23 | group("checkArgument", () { 24 | test("does not throw error when expression is true", () { 25 | expect(() => checkArgument(true), returnsNormally); 26 | }); 27 | 28 | test("throws error when expression is null", () { 29 | expect(() => checkArgument(null), throwsA((ArgumentError e) => e.message == "Expression cannot be null")); 30 | }); 31 | 32 | test("throws error with no message when expression is false and message is not provided", () { 33 | expect(() => checkArgument(false), throwsA((ArgumentError e) => e.message == null)); 34 | }); 35 | 36 | test("throws error with custom message when expression is false and custom message is provided", () { 37 | expect(() => checkArgument(false, "a custom message"), throwsA((ArgumentError e) => e.message == "a custom message")); 38 | }); 39 | }); 40 | } 41 | -------------------------------------------------------------------------------- /commons/test/lang/objects_test.dart: -------------------------------------------------------------------------------- 1 | /// Copyright (c) 2019 DeNA Co., Ltd. 2 | /// Licensed under the MIT License 3 | 4 | import "package:test/test.dart"; 5 | import "package:commons/commons.dart"; 6 | 7 | main() { 8 | 9 | var someValue = null.toString(); 10 | 11 | group("firstNonNull()", () { 12 | test("returns first argument when first is not null and second is null", () { 13 | expect(Objects.firstNonNull("first", null), "first"); 14 | }); 15 | 16 | test("returns first argument when first is not null and second is not null", () { 17 | expect(Objects.firstNonNull("first", "second"), "first"); 18 | }); 19 | 20 | test("returns second argument when first is null and second is not null", () { 21 | expect(Objects.firstNonNull(null, "second"), "second"); 22 | }); 23 | 24 | test("throws error when both arguments are null", () { 25 | expect(() => Objects.firstNonNull(null, null), throwsArgumentError); 26 | }); 27 | }); 28 | 29 | group("nullSafeInvoke()", () { 30 | test("returns null if initial variable is null", () { 31 | var list = null; 32 | expect(Objects.nullSafeInvoke(() => list.reversed.isEmpty), isNull); 33 | }); 34 | 35 | test("returns null if chained call results in a null part way through", () { 36 | var simpleTest = new _SimpleTestClass(); 37 | expect(Objects.nullSafeInvoke(() => simpleTest.nested.nested), isNull); 38 | }); 39 | }); 40 | 41 | group("isPrimitive()", () { 42 | test("returns true for int", () { 43 | expect(Objects.isPrimitive(1), isTrue); 44 | }); 45 | test("returns true for double", () { 46 | expect(Objects.isPrimitive(2.0), isTrue); 47 | }); 48 | test("returns true for bool", () { 49 | expect(Objects.isPrimitive(false), isTrue); 50 | }); 51 | test("returns true for null", () { 52 | expect(Objects.isPrimitive(null), isTrue); 53 | }); 54 | test("returns true for String", () { 55 | expect(Objects.isPrimitive("string"), isTrue); 56 | }); 57 | }); 58 | } 59 | 60 | class _SimpleTestClass { 61 | _SimpleTestClass nested = null; 62 | } -------------------------------------------------------------------------------- /commons/test/lang/strings_test.dart: -------------------------------------------------------------------------------- 1 | /// Copyright (c) 2019 DeNA Co., Ltd. 2 | /// Licensed under the MIT License 3 | 4 | import "package:test/test.dart"; 5 | import "package:commons/commons.dart"; 6 | 7 | main() { 8 | group("isNullOrEmpty()", () { 9 | test("returns true for null", () { 10 | expect(Strings.isNullOrEmpty(null), true); 11 | }); 12 | 13 | test("returns true for empty string", () { 14 | expect(Strings.isNullOrEmpty(""), true); 15 | }); 16 | 17 | test("returns false for non-empty string", () { 18 | expect(Strings.isNullOrEmpty("not empty"), false); 19 | }); 20 | }); 21 | 22 | group("nonNullOrEmpty()", (){ 23 | test("returns input string when it is not null", () { 24 | expect(Strings.nonNullOrEmpty("not null"), equals("not null")); 25 | }); 26 | test("returns empty string when input string is null", () { 27 | expect(Strings.nonNullOrEmpty(null), equals("")); 28 | }); 29 | }); 30 | 31 | group("nonEmptyOrNull()", () { 32 | test("returns input string when it is not empty", () { 33 | expect(Strings.nonEmptyOrNull("not null"), equals("not null")); 34 | }); 35 | test("returns null when input string is empty", () { 36 | expect(Strings.nonEmptyOrNull(""), isNull); 37 | }); 38 | }); 39 | 40 | group("replaceLast()", () { 41 | var alphabet = "abcdefghijklmnopqrstuvwxyz"; 42 | test("handles no matches", () { 43 | expect(Strings.replaceLast(alphabet,"123", "123"), equals(alphabet)); 44 | }); 45 | test("handles last match at start of string", () { 46 | expect(Strings.replaceLast(alphabet, "abc", "123"), equals("123defghijklmnopqrstuvwxyz")); 47 | }); 48 | test("handles last match in middle of string", () { 49 | expect(Strings.replaceLast(alphabet, "mno", "123"), equals("abcdefghijkl123pqrstuvwxyz")); 50 | }); 51 | test("handles last match at end of string", () { 52 | expect(Strings.replaceLast(alphabet, "xyz", "123"), equals("abcdefghijklmnopqrstuvw123")); 53 | }); 54 | test("handles repeated characters", () { 55 | expect(Strings.replaceLast("aaaaaaaaa", "aaa", "bbb"), equals("aaaaaabbb")); 56 | }); 57 | test("handles null source string", () { 58 | expect(() => Strings.replaceLast(null, "abc", "123"), throwsArgumentError); 59 | }); 60 | test("handles empty source string", () { 61 | expect(Strings.replaceLast("", "abc", "123"), equals("")); 62 | }); 63 | test("handles null from pattern", () { 64 | expect(() => Strings.replaceLast(null, "abc", "123"), throwsArgumentError); 65 | }); 66 | test("handles empty from pattern", () { 67 | expect(Strings.replaceLast(alphabet, "", "123"), equals("abcdefghijklmnopqrstuvwxyz123")); 68 | }); 69 | test("handles null to string", () { 70 | expect(() => Strings.replaceLast(null, "abc", "123"), throwsArgumentError); 71 | }); 72 | test("handles empty to string", () { 73 | expect(Strings.replaceLast(alphabet, "uvw", ""), equals("abcdefghijklmnopqrstxyz")); 74 | }); 75 | test("handles patterns properly", () { 76 | expect(Strings.replaceLast("Hello World!", new RegExp(r"(\w+!)"), "BoT!"), equals("Hello BoT!")); 77 | }); 78 | }); 79 | } -------------------------------------------------------------------------------- /hosting/.gitignore: -------------------------------------------------------------------------------- 1 | # Logs 2 | logs 3 | *.log 4 | npm-debug.log* 5 | yarn-debug.log* 6 | yarn-error.log* 7 | firebase-debug.log* 8 | 9 | # Firebase cache 10 | .firebase/ 11 | 12 | # Firebase config 13 | 14 | # Uncomment this if you'd like others to create their own Firebase project. 15 | # For a team working on the same Firebase project(s), it is recommended to leave 16 | # it commented so all members can deploy to the same project(s) in .firebaserc. 17 | # .firebaserc 18 | 19 | # Runtime data 20 | pids 21 | *.pid 22 | *.seed 23 | *.pid.lock 24 | 25 | # Directory for instrumented libs generated by jscoverage/JSCover 26 | lib-cov 27 | 28 | # Coverage directory used by tools like istanbul 29 | coverage 30 | 31 | # nyc test coverage 32 | .nyc_output 33 | 34 | # Grunt intermediate storage (http://gruntjs.com/creating-plugins#storing-task-files) 35 | .grunt 36 | 37 | # Bower dependency directory (https://bower.io/) 38 | bower_components 39 | 40 | # node-waf configuration 41 | .lock-wscript 42 | 43 | # Compiled binary addons (http://nodejs.org/api/addons.html) 44 | build/Release 45 | 46 | # Dependency directories 47 | node_modules/ 48 | 49 | # Optional npm cache directory 50 | .npm 51 | 52 | # Optional eslint cache 53 | .eslintcache 54 | 55 | # Optional REPL history 56 | .node_repl_history 57 | 58 | # Output of 'npm pack' 59 | *.tgz 60 | 61 | # Yarn Integrity file 62 | .yarn-integrity 63 | 64 | # dotenv environment variables file 65 | .env 66 | -------------------------------------------------------------------------------- /hosting/LICENSE: -------------------------------------------------------------------------------- 1 | Copyright (c) 2019 DeNA Co., Ltd. 2 | 3 | Permission is hereby granted, free of charge, to any person obtaining a copy 4 | of this software and associated documentation files (the "Software"), to deal 5 | in the Software without restriction, including without limitation the rights 6 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 7 | copies of the Software, and to permit persons to whom the Software is 8 | furnished to do so, subject to the following conditions: 9 | 10 | The above copyright notice and this permission notice shall be included in 11 | all copies or substantial portions of the Software. 12 | 13 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 14 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 15 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 16 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 17 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 18 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 19 | THE SOFTWARE. -------------------------------------------------------------------------------- /hosting/README.md: -------------------------------------------------------------------------------- 1 | # Web Hosting Data 2 | 3 | ### JSON Tools 4 | - JSON Schema Validator - Newtonsoft https://www.jsonschemavalidator.net/ 5 | - JSON Formatter & Validator https://jsonformatter.curiousconcept.com/ 6 | -------------------------------------------------------------------------------- /hosting/json.schemas/schema_business.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "http://json-schema.org/draft-04/schema#", 3 | "type": "object", 4 | "properties": { 5 | "id": { 6 | "type": "integer" 7 | }, 8 | "category": { 9 | "type": "object", 10 | "properties": { 11 | "text": { 12 | "type": "string" 13 | }, 14 | "icon": { 15 | "type": "string" 16 | } 17 | }, 18 | "required": [ 19 | "text", 20 | "icon" 21 | ] 22 | }, 23 | "services": { 24 | "type": "array", 25 | "items": [ 26 | { 27 | "type": "object", 28 | "properties": { 29 | "name": { 30 | "type": "string" 31 | }, 32 | "url": { 33 | "type": "string" 34 | } 35 | }, 36 | "required": [ 37 | "name", 38 | "url" 39 | ] 40 | } 41 | ] 42 | }, 43 | "stage": { 44 | "type": "string" 45 | }, 46 | "start_at": { 47 | "type": "string" 48 | }, 49 | "end_at": { 50 | "type": "string" 51 | }, 52 | "tags": { 53 | "type": "array", 54 | "items": [ 55 | { 56 | "type": "string" 57 | } 58 | ] 59 | }, 60 | "title": { 61 | "type": "string" 62 | }, 63 | "text": { 64 | "type": "string" 65 | } 66 | }, 67 | "required": [ 68 | "id", 69 | "stage", 70 | "start_at", 71 | "end_at", 72 | "tags", 73 | "title", 74 | "text" 75 | ] 76 | } -------------------------------------------------------------------------------- /hosting/json.schemas/schema_person.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "http://json-schema.org/draft-04/schema#", 3 | "type": "object", 4 | "properties": { 5 | "id": { 6 | "type": "integer" 7 | }, 8 | "name": { 9 | "type": "string" 10 | }, 11 | "company": { 12 | "type": "string" 13 | }, 14 | "team": { 15 | "type": "string" 16 | }, 17 | "profile": { 18 | "type": "string" 19 | }, 20 | "imageUrl": { 21 | "type": "string" 22 | }, 23 | "sns": { 24 | "type": "array", 25 | "items": [ 26 | { 27 | "type": "object", 28 | "properties": { 29 | "icon": { 30 | "type": "string" 31 | }, 32 | "url": { 33 | "type": "string" 34 | } 35 | }, 36 | "required": [ 37 | "icon", 38 | "url" 39 | ] 40 | } 41 | ] 42 | } 43 | }, 44 | "required": [ 45 | "text", 46 | "icon" 47 | ] 48 | } -------------------------------------------------------------------------------- /hosting/json.schemas/schema_sessions.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "http://json-schema.org/draft-04/schema#", 3 | "type": "array", 4 | "items": [ 5 | { 6 | "type": "object", 7 | "properties": { 8 | "id": { 9 | "type": "integer" 10 | }, 11 | "persons": { 12 | "type": "array", 13 | "items": [ 14 | { 15 | "type": "object", 16 | "properties": { 17 | "id": { 18 | "type": "integer" 19 | }, 20 | "name": { 21 | "type": "string" 22 | }, 23 | "company": { 24 | "type": "string" 25 | }, 26 | "team": { 27 | "type": "string" 28 | }, 29 | "profile": { 30 | "type": "string" 31 | }, 32 | "imageUrl": { 33 | "type": "string" 34 | }, 35 | "sns": { 36 | "type": "array", 37 | "items": [ 38 | { 39 | "type": "object", 40 | "properties": { 41 | "icon": { 42 | "type": "string" 43 | }, 44 | "url": { 45 | "type": "string" 46 | } 47 | }, 48 | "required": [ 49 | "icon", 50 | "url" 51 | ] 52 | } 53 | ] 54 | } 55 | }, 56 | "required": [ 57 | "id", 58 | "name", 59 | "profile", 60 | "imageUrl" 61 | ] 62 | } 63 | ] 64 | }, 65 | "business": { 66 | "type": "object", 67 | "properties": { 68 | "id": { 69 | "type": "integer" 70 | }, 71 | "category": { 72 | "type": "object", 73 | "properties": { 74 | "text": { 75 | "type": "string" 76 | }, 77 | "icon": { 78 | "type": "string" 79 | } 80 | }, 81 | "required": [ 82 | "text", 83 | "icon" 84 | ] 85 | }, 86 | "services": { 87 | "type": "array", 88 | "items": [ 89 | { 90 | "type": "object", 91 | "properties": { 92 | "name": { 93 | "type": "string" 94 | }, 95 | "url": { 96 | "type": "string" 97 | } 98 | }, 99 | "required": [ 100 | "name", 101 | "url" 102 | ] 103 | } 104 | ] 105 | }, 106 | "stage": { 107 | "type": "string" 108 | }, 109 | "start_at": { 110 | "type": "string" 111 | }, 112 | "end_at": { 113 | "type": "string" 114 | }, 115 | "tags": { 116 | "type": "array", 117 | "items": [ 118 | { 119 | "type": "string" 120 | } 121 | ] 122 | }, 123 | "title": { 124 | "type": "string" 125 | }, 126 | "text": { 127 | "type": "string" 128 | } 129 | }, 130 | "required": [ 131 | "id", 132 | "stage", 133 | "start_at", 134 | "end_at", 135 | "tags", 136 | "title", 137 | "text" 138 | ] 139 | } 140 | }, 141 | "required": [ 142 | "id", 143 | "persons", 144 | "business" 145 | ] 146 | } 147 | ] 148 | } -------------------------------------------------------------------------------- /hosting/public/503.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 72 | 185 | 186 | 215 | 216 | 217 | 218 |
219 |
220 | 503 221 |
222 |
223 | Looks like we're having
224 | some server issues. 225 |
226 |
227 |
228 |
229 | 230 |

231 | Go back to the previous page and try again. 232 | If you think something is broken, report a problem. 233 |

234 | 235 | 236 |
237 |
238 | 239 |
240 |
241 | 242 | 243 | 356 | 357 | 358 | 359 | 363 | 364 | 365 | 366 | 367 | -------------------------------------------------------------------------------- /hosting/public/image/img_person.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DeNA/techcon_app/8a38010cf0e8d0f19267049ecb27bf1429d6cd30/hosting/public/image/img_person.png -------------------------------------------------------------------------------- /hosting/public/image/stage_map.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DeNA/techcon_app/8a38010cf0e8d0f19267049ecb27bf1429d6cd30/hosting/public/image/stage_map.png -------------------------------------------------------------------------------- /hosting/public/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | -------------------------------------------------------------------------------- /repository/.gitignore: -------------------------------------------------------------------------------- 1 | .DS_Store 2 | .dart_tool/ 3 | 4 | .packages 5 | .pub/ 6 | 7 | build/ 8 | ios/.generated/ 9 | ios/Flutter/Generated.xcconfig 10 | ios/Runner/GeneratedPluginRegistrant.* 11 | -------------------------------------------------------------------------------- /repository/.metadata: -------------------------------------------------------------------------------- 1 | # This file tracks properties of this Flutter project. 2 | # Used by Flutter tool to assess capabilities and perform upgrades etc. 3 | # 4 | # This file should be version controlled and should not be manually edited. 5 | 6 | version: 7 | revision: 5391447fae6209bb21a89e6a5a6583cac1af9b4b 8 | channel: beta 9 | 10 | project_type: package 11 | -------------------------------------------------------------------------------- /repository/CHANGELOG.md: -------------------------------------------------------------------------------- 1 | ## [0.0.1] - TODO: Add release date. 2 | 3 | * TODO: Describe initial release. 4 | -------------------------------------------------------------------------------- /repository/LICENSE: -------------------------------------------------------------------------------- 1 | Copyright (c) 2019 DeNA Co., Ltd. 2 | 3 | Permission is hereby granted, free of charge, to any person obtaining a copy 4 | of this software and associated documentation files (the "Software"), to deal 5 | in the Software without restriction, including without limitation the rights 6 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 7 | copies of the Software, and to permit persons to whom the Software is 8 | furnished to do so, subject to the following conditions: 9 | 10 | The above copyright notice and this permission notice shall be included in 11 | all copies or substantial portions of the Software. 12 | 13 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 14 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 15 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 16 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 17 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 18 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 19 | THE SOFTWARE. -------------------------------------------------------------------------------- /repository/README.md: -------------------------------------------------------------------------------- 1 | # repository 2 | 3 | A interface and entity repository package. 4 | 5 | ### JSON Serialization 6 | 7 | ``` 8 | flutter packages pub run build_runner build 9 | ``` 10 | -------------------------------------------------------------------------------- /repository/lib/entity/business.dart: -------------------------------------------------------------------------------- 1 | /// Copyright (c) 2019 DeNA Co., Ltd. 2 | /// Licensed under the MIT License 3 | 4 | import "package:json_annotation/json_annotation.dart"; 5 | import 'package:repository/entity/category.dart'; 6 | import 'package:repository/entity/service.dart'; 7 | 8 | part "business.g.dart"; 9 | 10 | @JsonSerializable() 11 | class Business { 12 | int id; 13 | Category category; 14 | List services; 15 | String stage; 16 | @JsonKey(name: 'start_at') String startAt; 17 | @JsonKey(name: 'end_at') String endAt; 18 | List tags; 19 | String title; 20 | String text; 21 | 22 | Business(this.id, this.category, this.services, this.stage, this.startAt, 23 | this.endAt, this.tags, this.title, this.text); 24 | 25 | factory Business.fromJson(Map json) => 26 | _$BusinessFromJson(json); 27 | 28 | @override 29 | bool operator ==(Object other) => 30 | identical(this, other) || 31 | other is Business && 32 | runtimeType == other.runtimeType && 33 | id == other.id && 34 | category == other.category && 35 | services == other.services && 36 | stage == other.stage && 37 | startAt == other.startAt && 38 | endAt == other.endAt && 39 | tags == other.tags && 40 | title == other.title && 41 | text == other.text; 42 | 43 | @override 44 | int get hashCode => 45 | id.hashCode ^ 46 | category.hashCode ^ 47 | services.hashCode ^ 48 | stage.hashCode ^ 49 | startAt.hashCode ^ 50 | endAt.hashCode ^ 51 | tags.hashCode ^ 52 | title.hashCode ^ 53 | text.hashCode; 54 | 55 | @override 56 | String toString() { 57 | return 'Business{id: $id, category: $category, services: $services, stage: $stage, startAt: $startAt, endAt: $endAt, tags: $tags, title: $title, text: $text}'; 58 | } 59 | 60 | } 61 | -------------------------------------------------------------------------------- /repository/lib/entity/business.g.dart: -------------------------------------------------------------------------------- 1 | // GENERATED CODE - DO NOT MODIFY BY HAND 2 | 3 | part of 'business.dart'; 4 | 5 | // ************************************************************************** 6 | // JsonSerializableGenerator 7 | // ************************************************************************** 8 | 9 | Business _$BusinessFromJson(Map json) { 10 | return Business( 11 | json['id'] as int, 12 | json['category'] == null 13 | ? null 14 | : Category.fromJson(json['category'] as Map), 15 | (json['services'] as List) 16 | ?.map((e) => 17 | e == null ? null : Service.fromJson(e as Map)) 18 | ?.toList(), 19 | json['stage'] as String, 20 | json['start_at'] as String, 21 | json['end_at'] as String, 22 | (json['tags'] as List)?.map((e) => e as String)?.toList(), 23 | json['title'] as String, 24 | json['text'] as String); 25 | } 26 | 27 | Map _$BusinessToJson(Business instance) => { 28 | 'id': instance.id, 29 | 'category': instance.category, 30 | 'services': instance.services, 31 | 'stage': instance.stage, 32 | 'start_at': instance.startAt, 33 | 'end_at': instance.endAt, 34 | 'tags': instance.tags, 35 | 'title': instance.title, 36 | 'text': instance.text 37 | }; 38 | -------------------------------------------------------------------------------- /repository/lib/entity/category.dart: -------------------------------------------------------------------------------- 1 | /// Copyright (c) 2019 DeNA Co., Ltd. 2 | /// Licensed under the MIT License 3 | 4 | import "package:json_annotation/json_annotation.dart"; 5 | 6 | part "category.g.dart"; 7 | 8 | @JsonSerializable() 9 | class Category { 10 | String text; 11 | String icon; 12 | 13 | Category(this.text, this.icon); 14 | 15 | @override 16 | bool operator ==(Object other) => 17 | identical(this, other) || 18 | other is Category && 19 | runtimeType == other.runtimeType && 20 | text == other.text && 21 | icon == other.icon; 22 | 23 | @override 24 | int get hashCode => 25 | text.hashCode ^ 26 | icon.hashCode; 27 | 28 | @override 29 | String toString() { 30 | return 'Category{text: $text, icon: $icon}'; 31 | } 32 | 33 | factory Category.fromJson(Map json) => 34 | _$CategoryFromJson(json); 35 | 36 | } 37 | 38 | -------------------------------------------------------------------------------- /repository/lib/entity/category.g.dart: -------------------------------------------------------------------------------- 1 | // GENERATED CODE - DO NOT MODIFY BY HAND 2 | 3 | part of 'category.dart'; 4 | 5 | // ************************************************************************** 6 | // JsonSerializableGenerator 7 | // ************************************************************************** 8 | 9 | Category _$CategoryFromJson(Map json) { 10 | return Category(json['text'] as String, json['icon'] as String); 11 | } 12 | 13 | Map _$CategoryToJson(Category instance) => 14 | {'text': instance.text, 'icon': instance.icon}; 15 | -------------------------------------------------------------------------------- /repository/lib/entity/person.dart: -------------------------------------------------------------------------------- 1 | /// Copyright (c) 2019 DeNA Co., Ltd. 2 | /// Licensed under the MIT License 3 | 4 | import "package:json_annotation/json_annotation.dart"; 5 | import 'package:repository/entity/sns.dart'; 6 | 7 | part "person.g.dart"; 8 | 9 | @JsonSerializable() 10 | class Person extends Object { 11 | int id; 12 | String name; 13 | String company; 14 | String team; 15 | String profile; 16 | String imageUrl; 17 | List sns; 18 | 19 | Person(this.id, this.name, this.company, this.team, this.profile, 20 | this.imageUrl, this.sns); 21 | 22 | @override 23 | bool operator ==(Object other) => 24 | identical(this, other) || 25 | other is Person && 26 | runtimeType == other.runtimeType && 27 | id == other.id && 28 | name == other.name && 29 | company == other.company && 30 | team == other.team && 31 | profile == other.profile && 32 | imageUrl == other.imageUrl && 33 | sns == other.sns; 34 | 35 | @override 36 | int get hashCode => 37 | id.hashCode ^ 38 | name.hashCode ^ 39 | company.hashCode ^ 40 | team.hashCode ^ 41 | profile.hashCode ^ 42 | imageUrl.hashCode ^ 43 | sns.hashCode; 44 | 45 | @override 46 | String toString() { 47 | return 'Person{id: $id, name: $name, company: $company, team: $team, profile: $profile, imageUrl: $imageUrl, sns: $sns}'; 48 | } 49 | 50 | factory Person.fromJson(Map json) => _$PersonFromJson(json); 51 | } 52 | -------------------------------------------------------------------------------- /repository/lib/entity/person.g.dart: -------------------------------------------------------------------------------- 1 | // GENERATED CODE - DO NOT MODIFY BY HAND 2 | 3 | part of 'person.dart'; 4 | 5 | // ************************************************************************** 6 | // JsonSerializableGenerator 7 | // ************************************************************************** 8 | 9 | Person _$PersonFromJson(Map json) { 10 | return Person( 11 | json['id'] as int, 12 | json['name'] as String, 13 | json['company'] as String, 14 | json['team'] as String, 15 | json['profile'] as String, 16 | json['imageUrl'] as String, 17 | (json['sns'] as List) 18 | ?.map( 19 | (e) => e == null ? null : Sns.fromJson(e as Map)) 20 | ?.toList()); 21 | } 22 | 23 | Map _$PersonToJson(Person instance) => { 24 | 'id': instance.id, 25 | 'name': instance.name, 26 | 'company': instance.company, 27 | 'team': instance.team, 28 | 'profile': instance.profile, 29 | 'imageUrl': instance.imageUrl, 30 | 'sns': instance.sns 31 | }; 32 | -------------------------------------------------------------------------------- /repository/lib/entity/service.dart: -------------------------------------------------------------------------------- 1 | /// Copyright (c) 2019 DeNA Co., Ltd. 2 | /// Licensed under the MIT License 3 | 4 | import 'package:json_annotation/json_annotation.dart'; 5 | 6 | part "service.g.dart"; 7 | 8 | @JsonSerializable() 9 | class Service { 10 | String name; 11 | String url; 12 | 13 | Service(this.name, this.url); 14 | 15 | @override 16 | bool operator ==(Object other) => 17 | identical(this, other) || 18 | other is Service && 19 | runtimeType == other.runtimeType && 20 | name == other.name && 21 | url == other.url; 22 | 23 | @override 24 | int get hashCode => 25 | name.hashCode ^ 26 | url.hashCode; 27 | 28 | @override 29 | String toString() { 30 | return 'Service{name: $name, url: $url}'; 31 | } 32 | 33 | factory Service.fromJson(Map json) => 34 | _$ServiceFromJson(json); 35 | 36 | } 37 | -------------------------------------------------------------------------------- /repository/lib/entity/service.g.dart: -------------------------------------------------------------------------------- 1 | // GENERATED CODE - DO NOT MODIFY BY HAND 2 | 3 | part of 'service.dart'; 4 | 5 | // ************************************************************************** 6 | // JsonSerializableGenerator 7 | // ************************************************************************** 8 | 9 | Service _$ServiceFromJson(Map json) { 10 | return Service(json['name'] as String, json['url'] as String); 11 | } 12 | 13 | Map _$ServiceToJson(Service instance) => 14 | {'name': instance.name, 'url': instance.url}; 15 | -------------------------------------------------------------------------------- /repository/lib/entity/session.dart: -------------------------------------------------------------------------------- 1 | /// Copyright (c) 2019 DeNA Co., Ltd. 2 | /// Licensed under the MIT License 3 | 4 | import "package:json_annotation/json_annotation.dart"; 5 | import 'package:repository/entity/business.dart'; 6 | import 'package:repository/entity/person.dart'; 7 | 8 | part "session.g.dart"; 9 | 10 | @JsonSerializable() 11 | class Session { 12 | int id; 13 | List persons; 14 | Business business; 15 | 16 | Session(this.id, this.persons, this.business); 17 | 18 | @override 19 | bool operator ==(Object other) => 20 | identical(this, other) || 21 | other is Session && 22 | runtimeType == other.runtimeType && 23 | id == other.id && 24 | persons == other.persons && 25 | business == other.business; 26 | 27 | @override 28 | int get hashCode => id.hashCode ^ persons.hashCode ^ business.hashCode; 29 | 30 | @override 31 | String toString() { 32 | return 'Session{id: $id, persons: $persons, business: $business}'; 33 | } 34 | 35 | factory Session.fromJson(Map json) => 36 | _$SessionFromJson(json); 37 | } 38 | -------------------------------------------------------------------------------- /repository/lib/entity/session.g.dart: -------------------------------------------------------------------------------- 1 | // GENERATED CODE - DO NOT MODIFY BY HAND 2 | 3 | part of 'session.dart'; 4 | 5 | // ************************************************************************** 6 | // JsonSerializableGenerator 7 | // ************************************************************************** 8 | 9 | Session _$SessionFromJson(Map json) { 10 | return Session( 11 | json['id'] as int, 12 | (json['persons'] as List) 13 | ?.map((e) => 14 | e == null ? null : Person.fromJson(e as Map)) 15 | ?.toList(), 16 | json['business'] == null 17 | ? null 18 | : Business.fromJson(json['business'] as Map)); 19 | } 20 | 21 | Map _$SessionToJson(Session instance) => { 22 | 'id': instance.id, 23 | 'persons': instance.persons, 24 | 'business': instance.business 25 | }; 26 | -------------------------------------------------------------------------------- /repository/lib/entity/sns.dart: -------------------------------------------------------------------------------- 1 | /// Copyright (c) 2019 DeNA Co., Ltd. 2 | /// Licensed under the MIT License 3 | 4 | import "package:json_annotation/json_annotation.dart"; 5 | 6 | part "sns.g.dart"; 7 | 8 | @JsonSerializable() 9 | class Sns { 10 | String icon; 11 | String url; 12 | 13 | Sns(this.icon, this.url); 14 | 15 | factory Sns.fromJson(Map json) => _$SnsFromJson(json); 16 | 17 | @override 18 | bool operator ==(Object other) => 19 | identical(this, other) || 20 | other is Sns && 21 | runtimeType == other.runtimeType && 22 | icon == other.icon && 23 | url == other.url; 24 | 25 | @override 26 | int get hashCode => 27 | icon.hashCode ^ 28 | url.hashCode; 29 | 30 | @override 31 | String toString() { 32 | return 'Sns{icon: $icon, url: $url}'; 33 | } 34 | 35 | } 36 | -------------------------------------------------------------------------------- /repository/lib/entity/sns.g.dart: -------------------------------------------------------------------------------- 1 | // GENERATED CODE - DO NOT MODIFY BY HAND 2 | 3 | part of 'sns.dart'; 4 | 5 | // ************************************************************************** 6 | // JsonSerializableGenerator 7 | // ************************************************************************** 8 | 9 | Sns _$SnsFromJson(Map json) { 10 | return Sns(json['icon'] as String, json['url'] as String); 11 | } 12 | 13 | Map _$SnsToJson(Sns instance) => 14 | {'icon': instance.icon, 'url': instance.url}; 15 | -------------------------------------------------------------------------------- /repository/lib/repository.dart: -------------------------------------------------------------------------------- 1 | /// Copyright (c) 2019 DeNA Co., Ltd. 2 | /// Licensed under the MIT License 3 | 4 | library repository; 5 | 6 | import 'package:repository/entity/person.dart'; 7 | import 'package:repository/entity/session.dart'; 8 | 9 | 10 | abstract class Repository { 11 | Future> getSessionList(); 12 | Future getSessionById(String id); 13 | Future> getPersonList(); 14 | } 15 | -------------------------------------------------------------------------------- /repository/pubspec.yaml: -------------------------------------------------------------------------------- 1 | name: repository 2 | description: A Repository Flutter project. 3 | version: 0.0.1 4 | author: 5 | homepage: 6 | 7 | environment: 8 | sdk: ">=2.0.0-dev.68.0 <3.0.0" 9 | 10 | dependencies: 11 | json_annotation: ^2.0.0 12 | 13 | dev_dependencies: 14 | build_runner: ^1.0.0 15 | json_serializable: ^2.0.1 16 | 17 | test: ^1.3.0 18 | -------------------------------------------------------------------------------- /repository_cache/.gitignore: -------------------------------------------------------------------------------- 1 | .DS_Store 2 | .dart_tool/ 3 | 4 | .packages 5 | .pub/ 6 | pubspec.lock 7 | 8 | build/ 9 | -------------------------------------------------------------------------------- /repository_cache/.metadata: -------------------------------------------------------------------------------- 1 | # This file tracks properties of this Flutter project. 2 | # Used by Flutter tool to assess capabilities and perform upgrades etc. 3 | # 4 | # This file should be version controlled and should not be manually edited. 5 | 6 | version: 7 | revision: 5391447fae6209bb21a89e6a5a6583cac1af9b4b 8 | channel: stable 9 | 10 | project_type: plugin 11 | -------------------------------------------------------------------------------- /repository_cache/CHANGELOG.md: -------------------------------------------------------------------------------- 1 | ## 0.0.1 2 | 3 | * TODO: Describe initial release. 4 | -------------------------------------------------------------------------------- /repository_cache/LICENSE: -------------------------------------------------------------------------------- 1 | Copyright (c) 2019 DeNA Co., Ltd. 2 | 3 | Permission is hereby granted, free of charge, to any person obtaining a copy 4 | of this software and associated documentation files (the "Software"), to deal 5 | in the Software without restriction, including without limitation the rights 6 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 7 | copies of the Software, and to permit persons to whom the Software is 8 | furnished to do so, subject to the following conditions: 9 | 10 | The above copyright notice and this permission notice shall be included in 11 | all copies or substantial portions of the Software. 12 | 13 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 14 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 15 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 16 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 17 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 18 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 19 | THE SOFTWARE. -------------------------------------------------------------------------------- /repository_cache/README.md: -------------------------------------------------------------------------------- 1 | # repository_cache 2 | 3 | A cacheable remote repository package. 4 | -------------------------------------------------------------------------------- /repository_cache/android/.gitignore: -------------------------------------------------------------------------------- 1 | *.iml 2 | .gradle 3 | /local.properties 4 | /.idea/workspace.xml 5 | /.idea/libraries 6 | .DS_Store 7 | /build 8 | /captures 9 | -------------------------------------------------------------------------------- /repository_cache/android/build.gradle: -------------------------------------------------------------------------------- 1 | group 'com.dena.techcon.app.repositorycache' 2 | version '1.0-SNAPSHOT' 3 | 4 | buildscript { 5 | ext.kotlin_version = '1.2.71' 6 | repositories { 7 | google() 8 | jcenter() 9 | } 10 | 11 | dependencies { 12 | classpath 'com.android.tools.build:gradle:3.2.1' 13 | classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" 14 | } 15 | } 16 | 17 | rootProject.allprojects { 18 | repositories { 19 | google() 20 | jcenter() 21 | } 22 | } 23 | 24 | apply plugin: 'com.android.library' 25 | apply plugin: 'kotlin-android' 26 | 27 | android { 28 | compileSdkVersion 27 29 | 30 | sourceSets { 31 | main.java.srcDirs += 'src/main/kotlin' 32 | } 33 | defaultConfig { 34 | minSdkVersion 16 35 | testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" 36 | } 37 | lintOptions { 38 | disable 'InvalidPackage' 39 | } 40 | } 41 | 42 | dependencies { 43 | implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version" 44 | } 45 | -------------------------------------------------------------------------------- /repository_cache/android/gradle.properties: -------------------------------------------------------------------------------- 1 | org.gradle.jvmargs=-Xmx1536M 2 | -------------------------------------------------------------------------------- /repository_cache/android/settings.gradle: -------------------------------------------------------------------------------- 1 | rootProject.name = 'repository_cache' 2 | -------------------------------------------------------------------------------- /repository_cache/android/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 3 | 4 | -------------------------------------------------------------------------------- /repository_cache/android/src/main/kotlin/com/dena/techcon/app/repositorycache/RepositoryCachePlugin.kt: -------------------------------------------------------------------------------- 1 | package com.dena.techcon.app.repositorycache 2 | 3 | import io.flutter.plugin.common.MethodCall 4 | import io.flutter.plugin.common.MethodChannel 5 | import io.flutter.plugin.common.MethodChannel.MethodCallHandler 6 | import io.flutter.plugin.common.MethodChannel.Result 7 | import io.flutter.plugin.common.PluginRegistry.Registrar 8 | 9 | class RepositoryCachePlugin: MethodCallHandler { 10 | companion object { 11 | @JvmStatic 12 | fun registerWith(registrar: Registrar) { 13 | val channel = MethodChannel(registrar.messenger(), "repository_cache") 14 | channel.setMethodCallHandler(RepositoryCachePlugin()) 15 | } 16 | } 17 | 18 | override fun onMethodCall(call: MethodCall, result: Result) { 19 | if (call.method == "getPlatformVersion") { 20 | result.success("Android ${android.os.Build.VERSION.RELEASE}") 21 | } else { 22 | result.notImplemented() 23 | } 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /repository_cache/ios/.gitignore: -------------------------------------------------------------------------------- 1 | .idea/ 2 | .vagrant/ 3 | .sconsign.dblite 4 | .svn/ 5 | 6 | .DS_Store 7 | *.swp 8 | profile 9 | 10 | DerivedData/ 11 | build/ 12 | GeneratedPluginRegistrant.h 13 | GeneratedPluginRegistrant.m 14 | 15 | .generated/ 16 | 17 | *.pbxuser 18 | *.mode1v3 19 | *.mode2v3 20 | *.perspectivev3 21 | 22 | !default.pbxuser 23 | !default.mode1v3 24 | !default.mode2v3 25 | !default.perspectivev3 26 | 27 | xcuserdata 28 | 29 | *.moved-aside 30 | 31 | *.pyc 32 | *sync/ 33 | Icon? 34 | .tags* 35 | 36 | /Flutter/Generated.xcconfig 37 | -------------------------------------------------------------------------------- /repository_cache/ios/Assets/.gitkeep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DeNA/techcon_app/8a38010cf0e8d0f19267049ecb27bf1429d6cd30/repository_cache/ios/Assets/.gitkeep -------------------------------------------------------------------------------- /repository_cache/ios/Classes/RepositoryCachePlugin.h: -------------------------------------------------------------------------------- 1 | #import 2 | 3 | @interface RepositoryCachePlugin : NSObject 4 | @end 5 | -------------------------------------------------------------------------------- /repository_cache/ios/Classes/RepositoryCachePlugin.m: -------------------------------------------------------------------------------- 1 | #import "RepositoryCachePlugin.h" 2 | #import 3 | 4 | @implementation RepositoryCachePlugin 5 | + (void)registerWithRegistrar:(NSObject*)registrar { 6 | [SwiftRepositoryCachePlugin registerWithRegistrar:registrar]; 7 | } 8 | @end 9 | -------------------------------------------------------------------------------- /repository_cache/ios/Classes/SwiftRepositoryCachePlugin.swift: -------------------------------------------------------------------------------- 1 | import Flutter 2 | import UIKit 3 | 4 | public class SwiftRepositoryCachePlugin: NSObject, FlutterPlugin { 5 | public static func register(with registrar: FlutterPluginRegistrar) { 6 | let channel = FlutterMethodChannel(name: "repository_cache", binaryMessenger: registrar.messenger()) 7 | let instance = SwiftRepositoryCachePlugin() 8 | registrar.addMethodCallDelegate(instance, channel: channel) 9 | } 10 | 11 | public func handle(_ call: FlutterMethodCall, result: @escaping FlutterResult) { 12 | result("iOS " + UIDevice.current.systemVersion) 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /repository_cache/ios/repository_cache.podspec: -------------------------------------------------------------------------------- 1 | # 2 | # To learn more about a Podspec see http://guides.cocoapods.org/syntax/podspec.html 3 | # 4 | Pod::Spec.new do |s| 5 | s.name = 'repository_cache' 6 | s.version = '0.0.1' 7 | s.summary = 'A new Flutter project.' 8 | s.description = <<-DESC 9 | A new Flutter project. 10 | DESC 11 | s.homepage = 'http://example.com' 12 | s.license = { :file => '../LICENSE' } 13 | s.author = { 'Your Company' => 'email@example.com' } 14 | s.source = { :path => '.' } 15 | s.source_files = 'Classes/**/*' 16 | s.public_header_files = 'Classes/**/*.h' 17 | s.dependency 'Flutter' 18 | 19 | s.ios.deployment_target = '8.0' 20 | end 21 | 22 | -------------------------------------------------------------------------------- /repository_cache/lib/repository_cache.dart: -------------------------------------------------------------------------------- 1 | /// Copyright (c) 2019 DeNA Co., Ltd. 2 | /// Licensed under the MIT License 3 | 4 | import 'dart:async'; 5 | import 'dart:convert'; 6 | 7 | import 'package:flutter/services.dart'; 8 | import 'package:http/http.dart' as http; 9 | import 'package:repository/entity/person.dart'; 10 | import 'package:repository/entity/session.dart'; 11 | import 'package:repository/repository.dart'; 12 | import 'package:shared_preferences/shared_preferences.dart'; 13 | 14 | class RepositoryCache extends Repository { 15 | static const MethodChannel _channel = const MethodChannel('repository_cache'); 16 | 17 | static Future get platformVersion async { 18 | final String version = await _channel.invokeMethod('getPlatformVersion'); 19 | return version; 20 | } 21 | 22 | final Future _prefs = SharedPreferences.getInstance(); 23 | // TODO: Change to your hosting url. 24 | final _baseUrl = 'https://localhost/json'; 25 | 26 | @override 27 | Future> getPersonList() { 28 | // TODO: implement getPersonList 29 | return null; 30 | } 31 | 32 | @override 33 | Future getSessionById(String id) { 34 | // TODO: implement getSessionById 35 | return null; 36 | } 37 | 38 | @override 39 | Future> getSessionList() async { 40 | final _json = "sessions.json"; 41 | final _url = "$_baseUrl/$_json"; 42 | final client = http.Client(); 43 | final SharedPreferences prefs = await _prefs; 44 | 45 | return client.get(_url).timeout(Duration(seconds: 5)).then((response) { 46 | if (response.statusCode == 200) { 47 | var data = utf8.decode(response.bodyBytes); 48 | prefs.setString(_json, data); 49 | return data; 50 | } 51 | throw ("[${response.statusCode}] Could not get $_json"); 52 | }).catchError((error) { 53 | print("$error"); 54 | return prefs.getString(_json); 55 | }).then((data) { 56 | List sessions = List(); 57 | var decoded = jsonDecode(data); 58 | decoded.forEach((data) => sessions.add(Session.fromJson(data))); 59 | return sessions; 60 | }).catchError((error) { 61 | print("$error"); 62 | return List(); 63 | }); 64 | } 65 | } 66 | -------------------------------------------------------------------------------- /repository_cache/pubspec.yaml: -------------------------------------------------------------------------------- 1 | name: repository_cache 2 | description: A Repository Flutter project. 3 | version: 0.0.1 4 | author: 5 | homepage: 6 | 7 | environment: 8 | sdk: ">=2.0.0-dev.68.0 <3.0.0" 9 | 10 | dependencies: 11 | flutter: 12 | sdk: flutter 13 | 14 | commons: 15 | path: ../commons 16 | repository: 17 | path: ../repository 18 | 19 | http: ^0.12.0+1 20 | shared_preferences: ^0.4.3 21 | 22 | flutter: 23 | plugin: 24 | androidPackage: com.dena.techcon.app.repositorycache 25 | pluginClass: RepositoryCachePlugin 26 | -------------------------------------------------------------------------------- /repository_local/.gitignore: -------------------------------------------------------------------------------- 1 | .DS_Store 2 | .dart_tool/ 3 | 4 | .packages 5 | .pub/ 6 | 7 | build/ 8 | ios/.generated/ 9 | ios/Flutter/Generated.xcconfig 10 | ios/Runner/GeneratedPluginRegistrant.* 11 | -------------------------------------------------------------------------------- /repository_local/.metadata: -------------------------------------------------------------------------------- 1 | # This file tracks properties of this Flutter project. 2 | # Used by Flutter tool to assess capabilities and perform upgrades etc. 3 | # 4 | # This file should be version controlled and should not be manually edited. 5 | 6 | version: 7 | revision: 5391447fae6209bb21a89e6a5a6583cac1af9b4b 8 | channel: beta 9 | 10 | project_type: package 11 | -------------------------------------------------------------------------------- /repository_local/CHANGELOG.md: -------------------------------------------------------------------------------- 1 | ## [0.0.1] - TODO: Add release date. 2 | 3 | * TODO: Describe initial release. 4 | -------------------------------------------------------------------------------- /repository_local/LICENSE: -------------------------------------------------------------------------------- 1 | Copyright (c) 2019 DeNA Co., Ltd. 2 | 3 | Permission is hereby granted, free of charge, to any person obtaining a copy 4 | of this software and associated documentation files (the "Software"), to deal 5 | in the Software without restriction, including without limitation the rights 6 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 7 | copies of the Software, and to permit persons to whom the Software is 8 | furnished to do so, subject to the following conditions: 9 | 10 | The above copyright notice and this permission notice shall be included in 11 | all copies or substantial portions of the Software. 12 | 13 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 14 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 15 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 16 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 17 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 18 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 19 | THE SOFTWARE. -------------------------------------------------------------------------------- /repository_local/README.md: -------------------------------------------------------------------------------- 1 | # repository_local 2 | 3 | A static data repository package. 4 | -------------------------------------------------------------------------------- /repository_local/lib/repository_local.dart: -------------------------------------------------------------------------------- 1 | /// Copyright (c) 2019 DeNA Co., Ltd. 2 | /// Licensed under the MIT License 3 | 4 | import 'dart:async'; 5 | 6 | import 'package:repository/entity/person.dart'; 7 | import 'package:repository/entity/session.dart'; 8 | import 'package:repository/repository.dart'; 9 | import 'package:repository_local/assets.dart'; 10 | 11 | class RepositoryLocal implements Repository { 12 | @override 13 | Future getSessionById(String id) { 14 | // TODO: implement getSessionById 15 | return null; 16 | } 17 | 18 | @override 19 | Future> getSessionList() async { 20 | return sessionsData.map((data) => Session.fromJson(data)).toList(); 21 | } 22 | 23 | @override 24 | Future> getPersonList() async { 25 | // TODO: implement getSessionById 26 | return null; 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /repository_local/pubspec.yaml: -------------------------------------------------------------------------------- 1 | name: repository_local 2 | description: A Repository Local Flutter project. 3 | version: 0.0.1 4 | author: 5 | homepage: 6 | 7 | environment: 8 | sdk: ">=2.0.0-dev.68.0 <3.0.0" 9 | 10 | dependencies: 11 | commons: 12 | path: ../commons 13 | repository: 14 | path: ../repository 15 | -------------------------------------------------------------------------------- /screenshots/00_screenshots.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DeNA/techcon_app/8a38010cf0e8d0f19267049ecb27bf1429d6cd30/screenshots/00_screenshots.png -------------------------------------------------------------------------------- /screenshots/01_launch.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DeNA/techcon_app/8a38010cf0e8d0f19267049ecb27bf1429d6cd30/screenshots/01_launch.png -------------------------------------------------------------------------------- /screenshots/02_splash.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DeNA/techcon_app/8a38010cf0e8d0f19267049ecb27bf1429d6cd30/screenshots/02_splash.png -------------------------------------------------------------------------------- /screenshots/03_schedule.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DeNA/techcon_app/8a38010cf0e8d0f19267049ecb27bf1429d6cd30/screenshots/03_schedule.png -------------------------------------------------------------------------------- /screenshots/04_about.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DeNA/techcon_app/8a38010cf0e8d0f19267049ecb27bf1429d6cd30/screenshots/04_about.png -------------------------------------------------------------------------------- /screenshots/05_enquete.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DeNA/techcon_app/8a38010cf0e8d0f19267049ecb27bf1429d6cd30/screenshots/05_enquete.png -------------------------------------------------------------------------------- /screenshots/COPYRIGHT.txt: -------------------------------------------------------------------------------- 1 | The copyright of the images and the flr file contained in this folder and 2 | its subordinates is as follows: 3 | 4 | Copyright (C) 2019 DeNA Co., Ltd. All rights Reserved. 5 | 6 | 7 | ANY INCLUDED IMAGES ARE PROVIDED FOR TESTING PURPOSES ONLY. 8 | NO FURTHER USE OR DISTRIBUTION OF THESE IMAGES IS ALLOWED. 9 | --------------------------------------------------------------------------------