From 6b4a1df50e633482963e326798dac691fd0a35bf Mon Sep 17 00:00:00 2001 From: Gautier Pelloux-Prayer Date: Mon, 14 Dec 2015 11:23:56 +0100 Subject: [PATCH] UI: iPad version --- Classes/AboutView.m | 4 +- Classes/AssistantView.m | 5 +- Classes/Base.lproj/AssistantViewScreens.xib | 8 +- Classes/Base.lproj/CallView.xib | 146 +- Classes/Base.lproj/CallView~ipad.xib | 1342 +++++++++++++++++ Classes/Base.lproj/ChatConversationView.xib | 50 +- Classes/Base.lproj/ContactDetailsView.xib | 45 +- Classes/Base.lproj/DialerView.xib | 31 +- Classes/Base.lproj/DialerView~ipad.xib | 739 +++++++++ Classes/Base.lproj/HistoryDetailsView.xib | 54 +- Classes/Base.lproj/LaunchScreen.xib | 77 +- Classes/Base.lproj/SideMenuView.xib | 9 +- Classes/Base.lproj/SideMenuView~ipad.xib | 138 ++ Classes/CallIncomingView.m | 4 +- Classes/CallOutgoingView.m | 5 +- Classes/CallView.m | 4 +- Classes/ChatConversationCreateView.m | 4 +- Classes/ChatConversationView.h | 2 +- Classes/ChatConversationView.m | 19 +- Classes/ChatsListTableView.m | 10 + Classes/ChatsListView.m | 7 +- Classes/ContactDetailsView.h | 1 + Classes/ContactDetailsView.m | 33 +- Classes/ContactsListTableView.m | 18 +- Classes/ContactsListView.m | 6 +- Classes/DialerView.h | 2 +- Classes/DialerView.m | 4 +- Classes/FirstLoginView.m | 4 +- Classes/HistoryDetailsTableView.m | 15 +- Classes/HistoryDetailsView.h | 2 + Classes/HistoryDetailsView.m | 64 +- Classes/HistoryListTableView.m | 27 +- Classes/HistoryListView.m | 7 +- Classes/ImagePickerView.m | 4 +- Classes/ImageView.m | 4 +- .../LinphoneUI/Base.lproj/StatusBarView.xib | 33 +- Classes/LinphoneUI/Base.lproj/TabBarView.xib | 38 +- .../Base.lproj/UICallConferenceCell.xib | 45 +- .../LinphoneUI/Base.lproj/UICompositeView.xib | 27 +- .../Base.lproj/UICompositeView~ipad.xib | 105 ++ .../Base.lproj/UIConfirmationDialog.xib | 73 +- .../LinphoneUI/Base.lproj/UIContactCell.xib | 10 +- Classes/LinphoneUI/StatusBarView.m | 9 +- Classes/LinphoneUI/UIBouncingView.m | 11 + Classes/LinphoneUI/UICamSwitch.m | 30 +- Classes/LinphoneUI/UIChatBubbleTextCell.m | 3 +- Classes/LinphoneUI/UICheckBoxTableView.h | 2 + Classes/LinphoneUI/UICompositeView.h | 24 +- Classes/LinphoneUI/UICompositeView.m | 229 +-- Classes/LinphoneUI/UIContactCell.m | 7 + Classes/LinphoneUI/UIHistoryCell.h | 2 + Classes/LinphoneUI/UIVideoButton.m | 25 +- Classes/PhoneMainView.h | 4 +- Classes/PhoneMainView.m | 14 +- Classes/SettingsView.m | 4 +- .../AppIcon.appiconset/Contents.json | 8 +- .../AppIcon.appiconset/linphone_icon_120.png | Bin 5155 -> 5155 bytes .../AppIcon.appiconset/linphone_icon_152.png | Bin 6561 -> 6561 bytes .../AppIcon.appiconset/linphone_icon_167.png | Bin 0 -> 7180 bytes .../AppIcon.appiconset/linphone_icon_57.png | Bin 2383 -> 2383 bytes .../linphone_icon_57@2x.png | Bin 4893 -> 4893 bytes .../AppIcon.appiconset/linphone_icon_72.png | Bin 3019 -> 3019 bytes .../linphone_icon_72@2x.png | Bin 6202 -> 6202 bytes .../AppIcon.appiconset/linphone_icon_76.png | Bin 3246 -> 3246 bytes iTunesArtwork | Bin 17927 -> 17927 bytes linphone.xcodeproj/project.pbxproj | 50 +- .../xcschemes/LinphoneTester.xcscheme | 2 +- .../xcshareddata/xcschemes/linphone.xcscheme | 2 +- main.m | 2 +- 69 files changed, 2932 insertions(+), 721 deletions(-) create mode 100644 Classes/Base.lproj/CallView~ipad.xib create mode 100644 Classes/Base.lproj/DialerView~ipad.xib create mode 100644 Classes/Base.lproj/SideMenuView~ipad.xib create mode 100644 Classes/LinphoneUI/Base.lproj/UICompositeView~ipad.xib create mode 100644 Resources/Images.xcassets/AppIcon.appiconset/linphone_icon_167.png diff --git a/Classes/AboutView.m b/Classes/AboutView.m index a11566bef..fad3e915a 100644 --- a/Classes/AboutView.m +++ b/Classes/AboutView.m @@ -71,8 +71,8 @@ static UICompositeViewDescription *compositeDescription = nil; tabBar:nil sideMenu:SideMenuView.class fullscreen:false - landscapeMode:LinphoneManager.runningOnIpad - portraitMode:true]; + isLeftFragment:YES + fragmentWith:nil]; } return compositeDescription; } diff --git a/Classes/AssistantView.m b/Classes/AssistantView.m index b63ba79d9..d3e9be48d 100644 --- a/Classes/AssistantView.m +++ b/Classes/AssistantView.m @@ -68,8 +68,9 @@ static UICompositeViewDescription *compositeDescription = nil; tabBar:nil sideMenu:SideMenuView.class fullscreen:false - landscapeMode:true // LinphoneManager.runningOnIpad - portraitMode:true]; + isLeftFragment:NO + fragmentWith:nil]; + compositeDescription.darkBackground = true; } return compositeDescription; diff --git a/Classes/Base.lproj/AssistantViewScreens.xib b/Classes/Base.lproj/AssistantViewScreens.xib index bd514cde7..62b17b32d 100644 --- a/Classes/Base.lproj/AssistantViewScreens.xib +++ b/Classes/Base.lproj/AssistantViewScreens.xib @@ -47,7 +47,7 @@ - @@ -128,7 +124,6 @@ - @@ -141,13 +136,11 @@ - - @@ -156,18 +149,15 @@ - - - - @@ -278,7 +256,6 @@ - @@ -564,12 +519,10 @@ - - @@ -655,7 +602,6 @@ - @@ -784,7 +717,6 @@ - @@ -797,13 +729,11 @@ - - @@ -812,18 +742,15 @@ - - - - @@ -934,7 +849,6 @@ - @@ -1220,12 +1112,10 @@ - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Classes/Base.lproj/ChatConversationView.xib b/Classes/Base.lproj/ChatConversationView.xib index aac56f489..f36ddc7ba 100644 --- a/Classes/Base.lproj/ChatConversationView.xib +++ b/Classes/Base.lproj/ChatConversationView.xib @@ -1,14 +1,14 @@ - + - + - + @@ -43,12 +43,10 @@ - - @@ -173,7 +163,6 @@ - @@ -190,19 +179,16 @@ - - + - - @@ -169,12 +166,10 @@ - - @@ -248,12 +239,10 @@ - - + - - diff --git a/Classes/Base.lproj/DialerView.xib b/Classes/Base.lproj/DialerView.xib index aa92c7fd6..fa3ac8b53 100644 --- a/Classes/Base.lproj/DialerView.xib +++ b/Classes/Base.lproj/DialerView.xib @@ -1,8 +1,8 @@ - + - + @@ -17,8 +17,10 @@ + + @@ -45,12 +47,10 @@ - - @@ -63,7 +63,6 @@ - @@ -83,7 +81,6 @@ - @@ -260,7 +245,6 @@ - - - diff --git a/Classes/Base.lproj/DialerView~ipad.xib b/Classes/Base.lproj/DialerView~ipad.xib new file mode 100644 index 000000000..64cb2ed29 --- /dev/null +++ b/Classes/Base.lproj/DialerView~ipad.xib @@ -0,0 +1,739 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Classes/Base.lproj/HistoryDetailsView.xib b/Classes/Base.lproj/HistoryDetailsView.xib index 92909a139..6104ac807 100644 --- a/Classes/Base.lproj/HistoryDetailsView.xib +++ b/Classes/Base.lproj/HistoryDetailsView.xib @@ -1,8 +1,8 @@ - + - + @@ -10,7 +10,9 @@ + + @@ -34,12 +36,10 @@ - - @@ -72,7 +70,6 @@ - @@ -81,7 +78,6 @@ - + - - @@ -170,12 +166,10 @@ - - - @@ -218,7 +209,6 @@ - @@ -227,7 +217,6 @@ + + + + + + diff --git a/Classes/CallIncomingView.m b/Classes/CallIncomingView.m index 4b2572b71..ec431a6d0 100644 --- a/Classes/CallIncomingView.m +++ b/Classes/CallIncomingView.m @@ -53,8 +53,8 @@ static UICompositeViewDescription *compositeDescription = nil; tabBar:nil sideMenu:CallSideMenuView.class fullscreen:false - landscapeMode:LinphoneManager.runningOnIpad - portraitMode:true]; + isLeftFragment:YES + fragmentWith:nil]; compositeDescription.darkBackground = true; } return compositeDescription; diff --git a/Classes/CallOutgoingView.m b/Classes/CallOutgoingView.m index 309254d6c..b8807ca08 100644 --- a/Classes/CallOutgoingView.m +++ b/Classes/CallOutgoingView.m @@ -33,8 +33,9 @@ static UICompositeViewDescription *compositeDescription = nil; tabBar:nil sideMenu:CallSideMenuView.class fullscreen:false - landscapeMode:LinphoneManager.runningOnIpad - portraitMode:true]; + isLeftFragment:NO + fragmentWith:nil]; + compositeDescription.darkBackground = true; } return compositeDescription; diff --git a/Classes/CallView.m b/Classes/CallView.m index 346050f8a..87692f006 100644 --- a/Classes/CallView.m +++ b/Classes/CallView.m @@ -60,8 +60,8 @@ static UICompositeViewDescription *compositeDescription = nil; tabBar:nil sideMenu:CallSideMenuView.class fullscreen:false - landscapeMode:false - portraitMode:true]; + isLeftFragment:YES + fragmentWith:nil]; compositeDescription.darkBackground = true; } return compositeDescription; diff --git a/Classes/ChatConversationCreateView.m b/Classes/ChatConversationCreateView.m index a0ed0ae8c..71f82e283 100644 --- a/Classes/ChatConversationCreateView.m +++ b/Classes/ChatConversationCreateView.m @@ -22,8 +22,8 @@ static UICompositeViewDescription *compositeDescription = nil; tabBar:TabBarView.class sideMenu:SideMenuView.class fullscreen:false - landscapeMode:false - portraitMode:true]; + isLeftFragment:NO + fragmentWith:ChatsListView.class]; } return compositeDescription; } diff --git a/Classes/ChatConversationView.h b/Classes/ChatConversationView.h index 4438d68f0..cf28ebac1 100644 --- a/Classes/ChatConversationView.h +++ b/Classes/ChatConversationView.h @@ -39,6 +39,7 @@ BOOL composingVisible; } +@property(weak, nonatomic) IBOutlet UIIconButton *backButton; @property(nonatomic, strong) IBOutlet ChatConversationTableView *tableController; @property(weak, nonatomic) IBOutlet HPGrowingTextView *messageField; @property(weak, nonatomic) IBOutlet UIView *topBar; @@ -51,7 +52,6 @@ @property(strong, nonatomic) IBOutlet UILabel *composeLabel; @property(strong, nonatomic) IBOutlet UIView *composeIndicatorView; @property(nonatomic, strong) IBOutlet UIButton *pictureButton; -@property(weak, nonatomic) IBOutlet UIIconButton *backButton; @property(weak, nonatomic) IBOutlet UIIconButton *callButton; @property(weak, nonatomic) IBOutlet UIBackToCallButton *backToCallButton; diff --git a/Classes/ChatConversationView.m b/Classes/ChatConversationView.m index 02da23aa1..d5d4cc6f2 100644 --- a/Classes/ChatConversationView.m +++ b/Classes/ChatConversationView.m @@ -56,8 +56,8 @@ static UICompositeViewDescription *compositeDescription = nil; tabBar:TabBarView.class sideMenu:SideMenuView.class fullscreen:false - landscapeMode:false - portraitMode:true]; + isLeftFragment:NO + fragmentWith:ChatsListView.class]; } return compositeDescription; } @@ -71,6 +71,12 @@ static UICompositeViewDescription *compositeDescription = nil; - (void)viewDidLoad { [super viewDidLoad]; + // if we use fragments, remove back button + if (LinphoneManager.runningOnIpad) { + _backButton.hidden = YES; + _backButton.alpha = 0; + } + _messageField.minNumberOfLines = 1; _messageField.maxNumberOfLines = ([LinphoneManager runningOnIpad]) ? 10 : 3; _messageField.delegate = self; @@ -155,7 +161,7 @@ static UICompositeViewDescription *compositeDescription = nil; [self update]; linphone_chat_room_mark_as_read(chatRoom); [self setComposingVisible:linphone_chat_room_is_remote_composing(chatRoom) withDelay:0]; - [[NSNotificationCenter defaultCenter] postNotificationName:kLinphoneMessageReceived object:self]; + // [[NSNotificationCenter defaultCenter] postNotificationName:kLinphoneMessageReceived object:self]; } else { _chatView.hidden = YES; } @@ -164,7 +170,7 @@ static UICompositeViewDescription *compositeDescription = nil; - (void)applicationWillEnterForeground:(NSNotification *)notif { if (chatRoom != nil) { linphone_chat_room_mark_as_read(chatRoom); - [[NSNotificationCenter defaultCenter] postNotificationName:kLinphoneMessageReceived object:self]; + // [[NSNotificationCenter defaultCenter] postNotificationName:kLinphoneMessageReceived object:self]; } } @@ -461,8 +467,7 @@ static UICompositeViewDescription *compositeDescription = nil; - (IBAction)onBackClick:(id)event { [_tableController setChatRoom:NULL]; - ChatsListView *view = VIEW(ChatsListView); - [PhoneMainView.instance popToView:view.compositeViewDescription]; + [PhoneMainView.instance popToView:ChatsListView.compositeViewDescription]; } - (IBAction)onEditClick:(id)event { @@ -484,7 +489,7 @@ static UICompositeViewDescription *compositeDescription = nil; } - (IBAction)onDeleteClick:(id)sender { - NSString *msg = [NSString stringWithFormat:NSLocalizedString(@"Do you want to delete selected message?", nil)]; + NSString *msg = [NSString stringWithFormat:NSLocalizedString(@"Do you want to delete selected messages?", nil)]; [UIConfirmationDialog ShowWithMessage:msg cancelMessage:nil confirmMessage:nil diff --git a/Classes/ChatsListTableView.m b/Classes/ChatsListTableView.m index 35f5a884a..2a79a50cd 100644 --- a/Classes/ChatsListTableView.m +++ b/Classes/ChatsListTableView.m @@ -108,6 +108,16 @@ static void chatTable_free_chatrooms(void *data) { } data = [self sortChatRooms]; [super loadData]; + + // reset conversation view since in fragment mode, conversations are relative to current data + // select first conversation if any + if ([self totalNumberOfItems] > 0) { + ChatConversationView *view = VIEW(ChatConversationView); + [view setChatRoom:(LinphoneChatRoom *)ms_list_nth_data(data, 0)]; + [PhoneMainView.instance changeCurrentView:view.compositeViewDescription]; + } else { + [PhoneMainView.instance changeCurrentView:ChatConversationCreateView.compositeViewDescription]; + } } #pragma mark - UITableViewDataSource Functions diff --git a/Classes/ChatsListView.m b/Classes/ChatsListView.m index 09aa697e6..3660a62e0 100644 --- a/Classes/ChatsListView.m +++ b/Classes/ChatsListView.m @@ -58,8 +58,8 @@ static UICompositeViewDescription *compositeDescription = nil; tabBar:TabBarView.class sideMenu:SideMenuView.class fullscreen:false - landscapeMode:LinphoneManager.runningOnIpad - portraitMode:true]; + isLeftFragment:YES + fragmentWith:ChatConversationCreateView.class]; } return compositeDescription; } @@ -81,7 +81,8 @@ static UICompositeViewDescription *compositeDescription = nil; } - (IBAction)onDeleteClick:(id)sender { - NSString *msg = [NSString stringWithFormat:NSLocalizedString(@"Do you want to delete selected conversation?", nil)]; + NSString *msg = + [NSString stringWithFormat:NSLocalizedString(@"Do you want to delete selected conversations?", nil)]; [UIConfirmationDialog ShowWithMessage:msg cancelMessage:nil confirmMessage:nil diff --git a/Classes/ContactDetailsView.h b/Classes/ContactDetailsView.h index a2ebe9d20..4927ee42f 100644 --- a/Classes/ContactDetailsView.h +++ b/Classes/ContactDetailsView.h @@ -41,6 +41,7 @@ @property(weak, nonatomic) IBOutlet UILabel *nameLabel; @property(weak, nonatomic) IBOutlet UIToggleButton *deleteButton; @property(weak, nonatomic) IBOutlet UIView *contentView; +@property(weak, nonatomic) IBOutlet UILabel *emptyLabel; - (IBAction)onBackClick:(id)event; - (IBAction)onCancelClick:(id)event; diff --git a/Classes/ContactDetailsView.m b/Classes/ContactDetailsView.m index 433e9e8f1..a5a2e4122 100644 --- a/Classes/ContactDetailsView.m +++ b/Classes/ContactDetailsView.m @@ -112,6 +112,9 @@ static void sync_address_book(ABAddressBookRef addressBook, CFDictionaryRef info - (void)selectContact:(ABRecordRef)acontact andReload:(BOOL)reload { _contact = NULL; [self resetData]; + + _emptyLabel.hidden = (acontact != NULL); + _contact = acontact; [_avatarImage setImage:[FastAddressBook imageForContact:_contact thumbnail:NO] bordered:NO withRoundedRadius:YES]; [ContactDisplay setDisplayNameLabel:_nameLabel forContact:acontact]; @@ -168,20 +171,28 @@ static void sync_address_book(ABAddressBookRef addressBook, CFDictionaryRef info #pragma mark - ViewController Functions -- (void)viewWillAppear:(BOOL)animated { - [super viewWillAppear:animated]; +- (void)viewDidLoad { + [super viewDidLoad]; + + // if we use fragments, remove back button + if (LinphoneManager.runningOnIpad) { + _backButton.hidden = YES; + _backButton.alpha = 0; + } + + [self setContact:NULL]; _tableController.tableView.accessibilityIdentifier = @"Contact table"; [_editButton setImage:[UIImage imageNamed:@"valid_disabled.png"] forState:(UIControlStateDisabled | UIControlStateSelected)]; +} - if ([ContactSelection getSelectionMode] == ContactSelectionModeEdit || - [ContactSelection getSelectionMode] == ContactSelectionModeNone) { - [_editButton setHidden:FALSE]; - } else { - [_editButton setHidden:TRUE]; - } +- (void)viewWillAppear:(BOOL)animated { + [super viewWillAppear:animated]; + + _editButton.hidden = ([ContactSelection getSelectionMode] != ContactSelectionModeEdit && + [ContactSelection getSelectionMode] != ContactSelectionModeNone); } #pragma mark - UICompositeViewDelegate Functions @@ -195,8 +206,8 @@ static UICompositeViewDescription *compositeDescription = nil; tabBar:TabBarView.class sideMenu:SideMenuView.class fullscreen:false - landscapeMode:LinphoneManager.runningOnIpad - portraitMode:true]; + isLeftFragment:NO + fragmentWith:ContactsListView.class]; } return compositeDescription; } @@ -273,7 +284,7 @@ static UICompositeViewDescription *compositeDescription = nil; } - (IBAction)onDeleteClick:(id)sender { - NSString *msg = NSLocalizedString(@"Do you want to delete selected this contact?", nil); + NSString *msg = NSLocalizedString(@"Do you want to delete selected contact?", nil); [UIConfirmationDialog ShowWithMessage:msg cancelMessage:nil confirmMessage:nil diff --git a/Classes/ContactsListTableView.m b/Classes/ContactsListTableView.m index 17efd91a9..6fdaea794 100644 --- a/Classes/ContactsListTableView.m +++ b/Classes/ContactsListTableView.m @@ -144,6 +144,12 @@ static int ms_strcmpfuz(const char *fuzzy_word, const char *sentence) { } } [super loadData]; + // reset details view since in fragment mode, details are relative to current data + // select first contact if any + ABRecordRef contact = + ([self totalNumberOfItems] > 0) ? [self contactForIndexPath:[NSIndexPath indexPathForRow:0 inSection:0]] : nil; + ContactDetailsView *view = VIEW(ContactDetailsView); + [view setContact:contact]; } static void sync_address_book(ABAddressBookRef addressBook, CFDictionaryRef info, void *context) { @@ -167,16 +173,20 @@ static void sync_address_book(ABAddressBookRef addressBook, CFDictionaryRef info return [(OrderedDictionary *)[addressBookMap objectForKey:[addressBookMap keyAtIndex:section]] count]; } +- (ABRecordRef)contactForIndexPath:(NSIndexPath *)indexPath { + + OrderedDictionary *subDic = [addressBookMap objectForKey:[addressBookMap keyAtIndex:[indexPath section]]]; + NSString *key = [[subDic allKeys] objectAtIndex:[indexPath row]]; + return (__bridge ABRecordRef)([subDic objectForKey:key]); +} + - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { NSString *kCellId = NSStringFromClass(UIContactCell.class); UIContactCell *cell = [tableView dequeueReusableCellWithIdentifier:kCellId]; if (cell == nil) { cell = [[UIContactCell alloc] initWithIdentifier:kCellId]; } - OrderedDictionary *subDic = [addressBookMap objectForKey:[addressBookMap keyAtIndex:[indexPath section]]]; - - NSString *key = [[subDic allKeys] objectAtIndex:[indexPath row]]; - ABRecordRef contact = (__bridge ABRecordRef)([subDic objectForKey:key]); + ABRecordRef contact = [self contactForIndexPath:indexPath]; // Cached avatar UIImage *image = [avatarMap objectForKey:[NSNumber numberWithInt:ABRecordGetRecordID(contact)]]; diff --git a/Classes/ContactsListView.m b/Classes/ContactsListView.m index 5b6e3be53..f027b671b 100644 --- a/Classes/ContactsListView.m +++ b/Classes/ContactsListView.m @@ -96,8 +96,8 @@ static UICompositeViewDescription *compositeDescription = nil; tabBar:TabBarView.class sideMenu:SideMenuView.class fullscreen:false - landscapeMode:LinphoneManager.runningOnIpad - portraitMode:true]; + isLeftFragment:YES + fragmentWith:ContactDetailsView.class]; } return compositeDescription; } @@ -194,7 +194,7 @@ static UICompositeViewDescription *compositeDescription = nil; } - (IBAction)onDeleteClick:(id)sender { - NSString *msg = [NSString stringWithFormat:NSLocalizedString(@"Do you want to delete selected contact?", nil)]; + NSString *msg = [NSString stringWithFormat:NSLocalizedString(@"Do you want to delete selected contacts?", nil)]; [UIConfirmationDialog ShowWithMessage:msg cancelMessage:nil confirmMessage:nil diff --git a/Classes/DialerView.h b/Classes/DialerView.h index d080676f2..c9321d6b7 100644 --- a/Classes/DialerView.h +++ b/Classes/DialerView.h @@ -27,7 +27,7 @@ #import "UIDigitButton.h" @interface DialerView - : UIViewController { + : TPMultiLayoutViewController { } - (void)setAddress:(NSString *)address; diff --git a/Classes/DialerView.m b/Classes/DialerView.m index 708cc7d95..e0a9664cc 100644 --- a/Classes/DialerView.m +++ b/Classes/DialerView.m @@ -78,8 +78,8 @@ static UICompositeViewDescription *compositeDescription = nil; tabBar:TabBarView.class sideMenu:SideMenuView.class fullscreen:false - landscapeMode:LinphoneManager.runningOnIpad - portraitMode:true]; + isLeftFragment:YES + fragmentWith:nil]; compositeDescription.darkBackground = true; } return compositeDescription; diff --git a/Classes/FirstLoginView.m b/Classes/FirstLoginView.m index 99d5e7a63..cd2473341 100644 --- a/Classes/FirstLoginView.m +++ b/Classes/FirstLoginView.m @@ -36,8 +36,8 @@ static UICompositeViewDescription *compositeDescription = nil; tabBar:nil sideMenu:nil fullscreen:false - landscapeMode:LinphoneManager.runningOnIpad - portraitMode:true]; + isLeftFragment:NO + fragmentWith:nil]; } return compositeDescription; } diff --git a/Classes/HistoryDetailsTableView.m b/Classes/HistoryDetailsTableView.m index a8a11eefe..998b26949 100644 --- a/Classes/HistoryDetailsTableView.m +++ b/Classes/HistoryDetailsTableView.m @@ -18,11 +18,16 @@ } else { [callLogs removeAllObjects]; } - const MSList *logs = linphone_core_get_call_history_for_address([LinphoneManager getLc], peer); - while (logs != NULL) { - LinphoneCallLog *log = (LinphoneCallLog *)logs->data; - [callLogs addObject:[NSValue valueWithPointer:log]]; - logs = ms_list_next(logs); + + if (peer) { + const MSList *logs = linphone_core_get_call_history_for_address([LinphoneManager getLc], peer); + while (logs != NULL) { + LinphoneCallLog *log = (LinphoneCallLog *)logs->data; + if (linphone_address_weak_equal(linphone_call_log_get_remote_address(log), peer)) { + [callLogs addObject:[NSValue valueWithPointer:log]]; + } + logs = ms_list_next(logs); + } } [[self tableView] reloadData]; } diff --git a/Classes/HistoryDetailsView.h b/Classes/HistoryDetailsView.h index 3ae2801b9..355d53b56 100644 --- a/Classes/HistoryDetailsView.h +++ b/Classes/HistoryDetailsView.h @@ -29,6 +29,7 @@ @private LinphoneCallLog *callLog; } +@property(weak, nonatomic) IBOutlet UIButton *backButton; @property(weak, nonatomic) IBOutlet UILabel *contactLabel; @property(nonatomic, strong) IBOutlet UIRoundedImageView *avatarImage; @property(nonatomic, strong) IBOutlet UILabel *addressLabel; @@ -36,6 +37,7 @@ @property(nonatomic, copy, setter=setCallLogId:) NSString *callLogId; @property(weak, nonatomic) IBOutlet UIView *headerView; @property(strong, nonatomic) IBOutlet HistoryDetailsTableView *tableView; +@property(weak, nonatomic) IBOutlet UILabel *emptyLabel; - (IBAction)onBackClick:(id)event; - (IBAction)onAddContactClick:(id)event; diff --git a/Classes/HistoryDetailsView.m b/Classes/HistoryDetailsView.m index 7bf73ab92..1d92a47b5 100644 --- a/Classes/HistoryDetailsView.m +++ b/Classes/HistoryDetailsView.m @@ -34,8 +34,8 @@ static UICompositeViewDescription *compositeDescription = nil; tabBar:TabBarView.class sideMenu:SideMenuView.class fullscreen:false - landscapeMode:LinphoneManager.runningOnIpad - portraitMode:true]; + isLeftFragment:NO + fragmentWith:HistoryListView.class]; } return compositeDescription; } @@ -56,6 +56,12 @@ static UICompositeViewDescription *compositeDescription = nil; - (void)viewDidLoad { [super viewDidLoad]; + // if we use fragments, remove back button + if (LinphoneManager.runningOnIpad) { + _backButton.hidden = YES; + _backButton.alpha = 0; + } + UITapGestureRecognizer *headerTapGesture = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(onContactClick:)]; [_headerView addGestureRecognizer:headerTapGesture]; @@ -65,7 +71,6 @@ static UICompositeViewDescription *compositeDescription = nil; [super viewWillAppear:animated]; [self update]; - [_tableView loadDataForAddress:(callLog ? linphone_call_log_get_remote_address(callLog) : NULL)]; [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(update) @@ -91,52 +96,29 @@ static UICompositeViewDescription *compositeDescription = nil; #pragma mark - -+ (void)adaptSize:(UILabel *)label field:(UIView *)field { - // - // Adapt size - // - CGRect labelFrame = [label frame]; - CGRect fieldFrame = [field frame]; - - fieldFrame.origin.x -= labelFrame.size.width; - - // Compute firstName size - CGSize contraints; - contraints.height = [label frame].size.height; - contraints.width = ([field frame].size.width + [field frame].origin.x) - [label frame].origin.x; - CGSize firstNameSize = [[label text] sizeWithFont:[label font] constrainedToSize:contraints]; - labelFrame.size.width = firstNameSize.width; - - // Compute lastName size & position - fieldFrame.origin.x += labelFrame.size.width; - fieldFrame.size.width = (contraints.width + [label frame].origin.x) - fieldFrame.origin.x; - - [label setFrame:labelFrame]; - [field setFrame:fieldFrame]; -} - -- (void)retrieveCallLog { +- (void)update { // Look for the call log callLog = NULL; - const MSList *list = linphone_core_get_call_logs([LinphoneManager getLc]); - while (list != NULL) { - LinphoneCallLog *log = (LinphoneCallLog *)list->data; - const char *cid = linphone_call_log_get_call_id(log); - if (cid != NULL && [_callLogId isEqualToString:[NSString stringWithUTF8String:cid]]) { - callLog = log; - break; + if (_callLogId) { + const MSList *list = linphone_core_get_call_logs([LinphoneManager getLc]); + while (list != NULL) { + LinphoneCallLog *log = (LinphoneCallLog *)list->data; + const char *cid = linphone_call_log_get_call_id(log); + if (cid != NULL && [_callLogId isEqualToString:[NSString stringWithUTF8String:cid]]) { + callLog = log; + break; + } + list = list->next; } - list = list->next; } -} -- (void)update { // Pop if callLog is null - [self retrieveCallLog]; if (callLog == NULL) { - [PhoneMainView.instance popCurrentView]; + _emptyLabel.hidden = NO; + _addContactButton.hidden = YES; return; } + _emptyLabel.hidden = YES; LinphoneAddress *addr = linphone_call_log_get_remote_address(callLog); _addContactButton.hidden = ([FastAddressBook getContactWithAddress:addr] != nil); @@ -145,6 +127,8 @@ static UICompositeViewDescription *compositeDescription = nil; char *addrURI = linphone_address_as_string_uri_only(addr); _addressLabel.text = [NSString stringWithUTF8String:addrURI]; ms_free(addrURI); + + [_tableView loadDataForAddress:(callLog ? linphone_call_log_get_remote_address(callLog) : NULL)]; } #pragma mark - Action Functions diff --git a/Classes/HistoryListTableView.m b/Classes/HistoryListTableView.m index e73bff879..e26b3efe9 100644 --- a/Classes/HistoryListTableView.m +++ b/Classes/HistoryListTableView.m @@ -104,6 +104,12 @@ } - (void)loadData { + for (id day in self.sections.allKeys) { + for (id log in self.sections[day]) { + linphone_call_log_unref([log pointerValue]); + } + } + const MSList *logs = linphone_core_get_call_logs([LinphoneManager getLc]); self.sections = [NSMutableDictionary dictionary]; while (logs != NULL) { @@ -128,8 +134,7 @@ list = ms_list_append(list, log); linphone_call_log_set_user_data(prev, list); } else { - linphone_call_log_set_user_data(log, NULL); - [eventsOnThisDay addObject:[NSValue valueWithPointer:log]]; + [eventsOnThisDay addObject:[NSValue valueWithPointer:linphone_call_log_ref(log)]]; } } logs = ms_list_next(logs); @@ -138,6 +143,17 @@ [self computeSections]; [super loadData]; + + // reset details view since in fragment mode, details are relative to current data + // select first log if any + NSString *callId = nil; + if ([self totalNumberOfItems] > 0) { + id logId = [_sections objectForKey:_sortedDays[0]][0]; + LinphoneCallLog *log = [logId pointerValue]; + callId = [NSString stringWithUTF8String:linphone_call_log_get_call_id(log) ?: ""]; + } + HistoryDetailsView *view = VIEW(HistoryDetailsView); + [view setCallLogId:callId]; } - (void)computeSections { @@ -222,7 +238,13 @@ [tableView beginUpdates]; id log = [_sections objectForKey:_sortedDays[indexPath.section]][indexPath.row]; LinphoneCallLog *callLog = [log pointerValue]; + MSList *count = linphone_call_log_get_user_data(callLog); + while (count) { + linphone_core_remove_call_log([LinphoneManager getLc], count->data); + count = count->next; + } linphone_core_remove_call_log([LinphoneManager getLc], callLog); + linphone_call_log_unref(callLog); [[_sections objectForKey:_sortedDays[indexPath.section]] removeObject:log]; if (((NSArray *)[_sections objectForKey:_sortedDays[indexPath.section]]).count == 0) { [_sections removeObjectForKey:_sortedDays[indexPath.section]]; @@ -247,6 +269,7 @@ count = count->next; } linphone_core_remove_call_log([LinphoneManager getLc], callLog); + linphone_call_log_unref(callLog); [[_sections objectForKey:_sortedDays[indexPath.section]] removeObject:log]; if (((NSArray *)[_sections objectForKey:_sortedDays[indexPath.section]]).count == 0) { [_sections removeObjectForKey:_sortedDays[indexPath.section]]; diff --git a/Classes/HistoryListView.m b/Classes/HistoryListView.m index eb4296257..fa9c6be73 100644 --- a/Classes/HistoryListView.m +++ b/Classes/HistoryListView.m @@ -19,6 +19,7 @@ #import "HistoryListView.h" #import "PhoneMainView.h" +#import "LinphoneUI/UIHistoryCell.h" @implementation HistoryListView @@ -35,8 +36,8 @@ static UICompositeViewDescription *compositeDescription = nil; tabBar:TabBarView.class sideMenu:SideMenuView.class fullscreen:false - landscapeMode:LinphoneManager.runningOnIpad - portraitMode:true]; + isLeftFragment:YES + fragmentWith:HistoryDetailsView.class]; } return compositeDescription; } @@ -91,7 +92,7 @@ static UICompositeViewDescription *compositeDescription = nil; } - (IBAction)onDeleteClick:(id)event { - NSString *msg = [NSString stringWithFormat:NSLocalizedString(@"Do you want to delete selected log?", nil)]; + NSString *msg = [NSString stringWithFormat:NSLocalizedString(@"Do you want to delete selected logs?", nil)]; [UIConfirmationDialog ShowWithMessage:msg cancelMessage:nil confirmMessage:nil diff --git a/Classes/ImagePickerView.m b/Classes/ImagePickerView.m index 8ef50c0a0..d20c87566 100644 --- a/Classes/ImagePickerView.m +++ b/Classes/ImagePickerView.m @@ -54,8 +54,8 @@ static UICompositeViewDescription *compositeDescription = nil; tabBar:nil sideMenu:SideMenuView.class fullscreen:false - landscapeMode:LinphoneManager.runningOnIpad - portraitMode:true]; + isLeftFragment:NO + fragmentWith:nil]; compositeDescription.darkBackground = false; } return compositeDescription; diff --git a/Classes/ImageView.m b/Classes/ImageView.m index 28748683c..83d903ec8 100644 --- a/Classes/ImageView.m +++ b/Classes/ImageView.m @@ -123,8 +123,8 @@ static UICompositeViewDescription *compositeDescription = nil; tabBar:nil sideMenu:SideMenuView.class fullscreen:false - landscapeMode:LinphoneManager.runningOnIpad - portraitMode:true]; + isLeftFragment:NO + fragmentWith:nil]; } return compositeDescription; } diff --git a/Classes/LinphoneUI/Base.lproj/StatusBarView.xib b/Classes/LinphoneUI/Base.lproj/StatusBarView.xib index ef33fb4e0..d0caf7bd6 100644 --- a/Classes/LinphoneUI/Base.lproj/StatusBarView.xib +++ b/Classes/LinphoneUI/Base.lproj/StatusBarView.xib @@ -1,8 +1,8 @@ - + - + @@ -26,16 +26,14 @@ - - + - - - diff --git a/Classes/LinphoneUI/Base.lproj/TabBarView.xib b/Classes/LinphoneUI/Base.lproj/TabBarView.xib index c8f03344a..20789ebf3 100644 --- a/Classes/LinphoneUI/Base.lproj/TabBarView.xib +++ b/Classes/LinphoneUI/Base.lproj/TabBarView.xib @@ -1,8 +1,8 @@ - + - + @@ -29,12 +29,10 @@ - - diff --git a/Classes/LinphoneUI/Base.lproj/UICallConferenceCell.xib b/Classes/LinphoneUI/Base.lproj/UICallConferenceCell.xib index b8148544c..0b81fa266 100644 --- a/Classes/LinphoneUI/Base.lproj/UICallConferenceCell.xib +++ b/Classes/LinphoneUI/Base.lproj/UICallConferenceCell.xib @@ -1,8 +1,8 @@ - + - + @@ -20,16 +20,30 @@ - - - - - diff --git a/Classes/LinphoneUI/Base.lproj/UICompositeView.xib b/Classes/LinphoneUI/Base.lproj/UICompositeView.xib index 32428d092..1668cddf2 100644 --- a/Classes/LinphoneUI/Base.lproj/UICompositeView.xib +++ b/Classes/LinphoneUI/Base.lproj/UICompositeView.xib @@ -8,8 +8,9 @@ - + + @@ -22,8 +23,18 @@ - - + + + + + + + + + + + + @@ -59,8 +70,14 @@ - - + + + + + + + + diff --git a/Classes/LinphoneUI/Base.lproj/UICompositeView~ipad.xib b/Classes/LinphoneUI/Base.lproj/UICompositeView~ipad.xib new file mode 100644 index 000000000..d4b20b633 --- /dev/null +++ b/Classes/LinphoneUI/Base.lproj/UICompositeView~ipad.xib @@ -0,0 +1,105 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Classes/LinphoneUI/Base.lproj/UIConfirmationDialog.xib b/Classes/LinphoneUI/Base.lproj/UIConfirmationDialog.xib index ff821e1e2..7cd0c8bb0 100644 --- a/Classes/LinphoneUI/Base.lproj/UIConfirmationDialog.xib +++ b/Classes/LinphoneUI/Base.lproj/UIConfirmationDialog.xib @@ -23,40 +23,47 @@ - - - + diff --git a/Classes/LinphoneUI/Base.lproj/UIContactCell.xib b/Classes/LinphoneUI/Base.lproj/UIContactCell.xib index e096a978d..5754ba770 100644 --- a/Classes/LinphoneUI/Base.lproj/UIContactCell.xib +++ b/Classes/LinphoneUI/Base.lproj/UIContactCell.xib @@ -1,8 +1,8 @@ - + - + @@ -20,12 +20,10 @@ - - - + - diff --git a/Classes/LinphoneUI/StatusBarView.m b/Classes/LinphoneUI/StatusBarView.m index 4d5f759ee..1e0b19cdc 100644 --- a/Classes/LinphoneUI/StatusBarView.m +++ b/Classes/LinphoneUI/StatusBarView.m @@ -342,7 +342,14 @@ } - (IBAction)onRegistrationStateClick:(id)sender { - linphone_core_refresh_registers([LinphoneManager getLc]); + LinphoneCore *lc = [LinphoneManager getLc]; + if (linphone_core_get_default_proxy_config(lc)) { + linphone_core_refresh_registers(lc); + } else if (linphone_core_get_proxy_config_list(lc)) { + [PhoneMainView.instance changeCurrentView:SettingsView.compositeViewDescription]; + } else { + [PhoneMainView.instance changeCurrentView:AssistantView.compositeViewDescription]; + } } @end diff --git a/Classes/LinphoneUI/UIBouncingView.m b/Classes/LinphoneUI/UIBouncingView.m index 60e4ce007..b56157b69 100644 --- a/Classes/LinphoneUI/UIBouncingView.m +++ b/Classes/LinphoneUI/UIBouncingView.m @@ -29,6 +29,10 @@ INIT_WITH_COMMON { return self; } +- (void)dealloc { + [[NSNotificationCenter defaultCenter] removeObserver:self]; +} + - (void)settingsUpdate:(NSNotification *)notif { if ([[LinphoneManager instance] lpConfigBoolForKey:@"animations_preference"] == false) { [self stopBounceAnimation:kBounceAnimation target:self]; @@ -92,6 +96,9 @@ INIT_WITH_COMMON { } - (void)startAnimating:(BOOL)animated { + if (!self.hidden) { + return; + } [self setHidden:FALSE]; if ([[LinphoneManager instance] lpConfigBoolForKey:@"animations_preference"] == true) { if (animated) { @@ -108,6 +115,10 @@ INIT_WITH_COMMON { } - (void)stopAnimating:(BOOL)animated { + if (self.hidden) { + return; + } + [self stopBounceAnimation:kBounceAnimation target:self]; if (animated) { [self disappearAnimation:kDisappearAnimation diff --git a/Classes/LinphoneUI/UICamSwitch.m b/Classes/LinphoneUI/UICamSwitch.m index eb2d64a50..6716ff59b 100644 --- a/Classes/LinphoneUI/UICamSwitch.m +++ b/Classes/LinphoneUI/UICamSwitch.m @@ -26,39 +26,11 @@ #pragma mark - Lifecycle Functions -- (id)initUICamSwitch { +INIT_WITH_COMMON { [self addTarget:self action:@selector(touchUp:) forControlEvents:UIControlEventTouchUpInside]; return self; } -- (id)init { - self = [super init]; - if (self) { - if (!(self = [self initUICamSwitch])) - return nil; - } - return self; -} - -- (id)initWithFrame:(CGRect)frame { - - self = [super initWithFrame:frame]; - if (self) { - if (!(self = [self initUICamSwitch])) - return nil; - } - return self; -} - -- (id)initWithCoder:(NSCoder *)decoder { - self = [super initWithCoder:decoder]; - if (self) { - if (!(self = [self initUICamSwitch])) - return nil; - } - return self; -} - #pragma mark - - (void)touchUp:(id)sender { diff --git a/Classes/LinphoneUI/UIChatBubbleTextCell.m b/Classes/LinphoneUI/UIChatBubbleTextCell.m index c50521f44..e529141cf 100644 --- a/Classes/LinphoneUI/UIChatBubbleTextCell.m +++ b/Classes/LinphoneUI/UIChatBubbleTextCell.m @@ -276,11 +276,12 @@ static const CGFloat CELL_IMAGE_WIDTH = 100.0f; [[UIChatBubbleTextCell alloc] initWithIdentifier:NSStringFromClass(UIChatBubbleTextCell.class)]; dateFont = cell.contactDateLabel.font; dateViewSize = cell.contactDateLabel.frame.size; + dateViewSize.width = CGFLOAT_MAX; } CGSize messageSize = [self ViewHeightForMessage:chat withWidth:width]; CGSize dateSize = [self computeBoundingBox:[self ContactDateForChat:chat] size:dateViewSize font:dateFont]; - messageSize.width = MAX(MAX(messageSize.width, dateSize.width + CELL_MESSAGE_X_MARGIN), CELL_MIN_WIDTH); + messageSize.width = MAX(MAX(messageSize.width, MIN(dateSize.width + CELL_MESSAGE_X_MARGIN, width)), CELL_MIN_WIDTH); return messageSize; } diff --git a/Classes/LinphoneUI/UICheckBoxTableView.h b/Classes/LinphoneUI/UICheckBoxTableView.h index 692a30199..d8d114375 100644 --- a/Classes/LinphoneUI/UICheckBoxTableView.h +++ b/Classes/LinphoneUI/UICheckBoxTableView.h @@ -27,4 +27,6 @@ - (IBAction)onEditClick:(id)sender; - (IBAction)onCancelClick:(id)sender; +- (NSInteger)totalNumberOfItems; + @end diff --git a/Classes/LinphoneUI/UICompositeView.h b/Classes/LinphoneUI/UICompositeView.h index 8be0f04f9..7af4bd45e 100644 --- a/Classes/LinphoneUI/UICompositeView.h +++ b/Classes/LinphoneUI/UICompositeView.h @@ -27,27 +27,29 @@ @interface UICompositeViewDescription : NSObject { } -@property(strong) NSString *content; +@property(strong) NSString *name; @property(strong) NSString *statusBar; @property(strong) NSString *tabBar; @property(strong) NSString *sideMenu; +@property(strong) NSString *otherFragment; @property(assign) BOOL statusBarEnabled; @property(assign) BOOL tabBarEnabled; @property(assign) BOOL sideMenuEnabled; @property(assign) BOOL fullscreen; +@property(assign) BOOL isLeftFragment; +@property(assign) BOOL darkBackground; @property(assign) BOOL landscapeMode; @property(assign) BOOL portraitMode; -@property(assign) BOOL darkBackground; - (id)copy; - (BOOL)equal:(UICompositeViewDescription *)description; -- (id)init:(Class)content - statusBar:(Class)statusBar - tabBar:(Class)tabBar - sideMenu:(Class)sideMenu - fullscreen:(BOOL)fullscreen - landscapeMode:(BOOL)landscapeMode - portraitMode:(BOOL)portraitMode; +- (id)init:(Class)name + statusBar:(Class)statusBar + tabBar:(Class)tabBar + sideMenu:(Class)sideMenu + fullscreen:(BOOL)fullscreen + isLeftFragment:(BOOL)isLeftFragment + fragmentWith:(Class)otherFragment; @end @@ -66,9 +68,9 @@ } @property(strong) CATransition *viewTransition; - @property(nonatomic, strong) IBOutlet UIView *statusBarView; -@property(nonatomic, strong) IBOutlet UIView *contentView; +@property(nonatomic, strong) IBOutlet UIView *mainView; +@property(nonatomic, strong) IBOutlet UIView *detailsView; @property(nonatomic, strong) IBOutlet UIView *tabBarView; @property(strong, nonatomic) IBOutlet UIView *sideMenuView; diff --git a/Classes/LinphoneUI/UICompositeView.m b/Classes/LinphoneUI/UICompositeView.m index eff60f87f..577ece25c 100644 --- a/Classes/LinphoneUI/UICompositeView.m +++ b/Classes/LinphoneUI/UICompositeView.m @@ -27,7 +27,7 @@ - (id)copy { UICompositeViewDescription *copy = [UICompositeViewDescription alloc]; - copy.content = self.content; + copy.name = self.name; copy.statusBar = self.statusBar; copy.tabBar = self.tabBar; copy.sideMenu = self.sideMenu; @@ -37,22 +37,24 @@ copy.fullscreen = self.fullscreen; copy.landscapeMode = self.landscapeMode; copy.portraitMode = self.portraitMode; + copy.isLeftFragment = self.isLeftFragment; + copy.otherFragment = self.otherFragment; copy.darkBackground = self.darkBackground; return copy; } - (BOOL)equal:(UICompositeViewDescription *)description { - return [self.content compare:description.content] == NSOrderedSame; + return [self.name compare:description.name] == NSOrderedSame; } - (id)init:(Class)content - statusBar:(Class)statusBar - tabBar:(Class)tabBar - sideMenu:(Class)sideMenu - fullscreen:(BOOL)fullscreen - landscapeMode:(BOOL)landscapeMode - portraitMode:(BOOL)portraitMode { - self.content = NSStringFromClass(content); + statusBar:(Class)statusBar + tabBar:(Class)tabBar + sideMenu:(Class)sideMenu + fullscreen:(BOOL)fullscreen + isLeftFragment:(BOOL)isLeftFragment + fragmentWith:(Class)otherFragment { + self.name = NSStringFromClass(content); self.statusBar = NSStringFromClass(statusBar); self.tabBar = NSStringFromClass(tabBar); self.sideMenu = NSStringFromClass(sideMenu); @@ -60,8 +62,10 @@ self.tabBarEnabled = YES; self.sideMenuEnabled = NO; self.fullscreen = fullscreen; - self.landscapeMode = YES; // landscapeMode; - self.portraitMode = YES; // portraitMode; + self.landscapeMode = YES; + self.portraitMode = YES; + self.isLeftFragment = isLeftFragment || (otherFragment == nil); + self.otherFragment = LinphoneManager.runningOnIpad ? NSStringFromClass(otherFragment) : nil; self.darkBackground = true; return self; @@ -72,7 +76,8 @@ @property(nonatomic, strong) UIViewController *statusBarViewController; @property(nonatomic, strong) UIViewController *tabBarViewController; -@property(nonatomic, strong) UIViewController *contentViewController; +@property(nonatomic, strong) UIViewController *mainViewController; +@property(nonatomic, strong) UIViewController *detailsViewController; @property(nonatomic, strong) UIViewController *sideMenuViewController; @end @@ -148,7 +153,8 @@ - (void)viewWillAppear:(BOOL)animated { [super viewWillAppear:animated]; - [self.contentViewController viewWillAppear:animated]; + [self.mainViewController viewWillAppear:animated]; + [self.detailsViewController viewWillAppear:animated]; [self.tabBarViewController viewWillAppear:animated]; [self.statusBarViewController viewWillAppear:animated]; [self.sideMenuViewController viewWillAppear:animated]; @@ -161,7 +167,8 @@ - (void)viewDidAppear:(BOOL)animated { [super viewDidAppear:animated]; - [self.contentViewController viewDidAppear:animated]; + [self.mainViewController viewDidAppear:animated]; + [self.detailsViewController viewDidAppear:animated]; [self.tabBarViewController viewDidAppear:animated]; [self.statusBarViewController viewDidAppear:animated]; [self.sideMenuViewController viewDidAppear:animated]; @@ -169,7 +176,8 @@ - (void)viewWillDisappear:(BOOL)animated { [super viewWillDisappear:animated]; - [self.contentViewController viewWillDisappear:animated]; + [self.mainViewController viewWillDisappear:animated]; + [self.detailsViewController viewWillDisappear:animated]; [self.tabBarViewController viewWillDisappear:animated]; [self.statusBarViewController viewWillDisappear:animated]; [self.sideMenuViewController viewWillDisappear:animated]; @@ -181,7 +189,8 @@ - (void)viewDidDisappear:(BOOL)animated { [super viewDidDisappear:animated]; - [self.contentViewController viewDidDisappear:animated]; + [self.mainViewController viewDidDisappear:animated]; + [self.detailsViewController viewDidDisappear:animated]; [self.tabBarViewController viewDidDisappear:animated]; [self.statusBarViewController viewDidDisappear:animated]; [self.sideMenuViewController viewDidDisappear:animated]; @@ -193,7 +202,8 @@ duration:(NSTimeInterval)duration { currentOrientation = toInterfaceOrientation; [super willRotateToInterfaceOrientation:toInterfaceOrientation duration:duration]; - [self.contentViewController willRotateToInterfaceOrientation:toInterfaceOrientation duration:duration]; + [self.mainViewController willRotateToInterfaceOrientation:toInterfaceOrientation duration:duration]; + [self.detailsViewController willRotateToInterfaceOrientation:toInterfaceOrientation duration:duration]; [self.tabBarViewController willRotateToInterfaceOrientation:toInterfaceOrientation duration:duration]; [self.statusBarViewController willRotateToInterfaceOrientation:toInterfaceOrientation duration:duration]; [self.sideMenuViewController willRotateToInterfaceOrientation:toInterfaceOrientation duration:duration]; @@ -203,7 +213,8 @@ duration:(NSTimeInterval)duration { [super willAnimateRotationToInterfaceOrientation:toInterfaceOrientation duration:duration]; // Will invoke TPMultiLayout - [self.contentViewController willAnimateRotationToInterfaceOrientation:toInterfaceOrientation duration:duration]; + [self.mainViewController willAnimateRotationToInterfaceOrientation:toInterfaceOrientation duration:duration]; + [self.detailsViewController willAnimateRotationToInterfaceOrientation:toInterfaceOrientation duration:duration]; [self.tabBarViewController willAnimateRotationToInterfaceOrientation:toInterfaceOrientation duration:duration]; [self.statusBarViewController willAnimateRotationToInterfaceOrientation:toInterfaceOrientation duration:duration]; [self.sideMenuViewController willAnimateRotationToInterfaceOrientation:toInterfaceOrientation duration:duration]; @@ -212,7 +223,8 @@ - (void)didRotateFromInterfaceOrientation:(UIInterfaceOrientation)fromInterfaceOrientation { [super didRotateFromInterfaceOrientation:fromInterfaceOrientation]; - [self.contentViewController didRotateFromInterfaceOrientation:fromInterfaceOrientation]; + [self.mainViewController didRotateFromInterfaceOrientation:fromInterfaceOrientation]; + [self.detailsViewController didRotateFromInterfaceOrientation:fromInterfaceOrientation]; [self.tabBarViewController didRotateFromInterfaceOrientation:fromInterfaceOrientation]; [self.statusBarViewController didRotateFromInterfaceOrientation:fromInterfaceOrientation]; [self.sideMenuViewController didRotateFromInterfaceOrientation:fromInterfaceOrientation]; @@ -287,11 +299,11 @@ bool remove = true; /*ImagePickerView can be used as popover and we do NOT want to free it*/; - if ([key isEqualToString:ImagePickerView.compositeViewDescription.content]) { + if ([key isEqualToString:ImagePickerView.compositeViewDescription.name]) { remove = false; } else if (exclude != nil) { for (UICompositeViewDescription *description in exclude) { - if ([key isEqualToString:description.content] || [key isEqualToString:description.statusBar] || + if ([key isEqualToString:description.name] || [key isEqualToString:description.statusBar] || [key isEqualToString:description.tabBar] || [key isEqualToString:description.sideMenu]) { remove = false; break; @@ -379,7 +391,8 @@ sideMenu:(NSNumber *)sideMenu fullscreen:(NSNumber *)fullscreen { - UIViewController *oldContentViewController = self.contentViewController; + UIViewController *oldMainViewController = self.mainViewController; + UIViewController *oldDetailsViewController = self.detailsViewController; UIViewController *oldStatusBarViewController = self.statusBarViewController; UIViewController *oldTabBarViewController = self.tabBarViewController; UIViewController *oldSideMenuViewController = self.sideMenuViewController; @@ -390,37 +403,58 @@ oldViewDescription = currentViewDescription; currentViewDescription = [description copy]; + UIViewController *newMainViewController = description.isLeftFragment + ? [self getCachedController:description.name] + : [self getCachedController:description.otherFragment]; + UIViewController *newDetailsViewController = description.isLeftFragment + ? [self getCachedController:description.otherFragment] + : [self getCachedController:description.name]; + UIViewController *newStatusBarViewController = [self getCachedController:description.statusBar]; + UIViewController *newTabBarViewController = [self getCachedController:description.tabBar]; + UIViewController *newSideMenuViewController = [self getCachedController:description.sideMenu]; + // Animate only with a previous screen if (oldViewDescription != nil && self.viewTransition != nil) { - [self.contentView.layer removeAnimationForKey:@"transition"]; - [self.contentView.layer addAnimation:self.viewTransition forKey:@"transition"]; - if (![oldViewDescription.statusBar isEqualToString:currentViewDescription.statusBar] || + if (oldMainViewController != newMainViewController) { + [self.mainView.layer removeAnimationForKey:@"transition"]; + [self.mainView.layer addAnimation:self.viewTransition forKey:@"transition"]; + } else { + [self.mainView.layer removeAnimationForKey:@"transition"]; + } + if (oldDetailsViewController != newDetailsViewController) { + [self.detailsView.layer removeAnimationForKey:@"transition"]; + [self.detailsView.layer addAnimation:self.viewTransition forKey:@"transition"]; + } else { + [self.detailsView.layer removeAnimationForKey:@"transition"]; + } + + if (oldStatusBarViewController != newStatusBarViewController || oldViewDescription.statusBarEnabled != currentViewDescription.statusBarEnabled) { [self.statusBarView.layer removeAnimationForKey:@"transition"]; [self.statusBarView.layer addAnimation:self.viewTransition forKey:@"transition"]; } else { [self.statusBarView.layer removeAnimationForKey:@"transition"]; } - if (![oldViewDescription.tabBar isEqualToString:currentViewDescription.tabBar] || + if (oldTabBarViewController != newTabBarViewController || oldViewDescription.tabBarEnabled != currentViewDescription.tabBarEnabled) { [self.tabBarView.layer removeAnimationForKey:@"transition"]; [self.tabBarView.layer addAnimation:self.viewTransition forKey:@"transition"]; } else { [self.tabBarView.layer removeAnimationForKey:@"transition"]; } - if (![oldViewDescription.sideMenu isEqualToString:currentViewDescription.sideMenu] || + if (oldSideMenuViewController != newSideMenuViewController || oldViewDescription.sideMenuEnabled != currentViewDescription.sideMenuEnabled) { [self.sideMenuView.layer removeAnimationForKey:@"transition"]; [self.sideMenuView.layer addAnimation:self.viewTransition forKey:@"transition"]; } } - UIViewController *newContentViewController = [self getCachedController:description.content]; - UIViewController *newStatusBarViewController = [self getCachedController:description.statusBar]; - UIViewController *newTabBarViewController = [self getCachedController:description.tabBar]; - UIViewController *newSideMenuViewController = [self getCachedController:description.sideMenu]; - - [UICompositeView removeSubView:oldContentViewController]; + if (oldMainViewController != nil && oldMainViewController != newMainViewController) { + [UICompositeView removeSubView:oldMainViewController]; + } + if (oldDetailsViewController != nil && oldDetailsViewController != newDetailsViewController) { + [UICompositeView removeSubView:oldDetailsViewController]; + } if (oldTabBarViewController != nil && oldTabBarViewController != newTabBarViewController) { [UICompositeView removeSubView:oldTabBarViewController]; } @@ -432,7 +466,8 @@ } self.statusBarViewController = newStatusBarViewController; - self.contentViewController = newContentViewController; + self.mainViewController = newMainViewController; + self.detailsViewController = newDetailsViewController; self.tabBarViewController = newTabBarViewController; self.sideMenuViewController = newSideMenuViewController; @@ -443,17 +478,24 @@ [UICompositeView setOrientation:correctOrientation animated:currentOrientation != UIDeviceOrientationUnknown]; if (UIInterfaceOrientationIsLandscape(correctOrientation)) { - [self.contentViewController willAnimateRotationToInterfaceOrientation:correctOrientation duration:0]; + [self.mainViewController willAnimateRotationToInterfaceOrientation:correctOrientation duration:0]; + [self.detailsViewController willAnimateRotationToInterfaceOrientation:correctOrientation duration:0]; [self.tabBarViewController willAnimateRotationToInterfaceOrientation:correctOrientation duration:0]; [self.statusBarViewController willAnimateRotationToInterfaceOrientation:correctOrientation duration:0]; [self.sideMenuViewController willAnimateRotationToInterfaceOrientation:correctOrientation duration:0]; } } else { - if (oldContentViewController != newContentViewController) { - UIInterfaceOrientation oldOrientation = self.contentViewController.interfaceOrientation; - [self.contentViewController willRotateToInterfaceOrientation:correctOrientation duration:0]; - [self.contentViewController willAnimateRotationToInterfaceOrientation:correctOrientation duration:0]; - [self.contentViewController didRotateFromInterfaceOrientation:oldOrientation]; + if (oldMainViewController != newMainViewController) { + UIInterfaceOrientation oldOrientation = self.mainViewController.interfaceOrientation; + [self.mainViewController willRotateToInterfaceOrientation:correctOrientation duration:0]; + [self.mainViewController willAnimateRotationToInterfaceOrientation:correctOrientation duration:0]; + [self.mainViewController didRotateFromInterfaceOrientation:oldOrientation]; + } + if (oldDetailsViewController != newDetailsViewController) { + UIInterfaceOrientation oldOrientation = self.detailsViewController.interfaceOrientation; + [self.detailsViewController willRotateToInterfaceOrientation:correctOrientation duration:0]; + [self.detailsViewController willAnimateRotationToInterfaceOrientation:correctOrientation duration:0]; + [self.detailsViewController didRotateFromInterfaceOrientation:oldOrientation]; } if (oldTabBarViewController != newTabBarViewController) { UIInterfaceOrientation oldOrientation = self.tabBarViewController.interfaceOrientation; @@ -524,83 +566,69 @@ [UIView setAnimationDuration:0.35]; } - CGRect contentFrame = self.contentView.frame; - CGRect viewFrame = [self.view frame]; + // Compute frame for each elements + CGRect viewFrame = self.view.frame; - // Resize StatusBar + // 1. status bar - fixed size on top CGRect statusBarFrame = self.statusBarView.frame; - int origin = IPHONE_STATUSBAR_HEIGHT; - if (currentViewDescription.fullscreen) - origin = 0; - + int origin = currentViewDescription.fullscreen ? 0 : IPHONE_STATUSBAR_HEIGHT; if (self.statusBarViewController != nil && currentViewDescription.statusBarEnabled) { statusBarFrame.origin.y = origin; } else { statusBarFrame.origin.y = origin - statusBarFrame.size.height; } - contentFrame.origin.y = statusBarFrame.origin.y + statusBarFrame.size.height; + // 2. side menu - fixed size, always starting below status bar + CGRect sideMenuFrame = viewFrame; + sideMenuFrame.origin.y = origin + statusBarFrame.size.height; + sideMenuFrame.size.height -= sideMenuFrame.origin.y; + if (!currentViewDescription.sideMenuEnabled) { + // really hide; -width won't be enough since some animations may use this... + sideMenuFrame.origin.x = -3 * sideMenuFrame.size.width; + } + + // 3. tab bar - on portrait full width at bottom / on landscape on left, starting below status bar // Resize TabBar CGRect tabFrame = self.tabBarView.frame; if (self.tabBarViewController != nil && currentViewDescription.tabBarEnabled) { - if (UIInterfaceOrientationIsLandscape([self currentOrientation])) { - tabFrame.origin.x = 0; - tabFrame.origin.y = contentFrame.origin.y; - tabFrame.size.height = viewFrame.size.height - contentFrame.origin.y; - contentFrame.origin.x = tabFrame.size.width; - contentFrame.size.height = tabFrame.size.height; + tabFrame.origin.x = 0; + if (UIInterfaceOrientationIsPortrait([self currentOrientation])) { + tabFrame.origin.y = viewFrame.size.height - tabFrame.size.height; } else { - tabFrame.origin.y = viewFrame.size.height; - tabFrame.origin.x = viewFrame.size.width; - tabFrame.size.height = self.tabBarViewController.view.frame.size.height; - // tabFrame.size.width = self.tabBarViewController.view.frame.size.width; - tabFrame.origin.y -= tabFrame.size.height; - tabFrame.origin.x -= tabFrame.size.width; - contentFrame.size.height = tabFrame.origin.y - contentFrame.origin.y; - - // for some views, we need the content to overlap, in which case - // we insert in the tab XIB a mask with tag -1 and with y = the amount of - // points that the content should overlap. - for (UIView *view in self.tabBarViewController.view.subviews) { - if (view.tag == -1) { - contentFrame.size.height += view.frame.origin.y; - break; - } - } + tabFrame.origin.y = statusBarFrame.origin.y + statusBarFrame.size.height; + tabFrame.size.height = viewFrame.size.height - tabFrame.origin.y; } } else { - contentFrame.origin.x = 0; - contentFrame.size.height = viewFrame.size.height - contentFrame.origin.y; + tabFrame.origin.x = -tabFrame.size.width; tabFrame.origin.y = viewFrame.size.height; } - contentFrame.size.width = viewFrame.size.width - contentFrame.origin.x; - if (currentViewDescription.fullscreen) { - // contentFrame.origin.y = origin; - contentFrame.size.height = viewFrame.size.height - contentFrame.origin.y; + // 4. main view and details view - space left width of 35%/65% each + CGRect mainFrame = viewFrame; + mainFrame.origin.y = statusBarFrame.origin.y + statusBarFrame.size.height; + mainFrame.size.height -= mainFrame.origin.y; + if (!currentViewDescription.fullscreen) { + if (UIInterfaceOrientationIsPortrait([self currentOrientation])) { + mainFrame.size.height -= viewFrame.size.height - tabFrame.origin.y; + } else { + mainFrame.origin.x = tabFrame.origin.x + tabFrame.size.width; + mainFrame.size.width -= mainFrame.origin.x; + } } - - // Resize SideMenu - CGRect sideMenuFrame; - if (UIInterfaceOrientationIsPortrait([self currentOrientation])) { - sideMenuFrame = contentFrame; - sideMenuFrame.size.height += tabFrame.size.height; - } else { - sideMenuFrame = viewFrame; - sideMenuFrame.size.height -= origin + statusBarFrame.size.height; - sideMenuFrame.origin.y = origin + statusBarFrame.size.height; - } - - if (!currentViewDescription.sideMenuEnabled) { - sideMenuFrame.origin.x = - -3 * sideMenuFrame.size.width; // really hide; -width won't be enough since some animations may use this... + CGRect detailsFrame = mainFrame; + if (self.detailsViewController != nil) { + detailsFrame = mainFrame; + mainFrame.size.width = ceil(mainFrame.size.width * .35); + detailsFrame.size.width -= mainFrame.size.width; + detailsFrame.origin.x += mainFrame.size.width; } // Set frames - - // 1. content view - self.contentView.frame = contentFrame; - self.contentViewController.view.frame = self.contentView.bounds; + // 1. main view and details view + self.mainView.frame = mainFrame; + self.mainViewController.view.frame = self.mainView.bounds; + self.detailsView.frame = detailsFrame; + self.detailsViewController.view.frame = self.detailsView.bounds; // 2. tab bar self.tabBarView.frame = tabFrame; @@ -625,7 +653,12 @@ // Change view if (description != nil) { - [UICompositeView addSubView:self.contentViewController view:self.contentView]; + if (oldMainViewController == nil || oldMainViewController != self.tabBarViewController) { + [UICompositeView addSubView:self.mainViewController view:self.mainView]; + } + if (oldDetailsViewController == nil || oldDetailsViewController != self.detailsViewController) { + [UICompositeView addSubView:self.detailsViewController view:self.detailsView]; + } if (oldTabBarViewController == nil || oldTabBarViewController != self.tabBarViewController) { [UICompositeView addSubView:self.tabBarViewController view:self.tabBarView]; } @@ -665,7 +698,7 @@ [self update:nil tabBar:nil statusBar:nil sideMenu:[NSNumber numberWithBool:!hidden] fullscreen:nil]; } - (UIViewController *)getCurrentViewController { - return self.contentViewController; + return self.mainViewController; } - (BOOL)currentViewSupportsLandscape { diff --git a/Classes/LinphoneUI/UIContactCell.m b/Classes/LinphoneUI/UIContactCell.m index 383b239a3..d41fba729 100644 --- a/Classes/LinphoneUI/UIContactCell.m +++ b/Classes/LinphoneUI/UIContactCell.m @@ -36,6 +36,13 @@ UIView *sub = ((UIView *)[arrayOfViews objectAtIndex:0]); [self setFrame:CGRectMake(0, 0, sub.frame.size.width, sub.frame.size.height)]; [self addSubview:sub]; + + // Sections are wider on iPad and overlap linphone image - let's move it a bit + if (LinphoneManager.runningOnIpad) { + CGRect frame = _linphoneImage.frame; + frame.origin.x -= frame.size.width / 2; + _linphoneImage.frame = frame; + } } return self; } diff --git a/Classes/LinphoneUI/UIHistoryCell.h b/Classes/LinphoneUI/UIHistoryCell.h index 647d0ad2b..8cba9e8da 100644 --- a/Classes/LinphoneUI/UIHistoryCell.h +++ b/Classes/LinphoneUI/UIHistoryCell.h @@ -35,4 +35,6 @@ - (id)initWithIdentifier:(NSString*)identifier; +- (IBAction)onDetails:(id)event; + @end diff --git a/Classes/LinphoneUI/UIVideoButton.m b/Classes/LinphoneUI/UIVideoButton.m index 9909fa9ce..d78a50656 100644 --- a/Classes/LinphoneUI/UIVideoButton.m +++ b/Classes/LinphoneUI/UIVideoButton.m @@ -27,31 +27,8 @@ @synthesize waitView; -- (void)initUIVideoButton { +INIT_WITH_COMMON { last_update_state = FALSE; -} - -- (id)init { - self = [super init]; - if (self) { - [self initUIVideoButton]; - } - return self; -} - -- (id)initWithCoder:(NSCoder *)decoder { - self = [super initWithCoder:decoder]; - if (self) { - [self initUIVideoButton]; - } - return self; -} - -- (id)initWithFrame:(CGRect)frame { - self = [super initWithFrame:frame]; - if (self) { - [self initUIVideoButton]; - } return self; } diff --git a/Classes/PhoneMainView.h b/Classes/PhoneMainView.h index 4c080db3e..fa7d97bd1 100644 --- a/Classes/PhoneMainView.h +++ b/Classes/PhoneMainView.h @@ -53,7 +53,7 @@ }) #define VIEW(x) \ - DYNAMIC_CAST([PhoneMainView.instance.mainViewController getCachedController:x.compositeViewDescription.content], x) + DYNAMIC_CAST([PhoneMainView.instance.mainViewController getCachedController:x.compositeViewDescription.name], x) @class PhoneMainView; @@ -85,7 +85,7 @@ - (void)changeCurrentView:(UICompositeViewDescription *)currentView push:(BOOL)push; - (void)changeCurrentView:(UICompositeViewDescription *)view push:(BOOL)push animated:(BOOL)animated; - (UIViewController*)popCurrentView; -- (void)popToView:(UICompositeViewDescription *)currentView; +- (UIViewController *)popToView:(UICompositeViewDescription *)currentView; - (UICompositeViewDescription *)firstView; - (void)showStatusBar:(BOOL)show; - (void)showTabBar:(BOOL)show; diff --git a/Classes/PhoneMainView.m b/Classes/PhoneMainView.m index bf8aa5aa7..e974a35b3 100644 --- a/Classes/PhoneMainView.m +++ b/Classes/PhoneMainView.m @@ -563,7 +563,7 @@ static RootViewManager *rootViewManagerInstance = nil; } - (BOOL)isUnauthorizedView:(UICompositeViewDescription *)view { - return [[LinphoneManager.instance lpConfigStringForKey:@"unauthorized_views"] containsString:view.content]; + return [[LinphoneManager.instance lpConfigStringForKey:@"unauthorized_views"] containsString:view.name]; } - (UIViewController *)_changeCurrentView:(UICompositeViewDescription *)view @@ -577,11 +577,11 @@ static RootViewManager *rootViewManagerInstance = nil; if (fallback && [NSClassFromString(fallback) respondsToSelector:@selector(compositeViewDescription)]) { fallback_view = [NSClassFromString(fallback) performSelector:@selector(compositeViewDescription)]; } - LOGW(@"Trying to access unauthorized view %@, going back to %@", view.content, fallback_view.content); + LOGW(@"Trying to access unauthorized view %@, going back to %@", view.name, fallback_view.name); view = fallback_view; } if (![view equal:vc.currentView] || vc != self) { - LOGI(@"Change current view to %@", [view content]); + LOGI(@"Change current view to %@", view.name); if (animated && transition == nil) transition = [PhoneMainView getTransition:vc.currentView new:view]; [vc.mainViewController setViewTransition:(animated ? transition : nil)]; @@ -598,14 +598,14 @@ static RootViewManager *rootViewManagerInstance = nil; return [vc->mainViewController getCurrentViewController]; } -- (void)popToView:(UICompositeViewDescription *)view { +- (UIViewController *)popToView:(UICompositeViewDescription *)view { NSMutableArray *viewStack = [RootViewManager instance].viewDescriptionStack; while ([viewStack count] > 1 && ![[viewStack lastObject] equal:view]) { [viewStack removeLastObject]; } - [self _changeCurrentView:[viewStack lastObject] - transition:[PhoneMainView getBackwardTransition] - animated:[[LinphoneManager instance] lpConfigBoolForKey:@"animations_preference"]]; + return [self _changeCurrentView:[viewStack lastObject] + transition:[PhoneMainView getBackwardTransition] + animated:[[LinphoneManager instance] lpConfigBoolForKey:@"animations_preference"]]; } - (UICompositeViewDescription *)firstView { diff --git a/Classes/SettingsView.m b/Classes/SettingsView.m index f03606560..3a6037d7a 100644 --- a/Classes/SettingsView.m +++ b/Classes/SettingsView.m @@ -328,8 +328,8 @@ static UICompositeViewDescription *compositeDescription = nil; tabBar:nil sideMenu:SideMenuView.class fullscreen:false - landscapeMode:LinphoneManager.runningOnIpad - portraitMode:true]; + isLeftFragment:YES + fragmentWith:nil]; } return compositeDescription; } diff --git a/Resources/Images.xcassets/AppIcon.appiconset/Contents.json b/Resources/Images.xcassets/AppIcon.appiconset/Contents.json index 2982bf4af..90730a624 100644 --- a/Resources/Images.xcassets/AppIcon.appiconset/Contents.json +++ b/Resources/Images.xcassets/AppIcon.appiconset/Contents.json @@ -101,10 +101,16 @@ "idiom" : "ipad", "filename" : "linphone_icon_152.png", "scale" : "2x" + }, + { + "size" : "83.5x83.5", + "idiom" : "ipad", + "filename" : "linphone_icon_167.png", + "scale" : "2x" } ], "info" : { "version" : 1, "author" : "xcode" } -} \ No newline at end of file +} diff --git a/Resources/Images.xcassets/AppIcon.appiconset/linphone_icon_120.png b/Resources/Images.xcassets/AppIcon.appiconset/linphone_icon_120.png index a4f35eef967bf46efa8ac1d2f9c2be4d4f2cd3af..662f657bb675f1ecc42b1f0268b4c49f9537fe03 100644 GIT binary patch delta 105 zcmZ3iu~=h5A199hzZ&1v{P0^Fr&|bz80i|Cg&3Mz8CzHxnrIssS{WGBMKGi@Ffgc= rxJHzuB$lLF<>sekrd2W+85o-C8e-AF&${C_Py>UftDnm{r-UW|1%VtB delta 105 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

pEk~^vWVbwIfHXqofI4=2@`z;^mpz+}X zrN*gNQ)G9WlQmR2aa_|5u0_F(OotbA^{-L43gK#3Vugd0MKRQhr{CxBI|U0MPCM?^ z2g(c2Ja@2t?^7>nqJl^j%7JXOlxNJaEJA|^6(XGu4F87`kGIs!DiLJPQU|iBE(Au; z5iVVUHckOo%In$w0aLEEZ^aUcz$C&G39iEWNR}&Ooi+T#gH-HW8>2pv?MzJ34VZ5^ zt{Wpl!R0@#+R@yl_6!#445CD4sBw+sbskjmleU_%%;$bjC2O2E4z9|)){8uzux2X0 z`er?E00QIslxcT8M-Y!t@hVRlSBD1%yPGVxCYJw5sr`9diLd3ItX!-IVCta}b9Pwc zrZIv9EXs~3>h>WqmMV7WD+xN7{Br}N09xT__{B*Am5{dm>I`568gxU8#beuxx~ZN? zkEr@PV7l_hXn|i3QpdPp?pM5WPpY}rEyMg-;t025IruJ60izREphNA20n7wv=h6mzL$5>TV z4OmDuQO!ue!0q}2DjD$YZWcX)P%Xz2VZH?Woqh!a-{RQhqciu)?PI`jN+|taTpVbxQG> zEqpx5MyH7u5sa1OgG=`;S6%=Ea+eoKh)HLX>LiqRPx5}__rdI=Gp$!VWZ$Qe)J2%>UGDkkNu=j`ezbJ^Ih?CM94j* zeXsBArju@mCXw?VHw9Lar2?v#TqWq{fiy~_^n|_yH8FXmL9fGhaDQx^tV_2_(TT%) zSzp=Ts}RIhe#|eXtOQeO0`zC&q2zV1VN{BR$!{*3#P#lePj1ZMvk`Z;6Ax@5l<}$T z-R(aUQ~kWB+s6H|K-xRf{iDI9gR_Ai!>r)oA;;{Y+<5Xp4#sA7Og>fvRu9K4)V-Wo z(&<4ZO7#-|H5J$SeoKN%Z6pcBMY?eCI#{|$K{q3DqcwA!6o$=qT^Y_r7cFwQuBML% zhK1*5?D}qA4wx2mr}Q2^;QU~ykR>X37^lHbd-C}d{^K*FK@UeCVd)4E2s!Z@0*jqi zco3D_fpOvfzf@01zjz~tvQ9rJjkbVulW<14lRD}!=^54gE7>R#iPBR!x0F_ZMEt5? z8q@Ul;Eci$O`NzU_hnZ?xpE1HZV_#EqKqh-#5PmiS@wQfyEnnPy^9pjK@H0vxK(9R zQ#s%NP_#`H`k8s`ZTUe{X^9+eu9_)IxYj7MsQvE&uCrh1-PT@=-=-FG6q)CW`IbO| zzK~64e2IZW?hOQpFEDr}e2zNs*te`%cL#_3JzkG8N@mOc@Zq3}+ZXT5O8u%wnlwUms z6O?a+0isAvM^0(KbhqSOJOCf&O@yDj4Lb?phDE!xoRTgP*P2TUUNony)qTgL>|Q`a z{HIxc^<8@Qs~VCfJk~mRL6nIs#V>fpMCrg*^0a!+NPzc8#816p{4(H?obR|xg`;&ioX+XN@>cG6RxaTR_B|rj4+s!G$a`L#L0PLQ4&ebnX+T4#NJMZOBBG(PzZAFU zKFbug83Qj?Dn^VktbRgvbY5seA199hzZ&1v{P0^Fr>Ag)80i|Cg&3Mz8CzHxnrIssS{WGBMKGi@Ffgc= rxJHzuB$lLF<>sekrd2W+85o-C8e-AF&${C_Py>UftDnm{r-UW|BF`LP delta 105 zcmX>vbY5seA15~ppRsO^%C_K*(^EJ?40R1mLJUo;Obx9}OtlRRtqcr)tqe6{U|>)! rag8WRNi0dV%FR#7OsixtGB7mNHN>K!`^(!tpaup{S3j3^P6=d#Wzp$P!(_ZSBN diff --git a/Resources/Images.xcassets/AppIcon.appiconset/linphone_icon_72.png b/Resources/Images.xcassets/AppIcon.appiconset/linphone_icon_72.png index e87a07a5a711b98f277b0770e3cba0cd2085d59b..ae1756067b6c9e2e978269bf0519e0e1d2f433e8 100644 GIT binary patch delta 84 zcmX>tep-A&A199hzZ&1v{P0^Fr$68lH_|mU3o$gcGPbZXG|@INv@$TLi(p8f+{Z1Y Wj75&0b;oT6Antep-A&A15~ppRsO^%C_K*(;sk&8|oUEgczDwnHpM|m}(msS{WGpS{Z6IxsO{) W8H-%^m$!WkK;Y@>=d#Wzp$PyViWrgr diff --git a/Resources/Images.xcassets/AppIcon.appiconset/linphone_icon_72@2x.png b/Resources/Images.xcassets/AppIcon.appiconset/linphone_icon_72@2x.png index 80577b143c7ca2d8dbb6cc73b0df40a72030c52b..09d0359468b257e2e66696b273ce74c630373189 100644 GIT binary patch delta 84 zcmdmGu*+aVA199hzZ&1v{P0^Fr~8YG8|fOFg&3Mz8CzHxnrIssS{WGBMKGjK{wpq} Wj75&0b;oT6An=d#Wzp$PyLBp8_h diff --git a/Resources/Images.xcassets/AppIcon.appiconset/linphone_icon_76.png b/Resources/Images.xcassets/AppIcon.appiconset/linphone_icon_76.png index e81264a7b47f85848e0d8a1e0c91e561f06f6928..dfc02b4c97dfca3fcd2b53a88525d88944258e79 100644 GIT binary patch delta 84 zcmZ1{xlVFIA199hzZ&1v{P0^Fryu4PH_|mU3o$gcGPbZXG|@INv@$TLi(p8fT*xD( Wj75&0b;oT6An=d#Wzp$Py2h8QFO diff --git a/iTunesArtwork b/iTunesArtwork index 9037b6a1f9c8378ebe5643a60ab55052c29458da..daafcb919c63fb1d3e133a5697bb33a331039333 100644 GIT binary patch delta 73 zcmZqgVQlYV+_2eI+(_5ZEX2^%%Gk`x)JWUF(8|D|ots-^@+ns-Wh`>v!Zxp900K`} KKbLh*2~7at{1fE> delta 73 zcmZqgVQlYV+_2eI+)&rRB*f6f%GA)x#8lhB(8|Ez*UC_%$){YUl(EQle|g)-00f?{ KelF{r5}E)aj}@f= diff --git a/linphone.xcodeproj/project.pbxproj b/linphone.xcodeproj/project.pbxproj index 7d862e665..1697f2085 100755 --- a/linphone.xcodeproj/project.pbxproj +++ b/linphone.xcodeproj/project.pbxproj @@ -81,6 +81,7 @@ 6306440E1BECB08500134C72 /* FirstLoginView.m in Sources */ = {isa = PBXBuildFile; fileRef = 6306440C1BECB08500134C72 /* FirstLoginView.m */; }; 6308F9C51BF0DD6600D1234B /* XMLRPCHelper.m in Sources */ = {isa = PBXBuildFile; fileRef = 6308F9C41BF0DD6600D1234B /* XMLRPCHelper.m */; }; 630CF5571AF7CE1500539F7A /* UITextField+DoneButton.m in Sources */ = {isa = PBXBuildFile; fileRef = 630CF5561AF7CE1500539F7A /* UITextField+DoneButton.m */; }; + 63130FB21C1ED06900371918 /* SideMenuView~ipad.xib in Resources */ = {isa = PBXBuildFile; fileRef = 63130FB01C1ED06900371918 /* SideMenuView~ipad.xib */; }; 631348301B6F7B6600C6BDCB /* UIRoundBorderedButton.m in Sources */ = {isa = PBXBuildFile; fileRef = 6313482F1B6F7B6600C6BDCB /* UIRoundBorderedButton.m */; }; 631348321B6FA53300C6BDCB /* rootca.pem in Resources */ = {isa = PBXBuildFile; fileRef = 631348311B6FA53300C6BDCB /* rootca.pem */; }; 6316FA6D1BE12A3E0050E441 /* UIRightImageButton.m in Sources */ = {isa = PBXBuildFile; fileRef = 6316FA6C1BE12A3E0050E441 /* UIRightImageButton.m */; }; @@ -470,6 +471,9 @@ 63730FBA1C07570C00AD7A74 /* waiting_time@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 63730E521C07570C00AD7A74 /* waiting_time@2x.png */; }; 6377AC801BDE4069007F7625 /* UIBackToCallButton.m in Sources */ = {isa = PBXBuildFile; fileRef = 6377AC7F1BDE4069007F7625 /* UIBackToCallButton.m */; }; 6381DA7D1C1AD5EA00DF3BBD /* UIBouncingView.m in Sources */ = {isa = PBXBuildFile; fileRef = 6381DA7C1C1AD5EA00DF3BBD /* UIBouncingView.m */; }; + 638F1A621C2021B2004B8E02 /* DialerView~ipad.xib in Resources */ = {isa = PBXBuildFile; fileRef = 638F1A601C2021B2004B8E02 /* DialerView~ipad.xib */; }; + 638F1A881C2167C2004B8E02 /* CallView~ipad.xib in Resources */ = {isa = PBXBuildFile; fileRef = 638F1A861C2167C2004B8E02 /* CallView~ipad.xib */; }; + 638F1A911C21993D004B8E02 /* UICompositeView~ipad.xib in Resources */ = {isa = PBXBuildFile; fileRef = 638F1A8F1C21993D004B8E02 /* UICompositeView~ipad.xib */; }; 639CEAFD1A1DF4D9004DE38F /* StatusBarView.xib in Resources */ = {isa = PBXBuildFile; fileRef = 639CEAFF1A1DF4D9004DE38F /* StatusBarView.xib */; }; 639CEB001A1DF4E4004DE38F /* UIHistoryCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = 639CEB021A1DF4E4004DE38F /* UIHistoryCell.xib */; }; 639CEB031A1DF4EB004DE38F /* UICompositeView.xib in Resources */ = {isa = PBXBuildFile; fileRef = 639CEB051A1DF4EB004DE38F /* UICompositeView.xib */; }; @@ -885,6 +889,7 @@ 6308F9C41BF0DD6600D1234B /* XMLRPCHelper.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = XMLRPCHelper.m; path = Utils/XMLRPCHelper.m; sourceTree = ""; }; 630CF5551AF7CE1500539F7A /* UITextField+DoneButton.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "UITextField+DoneButton.h"; sourceTree = ""; }; 630CF5561AF7CE1500539F7A /* UITextField+DoneButton.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "UITextField+DoneButton.m"; sourceTree = ""; }; + 63130FB11C1ED06900371918 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = Base; path = "Base.lproj/SideMenuView~ipad.xib"; sourceTree = ""; }; 6313482E1B6F7B6600C6BDCB /* UIRoundBorderedButton.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = UIRoundBorderedButton.h; sourceTree = ""; }; 6313482F1B6F7B6600C6BDCB /* UIRoundBorderedButton.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = UIRoundBorderedButton.m; sourceTree = ""; }; 631348311B6FA53300C6BDCB /* rootca.pem */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; name = rootca.pem; path = "liblinphone-sdk/apple-darwin/share/linphone/rootca.pem"; sourceTree = SOURCE_ROOT; }; @@ -1289,6 +1294,9 @@ 6377AC7F1BDE4069007F7625 /* UIBackToCallButton.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = UIBackToCallButton.m; sourceTree = ""; }; 6381DA7B1C1AD5EA00DF3BBD /* UIBouncingView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = UIBouncingView.h; sourceTree = ""; }; 6381DA7C1C1AD5EA00DF3BBD /* UIBouncingView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = UIBouncingView.m; sourceTree = ""; }; + 638F1A611C2021B2004B8E02 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = Base; path = "Base.lproj/DialerView~ipad.xib"; sourceTree = ""; }; + 638F1A871C2167C2004B8E02 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = Base; path = "Base.lproj/CallView~ipad.xib"; sourceTree = ""; }; + 638F1A901C21993D004B8E02 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = Base; path = "Base.lproj/UICompositeView~ipad.xib"; sourceTree = ""; }; 639CEAFE1A1DF4D9004DE38F /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = Base; path = Base.lproj/StatusBarView.xib; sourceTree = ""; }; 639CEB011A1DF4E4004DE38F /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = Base; path = Base.lproj/UIHistoryCell.xib; sourceTree = ""; }; 639CEB041A1DF4EB004DE38F /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = Base; path = Base.lproj/UICompositeView.xib; sourceTree = ""; }; @@ -1740,6 +1748,7 @@ D3F83EE91582021700336684 /* CallView.h */, D3F83EEA1582021700336684 /* CallView.m */, D381881C15FE3FCA00C3EDCA /* CallView.xib */, + 638F1A861C2167C2004B8E02 /* CallView~ipad.xib */, 6341807A1BBC103100F71761 /* ChatConversationCreateTableView.h */, 6341807B1BBC103100F71761 /* ChatConversationCreateTableView.m */, 6336715E1BCBAAD200BFCBDE /* ChatConversationCreateView.h */, @@ -1769,6 +1778,7 @@ 22F2508B107141E100AC9B3F /* DialerView.h */, 22F2508C107141E100AC9B3F /* DialerView.m */, D38187C415FE345B00C3EDCA /* DialerView.xib */, + 638F1A601C2021B2004B8E02 /* DialerView~ipad.xib */, 6306440B1BECB08500134C72 /* FirstLoginView.h */, 6306440C1BECB08500134C72 /* FirstLoginView.m */, 639E9C951C0DB7BE00019A75 /* FirstLoginView.xib */, @@ -1809,6 +1819,7 @@ 633756421B67D2B100E21BAD /* SideMenuView.h */, 633756431B67D2B100E21BAD /* SideMenuView.m */, 639E9CB21C0DB83000019A75 /* SideMenuView.xib */, + 63130FB01C1ED06900371918 /* SideMenuView~ipad.xib */, D354981E1587716B000081D8 /* StatusBarView.h */, D354981F1587716B000081D8 /* StatusBarView.m */, 639CEAFF1A1DF4D9004DE38F /* StatusBarView.xib */, @@ -1871,6 +1882,7 @@ D31B4B1E159876C0002E6C72 /* UICompositeView.h */, D31B4B1F159876C0002E6C72 /* UICompositeView.m */, 639CEB051A1DF4EB004DE38F /* UICompositeView.xib */, + 638F1A8F1C21993D004B8E02 /* UICompositeView~ipad.xib */, 63701DDD1BA32039006A9AE3 /* UIConfirmationDialog.h */, 63701DDE1BA32039006A9AE3 /* UIConfirmationDialog.m */, 639E9CAB1C0DB7FB00019A75 /* UIConfirmationDialog.xib */, @@ -2761,7 +2773,7 @@ 29B97313FDCFA39411CA2CEA /* Project object */ = { isa = PBXProject; attributes = { - LastUpgradeCheck = 0700; + LastUpgradeCheck = 0720; TargetAttributes = { 1D6058900D05DD3D006BFB54 = { DevelopmentTeam = Z2V957B3D6; @@ -2873,6 +2885,7 @@ 636316D11A1DEBCB0009B839 /* AboutView.xib in Resources */, 63730F931C07570C00AD7A74 /* route_earpiece_selected.png in Resources */, 63730F1B1C07570C00AD7A74 /* history_chat_indicator@2x.png in Resources */, + 638F1A621C2021B2004B8E02 /* DialerView~ipad.xib in Resources */, 63730E981C07570C00AD7A74 /* call_transfer_default@2x.png in Resources */, 63730ED01C07570C00AD7A74 /* color_D.png in Resources */, 63730FB81C07570C00AD7A74 /* voicemail@2x.png in Resources */, @@ -2998,6 +3011,7 @@ 63730E791C07570C00AD7A74 /* call_hangup_disabled.png in Resources */, F088488A19FF8C41007FFCF3 /* UIContactCell.xib in Resources */, 63730EF41C07570C00AD7A74 /* deselect_all.png in Resources */, + 63130FB21C1ED06900371918 /* SideMenuView~ipad.xib in Resources */, 63730F461C07570C00AD7A74 /* numpad_3_default.png in Resources */, 63730EB11C07570C00AD7A74 /* chat_add_disabled.png in Resources */, 63730F5F1C07570C00AD7A74 /* numpad_9_default@2x.png in Resources */, @@ -3044,6 +3058,7 @@ 63730F9C1C07570C00AD7A74 /* routes_default@2x.png in Resources */, 63730F8B1C07570C00AD7A74 /* route_bluetooth_disabled.png in Resources */, 63AADBFA1B6A0FF200AA16FD /* msg.wav in Resources */, + 638F1A911C21993D004B8E02 /* UICompositeView~ipad.xib in Resources */, 63730E971C07570C00AD7A74 /* call_transfer_default.png in Resources */, 63730ED91C07570C00AD7A74 /* conference_exit_default@2x.png in Resources */, 63730F101C07570C00AD7A74 /* footer_history_default.png in Resources */, @@ -3108,6 +3123,7 @@ 63730F791C07570C00AD7A74 /* options_transfer_call_default.png in Resources */, 63730EC51C07570C00AD7A74 /* chat_start_body_disabled.png in Resources */, D38187DD15FE348A00C3EDCA /* AssistantView.xib in Resources */, + 638F1A881C2167C2004B8E02 /* CallView~ipad.xib in Resources */, 63730F851C07570C00AD7A74 /* pause_small_disabled.png in Resources */, 63730EAC1C07570C00AD7A74 /* cancel_edit_default@2x.png in Resources */, 63730F411C07570C00AD7A74 /* numpad_1_over@2x.png in Resources */, @@ -3590,6 +3606,14 @@ name = InfoPlist.strings; sourceTree = ""; }; + 63130FB01C1ED06900371918 /* SideMenuView~ipad.xib */ = { + isa = PBXVariantGroup; + children = ( + 63130FB11C1ED06900371918 /* Base */, + ); + name = "SideMenuView~ipad.xib"; + sourceTree = ""; + }; 634610101B6140A500548952 /* CallOutgoingView.xib */ = { isa = PBXVariantGroup; children = ( @@ -3617,6 +3641,30 @@ name = SettingsView.xib; sourceTree = ""; }; + 638F1A601C2021B2004B8E02 /* DialerView~ipad.xib */ = { + isa = PBXVariantGroup; + children = ( + 638F1A611C2021B2004B8E02 /* Base */, + ); + name = "DialerView~ipad.xib"; + sourceTree = ""; + }; + 638F1A861C2167C2004B8E02 /* CallView~ipad.xib */ = { + isa = PBXVariantGroup; + children = ( + 638F1A871C2167C2004B8E02 /* Base */, + ); + name = "CallView~ipad.xib"; + sourceTree = ""; + }; + 638F1A8F1C21993D004B8E02 /* UICompositeView~ipad.xib */ = { + isa = PBXVariantGroup; + children = ( + 638F1A901C21993D004B8E02 /* Base */, + ); + name = "UICompositeView~ipad.xib"; + sourceTree = ""; + }; 639CEAFF1A1DF4D9004DE38F /* StatusBarView.xib */ = { isa = PBXVariantGroup; children = ( diff --git a/linphone.xcodeproj/xcshareddata/xcschemes/LinphoneTester.xcscheme b/linphone.xcodeproj/xcshareddata/xcschemes/LinphoneTester.xcscheme index 140b7cb98..0345d7d43 100644 --- a/linphone.xcodeproj/xcshareddata/xcschemes/LinphoneTester.xcscheme +++ b/linphone.xcodeproj/xcshareddata/xcschemes/LinphoneTester.xcscheme @@ -1,6 +1,6 @@