package org.yaxim.androidclient.data;
import org.yaxim.androidclient.data.RosterProvider.RosterConstants;
import org.yaxim.androidclient.service.IXMPPMucService;
import org.yaxim.androidclient.util.XMPPHelper;
import android.content.ComponentName;
import android.content.ContentValues;
import android.content.Context;
import android.content.Intent;
import android.content.ServiceConnection;
import android.database.Cursor;
import android.net.Uri;
import android.os.IBinder;
import android.os.RemoteException;
public class ChatRoomHelper {
public static boolean addRoom(Context ctx, String jid, String password, String nickname) {
ContentValues cv = new ContentValues();
cv.put(RosterProvider.RosterConstants.JID, jid.toLowerCase());
cv.put(RosterProvider.RosterConstants.NICKNAME, nickname);
cv.put(RosterProvider.RosterConstants.PASSWORD, password);
Uri ret = ctx.getContentResolver().insert(RosterProvider.MUCS_URI, cv);
return (ret != null);
}
public static boolean removeRoom(Context ctx, String jid) {
int deleted = ctx.getContentResolver().delete(RosterProvider.MUCS_URI,
RosterProvider.RosterConstants.JID+" = ?",
new String[] {jid.toLowerCase()});
return (deleted > 0);
}
public static boolean isRoom(Context ctx, String jid) {
Cursor cursor = ctx.getContentResolver().query(RosterProvider.MUCS_URI,
new String[] {RosterProvider.RosterConstants._ID,
RosterProvider.RosterConstants.JID},
RosterConstants.JID + " = ?", new String[] { jid.toLowerCase() }, null);
boolean is_room = (cursor.getCount() == 1);
cursor.close();
return is_room;
}
public static void syncDbRooms(final Context ctx) {
Intent serviceIntent = new Intent(ctx, org.yaxim.androidclient.service.XMPPService.class);
serviceIntent.setAction("org.yaxim.androidclient.XMPPSERVICE");
serviceIntent.setData(Uri.parse("?chat"));
ServiceConnection c = new ServiceConnection() {
public void onServiceConnected(ComponentName name, IBinder service) {
IXMPPMucService mucService = IXMPPMucService.Stub.asInterface(service);
try {
mucService.syncDbRooms();
} catch (RemoteException e) {
e.printStackTrace();
}
ctx.unbindService(this);
}
public void onServiceDisconnected(ComponentName name) {}
};
ctx.bindService(serviceIntent, c, Context.BIND_AUTO_CREATE);
}
public static String guessMyNickname(Context ctx, String fallback) {
// obtain a sorted list of MUC nicknames; manually counting the
// occurences is a workaround for the missing "GROUP BY nickname"
Cursor cursor = ctx.getContentResolver().query(RosterProvider.MUCS_URI,
new String[] { RosterConstants.NICKNAME },
null, null, RosterConstants.NICKNAME );
String best = XMPPHelper.capitalizeString(fallback);
int best_count = 0;
String current = null;
int current_count = 0;
// count the occurences of every nickname in 'current', update 'best' with most-often used one
while (cursor.moveToNext()) {
android.util.Log.d("ChatRoomHelper", String.format("guessMyNickname: %s(%d) %s(%d) %s", best, best_count, current, current_count, cursor.getString(0)));
if (cursor.getString(0).equals(current))
current_count++;
else {
current = cursor.getString(0);
current_count = 1;
}
if (current_count > best_count) {
best = current;
best_count = current_count;
}
}
cursor.close();
return best;
}
public static String getRoomName(Context ctx, String jid) {
// query the DB as we do not have the room name in memory
Cursor c = ctx.getContentResolver().query(RosterProvider.CONTENT_URI, new String[] { RosterConstants.ALIAS },
RosterConstants.JID + " = ?", new String[] { jid }, null);
String result = jid;
if (c.moveToFirst())
result = c.getString(0);
c.close();
return result;
}
public static RoomInfo getRoomInfo(Context ctx, String jid) {
Cursor cursor = ctx.getContentResolver().query(RosterProvider.MUCS_URI,
new String[] { RosterConstants._ID, RosterConstants.JID,
RosterConstants.NICKNAME, RosterConstants.PASSWORD },
RosterConstants.JID + " = ?", new String[] { jid.toLowerCase() }, null);
if (cursor.getCount() == 1) {
cursor.moveToFirst();
RoomInfo ri = new RoomInfo(cursor);
cursor.close();
return ri;
} else {
cursor.close();
return null;
}
}
public static class RoomInfo {
public String jid;
public String nickname;
public String password;
//public String status_message;
RoomInfo(Cursor c) {
jid = c.getString(c.getColumnIndexOrThrow(RosterConstants.JID));
nickname = c.getString(c.getColumnIndexOrThrow(RosterConstants.NICKNAME));
password = c.getString(c.getColumnIndexOrThrow(RosterConstants.PASSWORD));
//status_message = c.getString(c.getColumnIndexOrThrow(RosterConstants.STATUS_MESSAGE));
}
}
}