diff --git a/.cirrus.yml b/.cirrus.yml index 1236002fecd6..753bc90911ae 100644 --- a/.cirrus.yml +++ b/.cirrus.yml @@ -6,6 +6,8 @@ task: dockerfile: .ci/Dockerfile cpu: 8 memory: 16G + env: + E2E_PATH: "./packages/e2e" upgrade_script: - flutter channel stable - flutter upgrade @@ -45,6 +47,19 @@ task: - if [[ "$CHANNEL" -eq "stable" ]]; then find . | grep _web$ | xargs rm -rf; fi - flutter channel $CHANNEL - ./script/build_all_plugins_app.sh apk + - name: e2e_web_smoke_test + # Tests e2e example test in web. + only_if: "changesInclude('.cirrus.yml', 'packages/e2e/**') || $CIRRUS_PR == ''" + install_script: + - flutter config --enable-web + - git clone https://github.com/flutter/web_installers.git + - cd web_installers/packages/web_drivers/ + - pub get + - dart lib/web_driver_installer.dart chromedriver --install-only + - ./chromedriver/chromedriver --port=4444 & + test_script: + - cd $E2E_PATH/example/ + - flutter drive -v --target=test_driver/example_e2e.dart -d web-server --release --browser-name=chrome - name: build-apks+java-test+firebase-test-lab env: matrix: diff --git a/packages/android_alarm_manager/CHANGELOG.md b/packages/android_alarm_manager/CHANGELOG.md index cf935b566e20..d04ca962d7ad 100644 --- a/packages/android_alarm_manager/CHANGELOG.md +++ b/packages/android_alarm_manager/CHANGELOG.md @@ -1,3 +1,7 @@ +## 0.4.5+5 + +* Added an Espresso test. + ## 0.4.5+4 * Make the pedantic dev_dependency explicit. diff --git a/packages/android_alarm_manager/example/android/app/build.gradle b/packages/android_alarm_manager/example/android/app/build.gradle index d296cafa8e7c..f066040810c2 100644 --- a/packages/android_alarm_manager/example/android/app/build.gradle +++ b/packages/android_alarm_manager/example/android/app/build.gradle @@ -55,6 +55,8 @@ flutter { dependencies { testImplementation 'junit:junit:4.12' + testImplementation "com.google.truth:truth:1.0" androidTestImplementation 'androidx.test:runner:1.1.1' androidTestImplementation 'androidx.test.espresso:espresso-core:3.1.1' + api 'androidx.test:core:1.2.0' } diff --git a/packages/android_alarm_manager/example/android/app/src/androidTest/java/io/plugins/androidalarmmanager/BackgroundExecutionTest.java b/packages/android_alarm_manager/example/android/app/src/androidTest/java/io/plugins/androidalarmmanager/BackgroundExecutionTest.java new file mode 100644 index 000000000000..ce34b25ec505 --- /dev/null +++ b/packages/android_alarm_manager/example/android/app/src/androidTest/java/io/plugins/androidalarmmanager/BackgroundExecutionTest.java @@ -0,0 +1,64 @@ +// Copyright 2020 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +package io.flutter.plugins.androidalarmmanagerexample; + +import static androidx.test.espresso.Espresso.pressBackUnconditionally; +import static androidx.test.espresso.flutter.EspressoFlutter.onFlutterWidget; +import static androidx.test.espresso.flutter.action.FlutterActions.click; +import static androidx.test.espresso.flutter.matcher.FlutterMatchers.withValueKey; +import static org.junit.Assert.assertEquals; + +import android.content.Context; +import android.content.SharedPreferences; +import androidx.test.InstrumentationRegistry; +import androidx.test.core.app.ActivityScenario; +import androidx.test.ext.junit.runners.AndroidJUnit4; +import androidx.test.rule.ActivityTestRule; +import org.junit.Before; +import org.junit.Rule; +import org.junit.Test; +import org.junit.runner.RunWith; + +@RunWith(AndroidJUnit4.class) +public class BackgroundExecutionTest { + private SharedPreferences prefs; + static final String COUNT_KEY = "flutter.count"; + + @Rule + public ActivityTestRule myActivityTestRule = + new ActivityTestRule<>(DriverExtensionActivity.class, true, false); + + @Before + public void setUp() throws Exception { + Context context = InstrumentationRegistry.getInstrumentation().getTargetContext(); + prefs = context.getSharedPreferences("FlutterSharedPreferences", Context.MODE_PRIVATE); + prefs.edit().putLong(COUNT_KEY, 0).apply(); + + ActivityScenario.launch(DriverExtensionActivity.class); + } + + @Test + public void startBackgroundIsolate() throws Exception { + + // Register a one shot alarm which will go off in ~5 seconds. + onFlutterWidget(withValueKey("RegisterOneShotAlarm")).perform(click()); + + // The alarm count should be 0 after installation. + assertEquals(prefs.getLong(COUNT_KEY, -1), 0); + + // Close the application to background it. + pressBackUnconditionally(); + + // The alarm should eventually fire, wake up the application, create a + // background isolate, and then increment the counter in the shared + // preferences. Timeout after 20s, just to be safe. + int tries = 0; + while ((prefs.getLong(COUNT_KEY, -1) == 0) && (tries < 200)) { + Thread.sleep(100); + ++tries; + } + assertEquals(prefs.getLong(COUNT_KEY, -1), 1); + } +} diff --git a/packages/android_alarm_manager/example/android/app/src/androidTest/java/io/plugins/androidalarmmanager/DriverExtensionActivity.java b/packages/android_alarm_manager/example/android/app/src/androidTest/java/io/plugins/androidalarmmanager/DriverExtensionActivity.java new file mode 100644 index 000000000000..c51a3c0d8a55 --- /dev/null +++ b/packages/android_alarm_manager/example/android/app/src/androidTest/java/io/plugins/androidalarmmanager/DriverExtensionActivity.java @@ -0,0 +1,15 @@ +// Copyright 2019 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +package io.flutter.plugins.androidalarmmanagerexample; + +import androidx.annotation.NonNull; + +public class DriverExtensionActivity extends MainActivity { + @Override + @NonNull + public String getDartEntrypointFunctionName() { + return "appMain"; + } +} diff --git a/packages/android_alarm_manager/example/android/app/src/androidTest/java/io/plugins/androidalarmmanager/MainActivityTest.java b/packages/android_alarm_manager/example/android/app/src/androidTest/java/io/plugins/androidalarmmanager/MainActivityTest.java index 6b69d39de003..86bb25cccff2 100644 --- a/packages/android_alarm_manager/example/android/app/src/androidTest/java/io/plugins/androidalarmmanager/MainActivityTest.java +++ b/packages/android_alarm_manager/example/android/app/src/androidTest/java/io/plugins/androidalarmmanager/MainActivityTest.java @@ -5,11 +5,13 @@ package io.flutter.plugins.androidalarmmanagerexample; import androidx.test.rule.ActivityTestRule; -import dev.flutter.plugins.e2e.FlutterRunner; +import dev.flutter.plugins.e2e.FlutterTestRunner; import org.junit.Rule; import org.junit.runner.RunWith; -@RunWith(FlutterRunner.class) +@RunWith(FlutterTestRunner.class) public class MainActivityTest { - @Rule public ActivityTestRule rule = new ActivityTestRule<>(MainActivity.class); + @Rule + public ActivityTestRule rule = + new ActivityTestRule<>(MainActivity.class, true, false); } diff --git a/packages/android_alarm_manager/example/android/app/src/debug/AndroidManifest.xml b/packages/android_alarm_manager/example/android/app/src/debug/AndroidManifest.xml new file mode 100644 index 000000000000..e826cdd83ac7 --- /dev/null +++ b/packages/android_alarm_manager/example/android/app/src/debug/AndroidManifest.xml @@ -0,0 +1,21 @@ + + + + + + + + + + + + \ No newline at end of file diff --git a/packages/android_alarm_manager/example/android/app/src/main/java/io/flutter/plugins/androidalarmmanagerexample/MainActivity.java b/packages/android_alarm_manager/example/android/app/src/main/java/io/flutter/plugins/androidalarmmanagerexample/MainActivity.java index 2c80708c4e94..efe9064317cd 100644 --- a/packages/android_alarm_manager/example/android/app/src/main/java/io/flutter/plugins/androidalarmmanagerexample/MainActivity.java +++ b/packages/android_alarm_manager/example/android/app/src/main/java/io/flutter/plugins/androidalarmmanagerexample/MainActivity.java @@ -10,6 +10,7 @@ import io.flutter.embedding.engine.plugins.shim.ShimPluginRegistry; import io.flutter.plugins.androidalarmmanager.AndroidAlarmManagerPlugin; import io.flutter.plugins.pathprovider.PathProviderPlugin; +import io.flutter.plugins.sharedpreferences.SharedPreferencesPlugin; public class MainActivity extends FlutterActivity { // TODO(bkonyi): Remove this once v2 of GeneratedPluginRegistrant rolls to stable. https://github.com/flutter/flutter/issues/42694 @@ -18,6 +19,7 @@ public void configureFlutterEngine(FlutterEngine flutterEngine) { ShimPluginRegistry shimPluginRegistry = new ShimPluginRegistry(flutterEngine); flutterEngine.getPlugins().add(new AndroidAlarmManagerPlugin()); flutterEngine.getPlugins().add(new E2EPlugin()); + flutterEngine.getPlugins().add(new SharedPreferencesPlugin()); PathProviderPlugin.registerWith( shimPluginRegistry.registrarFor("io.flutter.plugins.pathprovider.PathProviderPlugin")); } diff --git a/packages/android_alarm_manager/example/lib/main.dart b/packages/android_alarm_manager/example/lib/main.dart index 12aad9b001a9..4ba697744dbf 100644 --- a/packages/android_alarm_manager/example/lib/main.dart +++ b/packages/android_alarm_manager/example/lib/main.dart @@ -4,32 +4,156 @@ // ignore_for_file: public_member_api_docs -import 'dart:async'; +import 'dart:isolate'; +import 'dart:math'; +import 'dart:ui'; import 'package:android_alarm_manager/android_alarm_manager.dart'; -import 'package:flutter/widgets.dart'; +import 'package:shared_preferences/shared_preferences.dart'; +import 'package:flutter/material.dart'; -void printMessage(String msg) => print('[${DateTime.now()}] $msg'); +/// The [SharedPreferences] key to access the alarm fire count. +const String countKey = 'count'; -void printPeriodic() => printMessage("Periodic!"); -void printOneShot() => printMessage("One shot!"); +/// The name associated with the UI isolate's [SendPort]. +const String isolateName = 'isolate'; -Future main() async { - final int periodicID = 0; - final int oneShotID = 1; +/// A port used to communicate from a background isolate to the UI isolate. +final ReceivePort port = ReceivePort(); + +/// Global [SharedPreferences] object. +SharedPreferences prefs; +Future main() async { + // TODO(bkonyi): uncomment WidgetsFlutterBinding.ensureInitialized(); - // Start the AlarmManager service. - await AndroidAlarmManager.initialize(); - - printMessage("main run"); - runApp(const Center( - child: - Text('See device log for output', textDirection: TextDirection.ltr))); - await AndroidAlarmManager.periodic( - const Duration(seconds: 5), periodicID, printPeriodic, - wakeup: true, exact: true); - await AndroidAlarmManager.oneShot( - const Duration(seconds: 5), oneShotID, printOneShot); + // Register the UI isolate's SendPort to allow for communication from the + // background isolate. + IsolateNameServer.registerPortWithName( + port.sendPort, + isolateName, + ); + prefs = await SharedPreferences.getInstance(); + if (!prefs.containsKey(countKey)) { + await prefs.setInt(countKey, 0); + } + runApp(AlarmManagerExampleApp()); +} + +/// Example app for Espresso plugin. +class AlarmManagerExampleApp extends StatelessWidget { + // This widget is the root of your application. + @override + Widget build(BuildContext context) { + return MaterialApp( + title: 'Flutter Demo', + home: _AlarmHomePage(title: 'Flutter Demo Home Page'), + ); + } +} + +class _AlarmHomePage extends StatefulWidget { + _AlarmHomePage({Key key, this.title}) : super(key: key); + final String title; + + @override + _AlarmHomePageState createState() => _AlarmHomePageState(); +} + +class _AlarmHomePageState extends State<_AlarmHomePage> { + int _counter = 0; + + @override + void initState() { + super.initState(); + AndroidAlarmManager.initialize(); + + // Register for events from the background isolate. These messages will + // always coincide with an alarm firing. + port.listen((_) async => await _incrementCounter()); + } + + Future _incrementCounter() async { + print('Increment counter!'); + + // Ensure we've loaded the updated count from the background isolate. + await prefs.reload(); + + setState(() { + _counter++; + }); + } + + // The background + static SendPort uiSendPort; + + // The callback for our alarm + static Future callback() async { + print('Alarm fired!'); + + // Get the previous cached count and increment it. + final prefs = await SharedPreferences.getInstance(); + int currentCount = prefs.getInt(countKey); + await prefs.setInt(countKey, currentCount + 1); + + // This will be null if we're running in the background. + uiSendPort ??= IsolateNameServer.lookupPortByName(isolateName); + uiSendPort?.send(null); + } + + @override + Widget build(BuildContext context) { + // TODO(jackson): This has been deprecated and should be replaced + // with `headline4` when it's available on all the versions of + // Flutter that we test. + // ignore: deprecated_member_use + final textStyle = Theme.of(context).textTheme.display1; + return Scaffold( + appBar: AppBar( + title: Text(widget.title), + ), + body: Center( + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Text( + 'Alarm fired $_counter times', + style: textStyle, + ), + Row( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Text( + 'Total alarms fired: ', + style: textStyle, + ), + Text( + prefs.getInt(countKey).toString(), + key: ValueKey('BackgroundCountText'), + style: textStyle, + ), + ], + ), + RaisedButton( + child: Text( + 'Schedule OneShot Alarm', + ), + key: ValueKey('RegisterOneShotAlarm'), + onPressed: () async { + await AndroidAlarmManager.oneShot( + const Duration(seconds: 5), + // Ensure we have a unique alarm ID. + Random().nextInt(pow(2, 31)), + callback, + exact: true, + wakeup: true, + ); + }, + ), + ], + ), + ), + ); + } } diff --git a/packages/android_alarm_manager/example/pubspec.yaml b/packages/android_alarm_manager/example/pubspec.yaml index dbcf2c02b817..2fc191881c10 100644 --- a/packages/android_alarm_manager/example/pubspec.yaml +++ b/packages/android_alarm_manager/example/pubspec.yaml @@ -6,11 +6,12 @@ dependencies: sdk: flutter android_alarm_manager: path: ../ - e2e: ^0.2.1 + shared_preferences: ^0.5.6 + e2e: 0.3.0 path_provider: ^1.3.1 - dev_dependencies: + espresso: ^0.0.1+3 flutter_driver: sdk: flutter flutter_test: diff --git a/packages/android_alarm_manager/example/test_driver/android_alarm_manager_e2e.dart b/packages/android_alarm_manager/example/test_driver/android_alarm_manager_e2e.dart index 8359bfd59ef2..a5bc1ac0ba48 100644 --- a/packages/android_alarm_manager/example/test_driver/android_alarm_manager_e2e.dart +++ b/packages/android_alarm_manager/example/test_driver/android_alarm_manager_e2e.dart @@ -4,9 +4,11 @@ import 'dart:async'; import 'dart:io'; +import 'package:android_alarm_manager_example/main.dart' as app; import 'package:android_alarm_manager/android_alarm_manager.dart'; import 'package:e2e/e2e.dart'; import 'package:flutter_test/flutter_test.dart'; +import 'package:flutter_driver/driver_extension.dart'; import 'package:path_provider/path_provider.dart'; // From https://flutter.dev/docs/cookbook/persistence/reading-writing-files @@ -44,14 +46,17 @@ Future readCounter() async { Future incrementCounter() async { final int value = await readCounter(); - print('incrementCounter to: ${value + 1}'); await writeCounter(value + 1); } +void appMain() { + enableFlutterDriverExtension(); + app.main(); +} + void main() { E2EWidgetsFlutterBinding.ensureInitialized(); - print('main'); setUp(() async { await AndroidAlarmManager.initialize(); }); diff --git a/packages/android_alarm_manager/pubspec.yaml b/packages/android_alarm_manager/pubspec.yaml index 3efcbb439816..7bdf68f393bd 100644 --- a/packages/android_alarm_manager/pubspec.yaml +++ b/packages/android_alarm_manager/pubspec.yaml @@ -1,7 +1,7 @@ name: android_alarm_manager description: Flutter plugin for accessing the Android AlarmManager service, and running Dart code in the background when alarms fire. -version: 0.4.5+4 +version: 0.4.5+5 homepage: https://github.com/flutter/plugins/tree/master/packages/android_alarm_manager dependencies: diff --git a/packages/android_intent/CHANGELOG.md b/packages/android_intent/CHANGELOG.md index 3d16c1422441..6160ba54b003 100644 --- a/packages/android_intent/CHANGELOG.md +++ b/packages/android_intent/CHANGELOG.md @@ -1,3 +1,16 @@ +## 0.3.6+1 + +* Bump the minimum Flutter version to 1.12.13+hotfix.5. +* Bump the minimum Dart version to 2.3.0. +* Uses Darts spread operator to build plugin arguments internally. +* Remove deprecated API usage warning in AndroidIntentPlugin.java. +* Migrates the Android example to V2 embedding. + +## 0.3.6 + +* Marks the `action` parameter as optional +* Adds an assertion to ensure the intent receives an action, component or both. + ## 0.3.5+1 * Make the pedantic dev_dependency explicit. diff --git a/packages/android_intent/android/build.gradle b/packages/android_intent/android/build.gradle index 008b49ff7719..d261dac7df1c 100644 --- a/packages/android_intent/android/build.gradle +++ b/packages/android_intent/android/build.gradle @@ -43,29 +43,3 @@ dependencies { testImplementation 'androidx.test:core:1.0.0' testImplementation 'org.robolectric:robolectric:4.3' } - -// TODO(mklim): Remove this hack once androidx.lifecycle is included on stable. https://github.com/flutter/flutter/issues/42348 -afterEvaluate { - def containsEmbeddingDependencies = false - for (def configuration : configurations.all) { - for (def dependency : configuration.dependencies) { - if (dependency.group == 'io.flutter' && - dependency.name.startsWith('flutter_embedding') && - dependency.isTransitive()) - { - containsEmbeddingDependencies = true - break - } - } - } - if (!containsEmbeddingDependencies) { - android { - dependencies { - def lifecycle_version = "1.1.1" - compileOnly "android.arch.lifecycle:runtime:$lifecycle_version" - compileOnly "android.arch.lifecycle:common:$lifecycle_version" - compileOnly "android.arch.lifecycle:common-java8:$lifecycle_version" - } - } - } -} diff --git a/packages/android_intent/android/src/main/java/io/flutter/plugins/androidintent/AndroidIntentPlugin.java b/packages/android_intent/android/src/main/java/io/flutter/plugins/androidintent/AndroidIntentPlugin.java index 10c807979162..2f35dfcf0372 100644 --- a/packages/android_intent/android/src/main/java/io/flutter/plugins/androidintent/AndroidIntentPlugin.java +++ b/packages/android_intent/android/src/main/java/io/flutter/plugins/androidintent/AndroidIntentPlugin.java @@ -42,7 +42,7 @@ public static void registerWith(Registrar registrar) { public void onAttachedToEngine(@NonNull FlutterPluginBinding binding) { sender.setApplicationContext(binding.getApplicationContext()); sender.setActivity(null); - impl.startListening(binding.getFlutterEngine().getDartExecutor()); + impl.startListening(binding.getBinaryMessenger()); } @Override diff --git a/packages/android_intent/android/src/main/java/io/flutter/plugins/androidintent/IntentSender.java b/packages/android_intent/android/src/main/java/io/flutter/plugins/androidintent/IntentSender.java index aac9226b9465..5aa7919699da 100644 --- a/packages/android_intent/android/src/main/java/io/flutter/plugins/androidintent/IntentSender.java +++ b/packages/android_intent/android/src/main/java/io/flutter/plugins/androidintent/IntentSender.java @@ -42,7 +42,7 @@ public IntentSender(@Nullable Activity activity, @Nullable Context applicationCo * back to {@code applicationContext} and adds {@link Intent#FLAG_ACTIVITY_NEW_TASK} to the intent * before launching it. * - * @param action the Intent action, such as {@code ACTION_VIEW}. + * @param action the Intent action, such as {@code ACTION_VIEW} if non-null. * @param flags forwarded to {@link Intent#addFlags(int)} if non-null. * @param category forwarded to {@link Intent#addCategory(String)} if non-null. * @param data forwarded to {@link Intent#setData(Uri)} if non-null and 'type' parameter is null. @@ -57,7 +57,7 @@ public IntentSender(@Nullable Activity activity, @Nullable Context applicationCo * Intent#setDataAndType(Uri, String)} */ void send( - String action, + @Nullable String action, @Nullable Integer flags, @Nullable String category, @Nullable Uri data, @@ -70,8 +70,11 @@ void send( return; } - Intent intent = new Intent(action); + Intent intent = new Intent(); + if (action != null) { + intent.setAction(action); + } if (flags != null) { intent.addFlags(flags); } diff --git a/packages/android_intent/android/src/main/java/io/flutter/plugins/androidintent/MethodCallHandlerImpl.java b/packages/android_intent/android/src/main/java/io/flutter/plugins/androidintent/MethodCallHandlerImpl.java index a77d181015de..09846d5e51ef 100644 --- a/packages/android_intent/android/src/main/java/io/flutter/plugins/androidintent/MethodCallHandlerImpl.java +++ b/packages/android_intent/android/src/main/java/io/flutter/plugins/androidintent/MethodCallHandlerImpl.java @@ -91,6 +91,10 @@ public void onMethodCall(@NonNull MethodCall call, @NonNull Result result) { } private static String convertAction(String action) { + if (action == null) { + return null; + } + switch (action) { case "action_view": return Intent.ACTION_VIEW; diff --git a/packages/android_intent/android/src/test/java/io/flutter/plugins/androidintent/MethodCallHandlerImplTest.java b/packages/android_intent/android/src/test/java/io/flutter/plugins/androidintent/MethodCallHandlerImplTest.java index 4ce7ddc3718e..cf0a28e822d4 100644 --- a/packages/android_intent/android/src/test/java/io/flutter/plugins/androidintent/MethodCallHandlerImplTest.java +++ b/packages/android_intent/android/src/test/java/io/flutter/plugins/androidintent/MethodCallHandlerImplTest.java @@ -217,8 +217,34 @@ public void onMethodCall_setsComponentName() { Intent intent = shadowOf((Application) context).getNextStartedActivity(); assertNotNull(intent); assertNotNull(intent.getComponent()); - assertEquals(expectedComponent.getPackageName(), intent.getPackage()); - assertEquals(expectedComponent.flattenToString(), intent.getComponent().flattenToString()); + assertEquals("foo", intent.getAction()); + assertEquals("io.flutter.plugins.androidintent", intent.getPackage()); + assertEquals( + "io.flutter.plugins.androidintent/MainActivity", intent.getComponent().flattenToString()); + } + + @Test + public void onMethodCall_setsOnlyComponentName() { + sender.setApplicationContext(context); + Map args = new HashMap<>(); + ComponentName expectedComponent = + new ComponentName("io.flutter.plugins.androidintent", "MainActivity"); + args.put("package", expectedComponent.getPackageName()); + args.put("componentName", expectedComponent.getClassName()); + Result result = mock(Result.class); + ShadowPackageManager shadowPm = + shadowOf(ApplicationProvider.getApplicationContext().getPackageManager()); + shadowPm.addActivityIfNotPresent(expectedComponent); + + methodCallHandler.onMethodCall(new MethodCall("launch", args), result); + + verify(result, times(1)).success(null); + Intent intent = shadowOf((Application) context).getNextStartedActivity(); + assertNotNull(intent); + assertNotNull(intent.getComponent()); + assertEquals("io.flutter.plugins.androidintent", intent.getPackage()); + assertEquals( + "io.flutter.plugins.androidintent/MainActivity", intent.getComponent().flattenToString()); } @Test diff --git a/packages/android_intent/example/android/app/src/main/AndroidManifest.xml b/packages/android_intent/example/android/app/src/main/AndroidManifest.xml index 7d6fcd44834f..761c35fd64d8 100644 --- a/packages/android_intent/example/android/app/src/main/AndroidManifest.xml +++ b/packages/android_intent/example/android/app/src/main/AndroidManifest.xml @@ -11,25 +11,27 @@ android:label="android_intent_example" android:name="io.flutter.app.FlutterApplication"> - + + + + + diff --git a/packages/android_intent/example/android/app/src/main/java/io/flutter/plugins/androidintentexample/EmbeddingV1Activity.java b/packages/android_intent/example/android/app/src/main/java/io/flutter/plugins/androidintentexample/EmbeddingV1Activity.java index 95dc41a02ef7..1bbe89a4a4cb 100644 --- a/packages/android_intent/example/android/app/src/main/java/io/flutter/plugins/androidintentexample/EmbeddingV1Activity.java +++ b/packages/android_intent/example/android/app/src/main/java/io/flutter/plugins/androidintentexample/EmbeddingV1Activity.java @@ -6,12 +6,13 @@ import android.os.Bundle; import io.flutter.app.FlutterActivity; -import io.flutter.plugins.GeneratedPluginRegistrant; +import io.flutter.plugins.androidintent.AndroidIntentPlugin; public class EmbeddingV1Activity extends FlutterActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); - GeneratedPluginRegistrant.registerWith(this); + AndroidIntentPlugin.registerWith( + registrarFor("io.flutter.plugins.androidintent.AndroidIntentPlugin")); } } diff --git a/packages/android_intent/example/android/app/src/main/java/io/flutter/plugins/androidintentexample/MainActivity.java b/packages/android_intent/example/android/app/src/main/java/io/flutter/plugins/androidintentexample/MainActivity.java deleted file mode 100644 index 56e0bab207d4..000000000000 --- a/packages/android_intent/example/android/app/src/main/java/io/flutter/plugins/androidintentexample/MainActivity.java +++ /dev/null @@ -1,12 +0,0 @@ -package io.flutter.plugins.androidintentexample; - -import io.flutter.embedding.android.FlutterActivity; -import io.flutter.embedding.engine.FlutterEngine; -import io.flutter.plugins.androidintent.AndroidIntentPlugin; - -public class MainActivity extends FlutterActivity { - @Override - public void configureFlutterEngine(FlutterEngine flutterEngine) { - flutterEngine.getPlugins().add(new AndroidIntentPlugin()); - } -} diff --git a/packages/android_intent/example/pubspec.yaml b/packages/android_intent/example/pubspec.yaml index 4418e9fb82c6..22ff833f8198 100644 --- a/packages/android_intent/example/pubspec.yaml +++ b/packages/android_intent/example/pubspec.yaml @@ -16,6 +16,3 @@ dev_dependencies: # The following section is specific to Flutter. flutter: uses-material-design: true - -environment: - flutter: ">=1.9.1+hotfix.2 <2.0.0" \ No newline at end of file diff --git a/packages/android_intent/lib/android_intent.dart b/packages/android_intent/lib/android_intent.dart index eb2f486408cc..ff95299a93fd 100644 --- a/packages/android_intent/lib/android_intent.dart +++ b/packages/android_intent/lib/android_intent.dart @@ -29,7 +29,7 @@ class AndroidIntent { /// If not null, then [package] but also be provided. /// [type] refers to the type of the intent, can be null. const AndroidIntent({ - @required this.action, + this.action, this.flags, this.category, this.data, @@ -38,7 +38,8 @@ class AndroidIntent { this.componentName, Platform platform, this.type, - }) : assert(action != null), + }) : assert(action != null || componentName != null, + 'action or component (or both) must be specified'), _channel = const MethodChannel(_kChannelName), _platform = platform ?? const LocalPlatform(); @@ -46,9 +47,9 @@ class AndroidIntent { /// app code, it may break without warning. @visibleForTesting AndroidIntent.private({ - @required this.action, @required Platform platform, @required MethodChannel channel, + this.action, this.flags, this.category, this.data, @@ -56,7 +57,9 @@ class AndroidIntent { this.package, this.componentName, this.type, - }) : _channel = channel, + }) : assert(action != null || componentName != null, + 'action or component (or both) must be specified'), + _channel = channel, _platform = platform; /// This is the general verb that the intent should attempt to do. This @@ -131,28 +134,23 @@ class AndroidIntent { if (!_platform.isAndroid) { return; } - final Map args = {'action': action}; - if (flags != null) { - args['flags'] = convertFlags(flags); - } - if (category != null) { - args['category'] = category; - } - if (data != null) { - args['data'] = data; - } - if (arguments != null) { - args['arguments'] = arguments; - } - if (package != null) { - args['package'] = package; - if (componentName != null) { - args['componentName'] = componentName; - } - } - if (type != null) { - args['type'] = type; - } - await _channel.invokeMethod('launch', args); + + await _channel.invokeMethod('launch', _buildArguments()); + } + + /// Constructs the map of arguments which is passed to the plugin. + Map _buildArguments() { + return { + if (action != null) 'action': action, + if (flags != null) 'flags': convertFlags(flags), + if (category != null) 'category': category, + if (data != null) 'data': data, + if (arguments != null) 'arguments': arguments, + if (package != null) ...{ + 'package': package, + if (componentName != null) 'componentName': componentName, + }, + if (type != null) 'type': type, + }; } } diff --git a/packages/android_intent/pubspec.yaml b/packages/android_intent/pubspec.yaml index c6e38bc0d93b..82f6e187ace5 100644 --- a/packages/android_intent/pubspec.yaml +++ b/packages/android_intent/pubspec.yaml @@ -1,7 +1,7 @@ name: android_intent description: Flutter plugin for launching Android Intents. Not supported on iOS. homepage: https://github.com/flutter/plugins/tree/master/packages/android_intent -version: 0.3.5+1 +version: 0.3.6+1 flutter: plugin: @@ -23,5 +23,5 @@ dev_dependencies: pedantic: ^1.8.0 environment: - sdk: ">=2.0.0-dev.28.0 <3.0.0" - flutter: ">=1.10.0 <2.0.0" + sdk: ">=2.3.0 <3.0.0" + flutter: ">=1.12.13+hotfix.5 <2.0.0" \ No newline at end of file diff --git a/packages/android_intent/test/android_intent_test.dart b/packages/android_intent/test/android_intent_test.dart index e36a8b7827c9..60cf3b58a507 100644 --- a/packages/android_intent/test/android_intent_test.dart +++ b/packages/android_intent/test/android_intent_test.dart @@ -15,6 +15,7 @@ void main() { setUp(() { mockChannel = MockMethodChannel(); }); + group('AndroidIntent', () { test('pass right params', () async { androidIntent = AndroidIntent.private( @@ -32,26 +33,53 @@ void main() { 'type': 'video/*', })); }); - test('pass null value to action param', () async { + + test('raises error if neither an action nor a component is provided', () { + try { + androidIntent = AndroidIntent(data: 'https://flutter.io'); + fail('should raise an AssertionError'); + } on AssertionError catch (e) { + expect(e.message, 'action or component (or both) must be specified'); + } catch (e) { + fail('should raise an AssertionError'); + } + }); + test('can send Intent with an action and no component', () async { androidIntent = AndroidIntent.private( - action: null, - channel: mockChannel, - platform: FakePlatform(operatingSystem: 'android')); + action: 'action_view', + channel: mockChannel, + platform: FakePlatform(operatingSystem: 'android'), + ); await androidIntent.launch(); verify(mockChannel.invokeMethod('launch', { - 'action': null, + 'action': 'action_view', + })); + }); + + test('can send Intent with a component and no action', () async { + androidIntent = AndroidIntent.private( + package: 'packageName', + componentName: 'componentName', + channel: mockChannel, + platform: FakePlatform(operatingSystem: 'android'), + ); + await androidIntent.launch(); + verify(mockChannel.invokeMethod('launch', { + 'package': 'packageName', + 'componentName': 'componentName', })); }); test('call in ios platform', () async { androidIntent = AndroidIntent.private( - action: null, + action: 'action_view', channel: mockChannel, platform: FakePlatform(operatingSystem: 'ios')); await androidIntent.launch(); verifyZeroInteractions(mockChannel); }); }); + group('convertFlags ', () { androidIntent = const AndroidIntent( action: 'action_view', diff --git a/packages/connectivity/connectivity/CHANGELOG.md b/packages/connectivity/connectivity/CHANGELOG.md index b297f38f275e..c62abb4fa591 100644 --- a/packages/connectivity/connectivity/CHANGELOG.md +++ b/packages/connectivity/connectivity/CHANGELOG.md @@ -1,3 +1,7 @@ +## 0.4.8+2 + +* Remove hard coded ios workspace setting of the example app. + ## 0.4.8+1 * Make the pedantic dev_dependency explicit. diff --git a/packages/connectivity/connectivity/pubspec.yaml b/packages/connectivity/connectivity/pubspec.yaml index ce90f75719fe..73cfc2a277e0 100644 --- a/packages/connectivity/connectivity/pubspec.yaml +++ b/packages/connectivity/connectivity/pubspec.yaml @@ -2,7 +2,7 @@ name: connectivity description: Flutter plugin for discovering the state of the network (WiFi & mobile/cellular) connectivity on Android and iOS. homepage: https://github.com/flutter/plugins/tree/master/packages/connectivity/connectivity -version: 0.4.8+1 +version: 0.4.8+2 flutter: plugin: diff --git a/packages/connectivity/connectivity_macos/CHANGELOG.md b/packages/connectivity/connectivity_macos/CHANGELOG.md index 43db2ff8b8bd..1d4bfd607d33 100644 --- a/packages/connectivity/connectivity_macos/CHANGELOG.md +++ b/packages/connectivity/connectivity_macos/CHANGELOG.md @@ -1,3 +1,7 @@ +## 0.1.0+2 + +* Remove hard coded ios workspace setting of the example app. + ## 0.1.0+1 * Make the pedantic dev_dependency explicit. diff --git a/packages/connectivity/connectivity_macos/pubspec.yaml b/packages/connectivity/connectivity_macos/pubspec.yaml index 70ba24793782..64e4846c5f4d 100644 --- a/packages/connectivity/connectivity_macos/pubspec.yaml +++ b/packages/connectivity/connectivity_macos/pubspec.yaml @@ -1,6 +1,6 @@ name: connectivity_macos description: macOS implementation of the connectivity plugin. -version: 0.1.0+1 +version: 0.1.0+2 homepage: https://github.com/flutter/plugins/tree/master/packages/connectivity/connectivity_macos flutter: diff --git a/packages/device_info/CHANGELOG.md b/packages/device_info/CHANGELOG.md index 00dcd2988bba..c6f8fb2d2616 100644 --- a/packages/device_info/CHANGELOG.md +++ b/packages/device_info/CHANGELOG.md @@ -1,3 +1,14 @@ +## 0.4.2+1 + +* Bump the minimum Flutter version to 1.12.13+hotfix.5. +* Remove deprecated API usage warning in AndroidIntentPlugin.java. +* Migrates the Android example to V2 embedding. +* Bumps AGP to 3.6.1. + +## 0.4.2 + +* Add systemFeatures to AndroidDeviceInfo. + ## 0.4.1+5 * Make the pedantic dev_dependency explicit. diff --git a/packages/device_info/android/build.gradle b/packages/device_info/android/build.gradle index d1dd790732f1..58bdfd327631 100644 --- a/packages/device_info/android/build.gradle +++ b/packages/device_info/android/build.gradle @@ -8,7 +8,7 @@ buildscript { } dependencies { - classpath 'com.android.tools.build:gradle:3.3.0' + classpath 'com.android.tools.build:gradle:3.6.1' } } @@ -32,29 +32,3 @@ android { disable 'InvalidPackage' } } - -// TODO(cyanglaz): Remove this hack once androidx.lifecycle is included on stable. https://github.com/flutter/flutter/issues/42348 -afterEvaluate { - def containsEmbeddingDependencies = false - for (def configuration : configurations.all) { - for (def dependency : configuration.dependencies) { - if (dependency.group == 'io.flutter' && - dependency.name.startsWith('flutter_embedding') && - dependency.isTransitive()) - { - containsEmbeddingDependencies = true - break - } - } - } - if (!containsEmbeddingDependencies) { - android { - dependencies { - def lifecycle_version = "1.1.1" - compileOnly "android.arch.lifecycle:runtime:$lifecycle_version" - compileOnly "android.arch.lifecycle:common:$lifecycle_version" - compileOnly "android.arch.lifecycle:common-java8:$lifecycle_version" - } - } - } -} diff --git a/packages/device_info/android/src/main/java/io/flutter/plugins/deviceinfo/DeviceInfoPlugin.java b/packages/device_info/android/src/main/java/io/flutter/plugins/deviceinfo/DeviceInfoPlugin.java index 8ad0f5db1851..8061959c2047 100644 --- a/packages/device_info/android/src/main/java/io/flutter/plugins/deviceinfo/DeviceInfoPlugin.java +++ b/packages/device_info/android/src/main/java/io/flutter/plugins/deviceinfo/DeviceInfoPlugin.java @@ -4,7 +4,7 @@ package io.flutter.plugins.deviceinfo; -import android.content.ContentResolver; +import android.content.Context; import io.flutter.embedding.engine.plugins.FlutterPlugin; import io.flutter.plugin.common.BinaryMessenger; import io.flutter.plugin.common.MethodChannel; @@ -18,14 +18,12 @@ public class DeviceInfoPlugin implements FlutterPlugin { /** Plugin registration. */ public static void registerWith(Registrar registrar) { DeviceInfoPlugin plugin = new DeviceInfoPlugin(); - plugin.setupMethodChannel(registrar.messenger(), registrar.context().getContentResolver()); + plugin.setupMethodChannel(registrar.messenger(), registrar.context()); } @Override public void onAttachedToEngine(FlutterPlugin.FlutterPluginBinding binding) { - setupMethodChannel( - binding.getFlutterEngine().getDartExecutor(), - binding.getApplicationContext().getContentResolver()); + setupMethodChannel(binding.getBinaryMessenger(), binding.getApplicationContext()); } @Override @@ -33,9 +31,10 @@ public void onDetachedFromEngine(FlutterPlugin.FlutterPluginBinding binding) { tearDownChannel(); } - private void setupMethodChannel(BinaryMessenger messenger, ContentResolver contentResolver) { + private void setupMethodChannel(BinaryMessenger messenger, Context context) { channel = new MethodChannel(messenger, "plugins.flutter.io/device_info"); - final MethodCallHandlerImpl handler = new MethodCallHandlerImpl(contentResolver); + final MethodCallHandlerImpl handler = + new MethodCallHandlerImpl(context.getContentResolver(), context.getPackageManager()); channel.setMethodCallHandler(handler); } diff --git a/packages/device_info/android/src/main/java/io/flutter/plugins/deviceinfo/MethodCallHandlerImpl.java b/packages/device_info/android/src/main/java/io/flutter/plugins/deviceinfo/MethodCallHandlerImpl.java index 22ea1f0ec85e..800ca6dcddb7 100644 --- a/packages/device_info/android/src/main/java/io/flutter/plugins/deviceinfo/MethodCallHandlerImpl.java +++ b/packages/device_info/android/src/main/java/io/flutter/plugins/deviceinfo/MethodCallHandlerImpl.java @@ -6,6 +6,8 @@ import android.annotation.SuppressLint; import android.content.ContentResolver; +import android.content.pm.FeatureInfo; +import android.content.pm.PackageManager; import android.os.Build; import android.provider.Settings; import io.flutter.plugin.common.MethodCall; @@ -20,14 +22,16 @@ */ class MethodCallHandlerImpl implements MethodChannel.MethodCallHandler { - private ContentResolver contentResolver; + private final ContentResolver contentResolver; + private final PackageManager packageManager; /** Substitute for missing values. */ private static final String[] EMPTY_STRING_LIST = new String[] {}; - /** Constructs DeviceInfo. The {@code contentResolver} must not be null. */ - MethodCallHandlerImpl(ContentResolver contentResolver) { + /** Constructs DeviceInfo. {@code contentResolver} and {@code packageManager} must not be null. */ + MethodCallHandlerImpl(ContentResolver contentResolver, PackageManager packageManager) { this.contentResolver = contentResolver; + this.packageManager = packageManager; } @Override @@ -60,6 +64,8 @@ public void onMethodCall(MethodCall call, MethodChannel.Result result) { build.put("isPhysicalDevice", !isEmulator()); build.put("androidId", getAndroidId()); + build.put("systemFeatures", Arrays.asList(getSystemFeatures())); + Map version = new HashMap<>(); if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { version.put("baseOS", Build.VERSION.BASE_OS); @@ -78,6 +84,18 @@ public void onMethodCall(MethodCall call, MethodChannel.Result result) { } } + private String[] getSystemFeatures() { + FeatureInfo[] featureInfos = packageManager.getSystemAvailableFeatures(); + if (featureInfos == null) { + return EMPTY_STRING_LIST; + } + String[] features = new String[featureInfos.length]; + for (int i = 0; i < featureInfos.length; i++) { + features[i] = featureInfos[i].name; + } + return features; + } + /** * Returns the Android hardware device ID that is unique between the device + user and app * signing. This key will change if the app is uninstalled or its data is cleared. Device factory diff --git a/packages/device_info/example/android/app/src/main/AndroidManifest.xml b/packages/device_info/example/android/app/src/main/AndroidManifest.xml index 45242ab08b69..f9f91fa39dae 100644 --- a/packages/device_info/example/android/app/src/main/AndroidManifest.xml +++ b/packages/device_info/example/android/app/src/main/AndroidManifest.xml @@ -12,15 +12,20 @@ android:exported="true" android:windowSoftInputMode="adjustResize"> - - - - - - + + + + + + + + + diff --git a/packages/device_info/example/android/app/src/main/java/io/flutter/plugins/deviceinfoexample/EmbeddingV1Activity.java b/packages/device_info/example/android/app/src/main/java/io/flutter/plugins/deviceinfoexample/EmbeddingV1Activity.java index 0bfaee848dbf..48678a7e6ad1 100644 --- a/packages/device_info/example/android/app/src/main/java/io/flutter/plugins/deviceinfoexample/EmbeddingV1Activity.java +++ b/packages/device_info/example/android/app/src/main/java/io/flutter/plugins/deviceinfoexample/EmbeddingV1Activity.java @@ -6,12 +6,12 @@ import android.os.Bundle; import io.flutter.app.FlutterActivity; -import io.flutter.plugins.GeneratedPluginRegistrant; +import io.flutter.plugins.deviceinfo.DeviceInfoPlugin; public class EmbeddingV1Activity extends FlutterActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); - GeneratedPluginRegistrant.registerWith(this); + DeviceInfoPlugin.registerWith(registrarFor("io.flutter.plugins.deviceinfo.DeviceInfoPlugin")); } } diff --git a/packages/device_info/example/android/app/src/main/java/io/flutter/plugins/deviceinfoexample/MainActivity.java b/packages/device_info/example/android/app/src/main/java/io/flutter/plugins/deviceinfoexample/MainActivity.java deleted file mode 100644 index b820542706e0..000000000000 --- a/packages/device_info/example/android/app/src/main/java/io/flutter/plugins/deviceinfoexample/MainActivity.java +++ /dev/null @@ -1,20 +0,0 @@ -// Copyright 2019 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -package io.flutter.plugins.deviceinfoexample; - -import io.flutter.embedding.android.FlutterActivity; -import io.flutter.embedding.engine.FlutterEngine; -import io.flutter.plugins.deviceinfo.DeviceInfoPlugin; - -public class MainActivity extends FlutterActivity { - - // TODO(cyanglaz): Remove this once v2 of GeneratedPluginRegistrant rolls to stable. - // https://github.com/flutter/flutter/issues/42694 - @Override - public void configureFlutterEngine(FlutterEngine flutterEngine) { - super.configureFlutterEngine(flutterEngine); - flutterEngine.getPlugins().add(new DeviceInfoPlugin()); - } -} diff --git a/packages/device_info/example/android/build.gradle b/packages/device_info/example/android/build.gradle index 541636cc492a..83f114c21e31 100644 --- a/packages/device_info/example/android/build.gradle +++ b/packages/device_info/example/android/build.gradle @@ -5,7 +5,7 @@ buildscript { } dependencies { - classpath 'com.android.tools.build:gradle:3.3.0' + classpath 'com.android.tools.build:gradle:3.6.1' } } diff --git a/packages/device_info/example/android/gradle/wrapper/gradle-wrapper.properties b/packages/device_info/example/android/gradle/wrapper/gradle-wrapper.properties index 2819f022f1fd..c243e25a0fff 100644 --- a/packages/device_info/example/android/gradle/wrapper/gradle-wrapper.properties +++ b/packages/device_info/example/android/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,6 @@ -#Fri Jun 23 08:50:38 CEST 2017 +#Mon Mar 09 11:05:13 GMT 2020 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-5.6.4-all.zip diff --git a/packages/device_info/example/lib/main.dart b/packages/device_info/example/lib/main.dart index 528604b661b0..1c1064aa09ee 100644 --- a/packages/device_info/example/lib/main.dart +++ b/packages/device_info/example/lib/main.dart @@ -85,6 +85,7 @@ class _MyAppState extends State { 'type': build.type, 'isPhysicalDevice': build.isPhysicalDevice, 'androidId': build.androidId, + 'systemFeatures': build.systemFeatures, }; } @@ -114,7 +115,6 @@ class _MyAppState extends State { Platform.isAndroid ? 'Android Device Info' : 'iOS Device Info'), ), body: ListView( - shrinkWrap: true, children: _deviceData.keys.map((String property) { return Row( children: [ @@ -132,6 +132,7 @@ class _MyAppState extends State { padding: const EdgeInsets.fromLTRB(0.0, 10.0, 0.0, 10.0), child: Text( '${_deviceData[property]}', + maxLines: 10, overflow: TextOverflow.ellipsis, ), )), diff --git a/packages/device_info/example/pubspec.yaml b/packages/device_info/example/pubspec.yaml index 89bf430d971c..dc63d8b66126 100644 --- a/packages/device_info/example/pubspec.yaml +++ b/packages/device_info/example/pubspec.yaml @@ -15,8 +15,3 @@ dev_dependencies: flutter: uses-material-design: true - -environment: - sdk: ">=2.0.0-dev.28.0 <3.0.0" - flutter: ">=1.9.1+hotfix.2 <2.0.0" - diff --git a/packages/device_info/lib/device_info.dart b/packages/device_info/lib/device_info.dart index e775227d96d1..25b7d46cdb11 100644 --- a/packages/device_info/lib/device_info.dart +++ b/packages/device_info/lib/device_info.dart @@ -62,9 +62,11 @@ class AndroidDeviceInfo { this.type, this.isPhysicalDevice, this.androidId, + List systemFeatures, }) : supported32BitAbis = List.unmodifiable(supported32BitAbis), supported64BitAbis = List.unmodifiable(supported64BitAbis), - supportedAbis = List.unmodifiable(supportedAbis); + supportedAbis = List.unmodifiable(supportedAbis), + systemFeatures = List.unmodifiable(systemFeatures); /// Android operating system version values derived from `android.os.Build.VERSION`. final AndroidBuildVersion version; @@ -126,6 +128,22 @@ class AndroidDeviceInfo { /// The Android hardware device ID that is unique between the device + user and app signing. final String androidId; + /// Describes what features are available on the current device. + /// + /// This can be used to check if the device has, for example, a front-facing + /// camera, or a touchscreen. However, in many cases this is not the best + /// API to use. For example, if you are interested in bluetooth, this API + /// can tell you if the device has a bluetooth radio, but it cannot tell you + /// if bluetooth is currently enabled, or if you have been granted the + /// necessary permissions to use it. Please *only* use this if there is no + /// other way to determine if a feature is supported. + /// + /// This data comes from Android's PackageManager.getSystemAvailableFeatures, + /// and many of the common feature strings to look for are available in + /// PackageManager's public documentation: + /// https://developer.android.com/reference/android/content/pm/PackageManager + final List systemFeatures; + /// Deserializes from the message received from [_kChannel]. static AndroidDeviceInfo _fromMap(Map map) { return AndroidDeviceInfo._( @@ -150,6 +168,7 @@ class AndroidDeviceInfo { type: map['type'], isPhysicalDevice: map['isPhysicalDevice'], androidId: map['androidId'], + systemFeatures: _fromList(map['systemFeatures']), ); } diff --git a/packages/device_info/pubspec.yaml b/packages/device_info/pubspec.yaml index b862a7de4452..0769f98c83c3 100644 --- a/packages/device_info/pubspec.yaml +++ b/packages/device_info/pubspec.yaml @@ -2,7 +2,7 @@ name: device_info description: Flutter plugin providing detailed information about the device (make, model, etc.), and Android or iOS version the app is running on. homepage: https://github.com/flutter/plugins/tree/master/packages/device_info -version: 0.4.1+5 +version: 0.4.2+1 flutter: plugin: @@ -26,4 +26,4 @@ dev_dependencies: environment: sdk: ">=2.0.0-dev.28.0 <3.0.0" - flutter: ">=1.10.0 <2.0.0" + flutter: ">=1.12.13+hotfix.5 <2.0.0" diff --git a/packages/e2e/CHANGELOG.md b/packages/e2e/CHANGELOG.md index 442b1db121f9..ab17150d7448 100644 --- a/packages/e2e/CHANGELOG.md +++ b/packages/e2e/CHANGELOG.md @@ -1,3 +1,17 @@ +## 0.3.0 + +* Updates documentation to instruct developers not to launch the activity since + we are doing it for them. +* Renames `FlutterRunner` to `FlutterTestRunner` to avoid conflict with Fuchsia. + +## 0.2.4+4 + +* Fixed a hang that occurred on platforms that don't have a `MethodChannel` listener registered.. + +## 0.2.4+3 + +* Fixed code snippet in the readme under the "Using Flutter driver to run tests" section. + ## 0.2.4+2 * Make the pedantic dev_dependency explicit. diff --git a/packages/e2e/README.md b/packages/e2e/README.md index b3c19ec40027..7d571a522057 100644 --- a/packages/e2e/README.md +++ b/packages/e2e/README.md @@ -41,12 +41,15 @@ Note that the tests don't use the `FlutterDriver` API, they use `testWidgets` in Put the a file named `_e2e_test.dart` in the app' `test_driver` directory: -``` +```dart +import 'dart:async'; +import 'dart:io'; import 'package:flutter_driver/flutter_driver.dart'; Future main() async { final FlutterDriver driver = await FlutterDriver.connect(); - await driver.requestData(null, timeout: const Duration(minutes: 1)); + final String result = + await driver.requestData(null, timeout: const Duration(minutes: 1)); await driver.close(); exit(result == 'pass' ? 0 : 1); } @@ -66,6 +69,15 @@ cd example flutter drive --driver=test_driver/_test.dart test/_e2e.dart ``` +You can run tests on web on release mode. + +First you need to make sure you have downloaded the driver for the browser. + +``` +cd example +flutter drive -v --target=test_driver/dart -d web-server --release --browser-name=chrome +``` + ## Android device testing Create an instrumentation test file in your application's @@ -73,7 +85,7 @@ Create an instrumentation test file in your application's com, example, and myapp with values from your app's package name). You can name this test file MainActivityTest.java or another name of your choice. -``` +```java package com.example.myapp; import androidx.test.rule.ActivityTestRule; @@ -81,10 +93,10 @@ import dev.flutter.plugins.e2e.FlutterRunner; import org.junit.Rule; import org.junit.runner.RunWith; -@RunWith(FlutterRunner.class) +@RunWith(FlutterTestRunner.class) public class MainActivityTest { @Rule - public ActivityTestRule rule = new ActivityTestRule<>(MainActivity.class); + public ActivityTestRule rule = new ActivityTestRule<>(MainActivity.class, true, false); } ``` diff --git a/packages/e2e/android/src/main/java/dev/flutter/plugins/e2e/FlutterRunner.java b/packages/e2e/android/src/main/java/dev/flutter/plugins/e2e/FlutterTestRunner.java similarity index 74% rename from packages/e2e/android/src/main/java/dev/flutter/plugins/e2e/FlutterRunner.java rename to packages/e2e/android/src/main/java/dev/flutter/plugins/e2e/FlutterTestRunner.java index 31f3e8431cad..f214cd7ce3fe 100644 --- a/packages/e2e/android/src/main/java/dev/flutter/plugins/e2e/FlutterRunner.java +++ b/packages/e2e/android/src/main/java/dev/flutter/plugins/e2e/FlutterTestRunner.java @@ -5,6 +5,7 @@ package dev.flutter.plugins.e2e; import android.app.Activity; +import android.util.Log; import androidx.test.rule.ActivityTestRule; import java.lang.reflect.Field; import java.util.Map; @@ -15,11 +16,13 @@ import org.junit.runner.notification.Failure; import org.junit.runner.notification.RunNotifier; -public class FlutterRunner extends Runner { +public class FlutterTestRunner extends Runner { + private static final String TAG = "FlutterTestRunner"; final Class testClass; + ActivityTestRule rule = null; - public FlutterRunner(Class testClass) { + public FlutterTestRunner(Class testClass) { super(); this.testClass = testClass; @@ -29,8 +32,7 @@ public FlutterRunner(Class testClass) { if (field.isAnnotationPresent(Rule.class)) { try { Object instance = testClass.newInstance(); - ActivityTestRule rule = (ActivityTestRule) field.get(instance); - rule.launchActivity(null); + rule = (ActivityTestRule) field.get(instance); } catch (InstantiationException | IllegalAccessException e) { // This might occur if the developer did not make the rule public. // We could call field.setAccessible(true) but it seems better to throw. @@ -47,6 +49,17 @@ public Description getDescription() { @Override public void run(RunNotifier notifier) { + if (rule == null) { + throw new RuntimeException("Unable to run tests due to missing activity rule"); + } + try { + rule.launchActivity(null); + } catch (RuntimeException e) { + Log.v(TAG, "launchActivity failed, possibly because the activity was already running. " + e); + Log.v( + TAG, + "Try disabling auto-launch of the activity, e.g. ActivityTestRule<>(MainActivity.class, true, false);"); + } Map results = null; try { results = E2EPlugin.testResults.get(); diff --git a/packages/e2e/example/android/app/src/androidTest/java/com/example/e2e_example/EmbedderV1ActivityTest.java b/packages/e2e/example/android/app/src/androidTest/java/com/example/e2e_example/EmbedderV1ActivityTest.java index a526c1c8422e..eedde293eb6c 100644 --- a/packages/e2e/example/android/app/src/androidTest/java/com/example/e2e_example/EmbedderV1ActivityTest.java +++ b/packages/e2e/example/android/app/src/androidTest/java/com/example/e2e_example/EmbedderV1ActivityTest.java @@ -1,13 +1,13 @@ package com.example.e2e_example; import androidx.test.rule.ActivityTestRule; -import dev.flutter.plugins.e2e.FlutterRunner; +import dev.flutter.plugins.e2e.FlutterTestRunner; import org.junit.Rule; import org.junit.runner.RunWith; -@RunWith(FlutterRunner.class) +@RunWith(FlutterTestRunner.class) public class EmbedderV1ActivityTest { @Rule public ActivityTestRule rule = - new ActivityTestRule<>(EmbedderV1Activity.class); + new ActivityTestRule<>(EmbedderV1Activity.class, true, false); } diff --git a/packages/e2e/example/android/app/src/androidTest/java/com/example/e2e_example/MainActivityTest.java b/packages/e2e/example/android/app/src/androidTest/java/com/example/e2e_example/MainActivityTest.java index b61c056e176d..93b1f923ee05 100644 --- a/packages/e2e/example/android/app/src/androidTest/java/com/example/e2e_example/MainActivityTest.java +++ b/packages/e2e/example/android/app/src/androidTest/java/com/example/e2e_example/MainActivityTest.java @@ -1,11 +1,13 @@ package com.example.e2e_example; import androidx.test.rule.ActivityTestRule; -import dev.flutter.plugins.e2e.FlutterRunner; +import dev.flutter.plugins.e2e.FlutterTestRunner; import org.junit.Rule; import org.junit.runner.RunWith; -@RunWith(FlutterRunner.class) +@RunWith(FlutterTestRunner.class) public class MainActivityTest { - @Rule public ActivityTestRule rule = new ActivityTestRule<>(MainActivity.class); + @Rule + public ActivityTestRule rule = + new ActivityTestRule<>(MainActivity.class, true, false); } diff --git a/packages/e2e/example/lib/main.dart b/packages/e2e/example/lib/main.dart index 2509fb390ff4..1f33324acd01 100644 --- a/packages/e2e/example/lib/main.dart +++ b/packages/e2e/example/lib/main.dart @@ -1,27 +1,5 @@ -import 'dart:io' show Platform; -import 'package:flutter/material.dart'; +import 'my_app.dart' if (dart.library.html) 'my_web_app.dart'; // ignore_for_file: public_member_api_docs -void main() => runApp(MyApp()); - -class MyApp extends StatefulWidget { - @override - _MyAppState createState() => _MyAppState(); -} - -class _MyAppState extends State { - @override - Widget build(BuildContext context) { - return MaterialApp( - home: Scaffold( - appBar: AppBar( - title: const Text('Plugin example app'), - ), - body: Center( - child: Text('Platform: ${Platform.operatingSystem}\n'), - ), - ), - ); - } -} +void main() => startApp(); diff --git a/packages/e2e/example/lib/my_app.dart b/packages/e2e/example/lib/my_app.dart new file mode 100644 index 000000000000..bfbdb860c76d --- /dev/null +++ b/packages/e2e/example/lib/my_app.dart @@ -0,0 +1,27 @@ +import 'dart:io' show Platform; +import 'package:flutter/material.dart'; + +// ignore_for_file: public_member_api_docs + +void startApp() => runApp(MyApp()); + +class MyApp extends StatefulWidget { + @override + _MyAppState createState() => _MyAppState(); +} + +class _MyAppState extends State { + @override + Widget build(BuildContext context) { + return MaterialApp( + home: Scaffold( + appBar: AppBar( + title: const Text('Plugin example app'), + ), + body: Center( + child: Text('Platform: ${Platform.operatingSystem}\n'), + ), + ), + ); + } +} diff --git a/packages/e2e/example/lib/my_web_app.dart b/packages/e2e/example/lib/my_web_app.dart new file mode 100644 index 000000000000..c2ced1af97ae --- /dev/null +++ b/packages/e2e/example/lib/my_web_app.dart @@ -0,0 +1,28 @@ +import 'dart:html' as html; +import 'package:flutter/material.dart'; + +// ignore_for_file: public_member_api_docs + +void startApp() => runApp(MyWebApp()); + +class MyWebApp extends StatefulWidget { + @override + _MyWebAppState createState() => _MyWebAppState(); +} + +class _MyWebAppState extends State { + @override + Widget build(BuildContext context) { + return MaterialApp( + home: Scaffold( + appBar: AppBar( + title: const Text('Plugin example app'), + ), + body: Center( + key: Key('mainapp'), + child: Text('Platform: ${html.window.navigator.platform}\n'), + ), + ), + ); + } +} diff --git a/packages/e2e/example/test_driver/example_e2e.dart b/packages/e2e/example/test_driver/example_e2e.dart index e91dd4d0ce9f..d97702d5d7cf 100644 --- a/packages/e2e/example/test_driver/example_e2e.dart +++ b/packages/e2e/example/test_driver/example_e2e.dart @@ -5,27 +5,12 @@ // 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 'dart:io' show Platform; -import 'package:flutter/material.dart'; -import 'package:flutter_test/flutter_test.dart'; import 'package:e2e/e2e.dart'; -import 'package:e2e_example/main.dart'; +import 'example_e2e_io.dart' if (dart.library.html) 'example_e2e_web.dart' + as tests; void main() { E2EWidgetsFlutterBinding.ensureInitialized(); - testWidgets('verify text', (WidgetTester tester) async { - // Build our app and trigger a frame. - await tester.pumpWidget(MyApp()); - - // Verify that platform version is retrieved. - expect( - find.byWidgetPredicate( - (Widget widget) => - widget is Text && - widget.data.startsWith('Platform: ${Platform.operatingSystem}'), - ), - findsOneWidget, - ); - }); + tests.main(); } diff --git a/packages/e2e/example/test_driver/example_e2e_io.dart b/packages/e2e/example/test_driver/example_e2e_io.dart new file mode 100644 index 000000000000..9766f568b654 --- /dev/null +++ b/packages/e2e/example/test_driver/example_e2e_io.dart @@ -0,0 +1,34 @@ +// 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 'dart:io' show Platform; +import 'package:flutter/material.dart'; +import 'package:flutter_test/flutter_test.dart'; +import 'package:e2e/e2e.dart'; + +import 'package:e2e_example/main.dart' as app; + +void main() { + E2EWidgetsFlutterBinding.ensureInitialized(); + testWidgets('verify text', (WidgetTester tester) async { + // Build our app and trigger a frame. + app.main(); + + // Trigger a frame. + await tester.pumpAndSettle(); + + // Verify that platform version is retrieved. + expect( + find.byWidgetPredicate( + (Widget widget) => + widget is Text && + widget.data.startsWith('Platform: ${Platform.operatingSystem}'), + ), + findsOneWidget, + ); + }); +} diff --git a/packages/e2e/example/test_driver/example_e2e_web.dart b/packages/e2e/example/test_driver/example_e2e_web.dart new file mode 100644 index 000000000000..24c3f2cbb2a4 --- /dev/null +++ b/packages/e2e/example/test_driver/example_e2e_web.dart @@ -0,0 +1,35 @@ +// 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 'dart:html' as html; +import 'package:flutter/material.dart'; +import 'package:flutter_test/flutter_test.dart'; +import 'package:e2e/e2e.dart'; + +import 'package:e2e_example/main.dart' as app; + +void main() { + E2EWidgetsFlutterBinding.ensureInitialized(); + testWidgets('verify text', (WidgetTester tester) async { + // Build our app and trigger a frame. + app.main(); + + // Trigger a frame. + await tester.pumpAndSettle(); + + // Verify that platform is retrieved. + expect( + find.byWidgetPredicate( + (Widget widget) => + widget is Text && + widget.data + .startsWith('Platform: ${html.window.navigator.platform}\n'), + ), + findsOneWidget, + ); + }); +} diff --git a/packages/e2e/example/test_driver/failure.dart b/packages/e2e/example/test_driver/failure.dart index 64d83bf5c13b..ddeeb800bb06 100644 --- a/packages/e2e/example/test_driver/failure.dart +++ b/packages/e2e/example/test_driver/failure.dart @@ -6,7 +6,7 @@ import 'package:flutter/material.dart'; import 'package:flutter_test/flutter_test.dart'; import 'package:e2e/e2e.dart'; -import 'package:e2e_example/main.dart'; +import 'package:e2e_example/main.dart' as app; // Tests the failure behavior of the E2EWidgetsFlutterBinding // @@ -21,10 +21,10 @@ void main() { testWidgets('failure 1', (WidgetTester tester) async { // Build our app and trigger a frame. - await tester.pumpWidget(MyApp()); + app.main(); // Verify that platform version is retrieved. - expect( + await expectLater( find.byWidgetPredicate( (Widget widget) => widget is Text && widget.data.startsWith('This should fail'), diff --git a/packages/e2e/example/web/favicon.png b/packages/e2e/example/web/favicon.png new file mode 100644 index 000000000000..8aaa46ac1ae2 Binary files /dev/null and b/packages/e2e/example/web/favicon.png differ diff --git a/packages/e2e/example/web/icons/Icon-192.png b/packages/e2e/example/web/icons/Icon-192.png new file mode 100644 index 000000000000..b749bfef0747 Binary files /dev/null and b/packages/e2e/example/web/icons/Icon-192.png differ diff --git a/packages/e2e/example/web/icons/Icon-512.png b/packages/e2e/example/web/icons/Icon-512.png new file mode 100644 index 000000000000..88cfd48dff11 Binary files /dev/null and b/packages/e2e/example/web/icons/Icon-512.png differ diff --git a/packages/e2e/example/web/index.html b/packages/e2e/example/web/index.html new file mode 100644 index 000000000000..96629657328f --- /dev/null +++ b/packages/e2e/example/web/index.html @@ -0,0 +1,33 @@ + + + + + + + + + + + + + + + + + example + + + + + + + + diff --git a/packages/e2e/example/web/manifest.json b/packages/e2e/example/web/manifest.json new file mode 100644 index 000000000000..c63800102369 --- /dev/null +++ b/packages/e2e/example/web/manifest.json @@ -0,0 +1,23 @@ +{ + "name": "example", + "short_name": "example", + "start_url": ".", + "display": "minimal-ui", + "background_color": "#0175C2", + "theme_color": "#0175C2", + "description": "A new Flutter project.", + "orientation": "portrait-primary", + "prefer_related_applications": false, + "icons": [ + { + "src": "icons/Icon-192.png", + "sizes": "192x192", + "type": "image/png" + }, + { + "src": "icons/Icon-512.png", + "sizes": "512x512", + "type": "image/png" + } + ] +} diff --git a/packages/e2e/lib/e2e.dart b/packages/e2e/lib/e2e.dart index afcbeb0d703e..eef594a6f99e 100644 --- a/packages/e2e/lib/e2e.dart +++ b/packages/e2e/lib/e2e.dart @@ -19,6 +19,12 @@ class E2EWidgetsFlutterBinding extends LiveTestWidgetsFlutterBinding { // TODO(jackson): Report test results as they arrive tearDownAll(() async { try { + // For web integration tests we are not using the + // `plugins.flutter.io/e2e`. Mark the tests as complete before invoking + // the channel. + if (kIsWeb) { + if (!_allTestsPassed.isCompleted) _allTestsPassed.complete(true); + } await _channel.invokeMethod( 'allTestsFinished', {'results': _results}); } on MissingPluginException { diff --git a/packages/e2e/pubspec.yaml b/packages/e2e/pubspec.yaml index 956f5bf0cbb7..e05bc1b560d8 100644 --- a/packages/e2e/pubspec.yaml +++ b/packages/e2e/pubspec.yaml @@ -1,6 +1,6 @@ name: e2e description: Runs tests that use the flutter_test API as integration tests. -version: 0.2.4+2 +version: 0.3.0 homepage: https://github.com/flutter/plugins/tree/master/packages/e2e environment: diff --git a/packages/espresso/CHANGELOG.md b/packages/espresso/CHANGELOG.md index 0fbb332ebcbf..7aab8f468bdc 100644 --- a/packages/espresso/CHANGELOG.md +++ b/packages/espresso/CHANGELOG.md @@ -1,3 +1,7 @@ +## 0.0.1+4 + +* Remove Swift dependency. + ## 0.0.1+3 * Make the pedantic dev_dependency explicit. diff --git a/packages/espresso/ios/Classes/SwiftEspressoPlugin.swift b/packages/espresso/ios/Classes/SwiftEspressoPlugin.swift deleted file mode 100644 index 2ff3024ce33a..000000000000 --- a/packages/espresso/ios/Classes/SwiftEspressoPlugin.swift +++ /dev/null @@ -1,14 +0,0 @@ -import Flutter -import UIKit - -public class SwiftEspressoPlugin: NSObject, FlutterPlugin { - public static func register(with registrar: FlutterPluginRegistrar) { - let channel = FlutterMethodChannel(name: "espresso", binaryMessenger: registrar.messenger()) - let instance = SwiftEspressoPlugin() - registrar.addMethodCallDelegate(instance, channel: channel) - } - - public func handle(_ call: FlutterMethodCall, result: @escaping FlutterResult) { - result("iOS " + UIDevice.current.systemVersion) - } -} diff --git a/packages/espresso/ios/espresso.podspec b/packages/espresso/ios/espresso.podspec index cd64afa1d3c5..8c35525d66cf 100644 --- a/packages/espresso/ios/espresso.podspec +++ b/packages/espresso/ios/espresso.podspec @@ -14,10 +14,10 @@ A new flutter plugin project. s.author = { 'Your Company' => 'email@example.com' } s.source = { :path => '.' } s.source_files = 'Classes/**/*' + s.public_header_files = 'Classes/**/*.h' s.dependency 'Flutter' s.platform = :ios, '8.0' # Flutter.framework does not contain a i386 slice. Only x86_64 simulators are supported. s.pod_target_xcconfig = { 'DEFINES_MODULE' => 'YES', 'VALID_ARCHS[sdk=iphonesimulator*]' => 'x86_64' } - s.swift_version = '5.0' end diff --git a/packages/espresso/pubspec.yaml b/packages/espresso/pubspec.yaml index f59b4140d676..50f613af6c84 100644 --- a/packages/espresso/pubspec.yaml +++ b/packages/espresso/pubspec.yaml @@ -1,6 +1,6 @@ name: espresso description: Java classes for testing Flutter apps using Espresso. -version: 0.0.1+3 +version: 0.0.1+4 homepage: https://github.com/flutter/plugins/espresso environment: diff --git a/packages/flutter_plugin_android_lifecycle/CHANGELOG.md b/packages/flutter_plugin_android_lifecycle/CHANGELOG.md index d8a04c731613..874eb461d943 100644 --- a/packages/flutter_plugin_android_lifecycle/CHANGELOG.md +++ b/packages/flutter_plugin_android_lifecycle/CHANGELOG.md @@ -1,3 +1,7 @@ +## 1.0.7 + +* Update Gradle version. Fixes https://github.com/flutter/flutter/issues/48724. + ## 1.0.6 * Make the pedantic dev_dependency explicit. diff --git a/packages/flutter_plugin_android_lifecycle/android/gradle/wrapper/gradle-wrapper.properties b/packages/flutter_plugin_android_lifecycle/android/gradle/wrapper/gradle-wrapper.properties index 019065d1d650..d757f3d33fcc 100644 --- a/packages/flutter_plugin_android_lifecycle/android/gradle/wrapper/gradle-wrapper.properties +++ b/packages/flutter_plugin_android_lifecycle/android/gradle/wrapper/gradle-wrapper.properties @@ -2,4 +2,4 @@ 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-5.4.1-all.zip diff --git a/packages/flutter_plugin_android_lifecycle/pubspec.yaml b/packages/flutter_plugin_android_lifecycle/pubspec.yaml index 567608c3fa04..a9191be477fa 100644 --- a/packages/flutter_plugin_android_lifecycle/pubspec.yaml +++ b/packages/flutter_plugin_android_lifecycle/pubspec.yaml @@ -1,6 +1,6 @@ name: flutter_plugin_android_lifecycle description: Flutter plugin for accessing an Android Lifecycle within other plugins. -version: 1.0.6 +version: 1.0.7 homepage: https://github.com/flutter/plugins/tree/master/packages/flutter_plugin_android_lifecycle environment: diff --git a/packages/google_sign_in/google_sign_in/CHANGELOG.md b/packages/google_sign_in/google_sign_in/CHANGELOG.md index c3dab069e738..831901e47ceb 100644 --- a/packages/google_sign_in/google_sign_in/CHANGELOG.md +++ b/packages/google_sign_in/google_sign_in/CHANGELOG.md @@ -1,3 +1,11 @@ +## 4.2.0 + +* Add support for method introduced in `google_sign_in_platform_interface` 1.1.0. + +## 4.1.5 + +* Remove unused variable. + ## 4.1.4 * Make the pedantic dev_dependency explicit. diff --git a/packages/google_sign_in/google_sign_in/android/src/main/java/io/flutter/plugins/googlesignin/GoogleSignInPlugin.java b/packages/google_sign_in/google_sign_in/android/src/main/java/io/flutter/plugins/googlesignin/GoogleSignInPlugin.java index 6c9bedde1038..bffc68465b7c 100755 --- a/packages/google_sign_in/google_sign_in/android/src/main/java/io/flutter/plugins/googlesignin/GoogleSignInPlugin.java +++ b/packages/google_sign_in/google_sign_in/android/src/main/java/io/flutter/plugins/googlesignin/GoogleSignInPlugin.java @@ -27,6 +27,7 @@ import io.flutter.plugin.common.MethodChannel.MethodCallHandler; import io.flutter.plugin.common.MethodChannel.Result; import io.flutter.plugin.common.PluginRegistry; +import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; @@ -46,6 +47,8 @@ public class GoogleSignInPlugin implements MethodCallHandler { private static final String METHOD_DISCONNECT = "disconnect"; private static final String METHOD_IS_SIGNED_IN = "isSignedIn"; private static final String METHOD_CLEAR_AUTH_CACHE = "clearAuthCache"; + private static final String METHOD_LIST_MISSING_SCOPES = "listMissingScopes"; + private static final String METHOD_REQUEST_SCOPES = "requestScopes"; private final IDelegate delegate; @@ -100,6 +103,11 @@ public void onMethodCall(MethodCall call, Result result) { delegate.isSignedIn(result); break; + case METHOD_REQUEST_SCOPES: + List scopes = call.argument("scopes"); + delegate.requestScopes(result, scopes); + break; + default: result.notImplemented(); } @@ -153,6 +161,9 @@ public void init( /** Checks if there is a signed in user. */ public void isSignedIn(Result result); + + /** Prompts the user to grant an additional Oauth scopes. */ + public void requestScopes(final Result result, final List scopes); } /** @@ -167,6 +178,7 @@ public void init( public static final class Delegate implements IDelegate, PluginRegistry.ActivityResultListener { private static final int REQUEST_CODE_SIGNIN = 53293; private static final int REQUEST_CODE_RECOVER_AUTH = 53294; + private static final int REQUEST_CODE_REQUEST_SCOPE = 53295; private static final String ERROR_REASON_EXCEPTION = "exception"; private static final String ERROR_REASON_STATUS = "status"; @@ -343,6 +355,35 @@ public void isSignedIn(final Result result) { result.success(value); } + @Override + public void requestScopes(Result result, List scopes) { + GoogleSignInAccount account = GoogleSignIn.getLastSignedInAccount(registrar.context()); + if (account == null) { + result.error(ERROR_REASON_SIGN_IN_REQUIRED, "No account to grant scopes.", null); + return; + } + + List wrappedScopes = new ArrayList<>(); + + for (String scope : scopes) { + Scope wrappedScope = new Scope(scope); + if (!GoogleSignIn.hasPermissions(account, wrappedScope)) { + wrappedScopes.add(wrappedScope); + } + } + + if (wrappedScopes.isEmpty()) { + result.success(true); + return; + } + + GoogleSignIn.requestPermissions( + registrar.activity(), + REQUEST_CODE_REQUEST_SCOPE, + account, + wrappedScopes.toArray(new Scope[0])); + } + private void onSignInResult(Task completedTask) { try { GoogleSignInAccount account = completedTask.getResult(ApiException.class); @@ -527,6 +568,9 @@ public boolean onActivityResult(int requestCode, int resultCode, Intent data) { finishWithError(ERROR_REASON_SIGN_IN_FAILED, "Signin failed"); } return true; + case REQUEST_CODE_REQUEST_SCOPE: + pendingOperation.result.success(resultCode == Activity.RESULT_OK); + return true; default: return false; } diff --git a/packages/google_sign_in/google_sign_in/ios/Classes/FLTGoogleSignInPlugin.m b/packages/google_sign_in/google_sign_in/ios/Classes/FLTGoogleSignInPlugin.m index dff3481ec16f..20e80c520f44 100644 --- a/packages/google_sign_in/google_sign_in/ios/Classes/FLTGoogleSignInPlugin.m +++ b/packages/google_sign_in/google_sign_in/ios/Classes/FLTGoogleSignInPlugin.m @@ -121,6 +121,16 @@ - (void)handleMethodCall:(FlutterMethodCall *)call result:(FlutterResult)result // There's nothing to be done here on iOS since the expired/invalid // tokens are refreshed automatically by getTokensWithHandler. result(nil); + } else if ([call.method isEqualToString:@"requestScopes"]) { + NSArray *currentScopes = [GIDSignIn sharedInstance].scopes; + NSArray *scopes = call.arguments[@"scopes"]; + NSArray *missingScopes = [scopes + filteredArrayUsingPredicate:[NSPredicate + predicateWithBlock:^BOOL(id scope, NSDictionary *bindings) { + return ![user.grantedScopes containsObject:scope]; + }]]; + [GIDSignIn sharedInstance].scopes = [currentScopes arrayByAddingObjectsFromArray:missingScopes]; + [[GIDSignIn sharedInstance] signIn]; } else { result(FlutterMethodNotImplemented); } @@ -138,7 +148,6 @@ - (BOOL)setAccountRequest:(FlutterResult)request { } - (BOOL)application:(UIApplication *)app openURL:(NSURL *)url options:(NSDictionary *)options { - NSString *sourceApplication = options[UIApplicationOpenURLOptionsSourceApplicationKey]; return [[GIDSignIn sharedInstance] handleURL:url]; } diff --git a/packages/google_sign_in/google_sign_in/lib/google_sign_in.dart b/packages/google_sign_in/google_sign_in/lib/google_sign_in.dart index 09753377ac76..7402c7a69816 100644 --- a/packages/google_sign_in/google_sign_in/lib/google_sign_in.dart +++ b/packages/google_sign_in/google_sign_in/lib/google_sign_in.dart @@ -367,4 +367,10 @@ class GoogleSignIn { /// authentication. Future disconnect() => _addMethodCall(GoogleSignInPlatform.instance.disconnect); + + /// Requests the user grants additional Oauth [scopes]. + Future requestScopes(List scopes) async { + await _ensureInitialized(); + return GoogleSignInPlatform.instance.requestScopes(scopes); + } } diff --git a/packages/google_sign_in/google_sign_in/pubspec.yaml b/packages/google_sign_in/google_sign_in/pubspec.yaml index 70363f049f15..46d8b340a1c7 100644 --- a/packages/google_sign_in/google_sign_in/pubspec.yaml +++ b/packages/google_sign_in/google_sign_in/pubspec.yaml @@ -2,7 +2,7 @@ name: google_sign_in description: Flutter plugin for Google Sign-In, a secure authentication system for signing in with a Google account on Android and iOS. homepage: https://github.com/flutter/plugins/tree/master/packages/google_sign_in/google_sign_in -version: 4.1.4 +version: 4.2.0 flutter: plugin: @@ -16,7 +16,7 @@ flutter: default_package: google_sign_in_web dependencies: - google_sign_in_platform_interface: ^1.0.0 + google_sign_in_platform_interface: ^1.1.0 flutter: sdk: flutter meta: ^1.0.4 diff --git a/packages/google_sign_in/google_sign_in/test/google_sign_in_test.dart b/packages/google_sign_in/google_sign_in/test/google_sign_in_test.dart index a85fb0f27e42..898c27fd9f7e 100755 --- a/packages/google_sign_in/google_sign_in/test/google_sign_in_test.dart +++ b/packages/google_sign_in/google_sign_in/test/google_sign_in_test.dart @@ -32,6 +32,7 @@ void main() { 'signOut': null, 'disconnect': null, 'isSignedIn': true, + 'requestScopes': true, 'getTokens': { 'idToken': '123', 'accessToken': '456', @@ -379,6 +380,27 @@ void main() { ], ); }); + + test('requestScopes returns true once new scope is granted', () async { + await googleSignIn.signIn(); + final result = await googleSignIn.requestScopes(['testScope']); + + expect(result, isTrue); + expect( + log, + [ + isMethodCall('init', arguments: { + 'signInOption': 'SignInOption.standard', + 'scopes': [], + 'hostedDomain': null, + }), + isMethodCall('signIn', arguments: null), + isMethodCall('requestScopes', arguments: { + 'scopes': ['testScope'], + }), + ], + ); + }); }); group('GoogleSignIn with fake backend', () { diff --git a/packages/google_sign_in/google_sign_in_platform_interface/CHANGELOG.md b/packages/google_sign_in/google_sign_in_platform_interface/CHANGELOG.md index 7819e747ecd4..c0627df8c1da 100644 --- a/packages/google_sign_in/google_sign_in_platform_interface/CHANGELOG.md +++ b/packages/google_sign_in/google_sign_in_platform_interface/CHANGELOG.md @@ -1,3 +1,8 @@ +## 1.1.0 + +* Add hasRequestedScope method to determine if an Oauth scope has been granted. +* Add requestScope Method to request new Oauth scopes be granted by the user. + ## 1.0.4 * Make the pedantic dev_dependency explicit. diff --git a/packages/google_sign_in/google_sign_in_platform_interface/lib/google_sign_in_platform_interface.dart b/packages/google_sign_in/google_sign_in_platform_interface/lib/google_sign_in_platform_interface.dart index 01230150c1d0..966e93551086 100644 --- a/packages/google_sign_in/google_sign_in_platform_interface/lib/google_sign_in_platform_interface.dart +++ b/packages/google_sign_in/google_sign_in_platform_interface/lib/google_sign_in_platform_interface.dart @@ -121,4 +121,12 @@ abstract class GoogleSignInPlatform { Future clearAuthCache({@required String token}) async { throw UnimplementedError('clearAuthCache() has not been implemented.'); } + + /// Requests the user grants additional Oauth [scopes]. + /// + /// Scopes should come from the full list + /// [here](https://developers.google.com/identity/protocols/googlescopes). + Future requestScopes(List scopes) async { + throw UnimplementedError('requestScopes() has not been implmented.'); + } } diff --git a/packages/google_sign_in/google_sign_in_platform_interface/lib/src/method_channel_google_sign_in.dart b/packages/google_sign_in/google_sign_in_platform_interface/lib/src/method_channel_google_sign_in.dart index 1d1eb64edd92..4d2a34fe0fe7 100644 --- a/packages/google_sign_in/google_sign_in_platform_interface/lib/src/method_channel_google_sign_in.dart +++ b/packages/google_sign_in/google_sign_in_platform_interface/lib/src/method_channel_google_sign_in.dart @@ -78,4 +78,12 @@ class MethodChannelGoogleSignIn extends GoogleSignInPlatform { {'token': token}, ); } + + @override + Future requestScopes(List scopes) { + return channel.invokeMethod( + 'requestScopes', + >{'scopes': scopes}, + ); + } } diff --git a/packages/google_sign_in/google_sign_in_platform_interface/pubspec.yaml b/packages/google_sign_in/google_sign_in_platform_interface/pubspec.yaml index 23937e2511ef..d1f7abc291c4 100644 --- a/packages/google_sign_in/google_sign_in_platform_interface/pubspec.yaml +++ b/packages/google_sign_in/google_sign_in_platform_interface/pubspec.yaml @@ -3,7 +3,7 @@ description: A common platform interface for the google_sign_in plugin. homepage: https://github.com/flutter/plugins/tree/master/packages/google_sign_in/google_sign_in_platform_interface # NOTE: We strongly prefer non-breaking changes, even at the expense of a # less-clean API. See https://flutter.dev/go/platform-interface-breaking-changes -version: 1.0.4 +version: 1.1.0 dependencies: flutter: diff --git a/packages/google_sign_in/google_sign_in_platform_interface/test/method_channel_google_sign_in_test.dart b/packages/google_sign_in/google_sign_in_platform_interface/test/method_channel_google_sign_in_test.dart index 13de6acf0748..6a8f73736004 100644 --- a/packages/google_sign_in/google_sign_in_platform_interface/test/method_channel_google_sign_in_test.dart +++ b/packages/google_sign_in/google_sign_in_platform_interface/test/method_channel_google_sign_in_test.dart @@ -114,6 +114,11 @@ void main() { }: isMethodCall('clearAuthCache', arguments: { 'token': 'abc', }), + () { + googleSignIn.requestScopes(['newScope', 'anotherScope']); + }: isMethodCall('requestScopes', arguments: { + 'scopes': ['newScope', 'anotherScope'], + }), googleSignIn.signOut: isMethodCall('signOut', arguments: null), googleSignIn.disconnect: isMethodCall('disconnect', arguments: null), googleSignIn.isSignedIn: isMethodCall('isSignedIn', arguments: null), diff --git a/packages/google_sign_in/google_sign_in_web/CHANGELOG.md b/packages/google_sign_in/google_sign_in_web/CHANGELOG.md index 7f1e88be166f..cc53a1aa50b9 100644 --- a/packages/google_sign_in/google_sign_in_web/CHANGELOG.md +++ b/packages/google_sign_in/google_sign_in_web/CHANGELOG.md @@ -1,3 +1,7 @@ +## 0.9.0 + +* Add support for methods introduced in `google_sign_in_platform_interface` 1.1.0. + ## 0.8.3+2 * Make the pedantic dev_dependency explicit. diff --git a/packages/google_sign_in/google_sign_in_web/lib/google_sign_in_web.dart b/packages/google_sign_in/google_sign_in_web/lib/google_sign_in_web.dart index 4004d47d5551..bb43ba100c5d 100644 --- a/packages/google_sign_in/google_sign_in_web/lib/google_sign_in_web.dart +++ b/packages/google_sign_in/google_sign_in_web/lib/google_sign_in_web.dart @@ -176,4 +176,23 @@ class GoogleSignInPlugin extends GoogleSignInPlatform { return auth2.getAuthInstance().disconnect(); } + + @override + Future requestScopes(List scopes) async { + await initialized; + + final currentUser = auth2.getAuthInstance()?.currentUser?.get(); + + if (currentUser == null) return false; + + final grantedScopes = currentUser.getGrantedScopes(); + final missingScopes = + scopes.where((scope) => !grantedScopes.contains(scope)); + + if (missingScopes.isEmpty) return true; + + return currentUser + .grant(auth2.SigninOptions(scope: missingScopes.join(" "))) ?? + false; + } } diff --git a/packages/google_sign_in/google_sign_in_web/pubspec.yaml b/packages/google_sign_in/google_sign_in_web/pubspec.yaml index 91a002bd6ad2..9f2ce2636b21 100644 --- a/packages/google_sign_in/google_sign_in_web/pubspec.yaml +++ b/packages/google_sign_in/google_sign_in_web/pubspec.yaml @@ -2,7 +2,7 @@ name: google_sign_in_web description: Flutter plugin for Google Sign-In, a secure authentication system for signing in with a Google account on Android, iOS and Web. homepage: https://github.com/flutter/plugins/tree/master/packages/google_sign_in/google_sign_in_web -version: 0.8.3+2 +version: 0.9.0 flutter: plugin: @@ -12,7 +12,7 @@ flutter: fileName: google_sign_in_web.dart dependencies: - google_sign_in_platform_interface: ^1.0.0 + google_sign_in_platform_interface: ^1.1.0 flutter: sdk: flutter flutter_web_plugins: diff --git a/packages/google_sign_in/google_sign_in_web/test/auth2_test.dart b/packages/google_sign_in/google_sign_in_web/test/auth2_test.dart index 7a3a01227169..40bc8a404d06 100644 --- a/packages/google_sign_in/google_sign_in_web/test/auth2_test.dart +++ b/packages/google_sign_in/google_sign_in_web/test/auth2_test.dart @@ -73,5 +73,11 @@ void main() { expect(actualToken, expectedTokenData); }); + + test('requestScopes', () async { + bool scopeGranted = await plugin.requestScopes(['newScope']); + + expect(scopeGranted, isTrue); + }); }); } diff --git a/packages/google_sign_in/google_sign_in_web/test/gapi_mocks/src/google_user.dart b/packages/google_sign_in/google_sign_in_web/test/gapi_mocks/src/google_user.dart index 9f2b7b9bf6fa..15993bb56d8a 100644 --- a/packages/google_sign_in/google_sign_in_web/test/gapi_mocks/src/google_user.dart +++ b/packages/google_sign_in/google_sign_in_web/test/gapi_mocks/src/google_user.dart @@ -21,5 +21,7 @@ String googleUser(GoogleSignInUserData data) => ''' access_token: 'access_${data.idToken}', } }, + getGrantedScopes: () => 'some scope', + grant: () => true, } '''; diff --git a/packages/in_app_purchase/CHANGELOG.md b/packages/in_app_purchase/CHANGELOG.md index d78df4f3f06f..9c454a8ee71c 100644 --- a/packages/in_app_purchase/CHANGELOG.md +++ b/packages/in_app_purchase/CHANGELOG.md @@ -1,3 +1,8 @@ +## 0.3.1+2 + +* Fix potential casting crash on Android v1 embedding when registering life cycle callbacks. +* Remove hard-coded legacy xcode build setting. + ## 0.3.1+1 * Add `pedantic` to dev_dependency. diff --git a/packages/in_app_purchase/android/src/main/java/io/flutter/plugins/inapppurchase/InAppPurchasePlugin.java b/packages/in_app_purchase/android/src/main/java/io/flutter/plugins/inapppurchase/InAppPurchasePlugin.java index b7edcfbcf5d5..de2080cfebf2 100644 --- a/packages/in_app_purchase/android/src/main/java/io/flutter/plugins/inapppurchase/InAppPurchasePlugin.java +++ b/packages/in_app_purchase/android/src/main/java/io/flutter/plugins/inapppurchase/InAppPurchasePlugin.java @@ -50,7 +50,7 @@ static final class MethodNames { public static void registerWith(Registrar registrar) { InAppPurchasePlugin plugin = new InAppPurchasePlugin(); plugin.setupMethodChannel(registrar.activity(), registrar.messenger(), registrar.context()); - ((Application) registrar.context()) + ((Application) registrar.context().getApplicationContext()) .registerActivityLifecycleCallbacks(plugin.methodCallHandler); } diff --git a/packages/in_app_purchase/example/android/app/src/test/java/io/flutter/plugins/inapppurchase/InAppPurchasePluginTest.java b/packages/in_app_purchase/example/android/app/src/test/java/io/flutter/plugins/inapppurchase/InAppPurchasePluginTest.java new file mode 100644 index 000000000000..0befa87e1d05 --- /dev/null +++ b/packages/in_app_purchase/example/android/app/src/test/java/io/flutter/plugins/inapppurchase/InAppPurchasePluginTest.java @@ -0,0 +1,40 @@ +// Copyright 2019 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +package io.flutter.plugins.inapppurchase; + +import static org.mockito.Mockito.when; + +import android.app.Activity; +import android.app.Application; +import android.content.Context; +import io.flutter.plugin.common.BinaryMessenger; +import io.flutter.plugin.common.PluginRegistry; +import org.junit.Before; +import org.junit.Test; +import org.mockito.Mock; +import org.mockito.MockitoAnnotations; + +public class InAppPurchasePluginTest { + @Mock Activity activity; + @Mock Context context; + @Mock PluginRegistry.Registrar mockRegistrar; // For v1 embedding + @Mock BinaryMessenger mockMessenger; + @Mock Application mockApplication; + + @Before + public void setUp() { + MockitoAnnotations.initMocks(this); + when(mockRegistrar.activity()).thenReturn(activity); + when(mockRegistrar.messenger()).thenReturn(mockMessenger); + when(mockRegistrar.context()).thenReturn(context); + } + + @Test + public void registerWith_doNotCrashWhenRegisterContextIsActivity_V1Embedding() { + when(mockRegistrar.context()).thenReturn(activity); + when(activity.getApplicationContext()).thenReturn(mockApplication); + InAppPurchasePlugin.registerWith(mockRegistrar); + } +} diff --git a/packages/in_app_purchase/pubspec.yaml b/packages/in_app_purchase/pubspec.yaml index ff1f40443b22..b2fd2304ae5c 100644 --- a/packages/in_app_purchase/pubspec.yaml +++ b/packages/in_app_purchase/pubspec.yaml @@ -1,7 +1,7 @@ name: in_app_purchase description: A Flutter plugin for in-app purchases. Exposes APIs for making in-app purchases through the App Store and Google Play. homepage: https://github.com/flutter/plugins/tree/master/packages/in_app_purchase -version: 0.3.1+1 +version: 0.3.1+2 dependencies: diff --git a/packages/path_provider/example/android.iml b/packages/path_provider/example/android.iml deleted file mode 100644 index 462b903e05b6..000000000000 --- a/packages/path_provider/example/android.iml +++ /dev/null @@ -1,12 +0,0 @@ - - - - - - - - - - - - diff --git a/packages/path_provider/example/path_provider_example.iml b/packages/path_provider/example/path_provider_example.iml deleted file mode 100644 index 9d5dae19540c..000000000000 --- a/packages/path_provider/example/path_provider_example.iml +++ /dev/null @@ -1,15 +0,0 @@ - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/packages/path_provider/CHANGELOG.md b/packages/path_provider/path_provider/CHANGELOG.md similarity index 94% rename from packages/path_provider/CHANGELOG.md rename to packages/path_provider/path_provider/CHANGELOG.md index ba2d0a95cca1..99e088ec268b 100644 --- a/packages/path_provider/CHANGELOG.md +++ b/packages/path_provider/path_provider/CHANGELOG.md @@ -1,3 +1,19 @@ +## 1.6.5 + +* Remove unused class name in pubspec. + +## 1.6.4 + +* Endorsed macOS implementation. + +## 1.6.3 + +* Use `path_provider_platform_interface` in core plugin. + +## 1.6.2 + +* Move package contents into `path_provider` for platform federation. + ## 1.6.1 * Make the pedantic dev_dependency explicit. diff --git a/packages/path_provider/LICENSE b/packages/path_provider/path_provider/LICENSE similarity index 100% rename from packages/path_provider/LICENSE rename to packages/path_provider/path_provider/LICENSE diff --git a/packages/path_provider/README.md b/packages/path_provider/path_provider/README.md similarity index 100% rename from packages/path_provider/README.md rename to packages/path_provider/path_provider/README.md diff --git a/packages/path_provider/android/build.gradle b/packages/path_provider/path_provider/android/build.gradle similarity index 100% rename from packages/path_provider/android/build.gradle rename to packages/path_provider/path_provider/android/build.gradle diff --git a/packages/path_provider/android/gradle.properties b/packages/path_provider/path_provider/android/gradle.properties similarity index 100% rename from packages/path_provider/android/gradle.properties rename to packages/path_provider/path_provider/android/gradle.properties diff --git a/packages/path_provider/android/settings.gradle b/packages/path_provider/path_provider/android/settings.gradle similarity index 100% rename from packages/path_provider/android/settings.gradle rename to packages/path_provider/path_provider/android/settings.gradle diff --git a/packages/path_provider/android/src/main/AndroidManifest.xml b/packages/path_provider/path_provider/android/src/main/AndroidManifest.xml similarity index 100% rename from packages/path_provider/android/src/main/AndroidManifest.xml rename to packages/path_provider/path_provider/android/src/main/AndroidManifest.xml diff --git a/packages/path_provider/android/src/main/java/io/flutter/plugins/pathprovider/PathProviderPlugin.java b/packages/path_provider/path_provider/android/src/main/java/io/flutter/plugins/pathprovider/PathProviderPlugin.java similarity index 100% rename from packages/path_provider/android/src/main/java/io/flutter/plugins/pathprovider/PathProviderPlugin.java rename to packages/path_provider/path_provider/android/src/main/java/io/flutter/plugins/pathprovider/PathProviderPlugin.java diff --git a/packages/path_provider/android/src/main/java/io/flutter/plugins/pathprovider/StorageDirectoryMapper.java b/packages/path_provider/path_provider/android/src/main/java/io/flutter/plugins/pathprovider/StorageDirectoryMapper.java similarity index 100% rename from packages/path_provider/android/src/main/java/io/flutter/plugins/pathprovider/StorageDirectoryMapper.java rename to packages/path_provider/path_provider/android/src/main/java/io/flutter/plugins/pathprovider/StorageDirectoryMapper.java diff --git a/packages/path_provider/android/src/test/java/io/flutter/plugins/pathprovider/StorageDirectoryMapperTest.java b/packages/path_provider/path_provider/android/src/test/java/io/flutter/plugins/pathprovider/StorageDirectoryMapperTest.java similarity index 100% rename from packages/path_provider/android/src/test/java/io/flutter/plugins/pathprovider/StorageDirectoryMapperTest.java rename to packages/path_provider/path_provider/android/src/test/java/io/flutter/plugins/pathprovider/StorageDirectoryMapperTest.java diff --git a/packages/path_provider/example/README.md b/packages/path_provider/path_provider/example/README.md similarity index 100% rename from packages/path_provider/example/README.md rename to packages/path_provider/path_provider/example/README.md diff --git a/packages/path_provider/example/android/app/build.gradle b/packages/path_provider/path_provider/example/android/app/build.gradle similarity index 100% rename from packages/path_provider/example/android/app/build.gradle rename to packages/path_provider/path_provider/example/android/app/build.gradle diff --git a/packages/path_provider/example/android/app/gradle/wrapper/gradle-wrapper.properties b/packages/path_provider/path_provider/example/android/app/gradle/wrapper/gradle-wrapper.properties similarity index 100% rename from packages/path_provider/example/android/app/gradle/wrapper/gradle-wrapper.properties rename to packages/path_provider/path_provider/example/android/app/gradle/wrapper/gradle-wrapper.properties diff --git a/packages/path_provider/example/android/app/src/androidTest/java/EmbeddingV1ActivityTest.java b/packages/path_provider/path_provider/example/android/app/src/androidTest/java/EmbeddingV1ActivityTest.java similarity index 100% rename from packages/path_provider/example/android/app/src/androidTest/java/EmbeddingV1ActivityTest.java rename to packages/path_provider/path_provider/example/android/app/src/androidTest/java/EmbeddingV1ActivityTest.java diff --git a/packages/path_provider/example/android/app/src/androidTest/java/MainActivityTest.java b/packages/path_provider/path_provider/example/android/app/src/androidTest/java/MainActivityTest.java similarity index 100% rename from packages/path_provider/example/android/app/src/androidTest/java/MainActivityTest.java rename to packages/path_provider/path_provider/example/android/app/src/androidTest/java/MainActivityTest.java diff --git a/packages/path_provider/example/android/app/src/main/AndroidManifest.xml b/packages/path_provider/path_provider/example/android/app/src/main/AndroidManifest.xml similarity index 100% rename from packages/path_provider/example/android/app/src/main/AndroidManifest.xml rename to packages/path_provider/path_provider/example/android/app/src/main/AndroidManifest.xml diff --git a/packages/path_provider/example/android/app/src/main/java/io/flutter/plugins/pathproviderexample/EmbeddingV1Activity.java b/packages/path_provider/path_provider/example/android/app/src/main/java/io/flutter/plugins/pathproviderexample/EmbeddingV1Activity.java similarity index 100% rename from packages/path_provider/example/android/app/src/main/java/io/flutter/plugins/pathproviderexample/EmbeddingV1Activity.java rename to packages/path_provider/path_provider/example/android/app/src/main/java/io/flutter/plugins/pathproviderexample/EmbeddingV1Activity.java diff --git a/packages/path_provider/example/android/app/src/main/java/io/flutter/plugins/pathproviderexample/MainActivity.java b/packages/path_provider/path_provider/example/android/app/src/main/java/io/flutter/plugins/pathproviderexample/MainActivity.java similarity index 100% rename from packages/path_provider/example/android/app/src/main/java/io/flutter/plugins/pathproviderexample/MainActivity.java rename to packages/path_provider/path_provider/example/android/app/src/main/java/io/flutter/plugins/pathproviderexample/MainActivity.java diff --git a/packages/path_provider/example/android/app/src/main/res/mipmap-hdpi/ic_launcher.png b/packages/path_provider/path_provider/example/android/app/src/main/res/mipmap-hdpi/ic_launcher.png similarity index 100% rename from packages/path_provider/example/android/app/src/main/res/mipmap-hdpi/ic_launcher.png rename to packages/path_provider/path_provider/example/android/app/src/main/res/mipmap-hdpi/ic_launcher.png diff --git a/packages/path_provider/example/android/app/src/main/res/mipmap-mdpi/ic_launcher.png b/packages/path_provider/path_provider/example/android/app/src/main/res/mipmap-mdpi/ic_launcher.png similarity index 100% rename from packages/path_provider/example/android/app/src/main/res/mipmap-mdpi/ic_launcher.png rename to packages/path_provider/path_provider/example/android/app/src/main/res/mipmap-mdpi/ic_launcher.png diff --git a/packages/path_provider/example/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png b/packages/path_provider/path_provider/example/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png similarity index 100% rename from packages/path_provider/example/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png rename to packages/path_provider/path_provider/example/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png diff --git a/packages/path_provider/example/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png b/packages/path_provider/path_provider/example/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png similarity index 100% rename from packages/path_provider/example/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png rename to packages/path_provider/path_provider/example/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png diff --git a/packages/path_provider/example/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png b/packages/path_provider/path_provider/example/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png similarity index 100% rename from packages/path_provider/example/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png rename to packages/path_provider/path_provider/example/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png diff --git a/packages/path_provider/example/android/build.gradle b/packages/path_provider/path_provider/example/android/build.gradle similarity index 100% rename from packages/path_provider/example/android/build.gradle rename to packages/path_provider/path_provider/example/android/build.gradle diff --git a/packages/path_provider/example/android/gradle.properties b/packages/path_provider/path_provider/example/android/gradle.properties similarity index 100% rename from packages/path_provider/example/android/gradle.properties rename to packages/path_provider/path_provider/example/android/gradle.properties diff --git a/packages/path_provider/example/android/gradle/wrapper/gradle-wrapper.properties b/packages/path_provider/path_provider/example/android/gradle/wrapper/gradle-wrapper.properties similarity index 100% rename from packages/path_provider/example/android/gradle/wrapper/gradle-wrapper.properties rename to packages/path_provider/path_provider/example/android/gradle/wrapper/gradle-wrapper.properties diff --git a/packages/path_provider/example/android/settings.gradle b/packages/path_provider/path_provider/example/android/settings.gradle similarity index 100% rename from packages/path_provider/example/android/settings.gradle rename to packages/path_provider/path_provider/example/android/settings.gradle diff --git a/packages/path_provider/example/ios/Flutter/AppFrameworkInfo.plist b/packages/path_provider/path_provider/example/ios/Flutter/AppFrameworkInfo.plist similarity index 100% rename from packages/path_provider/example/ios/Flutter/AppFrameworkInfo.plist rename to packages/path_provider/path_provider/example/ios/Flutter/AppFrameworkInfo.plist diff --git a/packages/path_provider/example/ios/Flutter/Debug.xcconfig b/packages/path_provider/path_provider/example/ios/Flutter/Debug.xcconfig similarity index 100% rename from packages/path_provider/example/ios/Flutter/Debug.xcconfig rename to packages/path_provider/path_provider/example/ios/Flutter/Debug.xcconfig diff --git a/packages/path_provider/example/ios/Flutter/Release.xcconfig b/packages/path_provider/path_provider/example/ios/Flutter/Release.xcconfig similarity index 100% rename from packages/path_provider/example/ios/Flutter/Release.xcconfig rename to packages/path_provider/path_provider/example/ios/Flutter/Release.xcconfig diff --git a/packages/path_provider/example/ios/Runner.xcodeproj/project.pbxproj b/packages/path_provider/path_provider/example/ios/Runner.xcodeproj/project.pbxproj similarity index 100% rename from packages/path_provider/example/ios/Runner.xcodeproj/project.pbxproj rename to packages/path_provider/path_provider/example/ios/Runner.xcodeproj/project.pbxproj diff --git a/packages/path_provider/example/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/packages/path_provider/path_provider/example/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata similarity index 100% rename from packages/path_provider/example/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata rename to packages/path_provider/path_provider/example/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata diff --git a/packages/path_provider/example/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/packages/path_provider/path_provider/example/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme similarity index 100% rename from packages/path_provider/example/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme rename to packages/path_provider/path_provider/example/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme diff --git a/packages/path_provider/example/ios/Runner.xcworkspace/contents.xcworkspacedata b/packages/path_provider/path_provider/example/ios/Runner.xcworkspace/contents.xcworkspacedata similarity index 100% rename from packages/path_provider/example/ios/Runner.xcworkspace/contents.xcworkspacedata rename to packages/path_provider/path_provider/example/ios/Runner.xcworkspace/contents.xcworkspacedata diff --git a/packages/path_provider/example/ios/Runner/AppDelegate.h b/packages/path_provider/path_provider/example/ios/Runner/AppDelegate.h similarity index 100% rename from packages/path_provider/example/ios/Runner/AppDelegate.h rename to packages/path_provider/path_provider/example/ios/Runner/AppDelegate.h diff --git a/packages/path_provider/example/ios/Runner/AppDelegate.m b/packages/path_provider/path_provider/example/ios/Runner/AppDelegate.m similarity index 100% rename from packages/path_provider/example/ios/Runner/AppDelegate.m rename to packages/path_provider/path_provider/example/ios/Runner/AppDelegate.m diff --git a/packages/path_provider/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json b/packages/path_provider/path_provider/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json similarity index 100% rename from packages/path_provider/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json rename to packages/path_provider/path_provider/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json diff --git a/packages/path_provider/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png b/packages/path_provider/path_provider/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png similarity index 100% rename from packages/path_provider/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png rename to packages/path_provider/path_provider/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png diff --git a/packages/path_provider/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png b/packages/path_provider/path_provider/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png similarity index 100% rename from packages/path_provider/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png rename to packages/path_provider/path_provider/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png diff --git a/packages/path_provider/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png b/packages/path_provider/path_provider/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png similarity index 100% rename from packages/path_provider/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png rename to packages/path_provider/path_provider/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png diff --git a/packages/path_provider/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png b/packages/path_provider/path_provider/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png similarity index 100% rename from packages/path_provider/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png rename to packages/path_provider/path_provider/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png diff --git a/packages/path_provider/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png b/packages/path_provider/path_provider/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png similarity index 100% rename from packages/path_provider/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png rename to packages/path_provider/path_provider/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png diff --git a/packages/path_provider/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png b/packages/path_provider/path_provider/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png similarity index 100% rename from packages/path_provider/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png rename to packages/path_provider/path_provider/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png diff --git a/packages/path_provider/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png b/packages/path_provider/path_provider/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png similarity index 100% rename from packages/path_provider/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png rename to packages/path_provider/path_provider/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png diff --git a/packages/path_provider/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png b/packages/path_provider/path_provider/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png similarity index 100% rename from packages/path_provider/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png rename to packages/path_provider/path_provider/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png diff --git a/packages/path_provider/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png b/packages/path_provider/path_provider/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png similarity index 100% rename from packages/path_provider/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png rename to packages/path_provider/path_provider/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png diff --git a/packages/path_provider/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png b/packages/path_provider/path_provider/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png similarity index 100% rename from packages/path_provider/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png rename to packages/path_provider/path_provider/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png diff --git a/packages/path_provider/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png b/packages/path_provider/path_provider/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png similarity index 100% rename from packages/path_provider/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png rename to packages/path_provider/path_provider/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png diff --git a/packages/path_provider/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png b/packages/path_provider/path_provider/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png similarity index 100% rename from packages/path_provider/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png rename to packages/path_provider/path_provider/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png diff --git a/packages/path_provider/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png b/packages/path_provider/path_provider/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png similarity index 100% rename from packages/path_provider/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png rename to packages/path_provider/path_provider/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png diff --git a/packages/path_provider/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png b/packages/path_provider/path_provider/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png similarity index 100% rename from packages/path_provider/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png rename to packages/path_provider/path_provider/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png diff --git a/packages/path_provider/example/ios/Runner/Base.lproj/LaunchScreen.storyboard b/packages/path_provider/path_provider/example/ios/Runner/Base.lproj/LaunchScreen.storyboard similarity index 100% rename from packages/path_provider/example/ios/Runner/Base.lproj/LaunchScreen.storyboard rename to packages/path_provider/path_provider/example/ios/Runner/Base.lproj/LaunchScreen.storyboard diff --git a/packages/path_provider/example/ios/Runner/Base.lproj/Main.storyboard b/packages/path_provider/path_provider/example/ios/Runner/Base.lproj/Main.storyboard similarity index 100% rename from packages/path_provider/example/ios/Runner/Base.lproj/Main.storyboard rename to packages/path_provider/path_provider/example/ios/Runner/Base.lproj/Main.storyboard diff --git a/packages/path_provider/example/ios/Runner/Info.plist b/packages/path_provider/path_provider/example/ios/Runner/Info.plist similarity index 100% rename from packages/path_provider/example/ios/Runner/Info.plist rename to packages/path_provider/path_provider/example/ios/Runner/Info.plist diff --git a/packages/path_provider/example/ios/Runner/main.m b/packages/path_provider/path_provider/example/ios/Runner/main.m similarity index 100% rename from packages/path_provider/example/ios/Runner/main.m rename to packages/path_provider/path_provider/example/ios/Runner/main.m diff --git a/packages/path_provider/example/lib/main.dart b/packages/path_provider/path_provider/example/lib/main.dart similarity index 100% rename from packages/path_provider/example/lib/main.dart rename to packages/path_provider/path_provider/example/lib/main.dart diff --git a/packages/path_provider/example/macos/Flutter/Flutter-Debug.xcconfig b/packages/path_provider/path_provider/example/macos/Flutter/Flutter-Debug.xcconfig similarity index 100% rename from packages/path_provider/example/macos/Flutter/Flutter-Debug.xcconfig rename to packages/path_provider/path_provider/example/macos/Flutter/Flutter-Debug.xcconfig diff --git a/packages/path_provider/example/macos/Flutter/Flutter-Release.xcconfig b/packages/path_provider/path_provider/example/macos/Flutter/Flutter-Release.xcconfig similarity index 100% rename from packages/path_provider/example/macos/Flutter/Flutter-Release.xcconfig rename to packages/path_provider/path_provider/example/macos/Flutter/Flutter-Release.xcconfig diff --git a/packages/path_provider/example/macos/Flutter/GeneratedPluginRegistrant.swift b/packages/path_provider/path_provider/example/macos/Flutter/GeneratedPluginRegistrant.swift similarity index 100% rename from packages/path_provider/example/macos/Flutter/GeneratedPluginRegistrant.swift rename to packages/path_provider/path_provider/example/macos/Flutter/GeneratedPluginRegistrant.swift diff --git a/packages/path_provider/example/macos/Runner.xcodeproj/project.pbxproj b/packages/path_provider/path_provider/example/macos/Runner.xcodeproj/project.pbxproj similarity index 100% rename from packages/path_provider/example/macos/Runner.xcodeproj/project.pbxproj rename to packages/path_provider/path_provider/example/macos/Runner.xcodeproj/project.pbxproj diff --git a/packages/path_provider/example/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/packages/path_provider/path_provider/example/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme similarity index 100% rename from packages/path_provider/example/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme rename to packages/path_provider/path_provider/example/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme diff --git a/packages/path_provider/example/macos/Runner.xcworkspace/contents.xcworkspacedata b/packages/path_provider/path_provider/example/macos/Runner.xcworkspace/contents.xcworkspacedata similarity index 67% rename from packages/path_provider/example/macos/Runner.xcworkspace/contents.xcworkspacedata rename to packages/path_provider/path_provider/example/macos/Runner.xcworkspace/contents.xcworkspacedata index 1d526a16ed0f..21a3cc14c74e 100644 --- a/packages/path_provider/example/macos/Runner.xcworkspace/contents.xcworkspacedata +++ b/packages/path_provider/path_provider/example/macos/Runner.xcworkspace/contents.xcworkspacedata @@ -4,4 +4,7 @@ + + diff --git a/packages/path_provider/example/macos/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/packages/path_provider/path_provider/example/macos/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist similarity index 100% rename from packages/path_provider/example/macos/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist rename to packages/path_provider/path_provider/example/macos/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist diff --git a/packages/path_provider/example/macos/Runner/AppDelegate.swift b/packages/path_provider/path_provider/example/macos/Runner/AppDelegate.swift similarity index 100% rename from packages/path_provider/example/macos/Runner/AppDelegate.swift rename to packages/path_provider/path_provider/example/macos/Runner/AppDelegate.swift diff --git a/packages/path_provider/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json b/packages/path_provider/path_provider/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json similarity index 100% rename from packages/path_provider/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json rename to packages/path_provider/path_provider/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json diff --git a/packages/path_provider/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_1024.png b/packages/path_provider/path_provider/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_1024.png similarity index 100% rename from packages/path_provider/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_1024.png rename to packages/path_provider/path_provider/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_1024.png diff --git a/packages/path_provider/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_128.png b/packages/path_provider/path_provider/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_128.png similarity index 100% rename from packages/path_provider/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_128.png rename to packages/path_provider/path_provider/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_128.png diff --git a/packages/path_provider/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_16.png b/packages/path_provider/path_provider/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_16.png similarity index 100% rename from packages/path_provider/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_16.png rename to packages/path_provider/path_provider/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_16.png diff --git a/packages/path_provider/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_256.png b/packages/path_provider/path_provider/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_256.png similarity index 100% rename from packages/path_provider/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_256.png rename to packages/path_provider/path_provider/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_256.png diff --git a/packages/path_provider/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_32.png b/packages/path_provider/path_provider/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_32.png similarity index 100% rename from packages/path_provider/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_32.png rename to packages/path_provider/path_provider/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_32.png diff --git a/packages/path_provider/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_512.png b/packages/path_provider/path_provider/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_512.png similarity index 100% rename from packages/path_provider/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_512.png rename to packages/path_provider/path_provider/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_512.png diff --git a/packages/path_provider/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_64.png b/packages/path_provider/path_provider/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_64.png similarity index 100% rename from packages/path_provider/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_64.png rename to packages/path_provider/path_provider/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_64.png diff --git a/packages/path_provider/example/macos/Runner/Base.lproj/MainMenu.xib b/packages/path_provider/path_provider/example/macos/Runner/Base.lproj/MainMenu.xib similarity index 100% rename from packages/path_provider/example/macos/Runner/Base.lproj/MainMenu.xib rename to packages/path_provider/path_provider/example/macos/Runner/Base.lproj/MainMenu.xib diff --git a/packages/path_provider/example/macos/Runner/Configs/AppInfo.xcconfig b/packages/path_provider/path_provider/example/macos/Runner/Configs/AppInfo.xcconfig similarity index 100% rename from packages/path_provider/example/macos/Runner/Configs/AppInfo.xcconfig rename to packages/path_provider/path_provider/example/macos/Runner/Configs/AppInfo.xcconfig diff --git a/packages/path_provider/example/macos/Runner/Configs/Debug.xcconfig b/packages/path_provider/path_provider/example/macos/Runner/Configs/Debug.xcconfig similarity index 100% rename from packages/path_provider/example/macos/Runner/Configs/Debug.xcconfig rename to packages/path_provider/path_provider/example/macos/Runner/Configs/Debug.xcconfig diff --git a/packages/path_provider/example/macos/Runner/Configs/Release.xcconfig b/packages/path_provider/path_provider/example/macos/Runner/Configs/Release.xcconfig similarity index 100% rename from packages/path_provider/example/macos/Runner/Configs/Release.xcconfig rename to packages/path_provider/path_provider/example/macos/Runner/Configs/Release.xcconfig diff --git a/packages/path_provider/example/macos/Runner/Configs/Warnings.xcconfig b/packages/path_provider/path_provider/example/macos/Runner/Configs/Warnings.xcconfig similarity index 100% rename from packages/path_provider/example/macos/Runner/Configs/Warnings.xcconfig rename to packages/path_provider/path_provider/example/macos/Runner/Configs/Warnings.xcconfig diff --git a/packages/path_provider/example/macos/Runner/DebugProfile.entitlements b/packages/path_provider/path_provider/example/macos/Runner/DebugProfile.entitlements similarity index 100% rename from packages/path_provider/example/macos/Runner/DebugProfile.entitlements rename to packages/path_provider/path_provider/example/macos/Runner/DebugProfile.entitlements diff --git a/packages/path_provider/example/macos/Runner/Info.plist b/packages/path_provider/path_provider/example/macos/Runner/Info.plist similarity index 100% rename from packages/path_provider/example/macos/Runner/Info.plist rename to packages/path_provider/path_provider/example/macos/Runner/Info.plist diff --git a/packages/path_provider/example/macos/Runner/MainFlutterWindow.swift b/packages/path_provider/path_provider/example/macos/Runner/MainFlutterWindow.swift similarity index 100% rename from packages/path_provider/example/macos/Runner/MainFlutterWindow.swift rename to packages/path_provider/path_provider/example/macos/Runner/MainFlutterWindow.swift diff --git a/packages/path_provider/example/macos/Runner/Release.entitlements b/packages/path_provider/path_provider/example/macos/Runner/Release.entitlements similarity index 100% rename from packages/path_provider/example/macos/Runner/Release.entitlements rename to packages/path_provider/path_provider/example/macos/Runner/Release.entitlements diff --git a/packages/path_provider/path_provider/example/pubspec.yaml b/packages/path_provider/path_provider/example/pubspec.yaml new file mode 100644 index 000000000000..1d6a50c2ca0f --- /dev/null +++ b/packages/path_provider/path_provider/example/pubspec.yaml @@ -0,0 +1,18 @@ +name: path_provider_example +description: Demonstrates how to use the path_provider plugin. + +dependencies: + flutter: + sdk: flutter + path_provider: + path: ../ + +dev_dependencies: + e2e: ^0.2.1 + flutter_driver: + sdk: flutter + test: any + pedantic: ^1.8.0 + +flutter: + uses-material-design: true diff --git a/packages/path_provider/example/test_driver/path_provider_e2e.dart b/packages/path_provider/path_provider/example/test_driver/path_provider_e2e.dart similarity index 100% rename from packages/path_provider/example/test_driver/path_provider_e2e.dart rename to packages/path_provider/path_provider/example/test_driver/path_provider_e2e.dart diff --git a/packages/path_provider/example/test_driver/path_provider_e2e_test.dart b/packages/path_provider/path_provider/example/test_driver/path_provider_e2e_test.dart similarity index 100% rename from packages/path_provider/example/test_driver/path_provider_e2e_test.dart rename to packages/path_provider/path_provider/example/test_driver/path_provider_e2e_test.dart diff --git a/packages/path_provider/ios/Assets/.gitkeep b/packages/path_provider/path_provider/ios/Assets/.gitkeep similarity index 100% rename from packages/path_provider/ios/Assets/.gitkeep rename to packages/path_provider/path_provider/ios/Assets/.gitkeep diff --git a/packages/path_provider/ios/Classes/FLTPathProviderPlugin.h b/packages/path_provider/path_provider/ios/Classes/FLTPathProviderPlugin.h similarity index 100% rename from packages/path_provider/ios/Classes/FLTPathProviderPlugin.h rename to packages/path_provider/path_provider/ios/Classes/FLTPathProviderPlugin.h diff --git a/packages/path_provider/ios/Classes/FLTPathProviderPlugin.m b/packages/path_provider/path_provider/ios/Classes/FLTPathProviderPlugin.m similarity index 100% rename from packages/path_provider/ios/Classes/FLTPathProviderPlugin.m rename to packages/path_provider/path_provider/ios/Classes/FLTPathProviderPlugin.m diff --git a/packages/path_provider/ios/path_provider.podspec b/packages/path_provider/path_provider/ios/path_provider.podspec similarity index 100% rename from packages/path_provider/ios/path_provider.podspec rename to packages/path_provider/path_provider/ios/path_provider.podspec diff --git a/packages/path_provider/lib/path_provider.dart b/packages/path_provider/path_provider/lib/path_provider.dart similarity index 57% rename from packages/path_provider/lib/path_provider.dart rename to packages/path_provider/path_provider/lib/path_provider.dart index b27cc4bc3fcb..a7643264d52a 100644 --- a/packages/path_provider/lib/path_provider.dart +++ b/packages/path_provider/path_provider/lib/path_provider.dart @@ -5,21 +5,12 @@ import 'dart:async'; import 'dart:io' show Directory; -import 'package:flutter/services.dart'; -import 'package:meta/meta.dart'; -import 'package:platform/platform.dart'; +import 'package:path_provider_platform_interface/path_provider_platform_interface.dart'; -const MethodChannel _channel = - MethodChannel('plugins.flutter.io/path_provider'); +export 'package:path_provider_platform_interface/path_provider_platform_interface.dart' + show StorageDirectory; -Platform _platform = const LocalPlatform(); - -/// This API is only exposed for the unit tests. It should not be used by -/// any code outside of the plugin itself. -@visibleForTesting -void setMockPathProviderPlatform(Platform platform) { - _platform = platform; -} +PathProviderPlatform get _platform => PathProviderPlatform.instance; /// Path to the temporary directory on the device that is not backed up and is /// suitable for storing caches of downloaded files. @@ -33,8 +24,7 @@ void setMockPathProviderPlatform(Platform platform) { /// /// On Android, this uses the `getCacheDir` API on the context. Future getTemporaryDirectory() async { - final String path = - await _channel.invokeMethod('getTemporaryDirectory'); + final String path = await _platform.getTemporaryPath(); if (path == null) { return null; } @@ -52,8 +42,7 @@ Future getTemporaryDirectory() async { /// /// On Android, this function uses the `getFilesDir` API on the context. Future getApplicationSupportDirectory() async { - final String path = - await _channel.invokeMethod('getApplicationSupportDirectory'); + final String path = await _platform.getApplicationSupportPath(); if (path == null) { return null; } @@ -67,11 +56,7 @@ Future getApplicationSupportDirectory() async { /// On Android, this function throws an [UnsupportedError] as no equivalent /// path exists. Future getLibraryDirectory() async { - if (_platform.isAndroid) { - throw UnsupportedError('Functionality not available on Android'); - } - final String path = - await _channel.invokeMethod('getLibraryDirectory'); + final String path = await _platform.getLibraryPath(); if (path == null) { return null; } @@ -88,8 +73,7 @@ Future getLibraryDirectory() async { /// using [getExternalStorageDirectory] instead if data is intended to be visible /// to the user. Future getApplicationDocumentsDirectory() async { - final String path = - await _channel.invokeMethod('getApplicationDocumentsDirectory'); + final String path = await _platform.getApplicationDocumentsPath(); if (path == null) { return null; } @@ -105,11 +89,7 @@ Future getApplicationDocumentsDirectory() async { /// /// On Android this uses the `getExternalFilesDir(null)`. Future getExternalStorageDirectory() async { - if (_platform.isIOS) { - throw UnsupportedError('Functionality not available on iOS'); - } - final String path = - await _channel.invokeMethod('getStorageDirectory'); + final String path = await _platform.getExternalStoragePath(); if (path == null) { return null; } @@ -130,65 +110,11 @@ Future getExternalStorageDirectory() async { /// On Android this returns Context.getExternalCacheDirs() or /// Context.getExternalCacheDir() on API levels below 19. Future> getExternalCacheDirectories() async { - if (_platform.isIOS) { - throw UnsupportedError('Functionality not available on iOS'); - } - final List paths = - await _channel.invokeListMethod('getExternalCacheDirectories'); + final List paths = await _platform.getExternalCachePaths(); return paths.map((String path) => Directory(path)).toList(); } -/// Corresponds to constants defined in Androids `android.os.Environment` class. -/// -/// https://developer.android.com/reference/android/os/Environment.html#fields_1 -enum StorageDirectory { - /// Contains audio files that should be treated as music. - /// - /// See https://developer.android.com/reference/android/os/Environment.html#DIRECTORY_MUSIC. - music, - - /// Contains audio files that should be treated as podcasts. - /// - /// See https://developer.android.com/reference/android/os/Environment.html#DIRECTORY_PODCASTS. - podcasts, - - /// Contains audio files that should be treated as ringtones. - /// - /// See https://developer.android.com/reference/android/os/Environment.html#DIRECTORY_RINGTONES. - ringtones, - - /// Contains audio files that should be treated as alarm sounds. - /// - /// See https://developer.android.com/reference/android/os/Environment.html#DIRECTORY_ALARMS. - alarms, - - /// Contains audio files that should be treated as notification sounds. - /// - /// See https://developer.android.com/reference/android/os/Environment.html#DIRECTORY_NOTIFICATIONS. - notifications, - - /// Contains images. See https://developer.android.com/reference/android/os/Environment.html#DIRECTORY_PICTURES. - pictures, - - /// Contains movies. See https://developer.android.com/reference/android/os/Environment.html#DIRECTORY_MOVIES. - movies, - - /// Contains files of any type that have been downloaded by the user. - /// - /// See https://developer.android.com/reference/android/os/Environment.html#DIRECTORY_DOWNLOADS. - downloads, - - /// Used to hold both pictures and videos when the device filesystem is - /// treated like a camera's. - /// - /// See https://developer.android.com/reference/android/os/Environment.html#DIRECTORY_DCIM. - dcim, - - /// Holds user-created documents. See https://developer.android.com/reference/android/os/Environment.html#DIRECTORY_DOCUMENTS. - documents, -} - /// Paths to directories where application specific data can be stored. /// These paths typically reside on external storage like separate partitions /// or SD cards. Phones may have multiple storage directories available. @@ -206,13 +132,8 @@ Future> getExternalStorageDirectories({ /// how this type translates to Android storage directories. StorageDirectory type, }) async { - if (_platform.isIOS) { - throw UnsupportedError('Functionality not available on iOS'); - } - final List paths = await _channel.invokeListMethod( - 'getExternalStorageDirectories', - {'type': type?.index}, - ); + final List paths = + await _platform.getExternalStoragePaths(type: type); return paths.map((String path) => Directory(path)).toList(); } @@ -223,14 +144,7 @@ Future> getExternalStorageDirectories({ /// On Android and on iOS, this function throws an [UnsupportedError] as no equivalent /// path exists. Future getDownloadsDirectory() async { - if (_platform.isAndroid) { - throw UnsupportedError('Functionality not available on Android'); - } - if (_platform.isIOS) { - throw UnsupportedError('Functionality not available on iOS'); - } - final String path = - await _channel.invokeMethod('getDownloadsDirectory'); + final String path = await _platform.getDownloadsPath(); if (path == null) { return null; } diff --git a/packages/path_provider/path_provider/macos/path_provider.podspec b/packages/path_provider/path_provider/macos/path_provider.podspec new file mode 100644 index 000000000000..9f3f01f2f858 --- /dev/null +++ b/packages/path_provider/path_provider/macos/path_provider.podspec @@ -0,0 +1,22 @@ +# +# To learn more about a Podspec see http://guides.cocoapods.org/syntax/podspec.html +# +Pod::Spec.new do |s| + s.name = 'path_provider' + s.version = '0.0.1' + s.summary = 'No-op implementation of the macos path_provider to avoid build issues on macos' + s.description = <<-DESC + No-op implementation of the path_provider plugin to avoid build issues on macos. + https://github.com/flutter/flutter/issues/46618 + DESC + s.homepage = 'https://github.com/flutter/plugins/tree/master/packages/path_provider' + s.license = { :file => '../LICENSE' } + s.author = { 'Flutter Team' => 'flutter-dev@googlegroups.com' } + s.source = { :path => '.' } + s.source_files = 'Classes/**/*' + s.public_header_files = 'Classes/**/*.h' + + s.platform = :osx + s.osx.deployment_target = '10.11' +end + diff --git a/packages/path_provider/pubspec.yaml b/packages/path_provider/path_provider/pubspec.yaml similarity index 74% rename from packages/path_provider/pubspec.yaml rename to packages/path_provider/path_provider/pubspec.yaml index 0b394514143e..9f081ca927d9 100644 --- a/packages/path_provider/pubspec.yaml +++ b/packages/path_provider/path_provider/pubspec.yaml @@ -1,8 +1,8 @@ name: path_provider description: Flutter plugin for getting commonly used locations on the Android & iOS file systems, such as the temp and app data directories. -homepage: https://github.com/flutter/plugins/tree/master/packages/path_provider -version: 1.6.1 +homepage: https://github.com/flutter/plugins/tree/master/packages/path_provider/path_provider +version: 1.6.5 flutter: plugin: @@ -12,12 +12,15 @@ flutter: pluginClass: PathProviderPlugin ios: pluginClass: FLTPathProviderPlugin + macos: + default_package: path_provider_macos + dependencies: flutter: sdk: flutter - platform: ^2.0.0 - meta: ^1.0.5 + path_provider_platform_interface: ^1.0.1 + path_provider_macos: ^0.0.4 dev_dependencies: e2e: ^0.2.1 @@ -28,6 +31,8 @@ dev_dependencies: test: any uuid: "^1.0.0" pedantic: ^1.8.0 + mockito: ^4.1.1 + plugin_platform_interface: ^1.0.0 environment: sdk: ">=2.0.0-dev.28.0 <3.0.0" diff --git a/packages/path_provider/test/path_provider_e2e.dart b/packages/path_provider/path_provider/test/path_provider_e2e.dart similarity index 100% rename from packages/path_provider/test/path_provider_e2e.dart rename to packages/path_provider/path_provider/test/path_provider_e2e.dart diff --git a/packages/path_provider/path_provider/test/path_provider_test.dart b/packages/path_provider/path_provider/test/path_provider_test.dart new file mode 100644 index 000000000000..eb17178b9975 --- /dev/null +++ b/packages/path_provider/path_provider/test/path_provider_test.dart @@ -0,0 +1,110 @@ +// Copyright 2019 The Flutter Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +import 'dart:io' show Directory; +import 'dart:async'; + +import 'package:flutter_test/flutter_test.dart'; +import 'package:mockito/mockito.dart'; +import 'package:path_provider/path_provider.dart'; +import 'package:path_provider_platform_interface/path_provider_platform_interface.dart'; +import 'package:plugin_platform_interface/plugin_platform_interface.dart'; + +const String kTemporaryPath = 'temporaryPath'; +const String kApplicationSupportPath = 'applicationSupportPath'; +const String kDownloadsPath = 'downloadsPath'; +const String kLibraryPath = 'libraryPath'; +const String kApplicationDocumentsPath = 'applicationDocumentsPath'; +const String kExternalCachePath = 'externalCachePath'; +const String kExternalStoragePath = 'externalStoragePath'; + +void main() { + group('PathProvider', () { + TestWidgetsFlutterBinding.ensureInitialized(); + + setUp(() async { + PathProviderPlatform.instance = MockPathProviderPlatform(); + }); + + test('getTemporaryDirectory', () async { + Directory result = await getTemporaryDirectory(); + expect(result.path, kTemporaryPath); + }); + + test('getApplicationSupportDirectory', () async { + Directory result = await getApplicationSupportDirectory(); + expect(result.path, kApplicationSupportPath); + }); + + test('getLibraryDirectory', () async { + Directory result = await getLibraryDirectory(); + expect(result.path, kLibraryPath); + }); + + test('getApplicationDocumentsDirectory', () async { + Directory result = await getApplicationDocumentsDirectory(); + expect(result.path, kApplicationDocumentsPath); + }); + + test('getExternalStorageDirectory', () async { + Directory result = await getExternalStorageDirectory(); + expect(result.path, kExternalStoragePath); + }); + + test('getExternalCacheDirectories', () async { + List result = await getExternalCacheDirectories(); + expect(result.length, 1); + expect(result.first.path, kExternalCachePath); + }); + + test('getExternalStorageDirectories', () async { + List result = await getExternalStorageDirectories(); + expect(result.length, 1); + expect(result.first.path, kExternalStoragePath); + }); + + test('getDownloadsDirectory', () async { + Directory result = await getDownloadsDirectory(); + expect(result.path, kDownloadsPath); + }); + }); +} + +class MockPathProviderPlatform extends Mock + with MockPlatformInterfaceMixin + implements PathProviderPlatform { + Future getTemporaryPath() async { + return kTemporaryPath; + } + + Future getApplicationSupportPath() async { + return kApplicationSupportPath; + } + + Future getLibraryPath() async { + return kLibraryPath; + } + + Future getApplicationDocumentsPath() async { + return kApplicationDocumentsPath; + } + + Future getExternalStoragePath() async { + return kExternalStoragePath; + } + + Future> getExternalCachePaths() async { + return [kExternalCachePath]; + } + + Future> getExternalStoragePaths({ + StorageDirectory type, + }) async { + return [kExternalStoragePath]; + } + + Future getDownloadsPath() async { + return kDownloadsPath; + } +} diff --git a/packages/path_provider/path_provider_macos/CHANGELOG.md b/packages/path_provider/path_provider_macos/CHANGELOG.md index ef9c69f45b06..62d7cd24b00f 100644 --- a/packages/path_provider/path_provider_macos/CHANGELOG.md +++ b/packages/path_provider/path_provider_macos/CHANGELOG.md @@ -1,3 +1,7 @@ +## 0.0.4 + +* Adds an example app to run integration tests. + ## 0.0.3+1 * Make the pedantic dev_dependency explicit. diff --git a/packages/path_provider/path_provider_macos/example/README.md b/packages/path_provider/path_provider_macos/example/README.md new file mode 100644 index 000000000000..c81750248f02 --- /dev/null +++ b/packages/path_provider/path_provider_macos/example/README.md @@ -0,0 +1,8 @@ +# path_provider_macos_example + +Demonstrates how to use the path_provider_macos plugin. + +## Getting Started + +For help getting started with Flutter, view our online +[documentation](http://flutter.io/). diff --git a/packages/path_provider/path_provider_macos/example/android/app/build.gradle b/packages/path_provider/path_provider_macos/example/android/app/build.gradle new file mode 100644 index 000000000000..0404c7203903 --- /dev/null +++ b/packages/path_provider/path_provider_macos/example/android/app/build.gradle @@ -0,0 +1,64 @@ +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 + + lintOptions { + disable 'InvalidPackage' + } + + defaultConfig { + applicationId "io.flutter.plugins.pathproviderexample" + minSdkVersion 16 + targetSdkVersion 28 + versionCode flutterVersionCode.toInteger() + versionName flutterVersionName + testInstrumentationRunner "androidx.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 { + androidTestImplementation 'androidx.test:runner:1.2.0' + androidTestImplementation 'androidx.test:rules:1.2.0' + androidTestImplementation 'androidx.test.espresso:espresso-core:3.2.0' + + testImplementation 'junit:junit:4.12' + androidTestImplementation 'androidx.test:runner:1.1.1' + androidTestImplementation 'androidx.test.espresso:espresso-core:3.1.1' +} diff --git a/packages/path_provider/path_provider_macos/example/android/app/gradle/wrapper/gradle-wrapper.properties b/packages/path_provider/path_provider_macos/example/android/app/gradle/wrapper/gradle-wrapper.properties new file mode 100644 index 000000000000..9a4163a4f5ee --- /dev/null +++ b/packages/path_provider/path_provider_macos/example/android/app/gradle/wrapper/gradle-wrapper.properties @@ -0,0 +1,5 @@ +distributionBase=GRADLE_USER_HOME +distributionPath=wrapper/dists +distributionUrl=https\://services.gradle.org/distributions/gradle-4.6-all.zip +zipStoreBase=GRADLE_USER_HOME +zipStorePath=wrapper/dists diff --git a/packages/path_provider/path_provider_macos/example/android/app/src/androidTest/java/EmbeddingV1ActivityTest.java b/packages/path_provider/path_provider_macos/example/android/app/src/androidTest/java/EmbeddingV1ActivityTest.java new file mode 100644 index 000000000000..cce04b79f516 --- /dev/null +++ b/packages/path_provider/path_provider_macos/example/android/app/src/androidTest/java/EmbeddingV1ActivityTest.java @@ -0,0 +1,15 @@ + +package io.flutter.plugins.pathprovider; + +import androidx.test.rule.ActivityTestRule; +import dev.flutter.plugins.e2e.FlutterRunner; +import io.flutter.plugins.pathproviderexample.EmbeddingV1Activity; +import org.junit.Rule; +import org.junit.runner.RunWith; + +@RunWith(FlutterRunner.class) +public class EmbeddingV1ActivityTest { + @Rule + public ActivityTestRule rule = + new ActivityTestRule<>(EmbeddingV1Activity.class); +} diff --git a/packages/device_info/example/android/app/src/main/java/io/flutter/plugins/deviceinfoexample/MainActivityTest.java b/packages/path_provider/path_provider_macos/example/android/app/src/androidTest/java/MainActivityTest.java similarity index 59% rename from packages/device_info/example/android/app/src/main/java/io/flutter/plugins/deviceinfoexample/MainActivityTest.java rename to packages/path_provider/path_provider_macos/example/android/app/src/androidTest/java/MainActivityTest.java index 36967ebf4564..7bdd449981f5 100644 --- a/packages/device_info/example/android/app/src/main/java/io/flutter/plugins/deviceinfoexample/MainActivityTest.java +++ b/packages/path_provider/path_provider_macos/example/android/app/src/androidTest/java/MainActivityTest.java @@ -1,11 +1,9 @@ -// Copyright 2019 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. -package io.flutter.plugins.deviceinfoexample; +package io.flutter.plugins.pathprovider; import androidx.test.rule.ActivityTestRule; import dev.flutter.plugins.e2e.FlutterRunner; +import io.flutter.plugins.pathproviderexample.MainActivity; import org.junit.Rule; import org.junit.runner.RunWith; diff --git a/packages/path_provider/path_provider_macos/example/android/app/src/main/AndroidManifest.xml b/packages/path_provider/path_provider_macos/example/android/app/src/main/AndroidManifest.xml new file mode 100644 index 000000000000..9e03a9373e33 --- /dev/null +++ b/packages/path_provider/path_provider_macos/example/android/app/src/main/AndroidManifest.xml @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + diff --git a/packages/path_provider/path_provider_macos/example/android/app/src/main/java/io/flutter/plugins/pathproviderexample/EmbeddingV1Activity.java b/packages/path_provider/path_provider_macos/example/android/app/src/main/java/io/flutter/plugins/pathproviderexample/EmbeddingV1Activity.java new file mode 100644 index 000000000000..a826af36a9d3 --- /dev/null +++ b/packages/path_provider/path_provider_macos/example/android/app/src/main/java/io/flutter/plugins/pathproviderexample/EmbeddingV1Activity.java @@ -0,0 +1,14 @@ + +package io.flutter.plugins.pathproviderexample; + +import android.os.Bundle; +import io.flutter.app.FlutterActivity; +import io.flutter.plugins.GeneratedPluginRegistrant; + +public class EmbeddingV1Activity extends FlutterActivity { + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + GeneratedPluginRegistrant.registerWith(this); + } +} diff --git a/packages/path_provider/path_provider_macos/example/android/app/src/main/java/io/flutter/plugins/pathproviderexample/MainActivity.java b/packages/path_provider/path_provider_macos/example/android/app/src/main/java/io/flutter/plugins/pathproviderexample/MainActivity.java new file mode 100644 index 000000000000..36372960fe9c --- /dev/null +++ b/packages/path_provider/path_provider_macos/example/android/app/src/main/java/io/flutter/plugins/pathproviderexample/MainActivity.java @@ -0,0 +1,19 @@ +// Copyright 2017 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +package io.flutter.plugins.pathproviderexample; + +import dev.flutter.plugins.e2e.E2EPlugin; +import io.flutter.embedding.android.FlutterActivity; +import io.flutter.embedding.engine.FlutterEngine; +import io.flutter.plugins.pathprovider.PathProviderPlugin; + +public class MainActivity extends FlutterActivity { + // TODO(xster): Remove this once v2 of GeneratedPluginRegistrant rolls to stable. https://github.com/flutter/flutter/issues/42694 + @Override + public void configureFlutterEngine(FlutterEngine flutterEngine) { + flutterEngine.getPlugins().add(new PathProviderPlugin()); + flutterEngine.getPlugins().add(new E2EPlugin()); + } +} diff --git a/packages/path_provider/path_provider_macos/example/android/app/src/main/res/mipmap-hdpi/ic_launcher.png b/packages/path_provider/path_provider_macos/example/android/app/src/main/res/mipmap-hdpi/ic_launcher.png new file mode 100644 index 000000000000..db77bb4b7b09 Binary files /dev/null and b/packages/path_provider/path_provider_macos/example/android/app/src/main/res/mipmap-hdpi/ic_launcher.png differ diff --git a/packages/path_provider/path_provider_macos/example/android/app/src/main/res/mipmap-mdpi/ic_launcher.png b/packages/path_provider/path_provider_macos/example/android/app/src/main/res/mipmap-mdpi/ic_launcher.png new file mode 100644 index 000000000000..17987b79bb8a Binary files /dev/null and b/packages/path_provider/path_provider_macos/example/android/app/src/main/res/mipmap-mdpi/ic_launcher.png differ diff --git a/packages/path_provider/path_provider_macos/example/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png b/packages/path_provider/path_provider_macos/example/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png new file mode 100644 index 000000000000..09d4391482be Binary files /dev/null and b/packages/path_provider/path_provider_macos/example/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png differ diff --git a/packages/path_provider/path_provider_macos/example/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png b/packages/path_provider/path_provider_macos/example/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png new file mode 100644 index 000000000000..d5f1c8d34e7a Binary files /dev/null and b/packages/path_provider/path_provider_macos/example/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png differ diff --git a/packages/path_provider/path_provider_macos/example/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png b/packages/path_provider/path_provider_macos/example/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png new file mode 100644 index 000000000000..4d6372eebdb2 Binary files /dev/null and b/packages/path_provider/path_provider_macos/example/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png differ diff --git a/packages/path_provider/path_provider_macos/example/android/build.gradle b/packages/path_provider/path_provider_macos/example/android/build.gradle new file mode 100644 index 000000000000..541636cc492a --- /dev/null +++ b/packages/path_provider/path_provider_macos/example/android/build.gradle @@ -0,0 +1,29 @@ +buildscript { + repositories { + google() + jcenter() + } + + dependencies { + classpath 'com.android.tools.build:gradle:3.3.0' + } +} + +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/packages/path_provider/path_provider_macos/example/android/gradle.properties b/packages/path_provider/path_provider_macos/example/android/gradle.properties new file mode 100644 index 000000000000..38c8d4544ff1 --- /dev/null +++ b/packages/path_provider/path_provider_macos/example/android/gradle.properties @@ -0,0 +1,4 @@ +org.gradle.jvmargs=-Xmx1536M +android.enableR8=true +android.useAndroidX=true +android.enableJetifier=true diff --git a/packages/path_provider/path_provider_macos/example/android/gradle/wrapper/gradle-wrapper.properties b/packages/path_provider/path_provider_macos/example/android/gradle/wrapper/gradle-wrapper.properties new file mode 100644 index 000000000000..caf54fa2801c --- /dev/null +++ b/packages/path_provider/path_provider_macos/example/android/gradle/wrapper/gradle-wrapper.properties @@ -0,0 +1,5 @@ +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/packages/path_provider/path_provider_macos/example/android/settings.gradle b/packages/path_provider/path_provider_macos/example/android/settings.gradle new file mode 100644 index 000000000000..6cb349eef1b6 --- /dev/null +++ b/packages/path_provider/path_provider_macos/example/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.withInputStream { stream -> plugins.load(stream) } +} + +plugins.each { name, path -> + def pluginDirectory = flutterProjectRoot.resolve(path).resolve('android').toFile() + include ":$name" + project(":$name").projectDir = pluginDirectory +} \ No newline at end of file diff --git a/packages/path_provider/path_provider_macos/example/ios/Flutter/AppFrameworkInfo.plist b/packages/path_provider/path_provider_macos/example/ios/Flutter/AppFrameworkInfo.plist new file mode 100644 index 000000000000..6c2de8086bcd --- /dev/null +++ b/packages/path_provider/path_provider_macos/example/ios/Flutter/AppFrameworkInfo.plist @@ -0,0 +1,30 @@ + + + + + CFBundleDevelopmentRegion + en + CFBundleExecutable + App + CFBundleIdentifier + io.flutter.flutter.app + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + App + CFBundlePackageType + FMWK + CFBundleShortVersionString + 1.0 + CFBundleSignature + ???? + CFBundleVersion + 1.0 + UIRequiredDeviceCapabilities + + arm64 + + MinimumOSVersion + 8.0 + + diff --git a/packages/path_provider/path_provider_macos/example/ios/Flutter/Debug.xcconfig b/packages/path_provider/path_provider_macos/example/ios/Flutter/Debug.xcconfig new file mode 100644 index 000000000000..9803018ca79d --- /dev/null +++ b/packages/path_provider/path_provider_macos/example/ios/Flutter/Debug.xcconfig @@ -0,0 +1,2 @@ +#include "Generated.xcconfig" +#include "Pods/Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig" diff --git a/packages/path_provider/path_provider_macos/example/ios/Flutter/Release.xcconfig b/packages/path_provider/path_provider_macos/example/ios/Flutter/Release.xcconfig new file mode 100644 index 000000000000..a4a8c604e13d --- /dev/null +++ b/packages/path_provider/path_provider_macos/example/ios/Flutter/Release.xcconfig @@ -0,0 +1,2 @@ +#include "Generated.xcconfig" +#include "Pods/Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig" diff --git a/packages/path_provider/path_provider_macos/example/ios/Runner.xcodeproj/project.pbxproj b/packages/path_provider/path_provider_macos/example/ios/Runner.xcodeproj/project.pbxproj new file mode 100644 index 000000000000..eb0222a7c9c5 --- /dev/null +++ b/packages/path_provider/path_provider_macos/example/ios/Runner.xcodeproj/project.pbxproj @@ -0,0 +1,490 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 46; + objects = { + +/* Begin PBXBuildFile section */ + 2D9222481EC32A19007564B0 /* GeneratedPluginRegistrant.m in Sources */ = {isa = PBXBuildFile; fileRef = 2D9222471EC32A19007564B0 /* 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, ); }; }; + 85DDFCF6BBDEE02B9D9F8138 /* libPods-Runner.a in Frameworks */ = {isa = PBXBuildFile; fileRef = C0EE60090AA5F3AAAF2175B6 /* libPods-Runner.a */; }; + 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, ); }; }; + 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 */ + 2D9222461EC32A19007564B0 /* GeneratedPluginRegistrant.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = GeneratedPluginRegistrant.h; sourceTree = ""; }; + 2D9222471EC32A19007564B0 /* 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 = ""; }; + 694A199F61914F41AAFD0B7F /* Pods-Runner.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug.xcconfig"; path = "Pods/Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"; 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 = ""; }; + C0EE60090AA5F3AAAF2175B6 /* libPods-Runner.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-Runner.a"; sourceTree = BUILT_PRODUCTS_DIR; }; + D317CA1E83064E01753D8BB5 /* Pods-Runner.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release.xcconfig"; path = "Pods/Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"; sourceTree = ""; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + 97C146EB1CF9000F007C117D /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 9705A1C61CF904A100538489 /* Flutter.framework in Frameworks */, + 3B80C3941E831B6300D905FE /* App.framework in Frameworks */, + 85DDFCF6BBDEE02B9D9F8138 /* libPods-Runner.a in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + 840012C8B5EDBCF56B0E4AC1 /* Pods */ = { + isa = PBXGroup; + children = ( + 694A199F61914F41AAFD0B7F /* Pods-Runner.debug.xcconfig */, + D317CA1E83064E01753D8BB5 /* Pods-Runner.release.xcconfig */, + ); + name = Pods; + sourceTree = ""; + }; + 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 */, + 840012C8B5EDBCF56B0E4AC1 /* Pods */, + CF3B75C9A7D2FA2A4C99F110 /* Frameworks */, + ); + sourceTree = ""; + }; + 97C146EF1CF9000F007C117D /* Products */ = { + isa = PBXGroup; + children = ( + 97C146EE1CF9000F007C117D /* Runner.app */, + ); + name = Products; + sourceTree = ""; + }; + 97C146F01CF9000F007C117D /* Runner */ = { + isa = PBXGroup; + children = ( + 2D9222461EC32A19007564B0 /* GeneratedPluginRegistrant.h */, + 2D9222471EC32A19007564B0 /* GeneratedPluginRegistrant.m */, + 7AFFD8ED1D35381100E5BB4D /* AppDelegate.h */, + 7AFFD8EE1D35381100E5BB4D /* AppDelegate.m */, + 97C146FA1CF9000F007C117D /* Main.storyboard */, + 97C146FD1CF9000F007C117D /* Assets.xcassets */, + 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */, + 97C147021CF9000F007C117D /* Info.plist */, + 97C146F11CF9000F007C117D /* Supporting Files */, + ); + path = Runner; + sourceTree = ""; + }; + 97C146F11CF9000F007C117D /* Supporting Files */ = { + isa = PBXGroup; + children = ( + 97C146F21CF9000F007C117D /* main.m */, + ); + name = "Supporting Files"; + sourceTree = ""; + }; + CF3B75C9A7D2FA2A4C99F110 /* Frameworks */ = { + isa = PBXGroup; + children = ( + C0EE60090AA5F3AAAF2175B6 /* libPods-Runner.a */, + ); + name = Frameworks; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXNativeTarget section */ + 97C146ED1CF9000F007C117D /* Runner */ = { + isa = PBXNativeTarget; + buildConfigurationList = 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */; + buildPhases = ( + AB1344B0443C71CD721E1BB7 /* [CP] Check Pods Manifest.lock */, + 9740EEB61CF901F6004384FC /* Run Script */, + 97C146EA1CF9000F007C117D /* Sources */, + 97C146EB1CF9000F007C117D /* Frameworks */, + 97C146EC1CF9000F007C117D /* Resources */, + 9705A1C41CF9048500538489 /* Embed Frameworks */, + 95BB15E9E1769C0D146AA592 /* [CP] Embed Pods 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 = 1100; + ORGANIZATIONNAME = "The Chromium Authors"; + TargetAttributes = { + 97C146ED1CF9000F007C117D = { + CreatedOnToolsVersion = 7.3.1; + }; + }; + }; + buildConfigurationList = 97C146E91CF9000F007C117D /* Build configuration list for PBXProject "Runner" */; + compatibilityVersion = "Xcode 3.2"; + developmentRegion = en; + hasScannedForEncodings = 0; + knownRegions = ( + en, + Base, + ); + mainGroup = 97C146E51CF9000F007C117D; + productRefGroup = 97C146EF1CF9000F007C117D /* Products */; + projectDirPath = ""; + projectRoot = ""; + targets = ( + 97C146ED1CF9000F007C117D /* Runner */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXResourcesBuildPhase section */ + 97C146EC1CF9000F007C117D /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */, + 3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */, + 97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */, + 97C146FC1CF9000F007C117D /* Main.storyboard in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXResourcesBuildPhase section */ + +/* Begin PBXShellScriptBuildPhase section */ + 3B06AD1E1E4923F5004D2608 /* Thin Binary */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputPaths = ( + ); + name = "Thin Binary"; + outputPaths = ( + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" thin"; + }; + 95BB15E9E1769C0D146AA592 /* [CP] Embed Pods Frameworks */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputPaths = ( + ); + name = "[CP] Embed Pods Frameworks"; + outputPaths = ( + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh\"\n"; + showEnvVarsInLog = 0; + }; + 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"; + }; + AB1344B0443C71CD721E1BB7 /* [CP] Check Pods Manifest.lock */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputPaths = ( + "${PODS_PODFILE_DIR_PATH}/Podfile.lock", + "${PODS_ROOT}/Manifest.lock", + ); + name = "[CP] Check Pods Manifest.lock"; + outputPaths = ( + "$(DERIVED_FILE_DIR)/Pods-Runner-checkManifestLockResult.txt", + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; + showEnvVarsInLog = 0; + }; +/* End PBXShellScriptBuildPhase section */ + +/* Begin PBXSourcesBuildPhase section */ + 97C146EA1CF9000F007C117D /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 978B8F6F1D3862AE00F588F7 /* AppDelegate.m in Sources */, + 97C146F31CF9000F007C117D /* main.m in Sources */, + 2D9222481EC32A19007564B0 /* 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 */ + 97C147031CF9000F007C117D /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 9740EEB21CF90195004384FC /* Debug.xcconfig */; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; + CLANG_ANALYZER_NONNULL = YES; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = dwarf; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_TESTABILITY = YES; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_DYNAMIC_NO_PIC = NO; + GCC_NO_COMMON_BLOCKS = YES; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_PREPROCESSOR_DEFINITIONS = ( + "DEBUG=1", + "$(inherited)", + ); + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 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_LOCALIZABILITY_NONLOCALIZED = YES; + CLANG_ANALYZER_NONNULL = YES; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + ENABLE_NS_ASSERTIONS = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_NO_COMMON_BLOCKS = YES; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 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; + 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 = io.flutter.plugins.pathProviderExample; + PRODUCT_NAME = "$(TARGET_NAME)"; + }; + name = Debug; + }; + 97C147071CF9000F007C117D /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + 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 = io.flutter.plugins.pathProviderExample; + PRODUCT_NAME = "$(TARGET_NAME)"; + }; + name = Release; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + 97C146E91CF9000F007C117D /* Build configuration list for PBXProject "Runner" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 97C147031CF9000F007C117D /* Debug */, + 97C147041CF9000F007C117D /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 97C147061CF9000F007C117D /* Debug */, + 97C147071CF9000F007C117D /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; +/* End XCConfigurationList section */ + }; + rootObject = 97C146E61CF9000F007C117D /* Project object */; +} diff --git a/packages/path_provider/path_provider_macos/example/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/packages/path_provider/path_provider_macos/example/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata new file mode 100644 index 000000000000..21a3cc14c74e --- /dev/null +++ b/packages/path_provider/path_provider_macos/example/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,10 @@ + + + + + + + diff --git a/packages/path_provider/path_provider_macos/example/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/packages/path_provider/path_provider_macos/example/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme new file mode 100644 index 000000000000..3bb3697ef41c --- /dev/null +++ b/packages/path_provider/path_provider_macos/example/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -0,0 +1,87 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/packages/path_provider/path_provider_macos/example/ios/Runner.xcworkspace/contents.xcworkspacedata b/packages/path_provider/path_provider_macos/example/ios/Runner.xcworkspace/contents.xcworkspacedata new file mode 100644 index 000000000000..21a3cc14c74e --- /dev/null +++ b/packages/path_provider/path_provider_macos/example/ios/Runner.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,10 @@ + + + + + + + diff --git a/packages/path_provider/path_provider_macos/example/ios/Runner/AppDelegate.h b/packages/path_provider/path_provider_macos/example/ios/Runner/AppDelegate.h new file mode 100644 index 000000000000..d9e18e990f2e --- /dev/null +++ b/packages/path_provider/path_provider_macos/example/ios/Runner/AppDelegate.h @@ -0,0 +1,10 @@ +// Copyright 2017 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#import +#import + +@interface AppDelegate : FlutterAppDelegate + +@end diff --git a/packages/path_provider/path_provider_macos/example/ios/Runner/AppDelegate.m b/packages/path_provider/path_provider_macos/example/ios/Runner/AppDelegate.m new file mode 100644 index 000000000000..a4b51c88eb60 --- /dev/null +++ b/packages/path_provider/path_provider_macos/example/ios/Runner/AppDelegate.m @@ -0,0 +1,16 @@ +// Copyright 2017 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "AppDelegate.h" +#include "GeneratedPluginRegistrant.h" + +@implementation AppDelegate + +- (BOOL)application:(UIApplication *)application + didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { + [GeneratedPluginRegistrant registerWithRegistry:self]; + return [super application:application didFinishLaunchingWithOptions:launchOptions]; +} + +@end diff --git a/packages/path_provider/path_provider_macos/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json b/packages/path_provider/path_provider_macos/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json new file mode 100644 index 000000000000..d22f10b2ab63 --- /dev/null +++ b/packages/path_provider/path_provider_macos/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json @@ -0,0 +1,116 @@ +{ + "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" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} diff --git a/packages/path_provider/path_provider_macos/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png b/packages/path_provider/path_provider_macos/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png new file mode 100644 index 000000000000..28c6bf03016f Binary files /dev/null and b/packages/path_provider/path_provider_macos/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png differ diff --git a/packages/path_provider/path_provider_macos/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png b/packages/path_provider/path_provider_macos/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png new file mode 100644 index 000000000000..2ccbfd967d96 Binary files /dev/null and b/packages/path_provider/path_provider_macos/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png differ diff --git a/packages/path_provider/path_provider_macos/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png b/packages/path_provider/path_provider_macos/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png new file mode 100644 index 000000000000..f091b6b0bca8 Binary files /dev/null and b/packages/path_provider/path_provider_macos/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png differ diff --git a/packages/path_provider/path_provider_macos/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png b/packages/path_provider/path_provider_macos/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png new file mode 100644 index 000000000000..4cde12118dda Binary files /dev/null and b/packages/path_provider/path_provider_macos/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png differ diff --git a/packages/path_provider/path_provider_macos/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png b/packages/path_provider/path_provider_macos/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png new file mode 100644 index 000000000000..d0ef06e7edb8 Binary files /dev/null and b/packages/path_provider/path_provider_macos/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png differ diff --git a/packages/path_provider/path_provider_macos/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png b/packages/path_provider/path_provider_macos/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png new file mode 100644 index 000000000000..dcdc2306c285 Binary files /dev/null and b/packages/path_provider/path_provider_macos/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png differ diff --git a/packages/path_provider/path_provider_macos/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png b/packages/path_provider/path_provider_macos/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png new file mode 100644 index 000000000000..2ccbfd967d96 Binary files /dev/null and b/packages/path_provider/path_provider_macos/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png differ diff --git a/packages/path_provider/path_provider_macos/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png b/packages/path_provider/path_provider_macos/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png new file mode 100644 index 000000000000..c8f9ed8f5cee Binary files /dev/null and b/packages/path_provider/path_provider_macos/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png differ diff --git a/packages/path_provider/path_provider_macos/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png b/packages/path_provider/path_provider_macos/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png new file mode 100644 index 000000000000..a6d6b8609df0 Binary files /dev/null and b/packages/path_provider/path_provider_macos/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png differ diff --git a/packages/path_provider/path_provider_macos/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png b/packages/path_provider/path_provider_macos/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png new file mode 100644 index 000000000000..a6d6b8609df0 Binary files /dev/null and b/packages/path_provider/path_provider_macos/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png differ diff --git a/packages/path_provider/path_provider_macos/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png b/packages/path_provider/path_provider_macos/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png new file mode 100644 index 000000000000..75b2d164a5a9 Binary files /dev/null and b/packages/path_provider/path_provider_macos/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png differ diff --git a/packages/path_provider/path_provider_macos/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png b/packages/path_provider/path_provider_macos/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png new file mode 100644 index 000000000000..c4df70d39da7 Binary files /dev/null and b/packages/path_provider/path_provider_macos/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png differ diff --git a/packages/path_provider/path_provider_macos/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png b/packages/path_provider/path_provider_macos/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png new file mode 100644 index 000000000000..6a84f41e14e2 Binary files /dev/null and b/packages/path_provider/path_provider_macos/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png differ diff --git a/packages/path_provider/path_provider_macos/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png b/packages/path_provider/path_provider_macos/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png new file mode 100644 index 000000000000..d0e1f5853602 Binary files /dev/null and b/packages/path_provider/path_provider_macos/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png differ diff --git a/packages/path_provider/path_provider_macos/example/ios/Runner/Base.lproj/LaunchScreen.storyboard b/packages/path_provider/path_provider_macos/example/ios/Runner/Base.lproj/LaunchScreen.storyboard new file mode 100644 index 000000000000..ebf48f603974 --- /dev/null +++ b/packages/path_provider/path_provider_macos/example/ios/Runner/Base.lproj/LaunchScreen.storyboard @@ -0,0 +1,27 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/packages/path_provider/path_provider_macos/example/ios/Runner/Base.lproj/Main.storyboard b/packages/path_provider/path_provider_macos/example/ios/Runner/Base.lproj/Main.storyboard new file mode 100644 index 000000000000..f3c28516fb38 --- /dev/null +++ b/packages/path_provider/path_provider_macos/example/ios/Runner/Base.lproj/Main.storyboard @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/packages/path_provider/path_provider_macos/example/ios/Runner/Info.plist b/packages/path_provider/path_provider_macos/example/ios/Runner/Info.plist new file mode 100644 index 000000000000..342db6a5dcaf --- /dev/null +++ b/packages/path_provider/path_provider_macos/example/ios/Runner/Info.plist @@ -0,0 +1,49 @@ + + + + + CFBundleDevelopmentRegion + en + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIdentifier + $(PRODUCT_BUNDLE_IDENTIFIER) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + path_provider_example + CFBundlePackageType + APPL + CFBundleShortVersionString + 1.0 + CFBundleSignature + ???? + CFBundleVersion + 1 + LSRequiresIPhoneOS + + UILaunchStoryboardName + LaunchScreen + UIMainStoryboardFile + Main + UIRequiredDeviceCapabilities + + arm64 + + UISupportedInterfaceOrientations + + UIInterfaceOrientationPortrait + UIInterfaceOrientationLandscapeLeft + UIInterfaceOrientationLandscapeRight + + UISupportedInterfaceOrientations~ipad + + UIInterfaceOrientationPortrait + UIInterfaceOrientationPortraitUpsideDown + UIInterfaceOrientationLandscapeLeft + UIInterfaceOrientationLandscapeRight + + UIViewControllerBasedStatusBarAppearance + + + diff --git a/packages/path_provider/path_provider_macos/example/ios/Runner/main.m b/packages/path_provider/path_provider_macos/example/ios/Runner/main.m new file mode 100644 index 000000000000..bec320c0bee0 --- /dev/null +++ b/packages/path_provider/path_provider_macos/example/ios/Runner/main.m @@ -0,0 +1,13 @@ +// Copyright 2017 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#import +#import +#import "AppDelegate.h" + +int main(int argc, char* argv[]) { + @autoreleasepool { + return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class])); + } +} diff --git a/packages/path_provider/path_provider_macos/example/lib/main.dart b/packages/path_provider/path_provider_macos/example/lib/main.dart new file mode 100644 index 000000000000..473a989914f6 --- /dev/null +++ b/packages/path_provider/path_provider_macos/example/lib/main.dart @@ -0,0 +1,149 @@ +// Copyright 2019 The Flutter Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// ignore_for_file: public_member_api_docs + +import 'dart:async'; +import 'dart:io' show Directory; + +import 'package:flutter/material.dart'; +import 'package:path_provider/path_provider.dart'; + +void main() { + runApp(MyApp()); +} + +class MyApp extends StatelessWidget { + @override + Widget build(BuildContext context) { + return MaterialApp( + title: 'Path Provider', + theme: ThemeData( + primarySwatch: Colors.blue, + ), + home: MyHomePage(title: 'Path Provider'), + ); + } +} + +class MyHomePage extends StatefulWidget { + MyHomePage({Key key, this.title}) : super(key: key); + final String title; + + @override + _MyHomePageState createState() => _MyHomePageState(); +} + +class _MyHomePageState extends State { + Future _tempDirectory; + Future _appSupportDirectory; + Future _appDocumentsDirectory; + Future _appLibraryDirectory; + Future _downloadsDirectory; + + void _requestTempDirectory() { + setState(() { + _tempDirectory = getTemporaryDirectory(); + }); + } + + Widget _buildDirectory( + BuildContext context, AsyncSnapshot snapshot) { + Text text = const Text(''); + if (snapshot.connectionState == ConnectionState.done) { + if (snapshot.hasError) { + text = Text('Error: ${snapshot.error}'); + } else if (snapshot.hasData) { + text = Text('path: ${snapshot.data.path}'); + } else { + text = const Text('path unavailable'); + } + } + return Padding(padding: const EdgeInsets.all(16.0), child: text); + } + + void _requestAppDocumentsDirectory() { + setState(() { + _appDocumentsDirectory = getApplicationDocumentsDirectory(); + }); + } + + void _requestAppSupportDirectory() { + setState(() { + _appSupportDirectory = getApplicationSupportDirectory(); + }); + } + + void _requestAppLibraryDirectory() { + setState(() { + _appLibraryDirectory = getLibraryDirectory(); + }); + } + + void _requestDownloadsDirectory() { + setState(() { + _downloadsDirectory = getDownloadsDirectory(); + }); + } + + @override + Widget build(BuildContext context) { + return Scaffold( + appBar: AppBar( + title: Text(widget.title), + ), + body: Center( + child: ListView( + children: [ + Padding( + padding: const EdgeInsets.all(16.0), + child: RaisedButton( + child: const Text('Get Temporary Directory'), + onPressed: _requestTempDirectory, + ), + ), + FutureBuilder( + future: _tempDirectory, builder: _buildDirectory), + Padding( + padding: const EdgeInsets.all(16.0), + child: RaisedButton( + child: const Text('Get Application Documents Directory'), + onPressed: _requestAppDocumentsDirectory, + ), + ), + FutureBuilder( + future: _appDocumentsDirectory, builder: _buildDirectory), + Padding( + padding: const EdgeInsets.all(16.0), + child: RaisedButton( + child: const Text('Get Application Support Directory'), + onPressed: _requestAppSupportDirectory, + ), + ), + FutureBuilder( + future: _appSupportDirectory, builder: _buildDirectory), + Padding( + padding: const EdgeInsets.all(16.0), + child: RaisedButton( + child: const Text('Get Application Library Directory'), + onPressed: _requestAppLibraryDirectory, + ), + ), + FutureBuilder( + future: _appLibraryDirectory, builder: _buildDirectory), + Padding( + padding: const EdgeInsets.all(16.0), + child: RaisedButton( + child: const Text('Get Downlads Directory'), + onPressed: _requestDownloadsDirectory, + ), + ), + FutureBuilder( + future: _downloadsDirectory, builder: _buildDirectory), + ], + ), + ), + ); + } +} diff --git a/packages/path_provider/path_provider_macos/example/macos/Flutter/Flutter-Debug.xcconfig b/packages/path_provider/path_provider_macos/example/macos/Flutter/Flutter-Debug.xcconfig new file mode 100644 index 000000000000..785633d3a86b --- /dev/null +++ b/packages/path_provider/path_provider_macos/example/macos/Flutter/Flutter-Debug.xcconfig @@ -0,0 +1,2 @@ +#include "Pods/Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig" +#include "ephemeral/Flutter-Generated.xcconfig" diff --git a/packages/path_provider/path_provider_macos/example/macos/Flutter/Flutter-Release.xcconfig b/packages/path_provider/path_provider_macos/example/macos/Flutter/Flutter-Release.xcconfig new file mode 100644 index 000000000000..5fba960c3af2 --- /dev/null +++ b/packages/path_provider/path_provider_macos/example/macos/Flutter/Flutter-Release.xcconfig @@ -0,0 +1,2 @@ +#include "Pods/Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig" +#include "ephemeral/Flutter-Generated.xcconfig" diff --git a/packages/path_provider/path_provider_macos/example/macos/Runner.xcodeproj/project.pbxproj b/packages/path_provider/path_provider_macos/example/macos/Runner.xcodeproj/project.pbxproj new file mode 100644 index 000000000000..1e39683e1446 --- /dev/null +++ b/packages/path_provider/path_provider_macos/example/macos/Runner.xcodeproj/project.pbxproj @@ -0,0 +1,654 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 51; + objects = { + +/* Begin PBXAggregateTarget section */ + 33CC111A2044C6BA0003C045 /* Flutter Assemble */ = { + isa = PBXAggregateTarget; + buildConfigurationList = 33CC111B2044C6BA0003C045 /* Build configuration list for PBXAggregateTarget "Flutter Assemble" */; + buildPhases = ( + 33CC111E2044C6BF0003C045 /* ShellScript */, + ); + dependencies = ( + ); + name = "Flutter Assemble"; + productName = FLX; + }; +/* End PBXAggregateTarget section */ + +/* Begin PBXBuildFile section */ + 23F6FAA3AF82DFCF2B7DD79A /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1523F64D34B952AB303BFFA8 /* Pods_Runner.framework */; }; + 335BBD1B22A9A15E00E9071D /* GeneratedPluginRegistrant.swift in Sources */ = {isa = PBXBuildFile; fileRef = 335BBD1A22A9A15E00E9071D /* GeneratedPluginRegistrant.swift */; }; + 33CC10F12044A3C60003C045 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 33CC10F02044A3C60003C045 /* AppDelegate.swift */; }; + 33CC10F32044A3C60003C045 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 33CC10F22044A3C60003C045 /* Assets.xcassets */; }; + 33CC10F62044A3C60003C045 /* MainMenu.xib in Resources */ = {isa = PBXBuildFile; fileRef = 33CC10F42044A3C60003C045 /* MainMenu.xib */; }; + 33CC11132044BFA00003C045 /* MainFlutterWindow.swift in Sources */ = {isa = PBXBuildFile; fileRef = 33CC11122044BFA00003C045 /* MainFlutterWindow.swift */; }; + 33D1A10422148B71006C7A3E /* FlutterMacOS.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 33D1A10322148B71006C7A3E /* FlutterMacOS.framework */; }; + 33D1A10522148B93006C7A3E /* FlutterMacOS.framework in Bundle Framework */ = {isa = PBXBuildFile; fileRef = 33D1A10322148B71006C7A3E /* FlutterMacOS.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; + D73912F022F37F9E000D13A0 /* App.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D73912EF22F37F9E000D13A0 /* App.framework */; }; + D73912F222F3801D000D13A0 /* App.framework in Bundle Framework */ = {isa = PBXBuildFile; fileRef = D73912EF22F37F9E000D13A0 /* App.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; +/* End PBXBuildFile section */ + +/* Begin PBXContainerItemProxy section */ + 33CC111F2044C79F0003C045 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 33CC10E52044A3C60003C045 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 33CC111A2044C6BA0003C045; + remoteInfo = FLX; + }; +/* End PBXContainerItemProxy section */ + +/* Begin PBXCopyFilesBuildPhase section */ + 33CC110E2044A8840003C045 /* Bundle Framework */ = { + isa = PBXCopyFilesBuildPhase; + buildActionMask = 2147483647; + dstPath = ""; + dstSubfolderSpec = 10; + files = ( + D73912F222F3801D000D13A0 /* App.framework in Bundle Framework */, + 33D1A10522148B93006C7A3E /* FlutterMacOS.framework in Bundle Framework */, + ); + name = "Bundle Framework"; + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXCopyFilesBuildPhase section */ + +/* Begin PBXFileReference section */ + 0A1A53CF00FD04D6ED0A8E4A /* Pods-Runner.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.profile.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.profile.xcconfig"; sourceTree = ""; }; + 1523F64D34B952AB303BFFA8 /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 333000ED22D3DE5D00554162 /* Warnings.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = Warnings.xcconfig; sourceTree = ""; }; + 335BBD1A22A9A15E00E9071D /* GeneratedPluginRegistrant.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = GeneratedPluginRegistrant.swift; sourceTree = ""; }; + 33CC10ED2044A3C60003C045 /* path_provider_example.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = path_provider_example.app; sourceTree = BUILT_PRODUCTS_DIR; }; + 33CC10F02044A3C60003C045 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; + 33CC10F22044A3C60003C045 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; name = Assets.xcassets; path = Runner/Assets.xcassets; sourceTree = ""; }; + 33CC10F52044A3C60003C045 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = Base; path = Base.lproj/MainMenu.xib; sourceTree = ""; }; + 33CC10F72044A3C60003C045 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; name = Info.plist; path = Runner/Info.plist; sourceTree = ""; }; + 33CC11122044BFA00003C045 /* MainFlutterWindow.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MainFlutterWindow.swift; sourceTree = ""; }; + 33CEB47222A05771004F2AC0 /* Flutter-Debug.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = "Flutter-Debug.xcconfig"; sourceTree = ""; }; + 33CEB47422A05771004F2AC0 /* Flutter-Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = "Flutter-Release.xcconfig"; sourceTree = ""; }; + 33CEB47722A0578A004F2AC0 /* Flutter-Generated.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = "Flutter-Generated.xcconfig"; path = "ephemeral/Flutter-Generated.xcconfig"; sourceTree = ""; }; + 33D1A10322148B71006C7A3E /* FlutterMacOS.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = FlutterMacOS.framework; path = Flutter/ephemeral/FlutterMacOS.framework; sourceTree = SOURCE_ROOT; }; + 33E51913231747F40026EE4D /* DebugProfile.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = DebugProfile.entitlements; sourceTree = ""; }; + 33E51914231749380026EE4D /* Release.entitlements */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.entitlements; path = Release.entitlements; sourceTree = ""; }; + 33E5194F232828860026EE4D /* AppInfo.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = AppInfo.xcconfig; sourceTree = ""; }; + 46139048DB9F59D473B61B5E /* Pods-Runner.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"; sourceTree = ""; }; + 7AFA3C8E1D35360C0083082E /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = Release.xcconfig; sourceTree = ""; }; + 9740EEB21CF90195004384FC /* Debug.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; path = Debug.xcconfig; sourceTree = ""; }; + D73912EF22F37F9E000D13A0 /* App.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = App.framework; path = Flutter/ephemeral/App.framework; sourceTree = SOURCE_ROOT; }; + F4586DA69948E3A954A2FC9C /* Pods-Runner.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"; sourceTree = ""; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + 33CC10EA2044A3C60003C045 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + D73912F022F37F9E000D13A0 /* App.framework in Frameworks */, + 33D1A10422148B71006C7A3E /* FlutterMacOS.framework in Frameworks */, + 23F6FAA3AF82DFCF2B7DD79A /* Pods_Runner.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + 30697CBF35C100C7DD4B4699 /* Pods */ = { + isa = PBXGroup; + children = ( + 46139048DB9F59D473B61B5E /* Pods-Runner.debug.xcconfig */, + F4586DA69948E3A954A2FC9C /* Pods-Runner.release.xcconfig */, + 0A1A53CF00FD04D6ED0A8E4A /* Pods-Runner.profile.xcconfig */, + ); + name = Pods; + path = Pods; + sourceTree = ""; + }; + 33BA886A226E78AF003329D5 /* Configs */ = { + isa = PBXGroup; + children = ( + 33E5194F232828860026EE4D /* AppInfo.xcconfig */, + 9740EEB21CF90195004384FC /* Debug.xcconfig */, + 7AFA3C8E1D35360C0083082E /* Release.xcconfig */, + 333000ED22D3DE5D00554162 /* Warnings.xcconfig */, + ); + path = Configs; + sourceTree = ""; + }; + 33CC10E42044A3C60003C045 = { + isa = PBXGroup; + children = ( + 33FAB671232836740065AC1E /* Runner */, + 33CEB47122A05771004F2AC0 /* Flutter */, + 33CC10EE2044A3C60003C045 /* Products */, + D73912EC22F37F3D000D13A0 /* Frameworks */, + 30697CBF35C100C7DD4B4699 /* Pods */, + ); + sourceTree = ""; + }; + 33CC10EE2044A3C60003C045 /* Products */ = { + isa = PBXGroup; + children = ( + 33CC10ED2044A3C60003C045 /* path_provider_example.app */, + ); + name = Products; + sourceTree = ""; + }; + 33CC11242044D66E0003C045 /* Resources */ = { + isa = PBXGroup; + children = ( + 33CC10F22044A3C60003C045 /* Assets.xcassets */, + 33CC10F42044A3C60003C045 /* MainMenu.xib */, + 33CC10F72044A3C60003C045 /* Info.plist */, + ); + name = Resources; + path = ..; + sourceTree = ""; + }; + 33CEB47122A05771004F2AC0 /* Flutter */ = { + isa = PBXGroup; + children = ( + 335BBD1A22A9A15E00E9071D /* GeneratedPluginRegistrant.swift */, + 33CEB47222A05771004F2AC0 /* Flutter-Debug.xcconfig */, + 33CEB47422A05771004F2AC0 /* Flutter-Release.xcconfig */, + 33CEB47722A0578A004F2AC0 /* Flutter-Generated.xcconfig */, + D73912EF22F37F9E000D13A0 /* App.framework */, + 33D1A10322148B71006C7A3E /* FlutterMacOS.framework */, + ); + path = Flutter; + sourceTree = ""; + }; + 33FAB671232836740065AC1E /* Runner */ = { + isa = PBXGroup; + children = ( + 33CC10F02044A3C60003C045 /* AppDelegate.swift */, + 33CC11122044BFA00003C045 /* MainFlutterWindow.swift */, + 33E51913231747F40026EE4D /* DebugProfile.entitlements */, + 33E51914231749380026EE4D /* Release.entitlements */, + 33CC11242044D66E0003C045 /* Resources */, + 33BA886A226E78AF003329D5 /* Configs */, + ); + path = Runner; + sourceTree = ""; + }; + D73912EC22F37F3D000D13A0 /* Frameworks */ = { + isa = PBXGroup; + children = ( + 1523F64D34B952AB303BFFA8 /* Pods_Runner.framework */, + ); + name = Frameworks; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXNativeTarget section */ + 33CC10EC2044A3C60003C045 /* Runner */ = { + isa = PBXNativeTarget; + buildConfigurationList = 33CC10FB2044A3C60003C045 /* Build configuration list for PBXNativeTarget "Runner" */; + buildPhases = ( + 82C3ED26F2C350499338A54B /* [CP] Check Pods Manifest.lock */, + 33CC10E92044A3C60003C045 /* Sources */, + 33CC10EA2044A3C60003C045 /* Frameworks */, + 33CC10EB2044A3C60003C045 /* Resources */, + 33CC110E2044A8840003C045 /* Bundle Framework */, + 3399D490228B24CF009A79C7 /* ShellScript */, + 7413A74A1ECFDFE67CD0521B /* [CP] Embed Pods Frameworks */, + ); + buildRules = ( + ); + dependencies = ( + 33CC11202044C79F0003C045 /* PBXTargetDependency */, + ); + name = Runner; + productName = Runner; + productReference = 33CC10ED2044A3C60003C045 /* path_provider_example.app */; + productType = "com.apple.product-type.application"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + 33CC10E52044A3C60003C045 /* Project object */ = { + isa = PBXProject; + attributes = { + LastSwiftUpdateCheck = 0920; + LastUpgradeCheck = 0930; + ORGANIZATIONNAME = "The Flutter Authors"; + TargetAttributes = { + 33CC10EC2044A3C60003C045 = { + CreatedOnToolsVersion = 9.2; + LastSwiftMigration = 1100; + ProvisioningStyle = Automatic; + SystemCapabilities = { + com.apple.Sandbox = { + enabled = 1; + }; + }; + }; + 33CC111A2044C6BA0003C045 = { + CreatedOnToolsVersion = 9.2; + ProvisioningStyle = Manual; + }; + }; + }; + buildConfigurationList = 33CC10E82044A3C60003C045 /* Build configuration list for PBXProject "Runner" */; + compatibilityVersion = "Xcode 8.0"; + developmentRegion = en; + hasScannedForEncodings = 0; + knownRegions = ( + en, + Base, + ); + mainGroup = 33CC10E42044A3C60003C045; + productRefGroup = 33CC10EE2044A3C60003C045 /* Products */; + projectDirPath = ""; + projectRoot = ""; + targets = ( + 33CC10EC2044A3C60003C045 /* Runner */, + 33CC111A2044C6BA0003C045 /* Flutter Assemble */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXResourcesBuildPhase section */ + 33CC10EB2044A3C60003C045 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 33CC10F32044A3C60003C045 /* Assets.xcassets in Resources */, + 33CC10F62044A3C60003C045 /* MainMenu.xib in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXResourcesBuildPhase section */ + +/* Begin PBXShellScriptBuildPhase section */ + 3399D490228B24CF009A79C7 /* ShellScript */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputFileListPaths = ( + ); + inputPaths = ( + ); + outputFileListPaths = ( + ); + outputPaths = ( + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "echo \"$PRODUCT_NAME.app\" > \"$PROJECT_DIR\"/Flutter/ephemeral/.app_filename\n"; + }; + 33CC111E2044C6BF0003C045 /* ShellScript */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputFileListPaths = ( + Flutter/ephemeral/FlutterInputs.xcfilelist, + ); + inputPaths = ( + Flutter/ephemeral/tripwire, + ); + outputFileListPaths = ( + Flutter/ephemeral/FlutterOutputs.xcfilelist, + ); + outputPaths = ( + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "\"$FLUTTER_ROOT\"/packages/flutter_tools/bin/macos_assemble.sh\ntouch Flutter/ephemeral/tripwire\n"; + }; + 7413A74A1ECFDFE67CD0521B /* [CP] Embed Pods Frameworks */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputFileListPaths = ( + ); + name = "[CP] Embed Pods Frameworks"; + outputFileListPaths = ( + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh\"\n"; + showEnvVarsInLog = 0; + }; + 82C3ED26F2C350499338A54B /* [CP] Check Pods Manifest.lock */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputFileListPaths = ( + ); + inputPaths = ( + "${PODS_PODFILE_DIR_PATH}/Podfile.lock", + "${PODS_ROOT}/Manifest.lock", + ); + name = "[CP] Check Pods Manifest.lock"; + outputFileListPaths = ( + ); + outputPaths = ( + "$(DERIVED_FILE_DIR)/Pods-Runner-checkManifestLockResult.txt", + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; + showEnvVarsInLog = 0; + }; +/* End PBXShellScriptBuildPhase section */ + +/* Begin PBXSourcesBuildPhase section */ + 33CC10E92044A3C60003C045 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 33CC11132044BFA00003C045 /* MainFlutterWindow.swift in Sources */, + 33CC10F12044A3C60003C045 /* AppDelegate.swift in Sources */, + 335BBD1B22A9A15E00E9071D /* GeneratedPluginRegistrant.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin PBXTargetDependency section */ + 33CC11202044C79F0003C045 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 33CC111A2044C6BA0003C045 /* Flutter Assemble */; + targetProxy = 33CC111F2044C79F0003C045 /* PBXContainerItemProxy */; + }; +/* End PBXTargetDependency section */ + +/* Begin PBXVariantGroup section */ + 33CC10F42044A3C60003C045 /* MainMenu.xib */ = { + isa = PBXVariantGroup; + children = ( + 33CC10F52044A3C60003C045 /* Base */, + ); + name = MainMenu.xib; + path = Runner; + sourceTree = ""; + }; +/* End PBXVariantGroup section */ + +/* Begin XCBuildConfiguration section */ + 338D0CE9231458BD00FA5F75 /* Profile */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; + 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_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + 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_SUSPICIOUS_MOVE = YES; + CODE_SIGN_IDENTITY = "-"; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + ENABLE_NS_ASSERTIONS = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_C_LANGUAGE_STANDARD = gnu11; + GCC_NO_COMMON_BLOCKS = YES; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + MACOSX_DEPLOYMENT_TARGET = 10.11; + MTL_ENABLE_DEBUG_INFO = NO; + SDKROOT = macosx; + SWIFT_COMPILATION_MODE = wholemodule; + SWIFT_OPTIMIZATION_LEVEL = "-O"; + }; + name = Profile; + }; + 338D0CEA231458BD00FA5F75 /* Profile */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 33E5194F232828860026EE4D /* AppInfo.xcconfig */; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CLANG_ENABLE_MODULES = YES; + CODE_SIGN_ENTITLEMENTS = Runner/DebugProfile.entitlements; + CODE_SIGN_STYLE = Automatic; + COMBINE_HIDPI_IMAGES = YES; + FRAMEWORK_SEARCH_PATHS = ( + "$(inherited)", + "$(PROJECT_DIR)/Flutter/ephemeral", + ); + INFOPLIST_FILE = Runner/Info.plist; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/../Frameworks", + ); + PROVISIONING_PROFILE_SPECIFIER = ""; + SWIFT_VERSION = 5.0; + }; + name = Profile; + }; + 338D0CEB231458BD00FA5F75 /* Profile */ = { + isa = XCBuildConfiguration; + buildSettings = { + CODE_SIGN_STYLE = Manual; + PRODUCT_NAME = "$(TARGET_NAME)"; + }; + name = Profile; + }; + 33CC10F92044A3C60003C045 /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 9740EEB21CF90195004384FC /* Debug.xcconfig */; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; + 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_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + 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_SUSPICIOUS_MOVE = YES; + CODE_SIGN_IDENTITY = "-"; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = dwarf; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_TESTABILITY = YES; + GCC_C_LANGUAGE_STANDARD = gnu11; + 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_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + MACOSX_DEPLOYMENT_TARGET = 10.11; + MTL_ENABLE_DEBUG_INFO = YES; + ONLY_ACTIVE_ARCH = YES; + SDKROOT = macosx; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + }; + name = Debug; + }; + 33CC10FA2044A3C60003C045 /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; + 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_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + 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_SUSPICIOUS_MOVE = YES; + CODE_SIGN_IDENTITY = "-"; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + ENABLE_NS_ASSERTIONS = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_C_LANGUAGE_STANDARD = gnu11; + GCC_NO_COMMON_BLOCKS = YES; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + MACOSX_DEPLOYMENT_TARGET = 10.11; + MTL_ENABLE_DEBUG_INFO = NO; + SDKROOT = macosx; + SWIFT_COMPILATION_MODE = wholemodule; + SWIFT_OPTIMIZATION_LEVEL = "-O"; + }; + name = Release; + }; + 33CC10FC2044A3C60003C045 /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 33E5194F232828860026EE4D /* AppInfo.xcconfig */; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CLANG_ENABLE_MODULES = YES; + CODE_SIGN_ENTITLEMENTS = Runner/DebugProfile.entitlements; + CODE_SIGN_STYLE = Automatic; + COMBINE_HIDPI_IMAGES = YES; + FRAMEWORK_SEARCH_PATHS = ( + "$(inherited)", + "$(PROJECT_DIR)/Flutter/ephemeral", + ); + INFOPLIST_FILE = Runner/Info.plist; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/../Frameworks", + ); + PROVISIONING_PROFILE_SPECIFIER = ""; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + SWIFT_VERSION = 5.0; + }; + name = Debug; + }; + 33CC10FD2044A3C60003C045 /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 33E5194F232828860026EE4D /* AppInfo.xcconfig */; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CLANG_ENABLE_MODULES = YES; + CODE_SIGN_ENTITLEMENTS = Runner/Release.entitlements; + CODE_SIGN_STYLE = Automatic; + COMBINE_HIDPI_IMAGES = YES; + FRAMEWORK_SEARCH_PATHS = ( + "$(inherited)", + "$(PROJECT_DIR)/Flutter/ephemeral", + ); + INFOPLIST_FILE = Runner/Info.plist; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/../Frameworks", + ); + PROVISIONING_PROFILE_SPECIFIER = ""; + SWIFT_VERSION = 5.0; + }; + name = Release; + }; + 33CC111C2044C6BA0003C045 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + CODE_SIGN_STYLE = Manual; + PRODUCT_NAME = "$(TARGET_NAME)"; + }; + name = Debug; + }; + 33CC111D2044C6BA0003C045 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + CODE_SIGN_STYLE = Automatic; + PRODUCT_NAME = "$(TARGET_NAME)"; + }; + name = Release; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + 33CC10E82044A3C60003C045 /* Build configuration list for PBXProject "Runner" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 33CC10F92044A3C60003C045 /* Debug */, + 33CC10FA2044A3C60003C045 /* Release */, + 338D0CE9231458BD00FA5F75 /* Profile */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 33CC10FB2044A3C60003C045 /* Build configuration list for PBXNativeTarget "Runner" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 33CC10FC2044A3C60003C045 /* Debug */, + 33CC10FD2044A3C60003C045 /* Release */, + 338D0CEA231458BD00FA5F75 /* Profile */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 33CC111B2044C6BA0003C045 /* Build configuration list for PBXAggregateTarget "Flutter Assemble" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 33CC111C2044C6BA0003C045 /* Debug */, + 33CC111D2044C6BA0003C045 /* Release */, + 338D0CEB231458BD00FA5F75 /* Profile */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; +/* End XCConfigurationList section */ + }; + rootObject = 33CC10E52044A3C60003C045 /* Project object */; +} diff --git a/packages/path_provider/path_provider_macos/example/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/packages/path_provider/path_provider_macos/example/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme new file mode 100644 index 000000000000..1552901c04e0 --- /dev/null +++ b/packages/path_provider/path_provider_macos/example/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -0,0 +1,101 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/packages/path_provider/path_provider_macos/example/macos/Runner.xcworkspace/contents.xcworkspacedata b/packages/path_provider/path_provider_macos/example/macos/Runner.xcworkspace/contents.xcworkspacedata new file mode 100644 index 000000000000..21a3cc14c74e --- /dev/null +++ b/packages/path_provider/path_provider_macos/example/macos/Runner.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,10 @@ + + + + + + + diff --git a/packages/in_app_purchase/example/ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings b/packages/path_provider/path_provider_macos/example/macos/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist similarity index 77% rename from packages/in_app_purchase/example/ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings rename to packages/path_provider/path_provider_macos/example/macos/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist index 949b67898200..18d981003d68 100644 --- a/packages/in_app_purchase/example/ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings +++ b/packages/path_provider/path_provider_macos/example/macos/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -2,7 +2,7 @@ - BuildSystemType - Original + IDEDidComputeMac32BitWarning + diff --git a/packages/path_provider/path_provider_macos/example/macos/Runner/AppDelegate.swift b/packages/path_provider/path_provider_macos/example/macos/Runner/AppDelegate.swift new file mode 100644 index 000000000000..d53ef6437726 --- /dev/null +++ b/packages/path_provider/path_provider_macos/example/macos/Runner/AppDelegate.swift @@ -0,0 +1,9 @@ +import Cocoa +import FlutterMacOS + +@NSApplicationMain +class AppDelegate: FlutterAppDelegate { + override func applicationShouldTerminateAfterLastWindowClosed(_ sender: NSApplication) -> Bool { + return true + } +} diff --git a/packages/path_provider/path_provider_macos/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json b/packages/path_provider/path_provider_macos/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json new file mode 100644 index 000000000000..a2ec33f19f11 --- /dev/null +++ b/packages/path_provider/path_provider_macos/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json @@ -0,0 +1,68 @@ +{ + "images" : [ + { + "size" : "16x16", + "idiom" : "mac", + "filename" : "app_icon_16.png", + "scale" : "1x" + }, + { + "size" : "16x16", + "idiom" : "mac", + "filename" : "app_icon_32.png", + "scale" : "2x" + }, + { + "size" : "32x32", + "idiom" : "mac", + "filename" : "app_icon_32.png", + "scale" : "1x" + }, + { + "size" : "32x32", + "idiom" : "mac", + "filename" : "app_icon_64.png", + "scale" : "2x" + }, + { + "size" : "128x128", + "idiom" : "mac", + "filename" : "app_icon_128.png", + "scale" : "1x" + }, + { + "size" : "128x128", + "idiom" : "mac", + "filename" : "app_icon_256.png", + "scale" : "2x" + }, + { + "size" : "256x256", + "idiom" : "mac", + "filename" : "app_icon_256.png", + "scale" : "1x" + }, + { + "size" : "256x256", + "idiom" : "mac", + "filename" : "app_icon_512.png", + "scale" : "2x" + }, + { + "size" : "512x512", + "idiom" : "mac", + "filename" : "app_icon_512.png", + "scale" : "1x" + }, + { + "size" : "512x512", + "idiom" : "mac", + "filename" : "app_icon_1024.png", + "scale" : "2x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} diff --git a/packages/path_provider/path_provider_macos/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_1024.png b/packages/path_provider/path_provider_macos/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_1024.png new file mode 100644 index 000000000000..3c4935a7ca84 Binary files /dev/null and b/packages/path_provider/path_provider_macos/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_1024.png differ diff --git a/packages/path_provider/path_provider_macos/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_128.png b/packages/path_provider/path_provider_macos/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_128.png new file mode 100644 index 000000000000..ed4cc1642168 Binary files /dev/null and b/packages/path_provider/path_provider_macos/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_128.png differ diff --git a/packages/path_provider/path_provider_macos/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_16.png b/packages/path_provider/path_provider_macos/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_16.png new file mode 100644 index 000000000000..483be6138973 Binary files /dev/null and b/packages/path_provider/path_provider_macos/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_16.png differ diff --git a/packages/path_provider/path_provider_macos/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_256.png b/packages/path_provider/path_provider_macos/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_256.png new file mode 100644 index 000000000000..bcbf36df2f2a Binary files /dev/null and b/packages/path_provider/path_provider_macos/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_256.png differ diff --git a/packages/path_provider/path_provider_macos/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_32.png b/packages/path_provider/path_provider_macos/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_32.png new file mode 100644 index 000000000000..9c0a65286476 Binary files /dev/null and b/packages/path_provider/path_provider_macos/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_32.png differ diff --git a/packages/path_provider/path_provider_macos/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_512.png b/packages/path_provider/path_provider_macos/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_512.png new file mode 100644 index 000000000000..e71a726136a4 Binary files /dev/null and b/packages/path_provider/path_provider_macos/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_512.png differ diff --git a/packages/path_provider/path_provider_macos/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_64.png b/packages/path_provider/path_provider_macos/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_64.png new file mode 100644 index 000000000000..8a31fe2dd3f9 Binary files /dev/null and b/packages/path_provider/path_provider_macos/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_64.png differ diff --git a/packages/path_provider/path_provider_macos/example/macos/Runner/Base.lproj/MainMenu.xib b/packages/path_provider/path_provider_macos/example/macos/Runner/Base.lproj/MainMenu.xib new file mode 100644 index 000000000000..537341abf994 --- /dev/null +++ b/packages/path_provider/path_provider_macos/example/macos/Runner/Base.lproj/MainMenu.xib @@ -0,0 +1,339 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/packages/path_provider/path_provider_macos/example/macos/Runner/Configs/AppInfo.xcconfig b/packages/path_provider/path_provider_macos/example/macos/Runner/Configs/AppInfo.xcconfig new file mode 100644 index 000000000000..477d8d3d133e --- /dev/null +++ b/packages/path_provider/path_provider_macos/example/macos/Runner/Configs/AppInfo.xcconfig @@ -0,0 +1,14 @@ +// Application-level settings for the Runner target. +// +// This may be replaced with something auto-generated from metadata (e.g., pubspec.yaml) in the +// future. If not, the values below would default to using the project name when this becomes a +// 'flutter create' template. + +// The application's name. By default this is also the title of the Flutter window. +PRODUCT_NAME = path_provider_example + +// The application's bundle identifier +PRODUCT_BUNDLE_IDENTIFIER = io.flutter.plugins.pathProviderExample + +// The copyright displayed in application information +PRODUCT_COPYRIGHT = Copyright © 2019 io.flutter.plugins. All rights reserved. diff --git a/packages/path_provider/path_provider_macos/example/macos/Runner/Configs/Debug.xcconfig b/packages/path_provider/path_provider_macos/example/macos/Runner/Configs/Debug.xcconfig new file mode 100644 index 000000000000..36b0fd9464f4 --- /dev/null +++ b/packages/path_provider/path_provider_macos/example/macos/Runner/Configs/Debug.xcconfig @@ -0,0 +1,2 @@ +#include "../../Flutter/Flutter-Debug.xcconfig" +#include "Warnings.xcconfig" diff --git a/packages/path_provider/path_provider_macos/example/macos/Runner/Configs/Release.xcconfig b/packages/path_provider/path_provider_macos/example/macos/Runner/Configs/Release.xcconfig new file mode 100644 index 000000000000..dff4f49561c8 --- /dev/null +++ b/packages/path_provider/path_provider_macos/example/macos/Runner/Configs/Release.xcconfig @@ -0,0 +1,2 @@ +#include "../../Flutter/Flutter-Release.xcconfig" +#include "Warnings.xcconfig" diff --git a/packages/path_provider/path_provider_macos/example/macos/Runner/Configs/Warnings.xcconfig b/packages/path_provider/path_provider_macos/example/macos/Runner/Configs/Warnings.xcconfig new file mode 100644 index 000000000000..42bcbf4780b1 --- /dev/null +++ b/packages/path_provider/path_provider_macos/example/macos/Runner/Configs/Warnings.xcconfig @@ -0,0 +1,13 @@ +WARNING_CFLAGS = -Wall -Wconditional-uninitialized -Wnullable-to-nonnull-conversion -Wmissing-method-return-type -Woverlength-strings +GCC_WARN_UNDECLARED_SELECTOR = YES +CLANG_UNDEFINED_BEHAVIOR_SANITIZER_NULLABILITY = YES +CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE +CLANG_WARN__DUPLICATE_METHOD_MATCH = YES +CLANG_WARN_PRAGMA_PACK = YES +CLANG_WARN_STRICT_PROTOTYPES = YES +CLANG_WARN_COMMA = YES +GCC_WARN_STRICT_SELECTOR_MATCH = YES +CLANG_WARN_OBJC_REPEATED_USE_OF_WEAK = YES +CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES +GCC_WARN_SHADOW = YES +CLANG_WARN_UNREACHABLE_CODE = YES diff --git a/packages/connectivity/connectivity_macos/example/ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings b/packages/path_provider/path_provider_macos/example/macos/Runner/DebugProfile.entitlements similarity index 54% rename from packages/connectivity/connectivity_macos/example/ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings rename to packages/path_provider/path_provider_macos/example/macos/Runner/DebugProfile.entitlements index 949b67898200..dddb8a30c851 100644 --- a/packages/connectivity/connectivity_macos/example/ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings +++ b/packages/path_provider/path_provider_macos/example/macos/Runner/DebugProfile.entitlements @@ -2,7 +2,11 @@ - BuildSystemType - Original + com.apple.security.app-sandbox + + com.apple.security.cs.allow-jit + + com.apple.security.network.server + diff --git a/packages/path_provider/path_provider_macos/example/macos/Runner/Info.plist b/packages/path_provider/path_provider_macos/example/macos/Runner/Info.plist new file mode 100644 index 000000000000..4789daa6a443 --- /dev/null +++ b/packages/path_provider/path_provider_macos/example/macos/Runner/Info.plist @@ -0,0 +1,32 @@ + + + + + CFBundleDevelopmentRegion + $(DEVELOPMENT_LANGUAGE) + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIconFile + + CFBundleIdentifier + $(PRODUCT_BUNDLE_IDENTIFIER) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + $(PRODUCT_NAME) + CFBundlePackageType + APPL + CFBundleShortVersionString + $(FLUTTER_BUILD_NAME) + CFBundleVersion + $(FLUTTER_BUILD_NUMBER) + LSMinimumSystemVersion + $(MACOSX_DEPLOYMENT_TARGET) + NSHumanReadableCopyright + $(PRODUCT_COPYRIGHT) + NSMainNibFile + MainMenu + NSPrincipalClass + NSApplication + + diff --git a/packages/path_provider/path_provider_macos/example/macos/Runner/MainFlutterWindow.swift b/packages/path_provider/path_provider_macos/example/macos/Runner/MainFlutterWindow.swift new file mode 100644 index 000000000000..2722837ec918 --- /dev/null +++ b/packages/path_provider/path_provider_macos/example/macos/Runner/MainFlutterWindow.swift @@ -0,0 +1,15 @@ +import Cocoa +import FlutterMacOS + +class MainFlutterWindow: NSWindow { + override func awakeFromNib() { + let flutterViewController = FlutterViewController.init() + let windowFrame = self.frame + self.contentViewController = flutterViewController + self.setFrame(windowFrame, display: true) + + RegisterGeneratedPlugins(registry: flutterViewController) + + super.awakeFromNib() + } +} diff --git a/packages/connectivity/connectivity/example/ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings b/packages/path_provider/path_provider_macos/example/macos/Runner/Release.entitlements similarity index 77% rename from packages/connectivity/connectivity/example/ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings rename to packages/path_provider/path_provider_macos/example/macos/Runner/Release.entitlements index 949b67898200..852fa1a4728a 100644 --- a/packages/connectivity/connectivity/example/ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings +++ b/packages/path_provider/path_provider_macos/example/macos/Runner/Release.entitlements @@ -2,7 +2,7 @@ - BuildSystemType - Original + com.apple.security.app-sandbox + diff --git a/packages/path_provider/example/pubspec.yaml b/packages/path_provider/path_provider_macos/example/pubspec.yaml similarity index 86% rename from packages/path_provider/example/pubspec.yaml rename to packages/path_provider/path_provider_macos/example/pubspec.yaml index fd4c24e51288..e3242b83ad99 100644 --- a/packages/path_provider/example/pubspec.yaml +++ b/packages/path_provider/path_provider_macos/example/pubspec.yaml @@ -4,10 +4,9 @@ description: Demonstrates how to use the path_provider plugin. dependencies: flutter: sdk: flutter - path_provider: - path: ../ + path_provider: any path_provider_macos: - path: ../path_provider_macos + path: ../ dev_dependencies: e2e: ^0.2.1 diff --git a/packages/path_provider/path_provider_macos/example/test_driver/path_provider_e2e.dart b/packages/path_provider/path_provider_macos/example/test_driver/path_provider_e2e.dart new file mode 100644 index 000000000000..6cb8362b76d5 --- /dev/null +++ b/packages/path_provider/path_provider_macos/example/test_driver/path_provider_e2e.dart @@ -0,0 +1,51 @@ +// Copyright 2019, the Chromium project authors. Please see the AUTHORS file +// for details. All rights reserved. Use of this source code is governed by a +// BSD-style license that can be found in the LICENSE file. + +import 'dart:io'; +import 'package:flutter_test/flutter_test.dart'; +import 'package:path_provider/path_provider.dart'; +import 'package:e2e/e2e.dart'; + +void main() { + E2EWidgetsFlutterBinding.ensureInitialized(); + + testWidgets('getTemporaryDirectory', (WidgetTester tester) async { + final Directory result = await getTemporaryDirectory(); + _verifySampleFile(result, 'temporaryDirectory'); + }); + + testWidgets('getApplicationDocumentsDirectory', (WidgetTester tester) async { + final Directory result = await getApplicationDocumentsDirectory(); + _verifySampleFile(result, 'applicationDocuments'); + }); + + testWidgets('getApplicationSupportDirectory', (WidgetTester tester) async { + final Directory result = await getApplicationSupportDirectory(); + _verifySampleFile(result, 'applicationSupport'); + }); + + testWidgets('getLibraryDirectory', (WidgetTester tester) async { + if (!Platform.isMacOS) { + return; + } + final Directory result = await getLibraryDirectory(); + _verifySampleFile(result, 'library'); + }); +} + +/// Verify a file called [name] in [directory] by recreating it with test +/// contents when necessary. +void _verifySampleFile(Directory directory, String name) { + final File file = File('${directory.path}/$name'); + + if (file.existsSync()) { + file.deleteSync(); + expect(file.existsSync(), isFalse); + } + + file.writeAsStringSync('Hello world!'); + expect(file.readAsStringSync(), 'Hello world!'); + expect(directory.listSync(), isNotEmpty); + file.deleteSync(); +} diff --git a/packages/path_provider/path_provider_macos/example/test_driver/path_provider_e2e_test.dart b/packages/path_provider/path_provider_macos/example/test_driver/path_provider_e2e_test.dart new file mode 100644 index 000000000000..f3aa9e218d82 --- /dev/null +++ b/packages/path_provider/path_provider_macos/example/test_driver/path_provider_e2e_test.dart @@ -0,0 +1,15 @@ +// Copyright 2019, the Chromium project authors. Please see the AUTHORS file +// for details. All rights reserved. Use of this source code is governed by a +// BSD-style license that can be found in the LICENSE file. + +import 'dart:async'; +import 'dart:io'; +import 'package:flutter_driver/flutter_driver.dart'; + +Future main() async { + final FlutterDriver driver = await FlutterDriver.connect(); + final String result = + await driver.requestData(null, timeout: const Duration(minutes: 1)); + await driver.close(); + exit(result == 'pass' ? 0 : 1); +} diff --git a/packages/path_provider/path_provider_macos/lib/path_provider_macos.dart b/packages/path_provider/path_provider_macos/lib/path_provider_macos.dart new file mode 100644 index 000000000000..cf440b2858af --- /dev/null +++ b/packages/path_provider/path_provider_macos/lib/path_provider_macos.dart @@ -0,0 +1,3 @@ +// Analyze will fail if there is no main.dart file. This file should +// be removed once an example app has been added to path_provider_macos. +// https://github.com/flutter/flutter/issues/51007 diff --git a/packages/path_provider/path_provider_macos/pubspec.yaml b/packages/path_provider/path_provider_macos/pubspec.yaml index ed7ef74fa609..30508428cf92 100644 --- a/packages/path_provider/path_provider_macos/pubspec.yaml +++ b/packages/path_provider/path_provider_macos/pubspec.yaml @@ -1,6 +1,6 @@ name: path_provider_macos description: macOS implementation of the path_provider plugin -version: 0.0.3+1 +version: 0.0.4 homepage: https://github.com/flutter/plugins/tree/master/packages/path_provider/path_provider_macos flutter: @@ -10,7 +10,7 @@ flutter: pluginClass: PathProviderPlugin environment: - sdk: ">=2.1.0 <3.0.0" + sdk: ">=2.1.0 <3.0.0" flutter: ">=1.10.0 <2.0.0" dependencies: diff --git a/packages/path_provider/path_provider_platform_interface/CHANGELOG.md b/packages/path_provider/path_provider_platform_interface/CHANGELOG.md new file mode 100644 index 000000000000..d577554afe2f --- /dev/null +++ b/packages/path_provider/path_provider_platform_interface/CHANGELOG.md @@ -0,0 +1,7 @@ +## 1.0.1 + +* Rename enum to StorageDirectory for backwards compatibility. + +## 1.0.0 + +* Initial release. diff --git a/packages/path_provider/path_provider_platform_interface/LICENSE b/packages/path_provider/path_provider_platform_interface/LICENSE new file mode 100644 index 000000000000..0c91662b3f2f --- /dev/null +++ b/packages/path_provider/path_provider_platform_interface/LICENSE @@ -0,0 +1,27 @@ +// Copyright 2020 The Chromium Authors. All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/packages/path_provider/path_provider_platform_interface/README.md b/packages/path_provider/path_provider_platform_interface/README.md new file mode 100644 index 000000000000..50035db91482 --- /dev/null +++ b/packages/path_provider/path_provider_platform_interface/README.md @@ -0,0 +1,26 @@ +# path_provider_platform_interface + +A common platform interface for the [`path_provider`][1] plugin. + +This interface allows platform-specific implementations of the `path_provider` +plugin, as well as the plugin itself, to ensure they are supporting the +same interface. + +# Usage + +To implement a new platform-specific implementation of `path_provider`, extend +[`PathProviderPlatform`][2] with an implementation that performs the +platform-specific behavior, and when you register your plugin, set the default +`PathProviderPlatform` by calling +`PathProviderPlatform.instance = MyPlatformPathProvider()`. + +# Note on breaking changes + +Strongly prefer non-breaking changes (such as adding a method to the interface) +over breaking changes for this package. + +See https://flutter.dev/go/platform-interface-breaking-changes for a discussion +on why a less-clean interface is preferable to a breaking change. + +[1]: ../ +[2]: lib/path_provider_platform_interface.dart diff --git a/packages/path_provider/path_provider_platform_interface/lib/path_provider_platform_interface.dart b/packages/path_provider/path_provider_platform_interface/lib/path_provider_platform_interface.dart new file mode 100644 index 000000000000..4f796aaeec33 --- /dev/null +++ b/packages/path_provider/path_provider_platform_interface/lib/path_provider_platform_interface.dart @@ -0,0 +1,101 @@ +// Copyright 2020 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +import 'dart:async'; + +import 'src/enums.dart'; +import 'src/method_channel_path_provider.dart'; + +import 'package:plugin_platform_interface/plugin_platform_interface.dart'; + +export 'src/enums.dart'; + +/// The interface that implementations of path_provider must implement. +/// +/// Platform implementations should extend this class rather than implement it as `PathProvider` +/// does not consider newly added methods to be breaking changes. Extending this class +/// (using `extends`) ensures that the subclass will get the default implementation, while +/// platform implementations that `implements` this interface will be broken by newly added +/// [PathProviderPlatform] methods. +abstract class PathProviderPlatform extends PlatformInterface { + /// Constructs a PathProviderPlatform. + PathProviderPlatform() : super(token: _token); + + static final Object _token = Object(); + + static PathProviderPlatform _instance = MethodChannelPathProvider(); + + /// The default instance of [PathProviderPlatform] to use. + /// + /// Defaults to [MethodChannelPathProvider]. + static PathProviderPlatform get instance => _instance; + + /// Platform-specific plugins should set this with their own platform-specific + /// class that extends [PathProviderPlatform] when they register themselves. + static set instance(PathProviderPlatform instance) { + PlatformInterface.verifyToken(instance, _token); + _instance = instance; + } + + /// Path to the temporary directory on the device that is not backed up and is + /// suitable for storing caches of downloaded files. + Future getTemporaryPath() { + throw UnimplementedError('getTemporaryPath() has not been implemented.'); + } + + /// Path to a directory where the application may place application support + /// files. + Future getApplicationSupportPath() { + throw UnimplementedError( + 'getApplicationSupportPath() has not been implemented.'); + } + + /// Path to the directory where application can store files that are persistent, + /// backed up, and not visible to the user, such as sqlite.db. + Future getLibraryPath() { + throw UnimplementedError('getLibraryPath() has not been implemented.'); + } + + /// Path to a directory where the application may place data that is + /// user-generated, or that cannot otherwise be recreated by your application. + Future getApplicationDocumentsPath() { + throw UnimplementedError( + 'getApplicationDocumentsPath() has not been implemented.'); + } + + /// Path to a directory where the application may access top level storage. + /// The current operating system should be determined before issuing this + /// function call, as this functionality is only available on Android. + Future getExternalStoragePath() { + throw UnimplementedError( + 'getExternalStoragePath() has not been implemented.'); + } + + /// Paths to directories where application specific external cache data can be + /// stored. These paths typically reside on external storage like separate + /// partitions or SD cards. Phones may have multiple storage directories + /// available. + Future> getExternalCachePaths() { + throw UnimplementedError( + 'getExternalCachePaths() has not been implemented.'); + } + + /// Paths to directories where application specific data can be stored. + /// These paths typically reside on external storage like separate partitions + /// or SD cards. Phones may have multiple storage directories available. + Future> getExternalStoragePaths({ + /// Optional parameter. See [StorageDirectory] for more informations on + /// how this type translates to Android storage directories. + StorageDirectory type, + }) { + throw UnimplementedError( + 'getExternalStoragePaths() has not been implemented.'); + } + + /// Path to the directory where downloaded files can be stored. + /// This is typically only relevant on desktop operating systems. + Future getDownloadsPath() { + throw UnimplementedError('getDownloadsPath() has not been implemented.'); + } +} diff --git a/packages/path_provider/path_provider_platform_interface/lib/src/enums.dart b/packages/path_provider/path_provider_platform_interface/lib/src/enums.dart new file mode 100644 index 000000000000..c97ef5d2b0f5 --- /dev/null +++ b/packages/path_provider/path_provider_platform_interface/lib/src/enums.dart @@ -0,0 +1,49 @@ +/// Corresponds to constants defined in Androids `android.os.Environment` class. +/// +/// https://developer.android.com/reference/android/os/Environment.html#fields_1 +enum StorageDirectory { + /// Contains audio files that should be treated as music. + /// + /// See https://developer.android.com/reference/android/os/Environment.html#DIRECTORY_MUSIC. + music, + + /// Contains audio files that should be treated as podcasts. + /// + /// See https://developer.android.com/reference/android/os/Environment.html#DIRECTORY_PODCASTS. + podcasts, + + /// Contains audio files that should be treated as ringtones. + /// + /// See https://developer.android.com/reference/android/os/Environment.html#DIRECTORY_RINGTONES. + ringtones, + + /// Contains audio files that should be treated as alarm sounds. + /// + /// See https://developer.android.com/reference/android/os/Environment.html#DIRECTORY_ALARMS. + alarms, + + /// Contains audio files that should be treated as notification sounds. + /// + /// See https://developer.android.com/reference/android/os/Environment.html#DIRECTORY_NOTIFICATIONS. + notifications, + + /// Contains images. See https://developer.android.com/reference/android/os/Environment.html#DIRECTORY_PICTURES. + pictures, + + /// Contains movies. See https://developer.android.com/reference/android/os/Environment.html#DIRECTORY_MOVIES. + movies, + + /// Contains files of any type that have been downloaded by the user. + /// + /// See https://developer.android.com/reference/android/os/Environment.html#DIRECTORY_DOWNLOADS. + downloads, + + /// Used to hold both pictures and videos when the device filesystem is + /// treated like a camera's. + /// + /// See https://developer.android.com/reference/android/os/Environment.html#DIRECTORY_DCIM. + dcim, + + /// Holds user-created documents. See https://developer.android.com/reference/android/os/Environment.html#DIRECTORY_DOCUMENTS. + documents, +} diff --git a/packages/path_provider/path_provider_platform_interface/lib/src/method_channel_path_provider.dart b/packages/path_provider/path_provider_platform_interface/lib/src/method_channel_path_provider.dart new file mode 100644 index 000000000000..7826fa4365be --- /dev/null +++ b/packages/path_provider/path_provider_platform_interface/lib/src/method_channel_path_provider.dart @@ -0,0 +1,86 @@ +// Copyright 2020 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +import 'dart:async'; + +import 'enums.dart'; + +import 'package:flutter/services.dart'; +import 'package:meta/meta.dart'; +import 'package:path_provider_platform_interface/path_provider_platform_interface.dart'; +import 'package:platform/platform.dart'; + +/// An implementation of [PathProviderPlatform] that uses method channels. +class MethodChannelPathProvider extends PathProviderPlatform { + /// The method channel used to interact with the native platform. + @visibleForTesting + MethodChannel methodChannel = + MethodChannel('plugins.flutter.io/path_provider'); + + // Ideally, this property shouldn't exist, and each platform should + // just implement the supported methods. Once all the platforms are + // federated, this property should be removed. + Platform _platform = const LocalPlatform(); + + /// This API is only exposed for the unit tests. It should not be used by + /// any code outside of the plugin itself. + @visibleForTesting + void setMockPathProviderPlatform(Platform platform) { + _platform = platform; + } + + Future getTemporaryPath() { + return methodChannel.invokeMethod('getTemporaryDirectory'); + } + + Future getApplicationSupportPath() { + return methodChannel.invokeMethod('getApplicationSupportDirectory'); + } + + Future getLibraryPath() { + if (!_platform.isIOS && !_platform.isMacOS) { + throw UnsupportedError('Functionality only available on iOS/macOS'); + } + return methodChannel.invokeMethod('getLibraryDirectory'); + } + + Future getApplicationDocumentsPath() { + return methodChannel + .invokeMethod('getApplicationDocumentsDirectory'); + } + + Future getExternalStoragePath() { + if (!_platform.isAndroid) { + throw UnsupportedError('Functionality only available on Android'); + } + return methodChannel.invokeMethod('getStorageDirectory'); + } + + Future> getExternalCachePaths() { + if (!_platform.isAndroid) { + throw UnsupportedError('Functionality only available on Android'); + } + return methodChannel + .invokeListMethod('getExternalCacheDirectories'); + } + + Future> getExternalStoragePaths({ + StorageDirectory type, + }) async { + if (!_platform.isAndroid) { + throw UnsupportedError('Functionality only available on Android'); + } + return methodChannel.invokeListMethod( + 'getExternalStorageDirectories', + {'type': type?.index}, + ); + } + + Future getDownloadsPath() { + if (!_platform.isMacOS) { + throw UnsupportedError('Functionality only available on macOS'); + } + return methodChannel.invokeMethod('getDownloadsDirectory'); + } +} diff --git a/packages/path_provider/path_provider_platform_interface/pubspec.yaml b/packages/path_provider/path_provider_platform_interface/pubspec.yaml new file mode 100644 index 000000000000..72f4b20b7e0c --- /dev/null +++ b/packages/path_provider/path_provider_platform_interface/pubspec.yaml @@ -0,0 +1,23 @@ +name: path_provider_platform_interface +description: A common platform interface for the path_provider plugin. +homepage: https://github.com/flutter/plugins/tree/master/packages/path_provider/path_provider_platform_interface +# NOTE: We strongly prefer non-breaking changes, even at the expense of a +# less-clean API. See https://flutter.dev/go/platform-interface-breaking-changes +version: 1.0.1 + +dependencies: + flutter: + sdk: flutter + meta: ^1.0.5 + platform: ^2.0.0 + plugin_platform_interface: ^1.0.1 + +dev_dependencies: + flutter_test: + sdk: flutter + pedantic: ^1.8.0 + test: any + +environment: + sdk: ">=2.0.0-dev.28.0 <3.0.0" + flutter: ">=1.10.0 <2.0.0" diff --git a/packages/path_provider/path_provider_platform_interface/test/method_channel_path_provider_test.dart b/packages/path_provider/path_provider_platform_interface/test/method_channel_path_provider_test.dart new file mode 100644 index 000000000000..99c9349f9ae5 --- /dev/null +++ b/packages/path_provider/path_provider_platform_interface/test/method_channel_path_provider_test.dart @@ -0,0 +1,204 @@ +// Copyright 2020 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +import 'package:flutter/services.dart'; +import 'package:flutter_test/flutter_test.dart'; +import 'package:path_provider_platform_interface/src/enums.dart'; +import 'package:path_provider_platform_interface/src/method_channel_path_provider.dart'; +import 'package:platform/platform.dart'; + +void main() { + TestWidgetsFlutterBinding.ensureInitialized(); + const String kTemporaryPath = 'temporaryPath'; + const String kApplicationSupportPath = 'applicationSupportPath'; + const String kLibraryPath = 'libraryPath'; + const String kApplicationDocumentsPath = 'applicationDocumentsPath'; + const String kExternalCachePaths = 'externalCachePaths'; + const String kExternalStoragePaths = 'externalStoragePaths'; + const String kDownloadsPath = 'downloadsPath'; + + group('$MethodChannelPathProvider', () { + MethodChannelPathProvider methodChannelPathProvider; + final List log = []; + + setUp(() async { + methodChannelPathProvider = MethodChannelPathProvider(); + + methodChannelPathProvider.methodChannel + .setMockMethodCallHandler((MethodCall methodCall) async { + log.add(methodCall); + switch (methodCall.method) { + case 'getTemporaryDirectory': + return kTemporaryPath; + case 'getApplicationSupportDirectory': + return kApplicationSupportPath; + case 'getLibraryDirectory': + return kLibraryPath; + case 'getApplicationDocumentsDirectory': + return kApplicationDocumentsPath; + case 'getExternalStorageDirectories': + return [kExternalStoragePaths]; + case 'getExternalCacheDirectories': + return [kExternalCachePaths]; + case 'getDownloadsDirectory': + return kDownloadsPath; + default: + return null; + } + }); + }); + + setUp(() { + methodChannelPathProvider.setMockPathProviderPlatform( + FakePlatform(operatingSystem: 'android')); + }); + + tearDown(() { + log.clear(); + }); + + test('getTemporaryPath', () async { + final String path = await methodChannelPathProvider.getTemporaryPath(); + expect( + log, + [isMethodCall('getTemporaryDirectory', arguments: null)], + ); + expect(path, kTemporaryPath); + }); + + test('getApplicationSupportPath', () async { + final String path = + await methodChannelPathProvider.getApplicationSupportPath(); + expect( + log, + [ + isMethodCall('getApplicationSupportDirectory', arguments: null) + ], + ); + expect(path, kApplicationSupportPath); + }); + + test('getLibraryPath android fails', () async { + try { + await methodChannelPathProvider.getLibraryPath(); + fail('should throw UnsupportedError'); + } catch (e) { + expect(e, isUnsupportedError); + } + }); + + test('getLibraryPath iOS succeeds', () async { + methodChannelPathProvider + .setMockPathProviderPlatform(FakePlatform(operatingSystem: 'ios')); + + final String path = await methodChannelPathProvider.getLibraryPath(); + expect( + log, + [isMethodCall('getLibraryDirectory', arguments: null)], + ); + expect(path, kLibraryPath); + }); + + test('getLibraryPath macOS succeeds', () async { + methodChannelPathProvider + .setMockPathProviderPlatform(FakePlatform(operatingSystem: 'macos')); + + final String path = await methodChannelPathProvider.getLibraryPath(); + expect( + log, + [isMethodCall('getLibraryDirectory', arguments: null)], + ); + expect(path, kLibraryPath); + }); + + test('getApplicationDocumentsPath', () async { + final String path = + await methodChannelPathProvider.getApplicationDocumentsPath(); + expect( + log, + [ + isMethodCall('getApplicationDocumentsDirectory', arguments: null) + ], + ); + expect(path, kApplicationDocumentsPath); + }); + + test('getExternalCachePaths android succeeds', () async { + final List result = + await methodChannelPathProvider.getExternalCachePaths(); + expect( + log, + [isMethodCall('getExternalCacheDirectories', arguments: null)], + ); + expect(result.length, 1); + expect(result.first, kExternalCachePaths); + }); + + test('getExternalCachePaths non-android fails', () async { + methodChannelPathProvider + .setMockPathProviderPlatform(FakePlatform(operatingSystem: 'ios')); + + try { + await methodChannelPathProvider.getExternalCachePaths(); + fail('should throw UnsupportedError'); + } catch (e) { + expect(e, isUnsupportedError); + } + }); + + for (StorageDirectory type + in StorageDirectory.values + [null]) { + test('getExternalStoragePaths (type: $type) android succeeds', () async { + final List result = + await methodChannelPathProvider.getExternalStoragePaths(type: type); + expect( + log, + [ + isMethodCall( + 'getExternalStorageDirectories', + arguments: {'type': type?.index}, + ) + ], + ); + + expect(result.length, 1); + expect(result.first, kExternalStoragePaths); + }); + + test('getExternalStoragePaths (type: $type) non-android fails', () async { + methodChannelPathProvider + .setMockPathProviderPlatform(FakePlatform(operatingSystem: 'ios')); + + try { + await methodChannelPathProvider.getExternalStoragePaths(); + fail('should throw UnsupportedError'); + } catch (e) { + expect(e, isUnsupportedError); + } + }); + } // end of for-loop + + test('getDownloadsPath macos succeeds', () async { + methodChannelPathProvider + .setMockPathProviderPlatform(FakePlatform(operatingSystem: 'macos')); + final String result = await methodChannelPathProvider.getDownloadsPath(); + expect( + log, + [isMethodCall('getDownloadsDirectory', arguments: null)], + ); + expect(result, kDownloadsPath); + }); + + test('getDownloadsPath non-macos fails', () async { + methodChannelPathProvider.setMockPathProviderPlatform( + FakePlatform(operatingSystem: 'android')); + try { + await methodChannelPathProvider.getDownloadsPath(); + fail('should throw UnsupportedError'); + } catch (e) { + expect(e, isUnsupportedError); + } + }); + }); +} diff --git a/packages/path_provider/test/path_provider_test.dart b/packages/path_provider/test/path_provider_test.dart deleted file mode 100644 index 5b875e3bc51e..000000000000 --- a/packages/path_provider/test/path_provider_test.dart +++ /dev/null @@ -1,237 +0,0 @@ -// Copyright 2019 The Flutter Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -import 'dart:io'; - -import 'package:flutter/services.dart'; -import 'package:flutter_test/flutter_test.dart'; -import 'package:path_provider/path_provider.dart'; -import 'package:platform/platform.dart'; - -void main() { - TestWidgetsFlutterBinding.ensureInitialized(); - - const MethodChannel channel = - MethodChannel('plugins.flutter.io/path_provider'); - final List log = []; - dynamic response; - - channel.setMockMethodCallHandler((MethodCall methodCall) async { - log.add(methodCall); - return response; - }); - - setUp(() { - setMockPathProviderPlatform(FakePlatform(operatingSystem: 'android')); - }); - - tearDown(() { - log.clear(); - }); - - test('getTemporaryDirectory test', () async { - response = null; - final Directory directory = await getTemporaryDirectory(); - expect( - log, - [isMethodCall('getTemporaryDirectory', arguments: null)], - ); - expect(directory, isNull); - }); - - test('getApplicationSupportDirectory test', () async { - response = null; - final Directory directory = await getApplicationSupportDirectory(); - expect( - log, - [ - isMethodCall('getApplicationSupportDirectory', arguments: null) - ], - ); - expect(directory, isNull); - }); - - test('getApplicationDocumentsDirectory test', () async { - response = null; - final Directory directory = await getApplicationDocumentsDirectory(); - expect( - log, - [ - isMethodCall('getApplicationDocumentsDirectory', arguments: null) - ], - ); - expect(directory, isNull); - }); - - test('getApplicationSupportDirectory test', () async { - response = null; - final Directory directory = await getApplicationSupportDirectory(); - expect( - log, - [ - isMethodCall('getApplicationSupportDirectory', arguments: null) - ], - ); - expect(directory, isNull); - }); - - test('getExternalStorageDirectory test', () async { - response = null; - final Directory directory = await getExternalStorageDirectory(); - expect( - log, - [isMethodCall('getStorageDirectory', arguments: null)], - ); - expect(directory, isNull); - }); - - test('getLibraryDirectory Android test', () async { - try { - await getLibraryDirectory(); - fail('should throw UnsupportedError'); - } catch (e) { - expect(e, isUnsupportedError); - } - }); - test('getLibraryDirectory iOS test', () async { - setMockPathProviderPlatform(FakePlatform(operatingSystem: 'ios')); - - final Directory directory = await getLibraryDirectory(); - expect( - log, - [isMethodCall('getLibraryDirectory', arguments: null)], - ); - expect(directory, isNull); - }); - - test('getExternalStorageDirectory iOS test', () async { - setMockPathProviderPlatform(FakePlatform(operatingSystem: 'ios')); - - try { - await getExternalStorageDirectory(); - fail('should throw UnsupportedError'); - } catch (e) { - expect(e, isUnsupportedError); - } - }); - - test('getExternalCacheDirectories test', () async { - response = []; - final List directories = await getExternalCacheDirectories(); - expect( - log, - [isMethodCall('getExternalCacheDirectories', arguments: null)], - ); - expect(directories, []); - }); - - test('getExternalCacheDirectories iOS test', () async { - setMockPathProviderPlatform(FakePlatform(operatingSystem: 'ios')); - - try { - await getExternalCacheDirectories(); - fail('should throw UnsupportedError'); - } catch (e) { - expect(e, isUnsupportedError); - } - }); - - for (StorageDirectory type - in StorageDirectory.values + [null]) { - test('getExternalStorageDirectories test (type: $type)', () async { - response = []; - final List directories = - await getExternalStorageDirectories(type: type); - expect( - log, - [ - isMethodCall( - 'getExternalStorageDirectories', - arguments: {'type': type?.index}, - ) - ], - ); - expect(directories, []); - }); - } - - test('getExternalStorageDirectories iOS test', () async { - setMockPathProviderPlatform(FakePlatform(operatingSystem: 'ios')); - - try { - await getExternalStorageDirectories(type: StorageDirectory.music); - fail('should throw UnsupportedError'); - } catch (e) { - expect(e, isUnsupportedError); - } - }); - - test('TemporaryDirectory path test', () async { - final String fakePath = "/foo/bar/baz"; - response = fakePath; - final Directory directory = await getTemporaryDirectory(); - expect(directory.path, equals(fakePath)); - }); - - test('ApplicationSupportDirectory path test', () async { - final String fakePath = "/foo/bar/baz"; - response = fakePath; - final Directory directory = await getApplicationSupportDirectory(); - expect(directory.path, equals(fakePath)); - }); - - test('ApplicationDocumentsDirectory path test', () async { - final String fakePath = "/foo/bar/baz"; - response = fakePath; - final Directory directory = await getApplicationDocumentsDirectory(); - expect(directory.path, equals(fakePath)); - }); - - test('ApplicationSupportDirectory path test', () async { - final String fakePath = "/foo/bar/baz"; - response = fakePath; - final Directory directory = await getApplicationSupportDirectory(); - expect(directory.path, equals(fakePath)); - }); - - test('ApplicationLibraryDirectory path test', () async { - setMockPathProviderPlatform(FakePlatform(operatingSystem: 'ios')); - - final String fakePath = "/foo/bar/baz"; - response = fakePath; - final Directory directory = await getLibraryDirectory(); - expect(directory.path, equals(fakePath)); - }); - - test('ExternalStorageDirectory path test', () async { - final String fakePath = "/foo/bar/baz"; - response = fakePath; - final Directory directory = await getExternalStorageDirectory(); - expect(directory.path, equals(fakePath)); - }); - - test('ExternalCacheDirectories path test', () async { - final List paths = ["/foo/bar/baz", "/foo/bar/baz2"]; - response = paths; - final List directories = await getExternalCacheDirectories(); - expect(directories.map((Directory d) => d.path).toList(), equals(paths)); - }); - - test('ExternalStorageDirectories path test', () async { - final List paths = ["/foo/bar/baz", "/foo/bar/baz2"]; - response = paths; - final List directories = await getExternalStorageDirectories( - type: StorageDirectory.music, - ); - expect(directories.map((Directory d) => d.path).toList(), equals(paths)); - }); - - test('DownloadsDirectory path macos test', () async { - setMockPathProviderPlatform(FakePlatform(operatingSystem: 'macos')); - final String fakePath = "/foo/bar/baz"; - response = fakePath; - final Directory directory = await getDownloadsDirectory(); - expect(directory.path, equals(fakePath)); - }); -} diff --git a/packages/share/CHANGELOG.md b/packages/share/CHANGELOG.md index 9bd0dec06766..7308189cbe18 100644 --- a/packages/share/CHANGELOG.md +++ b/packages/share/CHANGELOG.md @@ -1,3 +1,7 @@ +## 0.6.3+7 + +* Updated gradle version of example. + ## 0.6.3+6 * Make the pedantic dev_dependency explicit. diff --git a/packages/share/example/android/gradle/wrapper/gradle-wrapper.properties b/packages/share/example/android/gradle/wrapper/gradle-wrapper.properties index 019065d1d650..d757f3d33fcc 100644 --- a/packages/share/example/android/gradle/wrapper/gradle-wrapper.properties +++ b/packages/share/example/android/gradle/wrapper/gradle-wrapper.properties @@ -2,4 +2,4 @@ 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-5.4.1-all.zip diff --git a/packages/share/pubspec.yaml b/packages/share/pubspec.yaml index dc5f95a8afef..f7830a841249 100644 --- a/packages/share/pubspec.yaml +++ b/packages/share/pubspec.yaml @@ -2,7 +2,7 @@ name: share description: Flutter plugin for sharing content via the platform share UI, using the ACTION_SEND intent on Android and UIActivityViewController on iOS. homepage: https://github.com/flutter/plugins/tree/master/packages/share -version: 0.6.3+6 +version: 0.6.3+7 flutter: plugin: diff --git a/packages/shared_preferences/shared_preferences/CHANGELOG.md b/packages/shared_preferences/shared_preferences/CHANGELOG.md index 6757f22bae08..256b084816e9 100644 --- a/packages/shared_preferences/shared_preferences/CHANGELOG.md +++ b/packages/shared_preferences/shared_preferences/CHANGELOG.md @@ -1,3 +1,7 @@ +## 0.5.6+3 + +* Fix deprecated API usage warning. + ## 0.5.6+2 * Make the pedantic dev_dependency explicit. diff --git a/packages/shared_preferences/shared_preferences/android/src/main/java/io/flutter/plugins/sharedpreferences/SharedPreferencesPlugin.java b/packages/shared_preferences/shared_preferences/android/src/main/java/io/flutter/plugins/sharedpreferences/SharedPreferencesPlugin.java index 90cc96494c34..859610e3d66a 100644 --- a/packages/shared_preferences/shared_preferences/android/src/main/java/io/flutter/plugins/sharedpreferences/SharedPreferencesPlugin.java +++ b/packages/shared_preferences/shared_preferences/android/src/main/java/io/flutter/plugins/sharedpreferences/SharedPreferencesPlugin.java @@ -22,7 +22,7 @@ public static void registerWith(PluginRegistry.Registrar registrar) { @Override public void onAttachedToEngine(FlutterPlugin.FlutterPluginBinding binding) { - setupChannel(binding.getFlutterEngine().getDartExecutor(), binding.getApplicationContext()); + setupChannel(binding.getBinaryMessenger(), binding.getApplicationContext()); } @Override diff --git a/packages/shared_preferences/shared_preferences/pubspec.yaml b/packages/shared_preferences/shared_preferences/pubspec.yaml index d0cb26c7c994..099c95220b7d 100644 --- a/packages/shared_preferences/shared_preferences/pubspec.yaml +++ b/packages/shared_preferences/shared_preferences/pubspec.yaml @@ -2,7 +2,7 @@ name: shared_preferences description: Flutter plugin for reading and writing simple key-value pairs. Wraps NSUserDefaults on iOS and SharedPreferences on Android. homepage: https://github.com/flutter/plugins/tree/master/packages/shared_preferences/shared_preferences -version: 0.5.6+2 +version: 0.5.6+3 flutter: plugin: diff --git a/packages/url_launcher/url_launcher/CHANGELOG.md b/packages/url_launcher/url_launcher/CHANGELOG.md index 0cab10180cd8..3097a2122ae1 100644 --- a/packages/url_launcher/url_launcher/CHANGELOG.md +++ b/packages/url_launcher/url_launcher/CHANGELOG.md @@ -1,3 +1,7 @@ +## 5.4.3 + +* Fixed the launchUniversalLinkIos method. + ## 5.4.2 * Make the pedantic dev_dependency explicit. diff --git a/packages/url_launcher/url_launcher/example/lib/main.dart b/packages/url_launcher/url_launcher/example/lib/main.dart index 00ab6c5b047d..f7d90c4bef65 100644 --- a/packages/url_launcher/url_launcher/example/lib/main.dart +++ b/packages/url_launcher/url_launcher/example/lib/main.dart @@ -91,15 +91,15 @@ class _MyHomePageState extends State { } Future _launchUniversalLinkIos(String url) async { - if (await canLaunch('https://youtube.com')) { + if (await canLaunch(url)) { final bool nativeAppLaunchSucceeded = await launch( - 'https://youtube.com', + url, forceSafariVC: false, universalLinksOnly: true, ); if (!nativeAppLaunchSucceeded) { await launch( - 'https://youtube.com', + url, forceSafariVC: true, ); } diff --git a/packages/url_launcher/url_launcher/example/pubspec.yaml b/packages/url_launcher/url_launcher/example/pubspec.yaml index 065693e1432c..1eb3e603696f 100644 --- a/packages/url_launcher/url_launcher/example/pubspec.yaml +++ b/packages/url_launcher/url_launcher/example/pubspec.yaml @@ -12,6 +12,8 @@ dev_dependencies: flutter_driver: sdk: flutter pedantic: ^1.8.0 + mockito: ^4.1.1 + plugin_platform_interface: ^1.0.0 flutter: uses-material-design: true diff --git a/packages/url_launcher/url_launcher/example/test/url_launcher_example_test.dart b/packages/url_launcher/url_launcher/example/test/url_launcher_example_test.dart new file mode 100644 index 000000000000..41b9f6f5ec6c --- /dev/null +++ b/packages/url_launcher/url_launcher/example/test/url_launcher_example_test.dart @@ -0,0 +1,45 @@ +import 'package:flutter_test/flutter_test.dart'; +import 'package:flutter/material.dart'; +import 'package:mockito/mockito.dart'; +import 'package:plugin_platform_interface/plugin_platform_interface.dart'; +import 'package:url_launcher_platform_interface/url_launcher_platform_interface.dart'; +import 'package:url_launcher_example/main.dart'; + +void main() { + final MockUrlLauncher mock = MockUrlLauncher(); + UrlLauncherPlatform.instance = mock; + + testWidgets('Can open URLs', (WidgetTester tester) async { + await tester.pumpWidget(MyApp()); + const String defaultUrl = 'https://www.cylog.org/headers/'; + when(mock.canLaunch(defaultUrl)).thenAnswer((_) => Future.value(true)); + const Map defaultHeaders = { + 'my_header_key': 'my_header_value' + }; + verifyNever(mock.launch(defaultUrl, + useSafariVC: false, + useWebView: false, + enableDomStorage: false, + enableJavaScript: false, + universalLinksOnly: false, + headers: defaultHeaders)); + + Finder browserlaunchBtn = + find.widgetWithText(RaisedButton, 'Launch in browser'); + expect(browserlaunchBtn, findsOneWidget); + await tester.tap(browserlaunchBtn); + + verify(mock.launch(defaultUrl, + useSafariVC: false, + useWebView: false, + enableDomStorage: false, + enableJavaScript: false, + universalLinksOnly: false, + headers: defaultHeaders)) + .called(1); + }); +} + +class MockUrlLauncher extends Mock + with MockPlatformInterfaceMixin + implements UrlLauncherPlatform {} diff --git a/packages/url_launcher/url_launcher/pubspec.yaml b/packages/url_launcher/url_launcher/pubspec.yaml index ba929709b01e..f0568e0029c0 100644 --- a/packages/url_launcher/url_launcher/pubspec.yaml +++ b/packages/url_launcher/url_launcher/pubspec.yaml @@ -2,7 +2,7 @@ name: url_launcher description: Flutter plugin for launching a URL on Android and iOS. Supports web, phone, SMS, and email schemes. homepage: https://github.com/flutter/plugins/tree/master/packages/url_launcher/url_launcher -version: 5.4.2 +version: 5.4.3 flutter: plugin: diff --git a/packages/url_launcher/url_launcher_macos/CHANGELOG.md b/packages/url_launcher/url_launcher_macos/CHANGELOG.md index 6ecac5bd9faf..fc2448201e22 100644 --- a/packages/url_launcher/url_launcher_macos/CHANGELOG.md +++ b/packages/url_launcher/url_launcher_macos/CHANGELOG.md @@ -1,3 +1,7 @@ +# 0.0.1+5 + +* Fixed the launchUniversalLinkIos method. + # 0.0.1+4 * Make the pedantic dev_dependency explicit. diff --git a/packages/url_launcher/url_launcher_macos/example/lib/main.dart b/packages/url_launcher/url_launcher_macos/example/lib/main.dart index f079bb272663..b5cce7482d07 100644 --- a/packages/url_launcher/url_launcher_macos/example/lib/main.dart +++ b/packages/url_launcher/url_launcher_macos/example/lib/main.dart @@ -90,15 +90,15 @@ class _MyHomePageState extends State { } Future _launchUniversalLinkIos(String url) async { - if (await canLaunch('https://youtube.com')) { + if (await canLaunch(url)) { final bool nativeAppLaunchSucceeded = await launch( - 'https://youtube.com', + url, forceSafariVC: false, universalLinksOnly: true, ); if (!nativeAppLaunchSucceeded) { await launch( - 'https://youtube.com', + url, forceSafariVC: true, ); } diff --git a/packages/url_launcher/url_launcher_macos/pubspec.yaml b/packages/url_launcher/url_launcher_macos/pubspec.yaml index 3f6d5e04b026..04a6b33f1e68 100644 --- a/packages/url_launcher/url_launcher_macos/pubspec.yaml +++ b/packages/url_launcher/url_launcher_macos/pubspec.yaml @@ -1,6 +1,6 @@ name: url_launcher_macos description: macOS implementation of the url_launcher plugin. -version: 0.0.1+4 +version: 0.0.1+5 homepage: https://github.com/flutter/plugins/tree/master/packages/url_launcher/url_launcher_macos flutter: diff --git a/packages/webview_flutter/CHANGELOG.md b/packages/webview_flutter/CHANGELOG.md index cec384d73f0c..693213425161 100644 --- a/packages/webview_flutter/CHANGELOG.md +++ b/packages/webview_flutter/CHANGELOG.md @@ -1,3 +1,7 @@ +## 0.3.19+9 + +* Remove example app's iOS workspace settings. + ## 0.3.19+8 * Make the pedantic dev_dependency explicit. diff --git a/packages/webview_flutter/example/ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings b/packages/webview_flutter/example/ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings deleted file mode 100644 index 949b67898200..000000000000 --- a/packages/webview_flutter/example/ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings +++ /dev/null @@ -1,8 +0,0 @@ - - - - - BuildSystemType - Original - - diff --git a/packages/webview_flutter/pubspec.yaml b/packages/webview_flutter/pubspec.yaml index d19ed4776778..a3091ce7fcd2 100644 --- a/packages/webview_flutter/pubspec.yaml +++ b/packages/webview_flutter/pubspec.yaml @@ -1,6 +1,6 @@ name: webview_flutter description: A Flutter plugin that provides a WebView widget on Android and iOS. -version: 0.3.19+8 +version: 0.3.19+9 homepage: https://github.com/flutter/plugins/tree/master/packages/webview_flutter environment: diff --git a/script/build_all_plugins_app.sh b/script/build_all_plugins_app.sh index a497cd935d81..378deb71f56b 100755 --- a/script/build_all_plugins_app.sh +++ b/script/build_all_plugins_app.sh @@ -18,6 +18,9 @@ readonly EXCLUDED_PLUGINS_LIST=( "google_sign_in_platform_interface" "google_sign_in_web" "instrumentation_adapter" + "path_provider_macos" + "path_provider_platform_interface" + "path_provider_web" "plugin_platform_interface" "shared_preferences_macos" "shared_preferences_platform_interface"