Instrument missing screen metrics (#5764)

* Instrument missing screen metrics

- Done
This commit is contained in:
Gil Eluard 2022-03-08 10:13:46 +01:00 committed by GitHub
parent 962f2260bb
commit 9ebd8a4802
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
56 changed files with 269 additions and 246 deletions

View file

@ -32,6 +32,7 @@ import AnalyticsEvents
case searchPeople
case searchFiles
case room
case roomPreview
case roomDetails
case roomMembers
case user
@ -47,11 +48,16 @@ import AnalyticsEvents
case settingsSecurity
case settingsDefaultNotifications
case settingsMentionsAndKeywords
case settingsNotifications
case deactivateAccount
case group
case myGroups
case inviteFriends
case threadList
case spaceMenu
case spaceMembers
case spaceExploreRooms
case dialpad
/// The screen name reported to the AnalyticsEvent.
var screenName: AnalyticsEvent.MobileScreen.ScreenName {
@ -90,6 +96,8 @@ import AnalyticsEvents
return .RoomMembers
case .user:
return .User
case .roomPreview:
return .RoomPreview
case .roomSearch:
return .RoomSearch
case .roomUploads:
@ -114,6 +122,8 @@ import AnalyticsEvents
return .SettingsDefaultNotifications
case .settingsMentionsAndKeywords:
return .SettingsMentionsAndKeywords
case .settingsNotifications:
return .SettingsNotifications
case .deactivateAccount:
return .DeactivateAccount
case .group:
@ -124,6 +134,14 @@ import AnalyticsEvents
return .InviteFriends
case .threadList:
return .ThreadList
case .spaceMenu:
return .SpaceMenu
case .spaceMembers:
return .SpaceMembers
case .spaceExploreRooms:
return .SpaceExploreRooms
case .dialpad:
return .Dialpad
}
}
}

View file

@ -0,0 +1,49 @@
//
// Copyright 2021 New Vector Ltd
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
//
import Foundation
/// An object to report the screen's display to the `Analytics` object.
@objcMembers class AnalyticsScreenTracker: NSObject {
// MARK: - Properties
/// The screen being tracked.
private let screen: AnalyticsScreen
// MARK: - Setup
/// Create a new screen tracker for the specified screen.
/// - Parameter screen: The screen that should be reported.
init(screen: AnalyticsScreen) {
self.screen = screen
super.init()
}
// MARK: - Public
/// Send screen event without duration
func trackScreen() {
Analytics.shared.trackScreen(screen)
}
// MARK: static method
static func trackScreen(_ screen: AnalyticsScreen) {
Analytics.shared.trackScreen(screen)
}
}

View file

@ -158,6 +158,12 @@ class DialpadViewController: UIViewController {
}
}
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
AnalyticsScreenTracker.trackScreen(.dialpad)
}
override var preferredStatusBarStyle: UIStatusBarStyle {
return self.theme.statusBarStyle
}

View file

@ -18,7 +18,7 @@
#import "MatrixKit.h"
@class RootTabEmptyView;
@class AnalyticsScreenTimer;
@class AnalyticsScreenTracker;
@class UserIndicatorPresenterWrapper;
/**
@ -95,7 +95,7 @@ FOUNDATION_EXPORT NSString *const RecentsViewControllerDataReadyNotification;
/**
The screen timer used for analytics if they've been enabled. The default value is nil.
*/
@property (nonatomic) AnalyticsScreenTimer *screenTimer;
@property (nonatomic) AnalyticsScreenTracker *screenTracker;
/**
Presenter for displaying app-wide user indicators. If not set, the view controller will use legacy activity indicators

View file

@ -264,6 +264,8 @@ NSString *const RecentsViewControllerDataReadyNotification = @"RecentsViewContro
- (void)viewWillAppear:(BOOL)animated
{
[super viewWillAppear:animated];
[self.screenTracker trackScreen];
// Reset back user interactions
self.userInteractionEnabled = YES;
@ -334,14 +336,6 @@ NSString *const RecentsViewControllerDataReadyNotification = @"RecentsViewContro
// the selected room (if any) is highlighted.
[self refreshCurrentSelectedCell:YES];
}
[self.screenTimer start];
}
- (void)viewDidDisappear:(BOOL)animated
{
[super viewDidDisappear:animated];
[self.screenTimer stop];
}
- (void)viewDidLayoutSubviews

View file

@ -42,7 +42,7 @@
__weak id kThemeServiceDidChangeThemeNotificationObserver;
}
@property (nonatomic) AnalyticsScreenTimer *screenTimer;
@property (nonatomic) AnalyticsScreenTracker *screenTracker;
@end
@ -77,7 +77,7 @@
// Set itself as delegate by default.
self.delegate = self;
self.screenTimer = [[AnalyticsScreenTimer alloc] initWithScreen:AnalyticsScreenMyGroups];
self.screenTracker = [[AnalyticsScreenTracker alloc] initWithScreen:AnalyticsScreenMyGroups];
}
- (void)viewDidLoad
@ -207,6 +207,8 @@
{
[super viewWillAppear:animated];
[self.screenTracker trackScreen];
// Deselect the current selected row, it will be restored on viewDidAppear (if any)
NSIndexPath *indexPath = [self.groupsTableView indexPathForSelectedRow];
if (indexPath)
@ -257,14 +259,6 @@
// the selected group (if any) is highlighted.
[self refreshCurrentSelectedCell:YES];
}
[self.screenTimer start];
}
- (void)viewDidDisappear:(BOOL)animated
{
[super viewDidDisappear:animated];
[self.screenTimer stop];
}
#pragma mark - Override MXKGroupListViewController

View file

@ -48,7 +48,7 @@
@property (nonatomic, readonly) DTHTMLAttributedStringBuilderWillFlushCallback longDescriptionSanitizationCallback;
@property (nonatomic) AnalyticsScreenTimer *screenTimer;
@property (nonatomic) AnalyticsScreenTracker *screenTracker;
@end
@ -98,7 +98,7 @@
[element sanitizeWith:allowedHTMLTags bodyFont:self->_groupLongDescription.font imageHandler:[self groupLongDescriptionImageHandler]];
};
self.screenTimer = [[AnalyticsScreenTimer alloc] initWithScreen:AnalyticsScreenGroup];
self.screenTracker = [[AnalyticsScreenTracker alloc] initWithScreen:AnalyticsScreenGroup];
}
- (void)viewDidLoad
@ -209,6 +209,8 @@
{
[super viewWillAppear:animated];
[self.screenTracker trackScreen];
// Release the potential pushed view controller
[self releasePushedViewController];
@ -260,18 +262,6 @@
[self cancelRegistrationOnGroupChangeNotifications];
}
- (void)viewDidAppear:(BOOL)animated
{
[super viewDidAppear:animated];
[self.screenTimer start];
}
- (void)viewDidDisappear:(BOOL)animated
{
[super viewDidDisappear:animated];
[self.screenTimer stop];
}
- (void)viewDidLayoutSubviews
{
[super viewDidLayoutSubviews];

View file

@ -19,7 +19,7 @@
#import "ContactTableViewCell.h"
@class ContactsTableViewController;
@class AnalyticsScreenTimer;
@class AnalyticsScreenTracker;
/**
`ContactsTableViewController` delegate.
@ -123,7 +123,7 @@
/**
The screen timer used for analytics if they've been enabled. The default value is nil.
*/
@property (nonatomic) AnalyticsScreenTimer *screenTimer;
@property (nonatomic) AnalyticsScreenTracker *screenTracker;
@end

View file

@ -179,12 +179,7 @@
// Show the contacts access footer if necessary.
[self updateFooterViewVisibility];
}
- (void)viewDidAppear:(BOOL)animated
{
[super viewDidAppear:animated];
[self.screenTimer start];
[self.screenTracker trackScreen];
}
- (void)viewDidLayoutSubviews
@ -211,12 +206,6 @@
}
}
- (void)viewDidDisappear:(BOOL)animated
{
[super viewDidDisappear:animated];
[self.screenTimer stop];
}
#pragma mark -
/**

View file

@ -55,7 +55,7 @@ final class EnterNewRoomDetailsViewController: UIViewController {
item.isEnabled = false
return item
}()
private var screenTimer = AnalyticsScreenTimer(screen: .createRoom)
private var screenTracker = AnalyticsScreenTracker(screen: .createRoom)
private enum RowType {
case `default`
@ -216,11 +216,7 @@ final class EnterNewRoomDetailsViewController: UIViewController {
super.viewWillAppear(animated)
self.keyboardAvoider?.startAvoiding()
}
override func viewDidAppear(_ animated: Bool) {
super.viewDidAppear(animated)
screenTimer.start()
screenTracker.trackScreen()
}
override func viewDidDisappear(_ animated: Bool) {
@ -228,7 +224,6 @@ final class EnterNewRoomDetailsViewController: UIViewController {
self.keyboardAvoider?.stopAvoiding()
screenTimer.stop()
}
override var preferredStatusBarStyle: UIStatusBarStyle {

View file

@ -43,7 +43,7 @@
self.enableDragging = YES;
self.screenTimer = [[AnalyticsScreenTimer alloc] initWithScreen:AnalyticsScreenFavourites];
self.screenTracker = [[AnalyticsScreenTracker alloc] initWithScreen:AnalyticsScreenFavourites];
self.tableViewPaginationThrottler = [[MXThrottler alloc] initWithMinimumDelay:0.1];
}

View file

@ -17,7 +17,7 @@
#import "MatrixKit.h"
@class AnalyticsScreenTimer;
@class AnalyticsScreenTracker;
/**
`HomeFilesSearchViewController` displays the files search in user's rooms under a `HomeViewController` segment.
@ -32,6 +32,6 @@
/**
The screen timer used for analytics if they've been enabled. The default value is nil.
*/
@property (nonatomic) AnalyticsScreenTimer *screenTimer;
@property (nonatomic) AnalyticsScreenTracker *screenTracker;
@end

View file

@ -111,6 +111,8 @@
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(refreshSearchResult:) name:kMXSessionDidLeaveRoomNotification object:nil];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(refreshSearchResult:) name:kMXSessionNewRoomNotification object:nil];
[self.screenTracker trackScreen];
}
- (void)viewWillDisappear:(BOOL)animated
@ -121,18 +123,6 @@
[[NSNotificationCenter defaultCenter] removeObserver:self name:kMXSessionNewRoomNotification object:nil];
}
- (void)viewDidAppear:(BOOL)animated
{
[super viewDidAppear:animated];
[self.screenTimer start];
}
- (void)viewDidDisappear:(BOOL)animated
{
[super viewDidDisappear:animated];
[self.screenTimer stop];
}
#pragma mark -
- (void)refreshSearchResult:(NSNotification *)notif

View file

@ -17,7 +17,7 @@
#import "MatrixKit.h"
@class AnalyticsScreenTimer;
@class AnalyticsScreenTracker;
/**
`HomeMessagesSearchViewController` displays messages search in user's rooms under a `HomeViewController` segment.
@ -32,6 +32,6 @@
/**
The screen timer used for analytics if they've been enabled. The default value is nil.
*/
@property (nonatomic) AnalyticsScreenTimer *screenTimer;
@property (nonatomic) AnalyticsScreenTracker *screenTracker;
@end

View file

@ -118,6 +118,8 @@
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(refreshSearchResult:) name:kMXSessionDidLeaveRoomNotification object:nil];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(refreshSearchResult:) name:kMXSessionNewRoomNotification object:nil];
[self.screenTracker trackScreen];
}
- (void)viewWillDisappear:(BOOL)animated
@ -128,18 +130,6 @@
[[NSNotificationCenter defaultCenter] removeObserver:self name:kMXSessionNewRoomNotification object:nil];
}
- (void)viewDidAppear:(BOOL)animated
{
[super viewDidAppear:animated];
[self.screenTimer start];
}
- (void)viewDidDisappear:(BOOL)animated
{
[super viewDidDisappear:animated];
[self.screenTimer stop];
}
#pragma mark -
- (void)refreshSearchResult:(NSNotification *)notif

View file

@ -35,7 +35,7 @@
id kThemeServiceDidChangeThemeNotificationObserver;
}
@property (nonatomic) AnalyticsScreenTimer *screenTimer;
@property (nonatomic) AnalyticsScreenTracker *screenTracker;
@end
@ -49,7 +49,7 @@
self.enableBarTintColorStatusChange = NO;
self.rageShakeManager = [RageShakeManager sharedManager];
self.screenTimer = [[AnalyticsScreenTimer alloc] initWithScreen:AnalyticsScreenRoomDirectory];
self.screenTracker = [[AnalyticsScreenTracker alloc] initWithScreen:AnalyticsScreenRoomDirectory];
}
- (void)viewDidLoad
@ -119,6 +119,7 @@
}];
[self.tableView reloadData];
[self.screenTracker trackScreen];
}
- (void)viewDidAppear:(BOOL)animated
@ -136,8 +137,6 @@
// the selected room (if any) is highlighted.
[self refreshCurrentSelectedCell:YES];
}
[self.screenTimer start];
}
- (void)viewWillDisappear:(BOOL)animated
@ -151,12 +150,6 @@
[super viewWillDisappear:animated];
}
- (void)viewDidDisappear:(BOOL)animated
{
[super viewDidDisappear:animated];
[self.screenTimer stop];
}
- (void)displayWitDataSource:(PublicRoomsDirectoryDataSource *)dataSource2
{
// Let the data source provide cells

View file

@ -79,13 +79,13 @@
[titles addObject:[VectorL10n searchRooms]];
recentsViewController = [RecentsViewController recentListViewController];
recentsViewController.screenTimer = [[AnalyticsScreenTimer alloc] initWithScreen:AnalyticsScreenSearchRooms];
recentsViewController.screenTracker = [[AnalyticsScreenTracker alloc] initWithScreen:AnalyticsScreenSearchRooms];
recentsViewController.enableSearchBar = NO;
[viewControllers addObject:recentsViewController];
[titles addObject:[VectorL10n searchMessages]];
messagesSearchViewController = [HomeMessagesSearchViewController searchViewController];
messagesSearchViewController.screenTimer = [[AnalyticsScreenTimer alloc] initWithScreen:AnalyticsScreenSearchMessages];
messagesSearchViewController.screenTracker = [[AnalyticsScreenTracker alloc] initWithScreen:AnalyticsScreenSearchMessages];
[viewControllers addObject:messagesSearchViewController];
// Add search People tab
@ -93,13 +93,13 @@
peopleSearchViewController = [ContactsTableViewController contactsTableViewController];
peopleSearchViewController.contactsTableViewControllerDelegate = self;
peopleSearchViewController.disableFindYourContactsFooter = YES;
peopleSearchViewController.screenTimer = [[AnalyticsScreenTimer alloc] initWithScreen:AnalyticsScreenSearchPeople];
peopleSearchViewController.screenTracker = [[AnalyticsScreenTracker alloc] initWithScreen:AnalyticsScreenSearchPeople];
[viewControllers addObject:peopleSearchViewController];
// add Files tab
[titles addObject:[VectorL10n searchFiles]];
filesSearchViewController = [HomeFilesSearchViewController searchViewController];
filesSearchViewController.screenTimer = [[AnalyticsScreenTimer alloc] initWithScreen:AnalyticsScreenSearchFiles];
filesSearchViewController.screenTracker = [[AnalyticsScreenTracker alloc] initWithScreen:AnalyticsScreenSearchFiles];
[viewControllers addObject:filesSearchViewController];
[self initWithTitles:titles viewControllers:viewControllers defaultSelected:0];

View file

@ -70,7 +70,7 @@
selectedRoomId = nil;
selectedCollectionViewContentOffset = -1;
self.screenTimer = [[AnalyticsScreenTimer alloc] initWithScreen:AnalyticsScreenHome];
self.screenTracker = [[AnalyticsScreenTracker alloc] initWithScreen:AnalyticsScreenHome];
self.collectionViewPaginationThrottler = [[MXThrottler alloc] initWithMinimumDelay:0.1];
}

View file

@ -56,7 +56,7 @@ class HomeViewControllerWithBannerWrapperViewController: UIViewController, MXKVi
stackView.addArrangedSubview(homeViewController.view)
homeViewController.didMove(toParent: self)
}
// MARK: - BannerPresentationProtocol
func presentBannerView(_ bannerView: UIView, animated: Bool) {

View file

@ -90,6 +90,10 @@
*/
@property (nonatomic) MXIdentityService *identityService;
@property (nonatomic) AnalyticsScreenTracker *screenTracker;
@property (nonatomic) BOOL isViewVisible;
@end
@implementation MXKAuthenticationViewController
@ -187,6 +191,9 @@
[super viewWillAppear:animated];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(onTextFieldChange:) name:UITextFieldTextDidChangeNotification object:nil];
self.isViewVisible = YES;
[self.screenTracker trackScreen];
}
- (void)viewWillDisappear:(BOOL)animated
@ -206,6 +213,13 @@
[[NSNotificationCenter defaultCenter] removeObserver:self name:UITextFieldTextDidChangeNotification object:nil];
}
- (void)viewDidDisappear:(BOOL)animated
{
[super viewDidDisappear:animated];
self.isViewVisible = NO;
}
#pragma mark - Override MXKViewController
- (void)onKeyboardShowAnimationComplete
@ -312,6 +326,8 @@
// Update supported authentication flow and associated information (defined in authentication session)
[self refreshAuthenticationSession];
self.screenTracker = [[AnalyticsScreenTracker alloc] initWithScreen:AnalyticsScreenLogin];
}
else if (authType == MXKAuthenticationTypeRegister)
{
@ -324,6 +340,8 @@
// Update supported authentication flow and associated information (defined in authentication session)
[self refreshAuthenticationSession];
self.screenTracker = [[AnalyticsScreenTracker alloc] initWithScreen:AnalyticsScreenRegister];
}
else if (authType == MXKAuthenticationTypeForgotPassword)
{
@ -344,8 +362,15 @@
[_authSwitchButton setTitle:[VectorL10n back] forState:UIControlStateNormal];
[_authSwitchButton setTitle:[VectorL10n back] forState:UIControlStateHighlighted];
self.screenTracker = [[AnalyticsScreenTracker alloc] initWithScreen:AnalyticsScreenForgotPassword];
}
if (self.isViewVisible)
{
[self.screenTracker trackScreen];
}
[self checkIdentityServer];
}

View file

@ -74,6 +74,6 @@ final class InviteFriendsPresenter: NSObject {
self.presentingViewController?.present(viewController, animated: animated, completion: nil)
Analytics.shared.trackScreen(.inviteFriends, duration: nil)
AnalyticsScreenTracker.trackScreen(.inviteFriends)
}
}

View file

@ -52,7 +52,7 @@
directRoomsSectionNumber = 0;
self.screenTimer = [[AnalyticsScreenTimer alloc] initWithScreen:AnalyticsScreenPeople];
self.screenTracker = [[AnalyticsScreenTracker alloc] initWithScreen:AnalyticsScreenPeople];
self.tableViewPaginationThrottler = [[MXThrottler alloc] initWithMinimumDelay:0.1];
}

View file

@ -16,7 +16,7 @@ limitations under the License.
#import "MatrixKit.h"
@class AnalyticsScreenTimer;
@class AnalyticsScreenTracker;
/**
This view controller displays the attachments of a room. Only one matrix session is handled by this view controller.
@ -28,6 +28,6 @@ limitations under the License.
/**
The screen timer used for analytics if they've been enabled. The default value is nil.
*/
@property (nonatomic) AnalyticsScreenTimer *screenTimer;
@property (nonatomic) AnalyticsScreenTracker *screenTracker;
@end

View file

@ -102,6 +102,13 @@
[self userInterfaceThemeDidChange];
}
- (void)viewWillAppear:(BOOL)animated
{
[super viewWillAppear:animated];
[self.screenTracker trackScreen];
}
- (void)viewDidAppear:(BOOL)animated
{
[super viewDidAppear:animated];
@ -110,14 +117,6 @@
[UIView setAnimationsEnabled:NO];
[self roomInputToolbarView:self.inputToolbarView heightDidChanged:0 completion:nil];
[UIView setAnimationsEnabled:YES];
[self.screenTimer start];
}
- (void)viewDidDisappear:(BOOL)animated
{
[super viewDidDisappear:animated];
[self.screenTimer stop];
}
- (void)userInterfaceThemeDidChange

View file

@ -104,7 +104,7 @@
@property(nonatomic, strong) UserVerificationCoordinatorBridgePresenter *userVerificationCoordinatorBridgePresenter;
@property(nonatomic) AnalyticsScreenTimer *screenTimer;
@property(nonatomic) AnalyticsScreenTracker *screenTracker;
@end
@ -142,7 +142,7 @@
// Keep visible the status bar by default.
isStatusBarHidden = NO;
self.screenTimer = [[AnalyticsScreenTimer alloc] initWithScreen:AnalyticsScreenUser];
self.screenTracker = [[AnalyticsScreenTracker alloc] initWithScreen:AnalyticsScreenUser];
}
- (void)viewDidLoad
@ -242,6 +242,8 @@
- (void)viewWillAppear:(BOOL)animated
{
[super viewWillAppear:animated];
[self.screenTracker trackScreen];
[self userInterfaceThemeDidChange];
@ -265,18 +267,6 @@
self.bottomImageView.hidden = YES;
}
- (void)viewDidAppear:(BOOL)animated
{
[super viewDidAppear:animated];
[self.screenTimer start];
}
- (void)viewDidDisappear:(BOOL)animated
{
[super viewDidDisappear:animated];
[self.screenTimer stop];
}
- (void)viewWillTransitionToSize:(CGSize)size withTransitionCoordinator:(id <UIViewControllerTransitionCoordinator>)coordinator
{
[super viewWillTransitionToSize:size withTransitionCoordinator:coordinator];

View file

@ -95,7 +95,7 @@
/**
The screen timer used for analytics if they've been enabled. The default value is nil.
*/
@property (nonatomic) AnalyticsScreenTimer *screenTimer;
@property (nonatomic) AnalyticsScreenTracker *screenTracker;
/**
Returns the `UINib` object initialized for a `RoomParticipantsViewController`.

View file

@ -251,6 +251,8 @@
// Refresh display
[self refreshTableView];
[self.screenTracker trackScreen];
}
- (void)viewDidAppear:(BOOL)animated
@ -268,8 +270,6 @@
[contactsPickerViewController destroy];
contactsPickerViewController = nil;
}
[self.screenTimer start];
}
- (void)viewWillDisappear:(BOOL)animated
@ -286,12 +286,6 @@
[self searchBarCancelButtonClicked:_searchBarView];
}
- (void)viewDidDisappear:(BOOL)animated
{
[super viewDidDisappear:animated];
[self.screenTimer stop];
}
- (void)withdrawViewControllerAnimated:(BOOL)animated completion:(void (^)(void))completion
{
// Check whether the current view controller is displayed inside a segmented view controller in order to withdraw the right item

View file

@ -39,11 +39,11 @@ final class RoomInfoCoordinator: NSObject, RoomInfoCoordinatorType {
participants.enableMention = true
participants.mxRoom = self.room
participants.delegate = self
participants.screenTimer = AnalyticsScreenTimer(screen: .roomMembers)
participants.screenTracker = AnalyticsScreenTracker(screen: .roomMembers)
let files = RoomFilesViewController()
files.finalizeInit()
files.screenTimer = AnalyticsScreenTimer(screen: .roomUploads)
files.screenTracker = AnalyticsScreenTracker(screen: .roomUploads)
MXKRoomDataSource.load(withRoomId: self.room.roomId, andMatrixSession: self.session) { (dataSource) in
guard let dataSource = dataSource as? MXKRoomDataSource else { return }
dataSource.filterMessagesWithURL = true
@ -54,7 +54,7 @@ final class RoomInfoCoordinator: NSObject, RoomInfoCoordinatorType {
let settings = RoomSettingsViewController()
settings.finalizeInit()
settings.screenTimer = AnalyticsScreenTimer(screen: .roomSettings)
settings.screenTracker = AnalyticsScreenTracker(screen: .roomSettings)
settings.initWith(self.session, andRoomId: self.room.roomId)
if self.room.isDirect {

View file

@ -43,7 +43,7 @@ final class RoomInfoListViewController: UIViewController {
private var indicatorPresenter: UserIndicatorTypePresenterProtocol!
private var loadingIndicator: UserIndicator?
private var isRoomDirect: Bool = false
private var screenTimer = AnalyticsScreenTimer(screen: .roomDetails)
private var screenTracker = AnalyticsScreenTracker(screen: .roomDetails)
private lazy var closeButton: CloseButton = {
let button = CloseButton()
@ -134,9 +134,9 @@ final class RoomInfoListViewController: UIViewController {
return self.theme.statusBarStyle
}
override func viewDidAppear(_ animated: Bool) {
super.viewDidAppear(animated)
screenTimer.start()
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
screenTracker.trackScreen()
}
override func viewDidLayoutSubviews() {
@ -147,7 +147,6 @@ final class RoomInfoListViewController: UIViewController {
override func viewDidDisappear(_ animated: Bool) {
super.viewDidDisappear(animated)
screenTimer.stop()
stopLoading()
}

View file

@ -216,7 +216,6 @@ const NSTimeInterval kResizeComposerAnimationDuration = .05;
@property (nonatomic, weak) IBOutlet UIView *userSuggestionContainerView;
@property (nonatomic, readwrite) RoomDisplayConfiguration *displayConfiguration;
@property (nonatomic) AnalyticsScreenTimer *screenTimer;
// When layout of the screen changes (e.g. height), we no longer know whether
// to autoscroll to the bottom again or not. Instead we need to capture the
@ -321,8 +320,6 @@ const NSTimeInterval kResizeComposerAnimationDuration = .05;
_voiceMessageController = [[VoiceMessageController alloc] initWithThemeService:ThemeService.shared mediaServiceProvider:VoiceMessageMediaServiceProvider.sharedProvider];
self.voiceMessageController.delegate = self;
self.screenTimer = [[AnalyticsScreenTimer alloc] initWithScreen:AnalyticsScreenRoom];
}
- (void)viewDidLoad
@ -577,6 +574,17 @@ const NSTimeInterval kResizeComposerAnimationDuration = .05;
{
[super viewDidAppear:animated];
// Screen tracking
MXRoomSummary *summary = [self.mainSession roomWithRoomId:self.roomDataSource.roomId].summary;
if (!summary || !summary.isJoined)
{
[AnalyticsScreenTracker trackScreen: AnalyticsScreenRoomPreview];
}
else
{
[AnalyticsScreenTracker trackScreen: AnalyticsScreenRoom];
}
isAppeared = YES;
[self checkReadMarkerVisibility];
@ -621,9 +629,6 @@ const NSTimeInterval kResizeComposerAnimationDuration = .05;
hasJitsiCall = NO;
[self reloadBubblesTable:YES];
}
// Screen tracking
[self.screenTimer start];
}
- (void)viewDidDisappear:(BOOL)animated
@ -659,8 +664,6 @@ const NSTimeInterval kResizeComposerAnimationDuration = .05;
hasJitsiCall = YES;
[self reloadBubblesTable:YES];
}
[self.screenTimer stop];
}
- (void)viewWillLayoutSubviews {

View file

@ -33,7 +33,7 @@
MXKSearchDataSource *filesSearchDataSource;
}
@property (nonatomic) AnalyticsScreenTimer *screenTimer;
@property (nonatomic) AnalyticsScreenTracker *screenTracker;
@end
@ -52,7 +52,7 @@
// The navigation bar tint color and the rageShake Manager are handled by super (see SegmentedViewController).
self.screenTimer = [[AnalyticsScreenTimer alloc] initWithScreen:AnalyticsScreenRoomSearch];
self.screenTracker = [[AnalyticsScreenTracker alloc] initWithScreen:AnalyticsScreenRoomSearch];
}
- (void)viewDidLoad
@ -97,6 +97,8 @@
{
[super viewWillAppear:animated];
[self.screenTracker trackScreen];
// Let's child display the loading not this view controller
if (self.activityIndicator)
{
@ -118,8 +120,6 @@
// Refresh the search results.
// Note: We wait for 'viewDidAppear' call to consider the actual view size during this update.
[self updateSearch];
[self.screenTimer start];
}
- (void)viewWillDisappear:(BOOL)animated
@ -134,12 +134,6 @@
[super viewWillDisappear:animated];
}
- (void)viewDidDisappear:(BOOL)animated
{
[super viewDidDisappear:animated];
[self.screenTimer stop];
}
- (UIStatusBarStyle)preferredStatusBarStyle
{
return ThemeService.shared.theme.statusBarStyle;

View file

@ -19,7 +19,7 @@
#import "MediaPickerViewController.h"
#import "TableViewCellWithCheckBoxes.h"
@class AnalyticsScreenTimer;
@class AnalyticsScreenTracker;
/**
List the settings fields. Used to preselect/edit a field
@ -57,7 +57,7 @@ typedef enum : NSUInteger {
/**
The screen timer used for analytics if they've been enabled. The default value is nil.
*/
@property (nonatomic) AnalyticsScreenTimer *screenTimer;
@property (nonatomic) AnalyticsScreenTracker *screenTracker;
@end

View file

@ -309,6 +309,8 @@ NSString *const kRoomSettingsAdvancedE2eEnabledCellViewIdentifier = @"kRoomSetti
{
[super viewWillAppear:animated];
[self.screenTracker trackScreen];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(didUpdateRules:) name:kMXNotificationCenterDidUpdateRules object:nil];
// Observe appDelegateDidTapStatusBarNotificationObserver.
@ -328,8 +330,6 @@ NSString *const kRoomSettingsAdvancedE2eEnabledCellViewIdentifier = @"kRoomSetti
{
self.selectedRoomSettingsField = _selectedRoomSettingsField;
}
[self.screenTimer start];
}
- (void)viewWillDisappear:(BOOL)animated
@ -347,12 +347,6 @@ NSString *const kRoomSettingsAdvancedE2eEnabledCellViewIdentifier = @"kRoomSetti
}
}
- (void)viewDidDisappear:(BOOL)animated
{
[super viewDidDisappear:animated];
[self.screenTimer stop];
}
// Those methods are called when the viewcontroller is added or removed from a container view controller.
- (void)willMoveToParentViewController:(nullable UIViewController *)parent
{

View file

@ -39,7 +39,7 @@
id kThemeServiceDidChangeThemeNotificationObserver;
}
@property (nonatomic) AnalyticsScreenTimer *screenTimer;
@property (nonatomic) AnalyticsScreenTracker *screenTracker;
@end
@ -53,7 +53,7 @@
self.enableBarTintColorStatusChange = NO;
self.rageShakeManager = [RageShakeManager sharedManager];
self.screenTimer = [[AnalyticsScreenTimer alloc] initWithScreen:AnalyticsScreenSwitchDirectory];
self.screenTracker = [[AnalyticsScreenTracker alloc] initWithScreen:AnalyticsScreenSwitchDirectory];
}
- (void)destroy
@ -158,12 +158,7 @@
}];
[dataSource loadData];
}
- (void)viewDidAppear:(BOOL)animated
{
[super viewDidAppear:animated];
[self.screenTimer start];
[self.screenTracker trackScreen];
}
- (void)viewWillDisappear:(BOOL)animated
@ -177,12 +172,6 @@
[super viewWillDisappear:animated];
}
- (void)viewDidDisappear:(BOOL)animated
{
[super viewDidDisappear:animated];
[self.screenTimer stop];
}
- (void)displayWithDataSource:(MXKDirectoryServersDataSource*)theDataSource
onComplete:(void (^)(id<MXKDirectoryServerCellDataStoring> cellData))onComplete;
{

View file

@ -42,7 +42,7 @@
{
[super finalizeInit];
self.screenTimer = [[AnalyticsScreenTimer alloc] initWithScreen:AnalyticsScreenRooms];
self.screenTracker = [[AnalyticsScreenTracker alloc] initWithScreen:AnalyticsScreenRooms];
self.tableViewPaginationThrottler = [[MXThrottler alloc] initWithMinimumDelay:0.1];
}

View file

@ -69,7 +69,7 @@ final class ShowDirectoryViewController: UIViewController {
private var sections: [ShowDirectorySection] = []
private let screenTimer = AnalyticsScreenTimer(screen: .roomDirectory)
private let screenTracker = AnalyticsScreenTracker(screen: .roomDirectory)
// MARK: - Setup
@ -104,11 +104,7 @@ final class ShowDirectoryViewController: UIViewController {
super.viewWillAppear(animated)
self.keyboardAvoider?.startAvoiding()
}
override func viewDidAppear(_ animated: Bool) {
super.viewDidAppear(animated)
screenTimer.start()
screenTracker.trackScreen()
}
override func viewDidDisappear(_ animated: Bool) {
@ -116,7 +112,6 @@ final class ShowDirectoryViewController: UIViewController {
self.keyboardAvoider?.stopAvoiding()
screenTimer.stop()
}
override var preferredStatusBarStyle: UIStatusBarStyle {

View file

@ -47,7 +47,7 @@ static CGFloat const kTextFontSize = 15.0;
@property (weak, nonatomic) id <NSObject> themeDidChangeNotificationObserver;
@property (nonatomic) AnalyticsScreenTimer *screenTimer;
@property (nonatomic) AnalyticsScreenTracker *screenTracker;
@end
@ -67,7 +67,7 @@ static CGFloat const kTextFontSize = 15.0;
- (void)finalizeInit
{
[super finalizeInit];
self.screenTimer = [[AnalyticsScreenTimer alloc] initWithScreen:AnalyticsScreenDeactivateAccount];
self.screenTracker = [[AnalyticsScreenTracker alloc] initWithScreen:AnalyticsScreenDeactivateAccount];
}
- (void)destroy
@ -103,12 +103,7 @@ static CGFloat const kTextFontSize = 15.0;
[super viewWillAppear:animated];
[self userInterfaceThemeDidChange];
}
- (void)viewDidAppear:(BOOL)animated
{
[super viewDidAppear:animated];
[self.screenTimer start];
[self.screenTracker trackScreen];
}
- (void)viewDidLayoutSubviews
@ -118,12 +113,6 @@ static CGFloat const kTextFontSize = 15.0;
[self.deactivateAcccountButton.layer setCornerRadius:kButtonCornerRadius];
}
- (void)viewDidDisappear:(BOOL)animated
{
[super viewDidDisappear:animated];
[self.screenTimer stop];
}
- (UIStatusBarStyle)preferredStatusBarStyle
{
return ThemeService.shared.theme.statusBarStyle;

View file

@ -119,7 +119,7 @@ TableViewSectionsDelegate>
@property (nonatomic, strong) SetPinCoordinatorBridgePresenter *setPinCoordinatorBridgePresenter;
@property (nonatomic, strong) CrossSigningSetupCoordinatorBridgePresenter *crossSigningSetupCoordinatorBridgePresenter;
@property (nonatomic) AnalyticsScreenTimer *screenTimer;
@property (nonatomic) AnalyticsScreenTracker *screenTracker;
@end
@ -145,7 +145,7 @@ TableViewSectionsDelegate>
self.enableBarTintColorStatusChange = NO;
self.rageShakeManager = [RageShakeManager sharedManager];
self.screenTimer = [[AnalyticsScreenTimer alloc] initWithScreen:AnalyticsScreenSettingsSecurity];
self.screenTracker = [[AnalyticsScreenTracker alloc] initWithScreen:AnalyticsScreenSettingsSecurity];
}
- (void)viewDidLoad
@ -254,6 +254,8 @@ TableViewSectionsDelegate>
{
[super viewWillAppear:animated];
[self.screenTracker trackScreen];
// Release the potential pushed view controller
[self releasePushedViewController];
@ -269,12 +271,6 @@ TableViewSectionsDelegate>
[self loadCrossSigning];
}
- (void)viewDidAppear:(BOOL)animated
{
[super viewDidAppear:animated];
[self.screenTimer start];
}
- (void)viewWillDisappear:(BOOL)animated
{
[super viewWillDisappear:animated];
@ -286,12 +282,6 @@ TableViewSectionsDelegate>
}
}
- (void)viewDidDisappear:(BOOL)animated
{
[super viewDidDisappear:animated];
[self.screenTimer stop];
}
#pragma mark - Internal methods
- (void)updateSections

View file

@ -289,7 +289,7 @@ TableViewSectionsDelegate>
@property (nonatomic) BOOL isPreparingIdentityService;
@property (nonatomic, strong) ServiceTermsModalCoordinatorBridgePresenter *serviceTermsModalCoordinatorBridgePresenter;
@property (nonatomic) AnalyticsScreenTimer *screenTimer;
@property (nonatomic) AnalyticsScreenTracker *screenTracker;
@end
@ -324,7 +324,7 @@ TableViewSectionsDelegate>
isResetPwdInProgress = NO;
is3PIDBindingInProgress = NO;
self.screenTimer = [[AnalyticsScreenTimer alloc] initWithScreen:AnalyticsScreenSettings];
self.screenTracker = [[AnalyticsScreenTracker alloc] initWithScreen:AnalyticsScreenSettings];
}
- (void)updateSections
@ -797,6 +797,8 @@ TableViewSectionsDelegate>
{
[super viewWillAppear:animated];
[self.screenTracker trackScreen];
// Refresh display
[self refreshSettings];
@ -825,8 +827,6 @@ TableViewSectionsDelegate>
[self releasePushedViewController];
[self.settingsDiscoveryTableViewSection reload];
[self.screenTimer start];
}
- (void)viewWillDisappear:(BOOL)animated
@ -870,12 +870,6 @@ TableViewSectionsDelegate>
}
}
- (void)viewDidDisappear:(BOOL)animated
{
[super viewDidDisappear:animated];
[self.screenTimer stop];
}
#pragma mark - Internal methods
- (void)pushViewController:(UIViewController*)viewController

View file

@ -48,7 +48,7 @@ final class SideMenuViewController: UIViewController {
private var keyboardAvoider: KeyboardAvoider?
private var errorPresenter: MXKErrorPresentation!
private var activityPresenter: ActivityIndicatorPresenter!
private var screenTimer = AnalyticsScreenTimer(screen: .sidebar)
private var screenTracker = AnalyticsScreenTracker(screen: .sidebar)
private var sideMenuActionViews: [SideMenuActionView] = []
private weak var sideMenuVersionView: SideMenuVersionView?
@ -85,16 +85,7 @@ final class SideMenuViewController: UIViewController {
super.viewWillAppear(animated)
navigationController?.setNavigationBarHidden(true, animated: animated)
}
override func viewDidAppear(_ animated: Bool) {
super.viewDidAppear(animated)
screenTimer.start()
}
override func viewDidDisappear(_ animated: Bool) {
super.viewDidDisappear(animated)
screenTimer.stop()
screenTracker.trackScreen()
}
override var preferredStatusBarStyle: UIStatusBarStyle {

View file

@ -72,6 +72,12 @@ final class SpaceMemberListViewController: RoomParticipantsViewController {
self.title = ""
}
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
AnalyticsScreenTracker.trackScreen(.spaceMembers)
}
override var preferredStatusBarStyle: UIStatusBarStyle {
return self.theme.statusBarStyle

View file

@ -71,6 +71,12 @@ class SpaceMenuViewController: UIViewController {
self.viewModel.viewDelegate = self
}
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
AnalyticsScreenTracker.trackScreen(.spaceMenu)
}
override var preferredStatusBarStyle: UIStatusBarStyle {
return self.theme.statusBarStyle
}

View file

@ -96,6 +96,7 @@ final class SpaceExploreRoomViewController: UIViewController {
super.viewWillAppear(animated)
self.keyboardAvoider?.startAvoiding()
AnalyticsScreenTracker.trackScreen(.spaceExploreRooms)
}
override func viewDidDisappear(_ animated: Bool) {

View file

@ -74,6 +74,12 @@ final class SpaceChildRoomDetailViewController: UIViewController {
self.viewModel.process(viewAction: .loadData)
}
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
AnalyticsScreenTracker.trackScreen(.roomPreview)
}
override var preferredStatusBarStyle: UIStatusBarStyle {
return self.theme.statusBarStyle

View file

@ -81,7 +81,7 @@
// Assign itself as delegate
self.contactsTableViewControllerDelegate = self;
self.screenTimer = [[AnalyticsScreenTimer alloc] initWithScreen:AnalyticsScreenStartChat];
self.screenTracker = [[AnalyticsScreenTracker alloc] initWithScreen:AnalyticsScreenStartChat];
}
- (void)viewDidLoad

View file

@ -63,14 +63,13 @@ final class ThreadListViewController: UIViewController {
self.viewModel.viewDelegate = self
self.viewModel.process(viewAction: .loadData)
Analytics.shared.trackScreen(.threadList)
}
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
self.keyboardAvoider?.startAvoiding()
AnalyticsScreenTracker.trackScreen(.threadList)
}
override func viewDidDisappear(_ animated: Bool) {

View file

@ -0,0 +1,40 @@
//
// Copyright 2021 New Vector Ltd
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
//
import SwiftUI
@available(iOS 14.0, *)
/// `ScreenTrackerViewModifier` is a helper class used to track PostHog screen from SwiftUI screens.
struct ScreenTrackerViewModifier: ViewModifier {
let screen: AnalyticsScreen
@ViewBuilder
func body(content: Content) -> some View {
content
.onAppear {
#if canImport(MatrixSDK)
Analytics.shared.trackScreen(screen)
#endif
}
}
}
@available(iOS 14.0, *)
extension View {
func track(screen: AnalyticsScreen) -> some View {
return self.modifier(ScreenTrackerViewModifier(screen: screen))
}
}

View file

@ -112,8 +112,11 @@ struct OnboardingSplashScreen: View {
.background(theme.colors.background.ignoresSafeArea())
.accentColor(theme.colors.accent)
.navigationBarHidden(true)
.onAppear { startTimer() }
.onAppear {
startTimer()
}
.onDisappear { stopTimer() }
.track(screen: .welcome)
}
// MARK: - Animation

View file

@ -70,6 +70,7 @@ struct RoomNotificationSettings: View {
viewModel.process(viewAction: .load)
}
.accentColor(theme.colors.accent)
.track(screen: .roomNotifications)
}
}

View file

@ -24,6 +24,7 @@ struct DefaultNotificationSettings: View {
var body: some View {
NotificationSettings(viewModel: viewModel)
.navigationBarTitle(VectorL10n.settingsDefault)
.track(screen: .settingsDefaultNotifications)
}
}

View file

@ -35,6 +35,7 @@ struct MentionsAndKeywordNotificationSettings: View {
bottomSection: keywordSection
)
.navigationTitle(VectorL10n.settingsMentionsAndKeywords)
.track(screen: .settingsMentionsAndKeywords)
}
}

View file

@ -23,6 +23,7 @@ struct OtherNotificationSettings: View {
var body: some View {
NotificationSettings(viewModel: viewModel)
.navigationTitle(VectorL10n.settingsOther)
.track(screen: .settingsNotifications)
}
}

View file

@ -51,6 +51,7 @@ targets:
- path: ../Riot/Categories/UIColor.swift
- path: ../Riot/Categories/UISearchBar.swift
- path: ../Riot/Assets/en.lproj/Vector.strings
- path: ../Riot/Modules/Analytics/AnalyticsScreen.swift
- path: ../Riot/Assets/en.lproj/Untranslated.strings
buildPhase: resources
- path: ../Riot/Assets/Images.xcassets

View file

@ -59,6 +59,7 @@ targets:
- path: ../Riot/Categories/UIColor.swift
- path: ../Riot/Categories/UISearchBar.swift
- path: ../Riot/Assets/en.lproj/Vector.strings
- path: ../Riot/Modules/Analytics/AnalyticsScreen.swift
- path: ../Riot/Assets/en.lproj/Untranslated.strings
buildPhase: resources
- path: ../Riot/Assets/Images.xcassets

View file

@ -50,6 +50,7 @@ targets:
PROVISIONING_PROFILE: $(RIOT_PROVISIONING_PROFILE)
PROVISIONING_PROFILE_SPECIFIER: $(RIOT_PROVISIONING_PROFILE_SPECIFIER)
sources:
- path: ../Riot/Modules/Analytics/AnalyticsScreen.swift
- path: ../RiotSwiftUI/Modules
includes:
- "**/Test"

1
changelog.d/5763.change Normal file
View file

@ -0,0 +1 @@
Analytics: Instrument missing screen metrics.