package com.tomclaw.mandarin.core;
import android.content.ContentResolver;
import android.content.ContentValues;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.text.TextUtils;
import com.tomclaw.mandarin.im.SearchOptionsBuilder;
import com.tomclaw.mandarin.im.icq.AccountAvatarRequest;
import com.tomclaw.mandarin.im.icq.BuddyAddRequest;
import com.tomclaw.mandarin.im.icq.BuddyAvatarRequest;
import com.tomclaw.mandarin.im.icq.BuddyIgnoreStateRequest;
import com.tomclaw.mandarin.im.icq.BuddyInfoRequest;
import com.tomclaw.mandarin.im.icq.BuddyPresenceRequest;
import com.tomclaw.mandarin.im.icq.BuddyRemoveRequest;
import com.tomclaw.mandarin.im.icq.BuddyRenameRequest;
import com.tomclaw.mandarin.im.icq.BuddySearchRequest;
import com.tomclaw.mandarin.im.icq.EndSessionRequest;
import com.tomclaw.mandarin.im.icq.IcqFileDownloadRequest;
import com.tomclaw.mandarin.im.icq.IcqFileUploadRequest;
import com.tomclaw.mandarin.im.icq.IcqMessageRequest;
import com.tomclaw.mandarin.im.icq.IcqSearchOptionsBuilder;
import com.tomclaw.mandarin.im.icq.IcqTypingRequest;
import com.tomclaw.mandarin.im.icq.LargeAvatarRequest;
import com.tomclaw.mandarin.im.icq.SearchAvatarRequest;
import com.tomclaw.mandarin.im.icq.SetMoodRequest;
import com.tomclaw.mandarin.im.icq.SetPermitDenyRequest;
import com.tomclaw.mandarin.im.icq.SetStateRequest;
import com.tomclaw.mandarin.im.icq.UpdateInfoRequest;
import com.tomclaw.mandarin.im.icq.UploadAvatarRequest;
import com.tomclaw.mandarin.im.icq.UserInfoRequest;
import com.tomclaw.mandarin.util.GsonSingleton;
import com.tomclaw.mandarin.util.QueryBuilder;
import java.util.List;
/**
* Created with IntelliJ IDEA.
* User: solkin
* Date: 6/12/13
* Time: 1:30 PM
*/
public class RequestHelper {
public static void requestMessage(ContentResolver contentResolver, int buddyDbId, String cookie, String message) {
// Obtain account db id.
// TODO: out this method.
Cursor cursor = contentResolver.query(Settings.BUDDY_RESOLVER_URI, null,
GlobalProvider.ROW_AUTO_ID + "='" + buddyDbId + "'", null, null);
// Oh, cursor may be null sometimes.
if (cursor != null) {
// Cursor may have more than only one entry.
// TODO: check for at least one buddy present.
if (cursor.moveToFirst()) {
int accountDbId = cursor.getInt(cursor.getColumnIndex(GlobalProvider.ROSTER_BUDDY_ACCOUNT_DB_ID));
String buddyId = cursor.getString(cursor.getColumnIndex(GlobalProvider.ROSTER_BUDDY_ID));
requestMessage(contentResolver, accountDbId, buddyId, cookie, message);
}
cursor.close();
}
}
public static void requestMessage(ContentResolver contentResolver, int accountDbId, String buddyId,
String cookie, String message) {
IcqMessageRequest messageRequest = new IcqMessageRequest(buddyId, message, cookie);
insertRequest(contentResolver, Request.REQUEST_TYPE_SHORT, accountDbId, messageRequest);
}
public static void leaveOtherSessions(ContentResolver contentResolver, int accountDbId) {
IcqMessageRequest messageRequest = new IcqMessageRequest("aolsystemmsg", "1", "aolsystemmsg_auto_cookie");
insertRequest(contentResolver, Request.REQUEST_TYPE_SHORT, accountDbId, messageRequest);
}
public static void endSession(ContentResolver contentResolver, int accountDbId) {
EndSessionRequest endSessionRequest = new EndSessionRequest();
insertRequest(contentResolver, Request.REQUEST_TYPE_SHORT, accountDbId, endSessionRequest);
}
public static void requestBuddyAvatar(ContentResolver contentResolver, int accountDbId,
String buddyId, String url) {
requestBuddyAvatar(ContentResolverLayer.getInstance(contentResolver), accountDbId, buddyId, url);
}
public static void requestBuddyAvatar(SQLiteDatabase sqLiteDatabase, int accountDbId,
String buddyId, String url) {
requestBuddyAvatar(SQLiteDatabaseLayer.getInstance(sqLiteDatabase), accountDbId, buddyId, url);
}
public static void requestBuddyAvatar(DatabaseLayer databaseLayer, int accountDbId,
String buddyId, String url) {
BuddyAvatarRequest buddyAvatarRequest = new BuddyAvatarRequest(buddyId, url);
insertRequest(databaseLayer, Request.REQUEST_TYPE_DOWNLOAD, accountDbId,
url, buddyAvatarRequest);
}
public static void requestFileSend(ContentResolver contentResolver, int buddyDbId,
String cookie, String tag, UriFile uriFile) {
Cursor cursor = contentResolver.query(Settings.BUDDY_RESOLVER_URI, null,
GlobalProvider.ROW_AUTO_ID + "='" + buddyDbId + "'", null, null);
// Oh, cursor may be null sometimes.
if (cursor != null) {
if (cursor.moveToFirst()) {
int accountDbId = cursor.getInt(cursor.getColumnIndex(GlobalProvider.ROSTER_BUDDY_ACCOUNT_DB_ID));
String buddyId = cursor.getString(cursor.getColumnIndex(GlobalProvider.ROSTER_BUDDY_ID));
RangedUploadRequest uploadRequest = new IcqFileUploadRequest(uriFile, buddyId, cookie);
insertRequest(contentResolver, Request.REQUEST_TYPE_UPLOAD, accountDbId, tag, uploadRequest);
}
cursor.close();
}
}
public static void requestFileReceive(ContentResolver contentResolver, int buddyDbId,
String cookie, long time, String fileId, String fileUrl,
String originalMessage, String tag) {
Cursor cursor = contentResolver.query(Settings.BUDDY_RESOLVER_URI, null,
GlobalProvider.ROW_AUTO_ID + "='" + buddyDbId + "'", null, null);
// Oh, cursor may be null sometimes.
if (cursor != null) {
if (cursor.moveToFirst()) {
int accountDbId = cursor.getInt(cursor.getColumnIndex(GlobalProvider.ROSTER_BUDDY_ACCOUNT_DB_ID));
String buddyId = cursor.getString(cursor.getColumnIndex(GlobalProvider.ROSTER_BUDDY_ID));
RangedDownloadRequest downloadRequest = new IcqFileDownloadRequest(
buddyId, cookie, time, fileId, fileUrl, originalMessage, tag);
insertRequest(contentResolver, Request.REQUEST_TYPE_DOWNLOAD, accountDbId, tag, downloadRequest);
}
cursor.close();
}
}
public static void requestAccountAvatar(ContentResolver contentResolver, int accountDbId, String url) {
AccountAvatarRequest accountAvatarRequest = new AccountAvatarRequest(url);
insertRequest(contentResolver, Request.REQUEST_TYPE_DOWNLOAD, accountDbId,
url, accountAvatarRequest);
}
public static void requestBuddyInfo(ContentResolver contentResolver, String appSession,
int accountDbId, String buddyId) {
BuddyInfoRequest buddyInfoRequest = new BuddyInfoRequest(buddyId);
insertRequest(contentResolver, Request.REQUEST_TYPE_SHORT, false, accountDbId, appSession, buddyInfoRequest);
}
public static void requestUserInfo(ContentResolver contentResolver, String appSession, int accountDbId) {
Cursor cursor = contentResolver.query(Settings.ACCOUNT_RESOLVER_URI, null,
GlobalProvider.ROW_AUTO_ID + "='" + accountDbId + "'", null, null);
// Oh, cursor may be null sometimes.
if (cursor != null) {
// Cursor may have more than only one entry.
if (cursor.moveToFirst()) {
String userId = cursor.getString(cursor.getColumnIndex(GlobalProvider.ACCOUNT_USER_ID));
UserInfoRequest userInfoRequest = new UserInfoRequest(userId);
insertRequest(contentResolver, Request.REQUEST_TYPE_SHORT, false, accountDbId, appSession, userInfoRequest);
}
cursor.close();
}
}
public static void requestSetState(ContentResolver contentResolver, int accountDbId, int statusIndex) {
SetStateRequest setStateRequest = new SetStateRequest(statusIndex);
String tag = accountDbId + SetStateRequest.class.getName();
insertRequest(contentResolver, Request.REQUEST_TYPE_SHORT, true, accountDbId, tag, setStateRequest);
}
public static void requestSetMood(ContentResolver contentResolver, int accountDbId, int statusIndex,
String statusTitle, String statusMessage) {
SetMoodRequest setMoodRequest = new SetMoodRequest(statusIndex, statusTitle, statusMessage);
insertRequest(contentResolver, Request.REQUEST_TYPE_SHORT, accountDbId, setMoodRequest);
}
public static void requestTyping(ContentResolver contentResolver, int buddyDbId, boolean isTyping) {
Cursor cursor = contentResolver.query(Settings.BUDDY_RESOLVER_URI, null,
GlobalProvider.ROW_AUTO_ID + "='" + buddyDbId + "'", null, null);
// Oh, cursor may be null sometimes.
if (cursor != null) {
// Cursor may have more than only one entry.
if (cursor.moveToFirst()) {
int accountDbId = cursor.getInt(cursor.getColumnIndex(GlobalProvider.ROSTER_BUDDY_ACCOUNT_DB_ID));
String buddyId = cursor.getString(cursor.getColumnIndex(GlobalProvider.ROSTER_BUDDY_ID));
IcqTypingRequest typingRequest = new IcqTypingRequest(buddyId, isTyping);
insertRequest(contentResolver, Request.REQUEST_TYPE_SHORT, accountDbId, typingRequest);
}
cursor.close();
}
}
public static void requestAdd(ContentResolver contentResolver, int accountDbId, String buddyId,
String groupName, String authorizationMsg) {
BuddyAddRequest buddyAddRequest = new BuddyAddRequest(
buddyId, groupName, authorizationMsg);
insertRequest(contentResolver, Request.REQUEST_TYPE_SHORT, accountDbId, buddyAddRequest);
}
public static void requestRename(ContentResolver contentResolver, int accountDbId, String buddyId,
String buddyPreviousNameNick, String buddySatisfiedNick) {
BuddyRenameRequest buddyRenameRequest = new BuddyRenameRequest(
buddyId, buddyPreviousNameNick, buddySatisfiedNick);
insertRequest(contentResolver, Request.REQUEST_TYPE_SHORT, accountDbId, buddyRenameRequest);
}
public static void requestRemove(ContentResolver contentResolver, int accountDbId,
String groupName, String buddyId) {
BuddyRemoveRequest buddyRemoveRequest = new BuddyRemoveRequest(groupName, buddyId);
insertRequest(contentResolver, Request.REQUEST_TYPE_SHORT, accountDbId, buddyRemoveRequest);
}
public static void requestSearch(ContentResolver contentResolver, String appSession, int accountDbId,
SearchOptionsBuilder optionsBuilder, int offset) {
BuddySearchRequest buddySearchRequest = new BuddySearchRequest((IcqSearchOptionsBuilder) optionsBuilder, 20, offset, "RU");
insertRequest(contentResolver, Request.REQUEST_TYPE_SHORT, false, accountDbId, appSession, buddySearchRequest);
}
public static void requestBuddyPresence(ContentResolver contentResolver, String appSession, int accountDbId,
int total, int skipped, List<String> buddyIds,
IcqSearchOptionsBuilder searchOptions) {
BuddyPresenceRequest request = new BuddyPresenceRequest(total, skipped, buddyIds, searchOptions);
insertRequest(contentResolver, Request.REQUEST_TYPE_SHORT, false, accountDbId, appSession, request);
}
public static void requestSearchAvatar(ContentResolver contentResolver, int accountDbId, String buddyId,
String appSession, String url) {
SearchAvatarRequest searchAvatarRequest = new SearchAvatarRequest(buddyId, url);
insertRequest(contentResolver, Request.REQUEST_TYPE_DOWNLOAD, false, accountDbId,
url, appSession, searchAvatarRequest);
}
public static void requestLargeAvatar(ContentResolver contentResolver, int accountDbId, String buddyId,
String appSession, String url) {
LargeAvatarRequest largeAvatarRequest = new LargeAvatarRequest(buddyId, url);
insertRequest(contentResolver, Request.REQUEST_TYPE_DOWNLOAD, false, accountDbId,
url, appSession, largeAvatarRequest);
}
public static void requestUploadAvatar(ContentResolver contentResolver, int accountDbId, String hash) {
// Yes, this is upload operation, but is very tiny upload and be better in short queue.
UploadAvatarRequest uploadAvatarRequest = new UploadAvatarRequest(UploadAvatarRequest.TYPE_LARGE_AVATAR, hash);
insertRequest(contentResolver, Request.REQUEST_TYPE_SHORT, accountDbId, uploadAvatarRequest);
}
public static void updateUserInfo(ContentResolver contentResolver, int accountDbId, String friendlyName,
String firstName, String lastName, int gender, long birthDate,
String city, String webSite,
String aboutMe) {
UpdateInfoRequest updateInfoRequest = new UpdateInfoRequest(friendlyName, firstName,
lastName, gender, birthDate, city, webSite, aboutMe);
insertRequest(contentResolver, Request.REQUEST_TYPE_SHORT, accountDbId, updateInfoRequest);
}
public static void updateIgnoreBuddyState(ContentResolver contentResolver, int accountDbId,
String buddyId, boolean ignore) {
SetPermitDenyRequest setPermitDenyRequest = new SetPermitDenyRequest();
if (ignore) {
setPermitDenyRequest.setPdIgnore(buddyId);
} else {
setPermitDenyRequest.setPdIgnoreRemove(buddyId);
}
insertRequest(contentResolver, Request.REQUEST_TYPE_SHORT, accountDbId, setPermitDenyRequest);
}
public static void requestBuddyIgnoreState(ContentResolver contentResolver, String appSession,
int accountDbId, String buddyId) {
BuddyIgnoreStateRequest buddyIgnoreStateRequest = new BuddyIgnoreStateRequest(buddyId);
insertRequest(contentResolver, Request.REQUEST_TYPE_SHORT, false,
accountDbId, appSession, buddyIgnoreStateRequest);
}
private static void insertRequest(ContentResolver contentResolver, int type, boolean isPersistent,
int accountDbId, String appSession, Request request) {
insertRequest(contentResolver, type, isPersistent, accountDbId, null, appSession, request);
}
private static void insertRequest(ContentResolver contentResolver, int type, int accountDbId,
Request request) {
insertRequest(contentResolver, type, true, accountDbId, null, null, request);
}
private static void insertRequest(ContentResolver contentResolver, int type, int accountDbId,
String tag, Request request) {
insertRequest(contentResolver, type, true, accountDbId, tag, null, request);
}
private static void insertRequest(ContentResolver contentResolver, int type, boolean isPersistent,
int accountDbId, String tag, String appSession, Request request) {
insertRequest(ContentResolverLayer.getInstance(contentResolver), type,
isPersistent, accountDbId, tag, appSession, request);
}
private static void insertRequest(SQLiteDatabase sqLiteDatabase, int type, boolean isPersistent,
int accountDbId, String tag, String appSession, Request request) {
insertRequest(SQLiteDatabaseLayer.getInstance(sqLiteDatabase), type,
isPersistent, accountDbId, tag, appSession, request);
}
private static void insertRequest(DatabaseLayer databaseLayer, int type, int accountDbId,
String tag, Request request) {
insertRequest(databaseLayer, type, true, accountDbId, tag, null, request);
}
private static void insertRequest(DatabaseLayer databaseLayer, int type, boolean isPersistent,
int accountDbId, String tag, String appSession, Request request) {
// Writing to requests database.
ContentValues contentValues = new ContentValues();
contentValues.put(GlobalProvider.REQUEST_TYPE, type);
contentValues.put(GlobalProvider.REQUEST_CLASS, request.getClass().getName());
contentValues.put(GlobalProvider.REQUEST_PERSISTENT, isPersistent ? 1 : 0);
contentValues.put(GlobalProvider.REQUEST_ACCOUNT_DB_ID, accountDbId);
contentValues.put(GlobalProvider.REQUEST_STATE, Request.REQUEST_PENDING);
if (!TextUtils.isEmpty(appSession)) {
contentValues.put(GlobalProvider.REQUEST_SESSION, appSession);
}
if (!TextUtils.isEmpty(tag)) {
Cursor cursor = null;
try {
// Obtain existing request.
QueryBuilder queryBuilder = new QueryBuilder()
.columnEquals(GlobalProvider.REQUEST_TAG, tag);
cursor = databaseLayer.query(Settings.REQUEST_RESOLVER_URI, queryBuilder);
// Checking for at least one such download request exist.
if (cursor == null || cursor.moveToFirst()) {
return;
}
} finally {
if (cursor != null) {
cursor.close();
}
}
contentValues.put(GlobalProvider.REQUEST_TAG, tag);
}
contentValues.put(GlobalProvider.REQUEST_BUNDLE, GsonSingleton.getInstance().toJson(request));
databaseLayer.insert(Settings.REQUEST_RESOLVER_URI, contentValues);
}
public static void startDelayedRequest(ContentResolver contentResolver, String tag) {
// Writing to requests database.
ContentValues contentValues = new ContentValues();
contentValues.put(GlobalProvider.REQUEST_STATE, Request.REQUEST_PENDING);
contentResolver.update(Settings.REQUEST_RESOLVER_URI, contentValues,
GlobalProvider.REQUEST_TAG + "='" + tag + "'", null);
}
}