From cbd930173aecf4d7d4a8ef964692f93a548cdde2 Mon Sep 17 00:00:00 2001 From: Cuong Lam Date: Fri, 23 Oct 2020 22:32:07 +0700 Subject: [PATCH 1/6] Support AndroidX. --- android/build.gradle | 12 ++++++------ .../gradle/wrapper/gradle-wrapper.properties | 2 +- .../com/reactnative/photoview/ImageEvent.java | 2 +- .../com/reactnative/photoview/PhotoView.java | 3 +-- react-native-photo-view.podspec | 18 +++++++++--------- 5 files changed, 18 insertions(+), 19 deletions(-) diff --git a/android/build.gradle b/android/build.gradle index 9f8e449..865c4b3 100644 --- a/android/build.gradle +++ b/android/build.gradle @@ -6,19 +6,19 @@ buildscript { jcenter() } dependencies { - classpath 'com.android.tools.build:gradle:3.3.2' + classpath 'com.android.tools.build:gradle:4.0.1' } } apply plugin: 'com.android.library' android { - compileSdkVersion 28 - buildToolsVersion "28.0.3" + compileSdkVersion 29 + buildToolsVersion "29.0.3" defaultConfig { minSdkVersion 16 - targetSdkVersion 28 + targetSdkVersion 29 versionCode 1 } lintOptions { @@ -34,6 +34,6 @@ repositories { dependencies { implementation 'com.facebook.react:react-native:+' - implementation 'com.facebook.fresco:fresco:1.12.1' - implementation 'me.relex:photodraweeview:1.1.3' + implementation 'com.facebook.fresco:fresco:2.3.0' + implementation 'me.relex:photodraweeview:2.0.0' } diff --git a/android/gradle/wrapper/gradle-wrapper.properties b/android/gradle/wrapper/gradle-wrapper.properties index 122a0dc..24c00e4 100644 --- a/android/gradle/wrapper/gradle-wrapper.properties +++ b/android/gradle/wrapper/gradle-wrapper.properties @@ -3,4 +3,4 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-2.10-all.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-6.3-all.zip diff --git a/android/src/main/java/com/reactnative/photoview/ImageEvent.java b/android/src/main/java/com/reactnative/photoview/ImageEvent.java index 2446cb6..9d6471c 100644 --- a/android/src/main/java/com/reactnative/photoview/ImageEvent.java +++ b/android/src/main/java/com/reactnative/photoview/ImageEvent.java @@ -9,7 +9,7 @@ package com.reactnative.photoview; -import android.support.annotation.IntDef; +import androidx.annotation.IntDef; import com.facebook.react.bridge.WritableMap; import com.facebook.react.uimanager.events.Event; import com.facebook.react.uimanager.events.RCTEventEmitter; diff --git a/android/src/main/java/com/reactnative/photoview/PhotoView.java b/android/src/main/java/com/reactnative/photoview/PhotoView.java index dc13e3e..d36694a 100644 --- a/android/src/main/java/com/reactnative/photoview/PhotoView.java +++ b/android/src/main/java/com/reactnative/photoview/PhotoView.java @@ -4,7 +4,7 @@ import android.graphics.drawable.Animatable; import android.graphics.drawable.Drawable; import android.net.Uri; -import android.support.annotation.NonNull; +import androidx.annotation.NonNull; import android.util.Log; import android.view.View; import com.facebook.drawee.backends.pipeline.PipelineDraweeControllerBuilder; @@ -269,4 +269,3 @@ private int getMaxTextureSize() { return Math.max(maximumTextureSize, IMAGE_MAX_BITMAP_DIMENSION); } } - diff --git a/react-native-photo-view.podspec b/react-native-photo-view.podspec index b59c2da..ad0da37 100644 --- a/react-native-photo-view.podspec +++ b/react-native-photo-view.podspec @@ -1,17 +1,17 @@ -require "json" +require 'json' -package = JSON.parse(File.read(File.join(__dir__, "package.json"))) +package = JSON.parse(File.read(File.join(__dir__, 'package.json'))) Pod::Spec.new do |s| - s.name = "react-native-photo-view" - s.version = package["version"] + s.name = 'react-native-photo-view' + s.version = package['version'] s.summary = package['description'] s.author = package['author'] s.homepage = package['homepage'] s.license = package['license'] - s.ios.deployment_target = "7.0" - s.tvos.deployment_target = "9.0" - s.source = { :git => "https://github.com/alwx/react-native-photo-view.git", :tag => "v#{s.version}" } - s.source_files = "ios/*.{h,m}" - s.dependency "React-Core" + s.ios.deployment_target = '7.0' + s.tvos.deployment_target = '9.0' + s.source = { git: 'https://github.com/alwx/react-native-photo-view.git', tag: "v#{s.version}" } + s.source_files = 'ios/*.{h,m}' + s.dependency 'React-Core' end From 6303c737f9697e758056fbcd47cd0f9b6ae3666f Mon Sep 17 00:00:00 2001 From: Cuong Lam Date: Mon, 11 Oct 2021 21:31:38 +0700 Subject: [PATCH 2/6] Fix Android build on react-native 0.66 --- android/build.gradle | 17 ++++++++--------- example/android/build.gradle | 4 ++-- 2 files changed, 10 insertions(+), 11 deletions(-) diff --git a/android/build.gradle b/android/build.gradle index 865c4b3..4700036 100644 --- a/android/build.gradle +++ b/android/build.gradle @@ -2,23 +2,23 @@ buildscript { repositories { + mavenCentral() google() - jcenter() } dependencies { - classpath 'com.android.tools.build:gradle:4.0.1' + classpath 'com.android.tools.build:gradle:4.2.2' } } apply plugin: 'com.android.library' android { - compileSdkVersion 29 - buildToolsVersion "29.0.3" + compileSdkVersion 30 + buildToolsVersion "30.0.2" defaultConfig { - minSdkVersion 16 - targetSdkVersion 29 + minSdkVersion 21 + targetSdkVersion 30 versionCode 1 } lintOptions { @@ -29,11 +29,10 @@ android { repositories { mavenCentral() google() - jcenter() } dependencies { implementation 'com.facebook.react:react-native:+' - implementation 'com.facebook.fresco:fresco:2.3.0' - implementation 'me.relex:photodraweeview:2.0.0' + implementation 'com.facebook.fresco:fresco:2.5.0' + implementation 'me.relex:photodraweeview:2.1.0' } diff --git a/example/android/build.gradle b/example/android/build.gradle index eed9972..5894dd4 100644 --- a/example/android/build.gradle +++ b/example/android/build.gradle @@ -2,7 +2,7 @@ buildscript { repositories { - jcenter() + mavenCentral() } dependencies { classpath 'com.android.tools.build:gradle:2.2.3' @@ -14,8 +14,8 @@ buildscript { allprojects { repositories { + mavenCentral() mavenLocal() - jcenter() maven { // All of React Native (JS, Obj-C sources, Android binaries) is installed from npm url "$rootDir/../node_modules/react-native/android" From bcc36393bd59ec8837c40e70d81948e7ea38627f Mon Sep 17 00:00:00 2001 From: Cuong Lam Date: Fri, 22 Oct 2021 23:02:39 +0700 Subject: [PATCH 3/6] Support SDWebImage, Fix GIF animated. --- ios/RNPhotoView.m | 117 ++++++++++++++++---------------- react-native-photo-view.podspec | 6 +- 2 files changed, 64 insertions(+), 59 deletions(-) diff --git a/ios/RNPhotoView.m b/ios/RNPhotoView.m index 7ad1779..debf893 100644 --- a/ios/RNPhotoView.m +++ b/ios/RNPhotoView.m @@ -7,6 +7,8 @@ #import #import #import +#import +#import @interface RNPhotoView() @@ -90,12 +92,12 @@ - (void)imageView:(UIImageView *)imageView singleTapDetected:(UITouch *)touch { if (_onPhotoViewerTap) { _onPhotoViewerTap(@{ - @"point": @{ - @"x": @(touchX), - @"y": @(touchY), - }, - @"target": self.reactTag - }); + @"point": @{ + @"x": @(touchX), + @"y": @(touchY), + }, + @"target": self.reactTag + }); } } @@ -117,12 +119,12 @@ - (void)view:(UIView *)view singleTapDetected:(UITouch *)touch { if (_onPhotoViewerViewTap) { _onPhotoViewerViewTap(@{ - @"point": @{ - @"x": @(touchX), - @"y": @(touchY), - }, - @"target": self.reactTag, - }); + @"point": @{ + @"x": @(touchX), + @"y": @(touchY), + }, + @"target": self.reactTag, + }); } } @@ -248,9 +250,9 @@ - (void)layoutSubviews { _photoImageView.frame = frameToCenter; if (_onPhotoViewerScale) { _onPhotoViewerScale(@{ - @"scale": @(self.zoomScale), - @"target": self.reactTag - }); + @"scale": @(self.zoomScale), + @"target": self.reactTag + }); } } @@ -286,15 +288,16 @@ - (void)displayWithImage:(UIImage*)image { #pragma mark - Setter - (void)setSource:(NSDictionary *)source { + __weak RNPhotoView *weakSelf = self; dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.1 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{ - if ([_source isEqualToDictionary:source]) { + if ([weakSelf.source isEqualToDictionary:source]) { return; } NSString *uri = source[@"uri"]; if (!uri) { return; } - _source = source; + weakSelf.source = source; NSURL *imageURL = [NSURL URLWithString:uri]; if (![[uri substringToIndex:4] isEqualToString:@"http"]) { @@ -302,11 +305,11 @@ - (void)setSource:(NSDictionary *)source { UIImage *image = RCTImageFromLocalAssetURL(imageURL); if (image) { // if local image [self setImage:image]; - if (_onPhotoViewerLoad) { - _onPhotoViewerLoad(nil); + if (weakSelf.onPhotoViewerLoad) { + weakSelf.onPhotoViewerLoad(nil); } - if (_onPhotoViewerLoadEnd) { - _onPhotoViewerLoadEnd(nil); + if (weakSelf.onPhotoViewerLoadEnd) { + weakSelf.onPhotoViewerLoadEnd(nil); } return; } @@ -319,6 +322,10 @@ - (void)setSource:(NSDictionary *)source { NSURLRequest *request = [[NSURLRequest alloc] initWithURL:imageURL]; if (source[@"headers"]) { + // Set headers. + [source[@"headers"] enumerateKeysAndObjectsUsingBlock:^(NSString *key, NSString* header, BOOL *stop) { + [[SDWebImageDownloader sharedDownloader] setValue:header forHTTPHeaderField:key]; + }]; NSMutableURLRequest *mutableRequest = [request mutableCopy]; NSDictionary *headers = source[@"headers"]; @@ -328,47 +335,43 @@ - (void)setSource:(NSDictionary *)source { [mutableRequest addValue:[headers objectForKey:key] forHTTPHeaderField:key]; request = [mutableRequest copy]; } - - __weak RNPhotoView *weakSelf = self; - if (_onPhotoViewerLoadStart) { - _onPhotoViewerLoadStart(nil); + if (weakSelf.onPhotoViewerLoadStart) { + weakSelf.onPhotoViewerLoadStart(nil); } - // use default values from [imageLoader loadImageWithURLRequest:request callback:callback] method - [[_bridge moduleForClass:[RCTImageLoader class]] loadImageWithURLRequest:request - size:CGSizeZero - scale:1 - clipped:YES - resizeMode:RCTResizeModeStretch - progressBlock:^(int64_t progress, int64_t total) { - if (_onPhotoViewerProgress) { - _onPhotoViewerProgress(@{ - @"loaded": @((double)progress), - @"total": @((double)total), - }); - } - } - partialLoadBlock:nil - completionBlock:^(NSError *error, UIImage *image) { - if (image) { - dispatch_async(dispatch_get_main_queue(), ^{ - [weakSelf setImage:image]; - }); - if (_onPhotoViewerLoad) { - _onPhotoViewerLoad(nil); - } - } else { - if (_onPhotoViewerError) { - _onPhotoViewerError(nil); - } - } - if (_onPhotoViewerLoadEnd) { - _onPhotoViewerLoadEnd(nil); - } - }]; + SDWebImageOptions options = SDWebImageRetryFailed; + [weakSelf downloadImage:imageURL options:options]; }); } +- (void)downloadImage:(NSURL *) url options:(SDWebImageOptions) options { + __weak typeof(self) weakSelf = self; // Always use a weak reference to self in blocks + [[SDWebImageManager sharedManager] loadImageWithURL:url options:options progress:^(NSInteger receivedSize, NSInteger expectedSize, NSURL * _Nullable targetURL) { + if (weakSelf.onPhotoViewerProgress) { + weakSelf.onPhotoViewerProgress(@{ + @"loaded": @(receivedSize), + @"total": @(expectedSize) + }); + } + } completed:^(UIImage * _Nullable image, NSData * _Nullable data, NSError * _Nullable error, SDImageCacheType cacheType, BOOL finished, NSURL * _Nullable imageURL) { + if (error) { + if (weakSelf.onPhotoViewerError) { + weakSelf.onPhotoViewerError(nil); + } + } else if (image) { + dispatch_async(dispatch_get_main_queue(), ^{ + [weakSelf setImage:image]; + }); + if (weakSelf.onPhotoViewerLoad) { + weakSelf.onPhotoViewerLoad(nil); + } + } + if (weakSelf.onPhotoViewerLoadEnd) { + weakSelf.onPhotoViewerLoadEnd(nil); + } + }]; +} + - (void)setLoadingIndicatorSrc:(NSString *)loadingIndicatorSrc { if (!loadingIndicatorSrc) { return; diff --git a/react-native-photo-view.podspec b/react-native-photo-view.podspec index ad0da37..2f295cd 100644 --- a/react-native-photo-view.podspec +++ b/react-native-photo-view.podspec @@ -9,9 +9,11 @@ Pod::Spec.new do |s| s.author = package['author'] s.homepage = package['homepage'] s.license = package['license'] - s.ios.deployment_target = '7.0' - s.tvos.deployment_target = '9.0' + s.ios.deployment_target = '10.0' + s.tvos.deployment_target = '10.0' s.source = { git: 'https://github.com/alwx/react-native-photo-view.git', tag: "v#{s.version}" } s.source_files = 'ios/*.{h,m}' s.dependency 'React-Core' + s.dependency 'SDWebImage' + s.dependency 'SDWebImageWebPCoder' end From 0b79ce1a5589768228e3569e26ec0e710cac7a77 Mon Sep 17 00:00:00 2001 From: Cuong Lam Date: Fri, 22 Oct 2021 23:19:58 +0700 Subject: [PATCH 4/6] Update fresco 2.6.0 --- android/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/android/build.gradle b/android/build.gradle index 4700036..91c82ca 100644 --- a/android/build.gradle +++ b/android/build.gradle @@ -33,6 +33,6 @@ repositories { dependencies { implementation 'com.facebook.react:react-native:+' - implementation 'com.facebook.fresco:fresco:2.5.0' + implementation 'com.facebook.fresco:fresco:2.6.0' implementation 'me.relex:photodraweeview:2.1.0' } From 0fd4a9486ad7ac544f10351a35f83e2f260787cf Mon Sep 17 00:00:00 2001 From: Cuong Lam Date: Wed, 17 Aug 2022 15:11:46 +0700 Subject: [PATCH 5/6] Fix Invariant Violation: ViewPropTypes has been removed from React Native --- PhotoView.android.js | 2 +- PhotoView.ios.js | 2 +- package.json | 5 +++-- 3 files changed, 5 insertions(+), 4 deletions(-) diff --git a/PhotoView.android.js b/PhotoView.android.js index 4428051..0954736 100644 --- a/PhotoView.android.js +++ b/PhotoView.android.js @@ -1,7 +1,7 @@ import React, { Component } from 'react'; import PropTypes from 'prop-types'; import { requireNativeComponent, View } from 'react-native'; -import ViewPropTypes from 'react-native/Libraries/Components/View/ViewPropTypes'; +import { ViewPropTypes } from 'deprecated-react-native-prop-types' const resolveAssetSource = require('react-native/Libraries/Image/resolveAssetSource'); diff --git a/PhotoView.ios.js b/PhotoView.ios.js index 15214bd..7123ce3 100644 --- a/PhotoView.ios.js +++ b/PhotoView.ios.js @@ -1,7 +1,7 @@ import React, { Component } from 'react'; import PropTypes from 'prop-types'; import { requireNativeComponent, View } from 'react-native'; -import ViewPropTypes from 'react-native/Libraries/Components/View/ViewPropTypes'; +import { ViewPropTypes } from 'deprecated-react-native-prop-types' const resolveAssetSource = require('react-native/Libraries/Image/resolveAssetSource'); diff --git a/package.json b/package.json index 5b8ecb2..0acb512 100644 --- a/package.json +++ b/package.json @@ -27,7 +27,8 @@ "type": "git", "url": "git://github.com/alwx/react-native-photo-view.git" }, - "dependencies": { - "prop-types": "^15.5.10" + "peerDependencies": { + "deprecated-react-native-prop-types": "*", + "prop-types": "*" } } From 842ceb3a3d7217321b5f1b01880a4e78a756e4e0 Mon Sep 17 00:00:00 2001 From: Cuong Lam Date: Mon, 21 Nov 2022 14:56:57 +0700 Subject: [PATCH 6/6] Fix to show local image. --- ios/RNPhotoView.m | 5 +++++ react-native-photo-view.podspec | 1 + 2 files changed, 6 insertions(+) diff --git a/ios/RNPhotoView.m b/ios/RNPhotoView.m index debf893..7d746d0 100644 --- a/ios/RNPhotoView.m +++ b/ios/RNPhotoView.m @@ -9,6 +9,8 @@ #import #import #import +#import +#import @interface RNPhotoView() @@ -416,6 +418,9 @@ - (void)initView { _minZoomScale = 1.0; _maxZoomScale = 5.0; + [SDImageLoadersManager.sharedManager addLoader:SDImagePhotosLoader.sharedLoader]; + SDWebImageManager.defaultImageLoader = SDImageLoadersManager.sharedManager; + // Setup self.backgroundColor = [UIColor clearColor]; self.delegate = self; diff --git a/react-native-photo-view.podspec b/react-native-photo-view.podspec index 2f295cd..7ebef2f 100644 --- a/react-native-photo-view.podspec +++ b/react-native-photo-view.podspec @@ -16,4 +16,5 @@ Pod::Spec.new do |s| s.dependency 'React-Core' s.dependency 'SDWebImage' s.dependency 'SDWebImageWebPCoder' + s.dependency 'SDWebImagePhotosPlugin' end