package shts.jp.android.nogifeed.providers.dao;
import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.support.annotation.NonNull;
import java.util.ArrayList;
import rx.Observable;
import rx.Scheduler;
import rx.Subscriber;
import rx.schedulers.Schedulers;
import shts.jp.android.nogifeed.api.NogiFeedApiClient;
import shts.jp.android.nogifeed.models.Member;
import shts.jp.android.nogifeed.providers.NogiFeedContent;
public class Favorites extends ArrayList<Favorite> {
@NonNull
public static Favorites all(@NonNull Context context) {
Favorites favorites = new Favorites();
Cursor c = context.getContentResolver().query(
NogiFeedContent.Favorite.CONTENT_URI, null, null, null, null);
if (c == null || !c.moveToFirst()) return favorites;
try {
do {
int id = c.getInt(c.getColumnIndex(NogiFeedContent.Favorite.Key.ID));
int memberId = c.getInt(c.getColumnIndex(NogiFeedContent.Favorite.Key.MEMBER_ID));
favorites.add(new Favorite(id, memberId));
} while (c.moveToNext());
} finally {
c.close();
}
return favorites;
}
/**
* 指定したメンバーのお気に入り状況をトグルする
*
* @param context
* @param member
* @return トグルした結果を返却する。trueなら推しメン登録, falseなら推しメン解除
*/
public static void toggle(@NonNull Context context, @NonNull Member member) {
toggle(context, member.getId());
}
public static void toggle(@NonNull Context context, int memberId) {
if (exist(context, memberId)) {
remove(context, memberId);
} else {
add(context, memberId);
}
}
private static void add(@NonNull Context context, int memberId) {
ContentValues cv = new ContentValues();
cv.put(NogiFeedContent.Favorite.Key.MEMBER_ID, memberId);
context.getContentResolver().insert(NogiFeedContent.Favorite.CONTENT_URI, cv);
final Scheduler scheduler = Schedulers.newThread();
NogiFeedApiClient.addFavorite(memberId)
.subscribeOn(scheduler)
.observeOn(scheduler)
.subscribe(new Subscriber<Void>() {
@Override
public void onCompleted() {
unsubscribe();
}
@Override
public void onError(Throwable e) {
unsubscribe();
}
@Override
public void onNext(Void aVoid) {
}
});
}
private static void remove(@NonNull Context context, int memberId) {
String selection = NogiFeedContent.Favorite.Key.MEMBER_ID + "=?";
String[] selectionArgs = {String.valueOf(memberId)};
context.getContentResolver().delete(NogiFeedContent.Favorite.CONTENT_URI, selection, selectionArgs);
final Scheduler scheduler = Schedulers.newThread();
NogiFeedApiClient.removeFavorite(memberId)
.subscribeOn(scheduler)
.observeOn(scheduler)
.subscribe(new Subscriber<Void>() {
@Override
public void onCompleted() {
unsubscribe();
}
@Override
public void onError(Throwable e) {
unsubscribe();
}
@Override
public void onNext(Void aVoid) {
}
});
}
public static boolean exist(@NonNull Context context, @NonNull Member member) {
return exist(context, member.getId());
}
public static boolean exist(@NonNull Context context, int memberId) {
String selection = NogiFeedContent.Favorite.Key.MEMBER_ID + "=?";
String[] selectionArgs = {String.valueOf(memberId)};
Cursor c = context.getContentResolver().query(
NogiFeedContent.Favorite.CONTENT_URI,
NogiFeedContent.Favorite.sProjection,
selection, selectionArgs, null);
if (c == null || !c.moveToFirst()) return false;
try {
return c.getCount() == 1;
} finally {
c.close();
}
}
}