Update gif provider attribution

This commit is contained in:
Ilya Laktyushin 2020-06-05 18:43:07 +03:00
parent 20a381c595
commit c2ab9b9caf
6 changed files with 88 additions and 10 deletions

View File

@ -0,0 +1,22 @@
{
"images" : [
{
"idiom" : "universal",
"scale" : "1x"
},
{
"filename" : "tenor@2x.png",
"idiom" : "universal",
"scale" : "2x"
},
{
"filename" : "tenor@3x.png",
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 13 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 21 KiB

View File

@ -104,6 +104,18 @@ private func selectionChangedSignal(selectionState: TGMediaSelectionContext) ->
} }
} }
public struct WebSearchConfiguration: Equatable {
public let gifProvider: String?
public init(appConfiguration: AppConfiguration) {
var gifProvider: String? = nil
if let data = appConfiguration.data, let value = data["gif_search_branding"] as? String {
gifProvider = value
}
self.gifProvider = gifProvider
}
}
public final class WebSearchController: ViewController { public final class WebSearchController: ViewController {
private var validLayout: ContainerViewLayout? private var validLayout: ContainerViewLayout?
@ -165,9 +177,19 @@ public final class WebSearchController: ViewController {
return WebSearchSettings.defaultSettings return WebSearchSettings.defaultSettings
} }
} }
let gifProvider = self.context.account.postbox.preferencesView(keys: [PreferencesKeys.appConfiguration])
|> map { view -> String? in
guard let appConfiguration = view.values[PreferencesKeys.appConfiguration] as? AppConfiguration else {
return nil
}
let configuration = WebSearchConfiguration(appConfiguration: appConfiguration)
return configuration.gifProvider
}
|> distinctUntilChanged
self.disposable = ((combineLatest(settings, context.sharedContext.presentationData)) self.disposable = ((combineLatest(settings, context.sharedContext.presentationData, gifProvider))
|> deliverOnMainQueue).start(next: { [weak self] settings, presentationData in |> deliverOnMainQueue).start(next: { [weak self] settings, presentationData, gifProvider in
guard let strongSelf = self else { guard let strongSelf = self else {
return return
} }
@ -179,6 +201,9 @@ public final class WebSearchController: ViewController {
if current.presentationData !== presentationData { if current.presentationData !== presentationData {
updated = updated.withUpdatedPresentationData(presentationData) updated = updated.withUpdatedPresentationData(presentationData)
} }
if current.gifProvider != gifProvider {
updated = updated.withUpdatedGifProvider(gifProvider)
}
return updated return updated
} }
}) })
@ -310,13 +335,14 @@ public final class WebSearchController: ViewController {
let previousInterfaceState = self.interfaceState let previousInterfaceState = self.interfaceState
let previousTheme = self.interfaceState.presentationData.theme let previousTheme = self.interfaceState.presentationData.theme
let previousStrings = self.interfaceState.presentationData.theme let previousStrings = self.interfaceState.presentationData.theme
let previousGifProvider = self.interfaceState.gifProvider
let updatedInterfaceState = f(self.interfaceState) let updatedInterfaceState = f(self.interfaceState)
self.interfaceState = updatedInterfaceState self.interfaceState = updatedInterfaceState
self.interfaceStatePromise.set(updatedInterfaceState) self.interfaceStatePromise.set(updatedInterfaceState)
if self.isNodeLoaded { if self.isNodeLoaded {
if previousTheme !== updatedInterfaceState.presentationData.theme || previousStrings !== updatedInterfaceState.presentationData.strings { if previousTheme !== updatedInterfaceState.presentationData.theme || previousStrings !== updatedInterfaceState.presentationData.strings || previousGifProvider != updatedInterfaceState.gifProvider {
self.controllerNode.updatePresentationData(theme: updatedInterfaceState.presentationData.theme, strings: updatedInterfaceState.presentationData.strings) self.controllerNode.updatePresentationData(theme: updatedInterfaceState.presentationData.theme, strings: updatedInterfaceState.presentationData.strings)
} }
if previousInterfaceState != self.interfaceState { if previousInterfaceState != self.interfaceState {

View File

@ -348,8 +348,26 @@ class WebSearchControllerNode: ASDisplayNode {
self.segmentedControlNode.updateTheme(SegmentedControlTheme(theme: self.theme)) self.segmentedControlNode.updateTheme(SegmentedControlTheme(theme: self.theme))
self.toolbarBackgroundNode.backgroundColor = self.theme.rootController.navigationBar.backgroundColor self.toolbarBackgroundNode.backgroundColor = self.theme.rootController.navigationBar.backgroundColor
self.toolbarSeparatorNode.backgroundColor = self.theme.rootController.navigationBar.separatorColor self.toolbarSeparatorNode.backgroundColor = self.theme.rootController.navigationBar.separatorColor
}
self.attributionNode.image = generateTintedImage(image: UIImage(bundleImageName: "Media Grid/Giphy"), color: self.theme.list.itemSecondaryTextColor)
let gifProviderImage: UIImage?
if let gifProvider = self.webSearchInterfaceState.gifProvider {
switch gifProvider {
case "tenor":
gifProviderImage = generateTintedImage(image: UIImage(bundleImageName: "Media Grid/Tenor"), color: self.theme.list.itemSecondaryTextColor)
case "giphy":
gifProviderImage = generateTintedImage(image: UIImage(bundleImageName: "Media Grid/Giphy"), color: self.theme.list.itemSecondaryTextColor)
default:
gifProviderImage = nil
}
} else {
gifProviderImage = nil
}
let previousGifProviderImage = self.attributionNode.image
self.attributionNode.image = gifProviderImage
if previousGifProviderImage == nil, let validLayout = self.containerLayout {
self.containerLayoutUpdated(validLayout.0, navigationBarHeight: validLayout.1, transition: .immediate)
} }
} }
@ -386,7 +404,7 @@ class WebSearchControllerNode: ASDisplayNode {
transition.updateFrame(node: self.toolbarSeparatorNode, frame: CGRect(origin: CGPoint(x: 0.0, y: toolbarY), size: CGSize(width: layout.size.width, height: UIScreenPixel))) transition.updateFrame(node: self.toolbarSeparatorNode, frame: CGRect(origin: CGPoint(x: 0.0, y: toolbarY), size: CGSize(width: layout.size.width, height: UIScreenPixel)))
if let image = self.attributionNode.image { if let image = self.attributionNode.image {
transition.updateFrame(node: self.attributionNode, frame: CGRect(origin: CGPoint(x: floor((layout.size.width - image.size.width) / 2.0), y: toolbarY + floor((toolbarHeight - image.size.height) / 2.0)), size: image.size)) self.attributionNode.frame = CGRect(origin: CGPoint(x: floor((layout.size.width - image.size.width) / 2.0), y: toolbarY + floor((toolbarHeight - image.size.height) / 2.0)), size: image.size)
transition.updateAlpha(node: self.attributionNode, alpha: self.webSearchInterfaceState.state?.scope == .gifs ? 1.0 : 0.0) transition.updateAlpha(node: self.attributionNode, alpha: self.webSearchInterfaceState.state?.scope == .gifs ? 1.0 : 0.0)
} }
@ -456,6 +474,7 @@ class WebSearchControllerNode: ASDisplayNode {
} }
func updateInterfaceState(_ interfaceState: WebSearchInterfaceState, animated: Bool) { func updateInterfaceState(_ interfaceState: WebSearchInterfaceState, animated: Bool) {
let previousGifProvider = self.webSearchInterfaceState.gifProvider
self.webSearchInterfaceState = interfaceState self.webSearchInterfaceState = interfaceState
self.webSearchInterfaceStatePromise.set(self.webSearchInterfaceState) self.webSearchInterfaceStatePromise.set(self.webSearchInterfaceState)
@ -463,6 +482,10 @@ class WebSearchControllerNode: ASDisplayNode {
self.segmentedControlNode.selectedIndex = Int(state.scope.rawValue) self.segmentedControlNode.selectedIndex = Int(state.scope.rawValue)
} }
if previousGifProvider != interfaceState.gifProvider {
self.applyPresentationData(themeUpdated: false)
}
if let validLayout = self.containerLayout { if let validLayout = self.containerLayout {
self.containerLayoutUpdated(validLayout.0, navigationBarHeight: validLayout.1, transition: animated ? .animated(duration: 0.4, curve: .spring) : .immediate) self.containerLayoutUpdated(validLayout.0, navigationBarHeight: validLayout.1, transition: animated ? .animated(duration: 0.4, curve: .spring) : .immediate)
} }

View File

@ -11,26 +11,33 @@ struct WebSearchInterfaceInnerState: Equatable {
struct WebSearchInterfaceState: Equatable { struct WebSearchInterfaceState: Equatable {
let state: WebSearchInterfaceInnerState? let state: WebSearchInterfaceInnerState?
let presentationData: PresentationData let presentationData: PresentationData
let gifProvider: String?
init (presentationData: PresentationData) { init (presentationData: PresentationData) {
self.state = nil self.state = nil
self.presentationData = presentationData self.presentationData = presentationData
self.gifProvider = nil
} }
init(state: WebSearchInterfaceInnerState?, presentationData: PresentationData) { init(state: WebSearchInterfaceInnerState?, presentationData: PresentationData, gifProvider: String? = nil) {
self.state = state self.state = state
self.presentationData = presentationData self.presentationData = presentationData
self.gifProvider = gifProvider
} }
func withUpdatedScope(_ scope: WebSearchScope) -> WebSearchInterfaceState { func withUpdatedScope(_ scope: WebSearchScope) -> WebSearchInterfaceState {
return WebSearchInterfaceState(state: WebSearchInterfaceInnerState(scope: scope, query: self.state?.query ?? ""), presentationData: self.presentationData) return WebSearchInterfaceState(state: WebSearchInterfaceInnerState(scope: scope, query: self.state?.query ?? ""), presentationData: self.presentationData, gifProvider: self.gifProvider)
} }
func withUpdatedQuery(_ query: String) -> WebSearchInterfaceState { func withUpdatedQuery(_ query: String) -> WebSearchInterfaceState {
return WebSearchInterfaceState(state: WebSearchInterfaceInnerState(scope: self.state?.scope ?? .images, query: query), presentationData: self.presentationData) return WebSearchInterfaceState(state: WebSearchInterfaceInnerState(scope: self.state?.scope ?? .images, query: query), presentationData: self.presentationData, gifProvider: self.gifProvider)
} }
func withUpdatedPresentationData(_ presentationData: PresentationData) -> WebSearchInterfaceState { func withUpdatedPresentationData(_ presentationData: PresentationData) -> WebSearchInterfaceState {
return WebSearchInterfaceState(state: self.state, presentationData: presentationData) return WebSearchInterfaceState(state: self.state, presentationData: presentationData, gifProvider: self.gifProvider)
}
func withUpdatedGifProvider(_ gifProvider: String?) -> WebSearchInterfaceState {
return WebSearchInterfaceState(state: self.state, presentationData: self.presentationData, gifProvider: gifProvider)
} }
} }