From f4bd41d6fc77a29889309eec4d4c69084f9b04a2 Mon Sep 17 00:00:00 2001 From: Stuart Morgan Date: Tue, 27 Jun 2023 12:58:57 -0400 Subject: [PATCH 1/9] Add and document Android support --- .../file_selector/file_selector/README.md | 32 ++++++++++--------- .../file_selector/file_selector/pubspec.yaml | 3 ++ 2 files changed, 20 insertions(+), 15 deletions(-) diff --git a/packages/file_selector/file_selector/README.md b/packages/file_selector/file_selector/README.md index dac9746891b..12efb64de74 100644 --- a/packages/file_selector/file_selector/README.md +++ b/packages/file_selector/file_selector/README.md @@ -6,9 +6,9 @@ A Flutter plugin that manages files and interactions with file dialogs. -| | iOS | Linux | macOS | Web | Windows | -|-------------|---------|-------|--------|-----|-------------| -| **Support** | iOS 11+ | Any | 10.14+ | Any | Windows 10+ | +| | Android | iOS | Linux | macOS | Web | Windows | +|-------------|---------|---------|-------|--------|-----|-------------| +| **Support** | SDK 19+ | iOS 11+ | Any | 10.14+ | Any | Windows 10+ | ## Usage @@ -100,23 +100,25 @@ Different platforms support different type group filter options. To avoid filters that cover all platforms you are targeting, or that you conditionally pass different `XTypeGroup`s based on `Platform`. -| | iOS | Linux | macOS | Web | Windows | -|--------------------------|-----|-------|--------|-----|-------------| -| `extensions` | | ✔️ | ✔️ | ✔️ | ✔️ | -| `mimeTypes` | | ✔️ | ✔️† | ✔️ | | -| `uniformTypeIdentifiers` | ✔️ | | ✔️ | | | -| `webWildCards` | | | | ✔️ | | +| | Andoid | iOS | Linux | macOS | Web | Windows | +|--------------------------|--------|-----|-------|--------|-----|-------------| +| `extensions` | ✔️ | | ✔️ | ✔️ | ✔️ | ✔️ | +| `mimeTypes` | ✔️ | | ✔️ | ✔️† | ✔️ | | +| `uniformTypeIdentifiers` | | ✔️ | | ✔️ | | | +| `webWildCards` | | | | | ✔️ | | † `mimeTypes` are not supported on version of macOS earlier than 11 (Big Sur). ### Features supported by platform -| Feature | Description | iOS | Linux | macOS | Windows | Web | -| ---------------------- |----------------------------------- |--------- | ---------- | -------- | ------------ | ----------- | -| Choose a single file | Pick a file/image | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | -| Choose multiple files | Pick multiple files/images | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | -| Choose a save location | Pick a directory to save a file in | ❌ | ✔️ | ✔️ | ✔️ | ❌ | -| Choose a directory | Pick a folder and get its path | ❌ | ✔️ | ✔️ | ✔️ | ❌ | +| Feature | Description | Android | iOS | Linux | macOS | Windows | Web | +| ---------------------- |----------------------------------- |---------|--------- | ---------- | -------- | ------------ | ----------- | +| Choose a single file | Pick a file/image | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | +| Choose multiple files | Pick multiple files/images | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | +| Choose a save location | Pick a directory to save a file in | ❌ | ❌ | ✔️ | ✔️ | ✔️ | ❌ | +| Choose a directory | Pick a directory and get its path | ✔️† | ❌ | ✔️ | ✔️ | ✔️ | ❌ | + +† Choosing a directory is no supported on versions of Android before SDK 21 (Lollipop). [example]:./example [entitlement]: https://docs.flutter.dev/desktop#entitlements-and-the-app-sandbox diff --git a/packages/file_selector/file_selector/pubspec.yaml b/packages/file_selector/file_selector/pubspec.yaml index 6b32deecc33..f369c8202c1 100644 --- a/packages/file_selector/file_selector/pubspec.yaml +++ b/packages/file_selector/file_selector/pubspec.yaml @@ -12,6 +12,8 @@ environment: flutter: plugin: platforms: + android: + default_package: file_selector_android ios: default_package: file_selector_ios linux: @@ -24,6 +26,7 @@ flutter: default_package: file_selector_windows dependencies: + file_selector_android: ^0.5.0 file_selector_ios: ^0.5.0 file_selector_linux: ^0.9.2 file_selector_macos: ^0.9.3 From 381b41ee87a35a97b8656d28bf406aca3f7bb179 Mon Sep 17 00:00:00 2001 From: Stuart Morgan Date: Tue, 27 Jun 2023 13:00:09 -0400 Subject: [PATCH 2/9] Bump version --- packages/file_selector/file_selector/CHANGELOG.md | 4 ++++ packages/file_selector/file_selector/pubspec.yaml | 2 +- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/packages/file_selector/file_selector/CHANGELOG.md b/packages/file_selector/file_selector/CHANGELOG.md index 5215787e070..089f2d70b7e 100644 --- a/packages/file_selector/file_selector/CHANGELOG.md +++ b/packages/file_selector/file_selector/CHANGELOG.md @@ -1,3 +1,7 @@ +## 0.9.5 + +* Adds an endorsed Android implementation. + ## 0.9.4 * Adds `getSaveLocation` and deprecates `getSavePath`. diff --git a/packages/file_selector/file_selector/pubspec.yaml b/packages/file_selector/file_selector/pubspec.yaml index f369c8202c1..36cb7a69816 100644 --- a/packages/file_selector/file_selector/pubspec.yaml +++ b/packages/file_selector/file_selector/pubspec.yaml @@ -3,7 +3,7 @@ description: Flutter plugin for opening and saving files, or selecting directories, using native file selection UI. repository: https://github.com/flutter/packages/tree/main/packages/file_selector/file_selector issue_tracker: https://github.com/flutter/flutter/issues?q=is%3Aissue+is%3Aopen+label%3A%22p%3A+file_selector%22 -version: 0.9.4 +version: 0.9.5 environment: sdk: ">=2.18.0 <4.0.0" From 989ed105805df36388c91f6ceee5eb68baa7dca6 Mon Sep 17 00:00:00 2001 From: Stuart Morgan Date: Tue, 27 Jun 2023 14:05:59 -0400 Subject: [PATCH 3/9] Add Android to example app --- .../file_selector/example/android/.gitignore | 13 ++++ .../example/android/app/build.gradle | 72 ++++++++++++++++++ .../android/app/src/debug/AndroidManifest.xml | 7 ++ .../android/app/src/main/AndroidManifest.xml | 33 ++++++++ .../file_selector_example/MainActivity.kt | 6 ++ .../res/drawable-v21/launch_background.xml | 12 +++ .../main/res/drawable/launch_background.xml | 12 +++ .../src/main/res/mipmap-hdpi/ic_launcher.png | Bin 0 -> 544 bytes .../src/main/res/mipmap-mdpi/ic_launcher.png | Bin 0 -> 442 bytes .../src/main/res/mipmap-xhdpi/ic_launcher.png | Bin 0 -> 721 bytes .../main/res/mipmap-xxhdpi/ic_launcher.png | Bin 0 -> 1031 bytes .../main/res/mipmap-xxxhdpi/ic_launcher.png | Bin 0 -> 1443 bytes .../app/src/main/res/values-night/styles.xml | 18 +++++ .../app/src/main/res/values/styles.xml | 18 +++++ .../app/src/profile/AndroidManifest.xml | 7 ++ .../example/android/build.gradle | 31 ++++++++ .../example/android/gradle.properties | 3 + .../gradle/wrapper/gradle-wrapper.properties | 5 ++ .../example/android/settings.gradle | 11 +++ 19 files changed, 248 insertions(+) create mode 100644 packages/file_selector/file_selector/example/android/.gitignore create mode 100644 packages/file_selector/file_selector/example/android/app/build.gradle create mode 100644 packages/file_selector/file_selector/example/android/app/src/debug/AndroidManifest.xml create mode 100644 packages/file_selector/file_selector/example/android/app/src/main/AndroidManifest.xml create mode 100644 packages/file_selector/file_selector/example/android/app/src/main/kotlin/dev/flutter/plugins/file_selector_example/MainActivity.kt create mode 100644 packages/file_selector/file_selector/example/android/app/src/main/res/drawable-v21/launch_background.xml create mode 100644 packages/file_selector/file_selector/example/android/app/src/main/res/drawable/launch_background.xml create mode 100644 packages/file_selector/file_selector/example/android/app/src/main/res/mipmap-hdpi/ic_launcher.png create mode 100644 packages/file_selector/file_selector/example/android/app/src/main/res/mipmap-mdpi/ic_launcher.png create mode 100644 packages/file_selector/file_selector/example/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png create mode 100644 packages/file_selector/file_selector/example/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png create mode 100644 packages/file_selector/file_selector/example/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png create mode 100644 packages/file_selector/file_selector/example/android/app/src/main/res/values-night/styles.xml create mode 100644 packages/file_selector/file_selector/example/android/app/src/main/res/values/styles.xml create mode 100644 packages/file_selector/file_selector/example/android/app/src/profile/AndroidManifest.xml create mode 100644 packages/file_selector/file_selector/example/android/build.gradle create mode 100644 packages/file_selector/file_selector/example/android/gradle.properties create mode 100644 packages/file_selector/file_selector/example/android/gradle/wrapper/gradle-wrapper.properties create mode 100644 packages/file_selector/file_selector/example/android/settings.gradle diff --git a/packages/file_selector/file_selector/example/android/.gitignore b/packages/file_selector/file_selector/example/android/.gitignore new file mode 100644 index 00000000000..6f568019d3c --- /dev/null +++ b/packages/file_selector/file_selector/example/android/.gitignore @@ -0,0 +1,13 @@ +gradle-wrapper.jar +/.gradle +/captures/ +/gradlew +/gradlew.bat +/local.properties +GeneratedPluginRegistrant.java + +# Remember to never publicly share your keystore. +# See https://flutter.dev/docs/deployment/android#reference-the-keystore-from-the-app +key.properties +**/*.keystore +**/*.jks diff --git a/packages/file_selector/file_selector/example/android/app/build.gradle b/packages/file_selector/file_selector/example/android/app/build.gradle new file mode 100644 index 00000000000..dd9d542dbbb --- /dev/null +++ b/packages/file_selector/file_selector/example/android/app/build.gradle @@ -0,0 +1,72 @@ +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 plugin: 'kotlin-android' +apply from: "$flutterRoot/packages/flutter_tools/gradle/flutter.gradle" + +android { + namespace "dev.flutter.plugins.file_selector_example" + compileSdkVersion flutter.compileSdkVersion + ndkVersion flutter.ndkVersion + + compileOptions { + sourceCompatibility JavaVersion.VERSION_1_8 + targetCompatibility JavaVersion.VERSION_1_8 + } + + kotlinOptions { + jvmTarget = '1.8' + } + + sourceSets { + main.java.srcDirs += 'src/main/kotlin' + } + + defaultConfig { + // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). + applicationId "dev.flutter.plugins.file_selector_example" + // You can update the following values to match your application needs. + // For more information, see: https://docs.flutter.dev/deployment/android#reviewing-the-gradle-build-configuration. + minSdkVersion flutter.minSdkVersion + targetSdkVersion flutter.targetSdkVersion + versionCode flutterVersionCode.toInteger() + versionName flutterVersionName + } + + buildTypes { + release { + // TODO: Add your own signing config for the release build. + // Signing with the debug keys for now, so `flutter run --release` works. + signingConfig signingConfigs.debug + } + } +} + +flutter { + source '../..' +} + +dependencies { + implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version" +} diff --git a/packages/file_selector/file_selector/example/android/app/src/debug/AndroidManifest.xml b/packages/file_selector/file_selector/example/android/app/src/debug/AndroidManifest.xml new file mode 100644 index 00000000000..399f6981d5d --- /dev/null +++ b/packages/file_selector/file_selector/example/android/app/src/debug/AndroidManifest.xml @@ -0,0 +1,7 @@ + + + + diff --git a/packages/file_selector/file_selector/example/android/app/src/main/AndroidManifest.xml b/packages/file_selector/file_selector/example/android/app/src/main/AndroidManifest.xml new file mode 100644 index 00000000000..2aa121a6d82 --- /dev/null +++ b/packages/file_selector/file_selector/example/android/app/src/main/AndroidManifest.xml @@ -0,0 +1,33 @@ + + + + + + + + + + + + + + diff --git a/packages/file_selector/file_selector/example/android/app/src/main/kotlin/dev/flutter/plugins/file_selector_example/MainActivity.kt b/packages/file_selector/file_selector/example/android/app/src/main/kotlin/dev/flutter/plugins/file_selector_example/MainActivity.kt new file mode 100644 index 00000000000..a38bd99bb8c --- /dev/null +++ b/packages/file_selector/file_selector/example/android/app/src/main/kotlin/dev/flutter/plugins/file_selector_example/MainActivity.kt @@ -0,0 +1,6 @@ +package dev.flutter.plugins.file_selector_example + +import io.flutter.embedding.android.FlutterActivity + +class MainActivity: FlutterActivity() { +} diff --git a/packages/file_selector/file_selector/example/android/app/src/main/res/drawable-v21/launch_background.xml b/packages/file_selector/file_selector/example/android/app/src/main/res/drawable-v21/launch_background.xml new file mode 100644 index 00000000000..f74085f3f6a --- /dev/null +++ b/packages/file_selector/file_selector/example/android/app/src/main/res/drawable-v21/launch_background.xml @@ -0,0 +1,12 @@ + + + + + + + + diff --git a/packages/file_selector/file_selector/example/android/app/src/main/res/drawable/launch_background.xml b/packages/file_selector/file_selector/example/android/app/src/main/res/drawable/launch_background.xml new file mode 100644 index 00000000000..304732f8842 --- /dev/null +++ b/packages/file_selector/file_selector/example/android/app/src/main/res/drawable/launch_background.xml @@ -0,0 +1,12 @@ + + + + + + + + diff --git a/packages/file_selector/file_selector/example/android/app/src/main/res/mipmap-hdpi/ic_launcher.png b/packages/file_selector/file_selector/example/android/app/src/main/res/mipmap-hdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..db77bb4b7b0906d62b1847e87f15cdcacf6a4f29 GIT binary patch literal 544 zcmeAS@N?(olHy`uVBq!ia0vp^9w5xY3?!3`olAj~WQl7;NpOBzNqJ&XDuZK6ep0G} zXKrG8YEWuoN@d~6R2!h8bpbvhu0Wd6uZuB!w&u2PAxD2eNXD>P5D~Wn-+_Wa#27Xc zC?Zj|6r#X(-D3u$NCt}(Ms06KgJ4FxJVv{GM)!I~&n8Bnc94O7-Hd)cjDZswgC;Qs zO=b+9!WcT8F?0rF7!Uys2bs@gozCP?z~o%U|N3vA*22NaGQG zlg@K`O_XuxvZ&Ks^m&R!`&1=spLvfx7oGDKDwpwW`#iqdw@AL`7MR}m`rwr|mZgU`8P7SBkL78fFf!WnuYWm$5Z0 zNXhDbCv&49sM544K|?c)WrFfiZvCi9h0O)B3Pgg&ebxsLQ05GG~ AQ2+n{ literal 0 HcmV?d00001 diff --git a/packages/file_selector/file_selector/example/android/app/src/main/res/mipmap-mdpi/ic_launcher.png b/packages/file_selector/file_selector/example/android/app/src/main/res/mipmap-mdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..17987b79bb8a35cc66c3c1fd44f5a5526c1b78be GIT binary patch literal 442 zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDA3?vioaBc-sk|nMYCBgY=CFO}lsSJ)O`AMk? zp1FzXsX?iUDV2pMQ*D5Xx&nMcT!A!W`0S9QKQy;}1Cl^CgaH=;G9cpY;r$Q>i*pfB zP2drbID<_#qf;rPZx^FqH)F_D#*k@@q03KywUtLX8Ua?`H+NMzkczFPK3lFz@i_kW%1NOn0|D2I9n9wzH8m|-tHjsw|9>@K=iMBhxvkv6m8Y-l zytQ?X=U+MF$@3 zt`~i=@j|6y)RWMK--}M|=T`o&^Ni>IoWKHEbBXz7?A@mgWoL>!*SXo`SZH-*HSdS+ yn*9;$7;m`l>wYBC5bq;=U}IMqLzqbYCidGC!)_gkIk_C@Uy!y&wkt5C($~2D>~)O*cj@FGjOCM)M>_ixfudOh)?xMu#Fs z#}Y=@YDTwOM)x{K_j*Q;dPdJ?Mz0n|pLRx{4n|)f>SXlmV)XB04CrSJn#dS5nK2lM zrZ9#~WelCp7&e13Y$jvaEXHskn$2V!!DN-nWS__6T*l;H&Fopn?A6HZ-6WRLFP=R` zqG+CE#d4|IbyAI+rJJ`&x9*T`+a=p|0O(+s{UBcyZdkhj=yS1>AirP+0R;mf2uMgM zC}@~JfByORAh4SyRgi&!(cja>F(l*O+nd+@4m$|6K6KDn_&uvCpV23&>G9HJp{xgg zoq1^2_p9@|WEo z*X_Uko@K)qYYv~>43eQGMdbiGbo>E~Q& zrYBH{QP^@Sti!`2)uG{irBBq@y*$B zi#&(U-*=fp74j)RyIw49+0MRPMRU)+a2r*PJ$L5roHt2$UjExCTZSbq%V!HeS7J$N zdG@vOZB4v_lF7Plrx+hxo7(fCV&}fHq)$ literal 0 HcmV?d00001 diff --git a/packages/file_selector/file_selector/example/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png b/packages/file_selector/file_selector/example/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..d5f1c8d34e7a88e3f88bea192c3a370d44689c3c GIT binary patch literal 1031 zcmeAS@N?(olHy`uVBq!ia0vp^6F``Q8Ax83A=Cw=BuiW)N`mv#O3D+9QW+dm@{>{( zJaZG%Q-e|yQz{EjrrIztFa`(sgt!6~Yi|1%a`XoT0ojZ}lNrNjb9xjc(B0U1_% zz5^97Xt*%oq$rQy4?0GKNfJ44uvxI)gC`h-NZ|&0-7(qS@?b!5r36oQ}zyZrNO3 zMO=Or+<~>+A&uN&E!^Sl+>xE!QC-|oJv`ApDhqC^EWD|@=#J`=d#Xzxs4ah}w&Jnc z$|q_opQ^2TrnVZ0o~wh<3t%W&flvYGe#$xqda2bR_R zvPYgMcHgjZ5nSA^lJr%;<&0do;O^tDDh~=pIxA#coaCY>&N%M2^tq^U%3DB@ynvKo}b?yu-bFc-u0JHzced$sg7S3zqI(2 z#Km{dPr7I=pQ5>FuK#)QwK?Y`E`B?nP+}U)I#c1+FM*1kNvWG|a(TpksZQ3B@sD~b zpQ2)*V*TdwjFOtHvV|;OsiDqHi=6%)o4b!)x$)%9pGTsE z-JL={-Ffv+T87W(Xpooq<`r*VzWQcgBN$$`u}f>-ZQI1BB8ykN*=e4rIsJx9>z}*o zo~|9I;xof literal 0 HcmV?d00001 diff --git a/packages/file_selector/file_selector/example/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png b/packages/file_selector/file_selector/example/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..4d6372eebdb28e45604e46eeda8dd24651419bc0 GIT binary patch literal 1443 zcmb`G{WsKk6vsdJTdFg%tJav9_E4vzrOaqkWF|A724Nly!y+?N9`YV6wZ}5(X(D_N(?!*n3`|_r0Hc?=PQw&*vnU?QTFY zB_MsH|!j$PP;I}?dppoE_gA(4uc!jV&0!l7_;&p2^pxNo>PEcNJv za5_RT$o2Mf!<+r?&EbHH6nMoTsDOa;mN(wv8RNsHpG)`^ymG-S5By8=l9iVXzN_eG%Xg2@Xeq76tTZ*dGh~Lo9vl;Zfs+W#BydUw zCkZ$o1LqWQO$FC9aKlLl*7x9^0q%0}$OMlp@Kk_jHXOjofdePND+j!A{q!8~Jn+s3 z?~~w@4?egS02}8NuulUA=L~QQfm;MzCGd)XhiftT;+zFO&JVyp2mBww?;QByS_1w! zrQlx%{^cMj0|Bo1FjwY@Q8?Hx0cIPF*@-ZRFpPc#bBw{5@tD(5%sClzIfl8WU~V#u zm5Q;_F!wa$BSpqhN>W@2De?TKWR*!ujY;Yylk_X5#~V!L*Gw~;$%4Q8~Mad z@`-kG?yb$a9cHIApZDVZ^U6Xkp<*4rU82O7%}0jjHlK{id@?-wpN*fCHXyXh(bLt* zPc}H-x0e4E&nQ>y%B-(EL=9}RyC%MyX=upHuFhAk&MLbsF0LP-q`XnH78@fT+pKPW zu72MW`|?8ht^tz$iC}ZwLp4tB;Q49K!QCF3@!iB1qOI=?w z7In!}F~ij(18UYUjnbmC!qKhPo%24?8U1x{7o(+?^Zu0Hx81|FuS?bJ0jgBhEMzf< zCgUq7r2OCB(`XkKcN-TL>u5y#dD6D!)5W?`O5)V^>jb)P)GBdy%t$uUMpf$SNV31$ zb||OojAbvMP?T@$h_ZiFLFVHDmbyMhJF|-_)HX3%m=CDI+ID$0^C>kzxprBW)hw(v zr!Gmda);ICoQyhV_oP5+C%?jcG8v+D@9f?Dk*!BxY}dazmrT@64UrP3hlslANK)bq z$67n83eh}OeW&SV@HG95P|bjfqJ7gw$e+`Hxo!4cx`jdK1bJ>YDSpGKLPZ^1cv$ek zIB?0S<#tX?SJCLWdMd{-ME?$hc7A$zBOdIJ)4!KcAwb=VMov)nK;9z>x~rfT1>dS+ zZ6#`2v@`jgbqq)P22H)Tx2CpmM^o1$B+xT6`(v%5xJ(?j#>Q$+rx_R|7TzDZe{J6q zG1*EcU%tE?!kO%^M;3aM6JN*LAKUVb^xz8-Pxo#jR5(-KBeLJvA@-gxNHx0M-ZJLl z;#JwQoh~9V?`UVo#}{6ka@II>++D@%KqGpMdlQ}?9E*wFcf5(#XQnP$Dk5~%iX^>f z%$y;?M0BLp{O3a(-4A?ewryHrrD%cx#Q^%KY1H zNre$ve+vceSLZcNY4U(RBX&)oZn*Py()h)XkE?PL$!bNb{N5FVI2Y%LKEm%yvpyTP z(1P?z~7YxD~Rf<(a@_y` literal 0 HcmV?d00001 diff --git a/packages/file_selector/file_selector/example/android/app/src/main/res/values-night/styles.xml b/packages/file_selector/file_selector/example/android/app/src/main/res/values-night/styles.xml new file mode 100644 index 00000000000..06952be745f --- /dev/null +++ b/packages/file_selector/file_selector/example/android/app/src/main/res/values-night/styles.xml @@ -0,0 +1,18 @@ + + + + + + + diff --git a/packages/file_selector/file_selector/example/android/app/src/main/res/values/styles.xml b/packages/file_selector/file_selector/example/android/app/src/main/res/values/styles.xml new file mode 100644 index 00000000000..cb1ef88056e --- /dev/null +++ b/packages/file_selector/file_selector/example/android/app/src/main/res/values/styles.xml @@ -0,0 +1,18 @@ + + + + + + + diff --git a/packages/file_selector/file_selector/example/android/app/src/profile/AndroidManifest.xml b/packages/file_selector/file_selector/example/android/app/src/profile/AndroidManifest.xml new file mode 100644 index 00000000000..399f6981d5d --- /dev/null +++ b/packages/file_selector/file_selector/example/android/app/src/profile/AndroidManifest.xml @@ -0,0 +1,7 @@ + + + + diff --git a/packages/file_selector/file_selector/example/android/build.gradle b/packages/file_selector/file_selector/example/android/build.gradle new file mode 100644 index 00000000000..f7eb7f63ce1 --- /dev/null +++ b/packages/file_selector/file_selector/example/android/build.gradle @@ -0,0 +1,31 @@ +buildscript { + ext.kotlin_version = '1.7.10' + repositories { + google() + mavenCentral() + } + + dependencies { + classpath 'com.android.tools.build:gradle:7.3.0' + classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" + } +} + +allprojects { + repositories { + google() + mavenCentral() + } +} + +rootProject.buildDir = '../build' +subprojects { + project.buildDir = "${rootProject.buildDir}/${project.name}" +} +subprojects { + project.evaluationDependsOn(':app') +} + +tasks.register("clean", Delete) { + delete rootProject.buildDir +} diff --git a/packages/file_selector/file_selector/example/android/gradle.properties b/packages/file_selector/file_selector/example/android/gradle.properties new file mode 100644 index 00000000000..94adc3a3f97 --- /dev/null +++ b/packages/file_selector/file_selector/example/android/gradle.properties @@ -0,0 +1,3 @@ +org.gradle.jvmargs=-Xmx1536M +android.useAndroidX=true +android.enableJetifier=true diff --git a/packages/file_selector/file_selector/example/android/gradle/wrapper/gradle-wrapper.properties b/packages/file_selector/file_selector/example/android/gradle/wrapper/gradle-wrapper.properties new file mode 100644 index 00000000000..3c472b99c6f --- /dev/null +++ b/packages/file_selector/file_selector/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-7.5-all.zip diff --git a/packages/file_selector/file_selector/example/android/settings.gradle b/packages/file_selector/file_selector/example/android/settings.gradle new file mode 100644 index 00000000000..44e62bcf06a --- /dev/null +++ b/packages/file_selector/file_selector/example/android/settings.gradle @@ -0,0 +1,11 @@ +include ':app' + +def localPropertiesFile = new File(rootProject.projectDir, "local.properties") +def properties = new Properties() + +assert localPropertiesFile.exists() +localPropertiesFile.withReader("UTF-8") { reader -> properties.load(reader) } + +def flutterSdkPath = properties.getProperty("flutter.sdk") +assert flutterSdkPath != null, "flutter.sdk not set in local.properties" +apply from: "$flutterSdkPath/packages/flutter_tools/gradle/app_plugin_loader.gradle" From e6da9b76593d62d6320b21f388b530b6097d05a7 Mon Sep 17 00:00:00 2001 From: Stuart Morgan Date: Tue, 27 Jun 2023 14:08:00 -0400 Subject: [PATCH 4/9] Add license header --- .../dev/flutter/plugins/file_selector_example/MainActivity.kt | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/packages/file_selector/file_selector/example/android/app/src/main/kotlin/dev/flutter/plugins/file_selector_example/MainActivity.kt b/packages/file_selector/file_selector/example/android/app/src/main/kotlin/dev/flutter/plugins/file_selector_example/MainActivity.kt index a38bd99bb8c..9bf2bbdb810 100644 --- a/packages/file_selector/file_selector/example/android/app/src/main/kotlin/dev/flutter/plugins/file_selector_example/MainActivity.kt +++ b/packages/file_selector/file_selector/example/android/app/src/main/kotlin/dev/flutter/plugins/file_selector_example/MainActivity.kt @@ -1,3 +1,7 @@ +// Copyright 2013 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. + package dev.flutter.plugins.file_selector_example import io.flutter.embedding.android.FlutterActivity From 91d609ddd30e62e3ff0d058be55914b411397268 Mon Sep 17 00:00:00 2001 From: Stuart Morgan Date: Tue, 27 Jun 2023 14:45:55 -0400 Subject: [PATCH 5/9] Set min SDK --- .../file_selector/example/android/app/build.gradle | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/packages/file_selector/file_selector/example/android/app/build.gradle b/packages/file_selector/file_selector/example/android/app/build.gradle index dd9d542dbbb..56af9bc1f95 100644 --- a/packages/file_selector/file_selector/example/android/app/build.gradle +++ b/packages/file_selector/file_selector/example/android/app/build.gradle @@ -44,11 +44,10 @@ android { } defaultConfig { - // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). applicationId "dev.flutter.plugins.file_selector_example" // You can update the following values to match your application needs. // For more information, see: https://docs.flutter.dev/deployment/android#reviewing-the-gradle-build-configuration. - minSdkVersion flutter.minSdkVersion + minSdkVersion 19 targetSdkVersion flutter.targetSdkVersion versionCode flutterVersionCode.toInteger() versionName flutterVersionName From 242931753b4a1dab58f5b28dc6beb55cd5fe6d39 Mon Sep 17 00:00:00 2001 From: Stuart Morgan Date: Tue, 27 Jun 2023 14:46:17 -0400 Subject: [PATCH 6/9] Update the example to handle platform diffs better --- .../example/lib/get_directory_page.dart | 2 +- .../file_selector/example/lib/home_page.dart | 49 ++++++++++++------- .../example/lib/open_text_page.dart | 5 +- .../example/lib/save_text_page.dart | 2 +- 4 files changed, 35 insertions(+), 23 deletions(-) diff --git a/packages/file_selector/file_selector/example/lib/get_directory_page.dart b/packages/file_selector/file_selector/example/lib/get_directory_page.dart index 9236a330d04..3619cb0dac5 100644 --- a/packages/file_selector/file_selector/example/lib/get_directory_page.dart +++ b/packages/file_selector/file_selector/example/lib/get_directory_page.dart @@ -50,7 +50,7 @@ class GetDirectoryPage extends StatelessWidget { ), onPressed: _isIOS ? null : () => _getDirectoryPath(context), child: const Text( - 'Press to ask user to choose a directory (not supported on iOS).', + 'Press to ask user to choose a directory.', ), ), ], diff --git a/packages/file_selector/file_selector/example/lib/home_page.dart b/packages/file_selector/file_selector/example/lib/home_page.dart index 052dba04333..25db9eaba40 100644 --- a/packages/file_selector/file_selector/example/lib/home_page.dart +++ b/packages/file_selector/file_selector/example/lib/home_page.dart @@ -2,6 +2,9 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. +import 'dart:io' show Platform; + +import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; /// Home Page of the application @@ -43,25 +46,33 @@ class HomePage extends StatelessWidget { child: const Text('Open multiple images'), onPressed: () => Navigator.pushNamed(context, '/open/images'), ), - const SizedBox(height: 10), - ElevatedButton( - style: style, - child: const Text('Save a file'), - onPressed: () => Navigator.pushNamed(context, '/save/text'), - ), - const SizedBox(height: 10), - ElevatedButton( - style: style, - child: const Text('Open a get directory dialog'), - onPressed: () => Navigator.pushNamed(context, '/directory'), - ), - const SizedBox(height: 10), - ElevatedButton( - style: style, - child: const Text('Open a get multi directories dialog'), - onPressed: () => - Navigator.pushNamed(context, '/multi-directories'), - ), + // TODO(stuartmorgan): Replace these checks with support queries once + // https://github.com/flutter/flutter/issues/127328 is implemented. + if (kIsWeb || !(Platform.isAndroid || Platform.isIOS)) ...[ + const SizedBox(height: 10), + ElevatedButton( + style: style, + child: const Text('Save a file'), + onPressed: () => Navigator.pushNamed(context, '/save/text'), + ), + ], + if (!(kIsWeb || Platform.isIOS)) ...[ + const SizedBox(height: 10), + ElevatedButton( + style: style, + child: const Text('Open a get directory dialog'), + onPressed: () => Navigator.pushNamed(context, '/directory'), + ), + ], + if (!(kIsWeb || Platform.isAndroid || Platform.isIOS)) ...[ + const SizedBox(height: 10), + ElevatedButton( + style: style, + child: const Text('Open a get multi directories dialog'), + onPressed: () => + Navigator.pushNamed(context, '/multi-directories'), + ), + ], ], ), ), diff --git a/packages/file_selector/file_selector/example/lib/open_text_page.dart b/packages/file_selector/file_selector/example/lib/open_text_page.dart index 5121e9d55a4..5223e6ab600 100644 --- a/packages/file_selector/file_selector/example/lib/open_text_page.dart +++ b/packages/file_selector/file_selector/example/lib/open_text_page.dart @@ -3,6 +3,7 @@ // found in the LICENSE file. import 'package:file_selector/file_selector.dart'; +import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; import 'package:path_provider/path_provider.dart'; @@ -19,8 +20,8 @@ class OpenTextPage extends StatelessWidget { // This demonstrates using an initial directory for the prompt, which should // only be done in cases where the application can likely predict where the // file would be. In most cases, this parameter should not be provided. - final String initialDirectory = - (await getApplicationDocumentsDirectory()).path; + final String? initialDirectory = + kIsWeb ? null : (await getApplicationDocumentsDirectory()).path; final XFile? file = await openFile( acceptedTypeGroups: [typeGroup], initialDirectory: initialDirectory, diff --git a/packages/file_selector/file_selector/example/lib/save_text_page.dart b/packages/file_selector/file_selector/example/lib/save_text_page.dart index e782530914e..5099e3252bb 100644 --- a/packages/file_selector/file_selector/example/lib/save_text_page.dart +++ b/packages/file_selector/file_selector/example/lib/save_text_page.dart @@ -85,7 +85,7 @@ class SaveTextPage extends StatelessWidget { ), onPressed: _isIOS ? null : () => _saveFile(), child: const Text( - 'Press to save a text file (not supported on iOS).', + 'Press to save a text file.', ), ), ], From 086987682600a2623e61767dc35a117bb449586d Mon Sep 17 00:00:00 2001 From: Stuart Morgan Date: Tue, 27 Jun 2023 14:56:14 -0400 Subject: [PATCH 7/9] Exclude from integration tests --- script/configs/exclude_integration_android.yaml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/script/configs/exclude_integration_android.yaml b/script/configs/exclude_integration_android.yaml index fe51488c706..64193b5e60c 100644 --- a/script/configs/exclude_integration_android.yaml +++ b/script/configs/exclude_integration_android.yaml @@ -1 +1,2 @@ -[] +# Can't use Flutter integration tests due to native modal UI. +- file_selector From 95f82ab0a1ffd4080600ba783281d2127c34b135 Mon Sep 17 00:00:00 2001 From: Stuart Morgan Date: Tue, 27 Jun 2023 14:58:50 -0400 Subject: [PATCH 8/9] Add missing CODEOWNER --- CODEOWNERS | 1 + 1 file changed, 1 insertion(+) diff --git a/CODEOWNERS b/CODEOWNERS index dfc8a29c749..21ef69fc030 100644 --- a/CODEOWNERS +++ b/CODEOWNERS @@ -53,6 +53,7 @@ packages/**/*_web/** @ditman packages/camera/camera_android/** @camsim99 packages/camera/camera_android_camerax/** @camsim99 packages/espresso/** @reidbaker +packages/file_selector/file_selector_android/** @gmackall packages/flutter_plugin_android_lifecycle/** @reidbaker packages/google_maps_flutter/google_maps_flutter_android/** @reidbaker packages/google_sign_in/google_sign_in_android/** @camsim99 From 52688cec0b51aa65165fdfea2ad5092e68e557cd Mon Sep 17 00:00:00 2001 From: Stuart Morgan Date: Fri, 30 Jun 2023 10:54:34 -0400 Subject: [PATCH 9/9] Update gradle dependabot coverage --- .github/dependabot.yml | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/.github/dependabot.yml b/.github/dependabot.yml index f010a280e18..c5fa2a0e95d 100644 --- a/.github/dependabot.yml +++ b/.github/dependabot.yml @@ -159,6 +159,17 @@ updates: - dependency-name: "*" update-types: ["version-update:semver-minor", "version-update:semver-patch"] + - package-ecosystem: "gradle" + directory: "/packages/file_selector/file_selector/example/android/app" + commit-message: + prefix: "[file_selector]" + schedule: + interval: "weekly" + open-pull-requests-limit: 10 + ignore: + - dependency-name: "*" + update-types: ["version-update:semver-minor", "version-update:semver-patch"] + - package-ecosystem: "gradle" directory: "/packages/file_selector/file_selector_android/android" commit-message: