package com.amaze.filemanager.utils;
import android.app.Activity;
import android.content.ActivityNotFoundException;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.content.pm.ResolveInfo;
import android.net.Uri;
import android.os.AsyncTask;
import android.util.Log;
import android.widget.Toast;
import com.amaze.filemanager.R;
import com.amaze.filemanager.activities.MainActivity;
import com.amaze.filemanager.database.CloudHandler;
import com.amaze.filemanager.exceptions.CloudPluginException;
import com.amaze.filemanager.filesystem.BaseFile;
import com.amaze.filemanager.ui.icons.MimeTypes;
import com.cloudrail.si.interfaces.CloudStorage;
import com.cloudrail.si.types.CloudMetaData;
import java.io.File;
import java.util.ArrayList;
import java.util.List;
import static com.amaze.filemanager.activities.MainActivity.dataUtils;
/**
* Created by vishal on 19/4/17.
*
* Class provides helper methods for cloud utilities
*/
public class CloudUtil {
public static ArrayList<BaseFile> listFiles(String path, CloudStorage cloudStorage, OpenMode openMode)
throws CloudPluginException {
ArrayList<BaseFile> baseFiles = new ArrayList<>();
String strippedPath = stripPath(openMode, path);
Log.d("PATH", path);
Log.d("STRIPPED PATH", strippedPath);
try {
for (CloudMetaData cloudMetaData : cloudStorage.getChildren(strippedPath)) {
Log.d("FOUND FILE: ", cloudMetaData.getName());
BaseFile baseFile = new BaseFile(path + "/" + cloudMetaData.getName(),
"", (cloudMetaData.getModifiedAt() == null)
? 0l : cloudMetaData.getModifiedAt(), cloudMetaData.getSize(),
cloudMetaData.getFolder());
baseFile.setName(cloudMetaData.getName());
baseFile.setMode(openMode);
baseFiles.add(baseFile);
Log.d("FILE", cloudMetaData.getName());
}
} catch (Exception e) {
e.printStackTrace();
throw new CloudPluginException();
}
return baseFiles;
}
/**
* Strips down the cloud path to remove any prefix
* @param openMode
* @return
*/
public static String stripPath(OpenMode openMode, String path) {
String strippedPath = path;
switch (openMode) {
case DROPBOX:
if (path.equals(CloudHandler.CLOUD_PREFIX_DROPBOX + "/")) {
// we're at root, just replace the prefix
strippedPath = path.replace(CloudHandler.CLOUD_PREFIX_DROPBOX, "");
} else {
// we're not at root, replace prefix + /
strippedPath = path.replace(CloudHandler.CLOUD_PREFIX_DROPBOX + "/", "");
}
break;
case BOX:
if (path.equals(CloudHandler.CLOUD_PREFIX_BOX + "/")) {
// we're at root, just replace the prefix
strippedPath = path.replace(CloudHandler.CLOUD_PREFIX_BOX, "");
} else {
// we're not at root, replace prefix + /
strippedPath = path.replace(CloudHandler.CLOUD_PREFIX_BOX + "/", "");
}
break;
case ONEDRIVE:
if (path.equals(CloudHandler.CLOUD_PREFIX_ONE_DRIVE + "/")) {
// we're at root, just replace the prefix
strippedPath = path.replace(CloudHandler.CLOUD_PREFIX_ONE_DRIVE, "");
} else {
// we're not at root, replace prefix + /
strippedPath = path.replace(CloudHandler.CLOUD_PREFIX_ONE_DRIVE + "/", "");
}
break;
case GDRIVE:
if (path.equals(CloudHandler.CLOUD_PREFIX_GOOGLE_DRIVE + "/")) {
// we're at root, just replace the prefix
strippedPath = path.replace(CloudHandler.CLOUD_PREFIX_GOOGLE_DRIVE, "");
} else {
// we're not at root, replace prefix + /
strippedPath = path.replace(CloudHandler.CLOUD_PREFIX_GOOGLE_DRIVE + "/", "");
}
break;
default:
break;
}
return strippedPath;
}
public static void launchCloud(final BaseFile baseFile, final OpenMode serviceType, final Activity activity) {
final CloudStreamer streamer = CloudStreamer.getInstance();
new Thread(new Runnable() {
@Override
public void run() {
try {
streamer.setStreamSrc(baseFile.getInputStream(activity), baseFile.getName(), baseFile.length(activity));
activity.runOnUiThread(new Runnable() {
public void run() {
try {
File file = new File(Uri.parse(CloudUtil.stripPath(serviceType, baseFile.getPath())).getPath());
Uri uri = Uri.parse(CloudStreamer.URL + Uri.fromFile(file).getEncodedPath());
Intent i = new Intent(Intent.ACTION_VIEW);
i.setDataAndType(uri, MimeTypes.getMimeType(file));
PackageManager packageManager = activity.getPackageManager();
List<ResolveInfo> resInfos = packageManager.queryIntentActivities(i, 0);
if (resInfos != null && resInfos.size() > 0)
activity.startActivity(i);
else
Toast.makeText(activity,
activity.getResources().getString(R.string.smb_launch_error),
Toast.LENGTH_SHORT).show();
} catch (ActivityNotFoundException e) {
e.printStackTrace();
}
}
});
} catch (Exception e) {
e.printStackTrace();
}
}
}).start();
}
/**
* Asynctask checks if the item pressed on is a cloud account, and if the token that
* is saved for it is invalid or not, in which case, we'll clear off the
* saved token and authenticate the user again
* @param path the path of item in drawer
* @param mainActivity reference to main activity to fire callbacks to delete/add connection
*/
public static void checkToken(String path, final MainActivity mainActivity) {
new AsyncTask<String, Void, Boolean>() {
OpenMode serviceType;
@Override
protected Boolean doInBackground(String... params) {
boolean isTokenValid = true;
String path = params[0];
if (path.startsWith(CloudHandler.CLOUD_PREFIX_DROPBOX)) {
// dropbox account
serviceType = OpenMode.DROPBOX;
CloudStorage cloudStorageDropbox = dataUtils.getAccount(OpenMode.DROPBOX);
try {
cloudStorageDropbox.getUserLogin();
} catch (Exception e) {
e.printStackTrace();
isTokenValid = false;
}
} else if (path.startsWith(CloudHandler.CLOUD_PREFIX_ONE_DRIVE)) {
serviceType = OpenMode.ONEDRIVE;
CloudStorage cloudStorageOneDrive = dataUtils.getAccount(OpenMode.ONEDRIVE);
try {
cloudStorageOneDrive.getUserLogin();
} catch (Exception e) {
e.printStackTrace();
isTokenValid = false;
}
} else if (path.startsWith(CloudHandler.CLOUD_PREFIX_BOX)) {
serviceType = OpenMode.BOX;
CloudStorage cloudStorageBox = dataUtils.getAccount(OpenMode.BOX);
try {
cloudStorageBox.getUserLogin();
} catch (Exception e) {
e.printStackTrace();
isTokenValid = false;
}
} else if (path.startsWith(CloudHandler.CLOUD_PREFIX_GOOGLE_DRIVE)) {
serviceType = OpenMode.GDRIVE;
CloudStorage cloudStorageGDrive = dataUtils.getAccount(OpenMode.GDRIVE);
try {
cloudStorageGDrive.getUserLogin();
} catch (Exception e) {
e.printStackTrace();
isTokenValid = false;
}
}
return isTokenValid;
}
@Override
protected void onPostExecute(Boolean aBoolean) {
super.onPostExecute(aBoolean);
if (!aBoolean) {
// delete account and create a new one
Toast.makeText(mainActivity, mainActivity.getResources()
.getString(R.string.cloud_token_lost), Toast.LENGTH_LONG).show();
mainActivity.deleteConnection(serviceType);
mainActivity.addConnection(serviceType);
}
}
}.execute(path);
}
}