Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -3,20 +3,20 @@ import WidgetKit

extension WidgetCenter {
func reloadTodayTimelines() {
WidgetCenter.shared.reloadTimelines(ofKind: AppConfiguration.Widget.Stats.todayKind)
WidgetCenter.shared.reloadTimelines(ofKind: AppConfiguration.Widget.Stats.lockScreenTodayViewsKind)
WidgetCenter.shared.reloadTimelines(ofKind: AppConfiguration.Widget.Stats.lockScreenTodayLikesCommentsKind)
WidgetCenter.shared.reloadTimelines(ofKind: AppConfiguration.Widget.Stats.lockScreenTodayViewsVisitorsKind)
WidgetCenter.shared.reloadTimelines(ofKind: AppConfiguration.Widget.Stats.Kind.homeToday.rawValue)
WidgetCenter.shared.reloadTimelines(ofKind: AppConfiguration.Widget.Stats.Kind.lockScreenTodayViews.rawValue)
WidgetCenter.shared.reloadTimelines(ofKind: AppConfiguration.Widget.Stats.Kind.lockScreenTodayLikesComments.rawValue)
WidgetCenter.shared.reloadTimelines(ofKind: AppConfiguration.Widget.Stats.Kind.lockScreenTodayViewsVisitors.rawValue)
}

func reloadThisWeekTimelines() {
WidgetCenter.shared.reloadTimelines(ofKind: AppConfiguration.Widget.Stats.thisWeekKind)
WidgetCenter.shared.reloadTimelines(ofKind: AppConfiguration.Widget.Stats.Kind.homeThisWeek.rawValue)
}

func reloadAllTimeTimelines() {
WidgetCenter.shared.reloadTimelines(ofKind: AppConfiguration.Widget.Stats.allTimeKind)
WidgetCenter.shared.reloadTimelines(ofKind: AppConfiguration.Widget.Stats.lockScreenAllTimeViewsKind)
WidgetCenter.shared.reloadTimelines(ofKind: AppConfiguration.Widget.Stats.lockScreenAllTimeViewsVisitorsKind)
WidgetCenter.shared.reloadTimelines(ofKind: AppConfiguration.Widget.Stats.lockScreenAllTimePostsBestViewsKind)
WidgetCenter.shared.reloadTimelines(ofKind: AppConfiguration.Widget.Stats.Kind.homeAllTime.rawValue)
WidgetCenter.shared.reloadTimelines(ofKind: AppConfiguration.Widget.Stats.Kind.lockScreenAllTimeViews.rawValue)
WidgetCenter.shared.reloadTimelines(ofKind: AppConfiguration.Widget.Stats.Kind.lockScreenAllTimeViewsVisitors.rawValue)
WidgetCenter.shared.reloadTimelines(ofKind: AppConfiguration.Widget.Stats.Kind.lockScreenAllTimePostsBestViews.rawValue)
}
}
39 changes: 15 additions & 24 deletions WordPress/Jetpack/WidgetConfiguration.swift
Original file line number Diff line number Diff line change
Expand Up @@ -9,34 +9,25 @@ import Foundation
static let keychainServiceName = "JetpackTodayWidget"
static let userDefaultsSiteIdKey = "JetpackHomeWidgetsSiteId"
static let userDefaultsLoggedInKey = "JetpackHomeWidgetsLoggedIn"
static let todayKind = "JetpackHomeWidgetToday"
static let allTimeKind = "JetpackHomeWidgetAllTime"
static let thisWeekKind = "JetpackHomeWidgetThisWeek"
static let todayProperties = "JetpackHomeWidgetTodayProperties"
static let allTimeProperties = "JetpackHomeWidgetAllTimeProperties"
static let thisWeekProperties = "JetpackHomeWidgetThisWeekProperties"
static let todayFilename = "JetpackHomeWidgetTodayData.plist"
static let allTimeFilename = "JetpackHomeWidgetAllTimeData.plist"
static let thisWeekFilename = "JetpackHomeWidgetThisWeekData.plist"

/// Lock Screen
static let lockScreenTodayViewsKind = "JetpackLockScreenWidgetTodayViews"
static let lockScreenTodayViewsProperties = "JetpackLockScreenWidgetTodayViewsProperties"

static let lockScreenTodayLikesCommentsKind = "JetpackLockScreenWidgetTodayLikesComments"
static let lockScreenTodayLikesCommentsProperties = "JetpackLockScreenWidgetTodayLikesCommentsProperties"

static let lockScreenTodayViewsVisitorsKind = "JetpackLockScreenWidgetTodayViewsVisitors"
static let lockScreenTodayViewsVisitorsProperties = "JetpackLockScreenWidgetTodayViewsVisitorsProperties"

static let lockScreenAllTimeViewsKind = "JetpackLockScreenWidgetAllTimeViews"
static let lockScreenAllTimeViewsProperties = "JetpackLockScreenWidgetAllTimeViewsProperties"

static let lockScreenAllTimeViewsVisitorsKind = "JetpackLockScreenWidgetAllTimeViewsVisitors"
static let lockScreenAllTimeViewsVisitorsProperties = "JetpackLockScreenWidgetAllTimeViewsVisitorsProperties"

static let lockScreenAllTimePostsBestViewsKind = "JetpackLockScreenWidgetAllTimePostsBestViews"
static let lockScreenAllTimePostsBestViewsProperties = "JetpackLockScreenWidgetAllTimeBestViewsProperties"
enum Kind: String {
case homeToday = "JetpackHomeWidgetToday"
case homeAllTime = "JetpackHomeWidgetAllTime"
case homeThisWeek = "JetpackHomeWidgetThisWeek"
case lockScreenTodayViews = "JetpackLockScreenWidgetTodayViews"
case lockScreenTodayLikesComments = "JetpackLockScreenWidgetTodayLikesComments"
case lockScreenTodayViewsVisitors = "JetpackLockScreenWidgetTodayViewsVisitors"
case lockScreenAllTimeViews = "JetpackLockScreenWidgetAllTimeViews"
case lockScreenAllTimeViewsVisitors = "JetpackLockScreenWidgetAllTimeViewsVisitors"
case lockScreenAllTimePostsBestViews = "JetpackLockScreenWidgetAllTimePostsBestViews"

var countKey: String {
return rawValue + "Properties"
}
}
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -20,12 +20,8 @@ struct LockScreenAllTimePostsBestViewsStatWidgetConfig: LockScreenStatsWidgetCon
LocalizableStrings.allTimePreviewDescription
}

var kind: String {
AppConfiguration.Widget.Stats.lockScreenAllTimePostsBestViewsKind
}

var countKey: String {
AppConfiguration.Widget.Stats.lockScreenAllTimePostsBestViewsProperties
var kind: AppConfiguration.Widget.Stats.Kind {
AppConfiguration.Widget.Stats.Kind.lockScreenAllTimePostsBestViews
}

var placeholderContent: HomeWidgetAllTimeData {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,12 +20,8 @@ struct LockScreenAllTimeViewsStatWidgetConfig: LockScreenStatsWidgetConfig {
LocalizableStrings.allTimePreviewDescription
}

var kind: String {
AppConfiguration.Widget.Stats.lockScreenAllTimeViewsKind
}

var countKey: String {
AppConfiguration.Widget.Stats.lockScreenAllTimeViewsProperties
var kind: AppConfiguration.Widget.Stats.Kind {
AppConfiguration.Widget.Stats.Kind.lockScreenAllTimeViews
}

var placeholderContent: HomeWidgetAllTimeData {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,12 +20,8 @@ struct LockScreenAllTimeViewsVisitorsStatWidgetConfig: LockScreenStatsWidgetConf
LocalizableStrings.allTimePreviewDescription
}

var kind: String {
AppConfiguration.Widget.Stats.lockScreenAllTimeViewsVisitorsKind
}

var countKey: String {
AppConfiguration.Widget.Stats.lockScreenAllTimeViewsVisitorsProperties
var kind: AppConfiguration.Widget.Stats.Kind {
AppConfiguration.Widget.Stats.Kind.lockScreenAllTimeViewsVisitors
}

var placeholderContent: HomeWidgetAllTimeData {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,8 +7,7 @@ protocol LockScreenStatsWidgetConfig {
var supportFamilies: [WidgetFamily] { get }
var displayName: String { get }
var description: String { get }
var kind: String { get }
var countKey: String { get }
var kind: AppConfiguration.Widget.Stats.Kind { get }
var placeholderContent: WidgetData { get }
var viewProvider: ViewProvider { get }
}
Original file line number Diff line number Diff line change
Expand Up @@ -20,12 +20,8 @@ struct LockScreenTodayLikesCommentsStatWidgetConfig: LockScreenStatsWidgetConfig
LocalizableStrings.todayPreviewDescription
}

var kind: String {
AppConfiguration.Widget.Stats.lockScreenTodayLikesCommentsKind
}

var countKey: String {
AppConfiguration.Widget.Stats.lockScreenTodayLikesCommentsProperties
var kind: AppConfiguration.Widget.Stats.Kind {
AppConfiguration.Widget.Stats.Kind.lockScreenTodayLikesComments
}

var placeholderContent: HomeWidgetTodayData {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,12 +20,8 @@ struct LockScreenTodayViewsStatWidgetConfig: LockScreenStatsWidgetConfig {
LocalizableStrings.todayPreviewDescription
}

var kind: String {
AppConfiguration.Widget.Stats.lockScreenTodayViewsKind
}

var countKey: String {
AppConfiguration.Widget.Stats.lockScreenTodayViewsProperties
var kind: AppConfiguration.Widget.Stats.Kind {
AppConfiguration.Widget.Stats.Kind.lockScreenTodayViews
}

var placeholderContent: HomeWidgetTodayData {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,12 +20,8 @@ struct LockScreenTodayViewsVisitorsStatWidgetConfig: LockScreenStatsWidgetConfig
LocalizableStrings.todayPreviewDescription
}

var kind: String {
AppConfiguration.Widget.Stats.lockScreenTodayViewsVisitorsKind
}

var countKey: String {
AppConfiguration.Widget.Stats.lockScreenTodayViewsVisitorsProperties
var kind: AppConfiguration.Widget.Stats.Kind {
AppConfiguration.Widget.Stats.Kind.lockScreenTodayViewsVisitors
}

var placeholderContent: HomeWidgetTodayData {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@ struct LockScreenStatsWidget<T: LockScreenStatsWidgetConfig>: Widget {

var body: some WidgetConfiguration {
IntentConfiguration(
kind: config.kind,
kind: config.kind.rawValue,
intent: SelectSiteIntent.self,
provider: LockScreenSiteListProvider<T.WidgetData>(
service: StatsWidgetsService(),
Expand All @@ -26,8 +26,7 @@ struct LockScreenStatsWidget<T: LockScreenStatsWidgetConfig>: Widget {
) { (entry: LockScreenStatsWidgetEntry) -> LockScreenStatsWidgetsView in
defer {
tracks.trackWidgetUpdatedIfNeeded(entry: entry,
widgetKind: config.kind,
widgetCountKey: config.countKey)
widgetKind: config.kind)
}
return LockScreenStatsWidgetsView(
timelineEntry: entry,
Expand Down
91 changes: 50 additions & 41 deletions WordPress/JetpackStatsWidgets/Tracks/Tracks+StatsWidgets.swift
Original file line number Diff line number Diff line change
Expand Up @@ -5,44 +5,40 @@ import WidgetKit
///
extension Tracks {

func trackWidgetUpdatedIfNeeded(entry: LockScreenStatsWidgetEntry<some HomeWidgetData>, widgetKind: String, widgetCountKey: String) {
func trackWidgetUpdatedIfNeeded(entry: LockScreenStatsWidgetEntry<some HomeWidgetData>, widgetKind: AppConfiguration.Widget.Stats.Kind) {
switch entry {
case .siteSelected(_, let context):
if !context.isPreview {
trackWidgetUpdated(widgetKind: widgetKind,
widgetCountKey: widgetCountKey)
trackWidgetUpdated(widgetKind: widgetKind)
}

case .loggedOut, .noSite, .noData:
trackWidgetUpdated(widgetKind: widgetKind,
widgetCountKey: widgetCountKey)
trackWidgetUpdated(widgetKind: widgetKind)
}
}

func trackWidgetUpdatedIfNeeded(entry: StatsWidgetEntry, widgetKind: String, widgetCountKey: String) {
func trackWidgetUpdatedIfNeeded(entry: StatsWidgetEntry, widgetKind: AppConfiguration.Widget.Stats.Kind) {
switch entry {
case .siteSelected(_, let context):
if !context.isPreview {
trackWidgetUpdated(widgetKind: widgetKind,
widgetCountKey: widgetCountKey)
trackWidgetUpdated(widgetKind: widgetKind)
}

case .loggedOut, .noSite, .noData, .disabled:
trackWidgetUpdated(widgetKind: widgetKind,
widgetCountKey: widgetCountKey)
trackWidgetUpdated(widgetKind: widgetKind)
}
}

func trackWidgetUpdated(widgetKind: String, widgetCountKey: String) {
func trackWidgetUpdated(widgetKind: AppConfiguration.Widget.Stats.Kind) {

DispatchQueue.global().async {
WidgetCenter.shared.getCurrentConfigurations { result in

switch result {

case .success(let widgetInfo):
let widgetKindInfo = widgetInfo.filter { $0.kind == widgetKind }
self.trackUpdatedWidgetInfo(widgetInfo: widgetKindInfo, widgetPropertiesKey: widgetCountKey)
let widgetKindInfo = widgetInfo.filter { $0.kind == widgetKind.rawValue }
self.trackUpdatedWidgetInfo(widgetInfo: widgetKindInfo, widgetKind: widgetKind)

case .failure(let error):
DDLogError("Home Widget Today error: unable to read widget information. \(error.localizedDescription)")
Expand All @@ -51,14 +47,19 @@ extension Tracks {
}
}

private func trackUpdatedWidgetInfo(widgetInfo: [WidgetInfo], widgetPropertiesKey: String) {
private func trackUpdatedWidgetInfo(widgetInfo: [WidgetInfo], widgetKind: AppConfiguration.Widget.Stats.Kind) {
let widgetPropertiesKey = widgetKind.countKey

var properties = ["total_widgets": widgetInfo.count,
var properties: [String: Int] = [:]

switch widgetKind {
case .homeToday, .homeThisWeek, .homeAllTime:
properties = ["total_widgets": widgetInfo.count,
"small_widgets": widgetInfo.filter { $0.family == .systemSmall }.count,
"medium_widgets": widgetInfo.filter { $0.family == .systemMedium }.count,
"large_widgets": widgetInfo.filter { $0.family == .systemLarge }.count]
if #available(iOS 16.0, *) {
properties["rectangular_widgets"] = widgetInfo.filter { $0.family == .accessoryRectangular }.count
default:
break
}

let previousProperties = UserDefaults(suiteName: WPAppGroupName)?.object(forKey: widgetPropertiesKey) as? [String: Int]
Expand All @@ -69,7 +70,7 @@ extension Tracks {

UserDefaults(suiteName: WPAppGroupName)?.set(properties, forKey: widgetPropertiesKey)

trackExtensionEvent(ExtensionEvents.widgetUpdated(for: widgetPropertiesKey), properties: properties as [String: AnyObject]?)
trackExtensionEvent(ExtensionEvents.widgetUpdated(for: widgetKind), properties: properties as [String: AnyObject]?)
Comment thread
guarani marked this conversation as resolved.
}

// MARK: - Private Helpers
Expand All @@ -82,29 +83,37 @@ extension Tracks {
// MARK: - Private Enums

fileprivate enum ExtensionEvents: String {
// User installs an instance of the today widget
case todayWidgetUpdated = "today_home_extension_widget_updated"
// User installs an instance of the all time widget
case allTimeWidgetUpdated = "alltime_home_extension_widget_updated"
// Users installs an instance of the this week widget
case thisWeekWidgetUpdated = "thisweek_home_extension_widget_updated"
// Users installs an instance of the lockscreen today views widget
case todayViewsLockScreenWidgetUpdated = "today_views_lockscreen_extension_widget_updated"

case noEvent

static func widgetUpdated(for key: String) -> ExtensionEvents {
switch key {
case AppConfiguration.Widget.Stats.todayProperties:
return .todayWidgetUpdated
case AppConfiguration.Widget.Stats.allTimeProperties:
return .allTimeWidgetUpdated
case AppConfiguration.Widget.Stats.thisWeekProperties:
return .thisWeekWidgetUpdated
case AppConfiguration.Widget.Stats.lockScreenTodayViewsProperties:
return .todayViewsLockScreenWidgetUpdated
default:
return .noEvent

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This is one of the reasons of this refactoring. I want switch to happen on a type, such as Widget.Stats.Kind so compiler would notify about expanding tracking when we create a new widget kind.

// Events when user installs an instance of the widget
case homeTodayWidgetUpdated = "today_home_extension_widget_updated"
case homeAllTimeWidgetUpdated = "alltime_home_extension_widget_updated"
case homeThisWeekWidgetUpdated = "thisweek_home_extension_widget_updated"
case lockScreenTodayViewsWidgetUpdated = "today_views_lockscreen_widget_updated"
case lockScreenTodayLikesCommentsWidgetUpdated = "today_likes_comments_lockscreen_widget_updated"
case lockScreenTodayViewsVisitorsWidgetUpdated = "today_views_visitors_lockscreen_widget_updated"
case lockScreenAllTimeViewsWidgetUpdated = "all_time_views_lockscreen_widget_updated"
case lockScreenAllTimeViewsVisitorsWidgetUpdated = "all_time_views_visitors_lockscreen_widget_updated"
case lockScreenAllTimePostsBestViewsWidgetUpdated = "all_time_posts_best_views_lockscreen_widget_updated"

static func widgetUpdated(for widgetKind: AppConfiguration.Widget.Stats.Kind) -> ExtensionEvents {
switch widgetKind {
case .homeToday:
return .homeTodayWidgetUpdated
case .homeAllTime:
return .homeAllTimeWidgetUpdated
case .homeThisWeek:
return .homeThisWeekWidgetUpdated
case .lockScreenTodayViews:
return .lockScreenTodayViewsWidgetUpdated
case .lockScreenTodayLikesComments:
return .lockScreenTodayLikesCommentsWidgetUpdated
case .lockScreenTodayViewsVisitors:
return .lockScreenTodayViewsVisitorsWidgetUpdated
case .lockScreenAllTimeViews:
return .lockScreenAllTimeViewsWidgetUpdated
case .lockScreenAllTimeViewsVisitors:
return .lockScreenAllTimeViewsVisitorsWidgetUpdated
case .lockScreenAllTimePostsBestViews:
return .lockScreenAllTimePostsBestViewsWidgetUpdated
}
}
}
Expand Down
5 changes: 2 additions & 3 deletions WordPress/JetpackStatsWidgets/Widgets/HomeWidgetAllTime.swift
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@ struct HomeWidgetAllTime: Widget {

var body: some WidgetConfiguration {
IntentConfiguration(
kind: AppConfiguration.Widget.Stats.allTimeKind,
kind: AppConfiguration.Widget.Stats.Kind.homeAllTime.rawValue,
intent: SelectSiteIntent.self,
provider: SiteListProvider<HomeWidgetAllTimeData>(service: StatsWidgetsService(),
placeholderContent: placeholderContent,
Expand All @@ -25,8 +25,7 @@ struct HomeWidgetAllTime: Widget {

defer {
tracks.trackWidgetUpdatedIfNeeded(entry: entry,
widgetKind: AppConfiguration.Widget.Stats.allTimeKind,
widgetCountKey: AppConfiguration.Widget.Stats.allTimeProperties)
widgetKind: AppConfiguration.Widget.Stats.Kind.homeAllTime)
}

return StatsWidgetsView(timelineEntry: entry)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,7 @@ struct HomeWidgetThisWeek: Widget {

var body: some WidgetConfiguration {
IntentConfiguration(
kind: AppConfiguration.Widget.Stats.thisWeekKind,
kind: AppConfiguration.Widget.Stats.Kind.homeThisWeek.rawValue,
intent: SelectSiteIntent.self,
provider: SiteListProvider<HomeWidgetThisWeekData>(service: StatsWidgetsService(),
placeholderContent: placeholderContent,
Expand All @@ -45,8 +45,7 @@ struct HomeWidgetThisWeek: Widget {

defer {
tracks.trackWidgetUpdatedIfNeeded(entry: entry,
widgetKind: AppConfiguration.Widget.Stats.thisWeekKind,
widgetCountKey: AppConfiguration.Widget.Stats.thisWeekProperties)
widgetKind: AppConfiguration.Widget.Stats.Kind.homeThisWeek)
}

return StatsWidgetsView(timelineEntry: entry)
Expand Down
Loading