Skip to content

Commit

Permalink
Release 30.18.0
Browse files Browse the repository at this point in the history
commit_hash:6304878a6e878a7ce55b33d8fe165f4ba69f5ca0
  • Loading branch information
robot-divkit committed Sep 16, 2024
1 parent 26610f1 commit c6bb9a6
Show file tree
Hide file tree
Showing 23 changed files with 336 additions and 96 deletions.
5 changes: 5 additions & 0 deletions .mapping.json
Original file line number Diff line number Diff line change
Expand Up @@ -907,6 +907,7 @@
"Specs/DivKit/30.15.0/DivKit.podspec":"divkit/public-ios/Specs/DivKit/30.15.0/DivKit.podspec",
"Specs/DivKit/30.16.0/DivKit.podspec":"divkit/public-ios/Specs/DivKit/30.16.0/DivKit.podspec",
"Specs/DivKit/30.17.0/DivKit.podspec":"divkit/public-ios/Specs/DivKit/30.17.0/DivKit.podspec",
"Specs/DivKit/30.18.0/DivKit.podspec":"divkit/public-ios/Specs/DivKit/30.18.0/DivKit.podspec",
"Specs/DivKit/30.2.0/DivKit.podspec":"divkit/public-ios/Specs/DivKit/30.2.0/DivKit.podspec",
"Specs/DivKit/30.3.0/DivKit.podspec":"divkit/public-ios/Specs/DivKit/30.3.0/DivKit.podspec",
"Specs/DivKit/30.4.0/DivKit.podspec":"divkit/public-ios/Specs/DivKit/30.4.0/DivKit.podspec",
Expand Down Expand Up @@ -976,6 +977,7 @@
"Specs/DivKitExtensions/30.15.0/DivKitExtensions.podspec":"divkit/public-ios/Specs/DivKitExtensions/30.15.0/DivKitExtensions.podspec",
"Specs/DivKitExtensions/30.16.0/DivKitExtensions.podspec":"divkit/public-ios/Specs/DivKitExtensions/30.16.0/DivKitExtensions.podspec",
"Specs/DivKitExtensions/30.17.0/DivKitExtensions.podspec":"divkit/public-ios/Specs/DivKitExtensions/30.17.0/DivKitExtensions.podspec",
"Specs/DivKitExtensions/30.18.0/DivKitExtensions.podspec":"divkit/public-ios/Specs/DivKitExtensions/30.18.0/DivKitExtensions.podspec",
"Specs/DivKitExtensions/30.2.0/DivKitExtensions.podspec":"divkit/public-ios/Specs/DivKitExtensions/30.2.0/DivKitExtensions.podspec",
"Specs/DivKitExtensions/30.3.0/DivKitExtensions.podspec":"divkit/public-ios/Specs/DivKitExtensions/30.3.0/DivKitExtensions.podspec",
"Specs/DivKitExtensions/30.4.0/DivKitExtensions.podspec":"divkit/public-ios/Specs/DivKitExtensions/30.4.0/DivKitExtensions.podspec",
Expand Down Expand Up @@ -1027,6 +1029,7 @@
"Specs/DivKit_LayoutKit/30.15.0/DivKit_LayoutKit.podspec":"divkit/public-ios/Specs/DivKit_LayoutKit/30.15.0/DivKit_LayoutKit.podspec",
"Specs/DivKit_LayoutKit/30.16.0/DivKit_LayoutKit.podspec":"divkit/public-ios/Specs/DivKit_LayoutKit/30.16.0/DivKit_LayoutKit.podspec",
"Specs/DivKit_LayoutKit/30.17.0/DivKit_LayoutKit.podspec":"divkit/public-ios/Specs/DivKit_LayoutKit/30.17.0/DivKit_LayoutKit.podspec",
"Specs/DivKit_LayoutKit/30.18.0/DivKit_LayoutKit.podspec":"divkit/public-ios/Specs/DivKit_LayoutKit/30.18.0/DivKit_LayoutKit.podspec",
"Specs/DivKit_LayoutKit/30.2.0/DivKit_LayoutKit.podspec":"divkit/public-ios/Specs/DivKit_LayoutKit/30.2.0/DivKit_LayoutKit.podspec",
"Specs/DivKit_LayoutKit/30.3.0/DivKit_LayoutKit.podspec":"divkit/public-ios/Specs/DivKit_LayoutKit/30.3.0/DivKit_LayoutKit.podspec",
"Specs/DivKit_LayoutKit/30.4.0/DivKit_LayoutKit.podspec":"divkit/public-ios/Specs/DivKit_LayoutKit/30.4.0/DivKit_LayoutKit.podspec",
Expand Down Expand Up @@ -1078,6 +1081,7 @@
"Specs/DivKit_LayoutKitInterface/30.15.0/DivKit_LayoutKitInterface.podspec":"divkit/public-ios/Specs/DivKit_LayoutKitInterface/30.15.0/DivKit_LayoutKitInterface.podspec",
"Specs/DivKit_LayoutKitInterface/30.16.0/DivKit_LayoutKitInterface.podspec":"divkit/public-ios/Specs/DivKit_LayoutKitInterface/30.16.0/DivKit_LayoutKitInterface.podspec",
"Specs/DivKit_LayoutKitInterface/30.17.0/DivKit_LayoutKitInterface.podspec":"divkit/public-ios/Specs/DivKit_LayoutKitInterface/30.17.0/DivKit_LayoutKitInterface.podspec",
"Specs/DivKit_LayoutKitInterface/30.18.0/DivKit_LayoutKitInterface.podspec":"divkit/public-ios/Specs/DivKit_LayoutKitInterface/30.18.0/DivKit_LayoutKitInterface.podspec",
"Specs/DivKit_LayoutKitInterface/30.2.0/DivKit_LayoutKitInterface.podspec":"divkit/public-ios/Specs/DivKit_LayoutKitInterface/30.2.0/DivKit_LayoutKitInterface.podspec",
"Specs/DivKit_LayoutKitInterface/30.3.0/DivKit_LayoutKitInterface.podspec":"divkit/public-ios/Specs/DivKit_LayoutKitInterface/30.3.0/DivKit_LayoutKitInterface.podspec",
"Specs/DivKit_LayoutKitInterface/30.4.0/DivKit_LayoutKitInterface.podspec":"divkit/public-ios/Specs/DivKit_LayoutKitInterface/30.4.0/DivKit_LayoutKitInterface.podspec",
Expand Down Expand Up @@ -1129,6 +1133,7 @@
"Specs/DivKit_Serialization/30.15.0/DivKit_Serialization.podspec":"divkit/public-ios/Specs/DivKit_Serialization/30.15.0/DivKit_Serialization.podspec",
"Specs/DivKit_Serialization/30.16.0/DivKit_Serialization.podspec":"divkit/public-ios/Specs/DivKit_Serialization/30.16.0/DivKit_Serialization.podspec",
"Specs/DivKit_Serialization/30.17.0/DivKit_Serialization.podspec":"divkit/public-ios/Specs/DivKit_Serialization/30.17.0/DivKit_Serialization.podspec",
"Specs/DivKit_Serialization/30.18.0/DivKit_Serialization.podspec":"divkit/public-ios/Specs/DivKit_Serialization/30.18.0/DivKit_Serialization.podspec",
"Specs/DivKit_Serialization/30.2.0/DivKit_Serialization.podspec":"divkit/public-ios/Specs/DivKit_Serialization/30.2.0/DivKit_Serialization.podspec",
"Specs/DivKit_Serialization/30.3.0/DivKit_Serialization.podspec":"divkit/public-ios/Specs/DivKit_Serialization/30.3.0/DivKit_Serialization.podspec",
"Specs/DivKit_Serialization/30.4.0/DivKit_Serialization.podspec":"divkit/public-ios/Specs/DivKit_Serialization/30.4.0/DivKit_Serialization.podspec",
Expand Down
5 changes: 4 additions & 1 deletion DivKit/Actions/FocusElementActionHandler.swift
Original file line number Diff line number Diff line change
Expand Up @@ -9,10 +9,13 @@ final class FocusElementActionHandler {
if let previousCard = context.blockStateStorage.getFocusedElement()?.cardId {
context.updateCard(.state(previousCard))
}

let cardId = context.path.cardId
let element = IdAndCardId(id: elementId, cardId: cardId)

context.blockStateStorage.setFocused(
isFocused: true,
element: IdAndCardId(id: elementId, cardId: cardId)
element: element
)
context.updateCard(.state(cardId))
}
Expand Down
67 changes: 38 additions & 29 deletions DivKit/DivBlockStateStorage.swift
Original file line number Diff line number Diff line change
Expand Up @@ -24,10 +24,16 @@ public final class DivBlockStateStorage {
public let state: ElementState
}

private enum FocusedElement: Equatable {
case none
case pathFocused(UIElementPath)
case idFocused(IdAndCardId)
}

public private(set) var states: BlocksState
private var statesById: [IdAndCardId: ElementState] = [:]
private var focusedElement: UIElementPath?
private var focusedElementById: IdAndCardId?

private var focusedElement: FocusedElement = .none
private let lock = AllocatedUnfairLock()
private let stateUpdatesPipe = SignalPipe<ChangeEvent>()

Expand Down Expand Up @@ -81,65 +87,69 @@ public final class DivBlockStateStorage {

public func setFocused(isFocused: Bool, element: IdAndCardId) {
lock.withLock {
if isFocused {
focusedElement = nil
focusedElementById = element
} else if self.isFocusedInternal(element: element) {
focusedElement = nil
focusedElementById = nil
}
focusedElement = isFocused ? .idFocused(element) : removeFocus(from: element)
}
}

public func setFocused(isFocused: Bool, path: UIElementPath) {
lock.withLock {
if isFocused {
focusedElement = path
focusedElementById = nil
} else if self.isFocusedInternal(path: path) {
focusedElement = nil
focusedElementById = nil
}
focusedElement = isFocused ? .pathFocused(path) : .none
}
}

public func clearFocus() {
lock.withLock {
focusedElement = nil
focusedElementById = nil
focusedElement = .none
}
}

public func isFocused(element: IdAndCardId) -> Bool {
lock.withLock {
isFocusedInternal(element: element)
isFocusedInternal(checkedElement: .idFocused(element))
}
}

public func isFocused(path: UIElementPath) -> Bool {
lock.withLock {
isFocusedInternal(path: path)
isFocusedInternal(checkedElement: .pathFocused(path))
}
}

private func isFocusedInternal(element: IdAndCardId) -> Bool {
getFocusedElement() == element
private func isFocusedInternal(checkedElement: FocusedElement) -> Bool {
switch (focusedElement, checkedElement) {
case (.none, _), (_, .none):
false
case let (.pathFocused(focusedPath), .pathFocused(checkedPath)):
focusedPath == checkedPath
case let (.idFocused(focusedId), .idFocused(checkedId)):
focusedId == checkedId
case let (.pathFocused(focusedPath), .idFocused(checkedId)):
IdAndCardId(path: focusedPath) == checkedId
case let (.idFocused(focusedId), .pathFocused(checkedPath)):
focusedId == IdAndCardId(path: checkedPath)
}
}

private func isFocusedInternal(path: UIElementPath) -> Bool {
focusedElement == path || focusedElementById == IdAndCardId(path: path)
private func removeFocus(from element: IdAndCardId) -> FocusedElement {
isFocusedInternal(checkedElement: FocusedElement.idFocused(element)) ? .none : focusedElement
}

public func getFocusedElement() -> IdAndCardId? {
focusedElementById ?? focusedElement.map(IdAndCardId.init)
switch focusedElement {
case .none:
nil
case let .pathFocused(focusedPath):
IdAndCardId(path: focusedPath)
case let .idFocused(focusedId):
focusedId
}
}

public func reset() {
lock.withLock {
states = [:]
statesById = [:]
focusedElement = nil
focusedElementById = nil
focusedElement = .none
}
}

Expand All @@ -148,8 +158,7 @@ public final class DivBlockStateStorage {
states = states.filter { $0.key.root != cardId.rawValue }
statesById = statesById.filter { $0.key.cardId != cardId }
if getFocusedElement()?.cardId == cardId {
focusedElement = nil
focusedElementById = nil
focusedElement = .none
}
}
}
Expand Down
10 changes: 9 additions & 1 deletion DivKit/DivFlagsInfo.swift
Original file line number Diff line number Diff line change
Expand Up @@ -9,11 +9,19 @@ public struct DivFlagsInfo {
/// Enable experimental image loading optimization
public let imageLoadingOptimizationEnabled: Bool

/// Experimental tint/blur effect renderer
public let imageBlurPreferMetal: Bool
public let imageTintPreferMetal: Bool

/// Creates an instance of `DivFlagsInfo`.
public init(
imageLoadingOptimizationEnabled: Bool = true
imageLoadingOptimizationEnabled: Bool = true,
imageBlurPreferMetal: Bool = true,
imageTintPreferMetal: Bool = true
) {
self.imageLoadingOptimizationEnabled = imageLoadingOptimizationEnabled
self.imageBlurPreferMetal = imageBlurPreferMetal
self.imageTintPreferMetal = imageTintPreferMetal
}

/// The default instance of `DivFlagsInfo`.
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 = "30.17.0"
public static let version = "30.18.0"
}
4 changes: 3 additions & 1 deletion DivKit/Extensions/DivImage/DivImageExtensions.swift
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,9 @@ extension DivImage: DivBlockModeling, DivImageProtocol {
tintColor: resolveTintColor(expressionResolver),
tintMode: resolveTintMode(expressionResolver).tintMode,
effects: resolveEffects(expressionResolver),
appearanceAnimation: appearanceAnimation?.resolve(expressionResolver)
appearanceAnimation: appearanceAnimation?.resolve(expressionResolver),
blurUsingMetal: context.flagsInfo.imageBlurPreferMetal,
tintUsingMetal: context.flagsInfo.imageTintPreferMetal
)
}
}
Expand Down
3 changes: 2 additions & 1 deletion DivKit/Extensions/DivInputExtensions.swift
Original file line number Diff line number Diff line change
Expand Up @@ -76,7 +76,8 @@ extension DivInput: DivBlockModeling {
textAlignmentHorizontal: resolveTextAlignmentHorizontal(expressionResolver).textAlignment,
textAlignmentVertical: resolveTextAlignmentVertical(expressionResolver).textAlignment,
paddings: paddings?.resolve(context),
isEnabled: resolveIsEnabled(expressionResolver)
isEnabled: resolveIsEnabled(expressionResolver),
maxLength: resolveMaxLength(expressionResolver)
)
}

Expand Down
27 changes: 18 additions & 9 deletions DivKit/Extensions/DivStateExtensions.swift
Original file line number Diff line number Diff line change
Expand Up @@ -52,7 +52,8 @@ extension DivState: DivBlockModeling {
let previousState = getPreviousState(stateManagerItem: stateManagerItem),
previousState.stateId != activeStateId,
let previousDiv = previousState.div {
context.triggersStorage?.disableTriggers(path: context.parentPath + id + previousState.stateId)
context.triggersStorage?
.disableTriggers(path: context.parentPath + id + previousState.stateId)
context.triggersStorage?.enableTriggers(path: context.parentPath + id + activeStateId)

// state changed -> drop visibility cache for all children
Expand Down Expand Up @@ -94,21 +95,29 @@ extension DivState: DivBlockModeling {
let stateAlignment = activeStateDiv?
.resolveAlignment(context, defaultAlignment: defaultStateAlignment)
?? defaultStateAlignment

return LayeredBlock(
widthTrait: resolveContentWidthTrait(context),
heightTrait: resolveContentHeightTrait(context),
children: [
LayeredBlock.Child(
let child: LayeredBlock.Child = {
if animationOut == nil, animationIn == nil {
return LayeredBlock.Child(
content: activeBlock,
alignment: stateAlignment
)
} else {
return LayeredBlock.Child(
content: TransitioningBlock(
from: previousBlock,
to: activeBlock,
animationOut: animationOut,
animationIn: animationIn
),
alignment: stateAlignment
),
]
)
}
}()

return LayeredBlock(
widthTrait: resolveContentWidthTrait(context),
heightTrait: resolveContentHeightTrait(context),
children: [child]
).addingStateBlock(
ids: stateManager.getVisibleIds(statePath: activeStatePath)
)
Expand Down
7 changes: 7 additions & 0 deletions DivKit/Templates/Field.swift
Original file line number Diff line number Diff line change
Expand Up @@ -122,6 +122,13 @@ extension Field where T: ValidSerializationValue {
}

extension Field where T: RawRepresentable, T.RawValue: ValidSerializationValue {
@inlinable
func resolveValue(
context: TemplatesContext
) -> DeserializationResult<T> {
resolveValue(context: context, transform: T.init(rawValue:))
}

@inlinable
func resolveOptionalValue(
context: TemplatesContext,
Expand Down
6 changes: 4 additions & 2 deletions LayoutKit/LayoutKit/Blocks/DetachableAnimationBlock.swift
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@ public struct ChangeBoundsTransition: Equatable {
}
}

public final class DetachableAnimationBlock: WrapperBlock, LayoutCachingDefaultImpl {
public final class DetachableAnimationBlock: WrapperBlock, LayoutCachingDefaultImpl, Identifiable {
public let child: Block
public let id: String
public let animationIn: [TransitioningAnimation]?
Expand Down Expand Up @@ -74,7 +74,9 @@ extension DetachableAnimationBlock: CustomDebugStringConvertible {

extension DetachableAnimationBlock: ElementStateUpdating {
public func updated(withStates _: BlocksState) throws -> Self {
Self(
guard animationIn != nil else { return self }

return Self(
child: child,
id: id,
animationIn: nil,
Expand Down
4 changes: 3 additions & 1 deletion LayoutKit/LayoutKit/Blocks/ImageBlock+Copy.swift
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,9 @@ extension ImageBlock {
tintColor: tintColor,
tintMode: tintMode,
effects: effects,
accessibilityElement: accessibilityElement
accessibilityElement: accessibilityElement,
blurUsingMetal: blurUsingMetal,
tintUsingMetal: tintUsingMetal
)
}
}
24 changes: 19 additions & 5 deletions LayoutKit/LayoutKit/Blocks/ImageBlock.swift
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,8 @@ public final class ImageBlock: ImageBaseBlock {
public let effects: [ImageEffect]
public let accessibilityElement: AccessibilityElement?
public let appearanceAnimation: TransitioningAnimation?
public let blurUsingMetal: Bool?
public let tintUsingMetal: Bool?

public init(
imageHolder: ImageHolder,
Expand All @@ -23,7 +25,9 @@ public final class ImageBlock: ImageBaseBlock {
tintMode: TintMode,
effects: [ImageEffect] = [],
accessibilityElement: AccessibilityElement? = nil,
appearanceAnimation: TransitioningAnimation? = nil
appearanceAnimation: TransitioningAnimation? = nil,
blurUsingMetal: Bool? = nil,
tintUsingMetal: Bool? = nil
) {
self.imageHolder = imageHolder
self.widthTrait = widthTrait
Expand All @@ -34,6 +38,8 @@ public final class ImageBlock: ImageBaseBlock {
self.effects = effects
self.accessibilityElement = accessibilityElement
self.appearanceAnimation = appearanceAnimation
self.blurUsingMetal = blurUsingMetal
self.tintUsingMetal = tintUsingMetal
}

public convenience init(
Expand All @@ -45,7 +51,9 @@ public final class ImageBlock: ImageBaseBlock {
tintMode: TintMode = .sourceIn,
effects: [ImageEffect] = [],
accessibilityElement: AccessibilityElement? = nil,
appearanceAnimation: TransitioningAnimation? = nil
appearanceAnimation: TransitioningAnimation? = nil,
blurUsingMetal: Bool? = nil,
tintUsingMetal: Bool? = nil
) {
self.init(
imageHolder: imageHolder,
Expand All @@ -56,7 +64,9 @@ public final class ImageBlock: ImageBaseBlock {
tintMode: tintMode,
effects: effects,
accessibilityElement: accessibilityElement,
appearanceAnimation: appearanceAnimation
appearanceAnimation: appearanceAnimation,
blurUsingMetal: blurUsingMetal,
tintUsingMetal: tintUsingMetal
)
}

Expand All @@ -68,7 +78,9 @@ public final class ImageBlock: ImageBaseBlock {
tintMode: TintMode = .sourceIn,
effects: [ImageEffect] = [],
accessibilityElement: AccessibilityElement? = nil,
appearanceAnimation: TransitioningAnimation? = nil
appearanceAnimation: TransitioningAnimation? = nil,
blurUsingMetal: Bool? = nil,
tintUsingMetal: Bool? = nil
) {
self.init(
imageHolder: imageHolder,
Expand All @@ -79,7 +91,9 @@ public final class ImageBlock: ImageBaseBlock {
tintMode: tintMode,
effects: effects,
accessibilityElement: accessibilityElement,
appearanceAnimation: appearanceAnimation
appearanceAnimation: appearanceAnimation,
blurUsingMetal: blurUsingMetal,
tintUsingMetal: tintUsingMetal
)
}

Expand Down
Loading

0 comments on commit c6bb9a6

Please sign in to comment.