Skip to content

Instantly share code, notes, and snippets.

@Pash237
Last active October 21, 2020 09:42
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save Pash237/7257451fb9b47bb3926b6b561b44b3b2 to your computer and use it in GitHub Desktop.
Save Pash237/7257451fb9b47bb3926b6b561b44b3b2 to your computer and use it in GitHub Desktop.
//
// 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