/*******************************************************************************
* This file is part of RedReader.
*
* RedReader is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* RedReader is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with RedReader. If not, see <http://www.gnu.org/licenses/>.
******************************************************************************/
package org.quantumbadger.redreader.image;
import android.content.Intent;
import android.net.Uri;
import android.os.Environment;
import android.support.v7.app.AppCompatActivity;
import org.quantumbadger.redreader.R;
import org.quantumbadger.redreader.account.RedditAccount;
import org.quantumbadger.redreader.account.RedditAccountManager;
import org.quantumbadger.redreader.activities.BaseActivity;
import org.quantumbadger.redreader.activities.BugReportActivity;
import org.quantumbadger.redreader.cache.CacheManager;
import org.quantumbadger.redreader.cache.CacheRequest;
import org.quantumbadger.redreader.cache.downloadstrategy.DownloadStrategyIfNotCached;
import org.quantumbadger.redreader.common.Constants;
import org.quantumbadger.redreader.common.General;
import org.quantumbadger.redreader.common.LinkHandler;
import org.quantumbadger.redreader.common.RRError;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.util.UUID;
/**
* Created by Marco on 01.03.2017.
*/
public class SaveImageCallback implements BaseActivity.PermissionCallback {
private final AppCompatActivity activity;
private final String uri;
public SaveImageCallback(final AppCompatActivity activity, final String uri){
this.activity = activity;
this.uri = uri;
}
@Override
public void onPermissionGranted() {
final RedditAccount anon = RedditAccountManager.getAnon();
LinkHandler.getImageInfo(activity, uri, Constants.Priority.IMAGE_VIEW, 0, new GetImageInfoListener() {
@Override
public void onFailure(final @CacheRequest.RequestFailureType int type, final Throwable t, final Integer status, final String readableMessage) {
final RRError error = General.getGeneralErrorForFailure(activity, type, t, status, uri);
General.showResultDialog(activity, error);
}
@Override
public void onSuccess(final ImageInfo info) {
CacheManager.getInstance(activity).makeRequest(new CacheRequest(
General.uriFromString(info.urlOriginal),
anon,
null,
Constants.Priority.IMAGE_VIEW,
0,
DownloadStrategyIfNotCached.INSTANCE,
Constants.FileType.IMAGE,
CacheRequest.DOWNLOAD_QUEUE_IMMEDIATE,
false,
false,
activity) {
@Override
protected void onCallbackException(Throwable t) {
BugReportActivity.handleGlobalError(context, t);
}
@Override
protected void onDownloadNecessary() {
General.quickToast(context, R.string.download_downloading);
}
@Override
protected void onDownloadStarted() {
}
@Override
protected void onFailure(
@CacheRequest.RequestFailureType int type,
Throwable t,
Integer status,
String readableMessage) {
final RRError error = General.getGeneralErrorForFailure(context, type, t, status, url.toString());
General.showResultDialog(activity, error);
}
@Override
protected void onProgress(
boolean authorizationInProgress,
long bytesRead,
long totalBytes) {
}
@Override
protected void onSuccess(
CacheManager.ReadableCacheFile cacheFile,
long timestamp,
UUID session,
boolean fromCache,
String mimetype) {
String filename = General.filenameFromString(info.urlOriginal);
File dst = new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES), filename);
if(dst.exists()) {
int count = 0;
while(dst.exists()) {
count++;
dst = new File(
Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES),
count + "_" + filename.substring(1));
}
}
try {
final InputStream cacheFileInputStream = cacheFile.getInputStream();
if(cacheFileInputStream == null) {
notifyFailure(CacheRequest.REQUEST_FAILURE_CACHE_MISS, null, null, "Could not find cached image");
return;
}
General.copyFile(cacheFileInputStream, dst);
} catch(IOException e) {
notifyFailure(CacheRequest.REQUEST_FAILURE_STORAGE, e, null, "Could not copy file");
return;
}
activity.sendBroadcast(new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE,
Uri.parse("file://" + dst.getAbsolutePath()))
);
General.quickToast(context, context.getString(R.string.action_save_image_success) + " " + dst.getAbsolutePath());
}
});
}
@Override
public void onNotAnImage() {
General.quickToast(activity, R.string.selected_link_is_not_image);
}
});
}
@Override
public void onPermissionDenied() {
General.quickToast(activity, R.string.save_image_permission_denied);
}
}