From 910d19f649dd24c14fb80dc895db6c1875e35c2e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cu=CC=9Bo=CC=9Bng=20Nguye=CC=82=CC=83n?= Date: Tue, 16 Feb 2021 05:16:43 +0700 Subject: [PATCH] iOS --- .github/workflows/main.yml | 2 +- .run/AndroidDev.run.xml | 8 + .run/Dev.run.xml | 9 - .run/IosDev.run.xml | 6 + .run/instrument_checker.dart.run.xml | 7 + .../com/chaomao/hitnotes/MainActivity.kt | 2 +- .../hitnotes/SoundMethodCallHandler.kt | 77 ++ .../com/chaomao/hitnotes/SoundPlayerPlugin.kt | 97 -- database/db.json | 1010 ++++------------- ios/.gitignore | 1 + ios/Flutter/Debug.xcconfig | 1 + ios/Flutter/Release.xcconfig | 1 + ios/Podfile | 41 + ios/Podfile.lock | 538 +++++++++ ios/Runner.xcodeproj/project.pbxproj | 127 ++- .../xcshareddata/xcschemes/Runner.xcscheme | 8 +- .../contents.xcworkspacedata | 3 + ios/Runner/AppDelegate.swift | 17 +- .../Icon-App-1024x1024@1x.png | Bin 10932 -> 45653 bytes .../AppIcon.appiconset/Icon-App-20x20@1x.png | Bin 564 -> 774 bytes .../AppIcon.appiconset/Icon-App-20x20@2x.png | Bin 1283 -> 1490 bytes .../AppIcon.appiconset/Icon-App-20x20@3x.png | Bin 1588 -> 2278 bytes .../AppIcon.appiconset/Icon-App-29x29@1x.png | Bin 1025 -> 1118 bytes .../AppIcon.appiconset/Icon-App-29x29@2x.png | Bin 1716 -> 2157 bytes .../AppIcon.appiconset/Icon-App-29x29@3x.png | Bin 1920 -> 3309 bytes .../AppIcon.appiconset/Icon-App-40x40@1x.png | Bin 1283 -> 1490 bytes .../AppIcon.appiconset/Icon-App-40x40@2x.png | Bin 1895 -> 3023 bytes .../AppIcon.appiconset/Icon-App-40x40@3x.png | Bin 2665 -> 4547 bytes .../AppIcon.appiconset/Icon-App-60x60@2x.png | Bin 2665 -> 4547 bytes .../AppIcon.appiconset/Icon-App-60x60@3x.png | Bin 3831 -> 6969 bytes .../AppIcon.appiconset/Icon-App-76x76@1x.png | Bin 1888 -> 2894 bytes .../AppIcon.appiconset/Icon-App-76x76@2x.png | Bin 3294 -> 5824 bytes .../Icon-App-83.5x83.5@2x.png | Bin 3612 -> 6416 bytes .../LaunchImage.imageset/LaunchImage.png | Bin 68 -> 12376 bytes .../LaunchImage.imageset/LaunchImage@2x.png | Bin 68 -> 30605 bytes .../LaunchImage.imageset/LaunchImage@3x.png | Bin 68 -> 55304 bytes .../LaunchImage.imageset/README.md | 5 - ios/Runner/Info.plist | 22 +- ios/Runner/SoundMethodCallHandler.swift | 71 ++ lib/authentication/authentication_bloc.dart | 6 +- lib/game/complete_dialog.dart | 133 +-- lib/game/game_widget.dart | 169 +-- lib/game/pause_dialog.dart | 54 +- lib/game/tile/tile_converter.dart | 2 +- lib/game_config/game_config_widget.dart | 223 ++-- lib/home/home_bloc.dart | 42 - lib/home/home_event.dart | 16 - lib/home/home_state.dart | 24 - lib/home/home_widget.dart | 7 +- lib/instrument/instrument.dart | 8 +- lib/instrument/instrument.g.dart | 123 +- lib/instrument/pitch_note.dart | 16 - lib/instrument/pitch_note.g.dart | 145 --- lib/instrument_checker.dart | 55 + lib/main.dart | 10 +- lib/midi_processor.dart | 74 +- lib/serializers.dart | 2 - lib/serializers.g.dart | 5 +- lib/setting/setting_bloc.dart | 20 +- lib/setting/setting_event.dart | 10 + lib/song_checker.dart | 62 +- lib/sound_player.dart | 32 +- lib/splash_widget.dart | 2 - lib/user/user_bloc.dart | 11 + lib/user/user_repository.dart | 2 +- lib/user/user_repository_impl.dart | 2 +- lib/user/user_widget.dart | 422 +++---- pubspec.lock | 6 +- pubspec.yaml | 6 +- resources/.gitignore | 1 + resources/gen_ios-images.py | 26 + resources/gen_ios-launch-images.py | 29 + resources/ios-images/ic_launcher.svg | 5 + resources/ios-launch-images/LaunchImage.svg | 7 + .../31.mp3 | Bin .../33.mp3 | Bin .../36.mp3 | Bin .../39.mp3 | Bin .../43.mp3 | Bin .../45.mp3 | Bin .../48.mp3 | Bin .../52.mp3 | Bin .../54.mp3 | Bin .../57.mp3 | Bin .../60.mp3 | Bin .../63.mp3 | Bin .../66.mp3 | Bin .../69.mp3 | Bin .../72.mp3 | Bin .../75.mp3 | Bin .../78.mp3 | Bin .../81.mp3 | Bin .../84.mp3 | Bin .../40.mp3 | Bin .../44.mp3 | Bin .../48.mp3 | Bin .../52.mp3 | Bin .../56.mp3 | Bin .../60.mp3 | Bin .../65.mp3 | Bin .../68.mp3 | Bin .../72.mp3 | Bin .../76.mp3 | Bin .../80.mp3 | Bin .../84.mp3 | Bin 105 files changed, 1932 insertions(+), 1878 deletions(-) create mode 100644 .run/AndroidDev.run.xml delete mode 100644 .run/Dev.run.xml create mode 100644 .run/IosDev.run.xml create mode 100644 .run/instrument_checker.dart.run.xml create mode 100644 android/app/src/main/kotlin/com/chaomao/hitnotes/SoundMethodCallHandler.kt delete mode 100644 android/app/src/main/kotlin/com/chaomao/hitnotes/SoundPlayerPlugin.kt create mode 100644 ios/Podfile create mode 100644 ios/Podfile.lock delete mode 100644 ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md create mode 100644 ios/Runner/SoundMethodCallHandler.swift delete mode 100644 lib/home/home_bloc.dart delete mode 100644 lib/home/home_event.dart delete mode 100644 lib/home/home_state.dart delete mode 100644 lib/instrument/pitch_note.dart delete mode 100644 lib/instrument/pitch_note.g.dart create mode 100644 lib/instrument_checker.dart create mode 100644 resources/gen_ios-images.py create mode 100644 resources/gen_ios-launch-images.py create mode 100644 resources/ios-images/ic_launcher.svg create mode 100644 resources/ios-launch-images/LaunchImage.svg rename storage/sounds/{acoustic-guitar => acoustic_guitar}/31.mp3 (100%) rename storage/sounds/{acoustic-guitar => acoustic_guitar}/33.mp3 (100%) rename storage/sounds/{acoustic-guitar => acoustic_guitar}/36.mp3 (100%) rename storage/sounds/{acoustic-guitar => acoustic_guitar}/39.mp3 (100%) rename storage/sounds/{acoustic-guitar => acoustic_guitar}/43.mp3 (100%) rename storage/sounds/{acoustic-guitar => acoustic_guitar}/45.mp3 (100%) rename storage/sounds/{acoustic-guitar => acoustic_guitar}/48.mp3 (100%) rename storage/sounds/{acoustic-guitar => acoustic_guitar}/52.mp3 (100%) rename storage/sounds/{acoustic-guitar => acoustic_guitar}/54.mp3 (100%) rename storage/sounds/{acoustic-guitar => acoustic_guitar}/57.mp3 (100%) rename storage/sounds/{acoustic-guitar => acoustic_guitar}/60.mp3 (100%) rename storage/sounds/{acoustic-guitar => acoustic_guitar}/63.mp3 (100%) rename storage/sounds/{acoustic-guitar => acoustic_guitar}/66.mp3 (100%) rename storage/sounds/{acoustic-guitar => acoustic_guitar}/69.mp3 (100%) rename storage/sounds/{acoustic-guitar => acoustic_guitar}/72.mp3 (100%) rename storage/sounds/{acoustic-guitar => acoustic_guitar}/75.mp3 (100%) rename storage/sounds/{acoustic-guitar => acoustic_guitar}/78.mp3 (100%) rename storage/sounds/{acoustic-guitar => acoustic_guitar}/81.mp3 (100%) rename storage/sounds/{acoustic-guitar => acoustic_guitar}/84.mp3 (100%) rename storage/sounds/{electric-guitar => electric_guitar}/40.mp3 (100%) rename storage/sounds/{electric-guitar => electric_guitar}/44.mp3 (100%) rename storage/sounds/{electric-guitar => electric_guitar}/48.mp3 (100%) rename storage/sounds/{electric-guitar => electric_guitar}/52.mp3 (100%) rename storage/sounds/{electric-guitar => electric_guitar}/56.mp3 (100%) rename storage/sounds/{electric-guitar => electric_guitar}/60.mp3 (100%) rename storage/sounds/{electric-guitar => electric_guitar}/65.mp3 (100%) rename storage/sounds/{electric-guitar => electric_guitar}/68.mp3 (100%) rename storage/sounds/{electric-guitar => electric_guitar}/72.mp3 (100%) rename storage/sounds/{electric-guitar => electric_guitar}/76.mp3 (100%) rename storage/sounds/{electric-guitar => electric_guitar}/80.mp3 (100%) rename storage/sounds/{electric-guitar => electric_guitar}/84.mp3 (100%) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index e297939f..ed8cabd4 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -6,7 +6,7 @@ on: - master env: - flutter_version: "1.22.5" + flutter_version: "1.22.6" jobs: buildApk: diff --git a/.run/AndroidDev.run.xml b/.run/AndroidDev.run.xml new file mode 100644 index 00000000..4cfb2646 --- /dev/null +++ b/.run/AndroidDev.run.xml @@ -0,0 +1,8 @@ + + + + \ No newline at end of file diff --git a/.run/Dev.run.xml b/.run/Dev.run.xml deleted file mode 100644 index 8e84394c..00000000 --- a/.run/Dev.run.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - - \ No newline at end of file diff --git a/.run/IosDev.run.xml b/.run/IosDev.run.xml new file mode 100644 index 00000000..fc3affbe --- /dev/null +++ b/.run/IosDev.run.xml @@ -0,0 +1,6 @@ + + + + \ No newline at end of file diff --git a/.run/instrument_checker.dart.run.xml b/.run/instrument_checker.dart.run.xml new file mode 100644 index 00000000..fbaacbb0 --- /dev/null +++ b/.run/instrument_checker.dart.run.xml @@ -0,0 +1,7 @@ + + + + \ No newline at end of file diff --git a/android/app/src/main/kotlin/com/chaomao/hitnotes/MainActivity.kt b/android/app/src/main/kotlin/com/chaomao/hitnotes/MainActivity.kt index 0a3d8549..dfde49ca 100644 --- a/android/app/src/main/kotlin/com/chaomao/hitnotes/MainActivity.kt +++ b/android/app/src/main/kotlin/com/chaomao/hitnotes/MainActivity.kt @@ -8,6 +8,6 @@ import io.flutter.plugin.common.MethodChannel class MainActivity : FlutterActivity() { override fun configureFlutterEngine(@NonNull flutterEngine: FlutterEngine) { super.configureFlutterEngine(flutterEngine) - MethodChannel(flutterEngine.dartExecutor.binaryMessenger, "com.chaomao.hitnotes/sound_player").setMethodCallHandler(SoundPlayerPlugin()) + MethodChannel(flutterEngine.dartExecutor.binaryMessenger, "com.chaomao.hitnotes/sound_player").setMethodCallHandler(SoundMethodCallHandler()) } } diff --git a/android/app/src/main/kotlin/com/chaomao/hitnotes/SoundMethodCallHandler.kt b/android/app/src/main/kotlin/com/chaomao/hitnotes/SoundMethodCallHandler.kt new file mode 100644 index 00000000..dbeccc2e --- /dev/null +++ b/android/app/src/main/kotlin/com/chaomao/hitnotes/SoundMethodCallHandler.kt @@ -0,0 +1,77 @@ +package com.chaomao.hitnotes + +import android.media.AudioAttributes +import android.media.AudioManager +import android.media.SoundPool +import android.os.Build +import io.flutter.plugin.common.MethodCall +import io.flutter.plugin.common.MethodChannel +import kotlin.math.pow + +class SoundMethodCallHandler : MethodChannel.MethodCallHandler { + private lateinit var soundPool: SoundPool + private var loadedCount = 0 + private var soundIds = mapOf() + private var rates = mapOf() + private var activeSounds = arrayListOf() + private val maxStreams = 8 + + override fun onMethodCall(methodCall: MethodCall, result: MethodChannel.Result) { + when (methodCall.method) { + "load" -> { + val arguments = methodCall.arguments as Map + val soundPaths = arguments["soundPaths"] as Map + val baseNotes = arguments["baseNotes"] as Map + soundPool = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { + SoundPool.Builder() + .setMaxStreams(maxStreams) + .setAudioAttributes(AudioAttributes.Builder().setLegacyStreamType + (AudioManager.STREAM_MUSIC) + .setUsage(AudioAttributes.USAGE_GAME) + .build()) + .build() + } else { + SoundPool(maxStreams, AudioManager.STREAM_MUSIC, 1) + }.apply { + setOnLoadCompleteListener { _, _, _ -> + loadedCount++ + if (loadedCount == soundPaths.size) { + result.success(null) + } + } + } + val ids = hashMapOf() + for ((baseNote, path) in soundPaths) { + val soundId = soundPool.load(path, 1) + ids[baseNote] = soundId + } + rates = baseNotes.mapValues { 2f.pow((it.key - it.value).toFloat() / 12f) } + this.soundIds = baseNotes.mapValues { ids[it.value]!! } + } + "play" -> { + val arguments = methodCall.arguments as Map + val note = arguments["note"] as Int + val streamId = soundPool.play(soundIds[note]!!, 1.0f, 1.0f, 0, + 0, rates[note]!!) + activeSounds.add(streamId) + if (activeSounds.size > maxStreams) { + val firstSound = activeSounds.first() + soundPool.stop(firstSound) + activeSounds.remove(firstSound) + } + result.success(null) + } + "release" -> { + if (this::soundPool.isInitialized) { + soundPool.release() + } + loadedCount = 0 + activeSounds.clear() + result.success(null) + } + else -> { + result.notImplemented() + } + } + } +} \ No newline at end of file diff --git a/android/app/src/main/kotlin/com/chaomao/hitnotes/SoundPlayerPlugin.kt b/android/app/src/main/kotlin/com/chaomao/hitnotes/SoundPlayerPlugin.kt deleted file mode 100644 index 1d91409d..00000000 --- a/android/app/src/main/kotlin/com/chaomao/hitnotes/SoundPlayerPlugin.kt +++ /dev/null @@ -1,97 +0,0 @@ -package com.chaomao.hitnotes - -import android.media.AudioAttributes -import android.media.AudioManager -import android.media.SoundPool -import android.os.Build -import io.flutter.plugin.common.MethodCall -import io.flutter.plugin.common.MethodChannel - -class SoundPlayerPlugin : MethodChannel.MethodCallHandler { - private lateinit var soundPool: SoundPool - private val loadingSounds = hashMapOf() - - override fun onMethodCall(methodCall: MethodCall, result: MethodChannel.Result) { - when (methodCall.method) { - "init" -> { - val arguments = methodCall.arguments as Map - val streamTypeIndex = arguments["streamType"] as Int - val maxStreams = arguments["maxStreams"] as Int - val streamType = when (streamTypeIndex) { - 0 -> AudioManager.STREAM_RING - 1 -> AudioManager.STREAM_ALARM - 2 -> AudioManager.STREAM_MUSIC - 3 -> AudioManager.STREAM_NOTIFICATION - else -> -1 - } - if (streamType > -1) { - soundPool = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { - val usage = when (streamType) { - AudioManager.STREAM_RING -> AudioAttributes.USAGE_NOTIFICATION_RINGTONE - AudioManager.STREAM_ALARM -> AudioAttributes.USAGE_ALARM - AudioManager.STREAM_NOTIFICATION -> AudioAttributes.USAGE_NOTIFICATION - else -> AudioAttributes.USAGE_GAME - } - SoundPool.Builder() - .setMaxStreams(maxStreams) - .setAudioAttributes(AudioAttributes.Builder().setLegacyStreamType - (streamType) - .setUsage(usage) - .build()) - .build() - } else { - SoundPool(maxStreams, streamType, 1) - }.apply { - setOnLoadCompleteListener { _, sampleId, status -> - val resultCallback = loadingSounds[sampleId] - resultCallback?.let { - if (status == 0) { - it.success(sampleId) - } else { - it.error("Loading failed", "Error code: $status", null) - } - loadingSounds.remove(sampleId) - } - } - } - result.success(null) - } else { - result.error("Init failed", null, null) - } - } - "load" -> { - val arguments = methodCall.arguments as Map - val path = arguments["path"] as String - val priority = arguments["priority"] as Int - val soundId = soundPool.load(path, priority) - if (soundId > -1) { - loadingSounds[soundId] = result - } else { - result.success(soundId) - } - } - "play" -> { - val arguments = methodCall.arguments as Map - val soundId = arguments["soundId"] as Int - val repeat = arguments["repeat"] as Int - val rate = arguments["rate"] as Double - val streamId = soundPool.play(soundId, 1.0f, 1.0f, 0, - repeat, rate.toFloat()) - result.success(streamId) - } - "stop" -> { - val arguments = methodCall.arguments as Map - val streamId = arguments["streamId"] as Int - soundPool.stop(streamId) - result.success(streamId) - } - "release" -> { - soundPool.release() - result.success(null) - } - else -> { - result.notImplemented() - } - } - } -} \ No newline at end of file diff --git a/database/db.json b/database/db.json index aaca257d..77e098a8 100644 --- a/database/db.json +++ b/database/db.json @@ -3,459 +3,246 @@ "instruments": { "acoustic_guitar": { "__collections__": {}, + "baseNotes": { + "31": 31, + "32": 31, + "33": 33, + "34": 33, + "35": 33, + "36": 36, + "37": 36, + "38": 36, + "39": 39, + "40": 39, + "41": 39, + "42": 43, + "43": 43, + "44": 43, + "45": 45, + "46": 45, + "47": 45, + "48": 48, + "49": 48, + "50": 48, + "51": 52, + "52": 52, + "53": 52, + "54": 54, + "55": 54, + "56": 54, + "57": 57, + "58": 57, + "59": 57, + "60": 60, + "61": 60, + "62": 60, + "63": 63, + "64": 63, + "65": 63, + "66": 66, + "67": 66, + "68": 66, + "69": 69, + "70": 69, + "71": 69, + "72": 72, + "73": 72, + "74": 72, + "75": 75, + "76": 75, + "77": 75, + "78": 78, + "79": 78, + "80": 78, + "81": 81, + "82": 81, + "83": 81, + "84": 84 + }, "id": "acoustic_guitar", "maxNote": 84, "minNote": 31, - "soundFiles": { - "31": "sounds/acoustic-guitar/31.mp3", - "33": "sounds/acoustic-guitar/33.mp3", - "36": "sounds/acoustic-guitar/36.mp3", - "39": "sounds/acoustic-guitar/39.mp3", - "43": "sounds/acoustic-guitar/43.mp3", - "45": "sounds/acoustic-guitar/45.mp3", - "48": "sounds/acoustic-guitar/48.mp3", - "52": "sounds/acoustic-guitar/52.mp3", - "54": "sounds/acoustic-guitar/54.mp3", - "57": "sounds/acoustic-guitar/57.mp3", - "60": "sounds/acoustic-guitar/60.mp3", - "63": "sounds/acoustic-guitar/63.mp3", - "66": "sounds/acoustic-guitar/66.mp3", - "69": "sounds/acoustic-guitar/69.mp3", - "72": "sounds/acoustic-guitar/72.mp3", - "75": "sounds/acoustic-guitar/75.mp3", - "78": "sounds/acoustic-guitar/78.mp3", - "81": "sounds/acoustic-guitar/81.mp3", - "84": "sounds/acoustic-guitar/84.mp3" - }, - "soundNotes": { - "31": { - "note": 31, - "pitch": 1 - }, - "32": { - "note": 31, - "pitch": 1.0594631 - }, - "33": { - "note": 33, - "pitch": 1 - }, - "34": { - "note": 33, - "pitch": 1.0594631 - }, - "35": { - "note": 33, - "pitch": 1.122462 - }, - "36": { - "note": 36, - "pitch": 1 - }, - "37": { - "note": 36, - "pitch": 1.0594631 - }, - "38": { - "note": 36, - "pitch": 1.122462 - }, - "39": { - "note": 39, - "pitch": 1 - }, - "40": { - "note": 39, - "pitch": 1.0594631 - }, - "41": { - "note": 39, - "pitch": 1.122462 - }, - "42": { - "note": 43, - "pitch": 0.9438743 - }, - "43": { - "note": 43, - "pitch": 1 - }, - "44": { - "note": 43, - "pitch": 1.0594631 - }, - "45": { - "note": 45, - "pitch": 1 - }, - "46": { - "note": 45, - "pitch": 1.0594631 - }, - "47": { - "note": 45, - "pitch": 1.122462 - }, - "48": { - "note": 48, - "pitch": 1 - }, - "49": { - "note": 48, - "pitch": 1.0594631 - }, - "50": { - "note": 48, - "pitch": 1.122462 - }, - "51": { - "note": 52, - "pitch": 0.9438743 - }, - "52": { - "note": 52, - "pitch": 1 - }, - "53": { - "note": 52, - "pitch": 1.0594631 - }, - "54": { - "note": 54, - "pitch": 1 - }, - "55": { - "note": 54, - "pitch": 1.0594631 - }, - "56": { - "note": 54, - "pitch": 1.122462 - }, - "57": { - "note": 57, - "pitch": 1 - }, - "58": { - "note": 57, - "pitch": 1.0594631 - }, - "59": { - "note": 57, - "pitch": 1.122462 - }, - "60": { - "note": 60, - "pitch": 1 - }, - "61": { - "note": 60, - "pitch": 1.0594631 - }, - "62": { - "note": 60, - "pitch": 1.122462 - }, - "63": { - "note": 63, - "pitch": 1 - }, - "64": { - "note": 63, - "pitch": 1.0594631 - }, - "65": { - "note": 63, - "pitch": 1.122462 - }, - "66": { - "note": 66, - "pitch": 1 - }, - "67": { - "note": 66, - "pitch": 1.0594631 - }, - "68": { - "note": 66, - "pitch": 1.122462 - }, - "69": { - "note": 69, - "pitch": 1 - }, - "70": { - "note": 69, - "pitch": 1.0594631 - }, - "71": { - "note": 69, - "pitch": 1.122462 - }, - "72": { - "note": 72, - "pitch": 1 - }, - "73": { - "note": 72, - "pitch": 1.0594631 - }, - "74": { - "note": 72, - "pitch": 1.122462 - }, - "75": { - "note": 75, - "pitch": 1 - }, - "76": { - "note": 75, - "pitch": 1.0594631 - }, - "77": { - "note": 75, - "pitch": 1.122462 - }, - "78": { - "note": 78, - "pitch": 1 - }, - "79": { - "note": 78, - "pitch": 1.0594631 - }, - "80": { - "note": 78, - "pitch": 1.122462 - }, - "81": { - "note": 81, - "pitch": 1 - }, - "82": { - "note": 81, - "pitch": 1.0594631 - }, - "83": { - "note": 81, - "pitch": 1.122462 - }, - "84": { - "note": 84, - "pitch": 1 - } - }, - "volume": 0.5 + "soundPaths": { + "31": "sounds/acoustic_guitar/31.mp3", + "33": "sounds/acoustic_guitar/33.mp3", + "36": "sounds/acoustic_guitar/36.mp3", + "39": "sounds/acoustic_guitar/39.mp3", + "43": "sounds/acoustic_guitar/43.mp3", + "45": "sounds/acoustic_guitar/45.mp3", + "48": "sounds/acoustic_guitar/48.mp3", + "52": "sounds/acoustic_guitar/52.mp3", + "54": "sounds/acoustic_guitar/54.mp3", + "57": "sounds/acoustic_guitar/57.mp3", + "60": "sounds/acoustic_guitar/60.mp3", + "63": "sounds/acoustic_guitar/63.mp3", + "66": "sounds/acoustic_guitar/66.mp3", + "69": "sounds/acoustic_guitar/69.mp3", + "72": "sounds/acoustic_guitar/72.mp3", + "75": "sounds/acoustic_guitar/75.mp3", + "78": "sounds/acoustic_guitar/78.mp3", + "81": "sounds/acoustic_guitar/81.mp3", + "84": "sounds/acoustic_guitar/84.mp3" + } }, "electric_guitar": { "__collections__": {}, + "baseNotes": { + "40": 40, + "41": 40, + "42": 40, + "43": 44, + "44": 44, + "45": 44, + "46": 44, + "47": 48, + "48": 48, + "49": 48, + "50": 48, + "51": 52, + "52": 52, + "53": 52, + "54": 52, + "55": 56, + "56": 56, + "57": 56, + "58": 56, + "59": 60, + "60": 60, + "61": 60, + "62": 60, + "63": 65, + "64": 65, + "65": 65, + "66": 65, + "67": 65, + "68": 68, + "69": 68, + "70": 68, + "71": 72, + "72": 72, + "73": 72, + "74": 72, + "75": 76, + "76": 76, + "77": 76, + "78": 76, + "79": 80, + "80": 80, + "81": 80, + "82": 80, + "83": 84, + "84": 84 + }, "id": "electric_guitar", "maxNote": 84, "minNote": 40, - "soundFiles": { - "40": "sounds/electric-guitar/40.mp3", - "44": "sounds/electric-guitar/44.mp3", - "48": "sounds/electric-guitar/48.mp3", - "52": "sounds/electric-guitar/52.mp3", - "56": "sounds/electric-guitar/56.mp3", - "60": "sounds/electric-guitar/60.mp3", - "65": "sounds/electric-guitar/65.mp3", - "68": "sounds/electric-guitar/68.mp3", - "72": "sounds/electric-guitar/72.mp3", - "76": "sounds/electric-guitar/76.mp3", - "80": "sounds/electric-guitar/80.mp3", - "84": "sounds/electric-guitar/84.mp3" - }, - "soundNotes": { - "40": { - "note": 40, - "pitch": 1 - }, - "41": { - "note": 40, - "pitch": 1.0594631 - }, - "42": { - "note": 40, - "pitch": 1.122462 - }, - "43": { - "note": 44, - "pitch": 0.9438743 - }, - "44": { - "note": 44, - "pitch": 1 - }, - "45": { - "note": 44, - "pitch": 1.0594631 - }, - "46": { - "note": 44, - "pitch": 1.122462 - }, - "47": { - "note": 48, - "pitch": 0.9438743 - }, - "48": { - "note": 48, - "pitch": 1 - }, - "49": { - "note": 48, - "pitch": 1.0594631 - }, - "50": { - "note": 48, - "pitch": 1.122462 - }, - "51": { - "note": 52, - "pitch": 0.9438743 - }, - "52": { - "note": 52, - "pitch": 1 - }, - "53": { - "note": 52, - "pitch": 1.0594631 - }, - "54": { - "note": 52, - "pitch": 1.122462 - }, - "55": { - "note": 56, - "pitch": 0.9438743 - }, - "56": { - "note": 56, - "pitch": 1 - }, - "57": { - "note": 56, - "pitch": 1.0594631 - }, - "58": { - "note": 56, - "pitch": 1.122462 - }, - "59": { - "note": 60, - "pitch": 0.9438743 - }, - "60": { - "note": 60, - "pitch": 1 - }, - "61": { - "note": 60, - "pitch": 1.0594631 - }, - "62": { - "note": 60, - "pitch": 1.122462 - }, - "63": { - "note": 65, - "pitch": 0.8908987 - }, - "64": { - "note": 65, - "pitch": 0.9438743 - }, - "65": { - "note": 65, - "pitch": 1 - }, - "66": { - "note": 65, - "pitch": 1.0594631 - }, - "67": { - "note": 65, - "pitch": 1.122462 - }, - "68": { - "note": 68, - "pitch": 1 - }, - "69": { - "note": 68, - "pitch": 1.0594631 - }, - "70": { - "note": 68, - "pitch": 1.122462 - }, - "71": { - "note": 72, - "pitch": 0.9438743 - }, - "72": { - "note": 72, - "pitch": 1 - }, - "73": { - "note": 72, - "pitch": 1.0594631 - }, - "74": { - "note": 72, - "pitch": 1.122462 - }, - "75": { - "note": 76, - "pitch": 0.9438743 - }, - "76": { - "note": 76, - "pitch": 1 - }, - "77": { - "note": 76, - "pitch": 1.0594631 - }, - "78": { - "note": 76, - "pitch": 1.122462 - }, - "79": { - "note": 80, - "pitch": 0.9438743 - }, - "80": { - "note": 80, - "pitch": 1 - }, - "81": { - "note": 80, - "pitch": 1.0594631 - }, - "82": { - "note": 80, - "pitch": 1.122462 - }, - "83": { - "note": 84, - "pitch": 0.9438743 - }, - "84": { - "note": 84, - "pitch": 1 - } - }, - "volume": 0.3 + "soundPaths": { + "40": "sounds/electric_guitar/40.mp3", + "44": "sounds/electric_guitar/44.mp3", + "48": "sounds/electric_guitar/48.mp3", + "52": "sounds/electric_guitar/52.mp3", + "56": "sounds/electric_guitar/56.mp3", + "60": "sounds/electric_guitar/60.mp3", + "65": "sounds/electric_guitar/65.mp3", + "68": "sounds/electric_guitar/68.mp3", + "72": "sounds/electric_guitar/72.mp3", + "76": "sounds/electric_guitar/76.mp3", + "80": "sounds/electric_guitar/80.mp3", + "84": "sounds/electric_guitar/84.mp3" + } }, "piano": { "__collections__": {}, + "baseNotes": { + "100": 99, + "101": 99, + "102": 102, + "103": 102, + "104": 102, + "105": 105, + "106": 105, + "107": 107, + "24": 24, + "25": 24, + "26": 24, + "27": 30, + "28": 30, + "29": 30, + "30": 30, + "31": 30, + "32": 30, + "33": 35, + "34": 35, + "35": 35, + "36": 35, + "37": 35, + "38": 39, + "39": 39, + "40": 39, + "41": 39, + "42": 42, + "43": 42, + "44": 42, + "45": 47, + "46": 47, + "47": 47, + "48": 47, + "49": 47, + "50": 51, + "51": 51, + "52": 51, + "53": 51, + "54": 54, + "55": 54, + "56": 54, + "57": 57, + "58": 57, + "59": 57, + "60": 60, + "61": 60, + "62": 60, + "63": 63, + "64": 63, + "65": 63, + "66": 66, + "67": 66, + "68": 66, + "69": 69, + "70": 69, + "71": 69, + "72": 72, + "73": 72, + "74": 72, + "75": 75, + "76": 75, + "77": 75, + "78": 78, + "79": 78, + "80": 78, + "81": 81, + "82": 81, + "83": 81, + "84": 84, + "85": 84, + "86": 84, + "87": 87, + "88": 87, + "89": 87, + "90": 90, + "91": 90, + "92": 90, + "93": 93, + "94": 93, + "95": 93, + "96": 96, + "97": 96, + "98": 96, + "99": 99 + }, "id": "piano", - "maxNote": 108, + "maxNote": 107, "minNote": 24, - "soundFiles": { + "soundPaths": { "102": "sounds/piano/102.mp3", "105": "sounds/piano/105.mp3", "107": "sounds/piano/107.mp3", @@ -482,350 +269,7 @@ "93": "sounds/piano/93.mp3", "96": "sounds/piano/96.mp3", "99": "sounds/piano/99.mp3" - }, - "soundNotes": { - "100": { - "note": 99, - "pitch": 1.0594631 - }, - "101": { - "note": 99, - "pitch": 1.122462 - }, - "102": { - "note": 102, - "pitch": 1 - }, - "103": { - "note": 102, - "pitch": 1.0594631 - }, - "104": { - "note": 102, - "pitch": 1.122462 - }, - "105": { - "note": 105, - "pitch": 1 - }, - "106": { - "note": 105, - "pitch": 1.0594631 - }, - "107": { - "note": 107, - "pitch": 1 - }, - "108": { - "note": 107, - "pitch": 1.0594631 - }, - "24": { - "note": 24, - "pitch": 1 - }, - "25": { - "note": 24, - "pitch": 1.0594631 - }, - "26": { - "note": 24, - "pitch": 1.122462 - }, - "27": { - "note": 30, - "pitch": 0.8408964 - }, - "28": { - "note": 30, - "pitch": 0.8908987 - }, - "29": { - "note": 30, - "pitch": 0.9438743 - }, - "30": { - "note": 30, - "pitch": 1 - }, - "31": { - "note": 30, - "pitch": 1.0594631 - }, - "32": { - "note": 30, - "pitch": 1.122462 - }, - "33": { - "note": 35, - "pitch": 0.8908987 - }, - "34": { - "note": 35, - "pitch": 0.9438743 - }, - "35": { - "note": 35, - "pitch": 1 - }, - "36": { - "note": 35, - "pitch": 1.0594631 - }, - "37": { - "note": 35, - "pitch": 1.122462 - }, - "38": { - "note": 39, - "pitch": 0.9438743 - }, - "39": { - "note": 39, - "pitch": 1 - }, - "40": { - "note": 39, - "pitch": 1.0594631 - }, - "41": { - "note": 39, - "pitch": 1.122462 - }, - "42": { - "note": 42, - "pitch": 1 - }, - "43": { - "note": 42, - "pitch": 1.0594631 - }, - "44": { - "note": 42, - "pitch": 1.122462 - }, - "45": { - "note": 47, - "pitch": 0.8908987 - }, - "46": { - "note": 47, - "pitch": 0.9438743 - }, - "47": { - "note": 47, - "pitch": 1 - }, - "48": { - "note": 47, - "pitch": 1.0594631 - }, - "49": { - "note": 47, - "pitch": 1.122462 - }, - "50": { - "note": 51, - "pitch": 0.9438743 - }, - "51": { - "note": 51, - "pitch": 1 - }, - "52": { - "note": 51, - "pitch": 1.0594631 - }, - "53": { - "note": 51, - "pitch": 1.122462 - }, - "54": { - "note": 54, - "pitch": 1 - }, - "55": { - "note": 54, - "pitch": 1.0594631 - }, - "56": { - "note": 54, - "pitch": 1.122462 - }, - "57": { - "note": 57, - "pitch": 1 - }, - "58": { - "note": 57, - "pitch": 1.0594631 - }, - "59": { - "note": 57, - "pitch": 1.122462 - }, - "60": { - "note": 60, - "pitch": 1 - }, - "61": { - "note": 60, - "pitch": 1.0594631 - }, - "62": { - "note": 60, - "pitch": 1.122462 - }, - "63": { - "note": 63, - "pitch": 1 - }, - "64": { - "note": 63, - "pitch": 1.0594631 - }, - "65": { - "note": 63, - "pitch": 1.122462 - }, - "66": { - "note": 66, - "pitch": 1 - }, - "67": { - "note": 66, - "pitch": 1.0594631 - }, - "68": { - "note": 66, - "pitch": 1.122462 - }, - "69": { - "note": 69, - "pitch": 1 - }, - "70": { - "note": 69, - "pitch": 1.0594631 - }, - "71": { - "note": 69, - "pitch": 1.122462 - }, - "72": { - "note": 72, - "pitch": 1 - }, - "73": { - "note": 72, - "pitch": 1.0594631 - }, - "74": { - "note": 72, - "pitch": 1.122462 - }, - "75": { - "note": 75, - "pitch": 1 - }, - "76": { - "note": 75, - "pitch": 1.0594631 - }, - "77": { - "note": 75, - "pitch": 1.122462 - }, - "78": { - "note": 78, - "pitch": 1 - }, - "79": { - "note": 78, - "pitch": 1.0594631 - }, - "80": { - "note": 78, - "pitch": 1.122462 - }, - "81": { - "note": 81, - "pitch": 1 - }, - "82": { - "note": 81, - "pitch": 1.0594631 - }, - "83": { - "note": 81, - "pitch": 1.122462 - }, - "84": { - "note": 84, - "pitch": 1 - }, - "85": { - "note": 84, - "pitch": 1.0594631 - }, - "86": { - "note": 84, - "pitch": 1.122462 - }, - "87": { - "note": 87, - "pitch": 1 - }, - "88": { - "note": 87, - "pitch": 1.0594631 - }, - "89": { - "note": 87, - "pitch": 1.122462 - }, - "90": { - "note": 90, - "pitch": 1 - }, - "91": { - "note": 90, - "pitch": 1.0594631 - }, - "92": { - "note": 90, - "pitch": 1.122462 - }, - "93": { - "note": 93, - "pitch": 1 - }, - "94": { - "note": 93, - "pitch": 1.0594631 - }, - "95": { - "note": 93, - "pitch": 1.122462 - }, - "96": { - "note": 96, - "pitch": 1 - }, - "97": { - "note": 96, - "pitch": 1.0594631 - }, - "98": { - "note": 96, - "pitch": 1.122462 - }, - "99": { - "note": 99, - "pitch": 1 - } - }, - "volume": 0.5 + } } }, "songs": { diff --git a/ios/.gitignore b/ios/.gitignore index e96ef602..4f8654b8 100644 --- a/ios/.gitignore +++ b/ios/.gitignore @@ -30,3 +30,4 @@ Runner/GeneratedPluginRegistrant.* !default.mode2v3 !default.pbxuser !default.perspectivev3 +/Runner/GoogleService-Info.plist diff --git a/ios/Flutter/Debug.xcconfig b/ios/Flutter/Debug.xcconfig index 592ceee8..e8efba11 100644 --- a/ios/Flutter/Debug.xcconfig +++ b/ios/Flutter/Debug.xcconfig @@ -1 +1,2 @@ +#include "Pods/Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig" #include "Generated.xcconfig" diff --git a/ios/Flutter/Release.xcconfig b/ios/Flutter/Release.xcconfig index 592ceee8..399e9340 100644 --- a/ios/Flutter/Release.xcconfig +++ b/ios/Flutter/Release.xcconfig @@ -1 +1,2 @@ +#include "Pods/Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig" #include "Generated.xcconfig" diff --git a/ios/Podfile b/ios/Podfile new file mode 100644 index 00000000..9411102b --- /dev/null +++ b/ios/Podfile @@ -0,0 +1,41 @@ +# Uncomment this line to define a global platform for your project +platform :ios, '10.0' + +# CocoaPods analytics sends network stats synchronously affecting flutter build latency. +ENV['COCOAPODS_DISABLE_STATS'] = 'true' + +project 'Runner', { + 'Debug' => :debug, + 'Profile' => :release, + 'Release' => :release, +} + +def flutter_root + generated_xcode_build_settings_path = File.expand_path(File.join('..', 'Flutter', 'Generated.xcconfig'), __FILE__) + unless File.exist?(generated_xcode_build_settings_path) + raise "#{generated_xcode_build_settings_path} must exist. If you're running pod install manually, make sure flutter pub get is executed first" + end + + File.foreach(generated_xcode_build_settings_path) do |line| + matches = line.match(/FLUTTER_ROOT\=(.*)/) + return matches[1].strip if matches + end + raise "FLUTTER_ROOT not found in #{generated_xcode_build_settings_path}. Try deleting Generated.xcconfig, then run flutter pub get" +end + +require File.expand_path(File.join('packages', 'flutter_tools', 'bin', 'podhelper'), flutter_root) + +flutter_ios_podfile_setup + +target 'Runner' do + use_frameworks! + use_modular_headers! + + flutter_install_all_ios_pods File.dirname(File.realpath(__FILE__)) +end + +post_install do |installer| + installer.pods_project.targets.each do |target| + flutter_additional_ios_build_settings(target) + end +end diff --git a/ios/Podfile.lock b/ios/Podfile.lock new file mode 100644 index 00000000..069ada0d --- /dev/null +++ b/ios/Podfile.lock @@ -0,0 +1,538 @@ +PODS: + - abseil/algorithm (0.20200225.0): + - abseil/algorithm/algorithm (= 0.20200225.0) + - abseil/algorithm/container (= 0.20200225.0) + - abseil/algorithm/algorithm (0.20200225.0): + - abseil/base/config + - abseil/algorithm/container (0.20200225.0): + - abseil/algorithm/algorithm + - abseil/base/core_headers + - abseil/meta/type_traits + - abseil/base (0.20200225.0): + - abseil/base/atomic_hook (= 0.20200225.0) + - abseil/base/base (= 0.20200225.0) + - abseil/base/base_internal (= 0.20200225.0) + - abseil/base/bits (= 0.20200225.0) + - abseil/base/config (= 0.20200225.0) + - abseil/base/core_headers (= 0.20200225.0) + - abseil/base/dynamic_annotations (= 0.20200225.0) + - abseil/base/endian (= 0.20200225.0) + - abseil/base/errno_saver (= 0.20200225.0) + - abseil/base/exponential_biased (= 0.20200225.0) + - abseil/base/log_severity (= 0.20200225.0) + - abseil/base/malloc_internal (= 0.20200225.0) + - abseil/base/periodic_sampler (= 0.20200225.0) + - abseil/base/pretty_function (= 0.20200225.0) + - abseil/base/raw_logging_internal (= 0.20200225.0) + - abseil/base/spinlock_wait (= 0.20200225.0) + - abseil/base/throw_delegate (= 0.20200225.0) + - abseil/base/atomic_hook (0.20200225.0): + - abseil/base/config + - abseil/base/core_headers + - abseil/base/base (0.20200225.0): + - abseil/base/atomic_hook + - abseil/base/base_internal + - abseil/base/config + - abseil/base/core_headers + - abseil/base/dynamic_annotations + - abseil/base/log_severity + - abseil/base/raw_logging_internal + - abseil/base/spinlock_wait + - abseil/meta/type_traits + - abseil/base/base_internal (0.20200225.0): + - abseil/base/config + - abseil/meta/type_traits + - abseil/base/bits (0.20200225.0): + - abseil/base/config + - abseil/base/core_headers + - abseil/base/config (0.20200225.0) + - abseil/base/core_headers (0.20200225.0): + - abseil/base/config + - abseil/base/dynamic_annotations (0.20200225.0) + - abseil/base/endian (0.20200225.0): + - abseil/base/config + - abseil/base/core_headers + - abseil/base/errno_saver (0.20200225.0): + - abseil/base/config + - abseil/base/exponential_biased (0.20200225.0): + - abseil/base/config + - abseil/base/core_headers + - abseil/base/log_severity (0.20200225.0): + - abseil/base/config + - abseil/base/core_headers + - abseil/base/malloc_internal (0.20200225.0): + - abseil/base/base + - abseil/base/base_internal + - abseil/base/config + - abseil/base/core_headers + - abseil/base/dynamic_annotations + - abseil/base/raw_logging_internal + - abseil/base/periodic_sampler (0.20200225.0): + - abseil/base/core_headers + - abseil/base/exponential_biased + - abseil/base/pretty_function (0.20200225.0) + - abseil/base/raw_logging_internal (0.20200225.0): + - abseil/base/atomic_hook + - abseil/base/config + - abseil/base/core_headers + - abseil/base/log_severity + - abseil/base/spinlock_wait (0.20200225.0): + - abseil/base/base_internal + - abseil/base/core_headers + - abseil/base/errno_saver + - abseil/base/throw_delegate (0.20200225.0): + - abseil/base/config + - abseil/base/raw_logging_internal + - abseil/container/compressed_tuple (0.20200225.0): + - abseil/utility/utility + - abseil/container/inlined_vector (0.20200225.0): + - abseil/algorithm/algorithm + - abseil/base/core_headers + - abseil/base/throw_delegate + - abseil/container/inlined_vector_internal + - abseil/memory/memory + - abseil/container/inlined_vector_internal (0.20200225.0): + - abseil/base/core_headers + - abseil/container/compressed_tuple + - abseil/memory/memory + - abseil/meta/type_traits + - abseil/types/span + - abseil/memory (0.20200225.0): + - abseil/memory/memory (= 0.20200225.0) + - abseil/memory/memory (0.20200225.0): + - abseil/base/core_headers + - abseil/meta/type_traits + - abseil/meta (0.20200225.0): + - abseil/meta/type_traits (= 0.20200225.0) + - abseil/meta/type_traits (0.20200225.0): + - abseil/base/config + - abseil/numeric/int128 (0.20200225.0): + - abseil/base/config + - abseil/base/core_headers + - abseil/strings/internal (0.20200225.0): + - abseil/base/config + - abseil/base/core_headers + - abseil/base/endian + - abseil/base/raw_logging_internal + - abseil/meta/type_traits + - abseil/strings/str_format (0.20200225.0): + - abseil/strings/str_format_internal + - abseil/strings/str_format_internal (0.20200225.0): + - abseil/base/config + - abseil/base/core_headers + - abseil/meta/type_traits + - abseil/numeric/int128 + - abseil/strings/strings + - abseil/types/span + - abseil/strings/strings (0.20200225.0): + - abseil/base/base + - abseil/base/bits + - abseil/base/config + - abseil/base/core_headers + - abseil/base/endian + - abseil/base/raw_logging_internal + - abseil/base/throw_delegate + - abseil/memory/memory + - abseil/meta/type_traits + - abseil/numeric/int128 + - abseil/strings/internal + - abseil/time (0.20200225.0): + - abseil/time/internal (= 0.20200225.0) + - abseil/time/time (= 0.20200225.0) + - abseil/time/internal (0.20200225.0): + - abseil/time/internal/cctz (= 0.20200225.0) + - abseil/time/internal/cctz (0.20200225.0): + - abseil/time/internal/cctz/civil_time (= 0.20200225.0) + - abseil/time/internal/cctz/time_zone (= 0.20200225.0) + - abseil/time/internal/cctz/civil_time (0.20200225.0): + - abseil/base/config + - abseil/time/internal/cctz/time_zone (0.20200225.0): + - abseil/base/config + - abseil/time/internal/cctz/civil_time + - abseil/time/time (0.20200225.0): + - abseil/base/base + - abseil/base/core_headers + - abseil/base/raw_logging_internal + - abseil/numeric/int128 + - abseil/strings/strings + - abseil/time/internal/cctz/civil_time + - abseil/time/internal/cctz/time_zone + - abseil/types (0.20200225.0): + - abseil/types/any (= 0.20200225.0) + - abseil/types/bad_any_cast (= 0.20200225.0) + - abseil/types/bad_any_cast_impl (= 0.20200225.0) + - abseil/types/bad_optional_access (= 0.20200225.0) + - abseil/types/bad_variant_access (= 0.20200225.0) + - abseil/types/compare (= 0.20200225.0) + - abseil/types/optional (= 0.20200225.0) + - abseil/types/span (= 0.20200225.0) + - abseil/types/variant (= 0.20200225.0) + - abseil/types/any (0.20200225.0): + - abseil/base/config + - abseil/base/core_headers + - abseil/meta/type_traits + - abseil/types/bad_any_cast + - abseil/utility/utility + - abseil/types/bad_any_cast (0.20200225.0): + - abseil/base/config + - abseil/types/bad_any_cast_impl + - abseil/types/bad_any_cast_impl (0.20200225.0): + - abseil/base/config + - abseil/base/raw_logging_internal + - abseil/types/bad_optional_access (0.20200225.0): + - abseil/base/config + - abseil/base/raw_logging_internal + - abseil/types/bad_variant_access (0.20200225.0): + - abseil/base/config + - abseil/base/raw_logging_internal + - abseil/types/compare (0.20200225.0): + - abseil/base/core_headers + - abseil/meta/type_traits + - abseil/types/optional (0.20200225.0): + - abseil/base/base_internal + - abseil/base/config + - abseil/base/core_headers + - abseil/memory/memory + - abseil/meta/type_traits + - abseil/types/bad_optional_access + - abseil/utility/utility + - abseil/types/span (0.20200225.0): + - abseil/algorithm/algorithm + - abseil/base/core_headers + - abseil/base/throw_delegate + - abseil/meta/type_traits + - abseil/types/variant (0.20200225.0): + - abseil/base/base_internal + - abseil/base/config + - abseil/base/core_headers + - abseil/meta/type_traits + - abseil/types/bad_variant_access + - abseil/utility/utility + - abseil/utility/utility (0.20200225.0): + - abseil/base/base_internal + - abseil/base/config + - abseil/meta/type_traits + - AppAuth (1.4.0): + - AppAuth/Core (= 1.4.0) + - AppAuth/ExternalUserAgent (= 1.4.0) + - AppAuth/Core (1.4.0) + - AppAuth/ExternalUserAgent (1.4.0) + - audioplayers (0.0.1): + - Flutter + - BoringSSL-GRPC (0.0.7): + - BoringSSL-GRPC/Implementation (= 0.0.7) + - BoringSSL-GRPC/Interface (= 0.0.7) + - BoringSSL-GRPC/Implementation (0.0.7): + - BoringSSL-GRPC/Interface (= 0.0.7) + - BoringSSL-GRPC/Interface (0.0.7) + - cloud_firestore (0.16.0): + - Firebase/Firestore (= 7.3.0) + - firebase_core + - Flutter + - cloud_functions (0.9.0): + - Firebase/Functions (= 7.3.0) + - firebase_core + - Flutter + - device_info (0.0.1): + - Flutter + - FBSDKCoreKit (5.15.1): + - FBSDKCoreKit/Basics (= 5.15.1) + - FBSDKCoreKit/Core (= 5.15.1) + - FBSDKCoreKit/Basics (5.15.1) + - FBSDKCoreKit/Core (5.15.1): + - FBSDKCoreKit/Basics + - FBSDKLoginKit (5.15.1): + - FBSDKLoginKit/Login (= 5.15.1) + - FBSDKLoginKit/Login (5.15.1): + - FBSDKCoreKit (~> 5.0) + - Firebase/Auth (7.3.0): + - Firebase/CoreOnly + - FirebaseAuth (~> 7.3.0) + - Firebase/CoreOnly (7.3.0): + - FirebaseCore (= 7.3.0) + - Firebase/DynamicLinks (7.3.0): + - Firebase/CoreOnly + - FirebaseDynamicLinks (~> 7.3.0) + - Firebase/Firestore (7.3.0): + - Firebase/CoreOnly + - FirebaseFirestore (~> 7.3.0) + - Firebase/Functions (7.3.0): + - Firebase/CoreOnly + - FirebaseFunctions (~> 7.3.0) + - Firebase/Storage (7.3.0): + - Firebase/CoreOnly + - FirebaseStorage (~> 7.3.0) + - firebase_auth (0.20.0-1): + - Firebase/Auth (= 7.3.0) + - firebase_core + - Flutter + - firebase_core (0.7.0): + - Firebase/CoreOnly (= 7.3.0) + - Flutter + - firebase_dynamic_links (0.7.0-1): + - Firebase/DynamicLinks (= 7.3.0) + - firebase_core + - Flutter + - firebase_storage (7.0.0): + - Firebase/Storage (= 7.3.0) + - firebase_core + - Flutter + - FirebaseAuth (7.3.0): + - FirebaseCore (~> 7.0) + - GoogleUtilities/AppDelegateSwizzler (~> 7.0) + - GoogleUtilities/Environment (~> 7.0) + - GTMSessionFetcher/Core (~> 1.4) + - FirebaseCore (7.3.0): + - FirebaseCoreDiagnostics (~> 7.0) + - GoogleUtilities/Environment (~> 7.0) + - GoogleUtilities/Logger (~> 7.0) + - FirebaseCoreDiagnostics (7.3.0): + - GoogleDataTransport (~> 8.0) + - GoogleUtilities/Environment (~> 7.0) + - GoogleUtilities/Logger (~> 7.0) + - nanopb (~> 2.30906.0) + - FirebaseDynamicLinks (7.3.1): + - FirebaseCore (~> 7.0) + - FirebaseFirestore (7.3.0): + - abseil/algorithm (= 0.20200225.0) + - abseil/base (= 0.20200225.0) + - abseil/memory (= 0.20200225.0) + - abseil/meta (= 0.20200225.0) + - abseil/strings/strings (= 0.20200225.0) + - abseil/time (= 0.20200225.0) + - abseil/types (= 0.20200225.0) + - FirebaseCore (~> 7.0) + - "gRPC-C++ (~> 1.28.0)" + - leveldb-library (~> 1.22) + - nanopb (~> 2.30906.0) + - FirebaseFunctions (7.3.0): + - FirebaseCore (~> 7.0) + - GTMSessionFetcher/Core (~> 1.4) + - FirebaseStorage (7.3.0): + - FirebaseCore (~> 7.0) + - GTMSessionFetcher/Core (~> 1.4) + - Flutter (1.0.0) + - flutter_email_sender (0.0.1): + - Flutter + - flutter_facebook_login (0.0.1): + - FBSDKCoreKit (~> 5.5) + - FBSDKLoginKit (~> 5.5) + - Flutter + - FMDB (2.7.5): + - FMDB/standard (= 2.7.5) + - FMDB/standard (2.7.5) + - google_sign_in (0.0.1): + - Flutter + - GoogleSignIn (~> 5.0) + - GoogleDataTransport (8.1.0): + - nanopb (~> 2.30906.0) + - GoogleSignIn (5.0.2): + - AppAuth (~> 1.2) + - GTMAppAuth (~> 1.0) + - GTMSessionFetcher/Core (~> 1.1) + - GoogleUtilities/AppDelegateSwizzler (7.2.2): + - GoogleUtilities/Environment + - GoogleUtilities/Logger + - GoogleUtilities/Network + - GoogleUtilities/Environment (7.2.2): + - PromisesObjC (~> 1.2) + - GoogleUtilities/Logger (7.2.2): + - GoogleUtilities/Environment + - GoogleUtilities/Network (7.2.2): + - GoogleUtilities/Logger + - "GoogleUtilities/NSData+zlib" + - GoogleUtilities/Reachability + - "GoogleUtilities/NSData+zlib (7.2.2)" + - GoogleUtilities/Reachability (7.2.2): + - GoogleUtilities/Logger + - "gRPC-C++ (1.28.2)": + - "gRPC-C++/Implementation (= 1.28.2)" + - "gRPC-C++/Interface (= 1.28.2)" + - "gRPC-C++/Implementation (1.28.2)": + - abseil/container/inlined_vector (= 0.20200225.0) + - abseil/memory/memory (= 0.20200225.0) + - abseil/strings/str_format (= 0.20200225.0) + - abseil/strings/strings (= 0.20200225.0) + - abseil/types/optional (= 0.20200225.0) + - "gRPC-C++/Interface (= 1.28.2)" + - gRPC-Core (= 1.28.2) + - "gRPC-C++/Interface (1.28.2)" + - gRPC-Core (1.28.2): + - gRPC-Core/Implementation (= 1.28.2) + - gRPC-Core/Interface (= 1.28.2) + - gRPC-Core/Implementation (1.28.2): + - abseil/container/inlined_vector (= 0.20200225.0) + - abseil/memory/memory (= 0.20200225.0) + - abseil/strings/str_format (= 0.20200225.0) + - abseil/strings/strings (= 0.20200225.0) + - abseil/types/optional (= 0.20200225.0) + - BoringSSL-GRPC (= 0.0.7) + - gRPC-Core/Interface (= 1.28.2) + - gRPC-Core/Interface (1.28.2) + - GTMAppAuth (1.1.0): + - AppAuth/Core (~> 1.4) + - GTMSessionFetcher (~> 1.4) + - GTMSessionFetcher (1.5.0): + - GTMSessionFetcher/Full (= 1.5.0) + - GTMSessionFetcher/Core (1.5.0) + - GTMSessionFetcher/Full (1.5.0): + - GTMSessionFetcher/Core (= 1.5.0) + - in_app_review (0.2.0): + - Flutter + - leveldb-library (1.22) + - nanopb (2.30906.0): + - nanopb/decode (= 2.30906.0) + - nanopb/encode (= 2.30906.0) + - nanopb/decode (2.30906.0) + - nanopb/encode (2.30906.0) + - package_info (0.0.1): + - Flutter + - path_provider (0.0.1): + - Flutter + - PromisesObjC (1.2.12) + - share (0.0.1): + - Flutter + - shared_preferences (0.0.1): + - Flutter + - sqflite (0.0.2): + - Flutter + - FMDB (>= 2.7.5) + - url_launcher (0.0.1): + - Flutter + +DEPENDENCIES: + - audioplayers (from `.symlinks/plugins/audioplayers/ios`) + - cloud_firestore (from `.symlinks/plugins/cloud_firestore/ios`) + - cloud_functions (from `.symlinks/plugins/cloud_functions/ios`) + - device_info (from `.symlinks/plugins/device_info/ios`) + - firebase_auth (from `.symlinks/plugins/firebase_auth/ios`) + - firebase_core (from `.symlinks/plugins/firebase_core/ios`) + - firebase_dynamic_links (from `.symlinks/plugins/firebase_dynamic_links/ios`) + - firebase_storage (from `.symlinks/plugins/firebase_storage/ios`) + - Flutter (from `Flutter`) + - flutter_email_sender (from `.symlinks/plugins/flutter_email_sender/ios`) + - flutter_facebook_login (from `.symlinks/plugins/flutter_facebook_login/ios`) + - google_sign_in (from `.symlinks/plugins/google_sign_in/ios`) + - in_app_review (from `.symlinks/plugins/in_app_review/ios`) + - package_info (from `.symlinks/plugins/package_info/ios`) + - path_provider (from `.symlinks/plugins/path_provider/ios`) + - share (from `.symlinks/plugins/share/ios`) + - shared_preferences (from `.symlinks/plugins/shared_preferences/ios`) + - sqflite (from `.symlinks/plugins/sqflite/ios`) + - url_launcher (from `.symlinks/plugins/url_launcher/ios`) + +SPEC REPOS: + trunk: + - abseil + - AppAuth + - BoringSSL-GRPC + - FBSDKCoreKit + - FBSDKLoginKit + - Firebase + - FirebaseAuth + - FirebaseCore + - FirebaseCoreDiagnostics + - FirebaseDynamicLinks + - FirebaseFirestore + - FirebaseFunctions + - FirebaseStorage + - FMDB + - GoogleDataTransport + - GoogleSignIn + - GoogleUtilities + - "gRPC-C++" + - gRPC-Core + - GTMAppAuth + - GTMSessionFetcher + - leveldb-library + - nanopb + - PromisesObjC + +EXTERNAL SOURCES: + audioplayers: + :path: ".symlinks/plugins/audioplayers/ios" + cloud_firestore: + :path: ".symlinks/plugins/cloud_firestore/ios" + cloud_functions: + :path: ".symlinks/plugins/cloud_functions/ios" + device_info: + :path: ".symlinks/plugins/device_info/ios" + firebase_auth: + :path: ".symlinks/plugins/firebase_auth/ios" + firebase_core: + :path: ".symlinks/plugins/firebase_core/ios" + firebase_dynamic_links: + :path: ".symlinks/plugins/firebase_dynamic_links/ios" + firebase_storage: + :path: ".symlinks/plugins/firebase_storage/ios" + Flutter: + :path: Flutter + flutter_email_sender: + :path: ".symlinks/plugins/flutter_email_sender/ios" + flutter_facebook_login: + :path: ".symlinks/plugins/flutter_facebook_login/ios" + google_sign_in: + :path: ".symlinks/plugins/google_sign_in/ios" + in_app_review: + :path: ".symlinks/plugins/in_app_review/ios" + package_info: + :path: ".symlinks/plugins/package_info/ios" + path_provider: + :path: ".symlinks/plugins/path_provider/ios" + share: + :path: ".symlinks/plugins/share/ios" + shared_preferences: + :path: ".symlinks/plugins/shared_preferences/ios" + sqflite: + :path: ".symlinks/plugins/sqflite/ios" + url_launcher: + :path: ".symlinks/plugins/url_launcher/ios" + +SPEC CHECKSUMS: + abseil: 6c8eb7892aefa08d929b39f9bb108e5367e3228f + AppAuth: 31bcec809a638d7bd2f86ea8a52bd45f6e81e7c7 + audioplayers: 455322b54050b30ea4b1af7cd9e9d105f74efa8c + BoringSSL-GRPC: 8edf627ee524575e2f8d19d56f068b448eea3879 + cloud_firestore: 433cf1aece50c727965355ae00e8dbeeceae66b1 + cloud_functions: b4880478d8484299647004b1ee9d2d75b156ee03 + device_info: d7d233b645a32c40dfdc212de5cf646ca482f175 + FBSDKCoreKit: 1d5acf7c9d7a2f92bb1a242dc60cae5b7adb91df + FBSDKLoginKit: f1ea8026a58b52d30c9f2e6a58ca7d813619fb83 + Firebase: 26223c695fe322633274198cb19dca8cb7e54416 + firebase_auth: b55e5136528dced982022ee073ed4b48f15c055c + firebase_core: 91b27774a52f41f8b58484a75edf71197ac01c59 + firebase_dynamic_links: 14bf04008446c471b5c9f6e6542e14210bf26bd5 + firebase_storage: 554b8ce9192bfe0bd35f63da42d0d1f6ae819ccc + FirebaseAuth: c224a0cf1afa0949bd5c7bfcf154b4f5ce8ddef2 + FirebaseCore: 4d3c72622ce0e2106aaa07bb4b2935ba2c370972 + FirebaseCoreDiagnostics: d50e11039e5984d92c8a512be2395f13df747350 + FirebaseDynamicLinks: a6df95d6dbc746c2bbf7d511343cda1344e2cf70 + FirebaseFirestore: 1906bf163afdb7c432d2e3b5c40ceb9dd2df5820 + FirebaseFunctions: 56b7275ad46d936b77b64ecacd306e77db7be251 + FirebaseStorage: 5002b1895bfe74a5ce92ad54f966e6162d0da2e5 + Flutter: 0e3d915762c693b495b44d77113d4970485de6ec + flutter_email_sender: 02d7443217d8c41483223627972bfdc09f74276b + flutter_facebook_login: cfb5659f686b1c575ef205c6b6fd20db9679d3c4 + FMDB: 2ce00b547f966261cd18927a3ddb07cb6f3db82a + google_sign_in: 6bd214b9c154f881422f5fe27b66aaa7bbd580cc + GoogleDataTransport: 116c84c4bdeb76be2a7a46de51244368f9794eab + GoogleSignIn: 7137d297ddc022a7e0aa4619c86d72c909fa7213 + GoogleUtilities: 31c5b01f978a70c6cff2afc6272b3f1921614b43 + "gRPC-C++": 13d8ccef97d5c3c441b7e3c529ef28ebee86fad2 + gRPC-Core: 4afa11bfbedf7cdecd04de535a9e046893404ed5 + GTMAppAuth: 197a8dabfea5d665224aa00d17f164fc2248dab9 + GTMSessionFetcher: b3503b20a988c4e20cc189aa798fd18220133f52 + in_app_review: 4a97249f7a2f539a0f294c2d9196b7fe35e49541 + leveldb-library: 55d93ee664b4007aac644a782d11da33fba316f7 + nanopb: 1bf24dd71191072e120b83dd02d08f3da0d65e53 + package_info: 873975fc26034f0b863a300ad47e7f1ac6c7ec62 + path_provider: abfe2b5c733d04e238b0d8691db0cfd63a27a93c + PromisesObjC: 3113f7f76903778cf4a0586bd1ab89329a0b7b97 + share: 0b2c3e82132f5888bccca3351c504d0003b3b410 + shared_preferences: af6bfa751691cdc24be3045c43ec037377ada40d + sqflite: 6d358c025f5b867b29ed92fc697fd34924e11904 + url_launcher: 6fef411d543ceb26efce54b05a0a40bfd74cbbef + +PODFILE CHECKSUM: fe0e1ee7f3d1f7d00b11b474b62dd62134535aea + +COCOAPODS: 1.10.1 diff --git a/ios/Runner.xcodeproj/project.pbxproj b/ios/Runner.xcodeproj/project.pbxproj index 31f9995e..048bb196 100644 --- a/ios/Runner.xcodeproj/project.pbxproj +++ b/ios/Runner.xcodeproj/project.pbxproj @@ -3,12 +3,15 @@ archiveVersion = 1; classes = { }; - objectVersion = 46; + objectVersion = 51; objects = { /* Begin PBXBuildFile section */ + 1405C8E5B0F94F4AC872A4BF /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = F18839835C9F5E66BB582475 /* Pods_Runner.framework */; }; 1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */ = {isa = PBXBuildFile; fileRef = 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */; }; 3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */ = {isa = PBXBuildFile; fileRef = 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */; }; + 5EA1D41725DC1A06001FB55B /* SoundMethodCallHandler.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5EA1D41625DC1A06001FB55B /* SoundMethodCallHandler.swift */; }; + 5EA1D41B25DC1A57001FB55B /* GoogleService-Info.plist in Resources */ = {isa = PBXBuildFile; fileRef = 5EA1D41A25DC1A57001FB55B /* GoogleService-Info.plist */; }; 74858FAF1ED2DC5600515810 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 74858FAE1ED2DC5600515810 /* AppDelegate.swift */; }; 97C146FC1CF9000F007C117D /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FA1CF9000F007C117D /* Main.storyboard */; }; 97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FD1CF9000F007C117D /* Assets.xcassets */; }; @@ -29,9 +32,12 @@ /* End PBXCopyFilesBuildPhase section */ /* Begin PBXFileReference section */ + 0F647CDEE689C36BF8CAF4ED /* Pods-Runner.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.profile.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.profile.xcconfig"; sourceTree = ""; }; 1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = GeneratedPluginRegistrant.h; sourceTree = ""; }; 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GeneratedPluginRegistrant.m; sourceTree = ""; }; 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = AppFrameworkInfo.plist; path = Flutter/AppFrameworkInfo.plist; sourceTree = ""; }; + 5EA1D41625DC1A06001FB55B /* SoundMethodCallHandler.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SoundMethodCallHandler.swift; sourceTree = ""; }; + 5EA1D41A25DC1A57001FB55B /* GoogleService-Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = "GoogleService-Info.plist"; sourceTree = ""; }; 74858FAD1ED2DC5600515810 /* Runner-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "Runner-Bridging-Header.h"; sourceTree = ""; }; 74858FAE1ED2DC5600515810 /* AppDelegate.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; 7AFA3C8E1D35360C0083082E /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = Release.xcconfig; path = Flutter/Release.xcconfig; sourceTree = ""; }; @@ -42,6 +48,9 @@ 97C146FD1CF9000F007C117D /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; 97C147001CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; }; 97C147021CF9000F007C117D /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + 9F2D0A378488812A48B4A08A /* Pods-Runner.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"; sourceTree = ""; }; + F18839835C9F5E66BB582475 /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + FAB176F29BBF5AD5287F9740 /* Pods-Runner.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -49,12 +58,23 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( + 1405C8E5B0F94F4AC872A4BF /* Pods_Runner.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXFrameworksBuildPhase section */ /* Begin PBXGroup section */ + 58ABB834509D49F1995FB017 /* Pods */ = { + isa = PBXGroup; + children = ( + 9F2D0A378488812A48B4A08A /* Pods-Runner.debug.xcconfig */, + FAB176F29BBF5AD5287F9740 /* Pods-Runner.release.xcconfig */, + 0F647CDEE689C36BF8CAF4ED /* Pods-Runner.profile.xcconfig */, + ); + path = Pods; + sourceTree = ""; + }; 9740EEB11CF90186004384FC /* Flutter */ = { isa = PBXGroup; children = ( @@ -72,6 +92,8 @@ 9740EEB11CF90186004384FC /* Flutter */, 97C146F01CF9000F007C117D /* Runner */, 97C146EF1CF9000F007C117D /* Products */, + 58ABB834509D49F1995FB017 /* Pods */, + DA9F9612F89A0D08D4844F8E /* Frameworks */, ); sourceTree = ""; }; @@ -86,6 +108,8 @@ 97C146F01CF9000F007C117D /* Runner */ = { isa = PBXGroup; children = ( + 5EA1D41A25DC1A57001FB55B /* GoogleService-Info.plist */, + 5EA1D41625DC1A06001FB55B /* SoundMethodCallHandler.swift */, 97C146FA1CF9000F007C117D /* Main.storyboard */, 97C146FD1CF9000F007C117D /* Assets.xcassets */, 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */, @@ -98,6 +122,14 @@ path = Runner; sourceTree = ""; }; + DA9F9612F89A0D08D4844F8E /* Frameworks */ = { + isa = PBXGroup; + children = ( + F18839835C9F5E66BB582475 /* Pods_Runner.framework */, + ); + name = Frameworks; + sourceTree = ""; + }; /* End PBXGroup section */ /* Begin PBXNativeTarget section */ @@ -105,12 +137,15 @@ isa = PBXNativeTarget; buildConfigurationList = 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */; buildPhases = ( + EA90F68703DC121426BA7B27 /* [CP] Check Pods Manifest.lock */, 9740EEB61CF901F6004384FC /* Run Script */, 97C146EA1CF9000F007C117D /* Sources */, 97C146EB1CF9000F007C117D /* Frameworks */, 97C146EC1CF9000F007C117D /* Resources */, 9705A1C41CF9048500538489 /* Embed Frameworks */, 3B06AD1E1E4923F5004D2608 /* Thin Binary */, + A2F5482701A71BB1B60A1AF3 /* [CP] Embed Pods Frameworks */, + 8A4FB4697E0D80A731769358 /* [CP] Copy Pods Resources */, ); buildRules = ( ); @@ -161,6 +196,7 @@ files = ( 97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */, 3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */, + 5EA1D41B25DC1A57001FB55B /* GoogleService-Info.plist in Resources */, 97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */, 97C146FC1CF9000F007C117D /* Main.storyboard in Resources */, ); @@ -183,6 +219,23 @@ shellPath = /bin/sh; shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" embed_and_thin"; }; + 8A4FB4697E0D80A731769358 /* [CP] Copy Pods Resources */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputFileListPaths = ( + "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-resources-${CONFIGURATION}-input-files.xcfilelist", + ); + name = "[CP] Copy Pods Resources"; + outputFileListPaths = ( + "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-resources-${CONFIGURATION}-output-files.xcfilelist", + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-resources.sh\"\n"; + showEnvVarsInLog = 0; + }; 9740EEB61CF901F6004384FC /* Run Script */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; @@ -197,6 +250,45 @@ shellPath = /bin/sh; shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" build"; }; + A2F5482701A71BB1B60A1AF3 /* [CP] Embed Pods Frameworks */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputFileListPaths = ( + "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-input-files.xcfilelist", + ); + name = "[CP] Embed Pods Frameworks"; + outputFileListPaths = ( + "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-output-files.xcfilelist", + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh\"\n"; + showEnvVarsInLog = 0; + }; + EA90F68703DC121426BA7B27 /* [CP] Check Pods Manifest.lock */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputFileListPaths = ( + ); + inputPaths = ( + "${PODS_PODFILE_DIR_PATH}/Podfile.lock", + "${PODS_ROOT}/Manifest.lock", + ); + name = "[CP] Check Pods Manifest.lock"; + outputFileListPaths = ( + ); + outputPaths = ( + "$(DERIVED_FILE_DIR)/Pods-Runner-checkManifestLockResult.txt", + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; + showEnvVarsInLog = 0; + }; /* End PBXShellScriptBuildPhase section */ /* Begin PBXSourcesBuildPhase section */ @@ -204,6 +296,7 @@ isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( + 5EA1D41725DC1A06001FB55B /* SoundMethodCallHandler.swift in Sources */, 74858FAF1ED2DC5600515810 /* AppDelegate.swift in Sources */, 1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */, ); @@ -288,18 +381,24 @@ ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; CLANG_ENABLE_MODULES = YES; CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)"; + DEVELOPMENT_TEAM = N86MB5VSWU; ENABLE_BITCODE = NO; + "EXCLUDED_ARCHS[sdk=*]" = ""; FRAMEWORK_SEARCH_PATHS = ( "$(inherited)", "$(PROJECT_DIR)/Flutter", ); INFOPLIST_FILE = Runner/Info.plist; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + ); LIBRARY_SEARCH_PATHS = ( "$(inherited)", "$(PROJECT_DIR)/Flutter", ); - PRODUCT_BUNDLE_IDENTIFIER = com.chaomao.hitnotes; + MARKETING_VERSION = 1.0.0; + PRODUCT_BUNDLE_IDENTIFIER = com.chaomao.hittick; PRODUCT_NAME = "$(TARGET_NAME)"; SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; SWIFT_VERSION = 5.0; @@ -407,7 +506,8 @@ MTL_ENABLE_DEBUG_INFO = NO; SDKROOT = iphoneos; SUPPORTED_PLATFORMS = iphoneos; - SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; + SWIFT_COMPILATION_MODE = wholemodule; + SWIFT_OPTIMIZATION_LEVEL = "-O"; TARGETED_DEVICE_FAMILY = "1,2"; VALIDATE_PRODUCT = YES; }; @@ -420,18 +520,24 @@ ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; CLANG_ENABLE_MODULES = YES; CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)"; + DEVELOPMENT_TEAM = N86MB5VSWU; ENABLE_BITCODE = NO; + "EXCLUDED_ARCHS[sdk=iphonesimulator*]" = arm64; FRAMEWORK_SEARCH_PATHS = ( "$(inherited)", "$(PROJECT_DIR)/Flutter", ); INFOPLIST_FILE = Runner/Info.plist; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + ); LIBRARY_SEARCH_PATHS = ( "$(inherited)", "$(PROJECT_DIR)/Flutter", ); - PRODUCT_BUNDLE_IDENTIFIER = com.chaomao.hitnotes; + MARKETING_VERSION = 1.0.0; + PRODUCT_BUNDLE_IDENTIFIER = com.chaomao.hittick; PRODUCT_NAME = "$(TARGET_NAME)"; SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; SWIFT_OPTIMIZATION_LEVEL = "-Onone"; @@ -447,18 +553,23 @@ ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; CLANG_ENABLE_MODULES = YES; CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)"; + DEVELOPMENT_TEAM = N86MB5VSWU; ENABLE_BITCODE = NO; FRAMEWORK_SEARCH_PATHS = ( "$(inherited)", "$(PROJECT_DIR)/Flutter", ); INFOPLIST_FILE = Runner/Info.plist; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + ); LIBRARY_SEARCH_PATHS = ( "$(inherited)", "$(PROJECT_DIR)/Flutter", ); - PRODUCT_BUNDLE_IDENTIFIER = com.chaomao.hitnotes; + MARKETING_VERSION = 1.0.0; + PRODUCT_BUNDLE_IDENTIFIER = com.chaomao.hittick; PRODUCT_NAME = "$(TARGET_NAME)"; SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; SWIFT_VERSION = 5.0; diff --git a/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme index a28140cf..fb2dffc4 100644 --- a/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme +++ b/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -27,8 +27,6 @@ selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB" selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB" shouldUseLaunchSchemeArgsEnv = "YES"> - - - - + + - - + + diff --git a/ios/Runner/AppDelegate.swift b/ios/Runner/AppDelegate.swift index 70693e4a..f08266bb 100644 --- a/ios/Runner/AppDelegate.swift +++ b/ios/Runner/AppDelegate.swift @@ -3,11 +3,14 @@ import Flutter @UIApplicationMain @objc class AppDelegate: FlutterAppDelegate { - override func application( - _ application: UIApplication, - didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]? - ) -> Bool { - GeneratedPluginRegistrant.register(with: self) - return super.application(application, didFinishLaunchingWithOptions: launchOptions) - } + override func application( + _ application: UIApplication, + didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]? + ) -> Bool { + let controller : FlutterViewController = window?.rootViewController as! FlutterViewController + FlutterMethodChannel(name: "com.chaomao.hitnotes/sound_player", + binaryMessenger: controller.binaryMessenger).setMethodCallHandler(SoundMethodCallHandler().handle) + GeneratedPluginRegistrant.register(with: self) + return super.application(application, didFinishLaunchingWithOptions: launchOptions) + } } diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png index dc9ada4725e9b0ddb1deab583e5b5102493aa332..7f9ea81ee5cf52b745adb1017e43ab5636085c37 100644 GIT binary patch literal 45653 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 diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png index 2ccbfd967d9697cd4b83225558af2911e9571c9b..f7e2a26554a91262b0ea24fdcb9bd67b550a3ffe 100644 GIT binary patch delta 1473 zcmV;y1wQ(N3epRZBYyx1a7bBm000b4000b40n*N`P5=M^8FWQhbW?9;ba!ELWdL_~ zcP?peYja~^aAhuUa%Y?FJQ@H11z$--K~z|U&6#a%Q&kwpf9LkS-PXMz?8PZ6Fp%I7 zVOxfh@j6H#b3?#J zzd$SS1F%mB@mo}DDP@k7vPO=bzLHXAYr#D%rMx$Tx%yaNQ>h2$CjvMwO&4~5;JZGu z#_L!<-x6W_NsWuzBW?h$Ui0(LtLd@6W}yP)CIUDk&woJKqHvg9A3Lc3!y94S-r)~j zw_W!~JddJW1xQT<5Mce9WQu2*LihdvY}?tx#mfVU4mn(D%E&g_5&~X&CWWc@8$xYv zk7VHQCi2VDlS2IQ!)74o}S636~Su-U@Cv112j? z&P?h>6UqT=N!1m5^e(#?Y*9&ToxG|g5BY2M^z>Yl*x_Sas zt+bIp%@|>$xd!EldgQ?aAvk~wzARN+v+zZQ?0@&Duf-jE9Mm;>ID65@>mR6lTHS*# zC-R%mBbv*Sj`Lwp2|5ClSesdBJH=FE8z$jnz+mC;l`r%2X&tpcx^cOqZ;*y2FLjMW zOGKyPDpf#v{1@=_N3^d>u49q)6gH(l!fSe;o5|PfnDXQ@DwbGz?fqUFnkD=Y^G&LDHHZ4Ra&;(}PnoEv^s&ek zsR>Bu4NbtP>iQ>isn-i$d^&}3!*YQ?AlX~(3f&7q)RT}pU?9OP;15r6NmfDS3S0Ql z0m9bjqGB`CCK=F@I$%nI!POr5ZMC4ttbe%yEM`H~6Y58_L8*2X59GxUr_s-95!{ob z9xT?Zu#uh`J=>}S&M7AD|Dg;X<*d$gp{!FYgbrXMX80H3F<#4e!xK)jlt=TamokvS#2MuFAQa!j8r8e zE{+ahoRTsKx9323zFk+Dghk`%rGKTk0KY%l&+h$B?n>8DQEK7QM@(TmQA#*@*2~^% z7pKmJ=j+9D&6E_Haiy)xcVfQS_bHK1|s?v zH#2h`ZJa1=HRcrxSLx+WwvJf~HPp|WT`8e9(;p7<~9bJBU9RZST z3h8!*8F>Z@@=eT|ZXAtbQUL%`%IdMKSZe4C7%E_90`=TEHNtjaju4_v0T4o516BZS zV~Q12E3i}u5y>K@%$C7I_BxnNs|=Q-LsDJFQpy5?e?u%JIPEbP^x{+(&;lF=J{3aL b4>$M^;2+dtB#!~l00000NkvXXu0mjfJ?p@8 delta 1264 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 delta 1572 zcmV+<2HW}O5wr}DBYy?^Nklc)UfJ<2uenUn3ARN>mf|M z+(eagCX~wv_9N9Br6dE4W@{R1X8yU75JVAXqB_2?1W&7xoYHg zkR5NEVWsUG^?wLzRHH9Aa#eCDK9NvdPE(De9-HaQc(6~^lpTe2pm3&x9G1K5Xawdi z4F*DRWI%>vgEBPFqaRR51|&E>B!fiay027YsK+Vrn=1PqDKdi{m<&P1nQ3_Gw<%cH zHU+slT8moWCbIKH=(W3t1j5BNfsIKQ#Mzi(J59kx zT!xVJ&SKqb4XjdxWQV7$IrZ-{l-x3`7M}qzHsPzP1S_$c=96h(q%b9ZXPvcV z;D5oPsau6Q(U`-YLD*G41z_cgz)a99av0W_U=aHAj?mj@2KZI50efIA zO8^kn_?FjaZ_hfbhSh@3^GzxJx*P{Jc7Hi*OHPZ!wvEV2a9XKq###zPPeRs75i0(W zU?doBGb9yqT58~qn?wQ4oCi3oWdc^W%JAgTVR)*l33@Ky3ip4Rqz14Wx_gwsGYGq) zMY~B;*z8j>WF8xV`^#!USYHDVZf}I{OZGzBnutHA1D(}!4{};5>;)mO27l7F zHh@r23lDAk8oF(C+P0rsBpv85EP>4CVMx#04MOfG;P%vktHcXwTj~+IE(~px)3*MY z77e}p#|c>TD?sMatC0Tu4iKKJ0(X8jxQY*gYtxsC(zYC$g|@+I+kY;dg_dE>scBf& zbP1Nc@Hz<3R)V`=AGkc;8CXqdi+`PV3Vc;#lxQO~AoO*}pfE+=*r3ffZ_YMC zflq>i%a-`Xw)YRuK;MUtq{SGa7vtY^gg0bKSp&F>y|A>h5qhqSvgdtV{(lh0c$xz5 z;*U?KQl%W)htLmD=yhL!@aldLHW(=H00^&qu7J0mA5v0IaX@pn_bKobsC(e>(nAjI zzjyto3Dmc!oOxjlw&JZqeL%+vsN0Zy8@1@rs~rRNAqO?umG&QV WYK#ibz}*4>0000yLh{R-Rh>6IQ zh#VG?7BV3snuzQZk;D>(av>oieIlaLMfcqxu}t&CpckU**MQDqmRMpp(h*O< zn}>W%PRC90qsM|A9Psn{es3YFP7SCoMzm#}oo6?f0uTxdyAOEzdp?nh&-;=9T=69l z$xC&M2H1)b1=#+yi_VQD09^JadE8tV-sO?l$H^{$U( z^7>SB+i=!{oc@m3%naXNs^z5bF3txk2t<@=*y*2Q92)R1T~xk4ft>mRMA&m_8$U)G z@{%0?DvYbtyqI_b-uu{3REL+gxp3GQ;#s0{W&|1fJk|E-HvwQ*ahe=cR9n47+^hLD z=*Ba*V1J}Q$ei0xPlgyg6$W5Kvz<-%I&z3663B_qOkI5|KjK`hmUibj6OW%>rs@S>Jl{qbkD4-tdLfzAvTd|=L_4qSc-P5xR z2Y{ z*IkxHn_m=+oHe(hn%nYD28ijx!GS=ky<>|Drz6`urhOG64M&C9zY>eayjPR#ecQ+H zlR5w`ciMTlqom+Mt$78eKHh;k#YivBQ!9mR`3*o5n%ec;$!;w@GxOt_8 zS9g}9@^2DAw*oUjeJ;^J&>$U~&>5T17iDRzx3cHuZJ525jhOJkZZ(+nK(y} z1sNWV63=+cRjVvK@u-vTM@q5gHftvOm54L}qZG(*I4X=!>iGPE%?34Y3w1TueM2iu z0){)qxCs9r=uOFsh`J_xBX9VU6E9hRDZsKRZ8`ICh6f+zh_Ab z(jRY2a{B+|os<)hT5u?RkVuNN!js0QT$N5qdKbV*dH@&&Vjutv8ARzpRqqL`fs%v3 z_*Hd00YYHFNIC{Q1h^F1P!f5C!xIU|E+^yzaDu?XOc`!nZ+PjJh~`vV%1!_aj2TH& zKwB1AHSp7kgnyx5V{+EJ5gM3@MPI>kpg&?m&MZY^mCPDRTDzYO*c$nehN*{r1;b!} zL~B$N2&udO8tBp-PM4v#VA!7mo$41xCTJ~SU|=SOZ3V-D{)qMzXd9GbL+F1E1Yg28 z1RU&-XuA$zU1(Mh+ag0OA2L@}lJyL@X7yGouP$&$M1OlzM%Nm7TCsNcLSx`u3}=gu zz_8*kvf$vZc1ylSt62f92V^XU?#Y zz`8(e?aZ@#li0n*=g^qOcVpd-Wbok=@b#YwqkoqZx^jlHgV2aMo8z}1PBGB7;Ej|r zUB(UDU}Sw|KG_{Ict^w^3nDNEn{Q#}yRSHTWQ?6}jPTd&B7rp|u4dqtoymH&RdRgj zT#2{N3mqTk(vPPJH*F&>&U5!|8yVTRi>^YB#EGCzC1t+ajDgsRm$x_ZV)O4@I&qfh zrhh)<9J$s!Kq@Bk2*~DAzd+ItgnGi{)g+zGbzBzZYX#nnI#*DSOq^;G=#=I-Jg>aXP1F zlEh^jkE`b1p$afa*ZWyv)#99=s8_FR$dIH^l3o73@CH04X-v{g?RT@=lj`|W(&I~U amdroMzCV_|S*E^l&Yo9;Xs000O2Nklmlq zBye@>o)+yQQh#GbV7`c~zRH!&2CGCQzq2-b7p;E+=A_j8*CulTjZRv$j(|Yv#(U{^v0LMJPnI&EZ+};pa7Bm${WM@2SriGd^@G4= zzdgPf&-}iX7EjDl`MUo`_}L2=neo$Re!Iehx6N9)B-ntvHR2IZR>{vxJa(=r%CBE( zB@`0Fvh4xk*_T^5cr?t#))?>Z46t;q*RYHQsx)9=rdGOgUzH1`5|7uO2=mek4`QIT z?qryYU4L4B_h%u)G8Xu{2K33ugbp{4$Y=KVUApJ~y(h@ZH+)IUwg(aw1%jEW1o~<~ zw@j_*F=MKWyS`JPdv3!PKO48V=i;`>=%Mldxil9nm{r70L-TddEq~q1&QF86x^-7n zR=sUk>^At-!V<3UpE#|=V({W}4@XXfb6JH;b$`WrC3<yPp1%p&saiKFB~ON?hzIrA~ex;rV5)JXceic6H21U1)0yvVAkMe-A_=05n8O*x(z- zwtu#f1SJnhJ(AgTAjBWndKo)X-+5(9N<$d%`Q~cEWFEA?y`!Bo z4c2-=dqCK+J3u%L6Gl1cR%$#7Een-xn~?XnB^+PbGC3MK7L5HvTo~ z>2c0F-tmvP>{z+2m2m}ijBuQ$+}?sq1!xl|O{1r=KXe_t_60fHl-`t5cQVYsK1htJ ze12oUU@BC$ZGvd>N-ZecibI9j8?2y*&C4CGPr0@55H=l$H1O1VCOrNWkIr!O;eVbW ztKRfc-)LR12rOIY(+%(^j51y~Fc#`>Lk{jUyre*dSXj2jw2}a{TtJQ-LJb|sEu$UW zJUpL2uk$A4ugQ4lqX4zX6C>h+0Pk5aH;mRmP1?2NH9s(=67v;wIjIyQe)?dF!z#$E6AjcuH7Nqp$vo#9)o~BRR+{lGrSEYgFHn zybDKkeAcXcT$B}C3)hXWau-`Nk`hHFNl#TxD!`F%Ej=F4*Uq%b=3~19V}GIDdssGP z71b@d%>t)l*kJSV2Jpxa-PltI$P9(5!9%TEvPz|~&7p(Lg^s_;!RXn^+Pg25 z_fE;6AvPQ88zT)bF$>P~?23o(v*v(0V>*)69tLi+Ve zJ&7H3JCDHc9hWE#&Jk$>8nk*1+0-i8`A zE}qpK-jAI90({ce|S}s3aHRo8%_l!lHv9Z#50^& z6ztX}dp-6Z4Ds}mmV{i>?NYq@Vt0z&nXSxbXJ=N^;(uwG^;`TLI+i>Q zd~Bv$cXKLDM2ScfkXD)!i^07Mn{+pC?RLeG3OnW9Z4^2c{(pebbRo)-6A?mTWB>QS z_gp-1Pga*v8|}bZ(iGYr6kU-3k%(}hE)1lWyw92LV#d_0uNBv8z_D~oy9yMehGl23 zq@+mWnMEbJ5D9QxBmTZ?+C2GK3Ac}TVoTF$Xc|l!>ty-jZj3iso6UfKDiP@g)RW;< zbFL}MhOK^f?0*X4@tH4?mK15+I>y2DDLH?uEDH4Pco%RDFgqJoMd0}92%jAe(a;>F z)hBqoF^b(9rNxT!?lx|`A)kr?_KafJ6j-H{n%5z;AMw|=vokwiI|P7ArPOH+Kq++w zc>3zrDJT3=DRmmU1PUUu0(khUR4MzcQA*A2_|eq?Eo1^#U&-3!h*yC}Os^7=8i~J% z|5d{;B9Eu^NJM0S#6Pk4DtrzSk@yD#{gdf2b?_om&X*tf3?}}8PkBmDE&DVQ|G?)6 h@HVhXDb;9H;D4s6GfaPlDfa*X002ovPDHLkV1i4fE*Jm+ literal 1716 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 delta 1906 zcmV-&2aWjc8GsLvBYy`+Nkl^fDmF(5(5$|?Cx}D zKEJa&XZP%OyE`*GvvYQ4PV&!g2|L^Q?YG}tx;sY@GzV#^0C$Z`m}blr)&(OPMHT6T@%AxHOWYGG zm>@=0?<)?0r0XK9>leRXyD^j4O4bXT!@LESVI<~>`yB+S2b_f__vvyMHkwGyyXedq3usx&X*}E{O;}+nJ#G_xm zJbQX5 zuFrVK*|x9RQeZ1J@1v9MX;>n34(i>=YE@Iur`0Vah(inE3VUFZNqf~ ztSz{1fz3Fsn_x4F>o(Yo;kpqvBe-sbwH(*Yuz!}~S^-;|MX;9Py1im8!}VY-!u4P+ z!nLEvx?+Rogo+Kw9OBXy&lGIvJ51_7Hl6Q>*MAJa!lMDGGML530`Te&0ciU({DC7` z;RKg{uC>($*mdXnVQQBjiVyqYC7mf!Z%e-Q!?Oo{ufu`G3CAC=UjiTpU<94UTFz2KEDuNS@KKkg)K8!v1L8RUP$_! z({LG$Dy&JLEVpiNVe^G(HCbA*SpsX?292)#=JVQDUMp-cOJPl`+yTHTD!AOit-zAD zptXYa!q%OVLa^mo25b7^Z>kE`3rqgr-G4i;Lw<+P(8khESW8aaBmxfY`WS#6j<92Q z-++&Y z$gbH4#2sT0cU0SdFs=*W*4hKGpuR1QGacHFy;`# zR&NJkbTNp}Ee5f08HmLzK%D(q3@lH;Tzx$?VT;&xJq-KyHV__o3dD)?KrE<6*iXV0 z8;6<{IKw@dyDwJ90H5^3h;|9?twz{UGr|>1Pzhdn6W(r0ifeZd=JI+AAz<~yL(QJk zAWW))+=`8mGj|J!70oF@d4B;WxB=jBM1bWWRBb&1!ie3BUzOdm}yC-xA%SY``k$rbfk;CHqifhU*jfGM@DkYCec zD9&E@F9*za0?~OQZiDE|Cf;;0 z`uZ%H=IeGyG^H0ruev{yIVARgwZUG)j7>F#3~dh+8DOtPByR=(VDhz2enf#EjcXCI z=NUPYr4@S)GhX!?s(0Eh(nGe!y$#$r1B$||I~`wPhUuCQEo;#Xb$EXk=6HgBBRd#c ziK|jN$e~{zV~|;*E@Ij-Z(+tI^B8RW51ptE!nMnPyZ`_I07*qoM6N<$f|P2EUH||9 diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png index 2ccbfd967d9697cd4b83225558af2911e9571c9b..f7e2a26554a91262b0ea24fdcb9bd67b550a3ffe 100644 GIT binary patch delta 1473 zcmV;y1wQ(N3epRZBYyx1a7bBm000b4000b40n*N`P5=M^8FWQhbW?9;ba!ELWdL_~ zcP?peYja~^aAhuUa%Y?FJQ@H11z$--K~z|U&6#a%Q&kwpf9LkS-PXMz?8PZ6Fp%I7 zVOxfh@j6H#b3?#J zzd$SS1F%mB@mo}DDP@k7vPO=bzLHXAYr#D%rMx$Tx%yaNQ>h2$CjvMwO&4~5;JZGu z#_L!<-x6W_NsWuzBW?h$Ui0(LtLd@6W}yP)CIUDk&woJKqHvg9A3Lc3!y94S-r)~j zw_W!~JddJW1xQT<5Mce9WQu2*LihdvY}?tx#mfVU4mn(D%E&g_5&~X&CWWc@8$xYv zk7VHQCi2VDlS2IQ!)74o}S636~Su-U@Cv112j? z&P?h>6UqT=N!1m5^e(#?Y*9&ToxG|g5BY2M^z>Yl*x_Sas zt+bIp%@|>$xd!EldgQ?aAvk~wzARN+v+zZQ?0@&Duf-jE9Mm;>ID65@>mR6lTHS*# zC-R%mBbv*Sj`Lwp2|5ClSesdBJH=FE8z$jnz+mC;l`r%2X&tpcx^cOqZ;*y2FLjMW zOGKyPDpf#v{1@=_N3^d>u49q)6gH(l!fSe;o5|PfnDXQ@DwbGz?fqUFnkD=Y^G&LDHHZ4Ra&;(}PnoEv^s&ek zsR>Bu4NbtP>iQ>isn-i$d^&}3!*YQ?AlX~(3f&7q)RT}pU?9OP;15r6NmfDS3S0Ql z0m9bjqGB`CCK=F@I$%nI!POr5ZMC4ttbe%yEM`H~6Y58_L8*2X59GxUr_s-95!{ob z9xT?Zu#uh`J=>}S&M7AD|Dg;X<*d$gp{!FYgbrXMX80H3F<#4e!xK)jlt=TamokvS#2MuFAQa!j8r8e zE{+ahoRTsKx9323zFk+Dghk`%rGKTk0KY%l&+h$B?n>8DQEK7QM@(TmQA#*@*2~^% z7pKmJ=j+9D&6E_Haiy)xcVfQS_bHK1|s?v zH#2h`ZJa1=HRcrxSLx+WwvJf~HPp|WT`8e9(;p7<~9bJBU9RZST z3h8!*8F>Z@@=eT|ZXAtbQUL%`%IdMKSZe4C7%E_90`=TEHNtjaju4_v0T4o516BZS zV~Q12E3i}u5y>K@%$C7I_BxnNs|=Q-LsDJFQpy5?e?u%JIPEbP^x{+(&;lF=J{3aL b4>$M^;2+dtB#!~l00000NkvXXu0mjfJ?p@8 delta 1264 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 M07*qoM6N<$f>{~P)&Kwi delta 1881 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 P00000NkvXXu0mjf%?TQg diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png index a6d6b8609df07bf62e5100a53a01510388bd2b22..5f0073bf8430ad5c1d1a3e09eb75853f7fe1accc 100644 GIT binary patch literal 4547 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 P00000NkvXXu0mjf%?TQg diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png index 75b2d164a5a98e212cca15ea7bf2ab5de5108680..9d4ab07ebaa49547a8ffaffa1a3227f025cdf211 100644 GIT binary patch literal 6969 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 LNkvXXu0mjf;}?5@ literal 3831 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 diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png index c4df70d39da7941ef3f6dcb7f06a192d8dcb308d..b518a51a476010fc479dc0e78dc88ac926ad6c4e 100644 GIT binary patch delta 2888 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 CQ=0Gq literal 68 zcmeAS@N?(olHy`uVBq!ia0vp^j3CUx0wlM}@Gt=>Zci7-kcv6Uzs@r-FtIZ-&5|)J Q1PU{Fy85}Sb4q9e0B4a5jsO4v diff --git a/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png b/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png index 9da19eacad3b03bb08bbddbbf4ac48dd78b3d838..4decbff952b2ef8a43ea08a60252f9743f3c3139 100644 GIT binary patch literal 30605 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 bsR|P`rPHpIZFzo!j9z`GmP+dOKhOMsqq*^i literal 68 zcmeAS@N?(olHy`uVBq!ia0vp^j3CUx0wlM}@Gt=>Zci7-kcv6Uzs@r-FtIZ-&5|)J Q1PU{Fy85}Sb4q9e0B4a5jsO4v diff --git a/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png b/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png index 9da19eacad3b03bb08bbddbbf4ac48dd78b3d838..3c44c0d28db4671e19b04f3996f7ce9e351ec4c9 100644 GIT binary patch literal 55304 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 aIu_^mC7xXW=Jq^Na9d*Xmgdd74*m_P{OL{r literal 68 zcmeAS@N?(olHy`uVBq!ia0vp^j3CUx0wlM}@Gt=>Zci7-kcv6Uzs@r-FtIZ-&5|)J Q1PU{Fy85}Sb4q9e0B4a5jsO4v diff --git a/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md b/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md deleted file mode 100644 index 89c2725b..00000000 --- a/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md +++ /dev/null @@ -1,5 +0,0 @@ -# Launch Screen Assets - -You can customize the launch screen with your own desired assets by replacing the image files in this directory. - -You can also do it by opening your Flutter project's Xcode project with `open ios/Runner.xcworkspace`, selecting `Runner/Assets.xcassets` in the Project Navigator and dropping in the desired images. \ No newline at end of file diff --git a/ios/Runner/Info.plist b/ios/Runner/Info.plist index b504c7ab..b19ea04d 100644 --- a/ios/Runner/Info.plist +++ b/ios/Runner/Info.plist @@ -4,6 +4,8 @@ CFBundleDevelopmentRegion $(DEVELOPMENT_LANGUAGE) + CFBundleDisplayName + HitNotes CFBundleExecutable $(EXECUTABLE_NAME) CFBundleIdentifier @@ -15,11 +17,11 @@ CFBundlePackageType APPL CFBundleShortVersionString - $(FLUTTER_BUILD_NAME) + $(MARKETING_VERSION) CFBundleSignature ???? CFBundleVersion - $(FLUTTER_BUILD_NUMBER) + $(CURRENT_PROJECT_VERSION) LSRequiresIPhoneOS UILaunchStoryboardName @@ -28,15 +30,21 @@ Main UISupportedInterfaceOrientations - UIInterfaceOrientationPortrait - UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight + CFBundleURLTypes + + + CFBundleTypeRole + Editor + CFBundleURLSchemes + + com.googleusercontent.apps.839556303918-qc22f79vfgfd6r03958nofvv0tcssldf + + + UISupportedInterfaceOrientations~ipad - UIInterfaceOrientationPortrait - UIInterfaceOrientationPortraitUpsideDown - UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight UIViewControllerBasedStatusBarAppearance diff --git a/ios/Runner/SoundMethodCallHandler.swift b/ios/Runner/SoundMethodCallHandler.swift new file mode 100644 index 00000000..7cb9d9ca --- /dev/null +++ b/ios/Runner/SoundMethodCallHandler.swift @@ -0,0 +1,71 @@ +import Flutter +import UIKit +import AVFoundation + + +public class SoundMethodCallHandler: NSObject { + + private lazy var engine = AVAudioEngine() + private lazy var players = [Int: AVAudioPlayerNode]() + private lazy var files = [Int: AVAudioFile]() + + public func handle(_ call: FlutterMethodCall, result: @escaping FlutterResult) { + switch call.method { + case "load": + let attributes = call.arguments as! NSDictionary + let soundPaths = attributes["soundPaths"] as! [Int: String] + let baseNotes = attributes["baseNotes"] as! [Int: Int] + + var audioFiles = [Int: AVAudioFile]() + + for (baseNote, path) in soundPaths { + let fileUrl = NSURL.init(fileURLWithPath: path) + let file = try! AVAudioFile(forReading:fileUrl.absoluteURL!) + audioFiles[baseNote] = file + } + + for (note, baseNote) in baseNotes { + let file = audioFiles[baseNote]! + let player = AVAudioPlayerNode() + let pitch: Float = Float((note - baseNote) * 100) + players[note] = player + files[note] = file + engine.attach(player) + if (pitch != 0) { + let pitchEffect = AVAudioUnitTimePitch() + pitchEffect.pitch = pitch + engine.attach(pitchEffect) + engine.connect(player, to: pitchEffect, format: file.processingFormat) + engine.connect(pitchEffect, to: engine.mainMixerNode, format: file.processingFormat) + } else { + engine.connect(player, to: engine.mainMixerNode, format: file.processingFormat) + } + } + engine.prepare() + do { + try engine.start() + } catch let err { + print(err.localizedDescription) + } + result(nil) + case "play": + let attributes = call.arguments as! NSDictionary + let note = attributes["note"] as! Int + let player = players[note]! + if player.isPlaying { + player.stop() + } + player.scheduleFile(files[note]!, at: nil) + player.play() + result(nil) + case "release": + players.removeAll() + files.removeAll() + engine.stop() + engine.reset() + result(nil) + default: + result("notImplemented") + } + } +} diff --git a/lib/authentication/authentication_bloc.dart b/lib/authentication/authentication_bloc.dart index c1926ca2..45cdb690 100644 --- a/lib/authentication/authentication_bloc.dart +++ b/lib/authentication/authentication_bloc.dart @@ -37,7 +37,7 @@ class AuthenticationBloc if (currentUser == null) { await FirebaseAuth.instance.signInAnonymously(); } - _userRepository.changUser(); + _userRepository.subscribeUser(); yield Authenticated('Anonymous'); } catch (_) { yield Unauthenticated(); @@ -53,7 +53,7 @@ class AuthenticationBloc idToken: googleAuth.idToken, ); await _tryToLinkWithCurrentUser(credential); - _userRepository.changUser(); + _userRepository.subscribeUser(); yield Authenticated('Google'); } on Exception { yield Unauthenticated(); @@ -68,7 +68,7 @@ class AuthenticationBloc final credential = FacebookAuthProvider.credential(result.accessToken.token); await _tryToLinkWithCurrentUser(credential); - _userRepository.changUser(); + _userRepository.subscribeUser(); yield Authenticated('Facebook'); break; default: diff --git a/lib/game/complete_dialog.dart b/lib/game/complete_dialog.dart index 62364a26..3846dd3a 100644 --- a/lib/game/complete_dialog.dart +++ b/lib/game/complete_dialog.dart @@ -12,74 +12,77 @@ class CompleteDialog extends StatelessWidget { @override Widget build(BuildContext context) { return Material( - child: Column( - mainAxisAlignment: MainAxisAlignment.end, - crossAxisAlignment: CrossAxisAlignment.stretch, - children: [ - Expanded( - child: Align( - alignment: Alignment.center, - child: Column( - mainAxisSize: MainAxisSize.max, - mainAxisAlignment: MainAxisAlignment.center, - children: [ - Row( - mainAxisAlignment: MainAxisAlignment.center, - children: [ - Image( - image: AssetImage((_gameReward.stars >= 1) - ? 'assets/images/img_star_rate.png' - : 'assets/images/img_star_rate_disable.png')), - SizedBox(width: 8), - Image( - image: AssetImage((_gameReward.stars >= 2) - ? 'assets/images/img_star_rate.png' - : 'assets/images/img_star_rate_disable.png')), - SizedBox(width: 8), - Image( - image: AssetImage((_gameReward.stars >= 3) - ? 'assets/images/img_star_rate.png' - : 'assets/images/img_star_rate_disable.png')), - ], - ), - SizedBox(height: 16), - Row( - mainAxisAlignment: MainAxisAlignment.center, - children: [ - Image(image: AssetImage('assets/images/img_note.png')), - SizedBox(width: 8), - Text(_gameReward.playedNotes.toString()) - ], - ), - ], - )), - ), - Row( - children: [ - SizedBox(width: 8), - Expanded( - child: ElevatedButton( - onPressed: () { - Navigator.of(context).pop(); - Navigator.of(context).pop(); - Navigator.of(context).pop(); - }, - child: Text(S.of(context).txt_button_quit), - ), - ), - SizedBox(width: 8), - Expanded( - child: ElevatedButton( + child: SafeArea( + child: Column( + mainAxisAlignment: MainAxisAlignment.end, + crossAxisAlignment: CrossAxisAlignment.stretch, + children: [ + Expanded( + child: Align( + alignment: Alignment.center, + child: Column( + mainAxisSize: MainAxisSize.max, + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Row( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Image( + image: AssetImage((_gameReward.stars >= 1) + ? 'assets/images/img_star_rate.png' + : 'assets/images/img_star_rate_disable.png')), + SizedBox(width: 8), + Image( + image: AssetImage((_gameReward.stars >= 2) + ? 'assets/images/img_star_rate.png' + : 'assets/images/img_star_rate_disable.png')), + SizedBox(width: 8), + Image( + image: AssetImage((_gameReward.stars >= 3) + ? 'assets/images/img_star_rate.png' + : 'assets/images/img_star_rate_disable.png')), + ], + ), + SizedBox(height: 16), + Row( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Image( + image: AssetImage('assets/images/img_note.png')), + SizedBox(width: 8), + Text(_gameReward.playedNotes.toString()) + ], + ), + ], + )), + ), + Row( + children: [ + SizedBox(width: 8), + Expanded( + child: ElevatedButton( onPressed: () { - _onRestart(); + Navigator.of(context).pop(); + Navigator.of(context).pop(); Navigator.of(context).pop(); }, - child: Text(S.of(context).txt_button_restart)), - ), - SizedBox(width: 8) - ], - ) - ], + child: Text(S.of(context).txt_button_quit), + ), + ), + SizedBox(width: 8), + Expanded( + child: ElevatedButton( + onPressed: () { + _onRestart(); + Navigator.of(context).pop(); + }, + child: Text(S.of(context).txt_button_restart)), + ), + SizedBox(width: 8) + ], + ) + ], + ), ), ); } diff --git a/lib/game/game_widget.dart b/lib/game/game_widget.dart index 3a6b4c50..9500fa0b 100644 --- a/lib/game/game_widget.dart +++ b/lib/game/game_widget.dart @@ -35,12 +35,14 @@ class _GameWidgetState extends State { BlocProvider.of(context).pauseStream.listen((event) { showDialog( context: context, + useSafeArea: false, builder: (_) => PauseDialog(_onRestart), ); }); BlocProvider.of(context).completeStream.listen((event) { showDialog( context: context, + useSafeArea: false, builder: (_) => CompleteDialog(event, _onRestart), ); }); @@ -90,54 +92,63 @@ class _GameWidgetState extends State { height: NON_TOUCH_REGION_HEIGHT.toDouble(), child: Material( color: Colors.transparent, - child: Column( - children: [ - LinearProgressIndicator( - backgroundColor: onBackgroundColor.withOpacity(0.1), - valueColor: AlwaysStoppedAnimation(secondaryColor), - value: (state as GameUpdated).time / - (state as GameUpdated).maxTime, - ), - Padding( - padding: EdgeInsets.all(8), - child: Column( - children: [ - Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: [ - Text((state as GameUpdated).songName, - style: Theme.of(context).textTheme.headline6), - Text( - '${(state as GameUpdated).time.toInt() ~/ 60}:${((state as GameUpdated).time.toInt() % 60).toString().padLeft(2, '0')}/${(state as GameUpdated).maxTime.toInt() ~/ 60}:${((state as GameUpdated).maxTime.toInt() % 60).toString().padLeft(2, '0')}', - style: Theme.of(context).textTheme.headline6) - ], - ), - Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: [ - IconButton( - iconSize: 38, - icon: Icon(Icons.pause_circle_outline_rounded), - onPressed: () { - BlocProvider.of(context) - .add(PauseGame()); - }, - ), - Text((state as GameUpdated).tilesCount.toString(), - style: Theme.of(context) - .textTheme - .headline4 - .copyWith(color: secondaryColor)) - ], - ), - Row( - mainAxisAlignment: MainAxisAlignment.end, - children: [GuideTextWidget()], - ) - ], + child: SafeArea( + child: Column( + children: [ + LinearProgressIndicator( + backgroundColor: onBackgroundColor.withOpacity(0.1), + valueColor: + AlwaysStoppedAnimation(secondaryColor), + value: (state as GameUpdated).time / + (state as GameUpdated).maxTime, ), - ) - ], + Padding( + padding: EdgeInsets.all(8), + child: Column( + children: [ + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Text((state as GameUpdated).songName, + style: + Theme.of(context).textTheme.headline6), + Text( + '${(state as GameUpdated).time.toInt() ~/ 60}:${((state as GameUpdated).time.toInt() % 60).toString().padLeft(2, '0')}/${(state as GameUpdated).maxTime.toInt() ~/ 60}:${((state as GameUpdated).maxTime.toInt() % 60).toString().padLeft(2, '0')}', + style: + Theme.of(context).textTheme.headline6) + ], + ), + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + IconButton( + iconSize: 38, + icon: + Icon(Icons.pause_circle_outline_rounded), + onPressed: () { + BlocProvider.of(context) + .add(PauseGame()); + }, + ), + Text( + (state as GameUpdated) + .tilesCount + .toString(), + style: Theme.of(context) + .textTheme + .headline4 + .copyWith(color: secondaryColor)) + ], + ), + Row( + mainAxisAlignment: MainAxisAlignment.end, + children: [GuideTextWidget()], + ) + ], + ), + ) + ], + ), ), )) ]); @@ -198,22 +209,24 @@ class LoadingSoundWidget extends StatelessWidget { @override Widget build(BuildContext context) { return Material( - child: Padding( - padding: EdgeInsets.all(8.0), - child: Column( - mainAxisAlignment: MainAxisAlignment.center, - crossAxisAlignment: CrossAxisAlignment.center, - children: [ - Expanded( - child: Align( - alignment: Alignment.center, - child: Image( - image: AssetImage('assets/images/img_app_icon.png')), + child: SafeArea( + child: Padding( + padding: EdgeInsets.all(8.0), + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + Expanded( + child: Align( + alignment: Alignment.center, + child: Image( + image: AssetImage('assets/images/img_app_icon.png')), + ), ), - ), - Text(S.of(context).txt_dialog_loading_sound_description) - ], - )), + Text(S.of(context).txt_dialog_loading_sound_description) + ], + )), + ), ); } } @@ -226,22 +239,24 @@ class LoadingGiftWidget extends StatelessWidget { @override Widget build(BuildContext context) { return Material( - child: Padding( - padding: EdgeInsets.all(8.0), - child: Column( - mainAxisAlignment: MainAxisAlignment.center, - crossAxisAlignment: CrossAxisAlignment.center, - children: [ - Expanded( - child: Align( - alignment: Alignment.center, - child: Image( - image: AssetImage('assets/images/img_app_icon.png')), + child: SafeArea( + child: Padding( + padding: EdgeInsets.all(8.0), + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + Expanded( + child: Align( + alignment: Alignment.center, + child: Image( + image: AssetImage('assets/images/img_app_icon.png')), + ), ), - ), - Text(S.of(context).txt_game_complete_loading_gift) - ], - )), + Text(S.of(context).txt_game_complete_loading_gift) + ], + )), + ), ); } } diff --git a/lib/game/pause_dialog.dart b/lib/game/pause_dialog.dart index 5093ba72..7bdf8b7b 100644 --- a/lib/game/pause_dialog.dart +++ b/lib/game/pause_dialog.dart @@ -11,32 +11,34 @@ class PauseDialog extends StatelessWidget { Widget build(BuildContext context) { return Material( color: Colors.transparent, - child: Column( - mainAxisAlignment: MainAxisAlignment.end, - crossAxisAlignment: CrossAxisAlignment.stretch, - children: [ - ElevatedButton( - onPressed: () { - Navigator.of(context).pop(); - Navigator.of(context).pop(); - Navigator.of(context).pop(); - }, - child: Text(S.of(context).txt_button_quit), - ), - ElevatedButton( - onPressed: () { - _onRestart(); - Navigator.of(context).pop(); - }, - child: Text(S.of(context).txt_button_restart), - ), - ElevatedButton( - onPressed: () { - Navigator.of(context).pop(); - }, - child: Text(S.of(context).txt_game_button_continue), - ) - ], + child: SafeArea( + child: Column( + mainAxisAlignment: MainAxisAlignment.end, + crossAxisAlignment: CrossAxisAlignment.stretch, + children: [ + ElevatedButton( + onPressed: () { + Navigator.of(context).pop(); + Navigator.of(context).pop(); + Navigator.of(context).pop(); + }, + child: Text(S.of(context).txt_button_quit), + ), + ElevatedButton( + onPressed: () { + _onRestart(); + Navigator.of(context).pop(); + }, + child: Text(S.of(context).txt_button_restart), + ), + ElevatedButton( + onPressed: () { + Navigator.of(context).pop(); + }, + child: Text(S.of(context).txt_game_button_continue), + ) + ], + ), ), ); } diff --git a/lib/game/tile/tile_converter.dart b/lib/game/tile/tile_converter.dart index b1895013..5acb625d 100644 --- a/lib/game/tile/tile_converter.dart +++ b/lib/game/tile/tile_converter.dart @@ -13,7 +13,7 @@ const NUMBER_TILE_COLUMN = 4; const UNIT_DURATION_HEIGHT = 72; const TILE_WIDTH = 36.0; const TILE_HEIGHT = TILE_WIDTH; -const NON_TOUCH_REGION_HEIGHT = 150; +const NON_TOUCH_REGION_HEIGHT = 160; const startVisibleY = 0; double tickToSecond(int resolution, int bpm) { diff --git a/lib/game_config/game_config_widget.dart b/lib/game_config/game_config_widget.dart index 81347ac1..b6003e87 100644 --- a/lib/game_config/game_config_widget.dart +++ b/lib/game_config/game_config_widget.dart @@ -16,120 +16,123 @@ class GameConfigWidget extends StatelessWidget { appBar: AppBar( title: Text(S.of(context).txt_configure, style: Theme.of(context).appBarTheme.textTheme.headline5)), - body: Column( - mainAxisAlignment: MainAxisAlignment.end, - crossAxisAlignment: CrossAxisAlignment.stretch, - children: [ - Expanded( - child: Column( - mainAxisSize: MainAxisSize.max, - mainAxisAlignment: MainAxisAlignment.center, - children: [ - Text(S.of(context).txt_difficulty, - style: Theme.of(context).textTheme.headline5), - SizedBox(height: 8), - Row( - children: [ - SizedBox(width: 8), - CardWidget( - selected: state.difficulty == 0, - text: S.of(context).txt_easy, - caption: S.of(context).txt_fingers(2), - onTap: () { - BlocProvider.of(context) - ..add(GameConfigChangeDifficultyEvent(0)); - }, - ), - SizedBox(width: 8), - CardWidget( - selected: state.difficulty == 1, - text: S.of(context).txt_medium, - caption: S.of(context).txt_fingers(3), - onTap: () { - BlocProvider.of(context) - ..add(GameConfigChangeDifficultyEvent(1)); - }, - ), - SizedBox(width: 8), - CardWidget( - selected: state.difficulty == 2, - text: S.of(context).txt_difficult, - caption: S.of(context).txt_fingers(4), - onTap: () { - BlocProvider.of(context) - ..add(GameConfigChangeDifficultyEvent(2)); - }, - ), - SizedBox(width: 8) - ], - ) - ], + body: SafeArea( + child: Column( + mainAxisAlignment: MainAxisAlignment.end, + crossAxisAlignment: CrossAxisAlignment.stretch, + children: [ + Expanded( + child: Column( + mainAxisSize: MainAxisSize.max, + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Text(S.of(context).txt_difficulty, + style: Theme.of(context).textTheme.headline5), + SizedBox(height: 8), + Row( + children: [ + SizedBox(width: 8), + CardWidget( + selected: state.difficulty == 0, + text: S.of(context).txt_easy, + caption: S.of(context).txt_fingers(2), + onTap: () { + BlocProvider.of(context) + ..add(GameConfigChangeDifficultyEvent(0)); + }, + ), + SizedBox(width: 8), + CardWidget( + selected: state.difficulty == 1, + text: S.of(context).txt_medium, + caption: S.of(context).txt_fingers(3), + onTap: () { + BlocProvider.of(context) + ..add(GameConfigChangeDifficultyEvent(1)); + }, + ), + SizedBox(width: 8), + CardWidget( + selected: state.difficulty == 2, + text: S.of(context).txt_difficult, + caption: S.of(context).txt_fingers(4), + onTap: () { + BlocProvider.of(context) + ..add(GameConfigChangeDifficultyEvent(2)); + }, + ), + SizedBox(width: 8) + ], + ) + ], + ), ), - ), - Expanded( - child: Column( - mainAxisSize: MainAxisSize.max, - mainAxisAlignment: MainAxisAlignment.center, + Expanded( + child: Column( + mainAxisSize: MainAxisSize.max, + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Text(S.of(context).txt_speed, + style: Theme.of(context).textTheme.headline5), + SizedBox(height: 8), + Row( + children: [ + SizedBox(width: 8), + CardWidget( + selected: state.speed == 0, + text: S.of(context).txt_slow, + caption: 'x0.75', + onTap: () { + BlocProvider.of(context) + ..add(GameConfigChangeSpeedEvent(0)); + }, + ), + SizedBox(width: 8), + CardWidget( + selected: state.speed == 1, + text: S.of(context).txt_normal, + caption: 'x1.0', + onTap: () { + BlocProvider.of(context) + ..add(GameConfigChangeSpeedEvent(1)); + }, + ), + SizedBox(width: 8), + CardWidget( + selected: state.speed == 2, + text: S.of(context).txt_fast, + caption: 'x1.25', + onTap: () { + BlocProvider.of(context) + ..add(GameConfigChangeSpeedEvent(2)); + }, + ), + SizedBox(width: 8) + ], + ) + ], + ), + ), + Row( children: [ - Text(S.of(context).txt_speed, - style: Theme.of(context).textTheme.headline5), - SizedBox(height: 8), - Row( - children: [ - SizedBox(width: 8), - CardWidget( - selected: state.speed == 0, - text: S.of(context).txt_slow, - caption: 'x0.75', - onTap: () { - BlocProvider.of(context) - ..add(GameConfigChangeSpeedEvent(0)); - }, - ), - SizedBox(width: 8), - CardWidget( - selected: state.speed == 1, - text: S.of(context).txt_normal, - caption: 'x1.0', - onTap: () { - BlocProvider.of(context) - ..add(GameConfigChangeSpeedEvent(1)); - }, - ), - SizedBox(width: 8), - CardWidget( - selected: state.speed == 2, - text: S.of(context).txt_fast, - caption: 'x1.25', - onTap: () { - BlocProvider.of(context) - ..add(GameConfigChangeSpeedEvent(2)); + SizedBox(width: 8), + Expanded( + child: ElevatedButton( + onPressed: () { + Navigator.pushNamed(context, Routes.game, + arguments: { + 'song': song, + 'difficulty': state.difficulty, + 'speed': state.speed + }); }, - ), - SizedBox(width: 8) - ], - ) + child: Text(S.of(context).txt_start)), + ), + SizedBox(width: 8) ], - ), - ), - Row( - children: [ - SizedBox(width: 8), - Expanded( - child: ElevatedButton( - onPressed: () { - Navigator.pushNamed(context, Routes.game, arguments: { - 'song': song, - 'difficulty': state.difficulty, - 'speed': state.speed - }); - }, - child: Text(S.of(context).txt_start)), - ), - SizedBox(width: 8) - ], - ) - ], + ) + ], + ), )); }); } diff --git a/lib/home/home_bloc.dart b/lib/home/home_bloc.dart deleted file mode 100644 index 270209f3..00000000 --- a/lib/home/home_bloc.dart +++ /dev/null @@ -1,42 +0,0 @@ -import 'dart:async'; - -import 'package:bloc/bloc.dart'; - -import '../instrument/instruments_repository.dart'; -import '../midi_processor.dart'; -import '../user/user_repository.dart'; -import 'home_event.dart'; -import 'home_state.dart'; - -class HomeBloc extends Bloc { - final UserRepository _userRepository; - final InstrumentsRepository _instrumentsRepository; - - HomeBloc(this._userRepository, this._instrumentsRepository) - : super(HomeInitial()) { - _userRepository.getCurrentUser().listen((user) async { - if (state is HomeInitial) { - final instrument = (await _instrumentsRepository.instruments()) - .firstWhere( - (instrument) => instrument.id == user.user.instrumentId); - MidiProcessor.getInstance().onSelectInstrument(instrument); - } else if (state is HomeUpdated) { - final oldUser = (state as HomeUpdated).user; - if (oldUser.user.instrumentId != user.user.instrumentId) { - final instrument = (await _instrumentsRepository.instruments()) - .firstWhere( - (instrument) => instrument.id == user.user.instrumentId); - MidiProcessor.getInstance().onSelectInstrument(instrument); - } - } - add(HomeUpdate(user)); - }); - } - - @override - Stream mapEventToState(HomeEvent event) async* { - if (event is HomeUpdate) { - yield HomeUpdated(event.user); - } - } -} diff --git a/lib/home/home_event.dart b/lib/home/home_event.dart deleted file mode 100644 index a740bbaa..00000000 --- a/lib/home/home_event.dart +++ /dev/null @@ -1,16 +0,0 @@ -import 'package:equatable/equatable.dart'; - -import '../user/user_repository.dart'; - -abstract class HomeEvent extends Equatable { - const HomeEvent(); -} - -class HomeUpdate extends HomeEvent { - final AppUser user; - - const HomeUpdate(this.user); - - @override - List get props => [user]; -} diff --git a/lib/home/home_state.dart b/lib/home/home_state.dart deleted file mode 100644 index 2a24aa20..00000000 --- a/lib/home/home_state.dart +++ /dev/null @@ -1,24 +0,0 @@ -import 'package:equatable/equatable.dart'; - -import '../user/user_repository.dart'; - -abstract class HomeState extends Equatable { - const HomeState(); - - @override - List get props => []; -} - -class HomeInitial extends HomeState {} - -class HomeUpdated extends HomeState { - final AppUser user; - - const HomeUpdated(this.user); - - @override - List get props => [user]; - - @override - String toString() => 'HomeUpdated { photoUrl: $user }'; -} diff --git a/lib/home/home_widget.dart b/lib/home/home_widget.dart index c0e183f1..39c264e1 100644 --- a/lib/home/home_widget.dart +++ b/lib/home/home_widget.dart @@ -7,13 +7,12 @@ import '../main.dart'; import '../routes.dart'; import '../search/search_widget.dart'; import '../songs/songs_widget.dart'; -import 'home_bloc.dart'; -import 'home_state.dart'; +import '../user/user_bloc.dart'; class HomeWidget extends StatelessWidget { @override Widget build(BuildContext context) { - return BlocBuilder( + return BlocBuilder( builder: (context, state) { return Scaffold( body: DefaultTabController( @@ -53,7 +52,7 @@ class HomeWidget extends StatelessWidget { }), IconButton( icon: ClipOval( - child: (state is HomeUpdated && + child: (state is UserUpdated && !state.user.isAnonymous) ? Image.network(state.user.photoUrl) : Icon(Icons.account_circle_rounded), diff --git a/lib/instrument/instrument.dart b/lib/instrument/instrument.dart index 04a65408..837d4847 100644 --- a/lib/instrument/instrument.dart +++ b/lib/instrument/instrument.dart @@ -2,8 +2,6 @@ import 'package:built_collection/built_collection.dart'; import 'package:built_value/built_value.dart'; import 'package:built_value/serializer.dart'; -import 'pitch_note.dart'; - part 'instrument.g.dart'; abstract class Instrument implements Built { @@ -15,13 +13,11 @@ abstract class Instrument implements Built { String get id; - BuiltMap get soundFiles; + BuiltMap get soundPaths; - BuiltMap get soundNotes; + BuiltMap get baseNotes; int get minNote; int get maxNote; - - double get volume; } diff --git a/lib/instrument/instrument.g.dart b/lib/instrument/instrument.g.dart index 2328653f..9313d2e7 100644 --- a/lib/instrument/instrument.g.dart +++ b/lib/instrument/instrument.g.dart @@ -20,21 +20,18 @@ class _$InstrumentSerializer implements StructuredSerializer { final result = [ 'id', serializers.serialize(object.id, specifiedType: const FullType(String)), - 'soundFiles', - serializers.serialize(object.soundFiles, + 'soundPaths', + serializers.serialize(object.soundPaths, specifiedType: const FullType( BuiltMap, const [const FullType(int), const FullType(String)])), - 'soundNotes', - serializers.serialize(object.soundNotes, - specifiedType: const FullType(BuiltMap, - const [const FullType(int), const FullType(PitchNote)])), + 'baseNotes', + serializers.serialize(object.baseNotes, + specifiedType: const FullType( + BuiltMap, const [const FullType(int), const FullType(int)])), 'minNote', serializers.serialize(object.minNote, specifiedType: const FullType(int)), 'maxNote', serializers.serialize(object.maxNote, specifiedType: const FullType(int)), - 'volume', - serializers.serialize(object.volume, - specifiedType: const FullType(double)), ]; return result; @@ -55,15 +52,15 @@ class _$InstrumentSerializer implements StructuredSerializer { result.id = serializers.deserialize(value, specifiedType: const FullType(String)) as String; break; - case 'soundFiles': - result.soundFiles.replace(serializers.deserialize(value, + case 'soundPaths': + result.soundPaths.replace(serializers.deserialize(value, specifiedType: const FullType(BuiltMap, const [const FullType(int), const FullType(String)]))); break; - case 'soundNotes': - result.soundNotes.replace(serializers.deserialize(value, - specifiedType: const FullType(BuiltMap, - const [const FullType(int), const FullType(PitchNote)]))); + case 'baseNotes': + result.baseNotes.replace(serializers.deserialize(value, + specifiedType: const FullType( + BuiltMap, const [const FullType(int), const FullType(int)]))); break; case 'minNote': result.minNote = serializers.deserialize(value, @@ -73,10 +70,6 @@ class _$InstrumentSerializer implements StructuredSerializer { result.maxNote = serializers.deserialize(value, specifiedType: const FullType(int)) as int; break; - case 'volume': - result.volume = serializers.deserialize(value, - specifiedType: const FullType(double)) as double; - break; } } @@ -88,35 +81,28 @@ class _$Instrument extends Instrument { @override final String id; @override - final BuiltMap soundFiles; + final BuiltMap soundPaths; @override - final BuiltMap soundNotes; + final BuiltMap baseNotes; @override final int minNote; @override final int maxNote; - @override - final double volume; factory _$Instrument([void Function(InstrumentBuilder) updates]) => (new InstrumentBuilder()..update(updates)).build(); _$Instrument._( - {this.id, - this.soundFiles, - this.soundNotes, - this.minNote, - this.maxNote, - this.volume}) + {this.id, this.soundPaths, this.baseNotes, this.minNote, this.maxNote}) : super._() { if (id == null) { throw new BuiltValueNullFieldError('Instrument', 'id'); } - if (soundFiles == null) { - throw new BuiltValueNullFieldError('Instrument', 'soundFiles'); + if (soundPaths == null) { + throw new BuiltValueNullFieldError('Instrument', 'soundPaths'); } - if (soundNotes == null) { - throw new BuiltValueNullFieldError('Instrument', 'soundNotes'); + if (baseNotes == null) { + throw new BuiltValueNullFieldError('Instrument', 'baseNotes'); } if (minNote == null) { throw new BuiltValueNullFieldError('Instrument', 'minNote'); @@ -124,9 +110,6 @@ class _$Instrument extends Instrument { if (maxNote == null) { throw new BuiltValueNullFieldError('Instrument', 'maxNote'); } - if (volume == null) { - throw new BuiltValueNullFieldError('Instrument', 'volume'); - } } @override @@ -141,34 +124,30 @@ class _$Instrument extends Instrument { if (identical(other, this)) return true; return other is Instrument && id == other.id && - soundFiles == other.soundFiles && - soundNotes == other.soundNotes && + soundPaths == other.soundPaths && + baseNotes == other.baseNotes && minNote == other.minNote && - maxNote == other.maxNote && - volume == other.volume; + maxNote == other.maxNote; } @override int get hashCode { return $jf($jc( $jc( - $jc( - $jc($jc($jc(0, id.hashCode), soundFiles.hashCode), - soundNotes.hashCode), - minNote.hashCode), - maxNote.hashCode), - volume.hashCode)); + $jc($jc($jc(0, id.hashCode), soundPaths.hashCode), + baseNotes.hashCode), + minNote.hashCode), + maxNote.hashCode)); } @override String toString() { return (newBuiltValueToStringHelper('Instrument') ..add('id', id) - ..add('soundFiles', soundFiles) - ..add('soundNotes', soundNotes) + ..add('soundPaths', soundPaths) + ..add('baseNotes', baseNotes) ..add('minNote', minNote) - ..add('maxNote', maxNote) - ..add('volume', volume)) + ..add('maxNote', maxNote)) .toString(); } } @@ -180,17 +159,17 @@ class InstrumentBuilder implements Builder { String get id => _$this._id; set id(String id) => _$this._id = id; - MapBuilder _soundFiles; - MapBuilder get soundFiles => - _$this._soundFiles ??= new MapBuilder(); - set soundFiles(MapBuilder soundFiles) => - _$this._soundFiles = soundFiles; + MapBuilder _soundPaths; + MapBuilder get soundPaths => + _$this._soundPaths ??= new MapBuilder(); + set soundPaths(MapBuilder soundPaths) => + _$this._soundPaths = soundPaths; - MapBuilder _soundNotes; - MapBuilder get soundNotes => - _$this._soundNotes ??= new MapBuilder(); - set soundNotes(MapBuilder soundNotes) => - _$this._soundNotes = soundNotes; + MapBuilder _baseNotes; + MapBuilder get baseNotes => + _$this._baseNotes ??= new MapBuilder(); + set baseNotes(MapBuilder baseNotes) => + _$this._baseNotes = baseNotes; int _minNote; int get minNote => _$this._minNote; @@ -200,20 +179,15 @@ class InstrumentBuilder implements Builder { int get maxNote => _$this._maxNote; set maxNote(int maxNote) => _$this._maxNote = maxNote; - double _volume; - double get volume => _$this._volume; - set volume(double volume) => _$this._volume = volume; - InstrumentBuilder(); InstrumentBuilder get _$this { if (_$v != null) { _id = _$v.id; - _soundFiles = _$v.soundFiles?.toBuilder(); - _soundNotes = _$v.soundNotes?.toBuilder(); + _soundPaths = _$v.soundPaths?.toBuilder(); + _baseNotes = _$v.baseNotes?.toBuilder(); _minNote = _$v.minNote; _maxNote = _$v.maxNote; - _volume = _$v.volume; _$v = null; } return this; @@ -239,18 +213,17 @@ class InstrumentBuilder implements Builder { _$result = _$v ?? new _$Instrument._( id: id, - soundFiles: soundFiles.build(), - soundNotes: soundNotes.build(), + soundPaths: soundPaths.build(), + baseNotes: baseNotes.build(), minNote: minNote, - maxNote: maxNote, - volume: volume); + maxNote: maxNote); } catch (_) { String _$failedField; try { - _$failedField = 'soundFiles'; - soundFiles.build(); - _$failedField = 'soundNotes'; - soundNotes.build(); + _$failedField = 'soundPaths'; + soundPaths.build(); + _$failedField = 'baseNotes'; + baseNotes.build(); } catch (e) { throw new BuiltValueNestedFieldError( 'Instrument', _$failedField, e.toString()); diff --git a/lib/instrument/pitch_note.dart b/lib/instrument/pitch_note.dart deleted file mode 100644 index 8c0e0b44..00000000 --- a/lib/instrument/pitch_note.dart +++ /dev/null @@ -1,16 +0,0 @@ -import 'package:built_value/built_value.dart'; -import 'package:built_value/serializer.dart'; - -part 'pitch_note.g.dart'; - -abstract class PitchNote implements Built { - static Serializer get serializer => _$pitchNoteSerializer; - - factory PitchNote([Function(PitchNoteBuilder) updates]) = _$PitchNote; - - PitchNote._(); - - int get note; - - double get pitch; -} diff --git a/lib/instrument/pitch_note.g.dart b/lib/instrument/pitch_note.g.dart deleted file mode 100644 index 1f2b6852..00000000 --- a/lib/instrument/pitch_note.g.dart +++ /dev/null @@ -1,145 +0,0 @@ -// GENERATED CODE - DO NOT MODIFY BY HAND - -part of 'pitch_note.dart'; - -// ************************************************************************** -// BuiltValueGenerator -// ************************************************************************** - -Serializer _$pitchNoteSerializer = new _$PitchNoteSerializer(); - -class _$PitchNoteSerializer implements StructuredSerializer { - @override - final Iterable types = const [PitchNote, _$PitchNote]; - @override - final String wireName = 'PitchNote'; - - @override - Iterable serialize(Serializers serializers, PitchNote object, - {FullType specifiedType = FullType.unspecified}) { - final result = [ - 'note', - serializers.serialize(object.note, specifiedType: const FullType(int)), - 'pitch', - serializers.serialize(object.pitch, - specifiedType: const FullType(double)), - ]; - - return result; - } - - @override - PitchNote deserialize(Serializers serializers, Iterable serialized, - {FullType specifiedType = FullType.unspecified}) { - final result = new PitchNoteBuilder(); - - final iterator = serialized.iterator; - while (iterator.moveNext()) { - final key = iterator.current as String; - iterator.moveNext(); - final dynamic value = iterator.current; - switch (key) { - case 'note': - result.note = serializers.deserialize(value, - specifiedType: const FullType(int)) as int; - break; - case 'pitch': - result.pitch = serializers.deserialize(value, - specifiedType: const FullType(double)) as double; - break; - } - } - - return result.build(); - } -} - -class _$PitchNote extends PitchNote { - @override - final int note; - @override - final double pitch; - - factory _$PitchNote([void Function(PitchNoteBuilder) updates]) => - (new PitchNoteBuilder()..update(updates)).build(); - - _$PitchNote._({this.note, this.pitch}) : super._() { - if (note == null) { - throw new BuiltValueNullFieldError('PitchNote', 'note'); - } - if (pitch == null) { - throw new BuiltValueNullFieldError('PitchNote', 'pitch'); - } - } - - @override - PitchNote rebuild(void Function(PitchNoteBuilder) updates) => - (toBuilder()..update(updates)).build(); - - @override - PitchNoteBuilder toBuilder() => new PitchNoteBuilder()..replace(this); - - @override - bool operator ==(Object other) { - if (identical(other, this)) return true; - return other is PitchNote && note == other.note && pitch == other.pitch; - } - - @override - int get hashCode { - return $jf($jc($jc(0, note.hashCode), pitch.hashCode)); - } - - @override - String toString() { - return (newBuiltValueToStringHelper('PitchNote') - ..add('note', note) - ..add('pitch', pitch)) - .toString(); - } -} - -class PitchNoteBuilder implements Builder { - _$PitchNote _$v; - - int _note; - int get note => _$this._note; - set note(int note) => _$this._note = note; - - double _pitch; - double get pitch => _$this._pitch; - set pitch(double pitch) => _$this._pitch = pitch; - - PitchNoteBuilder(); - - PitchNoteBuilder get _$this { - if (_$v != null) { - _note = _$v.note; - _pitch = _$v.pitch; - _$v = null; - } - return this; - } - - @override - void replace(PitchNote other) { - if (other == null) { - throw new ArgumentError.notNull('other'); - } - _$v = other as _$PitchNote; - } - - @override - void update(void Function(PitchNoteBuilder) updates) { - if (updates != null) updates(this); - } - - @override - _$PitchNote build() { - final _$result = _$v ?? new _$PitchNote._(note: note, pitch: pitch); - replace(_$result); - return _$result; - } -} - -// ignore_for_file: always_put_control_body_on_new_line,always_specify_types,annotate_overrides,avoid_annotating_with_dynamic,avoid_as,avoid_catches_without_on_clauses,avoid_returning_this,lines_longer_than_80_chars,omit_local_variable_types,prefer_expression_function_bodies,sort_constructors_first,test_types_in_equals,unnecessary_const,unnecessary_new diff --git a/lib/instrument_checker.dart b/lib/instrument_checker.dart new file mode 100644 index 00000000..c8a8487b --- /dev/null +++ b/lib/instrument_checker.dart @@ -0,0 +1,55 @@ +import 'dart:convert'; +import 'dart:io'; + +void main() { + File('database/db.json') + .readAsString() + .then((fileContents) => json.decode(fileContents)) + .then((jsonData) { + final dir = Directory('storage/sounds'); + final collections = jsonData['__collections__']; + final instruments = {}; + dir + .listSync(recursive: true) + .whereType() + .toList() + .forEach((childDir) { + final id = childDir.path.split('/').last; + final instrument = {}; + final soundPaths = {}; + childDir + .listSync(recursive: true) + .whereType() + .toList() + .forEach((file) { + soundPaths[file.path.split('/').last.split('.').first] = + file.path.replaceAll('storage/', ''); + }); + final notes = soundPaths.keys.map((e) => int.parse(e)).toList()..sort(); + final maxNote = notes.last; + final minNote = notes.first; + var i = 0; + final baseNotes = {}; + for (var note = minNote; note <= maxNote; note++) { + if ((i + 1) < notes.length && note >= notes[i + 1]) { + i++; + } else if ((i + 1) < notes.length && note > (notes[i] + 2)) { + i++; + } + final int = notes[i].toInt(); + baseNotes[note.toString()] = int; + } + + instrument['id'] = id; + instrument['maxNote'] = maxNote; + instrument['minNote'] = minNote; + instrument['soundPaths'] = soundPaths; + instrument['baseNotes'] = baseNotes; + instrument['__collections__'] = {}; + instruments[id] = instrument; + }); + collections['instruments'] = instruments; + jsonData['__collections__'] = collections; + File('database/db.json').writeAsStringSync(json.encode(jsonData)); + }); +} diff --git a/lib/main.dart b/lib/main.dart index 66605749..7c2be5e4 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -4,12 +4,12 @@ import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:flutter_localizations/flutter_localizations.dart'; import 'authentication/authentication_bloc.dart'; +import 'authentication/authentication_event.dart'; import 'game/game_bloc.dart'; import 'game/game_widget.dart'; import 'game_config/game_config_bloc.dart'; import 'game_config/game_config_widget.dart'; import 'generated/l10n.dart'; -import 'home/home_bloc.dart'; import 'home/home_widget.dart'; import 'instrument/instruments_repository_impl.dart'; import 'instrument/instruments_widget.dart'; @@ -67,7 +67,8 @@ class App extends StatelessWidget { ), BlocProvider( create: (context) { - return AuthenticationBloc(userRepository); + return AuthenticationBloc(userRepository) + ..add(SignInAnonymouslyEvent()); }, ), BlocProvider( @@ -106,10 +107,7 @@ class App extends StatelessWidget { return SplashWidget(); }, Routes.home: (context) { - return BlocProvider( - create: (context) => - HomeBloc(userRepository, instrumentsRepository), - child: HomeWidget()); + return HomeWidget(); }, Routes.gameConfig: (context) { primaryColor = Theme.of(context).colorScheme.primary; diff --git a/lib/midi_processor.dart b/lib/midi_processor.dart index c1ff655e..216978c1 100644 --- a/lib/midi_processor.dart +++ b/lib/midi_processor.dart @@ -16,50 +16,38 @@ class MidiProcessor { return _instance; } - Map> _noteToSoundIdAndPitches = {}; Instrument _instrument; - /* - Limit the number of simultaneous sounds, because, SoundPool only have 1MB heap size (media/libmediaplayerservice/MediaPlayerService.cpp), if exceeded, sound cannot be played. - AudioFlinger could not create track, status: -12 - SoundPool: Error creating AudioTrack - (Error -12 out of memory) - */ - static const _maxStreams = 8; final _soundPlayer = SoundPlayer(); - final _activeSounds = {}; - - final StreamController _soundLoadedController = BehaviorSubject(); + final _soundLoadedController = BehaviorSubject(); Stream get soundLoadedStream => _soundLoadedController.stream; + final _soundPaths = {}; void onSelectInstrument(Instrument instrument) { if (_instrument != instrument) { - dispose(); - _soundPlayer.init(2, _maxStreams); + _soundPaths.clear(); + _soundPlayer.release(); + _soundLoadedController.add(false); _instrument = instrument; - Future.wait(instrument.soundFiles.values - .map((e) => FirebaseCacheManager().getSingleFile(e))) - .then((files) => { - Future.wait(files.map((file) => _soundPlayer.load(file.path))) - .then((soundIds) => { - _noteToSoundIdAndPitches = _instrument.soundNotes - .map((note, pitchNote) => MapEntry( - note, - Pair( - soundIds[_instrument.soundFiles.keys - .toList() - .indexOf(pitchNote.note)], - pitchNote.pitch))) - .asMap(), - if (soundIds.length == _instrument.soundFiles.length) - {_soundLoadedController.add(true)} - }) - }); + Future.wait(instrument.soundPaths + .asMap() + .map((note, path) => MapEntry(note, getFile(note, path))) + .values + .toList()) + .then((_) async { + await _soundPlayer.load(_soundPaths, _instrument.baseNotes.toMap()); + _soundLoadedController.add(true); + }); } } + Future getFile(int note, String path) async { + final file = await FirebaseCacheManager().getSingleFile(path); + _soundPaths[note] = file.path; + } + Future playNote(int note) async { print(note.toString()); var pitchNote = note.toInt(); @@ -69,28 +57,6 @@ class MidiProcessor { while (pitchNote < _instrument.minNote) { pitchNote += 12; } - final soundIdAndPitch = _noteToSoundIdAndPitches[pitchNote]; - if (soundIdAndPitch != null) { - _activeSounds.add(await _soundPlayer.play(soundIdAndPitch.first, - rate: soundIdAndPitch.second)); - if (_activeSounds.length == _maxStreams) { - final firstSound = _activeSounds.first; - await _soundPlayer.stop(firstSound); - _activeSounds.remove(firstSound); - } - } + await _soundPlayer.play(pitchNote); } - - void dispose() { - _soundPlayer?.release(); - _soundLoadedController.add(false); - _activeSounds.clear(); - } -} - -class Pair { - final A first; - final B second; - - const Pair(this.first, this.second); } diff --git a/lib/serializers.dart b/lib/serializers.dart index 25737af8..949834fa 100644 --- a/lib/serializers.dart +++ b/lib/serializers.dart @@ -6,7 +6,6 @@ import 'package:built_value/standard_json_plugin.dart'; import 'game/game_reward.dart'; import 'instrument/instrument.dart'; -import 'instrument/pitch_note.dart'; import 'songs/song.dart'; import 'user/user.dart'; @@ -17,7 +16,6 @@ part 'serializers.g.dart'; Instrument, Song, GameReward, - PitchNote, User, ]) final Serializers serializers = (_$serializers.toBuilder() diff --git a/lib/serializers.g.dart b/lib/serializers.g.dart index 76477ef1..9297484b 100644 --- a/lib/serializers.g.dart +++ b/lib/serializers.g.dart @@ -9,7 +9,6 @@ part of 'serializers.dart'; Serializers _$serializers = (new Serializers().toBuilder() ..add(GameReward.serializer) ..add(Instrument.serializer) - ..add(PitchNote.serializer) ..add(Song.serializer) ..add(User.serializer) ..addBuilderFactory( @@ -30,8 +29,8 @@ Serializers _$serializers = (new Serializers().toBuilder() () => new MapBuilder()) ..addBuilderFactory( const FullType( - BuiltMap, const [const FullType(int), const FullType(PitchNote)]), - () => new MapBuilder())) + BuiltMap, const [const FullType(int), const FullType(int)]), + () => new MapBuilder())) .build(); // ignore_for_file: always_put_control_body_on_new_line,always_specify_types,annotate_overrides,avoid_annotating_with_dynamic,avoid_as,avoid_catches_without_on_clauses,avoid_returning_this,lines_longer_than_80_chars,omit_local_variable_types,prefer_expression_function_bodies,sort_constructors_first,test_types_in_equals,unnecessary_const,unnecessary_new diff --git a/lib/setting/setting_bloc.dart b/lib/setting/setting_bloc.dart index 9a60dbeb..614e5876 100644 --- a/lib/setting/setting_bloc.dart +++ b/lib/setting/setting_bloc.dart @@ -10,16 +10,16 @@ part 'setting_event.dart'; part 'setting_state.dart'; class SettingBloc extends Bloc { - SettingBloc() : super(SettingState(Locale('en', ''), ThemeMode.system)) { + SettingBloc() : super(SettingState(null, null)) { Preferences.getInstance().then((preferences) { - if (preferences.localeName != null) { - add(ChangeLocaleEvent( - Locale.fromSubtags(languageCode: preferences.localeName))); - } - if (preferences.themeName != null) { - add(ChangeThemeEvent(ThemeMode.values - .firstWhere((e) => e.toString() == preferences.themeName))); - } + final locale = (preferences.localeName != null) + ? Locale.fromSubtags(languageCode: preferences.localeName) + : null; + final themeMode = (preferences.themeName != null) + ? ThemeMode.values + .firstWhere((e) => e.toString() == preferences.themeName) + : ThemeMode.system; + add(LoadThemeAndLocaleEvent(themeMode, locale)); }); } @@ -37,6 +37,8 @@ class SettingBloc extends Bloc { preferences.themeName = event.theme.toString(); }); yield SettingState(state.locale, event.theme); + } else if (event is LoadThemeAndLocaleEvent) { + yield SettingState(event.locale, event.theme); } } } diff --git a/lib/setting/setting_event.dart b/lib/setting/setting_event.dart index 410a725b..8f3bc5c1 100644 --- a/lib/setting/setting_event.dart +++ b/lib/setting/setting_event.dart @@ -21,3 +21,13 @@ class ChangeThemeEvent extends SettingEvent { @override List get props => [theme]; } + +class LoadThemeAndLocaleEvent extends SettingEvent { + final ThemeMode theme; + final Locale locale; + + LoadThemeAndLocaleEvent(this.theme, this.locale); + + @override + List get props => [theme, locale]; +} diff --git a/lib/song_checker.dart b/lib/song_checker.dart index 45bbbfeb..715e977c 100644 --- a/lib/song_checker.dart +++ b/lib/song_checker.dart @@ -14,34 +14,34 @@ void main() { .then((jsonData) { final dir = Directory('storage/songs'); final collections = jsonData['__collections__']; - final songsMap = {}; + final songs = {}; dir.listSync(recursive: true).whereType().toList().forEach((file) { - final key = file.uri.toString().split('/').last.replaceAll('.mid', ''); + final id = file.uri.toString().split('/').last.replaceAll('.mid', ''); final temp = file.uri.toString().split('/'); final genre = temp[temp.length - 2]; print( - '*************************** Checking $key ***************************'); - final artist = key.split('-').first; - final title = key.replaceAll('$artist-', '').replaceAll('_', ' '); + '*************************** Checking $id ***************************'); + final artist = id.split('-').first; + final title = id.replaceAll('$artist-', '').replaceAll('_', ' '); final artist1 = artist.replaceAll('_', ' '); final midiFile = MidiParser().parseMidiFromFile(File(file.path)); final events = midiFile.tracks[0]; final track = midiFile.tracks.length; - final value = {}; + final song = {}; if (track != 2) { print('WARNING trackCount $track'); } - value['bpm'] = 0; + song['bpm'] = 0; for (final midiEvent in events) { if (midiEvent is SetTempoEvent) { final tempo = 60000000 ~/ midiEvent.microsecondsPerBeat; print('Tempo changes to $tempo'); - if (value['bpm'] <= tempo) { - value['bpm'] = tempo; + if (song['bpm'] <= tempo) { + song['bpm'] = tempo; } } } - print('Select largest tempo ${value['bpm']}'); + print('Select largest tempo ${song['bpm']}'); final tileChunks = createTileChunks(midiFile); final groupByDurationToPrevious = Map.fromEntries(groupBy( tileChunks, (TileChunk tileChunk) => tileChunk.durationToPrevious) @@ -66,8 +66,9 @@ void main() { var unitDuration = 0; final durations = groupByDurationToPrevious.keys.iterator; var tick2Second = - tickToSecond(midiFile.header.ticksPerBeat, value['bpm'] as int); - final minimumSingleTileSeconds = 0.25; // 4 touches per second, slow enough to click continuously + tickToSecond(midiFile.header.ticksPerBeat, song['bpm'] as int); + final minimumSingleTileSeconds = + 0.25; // 4 touches per second, slow enough to click continuously while (singleTileSeconds < minimumSingleTileSeconds && durations.moveNext() && unitDuration < mostCountDurationToPrevious) { @@ -78,13 +79,14 @@ void main() { } if (singleTileSeconds < minimumSingleTileSeconds) { - print('WARNING $key, Still too fast $singleTileSeconds'); - final newBpm = - ((value['bpm'] as int) * (singleTileSeconds / minimumSingleTileSeconds)).toInt(); + print('WARNING $id, Still too fast $singleTileSeconds'); + final newBpm = ((song['bpm'] as int) * + (singleTileSeconds / minimumSingleTileSeconds)) + .toInt(); print('Reduce bpm to $newBpm'); - value['bpm'] = newBpm; + song['bpm'] = newBpm; tick2Second = - tickToSecond(midiFile.header.ticksPerBeat, value['bpm'] as int); + tickToSecond(midiFile.header.ticksPerBeat, song['bpm'] as int); } final speedDpsPerTick = UNIT_DURATION_HEIGHT / unitDuration; final speedDpsPerSecond = speedDpsPerTick / tick2Second; @@ -92,7 +94,7 @@ void main() { print('There are ${tiles.length} tiles'); final tileCount = tiles.length; if (tileCount < 50) { - print('WARNING Number tile to small $key, number tiles $tileCount'); + print('WARNING Number tile to small $id, number tiles $tileCount'); } final duration = (0.5 + ((0.0 - tiles.last.initialY) * 1000000) / speedDpsPerSecond) @@ -100,15 +102,15 @@ void main() { 60000000; print('Duration is $duration minutes'); if (duration > 10) { - print('WARNING Too long $key, $duration minutes'); + print('WARNING Too long $id, $duration minutes'); } - value['unitDuration'] = unitDuration; - value['tilesCount'] = [ + song['unitDuration'] = unitDuration; + song['tilesCount'] = [ createTiles(tileChunks, unitDuration, 2).length, createTiles(tileChunks, unitDuration, 3).length, createTiles(tileChunks, unitDuration, 4).length ]; - value['duration'] = [ + song['duration'] = [ (0.5 + ((0.0 - tiles.last.initialY) * 1000000) / (speedDpsPerSecond * 0.75)) @@ -120,15 +122,15 @@ void main() { (speedDpsPerSecond * 1.25)) .toInt() ]; - value['artist'] = artist1; - value['id'] = key; - value['tags'] = [genre]; - value['title'] = title; - value['url'] = file.uri.toString().replaceAll('storage/', ''); - value['__collections__'] = {}; - songsMap[key] = value; + song['id'] = id; + song['artist'] = artist1; + song['tags'] = [genre]; + song['title'] = title; + song['url'] = file.uri.toString().replaceAll('storage/', ''); + song['__collections__'] = {}; + songs[id] = song; }); - collections['songs'] = songsMap; + collections['songs'] = songs; jsonData['__collections__'] = collections; File('database/db.json').writeAsStringSync(json.encode(jsonData)); }); diff --git a/lib/sound_player.dart b/lib/sound_player.dart index 9eddb145..c3ac40ff 100644 --- a/lib/sound_player.dart +++ b/lib/sound_player.dart @@ -3,35 +3,19 @@ import 'package:flutter/services.dart'; class SoundPlayer { MethodChannel channel = MethodChannel('com.chaomao.hitnotes/sound_player'); - Future init(int streamType, int maxStreams) { - return channel.invokeMethod('init', { - 'streamType': streamType, - 'maxStreams': maxStreams, - }); + Future load(Map soundPaths, Map baseNotes) { + print('load'); + return channel.invokeMethod('load', + {'soundPaths': soundPaths, 'baseNotes': baseNotes}); } - Future load(String path, {int priority = 1}) { - return channel.invokeMethod('load', { - 'path': path, - 'priority': priority, - }); - } - - Future play(int soundId, {int repeat = 0, double rate = 1.0}) { - return channel.invokeMethod('play', { - 'soundId': soundId, - 'repeat': repeat, - 'rate': rate, - }); - } - - Future stop(int streamId) { - return channel.invokeMethod('stop', { - 'streamId': streamId, - }); + Future play(int note) { + print('play $note'); + return channel.invokeMethod('play', {'note': note}); } Future release() { + print('release'); return channel.invokeMethod('release'); } } diff --git a/lib/splash_widget.dart b/lib/splash_widget.dart index 7a7974bf..a148622c 100644 --- a/lib/splash_widget.dart +++ b/lib/splash_widget.dart @@ -2,14 +2,12 @@ import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; import 'authentication/authentication_bloc.dart'; -import 'authentication/authentication_event.dart'; import 'authentication/authentication_state.dart'; import 'routes.dart'; class SplashWidget extends StatelessWidget { @override Widget build(BuildContext context) { - BlocProvider.of(context)..add(SignInAnonymouslyEvent()); BlocProvider.of(context).listen((state) { if (state is Authenticated) { Navigator.pushNamedAndRemoveUntil( diff --git a/lib/user/user_bloc.dart b/lib/user/user_bloc.dart index cab58352..b3fe1db3 100644 --- a/lib/user/user_bloc.dart +++ b/lib/user/user_bloc.dart @@ -6,9 +6,11 @@ import 'package:meta/meta.dart'; import '../instrument/instrument.dart'; import '../instrument/instruments_repository.dart'; +import '../midi_processor.dart'; import 'user_repository.dart'; part 'user_event.dart'; + part 'user_state.dart'; class UserBloc extends Bloc { @@ -31,6 +33,15 @@ class UserBloc extends Bloc { UserEvent event, ) async* { if (event is UpdateUser) { + if (state is UserLoading || + (state is UserUpdated && + ((state as UserUpdated).user.user.instrumentId != + event.user.user.instrumentId))) { + final instrument = (await _instrumentsRepository.instruments()) + .firstWhere( + (instrument) => instrument.id == event.user.user.instrumentId); + MidiProcessor.getInstance().onSelectInstrument(instrument); + } yield UserUpdated(event.user, event.instruments); } else if (event is ChangeInstrument) { _userRepository.changeInstrument(event.instrumentId); diff --git a/lib/user/user_repository.dart b/lib/user/user_repository.dart index 5422d33c..ca46ab43 100644 --- a/lib/user/user_repository.dart +++ b/lib/user/user_repository.dart @@ -1,7 +1,7 @@ import 'user.dart'; abstract class UserRepository { - void changUser(); + void subscribeUser(); void changeInstrument(String instrumentId); diff --git a/lib/user/user_repository_impl.dart b/lib/user/user_repository_impl.dart index d7d3f8f6..f6bac943 100644 --- a/lib/user/user_repository_impl.dart +++ b/lib/user/user_repository_impl.dart @@ -21,7 +21,7 @@ class UserRepositoryImpl implements UserRepository { } @override - Future changUser() async { + Future subscribeUser() async { await _userSubscription?.cancel(); _userSubscription = FirebaseFirestore.instance .collection('users') diff --git a/lib/user/user_widget.dart b/lib/user/user_widget.dart index 14847a61..0d5dbf69 100644 --- a/lib/user/user_widget.dart +++ b/lib/user/user_widget.dart @@ -32,7 +32,7 @@ class UserWidget extends StatelessWidget { child: ListView( shrinkWrap: true, controller: scrollController, - children: [buildColumn(state, context)]))); + children: [buildUI(state, context)]))); } else { return Container(); } @@ -41,226 +41,236 @@ class UserWidget extends StatelessWidget { ); } - Column buildColumn(UserUpdated state, BuildContext context) { - return Column( - crossAxisAlignment: CrossAxisAlignment.stretch, + Widget buildUI(UserUpdated state, BuildContext context) { + return SafeArea( + child: Column( + crossAxisAlignment: CrossAxisAlignment.stretch, + children: [ + () { + if (!state.user.isAnonymous) { + return buildAnonymousUI(state, context); + } else { + return buildUserUI(context); + } + }(), + Card( + color: Colors.transparent, + elevation: 0, + child: buildUserStatisticUI(state, context)), + ], + ), + ); + } + + Table buildUserStatisticUI(UserUpdated state, BuildContext context) { + return Table( children: [ - () { - if (!state.user.isAnonymous) { - return Card( - color: Colors.transparent, - elevation: 0, - child: Container( - padding: EdgeInsets.all(8.0), - child: Row( - children: [ - ClipOval( - child: Image.network(state.user.photoUrl, width: 72), - ), - SizedBox(width: 8), - Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Text( - state.user.name, - style: Theme.of(context).textTheme.headline5, - ), - SizedBox(height: 8), - Row( - children: [ - Icon( - Icons.today, - size: 16, - ), - SizedBox(width: 8), - Text( - S.of(context).txt_joined(DateFormat.yMMMd() - .format(state.user.creationTime)), - style: Theme.of(context).textTheme.subtitle1, - ), - ], - ), - Row( - children: [ - Image( - image: AssetImage( - 'assets/images/img_guitar.png'), - width: 16, - height: 16, - ), - SizedBox(width: 8), - Text(S.of(context).txt_using(Intl.message( - '', - /* FIXME Localization name of instrument should be taken from server, not from local text resources */ - name: state.user.user.instrumentId, - desc: '', - args: [], - ))), - ], - ), - ], - ) - ], - ))); - } else { - return Card( - color: Colors.transparent, - elevation: 0, - child: Container( - padding: EdgeInsets.all(8.0), - child: Column( - crossAxisAlignment: CrossAxisAlignment.stretch, - children: [ - OutlinedButton( - onPressed: () { - BlocProvider.of(context) - ..add(SignInWithGoogleEvent()); - }, - child: Padding( - padding: const EdgeInsets.all(8), - child: Row( - mainAxisSize: MainAxisSize.max, - mainAxisAlignment: MainAxisAlignment.start, - children: [ - Image( - image: AssetImage( - 'assets/images/img_google.png')), - SizedBox(width: 8), - Text(S.of(context).txt_button_sign_in_google, - style: - Theme.of(context).textTheme.subtitle1) - ], - ), - ), - ), - SizedBox(height: 8), - OutlinedButton( - onPressed: () { - BlocProvider.of(context) - ..add(SignInWithFacebookEvent()); - }, - child: Padding( - padding: const EdgeInsets.all(8), - child: Row( - mainAxisSize: MainAxisSize.max, - mainAxisAlignment: MainAxisAlignment.start, - children: [ - Image( - image: AssetImage( - 'assets/images/img_facebook.png')), - SizedBox(width: 8), - Text( - S.of(context).txt_button_sign_in_facebook, - style: - Theme.of(context).textTheme.subtitle1) - ], - ), - ), - ), - ]))); - } - }(), - Card( + TableRow(children: [ + Card( color: Colors.transparent, elevation: 0, - child: Table( - children: [ - TableRow(children: [ - Card( - color: Colors.transparent, - elevation: 0, - shape: RoundedRectangleBorder( - borderRadius: BorderRadius.circular(8), - // if you need this - side: BorderSide( - color: Colors.grey.withOpacity(0.2), - width: 1, - ), - ), - child: Container( - //color: Colors.white, - //width: 200, - //height: 200, - child: Column( - children: [ - SizedBox(height: 8), + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(8), + // if you need this + side: BorderSide( + color: Colors.grey.withOpacity(0.2), + width: 1, + ), + ), + child: Container( + //color: Colors.white, + //width: 200, + //height: 200, + child: Column( + children: [ + SizedBox(height: 8), + Image( + image: AssetImage('assets/images/img_star.png'), + ), + SizedBox(height: 8), + Text(state.user.user.stars.toString(), + style: Theme.of(context).textTheme.subtitle1), + SizedBox(height: 8), + ], + ), + ), + ), + Card( + color: Colors.transparent, + elevation: 0, + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(8), + // if you need this + side: BorderSide( + color: Colors.grey.withOpacity(0.2), + width: 1, + ), + ), + child: Container( + //color: Colors.white, + // width: 200, + //height: 200, + child: Column( + children: [ + SizedBox(height: 8), + Image( + image: AssetImage('assets/images/img_note.png'), + ), + SizedBox(height: 8), + Text(state.user.user.playedNotes.toString(), + style: Theme.of(context).textTheme.subtitle1), + SizedBox(height: 8), + ], + ), + ), + ), + Card( + color: Colors.transparent, + elevation: 0, + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(8), + // if you need this + side: BorderSide( + color: Colors.grey.withOpacity(0.2), + width: 1, + ), + ), + child: Container( + //color: Colors.white, + //width: 200, + //height: 200, + child: Column( + children: [ + SizedBox(height: 8), + Image( + image: AssetImage('assets/images/img_clock.png'), + ), + SizedBox(height: 8), + Text( + state.user.user.playedTime + .toString() + .substring(0, 4) + .toString(), + style: Theme.of(context).textTheme.subtitle1), + SizedBox(height: 8), + ], + ), + ), + ), + ]), + ], + ); + } + + Card buildUserUI(BuildContext context) { + return Card( + color: Colors.transparent, + elevation: 0, + child: Container( + padding: EdgeInsets.all(8.0), + child: Column( + crossAxisAlignment: CrossAxisAlignment.stretch, + children: [ + OutlinedButton( + onPressed: () { + BlocProvider.of(context) + ..add(SignInWithGoogleEvent()); + }, + child: Padding( + padding: const EdgeInsets.all(8), + child: Row( + mainAxisSize: MainAxisSize.max, + mainAxisAlignment: MainAxisAlignment.start, + children: [ Image( - image: AssetImage('assets/images/img_star.png'), - ), - SizedBox(height: 8), - Text(state.user.user.stars.toString(), - style: Theme.of(context).textTheme.subtitle1), - SizedBox(height: 8), + image: + AssetImage('assets/images/img_google.png')), + SizedBox(width: 8), + Text(S.of(context).txt_button_sign_in_google, + style: Theme.of(context).textTheme.subtitle1) ], ), ), ), - Card( - color: Colors.transparent, - elevation: 0, - shape: RoundedRectangleBorder( - borderRadius: BorderRadius.circular(8), - // if you need this - side: BorderSide( - color: Colors.grey.withOpacity(0.2), - width: 1, - ), - ), - child: Container( - //color: Colors.white, - // width: 200, - //height: 200, - child: Column( - children: [ - SizedBox(height: 8), + SizedBox(height: 8), + OutlinedButton( + onPressed: () { + BlocProvider.of(context) + ..add(SignInWithFacebookEvent()); + }, + child: Padding( + padding: const EdgeInsets.all(8), + child: Row( + mainAxisSize: MainAxisSize.max, + mainAxisAlignment: MainAxisAlignment.start, + children: [ Image( - image: AssetImage('assets/images/img_note.png'), - ), - SizedBox(height: 8), - Text(state.user.user.playedNotes.toString(), - style: Theme.of(context).textTheme.subtitle1), - SizedBox(height: 8), + image: + AssetImage('assets/images/img_facebook.png')), + SizedBox(width: 8), + Text(S.of(context).txt_button_sign_in_facebook, + style: Theme.of(context).textTheme.subtitle1) ], ), ), ), - Card( - color: Colors.transparent, - elevation: 0, - shape: RoundedRectangleBorder( - borderRadius: BorderRadius.circular(8), - // if you need this - side: BorderSide( - color: Colors.grey.withOpacity(0.2), - width: 1, - ), + ]))); + } + + Card buildAnonymousUI(UserUpdated state, BuildContext context) { + return Card( + color: Colors.transparent, + elevation: 0, + child: Container( + padding: EdgeInsets.all(8.0), + child: Row( + children: [ + ClipOval( + child: Image.network(state.user.photoUrl, width: 72), + ), + SizedBox(width: 8), + Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + state.user.name, + style: Theme.of(context).textTheme.headline5, ), - child: Container( - //color: Colors.white, - //width: 200, - //height: 200, - child: Column( - children: [ - SizedBox(height: 8), - Image( - image: AssetImage('assets/images/img_clock.png'), - ), - SizedBox(height: 8), - Text( - state.user.user.playedTime - .toString() - .substring(0, 4) - .toString(), - style: Theme.of(context).textTheme.subtitle1), - SizedBox(height: 8), - ], - ), + SizedBox(height: 8), + Row( + children: [ + Icon( + Icons.today, + size: 16, + ), + SizedBox(width: 8), + Text( + S.of(context).txt_joined(DateFormat.yMMMd() + .format(state.user.creationTime)), + style: Theme.of(context).textTheme.subtitle1, + ), + ], ), - ), - ]), + Row( + children: [ + Image( + image: AssetImage('assets/images/img_guitar.png'), + width: 16, + height: 16, + ), + SizedBox(width: 8), + Text(S.of(context).txt_using(Intl.message( + '', + /* FIXME Localization name of instrument should be taken from server, not from local text resources */ + name: state.user.user.instrumentId, + desc: '', + args: [], + ))), + ], + ), + ], + ) ], - )), - ], - ); + ))); } } diff --git a/pubspec.lock b/pubspec.lock index 7c00eb5f..0c5d7b5a 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -273,7 +273,7 @@ packages: name: equatable url: "https://pub.dartlang.org" source: hosted - version: "1.2.5" + version: "1.2.6" ffi: dependency: transitive description: @@ -371,7 +371,7 @@ packages: name: flame url: "https://pub.dartlang.org" source: hosted - version: "0.29.0" + version: "0.29.2" flare_dart: dependency: transitive description: @@ -397,7 +397,7 @@ packages: name: flutter_bloc url: "https://pub.dartlang.org" source: hosted - version: "6.1.1" + version: "6.1.2" flutter_cache_manager: dependency: "direct main" description: diff --git a/pubspec.yaml b/pubspec.yaml index 56d9ae16..03868fe9 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -8,13 +8,13 @@ dependencies: sdk: flutter flutter_localizations: sdk: flutter - flutter_bloc: ^6.0.6 - equatable: ^1.2.5 + flutter_bloc: ^6.1.2 + equatable: ^1.2.6 cloud_firestore: ^0.16.0 firebase_auth: ^0.20.0+1 firebase_storage: ^7.0.0 cloud_functions: ^0.9.0 - flame: 0.29.0 + flame: 0.29.2 dart_midi: ^1.0.1 cupertino_icons: ^1.0.0 built_value: ^7.1.0 diff --git a/resources/.gitignore b/resources/.gitignore index 71e41c9c..5b3f254b 100644 --- a/resources/.gitignore +++ b/resources/.gitignore @@ -1,3 +1,4 @@ +/venv /.idea/* !/.idea/codeStyles/ !/.idea/runConfigurations/ diff --git a/resources/gen_ios-images.py b/resources/gen_ios-images.py new file mode 100644 index 00000000..d39dd91c --- /dev/null +++ b/resources/gen_ios-images.py @@ -0,0 +1,26 @@ +import os +import subprocess + +multipliers = { + 20: [1, 2, 3], + 29: [1, 2, 3], + 40: [1, 2, 3], + 60: [2, 3], + 76: [1, 2], + 83.5: [2], + 1024: [1] +} +inkscape_default_dpi = 96 + +svg_default_folder = 'ios-images' +root = '../ios/Runner/Assets.xcassets/AppIcon.appiconset' + +for size, scales in multipliers.items(): + for scale in scales: + png_file_path = os.path.join(root, f"Icon-App-{size}x{size}@{scale}x" + '.png') + call_params = ["inkscape", + "--vacuum-defs", + "--export-dpi=%s" % int((size * scale) * 2), + "--export-filename=%s" % png_file_path, + os.path.join(svg_default_folder, 'ic_launcher.svg')] + subprocess.check_call(call_params, stdout=subprocess.DEVNULL, stderr=subprocess.STDOUT) diff --git a/resources/gen_ios-launch-images.py b/resources/gen_ios-launch-images.py new file mode 100644 index 00000000..53e1d795 --- /dev/null +++ b/resources/gen_ios-launch-images.py @@ -0,0 +1,29 @@ +import os +import subprocess + +multipliers = [ + 1, + 2, + 3, +] +inkscape_default_dpi = 96 + +svg_default_folder = 'ios-launch-images' +root = '../ios/Runner/Assets.xcassets/LaunchImage.imageset' + +file_paths = [] +file_names = os.listdir(svg_default_folder) +for svg_file_name in file_names: + file_paths.append(os.path.join(svg_default_folder, svg_file_name)) + +for scale in multipliers: + for file_path in file_paths: + png_file_path = os.path.join(root, f"LaunchImage@{scale}x" + '.png') + if scale == 1: + png_file_path = os.path.join(root, f"LaunchImage" + '.png') + call_params = ["inkscape", + "--vacuum-defs", + "--export-dpi=%s" % int(scale * inkscape_default_dpi), + "--export-filename=%s" % png_file_path, + file_path] + subprocess.check_call(call_params, stdout=subprocess.DEVNULL, stderr=subprocess.STDOUT) diff --git a/resources/ios-images/ic_launcher.svg b/resources/ios-images/ic_launcher.svg new file mode 100644 index 00000000..66567ffc --- /dev/null +++ b/resources/ios-images/ic_launcher.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/resources/ios-launch-images/LaunchImage.svg b/resources/ios-launch-images/LaunchImage.svg new file mode 100644 index 00000000..f2dfaa2e --- /dev/null +++ b/resources/ios-launch-images/LaunchImage.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/storage/sounds/acoustic-guitar/31.mp3 b/storage/sounds/acoustic_guitar/31.mp3 similarity index 100% rename from storage/sounds/acoustic-guitar/31.mp3 rename to storage/sounds/acoustic_guitar/31.mp3 diff --git a/storage/sounds/acoustic-guitar/33.mp3 b/storage/sounds/acoustic_guitar/33.mp3 similarity index 100% rename from storage/sounds/acoustic-guitar/33.mp3 rename to storage/sounds/acoustic_guitar/33.mp3 diff --git a/storage/sounds/acoustic-guitar/36.mp3 b/storage/sounds/acoustic_guitar/36.mp3 similarity index 100% rename from storage/sounds/acoustic-guitar/36.mp3 rename to storage/sounds/acoustic_guitar/36.mp3 diff --git a/storage/sounds/acoustic-guitar/39.mp3 b/storage/sounds/acoustic_guitar/39.mp3 similarity index 100% rename from storage/sounds/acoustic-guitar/39.mp3 rename to storage/sounds/acoustic_guitar/39.mp3 diff --git a/storage/sounds/acoustic-guitar/43.mp3 b/storage/sounds/acoustic_guitar/43.mp3 similarity index 100% rename from storage/sounds/acoustic-guitar/43.mp3 rename to storage/sounds/acoustic_guitar/43.mp3 diff --git a/storage/sounds/acoustic-guitar/45.mp3 b/storage/sounds/acoustic_guitar/45.mp3 similarity index 100% rename from storage/sounds/acoustic-guitar/45.mp3 rename to storage/sounds/acoustic_guitar/45.mp3 diff --git a/storage/sounds/acoustic-guitar/48.mp3 b/storage/sounds/acoustic_guitar/48.mp3 similarity index 100% rename from storage/sounds/acoustic-guitar/48.mp3 rename to storage/sounds/acoustic_guitar/48.mp3 diff --git a/storage/sounds/acoustic-guitar/52.mp3 b/storage/sounds/acoustic_guitar/52.mp3 similarity index 100% rename from storage/sounds/acoustic-guitar/52.mp3 rename to storage/sounds/acoustic_guitar/52.mp3 diff --git a/storage/sounds/acoustic-guitar/54.mp3 b/storage/sounds/acoustic_guitar/54.mp3 similarity index 100% rename from storage/sounds/acoustic-guitar/54.mp3 rename to storage/sounds/acoustic_guitar/54.mp3 diff --git a/storage/sounds/acoustic-guitar/57.mp3 b/storage/sounds/acoustic_guitar/57.mp3 similarity index 100% rename from storage/sounds/acoustic-guitar/57.mp3 rename to storage/sounds/acoustic_guitar/57.mp3 diff --git a/storage/sounds/acoustic-guitar/60.mp3 b/storage/sounds/acoustic_guitar/60.mp3 similarity index 100% rename from storage/sounds/acoustic-guitar/60.mp3 rename to storage/sounds/acoustic_guitar/60.mp3 diff --git a/storage/sounds/acoustic-guitar/63.mp3 b/storage/sounds/acoustic_guitar/63.mp3 similarity index 100% rename from storage/sounds/acoustic-guitar/63.mp3 rename to storage/sounds/acoustic_guitar/63.mp3 diff --git a/storage/sounds/acoustic-guitar/66.mp3 b/storage/sounds/acoustic_guitar/66.mp3 similarity index 100% rename from storage/sounds/acoustic-guitar/66.mp3 rename to storage/sounds/acoustic_guitar/66.mp3 diff --git a/storage/sounds/acoustic-guitar/69.mp3 b/storage/sounds/acoustic_guitar/69.mp3 similarity index 100% rename from storage/sounds/acoustic-guitar/69.mp3 rename to storage/sounds/acoustic_guitar/69.mp3 diff --git a/storage/sounds/acoustic-guitar/72.mp3 b/storage/sounds/acoustic_guitar/72.mp3 similarity index 100% rename from storage/sounds/acoustic-guitar/72.mp3 rename to storage/sounds/acoustic_guitar/72.mp3 diff --git a/storage/sounds/acoustic-guitar/75.mp3 b/storage/sounds/acoustic_guitar/75.mp3 similarity index 100% rename from storage/sounds/acoustic-guitar/75.mp3 rename to storage/sounds/acoustic_guitar/75.mp3 diff --git a/storage/sounds/acoustic-guitar/78.mp3 b/storage/sounds/acoustic_guitar/78.mp3 similarity index 100% rename from storage/sounds/acoustic-guitar/78.mp3 rename to storage/sounds/acoustic_guitar/78.mp3 diff --git a/storage/sounds/acoustic-guitar/81.mp3 b/storage/sounds/acoustic_guitar/81.mp3 similarity index 100% rename from storage/sounds/acoustic-guitar/81.mp3 rename to storage/sounds/acoustic_guitar/81.mp3 diff --git a/storage/sounds/acoustic-guitar/84.mp3 b/storage/sounds/acoustic_guitar/84.mp3 similarity index 100% rename from storage/sounds/acoustic-guitar/84.mp3 rename to storage/sounds/acoustic_guitar/84.mp3 diff --git a/storage/sounds/electric-guitar/40.mp3 b/storage/sounds/electric_guitar/40.mp3 similarity index 100% rename from storage/sounds/electric-guitar/40.mp3 rename to storage/sounds/electric_guitar/40.mp3 diff --git a/storage/sounds/electric-guitar/44.mp3 b/storage/sounds/electric_guitar/44.mp3 similarity index 100% rename from storage/sounds/electric-guitar/44.mp3 rename to storage/sounds/electric_guitar/44.mp3 diff --git a/storage/sounds/electric-guitar/48.mp3 b/storage/sounds/electric_guitar/48.mp3 similarity index 100% rename from storage/sounds/electric-guitar/48.mp3 rename to storage/sounds/electric_guitar/48.mp3 diff --git a/storage/sounds/electric-guitar/52.mp3 b/storage/sounds/electric_guitar/52.mp3 similarity index 100% rename from storage/sounds/electric-guitar/52.mp3 rename to storage/sounds/electric_guitar/52.mp3 diff --git a/storage/sounds/electric-guitar/56.mp3 b/storage/sounds/electric_guitar/56.mp3 similarity index 100% rename from storage/sounds/electric-guitar/56.mp3 rename to storage/sounds/electric_guitar/56.mp3 diff --git a/storage/sounds/electric-guitar/60.mp3 b/storage/sounds/electric_guitar/60.mp3 similarity index 100% rename from storage/sounds/electric-guitar/60.mp3 rename to storage/sounds/electric_guitar/60.mp3 diff --git a/storage/sounds/electric-guitar/65.mp3 b/storage/sounds/electric_guitar/65.mp3 similarity index 100% rename from storage/sounds/electric-guitar/65.mp3 rename to storage/sounds/electric_guitar/65.mp3 diff --git a/storage/sounds/electric-guitar/68.mp3 b/storage/sounds/electric_guitar/68.mp3 similarity index 100% rename from storage/sounds/electric-guitar/68.mp3 rename to storage/sounds/electric_guitar/68.mp3 diff --git a/storage/sounds/electric-guitar/72.mp3 b/storage/sounds/electric_guitar/72.mp3 similarity index 100% rename from storage/sounds/electric-guitar/72.mp3 rename to storage/sounds/electric_guitar/72.mp3 diff --git a/storage/sounds/electric-guitar/76.mp3 b/storage/sounds/electric_guitar/76.mp3 similarity index 100% rename from storage/sounds/electric-guitar/76.mp3 rename to storage/sounds/electric_guitar/76.mp3 diff --git a/storage/sounds/electric-guitar/80.mp3 b/storage/sounds/electric_guitar/80.mp3 similarity index 100% rename from storage/sounds/electric-guitar/80.mp3 rename to storage/sounds/electric_guitar/80.mp3 diff --git a/storage/sounds/electric-guitar/84.mp3 b/storage/sounds/electric_guitar/84.mp3 similarity index 100% rename from storage/sounds/electric-guitar/84.mp3 rename to storage/sounds/electric_guitar/84.mp3