package net.toload.main.hd.handler;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import net.toload.main.hd.R;
import net.toload.main.hd.limesettings.DBServer;
import android.app.ProgressDialog;
import android.content.Context;
import android.os.AsyncTask;
import com.dropbox.client2.DropboxAPI;
import com.dropbox.client2.DropboxAPI.UploadRequest;
import com.dropbox.client2.ProgressListener;
import com.dropbox.client2.exception.DropboxException;
import com.dropbox.client2.exception.DropboxFileSizeException;
import com.dropbox.client2.exception.DropboxIOException;
import com.dropbox.client2.exception.DropboxParseException;
import com.dropbox.client2.exception.DropboxPartialFileException;
import com.dropbox.client2.exception.DropboxServerException;
import com.dropbox.client2.exception.DropboxUnlinkedException;
/**
* Here we show uploading a file in a background thread, trying to show
* typical exception handling and flow of control for an app that uploads a
* file from Dropbox.
*/
public class DropboxDBBackup extends AsyncTask<Void, Long, Boolean> {
private DropboxAPI<?> mApi;
private String mPath;
private File mFile;
private long mFileLen;
private UploadRequest mRequest;
private Context mContext;
private final ProgressDialog mDialog;
private String mErrorMsg;
public final static int intentLIMEMenu = 0;
public DropboxDBBackup(Context context, DropboxAPI<?> api, String dropboxPath, File file) {
// We set the context this way so we don't accidentally leak activities
mContext = context.getApplicationContext();
mFileLen = file.length();
mApi = api;
mPath = dropboxPath;
mFile = file;
mDialog = new ProgressDialog(context);
mDialog.setMax(100);
mDialog.setCanceledOnTouchOutside(false);
mDialog.setTitle(mContext.getText(R.string.l3_initial_dropbox_backup_database));
mDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
mDialog.setProgress(0);
/*
mDialog.setButton(DialogInterface.BUTTON_NEGATIVE,
mContext.getText(R.string.lime_loading_cancel)
, new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
// This will cancel the putFile operation
mRequest.abort();
}
});
*/
mDialog.show();
}
@Override
protected Boolean doInBackground(Void... params) {
try {
// By creating a request, we get a handle to the putFile operation,
// so we can cancel it later if we want to
FileInputStream fis = new FileInputStream(mFile);
String path = mPath + mFile.getName();
mRequest = mApi.putFileOverwriteRequest(path, fis, mFile.length(),
new ProgressListener() {
@Override
public long progressInterval() {
// Update the progress bar every half-second or so
return 500;
}
@Override
public void onProgress(long bytes, long total) {
publishProgress(bytes);
}
});
if (mRequest != null) {
mRequest.upload();
return true;
}
} catch (DropboxUnlinkedException e) {
// This session wasn't authenticated properly or user unlinked
//mErrorMsg = "This app wasn't authenticated properly.";
mErrorMsg = mContext.getText(R.string.l3_initial_dropbox_authetication_failed).toString();
} catch (DropboxFileSizeException e) {
// File size too big to upload via the API
//mErrorMsg = "This file is too big to upload";
mErrorMsg = mContext.getText(R.string.l3_initial_dropbox_large).toString();
} catch (DropboxPartialFileException e) {
// We canceled the operation
mErrorMsg = "Upload canceled";
mErrorMsg = mContext.getText(R.string.l3_initial_dropbox_canceled).toString();
} catch (DropboxServerException e) {
// Server-side exception. These are examples of what could happen,
// but we don't do anything special with them here.
if (e.error == DropboxServerException._401_UNAUTHORIZED) {
// Unauthorized, so we should unlink them. You may want to
// automatically log the user out in this case.
} else if (e.error == DropboxServerException._403_FORBIDDEN) {
// Not allowed to access this
} else if (e.error == DropboxServerException._404_NOT_FOUND) {
// path not found (or if it was the thumbnail, can't be
// thumbnailed)
} else if (e.error == DropboxServerException._507_INSUFFICIENT_STORAGE) {
// user is over quota
} else {
// Something else
}
// This gets the Dropbox error, translated into the user's language
mErrorMsg = e.body.userError;
if (mErrorMsg == null) {
mErrorMsg = e.body.error;
}
} catch (DropboxIOException e) {
// Happens all the time, probably want to retry automatically.
//mErrorMsg = "Network error. Try again.";
mErrorMsg = mContext.getText(R.string.l3_initial_dropbox_failed).toString();
} catch (DropboxParseException e) {
// Probably due to Dropbox server restarting, should retry
//mErrorMsg = "Dropbox error. Try again.";
mErrorMsg = mContext.getText(R.string.l3_initial_dropbox_failed).toString();
} catch (DropboxException e) {
// Unknown error
//mErrorMsg = "Unknown error. Try again.";
mErrorMsg = mContext.getText(R.string.l3_initial_dropbox_failed).toString();
} catch (FileNotFoundException e) {
}
return false;
}
@Override
protected void onProgressUpdate(Long... progress) {
int percent = (int)(100.0*(double)progress[0]/mFileLen + 0.5);
mDialog.setProgress(percent);
}
@Override
protected void onPostExecute(Boolean result) {
mDialog.dismiss();
if (result) {
DBServer.showNotificationMessage(
mContext.getText(R.string.l3_initial_dropbox_backup_end)+ "", intentLIMEMenu);
} else {
DBServer.showNotificationMessage(mErrorMsg+ "", intentLIMEMenu);
}
}
}