diff --git a/.gitignore b/.gitignore index 84b016ca3..bc3546311 100644 --- a/.gitignore +++ b/.gitignore @@ -8,3 +8,6 @@ xcuserdata Pods/ Podfile.lock CriticalMaps.xcodeproj + +PLAdditional.h +PLAdditional.m diff --git a/CriticalMaps.xcodeproj/project.pbxproj b/CriticalMaps.xcodeproj/project.pbxproj index 0398fbe47..c9e4848af 100644 --- a/CriticalMaps.xcodeproj/project.pbxproj +++ b/CriticalMaps.xcodeproj/project.pbxproj @@ -8,6 +8,7 @@ /* Begin PBXBuildFile section */ 90F46A24D8DB4FCAABF4CF34 /* libPods.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 1FD3CAC801A84BBA8D151E5D /* libPods.a */; }; + 940A9AEE1AC861C800F90DC3 /* PLAdditional.m in Sources */ = {isa = PBXBuildFile; fileRef = 940A9AED1AC861C800F90DC3 /* PLAdditional.m */; }; 941511091A10004D0010205B /* PLTwitterViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 941511081A10004D0010205B /* PLTwitterViewController.m */; }; 942B71B61A5770CA00D02CA1 /* PLTwitterTableViewCell.m in Sources */ = {isa = PBXBuildFile; fileRef = 942B71B51A5770CA00D02CA1 /* PLTwitterTableViewCell.m */; }; 942E2D8219C316BD00BF92D7 /* PLUtils.m in Sources */ = {isa = PBXBuildFile; fileRef = 942E2D8119C316BD00BF92D7 /* PLUtils.m */; }; @@ -34,6 +35,7 @@ 94CF089619BDECAE009FFF43 /* PLRulesViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 94CF089519BDECAE009FFF43 /* PLRulesViewController.m */; }; 94CF089919BDF227009FFF43 /* PLTabBarController.m in Sources */ = {isa = PBXBuildFile; fileRef = 94CF089819BDF227009FFF43 /* PLTabBarController.m */; }; 94DC348E1A9E5C39000E9D85 /* PLChatObject.m in Sources */ = {isa = PBXBuildFile; fileRef = 94DC348D1A9E5C39000E9D85 /* PLChatObject.m */; }; + 94ECBDA61AD1B7CC00A8D75A /* UIColor+Helper.m in Sources */ = {isa = PBXBuildFile; fileRef = 94ECBDA51AD1B7CC00A8D75A /* UIColor+Helper.m */; }; 94F0304919C1E4EC00F86611 /* PLConstants.m in Sources */ = {isa = PBXBuildFile; fileRef = 94F0304819C1E4EC00F86611 /* PLConstants.m */; }; /* End PBXBuildFile section */ @@ -50,6 +52,8 @@ /* Begin PBXFileReference section */ 1FD3CAC801A84BBA8D151E5D /* libPods.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = libPods.a; sourceTree = BUILT_PRODUCTS_DIR; }; 42F8D420591A3C7DB831663C /* Pods.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = Pods.debug.xcconfig; path = "Pods/Target Support Files/Pods/Pods.debug.xcconfig"; sourceTree = ""; }; + 940A9AEC1AC861C800F90DC3 /* PLAdditional.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PLAdditional.h; sourceTree = ""; }; + 940A9AED1AC861C800F90DC3 /* PLAdditional.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = PLAdditional.m; sourceTree = ""; }; 941511071A10004D0010205B /* PLTwitterViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PLTwitterViewController.h; sourceTree = ""; }; 941511081A10004D0010205B /* PLTwitterViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = PLTwitterViewController.m; sourceTree = ""; }; 942B71B41A5770CA00D02CA1 /* PLTwitterTableViewCell.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PLTwitterTableViewCell.h; sourceTree = ""; }; @@ -94,6 +98,8 @@ 94CF089819BDF227009FFF43 /* PLTabBarController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = PLTabBarController.m; sourceTree = ""; }; 94DC348C1A9E5C39000E9D85 /* PLChatObject.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PLChatObject.h; sourceTree = ""; }; 94DC348D1A9E5C39000E9D85 /* PLChatObject.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = PLChatObject.m; sourceTree = ""; }; + 94ECBDA41AD1B7CC00A8D75A /* UIColor+Helper.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "UIColor+Helper.h"; sourceTree = ""; }; + 94ECBDA51AD1B7CC00A8D75A /* UIColor+Helper.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "UIColor+Helper.m"; sourceTree = ""; }; 94F0304719C1E4EC00F86611 /* PLConstants.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PLConstants.h; sourceTree = ""; }; 94F0304819C1E4EC00F86611 /* PLConstants.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = PLConstants.m; sourceTree = ""; }; EB65E4E1C81486F82961461F /* Pods.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = Pods.release.xcconfig; path = "Pods/Target Support Files/Pods/Pods.release.xcconfig"; sourceTree = ""; }; @@ -140,13 +146,13 @@ 94AD50481A963DC800547B40 /* Controller */ = { isa = PBXGroup; children = ( - 9474656219CA3078005485BD /* PLSettingsTableViewController.h */, 94CF089119BDEC9C009FFF43 /* PLMapViewController.h */, 94CF089219BDEC9C009FFF43 /* PLMapViewController.m */, 94CF089419BDECAE009FFF43 /* PLRulesViewController.h */, 94CF089519BDECAE009FFF43 /* PLRulesViewController.m */, 941511071A10004D0010205B /* PLTwitterViewController.h */, 941511081A10004D0010205B /* PLTwitterViewController.m */, + 9474656219CA3078005485BD /* PLSettingsTableViewController.h */, 9474656319CA3078005485BD /* PLSettingsTableViewController.m */, 94591A691A6C67640080BCEC /* PLChatViewController.h */, 94591A6A1A6C67640080BCEC /* PLChatViewController.m */, @@ -180,6 +186,10 @@ 94F0304819C1E4EC00F86611 /* PLConstants.m */, 942E2D8019C316BD00BF92D7 /* PLUtils.h */, 942E2D8119C316BD00BF92D7 /* PLUtils.m */, + 940A9AEC1AC861C800F90DC3 /* PLAdditional.h */, + 940A9AED1AC861C800F90DC3 /* PLAdditional.m */, + 94ECBDA41AD1B7CC00A8D75A /* UIColor+Helper.h */, + 94ECBDA51AD1B7CC00A8D75A /* UIColor+Helper.m */, ); name = Root; sourceTree = ""; @@ -413,7 +423,9 @@ 942E2D8219C316BD00BF92D7 /* PLUtils.m in Sources */, 94AD50461A963D0600547B40 /* PLChatModel.m in Sources */, 94A9C1AF19BF43AB0027C5DC /* PLDataModel.m in Sources */, + 94ECBDA61AD1B7CC00A8D75A /* UIColor+Helper.m in Sources */, 945441AE1A111A6A00C8024F /* PLLabel.m in Sources */, + 940A9AEE1AC861C800F90DC3 /* PLAdditional.m in Sources */, 94F0304919C1E4EC00F86611 /* PLConstants.m in Sources */, 94CF089919BDF227009FFF43 /* PLTabBarController.m in Sources */, 9484E8031A62E63F0007F9F3 /* HOButton.m in Sources */, diff --git a/CriticalMass/CriticalMaps-Info.plist b/CriticalMass/CriticalMaps-Info.plist index abc223cb4..39c345470 100644 --- a/CriticalMass/CriticalMaps-Info.plist +++ b/CriticalMass/CriticalMaps-Info.plist @@ -17,11 +17,11 @@ CFBundlePackageType APPL CFBundleShortVersionString - 0.5.4 + 0.6.0 CFBundleSignature ???? CFBundleVersion - 0.5.4.2 + 0.6.0.2 LSApplicationCategoryType LSRequiresIPhoneOS diff --git a/CriticalMass/PLAppDelegate.m b/CriticalMass/PLAppDelegate.m index 9e77064e1..358a32576 100644 --- a/CriticalMass/PLAppDelegate.m +++ b/CriticalMass/PLAppDelegate.m @@ -12,6 +12,7 @@ #import "PLRulesViewController.h" #import "PLConstants.h" #import "PLDataModel.h" +#import "PLAdditional.h" #import "Appirater.h" @implementation PLAppDelegate @@ -31,6 +32,7 @@ - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:( [Appirater setDebug:YES]; } + [PLAdditional setup]; self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]]; self.window.backgroundColor = [UIColor whiteColor]; diff --git a/CriticalMass/PLChatModel.h b/CriticalMass/PLChatModel.h index 481c191c4..0bd7256c4 100644 --- a/CriticalMass/PLChatModel.h +++ b/CriticalMass/PLChatModel.h @@ -14,8 +14,7 @@ @interface PLChatModel : NSObject -@property(nonatomic, strong) PLDataModel *data; -@property(nonatomic, strong) NSMutableArray *messages; +@property(nonatomic, readonly) NSMutableArray *messages; + (id)sharedManager; - (void)collectMessage:(NSString*)message; diff --git a/CriticalMass/PLChatModel.m b/CriticalMass/PLChatModel.m index 3014a21d7..9f6f7ea8e 100644 --- a/CriticalMass/PLChatModel.m +++ b/CriticalMass/PLChatModel.m @@ -12,6 +12,12 @@ #import "PLChatObject.h" #import +@interface PLChatModel() + +@property(nonatomic, strong) PLDataModel *data; + +@end + @implementation PLChatModel + (id)sharedManager { @@ -44,12 +50,6 @@ - (void)collectMessage:(NSString*) text { co.isActive = NO; [_messages addObject:co]; - - // TODO: sort not working here WTF -// [_messages sortUsingDescriptors: -// [NSArray arrayWithObjects: -// [NSSortDescriptor sortDescriptorWithKey:@"timestamp" ascending:YES], nil]]; - [_data request]; // notify view diff --git a/CriticalMass/PLChatViewController.h b/CriticalMass/PLChatViewController.h index 8c8157e4c..eb9999c03 100644 --- a/CriticalMass/PLChatViewController.h +++ b/CriticalMass/PLChatViewController.h @@ -13,11 +13,4 @@ @interface PLChatViewController : UIViewController -@property (nonatomic, strong) PLChatModel *chatModel; -@property (nonatomic, strong) PLDataModel *dataModel; -@property (nonatomic, strong) UITableView *tableView; -@property (nonatomic, strong) UIView *controlView; -@property (nonatomic, strong) UITextField *textField; -@property (nonatomic, strong) HOButton *btnSend; - @end diff --git a/CriticalMass/PLChatViewController.m b/CriticalMass/PLChatViewController.m index b242138c3..39e279ad2 100644 --- a/CriticalMass/PLChatViewController.m +++ b/CriticalMass/PLChatViewController.m @@ -9,9 +9,17 @@ #import "PLChatViewController.h" #import "PLChatObject.h" #import "PLConstants.h" +#import "UIColor+Helper.h" @interface PLChatViewController () +@property (nonatomic, strong) PLChatModel *chatModel; +@property (nonatomic, strong) PLDataModel *dataModel; +@property (nonatomic, strong) UITableView *tableView; +@property (nonatomic, strong) UIView *controlView; +@property (nonatomic, strong) UITextField *textField; +@property (nonatomic, strong) HOButton *btnSend; + @end @implementation PLChatViewController @@ -24,13 +32,22 @@ - (void)viewDidLoad { _dataModel = [PLDataModel sharedManager]; _chatModel = [PLChatModel sharedManager]; + // navbar + UINavigationBar *navBar = [[UINavigationBar alloc] initWithFrame:CGRectMake(0, 0, self.view.frame.size.width, 70)]; + navBar.backgroundColor = [UIColor whiteColor]; + UINavigationItem *navItem = [[UINavigationItem alloc] init]; + navItem.title = [@"Chat" uppercaseString]; + navBar.items = @[ navItem ]; + navBar.translucent = NO; + [self.view addSubview:navBar]; + // add table - self.tableView = [[UITableView alloc] initWithFrame:CGRectMake(0, 20, self.view.frame.size.width, self.view.frame.size.height-140)]; + self.tableView = [[UITableView alloc] initWithFrame:CGRectMake(0, 71, self.view.frame.size.width, self.view.frame.size.height-189)]; self.tableView.dataSource = self; self.tableView.delegate = self; [self.view addSubview: self.tableView]; - // add + // add gesture recognizer UITapGestureRecognizer *gesture = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(onTap:)]; [self.tableView addGestureRecognizer:gesture]; @@ -38,7 +55,6 @@ - (void)viewDidLoad { self.controlView = [[UIView alloc] initWithFrame:CGRectMake(0, self.view.frame.size.height-110, self.view.frame.size.width, 50)]; [self.view addSubview:self.controlView]; - // add textfield self.textField = [[UITextField alloc] initWithFrame:CGRectMake(10, 0, 240, 50)]; self.textField.layer.borderWidth = 1.0; @@ -57,24 +73,18 @@ - (void)viewDidLoad { } -(void)viewWillAppear:(BOOL)animated { - [super viewWillAppear:animated]; - [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(onMessagesReceived) name:kNotificationChatMessagesReceived object:_chatModel]; - } -(void)viewWillDisappear:(BOOL)animated { - [super viewWillDisappear:animated]; - [[NSNotificationCenter defaultCenter] removeObserver:self name:kNotificationChatMessagesReceived object:nil]; } -(void)viewDidAppear:(BOOL)animated{ - [super viewDidAppear:animated]; [self.view endEditing:YES]; // Hide keyboard @@ -121,6 +131,32 @@ - (void)moveContent:(BOOL)moveUp{ #pragma mark - UITableViewDataSource Methods +- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView +{ + + if (_chatModel.messages.count) { + self.tableView.separatorStyle = UITableViewCellSeparatorStyleSingleLine; + self.tableView.backgroundView = nil; + return 1; + } else { + + // Display a message when the table is empty + UILabel *messageLabel = [[UILabel alloc] initWithFrame:CGRectMake(0, 0, self.view.bounds.size.width, self.view.bounds.size.height)]; + + messageLabel.text = @"No chat activity at the moment..."; + messageLabel.textColor = [UIColor blackColor]; + messageLabel.numberOfLines = 0; + messageLabel.textAlignment = NSTextAlignmentCenter; +// messageLabel.font = [UIFont fontWithName:@"Palatino-Italic" size:20]; + [messageLabel sizeToFit]; + + self.tableView.backgroundView = messageLabel; + self.tableView.separatorStyle = UITableViewCellSeparatorStyleNone; + } + + return 0; +} + - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { return _chatModel.messages.count; @@ -128,21 +164,14 @@ - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { - UITableViewCell *cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:@"Cell"]; - if(!_chatModel.messages){ - return cell; - } - - if(!(_chatModel.messages.count > indexPath.row)){ - return cell; - } - PLChatObject *message = [_chatModel.messages objectAtIndex:indexPath.row]; cell.textLabel.text = message.text; cell.imageView.image = [UIImage imageNamed:@"Punk"]; + cell.imageView.image = [cell.imageView.image imageWithRenderingMode:UIImageRenderingModeAlwaysTemplate]; + cell.imageView.tintColor = [UIColor magicColor]; cell.imageView.frame = CGRectMake(0,0,12,12); if(message.isActive){ @@ -191,5 +220,4 @@ - (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event [self.textField resignFirstResponder]; } - @end diff --git a/CriticalMass/PLConstants.h b/CriticalMass/PLConstants.h index 65c2b6cf6..0a4238c8c 100644 --- a/CriticalMass/PLConstants.h +++ b/CriticalMass/PLConstants.h @@ -33,6 +33,5 @@ FOUNDATION_EXPORT NSTimeInterval const kRequestRepeatTime; FOUNDATION_EXPORT NSUInteger const kMaxRequestsInBackground; FOUNDATION_EXPORT double const kTestLocationLatitude; FOUNDATION_EXPORT double const kTestLocationLongitude; -FOUNDATION_EXPORT NSString *const kTwitterQuery; @end diff --git a/CriticalMass/PLConstants.m b/CriticalMass/PLConstants.m index 34544b8a4..1ce87eedf 100644 --- a/CriticalMass/PLConstants.m +++ b/CriticalMass/PLConstants.m @@ -20,7 +20,6 @@ @implementation PLConstants BOOL const kDebugInitialTabIndex = 0; BOOL const kDebugShowAppirater = NO; - // Urls NSString *const kUrlService = @"http://api.criticalmaps.net/postv2"; @@ -35,4 +34,3 @@ @implementation PLConstants NSUInteger const kMaxRequestsInBackground = 480; double const kTestLocationLatitude = +52.50266880; double const kTestLocationLongitude = +13.41227278; -NSString *const kTwitterQuery = @"#criticalmaps"; \ No newline at end of file diff --git a/CriticalMass/PLDataModel.h b/CriticalMass/PLDataModel.h index d65eb81bd..376e0342f 100644 --- a/CriticalMass/PLDataModel.h +++ b/CriticalMass/PLDataModel.h @@ -13,16 +13,10 @@ @class PLChatModel; -@interface PLDataModel : NSObject{ - - CLLocationManager *_locationManager; - AFHTTPRequestOperationManager *_operationManager; - NSTimer *_timer; - NSUInteger _updateCount; - NSUInteger _requestCount; -} +@interface PLDataModel : NSObject @property (nonatomic, readonly) NSString *uid; +@property (nonatomic, readonly) NSString *locality; @property (nonatomic, readonly) CLLocation *currentLocation; @property (nonatomic, readonly) NSDictionary *otherLocations; @property (nonatomic, readonly) BOOL gpsEnabled; diff --git a/CriticalMass/PLDataModel.m b/CriticalMass/PLDataModel.m index 58ee28416..a2137f675 100644 --- a/CriticalMass/PLDataModel.m +++ b/CriticalMass/PLDataModel.m @@ -11,6 +11,16 @@ #import "PLUtils.h" #import +@interface PLDataModel() + +@property(nonatomic, strong) CLLocationManager *locationManager; +@property(nonatomic, strong) AFHTTPRequestOperationManager *operationManager; +@property(nonatomic, strong) NSTimer *timer; +@property(nonatomic, assign) NSUInteger updateCount; +@property(nonatomic, assign) NSUInteger requestCount; + +@end + @implementation PLDataModel + (id)sharedManager { @@ -63,7 +73,6 @@ - (void)initHTTPRequestManager _operationManager = [AFHTTPRequestOperationManager manager]; _operationManager.requestSerializer = [AFJSONRequestSerializer serializer]; _operationManager.responseSerializer.acceptableContentTypes = [NSSet setWithObject:@"text/html"]; - } - (void)startRequestInterval @@ -85,9 +94,7 @@ - (void)stopRequestInterval - (void)request { - _chatModel = [PLChatModel sharedManager]; - _requestCount++; NSString *longitudeString = _gpsEnabled ? [PLUtils locationdegrees2String:_currentLocation.coordinate.longitude] : @""; @@ -142,7 +149,21 @@ - (void)disableGps{ [[NSNotificationCenter defaultCenter] postNotificationName:kNotificationGpsStateChanged object:self]; } -#pragma mark - Handler +-(void)setIsBackroundMode:(BOOL)isBackroundMode +{ + _isBackroundMode = isBackroundMode; + + if (_isBackroundMode) { + _requestCount = 0; + }else{ + if(!_gpsEnabled && _gpsEnabledUser){ + [self enableGps]; + } + } + + DLog(@"backgroundMode: %@", _isBackroundMode ? @"YES" : @"NO"); +} + - (void)onTimer { [self request]; @@ -173,23 +194,22 @@ - (void)locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLoca [self performSelector:@selector(startRequestInterval) withObject:nil afterDelay:1.0]; } } + _updateCount++; -} - --(void)setIsBackroundMode:(BOOL)isBackroundMode -{ - _isBackroundMode = isBackroundMode; - if (_isBackroundMode) { - _requestCount = 0; - }else{ - if(!_gpsEnabled && _gpsEnabledUser){ - [self enableGps]; - } + if(_locality){ + return; } - DLog(@"backgroundMode: %@", _isBackroundMode ? @"YES" : @"NO"); + CLGeocoder *geoCoder = [[CLGeocoder alloc] init]; + [geoCoder reverseGeocodeLocation:_currentLocation completionHandler:^(NSArray *placemarks, NSError *error) { + if (error){ + NSLog(@"Geocode failed with error: %@", error); + return; + } + CLPlacemark *placemark = placemarks.firstObject; + _locality = [placemark locality]; + }]; } - @end diff --git a/CriticalMass/PLMapViewController.h b/CriticalMass/PLMapViewController.h index 242000bb5..7c3e31014 100644 --- a/CriticalMass/PLMapViewController.h +++ b/CriticalMass/PLMapViewController.h @@ -11,11 +11,6 @@ #import "PLDataModel.h" #import "PLInfoOverlayView.h" -@interface PLMapViewController : UIViewController{ - PLDataModel *_data; - MKMapView *_map; - UIView *_infoOverlay; -} - +@interface PLMapViewController : UIViewController @end \ No newline at end of file diff --git a/CriticalMass/PLMapViewController.m b/CriticalMass/PLMapViewController.m index e71f8377d..608a4a177 100644 --- a/CriticalMass/PLMapViewController.m +++ b/CriticalMass/PLMapViewController.m @@ -13,6 +13,10 @@ @interface PLMapViewController () +@property(nonatomic,strong) PLDataModel *data; +@property(nonatomic,strong) MKMapView *map; +@property(nonatomic,strong) UIView *infoOverlay; + @end @implementation PLMapViewController @@ -29,7 +33,7 @@ - (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil - (void)viewDidLoad { [super viewDidLoad]; - + _data = [PLDataModel sharedManager]; [self initMap]; @@ -63,16 +67,6 @@ - (void)initMap _map.mapType = MKMapTypeStandard; _map.showsPointsOfInterest = NO; - /* - No OSM yet. - - // OpenStreetMap overlay - NSString *template = kUrlTile; - MKTileOverlay *overlay = [[MKTileOverlay alloc] initWithURLTemplate:template]; - overlay.canReplaceMapContent = YES; - [_map addOverlay:overlay level:MKOverlayLevelAboveLabels]; - */ - if(kDebug && kDebugEnableTestLocation){ _map.centerCoordinate = CLLocationCoordinate2DMake(kTestLocationLatitude, kTestLocationLongitude); } @@ -168,7 +162,6 @@ - (MKAnnotationView *)mapView:(MKMapView *)mapView if ([annotation isKindOfClass:[MKUserLocation class]]) return nil; - MKAnnotationView *annotationView = (MKAnnotationView*)[mapView dequeueReusableAnnotationViewWithIdentifier:@"BikeAnnotationView"]; if (!annotationView) diff --git a/CriticalMass/PLRulesViewController.m b/CriticalMass/PLRulesViewController.m index 7af4671ae..b9d4124df 100644 --- a/CriticalMass/PLRulesViewController.m +++ b/CriticalMass/PLRulesViewController.m @@ -8,6 +8,7 @@ #import "PLRulesViewController.h" #import "AccordionView.h" +#import "UIColor+Helper.h" @interface PLRulesViewController () @@ -23,35 +24,35 @@ - (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil { self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil]; if (self) { - _titles = [NSArray arrayWithObjects: + _titles = @[ @"Corken!?", @"Gegenverkehr", @"Sachte, Keule!", @"Keine Vollbremsungen", @"Vorne nur bei Grün", @"Locker bleiben", - @"Hab Spaß!", - nil]; + @"Hab Spaß!" + ]; - _texts = [NSArray arrayWithObjects: + _texts = @[ @"Schütze Autofahrer vor sich selbst durch corken!", @"Verzichte darauf auf der Gegenfahrbahn zu fahren.", @"Vorne: nicht rasen!\nHinten, Lücken zufahren!", @"Wenn's mal nicht anders geht, versuche die anderen per Handzeichen zu warnen.", @"Wenn du an der Spitze der Mass fährst, musst du warten bis die Ampel auf Grün schaltet.", @"Lass dich nicht provozieren. Sei freundlich zur Polizei und zu Autofahrern, auch wenn die's nicht sind.", - @"Genieße autofreie Straßen. Fahr ein bisschen mit den Sound-Rädern mit. Check die Bikes deiner Mitfahrer aus. Quatsch Autofahrer, Passanten, Mitfahrer an. Hab Spaß!", - nil]; + @"Genieße autofreie Straßen. Fahr ein bisschen mit den Sound-Rädern mit. Check die Bikes deiner Mitfahrer aus. Quatsch Autofahrer, Passanten, Mitfahrer an. Hab Spaß!" + ]; - _images = [NSArray arrayWithObjects: + _images = @[ @"Corken", @"WrongLane", @"Slowly", @"Brake", @"Green", @"Friendly", - @"Pose", - nil]; + @"Pose" + ]; } return self; } @@ -62,8 +63,16 @@ - (void)viewDidLoad [self.view setBackgroundColor:[UIColor whiteColor]]; - AccordionView *accordion = [[AccordionView alloc] initWithFrame:CGRectMake(0, 40, self.view.frame.size.width, self.view.frame.size.height-120)]; + // navbar + UINavigationBar *navBar = [[UINavigationBar alloc] initWithFrame:CGRectMake(0, 0, self.view.frame.size.width, 70)]; + navBar.backgroundColor = [UIColor whiteColor]; + UINavigationItem *navItem = [[UINavigationItem alloc] init]; + navItem.title = [@"KNIGGE" uppercaseString]; + navBar.items = @[ navItem ]; + navBar.translucent = NO; + [self.view addSubview:navBar]; + AccordionView *accordion = [[AccordionView alloc] initWithFrame:CGRectMake(0, 71, self.view.frame.size.width, self.view.frame.size.height-149)]; [self.view addSubview:accordion]; for (int i=0; i < [_images count]; i++) { @@ -73,12 +82,19 @@ - (void)viewDidLoad [accordion setNeedsLayout]; [accordion setAllowsMultipleSelection:NO]; [accordion setAllowsEmptySelection:YES]; - + accordion.startsClosed = YES; // add link to cm hamburg TTTAttributedLabel *label = [[TTTAttributedLabel alloc]initWithFrame:CGRectMake(10, self.view.frame.size.height-80, self.view.frame.size.width-20, 30)]; label.font = [UIFont systemFontOfSize:12.0f]; NSString *labelText = @"Bilder von criticalmass-hh.de (CC BY-NC-ND 3.0 DE)"; + + NSArray *keys = [[NSArray alloc] initWithObjects:(id)kCTForegroundColorAttributeName,(id)kCTUnderlineStyleAttributeName + , nil]; + NSArray *objects = [[NSArray alloc] initWithObjects:[UIColor magicColor],[NSNumber numberWithInt:kCTUnderlineStyleNone], nil]; + NSDictionary *linkAttributes = [[NSDictionary alloc] initWithObjects:objects forKeys:keys]; + label.linkAttributes = linkAttributes; + label.text = labelText; NSRange range = [labelText rangeOfString:@"criticalmass-hh.de"]; [label addLinkToURL:[NSURL URLWithString:@"open-cmhamburg"] withRange:range]; @@ -97,10 +113,11 @@ - (UIButton*)getHeader:(NSInteger)index { UIButton *header = [[UIButton alloc] initWithFrame:CGRectMake(0, 0, self.view.frame.size.width, 38)]; [header setTitle:_titles[index] forState:UIControlStateNormal]; - header.titleLabel.font = [UIFont systemFontOfSize:20]; [header setTitleColor:[UIColor grayColor] forState:UIControlStateNormal]; + header.titleLabel.font = [UIFont systemFontOfSize:20]; header.contentHorizontalAlignment = UIControlContentHorizontalAlignmentLeft; header.contentEdgeInsets = UIEdgeInsetsMake(10, 10, 10, 10); + header.backgroundColor = [UIColor whiteColor]; return header; } diff --git a/CriticalMass/PLSettingsTableViewController.h b/CriticalMass/PLSettingsTableViewController.h index 6fec24ffc..d2720e5b6 100644 --- a/CriticalMass/PLSettingsTableViewController.h +++ b/CriticalMass/PLSettingsTableViewController.h @@ -10,5 +10,4 @@ @interface PLSettingsTableViewController : UITableViewController - @end diff --git a/CriticalMass/PLSettingsTableViewController.m b/CriticalMass/PLSettingsTableViewController.m index 90cfb3da0..2829ed0a8 100644 --- a/CriticalMass/PLSettingsTableViewController.m +++ b/CriticalMass/PLSettingsTableViewController.m @@ -9,15 +9,16 @@ #import "PLSettingsTableViewController.h" #import "PLDataModel.h" #import "PLConstants.h" +#import "UIColor+Helper.h" -@interface PLSettingsTableViewController () +@interface PLSettingsTableViewController() + +@property(nonatomic,strong) PLDataModel *data; +@property(nonatomic,strong) UISwitch *gpsSwitch; @end -@implementation PLSettingsTableViewController{ - PLDataModel *_data; - UISwitch *_gpsSwitch; -} +@implementation PLSettingsTableViewController - (id)initWithStyle:(UITableViewStyle)style { @@ -32,7 +33,7 @@ - (id)initWithStyle:(UITableViewStyle)style - (void)viewDidLoad { [super viewDidLoad]; - + self.clearsSelectionOnViewWillAppear = YES; } @@ -73,6 +74,7 @@ - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(N cell.textLabel.text = @"Enable GPS"; _gpsSwitch = [[UISwitch alloc]init]; + _gpsSwitch.onTintColor = [UIColor magicColor]; [_gpsSwitch addTarget:self action:@selector(onSwitchGPS:) forControlEvents:UIControlEventTouchUpInside]; [_gpsSwitch setOn:_data.gpsEnabled]; cell.accessoryView = _gpsSwitch; @@ -105,7 +107,6 @@ - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(N cell.detailTextLabel.text = @"Help finacing our tracking server"; } } - return cell; } diff --git a/CriticalMass/PLTabBarController.m b/CriticalMass/PLTabBarController.m index c1b846f81..f47160eab 100644 --- a/CriticalMass/PLTabBarController.m +++ b/CriticalMass/PLTabBarController.m @@ -4,6 +4,7 @@ #import "PLChatViewController.h" #import "PLTwitterViewController.h" #import "PLSettingsTableViewController.h" +#import "UIColor+Helper.h" @interface PLTabBarController () @@ -12,22 +13,13 @@ @interface PLTabBarController () @implementation PLTabBarController -- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil -{ - self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil]; - if (self) { - - - - - } - return self; -} - (void)viewDidLoad { [super viewDidLoad]; + self.view.tintColor = [UIColor magicColor]; + UIViewController *viewController1 = [[PLMapViewController alloc] init]; UIViewController *viewController2 = [[PLRulesViewController alloc] init]; UIViewController *viewController3 = [[PLChatViewController alloc] init]; diff --git a/CriticalMass/PLTwitterViewController.h b/CriticalMass/PLTwitterViewController.h index 253cd2f0e..deeee1881 100644 --- a/CriticalMass/PLTwitterViewController.h +++ b/CriticalMass/PLTwitterViewController.h @@ -11,11 +11,6 @@ #import "SAMLoadingView.h" #import -@interface PLTwitterViewController : UIViewController{ - STTwitterAPI *_twitter; - UITableView *_tableView; - NSArray *_statuses; - SAMLoadingView *_loadingView; -} +@interface PLTwitterViewController : UIViewController @end \ No newline at end of file diff --git a/CriticalMass/PLTwitterViewController.m b/CriticalMass/PLTwitterViewController.m index 3eaa8ce7f..b9762575e 100644 --- a/CriticalMass/PLTwitterViewController.m +++ b/CriticalMass/PLTwitterViewController.m @@ -11,10 +11,20 @@ #import "PLConstants.h" #import "PLTwitterTableViewCell.h" #import "HOButton.h" +#import "PLUtils.h" +#import "PLDataModel.h" +#import "UIColor+Helper.h" @interface PLTwitterViewController () +@property(nonatomic,strong) STTwitterAPI *twitter; +@property(nonatomic,strong) UITableViewController *tableVC; +@property(nonatomic,strong) NSArray *statuses; +@property(nonatomic,strong) PLDataModel *data; +@property(nonatomic,strong) NSString *twitterQuery; +@property(nonatomic,assign) NSArray *supportedLocalities; + @end @implementation PLTwitterViewController @@ -22,65 +32,75 @@ @implementation PLTwitterViewController - (void)viewDidLoad { [super viewDidLoad]; - PLLabel *label = [[PLLabel alloc] initWithFrame:CGRectMake(0, 19, self.view.frame.size.width, 50)]; - label.text = @"Latest Tweets of #criticalmaps"; - [label setFont: [UIFont fontWithName:@"HelveticaNeue-Light" size:16.0f]]; - [self.view addSubview:label]; - - HOButton *reloadBtn = [[HOButton alloc] init]; - [reloadBtn setImage:[UIImage imageNamed:@"Reload"] forState:UIControlStateNormal]; - reloadBtn.imageEdgeInsets = UIEdgeInsetsMake(10, 9, 10, 9); - [reloadBtn addTarget:self action:@selector(onClickReload:) forControlEvents:UIControlEventTouchUpInside]; - reloadBtn.center = CGPointMake(self.view.frame.size.width-40, 40); - [self.view addSubview:reloadBtn]; - - CGRect frame = CGRectMake(0, 70, self.view.frame.size.width, self.view.frame.size.height - 120); - - _tableView = [[UITableView alloc] initWithFrame:frame style:UITableViewStylePlain]; - [_tableView setDelegate:self]; - [_tableView setDataSource:self]; + _supportedLocalities = @[ + @"berlin", + @"wien", + @"cambridge", + @"hamburg", + @"dresden", + @"köln", + @"potsdam" + ]; - UIBezierPath *path = [UIBezierPath bezierPath]; - [path moveToPoint:CGPointMake(0, 70.0)]; - [path addLineToPoint:CGPointMake(self.view.frame.size.width, 70.0)]; + _data = [PLDataModel sharedManager]; - CAShapeLayer *shapeLayer = [CAShapeLayer layer]; - shapeLayer.path = [path CGPath]; - shapeLayer.strokeColor = [[UIColor blackColor] CGColor]; - shapeLayer.lineWidth = 1.0; - shapeLayer.fillColor = [[UIColor clearColor] CGColor]; - - [self.view.layer addSublayer:shapeLayer]; - - //[_tableVC.tableView registerClass:[HOTwoRowViewCell class] forCellReuseIdentifier:@"CustomCell"]; - //_tableVC.tableView.tableHeaderView = [self headerView]; - - [self.view addSubview:_tableView]; + if(_data.locality + && [_supportedLocalities containsObject:[_data.locality lowercaseString]]){ + + _twitterQuery = [PLUtils getTwitterQueryByLocality:_data.locality]; + }else{ + _twitterQuery = @"#criticalmaps"; + } + // table + CGRect frame = CGRectMake(0, 70, self.view.frame.size.width, self.view.frame.size.height - 120); + _tableVC = [[UITableViewController alloc] init]; + [_tableVC.tableView setDelegate:self]; + [_tableVC.tableView setDataSource:self]; + _tableVC.tableView.frame = frame; + [self.view addSubview:_tableVC.tableView]; _twitter = [STTwitterAPI twitterAPIAppOnlyWithConsumerKey:@"e0vyKNT3iC89SkUaIzEvX1oii" consumerSecret:@"151lpogCiUp4RhjRNZukl2tJSeGyskq37U8wmldFm9FDPfzBW8"]; - _loadingView = [[SAMLoadingView alloc] initWithFrame: frame]; - _loadingView.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight; - [self.view addSubview:_loadingView]; + // navbar + UINavigationBar *navBar = [[UINavigationBar alloc] initWithFrame:CGRectMake(0, 0, self.view.frame.size.width, 70)]; + navBar.backgroundColor = [UIColor whiteColor]; + UINavigationItem *navItem = [[UINavigationItem alloc] init]; + navItem.title = [[NSString stringWithFormat:@"%@", _twitterQuery] uppercaseString]; + navBar.items = @[ navItem ]; + navBar.translucent = NO; + [self.view addSubview:navBar]; + + // refresh control + _tableVC.refreshControl = [[UIRefreshControl alloc] init]; + _tableVC.refreshControl.backgroundColor = [UIColor magicColor]; + _tableVC.refreshControl.tintColor = [UIColor whiteColor]; + [_tableVC.refreshControl addTarget:self + action:@selector(onRefreshPull) + forControlEvents:UIControlEventValueChanged]; [self loadTweets]; } +-(void)viewWillAppear:(BOOL)animated{ + [super viewWillAppear:animated]; + [_tableVC.tableView reloadData]; +} + + - (void)loadTweets { - [_loadingView setHidden:NO]; [_twitter verifyCredentialsWithSuccessBlock:^(NSString *bearerToken) { DLog(@"Access granted with %@", bearerToken); [_twitter verifyCredentialsWithSuccessBlock:^(NSString *bearerToken) { - [_twitter getSearchTweetsWithQuery: kTwitterQuery + [_twitter getSearchTweetsWithQuery: _twitterQuery successBlock:^(NSDictionary *searchMetadata, NSArray *statuses) { _statuses = statuses; - [_tableView reloadData]; - [_loadingView setHidden:YES]; - + [_tableVC.tableView reloadData]; + [_tableVC.refreshControl endRefreshing]; + } errorBlock:^(NSError *error) { // ... }]; @@ -95,12 +115,6 @@ - (void)loadTweets { } -- (void)viewWillAppear:(BOOL)animated{ - [super viewDidAppear:animated]; - - [_tableView reloadData]; -} - - (void)didReceiveMemoryWarning { [super didReceiveMemoryWarning]; @@ -110,8 +124,38 @@ - (IBAction)onClickReload:(id)sender { [self loadTweets]; } +- (void)onRefreshPull { + [self loadTweets]; +} + #pragma mark - Data source +- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView +{ + + if (_statuses.count) { + tableView.separatorStyle = UITableViewCellSeparatorStyleSingleLine; + tableView.backgroundView = nil; + return 1; + } else { + + // Display a message when the table is empty + UILabel *messageLabel = [[UILabel alloc] initWithFrame:CGRectMake(0, 0, self.view.bounds.size.width, self.view.bounds.size.height)]; + + messageLabel.text = @"No data is currently available.\nPlease pull down to refresh."; + messageLabel.textColor = [UIColor blackColor]; + messageLabel.numberOfLines = 0; + messageLabel.textAlignment = NSTextAlignmentCenter; + // messageLabel.font = [UIFont fontWithName:@"Palatino-Italic" size:20]; + [messageLabel sizeToFit]; + + tableView.backgroundView = messageLabel; + tableView.separatorStyle = UITableViewCellSeparatorStyleNone; + } + + return 0; +} + - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { return [_statuses count]; @@ -131,7 +175,7 @@ - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(N } NSDictionary *status = [_statuses objectAtIndex:indexPath.row]; - + DLog(@"%@", status); NSString *profileImageURL = status[@"user"][@"profile_image_url"]; @@ -141,17 +185,11 @@ - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(N [cell.imageView sd_setImageWithURL:[NSURL URLWithString: profileImageURL] placeholderImage:[UIImage imageNamed:@"Twitter"]]; - + cell.textLabel.text = [NSString stringWithFormat:@"@%@: %@", screenName, text]; //cell.detailTextLabel.text = [NSString stringWithFormat:@"@%@ | %@", screenName, dateString]; return cell; } - -- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView -{ - return 1; -} - @end diff --git a/CriticalMass/PLUtils.h b/CriticalMass/PLUtils.h index 63bdd37cf..5cadf7cbc 100644 --- a/CriticalMass/PLUtils.h +++ b/CriticalMass/PLUtils.h @@ -14,5 +14,6 @@ +(NSString*)locationdegrees2String:(double)degrees; +(double)string2Locationdegrees:(NSString*)string; +(NSString*)getTimestamp; ++(NSString*)getTwitterQueryByLocality:(NSString*)locality; @end diff --git a/CriticalMass/PLUtils.m b/CriticalMass/PLUtils.m index 68c7a3de9..a49f05ffa 100644 --- a/CriticalMass/PLUtils.m +++ b/CriticalMass/PLUtils.m @@ -8,7 +8,6 @@ #import "PLUtils.h" - @implementation PLUtils +(NSString*)locationdegrees2String:(double)degrees @@ -16,7 +15,8 @@ +(NSString*)locationdegrees2String:(double)degrees return [[NSString stringWithFormat:@"%.06f", degrees] stringByReplacingOccurrencesOfString:@"." withString:@""]; } -+(double)string2Locationdegrees:(NSString*)string{ ++(double)string2Locationdegrees:(NSString*)string +{ return (double)([string floatValue]/1000000); } @@ -25,4 +25,11 @@ +(NSString*)getTimestamp return [NSString stringWithFormat:@"%f",[[NSDate date] timeIntervalSince1970] * 1000]; } ++(NSString*)getTwitterQueryByLocality:(NSString*)locality +{ + NSString *ret = [NSString stringWithFormat:@"#cm%@",[locality lowercaseString]]; + ret = [ret stringByReplacingOccurrencesOfString:@" " withString:@""]; + return ret; +} + @end diff --git a/CriticalMass/UIColor+Helper.h b/CriticalMass/UIColor+Helper.h new file mode 100644 index 000000000..3b0cd1d87 --- /dev/null +++ b/CriticalMass/UIColor+Helper.h @@ -0,0 +1,15 @@ +// +// UIColor+Helper.h +// CriticalMaps +// +// Created by Norman Sander on 05.04.15. +// Copyright (c) 2015 Pokus Labs. All rights reserved. +// + +#import + +@interface UIColor (Helper) + ++ (UIColor *)magicColor; + +@end diff --git a/CriticalMass/UIColor+Helper.m b/CriticalMass/UIColor+Helper.m new file mode 100644 index 000000000..913281cb9 --- /dev/null +++ b/CriticalMass/UIColor+Helper.m @@ -0,0 +1,19 @@ +// +// UIColor+Helper.m +// CriticalMaps +// +// Created by Norman Sander on 05.04.15. +// Copyright (c) 2015 Pokus Labs. All rights reserved. +// + +#import "UIColor+Helper.h" + +#define UIColorFromRGB(rgbValue) [UIColor colorWithRed:((float)((rgbValue & 0xFF0000) >> 16))/255.0 green:((float)((rgbValue & 0xFF00) >> 8))/255.0 blue:((float)(rgbValue & 0xFF))/255.0 alpha:1.0] + +@implementation UIColor (Helper) + ++ (UIColor *)magicColor { + return UIColorFromRGB(0x028a68); +} + +@end diff --git a/Podfile b/Podfile index 228d9f816..9c56b7e6c 100644 --- a/Podfile +++ b/Podfile @@ -9,6 +9,7 @@ pod 'NSString-Hashes' pod 'AccordionView' pod 'TTTAttributedLabel' pod 'STTwitter' +pod 'GoogleAnalytics-iOS-SDK', '3.0.3c' pod 'SAMLoadingView' pod 'SDWebImage' pod 'Appirater' \ No newline at end of file diff --git a/Podfile.lock b/Podfile.lock index a5e861c4b..dbd379488 100644 --- a/Podfile.lock +++ b/Podfile.lock @@ -1,39 +1,41 @@ PODS: - AccordionView (0.0.5) - - AFNetworking (2.5.1): - - AFNetworking/NSURLConnection (= 2.5.1) - - AFNetworking/NSURLSession (= 2.5.1) - - AFNetworking/Reachability (= 2.5.1) - - AFNetworking/Security (= 2.5.1) - - AFNetworking/Serialization (= 2.5.1) - - AFNetworking/UIKit (= 2.5.1) - - AFNetworking/NSURLConnection (2.5.1): + - AFNetworking (2.5.2): + - AFNetworking/NSURLConnection (= 2.5.2) + - AFNetworking/NSURLSession (= 2.5.2) + - AFNetworking/Reachability (= 2.5.2) + - AFNetworking/Security (= 2.5.2) + - AFNetworking/Serialization (= 2.5.2) + - AFNetworking/UIKit (= 2.5.2) + - AFNetworking/NSURLConnection (2.5.2): - AFNetworking/Reachability - AFNetworking/Security - AFNetworking/Serialization - - AFNetworking/NSURLSession (2.5.1): + - AFNetworking/NSURLSession (2.5.2): - AFNetworking/Reachability - AFNetworking/Security - AFNetworking/Serialization - - AFNetworking/Reachability (2.5.1) - - AFNetworking/Security (2.5.1) - - AFNetworking/Serialization (2.5.1) - - AFNetworking/UIKit (2.5.1): + - AFNetworking/Reachability (2.5.2) + - AFNetworking/Security (2.5.2) + - AFNetworking/Serialization (2.5.2) + - AFNetworking/UIKit (2.5.2): - AFNetworking/NSURLConnection - AFNetworking/NSURLSession - Appirater (2.0.4) + - GoogleAnalytics-iOS-SDK (3.0.3c) - NSString-Hashes (1.2.2) - SAMLoadingView (0.1.0) - - SDWebImage (3.7.1): - - SDWebImage/Core (= 3.7.1) - - SDWebImage/Core (3.7.1) - - STTwitter (0.1.9) - - TTTAttributedLabel (1.13.2) + - SDWebImage (3.7.2): + - SDWebImage/Core (= 3.7.2) + - SDWebImage/Core (3.7.2) + - STTwitter (0.2.0) + - TTTAttributedLabel (1.13.3) DEPENDENCIES: - AccordionView - AFNetworking - Appirater + - GoogleAnalytics-iOS-SDK (= 3.0.3c) - NSString-Hashes - SAMLoadingView - SDWebImage @@ -41,13 +43,14 @@ DEPENDENCIES: - TTTAttributedLabel SPEC CHECKSUMS: - AccordionView: bc022d5ae3b05a96b0b1ccd41cf37cc6796161a7 - AFNetworking: 8bee59492a6ff15d69130efa4d0dc67e0094a52a - Appirater: cbdb7f305562cfde585300bfff86da01ae559deb - NSString-Hashes: ddf6e856e93d3c83c5d4ef8fcdea2a96ed77c6bc - SAMLoadingView: 11b746311268140f6a2380723215fe96a6d15dee - SDWebImage: 116e88633b5b416ea0ca4b334a4ac59cf72dd38d - STTwitter: c9ddaac928660d64e346546d554069a7cdaaf5aa - TTTAttributedLabel: 7c4592f9a806badb8b48dc634cb9800447c51594 + AccordionView: 4f82751476a96ec60985041a48bf4c94ac1ea5ab + AFNetworking: fefbce9660acb17f48ae0011292d4da0f457bf36 + Appirater: 8783318c36414e8de3ea023443028df94c1b784b + GoogleAnalytics-iOS-SDK: 44a1874cccd8294a0376fd8ee136f7c898c151a5 + NSString-Hashes: c3848d809e92650e4fb17db5d8cc4bd2aa1eaddd + SAMLoadingView: 7ffc4f0efe85f9717d6e367b6b93e32befe4407c + SDWebImage: 71b7cdc1d1721d6a82ed62889030225f2c249e29 + STTwitter: 4fda61d0a96c707f94df85677b1a4aedbcec6fcd + TTTAttributedLabel: 6f3174aef8e738f44dff97c2eb7d8184f6ab6277 -COCOAPODS: 0.35.0 +COCOAPODS: 0.36.3 diff --git a/README.md b/README.md index da74faa96..82cb83cd8 100644 --- a/README.md +++ b/README.md @@ -37,6 +37,7 @@ check: http://criticalmaps.net - [ ] better design - [ ] individual fonts - [x] twitterfeed -- [ ] feedback functionality -- [ ] share functionality +- [ ] feedback mail composer +- [ ] sharing - [ ] zoom buttons +- [x] chat