package com.openfarmanager.android.core.network.dropbox; import android.database.Cursor; import com.dropbox.client2.ProgressListener; import com.dropbox.client2.android.AndroidAuthSession; import com.dropbox.client2.exception.DropboxException; import com.dropbox.client2.exception.DropboxServerException; import com.dropbox.client2.session.AccessTokenPair; import com.dropbox.client2.session.AppKeyPair; import com.dropbox.client2.session.Session; 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.DropboxFile; import com.openfarmanager.android.filesystem.FileProxy; import com.openfarmanager.android.model.NetworkAccount; import com.openfarmanager.android.model.NetworkEnum; import org.json.JSONException; import org.json.JSONObject; import static com.openfarmanager.android.utils.Extensions.*; import java.io.InputStream; import java.util.ArrayList; import java.util.List; public class DropboxAPI extends com.dropbox.client2.DropboxAPI<AndroidAuthSession> implements NetworkApi { private final static String APP_KEY = "6gnp59nffh0a5xj"; private final static String APP_SECRET = "rhm6h3u043l91vv"; private final static Session.AccessType ACCESS_TYPE = Session.AccessType.DROPBOX; public static final String DROPBOX_KEY = "dropbox_key"; public static final String DROPBOX_SECRET = "dropbox_secret"; private DropboxAccount mCurrentAuthenticatedAccount; public DropboxAPI(AndroidAuthSession session) { super(session); } public static AndroidAuthSession createSession() { return new AndroidAuthSession(new AppKeyPair(APP_KEY, APP_SECRET), ACCESS_TYPE); } public int getAuthorizedAccountsCount() { return NetworkAccountDbAdapter.count(NetworkEnum.Dropbox.ordinal()); } public void storeAccessTokens(String userName, AccessTokenPair tokens) { JSONObject authData = new JSONObject(); try { authData.put(DROPBOX_KEY, tokens.key); authData.put(DROPBOX_SECRET, tokens.secret); NetworkAccountDbAdapter.insert(userName, NetworkEnum.Dropbox.ordinal(), authData.toString()); } catch (JSONException e) { e.printStackTrace(); } } @Override public List<NetworkAccount> getAuthorizedAccounts() { List<NetworkAccount> accounts = new ArrayList<NetworkAccount>(); Cursor cursor = NetworkAccountDbAdapter.getAccounts(NetworkEnum.Dropbox.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()) { String authData = cursor.getString(idxAuthData); try { JSONObject data = new JSONObject(authData); DropboxAccount account = new DropboxAccount(cursor.getLong(idxId), cursor.getString(idxUserName), data.getString(DROPBOX_KEY), data.getString(DROPBOX_SECRET)); accounts.add(account); } catch (JSONException e) { e.printStackTrace(); } } } finally { cursor.close(); DataStorageHelper.closeDatabase(); } return accounts; } @Override public NetworkAccount newAccount() { return new DropboxAccount(-1, App.sInstance.getResources().getString(R.string.btn_new), null, null); } @Override public NetworkAccount getCurrentNetworkAccount() { return mCurrentAuthenticatedAccount; } @Override public String createDirectory(String baseDirectory, String newDirectoryName) throws Exception { Entry folder = createFolder(baseDirectory + "/" + newDirectoryName); return folder.path; } @Override public List<FileProxy> search(String path, String query) { List<FileProxy> searchResult = new ArrayList<FileProxy>(); List<com.dropbox.client2.DropboxAPI.Entry> entries = null; try { entries = search(isNullOrEmpty(path) ? "/" : path, query, -1, false); } catch (Exception e) { e.printStackTrace(); } if (entries != null && entries.size() > 0) { for (Entry entry : entries) { searchResult.add(new DropboxFile(entry)); } } return searchResult; } @Override public boolean rename(FileProxy file, String toPath) throws Exception { return move(file.getFullPath(), toPath) != null; } public void setAuthTokensToSession(DropboxAccount account) { mCurrentAuthenticatedAccount = account; getSession().setAccessTokenPair(new AccessTokenPair(account.getKey(), account.getSecret())); } public void deleteCurrentAccount() { NetworkAccountDbAdapter.delete(mCurrentAuthenticatedAccount.getId()); } @Override public void delete(FileProxy file) throws Exception { try { delete(file.getFullPath()); } catch (DropboxServerException e) { if (e.error == DropboxServerException._503_SERVICE_UNAVAILABLE) { delete(file); } else { throw e; } } } @Override public DropboxAPI.Entry putFileOverwrite(String path, InputStream is, long length, ProgressListener listener) throws DropboxException { try { return super.putFileOverwrite(path, is, length, listener); } catch (DropboxServerException e) { if (e.error == DropboxServerException._503_SERVICE_UNAVAILABLE) { return putFileOverwrite(path, is, length, listener); } else { throw e; } } } public static class DropboxAccount extends NetworkAccount { private String mKey; private String mSecret; public DropboxAccount(long id, String userName, JSONObject data) throws JSONException { this(id, userName, data.getString(DROPBOX_KEY), data.getString(DROPBOX_SECRET)); } public DropboxAccount(long id, String userName, String key, String secret) { mId = id; mUserName = userName; mKey = key; mSecret = secret; } public String getKey() { return mKey; } public String getSecret() { return mSecret; } @Override public NetworkEnum getNetworkType() { return NetworkEnum.Dropbox; } } }