From 4f6a0a4eaad70db98abe4587e2433c1aba41d3d0 Mon Sep 17 00:00:00 2001 From: Dimitar Todorov Date: Wed, 7 Aug 2019 12:02:38 +0300 Subject: [PATCH 01/23] feat: Add support for video select in android --- README.md | 2 +- src/imagepicker.android.ts | 16 +++++++++++++++- 2 files changed, 16 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 475aca3..7a0d25e 100644 --- a/README.md +++ b/README.md @@ -133,7 +133,7 @@ context | prompt | iOS | undefined | Display prompt text when selecting assets. | | numberOfColumnsInPortrait | iOS | 4 | Set the number of columns in Portrait orientation. | | numberOfColumnsInLandscape | iOS | 7 | Set the number of columns in Landscape orientation. | -| mediaType | both | Any (iOS), Image (Android) | Choose whether to pick Image/Video/Any type of assets. | +| mediaType | both | Any | Choose whether to pick Image/Video/Any type of assets. | The **hostView** parameter can be set to the view that hosts the image picker. Applicable in iOS only, intended to be used when open picker from a modal page. diff --git a/src/imagepicker.android.ts b/src/imagepicker.android.ts index 09d8053..ba5d406 100644 --- a/src/imagepicker.android.ts +++ b/src/imagepicker.android.ts @@ -147,7 +147,7 @@ export class ImagePicker { } get mediaType(): string { - const mediaType = this._options && 'mediaType' in this._options ? this._options.mediaType : ImagePickerMediaType.Image; + const mediaType = this._options && 'mediaType' in this._options ? this._options.mediaType : ImagePickerMediaType.Any; if (mediaType === ImagePickerMediaType.Image) { return "image/*"; } else if (mediaType === ImagePickerMediaType.Video) { @@ -227,6 +227,20 @@ export class ImagePicker { let intent = new Intent(); intent.setType(this.mediaType); + let length = this.mediaType === "*/*" ? 2 : 1; + let mimeTypes = Array.create(java.lang.String, length); + + if (this.mediaType === "*/*") { + mimeTypes[0] = "image/*"; + mimeTypes[1] = "video/*"; + } + else { + mimeTypes[0] = this.mediaType; + } + + // not in platform-declaration typings + intent.putExtra((android.content.Intent as any).EXTRA_MIME_TYPES, mimeTypes); + // TODO: Use (android).content.Intent.EXTRA_ALLOW_MULTIPLE if (this.mode === 'multiple') { intent.putExtra("android.intent.extra.ALLOW_MULTIPLE", true); From 4f71c0857fe28e15a1125f9eba0e8607d38a725a Mon Sep 17 00:00:00 2001 From: Dimitar Todorov Date: Wed, 7 Aug 2019 12:11:39 +0300 Subject: [PATCH 02/23] Fix: lint errors --- src/imagepicker.android.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/src/imagepicker.android.ts b/src/imagepicker.android.ts index ba5d406..5037f76 100644 --- a/src/imagepicker.android.ts +++ b/src/imagepicker.android.ts @@ -240,7 +240,6 @@ export class ImagePicker { // not in platform-declaration typings intent.putExtra((android.content.Intent as any).EXTRA_MIME_TYPES, mimeTypes); - // TODO: Use (android).content.Intent.EXTRA_ALLOW_MULTIPLE if (this.mode === 'multiple') { intent.putExtra("android.intent.extra.ALLOW_MULTIPLE", true); From 0d6ca901868357e8e9f65787841e69e6e69cc677 Mon Sep 17 00:00:00 2001 From: dtodorov Date: Wed, 7 Aug 2019 18:24:05 +0300 Subject: [PATCH 03/23] Chore: bump version to 7.0.0 --- src/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/package.json b/src/package.json index 59b4a4c..e70fbd9 100644 --- a/src/package.json +++ b/src/package.json @@ -1,6 +1,6 @@ { "name": "nativescript-imagepicker", - "version": "6.3.0", + "version": "7.0.0", "description": "A plugin for the NativeScript framework implementing multiple image picker", "repository": { "type": "git", From 07a034e81f4dc176e28e041be05b67abf0ca279e Mon Sep 17 00:00:00 2001 From: dtodorov Date: Tue, 20 Aug 2019 11:37:52 +0300 Subject: [PATCH 04/23] Fix: mocha-multi version to 1.1.0 (#297) * Fix: mocha-multi version to.1.0.1 * Update package.json --- tests/package.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/package.json b/tests/package.json index a983540..4370321 100644 --- a/tests/package.json +++ b/tests/package.json @@ -11,7 +11,7 @@ "karma-nativescript-launcher": "^0.4.0", "mocha": "^3.3.0", "mocha-junit-reporter": "^1.18.0", - "mocha-multi": "^1.0.1", + "mocha-multi": "1.1.0", "mochawesome": "^3.1.1", "nativescript-dev-appium": "~5.2.0", "typescript": "~3.5.3" @@ -19,4 +19,4 @@ "scripts": { "e2e": "tsc -p e2e && mocha --opts ./e2e/config/mocha.opts" } -} \ No newline at end of file +} From 2a3cb0993fb1dcc2e5747a1ff67e7280439e8350 Mon Sep 17 00:00:00 2001 From: dtodorov Date: Tue, 20 Aug 2019 17:18:48 +0300 Subject: [PATCH 05/23] Add android28 to capabilities. Update test run. (#298) * Add android28 to capabilities. Update test run. * Fix: update tests for android28 compatibility --- .travis.yml | 6 +++--- tests/e2e/config/appium.capabilities.json | 7 +++++++ tests/e2e/test.e2e.ts | 22 +++++----------------- 3 files changed, 15 insertions(+), 20 deletions(-) diff --git a/.travis.yml b/.travis.yml index 4658607..6570619 100644 --- a/.travis.yml +++ b/.travis.yml @@ -118,7 +118,7 @@ matrix: script: - npm i -g appium - cd tests && npm i - - travis_wait travis_retry npm run e2e -- --runType android24 --sauceLab --appPath $ANDROID_PACKAGE_JS + - travis_wait travis_retry npm run e2e -- --runType android28 --sauceLab --appPath $ANDROID_PACKAGE_JS - os: linux env: - Android="24" @@ -129,7 +129,7 @@ matrix: script: - npm i -g appium - cd tests && npm i - - travis_wait travis_retry npm run e2e -- --runType android24 --sauceLab --appPath $ANDROID_PACKAGE_VUE + - travis_wait travis_retry npm run e2e -- --runType android28 --sauceLab --appPath $ANDROID_PACKAGE_VUE - os: linux env: - Android="24" @@ -140,7 +140,7 @@ matrix: script: - npm i -g appium - cd tests && npm i - - travis_wait travis_retry npm run e2e -- --runType android24 --sauceLab --appPath $ANDROID_PACKAGE_NG + - travis_wait travis_retry npm run e2e -- --runType android28 --sauceLab --appPath $ANDROID_PACKAGE_NG - os: linux env: - iOS="12.0" diff --git a/tests/e2e/config/appium.capabilities.json b/tests/e2e/config/appium.capabilities.json index 1333fc5..0347667 100644 --- a/tests/e2e/config/appium.capabilities.json +++ b/tests/e2e/config/appium.capabilities.json @@ -36,6 +36,13 @@ "appium-version": "1.7.1", "noReset": true }, + "android28": { + "platformName": "Android", + "platformVersion": "9.0", + "deviceName": "Android GoogleAPI Emulator", + "appiumVersion": "1.9.1", + "noReset": true + }, "sim11iPhone6": { "platformName": "iOS", "platformVersion": "11.0", diff --git a/tests/e2e/test.e2e.ts b/tests/e2e/test.e2e.ts index 5a56a2d..20ba1ce 100644 --- a/tests/e2e/test.e2e.ts +++ b/tests/e2e/test.e2e.ts @@ -57,26 +57,14 @@ describe("Imagepicker", async function () { const confirmButton = await driver.findElementByText(confirmButtonText); await confirmButton.click(); - if (isAndroid) { - const imagesFolderXpath = await driver.elementHelper.getXPathByText(imagesFolderName, SearchOptions.contains); - await driver.driver.sleep(3000); - let imagesFolder = await driver.driver.elementByXPathIfExists(imagesFolderXpath, 10000); - - if (isSauceRun && imagesFolder) { - await imagesFolder.click(); - let dcimFolder = await driver.findElementByText("DCIM", SearchOptions.contains); - await dcimFolder.click(); - imagesFolder = await driver.findElementByClassName(driver.locators.image); - await imagesFolder.click(); - } - } else { + if (!isAndroid) { const cameraRollFolder = await driver.findElementByAccessibilityId(imagesFolderNameIos); await cameraRollFolder.click(); } const imageLocator = isAndroid ? "android.widget.ImageView" : "XCUIElementTypeCell"; - const image = await driver.findElementByClassName(imageLocator); - await image.tap(); + const images = await driver.findElementsByClassName(imageLocator); + await images[1].tap(); pickSingleButton = await driver.findElementByText(pickSingleButtonText, SearchOptions.contains); expect(pickSingleButton).to.exist; @@ -101,8 +89,8 @@ describe("Imagepicker", async function () { if (isAndroid) { const allImages = await driver.findElementsByClassName("android.widget.ImageView"); - await allImages[5].hold(); // second Image - await allImages[2].click(); // first image + await allImages[1].hold(); // second Image + await allImages[4].click(); // first image } else { const allImages = await driver.findElementsByClassName("XCUIElementTypeCell"); await allImages[0].click(); // first image From be155c9078c567ab8246bea09d4274477a727814 Mon Sep 17 00:00:00 2001 From: dtodorov Date: Wed, 21 Aug 2019 13:59:40 +0300 Subject: [PATCH 06/23] Chore: update labels of travis builds --- .travis.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.travis.yml b/.travis.yml index 6570619..60099d4 100644 --- a/.travis.yml +++ b/.travis.yml @@ -110,7 +110,7 @@ matrix: - "curl -u $SAUCE_USER:$SAUCE_KEY -X POST -H 'Content-Type: application/octet-stream' $ANDROID_SAUCE_STORAGE/$ANDROID_PACKAGE_VUE?overwrite=true --data-binary @$ANDROID_PACKAGE_FOLDER_VUE/app-debug.apk" - stage: "UI Tests" env: - - Android="24" + - Android="28" - Type="VanillaJS" language: node_js os: linux @@ -121,7 +121,7 @@ matrix: - travis_wait travis_retry npm run e2e -- --runType android28 --sauceLab --appPath $ANDROID_PACKAGE_JS - os: linux env: - - Android="24" + - Android="28" - Type="VueJS" language: node_js os: linux @@ -132,7 +132,7 @@ matrix: - travis_wait travis_retry npm run e2e -- --runType android28 --sauceLab --appPath $ANDROID_PACKAGE_VUE - os: linux env: - - Android="24" + - Android="28" - Type="Angular" language: node_js os: linux From a9b36dcab8acbb49aa30d820e3e1cd02bad314c1 Mon Sep 17 00:00:00 2001 From: Zdravko Branzov Date: Mon, 9 Sep 2019 13:01:59 +0300 Subject: [PATCH 07/23] fix: android images location --- .gitignore | 4 ++++ tests/e2e/helper.ts | 10 ++++++++++ tests/e2e/test.e2e.ts | 11 +++++++++++ 3 files changed, 25 insertions(+) create mode 100644 tests/e2e/helper.ts diff --git a/.gitignore b/.gitignore index c96a83f..ca6ae36 100644 --- a/.gitignore +++ b/.gitignore @@ -36,3 +36,7 @@ demo-angular/report/stats.json /src/platforms/android/nativescript_imagepicker.aar /src/*.tgz !demo-vue/app/app.js + +// Tests +**/mochawesome-report/ +test-results.xml diff --git a/tests/e2e/helper.ts b/tests/e2e/helper.ts new file mode 100644 index 0000000..6f7a49f --- /dev/null +++ b/tests/e2e/helper.ts @@ -0,0 +1,10 @@ +import { AppiumDriver } from "nativescript-dev-appium"; + +export async function findAndroidImages(driver: AppiumDriver) { + const sidedrawer = await driver.findElementByAccessibilityId("Show roots"); + await sidedrawer.click(); + const images = await driver.findElementByText("Images"); + await images.click(); + const dcimFolder = await driver.findElementByText("DCIM"); + await dcimFolder.click(); +} \ No newline at end of file diff --git a/tests/e2e/test.e2e.ts b/tests/e2e/test.e2e.ts index 20ba1ce..d6d718a 100644 --- a/tests/e2e/test.e2e.ts +++ b/tests/e2e/test.e2e.ts @@ -1,6 +1,7 @@ import { AppiumDriver, createDriver, SearchOptions } from "nativescript-dev-appium"; import { isSauceLab, runType } from "nativescript-dev-appium/lib/parser"; import { expect } from "chai"; +import { findAndroidImages } from "./helper"; const fs = require('fs'); const addContext = require('mochawesome/addContext'); const rimraf = require('rimraf'); @@ -57,6 +58,11 @@ describe("Imagepicker", async function () { const confirmButton = await driver.findElementByText(confirmButtonText); await confirmButton.click(); + // TODO remove when SauceLabs fix images location + if (isAndroid) { + await findAndroidImages(driver); + } + if (!isAndroid) { const cameraRollFolder = await driver.findElementByAccessibilityId(imagesFolderNameIos); await cameraRollFolder.click(); @@ -82,6 +88,11 @@ describe("Imagepicker", async function () { const pickMultipleButton = await driver.findElementByText(pickMultipleButtonText, SearchOptions.contains); await pickMultipleButton.click(); + // TODO remove when SauceLabs fix images location + if (isAndroid) { + await findAndroidImages(driver); + } + if (!isAndroid) { const cameraRollFolder = await driver.findElementByText(imagesFolderNameIos); await cameraRollFolder.click(); From 73d16d090d4cdab4d8f368dee48908308419443f Mon Sep 17 00:00:00 2001 From: Kirill Goncharov Date: Tue, 27 Aug 2019 15:39:44 +0300 Subject: [PATCH 08/23] feat(android): add option for showing internal/external storage --- README.md | 3 +-- src/imagepicker.android.ts | 4 ++++ src/imagepicker.common.ts | 6 ++++++ src/index.d.ts | 7 +++++++ 4 files changed, 18 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 7a0d25e..e43d2a3 100644 --- a/README.md +++ b/README.md @@ -22,8 +22,6 @@ Imagepicker plugin supporting both single and multiple selection. - [Request permissions, show the images list and process the selection](#request-permissions-show-the-images-list-and-process-the-selection) - [API](#api) - [Methods](#methods) - - [Properties](#properties) - - [Image properties](#image-properties) - [Contribute](#contribute) - [Get Help](#get-help) @@ -134,6 +132,7 @@ context | numberOfColumnsInPortrait | iOS | 4 | Set the number of columns in Portrait orientation. | | numberOfColumnsInLandscape | iOS | 7 | Set the number of columns in Landscape orientation. | | mediaType | both | Any | Choose whether to pick Image/Video/Any type of assets. | +| showAdvanced | Android | false | Show internal and removable storage options on Android (**WARNING**: [not supported officially](https://issuetracker.google.com/issues/72053350)). | The **hostView** parameter can be set to the view that hosts the image picker. Applicable in iOS only, intended to be used when open picker from a modal page. diff --git a/src/imagepicker.android.ts b/src/imagepicker.android.ts index 5037f76..4285b80 100644 --- a/src/imagepicker.android.ts +++ b/src/imagepicker.android.ts @@ -245,6 +245,10 @@ export class ImagePicker { intent.putExtra("android.intent.extra.ALLOW_MULTIPLE", true); } + if (this._options.showAdvanced) { + intent.putExtra("android.content.extra.SHOW_ADVANCED", true); + } + intent.putExtra(android.content.Intent.EXTRA_LOCAL_ONLY, true); intent.setAction("android.intent.action.OPEN_DOCUMENT"); let chooser = Intent.createChooser(intent, "Select Picture"); diff --git a/src/imagepicker.common.ts b/src/imagepicker.common.ts index 364787e..0d904f4 100644 --- a/src/imagepicker.common.ts +++ b/src/imagepicker.common.ts @@ -48,6 +48,12 @@ export interface Options { */ mediaType?: ImagePickerMediaType; + /** + * Show internal and removable storage options on Android. + * Not supported officially, see https://issuetracker.google.com/issues/72053350 | + */ + showAdvanced?: boolean; + android?: { /** * Provide a reason for permission request to access external storage on api levels above 23. diff --git a/src/index.d.ts b/src/index.d.ts index 38208e1..d28b76f 100644 --- a/src/index.d.ts +++ b/src/index.d.ts @@ -67,12 +67,19 @@ interface Options { */ mediaType?: ImagePickerMediaType; + /** + * Show internal and removable storage options on Android. + * Not supported officially, see https://issuetracker.google.com/issues/72053350 | + */ + showAdvanced?: boolean; + android?: { /** * Provide a reason for permission request to access external storage on api levels above 23. */ read_external_storage?: string; }; + } /** From 9048c186f26a9444f8ba29c9adb77075159aeb6b Mon Sep 17 00:00:00 2001 From: Kirill Goncharov Date: Wed, 4 Sep 2019 15:07:51 +0300 Subject: [PATCH 09/23] refactor(android): add mimeTypes property to ImagePicker class This would allow customization of picker behaviour in subclasses. --- src/imagepicker.android.ts | 28 ++++++++++++++++------------ src/index.d.ts | 3 +++ 2 files changed, 19 insertions(+), 12 deletions(-) diff --git a/src/imagepicker.android.ts b/src/imagepicker.android.ts index 4285b80..8a1d7f1 100644 --- a/src/imagepicker.android.ts +++ b/src/imagepicker.android.ts @@ -157,6 +157,20 @@ export class ImagePicker { } } + get mimeTypes() { + let length = this.mediaType === "*/*" ? 2 : 1; + let mimeTypes = Array.create(java.lang.String, length); + + if (this.mediaType === "*/*") { + mimeTypes[0] = "image/*"; + mimeTypes[1] = "video/*"; + } + else { + mimeTypes[0] = this.mediaType; + } + return mimeTypes; + } + authorize(): Promise { if ((android).os.Build.VERSION.SDK_INT >= 23) { return permissions.requestPermission([(android).Manifest.permission.READ_EXTERNAL_STORAGE]); @@ -227,19 +241,9 @@ export class ImagePicker { let intent = new Intent(); intent.setType(this.mediaType); - let length = this.mediaType === "*/*" ? 2 : 1; - let mimeTypes = Array.create(java.lang.String, length); - - if (this.mediaType === "*/*") { - mimeTypes[0] = "image/*"; - mimeTypes[1] = "video/*"; - } - else { - mimeTypes[0] = this.mediaType; - } - // not in platform-declaration typings - intent.putExtra((android.content.Intent as any).EXTRA_MIME_TYPES, mimeTypes); + intent.putExtra((android.content.Intent as any).EXTRA_MIME_TYPES, this.mimeTypes); + // TODO: Use (android).content.Intent.EXTRA_ALLOW_MULTIPLE if (this.mode === 'multiple') { intent.putExtra("android.intent.extra.ALLOW_MULTIPLE", true); diff --git a/src/index.d.ts b/src/index.d.ts index d28b76f..8a5b1a8 100644 --- a/src/index.d.ts +++ b/src/index.d.ts @@ -4,6 +4,9 @@ import { ImageAsset } from "tns-core-modules/image-asset"; import { View } from "tns-core-modules/ui/core/view/view"; export class ImagePicker { + + constructor(options?: Options); + /** * Call this before 'present' to request any additional permissions that may be necessary. * In case of failed authorization consider notifying the user for degraded functionality. From 3565b636f8a18b923c3be7d93bd1991373e823da Mon Sep 17 00:00:00 2001 From: Zdravko Branzov Date: Tue, 10 Sep 2019 16:02:54 +0300 Subject: [PATCH 10/23] chore: bump version to 7.1.0 --- src/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/package.json b/src/package.json index e70fbd9..e5772e8 100644 --- a/src/package.json +++ b/src/package.json @@ -1,6 +1,6 @@ { "name": "nativescript-imagepicker", - "version": "7.0.0", + "version": "7.1.0", "description": "A plugin for the NativeScript framework implementing multiple image picker", "repository": { "type": "git", From 555b177f8b5b6b921eecabb984eed045d80ba479 Mon Sep 17 00:00:00 2001 From: Fatme Date: Fri, 25 Oct 2019 12:25:31 +0300 Subject: [PATCH 11/23] fix: don't use short imports Avoid using short imports - https://www.nativescript.org/blog/say-goodbye-to-short-imports-in-nativescript. --- src/imagepicker.android.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/imagepicker.android.ts b/src/imagepicker.android.ts index 8a1d7f1..6f49096 100644 --- a/src/imagepicker.android.ts +++ b/src/imagepicker.android.ts @@ -185,7 +185,7 @@ export class ImagePicker { // WARNING: If we want to support multiple pickers we will need to have a range of IDs here: let RESULT_CODE_PICKER_IMAGES = 9192; - let application = require("application"); + let application = require("tns-core-modules/application"); application.android.on(application.AndroidApplication.activityResultEvent, onResult); function onResult(args) { From e7e43ec844db84f4118c95a31a99778f48abe2ce Mon Sep 17 00:00:00 2001 From: Elena Hristova Date: Thu, 7 Nov 2019 17:38:54 +0200 Subject: [PATCH 12/23] chore: update to 6.2 (#314) --- demo-angular/package.json | 27 +++++++++++++-------------- demo-vue/package.json | 12 ++++++------ demo/package.json | 8 ++++---- src/package.json | 6 +++--- 4 files changed, 26 insertions(+), 27 deletions(-) diff --git a/demo-angular/package.json b/demo-angular/package.json index 88199fb..297475e 100644 --- a/demo-angular/package.json +++ b/demo-angular/package.json @@ -2,22 +2,21 @@ "nativescript": { "id": "org.nativescript.imagepickerdemoangular", "tns-ios": { - "version": "6.0.1" + "version": "6.2.0" }, "tns-android": { - "version": "6.0.0" + "version": "6.2.0" } }, "dependencies": { - "@angular/common": "~8.0.0", - "@angular/compiler": "~8.0.0", - "@angular/core": "~8.0.0", - "@angular/forms": "~8.0.0", - "@angular/http": "8.0.0-beta.10", - "@angular/platform-browser": "~8.0.0", - "@angular/platform-browser-dynamic": "~8.0.0", - "@angular/router": "~8.0.0", - "nativescript-angular": "~8.0.0", + "@angular/common": "~8.2.0", + "@angular/compiler": "~8.2.0", + "@angular/core": "~8.2.0", + "@angular/forms": "~8.2.0", + "@angular/platform-browser": "~8.2.0", + "@angular/platform-browser-dynamic": "~8.2.0", + "@angular/router": "~8.2.0", + "nativescript-angular": "~8.20.0", "nativescript-imagepicker": "../src", "nativescript-theme-core": "^1.0.4", "nativescript-unit-test-runner": "0.7.0", @@ -31,11 +30,11 @@ "karma-jasmine": "2.0.1", "karma-nativescript-launcher": "^0.4.0", "nativescript-css-loader": "~0.26.0", - "nativescript-dev-webpack": "~1.0.1", + "nativescript-dev-webpack": "^1.3.0", "tns-platform-declarations": "^6.0.0", "tslint": "~5.11.0", "zone.js": "^0.8.4", - "typescript": "~3.4.5", + "typescript": "~3.5.3", "karma-webpack": "3.0.5" }, "scripts": { @@ -51,4 +50,4 @@ "build-android-bundle": "npm run ns-bundle --android --build-app", "build-ios-bundle": "npm run ns-bundle --ios --build-app" } -} \ No newline at end of file +} diff --git a/demo-vue/package.json b/demo-vue/package.json index 7527afb..0c57ee5 100644 --- a/demo-vue/package.json +++ b/demo-vue/package.json @@ -2,16 +2,16 @@ "nativescript": { "id": "org.nativescript.demovue", "tns-android": { - "version": "6.0.0" + "version": "6.2.0" }, "tns-ios": { - "version": "6.0.1" + "version": "6.2.0" } }, "dependencies": { "nativescript-imagepicker": "../src", "nativescript-theme-core": "~1.0.4", - "nativescript-vue": "~2.3.0", + "nativescript-vue": "~2.4.0", "tns-core-modules": "^6.0.0" }, "devDependencies": { @@ -28,11 +28,11 @@ "mocha-multi": "^1.0.1", "mochawesome": "^3.1.1", "nativescript-dev-appium": "~5.2.0", - "nativescript-dev-webpack": "~1.0.1", - "nativescript-vue-template-compiler": "~2.3.0", + "nativescript-dev-webpack": "^1.3.0", + "nativescript-vue-template-compiler": "~2.4.0", "node-sass": "~4.12.0", "vue-loader": "~15.4.0", - "typescript": "~3.4.5" + "typescript": "~3.5.3" }, "scripts": { "build.plugin": "cd ../src && npm run build", diff --git a/demo/package.json b/demo/package.json index a97b3d4..076077f 100644 --- a/demo/package.json +++ b/demo/package.json @@ -2,10 +2,10 @@ "nativescript": { "id": "org.nativescript.imagepickerdemo", "tns-android": { - "version": "6.0.0" + "version": "6.2.0" }, "tns-ios": { - "version": "6.0.1" + "version": "6.2.0" } }, "dependencies": { @@ -30,10 +30,10 @@ "mochawesome": "^3.1.1", "nativescript-css-loader": "~0.26.0", "nativescript-dev-appium": "~5.2.0", - "nativescript-dev-webpack": "~1.0.1", + "nativescript-dev-webpack": "^1.3.0", "tns-platform-declarations": "^6.0.0", "tslint": "~5.11.0", - "typescript": "~3.4.5", + "typescript": "~3.5.3", "karma-webpack": "3.0.5" }, "scripts": { diff --git a/src/package.json b/src/package.json index e5772e8..f97ecb9 100644 --- a/src/package.json +++ b/src/package.json @@ -46,9 +46,9 @@ "homepage": "https://github.com/NativeScript/nativescript-imagepicker", "readmeFilename": "README.md", "devDependencies": { - "tns-core-modules": "^5.0.0", - "tns-platform-declarations": "^5.0.0", - "typescript": "~3.4.5", + "tns-core-modules": "^6.0.0", + "tns-platform-declarations": "^6.0.0", + "typescript": "~3.5.3", "tslint": "~5.11.0" }, "dependencies": { From ca29935125dad9e829ef26d63808ba0e3eee680a Mon Sep 17 00:00:00 2001 From: Stoyan Stratev Date: Wed, 18 Dec 2019 12:00:25 +0200 Subject: [PATCH 13/23] fix: permissions problem when building with API 29 - cannot read external storage when app is built with targetSdkVersion set to 29 --- .../app/App_Resources/Android/src/main/AndroidManifest.xml | 1 + demo-angular/app/package.json | 3 ++- .../app/App_Resources/Android/src/main/AndroidManifest.xml | 3 ++- demo-vue/app/package.json | 3 ++- demo/app/App_Resources/Android/src/main/AndroidManifest.xml | 1 + demo/app/package.json | 3 ++- src/platforms/android/AndroidManifest.xml | 2 +- 7 files changed, 11 insertions(+), 5 deletions(-) diff --git a/demo-angular/app/App_Resources/Android/src/main/AndroidManifest.xml b/demo-angular/app/App_Resources/Android/src/main/AndroidManifest.xml index 9db8321..976f83f 100644 --- a/demo-angular/app/App_Resources/Android/src/main/AndroidManifest.xml +++ b/demo-angular/app/App_Resources/Android/src/main/AndroidManifest.xml @@ -19,6 +19,7 @@ --> - + From 268fe7103db230a00de796720b454715ecc92660 Mon Sep 17 00:00:00 2001 From: Stoyan Stratev Date: Wed, 18 Dec 2019 13:01:12 +0200 Subject: [PATCH 14/23] Update .travis.yml build using android sdk 29 --- .travis.yml | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/.travis.yml b/.travis.yml index 60099d4..51535f8 100644 --- a/.travis.yml +++ b/.travis.yml @@ -76,7 +76,7 @@ matrix: os: linux dist: trusty env: - - WebpackAndroid="28" + - WebpackAndroid="29" - Type="VanillaJS" jdk: oraclejdk8 before_install: nvm install 10 @@ -88,7 +88,7 @@ matrix: os: linux dist: trusty env: - - WebpackAndroid="28" + - WebpackAndroid="29" - Type="Angular" jdk: oraclejdk8 before_install: nvm install 10 @@ -100,7 +100,7 @@ matrix: os: linux dist: trusty env: - - WebpackAndroid="28" + - WebpackAndroid="29" - Type="VueJS" jdk: oraclejdk8 before_install: nvm install 10 @@ -110,7 +110,7 @@ matrix: - "curl -u $SAUCE_USER:$SAUCE_KEY -X POST -H 'Content-Type: application/octet-stream' $ANDROID_SAUCE_STORAGE/$ANDROID_PACKAGE_VUE?overwrite=true --data-binary @$ANDROID_PACKAGE_FOLDER_VUE/app-debug.apk" - stage: "UI Tests" env: - - Android="28" + - Android="29" - Type="VanillaJS" language: node_js os: linux @@ -121,7 +121,7 @@ matrix: - travis_wait travis_retry npm run e2e -- --runType android28 --sauceLab --appPath $ANDROID_PACKAGE_JS - os: linux env: - - Android="28" + - Android="29" - Type="VueJS" language: node_js os: linux @@ -132,7 +132,7 @@ matrix: - travis_wait travis_retry npm run e2e -- --runType android28 --sauceLab --appPath $ANDROID_PACKAGE_VUE - os: linux env: - - Android="28" + - Android="29" - Type="Angular" language: node_js os: linux @@ -176,8 +176,8 @@ android: components: - tools - platform-tools - - build-tools-28.0.3 - - android-28 + - build-tools-29.0.2 + - android-29 - android-23 - extra-android-m2repository From 91ad2040559c63f8cd97ee6d4a7659ba4b180ed7 Mon Sep 17 00:00:00 2001 From: Stoyan Stratev Date: Wed, 18 Dec 2019 13:12:30 +0200 Subject: [PATCH 15/23] fix typo --- demo-vue/app/App_Resources/Android/src/main/AndroidManifest.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/demo-vue/app/App_Resources/Android/src/main/AndroidManifest.xml b/demo-vue/app/App_Resources/Android/src/main/AndroidManifest.xml index 1297c76..fe5ac77 100644 --- a/demo-vue/app/App_Resources/Android/src/main/AndroidManifest.xml +++ b/demo-vue/app/App_Resources/Android/src/main/AndroidManifest.xml @@ -19,7 +19,7 @@ Date: Wed, 18 Dec 2019 13:23:57 +0200 Subject: [PATCH 16/23] Update AndroidManifest.xml --- .../app/App_Resources/Android/src/main/AndroidManifest.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/demo-angular/app/App_Resources/Android/src/main/AndroidManifest.xml b/demo-angular/app/App_Resources/Android/src/main/AndroidManifest.xml index 976f83f..a7e745d 100644 --- a/demo-angular/app/App_Resources/Android/src/main/AndroidManifest.xml +++ b/demo-angular/app/App_Resources/Android/src/main/AndroidManifest.xml @@ -20,7 +20,7 @@ Date: Wed, 18 Dec 2019 13:33:38 +0200 Subject: [PATCH 17/23] oops --- .../app/App_Resources/Android/src/main/AndroidManifest.xml | 2 +- demo-vue/app/App_Resources/Android/src/main/AndroidManifest.xml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/demo-angular/app/App_Resources/Android/src/main/AndroidManifest.xml b/demo-angular/app/App_Resources/Android/src/main/AndroidManifest.xml index a7e745d..976f83f 100644 --- a/demo-angular/app/App_Resources/Android/src/main/AndroidManifest.xml +++ b/demo-angular/app/App_Resources/Android/src/main/AndroidManifest.xml @@ -20,7 +20,7 @@ Date: Mon, 3 Aug 2020 01:16:33 +0200 Subject: [PATCH 18/23] chore: Change Podfile dependencies (#329) Using the same QBImagePickerController dependency as nativescript-camera-plus plugin does. --- src/platforms/ios/Podfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/platforms/ios/Podfile b/src/platforms/ios/Podfile index 4bf1aa1..66bb1d8 100644 --- a/src/platforms/ios/Podfile +++ b/src/platforms/ios/Podfile @@ -1 +1 @@ -pod 'QBImagePickerController', '~> 3.4.0' \ No newline at end of file +pod "QBImagePickerController", :git => 'https://github.com/flypapertech/QBImagePicker.git', :commit => '47aa21d32f8e6db0df79b089ad64e43d498b5951' From 408f5070a4857356dac10dce9f11d940b90c3049 Mon Sep 17 00:00:00 2001 From: Kirill Goncharov Date: Mon, 3 Aug 2020 02:17:16 +0300 Subject: [PATCH 19/23] fix(android): Fix picking from 'SDCARD' location (#326) --- src/imagepicker.android.ts | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/src/imagepicker.android.ts b/src/imagepicker.android.ts index 6f49096..245c415 100644 --- a/src/imagepicker.android.ts +++ b/src/imagepicker.android.ts @@ -22,9 +22,20 @@ class UriHelper { if ("primary" === type.toLowerCase()) { return android.os.Environment.getExternalStorageDirectory() + "/" + id; + } else { + if (android.os.Build.VERSION.SDK_INT > 23) { + (this.getContentResolver() as any).takePersistableUriPermission( + uri, + android.content.Intent.FLAG_GRANT_READ_URI_PERMISSION | android.content.Intent.FLAG_GRANT_WRITE_URI_PERMISSION, + ); + const externalMediaDirs = application.android.context.getExternalMediaDirs(); + if (externalMediaDirs.length > 1) { + let filePath = externalMediaDirs[1].getAbsolutePath(); + filePath = filePath.substring(0, filePath.indexOf("Android")) + id; + return filePath; + } + } } - - // TODO handle non-primary volumes } // DownloadsProvider else if (UriHelper.isDownloadsDocument(uri)) { From a587e6d5851bc255a49cf4d291ac4d45a5d2469d Mon Sep 17 00:00:00 2001 From: aurelientorres Date: Mon, 3 Aug 2020 01:18:15 +0200 Subject: [PATCH 20/23] chore: update README.md (#317) --- README.md | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/README.md b/README.md index e43d2a3..c754f93 100644 --- a/README.md +++ b/README.md @@ -109,6 +109,18 @@ context > **NOTE**: To request permissions for Android 6+ (API 23+) we use [nativescript-permissions](https://www.npmjs.com/package/nativescript-permissions). +> **NOTE**: To be sure to have permissions add the following lines in AndroidManifest.xml +``` + + + + + ... + + +``` + + > **NOTE**: Using the plugin on iOS requres photo library permission. Your app might be rejected from the Apple App Store if you do not provide a description about why you need this permission. The default message "Requires access to photo library." might not be enough for the App Store reviewers. You can customize it by editing the `app/App_Resources/iOS/Info.plist` file in your app and adding the following key: ```xml From bc9209dd7d773eb437ff812f07873c72c789d572 Mon Sep 17 00:00:00 2001 From: Nathan Walker Date: Mon, 7 Sep 2020 11:31:06 -0700 Subject: [PATCH 21/23] chore: readme --- README.md | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/README.md b/README.md index c754f93..d160e36 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,10 @@ +## NativeScript 7 + +* Use `@nativescript/imagepicker`: `~1.0.0` +* [Source managed here](https://github.com/NativeScript/plugins) + +## If using 6 and below, see the following: + # NativeScript Image Picker ![apple](https://cdn3.iconfinder.com/data/icons/picons-social/57/16-apple-32.png) ![android](https://cdn4.iconfinder.com/data/icons/logos-3/228/android-32.png) From c24b782d3ae454fd43b2dbc68bd69661fb137cd1 Mon Sep 17 00:00:00 2001 From: Nathan Walker Date: Mon, 5 Apr 2021 10:02:11 -0700 Subject: [PATCH 22/23] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index d160e36..e1a4292 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -## NativeScript 7 +## NativeScript 7 or higher * Use `@nativescript/imagepicker`: `~1.0.0` * [Source managed here](https://github.com/NativeScript/plugins) From 82a8c1b6fde08111c1d4f169e291a07773331c56 Mon Sep 17 00:00:00 2001 From: Nathan Walker Date: Mon, 12 Apr 2021 22:10:42 -0700 Subject: [PATCH 23/23] chore: disable travis --- .travis.yml | 202 ---------------------------------------------------- 1 file changed, 202 deletions(-) delete mode 100644 .travis.yml diff --git a/.travis.yml b/.travis.yml deleted file mode 100644 index 51535f8..0000000 --- a/.travis.yml +++ /dev/null @@ -1,202 +0,0 @@ -env: - global: - - ANDROID_PACKAGE_JS='imagepicker-debug-js.apk' - - ANDROID_PACKAGE_NG='imagepicker-debug-ng.apk' - - ANDROID_PACKAGE_VUE='imagepicker-debug-vue.apk' - - ANDROID_PACKAGE_FOLDER_JS=$TRAVIS_BUILD_DIR/demo/outputs - - ANDROID_PACKAGE_FOLDER_NG=$TRAVIS_BUILD_DIR/demo-angular/outputs - - ANDROID_PACKAGE_FOLDER_VUE=$TRAVIS_BUILD_DIR/demo-vue/outputs - - ANDROID_SAUCE_STORAGE="https://saucelabs.com/rest/v1/storage/$SAUCE_USER" - - IOS_PACKAGE_JS='imagepicker-demo-js.zip' - - IOS_PACKAGE_NG='imagepicker-demo-ng.zip' - - IOS_PACKAGE_VUE='imagepicker-demo-vue.zip' - - IOS_PACKAGE_FOLDER_JS=$TRAVIS_BUILD_DIR/demo/outputs - - IOS_PACKAGE_FOLDER_NG=$TRAVIS_BUILD_DIR/demo-angular/outputs - - IOS_PACKAGE_FOLDER_VUE=$TRAVIS_BUILD_DIR/demo-vue/outputs - - IOS_SAUCE_STORAGE="https://saucelabs.com/rest/v1/storage/$SAUCE_USER" - -git: - depth: 1 - -branches: - only: - - master - -matrix: - include: - - stage: "Lint" - language: node_js - os: linux - node_js: "10" - script: cd src && npm run ci.tslint && cd ../demo && npm run ci.tslint && cd ../demo-angular && npm run ci.tslint - - stage: "WebPack and Build" - os: osx - env: - - WebpackiOS="12.0" - - Type="VanillaJS" - osx_image: xcode10.2 - language: node_js - node_js: "10" - jdk: oraclejdk8 - before_script: pod repo update - script: - - cd src && npm run build - - cd ../demo && npm i && tns build ios --bundle --env.uglify --copy-to "./outputs/demo.app" - - cd $IOS_PACKAGE_FOLDER_JS && zip -r $IOS_PACKAGE_JS demo.app - - "curl -u $SAUCE_USER:$SAUCE_KEY -X POST -H 'Content-Type: application/octet-stream' $IOS_SAUCE_STORAGE/$IOS_PACKAGE_JS?overwrite=true --data-binary @$IOS_PACKAGE_FOLDER_JS/$IOS_PACKAGE_JS" - - os: osx - env: - - WebpackiOS="12.0" - - Type="Angular" - osx_image: xcode10.2 - language: node_js - node_js: "10" - jdk: oraclejdk8 - before_script: pod repo update - script: - - cd src && npm run build - - cd ../demo-angular && npm i && tns build ios --bundle --env.uglify --env.aot --copy-to "./outputs/demo-angular.app" - - cd $IOS_PACKAGE_FOLDER_NG && zip -r $IOS_PACKAGE_NG demo-angular.app - - "curl -u $SAUCE_USER:$SAUCE_KEY -X POST -H 'Content-Type: application/octet-stream' $IOS_SAUCE_STORAGE/$IOS_PACKAGE_NG?overwrite=true --data-binary @$IOS_PACKAGE_FOLDER_NG/$IOS_PACKAGE_NG" - - os: osx - env: - - WebpackiOS="12.0" - - Type="VueJS" - osx_image: xcode10.2 - language: node_js - node_js: "10" - jdk: oraclejdk8 - before_script: pod repo update - script: - - cd src && npm run build - - cd ../demo-vue && npm i && tns build ios --bundle --env.uglify --copy-to "./outputs/demovue.app" - - cd $IOS_PACKAGE_FOLDER_VUE && zip -r $IOS_PACKAGE_VUE demovue.app - - "curl -u $SAUCE_USER:$SAUCE_KEY -X POST -H 'Content-Type: application/octet-stream' $IOS_SAUCE_STORAGE/$IOS_PACKAGE_VUE?overwrite=true --data-binary @$IOS_PACKAGE_FOLDER_VUE/$IOS_PACKAGE_VUE" - - language: android - os: linux - dist: trusty - env: - - WebpackAndroid="29" - - Type="VanillaJS" - jdk: oraclejdk8 - before_install: nvm install 10 - script: - - cd src && npm run build - - cd ../demo && npm i && tns build android --bundle --env.uglify --env.snapshot --copy-to "./outputs/app-debug.apk" - - "curl -u $SAUCE_USER:$SAUCE_KEY -X POST -H 'Content-Type: application/octet-stream' $ANDROID_SAUCE_STORAGE/$ANDROID_PACKAGE_JS?overwrite=true --data-binary @$ANDROID_PACKAGE_FOLDER_JS/app-debug.apk" - - language: android - os: linux - dist: trusty - env: - - WebpackAndroid="29" - - Type="Angular" - jdk: oraclejdk8 - before_install: nvm install 10 - script: - - cd src && npm run build - - cd ../demo-angular && npm i && tns build android --bundle --env.uglify --env.snapshot --copy-to "./outputs/app-debug.apk" - - "curl -u $SAUCE_USER:$SAUCE_KEY -X POST -H 'Content-Type: application/octet-stream' $ANDROID_SAUCE_STORAGE/$ANDROID_PACKAGE_NG?overwrite=true --data-binary @$ANDROID_PACKAGE_FOLDER_NG/app-debug.apk" - - language: android - os: linux - dist: trusty - env: - - WebpackAndroid="29" - - Type="VueJS" - jdk: oraclejdk8 - before_install: nvm install 10 - script: - - cd src && npm run build - - cd ../demo-vue && npm i && tns build android --bundle --env.uglify --copy-to "./outputs/app-debug.apk" - - "curl -u $SAUCE_USER:$SAUCE_KEY -X POST -H 'Content-Type: application/octet-stream' $ANDROID_SAUCE_STORAGE/$ANDROID_PACKAGE_VUE?overwrite=true --data-binary @$ANDROID_PACKAGE_FOLDER_VUE/app-debug.apk" - - stage: "UI Tests" - env: - - Android="29" - - Type="VanillaJS" - language: node_js - os: linux - node_js: "10" - script: - - npm i -g appium - - cd tests && npm i - - travis_wait travis_retry npm run e2e -- --runType android28 --sauceLab --appPath $ANDROID_PACKAGE_JS - - os: linux - env: - - Android="29" - - Type="VueJS" - language: node_js - os: linux - node_js: "10" - script: - - npm i -g appium - - cd tests && npm i - - travis_wait travis_retry npm run e2e -- --runType android28 --sauceLab --appPath $ANDROID_PACKAGE_VUE - - os: linux - env: - - Android="29" - - Type="Angular" - language: node_js - os: linux - node_js: "10" - script: - - npm i -g appium - - cd tests && npm i - - travis_wait travis_retry npm run e2e -- --runType android28 --sauceLab --appPath $ANDROID_PACKAGE_NG - - os: linux - env: - - iOS="12.0" - - Type="VanillaJS" - language: node_js - node_js: "10" - script: - - npm i -g appium - - cd tests && npm i - - travis_wait travis_retry npm run e2e -- --runType sim12iPhoneX --sauceLab --appPath $IOS_PACKAGE_JS - - os: linux - env: - - iOS="12.0" - - Type="VueJS" - language: node_js - node_js: "10" - script: - - npm i -g appium - - cd tests && npm i - - travis_wait travis_retry npm run e2e -- --runType sim12iPhoneX --sauceLab --appPath $IOS_PACKAGE_VUE - - os: linux - env: - - iOS="12.0" - - Type="Angular" - language: node_js - node_js: "10" - script: - - npm i -g appium - - cd tests && npm i - - travis_wait travis_retry npm run e2e -- --runType sim12iPhoneX --sauceLab --appPath $IOS_PACKAGE_NG - -android: - components: - - tools - - platform-tools - - build-tools-29.0.2 - - android-29 - - android-23 - - extra-android-m2repository - -before_cache: - - rm -f $HOME/.gradle/caches/modules-2/modules-2.lock - -cache: - directories: - - .nvm - - $HOME/.gradle/caches/ - - $HOME/.gradle/wrapper/ - -before_install: - - sudo pip install --upgrade pip - - sudo pip install six - -install: - - echo no | npm install -g nativescript - - tns usage-reporting disable - - tns error-reporting disable - -