124d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard/* 224d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard * Copyright (C) 2013 The Android Open Source Project 324d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard * 424d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard * Licensed under the Apache License, Version 2.0 (the "License"); 524d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard * you may not use this file except in compliance with the License. 624d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard * You may obtain a copy of the License at 724d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard * 824d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard * http://www.apache.org/licenses/LICENSE-2.0 924d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard * 1024d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard * Unless required by applicable law or agreed to in writing, software 1124d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard * distributed under the License is distributed on an "AS IS" BASIS, 1224d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1324d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard * See the License for the specific language governing permissions and 1424d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard * limitations under the License. 1524d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard */ 1624d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard 1724d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroardpackage com.android.gallery3d.filtershow.pipeline; 1824d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard 1924d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroardimport android.content.res.Resources; 2024d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroardimport android.graphics.Bitmap; 2155d6abe58c3a7574a5d76c68ec5c21848848e399nicolasroardimport android.graphics.Rect; 2224d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroardimport android.net.Uri; 2324d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroardimport com.android.gallery3d.filtershow.cache.ImageLoader; 2424d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroardimport com.android.gallery3d.filtershow.filters.FiltersManager; 2524d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroardimport com.android.gallery3d.filtershow.tools.SaveImage; 2624d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard 2724d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroardimport java.io.File; 2824d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard 2924d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroardpublic class ImageSavingTask extends ProcessingTask { 3024d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard private ProcessingService mProcessingService; 3124d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard 3224d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard static class SaveRequest implements Request { 3324d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard Uri sourceUri; 3424d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard Uri selectedUri; 3524d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard File destinationFile; 3624d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard ImagePreset preset; 37568b8d8bade4aac4bc598dff9b76ced159c533bfRuben Brunk boolean flatten; 38077e718ecb6eb07997ad7c458d38eb21b3b2e6f9Ruben Brunk int quality; 3955d6abe58c3a7574a5d76c68ec5c21848848e399nicolasroard float sizeFactor; 403b311c3ffc7e9c6b7f5a89337787a656d6e10dbcnicolasroard Bitmap previewImage; 41eeed64b1fbdafe5c91ce36b3c5488c003fbb8fabnicolasroard boolean exit; 4224d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard } 4324d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard 4424d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard static class UpdateBitmap implements Update { 4524d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard Bitmap bitmap; 4624d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard } 4724d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard 4824d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard static class UpdateProgress implements Update { 4924d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard int max; 5024d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard int current; 5124d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard } 5224d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard 53ef4c2131c02f77d9fc508c7b26989a7f9b03862eJohn Hoford static class UpdatePreviewSaved implements Update { 54ef4c2131c02f77d9fc508c7b26989a7f9b03862eJohn Hoford Uri uri; 55eeed64b1fbdafe5c91ce36b3c5488c003fbb8fabnicolasroard boolean exit; 56ef4c2131c02f77d9fc508c7b26989a7f9b03862eJohn Hoford } 57ef4c2131c02f77d9fc508c7b26989a7f9b03862eJohn Hoford 5824d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard static class URIResult implements Result { 5924d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard Uri uri; 60eeed64b1fbdafe5c91ce36b3c5488c003fbb8fabnicolasroard boolean exit; 6124d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard } 6224d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard 6324d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard public ImageSavingTask(ProcessingService service) { 6424d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard mProcessingService = service; 6524d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard } 6624d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard 6724d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard public void saveImage(Uri sourceUri, Uri selectedUri, 683b311c3ffc7e9c6b7f5a89337787a656d6e10dbcnicolasroard File destinationFile, ImagePreset preset, 693b311c3ffc7e9c6b7f5a89337787a656d6e10dbcnicolasroard Bitmap previewImage, boolean flatten, 70eeed64b1fbdafe5c91ce36b3c5488c003fbb8fabnicolasroard int quality, float sizeFactor, boolean exit) { 7124d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard SaveRequest request = new SaveRequest(); 7224d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard request.sourceUri = sourceUri; 7324d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard request.selectedUri = selectedUri; 7424d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard request.destinationFile = destinationFile; 7524d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard request.preset = preset; 76568b8d8bade4aac4bc598dff9b76ced159c533bfRuben Brunk request.flatten = flatten; 77077e718ecb6eb07997ad7c458d38eb21b3b2e6f9Ruben Brunk request.quality = quality; 7855d6abe58c3a7574a5d76c68ec5c21848848e399nicolasroard request.sizeFactor = sizeFactor; 793b311c3ffc7e9c6b7f5a89337787a656d6e10dbcnicolasroard request.previewImage = previewImage; 80eeed64b1fbdafe5c91ce36b3c5488c003fbb8fabnicolasroard request.exit = exit; 8124d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard postRequest(request); 8224d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard } 8324d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard 8424d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard public Result doInBackground(Request message) { 8524d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard SaveRequest request = (SaveRequest) message; 8624d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard Uri sourceUri = request.sourceUri; 8724d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard Uri selectedUri = request.selectedUri; 8824d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard File destinationFile = request.destinationFile; 893b311c3ffc7e9c6b7f5a89337787a656d6e10dbcnicolasroard Bitmap previewImage = request.previewImage; 9024d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard ImagePreset preset = request.preset; 91568b8d8bade4aac4bc598dff9b76ced159c533bfRuben Brunk boolean flatten = request.flatten; 92eeed64b1fbdafe5c91ce36b3c5488c003fbb8fabnicolasroard final boolean exit = request.exit; 9324d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard // We create a small bitmap showing the result that we can 9424d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard // give to the notification 9524d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard UpdateBitmap updateBitmap = new UpdateBitmap(); 96ef4c2131c02f77d9fc508c7b26989a7f9b03862eJohn Hoford updateBitmap.bitmap = createNotificationBitmap(previewImage, sourceUri, preset); 9724d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard postUpdate(updateBitmap); 9824d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard SaveImage saveImage = new SaveImage(mProcessingService, sourceUri, 993b311c3ffc7e9c6b7f5a89337787a656d6e10dbcnicolasroard selectedUri, destinationFile, previewImage, 10024d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard new SaveImage.Callback() { 10124d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard @Override 102ef4c2131c02f77d9fc508c7b26989a7f9b03862eJohn Hoford public void onPreviewSaved(Uri uri){ 103ef4c2131c02f77d9fc508c7b26989a7f9b03862eJohn Hoford UpdatePreviewSaved previewSaved = new UpdatePreviewSaved(); 104ef4c2131c02f77d9fc508c7b26989a7f9b03862eJohn Hoford previewSaved.uri = uri; 105eeed64b1fbdafe5c91ce36b3c5488c003fbb8fabnicolasroard previewSaved.exit = exit; 106ef4c2131c02f77d9fc508c7b26989a7f9b03862eJohn Hoford postUpdate(previewSaved); 107ef4c2131c02f77d9fc508c7b26989a7f9b03862eJohn Hoford } 108ef4c2131c02f77d9fc508c7b26989a7f9b03862eJohn Hoford 109ef4c2131c02f77d9fc508c7b26989a7f9b03862eJohn Hoford @Override 11024d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard public void onProgress(int max, int current) { 11124d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard UpdateProgress updateProgress = new UpdateProgress(); 11224d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard updateProgress.max = max; 11324d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard updateProgress.current = current; 11424d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard postUpdate(updateProgress); 11524d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard } 11624d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard }); 117863b61f2ddd387473f588e2a9184eabb5a930096John Hoford Uri uri = saveImage.processAndSaveImage(preset, flatten, 118eeed64b1fbdafe5c91ce36b3c5488c003fbb8fabnicolasroard request.quality, request.sizeFactor, request.exit); 11924d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard URIResult result = new URIResult(); 12024d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard result.uri = uri; 121eeed64b1fbdafe5c91ce36b3c5488c003fbb8fabnicolasroard result.exit = request.exit; 12224d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard return result; 12324d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard } 12424d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard 12524d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard @Override 12624d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard public void onResult(Result message) { 12724d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard URIResult result = (URIResult) message; 128eeed64b1fbdafe5c91ce36b3c5488c003fbb8fabnicolasroard mProcessingService.completeSaveImage(result.uri, result.exit); 12924d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard } 13024d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard 13124d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard @Override 13224d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard public void onUpdate(Update message) { 133ef4c2131c02f77d9fc508c7b26989a7f9b03862eJohn Hoford if (message instanceof UpdatePreviewSaved){ 134ef4c2131c02f77d9fc508c7b26989a7f9b03862eJohn Hoford Uri uri = ((UpdatePreviewSaved) message).uri; 135eeed64b1fbdafe5c91ce36b3c5488c003fbb8fabnicolasroard boolean exit = ((UpdatePreviewSaved) message).exit; 136eeed64b1fbdafe5c91ce36b3c5488c003fbb8fabnicolasroard mProcessingService.completePreviewSaveImage(uri, exit); 137ef4c2131c02f77d9fc508c7b26989a7f9b03862eJohn Hoford } 13824d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard if (message instanceof UpdateBitmap) { 13924d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard Bitmap bitmap = ((UpdateBitmap) message).bitmap; 14024d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard mProcessingService.updateNotificationWithBitmap(bitmap); 14124d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard } 14224d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard if (message instanceof UpdateProgress) { 14324d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard UpdateProgress progress = (UpdateProgress) message; 14424d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard mProcessingService.updateProgress(progress.max, progress.current); 14524d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard } 14624d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard } 14724d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard 148ef4c2131c02f77d9fc508c7b26989a7f9b03862eJohn Hoford private Bitmap createNotificationBitmap(Bitmap preview, Uri sourceUri, ImagePreset preset) { 14924d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard int notificationBitmapSize = Resources.getSystem().getDimensionPixelSize( 15024d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard android.R.dimen.notification_large_icon_width); 151ef4c2131c02f77d9fc508c7b26989a7f9b03862eJohn Hoford if (preview != null) { 152ef4c2131c02f77d9fc508c7b26989a7f9b03862eJohn Hoford return Bitmap.createScaledBitmap(preview, 153ef4c2131c02f77d9fc508c7b26989a7f9b03862eJohn Hoford notificationBitmapSize, notificationBitmapSize, true); 154ef4c2131c02f77d9fc508c7b26989a7f9b03862eJohn Hoford } 15524d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard Bitmap bitmap = ImageLoader.loadConstrainedBitmap(sourceUri, getContext(), 15624d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard notificationBitmapSize, null, true); 15724d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard CachingPipeline pipeline = new CachingPipeline(FiltersManager.getManager(), "Thumb"); 15824d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard return pipeline.renderFinalImage(bitmap, preset); 15924d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard } 16024d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard 16124d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard} 162