/*
* Nextcloud Android client application
*
* @author Tobias Kaminsky
* Copyright (C) 2019 Tobias Kaminsky
* Copyright (C) 2019 Nextcloud GmbH
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program 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 Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see .
*/
package com.owncloud.android.ui.asynctasks;
import android.os.AsyncTask;
import android.os.Build;
import android.print.PrintAttributes;
import android.print.PrintDocumentAdapter;
import android.print.PrintManager;
import com.owncloud.android.R;
import com.owncloud.android.lib.common.utils.Log_OC;
import com.owncloud.android.ui.activity.RichDocumentsWebView;
import com.owncloud.android.ui.adapter.PrintAdapter;
import com.owncloud.android.utils.DisplayUtils;
import org.apache.commons.httpclient.Header;
import org.apache.commons.httpclient.HttpClient;
import org.apache.commons.httpclient.HttpStatus;
import org.apache.commons.httpclient.methods.GetMethod;
import java.io.BufferedInputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.lang.ref.WeakReference;
import androidx.annotation.RequiresApi;
import static android.content.Context.PRINT_SERVICE;
@RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
public class PrintAsyncTask extends AsyncTask {
private static final String TAG = PrintAsyncTask.class.getSimpleName();
private static final String JOB_NAME = "Document";
private File file;
private String url;
private WeakReference richDocumentsWebViewWeakReference;
public PrintAsyncTask(File file, String url, WeakReference richDocumentsWebViewWeakReference) {
this.file = file;
this.url = url;
this.richDocumentsWebViewWeakReference = richDocumentsWebViewWeakReference;
}
@Override
protected void onPreExecute() {
richDocumentsWebViewWeakReference.get().runOnUiThread(
() -> richDocumentsWebViewWeakReference.get().showLoadingDialog(
richDocumentsWebViewWeakReference.get().getString(R.string.common_loading)));
super.onPreExecute();
}
@Override
protected Boolean doInBackground(Void... voids) {
HttpClient client = new HttpClient();
GetMethod getMethod = new GetMethod(url);
FileOutputStream fos;
try {
int status = client.executeMethod(getMethod);
if (status == HttpStatus.SC_OK) {
if (file.exists() && !file.delete()) {
return false;
}
file.getParentFile().mkdirs();
if (!file.getParentFile().exists()) {
Log_OC.d(TAG, file.getParentFile().getAbsolutePath() + " does not exist");
return false;
}
if (!file.createNewFile()) {
Log_OC.d(TAG, file.getAbsolutePath() + " could not be created");
return false;
}
BufferedInputStream bis = new BufferedInputStream(getMethod.getResponseBodyAsStream());
fos = new FileOutputStream(file);
long transferred = 0;
Header contentLength = getMethod.getResponseHeader("Content-Length");
long totalToTransfer = contentLength != null && contentLength.getValue().length() > 0 ?
Long.parseLong(contentLength.getValue()) : 0;
byte[] bytes = new byte[4096];
int readResult;
while ((readResult = bis.read(bytes)) != -1) {
fos.write(bytes, 0, readResult);
transferred += readResult;
}
// Check if the file is completed
if (transferred != totalToTransfer) {
return false;
}
if (getMethod.getResponseBodyAsStream() != null) {
getMethod.getResponseBodyAsStream().close();
}
}
} catch (IOException e) {
Log_OC.e(TAG, "Error reading file", e);
}
return true;
}
@Override
protected void onPostExecute(Boolean result) {
RichDocumentsWebView richDocumentsWebView = richDocumentsWebViewWeakReference.get();
richDocumentsWebView.dismissLoadingDialog();
PrintManager printManager = (PrintManager) richDocumentsWebView.getSystemService(PRINT_SERVICE);
if (!result || printManager == null) {
DisplayUtils.showSnackMessage(richDocumentsWebView,
richDocumentsWebView.getString(R.string.failed_to_print));
return;
}
PrintDocumentAdapter printAdapter = new PrintAdapter(file.getAbsolutePath());
printManager.print(JOB_NAME, printAdapter, new PrintAttributes.Builder().build());
}
}