Bgerstle has uploaded a new change for review. https://gerrit.wikimedia.org/r/210823
Change subject: ugly WIP: group preferred languages ...................................................................... ugly WIP: group preferred languages - [x] group languages by "preferred" and "other" - [ ] implement & localize proper section headers - [ ] add new icon to bottom bar Bug: T97780 Change-Id: I7218a1a0016563808b1dab70ca6ff97c504cd5e9 --- M Wikipedia/View Controllers/Languages/LanguagesViewController.m 1 file changed, 75 insertions(+), 40 deletions(-) git pull ssh://gerrit.wikimedia.org:29418/apps/ios/wikipedia refs/changes/23/210823/1 diff --git a/Wikipedia/View Controllers/Languages/LanguagesViewController.m b/Wikipedia/View Controllers/Languages/LanguagesViewController.m index 03538da..ca0550c 100644 --- a/Wikipedia/View Controllers/Languages/LanguagesViewController.m +++ b/Wikipedia/View Controllers/Languages/LanguagesViewController.m @@ -12,17 +12,30 @@ #import "UIViewController+Alert.h" #import "UIViewController+ModalPop.h" #import "UIView+ConstraintsScale.h" +#import "NSString+Extras.h" #pragma mark - Defines -#define BACKGROUND_COLOR [UIColor colorWithWhite:1.0f alpha:1.0f] - -#pragma mark - Private properties +typedef NS_ENUM (NSInteger, WMFLanguagesTableSection) { + /// Section in the languages table containing preferred languages. + WMFLanguagesTableSectionPreferred = 0, + /// Section in the languages table containing languages other than the preferred ones. + WMFLanguagesTableSectionOther = 1, + /// Number of sections in the languages table + WMFLanguagesTableSectionCount +}; @interface LanguagesViewController () +/// Array of dictionaries which represent languages to choose from. @property (strong, nonatomic) NSArray* languagesData; -@property (strong, nonatomic) NSMutableArray* filteredLanguagesData; + +/// Languages in `languagesData` filtered by `filterString` that are contained in the user's preferred languages. +/// @note The user's preferred languages are currently dictated by `+[NSLocale preferredLanguages]`. +@property (strong, nonatomic) NSArray* preferredLanguages; + +/// Languages in `languagesData` filtered by `filterString` that aren't in `preferredLanguages` +@property (strong, nonatomic) NSArray* otherLanguages; @property (strong, nonatomic) NSString* filterString; @property (strong, nonatomic) UITextField* filterTextField; @@ -53,15 +66,9 @@ [super viewDidLoad]; self.tableView.separatorStyle = UITableViewCellSeparatorStyleNone; - - self.languagesData = @[]; - self.filteredLanguagesData = @[].mutableCopy; - - self.view.backgroundColor = BACKGROUND_COLOR; - - self.tableView.contentInset = UIEdgeInsetsMake(15.0 * MENUS_SCALE_MULTIPLIER, 0, 0, 0); - - self.filterString = @""; + self.view.backgroundColor = [UIColor whiteColor]; + self.tableView.contentInset = UIEdgeInsetsMake(15.0 * MENUS_SCALE_MULTIPLIER, 0, 0, 0); + self.filterString = @""; } - (void)viewWillAppear:(BOOL)animated { @@ -140,24 +147,31 @@ } - (void)reloadTableDataFiltered { - if (self.filterString.length == 0) { - self.filteredLanguagesData = self.languagesData.mutableCopy; - [self.tableView reloadData]; - return; + NSArray* filteredLanguages; + if (!self.filterString.length) { + filteredLanguages = [self.languagesData copy]; + } else { + filteredLanguages = + [self.languagesData filteredArrayUsingPredicate: + [NSPredicate predicateWithBlock:^BOOL (NSDictionary* lang, NSDictionary* bindings) { +#warning TODO: use proper model object and refactor this into an instance method + return [lang[@"name"] wmf_isEqualToStringIgnoringCase:self.filterString] + || [lang[@"canonical_name"] wmf_caseInsensitiveContainsString:self.filterString] + || [lang[@"code"] wmf_isEqualToStringIgnoringCase:self.filterString]; + }]]; } - [self.filteredLanguagesData removeAllObjects]; + self.preferredLanguages = + [filteredLanguages filteredArrayUsingPredicate: + [NSPredicate predicateWithBlock:^BOOL (NSDictionary* lang, NSDictionary* bindings) { + return [[NSLocale preferredLanguages] containsObject:lang[@"code"]]; + }]]; - self.filteredLanguagesData = - [self.languagesData filteredArrayUsingPredicate: - [NSPredicate predicateWithFormat:@"\ - SELF.name contains[c] %@\ - || \ - SELF.canonical_name contains[c] %@\ - || \ - SELF.code == [c] %@\ - ", self.filterString, self.filterString, self.filterString] - ].mutableCopy; + self.otherLanguages = + [filteredLanguages filteredArrayUsingPredicate: + [NSPredicate predicateWithBlock:^BOOL (id evaluatedObject, NSDictionary* bindings) { + return ![self.preferredLanguages containsObject:evaluatedObject]; + }]]; [self.tableView reloadData]; } @@ -202,36 +216,57 @@ thenNotifyDelegate:self]; } +- (NSDictionary*)languageAtIndexPath:(NSIndexPath*)indexPath { + switch (indexPath.section) { + case WMFLanguagesTableSectionOther: + return self.otherLanguages[indexPath.row]; + case WMFLanguagesTableSectionPreferred: + return self.preferredLanguages[indexPath.row]; + } + NSAssert(NO, @"Forgot to add a case to the language-for-section switch!"); + return @{}; +} + #pragma mark - Table protocol methods - (NSInteger)numberOfSectionsInTableView:(UITableView*)tableView { // Return the number of sections. - return 1; + return WMFLanguagesTableSectionCount; } - (NSInteger)tableView:(UITableView*)tableView numberOfRowsInSection:(NSInteger)section { - // Return the number of rows in the section. - return self.filteredLanguagesData.count; + switch (section) { + case WMFLanguagesTableSectionOther: + return self.otherLanguages.count; + case WMFLanguagesTableSectionPreferred: + return self.preferredLanguages.count; + } + NSAssert(NO, @"Forgot to add a case to the items-for-section switch!"); + return 0; } - (CGFloat)tableView:(UITableView*)tableView heightForRowAtIndexPath:(NSIndexPath*)indexPath { return 48.0 * MENUS_SCALE_MULTIPLIER; } -- (CGFloat)tableView:(UITableView*)tableView heightForHeaderInSection:(NSInteger)section; -{ - return 0; -} - -- (UIView*)tableView:(UITableView*)tableView viewForHeaderInSection:(NSInteger)section { - return nil; +- (NSString*)tableView:(UITableView*)tableView titleForHeaderInSection:(NSInteger)section { + switch (section) { + case WMFLanguagesTableSectionPreferred: + #warning TODO: localize + return @"Preferred"; + case WMFLanguagesTableSectionOther: + #warning TODO: localize + return @"Other languages"; + } + NSAssert(NO, @"Forgot to add a case to the section title mapping switch!"); + return @""; } - (UITableViewCell*)tableView:(UITableView*)tableView cellForRowAtIndexPath:(NSIndexPath*)indexPath { static NSString* cellId = @"LanguagesCell"; LanguagesCell* cell = [tableView dequeueReusableCellWithIdentifier:cellId forIndexPath:indexPath]; - NSDictionary* d = self.filteredLanguagesData[indexPath.row]; + NSDictionary* d = [self languageAtIndexPath:indexPath]; cell.textLabel.text = d[@"name"]; cell.canonicalLabel.text = d[@"canonical_name"]; @@ -240,7 +275,7 @@ } - (void)tableView:(UITableView*)tableView didSelectRowAtIndexPath:(NSIndexPath*)indexPath { - NSDictionary* selectedLangInfo = self.filteredLanguagesData[indexPath.row]; + NSDictionary* selectedLangInfo = [self languageAtIndexPath:indexPath]; [self.languageSelectionDelegate languageSelected:selectedLangInfo sender:self]; } -- To view, visit https://gerrit.wikimedia.org/r/210823 To unsubscribe, visit https://gerrit.wikimedia.org/r/settings Gerrit-MessageType: newchange Gerrit-Change-Id: I7218a1a0016563808b1dab70ca6ff97c504cd5e9 Gerrit-PatchSet: 1 Gerrit-Project: apps/ios/wikipedia Gerrit-Branch: master Gerrit-Owner: Bgerstle <bgers...@wikimedia.org> _______________________________________________ MediaWiki-commits mailing list MediaWiki-commits@lists.wikimedia.org https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits