Skip to content

Commit

Permalink
Release 28.8.0
Browse files Browse the repository at this point in the history
  • Loading branch information
robot-divkit committed Oct 30, 2023
1 parent 7ee2177 commit ae162ff
Show file tree
Hide file tree
Showing 20 changed files with 248 additions and 66 deletions.
6 changes: 6 additions & 0 deletions .mapping.json
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@
"DivKit/DivExtensionHandler.swift":"divkit/public-ios/DivKit/DivExtensionHandler.swift",
"DivKit/DivFlagsInfo.swift":"divkit/public-ios/DivKit/DivFlagsInfo.swift",
"DivKit/DivFontProvider.swift":"divkit/public-ios/DivKit/DivFontProvider.swift",
"DivKit/DivImageHolderFactory.swift":"divkit/public-ios/DivKit/DivImageHolderFactory.swift",
"DivKit/DivKitComponents.swift":"divkit/public-ios/DivKit/DivKitComponents.swift",
"DivKit/DivKitInfo.swift":"divkit/public-ios/DivKit/DivKitInfo.swift",
"DivKit/DivKitLogger.swift":"divkit/public-ios/DivKit/DivKitLogger.swift",
Expand Down Expand Up @@ -818,6 +819,7 @@
"Specs/DivKit/28.5.1/DivKit.podspec":"divkit/public-ios/Specs/DivKit/28.5.1/DivKit.podspec",
"Specs/DivKit/28.6.0/DivKit.podspec":"divkit/public-ios/Specs/DivKit/28.6.0/DivKit.podspec",
"Specs/DivKit/28.7.0/DivKit.podspec":"divkit/public-ios/Specs/DivKit/28.7.0/DivKit.podspec",
"Specs/DivKit/28.8.0/DivKit.podspec":"divkit/public-ios/Specs/DivKit/28.8.0/DivKit.podspec",
"Specs/DivKitExtensions/24.3.0/DivKitExtensions.podspec":"divkit/public-ios/Specs/DivKitExtensions/24.3.0/DivKitExtensions.podspec",
"Specs/DivKitExtensions/25.0.0/DivKitExtensions.podspec":"divkit/public-ios/Specs/DivKitExtensions/25.0.0/DivKitExtensions.podspec",
"Specs/DivKitExtensions/25.1.0/DivKitExtensions.podspec":"divkit/public-ios/Specs/DivKitExtensions/25.1.0/DivKitExtensions.podspec",
Expand All @@ -844,6 +846,7 @@
"Specs/DivKitExtensions/28.5.1/DivKitExtensions.podspec":"divkit/public-ios/Specs/DivKitExtensions/28.5.1/DivKitExtensions.podspec",
"Specs/DivKitExtensions/28.6.0/DivKitExtensions.podspec":"divkit/public-ios/Specs/DivKitExtensions/28.6.0/DivKitExtensions.podspec",
"Specs/DivKitExtensions/28.7.0/DivKitExtensions.podspec":"divkit/public-ios/Specs/DivKitExtensions/28.7.0/DivKitExtensions.podspec",
"Specs/DivKitExtensions/28.8.0/DivKitExtensions.podspec":"divkit/public-ios/Specs/DivKitExtensions/28.8.0/DivKitExtensions.podspec",
"Specs/DivKit_LayoutKit/28.0.1/DivKit_LayoutKit.podspec":"divkit/public-ios/Specs/DivKit_LayoutKit/28.0.1/DivKit_LayoutKit.podspec",
"Specs/DivKit_LayoutKit/28.1.0/DivKit_LayoutKit.podspec":"divkit/public-ios/Specs/DivKit_LayoutKit/28.1.0/DivKit_LayoutKit.podspec",
"Specs/DivKit_LayoutKit/28.2.0/DivKit_LayoutKit.podspec":"divkit/public-ios/Specs/DivKit_LayoutKit/28.2.0/DivKit_LayoutKit.podspec",
Expand All @@ -852,6 +855,7 @@
"Specs/DivKit_LayoutKit/28.5.1/DivKit_LayoutKit.podspec":"divkit/public-ios/Specs/DivKit_LayoutKit/28.5.1/DivKit_LayoutKit.podspec",
"Specs/DivKit_LayoutKit/28.6.0/DivKit_LayoutKit.podspec":"divkit/public-ios/Specs/DivKit_LayoutKit/28.6.0/DivKit_LayoutKit.podspec",
"Specs/DivKit_LayoutKit/28.7.0/DivKit_LayoutKit.podspec":"divkit/public-ios/Specs/DivKit_LayoutKit/28.7.0/DivKit_LayoutKit.podspec",
"Specs/DivKit_LayoutKit/28.8.0/DivKit_LayoutKit.podspec":"divkit/public-ios/Specs/DivKit_LayoutKit/28.8.0/DivKit_LayoutKit.podspec",
"Specs/DivKit_LayoutKitInterface/28.0.1/DivKit_LayoutKitInterface.podspec":"divkit/public-ios/Specs/DivKit_LayoutKitInterface/28.0.1/DivKit_LayoutKitInterface.podspec",
"Specs/DivKit_LayoutKitInterface/28.1.0/DivKit_LayoutKitInterface.podspec":"divkit/public-ios/Specs/DivKit_LayoutKitInterface/28.1.0/DivKit_LayoutKitInterface.podspec",
"Specs/DivKit_LayoutKitInterface/28.2.0/DivKit_LayoutKitInterface.podspec":"divkit/public-ios/Specs/DivKit_LayoutKitInterface/28.2.0/DivKit_LayoutKitInterface.podspec",
Expand All @@ -860,6 +864,7 @@
"Specs/DivKit_LayoutKitInterface/28.5.1/DivKit_LayoutKitInterface.podspec":"divkit/public-ios/Specs/DivKit_LayoutKitInterface/28.5.1/DivKit_LayoutKitInterface.podspec",
"Specs/DivKit_LayoutKitInterface/28.6.0/DivKit_LayoutKitInterface.podspec":"divkit/public-ios/Specs/DivKit_LayoutKitInterface/28.6.0/DivKit_LayoutKitInterface.podspec",
"Specs/DivKit_LayoutKitInterface/28.7.0/DivKit_LayoutKitInterface.podspec":"divkit/public-ios/Specs/DivKit_LayoutKitInterface/28.7.0/DivKit_LayoutKitInterface.podspec",
"Specs/DivKit_LayoutKitInterface/28.8.0/DivKit_LayoutKitInterface.podspec":"divkit/public-ios/Specs/DivKit_LayoutKitInterface/28.8.0/DivKit_LayoutKitInterface.podspec",
"Specs/DivKit_Serialization/28.0.1/DivKit_Serialization.podspec":"divkit/public-ios/Specs/DivKit_Serialization/28.0.1/DivKit_Serialization.podspec",
"Specs/DivKit_Serialization/28.1.0/DivKit_Serialization.podspec":"divkit/public-ios/Specs/DivKit_Serialization/28.1.0/DivKit_Serialization.podspec",
"Specs/DivKit_Serialization/28.2.0/DivKit_Serialization.podspec":"divkit/public-ios/Specs/DivKit_Serialization/28.2.0/DivKit_Serialization.podspec",
Expand All @@ -868,6 +873,7 @@
"Specs/DivKit_Serialization/28.5.1/DivKit_Serialization.podspec":"divkit/public-ios/Specs/DivKit_Serialization/28.5.1/DivKit_Serialization.podspec",
"Specs/DivKit_Serialization/28.6.0/DivKit_Serialization.podspec":"divkit/public-ios/Specs/DivKit_Serialization/28.6.0/DivKit_Serialization.podspec",
"Specs/DivKit_Serialization/28.7.0/DivKit_Serialization.podspec":"divkit/public-ios/Specs/DivKit_Serialization/28.7.0/DivKit_Serialization.podspec",
"Specs/DivKit_Serialization/28.8.0/DivKit_Serialization.podspec":"divkit/public-ios/Specs/DivKit_Serialization/28.8.0/DivKit_Serialization.podspec",
"Specs/LayoutKit/24.3.0/LayoutKit.podspec":"divkit/public-ios/Specs/LayoutKit/24.3.0/LayoutKit.podspec",
"Specs/LayoutKit/25.0.0/LayoutKit.podspec":"divkit/public-ios/Specs/LayoutKit/25.0.0/LayoutKit.podspec",
"Specs/LayoutKit/25.1.0/LayoutKit.podspec":"divkit/public-ios/Specs/LayoutKit/25.1.0/LayoutKit.podspec",
Expand Down
8 changes: 4 additions & 4 deletions DivKit/DivBlockModelingContext.swift
Original file line number Diff line number Diff line change
Expand Up @@ -19,8 +19,8 @@ public struct DivBlockModelingContext {
public let blockStateStorage: DivBlockStateStorage
let visibilityCounter: DivVisibilityCounting
let lastVisibleBoundsCache: DivLastVisibleBoundsCache
public let imageHolderFactory: ImageHolderFactory
let highPriorityImageHolderFactory: ImageHolderFactory?
public let imageHolderFactory: DivImageHolderFactory
let highPriorityImageHolderFactory: DivImageHolderFactory?
let divCustomBlockFactory: DivCustomBlockFactory
let fontProvider: DivFontProvider
let flagsInfo: DivFlagsInfo
Expand Down Expand Up @@ -64,8 +64,8 @@ public struct DivBlockModelingContext {
blockStateStorage: DivBlockStateStorage = DivBlockStateStorage(),
visibilityCounter: DivVisibilityCounting? = nil,
lastVisibleBoundsCache: DivLastVisibleBoundsCache? = nil,
imageHolderFactory: ImageHolderFactory,
highPriorityImageHolderFactory: ImageHolderFactory? = nil,
imageHolderFactory: DivImageHolderFactory,
highPriorityImageHolderFactory: DivImageHolderFactory? = nil,
divCustomBlockFactory: DivCustomBlockFactory? = nil,
fontProvider: DivFontProvider? = nil,
flagsInfo: DivFlagsInfo = .default,
Expand Down
79 changes: 79 additions & 0 deletions DivKit/DivImageHolderFactory.swift
Original file line number Diff line number Diff line change
@@ -0,0 +1,79 @@
import Foundation

import BasePublic
import NetworkingPublic

/// Loads images for `DivKit` views.
public protocol DivImageHolderFactory {
/// Provides `ImageHolder` for an image with given `URL`.
func make(_ url: URL?, _ placeholder: ImagePlaceholder?) -> ImageHolder
}

extension DivImageHolderFactory {
public func make(_ url: URL?) -> ImageHolder {
make(url, nil)
}

public func withCache(_ cachedImageHolders: [ImageHolder]) -> DivImageHolderFactory {
if cachedImageHolders.isEmpty {
return self
}
return CachedImageHolderFactory(
imageHolderFactory: self,
cachedImageHolders: cachedImageHolders
)
}
}

extension ImageHolderFactory: DivImageHolderFactory {}

final class DefaultImageHolderFactory: DivImageHolderFactory {
private let requester: URLResourceRequesting
private let imageLoadingOptimizationEnabled: Bool

private let imageProcessingQueue = OperationQueue(
name: "tech.divkit.image-processing",
qos: .userInitiated
)

init(
requestPerformer: URLRequestPerforming,
imageLoadingOptimizationEnabled: Bool
) {
self.requester = NetworkURLResourceRequester(performer: requestPerformer)
self.imageLoadingOptimizationEnabled = imageLoadingOptimizationEnabled
}

func make(_ url: URL?, _ placeholder: ImagePlaceholder?) -> ImageHolder {
guard let url = url else {
return placeholder?.toImageHolder() ?? NilImageHolder()
}
return RemoteImageHolder(
url: url,
placeholder: placeholder,
requester: requester,
imageProcessingQueue: imageProcessingQueue,
imageLoadingOptimizationEnabled: imageLoadingOptimizationEnabled
)
}
}

private final class CachedImageHolderFactory: DivImageHolderFactory {
private let imageHolderFactory: DivImageHolderFactory
private let cachedImageHolders: [ImageHolder]

init(
imageHolderFactory: DivImageHolderFactory,
cachedImageHolders: [ImageHolder]
) {
self.imageHolderFactory = imageHolderFactory
self.cachedImageHolders = cachedImageHolders
}

func make(_ url: URL?, _ placeholder: ImagePlaceholder?) -> ImageHolder {
let cachedImageHolder = cachedImageHolders.first {
$0.reused(with: placeholder, remoteImageURL: url) != nil
}
return cachedImageHolder ?? imageHolderFactory.make(url, placeholder)
}
}
27 changes: 6 additions & 21 deletions DivKit/DivKitComponents.swift
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@ public final class DivKitComponents {
public var extensionHandlers: [DivExtensionHandler]
public let flagsInfo: DivFlagsInfo
public let fontProvider: DivFontProvider
public let imageHolderFactory: ImageHolderFactory
public let imageHolderFactory: DivImageHolderFactory
public let layoutDirection: UserInterfaceLayoutDirection
public let patchProvider: DivPatchProvider
public let playerFactory: PlayerFactory?
Expand Down Expand Up @@ -94,7 +94,7 @@ public final class DivKitComponents {
extensionHandlers: [DivExtensionHandler] = [],
flagsInfo: DivFlagsInfo = .default,
fontProvider: DivFontProvider? = nil,
imageHolderFactory: ImageHolderFactory? = nil,
imageHolderFactory: DivImageHolderFactory? = nil,
layoutDirection: UserInterfaceLayoutDirection = .leftToRight,
patchProvider: DivPatchProvider? = nil,
requestPerformer: URLRequestPerforming? = nil,
Expand Down Expand Up @@ -140,7 +140,7 @@ public final class DivKitComponents {
let requestPerformer = requestPerformer ?? URLRequestPerformer(urlTransform: nil)

self.imageHolderFactory = imageHolderFactory
?? makeImageHolderFactory(
?? DefaultImageHolderFactory(
requestPerformer: requestPerformer,
imageLoadingOptimizationEnabled: flagsInfo.imageLoadingOptimizationEnabled
)
Expand Down Expand Up @@ -211,6 +211,7 @@ public final class DivKitComponents {
patchProvider.cancelRequests()

blockStateStorage.reset()
lastVisibleBoundsCache.reset()
stateManagement.reset()
variablesStorage.reset()
visibilityCounter.reset()
Expand All @@ -219,6 +220,7 @@ public final class DivKitComponents {

public func reset(cardId: DivCardID) {
blockStateStorage.reset(cardId: cardId)
lastVisibleBoundsCache.dropVisibleBounds(forMatchingPrefix: UIElementPath(cardId.rawValue))
stateManagement.reset(cardId: cardId)
variablesStorage.reset(cardId: cardId)
visibilityCounter.reset(cardId: cardId)
Expand Down Expand Up @@ -285,8 +287,7 @@ public final class DivKitComponents {
blockStateStorage: blockStateStorage,
visibilityCounter: visibilityCounter,
lastVisibleBoundsCache: lastVisibleBoundsCache,
imageHolderFactory: imageHolderFactory
.withInMemoryCache(cachedImageHolders: cachedImageHolders),
imageHolderFactory: imageHolderFactory.withCache(cachedImageHolders),
divCustomBlockFactory: divCustomBlockFactory,
fontProvider: fontProvider,
flagsInfo: flagsInfo,
Expand Down Expand Up @@ -335,22 +336,6 @@ public final class DivKitComponents {
}
}

func makeImageHolderFactory(
requestPerformer: URLRequestPerforming,
imageLoadingOptimizationEnabled: Bool = false
) -> ImageHolderFactory {
ImageHolderFactory(
requester: NetworkURLResourceRequester(
performer: requestPerformer
),
imageProcessingQueue: OperationQueue(
name: "tech.divkit.image-processing",
qos: .userInitiated
),
imageLoadingOptimizationEnabled: imageLoadingOptimizationEnabled
)
}

#if os(iOS)
let defaultPlayerFactory: PlayerFactory? = DefaultPlayerFactory()
#else
Expand Down
2 changes: 1 addition & 1 deletion DivKit/DivKitInfo.swift
Original file line number Diff line number Diff line change
@@ -1,3 +1,3 @@
public enum DivKitInfo {
public static let version = "28.7.0"
public static let version = "28.8.0"
}
5 changes: 2 additions & 3 deletions DivKit/Extensions/DivBackgroundExtensions.swift
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,6 @@ import NetworkingPublic

extension DivBackground {
func makeBlockBackground(
with imageHolderFactory: ImageHolderFactory,
context: DivBlockModelingContext
) -> LayoutKit.Background? {
let expressionResolver = context.expressionResolver
Expand All @@ -27,7 +26,7 @@ extension DivBackground {
).map { .gradient(.radial($0)) }
case let .divImageBackground(imageBackground):
let image = BackgroundImage(
imageHolder: imageHolderFactory.make(
imageHolder: context.imageHolderFactory.make(
imageBackground.resolveImageUrl(expressionResolver)
),
contentMode: imageBackground.contentMode(context: context),
Expand All @@ -39,7 +38,7 @@ extension DivBackground {
return solidBackground.resolveColor(expressionResolver).map { .solidColor($0) }
case let .divNinePatchBackground(ninePatchBackground):
let image = NinePatchImage(
imageHolder: imageHolderFactory.make(
imageHolder: context.imageHolderFactory.make(
ninePatchBackground.resolveImageUrl(expressionResolver)
),
insets: ninePatchBackground.insets.makeEdgeInsets(with: expressionResolver)
Expand Down
12 changes: 2 additions & 10 deletions DivKit/Extensions/DivBase/DivBaseExtensions.swift
Original file line number Diff line number Diff line change
Expand Up @@ -66,7 +66,6 @@ extension DivBase {
block = applyBackground(
background,
to: block,
imageHolderFactory: context.imageHolderFactory,
context: context
)
.addingDecorations(
Expand Down Expand Up @@ -237,7 +236,6 @@ extension DivBase {
private func applyBackground(
_ backgrounds: [DivBackground]?,
to block: Block,
imageHolderFactory: ImageHolderFactory,
context: DivBlockModelingContext
) -> Block {
guard let backgrounds = backgrounds else {
Expand All @@ -246,10 +244,7 @@ extension DivBase {

// optimization for the most common case: saves Array alloc/dealloc
if backgrounds.count == 1 {
guard let background = backgrounds[0].makeBlockBackground(
with: imageHolderFactory,
context: context
) else {
guard let background = backgrounds[0].makeBlockBackground(context: context) else {
return block
}
if case let .solidColor(color) = background {
Expand All @@ -259,10 +254,7 @@ extension DivBase {
}

let blockBackgrounds = backgrounds.compactMap {
$0.makeBlockBackground(
with: imageHolderFactory,
context: context
)
$0.makeBlockBackground(context: context)
}
guard let background = blockBackgrounds.composite() else {
return block
Expand Down
11 changes: 5 additions & 6 deletions DivKit/Extensions/DivImage/DivImageExtensions.swift
Original file line number Diff line number Diff line change
Expand Up @@ -22,19 +22,18 @@ extension DivImage: DivBlockModeling, DivImageProtocol {

let expressionResolver = context.expressionResolver
let highPriority = resolveHighPriorityPreviewShow(expressionResolver)
let imageHolderFactory: ImageHolderFactory
let imageHolderFactory: DivImageHolderFactory
if highPriority, let highPriorityImageHolderFactory = context.highPriorityImageHolderFactory {
imageHolderFactory = highPriorityImageHolderFactory
} else {
imageHolderFactory = context.imageHolderFactory
}

let imageHolder = imageHolderFactory.make(
resolveImageUrl(expressionResolver),
resolvePlaceholder(expressionResolver, highPriority: highPriority)
)
return ImageBlock(
imageHolder: imageHolder,
imageHolder: imageHolderFactory.make(
resolveImageUrl(expressionResolver),
resolvePlaceholder(expressionResolver, highPriority: highPriority)
),
widthTrait: makeContentWidthTrait(with: context),
height: resolveHeight(context),
contentMode: contentMode(context: context),
Expand Down
13 changes: 5 additions & 8 deletions DivKit/Extensions/DivTextExtensions.swift
Original file line number Diff line number Diff line change
Expand Up @@ -148,10 +148,7 @@ extension DivText: DivBlockModeling {
let start = $0.resolveStart(context.expressionResolver) ?? 0
return start <= CFAttributedStringGetLength(text)
}
.map { $0.makeImage(
withFactory: context.imageHolderFactory,
expressionResolver: context.expressionResolver
) }
.map { $0.makeImage(context: context) }
}

private func apply(
Expand Down Expand Up @@ -290,15 +287,15 @@ extension URLQueryItem {

extension DivText.Image {
fileprivate func makeImage(
withFactory factory: ImageHolderFactory,
expressionResolver: ExpressionResolver
context: DivBlockModelingContext
) -> TextBlock.InlineImage {
TextBlock.InlineImage(
let expressionResolver = context.expressionResolver
return TextBlock.InlineImage(
size: CGSize(
width: CGFloat(width.resolveValue(expressionResolver) ?? 0),
height: CGFloat(height.resolveValue(expressionResolver) ?? 0)
),
holder: factory.make(resolveUrl(expressionResolver)),
holder: context.imageHolderFactory.make(resolveUrl(expressionResolver)),
location: resolveStart(expressionResolver) ?? 0,
tintColor: resolveTintColor(expressionResolver)
)
Expand Down
7 changes: 6 additions & 1 deletion DivKit/Variables/DivVariableStorage.swift
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,8 @@ public final class DivVariableStorage {
private var values = DivVariables()
private let lock = RWLock()

var allValues: DivVariables {
/// Gets all available variables including variables from outer storage.
public var allValues: DivVariables {
(outerStorage?.allValues ?? [:]) + values
}

Expand Down Expand Up @@ -150,6 +151,10 @@ public final class DivVariableStorage {
}
}

public func addObserver(_ action: @escaping (ChangeEvent) -> Void) -> Disposable {
changeEvents.addObserver(action)
}

private func notify(_ event: ChangeEvent) {
onMainThread { [weak self] in
self?.changeEventsPipe.send(event)
Expand Down
2 changes: 1 addition & 1 deletion DivKit/Variables/DivVariablesStorage.swift
Original file line number Diff line number Diff line change
Expand Up @@ -106,7 +106,7 @@ public final class DivVariablesStorage {
public func append(
variables newVariables: DivVariables,
for cardId: DivCardID,
replaceExisting: Bool
replaceExisting: Bool = true
) {
let oldVariables = lock.read {
cardVariables[cardId] ?? [:]
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -25,10 +25,10 @@ public final class CustomImagePreviewExtensionHandler: DivExtensionHandler {
return block
}

let imageURL = div.resolveImageUrl(context.expressionResolver) ?? defaultImageURL
let placeholder: ImagePlaceholder = .view(viewFactory())

let imageHolder = context.imageHolderFactory.make(imageURL, placeholder)
let imageHolder = context.imageHolderFactory.make(
div.resolveImageUrl(context.expressionResolver) ?? defaultImageURL,
.view(viewFactory())
)
return block.makeCopy(with: imageHolder)
}
}
Expand Down
Loading

0 comments on commit ae162ff

Please sign in to comment.