package com.openfarmanager.android.core.network.mediafire;
import android.database.Cursor;
import com.mediafire.sdk.MFApiException;
import com.mediafire.sdk.MFException;
import com.mediafire.sdk.MediaFire;
import com.mediafire.sdk.api.FileApi;
import com.mediafire.sdk.api.FolderApi;
import com.mediafire.sdk.api.responses.FileDeleteResponse;
import com.mediafire.sdk.api.responses.FileGetInfoResponse;
import com.mediafire.sdk.api.responses.FileUpdateResponse;
import com.mediafire.sdk.api.responses.FolderCreateResponse;
import com.mediafire.sdk.api.responses.FolderDeleteResponse;
import com.mediafire.sdk.api.responses.FolderGetContentsResponse;
import com.mediafire.sdk.api.responses.FolderUpdateResponse;
import com.mediafire.sdk.api.responses.data_models.File;
import com.mediafire.sdk.api.responses.data_models.Folder;
import com.microsoft.live.LiveOperation;
import com.openfarmanager.android.App;
import com.openfarmanager.android.R;
import com.openfarmanager.android.core.DataStorageHelper;
import com.openfarmanager.android.core.dbadapters.NetworkAccountDbAdapter;
import com.openfarmanager.android.core.network.NetworkApi;
import com.openfarmanager.android.filesystem.FileProxy;
import com.openfarmanager.android.filesystem.MediaFireFile;
import com.openfarmanager.android.filesystem.SkyDriveFile;
import com.openfarmanager.android.model.NetworkAccount;
import com.openfarmanager.android.model.NetworkEnum;
import com.openfarmanager.android.model.exeptions.NetworkException;
import org.json.JSONObject;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import static com.openfarmanager.android.utils.Extensions.isNullOrEmpty;
/**
* @author Vlad Namashko
*/
public class MediaFireApi implements NetworkApi {
public static final String APP_ID = "46558";
public static final String APP_KEY = "r3s0keye2wi0uucarqnuqerk4cw76h746gh3ernj";
public final static String VERSION = "1.4";
private MediaFire mMediaFire;
private MediaFireAccount mCurrentAccount;
public MediaFireApi() {
mMediaFire = new MediaFire(MediaFireApi.APP_ID, MediaFireApi.APP_KEY);
}
public void startNewSession(String userName, String password) throws MFApiException, MFException {
mMediaFire.startSessionWithEmail(userName, password, null);
mCurrentAccount = new MediaFireAccount(saveAccount(userName, password), userName, password);
}
public void startSession(MediaFireAccount account) throws MFApiException, MFException {
mMediaFire.startSessionWithEmail(account.getUserName(), account.getPassword(), null);
mCurrentAccount = account;
}
public void endSession() {
mMediaFire.endSession();
}
@Override
public int getAuthorizedAccountsCount() {
return NetworkAccountDbAdapter.count(NetworkEnum.MediaFire.ordinal());
}
@Override
public List<NetworkAccount> getAuthorizedAccounts() {
List<NetworkAccount> accounts = new ArrayList<>();
Cursor cursor = NetworkAccountDbAdapter.getAccounts(NetworkEnum.MediaFire.ordinal());
if (cursor == null) {
return accounts;
}
try {
int idxId = cursor.getColumnIndex(NetworkAccountDbAdapter.Columns.ID);
int idxUserName = cursor.getColumnIndex(NetworkAccountDbAdapter.Columns.USER_NAME);
int idxAuthData = cursor.getColumnIndex(NetworkAccountDbAdapter.Columns.AUTH_DATA);
while (cursor.moveToNext()) {
MediaFireAccount account = new MediaFireAccount(cursor.getLong(idxId), cursor.getString(idxUserName),
cursor.getString(idxAuthData));
accounts.add(account);
}
} finally {
cursor.close();
DataStorageHelper.closeDatabase();
}
return accounts;
}
public List<FileProxy> openDirectory(String path) {
return openDirectory(path, null);
}
public List<FileProxy> openDirectory(String path, String parentPath) {
List<FileProxy> files = new ArrayList<>();
LinkedHashMap<String, Object> query = new LinkedHashMap<>();
query.put("response_format", "json");
query.put("content_type", "folders");
query.put("chunk_size", 1000);
if (!path.equals("/")) {
query.put("folder_key", path);
}
try {
FolderGetContentsResponse response = FolderApi.getContent(mMediaFire, query, VERSION, FolderGetContentsResponse.class);
for (Folder folder : response.getFolderContents().folders) {
files.add(new MediaFireFile(folder, path, parentPath));
}
query.put("content_type", "files");
response = FolderApi.getContent(mMediaFire, query, VERSION, FolderGetContentsResponse.class);
for (File file : response.getFolderContents().files) {
files.add(new MediaFireFile(file, path, parentPath));
}
} catch (Exception ignore) {
ignore.printStackTrace();
}
return files;
}
@Override
public NetworkAccount newAccount() {
return new MediaFireAccount(-1, App.sInstance.getResources().getString(R.string.btn_new), null);
}
@Override
public NetworkAccount getCurrentNetworkAccount() {
return mCurrentAccount;
}
@Override
public void delete(FileProxy file) throws Exception {
boolean isDirectory = file.isDirectory();
LinkedHashMap<String, Object> query = new LinkedHashMap<>();
query.put(isDirectory ? "folder_key" : "quick_key", file.getId());
if (isDirectory) {
FolderApi.delete(mMediaFire, query, VERSION, FolderDeleteResponse.class);
} else {
FileApi.delete(mMediaFire, query, VERSION, FileDeleteResponse.class);
}
}
@Override
public String createDirectory(String baseDirectory, String newDirectoryName) throws Exception {
LinkedHashMap<String, Object> query = new LinkedHashMap<>();
query.put("foldername", newDirectoryName);
query.put("parent_key", baseDirectory);
FolderCreateResponse response = FolderApi.create(mMediaFire, query, VERSION, FolderCreateResponse.class);
return response.getFolderKey();
}
@Override
public List<FileProxy> search(String path, String query) {
return null;
}
public MediaFire getMediaFire() {
return mMediaFire;
}
@Override
public boolean rename(FileProxy file, String newPath) throws Exception {
boolean isDirectory = file.isDirectory();
String name = newPath.substring(newPath.lastIndexOf("/") + 1, newPath.length());
LinkedHashMap<String, Object> query = new LinkedHashMap<>();
query.put(isDirectory ? "folder_key" : "quick_key", file.getId());
query.put(isDirectory ? "foldername" : "filename", name);
if (isDirectory) {
FolderApi.update(mMediaFire, query, VERSION, FolderUpdateResponse.class);
} else {
FileApi.update(mMediaFire, query, VERSION, FileUpdateResponse.class);
}
return true;
}
public FileProxy getFileInfo(String id) {
LinkedHashMap<String, Object> query = new LinkedHashMap<>();
query.put("quick_key", id);
try {
FileGetInfoResponse response = FileApi.getInfo(mMediaFire, query, VERSION, FileGetInfoResponse.class);
return new MediaFireFile(response.getFileInfo());
} catch (Exception e) {
throw NetworkException.handleNetworkException(e);
}
}
public long saveAccount(String userName, String password) {
return NetworkAccountDbAdapter.insert(userName, NetworkEnum.MediaFire.ordinal(), password);
}
public static class MediaFireAccount extends NetworkAccount {
private String mPassword;
public MediaFireAccount(long id, String userName, String password) {
mId = id;
mUserName = userName;
mPassword = password;
}
public String getPassword() {
return mPassword;
}
@Override
public NetworkEnum getNetworkType() {
return NetworkEnum.MediaFire;
}
}
}