Merge branch 'feature/ONEAPP-7249' into 'develop'
Digital PCT265 story ONEAPP-7249 - Enhancement for allowing background polling. ### Summary 1. Logging change for less verbose logging statements and standardization. Used to help tracking pollingBehavior state. 2. Optimizations to reduce scrolling stagger on refresh. 3. Reduce layout row tearing. ### JIRA Ticket https://onejira.verizon.com/browse/ONEAPP-7249 See merge request https://gitlab.verizon.com/BPHV_MIPS/mvm_core/-/merge_requests/328
This commit is contained in:
commit
a00eff7cf1
@ -64,4 +64,19 @@ public struct ActionActionsModel: ActionModelProtocol {
|
|||||||
try container.encodeIfPresent(extraParameters, forKey: .extraParameters)
|
try container.encodeIfPresent(extraParameters, forKey: .extraParameters)
|
||||||
try container.encodeIfPresent(analyticsData, forKey: .analyticsData)
|
try container.encodeIfPresent(analyticsData, forKey: .analyticsData)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public func isEqual(to model: any ModelComparisonProtocol) -> Bool {
|
||||||
|
guard let model = model as? Self else { return false }
|
||||||
|
return actions.isEqual(to: model.actions)
|
||||||
|
&& concurrent == model.concurrent
|
||||||
|
&& extraParameters == model.extraParameters
|
||||||
|
&& analyticsData == model.analyticsData
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
extension ActionActionsModel: CustomDebugStringConvertible {
|
||||||
|
|
||||||
|
public var debugDescription: String {
|
||||||
|
return "\(Self.self) [\(actions)]"
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -25,4 +25,12 @@ public struct ActionBackModel: ActionModelProtocol {
|
|||||||
self.extraParameters = extraParameters
|
self.extraParameters = extraParameters
|
||||||
self.analyticsData = analyticsData
|
self.analyticsData = analyticsData
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Default
|
||||||
|
public func isEqual(to model: any ModelComparisonProtocol) -> Bool {
|
||||||
|
guard let model = model as? Self else { return false }
|
||||||
|
return model.actionType == actionType
|
||||||
|
&& model.extraParameters == extraParameters
|
||||||
|
&& model.analyticsData == analyticsData
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -28,4 +28,11 @@ public struct ActionCallModel: ActionModelProtocol {
|
|||||||
self.extraParameters = extraParameters
|
self.extraParameters = extraParameters
|
||||||
self.analyticsData = analyticsData
|
self.analyticsData = analyticsData
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public func isEqual(to model: any ModelComparisonProtocol) -> Bool {
|
||||||
|
guard let model = model as? Self else { return false }
|
||||||
|
return extraParameters == model.extraParameters
|
||||||
|
&& analyticsData == model.analyticsData
|
||||||
|
&& callNumber == model.callNumber
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -25,4 +25,12 @@ public struct ActionCancelModel: ActionModelProtocol {
|
|||||||
self.extraParameters = extraParameters
|
self.extraParameters = extraParameters
|
||||||
self.analyticsData = analyticsData
|
self.analyticsData = analyticsData
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Default
|
||||||
|
public func isEqual(to model: any ModelComparisonProtocol) -> Bool {
|
||||||
|
guard let model = model as? Self else { return false }
|
||||||
|
return model.actionType == actionType
|
||||||
|
&& model.extraParameters == extraParameters
|
||||||
|
&& model.analyticsData == analyticsData
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -42,4 +42,14 @@ public struct ActionContactModel: ActionModelProtocol {
|
|||||||
self.extraParameters = extraParameters
|
self.extraParameters = extraParameters
|
||||||
self.analyticsData = analyticsData
|
self.analyticsData = analyticsData
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public func isEqual(to model: any ModelComparisonProtocol) -> Bool {
|
||||||
|
guard let model = model as? Self else { return false }
|
||||||
|
return extraParameters == model.extraParameters
|
||||||
|
&& analyticsData == model.analyticsData
|
||||||
|
&& phoneNumber == model.phoneNumber
|
||||||
|
&& firstName == model.firstName
|
||||||
|
&& lastName == model.lastName
|
||||||
|
&& approach == model.approach
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -7,6 +7,7 @@
|
|||||||
//
|
//
|
||||||
|
|
||||||
public struct ActionNoopModel: ActionModelProtocol {
|
public struct ActionNoopModel: ActionModelProtocol {
|
||||||
|
|
||||||
//--------------------------------------------------
|
//--------------------------------------------------
|
||||||
// MARK: - Properties
|
// MARK: - Properties
|
||||||
//--------------------------------------------------
|
//--------------------------------------------------
|
||||||
@ -24,4 +25,12 @@ public struct ActionNoopModel: ActionModelProtocol {
|
|||||||
self.extraParameters = extraParameters
|
self.extraParameters = extraParameters
|
||||||
self.analyticsData = analyticsData
|
self.analyticsData = analyticsData
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Default
|
||||||
|
public func isEqual(to model: any ModelComparisonProtocol) -> Bool {
|
||||||
|
guard let model = model as? Self else { return false }
|
||||||
|
return model.actionType == actionType
|
||||||
|
&& model.extraParameters == extraParameters
|
||||||
|
&& model.analyticsData == analyticsData
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -115,4 +115,31 @@ public struct ActionOpenPageModel: ActionModelProtocol, ActionOpenPageProtocol,
|
|||||||
try container.encodeIfPresent(analyticsData, forKey: .analyticsData)
|
try container.encodeIfPresent(analyticsData, forKey: .analyticsData)
|
||||||
try container.encodeIfPresent(fallbackResponse, forKey: .fallbackResponse)
|
try container.encodeIfPresent(fallbackResponse, forKey: .fallbackResponse)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public func isEqual(to model: any ModelComparisonProtocol) -> Bool {
|
||||||
|
guard let model = model as? Self else { return false }
|
||||||
|
return pageType == model.pageType
|
||||||
|
&& baseURL == model.baseURL
|
||||||
|
&& appContext == model.appContext
|
||||||
|
&& requestURL == model.requestURL
|
||||||
|
&& modules == model.modules
|
||||||
|
&& presentationStyle == model.presentationStyle
|
||||||
|
&& tabBarIndex == model.tabBarIndex
|
||||||
|
&& background == model.background
|
||||||
|
&& clientParameters == model.clientParameters
|
||||||
|
&& customTimeoutTime == model.customTimeoutTime
|
||||||
|
&& extraParameters == model.extraParameters
|
||||||
|
&& analyticsData == model.analyticsData
|
||||||
|
&& fallbackResponse == model.fallbackResponse
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
extension ActionOpenPageModel: CustomDebugStringConvertible {
|
||||||
|
public var debugDescription: String {
|
||||||
|
if let requestURL {
|
||||||
|
return "\(Self.self) for \(pageType) @ \(requestURL)"
|
||||||
|
} else {
|
||||||
|
return "\(Self.self) for \(pageType)"
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -30,4 +30,13 @@ public struct ActionOpenSMSModel: ActionModelProtocol {
|
|||||||
self.extraParameters = extraParameters
|
self.extraParameters = extraParameters
|
||||||
self.analyticsData = analyticsData
|
self.analyticsData = analyticsData
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Default
|
||||||
|
public func isEqual(to model: any ModelComparisonProtocol) -> Bool {
|
||||||
|
guard let model = model as? Self else { return false }
|
||||||
|
return model.extraParameters == extraParameters
|
||||||
|
&& model.analyticsData == analyticsData
|
||||||
|
&& model.phoneNumber == phoneNumber
|
||||||
|
&& model.message == message
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -60,4 +60,13 @@ open class ActionOpenUrlModel: ActionModelProtocol {
|
|||||||
try container.encodeIfPresent(extraParameters, forKey: .extraParameters)
|
try container.encodeIfPresent(extraParameters, forKey: .extraParameters)
|
||||||
try container.encodeIfPresent(analyticsData, forKey: .analyticsData)
|
try container.encodeIfPresent(analyticsData, forKey: .analyticsData)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public func isEqual(to model: any ModelComparisonProtocol) -> Bool {
|
||||||
|
guard let model = model as? Self else { return false }
|
||||||
|
return extraParameters == model.extraParameters
|
||||||
|
&& analyticsData == model.analyticsData
|
||||||
|
&& browserUrl == model.browserUrl
|
||||||
|
&& appURL == model.appURL
|
||||||
|
&& appURLOptions == model.appURLOptions
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -25,4 +25,12 @@ public struct ActionPreviousSubmitModel: ActionModelProtocol {
|
|||||||
self.extraParameters = extraParameters
|
self.extraParameters = extraParameters
|
||||||
self.analyticsData = analyticsData
|
self.analyticsData = analyticsData
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Default
|
||||||
|
public func isEqual(to model: any ModelComparisonProtocol) -> Bool {
|
||||||
|
guard let model = model as? Self else { return false }
|
||||||
|
return model.actionType == actionType
|
||||||
|
&& model.extraParameters == extraParameters
|
||||||
|
&& model.analyticsData == analyticsData
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -32,4 +32,12 @@ public struct ActionRestartModel: ActionModelProtocol {
|
|||||||
self.extraParameters = extraParameters
|
self.extraParameters = extraParameters
|
||||||
self.analyticsData = analyticsData
|
self.analyticsData = analyticsData
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public func isEqual(to model: any ModelComparisonProtocol) -> Bool {
|
||||||
|
guard let model = model as? Self else { return false }
|
||||||
|
return extraParameters == model.extraParameters
|
||||||
|
&& analyticsData == model.analyticsData
|
||||||
|
&& requestURL == model.requestURL
|
||||||
|
&& pageType == model.pageType
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -25,4 +25,10 @@ public struct ActionSettingModel: ActionModelProtocol {
|
|||||||
self.extraParameters = extraParameters
|
self.extraParameters = extraParameters
|
||||||
self.analyticsData = analyticsData
|
self.analyticsData = analyticsData
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public func isEqual(to model: any ModelComparisonProtocol) -> Bool {
|
||||||
|
guard let model = model as? Self else { return false }
|
||||||
|
return extraParameters == model.extraParameters
|
||||||
|
&& analyticsData == model.analyticsData
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -6,7 +6,7 @@
|
|||||||
// Copyright © 2020 myverizon. All rights reserved.
|
// Copyright © 2020 myverizon. All rights reserved.
|
||||||
//
|
//
|
||||||
|
|
||||||
public struct ActionShareItemModel: Codable {
|
public struct ActionShareItemModel: Codable, Equatable {
|
||||||
|
|
||||||
public enum SharedType: String, Codable {
|
public enum SharedType: String, Codable {
|
||||||
case text
|
case text
|
||||||
@ -14,14 +14,14 @@ public struct ActionShareItemModel: Codable {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public var type: SharedType
|
public var type: SharedType
|
||||||
public var value: Any
|
public var value: AnyHashable // Common Equatable type between String and URL.
|
||||||
|
|
||||||
private enum CodingKeys: String, CodingKey {
|
private enum CodingKeys: String, CodingKey {
|
||||||
case type
|
case type
|
||||||
case value
|
case value
|
||||||
}
|
}
|
||||||
|
|
||||||
public init(type: SharedType, value: Any) {
|
public init(type: SharedType, value: AnyHashable) {
|
||||||
self.type = type
|
self.type = type
|
||||||
self.value = value
|
self.value = value
|
||||||
}
|
}
|
||||||
@ -47,6 +47,11 @@ public struct ActionShareItemModel: Codable {
|
|||||||
try container.encode(value as! URL, forKey: .value)
|
try container.encode(value as! URL, forKey: .value)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static func == (lhs: ActionShareItemModel, rhs: ActionShareItemModel) -> Bool {
|
||||||
|
return lhs.type == rhs.type
|
||||||
|
&& lhs.value == rhs.value
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public struct ActionShareModel: ActionModelProtocol {
|
public struct ActionShareModel: ActionModelProtocol {
|
||||||
@ -101,7 +106,7 @@ public struct ActionShareModel: ActionModelProtocol {
|
|||||||
private init(deprecatedFrom decoder: Decoder) throws {
|
private init(deprecatedFrom decoder: Decoder) throws {
|
||||||
let typeContainer = try decoder.container(keyedBy: DeprecatedCodingKeys.self)
|
let typeContainer = try decoder.container(keyedBy: DeprecatedCodingKeys.self)
|
||||||
let type = try typeContainer.decode(ActionShareItemModel.SharedType.self, forKey: .sharedType)
|
let type = try typeContainer.decode(ActionShareItemModel.SharedType.self, forKey: .sharedType)
|
||||||
var value: Any
|
var value: AnyHashable
|
||||||
switch type {
|
switch type {
|
||||||
case .url:
|
case .url:
|
||||||
value = try typeContainer.decode(URL.self, forKey: .sharedText)
|
value = try typeContainer.decode(URL.self, forKey: .sharedText)
|
||||||
@ -116,4 +121,11 @@ public struct ActionShareModel: ActionModelProtocol {
|
|||||||
try container.encode(actionType, forKey: .actionType)
|
try container.encode(actionType, forKey: .actionType)
|
||||||
try container.encode(items, forKey: .items)
|
try container.encode(items, forKey: .items)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public func isEqual(to model: any ModelComparisonProtocol) -> Bool {
|
||||||
|
guard let model = model as? Self else { return false }
|
||||||
|
return extraParameters == model.extraParameters
|
||||||
|
&& analyticsData == model.analyticsData
|
||||||
|
&& items == model.items
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -85,9 +85,9 @@ public protocol MVMCoreJSONActionHandlerProtocol: MVMCoreActionHandlerProtocol {
|
|||||||
open func handleAction(with model: ActionModelProtocol, additionalData: [AnyHashable: Any]?, delegateObject: DelegateObject?) async throws {
|
open func handleAction(with model: ActionModelProtocol, additionalData: [AnyHashable: Any]?, delegateObject: DelegateObject?) async throws {
|
||||||
try Task.checkCancellation()
|
try Task.checkCancellation()
|
||||||
var (additionalData, uuid) = MVMCoreActionHandler.setUUID(additionalData: additionalData)
|
var (additionalData, uuid) = MVMCoreActionHandler.setUUID(additionalData: additionalData)
|
||||||
MVMCoreActionHandler.log(string: "Begin Action: \(model.actionType)", additionalData: additionalData)
|
MVMCoreActionHandler.log(string: "Begin Action: \(model)", additionalData: additionalData)
|
||||||
defer {
|
defer {
|
||||||
MVMCoreActionHandler.log(string: "End Action: \(model.actionType)", additionalData: additionalData)
|
MVMCoreActionHandler.log(string: "End Action: \(model)", additionalData: additionalData)
|
||||||
}
|
}
|
||||||
let json = try additionalData.removeValue(forKey: jsonKey) as? [AnyHashable : Any] ?? MVMCoreActionHandler.convertActionToJSON(model)
|
let json = try additionalData.removeValue(forKey: jsonKey) as? [AnyHashable : Any] ?? MVMCoreActionHandler.convertActionToJSON(model)
|
||||||
|
|
||||||
@ -148,7 +148,7 @@ public protocol MVMCoreJSONActionHandlerProtocol: MVMCoreActionHandlerProtocol {
|
|||||||
}
|
}
|
||||||
|
|
||||||
static public func log(string: String, additionalData: [AnyHashable: Any]?) {
|
static public func log(string: String, additionalData: [AnyHashable: Any]?) {
|
||||||
MVMCoreLoggingHandler.logDebugMessage(withDelegate: "ActionHandler: UUID: \(String(describing: getUUID(additionalData: additionalData))), \(string)")
|
MVMCoreLoggingHandler.shared()?.handleDebugMessage("ActionHandler: UUID: \(getUUID(additionalData: additionalData) ?? "untracked"), \(string)", category: String(describing: Self.self))
|
||||||
}
|
}
|
||||||
|
|
||||||
fileprivate func logActionError(_ error: Error, _ actionType: String?, _ additionalData: [AnyHashable: Any]?, _ delegateObject: DelegateObject?) {
|
fileprivate func logActionError(_ error: Error, _ actionType: String?, _ additionalData: [AnyHashable: Any]?, _ delegateObject: DelegateObject?) {
|
||||||
|
|||||||
@ -9,7 +9,8 @@
|
|||||||
import Foundation
|
import Foundation
|
||||||
|
|
||||||
/// A model for UIApplication.OpenExternalURLOptionsKey
|
/// A model for UIApplication.OpenExternalURLOptionsKey
|
||||||
open class OpenUrlOptionsModel: Codable {
|
open class OpenUrlOptionsModel: Codable, Equatable {
|
||||||
|
|
||||||
public var options: [UIApplication.OpenExternalURLOptionsKey: Any]
|
public var options: [UIApplication.OpenExternalURLOptionsKey: Any]
|
||||||
|
|
||||||
//--------------------------------------------------
|
//--------------------------------------------------
|
||||||
@ -42,4 +43,16 @@ open class OpenUrlOptionsModel: Codable {
|
|||||||
try container.encode(universalLinksValue, forKey: .universalLinksOnly)
|
try container.encode(universalLinksValue, forKey: .universalLinksOnly)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static func == (lhs: OpenUrlOptionsModel, rhs: OpenUrlOptionsModel) -> Bool {
|
||||||
|
return lhs.options.allSatisfy { pair in
|
||||||
|
switch(pair.key) {
|
||||||
|
case .universalLinksOnly:
|
||||||
|
return rhs.options[pair.key] as? Bool == pair.value as? Bool
|
||||||
|
default:
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@ -232,7 +232,7 @@
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
NSString *jsonString = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
|
NSString *jsonString = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
|
||||||
MVMCoreLog(@"Request Parameters for URL %@:\n%@", [url absoluteString], jsonString);
|
MVMCoreNetworkLog(@"Request Parameters for URL %@:\n%@", [url absoluteString], jsonString);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
// Standard condensed to send to the server.
|
// Standard condensed to send to the server.
|
||||||
@ -309,15 +309,15 @@
|
|||||||
return nil;
|
return nil;
|
||||||
}
|
}
|
||||||
|
|
||||||
MVMCoreLog(@"********************************* Cookie Sent *********************************");
|
MVMCoreNetworkLog(@"********************************* Cookie Sent *********************************");
|
||||||
[[[NSHTTPCookieStorage sharedHTTPCookieStorage] cookiesForURL:request.URL] enumerateObjectsUsingBlock:^(NSHTTPCookie * _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
|
[[[NSHTTPCookieStorage sharedHTTPCookieStorage] cookiesForURL:request.URL] enumerateObjectsUsingBlock:^(NSHTTPCookie * _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
|
||||||
MVMCoreLog(@"Cookie Name: %@, Cookie Value: %@, Domain: %@", obj.name, obj.value, obj.domain);
|
MVMCoreNetworkLog(@"Cookie Name: %@, Cookie Value: %@, Domain: %@", obj.name, obj.value, obj.domain);
|
||||||
}];
|
}];
|
||||||
|
|
||||||
NSTimeInterval startTime = [NSDate timeIntervalSinceReferenceDate];
|
NSTimeInterval startTime = [NSDate timeIntervalSinceReferenceDate];
|
||||||
NSURLSessionTask *task = [session dataTaskWithRequest:request completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {
|
NSURLSessionTask *task = [session dataTaskWithRequest:request completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {
|
||||||
|
|
||||||
MVMCoreLog(@"Request Time %f", [NSDate timeIntervalSinceReferenceDate] - startTime);
|
MVMCoreNetworkLog(@"Request Time %f", [NSDate timeIntervalSinceReferenceDate] - startTime);
|
||||||
|
|
||||||
NSDate *startTimeDate = [NSDate dateWithTimeIntervalSinceReferenceDate:startTime];
|
NSDate *startTimeDate = [NSDate dateWithTimeIntervalSinceReferenceDate:startTime];
|
||||||
|
|
||||||
@ -330,7 +330,7 @@
|
|||||||
[trackInfo setObject:error.localizedDescription forKey:@"error"];
|
[trackInfo setObject:error.localizedDescription forKey:@"error"];
|
||||||
}
|
}
|
||||||
|
|
||||||
MVMCoreLog(@"Set-Cookie %@ Value: %@", requestParameters.pageType, [(NSHTTPURLResponse *)response allHeaderFields][@"Set-Cookie"]);
|
MVMCoreNetworkLog(@"Set-Cookie %@ Value: %@", requestParameters.pageType, [(NSHTTPURLResponse *)response allHeaderFields][@"Set-Cookie"]);
|
||||||
|
|
||||||
id jsonObject = nil;
|
id jsonObject = nil;
|
||||||
MVMCoreErrorObject *errorObject = nil;
|
MVMCoreErrorObject *errorObject = nil;
|
||||||
@ -354,7 +354,7 @@
|
|||||||
// Log the response pretty.
|
// Log the response pretty.
|
||||||
NSData *prettyData = [NSJSONSerialization dataWithJSONObject:jsonObject options:NSJSONWritingPrettyPrinted error:&error];
|
NSData *prettyData = [NSJSONSerialization dataWithJSONObject:jsonObject options:NSJSONWritingPrettyPrinted error:&error];
|
||||||
NSString *responseString = [[NSString alloc] initWithData:prettyData encoding:NSUTF8StringEncoding];
|
NSString *responseString = [[NSString alloc] initWithData:prettyData encoding:NSUTF8StringEncoding];
|
||||||
MVMCoreLog(@"Response for Request Page Type %@:\n%@",requestParameters.pageType, responseString);
|
MVMCoreNetworkLog(@"Response for Request Page Type %@:\n%@",requestParameters.pageType, responseString);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
// Empty response.
|
// Empty response.
|
||||||
|
|||||||
@ -86,7 +86,7 @@
|
|||||||
// stop any loading animation we may have started
|
// stop any loading animation we may have started
|
||||||
[self stopLoadingAnimationIfNeeded];
|
[self stopLoadingAnimationIfNeeded];
|
||||||
|
|
||||||
MVMCoreLog(@"Load Operation finished for page type %@, background load %@", self.requestParameters.pageType, @(self.backgroundLoad));
|
MVMCoreNetworkLog(@"Load Operation finished for page type %@, background load %@", self.requestParameters.pageType, @(self.backgroundLoad));
|
||||||
[super markAsFinished];
|
[super markAsFinished];
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -107,7 +107,7 @@
|
|||||||
}
|
}
|
||||||
|
|
||||||
- (void)main {
|
- (void)main {
|
||||||
MVMCoreLog(@"Load Operation begun for page type %@, background load %@, delegate %@", self.requestParameters.pageType, @(self.backgroundLoad),self.delegateObject.loadDelegate);
|
MVMCoreNetworkLog(@"Load Operation begun for page type %@, background load %@, delegate %@", self.requestParameters.pageType, @(self.backgroundLoad),self.delegateObject.loadDelegate);
|
||||||
|
|
||||||
[self.requestParameters resolveURL:[MVMCoreSessionObject sharedGlobal]];
|
[self.requestParameters resolveURL:[MVMCoreSessionObject sharedGlobal]];
|
||||||
|
|
||||||
@ -139,10 +139,10 @@
|
|||||||
|
|
||||||
// Log if loaded from cache.
|
// Log if loaded from cache.
|
||||||
if (pageFromCache) {
|
if (pageFromCache) {
|
||||||
MVMCoreLog(@"loaded from cache page %@",[MVMCoreActionUtility formatDictionaryAsJSONString:pageFromCache]);
|
MVMCoreNetworkLog(@"loaded from cache page %@",[MVMCoreActionUtility formatDictionaryAsJSONString:pageFromCache]);
|
||||||
}
|
}
|
||||||
if (modulesFromCache) {
|
if (modulesFromCache) {
|
||||||
MVMCoreLog(@"loaded from cache modules %@",[MVMCoreActionUtility formatDictionaryAsJSONString:modulesFromCache]);
|
MVMCoreNetworkLog(@"loaded from cache modules %@",[MVMCoreActionUtility formatDictionaryAsJSONString:modulesFromCache]);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Create a load object from any data we fetched.
|
// Create a load object from any data we fetched.
|
||||||
@ -822,7 +822,7 @@
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
MVMCoreLog(@"Error: %@ %@ %@ %@ %@",[error stringErrorCode], error.domain, error.location,error.messageToDisplay, error.messageToLog);
|
MVMCoreNetworkLog(@"Error: %@ %@ %@ %@ %@",[error stringErrorCode], error.domain, error.location,error.messageToDisplay, error.messageToLog);
|
||||||
|
|
||||||
if (showAlertForErrorIfApplicable && (!loadObject.operation.backgroundLoad || loadObject.requestParameters.allowAlertsIfBackgroundRequest) && !loadObject.requestParameters.handleErrorsSilently && !error.silentError && !error.errorScreenError) {
|
if (showAlertForErrorIfApplicable && (!loadObject.operation.backgroundLoad || loadObject.requestParameters.allowAlertsIfBackgroundRequest) && !loadObject.requestParameters.handleErrorsSilently && !error.silentError && !error.errorScreenError) {
|
||||||
|
|
||||||
|
|||||||
@ -8,13 +8,16 @@
|
|||||||
|
|
||||||
public protocol MVMCoreLoggingDelegateProtocol {
|
public protocol MVMCoreLoggingDelegateProtocol {
|
||||||
|
|
||||||
// Can be used to log different actions performed by the core.
|
/// Can be used to log different actions performed by the core.
|
||||||
func handleDebugMessage(_ message: String?)
|
func handleDebugMessage(_ message: String?)
|
||||||
|
|
||||||
|
/// Can be used to log a message under a particular cagetory.
|
||||||
|
func handleDebugMessage(_ message: String, category: String?)
|
||||||
|
|
||||||
// Can be used to choose how to log error objects.
|
/// Can be used to choose how to log error objects.
|
||||||
func addError(toLog errorObject: MVMCoreErrorObject)
|
func addError(toLog errorObject: MVMCoreErrorObject)
|
||||||
|
|
||||||
// Log that the load has finished.
|
/// Log that the load has finished.
|
||||||
func logLoadFinished(_ loadObject: MVMCoreLoadObject?, loadedViewController: MVMCoreViewControllerProtocol?, error: MVMCoreErrorObject?)
|
func logLoadFinished(_ loadObject: MVMCoreLoadObject?, loadedViewController: MVMCoreViewControllerProtocol?, error: MVMCoreErrorObject?)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -7,7 +7,7 @@
|
|||||||
//
|
//
|
||||||
|
|
||||||
|
|
||||||
public protocol ActionModelProtocol: ModelProtocol {
|
public protocol ActionModelProtocol: ModelProtocol, CustomDebugStringConvertible {
|
||||||
|
|
||||||
var actionType: String { get }
|
var actionType: String { get }
|
||||||
var extraParameters: JSONValueDictionary? { get set }
|
var extraParameters: JSONValueDictionary? { get set }
|
||||||
@ -33,4 +33,15 @@ public extension ActionModelProtocol {
|
|||||||
static var categoryName: String {
|
static var categoryName: String {
|
||||||
return "\(ActionModelProtocol.self)"
|
return "\(ActionModelProtocol.self)"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
var debugDescription: String {
|
||||||
|
return actionType
|
||||||
|
}
|
||||||
|
|
||||||
|
func isEqual(to model: any ModelComparisonProtocol) -> Bool {
|
||||||
|
guard let model = model as? Self else { return false }
|
||||||
|
return model.actionType == actionType
|
||||||
|
&& model.extraParameters == extraParameters
|
||||||
|
&& model.analyticsData == analyticsData
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -29,4 +29,11 @@ public class ActionRunJavaScriptModel: ActionModelProtocol {
|
|||||||
self.extraParameters = extraParameters
|
self.extraParameters = extraParameters
|
||||||
self.analyticsData = analyticsData
|
self.analyticsData = analyticsData
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public func isEqual(to model: any ModelComparisonProtocol) -> Bool {
|
||||||
|
guard let model = model as? Self else { return false }
|
||||||
|
return jsCallback == model.jsCallback
|
||||||
|
&& extraParameters == model.extraParameters
|
||||||
|
&& analyticsData == model.analyticsData
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -8,7 +8,8 @@
|
|||||||
|
|
||||||
import Foundation
|
import Foundation
|
||||||
|
|
||||||
public class ClientParameterModel: Codable {
|
public class ClientParameterModel: Equatable, Codable {
|
||||||
|
|
||||||
var timeout: Double?
|
var timeout: Double?
|
||||||
var list: [ClientParameterModelProtocol]
|
var list: [ClientParameterModelProtocol]
|
||||||
|
|
||||||
@ -33,4 +34,9 @@ public class ClientParameterModel: Codable {
|
|||||||
try container.encodeIfPresent(timeout, forKey: .timeout)
|
try container.encodeIfPresent(timeout, forKey: .timeout)
|
||||||
try container.encodeModels(list, forKey: .list)
|
try container.encodeModels(list, forKey: .list)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static func == (lhs: ClientParameterModel, rhs: ClientParameterModel) -> Bool {
|
||||||
|
return lhs.list.isEqual(to: rhs.list)
|
||||||
|
&& lhs.timeout == rhs.timeout
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -30,4 +30,9 @@ public extension ClientParameterModelProtocol {
|
|||||||
static var categoryName: String {
|
static var categoryName: String {
|
||||||
return "\(ClientParameterModelProtocol.self)"
|
return "\(ClientParameterModelProtocol.self)"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func isEqual(to model: any ModelProtocol) -> Bool {
|
||||||
|
guard let model = model as? Self else { return false }
|
||||||
|
return type == model.type
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -8,7 +8,7 @@
|
|||||||
|
|
||||||
import Foundation
|
import Foundation
|
||||||
|
|
||||||
public protocol ModelProtocol: Codable {
|
public protocol ModelProtocol: ModelComparisonProtocol, Codable {
|
||||||
|
|
||||||
/// The key name of the molecule
|
/// The key name of the molecule
|
||||||
static var identifier: String { get }
|
static var identifier: String { get }
|
||||||
@ -50,3 +50,62 @@ extension ModelProtocol {
|
|||||||
try unkeyedContainer.encode(self)
|
try unkeyedContainer.encode(self)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public protocol ModelComparisonProtocol {
|
||||||
|
/// Shallow checks if the current model is equal to another model. Defaults to false unless implemented otherwise.
|
||||||
|
func isEqual(to model: ModelComparisonProtocol) -> Bool
|
||||||
|
}
|
||||||
|
|
||||||
|
extension ModelComparisonProtocol {
|
||||||
|
public func isEqual(to model: ModelComparisonProtocol) -> Bool {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public extension Optional {
|
||||||
|
/// Checks if the current model is equal to another model.
|
||||||
|
func isEqual(to model: ModelComparisonProtocol?) -> Bool {
|
||||||
|
guard let self = self as? ModelComparisonProtocol else {
|
||||||
|
return model == nil
|
||||||
|
}
|
||||||
|
guard let model = model else {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
return self.isEqual(to: model)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public extension Collection {
|
||||||
|
/// Checks if all the models in the given collection match another given collection.
|
||||||
|
func isEqual(to models: [ModelComparisonProtocol]) -> Bool {
|
||||||
|
guard count == models.count, let self = self as? [ModelComparisonProtocol] else { return false }
|
||||||
|
return models.indices.allSatisfy { index in
|
||||||
|
self[index].isEqual(to: models[index])
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public extension Optional where Wrapped: Collection {
|
||||||
|
/// Checks if the current model is equal to another model.
|
||||||
|
func isEqual(to models: [ModelComparisonProtocol]?) -> Bool {
|
||||||
|
guard let self = self as? [ModelComparisonProtocol] else {
|
||||||
|
return models == nil
|
||||||
|
}
|
||||||
|
guard let models = models else {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
return self.isEqual(to: models)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public extension Optional {
|
||||||
|
/// Checks if
|
||||||
|
func matchExistence(with anotherOptional: Optional) -> Bool {
|
||||||
|
switch(self) {
|
||||||
|
case .none:
|
||||||
|
return anotherOptional == nil
|
||||||
|
case .some(_):
|
||||||
|
return anotherOptional != nil
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|||||||
@ -7,9 +7,31 @@
|
|||||||
//
|
//
|
||||||
|
|
||||||
import Foundation
|
import Foundation
|
||||||
|
import os
|
||||||
|
|
||||||
@objc public extension MVMCoreLoggingHandler {
|
public protocol CoreLogging {
|
||||||
@objc func print(with message: String) {
|
static var loggingCategory: String? { get }
|
||||||
Swift.print(message)
|
|
||||||
|
var loggingPrefix: String { get }
|
||||||
|
}
|
||||||
|
|
||||||
|
public extension CoreLogging {
|
||||||
|
|
||||||
|
static var loggingCategory: String? { return nil }
|
||||||
|
|
||||||
|
var loggingPrefix: String {
|
||||||
|
return ""
|
||||||
|
}
|
||||||
|
|
||||||
|
static func debugLog(_ string: String) {
|
||||||
|
#if LOGGING
|
||||||
|
MVMCoreLoggingHandler.shared()?.handleDebugMessage(string, category: loggingCategory)
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
func debugLog(_ string: String) {
|
||||||
|
#if LOGGING
|
||||||
|
MVMCoreLoggingHandler.shared()?.handleDebugMessage("\(loggingPrefix)\(string)", category: Self.loggingCategory)
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -7,9 +7,28 @@
|
|||||||
//
|
//
|
||||||
|
|
||||||
import Foundation
|
import Foundation
|
||||||
|
import os
|
||||||
|
|
||||||
@objc open class MVMCoreLoggingHandler: NSObject, MVMCoreLoggingDelegateProtocol {
|
@objc open class MVMCoreLoggingHandler: NSObject, MVMCoreLoggingDelegateProtocol {
|
||||||
|
|
||||||
|
public static let standardCategory = "General"
|
||||||
|
|
||||||
|
private let logger = Logger(subsystem: "MVMCoreLogging", category: standardCategory)
|
||||||
|
private var loggerCache = [String: Logger]()
|
||||||
|
|
||||||
|
open func getLogger(category: String?) -> Logger {
|
||||||
|
if let category {
|
||||||
|
if let logger = loggerCache[category] {
|
||||||
|
return logger
|
||||||
|
} else {
|
||||||
|
let logger = Logger(subsystem: Bundle.main.bundleIdentifier!, category: category)
|
||||||
|
loggerCache[category] = logger
|
||||||
|
return logger
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return logger
|
||||||
|
}
|
||||||
|
|
||||||
@objc(sharedLoggingHandler)
|
@objc(sharedLoggingHandler)
|
||||||
public static func shared() -> Self? {
|
public static func shared() -> Self? {
|
||||||
return MVMCoreActionUtility.initializerClassCheck(MVMCoreObject.sharedInstance()?.loggingDelegate as? NSObject, classToVerify: self) as? Self
|
return MVMCoreActionUtility.initializerClassCheck(MVMCoreObject.sharedInstance()?.loggingDelegate as? NSObject, classToVerify: self) as? Self
|
||||||
@ -29,8 +48,25 @@ import Foundation
|
|||||||
// MARK: - logging delegate
|
// MARK: - logging delegate
|
||||||
@objc open func handleDebugMessage(_ message: String?) {
|
@objc open func handleDebugMessage(_ message: String?) {
|
||||||
#if LOGGING
|
#if LOGGING
|
||||||
guard let message = message else { return }
|
guard let message = message else { return }
|
||||||
self.print(with: message)
|
guard message.count < 1024 else {
|
||||||
|
logger.debug("\(message.prefix(300), privacy: .public)... <stdio>") // Send initial log to console.
|
||||||
|
print(message) // Print the whole on stdout.
|
||||||
|
return
|
||||||
|
}
|
||||||
|
logger.debug("\(message, privacy: .public)") // Assume that becaues this is a LOGGING build we want these messages to be unmasked.
|
||||||
|
// TODO: How do we split the messaging by Library and Subsystem?
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
@objc open func handleDebugMessage(_ message: String, category: String?) {
|
||||||
|
#if LOGGING
|
||||||
|
guard message.count < 1024 else {
|
||||||
|
getLogger(category: category).debug("\(message.prefix(300), privacy: .public)... <stdio>") // Send initial log to console.
|
||||||
|
print(message) // Print the whole on stdout.
|
||||||
|
return
|
||||||
|
}
|
||||||
|
getLogger(category: category).debug("\(message, privacy: .public)") // Assume that becaues this is a LOGGING build we want these messages to be unmasked.
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -8,7 +8,11 @@
|
|||||||
|
|
||||||
#ifndef MVMCoreLoggingHandlerHelper_h
|
#ifndef MVMCoreLoggingHandlerHelper_h
|
||||||
#define MVMCoreLoggingHandlerHelper_h
|
#define MVMCoreLoggingHandlerHelper_h
|
||||||
|
|
||||||
#define MVMCoreLog(fmt, ...) \
|
#define MVMCoreLog(fmt, ...) \
|
||||||
[MVMCoreLoggingHandler logDebugMessageWithDelegate:[NSString stringWithFormat:(@"%s [Line %d] " fmt), __PRETTY_FUNCTION__, __LINE__, ##__VA_ARGS__]];
|
[MVMCoreLoggingHandler logDebugMessageWithDelegate:[NSString stringWithFormat:(@"%s [Line %d] " fmt), __PRETTY_FUNCTION__, __LINE__, ##__VA_ARGS__]];
|
||||||
#endif
|
|
||||||
|
|
||||||
|
#define MVMCoreNetworkLog(fmt, ...) \
|
||||||
|
[MVMCoreLoggingHandler.sharedLoggingHandler handleDebugMessage:[NSString stringWithFormat:(@"%s [Line %d] " fmt), __PRETTY_FUNCTION__, __LINE__, ##__VA_ARGS__] category: @"Network"];
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user