commit
a015bf1b29
@ -25,7 +25,8 @@ public class SwiftPhotoGalleryPlugin: NSObject, FlutterPlugin {
|
|||||||
let newest = arguments["newest"] as! Bool
|
let newest = arguments["newest"] as! Bool
|
||||||
let skip = arguments["skip"] as? NSNumber
|
let skip = arguments["skip"] as? NSNumber
|
||||||
let take = arguments["take"] as? NSNumber
|
let take = arguments["take"] as? NSNumber
|
||||||
result(listMedia(albumId: albumId, mediumType: mediumType, newest: newest, skip: skip, take: take))
|
let lightWeight = arguments["lightWeight"] as? Bool
|
||||||
|
result(listMedia(albumId: albumId, mediumType: mediumType, newest: newest, skip: skip, take: take, lightWeight: lightWeight))
|
||||||
}
|
}
|
||||||
else if(call.method == "getMedium") {
|
else if(call.method == "getMedium") {
|
||||||
let arguments = call.arguments as! Dictionary<String, AnyObject>
|
let arguments = call.arguments as! Dictionary<String, AnyObject>
|
||||||
@ -37,6 +38,16 @@ public class SwiftPhotoGalleryPlugin: NSObject, FlutterPlugin {
|
|||||||
}
|
}
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
else if(call.method == "deleteMedium") {
|
||||||
|
let arguments = call.arguments as! Dictionary<String, AnyObject>
|
||||||
|
let mediumId = arguments["mediumId"] as! String
|
||||||
|
deleteMedium(
|
||||||
|
mediumId: mediumId,
|
||||||
|
completion: { (success: Bool, error: Error?) -> Void in
|
||||||
|
result(success)
|
||||||
|
}
|
||||||
|
)
|
||||||
|
}
|
||||||
else if(call.method == "getThumbnail") {
|
else if(call.method == "getThumbnail") {
|
||||||
let arguments = call.arguments as! Dictionary<String, AnyObject>
|
let arguments = call.arguments as! Dictionary<String, AnyObject>
|
||||||
let mediumId = arguments["mediumId"] as! String
|
let mediumId = arguments["mediumId"] as! String
|
||||||
@ -172,7 +183,7 @@ public class SwiftPhotoGalleryPlugin: NSObject, FlutterPlugin {
|
|||||||
return PHAsset.fetchAssets(in: collection ?? PHAssetCollection.init(), options: options).count
|
return PHAsset.fetchAssets(in: collection ?? PHAssetCollection.init(), options: options).count
|
||||||
}
|
}
|
||||||
|
|
||||||
private func listMedia(albumId: String, mediumType: String?, newest: Bool, skip: NSNumber?, take: NSNumber?) -> NSDictionary {
|
private func listMedia(albumId: String, mediumType: String?, newest: Bool, skip: NSNumber?, take: NSNumber?, lightWeight: Bool? = false) -> NSDictionary {
|
||||||
let fetchOptions = PHFetchOptions()
|
let fetchOptions = PHFetchOptions()
|
||||||
fetchOptions.predicate = predicateFromMediumType(mediumType: mediumType)
|
fetchOptions.predicate = predicateFromMediumType(mediumType: mediumType)
|
||||||
fetchOptions.sortDescriptors = [
|
fetchOptions.sortDescriptors = [
|
||||||
@ -193,7 +204,11 @@ public class SwiftPhotoGalleryPlugin: NSObject, FlutterPlugin {
|
|||||||
var items = [[String: Any?]]()
|
var items = [[String: Any?]]()
|
||||||
for index in start..<end {
|
for index in start..<end {
|
||||||
let asset = fetchResult.object(at: index) as PHAsset
|
let asset = fetchResult.object(at: index) as PHAsset
|
||||||
items.append(getMediumFromAsset(asset: asset))
|
if(lightWeight == true) {
|
||||||
|
items.append(getMediumFromAssetLightWeight(asset: asset))
|
||||||
|
} else {
|
||||||
|
items.append(getMediumFromAsset(asset: asset))
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return [
|
return [
|
||||||
@ -222,6 +237,30 @@ public class SwiftPhotoGalleryPlugin: NSObject, FlutterPlugin {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private func deleteMedium(mediumId: String, completion: @escaping (Bool, Error?) -> Void) {
|
||||||
|
let fetchOptions = PHFetchOptions()
|
||||||
|
if #available(iOS 9, *) {
|
||||||
|
fetchOptions.fetchLimit = 1
|
||||||
|
}
|
||||||
|
let assets: PHFetchResult = PHAsset.fetchAssets(withLocalIdentifiers: [mediumId], options: fetchOptions)
|
||||||
|
|
||||||
|
if assets.count <= 0 {
|
||||||
|
completion(false, NSError(domain: "photo_gallery", code: 404, userInfo: nil))
|
||||||
|
} else {
|
||||||
|
let asset: PHAsset = assets[0]
|
||||||
|
deleteAssets(assets: [asset]) { success, error in
|
||||||
|
completion(success, error)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private func deleteAssets(assets: [PHAsset], completion: @escaping (Bool, Error?) -> Void) {
|
||||||
|
PHPhotoLibrary.shared().performChanges({
|
||||||
|
PHAssetChangeRequest.deleteAssets(assets as NSFastEnumeration)
|
||||||
|
}, completionHandler: completion)
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
private func getThumbnail(
|
private func getThumbnail(
|
||||||
mediumId: String,
|
mediumId: String,
|
||||||
width: NSNumber?,
|
width: NSNumber?,
|
||||||
@ -435,6 +474,19 @@ public class SwiftPhotoGalleryPlugin: NSObject, FlutterPlugin {
|
|||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
private func getMediumFromAssetLightWeight(asset: PHAsset) -> [String: Any?] {
|
||||||
|
return [
|
||||||
|
"id": asset.localIdentifier,
|
||||||
|
"mediumType": toDartMediumType(value: asset.mediaType),
|
||||||
|
"height": asset.pixelHeight,
|
||||||
|
"width": asset.pixelWidth,
|
||||||
|
"duration": NSInteger(asset.duration * 1000),
|
||||||
|
"creationDate": (asset.creationDate != nil) ? NSInteger(asset.creationDate!.timeIntervalSince1970 * 1000) : nil,
|
||||||
|
"modifiedDate": (asset.modificationDate != nil) ? NSInteger(asset.modificationDate!.timeIntervalSince1970 * 1000) : nil
|
||||||
|
]
|
||||||
|
}
|
||||||
|
|
||||||
private func getMediumFromAssetAsync(asset: PHAsset, completion: @escaping ([String : Any?]?, Error?) -> Void) -> Void {
|
private func getMediumFromAssetAsync(asset: PHAsset, completion: @escaping ([String : Any?]?, Error?) -> Void) -> Void {
|
||||||
let mimeType = self.extractMimeTypeFromAsset(asset: asset)
|
let mimeType = self.extractMimeTypeFromAsset(asset: asset)
|
||||||
let filename = self.extractFilenameFromAsset(asset: asset)
|
let filename = self.extractFilenameFromAsset(asset: asset)
|
||||||
@ -587,6 +639,7 @@ public class SwiftPhotoGalleryPlugin: NSObject, FlutterPlugin {
|
|||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
private func cachePath() -> URL {
|
private func cachePath() -> URL {
|
||||||
let paths = FileManager.default.urls(for: .cachesDirectory, in: .userDomainMask)
|
let paths = FileManager.default.urls(for: .cachesDirectory, in: .userDomainMask)
|
||||||
let cacheFolder = paths[0].appendingPathComponent("photo_gallery")
|
let cacheFolder = paths[0].appendingPathComponent("photo_gallery")
|
||||||
|
@ -31,7 +31,9 @@ class PhotoGallery {
|
|||||||
'newest': newest,
|
'newest': newest,
|
||||||
'hideIfEmpty': hideIfEmpty,
|
'hideIfEmpty': hideIfEmpty,
|
||||||
});
|
});
|
||||||
return json.map<Album>((album) => Album.fromJson(album, mediumType, newest)).toList();
|
return json
|
||||||
|
.map<Album>((album) => Album.fromJson(album, mediumType, newest))
|
||||||
|
.toList();
|
||||||
}
|
}
|
||||||
|
|
||||||
/// List all available media in a specific album, support pagination of media
|
/// List all available media in a specific album, support pagination of media
|
||||||
@ -62,6 +64,21 @@ class PhotoGallery {
|
|||||||
return Medium.fromJson(json);
|
return Medium.fromJson(json);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Delete medium by medium id
|
||||||
|
static Future<bool> deleteMedium({
|
||||||
|
required String mediumId,
|
||||||
|
}) async {
|
||||||
|
if (!Platform.isIOS) {
|
||||||
|
throw UnsupportedError('This function is only available on iOS');
|
||||||
|
}
|
||||||
|
|
||||||
|
final result = await _channel.invokeMethod('deleteMedium', {
|
||||||
|
'mediumId': mediumId,
|
||||||
|
});
|
||||||
|
|
||||||
|
return result as bool;
|
||||||
|
}
|
||||||
|
|
||||||
/// Get medium thumbnail by medium id
|
/// Get medium thumbnail by medium id
|
||||||
static Future<List<int>> getThumbnail({
|
static Future<List<int>> getThumbnail({
|
||||||
required String mediumId,
|
required String mediumId,
|
||||||
|
Loading…
x
Reference in New Issue
Block a user