Brion VIBBER has uploaded a new change for review. https://gerrit.wikimedia.org/r/88165
Change subject: Made details page license selectable for new images. ...................................................................... Made details page license selectable for new images. Change-Id: Ib1061e91647310ee8ba9bfd2ea116b65c8b97560 --- M Commons-iOS.xcodeproj/project.pbxproj M Commons-iOS/CommonsApp.m M Commons-iOS/DetailScrollViewController.m M Commons-iOS/FileUpload.h M Commons-iOS/FileUpload.m M Commons-iOS/FileUpload.xcdatamodeld/.xccurrentversion M Commons-iOS/FileUpload.xcdatamodeld/FileUpload 3.xcdatamodel/contents A Commons-iOS/FileUpload.xcdatamodeld/FileUpload 4.xcdatamodel/contents 8 files changed, 192 insertions(+), 44 deletions(-) git pull ssh://gerrit.wikimedia.org:29418/apps/ios/commons refs/changes/65/88165/1 diff --git a/Commons-iOS.xcodeproj/project.pbxproj b/Commons-iOS.xcodeproj/project.pbxproj index 07c631c..e01e242 100644 --- a/Commons-iOS.xcodeproj/project.pbxproj +++ b/Commons-iOS.xcodeproj/project.pbxproj @@ -341,6 +341,7 @@ 0417D9E9176E666B00081D8C /* GalleryMultiSelectCollectionVC.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GalleryMultiSelectCollectionVC.m; sourceTree = "<group>"; }; 0417D9EE176EB00000081D8C /* GalleryMultiSelectAlbumCell.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = GalleryMultiSelectAlbumCell.h; sourceTree = "<group>"; }; 0417D9EF176EB00100081D8C /* GalleryMultiSelectAlbumCell.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GalleryMultiSelectAlbumCell.m; sourceTree = "<group>"; }; + 0438EF0317FCCB96005F8BF5 /* FileUpload 4.xcdatamodel */ = {isa = PBXFileReference; lastKnownFileType = file; path = "FileUpload 4.xcdatamodel"; sourceTree = "<group>"; }; 044A0C3A170F6504003395DD /* GradientButton.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = GradientButton.h; sourceTree = "<group>"; }; 044A0C3B170F6504003395DD /* GradientButton.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GradientButton.m; sourceTree = "<group>"; }; 0451C8601739A2CC00C2D03B /* FetchImageOperation.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FetchImageOperation.h; sourceTree = "<group>"; }; @@ -1997,11 +1998,12 @@ D41B99ED16B1CB2E0045BEB5 /* FileUpload.xcdatamodeld */ = { isa = XCVersionGroup; children = ( + 0438EF0317FCCB96005F8BF5 /* FileUpload 4.xcdatamodel */, D41BFA46173AF10600472EC7 /* FileUpload 3.xcdatamodel */, D4C5B4201720BCD700C40532 /* FileUpload 2.xcdatamodel */, D41B99EE16B1CB2E0045BEB5 /* FileUpload.xcdatamodel */, ); - currentVersion = D41BFA46173AF10600472EC7 /* FileUpload 3.xcdatamodel */; + currentVersion = 0438EF0317FCCB96005F8BF5 /* FileUpload 4.xcdatamodel */; path = FileUpload.xcdatamodeld; sourceTree = "<group>"; versionGroupType = wrapper.xcdatamodel; diff --git a/Commons-iOS/CommonsApp.m b/Commons-iOS/CommonsApp.m index fb4ac60..907c52d 100644 --- a/Commons-iOS/CommonsApp.m +++ b/Commons-iOS/CommonsApp.m @@ -683,6 +683,9 @@ if (_currentUploadOp.isLoggedIn) { record.progress = @0.0f; + + // In case license somehow is not set by now... + if (record.license == nil) record.license = @"cc-by-sa-3.0"; MWPromise *upload = [_currentUploadOp uploadFile:fileName withFileData:fileData @@ -763,12 +766,12 @@ NSString *format = @"== {{int:filedesc}} ==\n" @"{{Information\n|description=%@\n|source={{own}}\n|author=[[User:%@|%2$@]]\n|date=%@}}\n" @"== {{int:license-header}} ==\n" - @"{{self|cc-by-sa-3.0}}\n" + @"{{self|%@}}\n" @"\n" @"{{Uploaded from Mobile|platform=iOS|version=%@}}\n" @"%@"; NSString *cats = [self formatCategories:record]; - NSString *desc = [NSString stringWithFormat:format, record.desc, self.username, [self formatDescriptionDate:record], self.version, cats]; + NSString *desc = [NSString stringWithFormat:format, record.desc, self.username, [self formatDescriptionDate:record], record.license, self.version, cats]; return desc; } diff --git a/Commons-iOS/DetailScrollViewController.m b/Commons-iOS/DetailScrollViewController.m index 5f0058c..bf9b2a0 100644 --- a/Commons-iOS/DetailScrollViewController.m +++ b/Commons-iOS/DetailScrollViewController.m @@ -69,6 +69,9 @@ CFTimeInterval timeLastCategoryPan_; CategoryLicenseExtractor *categoryLicenseExtractor_; NSURL *licenseURL_; + NSArray *selectableLicenses_; + NSInteger selectedLicenseIndex_; + NSMutableArray *licenseLabels_; } #pragma mark - Init / dealloc @@ -87,6 +90,9 @@ self.categoriesNeedToBeRefreshed = NO; timeLastDetailsPan_ = CACurrentMediaTime(); timeLastCategoryPan_ = CACurrentMediaTime(); + selectableLicenses_ = nil; + selectedLicenseIndex_ = 0; + licenseLabels_ = nil; } return self; } @@ -116,7 +122,10 @@ self.view.translatesAutoresizingMaskIntoConstraints = NO; previewImage_ = nil; - + + // Load the list of licenses user may choose from + [self loadSelectableLicenses]; + // Get the app delegate so the loading indicator may be accessed self.appDelegate = (AppDelegate *)[[UIApplication sharedApplication] delegate]; @@ -403,6 +412,146 @@ } } +#pragma mark - License retrieval + +- (void)getPreviouslySavedLicenseFromCategories:(NSMutableArray *)categories +{ + // Replaces "loading..." message in licenseDefaultLabel with name of license or "Tap for license" + // message if no license found. If no license found makes "Tap for license" actually link to the + // image's wiki page. + + // Extract license from categories now that categories have been retrieved + NSString *license = [categoryLicenseExtractor_ getLicenseFromCategories:categories]; + + // If license was name was not retrieved change it to say "Tap for License" for now + if (license == nil){ + license = [MWMessage forKey:@"picture-of-day-tap-for-license"].text; + + UITapGestureRecognizer *licenseTapGesture = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(handleLicenseTap:)]; + [self.licenseDefaultLabel addGestureRecognizer:licenseTapGesture]; + + // Get the wiki url for the image + NSString *pageTitle = [@"File:" stringByAppendingString:self.selectedRecord.title]; + NSURL *wikiUrl = [CommonsApp.singleton URLForWikiPage:pageTitle]; + licenseURL_ = wikiUrl; + }else{ + licenseURL_ = [NSURL URLWithString:[categoryLicenseExtractor_ getURLForLicense:license]]; + license = [license uppercaseString]; + } + + // Update licenseDefaultLabel to show name of found license + self.licenseDefaultLabel.text = license; +} + +#pragma mark - License choices + +-(void)updateLicenseContainer{ + // Presents and constrains a label for each license choice. + + //NSLog(@"license from record = %@", self.selectedRecord.license); + + if (self.selectedRecord.license == nil) self.selectedRecord.license = @"cc-by-sa-3.0"; + selectedLicenseIndex_ = [self getSelectedRecordLicenseIndex]; + + // Remove the "Loading..." label + [self.licenseDefaultLabel removeFromSuperview]; + + licenseLabels_ = [@[] mutableCopy]; + UIView *labelAbove = self.licenseLabel; + NSInteger tag = 0; + for (NSDictionary *license in selectableLicenses_) { + UILabelDynamicHeight *label = [[UILabelDynamicHeight alloc] init]; + label.translatesAutoresizingMaskIntoConstraints = NO; + [self.licenseContainer addSubview:label]; + [self styleDetailsLabel:label]; + [licenseLabels_ addObject:label]; + + label.text = license[@"description"]; + + [self.licenseContainer addSubview:label]; + label.tag = tag++; + + // Constrain each license label appropriately + [self.licenseContainer addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|-[label]-|" options:0 metrics:nil views:@{@"label": label}]]; + + NSString *formatString = @"V:[labelAbove]-[label]"; + if (selectableLicenses_.lastObject == license) { + formatString = [formatString stringByAppendingString:@"-|"]; + } + + [self.licenseContainer addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:formatString options:0 metrics:nil views:@{@"label": label, @"labelAbove": labelAbove}]]; + labelAbove = label; + + // Make label respond to taps + UITapGestureRecognizer *tapGesture = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(licenseSelectionTapped:)]; + [label addGestureRecognizer:tapGesture]; + + // Make the selected license appear highlighted + [self setLicenseSelectionIndication:label]; + } +} + +#pragma mark - License selection + +-(void) loadSelectableLicenses +{ + // The list of licenses to be chosen from. + selectableLicenses_ = @[ + @{ + @"license" :@"cc-by-sa-3.0", + @"description": @"Creative Commons Attribution ShareAlike 3.0" + }, + @{ + @"license" :@"cc-by-3.0", + @"description": @"Creative Commons Attribution 3.0" + }, + @{ + @"license" :@"cc-zero", + @"description": @"Creative Commons CC0 Waiver" + } + ]; +} + +-(void)licenseSelectionTapped:(UITapGestureRecognizer *)recognizer +{ + NSLog(@"license selected = %d", recognizer.view.tag); + selectedLicenseIndex_ = recognizer.view.tag; + if (!(selectedLicenseIndex_ < selectableLicenses_.count)) { + selectedLicenseIndex_ = 0; + } + NSDictionary *selectedLicense = selectableLicenses_[selectedLicenseIndex_]; + self.selectedRecord.license = selectedLicense[@"license"]; + + // Add the license to categories too (needed since we're pulling license info from categories) + [self.selectedRecord addCategory:[selectedLicense[@"license"] uppercaseString]]; + + for (UILabelDynamicHeight *label in licenseLabels_) { + [self setLicenseSelectionIndication:label]; + } +} + +-(NSInteger)getSelectedRecordLicenseIndex +{ + // Looks for self.selectedRecord.license in selectableLicenses_ and returns index of match. + NSInteger index = 0; + for (NSDictionary *license in selectableLicenses_) { + if ([license[@"license"] isEqualToString:self.selectedRecord.license]) { + return index; + } + index++; + } + return index; +} + +-(void)setLicenseSelectionIndication:(UILabelDynamicHeight *)label +{ + if (label.tag == selectedLicenseIndex_){ + label.borderView.layer.borderWidth = 2.0f; + }else{ + label.borderView.layer.borderWidth = 0.0f; + } +} + #pragma mark - Selected record -(void)configureForSelectedRecord @@ -429,10 +578,8 @@ }); }else{ [self updateCategoryContainer]; - -// new pic! add list of licenses to be chosen from here - + [self updateLicenseContainer]; } dispatch_async(dispatch_get_main_queue(), ^(void) { @@ -900,39 +1047,6 @@ }]; } -#pragma mark - License retrieval - -- (void)getPreviouslySavedLicenseFromCategories:(NSMutableArray *)categories -{ - // Replaces "loading..." message in licenseDefaultLabel with name of license or "Tap for license" - // message if no license found. If no license found makes "Tap for license" actually link to the - // image's wiki page. - - // Extract license from categories now that categories have been retrieved - NSString *license = [categoryLicenseExtractor_ getLicenseFromCategories:categories]; - -//license = nil; - - // If license was name was not retrieved change it to say "Tap for License" for now - if (license == nil){ - license = [MWMessage forKey:@"picture-of-day-tap-for-license"].text; - - UITapGestureRecognizer *licenseTapGesture = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(handleLicenseTap:)]; - [self.licenseDefaultLabel addGestureRecognizer:licenseTapGesture]; - - // Get the wiki url for the image - NSString *pageTitle = [@"File:" stringByAppendingString:self.selectedRecord.title]; - NSURL *wikiUrl = [CommonsApp.singleton URLForWikiPage:pageTitle]; - licenseURL_ = wikiUrl; - }else{ - licenseURL_ = [NSURL URLWithString:[categoryLicenseExtractor_ getURLForLicense:license]]; - license = [license uppercaseString]; - } - - // Update licenseDefaultLabel to show name of found license - self.licenseDefaultLabel.text = license; -} - #pragma mark - Category retrieval - (void)getPreviouslySavedCategoriesForRecord:(FileUpload *)record @@ -1103,6 +1217,7 @@ label.textColor = [UIColor whiteColor]; label.backgroundColor = [UIColor clearColor]; label.borderColor = [UIColor clearColor]; + label.borderView.layer.borderColor = [UIColor colorWithWhite:1.0f alpha:0.8f].CGColor; label.paddingColor = DETAIL_NON_EDITABLE_TEXTBOX_BACKGROUND_COLOR; [label setPaddingInsets:DETAIL_CATEGORY_PADDING_INSET]; } diff --git a/Commons-iOS/FileUpload.h b/Commons-iOS/FileUpload.h index 302e880..a9f46f3 100644 --- a/Commons-iOS/FileUpload.h +++ b/Commons-iOS/FileUpload.h @@ -24,6 +24,7 @@ @property (nonatomic, retain) NSString * source; @property (nonatomic, retain) NSString * thumbnailURL; @property (nonatomic, retain) NSNumber * fileSize; +@property (nonatomic, retain) NSString * license; @property (nonatomic, retain) NSNumber * fetchThumbnailProgress; diff --git a/Commons-iOS/FileUpload.m b/Commons-iOS/FileUpload.m index 34e042b..7af3a35 100644 --- a/Commons-iOS/FileUpload.m +++ b/Commons-iOS/FileUpload.m @@ -23,6 +23,7 @@ @dynamic source; @dynamic thumbnailURL; @dynamic fileSize; +@dynamic license; @synthesize fetchThumbnailProgress; diff --git a/Commons-iOS/FileUpload.xcdatamodeld/.xccurrentversion b/Commons-iOS/FileUpload.xcdatamodeld/.xccurrentversion index 9578caa..e4a3d0e 100644 --- a/Commons-iOS/FileUpload.xcdatamodeld/.xccurrentversion +++ b/Commons-iOS/FileUpload.xcdatamodeld/.xccurrentversion @@ -3,6 +3,6 @@ <plist version="1.0"> <dict> <key>_XCCurrentVersionName</key> - <string>FileUpload 3.xcdatamodel</string> + <string>FileUpload 4.xcdatamodel</string> </dict> </plist> diff --git a/Commons-iOS/FileUpload.xcdatamodeld/FileUpload 3.xcdatamodel/contents b/Commons-iOS/FileUpload.xcdatamodeld/FileUpload 3.xcdatamodel/contents index f511604..e7ba70d 100644 --- a/Commons-iOS/FileUpload.xcdatamodeld/FileUpload 3.xcdatamodel/contents +++ b/Commons-iOS/FileUpload.xcdatamodeld/FileUpload 3.xcdatamodel/contents @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="UTF-8" standalone="yes"?> -<model name="" userDefinedModelVersionIdentifier="" type="com.apple.IDECoreDataModeler.DataModel" documentVersion="1.0" lastSavedToolsVersion="2061" systemVersion="12D78" minimumToolsVersion="Xcode 4.3" macOSVersion="Automatic" iOSVersion="Automatic"> +<model userDefinedModelVersionIdentifier="" type="com.apple.IDECoreDataModeler.DataModel" documentVersion="1.0" lastSavedToolsVersion="3396" systemVersion="12F37" minimumToolsVersion="Xcode 4.3" macOSVersion="Automatic" iOSVersion="Automatic"> <entity name="Category" representedClassName="Category" syncable="YES"> <attribute name="lastUsed" optional="YES" attributeType="Date" syncable="YES"/> <attribute name="name" optional="YES" attributeType="String" syncable="YES"/> @@ -19,7 +19,7 @@ <attribute name="title" optional="YES" attributeType="String" syncable="YES"/> </entity> <elements> - <element name="FileUpload" positionX="160" positionY="192" width="128" height="210"/> - <element name="Category" positionX="160" positionY="192" width="128" height="90"/> + <element name="Category" positionX="0" positionY="0" width="0" height="0"/> + <element name="FileUpload" positionX="0" positionY="0" width="0" height="0"/> </elements> </model> \ No newline at end of file diff --git a/Commons-iOS/FileUpload.xcdatamodeld/FileUpload 4.xcdatamodel/contents b/Commons-iOS/FileUpload.xcdatamodeld/FileUpload 4.xcdatamodel/contents new file mode 100644 index 0000000..840e6de --- /dev/null +++ b/Commons-iOS/FileUpload.xcdatamodeld/FileUpload 4.xcdatamodel/contents @@ -0,0 +1,26 @@ +<?xml version="1.0" encoding="UTF-8" standalone="yes"?> +<model userDefinedModelVersionIdentifier="" type="com.apple.IDECoreDataModeler.DataModel" documentVersion="1.0" lastSavedToolsVersion="3396" systemVersion="12F37" minimumToolsVersion="Xcode 4.3" macOSVersion="Automatic" iOSVersion="Automatic"> + <entity name="Category" representedClassName="Category" syncable="YES"> + <attribute name="lastUsed" optional="YES" attributeType="Date" syncable="YES"/> + <attribute name="name" optional="YES" attributeType="String" syncable="YES"/> + <attribute name="timesUsed" optional="YES" attributeType="Integer 32" defaultValueString="0" syncable="YES"/> + </entity> + <entity name="FileUpload" representedClassName="FileUpload" syncable="YES"> + <attribute name="categories" optional="YES" attributeType="String" syncable="YES"/> + <attribute name="complete" optional="YES" attributeType="Boolean" syncable="YES"/> + <attribute name="created" optional="YES" attributeType="Date" syncable="YES"/> + <attribute name="desc" optional="YES" attributeType="String" syncable="YES"/> + <attribute name="fileSize" optional="YES" attributeType="Integer 32" defaultValueString="0" syncable="YES"/> + <attribute name="fileType" optional="YES" attributeType="String" syncable="YES"/> + <attribute name="license" optional="YES" attributeType="String" syncable="YES"/> + <attribute name="localFile" optional="YES" attributeType="String" syncable="YES"/> + <attribute name="progress" optional="YES" attributeType="Float" defaultValueString="0.0" syncable="YES"/> + <attribute name="source" optional="YES" attributeType="String" syncable="YES"/> + <attribute name="thumbnailURL" optional="YES" attributeType="String" syncable="YES"/> + <attribute name="title" optional="YES" attributeType="String" syncable="YES"/> + </entity> + <elements> + <element name="Category" positionX="0" positionY="0" width="0" height="0"/> + <element name="FileUpload" positionX="0" positionY="0" width="0" height="0"/> + </elements> +</model> \ No newline at end of file -- To view, visit https://gerrit.wikimedia.org/r/88165 To unsubscribe, visit https://gerrit.wikimedia.org/r/settings Gerrit-MessageType: newchange Gerrit-Change-Id: Ib1061e91647310ee8ba9bfd2ea116b65c8b97560 Gerrit-PatchSet: 1 Gerrit-Project: apps/ios/commons Gerrit-Branch: master Gerrit-Owner: Brion VIBBER <br...@wikimedia.org> Gerrit-Reviewer: Mhurd <mh...@wikimedia.org> _______________________________________________ MediaWiki-commits mailing list MediaWiki-commits@lists.wikimedia.org https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits