| OLD | NEW |
| 1 // Copyright 2016 The Chromium Authors. All rights reserved. | 1 // Copyright 2016 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #import "ios/chrome/browser/share_extension/share_extension_item_receiver.h" | 5 #import "ios/chrome/browser/share_extension/share_extension_item_receiver.h" |
| 6 | 6 |
| 7 #import <UIKit/UIKit.h> | 7 #import <UIKit/UIKit.h> |
| 8 | 8 |
| 9 #include "base/ios/block_types.h" | 9 #include "base/ios/block_types.h" |
| 10 #include "base/mac/bind_objc_block.h" | 10 #include "base/mac/bind_objc_block.h" |
| (...skipping 92 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 103 return; | 103 return; |
| 104 } | 104 } |
| 105 #else | 105 #else |
| 106 DCHECK([self presentedItemURL]); | 106 DCHECK([self presentedItemURL]); |
| 107 #endif | 107 #endif |
| 108 | 108 |
| 109 _readingListModel = readingListModel; | 109 _readingListModel = readingListModel; |
| 110 _bookmarkModel = bookmarkModel; | 110 _bookmarkModel = bookmarkModel; |
| 111 | 111 |
| 112 web::WebThread::PostTask(web::WebThread::FILE, FROM_HERE, | 112 web::WebThread::PostTask(web::WebThread::FILE, FROM_HERE, |
| 113 base::BindBlock(^() { | 113 base::BindBlockArc(^() { |
| 114 [self createReadingListFolder]; | 114 [self createReadingListFolder]; |
| 115 })); | 115 })); |
| 116 [[NSNotificationCenter defaultCenter] | 116 [[NSNotificationCenter defaultCenter] |
| 117 addObserver:self | 117 addObserver:self |
| 118 selector:@selector(applicationDidBecomeActive) | 118 selector:@selector(applicationDidBecomeActive) |
| 119 name:UIApplicationDidBecomeActiveNotification | 119 name:UIApplicationDidBecomeActiveNotification |
| 120 object:nil]; | 120 object:nil]; |
| 121 [[NSNotificationCenter defaultCenter] | 121 [[NSNotificationCenter defaultCenter] |
| 122 addObserver:self | 122 addObserver:self |
| 123 selector:@selector(applicationWillResignActive) | 123 selector:@selector(applicationWillResignActive) |
| (...skipping 18 matching lines...) Expand all Loading... |
| 142 DCHECK_CURRENTLY_ON(web::WebThread::FILE); | 142 DCHECK_CURRENTLY_ON(web::WebThread::FILE); |
| 143 if (![[NSFileManager defaultManager] | 143 if (![[NSFileManager defaultManager] |
| 144 fileExistsAtPath:[[self presentedItemURL] path]]) { | 144 fileExistsAtPath:[[self presentedItemURL] path]]) { |
| 145 [[NSFileManager defaultManager] | 145 [[NSFileManager defaultManager] |
| 146 createDirectoryAtPath:[[self presentedItemURL] path] | 146 createDirectoryAtPath:[[self presentedItemURL] path] |
| 147 withIntermediateDirectories:NO | 147 withIntermediateDirectories:NO |
| 148 attributes:nil | 148 attributes:nil |
| 149 error:nil]; | 149 error:nil]; |
| 150 } | 150 } |
| 151 web::WebThread::PostTask( | 151 web::WebThread::PostTask( |
| 152 web::WebThread::UI, FROM_HERE, base::BindBlock(^() { | 152 web::WebThread::UI, FROM_HERE, base::BindBlockArc(^() { |
| 153 if ([[UIApplication sharedApplication] applicationState] == | 153 if ([[UIApplication sharedApplication] applicationState] == |
| 154 UIApplicationStateActive) { | 154 UIApplicationStateActive) { |
| 155 _folderCreated = YES; | 155 _folderCreated = YES; |
| 156 [self applicationDidBecomeActive]; | 156 [self applicationDidBecomeActive]; |
| 157 } | 157 } |
| 158 })); | 158 })); |
| 159 } | 159 } |
| 160 | 160 |
| 161 - (BOOL)receivedData:(NSData*)data withCompletion:(ProceduralBlock)completion { | 161 - (BOOL)receivedData:(NSData*)data withCompletion:(ProceduralBlock)completion { |
| 162 id entryID = [NSKeyedUnarchiver unarchiveObjectWithData:data]; | 162 id entryID = [NSKeyedUnarchiver unarchiveObjectWithData:data]; |
| (...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 198 completion(); | 198 completion(); |
| 199 } | 199 } |
| 200 return NO; | 200 return NO; |
| 201 } | 201 } |
| 202 | 202 |
| 203 UMA_HISTOGRAM_TIMES("IOS.ShareExtension.ReceivedEntryDelay", | 203 UMA_HISTOGRAM_TIMES("IOS.ShareExtension.ReceivedEntryDelay", |
| 204 base::TimeDelta::FromSecondsD( | 204 base::TimeDelta::FromSecondsD( |
| 205 [[NSDate date] timeIntervalSinceDate:entryDate])); | 205 [[NSDate date] timeIntervalSinceDate:entryDate])); |
| 206 | 206 |
| 207 // Entry is valid. Add it to the reading list model. | 207 // Entry is valid. Add it to the reading list model. |
| 208 web::WebThread::PostTask(web::WebThread::UI, FROM_HERE, base::BindBlock(^() { | 208 web::WebThread::PostTask(web::WebThread::UI, FROM_HERE, |
| 209 base::BindBlockArc(^() { |
| 209 if (!_readingListModel || !_bookmarkModel) { | 210 if (!_readingListModel || !_bookmarkModel) { |
| 210 // Models may have been deleted after the file | 211 // Models may have been deleted after the file |
| 211 // processing started. | 212 // processing started. |
| 212 return; | 213 return; |
| 213 } | 214 } |
| 214 app_group::ShareExtensionItemType type = | 215 app_group::ShareExtensionItemType type = |
| 215 static_cast<app_group::ShareExtensionItemType>( | 216 static_cast<app_group::ShareExtensionItemType>( |
| 216 [entryType integerValue]); | 217 [entryType integerValue]); |
| 217 if (type == app_group::READING_LIST_ITEM) { | 218 if (type == app_group::READING_LIST_ITEM) { |
| 218 LogHistogramReceivedItem(READINGLIST_ENTRY); | 219 LogHistogramReceivedItem(READINGLIST_ENTRY); |
| 219 _readingListModel->AddEntry(entryURL, | 220 _readingListModel->AddEntry(entryURL, |
| 220 entryTitle); | 221 entryTitle); |
| 221 } | 222 } |
| 222 if (type == app_group::BOOKMARK_ITEM) { | 223 if (type == app_group::BOOKMARK_ITEM) { |
| 223 LogHistogramReceivedItem(BOOKMARK_ENTRY); | 224 LogHistogramReceivedItem(BOOKMARK_ENTRY); |
| 224 _bookmarkModel->AddURL( | 225 _bookmarkModel->AddURL( |
| 225 _bookmarkModel->mobile_node(), 0, | 226 _bookmarkModel->mobile_node(), 0, |
| 226 base::ASCIIToUTF16(entryTitle), entryURL); | 227 base::ASCIIToUTF16(entryTitle), entryURL); |
| 227 } | 228 } |
| 228 if (completion) { | 229 if (completion) { |
| 229 web::WebThread::PostTask(web::WebThread::FILE, | 230 web::WebThread::PostTask(web::WebThread::FILE, |
| 230 FROM_HERE, | 231 FROM_HERE, |
| 231 base::BindBlock(^() { | 232 base::BindBlockArc(^() { |
| 232 completion(); | 233 completion(); |
| 233 })); | 234 })); |
| 234 } | 235 } |
| 235 })); | 236 })); |
| 236 return YES; | 237 return YES; |
| 237 } | 238 } |
| 238 | 239 |
| 239 - (void)handleFileAtURL:(NSURL*)url withCompletion:(ProceduralBlock)completion { | 240 - (void)handleFileAtURL:(NSURL*)url withCompletion:(ProceduralBlock)completion { |
| 240 DCHECK_CURRENTLY_ON(web::WebThread::FILE); | 241 DCHECK_CURRENTLY_ON(web::WebThread::FILE); |
| 241 if (![[NSFileManager defaultManager] fileExistsAtPath:[url path]]) { | 242 if (![[NSFileManager defaultManager] fileExistsAtPath:[url path]]) { |
| (...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 285 - (void)applicationDidBecomeActive { | 286 - (void)applicationDidBecomeActive { |
| 286 if (!_folderCreated || _isObservingFolder) { | 287 if (!_folderCreated || _isObservingFolder) { |
| 287 return; | 288 return; |
| 288 } | 289 } |
| 289 _isObservingFolder = YES; | 290 _isObservingFolder = YES; |
| 290 // Start observing for new files. | 291 // Start observing for new files. |
| 291 [NSFileCoordinator addFilePresenter:self]; | 292 [NSFileCoordinator addFilePresenter:self]; |
| 292 | 293 |
| 293 // There may already be files. Process them. | 294 // There may already be files. Process them. |
| 294 web::WebThread::PostTask( | 295 web::WebThread::PostTask( |
| 295 web::WebThread::FILE, FROM_HERE, base::BindBlock(^() { | 296 web::WebThread::FILE, FROM_HERE, base::BindBlockArc(^() { |
| 296 NSArray<NSURL*>* files = [[NSFileManager defaultManager] | 297 NSArray<NSURL*>* files = [[NSFileManager defaultManager] |
| 297 contentsOfDirectoryAtURL:[self presentedItemURL] | 298 contentsOfDirectoryAtURL:[self presentedItemURL] |
| 298 includingPropertiesForKeys:nil | 299 includingPropertiesForKeys:nil |
| 299 options:NSDirectoryEnumerationSkipsHiddenFiles | 300 options:NSDirectoryEnumerationSkipsHiddenFiles |
| 300 error:nil]; | 301 error:nil]; |
| 301 if ([files count] == 0) { | 302 if ([files count] == 0) { |
| 302 return; | 303 return; |
| 303 } | 304 } |
| 304 web::WebThread::PostTask( | 305 web::WebThread::PostTask( |
| 305 web::WebThread::UI, FROM_HERE, base::BindBlock(^() { | 306 web::WebThread::UI, FROM_HERE, base::BindBlockArc(^() { |
| 306 UMA_HISTOGRAM_COUNTS_100( | 307 UMA_HISTOGRAM_COUNTS_100( |
| 307 "IOS.ShareExtension.ReceivedEntriesCount", [files count]); | 308 "IOS.ShareExtension.ReceivedEntriesCount", [files count]); |
| 308 for (NSURL* fileURL : files) { | 309 for (NSURL* fileURL : files) { |
| 309 __block std::unique_ptr< | 310 __block std::unique_ptr< |
| 310 ReadingListModel::ScopedReadingListBatchUpdate> | 311 ReadingListModel::ScopedReadingListBatchUpdate> |
| 311 batchToken(_readingListModel->BeginBatchUpdates()); | 312 batchToken(_readingListModel->BeginBatchUpdates()); |
| 312 web::WebThread::PostTask( | 313 web::WebThread::PostTask( |
| 313 web::WebThread::FILE, FROM_HERE, base::BindBlock(^() { | 314 web::WebThread::FILE, FROM_HERE, base::BindBlockArc(^() { |
| 314 [self handleFileAtURL:fileURL | 315 [self handleFileAtURL:fileURL |
| 315 withCompletion:^{ | 316 withCompletion:^{ |
| 316 web::WebThread::PostTask(web::WebThread::UI, | 317 web::WebThread::PostTask(web::WebThread::UI, |
| 317 FROM_HERE, | 318 FROM_HERE, |
| 318 base::BindBlock(^() { | 319 base::BindBlockArc(^() { |
| 319 batchToken.reset(); | 320 batchToken.reset(); |
| 320 })); | 321 })); |
| 321 }]; | 322 }]; |
| 322 })); | 323 })); |
| 323 } | 324 } |
| 324 })); | 325 })); |
| 325 })); | 326 })); |
| 326 } | 327 } |
| 327 | 328 |
| 328 - (void)applicationWillResignActive { | 329 - (void)applicationWillResignActive { |
| 329 if (!_isObservingFolder) { | 330 if (!_isObservingFolder) { |
| 330 return; | 331 return; |
| 331 } | 332 } |
| 332 _isObservingFolder = NO; | 333 _isObservingFolder = NO; |
| 333 [NSFileCoordinator removeFilePresenter:self]; | 334 [NSFileCoordinator removeFilePresenter:self]; |
| 334 } | 335 } |
| 335 | 336 |
| 336 #pragma mark - | 337 #pragma mark - |
| 337 #pragma mark NSFilePresenter methods | 338 #pragma mark NSFilePresenter methods |
| 338 | 339 |
| 339 - (void)presentedSubitemDidChangeAtURL:(NSURL*)url { | 340 - (void)presentedSubitemDidChangeAtURL:(NSURL*)url { |
| 340 web::WebThread::PostTask(web::WebThread::FILE, FROM_HERE, | 341 web::WebThread::PostTask(web::WebThread::FILE, FROM_HERE, |
| 341 base::BindBlock(^() { | 342 base::BindBlockArc(^() { |
| 342 [self handleFileAtURL:url withCompletion:nil]; | 343 [self handleFileAtURL:url withCompletion:nil]; |
| 343 })); | 344 })); |
| 344 } | 345 } |
| 345 | 346 |
| 346 - (NSOperationQueue*)presentedItemOperationQueue { | 347 - (NSOperationQueue*)presentedItemOperationQueue { |
| 347 return [NSOperationQueue mainQueue]; | 348 return [NSOperationQueue mainQueue]; |
| 348 } | 349 } |
| 349 | 350 |
| 350 - (NSURL*)presentedItemURL { | 351 - (NSURL*)presentedItemURL { |
| 351 return app_group::ShareExtensionItemsFolder(); | 352 return app_group::ShareExtensionItemsFolder(); |
| 352 } | 353 } |
| 353 | 354 |
| 354 @end | 355 @end |
| OLD | NEW |