From 0e9eafb0af762374c569e06f0af7f53ba205e4be Mon Sep 17 00:00:00 2001 From: Gautier Pelloux-Prayer Date: Thu, 16 Apr 2015 12:29:18 +0200 Subject: [PATCH] InAppProducts: integrating UI --- Classes/Base.lproj/ChatRoomViewController.xib | 19 ++--- Classes/InAppProductsCell.h | 27 +++++++ Classes/InAppProductsCell.m | 52 ++++++++++++++ Classes/InAppProductsCell.xib | 60 ++++++++++++++++ Classes/InAppProductsManager.h | 9 ++- Classes/InAppProductsManager.m | 35 +++++++--- Classes/InAppProductsTableViewController.h | 13 ++++ Classes/InAppProductsTableViewController.m | 70 +++++++++++++++++++ Classes/InAppProductsViewController.h | 18 +++++ Classes/InAppProductsViewController.m | 70 +++++++++++++++++++ Classes/InAppProductsViewController.xib | 48 +++++++++++++ Classes/PhoneMainView.m | 5 +- Classes/SettingsViewController.m | 6 +- Settings/InAppSettings.bundle/Root.plist | 8 +++ in_app_products.plist | 7 -- linphone-Info.plist | 2 +- linphone.xcodeproj/project.pbxproj | 30 ++++++-- 17 files changed, 446 insertions(+), 33 deletions(-) create mode 100644 Classes/InAppProductsCell.h create mode 100644 Classes/InAppProductsCell.m create mode 100644 Classes/InAppProductsCell.xib create mode 100644 Classes/InAppProductsTableViewController.h create mode 100644 Classes/InAppProductsTableViewController.m create mode 100644 Classes/InAppProductsViewController.h create mode 100644 Classes/InAppProductsViewController.m create mode 100644 Classes/InAppProductsViewController.xib delete mode 100644 in_app_products.plist diff --git a/Classes/Base.lproj/ChatRoomViewController.xib b/Classes/Base.lproj/ChatRoomViewController.xib index 9e0649197..92c0c0cac 100644 --- a/Classes/Base.lproj/ChatRoomViewController.xib +++ b/Classes/Base.lproj/ChatRoomViewController.xib @@ -1,7 +1,8 @@ - + - + + @@ -248,14 +249,11 @@ + + - - - - - @@ -281,4 +279,9 @@ - \ No newline at end of file + + + + + + diff --git a/Classes/InAppProductsCell.h b/Classes/InAppProductsCell.h new file mode 100644 index 000000000..5073f93fa --- /dev/null +++ b/Classes/InAppProductsCell.h @@ -0,0 +1,27 @@ +// +// InAppProductsCell.h +// linphone +// +// Created by Gautier Pelloux-Prayer on 15/04/15. +// +// + +#import + +#import "UITransparentTVCell.h" + + +@interface InAppProductsCell : UITransparentTVCell { + +} +@property (retain, nonatomic) IBOutlet UILabel *ptitle; +@property (retain, nonatomic) IBOutlet UILabel *pdescription; +@property (retain, nonatomic) IBOutlet UILabel *pprice; +@property (retain, nonatomic) IBOutlet UISwitch *ppurchased; +@property (nonatomic) BOOL isMaximized; + +- (id)initWithIdentifier:(NSString*)identifier; + ++ (CGFloat)getHeight:(BOOL)maximized; + +@end diff --git a/Classes/InAppProductsCell.m b/Classes/InAppProductsCell.m new file mode 100644 index 000000000..e075e932b --- /dev/null +++ b/Classes/InAppProductsCell.m @@ -0,0 +1,52 @@ +// +// InAppProductsCell.m +// linphone +// +// Created by Gautier Pelloux-Prayer on 15/04/15. +// +// + +#import "InAppProductsCell.h" + +@implementation InAppProductsCell + +- (void)setIsMaximized:(BOOL)isMaximized { + _isMaximized = isMaximized; + + //show the BUY button only when not maximized + + self.frame = CGRectMake(self.frame.origin.x, + self.frame.origin.y, + self.frame.size.width, + [InAppProductsCell getHeight:isMaximized]); +} + +- (id)initWithIdentifier:(NSString*)identifier { + if ((self = [super initWithStyle:UITableViewCellStyleDefault reuseIdentifier:identifier]) != nil) { + NSArray *arrayOfViews = [[NSBundle mainBundle] loadNibNamed:@"InAppProductsCell" + owner:self + options:nil]; + if ([arrayOfViews count] >= 1) { + [self.contentView addSubview:[arrayOfViews objectAtIndex:0]]; + } + } + return self; +} + +- (void)dealloc { + [_ptitle release]; + [_pdescription release]; + [_pprice release]; + [_ppurchased release]; + [super dealloc]; +} + +- (NSString *)description { + return [NSString stringWithFormat:@"%@ (%@): %@", _ptitle.text, _pprice.text, _pdescription.text]; +} + ++ (CGFloat)getHeight:(BOOL)maximized { + return maximized ? 120 : 44; +} + +@end diff --git a/Classes/InAppProductsCell.xib b/Classes/InAppProductsCell.xib new file mode 100644 index 000000000..ad9ca60b8 --- /dev/null +++ b/Classes/InAppProductsCell.xib @@ -0,0 +1,60 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Classes/InAppProductsManager.h b/Classes/InAppProductsManager.h index e5a3c369e..b7f35fa32 100644 --- a/Classes/InAppProductsManager.h +++ b/Classes/InAppProductsManager.h @@ -20,8 +20,15 @@ #import #import +extern NSString *const kInAppProductsReady; + @interface InAppProductsManager : NSObject { - NSArray *inAppProducts; + } +@property (readonly) NSArray *inAppProducts; + +- (void)loadProducts; +- (BOOL)isPurchased:(SKProduct*)product; + @end diff --git a/Classes/InAppProductsManager.m b/Classes/InAppProductsManager.m index 9bcc0a40b..66034a0c1 100644 --- a/Classes/InAppProductsManager.m +++ b/Classes/InAppProductsManager.m @@ -20,14 +20,16 @@ #import "InAppProductsManager.h" #import "Utils.h" +NSString *const kInAppProductsReady = @"InAppProductsReady"; + @implementation InAppProductsManager { bool ready; } - (instancetype)init { if ((self = [super init]) != nil) { - [self loadProducts]; ready = false; + [self loadProducts]; } return self; } @@ -36,31 +38,46 @@ if (! [SKPaymentQueue canMakePayments]) { return; } - - NSURL *url = [[NSBundle mainBundle] URLForResource:@"in_app_products" - withExtension:@"plist"]; - - inAppProducts = [NSArray arrayWithContentsOfURL:url]; + //TODO: move this list elsewhere + NSArray * list = [[NSArray alloc] initWithArray:@[@"test.tunnel"]]; SKProductsRequest *productsRequest = [[SKProductsRequest alloc] - initWithProductIdentifiers:[NSSet setWithArray:inAppProducts]]; + initWithProductIdentifiers:[NSSet setWithArray:list]]; productsRequest.delegate = self; [productsRequest start]; } - (void)productsRequest:(SKProductsRequest *)request didReceiveResponse:(SKProductsResponse *)response { - inAppProducts = response.products; - LOGI(@"Found %lu products purchasable", inAppProducts.count); + _inAppProducts = [response.products retain]; + LOGI(@"Found %lu products purchasable", (unsigned long)_inAppProducts.count); for (NSString *invalidIdentifier in response.invalidProductIdentifiers) { LOGE(@"Product Identifier with invalid ID %@", invalidIdentifier); } ready = true; + + NSDictionary* dict = [NSDictionary dictionaryWithObjectsAndKeys: + _inAppProducts, @"products", + nil]; + + dispatch_async(dispatch_get_main_queue(), ^(void){ + [[NSNotificationCenter defaultCenter] postNotificationName:kInAppProductsReady object:self userInfo:dict]; + }); } - (void)paymentQueue:(SKPaymentQueue *)queue updatedTransactions:(NSArray *)transactions { } +- (BOOL)isPurchased:(SKProduct*)product { + for (SKProduct *prod in _inAppProducts) { + if (prod == product) { + LOGE(@"Is %@ bought? assuming NO", product.localizedTitle); + return false; //todo + } + } + return false; +} + @end \ No newline at end of file diff --git a/Classes/InAppProductsTableViewController.h b/Classes/InAppProductsTableViewController.h new file mode 100644 index 000000000..a98352c37 --- /dev/null +++ b/Classes/InAppProductsTableViewController.h @@ -0,0 +1,13 @@ +// +// InAppProductsTableViewController.h +// linphone +// +// Created by Gautier Pelloux-Prayer on 16/04/15. +// +// + +#import + +@interface InAppProductsTableViewController : UITableViewController + +@end diff --git a/Classes/InAppProductsTableViewController.m b/Classes/InAppProductsTableViewController.m new file mode 100644 index 000000000..fa86d45b6 --- /dev/null +++ b/Classes/InAppProductsTableViewController.m @@ -0,0 +1,70 @@ +// +// InAppProductsTableViewController.m +// linphone +// +// Created by Gautier Pelloux-Prayer on 16/04/15. +// +// + +#import "InAppProductsTableViewController.h" +#import "InAppProductsCell.h" +#import "InAppProductsManager.h" +#import "LinphoneManager.h" + +@implementation InAppProductsTableViewController { + InAppProductsManager *iapm; + NSInteger currentExpanded; +} + +- (void)viewWillAppear:(BOOL)animated { + iapm = [[LinphoneManager instance] iapManager]; + + [iapm loadProducts]; +} + +#pragma mark - Table view data source + +- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView { + return 1; +} + +- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { + return [iapm inAppProducts].count; +} + +- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { + static NSString *kCellId = @"InAppProductsCell"; + InAppProductsCell *cell = [tableView dequeueReusableCellWithIdentifier:kCellId]; + if (cell == nil) { + cell = [[[InAppProductsCell alloc] initWithIdentifier:kCellId] autorelease]; + } + SKProduct *prod = [[[[LinphoneManager instance] iapManager] inAppProducts] objectAtIndex:indexPath.row]; + [cell.ptitle setText: [prod localizedTitle]]; + [cell.pdescription setText: [prod localizedDescription]]; + [cell.pprice setText: [NSString stringWithFormat:@"%@", [prod price]]]; + [cell.ppurchased setEnabled: [iapm isPurchased:prod]]; + cell.isMaximized = (currentExpanded == indexPath.row); + + LOGI(@"One more: %@", cell); + return cell; +} + +- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { + if(currentExpanded == indexPath.row) { + currentExpanded = -1; + [tableView reloadRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationFade]; + return; + } else if(currentExpanded >= 0) { + NSIndexPath *previousPath = [NSIndexPath indexPathForRow:currentExpanded inSection:0]; + currentExpanded = indexPath.row; + [tableView reloadRowsAtIndexPaths:[NSArray arrayWithObject:previousPath] withRowAnimation:UITableViewRowAnimationFade]; + } + currentExpanded = indexPath.row; + [tableView reloadRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationFade]; +} + +-(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath { + return [InAppProductsCell getHeight:(currentExpanded == indexPath.row)]; +} + +@end diff --git a/Classes/InAppProductsViewController.h b/Classes/InAppProductsViewController.h new file mode 100644 index 000000000..632240657 --- /dev/null +++ b/Classes/InAppProductsViewController.h @@ -0,0 +1,18 @@ +// +// InAppProductsViewController.h +// linphone +// +// Created by Gautier Pelloux-Prayer on 15/04/15. +// +// + +#import +#import "UICompositeViewController.h" +#import "InAppProductsTableViewController.h" + +@interface InAppProductsViewController : UIViewController { +} + +@property (nonatomic, retain) IBOutlet InAppProductsTableViewController* tableController; + +@end diff --git a/Classes/InAppProductsViewController.m b/Classes/InAppProductsViewController.m new file mode 100644 index 000000000..67dab35cd --- /dev/null +++ b/Classes/InAppProductsViewController.m @@ -0,0 +1,70 @@ +// +// InAppProductsViewController.m +// linphone +// +// Created by Gautier Pelloux-Prayer on 15/04/15. +// +// + +#import "InAppProductsViewController.h" +#import "InAppProductsCell.h" + +@implementation InAppProductsViewController + +#pragma mark - Lifecycle Functions + +- (id)init { + return [super initWithNibName:@"InAppProductsViewController" bundle:[NSBundle mainBundle]]; +} + + +- (void)dealloc { + [[NSNotificationCenter defaultCenter] removeObserver:self]; + + [_tableController release]; + + [super dealloc]; +} + +#pragma mark - ViewController Functions + +- (void)viewDidLoad { + [super viewDidLoad]; +} + +- (void)viewWillAppear:(BOOL)animated { + [super viewWillAppear:animated]; +// [[NSNotificationCenter defaultCenter] addObserver:self +// selector:@selector(textReceivedEvent:) +// name:kLinphoneTextReceived +// object:nil]; +} + +- (void)viewWillDisappear:(BOOL)animated { + [super viewWillDisappear:animated]; + +// [[NSNotificationCenter defaultCenter] removeObserver:self +// name:kLinphoneTextReceived +// object:nil]; +} + +#pragma mark - UICompositeViewDelegate Functions + +static UICompositeViewDescription *compositeDescription = nil; + ++ (UICompositeViewDescription *)compositeViewDescription { + if(compositeDescription == nil) { + compositeDescription = [[UICompositeViewDescription alloc] init:@"InAppProducts" + content:@"InAppProductsViewController" + stateBar:nil + stateBarEnabled:false + tabBar: @"UIMainBar" + tabBarEnabled:true + fullscreen:false + landscapeMode:[LinphoneManager runningOnIpad] + portraitMode:true]; + } + return compositeDescription; +} + +@end \ No newline at end of file diff --git a/Classes/InAppProductsViewController.xib b/Classes/InAppProductsViewController.xib new file mode 100644 index 000000000..3d871c635 --- /dev/null +++ b/Classes/InAppProductsViewController.xib @@ -0,0 +1,48 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Classes/PhoneMainView.m b/Classes/PhoneMainView.m index f7840cc9a..e1ad68ec9 100644 --- a/Classes/PhoneMainView.m +++ b/Classes/PhoneMainView.m @@ -20,6 +20,7 @@ #import #import +#import "InAppProductsViewController.h" #import "LinphoneAppDelegate.h" #import "PhoneMainView.h" #import "Utils.h" @@ -403,7 +404,6 @@ static RootViewManager* rootViewManagerInstance = nil; } } } - - (void)startUp { LinphoneCore* core = nil; @try { @@ -419,7 +419,8 @@ static RootViewManager* rootViewManagerInstance = nil; // Change to default view const MSList *list = linphone_core_get_proxy_config_list(core); if(list != NULL || ([lm lpConfigBoolForKey:@"hide_wizard_preference"] == true) || lm.isTesting) { - [self changeCurrentView: [DialerViewController compositeViewDescription]]; + [self changeCurrentView: [InAppProductsViewController compositeViewDescription]]; + } else { WizardViewController *controller = DYNAMIC_CAST([[PhoneMainView instance] changeCurrentView:[WizardViewController compositeViewDescription]], WizardViewController); if(controller != nil) { diff --git a/Classes/SettingsViewController.m b/Classes/SettingsViewController.m index 909a8fb39..d200f59e3 100644 --- a/Classes/SettingsViewController.m +++ b/Classes/SettingsViewController.m @@ -22,6 +22,7 @@ #import "PhoneMainView.h" #import "UILinphone.h" #import "UACellBackgroundView.h" +#import "InAppProductsViewController.h" #import "DCRoundSwitch.h" @@ -466,6 +467,7 @@ static UICompositeViewDescription *compositeDescription = nil; selector:@selector(appSettingChanged:) name:kIASKAppSettingChanged object:nil]; + } @@ -603,7 +605,7 @@ static UICompositeViewDescription *compositeDescription = nil; [hiddenKeys addObject:@"send_logs_button"]; [hiddenKeys addObject:@"reset_logs_button"]; } - + [hiddenKeys addObject:@"playback_gain_preference"]; [hiddenKeys addObject:@"microphone_gain_preference"]; @@ -770,6 +772,8 @@ static UICompositeViewDescription *compositeDescription = nil; } [self emailAttachment:[NSData dataWithContentsOfFile:[NSString stringWithUTF8String:filepath]] mimeType:mimeType name:filename]; ms_free(filepath); + } else if([key isEqual:@"in_app_products_button"]) { + [[PhoneMainView instance] changeCurrentView:[InAppProductsViewController compositeViewDescription] push:TRUE]; } } diff --git a/Settings/InAppSettings.bundle/Root.plist b/Settings/InAppSettings.bundle/Root.plist index 62dbcc5ec..87206bbc6 100644 --- a/Settings/InAppSettings.bundle/Root.plist +++ b/Settings/InAppSettings.bundle/Root.plist @@ -242,6 +242,14 @@ Type PSChildPaneSpecifier + + Key + in_app_products_button + Title + Extra features + Type + IASKButtonSpecifier + Title diff --git a/in_app_products.plist b/in_app_products.plist deleted file mode 100644 index d269bc27a..000000000 --- a/in_app_products.plist +++ /dev/null @@ -1,7 +0,0 @@ - - - - - test.tunnel - - diff --git a/linphone-Info.plist b/linphone-Info.plist index 6c3c7e1fa..1fd8768b6 100644 --- a/linphone-Info.plist +++ b/linphone-Info.plist @@ -5,7 +5,7 @@ CFBundleDevelopmentRegion English CFBundleDisplayName - Linphone + LinphoneTest CFBundleExecutable ${EXECUTABLE_NAME} CFBundleIcons~ipad diff --git a/linphone.xcodeproj/project.pbxproj b/linphone.xcodeproj/project.pbxproj index dce290b01..12f7f743a 100755 --- a/linphone.xcodeproj/project.pbxproj +++ b/linphone.xcodeproj/project.pbxproj @@ -112,6 +112,11 @@ 57F005CA15EE2D9200914747 /* linphonerc-factory~ipad in Resources */ = {isa = PBXBuildFile; fileRef = 57F005C715EE2D9200914747 /* linphonerc-factory~ipad */; }; 631C4FB119D2A8F2004BFE77 /* UIDigitButtonLongPlus.m in Sources */ = {isa = PBXBuildFile; fileRef = 631C4FB019D2A8F2004BFE77 /* UIDigitButtonLongPlus.m */; }; 631C4FB719D2C3A6004BFE77 /* UIDigitButtonLongVoiceMail.m in Sources */ = {isa = PBXBuildFile; fileRef = 631C4FB619D2C3A6004BFE77 /* UIDigitButtonLongVoiceMail.m */; }; + 6359DE7F1ADEB54200EA15C0 /* InAppProductsViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 6359DE7D1ADEB54200EA15C0 /* InAppProductsViewController.m */; }; + 6359DE801ADEB54200EA15C0 /* InAppProductsViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = 6359DE7E1ADEB54200EA15C0 /* InAppProductsViewController.xib */; }; + 6359DE841ADEB64100EA15C0 /* InAppProductsCell.m in Sources */ = {isa = PBXBuildFile; fileRef = 6359DE821ADEB64100EA15C0 /* InAppProductsCell.m */; }; + 6359DE851ADEB64100EA15C0 /* InAppProductsCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = 6359DE831ADEB64100EA15C0 /* InAppProductsCell.xib */; }; + 6359DE8B1ADF9EB900EA15C0 /* InAppProductsTableViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 6359DE8A1ADF9EB900EA15C0 /* InAppProductsTableViewController.m */; }; 636316D11A1DEBCB0009B839 /* AboutViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = 636316D31A1DEBCB0009B839 /* AboutViewController.xib */; }; 636316D41A1DEC650009B839 /* SettingsViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = 636316D61A1DEC650009B839 /* SettingsViewController.xib */; }; 636316D91A1DECC90009B839 /* PhoneMainView.xib in Resources */ = {isa = PBXBuildFile; fileRef = 636316D71A1DECC90009B839 /* PhoneMainView.xib */; }; @@ -123,7 +128,6 @@ 639CEB091A1DF4FA004DE38F /* UIChatCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = 639CEB0B1A1DF4FA004DE38F /* UIChatCell.xib */; }; 63CD4B4F1A5AAC8C00B84282 /* DTAlertView.m in Sources */ = {isa = PBXBuildFile; fileRef = 63CD4B4E1A5AAC8C00B84282 /* DTAlertView.m */; }; 63E59A3A1ADE6A0100646FB3 /* StoreKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 63E59A391ADE6A0100646FB3 /* StoreKit.framework */; }; - 63E59A3C1ADE6E5C00646FB3 /* in_app_products.plist in Resources */ = {isa = PBXBuildFile; fileRef = 63E59A3B1ADE6E5C00646FB3 /* in_app_products.plist */; }; 63E59A3F1ADE70D900646FB3 /* InAppProductsManager.m in Sources */ = {isa = PBXBuildFile; fileRef = 63E59A3E1ADE70D900646FB3 /* InAppProductsManager.m */; }; 63FB30351A680E73008CA393 /* UIRoundedImageView.m in Sources */ = {isa = PBXBuildFile; fileRef = 63FB30341A680E73008CA393 /* UIRoundedImageView.m */; }; 70571E1A13FABCB000CDD3C2 /* rootca.pem in Resources */ = {isa = PBXBuildFile; fileRef = 70571E1913FABCB000CDD3C2 /* rootca.pem */; }; @@ -1023,6 +1027,14 @@ 631C4FB519D2C3A6004BFE77 /* UIDigitButtonLongVoiceMail.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = UIDigitButtonLongVoiceMail.h; sourceTree = ""; }; 631C4FB619D2C3A6004BFE77 /* UIDigitButtonLongVoiceMail.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = UIDigitButtonLongVoiceMail.m; sourceTree = ""; }; 633E388219FFB0F400936D1C /* README.md */ = {isa = PBXFileReference; lastKnownFileType = net.daringfireball.markdown; path = README.md; sourceTree = ""; }; + 6359DE7C1ADEB54200EA15C0 /* InAppProductsViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = InAppProductsViewController.h; sourceTree = ""; }; + 6359DE7D1ADEB54200EA15C0 /* InAppProductsViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = InAppProductsViewController.m; sourceTree = ""; }; + 6359DE7E1ADEB54200EA15C0 /* InAppProductsViewController.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = InAppProductsViewController.xib; sourceTree = ""; }; + 6359DE811ADEB64100EA15C0 /* InAppProductsCell.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = InAppProductsCell.h; sourceTree = ""; }; + 6359DE821ADEB64100EA15C0 /* InAppProductsCell.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = InAppProductsCell.m; sourceTree = ""; }; + 6359DE831ADEB64100EA15C0 /* InAppProductsCell.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = InAppProductsCell.xib; sourceTree = ""; }; + 6359DE891ADF9EB900EA15C0 /* InAppProductsTableViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = InAppProductsTableViewController.h; sourceTree = ""; }; + 6359DE8A1ADF9EB900EA15C0 /* InAppProductsTableViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = InAppProductsTableViewController.m; sourceTree = ""; }; 636316D21A1DEBCB0009B839 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = Base; path = Base.lproj/AboutViewController.xib; sourceTree = ""; }; 636316D51A1DEC650009B839 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = Base; path = Base.lproj/SettingsViewController.xib; sourceTree = ""; }; 636316D81A1DECC90009B839 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = Base; path = Base.lproj/PhoneMainView.xib; sourceTree = ""; }; @@ -1040,7 +1052,6 @@ 63CD4B4D1A5AAC8C00B84282 /* DTAlertView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DTAlertView.h; sourceTree = ""; }; 63CD4B4E1A5AAC8C00B84282 /* DTAlertView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = DTAlertView.m; sourceTree = ""; }; 63E59A391ADE6A0100646FB3 /* StoreKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = StoreKit.framework; path = System/Library/Frameworks/StoreKit.framework; sourceTree = SDKROOT; }; - 63E59A3B1ADE6E5C00646FB3 /* in_app_products.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = in_app_products.plist; sourceTree = ""; }; 63E59A3D1ADE6ECB00646FB3 /* InAppProductsManager.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = InAppProductsManager.h; sourceTree = ""; }; 63E59A3E1ADE70D900646FB3 /* InAppProductsManager.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = InAppProductsManager.m; sourceTree = ""; }; 63EF7FDC1A24B5810017A416 /* fr */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = fr; path = fr.lproj/AboutViewController.strings; sourceTree = ""; }; @@ -2043,8 +2054,16 @@ 22405EFD1601C19000B92522 /* ImageViewController.h */, 22405EFE1601C19100B92522 /* ImageViewController.m */, D37EE11016035793003608A6 /* ImageViewController.xib */, + 6359DE811ADEB64100EA15C0 /* InAppProductsCell.h */, + 6359DE821ADEB64100EA15C0 /* InAppProductsCell.m */, + 6359DE831ADEB64100EA15C0 /* InAppProductsCell.xib */, 63E59A3D1ADE6ECB00646FB3 /* InAppProductsManager.h */, 63E59A3E1ADE70D900646FB3 /* InAppProductsManager.m */, + 6359DE891ADF9EB900EA15C0 /* InAppProductsTableViewController.h */, + 6359DE8A1ADF9EB900EA15C0 /* InAppProductsTableViewController.m */, + 6359DE7C1ADEB54200EA15C0 /* InAppProductsViewController.h */, + 6359DE7D1ADEB54200EA15C0 /* InAppProductsViewController.m */, + 6359DE7E1ADEB54200EA15C0 /* InAppProductsViewController.xib */, D31AAF5C159B3919002C6B02 /* InCallTableViewController.h */, D31AAF5D159B3919002C6B02 /* InCallTableViewController.m */, D3F83EE91582021700336684 /* InCallViewController.h */, @@ -2240,7 +2259,6 @@ F0B89C2518DC973E0050B60E /* wizard_linphone_create.rc */, F0B89C2618DC973E0050B60E /* wizard_linphone_existing.rc */, F0B89C2718DC973E0050B60E /* wizard_remote.rc */, - 63E59A3B1ADE6E5C00646FB3 /* in_app_products.plist */, ); name = Resources; sourceTree = ""; @@ -3331,6 +3349,7 @@ D38327F71580FE3A00FA0D23 /* settings_default.png in Resources */, D38327F81580FE3A00FA0D23 /* settings_selected.png in Resources */, D38327F91580FE3A00FA0D23 /* chat_default.png in Resources */, + 6359DE801ADEB54200EA15C0 /* InAppProductsViewController.xib in Resources */, D38327FA1580FE3A00FA0D23 /* chat_selected.png in Resources */, D3832800158100E400FA0D23 /* contacts_over.png in Resources */, D3832801158100E400FA0D23 /* history_over.png in Resources */, @@ -3367,8 +3386,8 @@ D3F83F581582223B00336684 /* numpad_five_default.png in Resources */, D3F83F5A1582223B00336684 /* numpad_five_over.png in Resources */, D3F83F5C1582223B00336684 /* numpad_six_default.png in Resources */, + 6359DE851ADEB64100EA15C0 /* InAppProductsCell.xib in Resources */, 636316D91A1DECC90009B839 /* PhoneMainView.xib in Resources */, - 63E59A3C1ADE6E5C00646FB3 /* in_app_products.plist in Resources */, D3F83F5E1582223B00336684 /* numpad_six_over.png in Resources */, D3F83F601582223B00336684 /* numpad_seven_default.png in Resources */, D3F83F621582223B00336684 /* numpad_seven_over.png in Resources */, @@ -4039,10 +4058,13 @@ D3807FFC15C2894A005BE9BC /* IASKPSTitleValueSpecifierViewCell.m in Sources */, D3807FFE15C2894A005BE9BC /* IASKSlider.m in Sources */, D380800015C2894A005BE9BC /* IASKSwitch.m in Sources */, + 6359DE8B1ADF9EB900EA15C0 /* InAppProductsTableViewController.m in Sources */, D380800215C2894A005BE9BC /* IASKTextField.m in Sources */, D380800515C28A7A005BE9BC /* UILinphone.m in Sources */, D380801315C299D0005BE9BC /* ColorSpaceUtilites.m in Sources */, + 6359DE7F1ADEB54200EA15C0 /* InAppProductsViewController.m in Sources */, D378AB2A15DCDB4A0098505D /* ImagePickerViewController.m in Sources */, + 6359DE841ADEB64100EA15C0 /* InAppProductsCell.m in Sources */, 22405F001601C19200B92522 /* ImageViewController.m in Sources */, D3ED40191602172200BF332B /* HPGrowingTextView.m in Sources */, D3ED401B1602172200BF332B /* HPTextViewInternal.m in Sources */,