Last active
October 21, 2020 09:42
-
-
Save Pash237/7257451fb9b47bb3926b6b561b44b3b2 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// | |
// Analytics.swift | |
// Myalarm | |
// | |
// Created by Pavel Alexeev on 19.10.2020. | |
// Copyright © 2020 C.Nord. All rights reserved. | |
// | |
import Foundation | |
import Firebase | |
struct Analytics { | |
private static func logEvent(_ event: String, parameters: Dictionary<String, Any>? = nil) | |
{ | |
//#if !DEBUG | |
Firebase.Analytics.logEvent(event, parameters: parameters) | |
//#endif | |
} | |
private static func setUserProperty(_ value: Any, forName name: String) { | |
//#if !DEBUG | |
if let value = value as? Bool { | |
Firebase.Analytics.setUserProperty(value ? "yes" : "no", forName: name) | |
} else { | |
Firebase.Analytics.setUserProperty("\(value)", forName: name) | |
} | |
//#endif | |
} | |
static func setUserProperties() { | |
setUserProperty(Objects.all.count, forName: "object_count") | |
if let current = Objects.current { | |
setUserProperty(current.parts.count, forName: "current_object_part_count") | |
setUserProperty(current.overallState.rawValue, forName: "current_object_state") | |
setUserProperty(current.readyState.rawValue, forName: "current_object_ready_state") | |
setUserProperty(current.accessLevel.rawValue, forName: "current_object_access_level") | |
setUserProperty(current.panicButtonState.isPresent, forName: "current_object_panic_button_present") | |
setUserProperty(current.panicButtonState.canBeActivated, forName: "current_object_panic_button_can_be_activated") | |
setUserProperty(current.panicButtonState.alarm, forName: "current_object_panic_button_alarm") | |
setUserProperty(current.userCodeLength, forName: "current_object_user_code_length") | |
setUserProperty(current.sensors.count, forName: "current_object_sensor_count") | |
setUserProperty(current.cameras.count, forName: "current_object_camera_count") | |
setUserProperty(current.myTechTasks.count, forName: "current_object_my_tech_task_count") | |
setUserProperty(current.myTechTasksEnabled, forName: "current_object_my_tech_tasks_enabled") | |
setUserProperty(current.devices.count, forName: "current_object_actuator_count") | |
setUserProperty(current.hasDevices, forName: "current_object_actuators_enabled") | |
setUserProperty(current.users.count, forName: "current_object_user_count") | |
} | |
setUserProperty(PinCodeSettings.shared.pinCode != nil, forName: "pincode_enabled") | |
setUserProperty(PinCodeSettings.shared.biometricsAvailable, forName: "pincode_biometric_available") | |
setUserProperty(PinCodeSettings.shared.biometricsEnabled, forName: "pincode_biometric_enabled") | |
setUserProperty(PinCodeSettings.shared.pinCodeTimeoutEnabled, forName: "pincode_3minute_enabled") | |
setUserProperty("\(PinCodeSettings.shared.biometryType)", forName: "pincode_biometric_type") | |
} | |
} | |
extension Analytics { | |
struct ArmDisarm { | |
static func tappedObjectPart(_ objectPart: ObjectPart) { | |
logEvent("object_part_tapped", parameters: [ | |
"state": objectPart.state.rawValue, | |
"arm_disarm_allowed": objectPart.armDisarmAllowed | |
]) | |
} | |
static func pinCodePopupClosed(_ objectPart: ObjectPart) { | |
logEvent("arm_disarm_pin_code_popup_closed", parameters: [ | |
"state": objectPart.state.rawValue | |
]) | |
} | |
static func error(_ objectPart: ObjectPart, error: APIError) { | |
logEvent("arm_disarm_error", parameters: [ | |
"state": objectPart.state.rawValue, | |
"error": error.statusCode | |
]) | |
} | |
static func success(_ objectPart: ObjectPart) { | |
logEvent("arm_disarm_success", parameters: [ | |
"state": objectPart.state.rawValue | |
]) | |
} | |
static func openedPushNotification(state: ArmState) { | |
logEvent("arm_disarm_opened_push_notification", parameters: [ | |
"state": state.rawValue | |
]) | |
} | |
} | |
} | |
extension Analytics { | |
struct Events { | |
static func didTapEventsButton(object: Object) { | |
logEvent("events_button_tapped") | |
} | |
static func didCloseEventsScreen(object: Object) { | |
logEvent("events_screen_closed") | |
} | |
} | |
} | |
extension Analytics { | |
struct SecurityServices { | |
static func didTapSecurityServicesButton(object: Object) { | |
logEvent("security_services_button_tapped") | |
} | |
static func didCallSecurityService() { | |
logEvent("security_services_call_button_tapped") | |
} | |
static func didEmailSecurityService() { | |
logEvent("security_services_email_button_tapped") | |
} | |
static func didTapSecurityServiceWebsite() { | |
logEvent("security_services_website_button_tapped") | |
} | |
} | |
} | |
extension Analytics { | |
struct Users { | |
static func didTapUsersButton(object: Object) { | |
logEvent("object_users_button_tapped", parameters: [ | |
"user_count": object.users.count | |
]) | |
} | |
static func didTapUser(object: Object, user: User) { | |
logEvent("object_user_tapped", parameters: [ | |
"role": user.role.rawValue | |
]) | |
} | |
static func didCallUser(_ user: User) { | |
logEvent("object_user_call_button_tapped", parameters: [ | |
"role": user.role.rawValue | |
]) | |
} | |
} | |
} | |
extension Analytics { | |
struct AppSettings { | |
static func didTapAppSettingsButton() { | |
logEvent("app_settings_button_tapped") | |
} | |
static func didTapLogOutButton() { | |
logEvent("log_out_button_tapped") | |
} | |
static func didConfirmLogOut() { | |
logEvent("log_out_confirmed") | |
} | |
static func didReceiveUnauthorizedError() { | |
logEvent("did_receive_unauthorized_error") | |
} | |
} | |
} | |
extension Analytics { | |
struct Video { | |
static func didTapCameraButton(object: Object, camera: Camera) { | |
logEvent("camera_button_tapped") | |
} | |
enum DirectionChange: String { | |
case next = "next" | |
case previous = "previous" | |
} | |
enum RewindDirection: String { | |
case forward = "forward" | |
case backward = "backward" | |
} | |
private static var parameters: Dictionary<String, Any> { | |
guard let objectVideoView = UIApplication.shared.topViewController.view as? ObjectVideoView else { | |
return [:] | |
} | |
let date = objectVideoView.dateAtCurrentPosition | |
let isFullscreen = objectVideoView.width > objectVideoView.height | |
return [ | |
"days_ago": Date().daystamp - date.daystamp, | |
"hours_ago": Date().hoursSinceReferenceDate - date.hoursSinceReferenceDate, | |
"minutes_ago": Date().minuesSinceReferenceDate - date.minuesSinceReferenceDate, | |
"is_live": date.timeIntervalToNow < 1.0, | |
"is_fullscreen": isFullscreen | |
] | |
} | |
static func didTapCalendarButton() { | |
logEvent("camera_calendar_button_tapped", parameters: parameters) | |
} | |
static func didTapLiveButton() { | |
logEvent("camera_live_button_tapped", parameters: parameters) | |
} | |
static func didScrollTimeline() { | |
logEvent("camera_timeline_scroll", parameters: parameters) | |
} | |
static func didClose() { | |
logEvent("camera_screen_closed", parameters: parameters) | |
} | |
static func didOpenControls() { | |
logEvent("camera_controls_opened", parameters: parameters) | |
} | |
private static var lastFullscreenModeButtonPress = Date() | |
static func didPressFullscreenModeButton(isFullscreen: Bool) { | |
lastFullscreenModeButtonPress = Date() | |
} | |
static func didEnterFullscreen() { | |
// если только что нажимали на кнопку полноэкранного режима, значит повотор произошёл из-за кнопки | |
let forced = lastFullscreenModeButtonPress.timeIntervalToNow < 1.0 | |
logEvent("camera_enters_fullscreen", parameters: parameters + [ | |
"reason": forced ? "button_press" : "device_rotation" | |
]) | |
} | |
static func didExitFullscreen() { | |
let forced = lastFullscreenModeButtonPress.timeIntervalToNow < 1.0 | |
logEvent("camera_exits_fullscreen", parameters: parameters + [ | |
"reason": forced ? "button_press" : "device_rotation" | |
]) | |
} | |
static func didChangeCamera(withButton: Bool, direction: DirectionChange) { | |
logEvent("camera_changed", parameters: parameters + [ | |
"reason": withButton ? "button_press" : "swipe", | |
"direction": direction.rawValue | |
]) | |
} | |
private static var lastRewindDate = Date() | |
private static var rewindCountInLastSecond: Int = 0 | |
static func didRewindCamera(direction: RewindDirection) { | |
if lastRewindDate.timeIntervalToNow > 1.0 { | |
rewindCountInLastSecond = 0 | |
} | |
rewindCountInLastSecond += 1 | |
logEvent("camera_rewind", parameters: parameters + [ | |
"count": rewindCountInLastSecond, | |
"direction": direction.rawValue | |
]) | |
lastRewindDate = Date() | |
} | |
} | |
} | |
extension Analytics { | |
struct ObjectChooser { | |
static func didTapObjectChooserButton() { | |
logEvent("change_object_button_tapped") | |
} | |
static func didCloseObjectChooserScreen() { | |
logEvent("change_object_screen_closed") | |
} | |
static func didSelectObject(object: Object) { | |
logEvent("object_changed", parameters: [ | |
"state": object.overallState.rawValue | |
]) | |
} | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment