diff --git a/analysis_options.yaml b/analysis_options.yaml new file mode 100644 index 0000000..f47b422 --- /dev/null +++ b/analysis_options.yaml @@ -0,0 +1,228 @@ +# Specify analysis options. +# +# Until there are meta linter rules, each desired lint must be explicitly enabled. +# See: https://github.com/dart-lang/linter/issues/288 +# +# For a list of lints, see: http://dart-lang.github.io/linter/lints/ +# See the configuration guide for more +# https://github.com/dart-lang/sdk/tree/master/pkg/analyzer#configuring-the-analyzer +# +# There are other similar analysis options files in the flutter repos, +# which should be kept in sync with this file: +# +# - analysis_options.yaml (this file) +# - packages/flutter/lib/analysis_options_user.yaml +# - https://github.com/flutter/plugins/blob/master/analysis_options.yaml +# - https://github.com/flutter/engine/blob/master/analysis_options.yaml +# +# This file contains the analysis options used by Flutter tools, such as IntelliJ, +# Android Studio, and the `flutter analyze` command. + +analyzer: + strong-mode: + implicit-casts: false + errors: + # treat missing required parameters as a warning (not a hint) + missing_required_param: warning + # treat missing returns as a warning (not a hint) + missing_return: warning + # allow having TODOs in the code + todo: ignore + # allow self-reference to deprecated members (we do this because otherwise we have + # to annotate every member in every test, assert, etc, when we deprecate something) + deprecated_member_use_from_same_package: ignore + # Ignore analyzer hints for updating pubspecs when using Future or + # Stream and not importing dart:async + # Please see https://github.com/flutter/flutter/pull/24528 for details. + sdk_version_async_exported_from_core: ignore + # Turned off until null-safe rollout is complete. + unnecessary_null_comparison: ignore + exclude: + - "bin/cache/**" + enable-experiment: + - non-nullable + +linter: + rules: + # these rules are documented on and in the same order as + # the Dart Lint rules page to make maintenance easier + # https://github.com/dart-lang/linter/blob/master/example/all.yaml + - always_declare_return_types + - always_put_control_body_on_new_line + # - always_put_required_named_parameters_first # we prefer having parameters in the same order as fields https://github.com/flutter/flutter/issues/10219 + - always_require_non_null_named_parameters + - always_specify_types + # - always_use_package_imports # we do this commonly + - annotate_overrides + # - avoid_annotating_with_dynamic # conflicts with always_specify_types + - avoid_bool_literals_in_conditional_expressions + # - avoid_catches_without_on_clauses # we do this commonly + # - avoid_catching_errors # we do this commonly + - avoid_classes_with_only_static_members + # - avoid_double_and_int_checks # only useful when targeting JS runtime + # - avoid_dynamic_calls # not yet tested + - avoid_empty_else + - avoid_equals_and_hash_code_on_mutable_classes + # - avoid_escaping_inner_quotes # not yet tested + - avoid_field_initializers_in_const_classes + - avoid_function_literals_in_foreach_calls + # - avoid_implementing_value_types # not yet tested + - avoid_init_to_null + # - avoid_js_rounded_ints # only useful when targeting JS runtime + - avoid_null_checks_in_equality_operators + # - avoid_positional_boolean_parameters # not yet tested + # - avoid_print # not yet tested + # - avoid_private_typedef_functions # we prefer having typedef (discussion in https://github.com/flutter/flutter/pull/16356) + # - avoid_redundant_argument_values # not yet tested + - avoid_relative_lib_imports + - avoid_renaming_method_parameters + - avoid_return_types_on_setters + # - avoid_returning_null # there are plenty of valid reasons to return null + # - avoid_returning_null_for_future # not yet tested + - avoid_returning_null_for_void + # - avoid_returning_this # there are plenty of valid reasons to return this + # - avoid_setters_without_getters # not yet tested + - avoid_shadowing_type_parameters + - avoid_single_cascade_in_expression_statements + - avoid_slow_async_io + - avoid_type_to_string + - avoid_types_as_parameter_names + # - avoid_types_on_closure_parameters # conflicts with always_specify_types + - avoid_unnecessary_containers + - avoid_unused_constructor_parameters + - avoid_void_async + # - avoid_web_libraries_in_flutter # not yet tested + - await_only_futures + - camel_case_extensions + - camel_case_types + - cancel_subscriptions + # - cascade_invocations # not yet tested + - cast_nullable_to_non_nullable + # - close_sinks # not reliable enough + # - comment_references # blocked on https://github.com/dart-lang/linter/issues/1142 + # - constant_identifier_names # needs an opt-out https://github.com/dart-lang/linter/issues/204 + - control_flow_in_finally + # - diagnostic_describe_all_properties # not yet tested + - directives_ordering + # - do_not_use_environment # we do this commonly + - empty_catches + - empty_constructor_bodies + - empty_statements + - exhaustive_cases + - file_names + - flutter_style_todos + - hash_and_equals + - implementation_imports + # - invariant_booleans # too many false positives: https://github.com/dart-lang/linter/issues/811 + - iterable_contains_unrelated_type + # - join_return_with_assignment # not required by flutter style + - leading_newlines_in_multiline_strings + - library_names + - library_prefixes + # - lines_longer_than_80_chars # not required by flutter style + - list_remove_unrelated_type + # - literal_only_boolean_expressions # too many false positives: https://github.com/dart-lang/sdk/issues/34181 + - missing_whitespace_between_adjacent_strings + - no_adjacent_strings_in_list + # - no_default_cases # too many false positives + - no_duplicate_case_values + - no_logic_in_create_state + # - no_runtimeType_toString # ok in tests; we enable this only in packages/ + - non_constant_identifier_names + - null_check_on_nullable_type_parameter + - null_closures + # - omit_local_variable_types # opposite of always_specify_types + # - one_member_abstracts # too many false positives + # - only_throw_errors # https://github.com/flutter/flutter/issues/5792 + - overridden_fields + - package_api_docs + - package_names + - package_prefixed_library_names + # - parameter_assignments # we do this commonly + - prefer_adjacent_string_concatenation + - prefer_asserts_in_initializer_lists + # - prefer_asserts_with_message # not required by flutter style + - prefer_collection_literals + - prefer_conditional_assignment + - prefer_const_constructors + - prefer_const_constructors_in_immutables + - prefer_const_declarations + - prefer_const_literals_to_create_immutables + # - prefer_constructors_over_static_methods # far too many false positives + - prefer_contains + # - prefer_double_quotes # opposite of prefer_single_quotes + - prefer_equal_for_default_values + # - prefer_expression_function_bodies # conflicts with https://github.com/flutter/flutter/wiki/Style-guide-for-Flutter-repo#consider-using--for-short-functions-and-methods + - prefer_final_fields + - prefer_final_in_for_each + - prefer_final_locals + - prefer_for_elements_to_map_fromIterable + - prefer_foreach + - prefer_function_declarations_over_variables + - prefer_generic_function_type_aliases + - prefer_if_elements_to_conditional_expressions + - prefer_if_null_operators + - prefer_initializing_formals + - prefer_inlined_adds + # - prefer_int_literals # conflicts with https://github.com/flutter/flutter/wiki/Style-guide-for-Flutter-repo#use-double-literals-for-double-constants + # - prefer_interpolation_to_compose_strings # doesn't work with raw strings, see https://github.com/dart-lang/linter/issues/2490 + - prefer_is_empty + - prefer_is_not_empty + - prefer_is_not_operator + - prefer_iterable_whereType + # - prefer_mixin # https://github.com/dart-lang/language/issues/32 + - prefer_null_aware_operators + # - prefer_relative_imports # incompatible with sub-package imports + - prefer_single_quotes + - prefer_spread_collections + - prefer_typing_uninitialized_variables + - prefer_void_to_null + - provide_deprecation_message + # - public_member_api_docs # enabled on a case-by-case basis; see e.g. packages/analysis_options.yaml + - recursive_getters + - sized_box_for_whitespace + - slash_for_doc_comments + # - sort_child_properties_last # not yet tested + - sort_constructors_first + # - sort_pub_dependencies # prevents separating pinned transitive dependencies + - sort_unnamed_constructors_first + - test_types_in_equals + - throw_in_finally + - tighten_type_of_initializing_formals + # - type_annotate_public_apis # subset of always_specify_types + - type_init_formals + # - unawaited_futures # too many false positives + - unnecessary_await_in_return + - unnecessary_brace_in_string_interps + - unnecessary_const + # - unnecessary_final # conflicts with prefer_final_locals + - unnecessary_getters_setters + # - unnecessary_lambdas # has false positives: https://github.com/dart-lang/linter/issues/498 + - unnecessary_new + - unnecessary_null_aware_assignments + # - unnecessary_null_checks # not yet tested + - unnecessary_null_in_if_null_operators + - unnecessary_nullable_for_final_variable_declarations + - unnecessary_overrides + - unnecessary_parenthesis + # - unnecessary_raw_strings # not yet tested + - unnecessary_statements + - unnecessary_string_escapes + - unnecessary_string_interpolations + - unnecessary_this + - unrelated_type_equality_checks + # - unsafe_html # not yet tested + - use_full_hex_values_for_flutter_colors + - use_function_type_syntax_for_parameters + # - use_if_null_to_convert_nulls_to_bools # not yet tested + - use_is_even_rather_than_modulo + - use_key_in_widget_constructors + - use_late_for_private_fields_and_variables + # - use_named_constants # not yet tested + - use_raw_strings + - use_rethrow_when_possible + # - use_setters_to_change_properties # not yet tested + # - use_string_buffers # has false positives: https://github.com/dart-lang/sdk/issues/34182 + # - use_to_and_as_if_applicable # has false positives, so we prefer to catch this by code-review + - valid_regexps + - void_checks \ No newline at end of file diff --git a/android/.idea/caches/build_file_checksums.ser b/android/.idea/caches/build_file_checksums.ser index e20a885..10e027e 100644 Binary files a/android/.idea/caches/build_file_checksums.ser and b/android/.idea/caches/build_file_checksums.ser differ diff --git a/android/.idea/gradle.xml b/android/.idea/gradle.xml index 47bd81f..f894050 100644 --- a/android/.idea/gradle.xml +++ b/android/.idea/gradle.xml @@ -1,8 +1,10 @@ + diff --git a/android/.idea/misc.xml b/android/.idea/misc.xml index b0c7b20..3386629 100644 --- a/android/.idea/misc.xml +++ b/android/.idea/misc.xml @@ -29,7 +29,7 @@ - + diff --git a/android/.idea/modules.xml b/android/.idea/modules.xml deleted file mode 100644 index f9b4966..0000000 --- a/android/.idea/modules.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - - - \ No newline at end of file diff --git a/example/.flutter-plugins-dependencies b/example/.flutter-plugins-dependencies new file mode 100644 index 0000000..ba8f495 --- /dev/null +++ b/example/.flutter-plugins-dependencies @@ -0,0 +1 @@ +{"info":"This is a generated file; do not edit or check into version control.","plugins":{"ios":[{"name":"esys_flutter_share","path":"/Users/felixmo/Desktop/trustME/sample/esys-flutter-share/","dependencies":["path_provider"]},{"name":"path_provider","path":"/Users/felixmo/.pub-cache/hosted/pub.dartlang.org/path_provider-2.0.1/","dependencies":[]}],"android":[{"name":"esys_flutter_share","path":"/Users/felixmo/Desktop/trustME/sample/esys-flutter-share/","dependencies":["path_provider"]},{"name":"path_provider","path":"/Users/felixmo/.pub-cache/hosted/pub.dartlang.org/path_provider-2.0.1/","dependencies":[]}],"macos":[{"name":"path_provider_macos","path":"/Users/felixmo/.pub-cache/hosted/pub.dartlang.org/path_provider_macos-2.0.0/","dependencies":[]}],"linux":[{"name":"path_provider_linux","path":"/Users/felixmo/.pub-cache/hosted/pub.dartlang.org/path_provider_linux-2.0.0/","dependencies":[]}],"windows":[{"name":"path_provider_windows","path":"/Users/felixmo/.pub-cache/hosted/pub.dartlang.org/path_provider_windows-2.0.0/","dependencies":[]}],"web":[]},"dependencyGraph":[{"name":"esys_flutter_share","dependencies":["path_provider"]},{"name":"path_provider","dependencies":["path_provider_macos","path_provider_linux","path_provider_windows"]},{"name":"path_provider_linux","dependencies":[]},{"name":"path_provider_macos","dependencies":[]},{"name":"path_provider_windows","dependencies":[]}],"date_created":"2021-04-01 10:37:12.635278","version":"2.0.3"} \ No newline at end of file diff --git a/example/android/app/src/main/AndroidManifest.xml b/example/android/app/src/main/AndroidManifest.xml index 446eeef..8cdbaab 100644 --- a/example/android/app/src/main/AndroidManifest.xml +++ b/example/android/app/src/main/AndroidManifest.xml @@ -30,6 +30,9 @@ + diff --git a/example/android/app/src/main/java/de/esys/esysfluttershareexample/MainActivity.java b/example/android/app/src/main/java/de/esys/esysfluttershareexample/MainActivity.java index 29ffb90..9840c5e 100644 --- a/example/android/app/src/main/java/de/esys/esysfluttershareexample/MainActivity.java +++ b/example/android/app/src/main/java/de/esys/esysfluttershareexample/MainActivity.java @@ -1,13 +1,6 @@ package de.esys.esysfluttershareexample; -import android.os.Bundle; -import io.flutter.app.FlutterActivity; -import io.flutter.plugins.GeneratedPluginRegistrant; +import io.flutter.embedding.android.FlutterActivity; public class MainActivity extends FlutterActivity { - @Override - protected void onCreate(Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - GeneratedPluginRegistrant.registerWith(this); - } } diff --git a/example/android/build.gradle b/example/android/build.gradle index bb8a303..fab3c2e 100644 --- a/example/android/build.gradle +++ b/example/android/build.gradle @@ -5,7 +5,7 @@ buildscript { } dependencies { - classpath 'com.android.tools.build:gradle:3.2.1' + classpath 'com.android.tools.build:gradle:4.1.3' } } diff --git a/example/android/gradle/wrapper/gradle-wrapper.properties b/example/android/gradle/wrapper/gradle-wrapper.properties index 2819f02..00b12b3 100644 --- a/example/android/gradle/wrapper/gradle-wrapper.properties +++ b/example/android/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,6 @@ -#Fri Jun 23 08:50:38 CEST 2017 +#Tue Mar 30 18:09:08 HKT 2021 distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-4.10.2-all.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-6.5-bin.zip diff --git a/example/ios/Flutter/flutter_export_environment.sh b/example/ios/Flutter/flutter_export_environment.sh new file mode 100755 index 0000000..817cc77 --- /dev/null +++ b/example/ios/Flutter/flutter_export_environment.sh @@ -0,0 +1,13 @@ +#!/bin/sh +# This is a generated file; do not edit or check into version control. +export "FLUTTER_ROOT=/Users/felixmo/flutter" +export "FLUTTER_APPLICATION_PATH=/Users/felixmo/Desktop/trustME/sample/esys-flutter-share/example" +export "FLUTTER_TARGET=lib/main.dart" +export "FLUTTER_BUILD_DIR=build" +export "SYMROOT=${SOURCE_ROOT}/../build/ios" +export "FLUTTER_BUILD_NAME=1.0.0" +export "FLUTTER_BUILD_NUMBER=1" +export "DART_OBFUSCATION=false" +export "TRACK_WIDGET_CREATION=false" +export "TREE_SHAKE_ICONS=false" +export "PACKAGE_CONFIG=.packages" diff --git a/example/lib/main.dart b/example/lib/main.dart index 8da9b8c..c7335d4 100644 --- a/example/lib/main.dart +++ b/example/lib/main.dart @@ -74,9 +74,9 @@ class _MyHomePageState extends State { Future _shareImage() async { try { - final ByteData bytes = await rootBundle.load('assets/image1.png'); + final ByteData? bytes = await rootBundle.load('assets/image1.png'); await Share.file( - 'esys image', 'esys.png', bytes.buffer.asUint8List(), 'image/png', + 'esys image', 'esys.png', bytes!.buffer.asUint8List(), 'image/png', text: 'My optional text.'); } catch (e) { print('error: $e'); @@ -85,14 +85,14 @@ class _MyHomePageState extends State { Future _shareImages() async { try { - final ByteData bytes1 = await rootBundle.load('assets/image1.png'); - final ByteData bytes2 = await rootBundle.load('assets/image2.png'); + final ByteData? bytes1 = await rootBundle.load('assets/image1.png'); + final ByteData? bytes2 = await rootBundle.load('assets/image2.png'); await Share.files( 'esys images', { - 'esys.png': bytes1.buffer.asUint8List(), - 'bluedan.png': bytes2.buffer.asUint8List(), + 'esys.png': bytes1!.buffer.asUint8List(), + 'bluedan.png': bytes2!.buffer.asUint8List(), }, 'image/png'); } catch (e) { @@ -102,9 +102,9 @@ class _MyHomePageState extends State { Future _shareCSV() async { try { - final ByteData bytes = await rootBundle.load('assets/addresses.csv'); + final ByteData? bytes = await rootBundle.load('assets/addresses.csv'); await Share.file( - 'addresses', 'addresses.csv', bytes.buffer.asUint8List(), 'text/csv'); + 'addresses', 'addresses.csv', bytes!.buffer.asUint8List(), 'text/csv'); } catch (e) { print('error: $e'); } @@ -112,16 +112,16 @@ class _MyHomePageState extends State { Future _shareMixed() async { try { - final ByteData bytes1 = await rootBundle.load('assets/image1.png'); - final ByteData bytes2 = await rootBundle.load('assets/image2.png'); - final ByteData bytes3 = await rootBundle.load('assets/addresses.csv'); + final ByteData? bytes1 = await rootBundle.load('assets/image1.png'); + final ByteData? bytes2 = await rootBundle.load('assets/image2.png'); + final ByteData? bytes3 = await rootBundle.load('assets/addresses.csv'); await Share.files( 'esys images', { - 'esys.png': bytes1.buffer.asUint8List(), - 'bluedan.png': bytes2.buffer.asUint8List(), - 'addresses.csv': bytes3.buffer.asUint8List(), + 'esys.png': bytes1!.buffer.asUint8List(), + 'bluedan.png': bytes2!.buffer.asUint8List(), + 'addresses.csv': bytes3!.buffer.asUint8List(), }, '*/*', text: 'My optional text.'); @@ -135,7 +135,7 @@ class _MyHomePageState extends State { var request = await HttpClient().getUrl(Uri.parse( 'https://shop.esys.eu/media/image/6f/8f/af/amlog_transport-berwachung.jpg')); var response = await request.close(); - Uint8List bytes = await consolidateHttpClientResponseBytes(response); + Uint8List? bytes = await consolidateHttpClientResponseBytes(response); await Share.file('ESYS AMLOG', 'amlog.jpg', bytes, 'image/jpg'); } catch (e) { print('error: $e'); @@ -144,9 +144,9 @@ class _MyHomePageState extends State { Future _shareSound() async { try { - final ByteData bytes = await rootBundle.load('assets/cat.mp3'); + final ByteData? bytes = await rootBundle.load('assets/cat.mp3'); await Share.file( - 'Sound', 'cat.mp3', bytes.buffer.asUint8List(), 'audio/*'); + 'Sound', 'cat.mp3', bytes!.buffer.asUint8List(), 'audio/*'); } catch (e) { print('error: $e'); } diff --git a/example/pubspec.yaml b/example/pubspec.yaml index 04da2c1..0acca84 100644 --- a/example/pubspec.yaml +++ b/example/pubspec.yaml @@ -3,7 +3,7 @@ description: Demonstrates how to use the esys_flutter_share plugin. publish_to: 'none' environment: - sdk: ">=2.1.0 <3.0.0" + sdk: ">=2.12.0 <3.0.0" dependencies: flutter: diff --git a/lib/esys_flutter_share.dart b/lib/esys_flutter_share.dart index d8c37d4..54ec371 100644 --- a/lib/esys_flutter_share.dart +++ b/lib/esys_flutter_share.dart @@ -5,50 +5,43 @@ import 'package:flutter/services.dart'; import 'package:path_provider/path_provider.dart'; class Share { - static const MethodChannel _channel = const MethodChannel( - 'channel:github.com/orgs/esysberlin/esys-flutter-share'); + static const MethodChannel _channel = MethodChannel('channel:github.com/orgs/esysberlin/esys-flutter-share'); /// Sends a text to other apps. - static void text(String title, String text, String mimeType) { - Map argsMap = { - 'title': '$title', - 'text': '$text', - 'mimeType': '$mimeType' - }; + static void text(String? title, String? text, String? mimeType) { + final Map argsMap = {'title': title, 'text': text, 'mimeType': mimeType}; _channel.invokeMethod('text', argsMap); } /// Sends a file to other apps. - static Future file( - String title, String name, List bytes, String mimeType, {String text = ''}) async { - Map argsMap = { - 'title': '$title', - 'name': '$name', - 'mimeType': '$mimeType', - 'text': '$text' + static Future? file(String? title, String? name, List bytes, String? mimeType, {String? text = ''}) async { + final Map argsMap = { + 'title': title, + 'name': name, + 'mimeType': mimeType, + 'text': text }; - final tempDir = await getTemporaryDirectory(); - final file = await new File('${tempDir.path}/$name').create(); + final Directory tempDir = await getTemporaryDirectory(); + final File file = await File('${tempDir.path}/$name').create(); await file.writeAsBytes(bytes); _channel.invokeMethod('file', argsMap); } /// Sends multiple files to other apps. - static Future files( - String title, Map> files, String mimeType, {String text = ''}) async { - Map argsMap = { - 'title': '$title', - 'names': files.entries.toList().map((x) => x.key).toList(), + static Future? files(String? title, Map> files, String? mimeType, {String? text = ''}) async { + final Map argsMap = { + 'title': title, + 'names': files.entries.toList().map((MapEntry> x) => x.key).toList(), 'mimeType': mimeType, - 'text': '$text' + 'text': text }; - final tempDir = await getTemporaryDirectory(); + final Directory tempDir = await getTemporaryDirectory(); - for (var entry in files.entries) { - final file = await new File('${tempDir.path}/${entry.key}').create(); + for (final MapEntry> entry in files.entries) { + final File file = await File('${tempDir.path}/${entry.key}').create(); await file.writeAsBytes(entry.value); } diff --git a/pubspec.yaml b/pubspec.yaml index 8bfc35d..53a3aec 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -5,12 +5,16 @@ author: ESYS GmbH homepage: https://github.com/esysberlin/esys-flutter-share environment: - sdk: ">=2.0.0-dev.68.0 <3.0.0" + sdk: ">=2.12.0 <3.0.0" dependencies: flutter: sdk: flutter - path_provider: ^1.1.0 + path_provider: ^2.0.1 + +dev_dependencies: + build_runner: ^1.10.1 + pedantic: ^1.9.2 # For information on the generic Dart part of this file, see the # following page: https://www.dartlang.org/tools/pub/pubspec