@momo-kits/native-kits 0.0.1-beta.5 → 0.89.1-2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -0
- package/android/.gradle/8.0/checksums/checksums.lock +0 -0
- package/android/.gradle/8.0/dependencies-accessors/dependencies-accessors.lock +0 -0
- package/android/.gradle/8.0/dependencies-accessors/gc.properties +0 -0
- package/android/.gradle/8.0/fileChanges/last-build.bin +0 -0
- package/android/.gradle/8.0/fileHashes/fileHashes.lock +0 -0
- package/android/.gradle/8.0/gc.properties +0 -0
- package/android/.gradle/config.properties +2 -0
- package/android/.gradle/vcs-1/gc.properties +0 -0
- package/android/.idea/gradle.xml +12 -0
- package/android/.idea/migrations.xml +10 -0
- package/android/.idea/misc.xml +10 -0
- package/android/.idea/vcs.xml +6 -0
- package/android/.idea/workspace.xml +50 -0
- package/android/build.gradle +35 -69
- package/android/local.properties +8 -0
- package/android/proguard-rules.pro +21 -0
- package/android/src/main/AndroidManifest.xml +2 -2
- package/android/src/main/java/com/momoplatform/nativekits/foundations/Button.kt +16 -0
- package/android/src/main/java/com/momoplatform/nativekits/libs/Logo.kt +63 -0
- package/android/src/main/java/com/momoplatform/nativekits/libs/TrustBanner.kt +246 -0
- package/android/src/main/res/drawable/ic_launcher_background.xml +170 -0
- package/android/src/main/res/drawable-v24/ic_launcher_foreground.xml +30 -0
- package/android/src/main/res/mipmap-anydpi-v26/ic_launcher.xml +6 -0
- package/android/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml +6 -0
- package/android/src/main/res/mipmap-hdpi/ic_launcher.webp +0 -0
- package/android/src/main/res/mipmap-hdpi/ic_launcher_round.webp +0 -0
- package/android/src/main/res/mipmap-mdpi/ic_launcher.webp +0 -0
- package/android/src/main/res/mipmap-mdpi/ic_launcher_round.webp +0 -0
- package/android/src/main/res/mipmap-xhdpi/ic_launcher.webp +0 -0
- package/android/src/main/res/mipmap-xhdpi/ic_launcher_round.webp +0 -0
- package/android/src/main/res/mipmap-xxhdpi/ic_launcher.webp +0 -0
- package/android/src/main/res/mipmap-xxhdpi/ic_launcher_round.webp +0 -0
- package/android/src/main/res/mipmap-xxxhdpi/ic_launcher.webp +0 -0
- package/android/src/main/res/mipmap-xxxhdpi/ic_launcher_round.webp +0 -0
- package/android/src/main/res/values/colors.xml +10 -0
- package/android/src/main/res/values/strings.xml +3 -0
- package/android/src/main/res/values/themes.xml +3 -0
- package/android/src/main/res/values-night/themes.xml +3 -0
- package/android/src/main/res/xml/backup_rules.xml +13 -0
- package/android/src/main/res/xml/data_extraction_rules.xml +19 -0
- package/build.gradle.kts +18 -0
- package/compose/build.gradle.kts +82 -0
- package/compose/src/androidMain/AndroidManifest.xml +2 -0
- package/compose/src/androidMain/kotlin/vn/momo/kits/utils/Platform.kt +3 -0
- package/compose/src/androidMain/kotlin/vn/momo/kits/utils/SetMaskFilter.kt +8 -0
- package/compose/src/androidMain/kotlin/vn/momo/kits/utils/Utils.android.kt +14 -0
- package/compose/src/commonMain/kotlin/vn/momo/kits/application/Components.kt +194 -0
- package/compose/src/commonMain/kotlin/vn/momo/kits/application/NavigationContainer.kt +197 -0
- package/compose/src/commonMain/kotlin/vn/momo/kits/application/Screen.kt +133 -0
- package/compose/src/commonMain/kotlin/vn/momo/kits/components/Badge.kt +62 -0
- package/compose/src/commonMain/kotlin/vn/momo/kits/components/BadgeDot.kt +27 -0
- package/compose/src/commonMain/kotlin/vn/momo/kits/components/Button.kt +288 -0
- package/compose/src/commonMain/kotlin/vn/momo/kits/components/CheckBox.kt +80 -0
- package/compose/src/commonMain/kotlin/vn/momo/kits/components/Divider.kt +23 -0
- package/compose/src/commonMain/kotlin/vn/momo/kits/components/Icon.kt +42 -0
- package/compose/src/commonMain/kotlin/vn/momo/kits/components/IconButton.kt +126 -0
- package/compose/src/commonMain/kotlin/vn/momo/kits/components/Image.kt +51 -0
- package/compose/src/commonMain/kotlin/vn/momo/kits/components/Input.kt +299 -0
- package/compose/src/commonMain/kotlin/vn/momo/kits/components/InputMoney.kt +246 -0
- package/compose/src/commonMain/kotlin/vn/momo/kits/components/InputSearch.kt +223 -0
- package/compose/src/commonMain/kotlin/vn/momo/kits/components/InputTextArea.kt +244 -0
- package/compose/src/commonMain/kotlin/vn/momo/kits/components/PopupNotify.kt +281 -0
- package/compose/src/commonMain/kotlin/vn/momo/kits/components/PromotionPopup.kt +72 -0
- package/compose/src/commonMain/kotlin/vn/momo/kits/components/Radio.kt +65 -0
- package/compose/src/commonMain/kotlin/vn/momo/kits/components/Skeleton.kt +64 -0
- package/compose/src/commonMain/kotlin/vn/momo/kits/components/Switch.kt +63 -0
- package/compose/src/commonMain/kotlin/vn/momo/kits/components/Tag.kt +73 -0
- package/compose/src/commonMain/kotlin/vn/momo/kits/components/Text.kt +42 -0
- package/compose/src/commonMain/kotlin/vn/momo/kits/const/Colors.kt +150 -0
- package/compose/src/commonMain/kotlin/vn/momo/kits/const/Radius.kt +12 -0
- package/compose/src/commonMain/kotlin/vn/momo/kits/const/Spacing.kt +13 -0
- package/compose/src/commonMain/kotlin/vn/momo/kits/const/Theme.kt +173 -0
- package/compose/src/commonMain/kotlin/vn/momo/kits/const/Typography.kt +242 -0
- package/compose/src/commonMain/kotlin/vn/momo/kits/layout/Card.kt +2 -0
- package/compose/src/commonMain/kotlin/vn/momo/kits/layout/Item.kt +2 -0
- package/compose/src/commonMain/kotlin/vn/momo/kits/layout/Section.kt +2 -0
- package/compose/src/commonMain/kotlin/vn/momo/kits/modifier/Shadow.kt +50 -0
- package/compose/src/commonMain/kotlin/vn/momo/kits/utils/Icons.kt +1321 -0
- package/compose/src/commonMain/kotlin/vn/momo/kits/utils/Platform.kt +3 -0
- package/compose/src/commonMain/kotlin/vn/momo/kits/utils/SetMaskFilter.kt +5 -0
- package/compose/src/commonMain/kotlin/vn/momo/kits/utils/Utils.kt +97 -0
- package/compose/src/iosMain/kotlin/vn/momo/kits/utils/Platform.kt +3 -0
- package/compose/src/iosMain/kotlin/vn/momo/kits/utils/SetMaskFilter.kt +9 -0
- package/compose/src/iosMain/kotlin/vn/momo/kits/utils/Utils.ios.kt +18 -0
- package/gradle.properties +19 -0
- package/gradlew +240 -0
- package/gradlew.bat +91 -0
- package/ios/Button/Button.swift +9 -2
- package/ios/CalculatorKeyboard/CalculatorKeyboard.swift +126 -0
- package/ios/Colors+Radius+Spacing/Colors.swift +21 -19
- package/ios/Input/Input.swift +1 -0
- package/ios/OTPKeyboard/KeyboardButton.swift +12 -4
- package/ios/Popup/PopupDisplay.swift +72 -81
- package/ios/Popup/PopupInput.swift +96 -0
- package/ios/Popup/PopupPromotion.swift +52 -0
- package/ios/ScrollIndicator/ScrollIndicator.swift +79 -0
- package/ios/Template/Logo/Logo.swift +75 -0
- package/ios/Template/TrustBanner/TrustBanner.swift +189 -0
- package/ios/native-kits.podspec +1 -1
- package/local.properties +8 -0
- package/package.json +6 -6
- package/publish.sh +1 -10
- package/settings.gradle.kts +41 -0
- package/android/gradle.properties +0 -5
- package/android/src/main/java/com/momoplatform/nativekits/NativeKitsPackage.kt +0 -17
- package/android/src/main/java/com/momoplatform/nativekits/NativeKitsViewManager.kt +0 -20
- package/example/ios/Example/Assets.xcassets/AppIcon.appiconset/Contents.json +0 -63
- package/example/ios/Example/Assets.xcassets/Background.colorset/Contents.json +0 -38
- package/example/ios/Example/Assets.xcassets/Border.colorset/Contents.json +0 -38
- package/example/ios/Example/Assets.xcassets/Card.colorset/Contents.json +0 -38
- package/example/ios/Example/Assets.xcassets/Contents.json +0 -6
- package/example/ios/Example/Assets.xcassets/Error.colorset/Contents.json +0 -38
- package/example/ios/Example/Assets.xcassets/Primary.colorset/Contents.json +0 -38
- package/example/ios/Example/Assets.xcassets/PrimaryDark.colorset/Contents.json +0 -38
- package/example/ios/Example/Assets.xcassets/PrimaryLight.colorset/Contents.json +0 -38
- package/example/ios/Example/Assets.xcassets/Secondary.colorset/Contents.json +0 -38
- package/example/ios/Example/Assets.xcassets/Success.colorset/Contents.json +0 -38
- package/example/ios/Example/Assets.xcassets/Text.colorset/Contents.json +0 -38
- package/example/ios/Example/Assets.xcassets/TextSecondary.colorset/Contents.json +0 -38
- package/example/ios/Example/Assets.xcassets/Warning.colorset/Contents.json +0 -38
- package/example/ios/Example/ComponentDetail.swift +0 -35
- package/example/ios/Example/ComponentItem.swift +0 -24
- package/example/ios/Example/ComponentModel.swift +0 -38
- package/example/ios/Example/ContentView.swift +0 -39
- package/example/ios/Example/Example.entitlements +0 -10
- package/example/ios/Example/Foundation/ButtonDemo.swift +0 -80
- package/example/ios/Example/Foundation/ImageDemo.swift +0 -43
- package/example/ios/Example/Foundation/Popup/ActionSheets.swift +0 -136
- package/example/ios/Example/Foundation/Popup/Floats.swift +0 -127
- package/example/ios/Example/Foundation/Popup/Popups.swift +0 -51
- package/example/ios/Example/Foundation/PopupDemo.swift +0 -389
- package/example/ios/Example/Foundation/TextInputDemo.swift +0 -36
- package/example/ios/Example/Foundation/TypographyDemo.swift +0 -53
- package/example/ios/Example/Foundation.swift +0 -26
- package/example/ios/Example/Info.plist +0 -18
- package/example/ios/Example/Library/CheckboxDemo.swift +0 -19
- package/example/ios/Example/Library/SwipeableDemo.swift +0 -105
- package/example/ios/Example/Library/SwitchDemo.swift +0 -19
- package/example/ios/Example/Library.swift +0 -26
- package/example/ios/Example/Main.swift +0 -27
- package/example/ios/Example/Overview.swift +0 -20
- package/example/ios/Example/Preview Content/Preview Assets.xcassets/Contents.json +0 -6
- package/example/ios/Example/Resource/SFProText-Black.ttf +0 -0
- package/example/ios/Example/Resource/SFProText-Bold.ttf +0 -0
- package/example/ios/Example/Resource/SFProText-Heavy.ttf +0 -0
- package/example/ios/Example/Resource/SFProText-Light.ttf +0 -0
- package/example/ios/Example/Resource/SFProText-Medium.ttf +0 -0
- package/example/ios/Example/Resource/SFProText-Regular.ttf +0 -0
- package/example/ios/Example/Resource/SFProText-Semibold.ttf +0 -0
- package/example/ios/Example/Resource/SFProText-Thin.ttf +0 -0
- package/example/ios/Example/Resource/SFProText-Ultralight.ttf +0 -0
- package/example/ios/Example/Resource/foundation.json +0 -33
- package/example/ios/Example/Resource/library.json +0 -18
- package/example/ios/Example/Utils.swift +0 -30
- package/example/ios/Example/ViewModifier/DarkViewModifier.swift +0 -22
- package/example/ios/Example.xcodeproj/project.pbxproj +0 -581
- package/example/ios/Example.xcodeproj/project.xcworkspace/contents.xcworkspacedata +0 -7
- package/example/ios/Example.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist +0 -8
- package/example/ios/Example.xcodeproj/project.xcworkspace/xcuserdata/wem.xcuserdatad/UserInterfaceState.xcuserstate +0 -0
- package/example/ios/Example.xcodeproj/xcuserdata/wem.xcuserdatad/xcschemes/xcschememanagement.plist +0 -14
- package/example/ios/Example.xcworkspace/contents.xcworkspacedata +0 -10
- package/example/ios/Example.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist +0 -8
- package/example/ios/Example.xcworkspace/xcuserdata/wem.xcuserdatad/UserInterfaceState.xcuserstate +0 -0
- package/example/ios/Example.xcworkspace/xcuserdata/wem.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist +0 -6
- package/example/ios/Podfile +0 -7
- package/example/ios/Podfile.lock +0 -35
- package/example/ios/Pods/Local Podspecs/MoMoUIKits.podspec.json +0 -37
- package/example/ios/Pods/Manifest.lock +0 -35
- package/example/ios/Pods/Pods.xcodeproj/project.pbxproj +0 -2047
- package/example/ios/Pods/Pods.xcodeproj/xcuserdata/wem.xcuserdatad/xcschemes/MoMoUIKits.xcscheme +0 -58
- package/example/ios/Pods/Pods.xcodeproj/xcuserdata/wem.xcuserdatad/xcschemes/Pods-Example.xcscheme +0 -58
- package/example/ios/Pods/Pods.xcodeproj/xcuserdata/wem.xcuserdatad/xcschemes/SDWebImage.xcscheme +0 -58
- package/example/ios/Pods/Pods.xcodeproj/xcuserdata/wem.xcuserdatad/xcschemes/SDWebImageSwiftUI.xcscheme +0 -58
- package/example/ios/Pods/Pods.xcodeproj/xcuserdata/wem.xcuserdatad/xcschemes/SkeletonUI.xcscheme +0 -58
- package/example/ios/Pods/Pods.xcodeproj/xcuserdata/wem.xcuserdatad/xcschemes/xcschememanagement.plist +0 -46
- package/example/ios/Pods/SDWebImage/LICENSE +0 -20
- package/example/ios/Pods/SDWebImage/README.md +0 -352
- package/example/ios/Pods/SDWebImage/SDWebImage/Core/NSButton+WebCache.h +0 -340
- package/example/ios/Pods/SDWebImage/SDWebImage/Core/NSButton+WebCache.m +0 -172
- package/example/ios/Pods/SDWebImage/SDWebImage/Core/NSData+ImageContentType.h +0 -63
- package/example/ios/Pods/SDWebImage/SDWebImage/Core/NSData+ImageContentType.m +0 -165
- package/example/ios/Pods/SDWebImage/SDWebImage/Core/NSImage+Compatibility.h +0 -67
- package/example/ios/Pods/SDWebImage/SDWebImage/Core/NSImage+Compatibility.m +0 -120
- package/example/ios/Pods/SDWebImage/SDWebImage/Core/SDAnimatedImage.h +0 -114
- package/example/ios/Pods/SDWebImage/SDWebImage/Core/SDAnimatedImage.m +0 -392
- package/example/ios/Pods/SDWebImage/SDWebImage/Core/SDAnimatedImagePlayer.h +0 -112
- package/example/ios/Pods/SDWebImage/SDWebImage/Core/SDAnimatedImagePlayer.m +0 -420
- package/example/ios/Pods/SDWebImage/SDWebImage/Core/SDAnimatedImageRep.h +0 -23
- package/example/ios/Pods/SDWebImage/SDWebImage/Core/SDAnimatedImageRep.m +0 -133
- package/example/ios/Pods/SDWebImage/SDWebImage/Core/SDAnimatedImageView+WebCache.h +0 -168
- package/example/ios/Pods/SDWebImage/SDWebImage/Core/SDAnimatedImageView+WebCache.m +0 -79
- package/example/ios/Pods/SDWebImage/SDWebImage/Core/SDAnimatedImageView.h +0 -110
- package/example/ios/Pods/SDWebImage/SDWebImage/Core/SDAnimatedImageView.m +0 -540
- package/example/ios/Pods/SDWebImage/SDWebImage/Core/SDDiskCache.h +0 -145
- package/example/ios/Pods/SDWebImage/SDWebImage/Core/SDDiskCache.m +0 -326
- package/example/ios/Pods/SDWebImage/SDWebImage/Core/SDGraphicsImageRenderer.h +0 -73
- package/example/ios/Pods/SDWebImage/SDWebImage/Core/SDGraphicsImageRenderer.m +0 -256
- package/example/ios/Pods/SDWebImage/SDWebImage/Core/SDImageAPNGCoder.h +0 -19
- package/example/ios/Pods/SDWebImage/SDWebImage/Core/SDImageAPNGCoder.m +0 -58
- package/example/ios/Pods/SDWebImage/SDWebImage/Core/SDImageAWebPCoder.h +0 -23
- package/example/ios/Pods/SDWebImage/SDWebImage/Core/SDImageAWebPCoder.m +0 -98
- package/example/ios/Pods/SDWebImage/SDWebImage/Core/SDImageCache.h +0 -450
- package/example/ios/Pods/SDWebImage/SDWebImage/Core/SDImageCache.m +0 -1030
- package/example/ios/Pods/SDWebImage/SDWebImage/Core/SDImageCacheConfig.h +0 -153
- package/example/ios/Pods/SDWebImage/SDWebImage/Core/SDImageCacheConfig.m +0 -68
- package/example/ios/Pods/SDWebImage/SDWebImage/Core/SDImageCacheDefine.h +0 -156
- package/example/ios/Pods/SDWebImage/SDWebImage/Core/SDImageCacheDefine.m +0 -138
- package/example/ios/Pods/SDWebImage/SDWebImage/Core/SDImageCachesManager.h +0 -81
- package/example/ios/Pods/SDWebImage/SDWebImage/Core/SDImageCachesManager.m +0 -556
- package/example/ios/Pods/SDWebImage/SDWebImage/Core/SDImageCoder.h +0 -297
- package/example/ios/Pods/SDWebImage/SDWebImage/Core/SDImageCoder.m +0 -26
- package/example/ios/Pods/SDWebImage/SDWebImage/Core/SDImageCoderHelper.h +0 -153
- package/example/ios/Pods/SDWebImage/SDWebImage/Core/SDImageCoderHelper.m +0 -822
- package/example/ios/Pods/SDWebImage/SDWebImage/Core/SDImageCodersManager.h +0 -58
- package/example/ios/Pods/SDWebImage/SDWebImage/Core/SDImageCodersManager.m +0 -130
- package/example/ios/Pods/SDWebImage/SDWebImage/Core/SDImageFrame.h +0 -36
- package/example/ios/Pods/SDWebImage/SDWebImage/Core/SDImageFrame.m +0 -28
- package/example/ios/Pods/SDWebImage/SDWebImage/Core/SDImageGIFCoder.h +0 -22
- package/example/ios/Pods/SDWebImage/SDWebImage/Core/SDImageGIFCoder.m +0 -58
- package/example/ios/Pods/SDWebImage/SDWebImage/Core/SDImageGraphics.h +0 -28
- package/example/ios/Pods/SDWebImage/SDWebImage/Core/SDImageGraphics.m +0 -127
- package/example/ios/Pods/SDWebImage/SDWebImage/Core/SDImageHEICCoder.h +0 -25
- package/example/ios/Pods/SDWebImage/SDWebImage/Core/SDImageHEICCoder.m +0 -101
- package/example/ios/Pods/SDWebImage/SDWebImage/Core/SDImageIOAnimatedCoder.h +0 -58
- package/example/ios/Pods/SDWebImage/SDWebImage/Core/SDImageIOAnimatedCoder.m +0 -807
- package/example/ios/Pods/SDWebImage/SDWebImage/Core/SDImageIOCoder.h +0 -30
- package/example/ios/Pods/SDWebImage/SDWebImage/Core/SDImageIOCoder.m +0 -420
- package/example/ios/Pods/SDWebImage/SDWebImage/Core/SDImageLoader.h +0 -146
- package/example/ios/Pods/SDWebImage/SDWebImage/Core/SDImageLoader.m +0 -170
- package/example/ios/Pods/SDWebImage/SDWebImage/Core/SDImageLoadersManager.h +0 -40
- package/example/ios/Pods/SDWebImage/SDWebImage/Core/SDImageLoadersManager.m +0 -123
- package/example/ios/Pods/SDWebImage/SDWebImage/Core/SDImageTransformer.h +0 -241
- package/example/ios/Pods/SDWebImage/SDWebImage/Core/SDImageTransformer.m +0 -331
- package/example/ios/Pods/SDWebImage/SDWebImage/Core/SDMemoryCache.h +0 -78
- package/example/ios/Pods/SDWebImage/SDWebImage/Core/SDMemoryCache.m +0 -158
- package/example/ios/Pods/SDWebImage/SDWebImage/Core/SDWebImageCacheKeyFilter.h +0 -32
- package/example/ios/Pods/SDWebImage/SDWebImage/Core/SDWebImageCacheKeyFilter.m +0 -39
- package/example/ios/Pods/SDWebImage/SDWebImage/Core/SDWebImageCacheSerializer.h +0 -36
- package/example/ios/Pods/SDWebImage/SDWebImage/Core/SDWebImageCacheSerializer.m +0 -39
- package/example/ios/Pods/SDWebImage/SDWebImage/Core/SDWebImageCompat.h +0 -95
- package/example/ios/Pods/SDWebImage/SDWebImage/Core/SDWebImageCompat.m +0 -17
- package/example/ios/Pods/SDWebImage/SDWebImage/Core/SDWebImageDefine.h +0 -352
- package/example/ios/Pods/SDWebImage/SDWebImage/Core/SDWebImageDefine.m +0 -149
- package/example/ios/Pods/SDWebImage/SDWebImage/Core/SDWebImageDownloader.h +0 -314
- package/example/ios/Pods/SDWebImage/SDWebImage/Core/SDWebImageDownloader.m +0 -658
- package/example/ios/Pods/SDWebImage/SDWebImage/Core/SDWebImageDownloaderConfig.h +0 -113
- package/example/ios/Pods/SDWebImage/SDWebImage/Core/SDWebImageDownloaderConfig.m +0 -60
- package/example/ios/Pods/SDWebImage/SDWebImage/Core/SDWebImageDownloaderDecryptor.h +0 -49
- package/example/ios/Pods/SDWebImage/SDWebImage/Core/SDWebImageDownloaderDecryptor.m +0 -55
- package/example/ios/Pods/SDWebImage/SDWebImage/Core/SDWebImageDownloaderOperation.h +0 -191
- package/example/ios/Pods/SDWebImage/SDWebImage/Core/SDWebImageDownloaderOperation.m +0 -722
- package/example/ios/Pods/SDWebImage/SDWebImage/Core/SDWebImageDownloaderRequestModifier.h +0 -69
- package/example/ios/Pods/SDWebImage/SDWebImage/Core/SDWebImageDownloaderRequestModifier.m +0 -71
- package/example/ios/Pods/SDWebImage/SDWebImage/Core/SDWebImageDownloaderResponseModifier.h +0 -69
- package/example/ios/Pods/SDWebImage/SDWebImage/Core/SDWebImageDownloaderResponseModifier.m +0 -73
- package/example/ios/Pods/SDWebImage/SDWebImage/Core/SDWebImageError.h +0 -32
- package/example/ios/Pods/SDWebImage/SDWebImage/Core/SDWebImageError.m +0 -16
- package/example/ios/Pods/SDWebImage/SDWebImage/Core/SDWebImageIndicator.h +0 -115
- package/example/ios/Pods/SDWebImage/SDWebImage/Core/SDWebImageIndicator.m +0 -275
- package/example/ios/Pods/SDWebImage/SDWebImage/Core/SDWebImageManager.h +0 -290
- package/example/ios/Pods/SDWebImage/SDWebImage/Core/SDWebImageManager.m +0 -775
- package/example/ios/Pods/SDWebImage/SDWebImage/Core/SDWebImageOperation.h +0 -27
- package/example/ios/Pods/SDWebImage/SDWebImage/Core/SDWebImageOperation.m +0 -14
- package/example/ios/Pods/SDWebImage/SDWebImage/Core/SDWebImageOptionsProcessor.h +0 -72
- package/example/ios/Pods/SDWebImage/SDWebImage/Core/SDWebImageOptionsProcessor.m +0 -59
- package/example/ios/Pods/SDWebImage/SDWebImage/Core/SDWebImagePrefetcher.h +0 -143
- package/example/ios/Pods/SDWebImage/SDWebImage/Core/SDWebImagePrefetcher.m +0 -303
- package/example/ios/Pods/SDWebImage/SDWebImage/Core/SDWebImageTransition.h +0 -131
- package/example/ios/Pods/SDWebImage/SDWebImage/Core/SDWebImageTransition.m +0 -194
- package/example/ios/Pods/SDWebImage/SDWebImage/Core/UIButton+WebCache.h +0 -387
- package/example/ios/Pods/SDWebImage/SDWebImage/Core/UIButton+WebCache.m +0 -234
- package/example/ios/Pods/SDWebImage/SDWebImage/Core/UIImage+ExtendedCacheData.h +0 -24
- package/example/ios/Pods/SDWebImage/SDWebImage/Core/UIImage+ExtendedCacheData.m +0 -23
- package/example/ios/Pods/SDWebImage/SDWebImage/Core/UIImage+ForceDecode.h +0 -46
- package/example/ios/Pods/SDWebImage/SDWebImage/Core/UIImage+ForceDecode.m +0 -60
- package/example/ios/Pods/SDWebImage/SDWebImage/Core/UIImage+GIF.h +0 -26
- package/example/ios/Pods/SDWebImage/SDWebImage/Core/UIImage+GIF.m +0 -22
- package/example/ios/Pods/SDWebImage/SDWebImage/Core/UIImage+MemoryCacheCost.h +0 -27
- package/example/ios/Pods/SDWebImage/SDWebImage/Core/UIImage+MemoryCacheCost.m +0 -47
- package/example/ios/Pods/SDWebImage/SDWebImage/Core/UIImage+Metadata.h +0 -89
- package/example/ios/Pods/SDWebImage/SDWebImage/Core/UIImage+Metadata.m +0 -221
- package/example/ios/Pods/SDWebImage/SDWebImage/Core/UIImage+MultiFormat.h +0 -80
- package/example/ios/Pods/SDWebImage/SDWebImage/Core/UIImage+MultiFormat.m +0 -47
- package/example/ios/Pods/SDWebImage/SDWebImage/Core/UIImage+Transform.h +0 -146
- package/example/ios/Pods/SDWebImage/SDWebImage/Core/UIImage+Transform.m +0 -824
- package/example/ios/Pods/SDWebImage/SDWebImage/Core/UIImageView+HighlightedWebCache.h +0 -129
- package/example/ios/Pods/SDWebImage/SDWebImage/Core/UIImageView+HighlightedWebCache.m +0 -76
- package/example/ios/Pods/SDWebImage/SDWebImage/Core/UIImageView+WebCache.h +0 -194
- package/example/ios/Pods/SDWebImage/SDWebImage/Core/UIImageView+WebCache.m +0 -67
- package/example/ios/Pods/SDWebImage/SDWebImage/Core/UIView+WebCache.h +0 -110
- package/example/ios/Pods/SDWebImage/SDWebImage/Core/UIView+WebCache.m +0 -446
- package/example/ios/Pods/SDWebImage/SDWebImage/Core/UIView+WebCacheOperation.h +0 -48
- package/example/ios/Pods/SDWebImage/SDWebImage/Core/UIView+WebCacheOperation.m +0 -82
- package/example/ios/Pods/SDWebImage/SDWebImage/Private/NSBezierPath+SDRoundedCorners.h +0 -24
- package/example/ios/Pods/SDWebImage/SDWebImage/Private/NSBezierPath+SDRoundedCorners.m +0 -42
- package/example/ios/Pods/SDWebImage/SDWebImage/Private/SDAssociatedObject.h +0 -14
- package/example/ios/Pods/SDWebImage/SDWebImage/Private/SDAssociatedObject.m +0 -29
- package/example/ios/Pods/SDWebImage/SDWebImage/Private/SDAsyncBlockOperation.h +0 -21
- package/example/ios/Pods/SDWebImage/SDWebImage/Private/SDAsyncBlockOperation.m +0 -92
- package/example/ios/Pods/SDWebImage/SDWebImage/Private/SDDeviceHelper.h +0 -18
- package/example/ios/Pods/SDWebImage/SDWebImage/Private/SDDeviceHelper.m +0 -32
- package/example/ios/Pods/SDWebImage/SDWebImage/Private/SDDisplayLink.h +0 -29
- package/example/ios/Pods/SDWebImage/SDWebImage/Private/SDDisplayLink.m +0 -227
- package/example/ios/Pods/SDWebImage/SDWebImage/Private/SDFileAttributeHelper.h +0 -19
- package/example/ios/Pods/SDWebImage/SDWebImage/Private/SDFileAttributeHelper.m +0 -127
- package/example/ios/Pods/SDWebImage/SDWebImage/Private/SDImageAssetManager.h +0 -23
- package/example/ios/Pods/SDWebImage/SDWebImage/Private/SDImageAssetManager.m +0 -164
- package/example/ios/Pods/SDWebImage/SDWebImage/Private/SDImageCachesManagerOperation.h +0 -21
- package/example/ios/Pods/SDWebImage/SDWebImage/Private/SDImageCachesManagerOperation.m +0 -83
- package/example/ios/Pods/SDWebImage/SDWebImage/Private/SDImageIOAnimatedCoderInternal.h +0 -39
- package/example/ios/Pods/SDWebImage/SDWebImage/Private/SDInternalMacros.h +0 -122
- package/example/ios/Pods/SDWebImage/SDWebImage/Private/SDInternalMacros.m +0 -13
- package/example/ios/Pods/SDWebImage/SDWebImage/Private/SDWeakProxy.h +0 -20
- package/example/ios/Pods/SDWebImage/SDWebImage/Private/SDWeakProxy.m +0 -79
- package/example/ios/Pods/SDWebImage/SDWebImage/Private/SDWebImageTransitionInternal.h +0 -19
- package/example/ios/Pods/SDWebImage/SDWebImage/Private/SDmetamacros.h +0 -667
- package/example/ios/Pods/SDWebImage/SDWebImage/Private/UIColor+SDHexString.h +0 -18
- package/example/ios/Pods/SDWebImage/SDWebImage/Private/UIColor+SDHexString.m +0 -42
- package/example/ios/Pods/SDWebImage/WebImage/SDWebImage.h +0 -89
- package/example/ios/Pods/SDWebImageSwiftUI/LICENSE +0 -19
- package/example/ios/Pods/SDWebImageSwiftUI/README.md +0 -690
- package/example/ios/Pods/SDWebImageSwiftUI/SDWebImageSwiftUI/Classes/AnimatedImage.swift +0 -870
- package/example/ios/Pods/SDWebImageSwiftUI/SDWebImageSwiftUI/Classes/Backports/Backport.swift +0 -59
- package/example/ios/Pods/SDWebImageSwiftUI/SDWebImageSwiftUI/Classes/Backports/OnChange.swift +0 -52
- package/example/ios/Pods/SDWebImageSwiftUI/SDWebImageSwiftUI/Classes/Backports/Overlay.swift +0 -124
- package/example/ios/Pods/SDWebImageSwiftUI/SDWebImageSwiftUI/Classes/Backports/StateObject.swift +0 -151
- package/example/ios/Pods/SDWebImageSwiftUI/SDWebImageSwiftUI/Classes/Image.swift +0 -78
- package/example/ios/Pods/SDWebImageSwiftUI/SDWebImageSwiftUI/Classes/ImageManager.swift +0 -132
- package/example/ios/Pods/SDWebImageSwiftUI/SDWebImageSwiftUI/Classes/ImagePlayer.swift +0 -122
- package/example/ios/Pods/SDWebImageSwiftUI/SDWebImageSwiftUI/Classes/ImageViewWrapper.swift +0 -133
- package/example/ios/Pods/SDWebImageSwiftUI/SDWebImageSwiftUI/Classes/Indicator/ActivityIndicator.swift +0 -82
- package/example/ios/Pods/SDWebImageSwiftUI/SDWebImageSwiftUI/Classes/Indicator/Indicator.swift +0 -97
- package/example/ios/Pods/SDWebImageSwiftUI/SDWebImageSwiftUI/Classes/Indicator/ProgressIndicator.swift +0 -114
- package/example/ios/Pods/SDWebImageSwiftUI/SDWebImageSwiftUI/Classes/SDWebImageSwiftUI.swift +0 -64
- package/example/ios/Pods/SDWebImageSwiftUI/SDWebImageSwiftUI/Classes/SwiftUICompatibility.swift +0 -92
- package/example/ios/Pods/SDWebImageSwiftUI/SDWebImageSwiftUI/Classes/Transition/Transition.swift +0 -93
- package/example/ios/Pods/SDWebImageSwiftUI/SDWebImageSwiftUI/Classes/WebImage.swift +0 -509
- package/example/ios/Pods/SDWebImageSwiftUI/SDWebImageSwiftUI/Module/SDWebImageSwiftUI.h +0 -15
- package/example/ios/Pods/SkeletonUI/LICENSE +0 -21
- package/example/ios/Pods/SkeletonUI/README.md +0 -137
- package/example/ios/Pods/SkeletonUI/Sources/SkeletonUI/Angle/AngleInteractor.swift +0 -29
- package/example/ios/Pods/SkeletonUI/Sources/SkeletonUI/Angle/AnglePresenter.swift +0 -7
- package/example/ios/Pods/SkeletonUI/Sources/SkeletonUI/Animation/AnimationInteractor.swift +0 -56
- package/example/ios/Pods/SkeletonUI/Sources/SkeletonUI/Appearance/AppearanceInteractor.swift +0 -58
- package/example/ios/Pods/SkeletonUI/Sources/SkeletonUI/Appearance/AppearancePresenter.swift +0 -5
- package/example/ios/Pods/SkeletonUI/Sources/SkeletonUI/Extensions/ClosedRange+Normalize.swift +0 -16
- package/example/ios/Pods/SkeletonUI/Sources/SkeletonUI/Extensions/Image+OptionalType.swift +0 -102
- package/example/ios/Pods/SkeletonUI/Sources/SkeletonUI/Extensions/ModifiedContent+SkeletonModifier.swift +0 -26
- package/example/ios/Pods/SkeletonUI/Sources/SkeletonUI/Extensions/Optional+OptionalType.swift +0 -5
- package/example/ios/Pods/SkeletonUI/Sources/SkeletonUI/Extensions/SecureField+OptionalType.swift +0 -19
- package/example/ios/Pods/SkeletonUI/Sources/SkeletonUI/Extensions/Text+OptionalType.swift +0 -27
- package/example/ios/Pods/SkeletonUI/Sources/SkeletonUI/Extensions/TextField+OptionalType.swift +0 -35
- package/example/ios/Pods/SkeletonUI/Sources/SkeletonUI/Extensions/Toggle+OptionalType.swift +0 -29
- package/example/ios/Pods/SkeletonUI/Sources/SkeletonUI/Extensions/UnitPoint+Angle.swift +0 -8
- package/example/ios/Pods/SkeletonUI/Sources/SkeletonUI/Extensions/View+SkeletonModifier.swift +0 -8
- package/example/ios/Pods/SkeletonUI/Sources/SkeletonUI/Modifiers/SkeletonModifier.swift +0 -52
- package/example/ios/Pods/SkeletonUI/Sources/SkeletonUI/Multiline/MultilineInteractor.swift +0 -41
- package/example/ios/Pods/SkeletonUI/Sources/SkeletonUI/Multiline/MultilinePresenter.swift +0 -9
- package/example/ios/Pods/SkeletonUI/Sources/SkeletonUI/Opacity/OpacityInteractor.swift +0 -29
- package/example/ios/Pods/SkeletonUI/Sources/SkeletonUI/Opacity/OpacityPresenter.swift +0 -7
- package/example/ios/Pods/SkeletonUI/Sources/SkeletonUI/Position/PositionInteractor.swift +0 -29
- package/example/ios/Pods/SkeletonUI/Sources/SkeletonUI/Position/PositionPresenter.swift +0 -7
- package/example/ios/Pods/SkeletonUI/Sources/SkeletonUI/Protocols/OptionalType.swift +0 -4
- package/example/ios/Pods/SkeletonUI/Sources/SkeletonUI/Radius/RadiusInteractor.swift +0 -29
- package/example/ios/Pods/SkeletonUI/Sources/SkeletonUI/Radius/RadiusPresenter.swift +0 -7
- package/example/ios/Pods/SkeletonUI/Sources/SkeletonUI/Shape/ShapeInteractor.swift +0 -33
- package/example/ios/Pods/SkeletonUI/Sources/SkeletonUI/Shape/ShapePresenter.swift +0 -5
- package/example/ios/Pods/SkeletonUI/Sources/SkeletonUI/Skeleton/SkeletonForEach.swift +0 -20
- package/example/ios/Pods/SkeletonUI/Sources/SkeletonUI/Skeleton/SkeletonInteractor.swift +0 -27
- package/example/ios/Pods/SkeletonUI/Sources/SkeletonUI/Skeleton/SkeletonList.swift +0 -20
- package/example/ios/Pods/SkeletonUI/Sources/SkeletonUI/Skeleton/SkeletonPresenter.swift +0 -15
- package/example/ios/Pods/SkeletonUI/Sources/SkeletonUI/Skeleton/SkeletonShape.swift +0 -64
- package/example/ios/Pods/SkeletonUI/Sources/SkeletonUI/Skeleton/SkeletonView.swift +0 -25
- package/example/ios/Pods/Target Support Files/MoMoUIKits/MoMoUIKits-dummy.m +0 -5
- package/example/ios/Pods/Target Support Files/MoMoUIKits/MoMoUIKits-prefix.pch +0 -12
- package/example/ios/Pods/Target Support Files/MoMoUIKits/MoMoUIKits-umbrella.h +0 -16
- package/example/ios/Pods/Target Support Files/MoMoUIKits/MoMoUIKits.debug.xcconfig +0 -15
- package/example/ios/Pods/Target Support Files/MoMoUIKits/MoMoUIKits.modulemap +0 -6
- package/example/ios/Pods/Target Support Files/MoMoUIKits/MoMoUIKits.release.xcconfig +0 -15
- package/example/ios/Pods/Target Support Files/Pods-Example/Pods-Example-acknowledgements.markdown +0 -75
- package/example/ios/Pods/Target Support Files/Pods-Example/Pods-Example-acknowledgements.plist +0 -119
- package/example/ios/Pods/Target Support Files/Pods-Example/Pods-Example-dummy.m +0 -5
- package/example/ios/Pods/Target Support Files/Pods-Example/Pods-Example-umbrella.h +0 -16
- package/example/ios/Pods/Target Support Files/Pods-Example/Pods-Example.debug.xcconfig +0 -15
- package/example/ios/Pods/Target Support Files/Pods-Example/Pods-Example.modulemap +0 -6
- package/example/ios/Pods/Target Support Files/Pods-Example/Pods-Example.release.xcconfig +0 -15
- package/example/ios/Pods/Target Support Files/SDWebImage/SDWebImage-dummy.m +0 -5
- package/example/ios/Pods/Target Support Files/SDWebImage/SDWebImage-prefix.pch +0 -12
- package/example/ios/Pods/Target Support Files/SDWebImage/SDWebImage-umbrella.h +0 -75
- package/example/ios/Pods/Target Support Files/SDWebImage/SDWebImage.debug.xcconfig +0 -14
- package/example/ios/Pods/Target Support Files/SDWebImage/SDWebImage.modulemap +0 -6
- package/example/ios/Pods/Target Support Files/SDWebImage/SDWebImage.release.xcconfig +0 -14
- package/example/ios/Pods/Target Support Files/SDWebImageSwiftUI/SDWebImageSwiftUI-dummy.m +0 -5
- package/example/ios/Pods/Target Support Files/SDWebImageSwiftUI/SDWebImageSwiftUI-prefix.pch +0 -12
- package/example/ios/Pods/Target Support Files/SDWebImageSwiftUI/SDWebImageSwiftUI-umbrella.h +0 -17
- package/example/ios/Pods/Target Support Files/SDWebImageSwiftUI/SDWebImageSwiftUI.debug.xcconfig +0 -17
- package/example/ios/Pods/Target Support Files/SDWebImageSwiftUI/SDWebImageSwiftUI.modulemap +0 -6
- package/example/ios/Pods/Target Support Files/SDWebImageSwiftUI/SDWebImageSwiftUI.release.xcconfig +0 -17
- package/example/ios/Pods/Target Support Files/SkeletonUI/SkeletonUI-dummy.m +0 -5
- package/example/ios/Pods/Target Support Files/SkeletonUI/SkeletonUI-prefix.pch +0 -12
- package/example/ios/Pods/Target Support Files/SkeletonUI/SkeletonUI-umbrella.h +0 -16
- package/example/ios/Pods/Target Support Files/SkeletonUI/SkeletonUI.debug.xcconfig +0 -12
- package/example/ios/Pods/Target Support Files/SkeletonUI/SkeletonUI.modulemap +0 -6
- package/example/ios/Pods/Target Support Files/SkeletonUI/SkeletonUI.release.xcconfig +0 -12
- package/ios/Extensions/View++.swift +0 -9
|
@@ -1,722 +0,0 @@
|
|
|
1
|
-
/*
|
|
2
|
-
* This file is part of the SDWebImage package.
|
|
3
|
-
* (c) Olivier Poitrey <rs@dailymotion.com>
|
|
4
|
-
*
|
|
5
|
-
* For the full copyright and license information, please view the LICENSE
|
|
6
|
-
* file that was distributed with this source code.
|
|
7
|
-
*/
|
|
8
|
-
|
|
9
|
-
#import "SDWebImageDownloaderOperation.h"
|
|
10
|
-
#import "SDWebImageError.h"
|
|
11
|
-
#import "SDInternalMacros.h"
|
|
12
|
-
#import "SDWebImageDownloaderResponseModifier.h"
|
|
13
|
-
#import "SDWebImageDownloaderDecryptor.h"
|
|
14
|
-
#import "SDImageCacheDefine.h"
|
|
15
|
-
|
|
16
|
-
// A handler to represent individual request
|
|
17
|
-
@interface SDWebImageDownloaderOperationToken : NSObject
|
|
18
|
-
|
|
19
|
-
@property (nonatomic, copy, nullable) SDWebImageDownloaderCompletedBlock completedBlock;
|
|
20
|
-
@property (nonatomic, copy, nullable) SDWebImageDownloaderProgressBlock progressBlock;
|
|
21
|
-
@property (nonatomic, copy, nullable) SDImageCoderOptions *decodeOptions;
|
|
22
|
-
|
|
23
|
-
@end
|
|
24
|
-
|
|
25
|
-
@implementation SDWebImageDownloaderOperationToken
|
|
26
|
-
|
|
27
|
-
- (BOOL)isEqual:(id)other {
|
|
28
|
-
if (nil == other) {
|
|
29
|
-
return NO;
|
|
30
|
-
}
|
|
31
|
-
if (self == other) {
|
|
32
|
-
return YES;
|
|
33
|
-
}
|
|
34
|
-
if (![other isKindOfClass:[self class]]) {
|
|
35
|
-
return NO;
|
|
36
|
-
}
|
|
37
|
-
SDWebImageDownloaderOperationToken *object = (SDWebImageDownloaderOperationToken *)other;
|
|
38
|
-
// warn: only compare decodeOptions, ignore pointer, use `removeObjectIdenticalTo`
|
|
39
|
-
BOOL result = [self.decodeOptions isEqualToDictionary:object.decodeOptions];
|
|
40
|
-
return result;
|
|
41
|
-
}
|
|
42
|
-
|
|
43
|
-
@end
|
|
44
|
-
|
|
45
|
-
@interface SDWebImageDownloaderOperation ()
|
|
46
|
-
|
|
47
|
-
@property (strong, nonatomic, nonnull) NSMutableArray<SDWebImageDownloaderOperationToken *> *callbackTokens;
|
|
48
|
-
|
|
49
|
-
@property (assign, nonatomic, readwrite) SDWebImageDownloaderOptions options;
|
|
50
|
-
@property (copy, nonatomic, readwrite, nullable) SDWebImageContext *context;
|
|
51
|
-
|
|
52
|
-
@property (assign, nonatomic, getter = isExecuting) BOOL executing;
|
|
53
|
-
@property (assign, nonatomic, getter = isFinished) BOOL finished;
|
|
54
|
-
@property (strong, nonatomic, nullable) NSMutableData *imageData;
|
|
55
|
-
@property (copy, nonatomic, nullable) NSData *cachedData; // for `SDWebImageDownloaderIgnoreCachedResponse`
|
|
56
|
-
@property (assign, nonatomic) NSUInteger expectedSize; // may be 0
|
|
57
|
-
@property (assign, nonatomic) NSUInteger receivedSize;
|
|
58
|
-
@property (strong, nonatomic, nullable, readwrite) NSURLResponse *response;
|
|
59
|
-
@property (strong, nonatomic, nullable) NSError *responseError;
|
|
60
|
-
@property (assign, nonatomic) double previousProgress; // previous progress percent
|
|
61
|
-
|
|
62
|
-
@property (strong, nonatomic, nullable) id<SDWebImageDownloaderResponseModifier> responseModifier; // modify original URLResponse
|
|
63
|
-
@property (strong, nonatomic, nullable) id<SDWebImageDownloaderDecryptor> decryptor; // decrypt image data
|
|
64
|
-
|
|
65
|
-
// This is weak because it is injected by whoever manages this session. If this gets nil-ed out, we won't be able to run
|
|
66
|
-
// the task associated with this operation
|
|
67
|
-
@property (weak, nonatomic, nullable) NSURLSession *unownedSession;
|
|
68
|
-
// This is set if we're using not using an injected NSURLSession. We're responsible of invalidating this one
|
|
69
|
-
@property (strong, nonatomic, nullable) NSURLSession *ownedSession;
|
|
70
|
-
|
|
71
|
-
@property (strong, nonatomic, readwrite, nullable) NSURLSessionTask *dataTask;
|
|
72
|
-
|
|
73
|
-
@property (strong, nonatomic, readwrite, nullable) NSURLSessionTaskMetrics *metrics API_AVAILABLE(macosx(10.12), ios(10.0), watchos(3.0), tvos(10.0));
|
|
74
|
-
|
|
75
|
-
@property (strong, nonatomic, nonnull) NSOperationQueue *coderQueue; // the serial operation queue to do image decoding
|
|
76
|
-
|
|
77
|
-
@property (strong, nonatomic, nonnull) NSMapTable<SDImageCoderOptions *, UIImage *> *imageMap; // each variant of image is weak-referenced to avoid too many re-decode during downloading
|
|
78
|
-
#if SD_UIKIT
|
|
79
|
-
@property (assign, nonatomic) UIBackgroundTaskIdentifier backgroundTaskId;
|
|
80
|
-
#endif
|
|
81
|
-
|
|
82
|
-
@end
|
|
83
|
-
|
|
84
|
-
@implementation SDWebImageDownloaderOperation
|
|
85
|
-
|
|
86
|
-
@synthesize executing = _executing;
|
|
87
|
-
@synthesize finished = _finished;
|
|
88
|
-
|
|
89
|
-
- (nonnull instancetype)init {
|
|
90
|
-
return [self initWithRequest:nil inSession:nil options:0];
|
|
91
|
-
}
|
|
92
|
-
|
|
93
|
-
- (instancetype)initWithRequest:(NSURLRequest *)request inSession:(NSURLSession *)session options:(SDWebImageDownloaderOptions)options {
|
|
94
|
-
return [self initWithRequest:request inSession:session options:options context:nil];
|
|
95
|
-
}
|
|
96
|
-
|
|
97
|
-
- (nonnull instancetype)initWithRequest:(nullable NSURLRequest *)request
|
|
98
|
-
inSession:(nullable NSURLSession *)session
|
|
99
|
-
options:(SDWebImageDownloaderOptions)options
|
|
100
|
-
context:(nullable SDWebImageContext *)context {
|
|
101
|
-
if ((self = [super init])) {
|
|
102
|
-
_request = [request copy];
|
|
103
|
-
_options = options;
|
|
104
|
-
_context = [context copy];
|
|
105
|
-
_callbackTokens = [NSMutableArray new];
|
|
106
|
-
_responseModifier = context[SDWebImageContextDownloadResponseModifier];
|
|
107
|
-
_decryptor = context[SDWebImageContextDownloadDecryptor];
|
|
108
|
-
_executing = NO;
|
|
109
|
-
_finished = NO;
|
|
110
|
-
_expectedSize = 0;
|
|
111
|
-
_unownedSession = session;
|
|
112
|
-
_coderQueue = [NSOperationQueue new];
|
|
113
|
-
_coderQueue.maxConcurrentOperationCount = 1;
|
|
114
|
-
_imageMap = [[NSMapTable alloc] initWithKeyOptions:NSPointerFunctionsStrongMemory valueOptions:NSPointerFunctionsWeakMemory capacity:1];
|
|
115
|
-
#if SD_UIKIT
|
|
116
|
-
_backgroundTaskId = UIBackgroundTaskInvalid;
|
|
117
|
-
#endif
|
|
118
|
-
}
|
|
119
|
-
return self;
|
|
120
|
-
}
|
|
121
|
-
|
|
122
|
-
- (nullable id)addHandlersForProgress:(nullable SDWebImageDownloaderProgressBlock)progressBlock
|
|
123
|
-
completed:(nullable SDWebImageDownloaderCompletedBlock)completedBlock {
|
|
124
|
-
return [self addHandlersForProgress:progressBlock completed:completedBlock decodeOptions:nil];
|
|
125
|
-
}
|
|
126
|
-
|
|
127
|
-
- (nullable id)addHandlersForProgress:(nullable SDWebImageDownloaderProgressBlock)progressBlock
|
|
128
|
-
completed:(nullable SDWebImageDownloaderCompletedBlock)completedBlock
|
|
129
|
-
decodeOptions:(nullable SDImageCoderOptions *)decodeOptions {
|
|
130
|
-
if (!completedBlock && !progressBlock && !decodeOptions) return nil;
|
|
131
|
-
SDWebImageDownloaderOperationToken *token = [SDWebImageDownloaderOperationToken new];
|
|
132
|
-
token.completedBlock = completedBlock;
|
|
133
|
-
token.progressBlock = progressBlock;
|
|
134
|
-
token.decodeOptions = decodeOptions;
|
|
135
|
-
@synchronized (self) {
|
|
136
|
-
[self.callbackTokens addObject:token];
|
|
137
|
-
}
|
|
138
|
-
|
|
139
|
-
return token;
|
|
140
|
-
}
|
|
141
|
-
|
|
142
|
-
- (BOOL)cancel:(nullable id)token {
|
|
143
|
-
if (![token isKindOfClass:SDWebImageDownloaderOperationToken.class]) return NO;
|
|
144
|
-
|
|
145
|
-
BOOL shouldCancel = NO;
|
|
146
|
-
@synchronized (self) {
|
|
147
|
-
NSArray *tokens = self.callbackTokens;
|
|
148
|
-
if (tokens.count == 1 && [tokens indexOfObjectIdenticalTo:token] != NSNotFound) {
|
|
149
|
-
shouldCancel = YES;
|
|
150
|
-
}
|
|
151
|
-
}
|
|
152
|
-
if (shouldCancel) {
|
|
153
|
-
// Cancel operation running and callback last token's completion block
|
|
154
|
-
[self cancel];
|
|
155
|
-
} else {
|
|
156
|
-
// Only callback this token's completion block
|
|
157
|
-
@synchronized (self) {
|
|
158
|
-
[self.callbackTokens removeObjectIdenticalTo:token];
|
|
159
|
-
}
|
|
160
|
-
SDWebImageDownloaderCompletedBlock completedBlock = ((SDWebImageDownloaderOperationToken *)token).completedBlock;
|
|
161
|
-
if (completedBlock) {
|
|
162
|
-
dispatch_main_async_safe(^{
|
|
163
|
-
completedBlock(nil, nil, [NSError errorWithDomain:SDWebImageErrorDomain code:SDWebImageErrorCancelled userInfo:@{NSLocalizedDescriptionKey : @"Operation cancelled by user during sending the request"}], YES);
|
|
164
|
-
});
|
|
165
|
-
}
|
|
166
|
-
}
|
|
167
|
-
return shouldCancel;
|
|
168
|
-
}
|
|
169
|
-
|
|
170
|
-
- (void)start {
|
|
171
|
-
@synchronized (self) {
|
|
172
|
-
if (self.isCancelled) {
|
|
173
|
-
if (!self.isFinished) self.finished = YES;
|
|
174
|
-
// Operation cancelled by user before sending the request
|
|
175
|
-
[self callCompletionBlocksWithError:[NSError errorWithDomain:SDWebImageErrorDomain code:SDWebImageErrorCancelled userInfo:@{NSLocalizedDescriptionKey : @"Operation cancelled by user before sending the request"}]];
|
|
176
|
-
[self reset];
|
|
177
|
-
return;
|
|
178
|
-
}
|
|
179
|
-
|
|
180
|
-
#if SD_UIKIT
|
|
181
|
-
Class UIApplicationClass = NSClassFromString(@"UIApplication");
|
|
182
|
-
BOOL hasApplication = UIApplicationClass && [UIApplicationClass respondsToSelector:@selector(sharedApplication)];
|
|
183
|
-
if (hasApplication && [self shouldContinueWhenAppEntersBackground]) {
|
|
184
|
-
__weak typeof(self) wself = self;
|
|
185
|
-
UIApplication * app = [UIApplicationClass performSelector:@selector(sharedApplication)];
|
|
186
|
-
self.backgroundTaskId = [app beginBackgroundTaskWithExpirationHandler:^{
|
|
187
|
-
[wself cancel];
|
|
188
|
-
}];
|
|
189
|
-
}
|
|
190
|
-
#endif
|
|
191
|
-
NSURLSession *session = self.unownedSession;
|
|
192
|
-
if (!session) {
|
|
193
|
-
NSURLSessionConfiguration *sessionConfig = [NSURLSessionConfiguration defaultSessionConfiguration];
|
|
194
|
-
sessionConfig.timeoutIntervalForRequest = 15;
|
|
195
|
-
|
|
196
|
-
/**
|
|
197
|
-
* Create the session for this task
|
|
198
|
-
* We send nil as delegate queue so that the session creates a serial operation queue for performing all delegate
|
|
199
|
-
* method calls and completion handler calls.
|
|
200
|
-
*/
|
|
201
|
-
session = [NSURLSession sessionWithConfiguration:sessionConfig
|
|
202
|
-
delegate:self
|
|
203
|
-
delegateQueue:nil];
|
|
204
|
-
self.ownedSession = session;
|
|
205
|
-
}
|
|
206
|
-
|
|
207
|
-
if (self.options & SDWebImageDownloaderIgnoreCachedResponse) {
|
|
208
|
-
// Grab the cached data for later check
|
|
209
|
-
NSURLCache *URLCache = session.configuration.URLCache;
|
|
210
|
-
if (!URLCache) {
|
|
211
|
-
URLCache = [NSURLCache sharedURLCache];
|
|
212
|
-
}
|
|
213
|
-
NSCachedURLResponse *cachedResponse;
|
|
214
|
-
// NSURLCache's `cachedResponseForRequest:` is not thread-safe, see https://developer.apple.com/documentation/foundation/nsurlcache#2317483
|
|
215
|
-
@synchronized (URLCache) {
|
|
216
|
-
cachedResponse = [URLCache cachedResponseForRequest:self.request];
|
|
217
|
-
}
|
|
218
|
-
if (cachedResponse) {
|
|
219
|
-
self.cachedData = cachedResponse.data;
|
|
220
|
-
self.response = cachedResponse.response;
|
|
221
|
-
}
|
|
222
|
-
}
|
|
223
|
-
|
|
224
|
-
if (!session.delegate) {
|
|
225
|
-
// Session been invalid and has no delegate at all
|
|
226
|
-
[self callCompletionBlocksWithError:[NSError errorWithDomain:SDWebImageErrorDomain code:SDWebImageErrorInvalidDownloadOperation userInfo:@{NSLocalizedDescriptionKey : @"Session delegate is nil and invalid"}]];
|
|
227
|
-
[self reset];
|
|
228
|
-
return;
|
|
229
|
-
}
|
|
230
|
-
|
|
231
|
-
self.dataTask = [session dataTaskWithRequest:self.request];
|
|
232
|
-
self.executing = YES;
|
|
233
|
-
}
|
|
234
|
-
|
|
235
|
-
if (self.dataTask) {
|
|
236
|
-
if (self.options & SDWebImageDownloaderHighPriority) {
|
|
237
|
-
self.dataTask.priority = NSURLSessionTaskPriorityHigh;
|
|
238
|
-
self.coderQueue.qualityOfService = NSQualityOfServiceUserInteractive;
|
|
239
|
-
} else if (self.options & SDWebImageDownloaderLowPriority) {
|
|
240
|
-
self.dataTask.priority = NSURLSessionTaskPriorityLow;
|
|
241
|
-
self.coderQueue.qualityOfService = NSQualityOfServiceBackground;
|
|
242
|
-
} else {
|
|
243
|
-
self.dataTask.priority = NSURLSessionTaskPriorityDefault;
|
|
244
|
-
self.coderQueue.qualityOfService = NSQualityOfServiceDefault;
|
|
245
|
-
}
|
|
246
|
-
[self.dataTask resume];
|
|
247
|
-
NSArray<SDWebImageDownloaderOperationToken *> *tokens;
|
|
248
|
-
@synchronized (self) {
|
|
249
|
-
tokens = [self.callbackTokens copy];
|
|
250
|
-
}
|
|
251
|
-
for (SDWebImageDownloaderOperationToken *token in tokens) {
|
|
252
|
-
if (token.progressBlock) {
|
|
253
|
-
token.progressBlock(0, NSURLResponseUnknownLength, self.request.URL);
|
|
254
|
-
}
|
|
255
|
-
}
|
|
256
|
-
__block typeof(self) strongSelf = self;
|
|
257
|
-
dispatch_async(dispatch_get_main_queue(), ^{
|
|
258
|
-
[[NSNotificationCenter defaultCenter] postNotificationName:SDWebImageDownloadStartNotification object:strongSelf];
|
|
259
|
-
});
|
|
260
|
-
} else {
|
|
261
|
-
if (!self.isFinished) self.finished = YES;
|
|
262
|
-
[self callCompletionBlocksWithError:[NSError errorWithDomain:SDWebImageErrorDomain code:SDWebImageErrorInvalidDownloadOperation userInfo:@{NSLocalizedDescriptionKey : @"Task can't be initialized"}]];
|
|
263
|
-
[self reset];
|
|
264
|
-
}
|
|
265
|
-
}
|
|
266
|
-
|
|
267
|
-
- (void)cancel {
|
|
268
|
-
@synchronized (self) {
|
|
269
|
-
[self cancelInternal];
|
|
270
|
-
}
|
|
271
|
-
}
|
|
272
|
-
|
|
273
|
-
- (void)cancelInternal {
|
|
274
|
-
if (self.isFinished) return;
|
|
275
|
-
[super cancel];
|
|
276
|
-
|
|
277
|
-
__block typeof(self) strongSelf = self;
|
|
278
|
-
dispatch_async(dispatch_get_main_queue(), ^{
|
|
279
|
-
[[NSNotificationCenter defaultCenter] postNotificationName:SDWebImageDownloadStopNotification object:strongSelf];
|
|
280
|
-
});
|
|
281
|
-
|
|
282
|
-
if (self.dataTask) {
|
|
283
|
-
// Cancel the URLSession, `URLSession:task:didCompleteWithError:` delegate callback will be ignored
|
|
284
|
-
[self.dataTask cancel];
|
|
285
|
-
self.dataTask = nil;
|
|
286
|
-
}
|
|
287
|
-
|
|
288
|
-
// NSOperation disallow setFinished=YES **before** operation's start method been called
|
|
289
|
-
// We check for the initialized status, which is isExecuting == NO && isFinished = NO
|
|
290
|
-
// Ony update for non-intialized status, which is !(isExecuting == NO && isFinished = NO), or if (self.isExecuting || self.isFinished) {...}
|
|
291
|
-
if (self.isExecuting || self.isFinished) {
|
|
292
|
-
if (self.isExecuting) self.executing = NO;
|
|
293
|
-
if (!self.isFinished) self.finished = YES;
|
|
294
|
-
}
|
|
295
|
-
|
|
296
|
-
// Operation cancelled by user during sending the request
|
|
297
|
-
[self callCompletionBlocksWithError:[NSError errorWithDomain:SDWebImageErrorDomain code:SDWebImageErrorCancelled userInfo:@{NSLocalizedDescriptionKey : @"Operation cancelled by user during sending the request"}]];
|
|
298
|
-
|
|
299
|
-
[self reset];
|
|
300
|
-
}
|
|
301
|
-
|
|
302
|
-
- (void)done {
|
|
303
|
-
self.finished = YES;
|
|
304
|
-
self.executing = NO;
|
|
305
|
-
[self reset];
|
|
306
|
-
}
|
|
307
|
-
|
|
308
|
-
- (void)reset {
|
|
309
|
-
@synchronized (self) {
|
|
310
|
-
[self.callbackTokens removeAllObjects];
|
|
311
|
-
self.dataTask = nil;
|
|
312
|
-
|
|
313
|
-
if (self.ownedSession) {
|
|
314
|
-
[self.ownedSession invalidateAndCancel];
|
|
315
|
-
self.ownedSession = nil;
|
|
316
|
-
}
|
|
317
|
-
|
|
318
|
-
#if SD_UIKIT
|
|
319
|
-
if (self.backgroundTaskId != UIBackgroundTaskInvalid) {
|
|
320
|
-
// If backgroundTaskId != UIBackgroundTaskInvalid, sharedApplication is always exist
|
|
321
|
-
UIApplication * app = [UIApplication performSelector:@selector(sharedApplication)];
|
|
322
|
-
[app endBackgroundTask:self.backgroundTaskId];
|
|
323
|
-
self.backgroundTaskId = UIBackgroundTaskInvalid;
|
|
324
|
-
}
|
|
325
|
-
#endif
|
|
326
|
-
}
|
|
327
|
-
}
|
|
328
|
-
|
|
329
|
-
- (void)setFinished:(BOOL)finished {
|
|
330
|
-
[self willChangeValueForKey:@"isFinished"];
|
|
331
|
-
_finished = finished;
|
|
332
|
-
[self didChangeValueForKey:@"isFinished"];
|
|
333
|
-
}
|
|
334
|
-
|
|
335
|
-
- (void)setExecuting:(BOOL)executing {
|
|
336
|
-
[self willChangeValueForKey:@"isExecuting"];
|
|
337
|
-
_executing = executing;
|
|
338
|
-
[self didChangeValueForKey:@"isExecuting"];
|
|
339
|
-
}
|
|
340
|
-
|
|
341
|
-
- (BOOL)isConcurrent {
|
|
342
|
-
return YES;
|
|
343
|
-
}
|
|
344
|
-
|
|
345
|
-
#pragma mark NSURLSessionDataDelegate
|
|
346
|
-
|
|
347
|
-
- (void)URLSession:(NSURLSession *)session
|
|
348
|
-
dataTask:(NSURLSessionDataTask *)dataTask
|
|
349
|
-
didReceiveResponse:(NSURLResponse *)response
|
|
350
|
-
completionHandler:(void (^)(NSURLSessionResponseDisposition disposition))completionHandler {
|
|
351
|
-
NSURLSessionResponseDisposition disposition = NSURLSessionResponseAllow;
|
|
352
|
-
|
|
353
|
-
// Check response modifier, if return nil, will marked as cancelled.
|
|
354
|
-
BOOL valid = YES;
|
|
355
|
-
if (self.responseModifier && response) {
|
|
356
|
-
response = [self.responseModifier modifiedResponseWithResponse:response];
|
|
357
|
-
if (!response) {
|
|
358
|
-
valid = NO;
|
|
359
|
-
self.responseError = [NSError errorWithDomain:SDWebImageErrorDomain
|
|
360
|
-
code:SDWebImageErrorInvalidDownloadResponse
|
|
361
|
-
userInfo:@{NSLocalizedDescriptionKey : @"Download marked as failed because response is nil"}];
|
|
362
|
-
}
|
|
363
|
-
}
|
|
364
|
-
|
|
365
|
-
NSInteger expected = (NSInteger)response.expectedContentLength;
|
|
366
|
-
expected = expected > 0 ? expected : 0;
|
|
367
|
-
self.expectedSize = expected;
|
|
368
|
-
self.response = response;
|
|
369
|
-
|
|
370
|
-
// Check status code valid (defaults [200,400))
|
|
371
|
-
NSInteger statusCode = [response isKindOfClass:NSHTTPURLResponse.class] ? ((NSHTTPURLResponse *)response).statusCode : 0;
|
|
372
|
-
BOOL statusCodeValid = YES;
|
|
373
|
-
if (valid && statusCode > 0 && self.acceptableStatusCodes) {
|
|
374
|
-
statusCodeValid = [self.acceptableStatusCodes containsIndex:statusCode];
|
|
375
|
-
}
|
|
376
|
-
if (!statusCodeValid) {
|
|
377
|
-
valid = NO;
|
|
378
|
-
self.responseError = [NSError errorWithDomain:SDWebImageErrorDomain
|
|
379
|
-
code:SDWebImageErrorInvalidDownloadStatusCode
|
|
380
|
-
userInfo:@{NSLocalizedDescriptionKey : [NSString stringWithFormat:@"Download marked as failed because of invalid response status code %ld", (long)statusCode],
|
|
381
|
-
SDWebImageErrorDownloadStatusCodeKey : @(statusCode),
|
|
382
|
-
SDWebImageErrorDownloadResponseKey : response}];
|
|
383
|
-
}
|
|
384
|
-
// Check content type valid (defaults nil)
|
|
385
|
-
NSString *contentType = [response isKindOfClass:NSHTTPURLResponse.class] ? ((NSHTTPURLResponse *)response).MIMEType : nil;
|
|
386
|
-
BOOL contentTypeValid = YES;
|
|
387
|
-
if (valid && contentType.length > 0 && self.acceptableContentTypes) {
|
|
388
|
-
contentTypeValid = [self.acceptableContentTypes containsObject:contentType];
|
|
389
|
-
}
|
|
390
|
-
if (!contentTypeValid) {
|
|
391
|
-
valid = NO;
|
|
392
|
-
self.responseError = [NSError errorWithDomain:SDWebImageErrorDomain
|
|
393
|
-
code:SDWebImageErrorInvalidDownloadContentType
|
|
394
|
-
userInfo:@{NSLocalizedDescriptionKey : [NSString stringWithFormat:@"Download marked as failed because of invalid response content type %@", contentType],
|
|
395
|
-
SDWebImageErrorDownloadContentTypeKey : contentType,
|
|
396
|
-
SDWebImageErrorDownloadResponseKey : response}];
|
|
397
|
-
}
|
|
398
|
-
//'304 Not Modified' is an exceptional one
|
|
399
|
-
//URLSession current behavior will return 200 status code when the server respond 304 and URLCache hit. But this is not a standard behavior and we just add a check
|
|
400
|
-
if (valid && statusCode == 304 && !self.cachedData) {
|
|
401
|
-
valid = NO;
|
|
402
|
-
self.responseError = [NSError errorWithDomain:SDWebImageErrorDomain
|
|
403
|
-
code:SDWebImageErrorCacheNotModified
|
|
404
|
-
userInfo:@{NSLocalizedDescriptionKey: @"Download response status code is 304 not modified and ignored",
|
|
405
|
-
SDWebImageErrorDownloadResponseKey : response}];
|
|
406
|
-
}
|
|
407
|
-
|
|
408
|
-
if (valid) {
|
|
409
|
-
NSArray<SDWebImageDownloaderOperationToken *> *tokens;
|
|
410
|
-
@synchronized (self) {
|
|
411
|
-
tokens = [self.callbackTokens copy];
|
|
412
|
-
}
|
|
413
|
-
for (SDWebImageDownloaderOperationToken *token in tokens) {
|
|
414
|
-
if (token.progressBlock) {
|
|
415
|
-
token.progressBlock(0, expected, self.request.URL);
|
|
416
|
-
}
|
|
417
|
-
}
|
|
418
|
-
} else {
|
|
419
|
-
// Status code invalid and marked as cancelled. Do not call `[self.dataTask cancel]` which may mass up URLSession life cycle
|
|
420
|
-
disposition = NSURLSessionResponseCancel;
|
|
421
|
-
}
|
|
422
|
-
__block typeof(self) strongSelf = self;
|
|
423
|
-
dispatch_async(dispatch_get_main_queue(), ^{
|
|
424
|
-
[[NSNotificationCenter defaultCenter] postNotificationName:SDWebImageDownloadReceiveResponseNotification object:strongSelf];
|
|
425
|
-
});
|
|
426
|
-
|
|
427
|
-
if (completionHandler) {
|
|
428
|
-
completionHandler(disposition);
|
|
429
|
-
}
|
|
430
|
-
}
|
|
431
|
-
|
|
432
|
-
- (void)URLSession:(NSURLSession *)session dataTask:(NSURLSessionDataTask *)dataTask didReceiveData:(NSData *)data {
|
|
433
|
-
if (!self.imageData) {
|
|
434
|
-
self.imageData = [[NSMutableData alloc] initWithCapacity:self.expectedSize];
|
|
435
|
-
}
|
|
436
|
-
[self.imageData appendData:data];
|
|
437
|
-
|
|
438
|
-
self.receivedSize = self.imageData.length;
|
|
439
|
-
NSArray<SDWebImageDownloaderOperationToken *> *tokens;
|
|
440
|
-
@synchronized (self) {
|
|
441
|
-
tokens = [self.callbackTokens copy];
|
|
442
|
-
}
|
|
443
|
-
if (self.expectedSize == 0) {
|
|
444
|
-
// Unknown expectedSize, immediately call progressBlock and return
|
|
445
|
-
for (SDWebImageDownloaderOperationToken *token in tokens) {
|
|
446
|
-
if (token.progressBlock) {
|
|
447
|
-
token.progressBlock(self.receivedSize, self.expectedSize, self.request.URL);
|
|
448
|
-
}
|
|
449
|
-
}
|
|
450
|
-
return;
|
|
451
|
-
}
|
|
452
|
-
|
|
453
|
-
// Get the finish status
|
|
454
|
-
BOOL finished = (self.receivedSize >= self.expectedSize);
|
|
455
|
-
// Get the current progress
|
|
456
|
-
double currentProgress = (double)self.receivedSize / (double)self.expectedSize;
|
|
457
|
-
double previousProgress = self.previousProgress;
|
|
458
|
-
double progressInterval = currentProgress - previousProgress;
|
|
459
|
-
// Check if we need callback progress
|
|
460
|
-
if (!finished && (progressInterval < self.minimumProgressInterval)) {
|
|
461
|
-
return;
|
|
462
|
-
}
|
|
463
|
-
self.previousProgress = currentProgress;
|
|
464
|
-
|
|
465
|
-
// Using data decryptor will disable the progressive decoding, since there are no support for progressive decrypt
|
|
466
|
-
BOOL supportProgressive = (self.options & SDWebImageDownloaderProgressiveLoad) && !self.decryptor;
|
|
467
|
-
// When multiple thumbnail decoding use different size, this progressive decoding will cause issue because each callback assume called with different size's image, can not share the same decoding part
|
|
468
|
-
// We currently only pick the first thumbnail size, see #3423 talks
|
|
469
|
-
// Progressive decoding Only decode partial image, full image in `URLSession:task:didCompleteWithError:`
|
|
470
|
-
if (supportProgressive && !finished) {
|
|
471
|
-
// Get the image data
|
|
472
|
-
NSData *imageData = self.imageData;
|
|
473
|
-
|
|
474
|
-
// keep maximum one progressive decode process during download
|
|
475
|
-
if (self.coderQueue.operationCount == 0) {
|
|
476
|
-
// NSOperation have autoreleasepool, don't need to create extra one
|
|
477
|
-
@weakify(self);
|
|
478
|
-
NSOperation *operation = [NSBlockOperation blockOperationWithBlock:^{
|
|
479
|
-
@strongify(self);
|
|
480
|
-
if (!self) {
|
|
481
|
-
return;
|
|
482
|
-
}
|
|
483
|
-
UIImage *image = SDImageLoaderDecodeProgressiveImageData(imageData, self.request.URL, NO, self, [[self class] imageOptionsFromDownloaderOptions:self.options], self.context);
|
|
484
|
-
if (self.isFinished) {
|
|
485
|
-
return;
|
|
486
|
-
}
|
|
487
|
-
if (image) {
|
|
488
|
-
// We do not keep the progressive decoding image even when `finished`=YES. Because they are for view rendering but not take full function from downloader options. And some coders implementation may not keep consistent between progressive decoding and normal decoding.
|
|
489
|
-
|
|
490
|
-
[self callCompletionBlocksWithImage:image imageData:nil error:nil finished:NO];
|
|
491
|
-
}
|
|
492
|
-
}];
|
|
493
|
-
[self.coderQueue addOperation:operation];
|
|
494
|
-
}
|
|
495
|
-
}
|
|
496
|
-
|
|
497
|
-
for (SDWebImageDownloaderOperationToken *token in tokens) {
|
|
498
|
-
if (token.progressBlock) {
|
|
499
|
-
token.progressBlock(self.receivedSize, self.expectedSize, self.request.URL);
|
|
500
|
-
}
|
|
501
|
-
}
|
|
502
|
-
}
|
|
503
|
-
|
|
504
|
-
- (void)URLSession:(NSURLSession *)session
|
|
505
|
-
dataTask:(NSURLSessionDataTask *)dataTask
|
|
506
|
-
willCacheResponse:(NSCachedURLResponse *)proposedResponse
|
|
507
|
-
completionHandler:(void (^)(NSCachedURLResponse *cachedResponse))completionHandler {
|
|
508
|
-
|
|
509
|
-
NSCachedURLResponse *cachedResponse = proposedResponse;
|
|
510
|
-
|
|
511
|
-
if (!(self.options & SDWebImageDownloaderUseNSURLCache)) {
|
|
512
|
-
// Prevents caching of responses
|
|
513
|
-
cachedResponse = nil;
|
|
514
|
-
}
|
|
515
|
-
if (completionHandler) {
|
|
516
|
-
completionHandler(cachedResponse);
|
|
517
|
-
}
|
|
518
|
-
}
|
|
519
|
-
|
|
520
|
-
#pragma mark NSURLSessionTaskDelegate
|
|
521
|
-
|
|
522
|
-
- (void)URLSession:(NSURLSession *)session task:(NSURLSessionTask *)task didCompleteWithError:(NSError *)error {
|
|
523
|
-
// If we already cancel the operation or anything mark the operation finished, don't callback twice
|
|
524
|
-
if (self.isFinished) return;
|
|
525
|
-
|
|
526
|
-
NSArray<SDWebImageDownloaderOperationToken *> *tokens;
|
|
527
|
-
@synchronized (self) {
|
|
528
|
-
tokens = [self.callbackTokens copy];
|
|
529
|
-
self.dataTask = nil;
|
|
530
|
-
__block typeof(self) strongSelf = self;
|
|
531
|
-
dispatch_async(dispatch_get_main_queue(), ^{
|
|
532
|
-
[[NSNotificationCenter defaultCenter] postNotificationName:SDWebImageDownloadStopNotification object:strongSelf];
|
|
533
|
-
if (!error) {
|
|
534
|
-
[[NSNotificationCenter defaultCenter] postNotificationName:SDWebImageDownloadFinishNotification object:strongSelf];
|
|
535
|
-
}
|
|
536
|
-
});
|
|
537
|
-
}
|
|
538
|
-
|
|
539
|
-
// make sure to call `[self done]` to mark operation as finished
|
|
540
|
-
if (error) {
|
|
541
|
-
// custom error instead of URLSession error
|
|
542
|
-
if (self.responseError) {
|
|
543
|
-
error = self.responseError;
|
|
544
|
-
}
|
|
545
|
-
[self callCompletionBlocksWithError:error];
|
|
546
|
-
[self done];
|
|
547
|
-
} else {
|
|
548
|
-
if (tokens.count > 0) {
|
|
549
|
-
NSData *imageData = self.imageData;
|
|
550
|
-
self.imageData = nil;
|
|
551
|
-
// data decryptor
|
|
552
|
-
if (imageData && self.decryptor) {
|
|
553
|
-
imageData = [self.decryptor decryptedDataWithData:imageData response:self.response];
|
|
554
|
-
}
|
|
555
|
-
if (imageData) {
|
|
556
|
-
/** if you specified to only use cached data via `SDWebImageDownloaderIgnoreCachedResponse`,
|
|
557
|
-
* then we should check if the cached data is equal to image data
|
|
558
|
-
*/
|
|
559
|
-
if (self.options & SDWebImageDownloaderIgnoreCachedResponse && [self.cachedData isEqualToData:imageData]) {
|
|
560
|
-
self.responseError = [NSError errorWithDomain:SDWebImageErrorDomain
|
|
561
|
-
code:SDWebImageErrorCacheNotModified
|
|
562
|
-
userInfo:@{NSLocalizedDescriptionKey : @"Downloaded image is not modified and ignored",
|
|
563
|
-
SDWebImageErrorDownloadResponseKey : self.response}];
|
|
564
|
-
// call completion block with not modified error
|
|
565
|
-
[self callCompletionBlocksWithError:self.responseError];
|
|
566
|
-
[self done];
|
|
567
|
-
} else {
|
|
568
|
-
// decode the image in coder queue, cancel all previous decoding process
|
|
569
|
-
[self.coderQueue cancelAllOperations];
|
|
570
|
-
@weakify(self);
|
|
571
|
-
// call done after all different variant completed block was dispatched
|
|
572
|
-
NSOperation *doneOperation = [NSBlockOperation blockOperationWithBlock:^{
|
|
573
|
-
@strongify(self);
|
|
574
|
-
if (!self) {
|
|
575
|
-
return;
|
|
576
|
-
}
|
|
577
|
-
[self done];
|
|
578
|
-
}];
|
|
579
|
-
for (SDWebImageDownloaderOperationToken *token in tokens) {
|
|
580
|
-
NSOperation *operation = [NSBlockOperation blockOperationWithBlock:^{
|
|
581
|
-
@strongify(self);
|
|
582
|
-
if (!self) {
|
|
583
|
-
return;
|
|
584
|
-
}
|
|
585
|
-
UIImage *image;
|
|
586
|
-
// check if we already decode this variant of image for current callback
|
|
587
|
-
if (token.decodeOptions) {
|
|
588
|
-
image = [self.imageMap objectForKey:token.decodeOptions];
|
|
589
|
-
}
|
|
590
|
-
if (!image) {
|
|
591
|
-
// check if we already use progressive decoding, use that to produce faster decoding
|
|
592
|
-
id<SDProgressiveImageCoder> progressiveCoder = SDImageLoaderGetProgressiveCoder(self);
|
|
593
|
-
SDWebImageOptions options = [[self class] imageOptionsFromDownloaderOptions:self.options];
|
|
594
|
-
SDWebImageContext *context;
|
|
595
|
-
if (token.decodeOptions) {
|
|
596
|
-
SDWebImageMutableContext *mutableContext = [NSMutableDictionary dictionaryWithDictionary:self.context];
|
|
597
|
-
SDSetDecodeOptionsToContext(mutableContext, &options, token.decodeOptions);
|
|
598
|
-
context = [mutableContext copy];
|
|
599
|
-
} else {
|
|
600
|
-
context = self.context;
|
|
601
|
-
}
|
|
602
|
-
if (progressiveCoder) {
|
|
603
|
-
image = SDImageLoaderDecodeProgressiveImageData(imageData, self.request.URL, YES, self, options, context);
|
|
604
|
-
} else {
|
|
605
|
-
image = SDImageLoaderDecodeImageData(imageData, self.request.URL, options, context);
|
|
606
|
-
}
|
|
607
|
-
if (image && token.decodeOptions) {
|
|
608
|
-
[self.imageMap setObject:image forKey:token.decodeOptions];
|
|
609
|
-
}
|
|
610
|
-
}
|
|
611
|
-
CGSize imageSize = image.size;
|
|
612
|
-
if (imageSize.width == 0 || imageSize.height == 0) {
|
|
613
|
-
NSString *description = image == nil ? @"Downloaded image decode failed" : @"Downloaded image has 0 pixels";
|
|
614
|
-
[self callCompletionBlocksWithError:[NSError errorWithDomain:SDWebImageErrorDomain code:SDWebImageErrorBadImageData userInfo:@{NSLocalizedDescriptionKey : description}]];
|
|
615
|
-
} else {
|
|
616
|
-
[self callCompletionBlockWithToken:token image:image imageData:imageData error:nil finished:YES];
|
|
617
|
-
}
|
|
618
|
-
}];
|
|
619
|
-
[doneOperation addDependency:operation];
|
|
620
|
-
[self.coderQueue addOperation:operation];
|
|
621
|
-
}
|
|
622
|
-
// call [self done] after all completed block was dispatched
|
|
623
|
-
[self.coderQueue addOperation:doneOperation];
|
|
624
|
-
}
|
|
625
|
-
} else {
|
|
626
|
-
[self callCompletionBlocksWithError:[NSError errorWithDomain:SDWebImageErrorDomain code:SDWebImageErrorBadImageData userInfo:@{NSLocalizedDescriptionKey : @"Image data is nil"}]];
|
|
627
|
-
[self done];
|
|
628
|
-
}
|
|
629
|
-
} else {
|
|
630
|
-
[self done];
|
|
631
|
-
}
|
|
632
|
-
}
|
|
633
|
-
}
|
|
634
|
-
|
|
635
|
-
- (void)URLSession:(NSURLSession *)session task:(NSURLSessionTask *)task didReceiveChallenge:(NSURLAuthenticationChallenge *)challenge completionHandler:(void (^)(NSURLSessionAuthChallengeDisposition disposition, NSURLCredential *credential))completionHandler {
|
|
636
|
-
|
|
637
|
-
NSURLSessionAuthChallengeDisposition disposition = NSURLSessionAuthChallengePerformDefaultHandling;
|
|
638
|
-
__block NSURLCredential *credential = nil;
|
|
639
|
-
|
|
640
|
-
if ([challenge.protectionSpace.authenticationMethod isEqualToString:NSURLAuthenticationMethodServerTrust]) {
|
|
641
|
-
if (!(self.options & SDWebImageDownloaderAllowInvalidSSLCertificates)) {
|
|
642
|
-
disposition = NSURLSessionAuthChallengePerformDefaultHandling;
|
|
643
|
-
} else {
|
|
644
|
-
credential = [NSURLCredential credentialForTrust:challenge.protectionSpace.serverTrust];
|
|
645
|
-
disposition = NSURLSessionAuthChallengeUseCredential;
|
|
646
|
-
}
|
|
647
|
-
} else {
|
|
648
|
-
if (challenge.previousFailureCount == 0) {
|
|
649
|
-
if (self.credential) {
|
|
650
|
-
credential = self.credential;
|
|
651
|
-
disposition = NSURLSessionAuthChallengeUseCredential;
|
|
652
|
-
} else {
|
|
653
|
-
// Web Server like Nginx can set `ssl_verify_client` to optional but not always on
|
|
654
|
-
// We'd better use default handling here
|
|
655
|
-
disposition = NSURLSessionAuthChallengePerformDefaultHandling;
|
|
656
|
-
}
|
|
657
|
-
} else {
|
|
658
|
-
disposition = NSURLSessionAuthChallengeCancelAuthenticationChallenge;
|
|
659
|
-
}
|
|
660
|
-
}
|
|
661
|
-
|
|
662
|
-
if (completionHandler) {
|
|
663
|
-
completionHandler(disposition, credential);
|
|
664
|
-
}
|
|
665
|
-
}
|
|
666
|
-
|
|
667
|
-
- (void)URLSession:(NSURLSession *)session task:(NSURLSessionTask *)task didFinishCollectingMetrics:(NSURLSessionTaskMetrics *)metrics API_AVAILABLE(macosx(10.12), ios(10.0), watchos(3.0), tvos(10.0)) {
|
|
668
|
-
self.metrics = metrics;
|
|
669
|
-
}
|
|
670
|
-
|
|
671
|
-
#pragma mark Helper methods
|
|
672
|
-
+ (SDWebImageOptions)imageOptionsFromDownloaderOptions:(SDWebImageDownloaderOptions)downloadOptions {
|
|
673
|
-
SDWebImageOptions options = 0;
|
|
674
|
-
if (downloadOptions & SDWebImageDownloaderScaleDownLargeImages) options |= SDWebImageScaleDownLargeImages;
|
|
675
|
-
if (downloadOptions & SDWebImageDownloaderDecodeFirstFrameOnly) options |= SDWebImageDecodeFirstFrameOnly;
|
|
676
|
-
if (downloadOptions & SDWebImageDownloaderPreloadAllFrames) options |= SDWebImagePreloadAllFrames;
|
|
677
|
-
if (downloadOptions & SDWebImageDownloaderAvoidDecodeImage) options |= SDWebImageAvoidDecodeImage;
|
|
678
|
-
if (downloadOptions & SDWebImageDownloaderMatchAnimatedImageClass) options |= SDWebImageMatchAnimatedImageClass;
|
|
679
|
-
|
|
680
|
-
return options;
|
|
681
|
-
}
|
|
682
|
-
|
|
683
|
-
- (BOOL)shouldContinueWhenAppEntersBackground {
|
|
684
|
-
return SD_OPTIONS_CONTAINS(self.options, SDWebImageDownloaderContinueInBackground);
|
|
685
|
-
}
|
|
686
|
-
|
|
687
|
-
- (void)callCompletionBlocksWithError:(nullable NSError *)error {
|
|
688
|
-
[self callCompletionBlocksWithImage:nil imageData:nil error:error finished:YES];
|
|
689
|
-
}
|
|
690
|
-
|
|
691
|
-
- (void)callCompletionBlocksWithImage:(nullable UIImage *)image
|
|
692
|
-
imageData:(nullable NSData *)imageData
|
|
693
|
-
error:(nullable NSError *)error
|
|
694
|
-
finished:(BOOL)finished {
|
|
695
|
-
NSArray<SDWebImageDownloaderOperationToken *> *tokens;
|
|
696
|
-
@synchronized (self) {
|
|
697
|
-
tokens = [self.callbackTokens copy];
|
|
698
|
-
}
|
|
699
|
-
for (SDWebImageDownloaderOperationToken *token in tokens) {
|
|
700
|
-
SDWebImageDownloaderCompletedBlock completedBlock = token.completedBlock;
|
|
701
|
-
if (completedBlock) {
|
|
702
|
-
dispatch_main_async_safe(^{
|
|
703
|
-
completedBlock(image, imageData, error, finished);
|
|
704
|
-
});
|
|
705
|
-
}
|
|
706
|
-
}
|
|
707
|
-
}
|
|
708
|
-
|
|
709
|
-
- (void)callCompletionBlockWithToken:(nonnull SDWebImageDownloaderOperationToken *)token
|
|
710
|
-
image:(nullable UIImage *)image
|
|
711
|
-
imageData:(nullable NSData *)imageData
|
|
712
|
-
error:(nullable NSError *)error
|
|
713
|
-
finished:(BOOL)finished {
|
|
714
|
-
SDWebImageDownloaderCompletedBlock completedBlock = token.completedBlock;
|
|
715
|
-
if (completedBlock) {
|
|
716
|
-
dispatch_main_async_safe(^{
|
|
717
|
-
completedBlock(image, imageData, error, finished);
|
|
718
|
-
});
|
|
719
|
-
}
|
|
720
|
-
}
|
|
721
|
-
|
|
722
|
-
@end
|