package com.orgzly.android.provider.clients;
import android.content.ContentProviderOperation;
import android.content.ContentUris;
import android.content.ContentValues;
import android.content.Context;
import android.content.OperationApplicationException;
import android.database.Cursor;
import android.net.Uri;
import android.os.RemoteException;
import android.util.Log;
import com.orgzly.android.provider.ProviderContract;
import com.orgzly.android.repos.Repo;
import com.orgzly.android.repos.RepoFactory;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;
public class ReposClient {
private static final String TAG = ReposClient.class.getName();
public static Uri insert(Context context, String url) {
ContentValues values = new ContentValues();
values.put(ProviderContract.Repos.Param.REPO_URL, url);
return context.getContentResolver().insert(ProviderContract.Repos.ContentUri.repos(), values);
}
public static int delete(Context context, long id) {
return context.getContentResolver().delete(
ContentUris.withAppendedId(ProviderContract.Repos.ContentUri.repos(), id), null, null);
}
public static Map<String, Repo> getAll(Context context) {
Cursor cursor = context.getContentResolver().query(
ProviderContract.Repos.ContentUri.repos(),
new String[] { ProviderContract.Repos.Param.REPO_URL },
null,
null,
null);
return getAll(context, cursor);
}
private static Map<String, Repo> getAll(Context context, Cursor cursor) {
Map<String, Repo> result = new HashMap<>();
try {
for (cursor.moveToFirst(); !cursor.isAfterLast(); cursor.moveToNext()) {
String repoUrl = cursor.getString(0);
Repo repo = RepoFactory.getFromUri(context, repoUrl);
if (repo != null) {
result.put(repoUrl, repo);
} else {
Log.e(TAG, "Unsupported repository URL\"" + repoUrl + "\"");
}
}
} finally {
cursor.close();
}
return result;
}
public static long getId(Context context, String url) {
Cursor cursor = context.getContentResolver().query(
ProviderContract.Repos.ContentUri.repos(),
new String[] { ProviderContract.Repos.Param._ID },
ProviderContract.Repos.Param.REPO_URL + "=?",
new String[] { url },
null);
try {
if (cursor.moveToFirst()) {
return cursor.getLong(0);
} else {
return 0;
}
} finally {
cursor.close();
}
}
public static String getUrl(Context context, long id) {
Uri uri = ContentUris.withAppendedId(ProviderContract.Repos.ContentUri.repos(), id);
Cursor cursor = context.getContentResolver().query(uri, new String[] { ProviderContract.Repos.Param.REPO_URL }, null, null, null);
try {
if (cursor.moveToFirst()) {
return cursor.getString(0);
} else {
return null;
}
} finally {
cursor.close();
}
}
/**
* Since old repository URL could be used, do not actually update the existing record,
* but create a new one.
*/
public static int updateUrl(Context mContext, long id, String url) {
ArrayList<ContentProviderOperation> ops = new ArrayList<>();
ops.add(ContentProviderOperation
.newDelete(ContentUris.withAppendedId(ProviderContract.Repos.ContentUri.repos(), id))
.build());
ops.add(ContentProviderOperation
.newInsert(ProviderContract.Repos.ContentUri.repos())
.withValue(ProviderContract.Repos.Param.REPO_URL, url)
.build());
try {
mContext.getContentResolver().applyBatch(ProviderContract.AUTHORITY, ops);
} catch (RemoteException | OperationApplicationException e) {
e.printStackTrace();
throw new RuntimeException(e);
}
return 1;
}
}