Developer Area

root/apps/iphone/superbook/trunk/Classes/NaptrViewController.m @ 905

Revision 905, 35.3 kB (checked in by henri, 3 years ago)

Typo fix in localization

Line 
1//
2//  NaptrViewController.m
3//  LocateThem
4//
5//  Created by Henri Asseily on 8/25/08.
6/*
7 Copyright (c) 2008-2009, Telnic Ltd. All rights reserved.
8 
9 Redistribution and use in source and binary forms, with or without modification,
10 are permitted provided that the following conditions are met:
11 
12 Redistributions of source code must retain the above copyright notice, this list of conditions
13 and the following disclaimer. Redistributions in binary form must reproduce the above copyright
14 notice, this list of conditions and the following disclaimer in the documentation and/or other
15 materials provided with the distribution.
16 Neither the name of the Telnic Ltd. nor the names of its contributors may be used to endorse or
17 promote products derived from this software without specific prior written permission.
18 THIS DOCUMENTATION IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS
19 OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
20 AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
21 CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
22 DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
23 DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
24 IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
25 OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26 */
27//
28
29#import "NaptrViewController.h"
30#import "NSString+UITableViewHelper.h"
31#import "NaptrCell.h"
32#import "NTNaptrCell.h"
33#import "FriendsData.h"
34#import "FriendsMapViewController.h"
35#import "WebUrlViewController.h"
36#import "RecordNaptr+HAAdditions.h"
37#import "SHK.h"
38
39static UIFont *headerFont;
40static UIFont *naptrLabelFont;
41static UIFont *txtFont;
42static CGFloat naptrCellRowLineHeight;
43static CGSize maximumLabelSize;
44
45enum ActionSheets_enum {
46    ActionSheet_Action,
47    ActionSheet_Call,
48    ActionSheet_Share
49};
50
51@interface NaptrViewController (PrivateMethods)
52
53- (void)decrementLoadingCount;
54- (void)refreshTableNaptrAndTxt;
55- (void)refreshTableLoc;
56- (void)showError:(NSError *)error;
57- (UITableViewCell *)footerCellForTableView:(UITableView *)tableView;
58@end
59
60@implementation NaptrViewController
61
62@synthesize theDomain;
63@synthesize prefsReverseGeo;
64@synthesize loadingAIView;
65@synthesize loadingAIButton;
66@synthesize logoImage;
67@synthesize actionContactButton;
68@synthesize abId;
69
70#define kHeaderTextFontSize 14.0
71#define kTextFontSize 12.0
72#define kLogoSize 78.0
73#define kFooterCellHeight 24.0f
74
75#pragma mark -
76#pragma mark canonical init methods
77
78
79- (BOOL)setupWithPersonId:(NSNumber *)personId {
80        NSString *telName = [[FriendsData sharedInstance] getTelForABRecordId:personId withABRecordRef:nil];
81        BOOL res = [self setupWithTel:telName];
82        self.abId = personId;
83        return res;
84}
85
86- (BOOL) setupWithTel:(NSString *)telName {
87   
88        NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
89        self.prefsReverseGeo = [defaults integerForKey:@"reverseGeoPreference"];
90
91        headerFont = [UIFont boldSystemFontOfSize:kHeaderTextFontSize];
92        naptrLabelFont = [UIFont systemFontOfSize:kNaptrCellBaseFontSize];
93        txtFont = [UIFont boldSystemFontOfSize:kTextFontSize];
94        naptrCellRowLineHeight = [@"dummy text" sizeWithFont:naptrLabelFont].height;
95        maximumLabelSize = CGSizeMake([UIScreen mainScreen].bounds.size.width-50-kMarginSize, 500);
96
97        self.theDomain = [[[TelDomain alloc] initWithTelName:telName delegate:self] autorelease];
98        self.title = self.theDomain.displayName;
99        if (!self.title)
100                return FALSE;
101        self.abId = [NSNumber numberWithInt:NSUIntegerMax];
102
103        self.loadingAIView = [[[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleGray] autorelease];
104        self.loadingAIView.hidesWhenStopped = YES;
105        self.loadingAIButton = [[[UIBarButtonItem alloc] initWithCustomView:self.loadingAIView] autorelease];
106       
107        self.actionContactButton = [[[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemAction
108                                                                                                                                                        target:self
109                                                                                                                                                        action:@selector(domainAction:)] autorelease];
110        self.logoImage = nil;
111   
112    self.refreshLabel.textColor = [UIColor whiteColor];
113    self.statusLabel.textColor = [UIColor lightTextColor];
114
115    // get the logo in case there's cached info in the TelDomain already
116    // this won't do anything if the logo doesn't exist
117    [self performSelectorInBackground:@selector(retrieveLogo) withObject:nil];
118
119        // set the uinavbar of the root viewcontroller of the navcontroller
120        self.navigationItem.rightBarButtonItem = self.loadingAIButton;
121       
122    if (self.theDomain.expiryDate == nil) {
123        [self refresh];
124    } else if ([theDomain.expiryDate compare:[NSDate date]] != NSOrderedDescending) {
125        self.statusLabel.text = [NSString stringWithFormat:NSLocalizedString(@"Status: Expired (%@)", @"Refresh Status Expired"), self.theDomain.expiryDate];
126        [self refresh];
127    }
128    [self.tableView reloadData];
129        return TRUE;
130}
131
132#pragma mark -
133#pragma mark refresh
134
135- (void)refresh {
136        loadingCount = 2;
137        [theDomain getNaptrAndTxtInBackground];
138        if (prefsReverseGeo) {
139        [theDomain addObserver:self forKeyPath:@"geoLocDidFinish" options:0 context:NULL];
140                [theDomain getLocAndReverseGeoInBackground];
141        } else {
142                [theDomain getLocInBackground];
143        }
144}
145
146#pragma mark -
147#pragma mark Basic methods
148
149- (void)viewDidLoad {
150    [super viewDidLoad];
151    self.tableView.separatorStyle = UITableViewCellSeparatorStyleNone;
152    self.tableView.showsVerticalScrollIndicator = NO;
153    self.tableView.backgroundColor = [UIColor colorWithRed:92.0/255.0 green:25.0/255.0 blue:117.0/255.0 alpha:1];   
154}
155
156- (void)viewWillAppear:(BOOL)animated {
157        [super viewWillAppear:animated];
158        if (!self.navigationItem.rightBarButtonItem) {
159                self.navigationItem.rightBarButtonItem = self.loadingAIButton;
160    }
161}
162
163- (void)viewDidAppear:(BOOL)animated {
164        [super viewDidAppear:animated];
165        self.navigationController.navigationBarHidden = NO;
166}
167
168- (void)didReceiveMemoryWarning {
169        [super didReceiveMemoryWarning];
170}
171
172- (void)dealloc {
173        [super dealloc];
174}
175
176#pragma mark -
177#pragma mark UI updates
178
179- (NSUInteger)loadingCount {
180        return loadingCount;
181}
182
183- (void)decrementLoadingCount {
184        // Must call this on main thread, because it has UI needs and is called from background threads
185        if (![NSThread isMainThread]) {
186                [self performSelectorOnMainThread:_cmd
187                                                           withObject:nil
188                                                        waitUntilDone:YES];
189                return;
190        }
191        loadingCount--;
192        if (loadingCount == 0) {
193                [self.loadingAIView stopAnimating];
194        [self performSelector:@selector(stopLoading) withObject:nil afterDelay:0.1];
195                self.navigationItem.rightBarButtonItem = self.actionContactButton;
196        if (! self.theDomain.isCached) {
197            // Cache the domain data if it's new data
198            [self.theDomain archiveToCache];
199        }
200        if ([self.theDomain.expiryDate compare:[NSDate date]] == NSOrderedDescending) {
201            self.statusLabel.text = [NSString stringWithFormat:NSLocalizedString(@"Status: %@", @"Refresh Status"), NSLocalizedString(@"Up-to-date", @"Up-to-date")];
202        } else {
203            if (self.theDomain.expiryDate != nil) {
204                self.statusLabel.text = [NSString stringWithFormat:NSLocalizedString(@"Status: Expired (%@)", @"Refresh Status Expired"), self.theDomain.expiryDate];
205            }
206        }
207        } else {
208                [self.loadingAIView startAnimating];
209                self.navigationItem.rightBarButtonItem = self.loadingAIButton;
210        }
211}
212
213- (void)didFinishGettingNaptrAndTxtWithError:(NSError *)error {
214        // Must call this on main thread, because it has UI needs and is called from background threads
215        if (![NSThread isMainThread]) {
216                [self performSelectorOnMainThread:_cmd
217                                                           withObject:error
218                                                        waitUntilDone:YES];
219                return;
220        }
221        [self decrementLoadingCount];
222        if (error) {
223                // Show all errors unless the answer is invalid, which generally means there aren't any NAPTRs
224                if ([error code] != RESOLVER_STATUS_INVALID_ANSWER) {
225                        [self showError:error];
226                }
227        }
228        self.title = self.theDomain.displayName;
229        [self performSelectorInBackground:@selector(retrieveLogo) withObject:nil];
230        [self.tableView reloadData];
231}
232
233- (void)didFinishGettingLocWithError:(NSError *)error {
234        // Must call this on main thread, because it has UI needs and is called from background threads
235        if (![NSThread isMainThread]) {
236                [self performSelectorOnMainThread:_cmd
237                                                           withObject:nil
238                                                        waitUntilDone:YES];
239                return;
240        }
241        [self decrementLoadingCount];
242//      NSIndexSet *sections = [NSIndexSet indexSetWithIndex:SECTION_LOC];
243//      [self.tableView reloadSections:sections withRowAnimation:UITableViewRowAnimationFade];
244        [self.tableView reloadData];
245}
246
247- (void)didFinishRetrievingLogo {
248        if (self.logoImage) {
249                [self.tableView reloadSections:[NSIndexSet indexSetWithIndex:SECTION_HEADER] withRowAnimation:UITableViewRowAnimationNone];
250        }
251}
252
253#pragma mark -
254#pragma mark tableView datasource methods
255
256- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
257        return SECTION_TOTAL;
258}
259
260- (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section {
261    // hide if nothing in the section
262    return nil;
263}
264
265- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
266        TelDomain *theD = self.theDomain;
267    NSUInteger ct = 0;
268        switch (section) {
269                case SECTION_HEADER:
270                        if (!(theD.headerText || theD.logoUrl)) {
271                                return 0;
272                        }
273                        return 1;
274                        break;
275                case SECTION_NAPTR:
276            ct = [theD.naptrArray count];
277                        return (ct == 0 ? 0 : ct+1);   // add the footer cell to the below sections
278                        break;
279                case SECTION_TXT:
280            ct = [theD.txtArray count];
281                        return (ct == 0 ? 0 : ct+1);   // add the footer cell to the below sections
282                        break;
283                case SECTION_LOC:
284            ct = [theD.locArray count];
285                        return (ct == 0 ? 0 : ct+1);   // add the footer cell to the below sections
286                        break;
287                default:
288                        return 0;
289                        break;
290        }
291        return 0;
292}
293
294- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
295       
296        TelDomain *dom = self.theDomain;
297        switch (indexPath.section) {
298                case SECTION_HEADER:
299                {
300                        static NSString *MyIdentifier = @"headerCell";
301                       
302                        UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:MyIdentifier];
303                        if (cell == nil) {
304                                cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:MyIdentifier] autorelease];
305                cell.backgroundView = [[[UIImageView alloc] initWithImage:[UIImage imageNamed:@"CellBackgroundPurple"]] autorelease];
306                        }
307                        //Working with a resizable cell
308                        //If there is already a subview, remove it.
309                        if ([[cell.contentView subviews] count] > 0) {
310                                UIView *viewToClear = [[cell.contentView subviews] objectAtIndex:0];
311                                [viewToClear removeFromSuperview];
312                        }
313                        if (self.logoImage) {
314                                UIImageView *logoImageView = [[[UIImageView alloc] initWithImage:logoImage] autorelease];
315                               
316                                // Resize the image to fit kLogoSize x kLogoSize
317                                CGFloat ivW = logoImageView.frame.size.width;
318                                CGFloat ivH = logoImageView.frame.size.height;
319                                CGFloat ratio = 1.0f;
320                                if (MAX(ivW, ivH) > kLogoSize) {
321                                        ratio = kLogoSize / MAX(ivW, ivH);
322                                        logoImageView.frame = CGRectMake(0, 0, ivW * ratio, ivH * ratio);
323                                }
324
325                                UILabel *headerLabel;
326                                headerLabel = [dom.headerText sizeCellLabelWithFont:headerFont
327                                                                                                                  cellWidth:([UIScreen mainScreen].bounds.size.width - kLogoSize)
328                                                                                                           paddingWidth:3.0f Height:6.0f];
329                                CGRect frame = CGRectMake(0.0f, 0.0f, [UIScreen mainScreen].bounds.size.width - 3.0f,
330                                                                                  MAX(headerLabel.frame.size.height, kLogoSize+3.0f*2));
331                                UIView *headerAndLogoView = [[[UIView alloc] initWithFrame:frame] autorelease];
332                                [headerAndLogoView addSubview:logoImageView];
333                                [headerAndLogoView addSubview:headerLabel];
334                                headerLabel.frame = CGRectMake(3.0f + kLogoSize, 3.0f, headerLabel.frame.size.width, headerLabel.frame.size.height);
335                headerLabel.textColor = [UIColor whiteColor];
336                                [cell.contentView addSubview:headerAndLogoView];
337                                [headerAndLogoView sizeToFit];
338                        }
339                        if ((! dom.logoUrl) || [[cell.contentView subviews] count] == 0) {
340                                // Failed to get logo, or logo doesn't exist
341                                UILabel *headerLabel;
342                                if (dom.headerText)
343                                        headerLabel = [dom.headerText sizeCellLabelWithFont:headerFont paddingWidth:3.0f Height:3.0f];
344                                else
345                                        headerLabel = [dom.displayName sizeCellLabelWithFont:headerFont paddingWidth:3.0f Height:3.0f];
346                headerLabel.textColor = [UIColor whiteColor];
347                                [cell.contentView addSubview:headerLabel];
348                        }
349                        return cell;
350                }
351                        break;
352                       
353                case SECTION_NAPTR:
354                {
355            if ([tableView numberOfRowsInSection:indexPath.section] == indexPath.row +1) {
356                return [self footerCellForTableView:tableView];
357            }
358
359                        static NSString *NaptrCellId = @"naptrCells";
360                        static NSString *NaptrCellNoLabelId = @"naptrCellsNoLabel";
361                        static NSString *NTNaptrCellId = @"ntnaptrCells";
362                        static NSString *NTNaptrCellNoLabelId = @"ntnaptrCellsNoLabel";
363
364                        RecordNaptr *theRec = [[dom.naptrArray objectAtIndex:indexPath.row] retain];
365                       
366                        NaptrCell *cell;
367                        NSString *nId;
368                        if (theRec.isTerminal) {
369                                if ([theRec.labelDescription length] > 0) {
370                                        nId = NaptrCellId;
371                                } else {
372                                        nId = NaptrCellNoLabelId;
373                                }
374                                cell = (NaptrCell *)[tableView dequeueReusableCellWithIdentifier:nId];
375                                if (cell == nil) {
376                                        cell = [[[NaptrCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:nId] autorelease];
377                                }
378                        } else {
379                                if ([theRec.labelDescription length] > 0) {
380                                        nId = NTNaptrCellId;
381                                } else {
382                                        nId = NTNaptrCellNoLabelId;
383                                }
384                                cell = (NTNaptrCell *)[tableView dequeueReusableCellWithIdentifier:nId];
385                                if (cell == nil) {
386                                        cell = [[[NTNaptrCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:nId] autorelease];
387                                }
388                        }
389                       
390                        cell.serviceText = theRec.serviceDescription;
391                        cell.labelText = theRec.labelDescription;
392                        cell.iconImage = [theRec icon];
393                       
394                        // Display the uri without the leading type, colon and slashes if necessary
395                        NSRange colonRange = [theRec.uriContent rangeOfString:@":"];
396                        if (colonRange.location == NSNotFound) {
397                                cell.uriText = theRec.uriContent;
398                        } else {
399                                NSUInteger beginLoc = colonRange.location + 1;
400                                while ([theRec.uriContent characterAtIndex:beginLoc] == '/') {
401                                        ++beginLoc;
402                                }
403                                if ([theRec.uriContent length] > beginLoc) {
404                                        cell.uriText = [theRec.uriContent substringFromIndex:beginLoc];
405                                } else {
406                                        cell.uriText = theRec.uriContent;
407                                }
408                        }
409
410
411                        // Check if it's a ntnaptr. If so, remove the trailing part of the string if it is a subdomain of the current domain
412                        if (! theRec.isTerminal) {
413                                // If NTN points within domain, shorten text to only display the subdomain of this domain
414                                if ([[theRec.uriContent lowercaseString] hasSuffix:[dom.telName lowercaseString]]) {
415                                        NSInteger suffixIndex = [theRec.uriContent length] - [dom.telName length] - 1;
416                                        if (suffixIndex > 0) {
417                                                cell.uriText = [[[theRec.uriContent substringToIndex:suffixIndex]
418                                         stringByReplacingOccurrencesOfString:@"-" withString:@" "]
419                                        capitalizedString];
420                                        }
421                                }
422                        }
423                        [theRec release];
424                        return cell;
425                }
426                        break;
427                       
428                case SECTION_TXT:
429                {
430            if ([tableView numberOfRowsInSection:indexPath.section] == indexPath.row +1) {
431                return [self footerCellForTableView:tableView];
432            }
433                        static NSString *MyIdentifier = @"txtCells";
434                       
435                        RecordTxt *theRec = [[dom.txtArray objectAtIndex:indexPath.row] retain];
436                       
437                        UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:MyIdentifier];
438                        if (cell == nil) {
439                                NSArray *txtCellNib = [[NSBundle mainBundle] loadNibNamed:@"TxtTableViewCell" owner:self options:nil];
440                                cell = (UITableViewCell *)[txtCellNib objectAtIndex:0];
441                UIImage *bgImage = [[UIImage imageNamed:@"tablecellbg"] stretchableImageWithLeftCapWidth:15 topCapHeight:0];
442                cell.backgroundView = [[[UIImageView alloc] initWithImage:bgImage] autorelease];
443                cell.backgroundView.opaque = YES;
444                        }
445                        [(UILabel *)[cell viewWithTag:1] setText:theRec.primaryDescription];
446                        if (theRec.primaryValue != NULL) {
447                                UILabel *theLabel = (UILabel *)[cell viewWithTag:3];
448                                theLabel.text = theRec.primaryValue;
449                                theLabel.textColor = [UIColor darkGrayColor];
450                        } else {
451                                [(UILabel *)[cell viewWithTag:3] setText:@""];
452                        }
453                       
454                        // Set the text description and resize the label accordingly
455                        // We're not doing it like the header because we're using a nib for the cell
456                        // (but we override the font size here)
457                        UILabel *textDescriptionLabel = (UILabel *)[cell viewWithTag:2];
458                        textDescriptionLabel.text = theRec.textValue;
459                        CGFloat width = textDescriptionLabel.frame.size.width;
460                        CGFloat height = [textDescriptionLabel.text cellHeightForFont:txtFont paddingWidth:10.0f Height:5.0f];
461                        CGRect newframe = CGRectMake(textDescriptionLabel.frame.origin.x, textDescriptionLabel.frame.origin.y, width, height);
462                        textDescriptionLabel.frame = newframe;
463
464            [theRec release];
465                        return cell;
466                }
467                        break;
468                       
469                case SECTION_LOC:
470                {
471            if ([tableView numberOfRowsInSection:indexPath.section] == indexPath.row +1) {
472                return [self footerCellForTableView:tableView];
473            }
474                        static NSString *MyIdentifier = @"locCell";
475                       
476                        RecordLoc *theRec = [[dom.locArray objectAtIndex:indexPath.row] retain];
477                       
478                        // Get the cell
479                        UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:MyIdentifier];
480                        if (cell == nil) {
481                                NSArray *locCellNib = [[NSBundle mainBundle] loadNibNamed:@"MapTableViewCell" owner:self options:nil];
482                                cell = (UITableViewCell *)[locCellNib objectAtIndex:0];
483                UIImage *bgImage = [[UIImage imageNamed:@"tablecellbg"] stretchableImageWithLeftCapWidth:15 topCapHeight:0];
484                cell.backgroundView = [[[UIImageView alloc] initWithImage:bgImage] autorelease];
485                cell.backgroundView.opaque = YES;
486                UIImage *sbgImage = [[UIImage imageNamed:@"tablecellbg-selected"] stretchableImageWithLeftCapWidth:15 topCapHeight:0];
487                cell.selectedBackgroundView = [[[UIImageView alloc] initWithImage:sbgImage] autorelease];
488                        }                       
489                       
490                        // Display cell info
491                        [(UILabel *)[cell viewWithTag:LOCCELL_COUNTRY_TAG] setText:NSLocalizedString(@"Looking Up Country...", @"Looking Up Country...")];
492                       
493                        if (dom.timeZone) {
494                                NSCalendar *cal = [NSCalendar currentCalendar];
495                                [cal setTimeZone:dom.timeZone];
496                                NSDate *now = [NSDate date];
497                                // Set the color of the background of the cell, based on whether the person should be awake or not
498                                // Possibility: Make the hours a preference
499//                              unsigned unitFlags = NSHourCalendarUnit | NSMinuteCalendarUnit;
500//                              NSDateComponents *comps = [cal components:unitFlags fromDate:now];
501//                              if (([comps hour] < 8) || ([comps hour] > 22)) {
502//                                      cell.contentView.backgroundColor = [UIColor colorWithRed:0 green:0.15 blue:0.3 alpha:1];
503//                                      cell.accessoryView.backgroundColor = [UIColor colorWithRed:0 green:0.15 blue:0.3 alpha:1];
504//                              } else {
505//                                      cell.contentView.backgroundColor = [UIColor colorWithRed:0.3 green:0.9 blue:0.9 alpha:1];
506//                                      cell.accessoryView.backgroundColor = [UIColor colorWithRed:0.3 green:0.9 blue:0.9 alpha:1];
507//                              }
508                                // Now display the time properly
509                                NSDateFormatter *dF = [[NSDateFormatter alloc] init];
510                                [dF setTimeZone:dom.timeZone];
511                                [dF setTimeStyle:NSDateFormatterShortStyle];
512                                [dF setDateStyle:NSDateFormatterNoStyle];
513                                [(UILabel *)[cell viewWithTag:LOCCELL_LOCALTIME_TAG] setText:[dF stringFromDate:now]];
514                                [dF release];
515                        } else {
516                                // no timezone
517                                [(UILabel *)[cell viewWithTag:LOCCELL_LOCALTIME_TAG] setText:@""];
518                        }
519                        if (prefsReverseGeo) {
520                                if (dom.country) {
521                                        [(UILabel *)[cell viewWithTag:LOCCELL_COUNTRY_TAG] setText:dom.country];
522                                } else {
523                                        if (dom.geoLocDidFinish) {
524                                                [(UILabel *)[cell viewWithTag:LOCCELL_COUNTRY_TAG] setText:NSLocalizedString(@"Unknown Country", @"Unknown Country")];
525                                        }
526                }
527                        } else {        // not prefsReverseGeo
528                                [(UILabel *)[cell viewWithTag:LOCCELL_COUNTRY_TAG] setText:@""];
529                        }
530            MKMapView *map = (MKMapView *)[cell viewWithTag:LOCCELL_MAP_TAG];
531            TelMapAnnotation *aMarker = [TelMapAnnotation annotationWithCoordinate:theRec.coordinate];
532            [map addAnnotation:aMarker];
533            map.showsUserLocation = NO;
534            map.userInteractionEnabled = NO;
535                        [TelMapAnnotation recenterMap:map];
536            [theRec release];
537                        return cell;
538                }
539                        break;
540                       
541                default:
542                {
543                        UITableViewCell *cell = nil;
544                        return cell;
545                }
546                        break;
547        }
548}
549
550#pragma mark -
551#pragma mark Table view Delegate methods
552
553- (NSIndexPath *)tableView:(UITableView *)tableView willSelectRowAtIndexPath:(NSIndexPath *)indexPath {
554    // don't allow selection of footer row
555    if ([tableView numberOfRowsInSection:indexPath.section] == indexPath.row +1) {
556        return nil;
557    }
558    return indexPath;
559}
560
561// Row selection actions:
562//  - terminal naptr: fire off the url, and let the OS handle it
563//  - non-terminal naptr: query that domain
564//  - loc: display the mapview
565- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
566        NSUInteger row = indexPath.row;
567        if (row != NSNotFound) {
568                [tableView deselectRowAtIndexPath:indexPath animated:NO];
569                switch (indexPath.section) {
570                        case SECTION_NAPTR:
571                        {
572                                RecordNaptr *naptr = [self.theDomain.naptrArray objectAtIndex:row];
573                                if (naptr.isTerminal) {
574                                        [self actOnUri:naptr.uriContent];
575                                } else {
576                                        // Non-Terminal NAPTR
577                    NaptrViewController *newNVC = [[[NaptrViewController alloc] initWithStyle:UITableViewStylePlain] autorelease];
578                                        [newNVC setupWithTel:naptr.uriContent];
579                                        [self.navigationController pushViewController:newNVC animated:YES];
580                                }
581                        }
582                                break;
583                        case SECTION_LOC:
584                        {
585                                RecordLoc *loc = [self.theDomain.locArray objectAtIndex:row];
586                                FriendsMapViewController *fMVC = [FriendsMapViewController sharedInstance];
587                                TelMapAnnotation *theMarker = nil;
588                                fMVC.initialLoc = loc;
589                                if ([abId integerValue] == NSUIntegerMax) {     // not one of our address book .tel domains
590                                        if (self.theDomain.displayName) {
591                                                theMarker = [fMVC setMarkerWithABRecordId:self.abId title:self.theDomain.displayName telname:self.theDomain.telName location:loc];
592                                        } else {
593                                                theMarker = [fMVC setMarkerWithABRecordId:self.abId title:self.theDomain.cleanTelName telname:self.theDomain.telName location:loc];
594                                        }
595
596                                } else {
597                    NSString *personName = [[FriendsData sharedInstance] getNameForABRecordId:self.abId];
598                    theMarker = [fMVC setMarkerWithABRecordId:abId title:personName telname:self.theDomain.telName location:loc];
599                                }
600                                [self.navigationController pushViewController:fMVC animated:YES];
601                fMVC.currentAnnotation = theMarker;
602                        }
603                                break;
604                        default:
605                                break;
606                }
607        }
608}
609
610- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath {
611        switch (indexPath.section) {
612                case SECTION_HEADER:
613                {
614                        if (self.logoImage) {
615                                return (MAX([self.theDomain.headerText cellHeightForFont:headerFont
616                                                                                                                           cellWidth:([UIScreen mainScreen].bounds.size.width - kLogoSize)
617                                                                                                                        paddingWidth:3.0f Height:3.0f], kLogoSize));
618                        } else {
619                                return ([self.theDomain.headerText cellHeightForFont:headerFont paddingWidth:3.0f Height:3.0f]);
620                        }
621
622                }
623                case SECTION_NAPTR:
624                {
625            if (indexPath.row == [self.theDomain.naptrArray count]) {
626                   // don't call numberOfRowsInSection, you'd get an infinite loop
627                return kFooterCellHeight;
628            }
629                        RecordNaptr *theRec = [self.theDomain.naptrArray objectAtIndex:indexPath.row];
630            CGFloat iconWidth = 0.0f;
631//            if (theRec.icon) {
632//                iconWidth = 30.0f + kMarginSize * 2;
633//            }
634                        if (theRec.isTerminal) {
635                                CGFloat cellHeight = [theRec.labelDescription textHeightForFont:naptrLabelFont
636                                                                      cellWidth:(maximumLabelSize.width-iconWidth)
637                                                                                                                                 paddingWidth:3.0f
638                                                                                                                                           Height:kMarginSize];
639                                cellHeight += naptrCellRowLineHeight*2 + kMarginSize*3;
640                                return cellHeight;
641                        } else {
642                                if ([theRec.labelDescription length] == 0) {
643                                        // only service and uriContent
644                                        return (naptrCellRowLineHeight*2 + kMarginSize*4);
645                                } else {
646                                        // only label and uriContent
647                                        // since NTNaptrs have a disclosure indicator, must calculate including the padding width
648                    CGSize maxS = CGSizeMake(maximumLabelSize.width-iconWidth, maximumLabelSize.height);
649                                        CGSize expectedLabelSize = [theRec.labelDescription sizeWithFont:naptrLabelFont
650                                                                                                                                   constrainedToSize:maxS
651                                                                                                                                           lineBreakMode:UILineBreakModeWordWrap];
652                                        CGFloat cellHeight = expectedLabelSize.height + naptrCellRowLineHeight + kMarginSize*4;
653                                        return cellHeight;
654                                }
655                        }
656                }
657                case SECTION_TXT:
658                {
659            if (indexPath.row == [self.theDomain.txtArray count]) {
660                // don't call numberOfRowsInSection, you'd get an infinite loop
661                return kFooterCellHeight;
662            }
663                        RecordTxt *theRec = [self.theDomain.txtArray objectAtIndex:indexPath.row];
664                        return [theRec.textValue cellHeightForFont:txtFont paddingWidth:3.0f Height:18.0f];
665                }
666        case SECTION_LOC:
667        {
668            if (indexPath.row == [self.theDomain.locArray count]) {
669                // don't call numberOfRowsInSection, you'd get an infinite loop
670                return kFooterCellHeight;
671            }
672            if (prefsReverseGeo) {
673                return (CGFloat)160.0;
674            } else {
675               return (CGFloat)130.0;
676            }
677        }
678                default:
679                        return (CGFloat)44.0;
680        }
681}
682
683- (UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section {
684    NSString *headerTitle = nil;
685    switch (section) {
686                case SECTION_HEADER:
687            return nil;
688            break;
689            // don't call numberOfRowsInSection below, you'd get an infinite loop
690        case SECTION_NAPTR:
691            if ([self.theDomain.naptrArray count] == 0)
692                return nil;
693            headerTitle = NSLocalizedString(@"Contact Info", @"Contact data section title for contact tableview");
694            break;
695        case SECTION_TXT:
696            if ([self.theDomain.txtArray count] == 0)
697                return nil;
698            headerTitle = NSLocalizedString(@"Keywords", @"Keyword section title for contact tableview");
699            break;
700        case SECTION_LOC:
701            if ([self.theDomain.locArray count] == 0)
702                return nil;
703            headerTitle = NSLocalizedString(@"Location", @"Location section title for contact tableview");
704            break;
705                default:    // unused
706//                      headerTitle = NSLocalizedString(@"Other Records", @"Other records' section title for contact tableview");
707            return nil;
708                        break;
709    }
710    NSArray *nibObjs = [[NSBundle mainBundle] loadNibNamed:@"TelTableHeaderView" owner:self options:nil];
711    UIView *tableHeaderView = [nibObjs objectAtIndex:0];
712    UIImageView *bgIV = (UIImageView *)[tableHeaderView viewWithTag:1];
713    UIImage *hvbg = [bgIV.image stretchableImageWithLeftCapWidth:15 topCapHeight:15];
714    bgIV.image = hvbg;
715    UILabel *hL = (UILabel *)[tableHeaderView viewWithTag:2];
716    hL.text = headerTitle;
717    return tableHeaderView;
718}
719
720//- (UIView *)tableView:(UITableView *)tableView viewForFooterInSection:(NSInteger)section {
721//    if (section == SECTION_HEADER) {
722//        return nil;
723//    }
724//    NSArray *nibObjs = [[NSBundle mainBundle] loadNibNamed:@"TelTableFooterView" owner:self options:nil];
725//    UIView *tableFooterView = [nibObjs objectAtIndex:0];
726//    UIImageView *bgIV = (UIImageView *)[tableFooterView viewWithTag:1];
727//    UIImage *hvbg = [bgIV.image stretchableImageWithLeftCapWidth:15 topCapHeight:1];
728//    bgIV.image = hvbg;
729//    return tableFooterView;
730//}
731
732- (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section {
733    if (section == SECTION_HEADER) {
734        return 0.0f;
735    }
736    return 50.0f;
737}
738
739//- (CGFloat)tableView:(UITableView *)tableView heightForFooterInSection:(NSInteger)section {
740//    if (section == SECTION_HEADER) {
741//        return 10.0f;
742//    }
743//    return 24.0f;
744//}
745
746/*
747- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath {
748       
749        if (editingStyle == UITableViewCellEditingStyleDelete) {
750        }
751        if (editingStyle == UITableViewCellEditingStyleInsert) {
752        }
753}
754*/
755/*
756- (BOOL)tableView:(UITableView *)tableView canEditRowAtIndexPath:(NSIndexPath *)indexPath {
757        return YES;
758}
759*/
760/*
761- (void)tableView:(UITableView *)tableView moveRowAtIndexPath:(NSIndexPath *)fromIndexPath toIndexPath:(NSIndexPath *)toIndexPath {
762}
763*/
764/*
765- (BOOL)tableView:(UITableView *)tableView canMoveRowAtIndexPath:(NSIndexPath *)indexPath {
766        return YES;
767}
768*/
769
770#pragma mark -
771#pragma mark Custom UI methods
772
773- (UITableViewCell *)footerCellForTableView:(UITableView *)tableView {
774    static NSString *footerCellId = @"footerCell";
775    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:footerCellId];
776    if (!cell) {
777        cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:footerCellId] autorelease];
778        UIImage *bgI = [[UIImage imageNamed:@"tablelastcellbg"] stretchableImageWithLeftCapWidth:15 topCapHeight:1];
779        cell.backgroundView = [[[UIImageView alloc] initWithImage:bgI] autorelease];
780        cell.backgroundView.opaque = YES;
781        cell.selectionStyle = UITableViewCellSelectionStyleNone;
782    }
783    return cell;
784}
785
786#pragma mark -
787#pragma mark Observer for loc change
788
789- (void)observeValueForKeyPath:(NSString *)keyPath
790                      ofObject:(id)object
791                        change:(NSDictionary *)change
792                       context:(void *)context {
793    [object removeObserver:self forKeyPath:keyPath];   // Only a one-time observing for the location
794    [[self tableView:self.tableView cellForRowAtIndexPath:[NSIndexPath indexPathForRow:0 inSection:SECTION_LOC]]
795     setNeedsLayout];
796}
797
798
799#pragma mark -
800#pragma mark Custom Data Methods
801
802- (void)retrieveLogo {
803        NSAutoreleasePool *pool = nil;
804        if (![NSThread isMainThread]) {
805                pool = [[NSAutoreleasePool alloc] init];
806        }
807        if (self.theDomain.logoUrl) {
808                NSData *logoData = [NSData dataWithContentsOfURL:self.theDomain.logoUrl];
809                if (logoData) {
810                        self.logoImage = [UIImage imageWithData:logoData];
811                }
812        }
813        [self performSelectorOnMainThread:@selector(didFinishRetrievingLogo) withObject:nil waitUntilDone:NO];
814        if (pool != nil) {
815                [pool release];
816        }
817}
818
819#pragma mark -
820#pragma mark Methods to handle URI actions
821
822- (void)actOnUri:(NSString *)uri {
823        if (!uri)
824                return;
825        if ([uri hasPrefix:@"tel:"]) {
826                // if a telephone number, ask if we want to send SMS.
827                // Plus, this acts as a user acceptance to call or not
828                UIActionSheet *actionSheet = [[UIActionSheet alloc] initWithTitle:uri
829                                                                                                                                 delegate:self
830                                                                                                                cancelButtonTitle:nil
831                                                                                                   destructiveButtonTitle:nil
832                                                                                                                otherButtonTitles:nil];
833        actionSheet.tag = ActionSheet_Call;
834                callButtonIndex = [actionSheet addButtonWithTitle:NSLocalizedString(@"Call this number", @"Call this number")];
835                smsButtonIndex = [actionSheet addButtonWithTitle:NSLocalizedString(@"Send an SMS Message", @"Send an SMS Message")];
836                actionSheet.cancelButtonIndex = [actionSheet addButtonWithTitle:NSLocalizedString(@"Cancel", @"Cancel")];
837                [actionSheet showInView:self.view];
838                [actionSheet release];
839        } else if ([uri hasPrefix:@"http:"] || [uri hasPrefix:@"https:"]) {
840                WebUrlViewController *wVC = [[[WebUrlViewController alloc] initWithNibName:@"WebUrlView" bundle:nil] autorelease];
841                wVC.title = NSLocalizedString(@"Web View", @"Title for the Web View");
842                [self.navigationController pushViewController:wVC animated:YES];
843                [wVC showPage:uri];
844        } else {
845                // directly act on anything not a number or url
846                NSURL *naptrUrl = [NSURL URLWithString:uri];
847                [[UIApplication sharedApplication] openURL:naptrUrl];
848        }
849}
850
851- (void)actionSheet:(UIActionSheet *)actionSheet clickedButtonAtIndex:(NSInteger)buttonIndex {
852        if (buttonIndex == actionSheet.cancelButtonIndex) {
853                // Clicked cancel
854                return;
855        }
856    if (actionSheet.tag == ActionSheet_Call) {
857        NSURL *naptrUrl;
858        NSString *uri = [actionSheet title];
859        if (buttonIndex == callButtonIndex) {
860            naptrUrl = [NSURL URLWithString:[uri stringByAddingPercentEscapesUsingEncoding:NSASCIIStringEncoding]];
861            [[UIApplication sharedApplication] openURL:naptrUrl];
862        } else if (buttonIndex == smsButtonIndex) {
863            NSRange telPrefixRange = [uri rangeOfString:@"tel:"];
864            naptrUrl = [NSURL URLWithString:[uri stringByReplacingCharactersInRange:telPrefixRange withString:@"sms:"]];
865            [[UIApplication sharedApplication] openURL:naptrUrl];
866        }
867    } else if (actionSheet.tag == ActionSheet_Action) {
868        if (buttonIndex == 0) { // Save
869            [self saveContact:nil];
870        } else if (buttonIndex == 1) { // Share
871            [self shareContact:nil];
872        }
873    }
874        return;
875}
876
877#pragma mark ------ Action methods
878
879- (IBAction)domainAction:(id)sender {
880    UIActionSheet *actionSheet = [[UIActionSheet alloc] initWithTitle:nil
881                                                             delegate:self
882                                                    cancelButtonTitle:nil
883                                               destructiveButtonTitle:nil
884                                                    otherButtonTitles:nil];
885    actionSheet.tag = ActionSheet_Action;
886    [actionSheet addButtonWithTitle:NSLocalizedString(@"Save To Address Book", @"Save")];
887    [actionSheet addButtonWithTitle:NSLocalizedString(@"Share this", @"Share")];
888    actionSheet.cancelButtonIndex = [actionSheet addButtonWithTitle:NSLocalizedString(@"Cancel", @"Cancel")];
889    [actionSheet showInView:self.view];
890    [actionSheet release];
891}
892
893- (IBAction)saveContact:(id)sender {
894        if (abD)
895                [abD release];
896        abD = [[DotTelABDelegate alloc] initWithViewController:self telDomain:self.theDomain];
897        NSError *err;
898        if ([abId integerValue] == NSUIntegerMax) {     // not one of our address book .tel domains
899                err = [abD saveRecord];
900        } else {
901                err = [abD saveRecordWithRecordId:[abId integerValue]];
902        }
903        if (err) {
904                [self showError:err];
905        }
906}
907
908- (IBAction)shareContact:(id)sender {
909    // Create the item to share (in this example, a url)
910        NSURL *url = [NSURL URLWithString:[@"http://" stringByAppendingString:self.theDomain.telName]];
911    NSString *urlString = [url.absoluteString stringByReplacingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
912    NSString *sharingString = [NSString stringWithFormat:NSLocalizedString(@"I just checked out %@ on Superbook", @"sharing string"), urlString];
913        SHKItem *item = [SHKItem text:sharingString];
914   
915        // Get the ShareKit action sheet
916        SHKActionSheet *actionSheet = [SHKActionSheet actionSheetForItem:item];   
917        // Display the action sheet
918    [actionSheet showInView:self.view];
919}
920
921#pragma mark ------ Error Methods
922
923- (void)showError:(NSError *)error {
924        if (![NSThread isMainThread]) {
925                [self performSelectorOnMainThread:_cmd
926                                                           withObject:error
927                                                        waitUntilDone:NO];
928                return;
929        }       
930        UIAlertView *errAlert = [[UIAlertView alloc] initWithTitle:NSLocalizedString(@"Error", @"Error")
931                                                                                                           message:[error localizedDescription]
932                                                                                                          delegate:nil cancelButtonTitle:NSLocalizedString(@"OK", @"OK")
933                                                                                         otherButtonTitles:nil];
934        [errAlert show];
935        [errAlert release];
936}       
937@end
938
Note: See TracBrowser for help on using the browser.
Telnic
Search This Site
Partners
Neustar
ICANN
Main site | WHOIS | Sell .tel | FAQ | Archived Site | About Telnic | Contact Us