Files
2025-09-18 17:55:52 -04:00

437 lines
18 KiB
Plaintext

//
// RBMoreViewController.m
// RobloxMobile
//
// Created by Kyler Mulherin on 12/9/14.
// Copyright (c) 2014 ROBLOX. All rights reserved.
//
#import "RBMoreViewController.h"
#import "MoreTileButton.h"
#import "RBMobileWebViewController.h"
#import "RobloxTheme.h"
#import "RobloxInfo.h"
#import "UIView+Position.h"
#import "RobloxNotifications.h"
#import "UITabBarItem+CustomBadge.h"
#import "RBXMessagesPollingService.h"
#import "iOSSettingsService.h"
#import "RobloxWebUtility.h"
#import "RBXFunctions.h"
#import "RBGroupsScreenController.h"
#import "RBInventoryScreenController.h"
#import "RBProfileViewController.h"
#import "RBWebMessagesViewController.h"
#import "RBWebProfileViewController.h"
#define MS_openRobux @"MORE SCREEN - Open Robux"
#define MS_openBuildersClub @"MORE SCREEN - Open Builders Club"
#define BLOG_openRobux @"BLOG SCREEN - Open Robux"
#define BLOG_openBuildersClub @"BLOG SCREEN - Open Builders Club"
#define CHARACTER_openRobux @"CHARACTER SCREEN - Open Robux"
#define CHARACTER_openBuildersClub @"CHARACTER SCREEN - Open Builders Club"
#define FORUM_openRobux @"FORUM SCREEN - Open Robux"
#define FORUM_openBuildersClub @"FORUM SCREEN - Open Builders Club"
#define SETTINGS_openRobux @"SETTINGS SCREEN - Open Robux"
#define SETTINGS_openBuildersClub @"SETTINGS SCREEN - Open Builders Club"
#define TRADE_openRobux @"TRADE SCREEN - Open Robux"
#define TRADE_openBuildersClub @"TRADE SCREEN - Open Builders Club"
DYNAMIC_FASTFLAGVARIABLE(EnablePinchToZoomOnSponsored, true);
@interface RBMoreViewController ()
@end
@implementation RBMoreViewController
{
RBXAnalyticsCustomData mostRecentTab;
}
-(id) initWithCoder:(NSCoder *)aDecoder
{
self = [super initWithCoder:aDecoder];
if (self)
[self initNotificationPolling];
return self;
}
- (void)viewDidLoad
{
[super viewDidLoad];
//localize strings
[self setTitle:NSLocalizedString(@"MoreWord", nil)];
[_lblEvents setText:NSLocalizedString(@"EventsWord", nil)];
[_lblEvents setFont:[RobloxTheme fontH4]];
//apply themes
[self setViewTheme:RBXThemeGeneric];
[self.view setBackgroundColor:[RobloxTheme lightBackground]];
_btnEvent1.hidden = YES;
_btnEvent2.hidden = YES;
_btnEvent3.hidden = YES;
_btnEvent4.hidden = YES;
[self fetchEvents];
}
- (void)viewWillAppear:(BOOL)animated
{
[super viewWillAppear:animated];
[[RBXEventReporter sharedInstance] reportScreenLoaded:RBXAContextMain];
[self updateBadge];
if (![RobloxInfo thisDeviceIsATablet])
{
[_btnCharacter setIsEnabled:[self isCharacterLinkEnabled]];
[_btnForum setIsEnabled:[self isForumLinkEnabled]];
[_btnTrade setIsEnabled:[self isTradeLinkEnabled]];
}
[self fetchEvents];
//set a default
mostRecentTab = RBXACustomTabMore;
}
-(RBXAnalyticsCustomData) getMostRecentTab
{
return mostRecentTab;
}
#pragma mark
#pragma Button Actions
-(IBAction)openBlog:(id)sender
{
mostRecentTab = RBXACustomTabBlog;
[[RBXEventReporter sharedInstance] reportButtonClick:RBXAButtonMoreButton withContext:RBXAContextMain withCustomData:mostRecentTab];
//this URL is responsive and should be fine
RBMobileWebViewController* moreWeb = [self makeWebControllerwithURL:@"http://blog.watrbx.wtf"
withTitle:NSLocalizedString(@"BlogWord", nil)
andTheme:RBXThemeSocial
addIcons:YES
withRobuxFlurryEvent:BLOG_openRobux
andBCFlurryEvent:BLOG_openBuildersClub];
[self.navigationController pushViewController:moreWeb animated:YES];
}
-(IBAction)openCharacter:(id)sender
{
mostRecentTab = RBXACustomTabCharacter;
[[RBXEventReporter sharedInstance] reportButtonClick:RBXAButtonMoreButton withContext:RBXAContextMain withCustomData:mostRecentTab];
//this will cause problems on iPhone
NSString* url = [[RobloxInfo getWWWBaseUrl] stringByAppendingString:@"My/Character.aspx"];
RBMobileWebViewController* moreWeb = [self makeWebControllerwithURL:url
withTitle:NSLocalizedString(@"CharacterWord", nil)
andTheme:RBXThemeCreative
addIcons:YES
withRobuxFlurryEvent:CHARACTER_openRobux
andBCFlurryEvent:CHARACTER_openBuildersClub];
[self.navigationController pushViewController:moreWeb animated:YES];
}
-(IBAction)openForum:(id)sender
{
mostRecentTab = RBXACustomTabForum;
[[RBXEventReporter sharedInstance] reportButtonClick:RBXAButtonMoreButton withContext:RBXAContextMain withCustomData:mostRecentTab];
//this runs risks on iPhone
NSString* url = [[RobloxInfo getWWWBaseUrl] stringByAppendingString:@"Forum/default.aspx"];
RBMobileWebViewController* moreWeb = [self makeWebControllerwithURL:url
withTitle:NSLocalizedString(@"ForumWord", nil)
andTheme:RBXThemeSocial
addIcons:YES
withRobuxFlurryEvent:FORUM_openRobux
andBCFlurryEvent:FORUM_openBuildersClub];
[self.navigationController pushViewController:moreWeb animated:YES];
}
-(IBAction)openGroups:(id)sender
{
mostRecentTab = RBXACustomTabGroups;
[[RBXEventReporter sharedInstance] reportButtonClick:RBXAButtonMoreButton withContext:RBXAContextMain withCustomData:mostRecentTab];
//RBGroupsScreenController* screen = [[RBGroupsScreenController alloc] initWithNavButtons:YES];
//[self.navigationController pushViewController:screen animated:YES];
NSString* url = [[RobloxInfo getBaseUrl] stringByAppendingString:[RobloxInfo thisDeviceIsATablet] ? @"My/Groups.aspx" : @"my-groups"];
RBMobileWebViewController* moreWeb = [self makeWebControllerwithURL:url
withTitle:NSLocalizedString(@"GroupsWord", nil)
andTheme:RBXThemeSocial
addIcons:YES
withRobuxFlurryEvent:nil
andBCFlurryEvent:nil];
[self.navigationController pushViewController:moreWeb animated:YES];
}
-(IBAction)openHelp:(id)sender
{
mostRecentTab = RBXACustomTabHelp;
[[RBXEventReporter sharedInstance] reportButtonClick:RBXAButtonMoreButton withContext:RBXAContextMain withCustomData:mostRecentTab];
//NSString* helpURL = [NSString stringWithFormat:@"http://%@.help.watrbx.wtf/hc/%@"] //figure out how to localize this url?!!
RBMobileWebViewController* moreWeb = [self makeWebControllerwithURL:@"http://en.help.watrbx.wtf/hc/en-us"
withTitle:NSLocalizedString(@"HelpWord", nil)
andTheme:RBXThemeGeneric
addIcons:NO
withRobuxFlurryEvent:nil
andBCFlurryEvent:nil];
[self.navigationController pushViewController:moreWeb animated:YES];
}
-(IBAction)openInventory:(id)sender
{
mostRecentTab = RBXACustomTabInventory;
[[RBXEventReporter sharedInstance] reportButtonClick:RBXAButtonMoreButton withContext:RBXAContextMain withCustomData:mostRecentTab];
//RBInventoryScreenController* screen = [[RBInventoryScreenController alloc] initWithNavButtons:YES];
//[self.navigationController pushViewController:screen animated:YES];
NSString* url = [NSString stringWithFormat:@"%@users/%@/inventory#!/hats", [RobloxInfo getWWWBaseUrl], [UserInfo CurrentPlayer].userId];
RBMobileWebViewController* moreWeb = [self makeWebControllerwithURL:url
withTitle:NSLocalizedString(@"InventoryWord", nil)
andTheme:RBXThemeGame
addIcons:YES
withRobuxFlurryEvent:nil
andBCFlurryEvent:nil];
[self.navigationController pushViewController:moreWeb animated:YES];
}
-(IBAction)openCatalog:(id)sender
{
mostRecentTab = RBXACustomTabCatalog;
[[RBXEventReporter sharedInstance] reportButtonClick:RBXAButtonMoreButton withContext:RBXAContextMain withCustomData:mostRecentTab];
NSString* url = [[RobloxInfo getBaseUrl] stringByAppendingString:@"catalog/"];
RBMobileWebViewController* moreWeb = [self makeWebControllerwithURL:url
withTitle:NSLocalizedString(@"CatalogWord", nil)
andTheme:RBXThemeGame
addIcons:YES
withRobuxFlurryEvent:CHARACTER_openRobux
andBCFlurryEvent:CHARACTER_openRobux];
[self.navigationController pushViewController:moreWeb animated:YES];
}
-(IBAction)openProfile:(id)sender
{
mostRecentTab = RBXACustomTabProfile;
[[RBXEventReporter sharedInstance] reportButtonClick:RBXAButtonMoreButton withContext:RBXAContextMain withCustomData:mostRecentTab];
[self pushProfileControllerWithUserID:[UserInfo CurrentPlayer].userId];
}
-(IBAction)openSettings:(id)sender
{
mostRecentTab = RBXACustomTabSettings;
[[RBXEventReporter sharedInstance] reportButtonClick:RBXAButtonMoreButton withContext:RBXAContextMain withCustomData:mostRecentTab];
//if ([RobloxInfo thisDeviceIsATablet])
// [self didPressEditAccount];
//else
[self performSegueWithIdentifier:@"pushSettings" sender:self];
}
-(IBAction)openTrade:(id)sender
{
mostRecentTab = RBXACustomTabTrade;
[[RBXEventReporter sharedInstance] reportButtonClick:RBXAButtonMoreButton withContext:RBXAContextMain withCustomData:mostRecentTab];
//THIS WILL CAUSE PROBLEMS ON iPhone
NSString* url = [[RobloxInfo getWWWBaseUrl] stringByAppendingString:@"My/Money.aspx"];
RBMobileWebViewController* moreWeb = [self makeWebControllerwithURL:url
withTitle:NSLocalizedString(@"TradeWord", nil)
andTheme:RBXThemeSocial
addIcons:YES
withRobuxFlurryEvent:TRADE_openRobux
andBCFlurryEvent:TRADE_openBuildersClub];
[self.navigationController pushViewController:moreWeb animated:YES];
}
-(IBAction)openEvent:(id)sender
{
mostRecentTab = RBXACustomTabEvent;
[[RBXEventReporter sharedInstance] reportButtonClick:RBXAButtonMoreButton withContext:RBXAContextMain withCustomData:mostRecentTab];
MoreTileButton* btnSender = sender;
RBXSponsoredEvent* eventInfo = (RBXSponsoredEvent*)btnSender.extraInfo;
//open the page held at the url
NSString* url = [[RobloxInfo getWWWBaseUrl] stringByAppendingString:eventInfo.eventPageURLExtension];
RBMobileWebViewController* moreWeb = [self makeWebControllerwithURL:url
withTitle:eventInfo.eventName
andTheme:RBXThemeGame
addIcons:YES
withRobuxFlurryEvent:nil
andBCFlurryEvent:nil];
[moreWeb setToShowWholeScreen: DFFlag::EnablePinchToZoomOnSponsored];
[self.navigationController pushViewController:moreWeb animated:YES];
}
-(RBMobileWebViewController*) makeWebControllerwithURL:(NSString*)stringURL
withTitle:(NSString*)pageTitle
andTheme:(RBXTheme)viewTheme
addIcons:(BOOL)addIcons
withRobuxFlurryEvent:(NSString*)flurryRobux
andBCFlurryEvent:(NSString*)flurryBC
{
RBMobileWebViewController* moreWeb = [[RBMobileWebViewController alloc] initWithNavButtons:YES];
[moreWeb setViewTheme:viewTheme];
[moreWeb setUrl:stringURL];
[moreWeb setTitle:pageTitle];
if (addIcons)
[moreWeb addRobuxIconWithFlurryEvent:flurryRobux andBCIconWithFlurryEvent:flurryBC];
return moreWeb;
}
#pragma mark
#pragma Helper Functions
-(void) initMoreButton:(MoreTileButton*)aButton withEvent:(RBXSponsoredEvent*)eventData
{
if (!aButton) return;
dispatch_async(dispatch_get_main_queue(), ^
{
if (eventData)
{
UIImage* eventImage = [UIImage imageWithData:[NSData dataWithContentsOfURL:[NSURL URLWithString:eventData.eventLogoURLString]]];
[aButton setImageName:eventImage];
[aButton setExtraInfo:eventData];
aButton.hidden = NO;
}
else
{
aButton.hidden = YES;
}
});
}
-(void) fetchEvents
{
[RobloxData fetchSponsoredEvents:^(NSArray *events)
{
[RBXFunctions dispatchOnMainThread:^
{
_lblEvents.hidden = (events.count == 0);
RBXSponsoredEvent* evt1 = (events.count >= 1) ? events[0] : nil;
RBXSponsoredEvent* evt2 = (events.count >= 2) ? events[1] : nil;
RBXSponsoredEvent* evt3 = (events.count >= 3) ? events[2] : nil;
RBXSponsoredEvent* evt4 = (events.count >= 4) ? events[3] : nil;
//format phone event buttons
if (![RobloxInfo thisDeviceIsATablet])
{
float contentWidth = _btnCatalog.width;
switch (events.count)
{
case 1: {
//one big wide button
[_btnEvent1 setWidth:contentWidth];
}break;
case 2: {
//two stacked wide buttons
[_btnEvent1 setWidth:contentWidth];
[_btnEvent3 setWidth:contentWidth];
evt2 = nil;
evt3 = events[1];
}break;
case 3: {
//one big wide button
//two small buttons below
[_btnEvent1 setWidth:contentWidth];
[_btnEvent3 setWidth:_btnEvent4.width];
evt2 = nil;
evt3 = events[1];
evt4 = events[2];
}break;
default:
{
//four small buttons
[_btnEvent1 setWidth:_btnEvent4.width];
[_btnEvent2 setWidth:_btnEvent4.width];
[_btnEvent3 setWidth:_btnEvent4.width];
}
}
}
//update the button's target - passing nil hides the button
[self initMoreButton:_btnEvent1 withEvent:evt1];
[self initMoreButton:_btnEvent2 withEvent:evt2];
[self initMoreButton:_btnEvent3 withEvent:evt3];
[self initMoreButton:_btnEvent4 withEvent:evt4];
}];
}];
}
#pragma mark
#pragma iOS Settings Flags
- (BOOL)isCharacterLinkEnabled
{
iOSSettingsService* iOSSettings = [[RobloxWebUtility sharedInstance] getCachediOSSettings];
return iOSSettings->GetValueEnableLinkCharacter();
}
- (BOOL)isForumLinkEnabled
{
iOSSettingsService* iOSSettings = [[RobloxWebUtility sharedInstance] getCachediOSSettings];
return iOSSettings->GetValueEnableLinkForum();
}
- (BOOL)isTradeLinkEnabled
{
iOSSettingsService* iOSSettings = [[RobloxWebUtility sharedInstance] getCachediOSSettings];
return iOSSettings->GetValueEnableLinkTrade();
}
#pragma mark
#pragma Notification Polling functions
-(void) initNotificationPolling
{
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(updateBadge) name:RBX_NOTIFY_LOGGED_OUT object:nil];
[self updateBadge];
}
-(void) updateBadge
{
dispatch_async(dispatch_get_main_queue(), ^
{
if (![UserInfo CurrentPlayer].userLoggedIn)
{
[_btnSettings setBadgeValue:nil];
if ([self navigationController] && [[self navigationController] tabBarItem])
[self.navigationController.tabBarItem setBadgeValue:nil];
return;
}
//dispatch the update command to the main thread for instant update
int totalSettings = 0;
if ([UserInfo CurrentPlayer].accountNotifications)
{
totalSettings += ([UserInfo CurrentPlayer].accountNotifications.passwordNotificationEnabled && [UserInfo CurrentPlayer].password == nil) ? 1 : 0;
totalSettings += ([UserInfo CurrentPlayer].accountNotifications.emailNotificationEnabled && [UserInfo CurrentPlayer].userEmail == nil)? 1 : 0;
}
//add the badge to the settings button
if (_btnSettings)
[_btnSettings setBadgeValue:(totalSettings <= 0) ? nil : [NSString stringWithFormat:@"%i",totalSettings]];
//add the badge to the navigational tab bar
if ([self navigationController] && [[self navigationController] tabBarItem])
{
[self.navigationController.tabBarItem setBadgeValue:((totalSettings <= 0) ? nil : [NSString stringWithFormat:@"%i",totalSettings])];
}
});
}
@end