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