From d9695b0c680ba5cc88f0a200837d215a832c55f1 Mon Sep 17 00:00:00 2001 From: Thibault Deckers Date: Sat, 13 Jul 2019 18:12:19 +0900 Subject: [PATCH] poc: async mediastore thumbnails with fast scroll --- .gitignore | 73 +++ .metadata | 10 + README.md | 16 + android/app/build.gradle | 61 +++ android/app/src/debug/AndroidManifest.xml | 7 + android/app/src/main/AndroidManifest.xml | 30 ++ android/app/src/main/ic_launcher-web.png | Bin 0 -> 40953 bytes .../deckers/thibault/aves/MainActivity.java | 254 +++++++++ .../thibault/aves/model/ImageEntry.java | 177 ++++++ .../provider/MediaStoreImageProvider.java | 112 ++++ .../thibault/aves/utils/Constants.java | 10 + .../deckers/thibault/aves/utils/Utils.java | 24 + .../main/res/drawable/launch_background.xml | 12 + .../res/mipmap-anydpi-v26/ic_launcher.xml | 5 + .../mipmap-anydpi-v26/ic_launcher_round.xml | 5 + .../src/main/res/mipmap-hdpi/ic_launcher.png | Bin 0 -> 1913 bytes .../mipmap-hdpi/ic_launcher_foreground.png | Bin 0 -> 2430 bytes .../res/mipmap-hdpi/ic_launcher_round.png | Bin 0 -> 3859 bytes .../src/main/res/mipmap-mdpi/ic_launcher.png | Bin 0 -> 1255 bytes .../mipmap-mdpi/ic_launcher_foreground.png | Bin 0 -> 1591 bytes .../res/mipmap-mdpi/ic_launcher_round.png | Bin 0 -> 2400 bytes .../src/main/res/mipmap-xhdpi/ic_launcher.png | Bin 0 -> 2585 bytes .../mipmap-xhdpi/ic_launcher_foreground.png | Bin 0 -> 3367 bytes .../res/mipmap-xhdpi/ic_launcher_round.png | Bin 0 -> 5446 bytes .../main/res/mipmap-xxhdpi/ic_launcher.png | Bin 0 -> 4117 bytes .../mipmap-xxhdpi/ic_launcher_foreground.png | Bin 0 -> 5859 bytes .../res/mipmap-xxhdpi/ic_launcher_round.png | Bin 0 -> 8691 bytes .../main/res/mipmap-xxxhdpi/ic_launcher.png | Bin 0 -> 5778 bytes .../mipmap-xxxhdpi/ic_launcher_foreground.png | Bin 0 -> 8617 bytes .../res/mipmap-xxxhdpi/ic_launcher_round.png | Bin 0 -> 12525 bytes .../res/values/ic_launcher_background.xml | 4 + android/app/src/main/res/values/styles.xml | 8 + android/app/src/profile/AndroidManifest.xml | 7 + android/build.gradle | 29 + android/gradle.properties | 1 + .../gradle/wrapper/gradle-wrapper.properties | 6 + android/settings.gradle | 15 + ios/Flutter/AppFrameworkInfo.plist | 26 + ios/Flutter/Debug.xcconfig | 1 + ios/Flutter/Release.xcconfig | 1 + ios/Runner.xcodeproj/project.pbxproj | 506 ++++++++++++++++++ .../contents.xcworkspacedata | 7 + .../xcshareddata/xcschemes/Runner.xcscheme | 93 ++++ .../contents.xcworkspacedata | 7 + ios/Runner/AppDelegate.h | 6 + ios/Runner/AppDelegate.m | 13 + .../AppIcon.appiconset/Contents.json | 122 +++++ .../Icon-App-1024x1024@1x.png | Bin 0 -> 11112 bytes .../AppIcon.appiconset/Icon-App-20x20@1x.png | Bin 0 -> 564 bytes .../AppIcon.appiconset/Icon-App-20x20@2x.png | Bin 0 -> 1283 bytes .../AppIcon.appiconset/Icon-App-20x20@3x.png | Bin 0 -> 1588 bytes .../AppIcon.appiconset/Icon-App-29x29@1x.png | Bin 0 -> 1025 bytes .../AppIcon.appiconset/Icon-App-29x29@2x.png | Bin 0 -> 1716 bytes .../AppIcon.appiconset/Icon-App-29x29@3x.png | Bin 0 -> 1920 bytes .../AppIcon.appiconset/Icon-App-40x40@1x.png | Bin 0 -> 1283 bytes .../AppIcon.appiconset/Icon-App-40x40@2x.png | Bin 0 -> 1895 bytes .../AppIcon.appiconset/Icon-App-40x40@3x.png | Bin 0 -> 2665 bytes .../AppIcon.appiconset/Icon-App-60x60@2x.png | Bin 0 -> 2665 bytes .../AppIcon.appiconset/Icon-App-60x60@3x.png | Bin 0 -> 3831 bytes .../AppIcon.appiconset/Icon-App-76x76@1x.png | Bin 0 -> 1888 bytes .../AppIcon.appiconset/Icon-App-76x76@2x.png | Bin 0 -> 3294 bytes .../Icon-App-83.5x83.5@2x.png | Bin 0 -> 3612 bytes .../LaunchImage.imageset/Contents.json | 23 + .../LaunchImage.imageset/LaunchImage.png | Bin 0 -> 68 bytes .../LaunchImage.imageset/LaunchImage@2x.png | Bin 0 -> 68 bytes .../LaunchImage.imageset/LaunchImage@3x.png | Bin 0 -> 68 bytes .../LaunchImage.imageset/README.md | 5 + ios/Runner/Base.lproj/LaunchScreen.storyboard | 37 ++ ios/Runner/Base.lproj/Main.storyboard | 26 + ios/Runner/Info.plist | 45 ++ ios/Runner/main.m | 9 + lib/image_fullscreen_page.dart | 17 + lib/main.dart | 149 ++++++ lib/thumbnail.dart | 50 ++ pubspec.lock | 153 ++++++ pubspec.yaml | 62 +++ test/widget_test.dart | 30 ++ 77 files changed, 2254 insertions(+) create mode 100644 .gitignore create mode 100644 .metadata create mode 100644 README.md create mode 100644 android/app/build.gradle create mode 100644 android/app/src/debug/AndroidManifest.xml create mode 100644 android/app/src/main/AndroidManifest.xml create mode 100644 android/app/src/main/ic_launcher-web.png create mode 100644 android/app/src/main/java/deckers/thibault/aves/MainActivity.java create mode 100644 android/app/src/main/java/deckers/thibault/aves/model/ImageEntry.java create mode 100644 android/app/src/main/java/deckers/thibault/aves/model/provider/MediaStoreImageProvider.java create mode 100644 android/app/src/main/java/deckers/thibault/aves/utils/Constants.java create mode 100644 android/app/src/main/java/deckers/thibault/aves/utils/Utils.java create mode 100644 android/app/src/main/res/drawable/launch_background.xml create mode 100644 android/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml create mode 100644 android/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml create mode 100644 android/app/src/main/res/mipmap-hdpi/ic_launcher.png create mode 100644 android/app/src/main/res/mipmap-hdpi/ic_launcher_foreground.png create mode 100644 android/app/src/main/res/mipmap-hdpi/ic_launcher_round.png create mode 100644 android/app/src/main/res/mipmap-mdpi/ic_launcher.png create mode 100644 android/app/src/main/res/mipmap-mdpi/ic_launcher_foreground.png create mode 100644 android/app/src/main/res/mipmap-mdpi/ic_launcher_round.png create mode 100644 android/app/src/main/res/mipmap-xhdpi/ic_launcher.png create mode 100644 android/app/src/main/res/mipmap-xhdpi/ic_launcher_foreground.png create mode 100644 android/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png create mode 100644 android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png create mode 100644 android/app/src/main/res/mipmap-xxhdpi/ic_launcher_foreground.png create mode 100644 android/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png create mode 100644 android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png create mode 100644 android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_foreground.png create mode 100644 android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png create mode 100644 android/app/src/main/res/values/ic_launcher_background.xml create mode 100644 android/app/src/main/res/values/styles.xml create mode 100644 android/app/src/profile/AndroidManifest.xml create mode 100644 android/build.gradle create mode 100644 android/gradle.properties create mode 100644 android/gradle/wrapper/gradle-wrapper.properties create mode 100644 android/settings.gradle create mode 100644 ios/Flutter/AppFrameworkInfo.plist create mode 100644 ios/Flutter/Debug.xcconfig create mode 100644 ios/Flutter/Release.xcconfig create mode 100644 ios/Runner.xcodeproj/project.pbxproj create mode 100644 ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata create mode 100644 ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme create mode 100644 ios/Runner.xcworkspace/contents.xcworkspacedata create mode 100644 ios/Runner/AppDelegate.h create mode 100644 ios/Runner/AppDelegate.m create mode 100644 ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json create mode 100644 ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png create mode 100644 ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png create mode 100644 ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png create mode 100644 ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png create mode 100644 ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png create mode 100644 ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png create mode 100644 ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png create mode 100644 ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png create mode 100644 ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png create mode 100644 ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png create mode 100644 ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png create mode 100644 ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png create mode 100644 ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png create mode 100644 ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png create mode 100644 ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png create mode 100644 ios/Runner/Assets.xcassets/LaunchImage.imageset/Contents.json create mode 100644 ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png create mode 100644 ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png create mode 100644 ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png create mode 100644 ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md create mode 100644 ios/Runner/Base.lproj/LaunchScreen.storyboard create mode 100644 ios/Runner/Base.lproj/Main.storyboard create mode 100644 ios/Runner/Info.plist create mode 100644 ios/Runner/main.m create mode 100644 lib/image_fullscreen_page.dart create mode 100644 lib/main.dart create mode 100644 lib/thumbnail.dart create mode 100644 pubspec.lock create mode 100644 pubspec.yaml create mode 100644 test/widget_test.dart diff --git a/.gitignore b/.gitignore new file mode 100644 index 000000000..d04e98a56 --- /dev/null +++ b/.gitignore @@ -0,0 +1,73 @@ +# Miscellaneous +*.class +*.log +*.pyc +*.swp +.DS_Store +.atom/ +.buildlog/ +.history +.svn/ + +# IntelliJ related +*.iml +*.ipr +*.iws +.idea/ + +# The .vscode folder contains launch configuration and tasks you configure in +# VS Code which you may wish to be included in version control, so this line +# is commented out by default. +#.vscode/ + +# Flutter/Dart/Pub related +**/doc/api/ +.dart_tool/ +.flutter-plugins +.packages +.pub-cache/ +.pub/ +/build/ + +# Android related +**/android/**/gradle-wrapper.jar +**/android/.gradle +**/android/captures/ +**/android/gradlew +**/android/gradlew.bat +**/android/local.properties +**/android/**/GeneratedPluginRegistrant.java +.gradle + +# iOS/XCode related +**/ios/**/*.mode1v3 +**/ios/**/*.mode2v3 +**/ios/**/*.moved-aside +**/ios/**/*.pbxuser +**/ios/**/*.perspectivev3 +**/ios/**/*sync/ +**/ios/**/.sconsign.dblite +**/ios/**/.tags* +**/ios/**/.vagrant/ +**/ios/**/DerivedData/ +**/ios/**/Icon? +**/ios/**/Pods/ +**/ios/**/.symlinks/ +**/ios/**/profile +**/ios/**/xcuserdata +**/ios/.generated/ +**/ios/Flutter/App.framework +**/ios/Flutter/Flutter.framework +**/ios/Flutter/Generated.xcconfig +**/ios/Flutter/app.flx +**/ios/Flutter/app.zip +**/ios/Flutter/flutter_assets/ +**/ios/ServiceDefinitions.json +**/ios/Runner/GeneratedPluginRegistrant.* + +# Exceptions to above rules. +!**/ios/**/default.mode1v3 +!**/ios/**/default.mode2v3 +!**/ios/**/default.pbxuser +!**/ios/**/default.perspectivev3 +!/packages/flutter_tools/test/data/dart_dependencies_test/**/.packages diff --git a/.metadata b/.metadata new file mode 100644 index 000000000..fdef59c1a --- /dev/null +++ b/.metadata @@ -0,0 +1,10 @@ +# This file tracks properties of this Flutter project. +# Used by Flutter tool to assess capabilities and perform upgrades etc. +# +# This file should be version controlled and should not be manually edited. + +version: + revision: bc7bc940836f1f834699625426795fd6f07c18ec + channel: beta + +project_type: app diff --git a/README.md b/README.md new file mode 100644 index 000000000..9f65dd487 --- /dev/null +++ b/README.md @@ -0,0 +1,16 @@ +# aves + +A new Flutter application. + +## Getting Started + +This project is a starting point for a Flutter application. + +A few resources to get you started if this is your first Flutter project: + +- [Lab: Write your first Flutter app](https://flutter.dev/docs/get-started/codelab) +- [Cookbook: Useful Flutter samples](https://flutter.dev/docs/cookbook) + +For help getting started with Flutter, view our +[online documentation](https://flutter.dev/docs), which offers tutorials, +samples, guidance on mobile development, and a full API reference. diff --git a/android/app/build.gradle b/android/app/build.gradle new file mode 100644 index 000000000..729249538 --- /dev/null +++ b/android/app/build.gradle @@ -0,0 +1,61 @@ +def localProperties = new Properties() +def localPropertiesFile = rootProject.file('local.properties') +if (localPropertiesFile.exists()) { + localPropertiesFile.withReader('UTF-8') { reader -> + localProperties.load(reader) + } +} + +def flutterRoot = localProperties.getProperty('flutter.sdk') +if (flutterRoot == null) { + throw new GradleException("Flutter SDK not found. Define location with flutter.sdk in the local.properties file.") +} + +def flutterVersionCode = localProperties.getProperty('flutter.versionCode') +if (flutterVersionCode == null) { + flutterVersionCode = '1' +} + +def flutterVersionName = localProperties.getProperty('flutter.versionName') +if (flutterVersionName == null) { + flutterVersionName = '1.0' +} + +apply plugin: 'com.android.application' +apply from: "$flutterRoot/packages/flutter_tools/gradle/flutter.gradle" + +android { + compileSdkVersion 28 // latest (or latest-1 if the sources of latest SDK are unavailable) + + lintOptions { + disable 'InvalidPackage' + } + + defaultConfig { + applicationId "deckers.thibault.aves" + minSdkVersion 24 + targetSdkVersion 28 // same as compileSdkVersion + versionCode flutterVersionCode.toInteger() + versionName flutterVersionName + testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" + } + + buildTypes { + release { + // TODO: Add your own signing config for the release build. + // Signing with the debug keys for now, so `flutter run --release` works. + signingConfig signingConfigs.debug + } + } +} + +flutter { + source '../..' +} + +dependencies { + implementation 'com.karumi:dexter:5.0.0' + testImplementation 'junit:junit:4.12' + androidTestImplementation 'com.android.support.test:runner:1.0.2' + androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2' +} diff --git a/android/app/src/debug/AndroidManifest.xml b/android/app/src/debug/AndroidManifest.xml new file mode 100644 index 000000000..ebcc4799f --- /dev/null +++ b/android/app/src/debug/AndroidManifest.xml @@ -0,0 +1,7 @@ + + + + diff --git a/android/app/src/main/AndroidManifest.xml b/android/app/src/main/AndroidManifest.xml new file mode 100644 index 000000000..f7d2c4aed --- /dev/null +++ b/android/app/src/main/AndroidManifest.xml @@ -0,0 +1,30 @@ + + + + + + + + + + + + + + + diff --git a/android/app/src/main/ic_launcher-web.png b/android/app/src/main/ic_launcher-web.png new file mode 100644 index 0000000000000000000000000000000000000000..22e2ad32f8271e582503bf8e00df1172e0aa9502 GIT binary patch literal 40953 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 Mot2|y5yg}7e>E@i7ytkO literal 0 HcmV?d00001 diff --git a/android/app/src/main/java/deckers/thibault/aves/MainActivity.java b/android/app/src/main/java/deckers/thibault/aves/MainActivity.java new file mode 100644 index 000000000..5e18d389d --- /dev/null +++ b/android/app/src/main/java/deckers/thibault/aves/MainActivity.java @@ -0,0 +1,254 @@ +package deckers.thibault.aves; + +import android.Manifest; +import android.app.Activity; +import android.app.AlertDialog; +import android.content.ContentResolver; +import android.content.DialogInterface; +import android.content.Intent; +import android.database.Cursor; +import android.graphics.Bitmap; +import android.graphics.BitmapFactory; +import android.net.Uri; +import android.os.AsyncTask; +import android.os.Build; +import android.os.Bundle; +import android.provider.MediaStore; +import android.provider.Settings; +import android.util.Log; +import android.util.Size; +import android.util.SparseArray; + +import com.karumi.dexter.Dexter; +import com.karumi.dexter.PermissionToken; +import com.karumi.dexter.listener.PermissionDeniedResponse; +import com.karumi.dexter.listener.PermissionGrantedResponse; +import com.karumi.dexter.listener.PermissionRequest; +import com.karumi.dexter.listener.single.PermissionListener; + +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.io.OutputStream; +import java.nio.ByteBuffer; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.function.BiConsumer; +import java.util.function.Consumer; +import java.util.function.Function; +import java.util.stream.Collectors; + +import deckers.thibault.aves.model.ImageEntry; +import deckers.thibault.aves.model.provider.MediaStoreImageProvider; +import deckers.thibault.aves.utils.Utils; +import io.flutter.app.FlutterActivity; +import io.flutter.plugins.GeneratedPluginRegistrant; +import io.flutter.plugin.common.MethodChannel; +import io.flutter.plugin.common.MethodChannel.Result; + +class ThumbnailFetcher { + private ContentResolver contentResolver; + private SparseArray taskMap = new SparseArray<>(); + + ThumbnailFetcher(ContentResolver contentResolver) { + this.contentResolver = contentResolver; + } + + void fetch (Integer id, Result result) { + AsyncTask task = new BitmapWorkerTask(contentResolver).execute(new BitmapWorkerTask.MyTaskParams(id, result, this::complete)); + taskMap.append(id, task); + } + + void cancel(Integer id) { + AsyncTask task = taskMap.get(id, null); + if (task != null) task.cancel(true); + taskMap.remove(id); + } + + void complete(Integer id) { + taskMap.remove(id); + } +} + +public class MainActivity extends FlutterActivity { + private static final String CHANNEL = "deckers.thibault.aves/mediastore"; + + private ThumbnailFetcher thumbnailFetcher; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + GeneratedPluginRegistrant.registerWith(this); + + thumbnailFetcher = new ThumbnailFetcher(getContentResolver()); + new MethodChannel(getFlutterView(), CHANNEL).setMethodCallHandler( + (call, result) -> { + switch (call.method) { + case "getImages": + getPermissionResult(result, this); + break; + case "getThumbnail": { + Integer id = call.argument("id"); + thumbnailFetcher.fetch(id, result); + break; + } + case "cancelGetThumbnail": { + Integer id = call.argument("id"); + thumbnailFetcher.cancel(id); + result.success(null); + break; + } + default: + result.notImplemented(); + break; + } + }); + } + +// public void getImageThumbnail(final Result result, String uri, int width, int height) { +// // https://developer.android.com/reference/android/content/ContentResolver.html#loadThumbnail(android.net.Uri,%20android.util.Size,%20android.os.CancellationSignal) +// try { +// if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) { +// Bitmap bmp = getContentResolver().loadThumbnail(Uri.parse(uri), new Size(width, height), null); +// result.success(bmp); +// } else { +// // TODO get by mediastore +// getContentResolver(). +// } +// } catch (IOException e) { +// e.printStackTrace(); +// } +// } + + public void getPermissionResult(final Result result, final Activity activity) { + Dexter.withActivity(activity) + .withPermission(Manifest.permission.WRITE_EXTERNAL_STORAGE) + .withListener(new PermissionListener() { + @Override + public void onPermissionGranted(PermissionGrantedResponse response) { + result.success(fetchAll(activity)); + } + + @Override + public void onPermissionDenied(PermissionDeniedResponse response) { + + AlertDialog.Builder builder = new AlertDialog.Builder(activity); + builder.setMessage("This permission is needed for use this features of the app so please, allow it!"); + builder.setTitle("We need this permission"); + builder.setCancelable(false); + builder.setPositiveButton("OK", new DialogInterface.OnClickListener() { + public void onClick(DialogInterface dialog, int id) { + dialog.cancel(); + Intent intent = new Intent(); + intent.setAction(Settings.ACTION_APPLICATION_DETAILS_SETTINGS); + Uri uri = Uri.fromParts("package", activity.getPackageName(), null); + intent.setData(uri); + activity.startActivity(intent); + + } + }); + builder.setNegativeButton("Cancel", new DialogInterface.OnClickListener() { + public void onClick(DialogInterface dialog, int id) { + dialog.cancel(); + } + }); + AlertDialog alert = builder.create(); + alert.show(); + + + } + + @Override + public void onPermissionRationaleShouldBeShown(PermissionRequest permission, final PermissionToken token) { + + AlertDialog.Builder builder = new AlertDialog.Builder(activity); + builder.setMessage("This permission is needed for use this features of the app so please, allow it!"); + builder.setTitle("We need this permission"); + builder.setCancelable(false); + builder.setPositiveButton("OK", new DialogInterface.OnClickListener() { + public void onClick(DialogInterface dialog, int id) { + dialog.cancel(); + token.continuePermissionRequest(); + + } + }); + builder.setNegativeButton("Cancel", new DialogInterface.OnClickListener() { + public void onClick(DialogInterface dialog, int id) { + dialog.cancel(); + token.cancelPermissionRequest(); + } + }); + AlertDialog alert = builder.create(); + alert.show(); + } + }).check(); + } + + public List fetchAll(Activity activity) { + return new MediaStoreImageProvider().fetchAll(activity).stream() + .map(ImageEntry::toMap) + .collect(Collectors.toList()); + } +} + +class BitmapWorkerTask extends AsyncTask { + private static final String LOG_TAG = Utils.createLogTag(BitmapWorkerTask.class); + + static class MyTaskParams { + Integer id; + Result result; + Consumer complete; + + MyTaskParams(Integer id, Result result, Consumer complete) { + this.id = id; + this.result = result; + this.complete = complete; + } + } + + static class MyTaskResult { + MyTaskParams params; + byte[] data; + + MyTaskResult(MyTaskParams params, byte[] data) { + this.params = params; + this.data = data; + } + } + + private ContentResolver cr; + + BitmapWorkerTask(ContentResolver cr) { + this.cr = cr; + } + + @Override + protected MyTaskResult doInBackground(MyTaskParams... params) { + MyTaskParams p = params[0]; + byte[] data = null; + if (!this.isCancelled()) { + Log.d(LOG_TAG, "getThumbnail with id=" + p.id + "(called)"); + Bitmap bmp = MediaStore.Images.Thumbnails.getThumbnail(cr, p.id, MediaStore.Images.Thumbnails.MINI_KIND, null); + if (bmp != null) { + ByteArrayOutputStream stream = new ByteArrayOutputStream(); + bmp.compress(Bitmap.CompressFormat.JPEG, 90, stream); + data = stream.toByteArray(); + } + } else { + Log.d(LOG_TAG, "getThumbnail with id=" + p.id + "(cancelled)"); + } + return new MyTaskResult(p, data); + } + + @Override + protected void onPostExecute(MyTaskResult result) { + MethodChannel.Result r = result.params.result; + result.params.complete.accept(result.params.id); + if (result.data != null) { + r.success(result.data); + } else { + r.error("getthumbnail-null", "failed to get thumbnail for id=" + result.params.id, null); + } + } +} \ No newline at end of file diff --git a/android/app/src/main/java/deckers/thibault/aves/model/ImageEntry.java b/android/app/src/main/java/deckers/thibault/aves/model/ImageEntry.java new file mode 100644 index 000000000..4ee02e4a0 --- /dev/null +++ b/android/app/src/main/java/deckers/thibault/aves/model/ImageEntry.java @@ -0,0 +1,177 @@ +package deckers.thibault.aves.model; + +import android.content.ContentUris; +import android.content.Context; +import android.net.Uri; +import android.provider.MediaStore; +import android.support.annotation.NonNull; +import android.support.annotation.Nullable; +import android.text.format.DateUtils; + +import java.io.File; +import java.io.FileInputStream; +import java.io.FileNotFoundException; +import java.io.InputStream; +import java.util.HashMap; +import java.util.Map; + +import deckers.thibault.aves.utils.Constants; + +public class ImageEntry { + private static final Uri mediaStoreContentUri = MediaStore.Files.getContentUri("external"); + + // from source + private String path; // best effort to get local path from content providers + private long contentId; // should be defined for mediastore, use full URI otherwise + private Uri uri; // should be defined for external content, use ID for mediastore + private String mimeType; + private int width, height, orientationDegrees; + private long sizeBytes; + private String title, bucketDisplayName; + private long dateModifiedSecs, sourceDateTakenMillis; + private long durationMillis; + // derived + private boolean isVideo; + + public ImageEntry(Uri uri, String mimeType) { + this.contentId = -1; + this.uri = uri; + this.mimeType = mimeType; + init(); + } + + public ImageEntry(String path, long id, String mimeType, int width, int height, int orientationDegrees, long sizeBytes, + String title, long dateModifiedSecs, long dateTakenMillis, String bucketDisplayName, long durationMillis) { + this.path = path; + this.contentId = id; + this.uri = null; + this.mimeType = mimeType; + this.width = width; + this.height = height; + this.orientationDegrees = orientationDegrees; + this.sizeBytes = sizeBytes; + this.title = title; + this.dateModifiedSecs = dateModifiedSecs; + this.sourceDateTakenMillis = dateTakenMillis; + this.bucketDisplayName = bucketDisplayName; + this.durationMillis = durationMillis; + init(); + } + + public static Map toMap(ImageEntry entry) { + return new HashMap() {{ + put("path", entry.path); + put("contentId", entry.contentId); + put("uri", entry.uri); + put("mimeType", entry.mimeType); + put("width", entry.width); + put("height", entry.height); + put("orientationDegrees", entry.orientationDegrees); + put("sizeBytes", entry.sizeBytes); + put("title", entry.title); + put("dateModifiedSecs", entry.dateModifiedSecs); + put("sourceDateTakenMillis", entry.sourceDateTakenMillis); + put("bucketDisplayName", entry.bucketDisplayName); + put("durationMillis", entry.durationMillis); + }}; + } + + private void init() { + isVideo = mimeType.startsWith(Constants.MIME_VIDEO); + } + + @Nullable + public String getPath() { + return path; + } + + public String getFilename() { + return path == null ? null : new File(path).getName(); + } + + public InputStream getInputStream(Context context) throws FileNotFoundException { + // FileInputStream is faster than input stream from ContentResolver + return path != null ? new FileInputStream(path) : context.getContentResolver().openInputStream(getUri()); + } + + public Uri getUri() { + if (uri != null) { + return uri; + } + return ContentUris.withAppendedId(mediaStoreContentUri, contentId); + } + + public boolean isVideo() { + return isVideo; + } + + public boolean isEditable() { + return path != null; + } + + public boolean isGif() { + return Constants.MIME_GIF.equals(mimeType); + } + + public String getMimeType() { + return mimeType; + } + + public int getWidth() { + return width; + } + + public int getHeight() { + return height; + } + + public int getOrientationDegrees() { + return orientationDegrees; + } + + public long getSizeBytes() { + return sizeBytes; + } + + public String getTitle() { + return title; + } + + public long getDateModifiedSecs() { + return dateModifiedSecs; + } + + String getBucketDisplayName() { + return bucketDisplayName; + } + + public String getDuration() { + return DateUtils.formatElapsedTime(durationMillis / 1000); + } + + public int getMegaPixels() { + return Math.round((width * height) / 1000000f); + } + + // setters + + public void setContentId(long contentId) { + this.contentId = contentId; + } + + public void setPath(String path) { + this.path = path; + } + + public void setSizeBytes(long sizeBytes) { + this.sizeBytes = sizeBytes; + } + + public void setDateModifiedSecs(long dateModifiedSecs) { + this.dateModifiedSecs = dateModifiedSecs; + } + + public void setTitle(String title) { + this.title = title; + } +} diff --git a/android/app/src/main/java/deckers/thibault/aves/model/provider/MediaStoreImageProvider.java b/android/app/src/main/java/deckers/thibault/aves/model/provider/MediaStoreImageProvider.java new file mode 100644 index 000000000..14511a055 --- /dev/null +++ b/android/app/src/main/java/deckers/thibault/aves/model/provider/MediaStoreImageProvider.java @@ -0,0 +1,112 @@ +package deckers.thibault.aves.model.provider; + +import android.app.Activity; +import android.database.Cursor; +import android.net.Uri; +import android.provider.MediaStore; +import android.util.Log; + +import java.util.ArrayList; +import java.util.List; + +import deckers.thibault.aves.model.ImageEntry; +import deckers.thibault.aves.utils.Utils; + +public class MediaStoreImageProvider { + private static final String LOG_TAG = Utils.createLogTag(MediaStoreImageProvider.class); + + private Uri FILES_URI = MediaStore.Files.getContentUri("external"); + + private static final String[] PROJECTION = { + // image & video + MediaStore.MediaColumns._ID, + MediaStore.MediaColumns.DATA, + MediaStore.MediaColumns.MIME_TYPE, + MediaStore.MediaColumns.SIZE, + MediaStore.MediaColumns.TITLE, + MediaStore.MediaColumns.WIDTH, + MediaStore.MediaColumns.HEIGHT, + MediaStore.Images.Media.ORIENTATION, + MediaStore.MediaColumns.DATE_MODIFIED, + MediaStore.Images.Media.DATE_TAKEN, + MediaStore.Images.Media.BUCKET_DISPLAY_NAME, + // video only + MediaStore.Video.Media.DURATION, + }; + + private static final String SELECTION = MediaStore.Files.FileColumns.MEDIA_TYPE + "=" + MediaStore.Files.FileColumns.MEDIA_TYPE_IMAGE + + " OR " + MediaStore.Files.FileColumns.MEDIA_TYPE + "=" + MediaStore.Files.FileColumns.MEDIA_TYPE_VIDEO; + + + public List fetchAll(Activity activity) { + return fetch(activity, FILES_URI, null); + } + + public List fetch(final Activity activity, final Uri uri, String mimeType) { + ArrayList entries = new ArrayList<>(); + + // URI should refer to the "files" table, not to the "images" or "videos" one, + // as our projection includes a mix of columns from both + Uri filesUri = uri; + if (!FILES_URI.equals(uri)) { + String id = uri.getLastPathSegment(); + filesUri = Uri.withAppendedPath(FILES_URI, id); + } + + try { + Cursor cursor = activity.getContentResolver().query(filesUri, PROJECTION, SELECTION, null, null); + if (cursor != null) { + Log.d(LOG_TAG, "fetch query returned " + cursor.getCount() + " entries"); + + int idColumn = cursor.getColumnIndexOrThrow(MediaStore.MediaColumns._ID); + int pathColumn = cursor.getColumnIndexOrThrow(MediaStore.MediaColumns.DATA); + int mimeTypeColumn = cursor.getColumnIndexOrThrow(MediaStore.MediaColumns.MIME_TYPE); + int sizeColumn = cursor.getColumnIndexOrThrow(MediaStore.MediaColumns.SIZE); + int titleColumn = cursor.getColumnIndexOrThrow(MediaStore.MediaColumns.TITLE); + int widthColumn = cursor.getColumnIndexOrThrow(MediaStore.MediaColumns.WIDTH); + int heightColumn = cursor.getColumnIndexOrThrow(MediaStore.MediaColumns.HEIGHT); + int orientationColumn = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.ORIENTATION); + int dateModifiedColumn = cursor.getColumnIndexOrThrow(MediaStore.MediaColumns.DATE_MODIFIED); + int dateTakenColumn = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATE_TAKEN); + int bucketDisplayNameColumn = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.BUCKET_DISPLAY_NAME); + int durationColumn = cursor.getColumnIndexOrThrow(MediaStore.Video.Media.DURATION); + + while (cursor.moveToNext()) { + ImageEntry imageEntry = new ImageEntry( + cursor.getString(pathColumn), + cursor.getLong(idColumn), + cursor.getString(mimeTypeColumn), + cursor.getInt(widthColumn), + cursor.getInt(heightColumn), + cursor.getInt(orientationColumn), + cursor.getLong(sizeColumn), + cursor.getString(titleColumn), + cursor.getLong(dateModifiedColumn), + cursor.getLong(dateTakenColumn), + cursor.getString(bucketDisplayNameColumn), + cursor.getLong(durationColumn) + ); + if (imageEntry.getWidth() > 0) { + entries.add(imageEntry); +// } else { +// // some images are incorrectly registered in the MediaStore, +// // they are valid but miss some attributes, such as width, height, orientation +// try { +// imageEntry.fixMissingWidthHeightOrientation(activity); +// entries.add(imageEntry); +// } catch (IOException e) { +// // this is probably not a real image, like "/storage/emulated/0", so we skip it +// Log.w(LOG_TAG, "failed to compute dimensions of imageEntry=" + imageEntry); +// } + } + } + cursor.close(); + } + } catch (Exception e) { + Log.d(LOG_TAG, "failed to get entries", e); + } + + Log.d(LOG_TAG, "fetch completed with " + entries.size() + " entries"); + return entries; + } +} diff --git a/android/app/src/main/java/deckers/thibault/aves/utils/Constants.java b/android/app/src/main/java/deckers/thibault/aves/utils/Constants.java new file mode 100644 index 000000000..210809660 --- /dev/null +++ b/android/app/src/main/java/deckers/thibault/aves/utils/Constants.java @@ -0,0 +1,10 @@ +package deckers.thibault.aves.utils; + +public class Constants { + // mime types + + public static final String MIME_VIDEO = "video"; + public static final String MIME_JPEG = "image/jpeg"; + public static final String MIME_PNG = "image/png"; + public static final String MIME_GIF = "image/gif"; +} diff --git a/android/app/src/main/java/deckers/thibault/aves/utils/Utils.java b/android/app/src/main/java/deckers/thibault/aves/utils/Utils.java new file mode 100644 index 000000000..84337c806 --- /dev/null +++ b/android/app/src/main/java/deckers/thibault/aves/utils/Utils.java @@ -0,0 +1,24 @@ +package deckers.thibault.aves.utils; + +import java.util.regex.Pattern; + +public class Utils { + private static final int logTagMaxLength = 23; + private static final Pattern logTagPackagePattern = Pattern.compile("(\\w)(\\w*)\\."); + + public static String createLogTag(Class clazz) { + // shorten class name to "a.b.CccDdd" + String logTag = logTagPackagePattern.matcher(clazz.getName()).replaceAll("$1."); + if (logTag.length() > logTagMaxLength) { + // shorten class name to "a.b.CD" + String simpleName = clazz.getSimpleName(); + String shortSimpleName = simpleName.replaceAll("[a-z]", ""); + logTag = logTag.replace(simpleName, shortSimpleName); + if (logTag.length() > logTagMaxLength) { + // shorten class name to "CD" + logTag = shortSimpleName; + } + } + return logTag; + } +} \ No newline at end of file diff --git a/android/app/src/main/res/drawable/launch_background.xml b/android/app/src/main/res/drawable/launch_background.xml new file mode 100644 index 000000000..304732f88 --- /dev/null +++ b/android/app/src/main/res/drawable/launch_background.xml @@ -0,0 +1,12 @@ + + + + + + + + diff --git a/android/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml b/android/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml new file mode 100644 index 000000000..036d09bc5 --- /dev/null +++ b/android/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/android/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml b/android/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml new file mode 100644 index 000000000..036d09bc5 --- /dev/null +++ b/android/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/android/app/src/main/res/mipmap-hdpi/ic_launcher.png b/android/app/src/main/res/mipmap-hdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..9aa85d09e2523413f381784969d00303d9d7fe97 GIT binary patch literal 1913 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 VRM0D~$AbU>002ovPDHLkV1hf4eA55` literal 0 HcmV?d00001 diff --git a/android/app/src/main/res/mipmap-mdpi/ic_launcher.png b/android/app/src/main/res/mipmap-mdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..e4de406f34a261c6f3215b7d2b6af77748ca953a GIT binary patch literal 1255 zcmVEp4F%Hch%&w{{Eyl(zSl(w5$b!_VKjrCJ7*TUdLq2`BmH-1PS3 zd_U*>&ci)t!-n;w;sgLisA7dxv>M}gQ>myS<@?F}BR-d*oA@0>Mju6hDOw0~4s(LJ zBATz8qm7Baf)R}!rqSx!UWO`i^z-qNVivWxo z0a{yIx5@=jWe+qrH*Z@9_}>B~IRS?L2!h!@4i@J)*!m}+&ou!K_ar!n0x&Qf0Qco7 z7{vb!{~3fUo)CoDS@~wgB<3Ozp34saK1s%3exnDT-_s#WZymMBgh1ooqd>SY5dA42 zb)WQOPsD(*eL$SsG5{V%0H*NkfPmrDe&J?L5FdUzkQx)L z4TxiN3c&J+G5`{UAcDTjpF=oxN)VxNBGnW2rxBnG0a)c$VhVB2;FCYFDMaG{M5b{X zW$hSFTa*PzL$r1JpsKnnr*MkJc_7p7)S965UMSTQe%QX>Ab((==!e;)pq|Yf&*un% z`sg!PswdO{kQ9=*`Qt&?;e!`*=!yC-24N<~DGzWta0S}`?f?#VuxIqwW%oqgi2;bt zr~tq|<^aw417Nt(B|$Ww^+M$e1N;4kehAWORSh9z8?(dCwpU?)`|EJge+gzWoPIoW zZRyzwL+8B)Cos!wyA=Vjj@l%EG=y=)1c_M=e)#3;0*Dv(bxK={Y~Kuu0QBCn{0l%u z!^w=l#S!9k%T=h<7$oy_4PaLI;86s?e5-c>09Ez*gJ2o8N)X@w?1AH-yMc`))%j6x z95F8fpn44Dh-dn#ePXYKqPX`N8@vC1X?Vt`jrU%O92G#OR@xe%Q? z7n4+q=duAvmj*hW?s1;yL$uIpFF3k<-K1$)OX6Joj$Ck{ zH((eh+}PN-iF!1dOvTx*nC|y_y}u#^Ee8}N*EE#~LQ+h^T2s1ij^n`XcDJFo5;=Ed zMHLklTU{>KZ^2-YVOe$>=_52Rq|$YULLtWCaI}|~m(%bml6zBGf_kc|s%m>}ZSAg_ zni@q!>#oE^y{y>!w?k+&ntSoF6tz)dl~OOOx_GC91!M0XCAI8;T~8`W{{XJhQgpAB RwXFaE002ovPDHLkV1lvTOE>@k literal 0 HcmV?d00001 diff --git a/android/app/src/main/res/mipmap-mdpi/ic_launcher_foreground.png b/android/app/src/main/res/mipmap-mdpi/ic_launcher_foreground.png new file mode 100644 index 0000000000000000000000000000000000000000..780a95fe5acc43f9297839117a3384254ddf56e4 GIT binary patch literal 1591 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 literal 0 HcmV?d00001 diff --git a/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png b/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..beb423d68b4e1b32ac061ff136ca1c515328bd6d GIT binary patch literal 4117 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 literal 0 HcmV?d00001 diff --git a/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png b/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png new file mode 100644 index 0000000000000000000000000000000000000000..1bf20be256d9c59a831ea48ddd9a9ab00da86bd8 GIT binary patch literal 12525 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 z

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 + + #FFFFFF + \ No newline at end of file diff --git a/android/app/src/main/res/values/styles.xml b/android/app/src/main/res/values/styles.xml new file mode 100644 index 000000000..00fa4417c --- /dev/null +++ b/android/app/src/main/res/values/styles.xml @@ -0,0 +1,8 @@ + + + + diff --git a/android/app/src/profile/AndroidManifest.xml b/android/app/src/profile/AndroidManifest.xml new file mode 100644 index 000000000..ebcc4799f --- /dev/null +++ b/android/app/src/profile/AndroidManifest.xml @@ -0,0 +1,7 @@ + + + + diff --git a/android/build.gradle b/android/build.gradle new file mode 100644 index 000000000..1b3361691 --- /dev/null +++ b/android/build.gradle @@ -0,0 +1,29 @@ +buildscript { + repositories { + google() + jcenter() + } + + dependencies { + classpath 'com.android.tools.build:gradle:3.4.1' + } +} + +allprojects { + repositories { + google() + jcenter() + } +} + +rootProject.buildDir = '../build' +subprojects { + project.buildDir = "${rootProject.buildDir}/${project.name}" +} +subprojects { + project.evaluationDependsOn(':app') +} + +task clean(type: Delete) { + delete rootProject.buildDir +} diff --git a/android/gradle.properties b/android/gradle.properties new file mode 100644 index 000000000..8bd86f680 --- /dev/null +++ b/android/gradle.properties @@ -0,0 +1 @@ +org.gradle.jvmargs=-Xmx1536M diff --git a/android/gradle/wrapper/gradle-wrapper.properties b/android/gradle/wrapper/gradle-wrapper.properties new file mode 100644 index 000000000..01ad6880f --- /dev/null +++ b/android/gradle/wrapper/gradle-wrapper.properties @@ -0,0 +1,6 @@ +#Sun Jun 30 23:38:35 KST 2019 +distributionBase=GRADLE_USER_HOME +distributionPath=wrapper/dists +zipStoreBase=GRADLE_USER_HOME +zipStorePath=wrapper/dists +distributionUrl=https\://services.gradle.org/distributions/gradle-5.1.1-all.zip diff --git a/android/settings.gradle b/android/settings.gradle new file mode 100644 index 000000000..5a2f14fb1 --- /dev/null +++ b/android/settings.gradle @@ -0,0 +1,15 @@ +include ':app' + +def flutterProjectRoot = rootProject.projectDir.parentFile.toPath() + +def plugins = new Properties() +def pluginsFile = new File(flutterProjectRoot.toFile(), '.flutter-plugins') +if (pluginsFile.exists()) { + pluginsFile.withReader('UTF-8') { reader -> plugins.load(reader) } +} + +plugins.each { name, path -> + def pluginDirectory = flutterProjectRoot.resolve(path).resolve('android').toFile() + include ":$name" + project(":$name").projectDir = pluginDirectory +} diff --git a/ios/Flutter/AppFrameworkInfo.plist b/ios/Flutter/AppFrameworkInfo.plist new file mode 100644 index 000000000..9367d483e --- /dev/null +++ b/ios/Flutter/AppFrameworkInfo.plist @@ -0,0 +1,26 @@ + + + + + CFBundleDevelopmentRegion + en + CFBundleExecutable + App + CFBundleIdentifier + io.flutter.flutter.app + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + App + CFBundlePackageType + FMWK + CFBundleShortVersionString + 1.0 + CFBundleSignature + ???? + CFBundleVersion + 1.0 + MinimumOSVersion + 8.0 + + diff --git a/ios/Flutter/Debug.xcconfig b/ios/Flutter/Debug.xcconfig new file mode 100644 index 000000000..592ceee85 --- /dev/null +++ b/ios/Flutter/Debug.xcconfig @@ -0,0 +1 @@ +#include "Generated.xcconfig" diff --git a/ios/Flutter/Release.xcconfig b/ios/Flutter/Release.xcconfig new file mode 100644 index 000000000..592ceee85 --- /dev/null +++ b/ios/Flutter/Release.xcconfig @@ -0,0 +1 @@ +#include "Generated.xcconfig" diff --git a/ios/Runner.xcodeproj/project.pbxproj b/ios/Runner.xcodeproj/project.pbxproj new file mode 100644 index 000000000..c1479f0d6 --- /dev/null +++ b/ios/Runner.xcodeproj/project.pbxproj @@ -0,0 +1,506 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 46; + objects = { + +/* Begin PBXBuildFile section */ + 1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */ = {isa = PBXBuildFile; fileRef = 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */; }; + 3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */ = {isa = PBXBuildFile; fileRef = 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */; }; + 3B80C3941E831B6300D905FE /* App.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 3B80C3931E831B6300D905FE /* App.framework */; }; + 3B80C3951E831B6300D905FE /* App.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 3B80C3931E831B6300D905FE /* App.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; + 9705A1C61CF904A100538489 /* Flutter.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 9740EEBA1CF902C7004384FC /* Flutter.framework */; }; + 9705A1C71CF904A300538489 /* Flutter.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 9740EEBA1CF902C7004384FC /* Flutter.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; + 9740EEB41CF90195004384FC /* Debug.xcconfig in Resources */ = {isa = PBXBuildFile; fileRef = 9740EEB21CF90195004384FC /* Debug.xcconfig */; }; + 978B8F6F1D3862AE00F588F7 /* AppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 7AFFD8EE1D35381100E5BB4D /* AppDelegate.m */; }; + 97C146F31CF9000F007C117D /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 97C146F21CF9000F007C117D /* main.m */; }; + 97C146FC1CF9000F007C117D /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FA1CF9000F007C117D /* Main.storyboard */; }; + 97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FD1CF9000F007C117D /* Assets.xcassets */; }; + 97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */; }; +/* End PBXBuildFile section */ + +/* Begin PBXCopyFilesBuildPhase section */ + 9705A1C41CF9048500538489 /* Embed Frameworks */ = { + isa = PBXCopyFilesBuildPhase; + buildActionMask = 2147483647; + dstPath = ""; + dstSubfolderSpec = 10; + files = ( + 3B80C3951E831B6300D905FE /* App.framework in Embed Frameworks */, + 9705A1C71CF904A300538489 /* Flutter.framework in Embed Frameworks */, + ); + name = "Embed Frameworks"; + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXCopyFilesBuildPhase section */ + +/* Begin PBXFileReference section */ + 1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = GeneratedPluginRegistrant.h; sourceTree = ""; }; + 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GeneratedPluginRegistrant.m; sourceTree = ""; }; + 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = AppFrameworkInfo.plist; path = Flutter/AppFrameworkInfo.plist; sourceTree = ""; }; + 3B80C3931E831B6300D905FE /* App.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = App.framework; path = Flutter/App.framework; sourceTree = ""; }; + 7AFA3C8E1D35360C0083082E /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = Release.xcconfig; path = Flutter/Release.xcconfig; sourceTree = ""; }; + 7AFFD8ED1D35381100E5BB4D /* AppDelegate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AppDelegate.h; sourceTree = ""; }; + 7AFFD8EE1D35381100E5BB4D /* AppDelegate.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = AppDelegate.m; sourceTree = ""; }; + 9740EEB21CF90195004384FC /* Debug.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Debug.xcconfig; path = Flutter/Debug.xcconfig; sourceTree = ""; }; + 9740EEB31CF90195004384FC /* Generated.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Generated.xcconfig; path = Flutter/Generated.xcconfig; sourceTree = ""; }; + 9740EEBA1CF902C7004384FC /* Flutter.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Flutter.framework; path = Flutter/Flutter.framework; sourceTree = ""; }; + 97C146EE1CF9000F007C117D /* Runner.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Runner.app; sourceTree = BUILT_PRODUCTS_DIR; }; + 97C146F21CF9000F007C117D /* main.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = ""; }; + 97C146FB1CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; }; + 97C146FD1CF9000F007C117D /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; + 97C147001CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; }; + 97C147021CF9000F007C117D /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + 97C146EB1CF9000F007C117D /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 9705A1C61CF904A100538489 /* Flutter.framework in Frameworks */, + 3B80C3941E831B6300D905FE /* App.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + 9740EEB11CF90186004384FC /* Flutter */ = { + isa = PBXGroup; + children = ( + 3B80C3931E831B6300D905FE /* App.framework */, + 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */, + 9740EEBA1CF902C7004384FC /* Flutter.framework */, + 9740EEB21CF90195004384FC /* Debug.xcconfig */, + 7AFA3C8E1D35360C0083082E /* Release.xcconfig */, + 9740EEB31CF90195004384FC /* Generated.xcconfig */, + ); + name = Flutter; + sourceTree = ""; + }; + 97C146E51CF9000F007C117D = { + isa = PBXGroup; + children = ( + 9740EEB11CF90186004384FC /* Flutter */, + 97C146F01CF9000F007C117D /* Runner */, + 97C146EF1CF9000F007C117D /* Products */, + CF3B75C9A7D2FA2A4C99F110 /* Frameworks */, + ); + sourceTree = ""; + }; + 97C146EF1CF9000F007C117D /* Products */ = { + isa = PBXGroup; + children = ( + 97C146EE1CF9000F007C117D /* Runner.app */, + ); + name = Products; + sourceTree = ""; + }; + 97C146F01CF9000F007C117D /* Runner */ = { + isa = PBXGroup; + children = ( + 7AFFD8ED1D35381100E5BB4D /* AppDelegate.h */, + 7AFFD8EE1D35381100E5BB4D /* AppDelegate.m */, + 97C146FA1CF9000F007C117D /* Main.storyboard */, + 97C146FD1CF9000F007C117D /* Assets.xcassets */, + 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */, + 97C147021CF9000F007C117D /* Info.plist */, + 97C146F11CF9000F007C117D /* Supporting Files */, + 1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */, + 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */, + ); + path = Runner; + sourceTree = ""; + }; + 97C146F11CF9000F007C117D /* Supporting Files */ = { + isa = PBXGroup; + children = ( + 97C146F21CF9000F007C117D /* main.m */, + ); + name = "Supporting Files"; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXNativeTarget section */ + 97C146ED1CF9000F007C117D /* Runner */ = { + isa = PBXNativeTarget; + buildConfigurationList = 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */; + buildPhases = ( + 9740EEB61CF901F6004384FC /* Run Script */, + 97C146EA1CF9000F007C117D /* Sources */, + 97C146EB1CF9000F007C117D /* Frameworks */, + 97C146EC1CF9000F007C117D /* Resources */, + 9705A1C41CF9048500538489 /* Embed Frameworks */, + 3B06AD1E1E4923F5004D2608 /* Thin Binary */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = Runner; + productName = Runner; + productReference = 97C146EE1CF9000F007C117D /* Runner.app */; + productType = "com.apple.product-type.application"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + 97C146E61CF9000F007C117D /* Project object */ = { + isa = PBXProject; + attributes = { + LastUpgradeCheck = 0910; + ORGANIZATIONNAME = "The Chromium Authors"; + TargetAttributes = { + 97C146ED1CF9000F007C117D = { + CreatedOnToolsVersion = 7.3.1; + }; + }; + }; + buildConfigurationList = 97C146E91CF9000F007C117D /* Build configuration list for PBXProject "Runner" */; + compatibilityVersion = "Xcode 3.2"; + developmentRegion = English; + hasScannedForEncodings = 0; + knownRegions = ( + en, + Base, + ); + mainGroup = 97C146E51CF9000F007C117D; + productRefGroup = 97C146EF1CF9000F007C117D /* Products */; + projectDirPath = ""; + projectRoot = ""; + targets = ( + 97C146ED1CF9000F007C117D /* Runner */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXResourcesBuildPhase section */ + 97C146EC1CF9000F007C117D /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */, + 3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */, + 9740EEB41CF90195004384FC /* Debug.xcconfig in Resources */, + 97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */, + 97C146FC1CF9000F007C117D /* Main.storyboard in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXResourcesBuildPhase section */ + +/* Begin PBXShellScriptBuildPhase section */ + 3B06AD1E1E4923F5004D2608 /* Thin Binary */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputPaths = ( + ); + name = "Thin Binary"; + outputPaths = ( + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" thin"; + }; + 9740EEB61CF901F6004384FC /* Run Script */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputPaths = ( + ); + name = "Run Script"; + outputPaths = ( + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" build"; + }; +/* End PBXShellScriptBuildPhase section */ + +/* Begin PBXSourcesBuildPhase section */ + 97C146EA1CF9000F007C117D /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 978B8F6F1D3862AE00F588F7 /* AppDelegate.m in Sources */, + 97C146F31CF9000F007C117D /* main.m in Sources */, + 1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin PBXVariantGroup section */ + 97C146FA1CF9000F007C117D /* Main.storyboard */ = { + isa = PBXVariantGroup; + children = ( + 97C146FB1CF9000F007C117D /* Base */, + ); + name = Main.storyboard; + sourceTree = ""; + }; + 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */ = { + isa = PBXVariantGroup; + children = ( + 97C147001CF9000F007C117D /* Base */, + ); + name = LaunchScreen.storyboard; + sourceTree = ""; + }; +/* End PBXVariantGroup section */ + +/* Begin XCBuildConfiguration section */ + 249021D3217E4FDB00AE95B9 /* Profile */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_NONNULL = YES; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + ENABLE_NS_ASSERTIONS = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_NO_COMMON_BLOCKS = YES; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 8.0; + MTL_ENABLE_DEBUG_INFO = NO; + SDKROOT = iphoneos; + TARGETED_DEVICE_FAMILY = "1,2"; + VALIDATE_PRODUCT = YES; + }; + name = Profile; + }; + 249021D4217E4FDB00AE95B9 /* Profile */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)"; + DEVELOPMENT_TEAM = S8QB4VV633; + ENABLE_BITCODE = NO; + FRAMEWORK_SEARCH_PATHS = ( + "$(inherited)", + "$(PROJECT_DIR)/Flutter", + ); + INFOPLIST_FILE = Runner/Info.plist; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; + LIBRARY_SEARCH_PATHS = ( + "$(inherited)", + "$(PROJECT_DIR)/Flutter", + ); + PRODUCT_BUNDLE_IDENTIFIER = deckers.thibault.aves; + PRODUCT_NAME = "$(TARGET_NAME)"; + VERSIONING_SYSTEM = "apple-generic"; + }; + name = Profile; + }; + 97C147031CF9000F007C117D /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 9740EEB21CF90195004384FC /* Debug.xcconfig */; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_NONNULL = YES; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = dwarf; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_TESTABILITY = YES; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_DYNAMIC_NO_PIC = NO; + GCC_NO_COMMON_BLOCKS = YES; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_PREPROCESSOR_DEFINITIONS = ( + "DEBUG=1", + "$(inherited)", + ); + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 8.0; + MTL_ENABLE_DEBUG_INFO = YES; + ONLY_ACTIVE_ARCH = YES; + SDKROOT = iphoneos; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = Debug; + }; + 97C147041CF9000F007C117D /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_NONNULL = YES; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + ENABLE_NS_ASSERTIONS = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_NO_COMMON_BLOCKS = YES; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 8.0; + MTL_ENABLE_DEBUG_INFO = NO; + SDKROOT = iphoneos; + TARGETED_DEVICE_FAMILY = "1,2"; + VALIDATE_PRODUCT = YES; + }; + name = Release; + }; + 97C147061CF9000F007C117D /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 9740EEB21CF90195004384FC /* Debug.xcconfig */; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)"; + ENABLE_BITCODE = NO; + FRAMEWORK_SEARCH_PATHS = ( + "$(inherited)", + "$(PROJECT_DIR)/Flutter", + ); + INFOPLIST_FILE = Runner/Info.plist; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; + LIBRARY_SEARCH_PATHS = ( + "$(inherited)", + "$(PROJECT_DIR)/Flutter", + ); + PRODUCT_BUNDLE_IDENTIFIER = deckers.thibault.aves; + PRODUCT_NAME = "$(TARGET_NAME)"; + VERSIONING_SYSTEM = "apple-generic"; + }; + name = Debug; + }; + 97C147071CF9000F007C117D /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)"; + ENABLE_BITCODE = NO; + FRAMEWORK_SEARCH_PATHS = ( + "$(inherited)", + "$(PROJECT_DIR)/Flutter", + ); + INFOPLIST_FILE = Runner/Info.plist; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; + LIBRARY_SEARCH_PATHS = ( + "$(inherited)", + "$(PROJECT_DIR)/Flutter", + ); + PRODUCT_BUNDLE_IDENTIFIER = deckers.thibault.aves; + PRODUCT_NAME = "$(TARGET_NAME)"; + VERSIONING_SYSTEM = "apple-generic"; + }; + name = Release; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + 97C146E91CF9000F007C117D /* Build configuration list for PBXProject "Runner" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 97C147031CF9000F007C117D /* Debug */, + 97C147041CF9000F007C117D /* Release */, + 249021D3217E4FDB00AE95B9 /* Profile */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 97C147061CF9000F007C117D /* Debug */, + 97C147071CF9000F007C117D /* Release */, + 249021D4217E4FDB00AE95B9 /* Profile */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; +/* End XCConfigurationList section */ + }; + rootObject = 97C146E61CF9000F007C117D /* Project object */; +} diff --git a/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata new file mode 100644 index 000000000..1d526a16e --- /dev/null +++ b/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme new file mode 100644 index 000000000..786d6aad5 --- /dev/null +++ b/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -0,0 +1,93 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ios/Runner.xcworkspace/contents.xcworkspacedata b/ios/Runner.xcworkspace/contents.xcworkspacedata new file mode 100644 index 000000000..1d526a16e --- /dev/null +++ b/ios/Runner.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/ios/Runner/AppDelegate.h b/ios/Runner/AppDelegate.h new file mode 100644 index 000000000..36e21bbf9 --- /dev/null +++ b/ios/Runner/AppDelegate.h @@ -0,0 +1,6 @@ +#import +#import + +@interface AppDelegate : FlutterAppDelegate + +@end diff --git a/ios/Runner/AppDelegate.m b/ios/Runner/AppDelegate.m new file mode 100644 index 000000000..59a72e90b --- /dev/null +++ b/ios/Runner/AppDelegate.m @@ -0,0 +1,13 @@ +#include "AppDelegate.h" +#include "GeneratedPluginRegistrant.h" + +@implementation AppDelegate + +- (BOOL)application:(UIApplication *)application + didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { + [GeneratedPluginRegistrant registerWithRegistry:self]; + // Override point for customization after application launch. + return [super application:application didFinishLaunchingWithOptions:launchOptions]; +} + +@end diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json new file mode 100644 index 000000000..d36b1fab2 --- /dev/null +++ b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json @@ -0,0 +1,122 @@ +{ + "images" : [ + { + "size" : "20x20", + "idiom" : "iphone", + "filename" : "Icon-App-20x20@2x.png", + "scale" : "2x" + }, + { + "size" : "20x20", + "idiom" : "iphone", + "filename" : "Icon-App-20x20@3x.png", + "scale" : "3x" + }, + { + "size" : "29x29", + "idiom" : "iphone", + "filename" : "Icon-App-29x29@1x.png", + "scale" : "1x" + }, + { + "size" : "29x29", + "idiom" : "iphone", + "filename" : "Icon-App-29x29@2x.png", + "scale" : "2x" + }, + { + "size" : "29x29", + "idiom" : "iphone", + "filename" : "Icon-App-29x29@3x.png", + "scale" : "3x" + }, + { + "size" : "40x40", + "idiom" : "iphone", + "filename" : "Icon-App-40x40@2x.png", + "scale" : "2x" + }, + { + "size" : "40x40", + "idiom" : "iphone", + "filename" : "Icon-App-40x40@3x.png", + "scale" : "3x" + }, + { + "size" : "60x60", + "idiom" : "iphone", + "filename" : "Icon-App-60x60@2x.png", + "scale" : "2x" + }, + { + "size" : "60x60", + "idiom" : "iphone", + "filename" : "Icon-App-60x60@3x.png", + "scale" : "3x" + }, + { + "size" : "20x20", + "idiom" : "ipad", + "filename" : "Icon-App-20x20@1x.png", + "scale" : "1x" + }, + { + "size" : "20x20", + "idiom" : "ipad", + "filename" : "Icon-App-20x20@2x.png", + "scale" : "2x" + }, + { + "size" : "29x29", + "idiom" : "ipad", + "filename" : "Icon-App-29x29@1x.png", + "scale" : "1x" + }, + { + "size" : "29x29", + "idiom" : "ipad", + "filename" : "Icon-App-29x29@2x.png", + "scale" : "2x" + }, + { + "size" : "40x40", + "idiom" : "ipad", + "filename" : "Icon-App-40x40@1x.png", + "scale" : "1x" + }, + { + "size" : "40x40", + "idiom" : "ipad", + "filename" : "Icon-App-40x40@2x.png", + "scale" : "2x" + }, + { + "size" : "76x76", + "idiom" : "ipad", + "filename" : "Icon-App-76x76@1x.png", + "scale" : "1x" + }, + { + "size" : "76x76", + "idiom" : "ipad", + "filename" : "Icon-App-76x76@2x.png", + "scale" : "2x" + }, + { + "size" : "83.5x83.5", + "idiom" : "ipad", + "filename" : "Icon-App-83.5x83.5@2x.png", + "scale" : "2x" + }, + { + "size" : "1024x1024", + "idiom" : "ios-marketing", + "filename" : "Icon-App-1024x1024@1x.png", + "scale" : "1x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png new file mode 100644 index 0000000000000000000000000000000000000000..3d43d11e66f4de3da27ed045ca4fe38ad8b48094 GIT binary patch literal 11112 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 P-1+_A+?hGkL;m(J7kc&K literal 0 HcmV?d00001 diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png new file mode 100644 index 0000000000000000000000000000000000000000..28c6bf03016f6c994b70f38d1b7346e5831b531f GIT binary patch literal 564 zcmV-40?Yl0P)Px$?ny*JR5%f>l)FnDQ543{x%ZCiu33$Wg!pQFfT_}?5Q|_VSlIbLC`dpoMXL}9 zHfd9&47Mo(7D231gb+kjFxZHS4-m~7WurTH&doVX2KI5sU4v(sJ1@T9eCIKPjsqSr z)C01LsCxk=72-vXmX}CQD#BD;Cthymh&~=f$Q8nn0J<}ZrusBy4PvRNE}+1ceuj8u z0mW5k8fmgeLnTbWHGwfKA3@PdZxhn|PypR&^p?weGftrtCbjF#+zk_5BJh7;0`#Wr zgDpM_;Ax{jO##IrT`Oz;MvfwGfV$zD#c2xckpcXC6oou4ML~ezCc2EtnsQTB4tWNg z?4bkf;hG7IMfhgNI(FV5Gs4|*GyMTIY0$B=_*mso9Ityq$m^S>15>-?0(zQ<8Qy<_TjHE33(?_M8oaM zyc;NxzRVK@DL6RJnX%U^xW0Gpg(lXp(!uK1v0YgHjs^ZXSQ|m#lV7ip7{`C_J2TxPmfw%h$|%acrYHt)Re^PB%O&&=~a zhS(%I#+V>J-vjIib^<+s%ludY7y^C(P8nmqn9fp!i+?vr`bziDE=bx`%2W#Xyrj|i z!XQ4v1%L`m{7KT7q+LZNB^h8Ha2e=`Wp65^0;J00)_^G=au=8Yo;1b`CV&@#=jIBo zjN^JNVfYSs)+kDdGe7`1&8!?MQYKS?DuHZf3iogk_%#9E|5S zWeHrmAo>P;ejX7mwq#*}W25m^ZI+{(Z8fI?4jM_fffY0nok=+88^|*_DwcW>mR#e+ zX$F_KMdb6sRz!~7KkyN0G(3XQ+;z3X%PZ4gh;n-%62U<*VUKNv(D&Q->Na@Xb&u5Q3`3DGf+a8O5x7c#7+R+EAYl@R5us)CIw z7sT@_y~Ao@uL#&^LIh&QceqiT^+lb0YbFZt_SHOtWA%mgPEKVNvVgCsXy{5+zl*X8 zCJe)Q@y>wH^>l4;h1l^Y*9%-23TSmE>q5nI@?mt%n;Sj4Qq`Z+ib)a*a^cJc%E9^J zB;4s+K@rARbcBLT5P=@r;IVnBMKvT*)ew*R;&8vu%?Z&S>s?8?)3*YawM0P4!q$Kv zMmKh3lgE~&w&v%wVzH3Oe=jeNT=n@Y6J6TdHWTjXfX~-=1A1Bw`EW8rn}MqeI34nh zexFeA?&C3B2(E?0{drE@DA2pu(A#ElY&6el60Rn|Qpn-FkfQ8M93AfWIr)drgDFEU zghdWK)^71EWCP(@(=c4kfH1Y(4iugD4fve6;nSUpLT%!)MUHs1!zJYy4y||C+SwQ! z)KM&$7_tyM`sljP2fz6&Z;jxRn{Wup8IOUx8D4uh&(=O zx-7$a;U><*5L^!%xRlw)vAbh;sdlR||& ze}8_8%)c2Fwy=F&H|LM+p{pZB5DKTx>Y?F1N%BlZkXf!}JeGuMZk~LPi7{cidvUGB zAJ4LVeNV%XO>LTrklB#^-;8nb;}6l;1oW&WS=Mz*Az!4cqqQzbOSFq`$Q%PfD7srM zpKgP-D_0XPTRX*hAqeq0TDkJ;5HB1%$3Np)99#16c{ zJImlNL(npL!W|Gr_kxl1GVmF5&^$^YherS7+~q$p zt}{a=*RiD2Ikv6o=IM1kgc7zqpaZ;OB)P!1zz*i3{U()Dq#jG)egvK}@uFLa`oyWZ zf~=MV)|yJn`M^$N%ul5);JuQvaU1r2wt(}J_Qgyy`qWQI`hEeRX0uC@c1(dQ2}=U$ tNIIaX+dr)NRWXcxoR{>fqI{SF_dm1Ylv~=3YHI)h002ovPDHLkV1g(pWS;;4 literal 0 HcmV?d00001 diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..f091b6b0bca859a3f474b03065bef75ba58a9e4c GIT binary patch literal 1588 zcmV-42Fv-0P)C1SqPt}wig>|5Crh^=oyX$BK<}M8eLU3e2hGT;=G|!_SP)7zNI6fqUMB=)y zRAZ>eDe#*r`yDAVgB_R*LB*MAc)8(b{g{9McCXW!lq7r(btRoB9!8B-#AI6JMb~YFBEvdsV)`mEQO^&#eRKx@b&x- z5lZm*!WfD8oCLzfHGz#u7sT0^VLMI1MqGxF^v+`4YYnVYgk*=kU?HsSz{v({E3lb9 z>+xILjBN)t6`=g~IBOelGQ(O990@BfXf(DRI5I$qN$0Gkz-FSc$3a+2fX$AedL4u{ z4V+5Ong(9LiGcIKW?_352sR;LtDPmPJXI{YtT=O8=76o9;*n%_m|xo!i>7$IrZ-{l z-x3`7M}qzHsPV@$v#>H-TpjDh2UE$9g6sysUREDy_R(a)>=eHw-WAyfIN z*qb!_hW>G)Tu8nSw9yn#3wFMiLcfc4pY0ek1}8(NqkBR@t4{~oC>ryc-h_ByH(Cg5 z>ao-}771+xE3um9lWAY1FeQFxowa1(!J(;Jg*wrg!=6FdRX+t_<%z&d&?|Bn){>zm zZQj(aA_HeBY&OC^jj*)N`8fa^ePOU72VpInJoI1?`ty#lvlNzs(&MZX+R%2xS~5Kh zX*|AU4QE#~SgPzOXe9>tRj>hjU@c1k5Y_mW*Jp3fI;)1&g3j|zDgC+}2Q_v%YfDax z!?umcN^n}KYQ|a$Lr+51Nf9dkkYFSjZZjkma$0KOj+;aQ&721~t7QUKx61J3(P4P1 zstI~7-wOACnWP4=8oGOwz%vNDqD8w&Q`qcNGGrbbf&0s9L0De{4{mRS?o0MU+nR_! zrvshUau0G^DeMhM_v{5BuLjb#Hh@r23lDAk8oF(C+P0rsBpv85EP>4CVMx#04MOfG z;P%vktHcXwTj~+IE(~px)3*MY77e}p#|c>TD?sMatC0Tu4iKKJ0(X8jxQY*gYtxsC z(zYC$g|@+I+kY;dg_dE>scBf&bP1Nc@Hz<3R)V`=AGkc;8CXqdi=B4l2k|g;2%#m& z*jfX^%b!A8#bI!j9-0Fi0bOXl(-c^AB9|nQaE`*)Hw+o&jS9@7&Gov#HbD~#d{twV zXd^Tr^mWLfFh$@Dr$e;PBEz4(-2q1FF0}c;~B5sA}+Q>TOoP+t>wf)V9Iy=5ruQa;z)y zI9C9*oUga6=hxw6QasLPnee@3^Rr*M{CdaL5=R41nLs(AHk_=Y+A9$2&H(B7!_pURs&8aNw7?`&Z&xY_Ye z)~D5Bog^td-^QbUtkTirdyK^mTHAOuptDflut!#^lnKqU md>ggs(5nOWAqO?umG&QVYK#ibz}*4>0000U6E9hRK9^#O7(mu>ETqrXGsduA8$)?`v2seloOCza43C{NQ$$gAOH**MCn0Q?+L7dl7qnbRdqZ8LSVp1ItDxhxD?t@5_yHg6A8yI zC*%Wgg22K|8E#!~cTNYR~@Y9KepMPrrB8cABapAFa=`H+UGhkXUZV1GnwR1*lPyZ;*K(i~2gp|@bzp8}og7e*#% zEnr|^CWdVV!-4*Y_7rFvlww2Ze+>j*!Z!pQ?2l->4q#nqRu9`ELo6RMS5=br47g_X zRw}P9a7RRYQ%2Vsd0Me{_(EggTnuN6j=-?uFS6j^u69elMypu?t>op*wBx<=Wx8?( ztpe^(fwM6jJX7M-l*k3kEpWOl_Vk3@(_w4oc}4YF4|Rt=2V^XU?#Yz`8(e?aZ@#li0n*=g^qOcVpd-Wbok=@b#Yw zqn8u9a)z>l(1kEaPYZ6hwubN6i<8QHgsu0oE) ziJ(p;Wxm>sf!K+cw>R-(^Y2_bahB+&KI9y^);#0qt}t-$C|Bo71lHi{_+lg#f%RFy z0um=e3$K3i6K{U_4K!EX?F&rExl^W|G8Z8;`5z-k}OGNZ0#WVb$WCpQu-_YsiqKP?BB# vzVHS-CTUF4Ozn5G+mq_~Qqto~ahA+K`|lyv3(-e}00000NkvXXu0mjfd`9t{ literal 0 HcmV?d00001 diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..d0ef06e7edb86cdfe0d15b4b0d98334a86163658 GIT binary patch literal 1716 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 literal 0 HcmV?d00001 diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..c8f9ed8f5cee1c98386d13b17e89f719e83555b2 GIT binary patch literal 1895 zcmV-t2blPYP)FQtfgmafE#=YDCq`qUBt#QpG%*H6QHY765~R=q zZ6iudfM}q!Pz#~9JgOi8QJ|DSu?1-*(kSi1K4#~5?#|rh?sS)(-JQqX*}ciXJ56_H zdw=^s_srbAdqxlvGyrgGet#6T7_|j;95sL%MtM;q86vOxKM$f#puR)Bjv9Zvz9-di zXOTSsZkM83)E9PYBXC<$6(|>lNLVBb&&6y{NByFCp%6+^ALR@NCTse_wqvNmSWI-m z!$%KlHFH2omF!>#%1l3LTZg(s7eof$7*xB)ZQ0h?ejh?Ta9fDv59+u#MokW+1t8Zb zgHv%K(u9G^Lv`lh#f3<6!JVTL3(dCpxHbnbA;kKqQyd1~^Xe0VIaYBSWm6nsr;dFj z4;G-RyL?cYgsN1{L4ZFFNa;8)Rv0fM0C(~Tkit94 zz#~A)59?QjD&pAPSEQ)p8gP|DS{ng)j=2ux)_EzzJ773GmQ_Cic%3JJhC0t2cx>|v zJcVusIB!%F90{+}8hG3QU4KNeKmK%T>mN57NnCZ^56=0?&3@!j>a>B43pi{!u z7JyDj7`6d)qVp^R=%j>UIY6f+3`+qzIc!Y_=+uN^3BYV|o+$vGo-j-Wm<10%A=(Yk^beI{t%ld@yhKjq0iNjqN4XMGgQtbKubPM$JWBz}YA65k%dm*awtC^+f;a-x4+ddbH^7iDWGg&N0n#MW{kA|=8iMUiFYvMoDY@sPC#t$55gn6ykUTPAr`a@!(;np824>2xJthS z*ZdmT`g5-`BuJs`0LVhz+D9NNa3<=6m;cQLaF?tCv8)zcRSh66*Z|vXhG@$I%U~2l z?`Q zykI#*+rQ=z6Jm=Bui-SfpDYLA=|vzGE(dYm=OC8XM&MDo7ux4UF1~0J1+i%aCUpRe zt3L_uNyQ*cE(38Uy03H%I*)*Bh=Lb^Xj3?I^Hnbeq72(EOK^Y93CNp*uAA{5Lc=ky zx=~RKa4{iTm{_>_vSCm?$Ej=i6@=m%@VvAITnigVg{&@!7CDgs908761meDK5azA} z4?=NOH|PdvabgJ&fW2{Mo$Q0CcD8Qc84%{JPYt5EiG{MdLIAeX%T=D7NIP4%Hw}p9 zg)==!2Lbp#j{u_}hMiao9=!VSyx0gHbeCS`;q&vzeq|fs`y&^X-lso(Ls@-706qmA z7u*T5PMo_w3{se1t2`zWeO^hOvTsohG_;>J0wVqVe+n)AbQCx)yh9;w+J6?NF5Lmo zecS@ieAKL8%bVd@+-KT{yI|S}O>pYckUFs;ry9Ow$CD@ztz5K-*D$^{i(_1llhSh^ zEkL$}tsQt5>QA^;QgjgIfBDmcOgi5YDyu?t6vSnbp=1+@6D& z5MJ}B8q;bRlVoxasyhcUF1+)o`&3r0colr}QJ3hcSdLu;9;td>kf@Tcn<@9sIx&=m z;AD;SCh95=&p;$r{Xz3iWCO^MX83AGJ(yH&eTXgv|0=34#-&WAmw{)U7OU9!Wz^!7 zZ%jZFi@JR;>Mhi7S>V7wQ176|FdW2m?&`qa(ScO^CFPR80HucLHOTy%5s*HR0^8)i h0WYBP*#0Ks^FNSabJA*5${_#%002ovPDHLkV1oKhTl@e3 literal 0 HcmV?d00001 diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..a6d6b8609df07bf62e5100a53a01510388bd2b22 GIT binary patch literal 2665 zcmV-v3YPVWP)oFh3q0MFesq&64WThn3$;G69TfjsAv=f2G9}p zgSx99+!YV6qME!>9MD13x)k(+XE7W?_O4LoLb5ND8 zaV{9+P@>42xDfRiYBMSgD$0!vssptcb;&?u9u(LLBKmkZ>RMD=kvD3h`sk6!QYtBa ztlZI#nu$8lJ^q2Z79UTgZe>BU73(Aospiq+?SdMt8lDZ;*?@tyWVZVS_Q7S&*tJaiRlJ z+aSMOmbg3@h5}v;A*c8SbqM3icg-`Cnwl;7Ts%A1RkNIp+Txl-Ckkvg4oxrqGA5ewEgYqwtECD<_3Egu)xGllKt&J8g&+=ac@Jq4-?w6M3b*>w5 z69N3O%=I^6&UL5gZ!}trC7bUj*12xLdkNs~Bz4QdJJ*UDZox2UGR}SNg@lmOvhCc~ z*f_UeXv(=#I#*7>VZx2ObEN~UoGUTl=-@)E;YtCRZ>SVp$p9yG5hEFZ!`wI!spd)n zSk+vK0Vin7FL{7f&6OB%f;SH22dtbcF<|9fi2Fp%q4kxL!b1#l^)8dUwJ zwEf{(wJj@8iYDVnKB`eSU+;ml-t2`@%_)0jDM`+a46xhDbBj2+&Ih>1A>6aky#(-SYyE{R3f#y57wfLs z6w1p~$bp;6!9DX$M+J~S@D6vJAaElETnsX4h9a5tvPhC3L@qB~bOzkL@^z0k_hS{T4PF*TDrgdXp+dzsE? z>V|VR035Pl9n5&-RePFdS{7KAr2vPOqR9=M$vXA1Yy5>w;EsF`;OK{2pkn-kpp9Pw z)r;5JfJKKaT$4qCb{TaXHjb$QA{y0EYy*+b1XI;6Ah- zw13P)xT`>~eFoJC!>{2XL(a_#upp3gaR1#5+L(Jmzp4TBnx{~WHedpJ1ch8JFk~Sw z>F+gN+i+VD?gMXwcIhn8rz`>e>J^TI3E-MW>f}6R-pL}>WMOa0k#jN+`RyUVUC;#D zg|~oS^$6%wpF{^Qr+}X>0PKcr3Fc&>Z>uv@C);pwDs@2bZWhYP!rvGx?_|q{d`t<*XEb#=aOb=N+L@CVBGqImZf&+a zCQEa3$~@#kC);pasdG=f6tuIi0PO-y&tvX%>Mv=oY3U$nD zJ#gMegnQ46pq+3r=;zmgcG+zRc9D~c>z+jo9&D+`E6$LmyFqlmCYw;-Zooma{sR@~ z)_^|YL1&&@|GXo*pivH7k!msl+$Sew3%XJnxajt0K%3M6Bd&YFNy9}tWG^aovK2eX z1aL1%7;KRDrA@eG-Wr6w+;*H_VD~qLiVI`{_;>o)k`{8xa3EJT1O_>#iy_?va0eR? zDV=N%;Zjb%Z2s$@O>w@iqt!I}tLjGk!=p`D23I}N4Be@$(|iSA zf3Ih7b<{zqpDB4WF_5X1(peKe+rASze%u8eKLn#KKXt;UZ+Adf$_TO+vTqshLLJ5c z52HucO=lrNVae5XWOLm!V@n-ObU11!b+DN<$RuU+YsrBq*lYT;?AwJpmNKniF0Q1< zJCo>Q$=v$@&y=sj6{r!Y&y&`0$-I}S!H_~pI&2H8Z1C|BX4VgZ^-! zje3-;x0PBD!M`v*J_)rL^+$<1VJhH*2Fi~aA7s&@_rUHYJ9zD=M%4AFQ`}k8OC$9s XsPq=LnkwKG00000NkvXXu0mjfhAk5^ literal 0 HcmV?d00001 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 new file mode 100644 index 0000000000000000000000000000000000000000..a6d6b8609df07bf62e5100a53a01510388bd2b22 GIT binary patch literal 2665 zcmV-v3YPVWP)oFh3q0MFesq&64WThn3$;G69TfjsAv=f2G9}p zgSx99+!YV6qME!>9MD13x)k(+XE7W?_O4LoLb5ND8 zaV{9+P@>42xDfRiYBMSgD$0!vssptcb;&?u9u(LLBKmkZ>RMD=kvD3h`sk6!QYtBa ztlZI#nu$8lJ^q2Z79UTgZe>BU73(Aospiq+?SdMt8lDZ;*?@tyWVZVS_Q7S&*tJaiRlJ z+aSMOmbg3@h5}v;A*c8SbqM3icg-`Cnwl;7Ts%A1RkNIp+Txl-Ckkvg4oxrqGA5ewEgYqwtECD<_3Egu)xGllKt&J8g&+=ac@Jq4-?w6M3b*>w5 z69N3O%=I^6&UL5gZ!}trC7bUj*12xLdkNs~Bz4QdJJ*UDZox2UGR}SNg@lmOvhCc~ z*f_UeXv(=#I#*7>VZx2ObEN~UoGUTl=-@)E;YtCRZ>SVp$p9yG5hEFZ!`wI!spd)n zSk+vK0Vin7FL{7f&6OB%f;SH22dtbcF<|9fi2Fp%q4kxL!b1#l^)8dUwJ zwEf{(wJj@8iYDVnKB`eSU+;ml-t2`@%_)0jDM`+a46xhDbBj2+&Ih>1A>6aky#(-SYyE{R3f#y57wfLs z6w1p~$bp;6!9DX$M+J~S@D6vJAaElETnsX4h9a5tvPhC3L@qB~bOzkL@^z0k_hS{T4PF*TDrgdXp+dzsE? z>V|VR035Pl9n5&-RePFdS{7KAr2vPOqR9=M$vXA1Yy5>w;EsF`;OK{2pkn-kpp9Pw z)r;5JfJKKaT$4qCb{TaXHjb$QA{y0EYy*+b1XI;6Ah- zw13P)xT`>~eFoJC!>{2XL(a_#upp3gaR1#5+L(Jmzp4TBnx{~WHedpJ1ch8JFk~Sw z>F+gN+i+VD?gMXwcIhn8rz`>e>J^TI3E-MW>f}6R-pL}>WMOa0k#jN+`RyUVUC;#D zg|~oS^$6%wpF{^Qr+}X>0PKcr3Fc&>Z>uv@C);pwDs@2bZWhYP!rvGx?_|q{d`t<*XEb#=aOb=N+L@CVBGqImZf&+a zCQEa3$~@#kC);pasdG=f6tuIi0PO-y&tvX%>Mv=oY3U$nD zJ#gMegnQ46pq+3r=;zmgcG+zRc9D~c>z+jo9&D+`E6$LmyFqlmCYw;-Zooma{sR@~ z)_^|YL1&&@|GXo*pivH7k!msl+$Sew3%XJnxajt0K%3M6Bd&YFNy9}tWG^aovK2eX z1aL1%7;KRDrA@eG-Wr6w+;*H_VD~qLiVI`{_;>o)k`{8xa3EJT1O_>#iy_?va0eR? zDV=N%;Zjb%Z2s$@O>w@iqt!I}tLjGk!=p`D23I}N4Be@$(|iSA zf3Ih7b<{zqpDB4WF_5X1(peKe+rASze%u8eKLn#KKXt;UZ+Adf$_TO+vTqshLLJ5c z52HucO=lrNVae5XWOLm!V@n-ObU11!b+DN<$RuU+YsrBq*lYT;?AwJpmNKniF0Q1< zJCo>Q$=v$@&y=sj6{r!Y&y&`0$-I}S!H_~pI&2H8Z1C|BX4VgZ^-! zje3-;x0PBD!M`v*J_)rL^+$<1VJhH*2Fi~aA7s&@_rUHYJ9zD=M%4AFQ`}k8OC$9s XsPq=LnkwKG00000NkvXXu0mjfhAk5^ literal 0 HcmV?d00001 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 new file mode 100644 index 0000000000000000000000000000000000000000..75b2d164a5a98e212cca15ea7bf2ab5de5108680 GIT binary patch literal 3831 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 literal 0 HcmV?d00001 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 new file mode 100644 index 0000000000000000000000000000000000000000..c4df70d39da7941ef3f6dcb7f06a192d8dcb308d GIT binary patch literal 1888 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 iW8Zci7-kcv6Uzs@r-FtIZ-&5|)J Q1PU{Fy85}Sb4q9e0B4a5jsO4v literal 0 HcmV?d00001 diff --git a/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png b/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..9da19eacad3b03bb08bbddbbf4ac48dd78b3d838 GIT binary patch literal 68 zcmeAS@N?(olHy`uVBq!ia0vp^j3CUx0wlM}@Gt=>Zci7-kcv6Uzs@r-FtIZ-&5|)J Q1PU{Fy85}Sb4q9e0B4a5jsO4v literal 0 HcmV?d00001 diff --git a/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png b/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..9da19eacad3b03bb08bbddbbf4ac48dd78b3d838 GIT binary patch literal 68 zcmeAS@N?(olHy`uVBq!ia0vp^j3CUx0wlM}@Gt=>Zci7-kcv6Uzs@r-FtIZ-&5|)J Q1PU{Fy85}Sb4q9e0B4a5jsO4v literal 0 HcmV?d00001 diff --git a/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md b/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md new file mode 100644 index 000000000..89c2725b7 --- /dev/null +++ b/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md @@ -0,0 +1,5 @@ +# Launch Screen Assets + +You can customize the launch screen with your own desired assets by replacing the image files in this directory. + +You can also do it by opening your Flutter project's Xcode project with `open ios/Runner.xcworkspace`, selecting `Runner/Assets.xcassets` in the Project Navigator and dropping in the desired images. \ No newline at end of file diff --git a/ios/Runner/Base.lproj/LaunchScreen.storyboard b/ios/Runner/Base.lproj/LaunchScreen.storyboard new file mode 100644 index 000000000..f2e259c7c --- /dev/null +++ b/ios/Runner/Base.lproj/LaunchScreen.storyboard @@ -0,0 +1,37 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ios/Runner/Base.lproj/Main.storyboard b/ios/Runner/Base.lproj/Main.storyboard new file mode 100644 index 000000000..f3c28516f --- /dev/null +++ b/ios/Runner/Base.lproj/Main.storyboard @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ios/Runner/Info.plist b/ios/Runner/Info.plist new file mode 100644 index 000000000..a789a0df4 --- /dev/null +++ b/ios/Runner/Info.plist @@ -0,0 +1,45 @@ + + + + + CFBundleDevelopmentRegion + en + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIdentifier + $(PRODUCT_BUNDLE_IDENTIFIER) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + Aves + CFBundlePackageType + APPL + CFBundleShortVersionString + $(FLUTTER_BUILD_NAME) + CFBundleSignature + ???? + CFBundleVersion + $(FLUTTER_BUILD_NUMBER) + LSRequiresIPhoneOS + + UILaunchStoryboardName + LaunchScreen + UIMainStoryboardFile + Main + UISupportedInterfaceOrientations + + UIInterfaceOrientationPortrait + UIInterfaceOrientationLandscapeLeft + UIInterfaceOrientationLandscapeRight + + UISupportedInterfaceOrientations~ipad + + UIInterfaceOrientationPortrait + UIInterfaceOrientationPortraitUpsideDown + UIInterfaceOrientationLandscapeLeft + UIInterfaceOrientationLandscapeRight + + UIViewControllerBasedStatusBarAppearance + + + diff --git a/ios/Runner/main.m b/ios/Runner/main.m new file mode 100644 index 000000000..dff6597e4 --- /dev/null +++ b/ios/Runner/main.m @@ -0,0 +1,9 @@ +#import +#import +#import "AppDelegate.h" + +int main(int argc, char* argv[]) { + @autoreleasepool { + return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class])); + } +} diff --git a/lib/image_fullscreen_page.dart b/lib/image_fullscreen_page.dart new file mode 100644 index 000000000..cb959c9a3 --- /dev/null +++ b/lib/image_fullscreen_page.dart @@ -0,0 +1,17 @@ +import 'package:aves/thumbnail.dart'; +import 'package:flutter/material.dart'; + +class ImageFullscreenPage extends StatelessWidget { + final int id; + + ImageFullscreenPage({this.id}); + + @override + Widget build(BuildContext context) { + var width = MediaQuery.of(context).size.width; + return Thumbnail( + id: id, + extent: width, + ); + } +} diff --git a/lib/main.dart b/lib/main.dart new file mode 100644 index 000000000..71549818f --- /dev/null +++ b/lib/main.dart @@ -0,0 +1,149 @@ +import 'dart:typed_data'; +import 'package:aves/image_fullscreen_page.dart'; +import 'package:aves/thumbnail.dart'; +import 'package:draggable_scrollbar/draggable_scrollbar.dart'; + +import 'package:flutter/material.dart'; +import 'package:flutter/services.dart'; + +void main() => runApp(MyApp()); + +class MyApp extends StatelessWidget { + @override + Widget build(BuildContext context) { + return MaterialApp( + title: 'Flutter Demo', + theme: ThemeData( + brightness: Brightness.dark, + primarySwatch: Colors.blue, + ), + home: MyHomePage(title: 'Flutter Demo Home Page'), + ); + } +} + +class ImageFetcher { + static const platform = const MethodChannel('deckers.thibault.aves/mediastore'); + + static Future getImages() async { + try { + final result = await platform.invokeMethod('getImages'); + return result as List; + } on PlatformException catch (e) { + debugPrint('failed with exception=${e.message}'); + } + return []; + } + + static Future getThumbnail(int id) async { + try { + final result = await platform.invokeMethod('getThumbnail', { + 'id': id, + }); + return result as Uint8List; + } on PlatformException catch (e) { + debugPrint('failed with exception=${e.message}'); + } + return Uint8List(0); + } + + static cancelGetThumbnail(int id) async { + try { + await platform.invokeMethod('cancelGetThumbnail', { + 'id': id, + }); + } on PlatformException catch (e) { + debugPrint('failed with exception=${e.message}'); + } + } +} + +class MyHomePage extends StatefulWidget { + MyHomePage({Key key, this.title}) : super(key: key); + + final String title; + + @override + _MyHomePageState createState() => _MyHomePageState(); +} + +class _MyHomePageState extends State { + Future imageLoader; + ScrollController scrollController = ScrollController(); + + @override + void initState() { + super.initState(); + imageCache.maximumSizeBytes = 100 * 1024 * 1024; + imageLoader = ImageFetcher.getImages(); + } + + @override + Widget build(BuildContext context) { + var columnCount = 4; + var spacing = 1.0; + var extent = (MediaQuery.of(context).size.width - spacing * (columnCount - 1)) / columnCount; + debugPrint('MediaQuery.of(context).size=${MediaQuery.of(context).size} extent=$extent'); + return Scaffold( + appBar: AppBar( + title: Text(widget.title), + ), + body: FutureBuilder( + future: imageLoader, + builder: (futureContext, AsyncSnapshot snapshot) { + switch (snapshot.connectionState) { + case ConnectionState.none: + return Text('None'); + case ConnectionState.active: + case ConnectionState.waiting: + return Text('Awaiting result...'); + case ConnectionState.done: + if (snapshot.hasError) return Text('Error: ${snapshot.error}'); + var imageEntryList = snapshot.data; + return Container( + padding: EdgeInsets.symmetric(vertical: 0.0), + child: DraggableScrollbar.arrows( + labelTextBuilder: (double offset) => Text( + "${offset ~/ 1}", + style: TextStyle(color: Colors.blueGrey), + ), + controller: scrollController, + child: GridView.builder( + controller: scrollController, + gridDelegate: SliverGridDelegateWithMaxCrossAxisExtent( + maxCrossAxisExtent: extent, + mainAxisSpacing: spacing, + crossAxisSpacing: spacing, + ), + itemBuilder: (gridContext, index) { + var imageEntryMap = imageEntryList[index] as Map; + var contentId = imageEntryMap['contentId']; + return GestureDetector( + onTap: () => Navigator.push( + context, + MaterialPageRoute(builder: (context) => ImageFullscreenPage(id: contentId)), + ), + child: Container( + decoration: BoxDecoration( + border: Border.all( + color: Colors.grey.shade700, + width: 0.5, + ), + ), + child: Thumbnail( + id: contentId, + extent: extent, + ), + ), + ); + }, + itemCount: imageEntryList.length, + ), + ), + ); + } + return null; + }), + ); + } +} diff --git a/lib/thumbnail.dart b/lib/thumbnail.dart new file mode 100644 index 000000000..1928d7c0d --- /dev/null +++ b/lib/thumbnail.dart @@ -0,0 +1,50 @@ +import 'dart:typed_data'; +import 'package:aves/main.dart'; +import 'package:transparent_image/transparent_image.dart'; + +import 'package:flutter/material.dart'; + +class Thumbnail extends StatefulWidget { + Thumbnail({Key key, @required this.id, @required this.extent}) : super(key: key); + + final int id; + final double extent; + + @override + ThumbnailState createState() => ThumbnailState(); +} + +class ThumbnailState extends State { + Future loader; + + @override + void initState() { + super.initState(); + loader = ImageFetcher.getThumbnail(widget.id); + } + + @override + void dispose() { + ImageFetcher.cancelGetThumbnail(widget.id); + super.dispose(); + } + + @override + Widget build(BuildContext context) { + return FutureBuilder( + future: loader, + builder: (futureContext, AsyncSnapshot snapshot) { + var ready = snapshot.connectionState == ConnectionState.done && !snapshot.hasError; + Uint8List bytes = ready ? snapshot.data : kTransparentImage; + return Hero( + tag: widget.id, + child: Image.memory( + bytes, + width: widget.extent, + height: widget.extent, + fit: BoxFit.cover, + ), + ); + }); + } +} diff --git a/pubspec.lock b/pubspec.lock new file mode 100644 index 000000000..a4e617555 --- /dev/null +++ b/pubspec.lock @@ -0,0 +1,153 @@ +# Generated by pub +# See https://dart.dev/tools/pub/glossary#lockfile +packages: + async: + dependency: transitive + description: + name: async + url: "https://pub.dartlang.org" + source: hosted + version: "2.2.0" + boolean_selector: + dependency: transitive + description: + name: boolean_selector + url: "https://pub.dartlang.org" + source: hosted + version: "1.0.4" + charcode: + dependency: transitive + description: + name: charcode + url: "https://pub.dartlang.org" + source: hosted + version: "1.1.2" + collection: + dependency: transitive + description: + name: collection + url: "https://pub.dartlang.org" + source: hosted + version: "1.14.11" + draggable_scrollbar: + dependency: "direct main" + description: + name: draggable_scrollbar + url: "https://pub.dartlang.org" + source: hosted + version: "0.0.4" + flutter: + dependency: "direct main" + description: flutter + source: sdk + version: "0.0.0" + flutter_test: + dependency: "direct dev" + description: flutter + source: sdk + version: "0.0.0" + matcher: + dependency: transitive + description: + name: matcher + url: "https://pub.dartlang.org" + source: hosted + version: "0.12.5" + meta: + dependency: transitive + description: + name: meta + url: "https://pub.dartlang.org" + source: hosted + version: "1.1.6" + path: + dependency: transitive + description: + name: path + url: "https://pub.dartlang.org" + source: hosted + version: "1.6.2" + pedantic: + dependency: transitive + description: + name: pedantic + url: "https://pub.dartlang.org" + source: hosted + version: "1.7.0" + quiver: + dependency: transitive + description: + name: quiver + url: "https://pub.dartlang.org" + source: hosted + version: "2.0.3" + sky_engine: + dependency: transitive + description: flutter + source: sdk + version: "0.0.99" + source_span: + dependency: transitive + description: + name: source_span + url: "https://pub.dartlang.org" + source: hosted + version: "1.5.5" + stack_trace: + dependency: transitive + description: + name: stack_trace + url: "https://pub.dartlang.org" + source: hosted + version: "1.9.3" + stream_channel: + dependency: transitive + description: + name: stream_channel + url: "https://pub.dartlang.org" + source: hosted + version: "2.0.0" + string_scanner: + dependency: transitive + description: + name: string_scanner + url: "https://pub.dartlang.org" + source: hosted + version: "1.0.4" + term_glyph: + dependency: transitive + description: + name: term_glyph + url: "https://pub.dartlang.org" + source: hosted + version: "1.1.0" + test_api: + dependency: transitive + description: + name: test_api + url: "https://pub.dartlang.org" + source: hosted + version: "0.2.5" + transparent_image: + dependency: "direct main" + description: + name: transparent_image + url: "https://pub.dartlang.org" + source: hosted + version: "1.0.0" + typed_data: + dependency: transitive + description: + name: typed_data + url: "https://pub.dartlang.org" + source: hosted + version: "1.1.6" + vector_math: + dependency: transitive + description: + name: vector_math + url: "https://pub.dartlang.org" + source: hosted + version: "2.0.8" +sdks: + dart: ">=2.2.2 <3.0.0" diff --git a/pubspec.yaml b/pubspec.yaml new file mode 100644 index 000000000..9aabd1408 --- /dev/null +++ b/pubspec.yaml @@ -0,0 +1,62 @@ +name: aves +description: A new Flutter application. + +# The following defines the version and build number for your application. +# A version number is three numbers separated by dots, like 1.2.43 +# followed by an optional build number separated by a +. +# Both the version and the builder number may be overridden in flutter +# build by specifying --build-name and --build-number, respectively. +# In Android, build-name is used as versionName while build-number used as versionCode. +# Read more about Android versioning at https://developer.android.com/studio/publish/versioning +# In iOS, build-name is used as CFBundleShortVersionString while build-number used as CFBundleVersion. +# Read more about iOS versioning at +# https://developer.apple.com/library/archive/documentation/General/Reference/InfoPlistKeyReference/Articles/CoreFoundationKeys.html +version: 1.0.0+1 + +environment: + sdk: ">=2.1.0 <3.0.0" + +dependencies: + flutter: + sdk: flutter + draggable_scrollbar: + transparent_image: + +dev_dependencies: + flutter_test: + sdk: flutter + +flutter: + + uses-material-design: true + + # To add assets to your application, add an assets section, like this: + # assets: + # - images/a_dot_burr.jpeg + # - images/a_dot_ham.jpeg + + # An image asset can refer to one or more resolution-specific "variants", see + # https://flutter.dev/assets-and-images/#resolution-aware. + + # For details regarding adding assets from package dependencies, see + # https://flutter.dev/assets-and-images/#from-packages + + # To add custom fonts to your application, add a fonts section here, + # in this "flutter" section. Each entry in this list should have a + # "family" key with the font family name, and a "fonts" key with a + # list giving the asset and other descriptors for the font. For + # example: + # fonts: + # - family: Schyler + # fonts: + # - asset: fonts/Schyler-Regular.ttf + # - asset: fonts/Schyler-Italic.ttf + # style: italic + # - family: Trajan Pro + # fonts: + # - asset: fonts/TrajanPro.ttf + # - asset: fonts/TrajanPro_Bold.ttf + # weight: 700 + # + # For details regarding fonts from package dependencies, + # see https://flutter.dev/custom-fonts/#from-packages diff --git a/test/widget_test.dart b/test/widget_test.dart new file mode 100644 index 000000000..c74a2e373 --- /dev/null +++ b/test/widget_test.dart @@ -0,0 +1,30 @@ +// This is a basic Flutter widget test. +// +// To perform an interaction with a widget in your test, use the WidgetTester +// utility that Flutter provides. For example, you can send tap and scroll +// gestures. You can also use WidgetTester to find child widgets in the widget +// tree, read text, and verify that the values of widget properties are correct. + +import 'package:flutter/material.dart'; +import 'package:flutter_test/flutter_test.dart'; + +import 'package:aves/main.dart'; + +void main() { + testWidgets('Counter increments smoke test', (WidgetTester tester) async { + // Build our app and trigger a frame. + await tester.pumpWidget(MyApp()); + + // Verify that our counter starts at 0. + expect(find.text('0'), findsOneWidget); + expect(find.text('1'), findsNothing); + + // Tap the '+' icon and trigger a frame. + await tester.tap(find.byIcon(Icons.add)); + await tester.pump(); + + // Verify that our counter has incremented. + expect(find.text('0'), findsNothing); + expect(find.text('1'), findsOneWidget); + }); +}